From 1fe70988557ff38cca21a8b5485d37645709aa9c Mon Sep 17 00:00:00 2001 From: "J. Brandon Johnson" Date: Thu, 26 Dec 2024 15:12:46 -0800 Subject: [PATCH 01/69] chore: remove .env --- .env | 1 - 1 file changed, 1 deletion(-) delete mode 100644 .env diff --git a/.env b/.env deleted file mode 100644 index 2be7c65ae9..0000000000 --- a/.env +++ /dev/null @@ -1 +0,0 @@ -# hello world From d1e35825bd84a1bfe467006c96346950a78f0a4a Mon Sep 17 00:00:00 2001 From: "E.FU" Date: Sat, 28 Dec 2024 06:29:00 +0800 Subject: [PATCH 02/69] git ignore has .cursorrules --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 97c88ce295..b8bf427bf1 100644 --- a/.gitignore +++ b/.gitignore @@ -49,6 +49,7 @@ packages/plugin-coinbase/package-lock.json tsup.config.bundled_*.mjs .turbo +.cursorrules coverage .eslintcache From 34e9fc8e1ab977b89cac3b8a57fd4f53630f1a96 Mon Sep 17 00:00:00 2001 From: "E.FU" Date: Sat, 28 Dec 2024 21:45:48 +0800 Subject: [PATCH 03/69] fix(client-twitter): tighten engagement criteria and raise quality thresholds --- packages/client-twitter/src/post.ts | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/packages/client-twitter/src/post.ts b/packages/client-twitter/src/post.ts index 9ee9d6b173..c597b338fd 100644 --- a/packages/client-twitter/src/post.ts +++ b/packages/client-twitter/src/post.ts @@ -44,20 +44,25 @@ export const twitterActionTemplate = {{postDirections}} Guidelines: -- Highly selective engagement -- Direct mentions are priority -- Skip: low-effort content, off-topic, repetitive +- ONLY engage with content that DIRECTLY relates to character's core interests +- Direct mentions are priority IF they are on-topic +- Skip ALL content that is: + - Off-topic or tangentially related + - From high-profile accounts unless explicitly relevant + - Generic/viral content without specific relevance + - Political/controversial unless central to character + - Promotional/marketing unless directly relevant Actions (respond only with tags): -[LIKE] - Resonates with interests (9.5/10) -[RETWEET] - Perfect character alignment (9/10) -[QUOTE] - Can add unique value (8/10) -[REPLY] - Memetic opportunity (9/10) +[LIKE] - Perfect topic match AND aligns with character (9.8/10) +[RETWEET] - Exceptional content that embodies character's expertise (9.5/10) +[QUOTE] - Can add substantial domain expertise (9.5/10) +[REPLY] - Can contribute meaningful, expert-level insight (9.5/10) Tweet: {{currentTweet}} -# Respond with qualifying action tags only.` + postActionResponseFooter; +# Respond with qualifying action tags only. Default to NO action unless extremely confident of relevance.` + postActionResponseFooter; /** * Truncate text to fit within the Twitter character limit, ensuring it ends at a complete sentence. From 1b52990e6695f5d9e4f854d1234e89166eb41456 Mon Sep 17 00:00:00 2001 From: SK1989sL <91366180+SK1989sL@users.noreply.github.com> Date: Sat, 28 Dec 2024 15:15:55 +0100 Subject: [PATCH 04/69] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 4c91531ddb..37c30713f1 100644 --- a/README.md +++ b/README.md @@ -86,11 +86,11 @@ Copy .env.example to .env and fill in the appropriate values. cp .env.example .env ``` -Note: .env is optional. If your planning to run multiple distinct agents, you can pass secrets through the character JSON +Note: .env is optional. If you're planning to run multiple distinct agents, you can pass secrets through the character JSON ### Automatically Start Eliza -This will run everything to setup the project and start the bot with the default character. +This will run everything to set up the project and start the bot with the default character. ```bash sh scripts/start.sh From 428018294f9098b8f97ae36a95f48c99d81d7360 Mon Sep 17 00:00:00 2001 From: JOMOKING <83915728+RedHorse823@users.noreply.github.com> Date: Sat, 28 Dec 2024 22:21:18 +0800 Subject: [PATCH 05/69] Update README_CN - Model Configuration The original model configuration guide is misleading, it tells readers to configure model provider by change the `XAI_MODEL` parameters. But this is for the XAI configurations, i update the description completely with the right configuration steps. --- README_CN.md | 48 +++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/README_CN.md b/README_CN.md index 7562d4a334..82115705cb 100644 --- a/README_CN.md +++ b/README_CN.md @@ -104,13 +104,55 @@ pnpm start ## 配置不同的大模型 -### 配置Llama +您可以使用不同的大模型来驱动您的AI Agent,切换不同大模型需要两步: -您可以通过设置 `XAI_MODEL` 环境变量为 `meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` 或 `meta-llama/Meta-Llama-3.1-405B-Instruct` 来运行 Llama 70B 或 405B 模型 +1. 确认您在`.env`文件内配置了对应的大模型API Key或对应的访问配置,例如如果您想使用OpenAI,则需要找到`OPENAI_API_KEY`参数,并填入您的OpenAI API Key,并以此类推。 +2. 在您的*Character*文件里找到`modelProvider`,并更改这里的内容,例如如果想要切换到Claude,则需要填入`anthropic`,以此来表明您将使用anthropic大模型作为您的对应Agent的Provider. + +在`.env`文件内您可以找到不同大模型的详细配置,包括设定具体想要使用对应提供商的哪个模型,下方我们给出了两个实例: ### 配置OpenAI -您可以通过设置 `XAI_MODEL` 环境变量为 `gpt-4o-mini` 或 `gpt-4o` 来运行 OpenAI 模型 +首先您需要在Character文件内指定model provider + +```json + "name": "C-3PO", + "clients": [], + "modelProvider": "openai" + ... +``` + +其次请在`env`文件内配置相关参数 + +``` +# AI Model API Keys +OPENAI_API_KEY= # OpenAI API key, starting with sk- +SMALL_OPENAI_MODEL= # Default: gpt-4o-mini +MEDIUM_OPENAI_MODEL= # Default: gpt-4o +LARGE_OPENAI_MODEL= # Default: gpt-4o +EMBEDDING_OPENAI_MODEL= # Default: text-embedding-3-small +IMAGE_OPENAI_MODEL= # Default: dall-e-3 + +``` + +### 配置Anthorpic + +```json + "name": "C-3PO", + "clients": [], + "modelProvider": "anthropic" + ... +``` + +其次请在`env`文件内配置相关参数 + +``` +# Anthropic Configuration +ANTHROPIC_API_KEY= # For Claude +SMALL_ANTHROPIC_MODEL= # Default: claude-3-haiku-20240307 +MEDIUM_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 +LARGE_ANTHROPIC_MODEL= # Default: claude-3-5-sonnet-20241022 +``` ## 其他要求 From d90cde969d66bdc7dceb09c01b6cf0355a907c96 Mon Sep 17 00:00:00 2001 From: Judasz Date: Sat, 28 Dec 2024 17:14:00 +0100 Subject: [PATCH 06/69] Added Polish Readme file --- Readme_PL.md | 141 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 Readme_PL.md diff --git a/Readme_PL.md b/Readme_PL.md new file mode 100644 index 0000000000..fce19f37e3 --- /dev/null +++ b/Readme_PL.md @@ -0,0 +1,141 @@ +# Eliza 🤖 + +
+ Eliza Banner +
+ +
+ +📖 [Dokumentacja](https://elizaos.github.io/eliza/) | 🎯 [Przykłady](https://github.com/thejoven/awesome-eliza) + +
+ +## 🌍 README Tłumaczenia + +[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) | [Polski](./README_PL.md) + +## ✨ Cechy modelu: + +- 🛠️ Pełne wsparcie dla Discorda, Telegrama i Twittera +- 🔗 Wsparcie dla wszystkich modeli AI (Llama, Grok, OpenAI, Anthropic, itd.) +- 👥 Wiele osobowości jednocześnie oraz wsparcie dla pokoi +- 📚 Prosta konstrukcja i łatwość modyfikacji ustawień +- 💾 Przywracalna pamięć i opcja przechowywania dokumentów +- 🚀 Wiele możliwości rozszerzeń - twórz własne klienty, aplikacje itd +- ☁️ Wsparcie dla szerokiej gamy modeli (local Llama, OpenAI, Anthropic, Groq, etc.) +- 📦 Po prostu działa! + +## Poradniki wideo + +[AI Agent Dev School](https://www.youtube.com/watch?v=ArptLpQiKfI&list=PLx5pnFXdPTRzWla0RaOxALTSTnVq53fKL) + +## 🎯 Przykłady zastosowania + +- 🤖 Chatboty +- 🕵️ Autonomiczni Agenci +- 📈 Utrzymanie procesów biznesowych +- 🎮 Zaplecze dla postaci NPC w grach +- 🧠 Handel + +## 🚀 Jak zacząć? + +### Wstępne wymagania: + +- [Python 2.7+](https://www.python.org/downloads/) +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +> **Notka dla użytkowników Windowsa:** [WSL 2](https://learn.microsoft.com/en-us/windows/wsl/install-manual) jest wymagane!. + +### Użycie startera (Rekomendowane) + +```bash +git clone https://github.com/elizaos/eliza-starter.git +cd eliza-starter +cp .env.example .env +pnpm i && pnpm build && pnpm start +``` +Gdy agent się uruchomi, powinien pojawić się komunikat aby uruchomić komendę "pnpm start:client". +Wtedy trzeba odpalić drugi terminal, przejść do tego samego folderu, w którym mamy sklonowany kod z Githuba i odpalić tą komendę, aby być w stanie rozpocząć konwersację z naszym botem. +```bash +pnpm start:client +``` + +Następnie zapoznaj się z [Dokumentacją](https://elizaos.github.io/eliza/). Tam jest szcegółowo opisane, jak modyfikować i dopasować Elizę do własnych potrzeb. + +### Manualny start (Przeznaczone dla osób, które wiedzą, co robią) + +```bash +# Sklonuj repozytorium +git clone https://github.com/elizaos/eliza.git + +# Sprawdź, czy na pewno masz najnowszą wersję +# Projekt rozrasta się bardzo szybko, dlatego zalecane jest aby często sprawdzać wersję +git checkout $(git describe --tags --abbrev=0) +``` + +### Start przy użyciu Gitpod'a + +[![Otwórz w Gitpodzie](https://gitpod.io/button/open-in-gitpod.svg)](https://gitpod.io/#https://github.com/elizaos/eliza/tree/main) + +### Edytuj plik .env + +Zmień nazwę pliku .env.example na .env i wypełnij wartości zmiennych, które będą potrzebne do uruchomienia aplikacji. + +``` +cp .env.example .env +``` + +Uwaga: .env jest opcjonalne. Jeżeli planujesz stawiać więcej niż jedną postać, zalecane jest korzystanie z plików JSON dedykowanych dla charakterów. Będzie to bardziej przejrzyste i łatwiejsze do znalezienia gdy trzeba będzie wprowadzić jakieś zmiany. + +### Automatyczny start Elizy + +Ta komenda postawi projekt i uruchomi bota z domyślnym charakterem. + +```bash +sh scripts/start.sh +``` + +### Edycja pliku postaci + +1. Otwórz `packages/core/src/defaultCharacter.ts` aby zmodyfikować postać. Odkomentuj i edytuj. + +2. Aby załadować niestandardowe osobowości: + - Uzyj komendy `pnpm start --characters="path/to/your/character.json"` + - Wiele plików z osobowościami może być załadowana jednocześnie +3. Połącz z platformą X (niegdyś Twitter) + - zamień `"clients": []` na `"clients": ["twitter"]` w pliku osobowości aby połączyć z X + +### Manualny Start Elizy + +```bash +pnpm i +pnpm build +pnpm start + +# Projekt rozwija się bardzo szybko, dlatego jeżeli robisz sobie przerwę na jakiś czas i wejdzie w międzyczasie dużo zmian, dobrze jest użyć tej komendy: +pnpm clean +``` + +#### Dodatkowe wymagania + +Możesz musieć zainstalować pakiet Sharp. Jeżeli przy odpalaniu projektu wyskakuje błąd, spróbuj go zainstalować tą komendą: + +``` +pnpm install --include=optional sharp +``` + +### Społeczność i kontakt + +- [GitHub Issues](https://github.com/elizaos/eliza/issues). Korzystaj w przypadku gdy napotkasz na jakieś bugi podczas uzywania Elizy, lub masz jakieś propozycje rozwoju. +- [Discord](https://discord.gg/ai16z). Używaj, gdy chcesz się pochwalić swoją aplikacją lub po prostu pogadać z kimś. + +## Osoby zaangażowane w rozwój: + + + + + +## Historia gwiazdek + +[![Wykres historii gwiazdek](https://api.star-history.com/svg?repos=elizaos/eliza&type=Date)](https://star-history.com/#elizaos/eliza&Date) From ef53017796b17aef414d874fb888b5d1b513bc7b Mon Sep 17 00:00:00 2001 From: Judasz Date: Sat, 28 Dec 2024 17:18:47 +0100 Subject: [PATCH 07/69] Fixed polish's readme typo's --- README.md | 4 ++-- Readme_PL.md | 6 +----- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 4c91531ddb..15a1106b8d 100644 --- a/README.md +++ b/README.md @@ -12,7 +12,7 @@ ## 🌍 README Translations -[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) +[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) | [Polski](./README_PL.md) ## ✨ Features @@ -56,7 +56,7 @@ cp .env.example .env pnpm i && pnpm build && pnpm start ``` Once the agent is running, You should see the message to run "pnpm start:client" at the end. -Open another terminal and move to same directory and then run below command and follow the URL to chat to your agent. +Open another terminal and move to same directory and then run below command and follow the URL to chat to your agent. ```bash pnpm start:client ``` diff --git a/Readme_PL.md b/Readme_PL.md index fce19f37e3..5c927e4dc9 100644 --- a/Readme_PL.md +++ b/Readme_PL.md @@ -10,10 +10,6 @@ -## 🌍 README Tłumaczenia - -[中文说明](./README_CN.md) | [日本語の説明](./README_JA.md) | [한국어 설명](./README_KOR.md) | [Français](./README_FR.md) | [Português](./README_PTBR.md) | [Türkçe](./README_TR.md) | [Русский](./README_RU.md) | [Español](./README_ES.md) | [Italiano](./README_IT.md) | [ไทย](./README_TH.md) | [Deutsch](./README_DE.md) | [Tiếng Việt](./README_VI.md) | [עִברִית](https://github.com/elizaos/Elisa/blob/main/README_HE.md) | [Tagalog](./README_TG.md) | [Polski](./README_PL.md) - ## ✨ Cechy modelu: - 🛠️ Pełne wsparcie dla Discorda, Telegrama i Twittera @@ -23,7 +19,7 @@ - 💾 Przywracalna pamięć i opcja przechowywania dokumentów - 🚀 Wiele możliwości rozszerzeń - twórz własne klienty, aplikacje itd - ☁️ Wsparcie dla szerokiej gamy modeli (local Llama, OpenAI, Anthropic, Groq, etc.) -- 📦 Po prostu działa! +- 📦 To po prostu działa! ## Poradniki wideo From f41a882c796ad35969d1d0ad97ede4b2604aa98e Mon Sep 17 00:00:00 2001 From: yanushevitz <75587556+yanushevitz@users.noreply.github.com> Date: Sat, 28 Dec 2024 17:19:26 +0100 Subject: [PATCH 08/69] Rename Readme_PL.md to README_PL.md --- Readme_PL.md => README_PL.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename Readme_PL.md => README_PL.md (100%) diff --git a/Readme_PL.md b/README_PL.md similarity index 100% rename from Readme_PL.md rename to README_PL.md From 84c9d544c28ba4115934612f4823d1405cf66e55 Mon Sep 17 00:00:00 2001 From: "J. Brandon Johnson" Date: Sat, 28 Dec 2024 09:14:25 -0800 Subject: [PATCH 09/69] feat: fix chat client to autoscroll --- client/src/Chat.tsx | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/client/src/Chat.tsx b/client/src/Chat.tsx index e1744c866e..f9538d1323 100644 --- a/client/src/Chat.tsx +++ b/client/src/Chat.tsx @@ -1,11 +1,10 @@ -import { useRef, useState } from "react"; -import { useParams } from "react-router-dom"; -import { useMutation } from "@tanstack/react-query"; import { Button } from "@/components/ui/button"; -import { ImageIcon } from "lucide-react"; import { Input } from "@/components/ui/input"; +import { useMutation } from "@tanstack/react-query"; +import { ImageIcon } from "lucide-react"; +import { useEffect, useRef, useState } from "react"; +import { useParams } from "react-router-dom"; import "./App.css"; -import path from "path"; type TextResponse = { text: string; @@ -19,6 +18,15 @@ export default function Chat() { const [messages, setMessages] = useState([]); const [selectedFile, setSelectedFile] = useState(null); const fileInputRef = useRef(null); + const messagesEndRef = useRef(null); + + const scrollToBottom = () => { + messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); + }; + + useEffect(() => { + scrollToBottom(); + }, [messages]); const mutation = useMutation({ mutationFn: async (text: string) => { @@ -115,6 +123,7 @@ export default function Chat() { No messages yet. Start a conversation! )} +
From 3561ed80eec1ca275bb48c3b352a96816a968fdb Mon Sep 17 00:00:00 2001 From: "J. Brandon Johnson" Date: Sat, 28 Dec 2024 09:16:25 -0800 Subject: [PATCH 10/69] chore: update changelog --- CHANGELOG.md | 147 ++------------------------------------------------- 1 file changed, 4 insertions(+), 143 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index e0dec2dd5a..2ac64c2f52 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,143 +1,5 @@ # Changelog -## [v0.1.7-alpha.2](https://github.com/elizaOS/eliza/tree/v0.1.7-alpha.2) (2024-12-28) - -[Full Changelog](https://github.com/elizaOS/eliza/compare/v0.1.7-alpha.1...v0.1.7-alpha.2) - -**Implemented enhancements:** - -- add fuel plugin [\#1510](https://github.com/elizaOS/eliza/issues/1510) -- hi i finished the vertex ai integration do you guys need this? [\#1495](https://github.com/elizaOS/eliza/issues/1495) -- Add Tagalog Translation on README [\#1419](https://github.com/elizaOS/eliza/issues/1419) -- Reduce load on maintainers [\#1318](https://github.com/elizaOS/eliza/issues/1318) -- Greetings for first time contributors [\#1315](https://github.com/elizaOS/eliza/issues/1315) -- Enable code scanning on security purposes: [\#1313](https://github.com/elizaOS/eliza/issues/1313) - -**Fixed bugs:** - -- Swap & Bridge action issue [\#1523](https://github.com/elizaOS/eliza/issues/1523) -- Corrupt model `cache` [\#1506](https://github.com/elizaOS/eliza/issues/1506) -- \[PROPOSAL\] Setup lint/prettier and husky [\#1459](https://github.com/elizaOS/eliza/issues/1459) -- bug: pnpm run dev not working with characterfiles [\#1452](https://github.com/elizaOS/eliza/issues/1452) -- Not able to login in twitter [\#1398](https://github.com/elizaOS/eliza/issues/1398) -- Multiple generateNewTweetLoop method invocations caused multiple tweets to be posted. [\#1395](https://github.com/elizaOS/eliza/issues/1395) -- Postgres adapter doesnt apply settings [\#1378](https://github.com/elizaOS/eliza/issues/1378) -- imageSettings in character files do not currently work \(providing fix PR\) [\#1370](https://github.com/elizaOS/eliza/issues/1370) -- connect ETIMEDOUT 104.244.46.63:443 [\#1332](https://github.com/elizaOS/eliza/issues/1332) -- v0.1.6 When running on the gitpod , not able to chat in terminal when pnpm start , "Error starting agent for character Eliza" [\#1328](https://github.com/elizaOS/eliza/issues/1328) -- On load posts twice to Twitter [\#1284](https://github.com/elizaOS/eliza/issues/1284) -- Fix Incorrect Fallback Logic for Image Model Provider API Keys [\#1270](https://github.com/elizaOS/eliza/issues/1270) -- {{user}} tags in templates/examples empty when passed to LLM [\#1267](https://github.com/elizaOS/eliza/issues/1267) -- unsupported model provider: claude\_vertex on develop branch [\#1255](https://github.com/elizaOS/eliza/issues/1255) -- twitterShouldRespondTemplate Fails When Defined as a String in JSON Character Config [\#1235](https://github.com/elizaOS/eliza/issues/1235) -- pnpm install shows errors [\#1234](https://github.com/elizaOS/eliza/issues/1234) -- Long tweets fail with error Tweet needs to be a bit shorter \(Code 186\) [\#1178](https://github.com/elizaOS/eliza/issues/1178) -- Unable to Perform Transfer with plugin-evm Due to Parameter Parsing Error [\#964](https://github.com/elizaOS/eliza/issues/964) -- I have a twitter premium subscription and MAX\_TWEET\_LENGTH to 2500 but I can't to post a tweet with more than 280 characteres [\#883](https://github.com/elizaOS/eliza/issues/883) -- Twitter cookies do not match the docs [\#558](https://github.com/elizaOS/eliza/issues/558) - -**Closed issues:** - -- Scoped PR titles [\#1413](https://github.com/elizaOS/eliza/issues/1413) -- chore: Keeps README translations synchronized [\#1222](https://github.com/elizaOS/eliza/issues/1222) - -**Merged pull requests:** - -- chore: bump version to v.0.1.7-alpha.2 [\#1530](https://github.com/elizaOS/eliza/pull/1530) ([shakkernerd](https://github.com/shakkernerd)) -- chore: remove unused vars [\#1529](https://github.com/elizaOS/eliza/pull/1529) ([odilitime](https://github.com/odilitime)) -- feat: add /:agentId/speak endpoint for text-to-speech functionality [\#1528](https://github.com/elizaOS/eliza/pull/1528) ([HowieDuhzit](https://github.com/HowieDuhzit)) -- Fix: Update package.json with build-docker command to match the dockerfile command [\#1527](https://github.com/elizaOS/eliza/pull/1527) ([vanshika-srivastava](https://github.com/vanshika-srivastava)) -- feat: Add Livepeer Image Provider [\#1525](https://github.com/elizaOS/eliza/pull/1525) ([Titan-Node](https://github.com/Titan-Node)) -- feat: use OPENAI\_API\_URL from env to support custom OpenAI API endpoint [\#1522](https://github.com/elizaOS/eliza/pull/1522) ([imtms](https://github.com/imtms)) -- fix: handle long tweet in utils [\#1520](https://github.com/elizaOS/eliza/pull/1520) ([oxSaturn](https://github.com/oxSaturn)) -- chore: 1.7.0 prep, develop =\> main [\#1519](https://github.com/elizaOS/eliza/pull/1519) ([odilitime](https://github.com/odilitime)) -- chore: remove cache in core [\#1516](https://github.com/elizaOS/eliza/pull/1516) ([shakkernerd](https://github.com/shakkernerd)) -- chore: Revert "Clear `/cache/` in `clean.sh` script" [\#1515](https://github.com/elizaOS/eliza/pull/1515) ([shakkernerd](https://github.com/shakkernerd)) -- fix: client-twitter lowerCase bug and environment clean up \(+lint fixes, and TWITTER\_SEARCH\_ENABLE double start fix\) [\#1514](https://github.com/elizaOS/eliza/pull/1514) ([odilitime](https://github.com/odilitime)) -- chore: general code fixes/clean up [\#1513](https://github.com/elizaOS/eliza/pull/1513) ([shakkernerd](https://github.com/shakkernerd)) -- add fuel plugin [\#1512](https://github.com/elizaOS/eliza/pull/1512) ([Dhaiwat10](https://github.com/Dhaiwat10)) -- Clear `/cache/` in `clean.sh` script [\#1508](https://github.com/elizaOS/eliza/pull/1508) ([timolegros](https://github.com/timolegros)) -- feat: Add the FerePro plugin [\#1502](https://github.com/elizaOS/eliza/pull/1502) ([Rudrakc](https://github.com/Rudrakc)) -- feat: extend parseBooleanFromText function with additional boolean values [\#1501](https://github.com/elizaOS/eliza/pull/1501) ([shakkernerd](https://github.com/shakkernerd)) -- docs: bad links in eliza-in-tee.md [\#1500](https://github.com/elizaOS/eliza/pull/1500) ([janeyJo](https://github.com/janeyJo)) -- fix: improve Twitter client dry run mode and configuration logging [\#1498](https://github.com/elizaOS/eliza/pull/1498) ([e-fu](https://github.com/e-fu)) -- feat: add readme for ton plugin [\#1496](https://github.com/elizaOS/eliza/pull/1496) ([chandiniv1](https://github.com/chandiniv1)) -- feat: add readme for websearch plugin [\#1494](https://github.com/elizaOS/eliza/pull/1494) ([chandiniv1](https://github.com/chandiniv1)) -- docs: Fixed a small syntax issue in the ModelClass Update fine-tuning.md [\#1493](https://github.com/elizaOS/eliza/pull/1493) ([mdqst](https://github.com/mdqst)) -- fix: remove `type` when import from `elizaos` [\#1492](https://github.com/elizaOS/eliza/pull/1492) ([tomguluson92](https://github.com/tomguluson92)) -- fix: improve client type identification with test coverage [\#1490](https://github.com/elizaOS/eliza/pull/1490) ([ShaneOxM](https://github.com/ShaneOxM)) -- chore: fix typos [\#1489](https://github.com/elizaOS/eliza/pull/1489) ([qwdsds](https://github.com/qwdsds)) -- add CODE\_OF\_CONDUCT.md [\#1487](https://github.com/elizaOS/eliza/pull/1487) ([nulLeeKH](https://github.com/nulLeeKH)) -- fix: add required incremental option and remove invalid typescript configuration [\#1485](https://github.com/elizaOS/eliza/pull/1485) ([ShaneOxM](https://github.com/ShaneOxM)) -- feat: improve chat formatting line breaks [\#1483](https://github.com/elizaOS/eliza/pull/1483) ([swizzmagik](https://github.com/swizzmagik)) -- feat: add image features to react chat client [\#1481](https://github.com/elizaOS/eliza/pull/1481) ([0xPBIT](https://github.com/0xPBIT)) -- feat: Enhance client direct [\#1479](https://github.com/elizaOS/eliza/pull/1479) ([shakkernerd](https://github.com/shakkernerd)) -- chore: Do not consider self tweets when evaluating actions [\#1477](https://github.com/elizaOS/eliza/pull/1477) ([ag-wnl](https://github.com/ag-wnl)) -- chore: Docs update [\#1476](https://github.com/elizaOS/eliza/pull/1476) ([madjin](https://github.com/madjin)) -- Fetch timeline for followed accounts via Twitter client methods [\#1475](https://github.com/elizaOS/eliza/pull/1475) ([ag-wnl](https://github.com/ag-wnl)) -- fix\(core\) make modelConfiguration optional [\#1473](https://github.com/elizaOS/eliza/pull/1473) ([Archethect](https://github.com/Archethect)) -- fix: duplicate twitter post [\#1472](https://github.com/elizaOS/eliza/pull/1472) ([tcm390](https://github.com/tcm390)) -- fix: cleaner interaction prompts in the Twitter plugin [\#1469](https://github.com/elizaOS/eliza/pull/1469) ([todorkolev](https://github.com/todorkolev)) -- fix: cronoszkEVM -\> cronoszkevm [\#1468](https://github.com/elizaOS/eliza/pull/1468) ([shakkernerd](https://github.com/shakkernerd)) -- chore: update defailt character topic test case [\#1466](https://github.com/elizaOS/eliza/pull/1466) ([shakkernerd](https://github.com/shakkernerd)) -- docs: Fixed Incorrect Model Name in API Integration [\#1465](https://github.com/elizaOS/eliza/pull/1465) ([mdqst](https://github.com/mdqst)) -- feat: Adding plugin for Cronos ZKEVM [\#1464](https://github.com/elizaOS/eliza/pull/1464) ([samarth30](https://github.com/samarth30)) -- fix: client-twitter: fix ENABLE\_ACTION\_PROCESSING logic [\#1463](https://github.com/elizaOS/eliza/pull/1463) ([zkvm](https://github.com/zkvm)) -- fix: update pnpm lock [\#1457](https://github.com/elizaOS/eliza/pull/1457) ([odilitime](https://github.com/odilitime)) -- fix: swap and bridge actions of plugin-evm [\#1456](https://github.com/elizaOS/eliza/pull/1456) ([pythonberg1997](https://github.com/pythonberg1997)) -- feat: Add ModelConfiguration to Character to enable adjusting temperature, response length & penalties [\#1455](https://github.com/elizaOS/eliza/pull/1455) ([peersky](https://github.com/peersky)) -- feat: allow passing secrets through environment [\#1454](https://github.com/elizaOS/eliza/pull/1454) ([odilitime](https://github.com/odilitime)) -- New default character [\#1453](https://github.com/elizaOS/eliza/pull/1453) ([lalalune](https://github.com/lalalune)) -- fix: Remove code duplication in getGoals call [\#1450](https://github.com/elizaOS/eliza/pull/1450) ([hanyh2004](https://github.com/hanyh2004)) -- Feat: update package.json to add Cleanstart options for new database [\#1449](https://github.com/elizaOS/eliza/pull/1449) ([harperaa](https://github.com/harperaa)) -- feat: Add Text to 3D function [\#1446](https://github.com/elizaOS/eliza/pull/1446) ([tomguluson92](https://github.com/tomguluson92)) -- feat: suppress initial message from action [\#1444](https://github.com/elizaOS/eliza/pull/1444) ([0xPBIT](https://github.com/0xPBIT)) -- fix: fix incorrect link redirection issue [\#1443](https://github.com/elizaOS/eliza/pull/1443) ([mhxw](https://github.com/mhxw)) -- feat: \(plugin-evm\) add alienx chain [\#1438](https://github.com/elizaOS/eliza/pull/1438) ([xwxtwd](https://github.com/xwxtwd)) -- feat: add `only` to booleanFooter [\#1437](https://github.com/elizaOS/eliza/pull/1437) ([fyInALT](https://github.com/fyInALT)) -- fix: Make search feature in twitter client works [\#1433](https://github.com/elizaOS/eliza/pull/1433) ([nulLeeKH](https://github.com/nulLeeKH)) -- chore: Keeps README translations synchronized [\#1432](https://github.com/elizaOS/eliza/pull/1432) ([0xJord4n](https://github.com/0xJord4n)) -- improve logging in plugin-coinbase [\#1429](https://github.com/elizaOS/eliza/pull/1429) ([alessandromazza98](https://github.com/alessandromazza98)) -- Update eliza-in-tee.md \(fixing typo\) [\#1428](https://github.com/elizaOS/eliza/pull/1428) ([yerinle](https://github.com/yerinle)) -- feat: client-github retry [\#1425](https://github.com/elizaOS/eliza/pull/1425) ([tomguluson92](https://github.com/tomguluson92)) -- docs: 1.Quotation marks are used incorrectly.2.Delete duplicate words [\#1424](https://github.com/elizaOS/eliza/pull/1424) ([RiceChuan](https://github.com/RiceChuan)) -- fix: typos [\#1423](https://github.com/elizaOS/eliza/pull/1423) ([omahs](https://github.com/omahs)) -- feat: Twitter Post Action Implementation [\#1422](https://github.com/elizaOS/eliza/pull/1422) ([0xPBIT](https://github.com/0xPBIT)) -- docs: Add Tagalog README Translation [\#1420](https://github.com/elizaOS/eliza/pull/1420) ([harveyjavier](https://github.com/harveyjavier)) -- fix: Multiple Agents running at the same time on localhost [\#1415](https://github.com/elizaOS/eliza/pull/1415) ([0xCardinalError](https://github.com/0xCardinalError)) -- chore: allow scoped pr titles [\#1414](https://github.com/elizaOS/eliza/pull/1414) ([ryanleecode](https://github.com/ryanleecode)) -- chore: format package.json files with prettier [\#1412](https://github.com/elizaOS/eliza/pull/1412) ([ryanleecode](https://github.com/ryanleecode)) -- feat: add venice style presets & option to remove watermark \(image generation\) [\#1410](https://github.com/elizaOS/eliza/pull/1410) ([proteanx](https://github.com/proteanx)) -- fix: client-discord chat\_with\_attachment action remove hard coded model, allow any tiktoken model [\#1408](https://github.com/elizaOS/eliza/pull/1408) ([harperaa](https://github.com/harperaa)) -- fix: duplicate tweet log [\#1402](https://github.com/elizaOS/eliza/pull/1402) ([jasonqindev](https://github.com/jasonqindev)) -- docs: Add "What Did You Get Done This Week? \#6" notes [\#1399](https://github.com/elizaOS/eliza/pull/1399) ([YoungPhlo](https://github.com/YoungPhlo)) -- Standardize boolean values and update .env file pattern [\#1392](https://github.com/elizaOS/eliza/pull/1392) ([hcaumo](https://github.com/hcaumo)) -- chore: split tests [\#1390](https://github.com/elizaOS/eliza/pull/1390) ([shakkernerd](https://github.com/shakkernerd)) -- chore: require approval for integration test step [\#1388](https://github.com/elizaOS/eliza/pull/1388) ([shakkernerd](https://github.com/shakkernerd)) -- chore: change CI trigger [\#1387](https://github.com/elizaOS/eliza/pull/1387) ([shakkernerd](https://github.com/shakkernerd)) -- docs: sample plugin documentation [\#1385](https://github.com/elizaOS/eliza/pull/1385) ([ileana-pr](https://github.com/ileana-pr)) -- fix: postgres adapter settings not being applied [\#1379](https://github.com/elizaOS/eliza/pull/1379) ([ryanleecode](https://github.com/ryanleecode)) -- Update README.md to instructions to start client for chatting with Agent [\#1375](https://github.com/elizaOS/eliza/pull/1375) ([onlyzerosonce](https://github.com/onlyzerosonce)) -- fix: explicitly set env in each step [\#1374](https://github.com/elizaOS/eliza/pull/1374) ([shakkernerd](https://github.com/shakkernerd)) -- fix: image generation using imageSettings [\#1371](https://github.com/elizaOS/eliza/pull/1371) ([proteanx](https://github.com/proteanx)) -- docs: Add documentation on pnpm node version [\#1350](https://github.com/elizaOS/eliza/pull/1350) ([trbutler4](https://github.com/trbutler4)) -- feat: Add agentic JSDoc generation [\#1343](https://github.com/elizaOS/eliza/pull/1343) ([Ed-Marcavage](https://github.com/Ed-Marcavage)) -- feat: handle long tweet [\#1339](https://github.com/elizaOS/eliza/pull/1339) ([tcm390](https://github.com/tcm390)) -- fix: Twitter login notifications, incorrect cookie management. [\#1330](https://github.com/elizaOS/eliza/pull/1330) ([ChristopherTrimboli](https://github.com/ChristopherTrimboli)) -- feat: added docs for plugin-nft-generation [\#1327](https://github.com/elizaOS/eliza/pull/1327) ([vishal-kanna](https://github.com/vishal-kanna)) -- feat: add auto PR / issue close after being stale for a certain amount of time [\#1317](https://github.com/elizaOS/eliza/pull/1317) ([monilpat](https://github.com/monilpat)) -- feat: greet first time contributors [\#1316](https://github.com/elizaOS/eliza/pull/1316) ([monilpat](https://github.com/monilpat)) -- feat: \[Code Scanning\] Security Improvements - create codeql.yml [\#1314](https://github.com/elizaOS/eliza/pull/1314) ([monilpat](https://github.com/monilpat)) -- fix: Update speech.ts [\#1312](https://github.com/elizaOS/eliza/pull/1312) ([y4my4my4m](https://github.com/y4my4my4m)) -- fix: {{user}} tags in templates/examples empty when passed to LLM [\#1305](https://github.com/elizaOS/eliza/pull/1305) ([tcm390](https://github.com/tcm390)) -- fix: fix imageModelProvider apiKey selection fallback [\#1272](https://github.com/elizaOS/eliza/pull/1272) ([UD1sto](https://github.com/UD1sto)) -- feat: add abstract plugin [\#1225](https://github.com/elizaOS/eliza/pull/1225) ([cygaar](https://github.com/cygaar)) -- chore: update env for plugin-goat [\#1180](https://github.com/elizaOS/eliza/pull/1180) ([aeither](https://github.com/aeither)) -- feat: Add GitBook Plugin provider [\#1126](https://github.com/elizaOS/eliza/pull/1126) ([azep-ninja](https://github.com/azep-ninja)) -- feat: add avalanche plugin [\#842](https://github.com/elizaOS/eliza/pull/842) ([snow-farmer](https://github.com/snow-farmer)) -- feat: Add Custom System Prompt Support for plugin-image-generation [\#839](https://github.com/elizaOS/eliza/pull/839) ([tsubasakong](https://github.com/tsubasakong)) -- feat: replace `unruggable-core` with `unruggable-sdk` [\#450](https://github.com/elizaOS/eliza/pull/450) ([remiroyc](https://github.com/remiroyc)) - ## [v0.1.7-alpha.1](https://github.com/elizaOS/eliza/tree/v0.1.7-alpha.1) (2024-12-22) [Full Changelog](https://github.com/elizaOS/eliza/compare/v0.1.6...v0.1.7-alpha.1) @@ -149,7 +11,6 @@ - Why do I have a running Agent on WSL2, but the browser shows don't work? [\#1326](https://github.com/elizaOS/eliza/issues/1326) - http proxy error /agents [\#1322](https://github.com/elizaOS/eliza/issues/1322) - 2:02:20 AM \[vite\] http proxy error: /agents Error: connect ECONNREFUSED ::1:3000 at TCPConnectWrap.afterConnect \[as oncomplete\] \(node:net:1615:16\) \(x12\) [\#1321](https://github.com/elizaOS/eliza/issues/1321) -- "TypeError: response.body?.getReader is not a function" from package/plugin-node [\#1265](https://github.com/elizaOS/eliza/issues/1265) - Unable to run `pnpm install --no-frozen-lockfile` on v0.1.6-alpha.4 [\#1167](https://github.com/elizaOS/eliza/issues/1167) **Merged pull requests:** @@ -379,10 +240,10 @@ - fix: remove docker compose command since Docker file already runs [\#1139](https://github.com/elizaOS/eliza/pull/1139) ([rarepepi](https://github.com/rarepepi)) - feat: add support for handlebars templating engine as an option [\#1136](https://github.com/elizaOS/eliza/pull/1136) ([erise133](https://github.com/erise133)) - feat: allow agents to create/buy/sell tokens on FOMO.fund's bonding curve in plugin-solana [\#1135](https://github.com/elizaOS/eliza/pull/1135) ([0xNerd](https://github.com/0xNerd)) -- fix: fix the name [\#1133](https://github.com/elizaOS/eliza/pull/1133) ([0xCardinalError](https://github.com/0xCardinalError)) +- fix: fix the name [\#1133](https://github.com/elizaOS/eliza/pull/1133) ([n00b21337](https://github.com/n00b21337)) - feat: Add `chatapi.akash.network` to available list of model providers \(FREE LLAMA API ACCESS!\) [\#1131](https://github.com/elizaOS/eliza/pull/1131) ([MbBrainz](https://github.com/MbBrainz)) - fix: discord client duplicate function removal [\#1125](https://github.com/elizaOS/eliza/pull/1125) ([azep-ninja](https://github.com/azep-ninja)) -- fix: add more heplful default agents \(Dobby and C3PO\) [\#1124](https://github.com/elizaOS/eliza/pull/1124) ([0xCardinalError](https://github.com/0xCardinalError)) +- fix: add more heplful default agents \(Dobby and C3PO\) [\#1124](https://github.com/elizaOS/eliza/pull/1124) ([n00b21337](https://github.com/n00b21337)) - fix: Refactor to prevent unnecessary lockfile changes [\#1120](https://github.com/elizaOS/eliza/pull/1120) ([monilpat](https://github.com/monilpat)) - chore: fix broken pnpm lockfile [\#1115](https://github.com/elizaOS/eliza/pull/1115) ([shakkernerd](https://github.com/shakkernerd)) - feat: New docs for community section [\#1114](https://github.com/elizaOS/eliza/pull/1114) ([madjin](https://github.com/madjin)) @@ -522,7 +383,7 @@ - chore: rename intiface plugin [\#955](https://github.com/elizaOS/eliza/pull/955) ([odilitime](https://github.com/odilitime)) - fix: revert llamacloud endpoint change [\#954](https://github.com/elizaOS/eliza/pull/954) ([odilitime](https://github.com/odilitime)) - feat: allow character.json settings models for open router [\#953](https://github.com/elizaOS/eliza/pull/953) ([odilitime](https://github.com/odilitime)) -- chore: 947 add other evm chains to wallet [\#949](https://github.com/elizaOS/eliza/pull/949) ([0xCardinalError](https://github.com/0xCardinalError)) +- chore: 947 add other evm chains to wallet [\#949](https://github.com/elizaOS/eliza/pull/949) ([n00b21337](https://github.com/n00b21337)) - fix: telegram response memory userId to agentId [\#948](https://github.com/elizaOS/eliza/pull/948) ([bmgalego](https://github.com/bmgalego)) - docs: add WSL installation guide [\#946](https://github.com/elizaOS/eliza/pull/946) ([ileana-pr](https://github.com/ileana-pr)) - feat: Supports upload files to AWS S3. [\#941](https://github.com/elizaOS/eliza/pull/941) ([xwxtwd](https://github.com/xwxtwd)) @@ -1363,4 +1224,4 @@ -\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* +\* *This Changelog was automatically generated by [github_changelog_generator](https://github.com/github-changelog-generator/github-changelog-generator)* \ No newline at end of file From 3d7f27a8d760b493759a9bc17fde6a7edb30aecd Mon Sep 17 00:00:00 2001 From: Monil Patel Date: Sat, 28 Dec 2024 10:47:32 -0800 Subject: [PATCH 11/69] feat: improve messages Improve message so criteria is displayed --- .github/workflows/stale.yml | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/.github/workflows/stale.yml b/.github/workflows/stale.yml index ac76b77607..51d21090bc 100644 --- a/.github/workflows/stale.yml +++ b/.github/workflows/stale.yml @@ -12,13 +12,23 @@ jobs: issues: write pull-requests: write + env: + DAYS_BEFORE_STALE: 30 # Define the days-before-stale value + DAYS_BEFORE_CLOSE: 7 # Define the days-before-close value + steps: - uses: actions/stale@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} - stale-issue-message: 'This issue has been automatically marked as stale due to inactivity.' - stale-pr-message: 'This pull request has been automatically marked as stale due to inactivity.' + stale-issue-message: | + This issue has been automatically marked as stale due to ${{ + env.DAYS_BEFORE_STALE }} days of inactivity. + If no further activity occurs within ${{ env.DAYS_BEFORE_CLOSE }} days, it will be closed automatically. Please take action if this issue is still relevant. + stale-pr-message: | + This pull request has been automatically marked as stale due to ${{ + env.DAYS_BEFORE_STALE }} days of inactivity. + If no further activity occurs within ${{ env.DAYS_BEFORE_CLOSE }} days, it will be closed automatically. Please take action if this pull request is still relevant. stale-issue-label: 'no-issue-activity' stale-pr-label: 'no-pr-activity' - days-before-stale: 30 # Marks issues and PRs as stale after X days of inactivity - days-before-close: 7 # Closes issues and PRs X days after being marked as stale + days-before-stale: ${{ env.DAYS_BEFORE_STALE }} + days-before-close: ${{ env.DAYS_BEFORE_CLOSE }} From c84b33cfc2ae85fbb86349c19ffa237439668493 Mon Sep 17 00:00:00 2001 From: odilitime Date: Sat, 28 Dec 2024 19:14:09 +0000 Subject: [PATCH 12/69] fix number prefixed username, add X brand in messaging --- packages/client-twitter/src/environment.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/client-twitter/src/environment.ts b/packages/client-twitter/src/environment.ts index 8ff2fb454e..21b40e6d1a 100644 --- a/packages/client-twitter/src/environment.ts +++ b/packages/client-twitter/src/environment.ts @@ -3,15 +3,15 @@ import { z } from "zod"; export const DEFAULT_MAX_TWEET_LENGTH = 280; const twitterUsernameSchema = z.string() - .min(1) - .max(15) - .regex(/^[A-Za-z][A-Za-z0-9_]*[A-Za-z0-9]$|^[A-Za-z]$/, 'Invalid Twitter username format'); + .min(4, 'An X/Twitter Username must be at least 4 characters long') + .max(15, 'n X/Twitter Username cannot exceed 15 characters') + .regex(/^[A-Za-z0-9_]*$/, 'n X Username can only contain letters, numbers, and underscores'); export const twitterEnvSchema = z.object({ TWITTER_DRY_RUN: z.boolean(), - TWITTER_USERNAME: z.string().min(1, "Twitter username is required"), - TWITTER_PASSWORD: z.string().min(1, "Twitter password is required"), - TWITTER_EMAIL: z.string().email("Valid Twitter email is required"), + TWITTER_USERNAME: z.string().min(1, "X/Twitter username is required"), + TWITTER_PASSWORD: z.string().min(1, "X/Twitter password is required"), + TWITTER_EMAIL: z.string().email("Valid X/Twitter email is required"), MAX_TWEET_LENGTH: z.number().int().default(DEFAULT_MAX_TWEET_LENGTH), TWITTER_SEARCH_ENABLE: z.boolean().default(false), TWITTER_2FA_SECRET: z.string(), @@ -164,7 +164,7 @@ export async function validateTwitterConfig( .map((err) => `${err.path.join(".")}: ${err.message}`) .join("\n"); throw new Error( - `Twitter configuration validation failed:\n${errorMessages}` + `X/Twitter configuration validation failed:\n${errorMessages}` ); } throw error; From b8b432b03864bc300bf4a78a55aa19a16737b8ef Mon Sep 17 00:00:00 2001 From: Matt Gunnin Date: Sat, 28 Dec 2024 14:05:46 -0600 Subject: [PATCH 13/69] refactor: reorganize imports in video service --- packages/plugin-node/src/services/video.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/packages/plugin-node/src/services/video.ts b/packages/plugin-node/src/services/video.ts index f2657b4817..447aed67e0 100644 --- a/packages/plugin-node/src/services/video.ts +++ b/packages/plugin-node/src/services/video.ts @@ -1,16 +1,16 @@ -import { Service } from "@elizaos/core"; import { IAgentRuntime, ITranscriptionService, + IVideoService, Media, + Service, ServiceType, - IVideoService, + stringToUuid, } from "@elizaos/core"; -import { stringToUuid } from "@elizaos/core"; import ffmpeg from "fluent-ffmpeg"; import fs from "fs"; -import path from "path"; import { tmpdir } from "os"; +import path from "path"; import youtubeDl from "youtube-dl-exec"; export class VideoService extends Service implements IVideoService { From c0ec44ce13766d760c449cd1882d4b30fd99f401 Mon Sep 17 00:00:00 2001 From: Matt Gunnin Date: Sat, 28 Dec 2024 14:11:33 -0600 Subject: [PATCH 14/69] fix: improve clarity and grammar in pull request template --- .github/pull_request_template.md | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index 0dcc810f5f..7170123996 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,15 +1,15 @@ - + -# Relates to: +# Relates to - + # Risks # Background @@ -25,7 +25,7 @@ Features (non-breaking change which adds functionality) Updates (new versions of included code) --> - + @@ -35,10 +35,10 @@ Updates (new versions of included code) - + # Testing @@ -47,7 +47,7 @@ If a docs change is needed: I have updated the documentation accordingly. ## Detailed testing steps - + - + - + - + ^N%M{hg(@vSvCRGq z8Vkt`^VzNBS33U#`~3xhMAwarMF8Eq!~ILay0qU}$Jz2D$lb$ty@`AGY-6OGB6>`2 zX{NDtUJct%6x0Z73TjgxfR-7yaJj(Znd#P{CfC|Nngd!&=MT zBkvFUapo6%GC`%!VkXz_8NmyF^ZKVCSz^}`>xZ&On-bE9hAotfy4?6!s!U@Du#<=k zzQ$D#G4U+<17B)iGU;QqX8@8zhk(gop6$7^KRIPb4BgMA8g7N;Y{Ulg2#VVEm}m`& z{j}+y+?n|%dn0gxB)!qFrOls1eGH^7 z>>v|eukUk@HPSv9BRveFy$oKlH^v6DbH|_Dr& z9s}K@AT1*+$%Bhsp6?n%f8Rh4mWE5xOSk*B8!|9}p82dp+rP;25JiEtPg2iHh1%6* zFA}pnsW)Cl!>!PONiYaLENa(LID{!SHZ`@K?xB$-%a>-#7qYTj8W`DPwpsW7ogE50 z8P7py`()Z!Sx!ANIPUKB%wn~le!=S;9>UOz)X)If#rpjmBNiAal}N7#4DZ(3eL z$QIK~@!33uVxqnGkuZ1e3@`kEwwPGY#n^lRz0zN~5?-}kxwoc~o@$;$zBwp0d;@@N zYslxY@3?GVQlj~gs_T2UYTsd3^K(P*p4`nokPP&O$S&vgMUOLaWAzc{I}2Lv3R|)8 ztI`mQ`2CLZ`<>B5fUOeXKQqtwt0S+rwMw5IZ`$*J?!5!GN~wRVH}rSS6tkx_uky+w zis-&!>RdL1e^mo2O^RzvCS&RP&jO^wO!xRDScI(KS{j@oonRi5H`x&L`=I8ROZ!GM zYB`*{uEVfd8(T@^#;=z1?;F=BY>iUpzo&G{Hq=0Q=Ma-nTTi?O1*$2@hG3uB9?u&O zCUGa|1u<59H)nS`a8xr{Biw(8uaa}^EHFIOAg&;jXl0uyGANYNV}Uw2#P#f}=>gjN z0K%D9q}?f2tpvxcm{8k`W`;)#N9toWXg($HD>?R&9stah>3=Ub?z9e*g`jIAUq5AM z%op1-1g>hQImEUYe;da!+A7Rp_3(nIp z{?~5T;xp+-k^Vc(+NjZW*=vuP+tSY#M!AG1VEtuA5h)dcH`85}R{aLudpFqg*}+Mn zuDu!tVWD;WQufDhvuten?IUR$#8$Og6NkIV5URrLK*ETa^LU^n{x~xKM}-+~DnEzy zrd2j|qv^0hb~xa)(#<}{*O;-RFkJG$V#WV6^|WxWJ++ygAD0@qK#MvHSIsZIYgECS zs5SMdJ^u=jN2&#w)Jab^YKN2dGLgo}OMPE4m;QbXL&4zvAEZ`a@FPDMB(MT-Pe#PV z=>gs3hAECkr3@PmB@dMu4`Vi+Y&sdx{VY3LqY;2=ji6@a0AP8N%!v8YYP;`*HPMH%@FGUwW-M+Yw<;KSa-P zzz&$D(vA&%i>ih5dJ?&D$OSEslh>y)gLa46SkeBBSc-nSOzUcE7_W0>rdFfEO=MH9LK8~Rkjt{#48hu_%^ zM8l8+pbZo~>y42qw4u9_-dPb$)W>(u!j{9PjDrpY4PQK$NQm{M9+PKHVwm|BP{I%b z1_=#Auu}mp(zl8q_>1(uZS?o^e|qPkGVL}=m?W2VTKId?jW*g_Ay2_Joja=!D46Yg z6=jr+@l1!mm+HPMQ~Ce2$p1{e5tbizRd6gpwvtoqXz~OI|N4hQdh0tUJO1USQ&T60 zPb#vG$#u+tBhOC7$p6v1SKs;8>%=l`0?LWAYaJje4s9K!d5wH2gh@_hdT}6_4&N!d z&CVnwSN%(R{xS1*UdYLh7-Bi9;3rh0Wy@6Dk%1{ovA;8^z`}z9&{dIz#komr{UToW zAgb!Rc`qsbsH4kE#0bAYP`CTIp62_uVP$k7YGmHXR;7#e8d)`C+n6UuBjGOSTRp9O zwRYH1Z#$`y8LkP%Yzf6z53BKbPu@3dl&6gOBv5Z1Gsia5@*>pm@t~BW=}jjY-Tj)! zJeNyK7ep;aSDcQWO6_Fck?YLQcBbv2=6@qdhxvf)3(}h;HsNy|9v3z}Vt!;bGhe_1 zEQpgcLqXwzDqr74aZhd(e?^hQ;aNy%d_L>WYtw_BT4U{LPwfhQnKET_fv+*zrFKqi zjr&c?sZZEE@%5h-cQ8LK8J+Tfizftz`E!Wo zeLNh?e%7M=u*^qImRmo_0kOr8c690QPElm>P7TKru^qo(EE&5TU@o41OO{b^!Nju@V<$yb-ea`E#h+bxLkoHhI+v_;kc4w^&WeR`=g6R zxl<)|pAG2FnK5Eti2ZUSC@EL}wVilYv#nnOlZ-V>L^r!c7NTf~sA9ZrgXSSVe?qBH;Y@xNg- zAzHSVbT;$;!jfyH=^t^hnIXI!Sg{NNAX{JlsuoOt$S}?*$BeNc@+ZJ5RPF9@LTb?A z&9a^zXA0tHFv(ox zDAInH9(ox7Qi1p!488vrf&x>qFWXgxFAbW3yHlFTp3hcz;Iar_u<~kPxm(4wA8)@N zxO4Y;=Nmhuf#Y99DCabD#0JBNIX_bCsfx>JZ0luU{l=K%s+ zMHj-D1EHfEnFi55fI8EH!*M{JmUJo>5S-H-gZlXIg8?U>olaQnm?q=QYggyz{&xZ*=3IEx>N|Fl#>wQ4 zrT#hwV=00i!~5j6m_XtFm@$LJVBOVhwE}q6_*QTWsoWh8KKM~cQ6ACf_c|rwx=Xy) zXQ(z%zuM}H=bXcJBDL(!l_ky0?1vd}?c8Xiy0^LK5h^2Q(OmyO^t3whCZV*e+@V|# zY)!9Oi6JB>E&3Ve<*eqa9$5M$0mBB@(Uh_3 z-}Hk?>1JU1M92@#^?0#|8)NT5^zs+Mo6*F7kKR(<=@4_o^T$MD)2Q0l(A|nnrtP+| zo&HXD^sVBpFs=xPs)g_z87&)2@W2hayG*%TR@?foIy59rBs%JXGZD{EdfrJiIy*XF zh>DkIA1s=LnHD4z6djFuuVn2MYGF@Jke!|0@G=QOv2zJ|9D|&qmuhr&V9AsfOY0^} zd|emtROnQ-DrwWk&P!jfbW=JUk)Kl8YmLR);|`DTn8>YY%9Y1w2NusBAVD6`WLKGx5MVXD-M;7UYdN zs5C-%>3&QnIr$f%jU}4>b8dGz2&M;xY>C*08^Fsl87K%2Dq)#piGO3VwWk4xizE?; zD=2BAz$t~Y?C7r=b#J`gLkSUT&y`T9DPUdn`o6i)i}*w0DMF39S}5I#N(D@tjf@Pc z2+S8iK48A=C>V26@y_^WO)u|6B1J6=j!luw4}uQp6JM@*sKHL=pXgx!fEJ(34E`Y- z5h4`JMC;<{XLj-B;xx76^K!m`WaPX&ZruGlH8u#FI(#e2N!(^o%(BSbhjV~vZaUg= zX|$n3L1S|jT_2rMYQ``3@~j+uqhMxFc(8E$_q#AhAtQEdp>QhT7$UurbGsBtBE{qoJCzI*in#dC+^bew z#(!ICb&~aYeS^8ClAVwza@LbE1R@>9`91bQ1ULssl`-p!o(5#)2}OW~N|z?;f3DRH zfA{GPEYAw_*BHF_0sPwlzHmeJ-=rXa39}FKQyY5xJ_XCVf&-?5qzrJxLo@UPOk(7q zp)=19DzP=jn{p zbbTVxp%pxM8dP&P)Ays*aH6C{!=m283nGg)yZz4~e5}q2=&12pK{dkv?JS@!I0QNX zgJ+%so+Ce5sf;}!mhtBD|0qNF>PXfg%IH|UOhtS;a2H@Rb+o!!FW_#e*Wmm$P=7ER z=KaPq)R25un(f}mlzB$XJfWr*CMOjZg8c*LWD<+uSq>>sTs3Vf+wMWCIuyasJ> zhsbC$4{IyHO2b`4XNF4W2e=>pky_h#@ES-NjYF`YSNrVK#SmiF?{%2hNU+EYjr;3b zHll_OD_ShQ=5lPED5DrC0B7amA9}@Pm%(>5?rw}peA<$r-x`*1GAZ2>>kpV@P%Efw zEC*uv(0gqswaOsK*=t>gv?=#^d(zD9q_N0kb!%FzW^!!|sS4D=Key&j&-^-8_m&-5 zk3sC2K z1M1cTVi7QgULc!k-m{bDn@BA>%NUpsmrly290YiNxS^@iUXlvlGU@FKD{R*#wBuPnCy!g|$d0{h1l?fFEry|c+~3l}q5U^&R`l+2O6#xw)yD~^ZG%c=|SpVWy! z8=O)}M)3YD`e5a^5cjhd6sN*Mx)SwD|0*LFNwcxKIJM;oOEZixBn%sH0G zwm3AJ`;Z$ml~Q*hOJ>Z@BM-T5N=FcdL+em}d5}UdWB(@~1&IwEQCN{@V0g?wYK2-W zX2*#-h!_>is*d#--W2a0W$uLU|3D5L_d3s4?N>yZ4Z`sTgK8<-e1{jS*t;vmvR*M4 zecP~N3eD1sK?lo$Bs3uf;`K<5i$@2{iqDQsFw_ z@Ozv8?z^ars~!51p@jR+r)55Au0~COxwA!oJr-4N^d#VA@3-h=1B%VMb)xwE^D z?A4G<2P|BDm`4eKHf!VNQ%r#olewxB{Lw}CvxF$8*VwPox1NyM-QrJ8$5k{ue&V^jTit*PDGtzG|3 zm*Uzl1*x@IVA_IlJ2{LdkSR{{6AT^|1o(JfSNHd9Nz~PV)g?PBLDL3qMiVJ_JOQ|? z1F{+H{*bZ!WdhgDYO|v0t4y>0m=J8j!e#o|&LNh%Kz`}Qgu@G?-Qo{6$q5%@d6Jme z1;Vw@a^vU)qQ2E`+xvJ#AwQvc=lkYA8XtSTI(rknns17dm&N<}``+tPo5Xy@k2)Zz zi{}_8dy<;ZnWE)>^Xcc)n!V~@Kdmk-AqojbA?qGAF17DGJ@h_G*=^uW1oy)xSjILf zL`wMKR^R5ViZ+F61lYY>vo-eH%~!@Ei1zSm-5TI+=9nWMb9#aLL@mr0n88LiPoTk+ zmV`F?l_`Tl$j5PBm4QCw3l`HxtItwO+n9T~G;!}snaH4WZ&?GGg5D87lJ}h~UfD3s zY;dKo8)BGLG(0_SF?j2?Rx_-b-tD?sr{H0~cLOYc-Ho)u#N9ae6K>qeW;xRrTRRd; zoVZApmZjzB5R_1eaE&Z7<4fJ}bZW8;ziqO{8(ctPpA`kuwCUe&?fuuqb20{C$ZKH| zsNc|P+R|gM&ki@(vfI=Y20v&AD4qZBHYYe(H*Nl`+B&AkfB6(e2Z6MY%Z9AY3S1C= zml#H<4A`Ac@AK98IKj1HD`hcckZ?H;BMR<6fJ8a4C2CTB-LL<~m;e41+b?9dNU?*O zqGTrybs^)Q4a)v^7uUJdGbJ3{PN(nIJMb#X&>fx&c5`O|cI7y;=S7;O&6B*Ce6Ryz zII*OD#Kmv@cXld8cFn+nIUk1_@)Np~Js}dnLQ%ZYLh9MSH36V*m8ky!=(>-&1?}MF zGuNKn%ghR7Zka!7GKNxFZ*1UrfsYRzZj@SZw)Cm_#ukS<=rP;$cloRg1L0Q8Ixsl& zVi7y7ihC3&@h{f#6=n?vNT)-;C1*K#;9*~V&;bQ4_FsK?J`0?-rD$H-s%*MKvvR#W zITEFYGnY#6c3r-r|28`l;bh&x}HO6km>!<#I^9$%@yXJFWn0L zU(|R#;u7j_+ z<$FDSJgtLxDsvs+8>4nPEv{ESlyS7`+%H6UcRSv6s{Yx>S z$*Ow%!_%~UCaq&(YTfZ>5NCG{o-cWI=%-dnl&#T8svBzhn3#i-GLQ4yMMX(XC7_>A z`G5~=6}%?-3GY%>+17&}k_(bUVLz-MI6m!O%@fSd)X&w#09*vwF^O_YR&2fIToq0n2rpKUkA_|#rk-hmW`geem~)4 zJ1iHOnJ1XlLNWVISX6Gp)x0mwccN%il^A!UVL5ZhRn%s&VJVPn)7(|`w4|0_wP>PP zkydO1yFR3j->Gzy9QN_56+KI*zmOStqf~OPup_Zfki5LA=tI41Qm*PrvD2|%fFLeM zeeiQATWs(@Z6?6*D>jye^R-&kfcQe{Ui0;Fix`@s$JEgP%#U^RA06vSb3QUyL%Y z6vg&*jqkPVxhbKk$X@_g;MYWJKkMRd@I6Y&v(!D}by1y_{44tFirk z##ZZr%dcz6vy$cb8+TsleYQ zA3J<_6HK}@Pd@1sul*U+J>?K3mF&Vu67H35FsZu@XnUh-=0$B9b_=C5I_NhcuDh=n zSklF0uhH6m?rwWAK#;JxzPc@$z4sjDuEb`0!O&2eD*7)WY^g~s`u9zD;1AY(Bgc1= z;r7+urV44jB@!5hr)a#=Y_>uv+uz1VL(;iB22X*H)`KSAtzqphAMSH7JS|UruANL?hy3FW;7-9jUf}zG*Ga$Xt0r%=7Ye zp@!dJ4JhshcO)EY1SaaFxs(&5F7HwCS>L<~@Ikp`(0fLVcWu;J_vQ*&1(nVwYdHkN zbobj!S6Dq)w){lRI=iI%^IgP$Q3_VCmIv*_tH2`Hw>B~!;aJ6xtTMMeD8oa z-!v1|l{_wMtA>mWg?3Lfj4#y62NxZVPH+jaRVgB0zZ!B&e?B~-yYKw% ztJBC`3e`Pkl@D)|{()}Hz+&3A5f>D5YeArmewW3C+W~!Ie-A$}_{vnXBr1t`7m%hM z)v%Lpw}Zt{Uuj;=znNuV&OLWThw(~_XgqZ&kRpo%C$QS)ylrx9EtP&1z;Hgr0BgbF z9bea|pRP`%M#(|P;&_)wCK@&;h*>hQZC0VMfMUm&Pd56ArOW(R>3TAq2(#VkI-u3kNaIAHv2D?YWZIOIJ~fucd+2Ts@ZZvP#FZ_FNezi^G67bUYgtFL+A&nq#Z ze!0A${k@J=M9e~fNEmPWn#LS&tt9@cKJ8wt5_(CkE0IJbE#I0^+V}nS=Rx(QCYa3) zfn-Q+hmj?%3t3HHe5vx#<>|?0Cz*AOkr%=SML8xduMZhI(|J`(B~cnBWNH=ZWg{MS zI&b#0v72kVB;-)kvU!>y{zRjjD=!LO-NZ!GjARyq5Am?po-&k4R3i(D%SxHX_MB`& z5_OzjQoG0(pPAIk&XTX6S~DNMX>yu*?M{t@9(I>lzc1<6U}Vq|JSMEjLO{EV10(g2>Xt*UyJ*8wSneiS{>d3w}Hp zVtPvFI-T_yh#Qkn1Frm0|B@!>9JaZl$h zEwp?D!nT?_^Qb`b<~zS%owe-yTb4A3$hYs>r(gDiQAx4{2g!DEbvuswzR=xpEaXtW zA*TUtTZ<(+QT3D|*W@*LTP3BY<+s||arb8oeEzB;?!-?9w@<%il?7lGHW7%cfvQ=b z46Yg!N_r} zM`wm@AYOIxb*CFGe61#BG*Gn2diUTZ$QoxVM0wR@hY2|TvI1=XXXfeC`HrUKBdrH{ zn=(kgDq^wiR<5-~t`^#c5GBz)ZI|U0evPZnDdncmw=kVthi^ zRF?uDYv_8;sZOP=QX-E_46Q)Qv2&ddQ&OCV8AenrG+c*YQ{GCTKvSg`>A6*Ibl2m2 zjWY5E^dimnES(lSOAGGnH^0FO@xeOB!s2dEH zWC@xr{pJd9^FPjg%k!XLo&I|Q>s4UBA4J#GY8?h#%PKw`R+viWWD2zov{72w>g{3B zyxEn^Y+1vg&W`y!8pPzC41RbM^?|39Bd%#=Nt7O3H28+8Aqt8Az1eGi>PDCe*^Cv) z(988ZB!_vac;fZ1dGJ&S`=!&(%Y7dm&o-^}C|iA#T1h^e&5G}vkIN+Zp_nm&+z+8O zZrhi;*eqYb6_NUEcOm<$zG)*%d32%Wbbr*hX=ZQBZ-@cvQ?lq@Dq1MYUJ{W->N$}Z z66|wYO`0c^k*w(8mT;BI?Ib8de%u+tU|u1(U~!XTn|4>+Qzv8?m1ob%XI&|c!e7EN&l(wT*{g3b{0<{ zM1Qta+v!duvanQeAlH?r-h*FT*4a^$7{c6}>-5$)Hv2p)18NBCpOR>~Wnn7!AS~#s z#Bvi#K~Xx#@sBUJD84Oaup=$@BtoeYhmI|kHFwY_3pBspx)4_1X|M9p=XSte#d zz!lPSjMM7&tx?PmhfHzrwN;?bT1S>@tlT{tMC9lz^LHxF8v5py$Eq|syZi=qh7E)x zUZ#|nlb^0ziJj$dN?K#C&cGd;kIxnDBd(iAu^ISRz9jRWLOdFiVKRp~XV0u(!cYW% zsibTf*9E>y6!XIHua+hDg;?7rhXW~67_=Xh+aMVK+eJ?9p&;r#wV0?N zJzM(RHeoc=%N3iDQe^_$*MknhQ zdAbgf@;(3Qf2~5+EIss%O z%I=xIz?X}HbcjHRw`eK9euOSdA>~UmhG0v8?nBh2Kjbd0HA?bf+#x(g%2GU~^%r3YRT>mQJs<49+;6 zk&9-2IFOJ-^ZabC<7}MqTbbaUi8o5d9EUD842-^J9V725?Pb{eBX5%E|Ers_xRmGx z4=g(Y{irSPEI*=Rsm^qiCVTqytdiw;mi7Y5BF8c4w~onkFpjW$C~nK1gK4giHanc> zcnQ&Pq&BpP8G)n*?^mb?dKv7bB^8xDAN$uOSIl#YcVEPKWWG8-gC1~hhTD1Sn;&Ne zvFy}38hxV==s1O|drMx<9bT{KOcd>hz=ZRD@TVEqSqZsi>8A_#u#HqL z>p8y4L(-=Oe0Vb#KuhUGCPIK*DE1D1V828?<9s&Fmlxflxo@#hnf^M8?XsJwN`g4C ztXYqqJRVezFI9(KOrO-$^kS!SLY}kx4SfT74*xtZ^xswfc7E%d0)9!fXcT*G-ZZ2u z^$w^#;tnOuQ)OH!V#k|;RqnQo4go3OJ4*WB(pArfVQ|*+O*YU#~3USyoaIplhT!DgoihGyv`i<;U6J7K4DvMmC7{ zijyV}iM%oB+{whu+P>GW>%cB=1U@*ZWkDV-eLO9>bAH+>PN_erl2b2DyIZ~%wtV*Z# zJc&m_VK$$i@X)68Uz^9IY-0Y9F(aysF`VM<+Icrqo(|Y7-Z;jtKF-8sCig=65+D9SQumw!8x z^aVQM{LKu}0V##mo~wM0*>kQp*Ux6^_UYHUZ8r4en!w<9y!H?P@5%}gqb+B1m$KMs z0g^(VotXsk&2V6qS#aO6^jbMEu44$5v~IA3v)>=6F(W$ouv5=HP-D(TkWHvK?xEO8 zHjHk&A1zI~rLjd419a3HW#hVxJ}UK0N@Ux z2DhBVytV&YJO<|R6Mc{#4~QH zG-79T)Gw0*bIVdaJsZxN&y;_0Nr$UUdw zA18-51{}nq9tSXl!94GvCH9%xC9-bAF3bnoK3-KNUuqh=p}NQ?X8vC6oAsr)c?{hV zMwv*d$ zw`&J})Z+YCCK0PuZ`y=os>q6rY3gN!R|5}LVDKGbvSmxHQr$9KgQ>BC(JGiVOo!b@ zRFMt+c5{-LhK?jg=87P;I>g|g-@A_YVxJCkxUi@clRYz(2zr?K<4}@rVu|7=oJQOx z+YwE`gbiu#)U{J@-u#as1&Y&p=%c*a7Rs*%f{QOq+Xw6rO_-yME_)O5udy}a`4i1+ zaXu+#1iH$aKK^StT-aRl6th)rgLbK2(){%mjgGkQ`lM9doa>C}ZhhAtIihED2EaCG zNpo(F07&tDb;R5^CF=Js2MBwvq7GNaVmhiH#yr2(TeHG@2QHvZad6tS{JR|BggRai{F`N z^pfozXfk|>#bf_C*wn4%uZeSYM9tfg*wlL2G96{h6Nk^Q&0oSgyj{|kHhZvg3#jn! zC5I{%YjusI*y5kD^IJI{5rJv-$PiANu52&|jB;QJPQz&v#$gvLia-;`pXk4WTgm(U z%EKf(;~{X14SdH^)eO>R*dqfqJcVVNoL&M6F+-9y7vgiJx6&etWK_xK%LusAYZ`8-PGwrP!OPhXC_{38Z0)uu6x{**T4V1Y=r-=SKnCGwOd8}eIxsm@1CJC;3 zKHc!l6mmYzP!++Hab%$ib*Pr^rBcIVCps@0|C)bXu;2Z9;oaqp?rN-Ll$s2D&Abg6 zSIO`0=Hl1sq1|OjaI8g=XGns}kE7T>5jz&yCP&%cx+~U`dGW=qI8y2ErX-}qB;}7o zEFoROE{d*ch$48GM)K-lzHU-gcpR4J-i7~kDICW>0vzEbyE zm8NrYjR1HK-jkoWJ6EA%VWl`gVN}ynr$>~G{S5rvTad`l>d?;$p5hhJV+D2%g(*SBExKgKARyO68F__~sDr5UTDlF@wN)zVVN z?o;%+`Sjcl@c1eQ)q>wqg>b4%UtDey%{Uj1Ym*Qzp8GxAIUY^+neO)V^*YUa=gu=W zwX27%rPbn;toPQ@>sc!Ihm;{LuYjj-6`8@3qsFBQP;c~OPo0{f>V@SKq{kLhSh{dp zUkf0;k$P}qcB0gi;5+P7Yi;PcEMBU}o#9l3xZUxv#qFfmBKb3WyU)l?tU{OZo?uz3 zoD!^xdM$~e;z8NE-1=9Su6qSY5pU6K2`OS)rv!E07j<$5?uZbEp?bfxZS}ylgUO(% z8V!k_&G)N+gjP&sem910xwZ59IUwEh?6pl1`zqnBTesfdGi3SG+4h$&t0h)6!x2I~ z1WL8y4nqDDoAM+|{R;-AU&`b^;w)_ME)Xj8XQ%C{OH}WA1YKn8EUV9AyD*hq)`!v= zgjGu-m%uEWFGT5u${m1Xq+UDiNc1|%b2KAlsxo1u z)VPZ8ypV<8Cz)C4MJtAL#10cEY(~qE6Ee7dbP+x^Ks7 z!)`KeaN#0jAMbwnZ|N=BYBDRQQ)^=Uv6HEy#FxV+`)1A;IAi8c8Wo*TZ}`GvxkuAf z|Lp}p=GD)PZw+hja!?3y7h7HP{!3LiX}SU^)eDA58P;8D^nf!tjb!NKIzzSp%G7-PplQwacH%Ff#KUUbai0 zp6M!Rs;8VIjAnWukfzD;<_$gJY=v8Qn?*XrC5u`Wj?X{wXbsD}iSEmp5Pefs9q3`4 zrwHMkyD^TQ9cr!V^ODqg>{dFmte9Em9ewqBPH9 z;nR@q=;DGkm;qF`V}c+lHvVJ1iAaP2I-y8ypWPsX3Wm>gqXIJSg6JDT;)$PKeHam<&~?S`QJb zo`%$M=-(YHUHdl2P&M6??@)dc0e|-<2Khm4EsJFpwjSyb8>~>Y8fbXVy@$W$`#%89 zKr+9b#a%X9Kfh2oa4YD(hM2WKKPgRLc%c1;@T2_J(UV%6N*>1*`@rfvYOLxUca${@ zY@83`iL2!w$LE|zs`2C0P3|bcQ))zsPF2>cza{~%xzP7F$XY`goV^IS=6JlOS+kAb z;>~H$K|Z&dg7?tZa?hWtRS!52*cCX!@@k)Iq`v6hmn{gDD99$?u z$G^bowj7*?!W!{hYff~%W>fIo>o&{cuko-sfk7NND7}~)(Qp+@?|Cd-O|U66X!nf=MgzFebt;<#cT@sYpA$@-&IEPc*t2lUkjd&vL0 z-(QxV_KfGHl`HETS#xI3N?-omr~L}xp*lm|vuDjppa0B%repr{33fNQ!50EouU?&= z{>BaD$z^R{vjyJJhx9evo0bj39r)0I~<;n?Au1>9lbw6xzo z)6Q%MqJJhy%-KO;Zb8ksM zyk=#3;}P4ZLl)&rp-;Q)wsg)7t2Zn6LwA{*4&Bi%#u+jGW}Z3Ul$u>_oNu)O+sYH1 zEuRt>ot$)aJT~Yak}+NZ?vr{tu?17}YyCpyY5Mx)A_jfDpn#7)t#y=6o)!+qamYNm zVM)Rm+FPV|TIX)K0gSohBy%2PpZ1y*EZ&&n!GOj^=x)JeZ$1*Ew#n!*SBxF?z>H;0 zwH}S5&h;8=8f)=OP~>U&`9KJR&@Qn;Hz~E2Tj#WkUolLmbVj`n z9OEe?KK6;5ii}*bPfpq?IW|h-qU`fGTo#1$#XdNoYb^D64q@+T_^sbpz3Sx&zpLx5 z@c;7cU)knszJ(&}_|OfvbiRje_}1FIt+!6keaz%5f80R6{hjam1~6`|eAZ8Y z(b%C(OiZNLzwVWG)$bkyyANqvy8of~OS|r}YkJ2!Pe`||STXRAqxtwTSt+er-F{QH z|Gn4LbdTZ1(R5;z4jARf=gYw=Wyr62Szy6*jPao`44`M z!?u1)4_Fx){TAmCuW#&9g1vG?)HM{fW(BY$Cqf-Y?`c8PK zBeLdxgfmxDD-)J*?GjsO9&IhTaoflZ*Zd@{|GjPcnvUNVWZQ6!{gzl_3~J0JXlGFC6r6A_*)|SVxM5H zdHTT(y}ITZG{R3#ayfTN03Yq3qfW^b93;75SDiSwYi9~Na-)zgey^?6U!#w%E*_7K z0~JDzBWEYP(;y3~UXqj6vtIE2hsrD!%KnF)A+RjQH4(_|CqK zyO{%k_#Rq}xY?eFsuX$BZMFX$pQ-cSRJx8c^@=HGCV zy0Xi%v1T(kkKmo!5a41CNVKLd>pLx8YhmUyDuS#P&H^f2rDs0R@9+NsMlE!UArv*j8-6&@Xvn=*H@FI7d@+>U2-Vibub94U z4XzOBJod$P`9{U(1vV6Y{q;B4#_aR+6}Lm)yaYe;q4%XDk32kkW1iSI)INLfmHzeZ zZ%HqC*{fTO$o1^!zchXEbDy%SXY<|X@O!^M_`wg;=TG@c3w!G6Ur!(T*eBDAU+~

WvwCiFFUYeGyx#EP*b#uD{6QA8A@SU^NU1pz67^qHYf zFR%UIxAy+dU1#5Y&b{x=8$g^rbI;yut#6fG&bjBEefK_%R<}s-tGhOZXPJ z6;8CzWlKDx6O)Z$p}Tvk#EP5&UXn zU450@7DY0MtNGj|?It)tf8Uep&{P%jIX0W*z3NZ<^3fCP0R8yO?dG&I*Ht98I+>Hy z>wEvDvgc9V>&jV)CzTnx|(xT=|=&|H1oGmgB})>Ex46wC$lqH|2as3Rm6QRyhEzUcEXTd(7j) zRagHeTy)XJHMM8L_oEL#tj6=iym@oOPMC21+0QTa?67Fz!f^a?$5g!Yzx%zwUvet# zx8JgG(18aSdF!pW2L6&%>6Tk=3%|SR<}iQ$e0$F?x3pGTym(RAfB*dgw}@zU(o+oZHQ5kIl=(=HI#AXRorC({{;siRa_!vf+jILphHxk0%cy$4f3f z<>LF?%Y2!bbRN^ZbqNj;q7G6X4H`v&>4CEU>7k1eeA?r6QaM615t$vVP1usg$0kN< zGUC9;zfKhrE{4`QT6_va_>P|lbTs^E^+6RN8pQlC78I;(hp1h97(_nJF?T?*qDGxE zp6n@)z|N8Uf?5aAqr^^a8aKJBkHMF7oao$cP79avO&7jBZ2JD+gwdOS5XRTuiWiq} zN^J#z`I{D|9}wS580n;#VwpB)$1ol5EgahY_%N{DzG2#++j76;yTtP`<#o(ykKG#O zJicE3o8;mvFU9I*^y}#oz88-++_~8czQz7Z4z{!oC7b>7Sa-C6U85`x7mSL`y$oe9 zA~ilX3>$m^k9-X8zT#&T4?*x58^sC|&?8tWKfLCyFn!KK%prEZ_xlZX8*b~jz!?7i zUAOYuFuIXDzu-Y2`fb|y2>KOI2Qm9G%_c&?$BJK$fq}uHG)WBF&c~Ef3ObIHSmrn} zng_CsG7cCn6-h$2*9J_B_5*d*R3_l|9ceIfHry9Jw3P_j)I1btDLT;q{807%};^Sdq5kuSXR zq(=y?a8egJ@1gk*+L32QXei-D8;R>8@%ZS6oKalB(+!egW06$+K-u(@-za7UBc3Qr zW}H<|dXd?YMd#Ku#xxT+7~dK!4XMPl@g?g9hMMwdw&ziB<+%d+bkQWw@j1;Hdz}Z; z@jiT6@;uM&=5&ttH0`VD#P>dXmA#z$CEq2Ue3_0XXd|O1NOFblpFZzJ;fh~h)u{QF zH@!YQ|2bH2z?A#T>4>r;ccWW**Ij|Dd40P1mRs@av035hqmHQTJ?`iu!*?(ELAY~e z{S{(-pYW-tJTdIF6Ba|X`11A}%WT`c{~Ey%^xWXt1A!}SHx1)?-kSdH<<($Sci&}NI0~zbpL*)_@UrL4 zu*u);w;Krmi^=8>oxM5Sd~5oJORn5NAO48J@TS+y2n!dchG}Xa@s&5&Yh*L{mh)iy zS(w1ab`3vYiND1kz;w^Xv2e%w&JGik4dsQ0EC^58Yfe;eskZ_0HqGhD2GOrx?k}fv zJ56%&mFIdnZDS&5PLQUJiJVgX#@25b`1?4lThTANH*N^?jq{fF#!Vq&+h6kiHl_`> zY_xfv%F1cimvcXDvK-q+Z;2hA5Uf(VDXmVX+@`9nye*!RO!mDj_aT}0;meZed2TzW zbG)ZZSn?E`{EL>Z_{uAO&Vaz|F&7BAx99l=QKvY3ucB0Fm#I`Q@{_n0OO8c6BctPC z#l367+Vz{m%;`g6=N;ySS;#F3@9MC5WHj7*=jyN?cRBNC&j`D2zaR|ZmsB-BRQ7eP z>|}g%(&J$Dz(F>8z$>x$PbTf;yb9c2*m=p4@T5~t>co)RW7F_(xc>SZYRVfnYz$xj z#y7$94t<$$(jm-WFu&UBdE>@Sm~g!*Tz>f#CevXa-m!AR@yABe^@HTfdBe^d?UgG# zlhM@}ASk*Nypt!JCmeqqws!u0;QLIKF2DTOi09WB!qaR!>t&cQe)yq>go6$`APnN2 zg2hzor>3|&uKMen+;&bE14_&imi`r+Vi7G{;w!KCIRgUvD0Q`<%4MSqTnU;Bvd=h~ zO7$XN{q23`SjzJHQddcMkIDV>q!Leh%xiuf1NdG{GjA`-^7?vP()F0i zzjGj-*Y#!j?S=C?Dw`V|WJCO3xndV?BEC!5rZ!MqC7sImB;uEDmfN+16Sm}!ZpL+p zlYY2XaqOtldphu^4bA`--5Y54k9L+H$_K?M^-82x+P2#kGAPlHkxobKZRSdd&O7* zQ7B=H=RdIWQ__)5uPfeU@-4BW_!O`5+@|=-CmLs|pK>3v>3#UJ3`H)b) zNc*znd7j(O=^XFrl6~^nY0M?>w>?U}OFY?UEb_s!B`*}ON1jwRZrT*y@aDILOMZ4) zQGwO?t5>`<{55u?t5WWtbY9;I9Kt)^dRDmNiYu|Opzh7bj$zc=XQrd`TVK08^UxlxI`3rdWaGC_pV-UD0XMNd8rM7L-AwTz%+AUYv ze(|*M>c5x~F28CteE8GDScs7;<{FW{Z`FAC(ti(!Z~gBuCTfSm(@z@;haNO&A0oIL z_bu2W`VLGMbF%i>@-fl*C#i4k1pj50oglbFW!dDlciqX5Eaoo>&A*`(C{z+$jBdF!V=NQv- z$lMP_o~L&4Jg44Tq|R16|BJpS6KB!TgNwOs0=TU|*y$YTJX~ zL-zt+#yZN@uKm5^;>!1lx_uvg; z?#s)h?{hDguICA>SVXtwvNKUkr3YtKnMPP)27p99;{(r{p=t{hR5nb+k`;f^kAfxW z@dpVoVOEGucxIN;0~pcqfr(jyn0RLNZv_y1wBsKJnH3z!i?I?)e0mHNecLf%?d6#$ z)1=jp>Z5Up6UV1Q;8U!4<8vCyBFhS}V-Ks0$;hY!ztlD57>|3NMT;>}WcWxLJQf)N zQarMxx)>`5s^JJ^iY{Z>A6ZY2^|UX09hS`=oC>4dWXYM2Dc8?w=<{8^qrdx()oc0z zXXc2i4t!7Vw3!QRlGi{CV?MT(-0Ni90+P8+{(1|(j-Jo5ZyR6svb-)i?dzZW^0M5w z`G8aDm|a!~f-WBgUdbMLvezVU!g#&hzv(1{s*~bW-saC^RL_3#O*qBqZRc3V%ElDd z%YA*-=$=>7k-o=?$6W4gCGKdPyv3w#oXo}K?HC@W@!>gmWBdg&R(g)x(<8>%sfb;v zKw1dqONQe$OfIb};MA@%1b0ltYfh>-*%Z>}>YINaW^cbwn7MEl<8C`Vur07@)$L*9 zy*J~u#RNY(lzp1to7yl&nAXMi#gk&@nBfluFr@el(!OW7>Kni@;ZWuXv9TdFj47@l z4gr(Hm@vlMg>4d~}Xg#!nmFqVrbV9E0M z21sSE4QmYtUnO_7b2u6CIA6|VsOdUkTPzM%^+l5%k7c=Jm+|F%qqD$sjBKkPOLQ(1 zhPiwQqugZ4Sr&p2^z$+lexC4muQ@#4Z@k~3lF}IDL zHe;c^B7*k}mVDdzGKHeM>_ye;=;P1()5|IaSMYN4gM<7!Sdr)DzMRKkG8(7hlz=gJ zl`l|am@e;CNgIRAB%?0%BqNPvwi1Rie!W!~IG`O|i=sK^ydO@g(l;R^1U4OM#ZrWdq@RF5a#~f$v6-zN0m}5}FSxCl7|RiB~fm-I|lsKQUhVr4qHG zok~Bl;-yhi;4DJaopDkpwne1KiGSNbq6RThM^20-vMOhZ*OXa&PS~Vd)g@s)?aR)T z70n)kkzJ1!FV|_Ky?z_6Us>Kxd3$&}K3-oYCa0yB+xPM3zPwEOK6mneeD{09m$Pk` zJ@knuJ|VpI&2Pk5!FP3A%42ZYIdf)*_rCib;n{!o{J`y>l{RhK9A5R>H-xX^y~6wL zx37)0gAUvu+eW`Vy#8N;o_`J>{O5P0iP%VeB;S_Set9EiHatEP zRisQbU>|<)V0h2p4~EZwb+fJRZE2RuBnzw8gmC^3M#AGBI~W#Wi)E!bn0P&4*#JJ| z#K~9M9Od;cEwbQwj5o_w*Ei|r`HDNo!#U^khn~5lnVx~)>>Y)e&NzK~*a6#IH>TWZ zL;J*wl?%X)#V(n5X7->byU<%WV<3F=gdM^kpSL`$+T?6{y$5-Dr#XY+gU4+j<_@K{ zRsHg~^XmC_>uP%#$$8#hO_u`Kt~Fc~_4OUl=1(?D7+)`6u5?mCF*mi3@ILogvt4rF z6g=LsYeku8!!lMjny@tkzyAdPg4>pwT7aEi8t6G*13Kq>+GBi~nA!mBbENeXm-pXP zmOI5nx)u*;VR9R7F_dJoD_Ne?zIZGvCYIZh*YP;7uR3_1$NF+V7~y3X^m*rfJFHu` zw)!$3LtK1U>tT<2WZ2Wct5v$n6~Ed?eCCpQp2|K>U#5o$#q z^WXRUFlQF-7MOs&Z|#Qgw;w$}yz!&o4*!1E8DYlIVEEy$ZVGSy#QEWw#~%{j|Eeb$ zPj*+_yDq%%ix-9$|KI-(pLoO5!X7&<3>)#1idE~weCEPkLTmamzxt2cib_2<*Q%AFClSf+mMzoUlIP}b6*TsUiF*s!WTRTzhW$`5RzTRpte;` z+rI4DwZUy{9_!2fV1$=l(moE^P@RP@<?FPu(s(dmA zM?HJMO>nXu{YP1}Bx7dQ9imi^Vq#PXn0EM1MeLdYB2|YKNk!HJB>&K@CbHEg$_<soz#c}7aUwEtPLzQ97xBiSjnubYqaA4S3nsE0$pK@Wkz5F z`2Y^Q2CcvQw_$8#115s;uy0#>Kw5ySyE*Z@Y4z>s8}u0anSI6Hv)qcHV($6GbASj} zAHATWILc9`+{P4bAyLo9^8kK;usPlH8nbRGe&139zPNQbRvUAI*d~d&su(Mbrww4z zcyKy+kSnK(PceWPi03zz>tS?Isa_ohN+qmtQ+WPYe)4vbuUb$&h*He0Dh*C#M=_Dk zp~B?$+uEj8mJA7_oNQmt_{UW7z(A4EGS65UwS! z=LFn2ggQ(E+aHW~5uXx&IEJz%-%hg8PaT@#r_nZh_3-KP-IgU*8|j{Nv|gx4_Q5Di;I16+3UI&ui)W8Oe8<%k%JabL0n^TLix}G z2g5T?9}4^JjUTkof1cb}>WZP%KGbg;o2|0sTy_(7*~01JZAWY$Ui-tl{BX-7eNfVD z(ljPD7x2HbvgrRxQf4K0^euLlrNhUvGxNdYba4q_NV3_qKdl_VPH$ z_i+l>E4MmPw-+$Un{cHVOIYC)Ytd~A*wo<)iKld-al8&&s%xv`= zsEow?z3+WrIQ{g~!s5k?5i)M(@t4AVtL_W$dCxzEx4h-7aN3hjtt*hSc7s2;g4%N_ug}lyI#~pT?AJU`{d(_*BLKGnPGQAHzD8c zayYj4x%lEs@cx%y*%sISy}{nXWtaUjEWo7mpa0n(ci3vj%x(vel`1?G^1jY#stTW( z(Rl2#;c>Y=v(;~)-cVN7nCNAS{@LKf^}=Q@s``;nf8JJ(CEe6cO?>L89xUf6Z@VsR zs+Z}-hck2)Q<7=YL2TsK41Ahm1qv`h!r&|Wutiw}rmSMv6PhTJPvVWE=SxvpJi1_6 z?O-|aiZ<#JRvb$<`J3Ps6uOmqEORsHiiOfR-h0D`L*!Lz<6LpThdbc#1387UYgI_$ zqV3{pVPZOUtsGa*U@v)KDHS6OWLGNjxK8jBsE#QXzSno`uB)(`7Y}9GeoQ`2RDRYepNM>uK`2~>?KjYlnXZy-_A;gTiR*>U zoyZ6IEXP68Y^T-^&R7#)b{(`<%=)Gre~Qb;S~KE^wm1k=`}D#&lU+sG=n`ZM;`;Ps zD{yUVWlrK^r9(Bbi-$#+B*iQ*&h<^L=DaIi5!ynvYedx`K6Y5L>jJ~4)l>~@|0t7M zl(JdLH#Ho1?U52lUY|hQ^C<|V!|T$f)pvx=>+adMCA78j{d=(Y{jRtgi+9(>)1F<% zl|Ae%>tH^7WPhc;wQEC+F;4yx&)x*y&f`R<4vv!e{X(&QZ$$O#7$-L9FQvjcPL`QR z&IxOr5Eh+OYPo=5#!2C{-Lxi(hvvW*CX9`SY%w_*FTSO;0mbyh`rKNYj3Abj2~R4LV4_}rxGRFikwAx;RN z8HV;hqoZlq4n_jrQ`m~(#2CB#s<8PUd@g-|m^N=WTNOO>=(l!u50UR~Q!*KI`eW*a zi>UfhK1?45dX1Y}J2+Ead_ zttD-LR9M?nA$?zxpUw$B2cjg>)Q`AW4^WXrT~I)K+jTX0q8bxpFdOM;OcOu?18Rrp zQfTGLK&6xlG)M?j)s8G1XJUs`*P@d5Qv_s8;Vpa+J~sOCG*yMq%v89VJgZ!8&#)OL zx7!b`7<-wbKc-%|h^ilxkN@{S-v}T4mygtCj@o6HrQ!3R{bZOoZ*JL7t$my#iw$u- z99Z3}(F&Ew%4=M9HTFCWFK=CTns^B+Aen_8h?*~?=v8H5@$b}oULN2YO%TqZ3XzKD_dkukK6$D;D$T9fIL(c^52y_#+<+ zM<0Duc*5gP$VHK6U8;Iyc8L&6xvY?e-X^Tl<>X~GmR+2?Y(GD|_$iMLbFi)O+26P{ z?6vcv@QmXQir+c16-DGPb@iSJlhlA`Zev>(VE^qVW zZIsHiWqu*d?GmrLDVL3$R$D0-F3(FoDhwWPFdT~q1(qR;4?P4TKL*_4gO^g|iN++b z{lcC!_3&RJ6bwr}GEE>MNmE2l9_8fWV8Qu`W*R`^k2mnYoFwSPZ4Y!@TiL@UDyOc|v$xq1V}>F2c+v09FMetpGg~*%tP2Uv;#c8c|+l z=74-8>RbDeNcOy(>^ymSr3+Ba7HHyN-g0DJDVKS>nbNcw^W)_2CO7#jgRsMTb7ini z0F$p+l-F!SuDBTklb1_}{5(eTluELay$TPZ{CaRM59mYm6nVYs==4#ylzOCHF1aEGt z(+{wf>RVk7R8Q|Om7_?Gldj@(dG$T+Y*gnx)sj!kQa?o=t}97q*G!b{**0{ZR*k9~7{A2%-VFzZB z#~vfwr#OL;I7!Hi-5ytaM;XVPeWy6(Y79DFcah&+-P|I_0r`Uo+wQywj7(cSJcx&G z)ub@DqsAmLwxhOfsj=F)HCaU+LXD$%l{-jdk!|hbFXH;KXP7>Ky?iNvwz#~THk@p= zw`k=aOMThP`<^oCpg6iby+2qu%2To*o#CFN z_UZ`Xa(~qE^)1O|c%nJ$Qu!?y7E8J8=X6zX7&CkE9JYy1Fw&iA(ss($mZ0rF5BNae zt`ockulkbqlH9CB`*w}Ny*ea@tuTaY=O2@SwjWrV(P#?@i_Dax1@oV5snI3oSD97Q z?4)`kCc7RcAIz$29$irZi8gH43|20Ec~r$H$zevgFAgxVGw-u`AhxF>s8A zU&^LJoMFtEQBg+wFxCMmO@X#H11^iO!*+!pP~41x$;*9Qz8sOAV@X!BCk>DH{v@A3{>#g+2rqfrtMF%IeU~_ySiERa z`1)7B5O&)Q_h#~?T%ep*e9DE(^1pfQE5lEJ_VaMjPkx$7`Xfh1Mr?cNZ+z{GSS7qu zC%*pFw;Yw%k2I6oLwV%dai2Zn`+;v?J{~Um*=YFY`NJXK^zW3%51~H!Y^$^D>~$5* zXTfm}#JF7wA5VYM^zffwtR0%pw8d=*zLk|4$O91%*T?ifv>Oc1CNOr=Be!sbg4!S-^98iAa-YJ&zvBgzv%omcAYN>|3FIG68UvQ{Gulx7KZV{ii>`I zbNKUJQ0tedkk5I!$~+ za$8QVuVP7G^^t*`7GJsIQ!c*pQd1Oc+QSpt0KO}%$~GT!K+69Zn>5YDF(-avkjej) zS~->QtOE}~5pcWl6{%-jEME;^KoJd*~AlT8su~Tqsb}>O-cn7y-&=gADwqO%|A2284K4 z0F%jVGRG&`tCT2bBGhz^YCh!cMr4~_F7tkJ8B7h~9lv}ZU!De+9vKFg9%ZX>Dw$$Y zUI|8LW{k>8n0c%4zYHE54E~VoFUR zn_lM2vdz57uE+SYY>SucH~A4>d6%7ND85%WuGWncx^X*ZPV$mg;`NN@oASt~b5u!f z7MZDzDKK+`a)l8eIg8dHlzU|pRJ=TNAv-!WMH@6iUFPX}V3KIOI-0?B4M|40_W-wn zCfDjo3&5E*tG6)>V?KEO;6)CT;_L6eA&g)}{_O4d4g*7l*FONZEp1r~*s9+*)PG6Ft~NdE^9V9L=%ivph~;XyQWllKjeg=dGP04^k#1S3 ze!g{V@$abdvF6v35NQ*_njq%;iHByRF5Gq+TTX-SN_oY)05po$=`>D6bW2^I3 z@pTiJ?9I~v?meo+_?cucQk`QHzk`^3sbt%?CoSi6%^M8xep4W4FBaonF2_IVXo@;C z5)qbL+W}+qQp6?<`1p2#Ie$~$Y(46hQ>+K-E(2Y#2JO_2(KvlY zOXesQyG%7Pr0eBvHgXv&C!TU|tF4^-7OlKhHwopxU*9=Sos;wByNNG(pZS$nUlY#2 zHq6E6EwI7&^?vR%9}mlx?bB&b+E)FV{3t%)uIqdAR^R#frQ-;EmP8*dryh>;*pq|PP8tfoxMDP1echO?@_pQ6hr$tu58$~n6_DD@dYiuCNfl z;5+NAH-%4s`m^D?|NFgg`4v}$AN=5l;We*$Re1dy-e?nxyY8|}SiNRVIP%CNup;x4 z@PYTgFTDQ)9}Ei?EDYbqdx;lf1?fjW@~`2GU;HopTJI-ekKK0iqT>J;Anie%4uE2nX!3LpXS^9m64e?-UNjXXot~*pOJeesfs0c4OFc$s((d z9ekTwo3YW5&}RE!Qu(rLZ%-4z;Hy0&qQ7H5ZSQ07K73hrJkLjt&mJt0`tASoB*CSbAe6x^5N{@o+pFGP6;hO%up!~){99p z+K_MMz3fH{@mRvjw#TVVA53{1k=uzy^h9&T(^QwX*!uD1^=*u#3Ryd%EdR8n82Yg* zjMo>>=kh6>_d)lVD6(ythq)c|=J?)SOze(Ty#B5*vf;jMtAW|XQ=B%fx-D$L`+hl&xkV^@#QLB8zyfI=*){lBPm;kB zdHkn-15cxdW5mAAsKbs%GBqoCBFZA02+|R0{!F(+Q!GUMuB2woG8ug(#nlE@L|vGX z^>G~67s*txYJwO)S{UGjFy2Qzz{%n1ZacpUoeHU)a`qO{zIjWAO7c>rJ*{e4(cdu+l4dOB8Z@eFldmRQO?>aQ31fp54q0ETe+cP#BtpA9mm!<17zO$GgStUE*<~*PLwOffK@G{ETeEgd6hVbRWS0?YfGV z()}~tI-XU54artR-`c%6`N1*EODN~{%aJXVaZg6uMuiMtZ)MXsZ4NJ2T zkCOd2nPC#3>e-~j%mQWZZHY-eB#(=n{*H>V37x{Q8050aSCg$KzW3RLp-;)I4BF?4 z$=hlwm$0&3((!etJjWK=;nv%4$I9Qo3U}cdVJUGj$VWc-&*5>{F|g`a*~#M*zhtNf zZ@a~d!YA==;TOF4`=atG8t}2vJ6XQ*xsfjq=HUT`5)+%8+_&M^}fqt+FTjEtR2=l?+hL@gl>iUz9 zd_RzUSvnRkahWh9yX5kd<78L4aH5sx{>b;(lDy>0+6RKRc50KA{FGvpZ{@hO~$?G#eWe_ zJMBr~na_9z{_w$V0P6MSFMlQc^rt_ww&9K8ZMWSXzVVI!ww1x3`_IpZYp=U5eCprM z4ntV|%f!jxv(Eba@Nb{|gvE2nK1;&q-}>zEyXE(Vt8ZEvetpA=@Wu152yeUP&ah;= zdEtx`4hc^?vE?Bsf{b-Y%kZwvt|s1VSahDPbj3^r?$TGxVEy{bcR{9 zc#ykTsxjlBHM15Y4ptxP)}&>^*E`kautz;I?77G8;ij8!sdR2dU%c}l-xJO_;~C-L zgAWQb*#Bw#-*eBs;Q~zRfA9N0w3Xl6ZNFW3(;NRLXzORLDt^|po*usNh5xGTvGBG3 z{(4xkas}R@a%|XX$&OaNRk#WN?svauTQhTlKTl)&wXts(53)80;aKumB_Fm(h zPkT@!|KzcZWPFf(6cnG#8WUpUq;W#K2}?fp^@)Or22b|PA~Cc}K5+FCJ!P$5Mmk+Sc!z45$wT^IRVdn;lMocbWO5{K*pvV zA2XcF#NvO4pRTiv)vyW2x{~I{wvpz8B^pY)G)j_kD^S2hIwor_6b+UR%$Q^T+;U=Ig4m zV##&IFZr1O&)zS}ckgaq3;$fryAE?@oZ#iT8CUVr6;mEU7Cf&{g{+e{H@JBxT7b9N0Bb`pzNwW{(FXJEvL3C%R3wGdf}^rp%sStEI>^ zrFb7_q+xK)0hm}`rFe-NM;~xC@W%UY3-fn<__o!+Y`QH-!72kjjM2q@fwfD zw*P2s()tG;IL2chVG+v?<(z^~kO*XYw8Q_Mv1C@fN>%QBUz$f7FVs(z(E>*vDSGTs zl1II6zT{1MIX{kGYSEU}#!Pf#jojSRI3|dVH@v2EJ7Su^5Ac1%*it&ZbC{FD1Jkm} zVKy`^oRB^u%)d%$wE6;mfkz6mO2rXh3fUN%`S$(wu; z>vgH`Q=6>hN4j1n-^ztSZto7Be}+xwlFj=VyI*mbyf}Q#m%|v|8NBJ@f3VNM_6LW- zosTjbEY}n3hf4T(>VP_xV^x3Ub#yo7>xeQZ594^IAf8Jxln9L1h*&mb5E@00m6=l# z>Bu9QCV7Qp&T8^+(n^oEq(>c4#EFOd^1soAFNejq&dq^a&?&ceK1)46JrYj zKp&7`N^NHM{H9M3m0-?}EOfAy1enOKPzh}g>8PHP&5B7iVscysNCi5{btx+GWYgqH z-)Bv}Xv^z*9hTcr{d$7uE;H) zpZ@gIC)Qs+CTFXwn8o|V6OIcX#$@xg*Iw5J?VADLo3T*Bo{ROZg8M z9_vihbcFTtQrY}K0Go>!ig3U-J8d#&qOq9jxnQ32>+9yrGGZ422y$5$oiP+^#+KPC zZyLA09|V?7(j~j#J$>J~;h^nigjZa!GTgMf`+25J-JkigMbpEFj^8otzo@f=W>5cl z{afpfihFr4<9VA)S9zPh*X;*STX|oxZq#L>%-2;|*%obJ9K;tr+1%S@+2X;$$0A=I z>-~8hVZFSoYzkf6QP;c}002M$Nkla_LJ?bT2*0+whf5g44+)p7fQ=j@m_eE*DOGpQ|60ds(ltbd(qI z)9{PDyKQA}6i*A>Cgl^K_*mdJ(64*l8^Q}-@O(_3#>rn|c3HaACUP&j@F%wN_lH0F zQ8@CbBf`=pJBL}bXN7mZ^Z(dZ(Yzs~YbI{%d+RN?hSN`fGT5Dfp8Vv~uodq|;zbzf zXFTKSaa(BUd=o2=-*VQQZMzuTG6rggA9k4i@pT)1O}N*dd)nBbxxJSz3VZK@m)ak> zzje#{jl<#d=U*QF<*OHmS<{CCCw1>ywH`8ntNucVuup2d5bjyMAuO1SU)EcHG1e>@ z-|;eiCz)80amk%*=Du=^CQl%bm7N?FcT|l@4o9ETlvdX!b-&`B`;e_;}g$wb{=uKhOs?}%$S8*tD>!B*C?JI^W zNYC1r2iU2b>VRcOa^*ruu3Y?5o?MkgjXdcnZv;Z17??NJDUYA_WLxb*9uu*$X^eCb zK5sPHRxTY+OV|7IWyzTW~!iIw(Oyk zS&S`1>n0s;r&&h?I!*)nm7%rnNtdB>*D`5S|K3my?3ntr?SRtn;S z8FA-2+rKwTdJ-HH#PA{ue28)+eiVaycWrmB+Rpwj1Se3X$#cmazA+D$A*}Kh(b&rt zgC_b^bD@~l&=ks6rxL3)EtQ1j_6iCtDa-@M@<|KdM%SG0`~fXJT2ofTtzV&{&B+I z5AmN}e-zCt8+sUq?7?P-MKk!km!1lx`MVd!PRRo+VQqcK9Q|a6gsx#!q+Q6taCu@B zn;kQeKNIE=pxirGrOvZyZN6wmhj1jXc?tKMrsNEEG^5d1aNDdbV^*Q;6)N$lOaG1b ztwk6bj%hBpd1z@+t&GY)SDPLr$IRJPn<_i8L3Fg8sUcs*0Kd46dTv*h=6)fzMCUqiG>E7$gtGq5Uya?jGk?WIN4 z7ar^Yy>js&u18i>Fob@OP|;EEAzv*ujfs>!&w9Ym`UI1M2Yphr_#)~7Et?l7$W`8n zZgF|aU7~5=Jd1#q%}{K|9!qlBU>UI%Fns3KJwA+i%QNHUeoA;_V(mx6*q6^+|6^-4 z`VwoSTVLm=W^C_eQ1Am0t4^uhcA(Ic^L2iMhhHoHKx?P6732Sc>yYe4dkX%0ZCdf& zV~}(_AKBlz_Udjk`$>}@q!VQdDt{rGk}>p=%Y`2wg+RnaFEiFRnBLw7F__Q%Ant)1`93|;tiy7z93RX30Dz1~yT1ceEDsA0>m(1K{?(2* zs6EMC$>)K#iybTjQT{l#z-QM4-%0GNvSBSEMS^%SO^^wb2q5@n#lc#Nc|kXPBai3^ zduNf{N}!

r{1*rheNh9#@39**ETscm<_M-SVlkTmMB3X9A3%S4gCY$P(?lUeD3R8LW1@AwWg? z>RZ^kW5!7OliGbv9#yGka>05zjVSKWhDV*TB!}oX zoX(3h+F~9={GTp?XxdkC5{H$3qWhI{3kquto#+O$&B07Z!TVIH(biQEuM!z6JYIkV0y77J_g07s!bboY%I+=I{E#Q4TcFHQm-kD#L#U3vE?Cn z%w=Bn#$d^+jcjK0bQV)UF>3vQWw$!K1gSVS>V)=6>m^0nJ>o6^bDG&?ji*V8S|~{4!OYn} z-gDOac5GB{#E0kmIt(F9<1EFImW4Et>$)Ulv2Pljwvxv{%%5zDn%BEa9P3E5F`ocw z;0G}cz~`c@P5oc1OW)f#F%=2COsfD7lu<$*-p#cPfcoNVK>O#QxT zvpZnIkd48}ROT}nmr9ZGB;{B?lhNS1EDy}0k2@o@N`aj7+@X3F@S9>IDPxd7`9z_A zeZKUkrg86S(0K&SMBQnBe$}CDFLRK4Z%VC9%JUN)XPStvBrUHET^j|gs^+GH|N z|FYAeIk|@@P`SjZA0?b2Io`vAfHxD$7>|rddVY{Rp+j2YOgDu~eJB1Tai3Tqo|3$S zS?dhE(1{p;GXs!Ho>x6)1-AUCln-f6U1^ z^+t-jmU`uf(M!9mvYBl1&hGK)4w-iamxQ=>NIljjH~$X7lNKCmNOXD{5&~zMR8oeF ziL@%|X1yqL2e!f*Y9*3~q1^8l%#N3>c<$v35OKtP2quXl()0&=v&Oi;AHR|ArRA8y za2hD^2<&Dqnq|m~w{SRMJ2aU4E6f_-9B%z_d^#4qhT;AYFS*FXgnGDzcla;VYLsZo zdQ2{C=Wg}~`5}S%rbQ)d5SFP9NowD{&Fb)Rj4|+4Yyj3!f}xbEfs&Vb`SIUcex17Q*PPHsz=rPswJd`dUX zJ+5d%UC}DI0nj9)Q$K!m-!b><%%k+5-}iU==^a;{h(cRrQUZ!kpCZHIZP9_G{FYxl zYR8~|>UIqtGkClG7Idzfpc2kwls(kG305<|GkWgdLD@m~N9sz^uhf7bH=i}if)0|a zh~qR5^+aeLdRHf15A#i1o`^bEyfB9$f40rOF55VmOh!slcCZ@Go8agyFNR~lyo!9R z?n##KIANNd>t9#i60&=HCy?&^+j#VG;nDS~4B1nW6?Zq$wI@o|;&T=Lek@w+06@7c zZ1+!*S;ngMufg>IN=M*5W*)g;BTc(}k}RVA0e#zX(;daBkYbjrzLT8cOvb6bY+H|g z{2qrp*TAfJ?~Edw#;`RmI48uXPM}81^Y|>!ry|A;{Ln4^lwfMp+=lvAw_q|;BwW|@ zAY>#2yXP;(BY89}7qaBZ1^43ncksCVCaVnZZk-Ycfcb24|E_j6q49K7YufoY`-eNS zIVmpWzX9Mc!*y=7QlE?z>DueDXUkQSN&MGxpo>zyyB^KXew?a=#Y* zM$f%G?XrLKNQ>{(Z(>FAQqqAS`m46oFSV? z>8O1I4b4+XR{xgtFF3q#`^k=&ma7`-d~7Ej7Vr~DhA~1BezkXH`|r-K`g@KRRn%XV zu3o2H^{12FM7-++M8{l4Vk|lAlbB~kCecv|O@bqT2td^7Aq0*)_@SG*woz1EMPhW} zV$TP<>1Q7qqFGH~;ug)?# z;K4uD>8?Z{%V~w_NH`iTq2OJlaD8%g!nkl0HF^zIo|X6`xEl<5CG;p(8#H-Jkv z5Do^2k+RIEz*Hhv5=(BUbezA_wr_!+pJ*r4>2VNSvZZXfZo=r!dE0oy%{YCqDn^co z;eqAs0SVi;s82zf*&9^;fP7x>?DY*9(aE;V(Taz8o=Vl-dsZl=DDaM)JiJjyDG#HV58Ex`2jgyE1ENrDld zry{NdU*;*(b1*0>Y+KWltm**#7E)g`ql4-t(Qo5s^CBL)f3NpDMqe{q->Jy#D5|VK3suu~Zi^mr)am_uzuhw~1$# zH@xynz5UAv%Jc)#E$=#9d*)I4jhzR_&Qlr0Pi(icX3XV@dbZ1s5oqm6#7$VZkIdYt zHzBKEC~S_9Qq{K%2)^K|5I8^ulLI|<482kU<=Sr*neW$wZ+PvSw|4y(HiHV>YM#x|r(aTl{z z#{}U!=gAj^$Oqm0vrs0~!&E28fLp|tDgXyt%}qS>yTL=}3l3As`)^ZjB~#$Q>&b)1 zib_s604YV`h#XPQslwGV5Us=lz#8RjQk3`PIc0~L<518`x0MGcDLHUO%!DI-mmE(! zk3ls>3m1kaH<&|=Yz^*vrlJEm4f}{pEjR=z&opG+SFxO2jO~Zpk@)ivMcTg@5G?(2TU?OJg3{DtW=yJHF!u<7R(=6XL4 z30Q?$ObX*>VGdzPWjqI4Uy54}oi?Dmx(MO$<*Mnw&QFK>?jP!gq^nK}s?Ul`yv=x- zX4ZoXoH+j6DpY66wRkoRFZxNUv?VEO^}hWC#bYfV)Pxu1z7n= z{=DpR-HL2A#<)U|3FO3zRQ(5WyB#3*-k+Io|8SpTeDo5c3#)$B+wlr|ITew``Yy(q zvS)}osu4eCbbk*yU1=F>*Qsn9O%JGOt+@0 zw;2SXzw$yw3@eMc(ACLtD+RzXd0l%(*V;(=A~X6LNsnO<=3R0ywCN-(F;(5DTkQ{v z(7CI8u;!b(>VV8gyB_y$RHRFdVO>7+jUilBd!p=l8{*fQE2KVa z-B$AF+U3oG)*<)8h=GN_3rT{YuM&Orb;1ezS%GD6z6U%+hb=v-o%(n2#xmoq$ zYSr@(T|`SrWB<1fH!CUAY+i0csWc1sO7!M|im^`xVtwpWuTk1T^Qw1dsj$DqQ@(x) z6avlY@~0QjFITVdBK7b{v zQKy7bDt6JXb&FRobp*Z4=b&Rrrl*GO9jFuD>fL7E>WeMjdh}uAN-i;dDE2U?>+<*1N}J0~1-J>)flAg4S0($`VXI|7R;+ z`7ymjZT-|16cl22#XF2XV@RJR{sDPs*zZy#xK0@*BkNqpOchy%!%_^o*;}bKhr-|2USZ|BZY@Rr;BV`15{fYU4>v!DwTc z`KxHsz}~x*a=`-Qodue3&o{!!LiJ&%&>in4G+08IkoL{`=c+fcu05jWTtPIi1}IXv zV84G>k0pee)$CYuF|pKyzha^)$#bV*>eG^!c(lXe1vxb9kVnRydj%oC&aNADNSGeo zSP%0ISJoC9DNcmKSjsq(NjGaZhZrlWzC0}s;z8SdxMJ}RPq}6@>`H>1d}K5p zt;*+c?j8?OrTd#b`=!tjYf>KDKhyvounT16`;)_VTsVT@R_Z55Smj*w@}lOcLv;IZ z1z7#i4Kxm9yv~ZpHRzj^AX6oPwsiWC`M^1cHdnI5qZhQz!LflR6G0F2U*%=4P(ReA zeYEVQnO3_LcnT6a!9mEq+ZDvoQ>|R>UKp-G=u!*9@46IgN_L2_<}soxJk8EZ$RY3S zVGOh4UVQGKvmYamJUDPpn1f;Ti#(4;J(+mwfQRSU){YA%BX9VM>aF!{XZ_dvs+GBq zjOofx-!kH8e<79)8-zYRvjFI-wxMei=_&^7;V>drQ?yirghwH@u;V~Pq zl#vU3bB^xH#5jM7wK#{9CRr+qVIw+EgPezgwX@AFMNp_(7iCW{ ze7o(Kh`AKXQN(SW?6^5eIReK8I4lV!Z?vY)ri$Cz*o>zyHyISuPe|PM-_>-ZR1N9c zU{~eHrpH`QT1IEnUC@F3&f}9%?x)5Qet)o{gl$|{n!i7DBwy+n`n^(e;%Q)M zcE3}cNt~*`VW+MKwzDWX$z4D}x>C+Emh&1aZDz-kNCX&}gwmNG!HRJkScXOwk|(j8 zhV*D2T3$NSN^f&UuU(6Tah%par?em9$>4W0oymQcZ1P`zj)e&0w%Wzck>c7br-%k- zN>!}v-XHoJSjeJGO+j+OX-(#AGNttar{KNteiI6ytRCbxinYR2@c2JU zD6e_Y0NL8PEEKtQoO7P%S6W+swu~P2GVO9==hESoF4YYT#fSKuj(W8bAjFQI!R}5K zs~#PY*;3kEny9>4k%FKGrOm*nNR6d!y4?q@wW+6tmqAit&1w z10a($@sAAF=k!Ao8}5yT1cNWXPp@`U0i!@?ZVKo(%ajmN#GR9%K4}&S*8}w4|v3^ol1=f}oGynM7m- zoDps6 z4xarJJIq`B^@jWg68Styr#_U%;qh+A`*XEGHgfMCwbD?=4L+nE4Uji&+CB96*hXB7 zv?mFt_@gFzB4t+ZVW7utGAn=fOKR6T#xoMp*Grpfn+Y*Bj~IIZ8-G6Lv6dHwm&62s z3Kz`_ZcanlTPzaEhJST0|BRm4q+UmEq;zkOtPrhdR2Ea8%&T5$V5M5s`JC{hzjoB0 z|2oxtnGhSXJo#X+!Zi``7W)?cdlq+p>%<}T50<_wtt-v#Q!ll~~c;g9k9pDrRP-brtBU6$BevsR)2ACAddB0w1A zpaKyF-%dGtvSl6SZ-0wl5Ep%E`t|I<6tZN9UWjb2`Qsf>m1zmxr(>M=?5mV6ElbFh zRUQla@;UrJ_lNDkIbeuoXDMIa>v7h6vYq9DHC_qzKq^HJU6B%&sA!&3a>t(BD&zt6 zL7!ccYz*6x;8N8AlhyUYW$Hjd@n=8%A8fvBk=DO5z;+b0#U+1B^Os4ye{zz~{kNb+ za?02}g(|uvq1O8Kcg6xN#<`PhvBtrJgYy(u%@8V74_w*sE3X)4O|6v-_*1qIIFq;4 z`yV!wgJGYXu7qJLJ$B_lOLJrP8ng5n!-cZX zs|GV%l%X|c_|p#+ZvJQR2&)QaPP9!+_{xS?HS}(+90$Fx4v9C?TvWa>I%F+LLDYTN zCNz1wAl9+>_cp1%7Bp?$43vo>YgnDrLJ7}X7^-aCyKEGJLHXQ@ANmh1{WjR2aG7&wXapRcpCN& zrUzdE_EGoEo39r=l#TKRrcQauYh-*5<~PceWZiCl3E>YLC$9J)W$Au0N(gcW8OHuL zzoAZMX34e~zU{cU;pX;jQRWjwH%xnFv_Y>h3&%|k)jmyGFq@;Hls|}1sA?FLh2;MI z0^D0*Sx)TBqC#r>4MS%IsA)3AshJ`*r@Ow3Ez^ZT%jeK2e74jO*Ye9@9F@9cD5csG z(Gf%YRT*^ZIhyb9g2#4Ak!vMRMA|o=A9Y$`nlwEkNEO5gX(+H#QS{`;(lb@5T>6w1 zd&;)iMX2^%kUX*}m0{Vsp%;mcU0}P}-_`GyYxk7LlnBH;i8ZJfyxF~aN%br=G@b|8 z*dJq>V@RbaShe`C^M#vu!;B&ho@(z9X=SwbZ{wBEVi*LnVrd*&NRy87lSq502J(Ya z@(Jj+hGU-1;CiEjh;0K_U(KW%(liB;56W%5+5qmvSit%a-~byHSQ7CAp?2X~07m^% zXV~|7*3;?y<98VDms;Y79}w5cl#VmJaIvGc1pEbt9xc~E0c-PfF4kuUDoc-V$2r{) zji!>X)@EG)5xknAHxD8Y!HoX}Je&U(T}x`@o-**a0WAxK^2$=Y&=VPSslAJqoFeRQ zlozQlas4SdctE1P>b6-_`PTAlm)_%yrGTv14!abdDtfl;Z3})M%F7oe?8Z$i!s02) zeO?(c=hTP~onkHt&gdkGr1D%G=iu?yO(x-tR-LIOJ)3v`@uAheTi9vRQFGonJ!fL@ zfZK;MQj>g(Q1N6qKkWk)G~$(J3!PxzK#eSYQee-u-^essDJ*^5<7@crzJ}qyn5y~T zZxZF>=gwZQ3iz?sWrma~Q~Vgi2EK@pLI?^%h(t;K?MM22zlZX29IGt>(ov6A4kX~F zUul;9+FMzR_L+tgDnt*5VpvtV?UdPQJ8yLSwca-IO{GL*#J}}u%%)47(;Ud+w^PQK zsQCXU)a35@`~ep8H$NyF{dsQ!&H^#ne44*E*v`qm8cb>m%F26QA|J z%H?8haiX-6ZngmM9D81pGaL3h#99qd@@SCV?^FRgbgX*4y># z0FjDT5fW#;NY*YXaW+>zLQHJUbFR||rM`X>c%Pb-uOnHrn_zhfZ2H$ zc>sQ&$eL%c8=b%1NrH3<9I;%^g(tQeX099<`k4nr1wpi%RfEU{{PYRBEMJ zBeY)_IU^oc>TQ0AcOJpvN_g_cM#)pd1*c@sz+AShhLT|K#F<$A?*krw^ce7xIqEy7 z-~Wgh&1)=NrMqs|NA>;e(ZtX{6yf<*$cTm>hwLLp&IUt<*2uM+xrQSFdF!|4%iygfD;f*cv&H% zq$0Ajc@w_9sWYim?DZ~o^2$|_x2fEj)41Gszc%_zN(*jat!R5>US03gJEORatK>e) z7p&dRjzAK2&~Tg~)#TL8uIXFgD;))LSQzVAwT>|H#m^`2Gibxe!`22@e^YyeMTtXG z1%u>`L6Sbd%Py2jX9T8X-sp38z`EE}wmkt?Bre}^&NKahR|Vl_-3#4scGZ(`tN-|k zlP&QhKuO>{;fOB%({a*?Ps1YjCj_RaJfJ6lN1tbotX`*g7Z-?G8{v+G@4}j&f0fqq z{1Z#QK8}eiEw9>4yyVlhZ#COvaXyjIZDsXMK%)3W7g&9p(y5PjH?;~xSI>Gaj&9=& z7?LE$IL|q~mFP6%?4*4dou@Fir5VZ$@mNt$ODd%+O^0ghS-#!RhhWX%m@ES3-|#w( zO=hvx^ZLWF|AGXK7Q(fY!uG~l@f;Z#a)ZS7LM{^{LobeLgkt|`@}G9bV|7~%@b~vEMQy}LN{7rYF$!1c#(XuxRmTy{ItU$b81g74MZaFFxv=I-K(r%C zRpa*nZYRfx+&ZZfh)^gaegK8(?HZ=)FDO@4!1{LcRpChBxp^*J^3!4*iobY6QdKh> zLB(w_AQz1Pd42HI=8K@;nZg!vbjLMqa>3Bi&@P~;_j3%>NQXty$2wL8J0T-VzOXDo zmr0ZVM3tYaswQ-ScR435EdD1A$U!OI_wk!zd~4n}UlRQs66$6->y1uW+aF0eVd00; z$OIf@jmC_aF#JvcNWycN|%56&Y3rx zqvjWe-#k&|!VStdeT9zV3sQH@zUvVtDmN#x?-6Lw3hYHs7JgK(uh)ruBavClN~p)+ zJ~P-7xs&Omv<={#B58RW_mjPht@_Dd&Cw#q3kl74k&BQ-t})*oZ+c4Z>p9k9PWal( zEL7`;m{IK+YW>#kV8aK@4mW)#CR zA~@kASGHw-DEBw>XspVBm2oS6vnl2OO}+?{appTvq*pPpY=LpCY8YT$w}0!QP!-oN zIC1*ZhIshqW^Qj#>;?|850C^K-!nvb6r*SnA3IwQt zHZ2h1zvb(aR<_!eKjpPPxR0*zNPwz>u#NcA+4Px!RL~2SJG_C?GHcvp9ID9h*pMv zVj$;2lh4uF0@mkg^35DTmU0pC9jbSwP;W#+scUg*e|52}VcfdHiB)Nz`! zO%S5x+DU{cUu{s1^}vQb{G>ex;>kQ(qaz4$BDUUE#_uO>SD9PrJ_(oF@D8je84~7Z zJ+*f*5X+6$Gg^uKBAi7c*P;~v@$G^}Q{qse zg_trdob5)|?ILb8(4Zj&I9N22>Rb}+c)cA!Ynsj)e66kptTRPecz5V4q(EPKn^aGL z(`+`Q`cpF2C=1I3@;OUwHkF|Re#_rBg(teT{oY0`-Z=Vt5RR4ZUJ>0kS+9nA>X178 z=?sZJp040q=L>NB$x=S}3I_lnt{t|QgR5HWmiW#uZy@|Y{?ln^EY?$w8JN24wDAv= zo!#`a^Oq0W>2F$Lb^pyB-n$-+wkf4H`pV|+{EI*zJv1}RZDrnf*?;``Wy&{EE{Zk$ zK^kiS4hozSu2ueYOZaq`$oXKLfXg8vI@37UGVsXPs(k^gi>KHBI$Ps&wYu8gfZY_% zTGoZfyPXDT;iP%{322pkhh)2gP%`(lDaU(JG=k6K-kyF7EAs2#HVV5 zh<7e_CE?TB;)8$ohN?Hc+YI6(i{L>i4)&Xl2h*`*2JMlB&%X@ch3)pQKIC0aah5PX zw2aYV%@T-fzK<jeVB!dq_`Q4# z-^@H6T}V@~pv1_A`-}53S$%~+rQs2zsM~Ny0;z8=KL=ieIF(k`6EQ~O(HxsrPaf0L z@P|O(fQzg?R%8s-Q;l3X4|uu#?@$R`?qb*bEew|IIiXc+Hc$w+Nq8jrA^%ba!OYo>#3qdD*lD_hOkrr=CY<0ul~@Ji%cZQ>(a-wRCUmZJUY_mpR$_keqW+-jeNdd@XE8|k@G@x6 zH5k$>#Ian_ofrU#1&o})79p!%hwD=oJl@bt9uFlz6}$p9eY;;a35@EBI(xCBc3s>79*@x~gU^b=mLY zFB5$HnA7uPz{MDTTh_7DP4=>(|Cf+AH(9@P45TXpw_O)~RoBI2`d+Zi7m68Y|Hg7p zWc{vSg>r;YRLJ|&w=X}yHl9rm)Rwp>PG$29wV|+J`FGhT6h_r$Ney+H(jd26I9dL@ z+ReMH-3>qNiR`UI_@S(y5E2KO$JJ!bUgL~qe5Dno-Fgi!F;=_jG2%7?NI!?3;OpxH ztPGBr)1ZWw_;&ly<&QanzEOW+=o2h%yS~yx>}2JIHD&wCZ?Kd0P!MZy)a;ktodrAZ{5^e%(@qT^h-@SmqQ`Y| zGcZpV;v(pU2xJoWmzKwQbql#0uyh#5=Ixz1nM9RfetstZ@v7lv$M)ixnml>Lr=y-2 z3T@b%s3l+J)Z1yd{m$1wlCRhvjMjpQfzvu84PcI)* z6h*Vf?=7C(rJr4QCc0;wrDK{%d*^x|cdK;aD8&>@Yi>|?N&ujubI(T`c{^hNU}w&& z%^W^KW&X01C;`*k?9G^*c0wb``li^`>Wxs8MZ#Y&|_!UGAcKOUcmb>*|03Y0Q^ku>EpI=_WRpqDo$)5bf|GT!5o_SmW~{R zUFwW22&f%Qm8^EH44ot}HF0@{SRSnT_t<@FF@+nj#cp`2j zHJX-)DFfY2B$@d*&H$~KQJy*z0tI^7$!xd|x&QSJufK}=DZbMw0layWCfsh`-_$DZ zeh^R@K1uFjmgXs>wST1?cowX5`&^0*{?MZ^NMEc-lTbLxw%B3IbNanEoF$Vk<9rak z@ll`Qpo$rhsLoU#lg!$}BeE`)s_}iATYj>@>49_oWOwpJpbo91+esO|$&7-y7C$DZyjX2$Z-rQGoq#@S|BXF@p)qyvxMH;f9Cx8Z7n_ z43j;K+T<1YyH%z(^R%W{ZDS+^isHm{?gwGB3-0&IGM@gU-yy?OJx&Mx>F`+8t#3Rf zxnWz0&&+qmI}_u7UC9}{J(oCWyex0U(fNQeGzIJhJP~W0lJdWiz{|9oOqBtGTRQSH zX}y*DRGTF3-$p`PG+LPguW#}nx~?fRTYrQcjmKuecv)7IeUxt&30*yT zIz_#6WIqkgvEDAA#krhq)5BI4Q{0nKVAadOc?$UK`Q{>zZ6TClt1&EnA+K*|TJK;* zuR{DH{_-So&o|w&5WX~UDmqE2JgL20xI$i-zmoqycf5kg9_{SCr0sAM#jETFmiqjX zMZ^eB(G)%^i#EcUNl4_Uow%m13*z70&-*qQ=~r_}v0p5sU<1BZU$wjpoAnQO`*h~! zUO_tS&})z1zXEt~;15u(J?e2rJHM|Eezt}mVDoUTv++5(r`OkYyO!eS>SlgUXSUPD zlT4h1Grc)XppC|Uv=QeQHXvDaA!*&)=(kQGVAT`B==M?eCr=wZ9k0y06Zj`UkYj zi6mxN0IfSX#{A_qbUJ5gt1F-S`}#S#JT_{ip37Qtld8Oc3C8)6tJbex5z+@%R<`G* zbK^YP(};IixaU^4zhyJ;zyr7$gf~)=w;HZiJ#%tpd3Wp?L?V zwRZyx6#NQswP(9i3Mmm7eE|F-)HOmEq1iUGQB-RfdY8-zP zhef$L9W8m@Po;A8=^;j=3)D-dt{?R~w{RX!SI)$gdM-{JwUv8^Q*Cpu)TbB)_N*P+~*Hl<2lzNaRM{Z25@6v9w)s1$i$-dtJlB(WU+zUfpqnfS}-RJ)6?Q|;3 z*9}qkDm&x^baSy&up3^{OvBJq&*Kk!V$e>+hkm6k`+oOh$l@vK;(4Sw;;V!W`RdIb zx~RRjtuHph)+OktjStK`p^wcnO;Ew0pzp3SRrmo%b#K4dd{Q!H zTn*WIz*}eO9RVo7Wih=}y=z!-VO_8l;(xQawe;>b#*vM(gEnK<(y^z)9{%!@&jzhy9frVtnodYP@wEnx zp8pV&a!5YI@;|nuR&*X2iU0dbrvnii&*^MlFR8W2K@`K-Vfg^!NUHBDu>OnIjuY^q9^=sI6ny|utUMYZys1O4 z{%o$hS@bE6mgHEM`P8yatson2IU48qBh8tNcrl(aRmjmX6E|J+Q89WxecPC{%`&vn zLzsQEK3XS~8>C;UZ!WP+!F6~~v%zlh%kbd-mTaM!kvraan@`#RuS0n4S0TW?c$90k ziILOU$AARvH{K{Q2r)SGGElk@@8eO*h?TP6-)e0*Sev-LyE4$#y2Jy}hqgQ#zl4AO z!gGZQW-`DN2aJNQYmjH%_r9XH*n5YDQ&6Sj)uQl6B|z$_%gNyiozv}vbnQXlb7WqZ zHwk$Zg>$8;ufC+P1HvaDTwyYDzb5K~Pn-_>%Ak{QT^w5hfkmxRRHc*t7Q=4VsYfNM zp7hprRCwMuq+e`(Vzkku(Rwd`USJ^!;Y5DsBf7`Yz@BUNs!LcnCza9R`^;hdx!lu* zj~^HLh}%@o)*vR7tu}JPosoX6{~$_Z!V=YTcKfGR%%fh!4AjGb9-+g-geUmC^sHpt zD3YLD&Xt$=l?z<}F@x~qg5Jw$VxfBZ-q7E|!GWa>*J>}X(2!5GaZxC~zcwa6i8H)d z&dS+!*k(}QOmuJH7U4)way%L{YRMuN2H{#QM1Md&##hCO9l z%3f>hLIJk9W5#cCF=iCrqBTX2Fld5D`LO@sC7zuClXfHC;nM452BzfLXi)Q=UK$O| zQDo@JN?n~GO{C?$Q<}&Q8Lc8^!wkn>b?M#pi5s7(Ov!cau@en73@RuYBSC(TZWqav zzWLaQWEk;6rW!Qg`Q8t>98}!jBDZ6td@2EMq$ZLvLugU|zpjU55kUJZ3!dW+toQ9d z!*=r{V^C;IK+XcT^}dp5Wu*~8ua98!=9`Ell7$|(^6jdp`OBHM^TF?Vptmr$`8XXs ze!zLjh;r4d_g`wb%o3}FBlXP}(|whdO!Qo9-VNECkF7c6R39NkwQGROwlW~WK#2Ze zy9JLa)xgKKVeIHURpc(-J0>f(f1T4SwdoBrHMGuT+SmTRnBj942OHeenT);ItUve7 zM-TElFbxPxO&!gDKQx*1Ue&~ZaX1-?7_*+dXNO94;D=$x?xM>lnAhXL~3zG%VcUaAig6)_`dCI4%~5P?g|#3L`_Y0ev;xq=NCI~YD)MevqQ%P zjchzqqS`lP3}U`9;091r$l4p|j6DO_SBhm1_Mpz!LBDm58O)2v+UzpcD=zMrmQ9Vp zEqD`%nX`8wl~wHuhLl&I_BCQ1B(^_ZtiOIX9!(v2^Izip+IRo$brt;XBqCF#E2Aa8 z4pLW|2vD!#^ccX;=_tQ8+%O{%_2@N_7}oi>{M!GdsN1b&j~XXx;rFdBh(-`49Imqh zw7#xgp?7hr=e%zxpSYhZje%D`8WOoa z%SDq@xUl}+L`9HPS?^EjZ>?WH)%x!?3Fs)t=4s8jjI#AYE(pY$pHO*4nrKi9t87s% z9MC037uvF}%=5nZaZuCv-r!doc?PME*-cy?ACbYWi&rYsut4*GIp&ew!=2KRMT?9F5^AhGzb)1_ILS%ds0F-^)(C7h+XI@dQGAIzVxo;zEO4EvqNIevqBh9=co&ni)(bbaZj6F$}$1Qm&k9lC17j}{eo=I7bg_4W$y6zB+CZTbHCN) z^1)rR3Ghp+E#%L<0t0t}3N zT*GXE(I2wi#U{hHvAmCetfD{cA-ly5FDgI!J5~7L(T`AIVD|A_lmhcamSi)JnF5Pd zvZ}LiOAKpqPo?5Pr|I2iyJM4)w>vvnbkQVghgg&0Vo#rWmaaolB!1k%gSE<$`P-V= zdgUt?KDHNHg;beS=f|d5?|gN3X%mdb^K9G3 zqp%za^=7sVYl&78=6DJA8qy~bMPy(6Ugk-nxfvbZzTE0zr$N+mj`n_M&Wz_PDgBh8 z#x6BS*E0a@_YzTyW`Aru1OEc=&1!5P#Qt&LwkzM^8|-Rip~OcUGT(8tVI^Nz5 zXd!~BV*0CO;F-g)qQWhm0&r3Y2(`31ECXo*AvN&IL$(!uA{V2$D+345KvqYgVek?A+6)lhnbaor<|0Kdtd#~Xy-93 zuA}xEsL;;2I_GW81gUYopSSXuOO5iM4s4DRT@AQYO>%1cg!U!9lsoxc%xQw zpYtV$4Ka-K#_m4AzI}JAKGdjx8PXa``6AZ1Uit~TnyDP~FIzc(#$QM0$t$14Il~eRwar2w zC!4#KhA%Tx5%=?qnI|r>**qpB)X|G_{e^iS8$0$TW7J0K9TmgAdFJsfBtY(&y~?*v z|J|pgLEFj!Alg86^&dPT7>T~2^`cv%hmg1Utl{Vg)@$`|s&sq3l%+AwLupsgB*y^9 zVt8}ynrMBGT>E(YMFO7$l<28caTEXa|I-3UzbLvEV2?WFdLdqqJIC>eETui$+O4gB z>N0PR?q}9iT3uN9J`Gc<)N%&N}TAq3ltcOeAWg!!qg{$oS^^vK;ZqQi?AwWV;+ra@!gGPqNy5l9|ivT&a zllucQ?oadVrZ;L&gSbq;$yC(s)0LtSCsPcyNBc}qcaP6rA9QGy=ng4_o=(ZNjqLMr zZ&e*X+19$ZX_G1I9$YXMRhsp1Jn@4HUVOY2nxVVS@rB*?4y`Rv!v0f~ z*3x)IbW4y->0;y9536e}?;N@x<^vVh+PA-EO!vgw+2Q4T3z^p#oBjR!`F1)&DA~Vd z%#tZ&3dB>MWxRwBpPp}?@O@ms&Bw2`j>_^>1Vslj)U?q$U_u5J4|;cYmWYT6&djK4 zWL{21{P8>|$Z-TzKI{Z?>C^jtZoo9y&Feid=fa-v=H>MNs;s2w$bCLa_aD9DF8@~& zj3g{PG#cHBDimGN6JK~Q1gNwrCLVEbvT)w~vJ`(Wh+wykQm4;c0N)>EkjGj33E6V| z{smU#QBgJS^2TpX?Wn!^<7P+w^mZmIh=q_Z9ZmeRA-1Dpc3WnlyY8$^uXZL`b%w7m z-nasE<<0O^jL32hKQW}Skgl7cTXpp&7moik+DnM8zvaQPBDme9XTSsz0@wM%{*KkK zMm{E^qMhD<|I=K_Cd)bA;lsAm3ujVQ;ObHbx#RVMC4I}YpaU<9gjPA{yL05tlr$q@ zOPJR|i@$T@1+G1?IIkJ=5d{heIG{`5T<2>e(E>i{qn^<2_KWKPIXz}s4^uamWg}V> zkH!x+s~%w-e1p=|k1Zm%C7+#au$$1+2kG|H43Hn$^yMGzB&e>%jSBzb-+A1_x6=5n zWk{QA9d}HA(3CC~j?Yb+g01W?33oAjGb)O2c)qO|`!QB2z=D6_r)jCWw)r9NS?I4| z>rMCk(!_cW7PIL$pxV6*)kCufmkW%D%QclHYXM2N7?Aq-;cl(83K#6frl)Ov@U4)TwF#6yF=oiO9c|e>U1DwLE<)jEQ6Dvub=Dz*ZQTrTg)dDRouV z9p=I>mx?PiZxK$*^s~EPT0`C)s8W4qKRD)GG0(ZD zRj04Ea#II_TcK+*jnOH24wbQbPSw+2+Dkg*2K@yWq|9!{brnOAnBLYNI zXUvbr0`AB{Pvlw{N^X~=7((X8dQgd5)!^6Zizel_$dv303XZ|Efsn%zaVNNwv7t@^ zxnIgj#aZG~v(LSQA9;86@^(UoNoA+$@;IExB?g8z2X};q`jcJ$eX~4$V@A+*jugFP ze}yjyP)1yPy+E>QKXQ3zm*rAWY{~ysF-~@ANmE}T0sM-6j=h{JFN7W>X3+wcD~#uP zxpY1J_L*>8IebK{8ndE)SgpF%saic*B7rTA{3On~FPU_uSP9tUNxRzK;W6FL1&wn$ zbg3=;Y(c0Sf%90JX5&H~P>}13jrp*k$->NBvQk})8D^!%Y=bVMM|hxEWMT+yym<#} zr~@ffpYM(PF+FkPGO+J26v|`VPkQ}#T>*lysK)|Q<0?8%gbGq;naVa?F+1@$LX!&Z z|K3Jbnb0FSg|IVEX2sK;ZIjJFwh$`eb=Jc%SK{96;zS;O1v%r??xR+*P&O7#mtL-o z?~p<1&vru|>o*ff;%UdYH`oW2%jsN1E-LbOy>Pd+4^t?ni?13a)mGE4%UGyJ>=F8> zcv_O#b#P+xxY0T-N`5wCs-oKcbi&`7RIW+Gp7uI8&xk66j*M@u;g#Kf_b30thqD3> zrdo1MI~y0p7na<_+>b^>KxC447w480ZY9XB-(OrJmgSjwX}TU~i7o3NFa&}YiR{TJ zs_vRxHlvrX(x!ya)c0R}TTvuYM6%XUoj}7apHren@_TO)pA)j%KNN_rk?`9qCd!t? z@2#Eq7~C6tGM(;B@);h|uHS8Sgmk>t7q47t-_}j_KU|KCB-1#4!%Hh*1A6o)irQqq z!0BZn$nx|TU)47)=GzaOFc0W)K5E$ybE?tk92zMz;woR_(D@9maE{)_dlTGs^1Y%M za-GuCIK1y->cSC)q5V<@)SmQtj;n_45bE)Y*EF6j*=1QViO~?4#;+vAQt0P?TN3S~ zxbtQ910RRirHJKZF@>*~N!?v1m$uI=-zWOmD#RG6@M0J9cLyt;x}_H(`u;(OPcVWm z>y4eY3R};OmU%d9SZXvT*n~A}2qImW?4dyF8ui?z-`^IIxyv01yWsIVHpM98EoPSS zHW5;@_WEgCZjI}#G@Pz0S#B}{tse`K@W7={{%351&He*B=$gcp-aA359r}|8VUwfZ z*45*6f!XFK)IvcG_8cWLw-lWiQn!ACRH*>#TpD4ZJ**K)$>nT?-uQbtbI(*+C9Sfs z@ra1Dcv`6RauWLGsjHf1)cD_WYqC-o(YEZwcWp+DuHpU6fmJJClPX!0na}wtqU2-& zrtj&H(j{46XG}f(<4`y(|NL-MoxGEIy`yhq)Az6Z(FG~1UPp~{Byv@RMNw>0wC8tH zfOITnodj9y@bJ94MLQ-*(?)TffxbKqh71~YS$R)q$=uM>`GhucNfksq;e8ldQARxKAf=y zMn2P8lMu>ghW^k$W{HtC>5BfC0q9H#bm>hxhF0DWoL=q1{Hn5sTcb1%&ckePZMX8s zwLw#gIU(ZtU#-xU?(?fJo;guUhJ11eic;Too0eA=ilf?1@x?h=rI-_@81J0AXQs5{ zwECq0tx}1H1w|f8r?&inhzL`csx$MQN+(R;zp)Rx%IS~ddxk**X4)B^Xot7DE^YXt zw*sOyFMSf{Eom0l?F8KK@*B!lV}j&W%ys4&rhTI5TCaAL)s6B@#IaT2*h7A&g(H5 z<}ekcVkJTMeh)k$B(4sj`6=XXe@@M)g}cebbT^7;|4 z2Fbc9c7uYfeaTjRD`gOmMg5Qm=;}t#+>IV*vvE|L-);K702j>tpv>ELvN>0L%#3|``bmfs7oW(`j|VS57xTV$Uh@0& zdSRw~*gH7be?`1ziQqgjOEeyAQ^R@o-wx9vh%wgM)+6*(zzNME-+2N4DWfyDX4>K7j6@tOO4wDvCyNW-MBliEg z@&lE7!Q^kQ$JjHqcVN;abrHY73R$SJD;4^*FKt*_&8d3Ui*olf%iBJqsr*9Sg6iQcd0?P?gdinPi&PJrEp%cyU1bVSFYcWm(w)@ScK;7)LnN&ONs zRv`ndP~l24II!;bj$5Jj683lSL8~?aKdN-t?6T4X?D_=G6ynhDMljJ?&|bN5UGz_JKex>54I;U*b}4d^3fZL_XVrRplD2dM7cR@}tQJ%GX^b?pg`GwYE0f1u|xV zvN9w*E%AfQ+T8IFegC$ynfU8GYH=`~!W0jieTDzbpj_Cr>TU=<%U>AK%e|FdRcfKG$3PL-B|!j!vk4#uIcG-tP~_v$4| zwDEN8@=^y=yRmO`8t+sJ$m9TlEBd)5CHJG`M8{s<3wdq_Gu@fE_OJ%5`dRZ0(Ud21 zPv+s=zPG};=z2Z}^sksIeMSYJfB8V71Z3iRu{JxfJeh*3up>MxoeM5TX#IAO3?!2E zesLO$513)g>=V!B4|1^t7);}|eam`&wIQ4%DKc2Yaat!rr4wZmX(#=7FAML}waH1A zAizXb`m=fe=!d1@Z2{PA6j%8~4kHn~b5rEAWovr6Cn76#`)5G;2`@?`S3R-|h2Vx~=ru9uGl=DHWo6pi{{UZQ|1lw&-rl#$W`y-|d0WSyUy9l(-s6gF1S3A9JmZ-EW7LO>H67k?;>LE z$|OGm@f@}nnWR6=SV9-XZvt)(g;_loq^vLu5&B*ShS>4XE&gw4&*tw=VD?g#a$6ZQ zv`4_2s#|Bulqr!LLYg@ilsKki=y}iu`D>yrbo44N5=PyHGBe?()^h)#{p{llLO-Ly znMxjHk7wr~-9~WwMO074)psW~gx$>V-L98#Qz@xR0H5^XrouPGc))&?B&%=VVn85x*OPWy?*Lz2KT0>Yf-pZ~&T6LxefYRzig^9ZBS z|HxdgB-F!h$J4$LsD&yn>RyZfE72bL}{;9XDHRGRuZs|w+eyfkBFpGEA`D_d-H z$TOO)wFwhyuW;X%$N6hcdZ?u*#>dpKSPY!zD1MSUm8~6^>9=WXqVy!pu#*Xlj|oax zq1bfc9^Pwst?PXz&0}5M)GU_I5lv8T&ZIso$l;+-MIF#%6)8DY*LD7UdePS~o8{Dr z&#`dwCAY1Q&H4T06Ade_zu*zx4~hp57aK_8kBXs=+u0Hok%CScvY`)$&*ZR+o^4IY zOWJ%$$^t`U?;e@nsUfF%SRE>|Oe%!>QK&~=uLm9@&p4U|8F<%@F^ zzL!kT24azmI$z1C(!W9O;*R+$<-Ko=73B0|^>{80p+MdTCqRO~mA2ovZw z%O2P=XnZKD;Cv3TrxDkDJQ%-3&-lqvnipLgfzRNgDPU@>)(nb7BX!oAs5zo38W zA_RtBAF=#4SPdb+Bk-J;oKI$|LCPV;LxIxvu*J@-oXkQmlDP<>YZ)Ey@K9zR?e-2+ z{Zc~?56s2Buz2pJy!C_%=gfyq`#QH_GNAGo0)V( zi2CtMv&I1&u*1nNXMC==H}6r-j)z{LTEeAO#!|BLJ466z-uuu=;Dq`%1QVDsHy0b9 z4n?B_b>J6HLi;xh0d#@;_B_x~JF(c?Mg$eS&^6#OBIGgjQ3Ot>6Oi~lK2ZIjeFna^qxiQE;IOZ4B_wdR8v9_R2ozzpUl# zw?&&sc9liamFR4QR4B@JF86P-sNThYtmOi;;+P*at=+_P#;NTStpep)zXGzX@2U7r zmj0-{;$7Aks&OxJz^?t<&4nt#XCR0Ui!&-oflhutEp>5i;w~JT>IyIvs=iXXj=5F4 zH~RfYb$nnSPb;3tK6DA`$ye8mo!hbXj#*@$eEi3thamogZ6=zU>N;&l(e30;98XS1 z(Q@P0rSx(qypOv*%#-el&w`7qdG*cA?c8C2yRFZFfD>k$gRa%7L2#6Y_6jOg=P+EQ6J7p94OR|x2 zuB1IL+&Nj9sjIth`^5=gSNN&9kj!Ivkzm%WUp*)j!!gO4t}-Ix1md~aLihuHU>K`~ zBKCw5=xfzIJ}lqh>U4Fve{nlfK2#e_s3`x$eu24-W7EYrjUjAzCW!r`WO^qRXJ52Y$LS>+**d=72dr-Uwd=PRD_N8-*&4^r6N& z-|$+f4rDSvD(c;lfmfGXYs^Mu`B2ZTR0hO1tGa!V46`f#zU1ID7_Qw?K>Xm2wnz<7 z2wIH$P!{H}`8 zZu7LPZ*9-TuhFZplrgy(*Qa!+{p>CF+S36=Z{qX0xNlzIpJiux?Jn(5@`DBgW8WR{ zR(vI_*?S}ItJRu8f+OcMf1B(3CwJ9h{0pOh?$rWX`znw#V#~;8;#5xUjtWna0OdQ! z5mK$M2d{pDn&JuH$VYVYx0q?kf$ANe3SnsE1|(@a9I*VVRZHT`hn{WT*G^V;9)+uQ z3~qtzsSD0`j{q4|cus(n8`-j~>z20$_rdpOBDZT9BCHE@?w;o6B870_0kfkrbtissKmi5i;&&HndHe3=4q?)cHT86ojAz+V)gNk0 zP9`rDF8Mm(9%-t$Q+CCNdQ7W3z6GVntp)#v+US2j@z`iS?3g~q!fbP=2lP2T@(0$V zW4Q)y9*@lS^t%Lj-PgiVp|*QGcgcRdABR3lZqLpqdle78Wv(3(D@Vmcf;w_T!Az$= zj=#_N!mEr0{Dn9ItH*qqOB4IY@TnNBZP+L>R?R=Jey@!!nf>a)d}8JAq1#h+Bjm(I zyql%8t}U?=_gdK}I_H8##rR5X@S;h%GxlkQ#g4R%-TD@`J2Q@$#Oi1&_J95Q33y0G zBF&m0y zYG(TA1Ko^%>7(_4RJl!vovS2V=elP>WQ&g#rJ{50eA2==UJCb(2aitnqDK$zb?J+A ziOpe1teQYPi}w(|gUTfI*?)bvRiZSr!Ov7A8{5%G;F z0rd&_>laDmVIlRtX(N&6uZJ7%jATYj6SHfE}h%J@81V^zv7pl>g>@q4~+oA zzJLea$mL4t_m^mJ{*m$&Bg1#4mlf^f39x{H;S<-aTukf-$ZpPuf& zJIN}v;-T9bHpphAf~E#P*JEycxouq@xh0!;u%MO^&}VCaoP8gGgJ2xjGJf=yx>4*` zL-Hf%5?#vgacs8G-sb-Jsdgljui>YT2LjSV0z|NV2Ppl#%C65KcJQb2pOV(H(g}ZIl|edX zW$Jk5Z68DKFa3Q=P;0ES>MyW<(c8fprS0M0pabVY(ws9!mP>4!|57AF3Vtu%v2b|X zh*_{z>8rElGbEd@W4!Luf!RNu#{1_cky4Iz4t{ZPnq*QE?|*K_GMa$_i{0cs=mdf6 zqaryRz9JkDPbt+*VrgPBRiVVMm+0f+r&+0n71%&OIJLZUIM*UKdYVV@S{-yd`X{mV zmKykj5fdqhFlGc3s)*+!9Ja?xAVfsWdWAzBqeiye>(tFcmVLFfDbv-Wf}}oYS}f(P zlt_c?VJ2Fjo>+9+Ndb1^h)9Hn5tu?;Zd*aBcZOp(d`P65UV+$O&vQ0x;eDl3ypT3m z?d;T%8(RNP!TbMXc=1kr!sW$GSW@Pvsg?1~z?;IiI1qYfG1^KYk&2iKgc{T__$iW( zr|4c<)`X}`8Y#h`d`Xg-tcq}Ah*SsmIu!?dt8erl|4hdW$mQ*bNY<_I=j;;Dc3T&{ znd=a1$#(j9W_EUTnwu8qtGY#(5QpJDzX?Yr2sjSbI!RpdblJ^R#t7JbuwPFqlnn<* z(XhjEX)KFld=hD)y`|A(9YE+1X*0NtU=j5gVt)8=Q4b%TO;HZuSPd(6r%?SN9@Vh1 z|LZ!t$kz~Mk0M-DwTAn?!x{W?DSLd>mT~E_(9hIbM;>s4yG$FA_jbpN_~P*+gAe>o zig?%5k51}uH)>0H8D!7lRDH3GwV~oQ11teFv8{Ip{PtkRTo8UR3fCm2;~O0=Ka=TX z0&PSp481}rLdUpq*y-11E(qw;?H5E+H6Fk0jM^OkAi-Ju*=Tgk$g8`+IV2W7wEyKS zFx=Qr@OwP79iu$3Szjy@FUia%R20*31W+qJb`d4B{zGSxT}4SDU>knHjm#~4rP-Sb zZnFL9U@sQJXGxug4E(3;&uf;GuU=v7?t6%wp z<@)Ap))=7Pw5UFjR4$l%;+;P-F@Ii#0*mk#0fq$E}@D65Bo&r;ab8s#n`iO%0ie9Y$F*usQIq~ zLg@jAWFf`xh@#7lAml?hHAgq(fqdn8Tt{Xk6;)AMGqOr%;q{>$Up>`#q%*+=>a&&e zCmc}Y-a1hf9KB_Q_Ks>3x0`Y9KNk;ispV$@I2``-EozdBHD)8qStJ52koFJg-CmD0 zJ?hd9{PdqEQtQQD@n1}DDBVJOOd1tPDce1xkcM+0`qYC(M{Q(P_9F`)d6jF~yp4X` z?3Zk`{^K!F(|am^W}O(a+$*qR2iSi6#G8mgYO(4>{KZjY!2Tnc)Y2)yAK`L>NjbcR z;qq0?>cEYi$d)*ztU-kKhmWvn<|L(KmKh8t*3VC_EQ4@1@!=VoeCUC|XZ-ZXZFRVK zzN__-h;x2>E(V!??C3}c@xJI#{(c2|%>Lx(r26Fc&G_P26u{_c{uhPG)R}gA;>&_d zs=3ICjGgV=SQFmzz4W~hl?2-ut#3l6rs)Dm3+dKtCtYSP z>OH!Ji)E(>>*9$e{VSMjaz3J>cDr_#w^hVB&wdXBc{%q#A6!zl@L9~KI-$HzQzEDQ z9trvzKfKyedT{MlwNDlzQ=JpN7mWHSFUeTZ$rM$@iuIrvJl)BmuHktGKLC_>NWICx zjR+N43U5`_W77?BDen;I950O<%u#bKqNJ zrcoP7N^5@~1>cCvKHPogaKmArk~>K5cR+MrMz+JP*=BF!QYFlRAPu1mk2yZ|lP=F^lxOM^(=C|8d-*O}%J@kyUa@PMTcFLN zyhR|r)5g1L4Dy_Snm-9Axs6v5{PcW84)BOBwk}8Vjt-eeCzUA%UD zD#~|*SuTJui6G(~P&L%+fq|(?O`TOK44wc9S-x8E!}Q|%?R>jtp*J>%ne8$h&$0n?eEj~x<+y}BB>5&MDy{rE(g7)Z zb!%QkeRqd2SWRQ_P)67FH?;Mt|7^Sf7%h zS{S|5UwN9+_^hurU)g6o#1cGsjj-c+%!n?Dls&@pNbMr9MS?2DVJBWvxtl)znH!Xw z=(pdu3!2v?`IR3AYy?bRl2@E~1GFvdFLi$2t3Khlz|=AwJi-9H5I&!OFHqv!{`F1eeq(v}Y9y|j+mQ_xpYX&mLb953xMeleMx?1!Gv0WMAa zg%sY&Z1IYRmH>7JTqj2c8~&LpvO@?=GN42i`FK~y(%0(~^&S4RV)?%-Zm#qQW$e`? zKn5ILecSe_Qy)xfCC~XX5&o_p8M0refYJkh>=KTAn4?W>fLQ~m1fWW(d$H@qz>TB5 znpALfs()oa9TqGP{oTwY>0heidzHiBhixG!3laR)6KYW0F$=--7sRVgnPEF?1f8` z4)Wd&t@yUR-SHFky)w!;JylpgJyunTxUha5>*Y^Cmu~a~?aoh6`{g}}eLer9#>T7X zyfh;r=Qr_&LqdO}=_l^@Q9bOp?n)R>~tI6;LU+pfWD z5LwoQ4Us3m>EsgExSD2g(7=Rp9M>1iSTO)O|{xlBiSf&(ETj|hl%nX zDcR0%l5y|;@L*Uy>!SIGhv6X-o@mClPbc9|kG>8M1%ul=?G?2n+$ox-q5&Ue;bN@z z>_<}vE7XLWh!){_e)`Z!@xvyVy>JpFpbpx{{{4`?D_g+*Bd`aunRZyW=hK#nCpbx= z&TXS%NQCdFQVL(wcd@}8z;JVUk_?f|7q}?w@l0!%Xcsf3T6Qe7b6ouBEvDFtZO4E! zE3L>@C`RkRb)KqRga{&r_!(0A=$igU^h<-H1^yf>h`@AuUHMR2n?my#S5EF>S6@m= zXy4V01hHO>-GLqHQTS(xaJ=TU&Y+7PrjN|ZJ9`~H#y72{5D|LF?wOOJWSg8XTFV4T z7{xIrfyL}gkhUH0M4kLP-Ge0rS12{VLTraBEMLxnI~tY-X}z(^VQEGtPx=aNm(0TA*_Bj_tcN5=9j{WHj6YN-o6mK zld1LYrBRHLl>#3}2N5hH#$YU|^Lx#cw94uuE)U{9VCAR-K0-u1gyadrdg7;tf-4`- z&2S=D_F3P{76TowV+P{eu$SLhBvK}`d}rmUq}cSzQK5Qlz)$bRd!FnaRf#v(!T+%^zDOT?o~2NP0c)`? z4gU8xeoc$zhFTrQ#r5kA70my&Uyjs%154{^@``Vw|7j5sTBv2i&7bbp^-uZtoo{j- zPY-D8J?;e-?=Ss2oZGrzGzPBG{xIoy%+~FQKgw%htaPWx*K~t5-GJlB>BTxa^SL<` zAjF?+ZqZ9xe@Pj~Ppa&#(eHCEg~We=l`S%qSy{yJQAyzI$fax(%^Zn-Hy%6;)0f}? z78$NpYTvulljS`wzp9fgn0>SJ2qJmPoXChgE6QWw%u@7u=g)dgd=_89vzOYO4>~Wp zuq`ws+Pq(U9+uWL@gaUyPn4g-&wJ*q23360H~ly94{}ukII`KlQXcu&%$cbBq~&M~MG z^2(69OTTl=3E$tqN+^B(hzf8Y+3NZ}v-Jr*U`%6KRm z*$0UxUow^9%L2*G8ar< z#B+X5NJMAxiZ!mD&#!H{-tN!Z%~w{E7G`vzRKDw+!A8(X@!&r5qaLMeBcFjgO>gA3 z(Mq;YIq8HDJUbL4JBk9Us0(V_)k$ii6cQ^!eV>9*olA*P$>;X-L z_K?94ET+m(vS2S^foobatFVAuYvkwU?S3^64KqVBq}F7Zmc^a;Fg^#NiEt5Ah_9bl z{bu0<{PD!34_}(sew%dwAxvsixS16n_a}@&`T_ict3RF#`l$a6j+)e~jprTqyt(JT zBD{-QCVo7+^7|2cCqm8?+mN6jfC#^FhhE2nA*<_fbu1!FY;s8KAL>}2D|1PUYAzM= z?PP;a$IK}41V1GS#OL6BQ#!B`4}I*q5$V#uCfUI=HCZmqw)&$TCcz1o{%BXMuRyyM z$@3X^<&D(ynq!JWdi}b+p*qPT1X~M?%-=8Wtdew;g~j*kl;2hdv^up`kfzLUL;Ba1 zY;3IX(DV{PozTJVeVJwYHBR`gZWzwXm@124M;pJwmScv)KN2f{%4r5<44-)>@HAd^ zu=O!m4F0X_?;wl5l$V(^Drp;z)m7j6HPw)>!@PQGO*S{i7Bibj>ATLl8NbiK0p=`i zBTumz%*8Oh?Q6AMFp!8Yh75(4Pn0wv9;irQM@@h`XaKIlafau*^g<-bA+$JX_hfv|6YD)2&5)t=P)rFc3QZ{oc*QP7N%y`Q~Me=6*p+9|@rAbtzi=7!+hj`8~0y z>%)sJaLTwW>3se5h0NH=fqsllbo9-GxAxpT&sNvI`ioBw6MdEmf|=T|5QIycM7U;$ zu?E4*$wErrc$zYxlw9zCa{0e!GrwT$Z-wqN;Qu9v%1J5;;rEW3-h3_$Q(HciPVIWA z?#+l^&5+L$7Z`fDDE=fGJ&>AjAkiz|2#PHSSekmqNL zt-fw%PU#Sweqg4IfglP$8UfNZn-C%8ta%q2A~I24R;IN2jW)qe*zDtLS)H5`#iK2x z#yqussb#AdcB~Y{_1s_leA*e>JMml=bo|5eb;sZYUdy=ebULW(s9Ur zI_@1dzX>?4Bzb+a9~z{EWP^`Cq(wPwQAib@mjJWL-Xe8q^oWQ5@K=m&*o&K}wUP}` z5_zoS&=l7djA1Qr;XUDIE{3h_P1E)Hi|=7=9?3g@!&?u}@L4`9pEgY+IcL1ILS3*tDFN8jH(_ZeP5_X*fZ7 z|J~>Gjsl06A)(rx#1rERAPeWwnzTn+p3Z{$4NFa~oJ2K{W)&Vw z<(t!TT<>Y%LDMyEc1&ZVfV=F@^EDwA{J)29Q; zjx|Oz5?cy&*wy2^^2V^edQVTKZ;%Q5McxUe@3gVuF#xkO7Ys43gO``a18#u}f?6FA z1)$!teglID5L-b+b{-#n)?Om9W~3j1+ai?66rgm6y>*)BMH71Mj-L)e+(5Q$plc0w zEx^{6+^5u8O*uI2zrdtB;Z%iPG>^Dj|4bOpgm(cxjLy3Adx&SlX^Y^1G|)4*(>cmG zHz6rIU+y1;YsbD&v65AF;^J^DKhYrxQzj{Sqc1#3)OZ~87XMJjZ2(@!zedMRK6}^7 zK`?#~rl9@)&+dn^WtU~9Z>rjm&TJ zZU>9x0HjtJWmIJ@23}><$MwWOp|%%w-uZ5lZv4l_g{<-Q@Lq2yzh$Wlg_S10Rm^El zG!@=C51mNs$EG>9h+S*sLi5z&^b6!JG@;Z`t7c&ILL+N~6S&2<@_e_N`_IGH|41)= zxl*zD>YW@Dr;Duy^QBQLz0~5b>!n<&8gciQQ?CtBh1c2&uVIrEEzB4bZnVK4Q6Wfu zAwQ=^?vzf#2$2(F7iH7?{@icWEN>O~8m-VXk*jGX5Ccec?(&KT$S&#MEOc2oOZ0x{ zL%BdDTF)7$#P{;ZSr(mv@ly8EEKMg&r1mc}WC_Vy-Z_5REq={MPjv0PPQiR8BPaCi zqNI9b_h}4!U0ap39l;Qu;kYQsk&|TkrUbm3b~kmr=Gs)e|08Z^naW>4K3%nx$`4Uju{0R z<2mCsO(8CU#jx~p;S0vBVKNtcdknCZGhhJ@%1qJ#hD>_>YI#tttzvDGlm{t4J*!eE zdTXQ{l_)WTL}<4Av_5alo$f9GAtY8;YO~wIQu-GVjcU8MW);0{sS8+v>D0-? zkJFu-N$i#tgy9gfzx$dIE6~ng2SL7#x(%K@Uola%c`%)s!}~(N zT~x@-`ngis>xZcJDtGst%V7`}!k_J^Ij(hQzCS75yApI2WF*OcJRZ@aX~hNQQbrWF znPViSPD5LVHTES@9sbXNwntrgXl69Wku3HYbE}v#Ek$Jquo~Uuxcc;e_dT(L`Z2DSq z^^be1abfXinbGTT;pog81BtF`Z$l}B8Z#u%>9UZtZZBm&E}Sg~E|*|7bU9MvE6E^R z-+MWv$;^AOB&yab*tf z)Qw_Hp{p4&aaDXIv))k~W6J*^3-$!?kZN*Enql?{&x&n@2det#QP}2KD8^BJ-rr*@ z_G;oA(eQPzxqFYnn1>d0r2NrYq+fh?3X(Vi4USle%u>3zy7qHw-al-WfZKRcRGYb; z3>9nC@LaA**j@2nTMvq+ti+*^p?3|?C^j+0Y18MlUOp?lMooOQlnpQ?Xc$sp?n9}t zBkzPoy5X9pD~_B##$_&fsfVIa^JMzBv(L}3TqMY)p!TkmB3XTgV&U$tLDYm zGtgF32Fh;FrT1^7?xml==XAgO!ye;3So(A{_7vAPa zF!CFIayP>K_Cf-MtbjE=D zEfv=%$kp2}ufSX>5g*y%%AIbQ=8L{jbnHKVpf@7N`=wnIABxG$C>6)00vuA!HD=6yXgC8fuz!IaPH#5cG6(4@ z#^z_Wggl-a+HGss=_d+*`Z+KE>lumDE@Nz~WrvU0T|Fs>bK>c@zlwM5j+>`)NF+9r zP;svIUiW*Ta#4RaD}MJCuxABjF^03FUq!G*5j8SS2T)mLb*Wqf2XBDXbSj8zs0MUY z&09y@iRodA(~U0UxE?DjH}^LD!5q-32ghna#&|SsiB>07>U#RB4ce^{KyLH+cgQTa zsCjYW>{GW9v8grHsN;MpR83W^rJ_oP%WJ;NHP8bVo?RKnK7R)Wnag_b2s<=ZMY0;= zhf*Dj`CPL9?cd;FSI!W*+ewFQ4RGF5ErfrR99sQzaKbA|c>HUPCi17`pVNef1IakE zxFPTH_u@8)(^LA~`j{ zobRZpvDv$DHm$UkI30TxRG|V|(#T&ZVQ0Cp#;BUxE0$5uJT)OYd&-d4}ja+)il*O!Y|61ghXxS+wxQ%4|Ut1LI z{5qV-No0{iQ)gCSkeii5`;LT-M0IyK6GS!YEtYB8A-3(d`#rN`xHW&-uVN>UoEOz- z>y)uAahV9f6{fr~Yb7SAEC`7_q^tAtK)&0@=)|?L;gmPG_@362aT#!T zCZd5srik4SXB5SjavjdVm8l?zL_-ZXf6d+s#Z5DgjZ&zC+WwZI3;OXvnHaWnqhEie zHWEDUP|#`Ac`4c+~7UwODzfjm22g;Dxgh?&2ALN8RHpCEjo~7F zw}S`yA^Vim3sQklVgc}vd9D}*EHZ=xyo?N&T)GMN23}%|H3*t*TRuxVyRKrK`xejl zqz*dC#DKp1t^C4AudD-lX%J+JF3K=bQ!Ay=)hC#~`3Har7YT;-DCG*+_8*yN!V?-^ zuL^ufsWn!u_c7hWC%M8n_M1c1nZa)O6FQBWRR{uj~gKXbZ3=&)xL}n{8)4{RjIt8 zq`9*lvH&u_+!4Bc;cVuH#$jC>A4luo4rFr83{=^>0cW^<257S`>RWpYW;B%m)hkqtPzqCfW~rm zz4Yj01PD0Kq&-~0wmna8Myk9Kf;&ZC|Fn^-0D3#$87E)U7D}H?=+ONy zrDMkcqs78z-`HF zPG?GuEefjp!Y?7e4@|W2ILBcsh{mKU@dwYP%8cwdt^NpQA)hjq8$p41m@nZO>E27OCPvhC)DJl=gX;&DK6L zaqfp{xr12kW81NRZ0DDKG2;iMHRt#lGv`dnFv`ukVKX!F>-w}LBskj4%>CK6BR6MB zT~!F~8+_^vdF8@tG2Ayb1uR-;-l{O7_?F`k{SJLAl3X&VfW%u=?A+lM5;ef><2h|} zDZat{&2v4*<)hk3oIj=N*d>~vrLA(zt*Sxk2GaMUZ&S?bxld|sM~J-1wKRvlNJ8yU z@!Q4n@FSgb0h80wiHZr_3zto7@DAKIp0PW)=&}a4rwm=r+F^+g$2yPa9;|siLVQ02 z)5X!LSkG_2Q(zRewX`Oz4Bpzt`S5V|e3>HnZYd#oL$|%1w|oeG^=e0}#S%YBV=$}Y z_^EM6$wpE@hKOD$`~R@Be)-w<(f=Vggom1+Lc*#vdrTZ%XRp{SCX+$olF4rHudboa zMCr00TvF1^*6{i$3`h&`bV!ytlY}bRN2{GY3nbJcEuU<1f^57usPbR2R-$+rA2m^l z%^7_}OQws;>x;~$nzj9M3R04jNSuVZ?j`G1x}^Co+Zmh*uUFIF6IhF9tku@ioIE|r zxG|>#-O`5Y2fYojqFcOKu#s?F%Ey$As*}#Xk)iAf=RC&VjTXlGT$4H5{FfK= zcO_MFFPHH}gtxa~N(BvL%Uc_@*by+1_wA=z9|3>-!RG-~!Zh@#qa0l}C@Vp&B$U-YVY(Zg%~el@N0}r9r4@Ny}y>k>tnK*M} zn?`E9rq!7i%sHHU8Kc6j3rzfJ!YCToBmaEzBbChuBEZ>K|I?X)2XpIh_dgyQ$>$p? zcp$_r4M^H~mHF8Io}Op7CZXGSCST{~q;xJk*L~jNHqHLc_=$Gpiw_J|44M}${ZBnc0E}XgZ zrF`yMziGlqTBCe*z56rIpIZFN?hJ*vyV{A=pX=WpTpbv;1^(IowB{UCx8$n0#6J(A^+iB{ViOXmf$ zR}Le_WqPGooGQc~0q7QWH@YjofJ1(lNjcGg#{pNN(Z1o)jQ3A9ysep2inadmYKUN! z+{KvD%yeO7!|ah+!~X)sKsvwN+GmVUI*oQY`CIGOtGiVfbUl1epVzA;tFQ8k?dgeW z*<0%Xd{56Kg#r{yq2n;^6+1qdu^^B4tbFaE!Utr+DO#~J~zc} zu>m_*PmZPX);?p6q>SZq1Ut98fRAo}mzH_DCVy+)dVaYsWQVSY@9F2O4y*bqufEjd zuWtU~U_aINGNrD#xCcet?NjZpG083h_yr=|9e`MVQ7QPii{Nay^TxNY?ikR%{|(`B zG3fRi?+uSX`zybD#P0~O;o{>B7m6@eaDfqzh{njX|9(A4b_%~3gmL9=HfS+!z2Rad z@I?_2k3qzQ(mqk{3b@<%^vTD=IVOJjB$r)SSHs61)|hkE3HAScqGIp(mFF)ge_1J2Yjq6fUyTr4)hqH zlrt)X8~49bzt=&Ji0DgSM1LZ)_iIVy>nSn8QkSU|ojfimMyWLjw*%D98`YW#Z0Wcy zh^dr;s$yg`z4An~bhK@v76^|%#~t$cpm8kV&fwR-|NH(}X`dLjyM-}1+`MBr50bS- zsGsui$4X}1+PGVA$iWV6<)bcB-w=jzLI0ekf==|+Ty>*TZ)iXVtQ|NJMuuE%%Y z8&2;2ww>?ZoCa*Iga(_U_Zu_lgK}W;V?1J-%yW3}qF9*05T(z&qm9Re9(X?|0|Iu} zgW!jpCs&id=+ocuhVy#757^J^tuM~)8P7-dtmpGH`~Kry!RRAAKHTpLjt=8@N*SW2 zG^6hW7<+M~h;Lgn`CY`J3-5&`;-Ha+G%kDk5i#YEddY|7DX!R)K5Mn zGH{gWM>z-4n95hYF+DvoEqiMnfbZ!UYZKjBxn1v8ZAA5I>H4I6J%7gUQT0&-d;Z18K=s|wC+~i!BHW!#t@yds0D2a7pQUBTn7dlVU_dvGwX4X{56{~ zRtw9~*v+~Pt{8@au7~gG-ItCGL|O_`U*{EHc*W4YQp5Pcx+;Q!>rOMJkDU^C$G%mu zB2Kq<*3!s1=TkSN`62ymL!d@ezseV;)t8MBFN^Bcn*ctxUr!yfDn3-2!@@w-l z7X2vC(HuKtm+XpHtnylq^6IO6#!%Lnif{2-uq}V;m>cq;V)kM&*JbBvW(L-{A{H}Ae-KU_{1!x-?2zVbbQ zZGYp=8^hBtKCv-|2@)GEnDoU-vAsvEJ}!^k@j`HfO ze8y1Ln2K-lTd>KWclCbqqd)QY@;>mWs7|$5T!NXSnR%E?Ub{h8& zno(}Fn2=YdHVEZ=;0sx9#K=8W6(;yQrdD&)RX38X`LK3 z0DbwLT;)1ABMS7Vk3RGd9<_afr(xJ*q9={TQORJGNqc(QTNJUq6=x?B$m>;`fuZAi zIE(Wv``{c6e>b@uCuQfu)q8)VcdwTA_;Y(7@b%lT4PQNeVEbzP$iUC-@pqx0!`lh` zvHh*+Gr&0SkD=t>DHwu2R&AUag@5eu{IPQhmwo{C#E6ey*@q!qwbJACmf1ldu zvlCPLO;R|!gUtZS2tE_Xa~I5P%$XQWrL-4|<#=9o=|U4n5UTFZD@J(Yx_+8Rz@7a+j&F_l?#lW*c0De!9$!B=7vGA>F^XL6 ztaXVl)KuM>PbrMWf7SjEUpD52tUT?YhG#zmQr#<~;E}Ib;3%|m&_23Gl7jU#ws;;- z)KS!hczrMYg#vAJe)T4R5B)w9`(vrwd@yva+YEED=4>3xYqPatX$yJO z>av{uvYmeWQjG^5O>-(A*4^<<{aV_Jxz;!1=3>p+biH%TmfVV^F~|c)o^i5HV`VIT zKozI@Y||L-BaUPpV+)hdpW0o(*X~)JH>OdErB>roH%Ea-W1OBp?SbB1_WTst!?g6& zHSn{f(uQ_lDVc zJFdG0*3?VEgbF z_O$rvW1i~;;n)EzMP#4mLM!xVbFCtS9971@jPE>57tYnST7A)iWWLRA>E88A% ziAOr~PG90G`i3QLMG6W$eAEVY>E?V&sk>s4wF*r$+_mH9qqde^}QOfRtG#*4KRaKjO* zv02R&3bx9oA9=wMU+J8!fJz{)A6+SvGNB(=#^k29^^;jBnAji6Gp-z+TxIt}8QwhT zWZKxqMPWghuBLHCiEc33nWIu}Bv&v29L$3ok~Y)%wyuSg__Wuc!5|useas&j!cV=! zW2*6fFx8}tlA9CG=ovJ9e>6HOjytg$5qrw_JA~*d_4P(AP}?Hu318?~M~lMF9N^J3miySFw4d4M=*yqmoL<48yQ+Ql3H7hq}C8RZj+iN`h8Q!YU;`Qv!;%JDM!i1~OZ=#->qi@dP-YD#(?rz{)p`gPO1AoC zd@(o<3pA}iG#o-jDs>^&PJ#;QGg?DIv2P$s88rr7s?k8JQ!^l<)j&1$L6}3|xVo~a zSMMFbU)X!n5FnVdr!}}J-XFT@yhq&@1yUmMF0v;bWXodogqHx>VYtC;ZNWQ|LTCC+t>36$}iK#vg3r9aa7=IeF` z(|bMv+yu=jWfkUN6WcyMlK>0CQv9A>^qAPiWUo&6PA7X&Lvi3X@UkR`+2fLE)LXZX zx~v(BI?Ge^rAQ^E4rAm|nLP7Py2F&(gT#PpH}`nOlUFQt zmr1qP$&)fKWHjBP)KNc`%S5w#!EZ*UBZEWEykcmluHG=v;<}i}U8giMS|h zx-Ja8ALWYHY$Xg=u5Z77=QY1W`0YRV+det`_8TA||`oP7_MT`Vy~Ar9N93oXxBb^McOe)_{VVwZ7O zf`&c>^321$nQBbfm}>`TkAyz4yMg2T^ng#qX(lXH8}WXz11t9{JK-t3>HJ(Cwm5%x zo1ep<*`%K7@ZMjeILEmA&iC>vUCCEHFr0q%cz9&5c)>aS`2JrzZ})ThIDdB@uYAFG zf_*B*-r_oRBnC2MBQ|aw1GP7dXBaxI__)>if>(XZb;<5N3%OfyFQT(+7^e^Z)cWAm z`>?*-7k7K%Zza6z7k@wDUBLc6V0&!;Ao66Lyd&cv*Q`m`jXWqC0%@aNb;_%s@z}0@ zLZ<~S#B^xRGbhuQDeHos&4SlbGQP;O`RT)WN|^@%*obf0S{SX*?6ua6r3}g(s%!Cr zo2+Bjw|p0LJ9P?vCzsmH$gUA}urwe5n$#JJvMhSdv%^murh;Rqs!?K2($Ui9fJ0-= zA@yrlyZSL-j+bTln6B<;C5EnlwZo=ObFg030ZTpjoSRtK*c4-Yt;-84AdLxCisMj? zLkuW=>7zLE#AQs;PvS#|=E|Ve&RnqPShQ(Q;Ls#i%kQf%hT$*&Nk9*=ymosSzW;X* z5ot?|SMeRdTh@OCmXCmLjgdKb#VbGOv(=_?IbIP%^=o3z?FaPFG3WBBjs8lP?209i z{BwS}KKgB?b2+xg>fw7imezrG`jhtZ97@l;t$4i}dOkgTD>igJd@p`44)tsNS~=JF zF$bvPl~>F~d5x+hLw+mxEr(fFBmFyR`H`3$Tc4Dkl zY_4r(T!r;=aGeyZJni%+b&Lu4Bdw6ptz0^TuU?gR-j$)Zi$mjM;!JOLpB%P7Ua#MI z=W6nI?9ktM4i|@R+Iz#EeDs$1!mC~q7oF$u z{t%mo64|hUlN{9_X$_11@;I8= z>YMm4?2g_~ejIoAV$v6P`?A$EU?!uIi3)X~@pP~|V*Cb~B6E{W#|7@08JqJy)){-W zjeCRY67RW^FB6n8GWCcF8R!D$0c_+1jlB?=5i@i|Mm^L06cC_d0VbNSdxNibFzy%{ zVF_{Ci=%ok6=(#Jt{{fpkY!IWvjCpH3d?$}ojfW1vJ5?R8f%J~juWg{)9x!JE6u>5 zXvK-Y4e_nYKt_{i^#P=5gO>h*u1kyz9E)m6h6`w^y#}Rh3UqLQ#)K7DLkFXs1&!mT zRbt%w2sNzN;`Ne;Q{b_D{^&t{w=kpJe&;*>Ug5WFG8m7Ke)|vq4qf1E&5-%-moTIy zB9;|na3Fj@afOphQ0;w0=4L@-K(y z_Q6Cj?h20YSY~wB#-iAnJR@LcvoYgC&U9mDRNx9*ky=d*FX%DO{DX5ZF3rWQc{RkUH~@w3`D42o$zE0E zle?}%9<~ynU(!%}8LhmfKDq-!zB1~kJo71S*-H+GCA;?r42mgo{eFfIi!z=pU@AC_ zaWs$e@G0^H4}EEM8_|yxc8l)^Pt{dNGJ&g-Co;(>*=hsBn#qGQK5e804hUMUHN?@6 zvQoszjRk>9PKOrRw?pxBy~a`h9NTd4MXPnfSMszd-jaG*~UJdxvS(Nq1X88Kvcfv z%kfFu5?*oSLFfF`mh)+hIU8_ucC{(Lx;PB z=JKd5=hGN-HsI#$u(782TT>&CJg&NzIA>4(%HD7Gn$3Fb`D^^O>osQI#%X+ba{aSD zM7?EO$H?vTkf zUdgX?4_v!>cR0Cq$F7Awwy|Q9z&;CRW2sy$@(Vr~WPV34#+m>3K8XuOrm!(<%h~{E zs~3}~0EPYZ$?*Ka&+PH)2BLI+}huY&v_`5`Z~6fnocpw7x?psUkqRT+$MbO zy}g+1{n8#0`|RO^Nieu+8)XzJK{-GOSfKv5XNjQkb=5JLJ*)x}AD3UlOL^ZBSc8{p z3kEM`V?6lyaXE6;@CECaXHi6HI*~mFG-LU$t@|zUbQG#(KuuX7+Ovgc4MbC>7xYP| zV&P>~yl?3Zsy5ZP_#W2vjZ#`MvW~mzq-+WnlWU&+S~9j<#@Fo)2gEf1!;>-=<%v%* z(njnu9mf{N{lvcrQ@z!$ICT)7>*wn#dauX*$6kn^7lp^T?Z&!d9c&N6MnJ3*oZIus z#~%z&?8hL#`jbC)=yiK^^!@MuaKK%{ey6bU*Y4P>Myhiz$lZ#aywVJV_wqm zw(ac<>6jEz6ia@j;FxRbPhaeDBPy_vai=ssxEuK7-gj*xxc4^*<1-Z_n_OG$*M9C~ z!6V;vU-$0;KbS;3KgOFJDCq2Cj(Bnp&JSS69l$uRzi#JjSC4+KoqfeLdH|1te)hzE zRPAF1clyTI!m%^XM>#NK{D$2|r4QB^dpN-J7_Y};3o$HYo9=R_YTR7k(Lc_yWQ(;Mo8lU8pV89BM5Dl_0J! zyazBI5bAY(YE(BCsemhvv8Lvb7&z6y74ond!=&^Pd)HH6lZFph^k>*>QFv{PRa;owmFF2&LD;cntvZ5mho85eno0Z)v?f|?k0 zt2xw%0FCJZY>{!$Q>VP-c9s~Wz#~V=SGOtS6#K-#U<>iwzU`|5PS)HhSS}q0J!>ci zcg_Bk|9|%0HQ2J_IuGl)kGb=n!5aiX@C}k8B~pAzHYJO+U9O~Tkxpc*RF!g7qDYDo zms3gQPx8mER3(-Ca8fR(?5LF3lx<0t;z$-rDN-a+ltfXK_z)S9HpLeR5X5_c8O&fF zcji9weQT|+_v$`<&b@bV0g&)*;Ot(#*0;X3x_9q=&+I;X?+$CUveBQiN|wW~jxR9H z9EH7U2Z!-fmJpmZ_skP9!nLV#ie~8e@)(GwLf~BYg^V+VO}KBD#xAZBeY(rT#IXj?{$4U^Yn6$RUF~e&iVH~J(lf^m%XpW zJ&$i5o_hKAm{EJT{3BoLvVV@7<&kgpqkR!RV;AB2ID5hNzKW^3x92wF>^7ERH}MGA z2g=f^*YDo1kEeFdFU!4skxf|D^ZGJRFTb7YngfXJOSL;p7yhBPFD|fGY|_ETf9Tsk z@%ayaO2l*VIBaXjZ`vt~1N*bPbwei?+eA@Vj;K!Lo_>{7wbFRvhpDCdj%h6Ua8PZOs%^WM$j= zWbsc3LM}s3KeCW+( z93PYi4}&fz1dxvRlC?EQWb#PHe> z3q!`%7>P^$Hn-pxMb!~6AJ!@vFFSM*S}3pOr#kzN9I~AZ9j0lDQ#g-U$IF_5c}~Z_ za#F20td#@nY|r|P6GnK}!V<@#Hn4%IaU z;=(^R@mSYwyhDfY0=5qy^U8PBs% z{oZpgDZcBMpTWhVbNIfF3qp8qoV`D68Iu$5xLUGz0#oLl1pH9ug&WjHead&XO|Bk8-JF8EdzX)6!S@Ir&5k>Mje1I9j#J`SN^_8l`4Z1g{_66M zxy>W$^eJz?tJfBMKl@R;yO)bK`&CkyohdaOxu%!;E`~e?DS*_NHke1VyOMfN4dF!h zeAGVI_bU>Q=V<|h`HDFY4Rsohd3D>@2{lC!b4Ci6b&NGQ);0Jo)LXU#Af{uS=d0Sz zGClfs?VZypQ)b7awzqsNB>U*KTaDIq4uTyqr*n{)#iCjxEe7fLv7SQgnN-8e;j@ys z?6{B~MqvXvJLJ_suo}Cs+wmOx*@7?@g73hBFy(2_rNqs(Z;LPMdzlz^IP0m~sZGqN z^nS!-UC0VKqA(qCECOQQ;SteX2;RDerz`Mrr`kC)$ANp!ZYM6!NeJq5>2l0wrIq2L zm2QL=MzyfHmY-s%oiV)(>=GXheNqd-84&%*DwC!6KpIAkiGNq8ExyaE=F@xlAK&+D zPxA5a@>}u#U;AE<@AhjaZ#j69&&-$~DCUj8m2;2cpVrrKZpAxk@qM1(<@q!pe;+X4 zUyB1FeXqAR&kMxpByLmM7mBN{38;f9&wc9r7?{qfbjrHGSNGlqcys;{ka|*OeAeaI z(6bm1h0cd6mc|7b;5X0y5spRNIK+4T+WUU-Zr`Z+@1pv?UwilO)TYhe3oN|_$Z;u0 zz?@g@D{Z49j<984 z<-nLa=PTd7&i*4Cb(u$a)D&52&fc_b(-&$2Z0?zlCMZW7=0+QZ>|-Q!blU7Y!zC;^ z`f{T-@Z>mIwtnVZ`)w1<%>33U?{O9GcTh0+K$I1Lz9{IhHy1nL-`!p|4VfM;B;uF`%wkI8vL5ZsQ z+n-}V-n#q%{=Ib)|GqlzKBH~+8QHULH{;Or_3g~JpEBd{i>H0rLZXoEhm6dbzx-Ee zM00X12a-PNQE_NM1sy(I$U9j4)gT_!^G0Cx*y*ydei?7dz{MiY9lrZ_3l}n$I3Ib} z02h8y*@4Sti&TI&W40O=82qSX^U@=@v!CzL!jC^t=t~~errhPmeUwM%l#UT!SaAg} zT1^WplaKes+w4Lvvv>j&y+P(i$Q@aSSXw)S$2-3QPrApVZ!U}79I1blv9%L^p`Cq+ zGU^shHYhL-d8kYrK{c*2cDr1B@XO^K-r@Ts7Ja$+%SB-QLwI5wC6#s9rCPu z*Q4C(d%!P5s)bo@f-zYu}rbbtlQr9|{IAS*(dol|>TAKka^ZlVfZf z9E@*&cjZHtu(`_fl)0KhUE2h(k>J+108EcBCO?$eY1uc+9xD+UxBIxQ4Mks~{p>vX zNzz%{#xAhr@pC057N9kOgU$83+g4Y>twWJj*SQ%id`3E>>U>4t*Yy|xp677#nQr8d zwEWTXpD7Ri=Fc1MmN&k=-2UC~wMRzt@zLYr{c+nI;>NMZENW+N$}BzJwZ83b@TqRF zNv``+3i)|`2tPntIgHn@Al4RM%dmC%$+C6zDIdHXu9xXSUwLF5+kd%)=5N zK2%yiFh?m;A9wolyBFuK>9{p4?$*Q)?G9e!V#9i{+2shV;x6E;=O5!l#605@e0;uf z?%BT?F{kWrAM`3bbl9ZEW;1^j%9a_3(i|6pHH-A#YPZ4)r#5Q2n}2O2_W`dRJK|z3 zzFtO~?hEnZo;bFiz29C_GrjkhyeJAo&YBjKP1^znxbKe$qPD!kxrZ{|G&qofGwJ}= zKJ_@Z0i3bZnI-3dWtMr79bfW0})TW)Xe3M@L%l2#1H{&RO)}s=B+1+3{ zZz|LlQ0<`X1cr)k94CLvayyO zb&gYMx?CF9cxnrtV_IoBQ5n#zSZ$QC~17WkXV z90DXR`G>8>p&)#Z&2f?}m!zuVJR9{(s}=S_3NO7!Kyxtp$)#^++fMSPUwky!bKy}O z%_p^QwB9L~y~fG-{pQYn%yF`Qk-SqrBj3IF5If3io<7GL`O!X4pM76Qc`xIU^JhO; z@>r;EJ8=r<4D+`m+&rCf5!+5V2zR4(=Fjqt@{Rg+BV0S>ve!5nzh`bbkYE=j$C(Fj zzMw=heNMSe&fwj;_{Fk(`mO%U+j;!GUg>8}V&>_4|51B4{T%u2s8f;%z!*xh#*1Td?qZH^z)#*U2Tm7&HTqbTm*8 zoXmzzdTYxlKD3)11W?dSH5Bz9zrBC-rv3w3ybP9Qwo@!NRRG(#^sFuR`l9de`hu_7 zo4w>7z>C@be6Uf|3c)Jh*X|U0D)ew>=C8RWgj?P2z$%kMFv==P$K5njLbt$FU55U$PKmd9EwpG-YUHVZCKcgC9GmrQ?e03XP5zn~$xcJfF8vahQJX?{EpY!>29+U{l_>OR#g93)AnbPp7d-m;;JZAB?V#*_ z1Xd0oEz7G%%H{^{>fgeITjswDaknbwnVlCo5uu*G`#^$jvc)7NC>d=2nyVz{6l6BB z*_Lm{2$yThD)M1FV#-u&VpuX3O$#rd6my>59E>QqDB~!+{0*G*?vJ~DUB|5lAX(z3 z+R{-@RH*Ev6OU@))y_QB;bSJ^dW^8FX$!76fB6oT2{wbUhQQBEQ4H9`Q8B^`6NVWa z^z(Fd(LW-Yj3{&NMq3ReqmyZ;noa3sS397MU)E8UkM#2G^=z|*zA>wz+L68`U)GDi zud|Qvs7)kRc;VPiILUdudlz#}J`zno0ylsN9Jm^1o?pN%Z(-)u8JlB5o|&8E5Jq+I znn^y21-Q;z#+CF6+ti)C_Ok&+gYj7`a95jQu#pcS%p#1pW^sftmhcHjv8o|dnFjK*G)h<1ZMI2PK5AER;_7U8 zGTq!T9W=9?nH*`>of$+j+jsVtp&6L4}I#OPJ>U!>1D^tis=^O^4;pS^He$LXNr&bCkm(e4`H zT3eK`Vi^2Fk&g#u-YMW0lX&^a^h_;qORH-KcMNC{59%F9V3`+-4zJ;Dg z2_cDW!b#V+M|%17wXkj7GRj97TB&29thUuy=sm={eUIOT3+nmetx)FHZtNdSt!iT3 zNuM*Jj1NPx*g2E}brHYnsPBt%6sKz9Wb1sy3-#5f9Z)ULDpltva8_YI-lW%i0+%c7S&6%*}OZs1VKsv<*+CWQZ)%GX?#7m$huh zr8Y6iN0=}h7j?N!dE?5JvU%-FSwDw&`Za~obCIWXmK}KgxRO@&BJai~TGb-x+tQ=f z7zmPU&uRi^+oYvLOOr`!9+)hy0>~bFjQ&76vRFfj=tXE%X%CcOf zQ{Ct@kqoSR@H|__LAL#_I(&RCxNSZ!=gU;;Z$u^)Bn__83!m&L40RJ6ax|c~zbVyL zg(iLzwl;z^jhTm@I4JpFB}l;8cdY8)3x0l(_R86Z%fo-b&xfJf#$xb0%I$A^4;~l& zUMvp33_5knqj(4VoP-f8>nT4!VTda85C>m_ii5R^WZ6Pr@oXzjj}4!?Q-u?^*L?r& z@=<}>@2!_F)CVQ0b9eC)>se6bJetnnFQ=LLs;t|=Lsyr@sPHK93xO5OY_qiOW>di!0ZQY#A4vb<9S7)G4;= z%yEPAC={s7w8u4c@w0cgL!`L#~Aed^EfL`3CsghzZ=ZJf8H3( z)03j+6?}`ZeaOalLC!N=KL(YV0a!dN>EbcPz9A}h^x>Qf%QowPizE$qz zL)~uul#lAlH%BmBinZG~mF@<{too+7RW}eUr$L=6=vR7=ax|;K+$v%H^l= zxMn;q&gN0fuWd{`J-*atEc8}$LfV|eG7*+R_*s?MoL7Ecw_h(5+3ShRnOZ(&FP{;n>hLSj<>PnbyoI}c?H8f& z5`lr(P*GelXPYqDIoqYrI{Nf&aR*=XHz+u4KSH*1hjJnwa&;H4Y8lu*RL*0e_X#}K z`7AzM0JZ`Mtwd%olcgXq01Pj6??V`irB9=Z<*Y_qi_5j!

sePv7^Q<@gQVNJo~`c$|bZ_ zeAmLC6t!ppB6yL4Wr2=cuQZ^l!_RDvtW2|lF(tLys%7%FGU3te#U)yEiA;fVTxQF1 zoh;dzvItd&-J6O%;n;PS4(_^6DXbZ}Ass#yMuECe*qnwu%`@0kgkx=GI;&NcOgB&~ zC)K2otlD(ZDZjwq2hv{a^@DaMjeXY#WDjS?(ER)yFA5C}qi8JLroRQ!q8>TH&%aB- zZqNn&pg)fXs~IsDk8=+1C+Fu&KmYf!0DLzVgMR>@_r|+}9aA$^v&kGv2C#_`3HOsD zhpoO+id0Dkhjl(|m7hMs$xk|(VAF)GgGW2dEPe@(hvsJ+3!l6zcoTO87u+GduwC6QJEeg@sVsrlT zd%9x{X+P$Kf;FGuL%Z$-hVJl*yttwm2lc@S>^uVeVJCkK%y$9f7GTUP%&%ph3*+C4 z_@ScBOUzS$f(pJZ$7^5w)DY(x&Ru(7Fs5nD+F+n) z=v>BT!^T&$xk7BNDhptjVFgeu*NxtG>O?A^3 zDoMa%Mi-l{?2U4!LE6v$?$hO|M{$?;i&Sp8YYhv)yxyRkQJcuV_5GuPx+rFbuG#nI zEJRz^zg>Z;gYL&C7tSw>&CX>vP?S87M))=RMY#wUm=w)L*=G!UPz<=6T!M-^mZpCZztK6Y-71Fau$o`+HUmUn=|d#8 z+4l?jUi05=e#&;h8LuT1VqDWN<=cR=ZNT4PpTEXS?+##&6)&FQQG)g0(?MA4JfL~< zX=iDNgpGHk*a9&0d9r2KOlfl7!867wwcgZlCJv>P@iJ#y$jOR`tp4t=cV@Kx;khekxXmJ`5(e{4^a3O;g^%cwR?#9xS4as=fv@(mqf#wnkq zZ~iC}2%DLKWvycVY7A=GRU3p{Qm|IB0BWEXj;f4fTS;V|9z)!yz&D>)4I;j%S&3Q{ zYBx|eaG3<};yJW>x*R%uv$fr2ln?NAUgRJm&oxZ|3&6T)#0yF*M^2PO%P-BZ1$7t?gnb_YUMN~QazAmfy9F4Qk2rMu_U1Jlrw`&?c~9f;=bYC34$-E$&uwVn7Q8e=r)zgqTrW%-3JT?_tR7ghXBD37107M`Kgm&rhnX-K9 z6*yP%-M+N5SZ1h{T+$h)<7qk~EHUDvjzxU(r*093b{6>6zY(sHI<-QyWI|S)h+$1% z^yRyJAN|7*l})_MH+z_4f{Q;?YI-f4j3Bb96ey|XWNj%Kbb-9QcBI_$o$o4Vu<(2G z6|ePu5pz)IQ;v)6qJ{{(oc9(K0SL%RSy-Pp44-!~XO2A0z1a|ri?6BJOtTQwyEn~# zPZ;qk+vVu(FDu8efPLn^HzA!vwix{QCx5S;`|{_@wP$b)5}I7{@Q_i(hQJ!^7yn1b zR%aA!iGZ{|P7o}Hj4jT`ieL*+1;(fcXOP)Bqao$RX)mhT8p}o!=v+xZt{K5{Nvt*1 zh{d+N$(&`jYoVbpNvA2Jx`7I(8b;xgs&ScVDDmAmM5k;jC!*;%h;as2-6hNkpFAGi zXW55TBOUeC*&4wga$8ONo%-CJEHjg~omhH<+NoAQs+al#jKKn{VXe3%TzTr@^5Ad% zeEG(2{mXI$cLVe8;Je=agRvM4AUW(jOD8e~n+>WNY4Bn@1G*fLlfc^C5YHk2YO|-> z0e}dj7=0Z)HMeZfF+`}^afg=I?2cgG6}*YNfw%G5TIUbG`nd8N)rv_QWfgL$Ek4|q%?Zi#x3f~3Hxy6aeJIuM@i~sa4;3c#<|9EO4#wt6MY-8tl z&QY^E2%@)5=?18%>-4#;bC;ZQ+uY=4k#ikF{_iCZRHZU;%liIf=0s^#}BRIC3Q)|#3O%$-H;1e93& z?#Q{@op50j`Xh{tBbzuD z)#2C7*`AB-h*NQjOK!=k7sZ=rqc00$_2ErDQkuhfllPejhv}(rnWh6ObnSb_4&)ti znLo=L>w(e$06+jqL_t*KQafti6sr6Op(d4*oHUb^Y2*dce~YL4c#U?V=% zcJR-E)_jB?;3_6;O*{N7uR;DhxrCC_|`UhUQ==Fdd>q%*rEu)R{_SWG*>2vEmU?Zin1Z2eII) zn|{(EaOT_dq&CIML2$B}+!&2*b`HCGW?UOCVOR$ztNdYTUieT>wqLf(=DE+7m0SND zezkmTvXQ1Kk+=C`quMaCp{{c@bhK9;8%f`cArqwyA69HuA@o$KZzlH}_6^wR*NnC5 zi2>H~3QCjlk8`NE;-V7%xef>)15FHMjvZzE&}r@XO+EcV`(OliH3ElmvFOs(i&*0I zyMQ^*cp=l?A;!nZajsE^&*rla<0A0mu<;ceG5;8ahXkvb%4~r5$70K_LBnwbX~jGrQkx!FZ8w-aJmvqH9hq7eq`i#6GE_MeUAa_IP- z{(fIu_@$CXNl`YW>t>Gs9C0Rt)|XUPh{H$lNeH`Q2ZmZZNrazzY5u}050Rp+4mW)% zxYPGjc)auPmdCK@yK&`Wbk%wMvSDym|43_xN*Nf8X`o1FHFWHTWr&T{1W`~)G9O=h z`#b(ZxdR_A0(*b(BT$mj31m+^b;&%ReEM?L$E8m(qNc-kS--Y!AIf}WBIk!n&Bbit zf*3Xz0rPnW6dvVycxAP$t*v?5;y`WJ{LR&8u(O8@`|;z4%ZX!0%3Zgg1|RxCEcAy@ zohdK>%kQ_(+0TEnJo2&s7Yo7X%+3vesxf6+)h6^d4WDWQH4P3U6`3()!(|z;&e!

46AZXsL5qljV`v@s^r)PtSj%q{i@allwHatBl$4RBD~ zBPN}ZhyO%k(s*M*+|>9=UnA6hIy=XLIfpAM$<$P;$=!izD^v9g1$}ernr51ZajcJV z=3sWckJ%MmLD-fo0_aRlz3kFS1sivp`Yos^c3bzMNjjqg*+@4VW4l~E`$&1@4?bic zzBl+LEC%0=#o(LX_zv%joHRJ>pRt?ZvgV_(O*`Q<17ue%zgp8rBcz%}afQ8_gs%i4 zWPGS>2jJ`Y(cAH&oUFvRQ{ePx5Y_amUFu%7LLMEuOgk=tmoOK?|q=R zF_b-X5j)an48Hns5gec86Ze#*llR8gAU_uP*bW~V5hg7{~u&Wk>W?VqRcMSAM1w1c%S-8W79Jx1&BJ1x zkoBdBZIvu9)B!ltFC&ImUyDe6RULZuRj?PkwtlG(NT%l3<;^^+jd&JelD`|KZQ~>S zWOfPub$olS)UFtKWx1!D+YYYk+vP*O<(mlDW-(~Wh5NnoIAo?B>RJh}x*8-XAJ#cm z)(fjzHnr!}bw9|S{O0B(Eb1Q9v?E_jIq}N9j_JTgjB?9eHeV>_aaw#Da}hy~6FSAn z@ZHKoU&ZQcktzq(p&xR|M;O-NZTd(a=qy~v8E#e$`6EYjqs$T|l#Fo=wj=&(oZ}<=z}F5I+OrLE)x%_YBzxaBdf6j)(~UNPt9|S7xh>Aj zBV7>W#Sl}4omK8rz?}(3vqNch<`1_5D6S~L~heVmImXb9-78|vxgH!mL7Zqv{s3N@T z#8>kaR<*Efi_3yXJKHlR^z{!6ZMkHQtRL_R${cCVr8)k4UjmhLFNewaGKM&o0au*^ z*#qYsk#Laf223g{&88k z<$G}c#v*X;Z;cmm%!RQiC;)9}%T^N!pB^W*4@hlQVdfZCtXvaq$yGNKs&A|Id@Vs3 za;*zPRA-qBa=?+#e$~xEqu(|bJB}aR{fm(}C^t3&OSp4<8>4$1K-zhRaG2c_`adglyBDx|#}&(UP93C}y#?E3M6qFsLb-UQVjb z78k7`3&T^2`|E<199(ZWl17o3+?*>oc@*-|&dVq8i0As4XL(mIC?u27qQrm*t6CA+ zmQUbo$Ax7bd>ULcC44=v183BEneS7+K-%;-Qi|;RM zr~QX8{GkjzKKq3S%11x``SQn~{YrW0vGe8P<@Iv%#OZSK_-QPzo-S*v$FQIQAm%&Y zeSHnbz!OhCR?eP%v|L@kT$cF+#fZ6t#at`wXUOa)eil(SH~f8UY;RGA$9ZnyI9iEU z&>X|Nw(q?8)^alzZ&%<;{WbiZW6!SR2Rs|VZ@_N@=lD(JzI7;cux)N`miu0HM|s0* zUsitLdtO)G^G@8=9Oc$GzoVRb`D@DKpZQpM;#0V&8O27+h6)mRWB6=-_(%d6Cb~$M zN0%}S-;2v48tJLi)T4ja(>5xK)7SELz0WrHcUIv&(;SI&j!2GVl<5SJbRNOxPvEWp zaADJq@gN|(i;y7D#+o{h>{~Rwu;~s-Au(a?I}i2H1)1Db(>BSO7Fz589S5EXk>qk) zM6}9rDRwnZ?AB)`GPF}kj+RXfbJ=m2aIVxMhpK=8T~$j+x~dAn_i^$em#5~eS$56X z4xB-QH|MDs=1!1GhgEKb@X_~qG5F>;yuIA}SN@}N^5yqUgD}`XPMw()j5YK$)#NhH z3>ob5yck*EaC#UUj9In?8q5XU`N~HjZ=b;9p)WmxJA$7s+Z#JP9(n!eKxE>>4*21aIwrub9vu!Sd^RDQXo8E|ZB>X!?l&JOh&+hJptF^H|t!*_x`T-~R zv;E)>f3xiF--CDm&W`qhX0Ib~7~gNMK7)67GN%WV>~trCIMRId`J}yp%K|t{eYPE18RJ#GqHilfY zuopz5amYK)@`Hi4CRg;&x+tf;_IHH0AYE5`9NQU}Wtz}#@)TXhWm$IBw6R3oo=fe8 zagx7rantcO?K%0(i_z#i-^Nyh&k;Ibp(;mjAGPH)*iTtiIf2(0$~D`llU=ppB6jAK zzxGwFWf*}&*KiBJ%X;XmSbe<%=a36Nc}yCN_{j@7H%Fn&x8HB!WNHzx!NRt56e+{j zV4<=Swkn5uQC0hrVl2YvTxuLkCcGfq6NVR(?9FJ`r}yTvALy6n0`MvpYd7$#tmmur z6SK}M8dx+*qt0{3>{19%m+V7OvYAiDNWoe-C80KL(AgI*%7bDDe5Y3))fRafeU?)k zvjq>;;%KO0sQTbBd+=nA#?Kr4`goO(Tfskec;V{^zI6GQ$dm`67JnXR!Zz`ezQzWC zW5ANrHNPI80q!#G7qkhleV5&c!YGUZ2^MIw=l$I58$#e$^MYXQ%#ksqrcHfFxGE}- zQ7wPgEW`*Wk!_VO*35jYLE(^PaM+lUC+pc(Jk`Rm%@2!eZ%uv9`N$@o&ZmxJuZLgG z&H9uvIbY~$s(8jU1qGDwo0%V>caU!@Cig+OE~a@vXSvCiv5@P$Q4r{qXSGEv=?OJD zas{vG*>1*+27ZVYxBPNVm~fD5p$>&mmS`ry#ePm%4#B^18UIlGWLdub-QY>@aW^gz zJH2nE1Asi1w^uILB$AVK@}-G#=uONR$)W(jF!GU|HFf-`Kqr`uH}z21VlE?wuV5Hg z4y|c{nJyr?l5PLsePPEAE*NQ)59%8mfmPf=zIpypIP*?NE}r?^wK;h45#06rWS!2w zh!S&~^AKLb+l!chR_uESxt+3LP*DktAo9oOyGttso0_3>CD{G(=T(1qSrNT zHgJc4z2EobJvgnTN5y4=8ovs%wl(=O#Ljn8pl;gXT6MySGPSvrtmFXHsjXVLfLj$h z#M!uXp?vcrKWFdu<@t=$p84|sGwl!@m$8wv{;IYVB-oxXSf z#rKt)--NsGkRx%IudbJ0|DDg35C7I@%J~ad$_5r^udQFlow$d}spBi<`qc~N3ciyb zU%_0*LhH)%YT3eq?88qyS-$x&-f3-jw}boeDsJG#A}*M{ublb#4;N9H7q8!2Ol+4| z@Vzz$WD9mK+8#o^v5AFY)a%!`%aiBNmTT9pmeZ$Bl_U7U#WLa|VUi%glEqlUvFE>s z@)+dg=gSW~QNHrf+4BGV{=Y4E+;($$`*+-3e*ABKPkGsGCvivc>2l9||5`con(rtN z{`xPLb=?hYgEx&Yo1;Iu7M?by!A6uUQx)B7Ff)3Qs17cxvW{{TQyaM}xerzP96U?6 zx*z0#%d1(i4qj5ua!tBy%Q7S7c9uO0Xkvlf+ub%hq&^y|Z(AhwLi>XR)NyVjR9cL$ zal6i$N2k*mRUa@~YQ#}SE>w0vuwLE`OnYT9lD#ukG=js@Y5f7sp`{Ob4rggq+y$Sp6cv@WQ3 zY-O2kvO?FWa|1F1#(txR`KaC7q$kX1g5TPSxB4Y}%_ZSdVuzM-4m*6=;?qE{ywdAN>=R2yLOJ}Oh3Bzw7JZIlnX|oz}9OC&wvi*5VBXXQnDq~NG;2fA71E{dl(tXVp4QwP=(C&V#Z=e~f~ z*F1oJ$0c;7DJs%Yrrs8R*`^``QgdX3d04EEDc7CaBYK{rV{;2U2HQM8M00T z-+GN(@>4Be)Fw)=TKdE$Q{CaRg`pYy3Kj^pbc&r!l@qp^`7A%xBfqT6ILJ+2fvYjP zT&iAt$)0VMGuh>manf1c_bvM}=f2%IMFkKL(lVWS_FZ;;2_z74RIrxR)}bH=2JF$ZImu+24(3|Y5_d~5ph zPrkJ;1SLBmFOl-nTma@Tvi7ssVlwXt;3UXGO(~I;ty9m|QDH_M>}h zo4*l3&pOKqm-|DC24@PW;A<|)uZ~T)(65>)FrJFqs;QrskMx9)6FzjC;mf+@Lv>9g z=}nCINj>F}ax=R?7Tj1TY>pv2@N%hwII97Ul)F;*74^cRmT3KvU({yn`0IWGjir@+ zl&5Njg1yc&aWRL4Vbe;dv-si%K%!qo?|j_2ef^oT`Q#sA5%~MUL7YYwJ|bc>a;iDP zCYM0Bm3&7a`euD_D~9TfspBKwl#_|#Q(kJPT?gDm2|E@KyiF`VXwZ*JEbJ1~`LeuAC!t$u_oGraZXV`@n~Psyu^Qp0cvG0%0Z< z*}8gKOqvXuIj%v=_(pjNG5Jy=-fFLGdl+~7zV?TI!XAn2xA7h-zwp72m0$bFr_1Hb z*R3yntoho?a#_Lm&CRW4EZSnRcMWrUbE{m#_tLxWI8&ZEccFasfrrZD&pe9-Uo7$? z)-vx1h7V4$JPlW{P+*O0}H{Y%88f1s=V$;exiKk7k;{VB(&{+pb4U$|(+4`+!JxH#;)8$@5*@ za<>$y43OyuK8f0}wi~Ll3Pxv1hs4TbPMF#U+LX`)q*O~|r#9m&D(j~oSQr!=MxN)U ztZ46L%v#f$K1itJvBLjt(Lo3Up}|t`kR}H0WK$mI8)IH|=1hNRIvbP|5$yh$@1&D& zQ^RhMNWgd}fc3+g-cyB0>6R;JA1?pqpZq;T-S)QkmfOGkJ@(GviA6CcjZ2wDwwy2I zIx(fEkND&-TX3YY5o;c=i8Hut@WnNc!|nY0$j3wT!#iR(u@GD~c}FmF^{UIJrXZn< zB=vKyr+sxJR6A!CBTzOk;7JgQ7!yx=D;*(9a5ltI*&i4M{VV6?J!c;6tsOXq0P<$5l?*-%O&YjZieXFRLI=d08+-gJt^MwaD}bThsk#-Q9V_Pip#zV7g~FVJVXfr(>IUztbaD?CZ$ z(_v=%C|m?KzNBmTf$7_Ho6+Swg16?QwlJ!tUr^7)>9HyA-qf^#GiVn(j}2v(nV6lA zqq^<9Jm9Ms4X^OzhJ1aWZ!nD~e051a?@jz2Z+iK>2Yf*SJpQMpT*L*({VKP=sg#p< zflU)DCf=~EiNfF+w@6Q{xaAiU&Gh2QIO)Pq2SbHGZxfjcmU(<`t?_4kWLMqAttXA# zKVpTGpYln0G_i=IElSw9NO2y&j{U@iujBJTc?ADBy8ZBp^4D&9Q~9nFca@X)_3-4U zm??(QNzaCCS(YxvH$QIROZOR*e29^pYwG1VFFrB3$X`0PQEV(iuH%Y!Gk(3@U2Ec% zL%9$ynOL<|C;wp_+SNZ{bDg=fUb6CKyTht!r>0R10qC3a?Pc0?kzXIXZ_6k1Q77CY zo<85cEpF*YT*9cHhY<&G+(#;wCN?wsP560r@Ti-$zanO>I29B|aSGeF=?Y!`b5q+L zr#(w^)9;|##+^@WTa8Cu@~$eiO_mONUNk3;kHjP<>{i2e==eQl`IdJ^A9l(=^`mx$ zJ~`Jc3!m%in3X$l$VWBdkkhy+3+qAM_{ASy9_6D$4UgI{2(jixA}j)99C(4q?ii4a zdhO&bW%cO69l+g=I%wX&2y9-vQm&kT4AT~~5s!5&*YH8%H0J#D1t@Q0Qc`0_74256 z_Brn&yfBxmJzy_f#VqVV+kHqb{GNPeSvq#dz$f!r4;S;ZM+ z3k!VtSm%dvw=X}}AwTEBVP?F3y!+u#!)7kwA=eDgY{|`1wZ-4R`D3>DOP{ZOd+#sK@C zbDWE}T;TQjeh80=K8&Z=94f0=2;R7M-4=p3u&8UCI5%%#QI`wA{)lMYNsYUH595yD zOP4O;Ze;v}6S2v`&|K{0qo(;E9|wK&>6>kl`RMUecuEcqIef0;@88y;b=*aae9_+A zLNUCh|vqY*h|cLD$1pL|bw+Z*n*vDsX|TE6m&KV7ao!8`g<2+aeVb)u1- zJEEJjc0S0u0fv-T8k@*zK>)LbT=O@t9XCoZ1I11oUj*ZMa53NIhl zHkC7h90V4r+D_YUZHI`gHMK1TD&@$ncjJA*Z!fQT|4){BSFm{Kq+_g(qbaeOIH;Lz zQw5Ct4YS+L4R9}t6}C;hA9xFoNZ!UZ04tir$}w{=1@>_UMv)|C@?GtkU zCF@6X`4W zbsYC;4sG;n4%Xf)wS`Tph2lIs^k(v-a_i~OVe$9#(BZoiUU_3r^WhCg{7{GQh{LDw5Dj)s79*fqvy1ve90b|<> zp=B3V*D!w;l$F(`@?ZXgH(*G)BUEgssFCV!w3)j~->euu1ZSu10v=c`0la2$a zq8(c2hj6L|?Ay>+A7O5^-UaufSVNmQRWHhIH<;|d0N>=Y0GH|ZQ*PoX;(7W6sba<6 zK>j!6djoNlEaS0g9($|X&f}k_@7(v??06si13YDzKTg!&qdgP04zGL<{yF}F-+;5t zzceq=q8*b@tTC~4vXx0{|4Sd^5j&ii`n>PZS(TkBQyKPJ3lo$x`ivJwG_|N0OuSjBUX)@Z8=upl&8Vy#FBB47v5Er zu?m`boY6V6EKH6kf9jIGIT11*3+#0~T_bfpaprwkIpj~Ya+kl_!Y~KM8DNcDc-h6H zT0GINKC;iLYp!Vw@(z`{;>e>|s-dd=4;}rgS&gb73Cf~&_*gZUD_n1*UOLvP zG~)!DUt=0E;|daoSdchnQ^VaUdK)t*0N`v^b0u6giW7Mb&()`)KZaN zGHXKArY#rQR1;XSxLk7a>p+cZ#34D? zG`BolMC(*^sBD&nxj-@?8mQ}Uy{NMfD=Y}$AE*b5zcz#in|&AoyOSJu?(lAwvWQY}$>}TnuCHuJEGH5-!>v;%D@z zXQS!+B7XI?i^YK&m61OG?Z|W$JL1Z~9Ef_9>g!Ez&wu&T<-xeychXLKD>F*YsmUiI zsA&Yew9O(vlhIJ-=EF7>sI47%VzbWLu99dqeGX&c^wodkN6YHTQ{dVvzxlDxmw)sx ze!Dz#;Swlx;Sv|yQ5eeaYRAGXF1l~x;`;^M>3iwQdbzf-U7opi)-LERui(9wcEQiH zVxRdT!!>+&UBaV1j~+W(t|EEf>C467E7#U7{*l9ecQ79{Z41HpTlMr)PvH^I%ViCB z4zuRPS1$gNbPE^z$?+)OGko^klX$o98}R!lynh>hhp`C2vd%UyO5(yTo+WK#MRyxx zOU#lp?4xHdmjC>J_;C5L|L|?)$MIQ4KCk=XA1hz|SN~_b2yE!InJ5rLdW@LK+-T4F zk2qqtnLeKn=rHYjNOIL}MWnQx;R+k~KObd0%>(+gAda{c%ncm2DIFUK0gN(y$w3Ad zw>z_I6vfDb*Ko#XP760v#17{4rmVDRnHrm{tDf?Snw5>408ms&72K$%ptX(!vpo%a zh0O@+Sgr{oQLpQr8;s8a#mv4&6NdVIrss-~RP)j@efrY$tv5z{Crr&xz`ho*^lGD? zhJ$mp-DjG+lba!`_tmE!E{}d3pFj9e;a$OZz59LTHryH97WnAEs3R~%b!;~>wL`E{ zHvh~zW#m1`wvJ0NGf&Ugx9da!Z`hXc11f&_U1ICm>Cw>j@B0jg=h2MVOlqNMa!Y+7 zXSPXJEvVX~ni%EQBoof`85EuWc+hO&br~DiFP0^|C;8Aa-VKZ~6(#4s&3`Tm`~OyR zvwHO8fcZdmFakF|0{s54jMq(UUFUZd%ubt#6!=rP_*-cPk756=^(STX>Hp6ccP)2eq9&bv zxJiZ7Qq?gEMYbiEMjVa>5F@?LMKHhW&8Nz5{oJGYo;a^>O_Udff>FC2;TS z@q`<^X2oX`DxEur-AYOu3$lhTjm^Vfy<8r-|8jZeNq@r6iPJ0PwtJ71JMKAJPTo9P z79j`s8S2DC_UBf_n^=1O+K+@WG5SS$W-cIC(?!k|-?z=+8^%%TbCBNZ%+VN9BXY|; zeU5!w<4cwqn<=qDY)ccH8BEG6iS!(o3`%3!gBw$B$bVFmBx8G0`mkh-c-&IAGyM$9 zNT0_$%N3jBDZ-q%KG1`4hF|6uO;ZozEc8(hsB5m&v5-r4ilHBbXvWjx$v^xmH}!id zDF^cE6|<%uCeo72z12?XzDRcfkIr;`ir;>1uB6*O>30m;X&yBl6TaG$FWxVA@%t-A{fu#x}S_DO)`_#HE^?0;{G|mUA=V zl^)?u5qDNjU`p3;2g8GSyx#9!_*(f=EdCO`fnU3x!@E84MqsoipGgLH?F&6vgo}Fa z7!_HFHM&OOWUt>c~@#Yvq=vX1)P7AE6+8EwU?a0oN~re9y^z@nI{p|4!oPPw;H z$3kB^HI6jQmL|817l-noEA1@34SM5|T^QETQLQ*empGy4JN3T#&4+P^&l7m3AMY6D zMaiXd?AVcV>utA{m)&_M+L@cYEJ;@>rISLn@VT93BTSplX3fOiw4tX-eXRS?loMxd zcHDV9D<<43Ck-q!09V(o>=C0mrovV^t5XPyk@d<|b%Ihwm-=so4wIWEOQG7iwl4e` zc<`vXTi&w67`A@qt?t$ah1?JL=$Neg#lUGJlAgbBCzlx!|KR3@Z^qX6hPz)Fk^`0a zU~$80$ad$i)h^Tj;L*<-uY-EOMquUeT3LVgdOaMthQs%R@uH7SRc!n;%NFLb9Ts78 zP3Y|{o+B6wzxJr-lP^cV__f-4IUt>P{1ZCQXFx-h&bO+m)A@k%!lFD> z6Aam!%0so=Hm=}q-{1b(^7tn{RMwxu`vW`GZhn!F4W}jCY_W9ROM|Lh@`^hAI&EY+@vU<4_lN$Iau|!h9J7D+OCKvggAW&8ZSFLyXwF7GXXABz zhq(Cc#d7)56)Xhf!YJ>E;RRA#ob@|?>A`VnzDpqI>({Q?0`Xzo$;-z|U%Gl3i@HnY zFfOjHAWO!e&y_1z%EgNp%b7E0@Hl9^3mA*e#*aH~ggJyeP*(9+>aDdkJY9XG-2c_D zmiu0FU%BJf)8*;&=a@mc7Vo{^=3P4Az%n+}yqg(EB0kfIK#cNF{`F^V;p|8M`di8p zj^o#0k^IX)`;W`D3*_8u;r?w)-j7-4{LgKZXA~2kr4MS=t$%RIUp4UDwLB9M?*V-# z3*r&npK@LBH4nE6>;7OeweLIfItmUfYUGe^8El<7$8?Zq+>iyIcZET+ugeYI5|Mro znktyPbk#+-g^?^ht^yT8b?~yP7;AJJ;ZaL8gc?=vk!`&7Cr7VSyYlZsP|AJnuI+I!MRcot*pIWH{iuC-SMaOf_Y+tMes5Vhh6O-^ zEU`Yj)MjVZaZ)$3$7;99*96<#)prE-ooRdx9#o= zS)-P_bxVy76HWV@H8(eavMtLE9b#BFA{KB%-cc%vli$gCbT@x;j0>l1^mFU%7x1I9 zyYMs-+|_G-B*dq3giIfN4>?!>Zg$c^W1mJ~<;cmhjvuQX!hGe_<98m;ME_wn6cyeFrIiZxBZa-XZy?d=Z@eSUo_U&6<{ayS) zOB&PE$C+Nu84JU~@9_t(mJk0Q50xh#8js0a{=&`Wul}cZ&(Ly~*Bom6q#JnbUX}Vr zr^+7;*49K(-TCDF=vGtfajBihiat4Rg3;6#8EX(XH+*5soDIpSAL4C*T?3d3>*7}f z^mF3|U6X4UVx}1Zhd$~Doq!u+W(XZSqplsBv5Xbb{~R;-dm&vOI{~3Hwc4r~UAA#1 zv)arb)|}gngJP-f{iTQFBA$6;!FbiL=g!G2vPBN$p-3o8O3f8>w!)1<*i#?o_&ty6 zm*xWSq5;!R$e66lvM_cBa5i8M+C(ED>*X-2iR<@#_FZHXUtqG^yaUrFJM)BZ#ZyoN z28p6)tpiB5rk^5H-8h0zPSiuDuZf-BmDq;e5@|U%@g?(-YZuC=FFsU0@yr9|QoRe? z-FS(`Su=+bW0T^kKQc7~(#CB3X7IpP+A37kG;XpfFF_PbcIij;JWSR@W;6FsA&ipw z8XyIbf7IDm<06PSjFU=y^1o2~eXV_2Iq9Q>P)nQ!G3*Q!{M9$R!m;m%;pj(F7Wzk- zn-}b`UBewSfAq(HTt4xKe^f4Az6=#EhT`JrJ$K(#zV~~-x7>zB;8i?!(MrxI$Dpz1 zkYc;nf^8jyz%25eXM?^mfzxOkWsF(QlOcs+4X0+TXh%_>1y$Rv-BuuT?D$}#FG~|g zKB^rOolt{LNseY!Q3!6K*lgYd9EQ4|Cg9dN{E8Qs@|SOZtCUgK00TY8E32DE8n;eg zU6>$k^XwJa3G(aI=)b*(iE10)I3HSwI6G=F!^R3r7hDLA6gcl)+&*|;SU=Y=y9g%xr5yE83_gw5u304msoZj+B61(@eI z!jdlIJ9;#iPTXCVPQ41JySO-H_#P*2<=@-qwdFUk+c?5*$3N`-xmx-vP1-}%|XM?R}CGoyynB-`acw8<}I1wvo|ekSAeP0oEC4ZE$}h)*`o z1ur$#m`^@SBCd?=BZ}QWP{*T`JHF=!>f-M&{l=%t2mbHh$1uu?e;o#o#)Fv)xEHYa zdv%?URz~KaU&Y#et1PV0!Z!tW%&lXEK;3>b@#T0DGswQR3kFGsK-{LOFPU)Bz7mN&ib zwdJe#KTxi2aakEjBGFB|TZega!6Et@<6{BS=AZrw|3+??AASE@@B^W>^2#6lk#hep zeW38M&`lvt-XV?52F3^&3lkxus&3>H&9G+raw51ZSdE!ibfyUnuLy0EW_j4Al&g4G@W1`1e-Dp`{^@el z>)&2pt;a*#{vdfr%FfjNq~NIQ{tJ9k z1mp40!;;dPpMC-jNk+=fCpC4h*ReR`J#}H$WJ!kFIJx0?PSCB3k6_{ZTvauMY z3u%lG##cY=Tv=V4oDQUe5!lBOSXn!UAC!SGj%WU*V$-G}rz`*cy@U_HmvBx(XWz*J z&tt^kgw)CHIy21O5W~5ii*)kO_ACpRefK7BJp2(nJ?twuou$j=IRxn#Ca0pX_18yI z2+UeVj?w0LRaN#AUNv#B$N0L_lo-F`yyiPkecLYpzwW#FYATHbYKb-sQ-94+$3kPo z+I=4W%BAuP|H}hq{jz`G&Irk`e|vg*LNm5qoF)f(?^NHAQ%9QfpoyF;onGTm|F(2? z`U&F%zO8)@d~IitLi~JB@aV?)7oANVz-t@k-LD#r|&nT(vZ1ehA^J$2>JQ<6`EE$*bmst6#B64!? z8UG#g>SKyWb;_s4mMv=i_%J~`#Ny_S`YmR?A#3`Jc0>N(nog_x{48z0OVWxaEgH5H z)1I7}EVOCT(mBg)FDi-GVA)r)Y5+LtEk1QD@<(lA!a5*rWs5o=K*K(D{E2Bs%v{x| zcu<(AwsPiIL%#R-O8Eo4_m_`;es*i!E_zjpD#%xgzAb&OBaT&yDSP(MGVOD)8Y7w2 zu6XeXpjf-DM}FeWX;GI-h0wn?5&+_G{}2wm+2C8l&*3n}uvI^Wk#pjyn6Ozp@HHRB zS53RPBzE~!-r%ZL_(ipayMDj^^#{r)KlSPI%rnoRn|$Zqa(Vsh?<=o(id+bP2U%+^z%wa0iY-~Q)%K(v*o>Ygz48Y7w2uB`L? zD_{pf#2E%o%-d|SZr6Wo_Inn{7#F`lMNfRNK)k%XipR^nG`|Mq5j&7y*b(5JC@V*B z_aZJ@^4!E3$0H$^SYCk2=cipx!W?#7c%b4THS0|~i)wEz-ezo;<<;wQJIll)`@^Tp z@|o9_L#xNF?YS`7j8!}9=)c>tgP+cKgVAmC7{sf-v?))DkYVGaMj!cz-|@SNyMG(_ zfX>~t|9XJ;Ll?@Gn_U#F#MxKelXu}hd+FJ74e#&W-r_rcF$Z}5S>*3ky3~a6NjI|DHi6@Z};g zAN$M&WyWC5bNCAG0$u^&%*o^Bsi&VTPd$0Eyz{%>R6h2Zui|mjcoZ~_D?aRw|IyF# zV~&xh7A|DtpOO!J@bl$mw;nJ5{-1w!IeP0ISTui6dF1zh!}9Xch8P2G?T{+~u~;HR zgEd3i$aQWlL-MI2!qgZZ(qmB$KaO3dV4HH)iK=iIVP z_uOt|YjA%?5Y+Y+z}jlimO2|yui}_W{;ucwnzq)DI{C4tn-7ujJ{B~%O?dY*AC4Ej z+!46&4XCFwG25h{+$V{hjvYg^?+1@t$rZ$E*%G(0MIsaPj6{!lCDOKiV6wod70G<1 z7m?bkrDxsgY7>HF)pE1r8U0+xIs36cWq367tA6l5!=f~#bqS2JN=;xYOw_`AD}#o*0n?k`(c&jx!xDxn@!!_)@2 zMwQbHgNA52f7WT)xHesEEzttGb(4MYelSNK&s1}}jmHjN$Mulq6Zhh8#!)-(*t>z% z8Po@N|Jq<3Y@UY^upgY^)e>9R@g0S84hz0^-o@PXzdQV!fnpOElFdut`1Fxfc+6Pg zkL7G~`wR~yDzyou%nxL1$`-nc1!Po2(c3JyUYXnYyR>z+Y&`hkvV8^b(dG9$a;Yen ztW!$TSse|HiTvl)gx3KgNd2ATQ2PN#`c}9%Ui;P)iAeREEdBUfuW_Di2Wk00a8&+Tt~7ydoo zyeAseqUhuAl-tlz@e-NFsPfGXn4I<^4q|5a9JdMGG_uDeSKmoxlKRB`Qo}Fe3tRQ; z_}EmeiV5P{HqhiKyy}`r&S`>A^FQgbSb3ye)Stl2_{evk>-}D@+(UW?SAKUhSeyQf z{B$(HixY??CQ?06TwC>OS}h-dn~6{33_(8|5+F1h$!s-S*b`!h9Sg2l? z`e^C0tpcp_ma30i^*ad>w}!8RJI=((d>Py43tTp5H2Qo%e>VBc-f8}D#u9^%{ZE;0-ljig`!DX0b{lcHV07%X;SV+kBe35iuyXu%+%bC2 z?(F3(xB1Cwr|UtGdHJ8G3qK0t0+J=dr2#Lzv%oHJ+f^nhQ40{Nam9c)QWp5F;BmcY z-cSy$ok_&PtCp#6ORw5{u2xeI&)pfHWyEPhHI0UL+#ufh)^Ru4gTMN}mnZP3XDeZ1 zI!%#_lxQ1d9*%gNi;M>{n{2D}-BsK6ec*(iY@(1wy>M3Vks{!|zbDU>Ti^OlT-@8l z`+KjI|N4LY1zS`V!p@aEUxIGS&a>b{uG{=4Sdh#;_itPei4e_OIGmXoWpn*uf~b_twZk%zj&WL z7L8YzaZwh&yt8)+kAyyP`b_!S*X}Q`y64{Vw%5F}eC|tM!fR8u?a|X4yyl9W^Upd3-#++j{LHfK}6Ba`fD^4w#>-4p)CM5g8a^#s*s{piO(R35|U&OeWZ;P;Id zg5Ad>4-(4ene>1+7lBk0IN+-O3D@ic0g_!RtD)~qwh(;t8_O2%1m+#V{4TF!TCNJw z>t%22DeoTdZK87$*t^!`#(nv;lAVk2j&u(A$ra`n5sU>THl*xUF+NUe^cCD{1737^ySfiK!K ze;+Jg8b<~C8Pklyc;ldSlE_QP=ZJZv+rIWp*|`4~@uQ1NaK&YE{hLK#hPLlfQtVLI zV;hc=cW~htHGP@ElSpHLTB6~+amT$!%keWS<8(U=^?;<|D*6nEVXQy_c-7*uuaX_QZXSPqx z&g-2Qw8O8)?|6p!i!Ni8pKPeJIjLO)-dskY0oRN_`A5DZ9i5?1reFV=N6O`k?VP^v zZKuleD*u6#fK}dQPNO`jn>UV?UydoZR150`dCiMC|p|*qU77 zV{QW<;}$1!$gvuZl;1o(A+lwj3By#9x{Vz^lie z`%cLWb_XygEsG}3s7@2R;@oTULtB$prl!su*)T_MT*N7#4!7$AL;g8t=!W^iHgci6 zrJy`iXI{x9NOr`zh=0U=@zUevWB6t7{p)ATdcFHvJ|31|F^BQ%35IxJYVJ7}v4wJ>aqxO-jT*$;CGdmSHB zCaT^)?B?8UGDqbHChM!qD6WjOMSjCR376_VhW3-`#YOz6KjMk8v1X4;ZE?%3sWV45 z%+VVcapLcAeZMMYhpYY-FmVp^MLdPfE|iU0{Hl8p+ayT#CJt=LG{vHlAC>{8?{6I+ z;^CJ$q1ihBXXQFBAg#ReKd?Isi1O0q*7FKBQ+EM+d(%f68HXkNh1|?N$Jyd9(DJH7 zAYL>0MO8aT8aI^wKWhA#hP?4vIlRwL%dmI{n}ZR+V%zDv%9XQU^0|j8$0@35jwT9~ zQ^kwzej(GoYtu7L<~d?2L0gpU)*VO4R~yzvc3jy@VtBM8^8KfSor;51(+8$^3FAtO+*?; zMS9i5Kvq+=sdIxcYa>eNv)OIJ&>JNZk{eZqqaNk9cYc3aJ;A$cx69A`^2f^~kDse^ zj&{vIUdN~Gr^zjQCokX2yNUPz+C~0tUxamXUNo969JwFft&YW6@sXR4f8N02?`^l@ z;yq+O;(6oo$MGKEEBM=U2tPtwFGr3Xu^3$7-PqVL4r1xc1!tbqH}Mn`J`#ErkA9}! z9_q};kK;n+I_}O{#`}fWPMj{E|H7Bb4}RbGmn#>~moGi`ShfJ6FOHdy^rb5s<$wObC(A$hZ+^f)x4-Kzl&}BFKeydsLz;JpA^g&>uY-haJ7tPt zP4aVaEe>iE)3Hi8Z22Owhr*UZJvJ;0f~mxZk|SUFzQ1kloi>ku;#bOMdbBz5WD;Xv zi_fDZtP}tox#h0%roa6UardRaPwvFa-%#H1cYnEj^1u5l_`Y#L6jsMjyAB+Q#)qdt zkL}r~gU>eekY%enO&w%4n;L<9w=tq0A0B)9wo#okcgP$Mj?Ix<@3F@g6MOzkp9(7@ zdGURyw(73$2E`nU&aWIh72J2@J-Da9|4l1-5$(maLeqY}6_r3y6lzd53Gu<9||fEF33S;&?akV}JO;a_76> zpY8}IVj9<07JJx(Q(CWK%kJ4|)Z$m20a;G=K29=C9#pbS!IzHRQI?L}QZ_F=f`#A* z-5gtvhnJ{N+1;m8aFw zXmsH#U3HKi2KATu=tx#d)h|qH*S;j5pq#CQQB4G14{~IweE(m+qdfk=^KT_i^UB(lDp={jHqy zlAXiTcdqB1=eCo+<|E*OylTvO1CjNTRg*u{dL zsDRD-h6jyBHYeykX4^CS1Q6*e|9*_+Y-rQm=(VIdbbC?X;8m=>gm@9K`#qrc%A~x zYCNV6cUpgA{e1bzxi6P5;vYB{H`Ygv(D~QRn!Zqs&yw@aa_y)3;PARt{#Btd%5^om zF!bp#){K}Vp(#3+3xhC{!q75sj&&{V~m`YyXp}pbPcy~^6O)TUgo;5LovhE`-{J?i6aL~ z^2y^Rxrw1fR6B!hhxlY~M8#AMqs389sB>K74g%`+OZy%pTuqNy#h~0IVU6vpPnM0Z z{#;pk_20nbT>a6Tjv`n@eH}dNb2Ntm%ohGN7b?X`IVU!dyEv1lWBn17;fIP6FIw4S zO|9V?Mp9Wmd<6gad1-zHP#+KK7jFc(NVh5B^t>Rd3%c$+VQj|p7-5l`Vm{uI-f;bf?!;tV=nk!(D9bnDuHRL@BPszH zGsoyTYdeSd|jf+3sW8 zw7#(+M@ZG)kBms*=OD6IxfhBcJ*lndGEf1z`aoDcc^Y?PzS;KIV^5wh|LQkCRhF<| zy2a%2Sq8!7vVm)wxSRISYT3df?AG=yO&(1K0C*Wd*4tOf0fJ1v6JPNx4ySLj>Wi9 zLD**8gfab;+7Lr5aVi0~W|pf$z+3}Zu_4n;9ZRiE@MzY5H&=T!YsJObyZ_SPD);>5 zzlDX_^p3rXDCO*Df2Vx&xBq#0MvK9mc|!Z!WU$$dCC! zCe3?KL98jE8cDhdqtL2}aCw^d)=q#V0?m08ysD$w*h~jNbK<3g=b|mSl${;LbP1H# zu;Ty6KK?7@<>ld#86gbm-Tw$?A;oyhk9i@#s1M^eNC@n8h@e+2lWv1L56a%{+gG%d)m60k8Qu`?<3D@NeTd z!`+2k{GC@AB84%TZBetf5}=wJl(JDLInd(@92%nvpraDVvUCKx{I>Vrg71W9%AbAu zBA$NN-Zfe2zQu%Bz4>JMOFwewf~<0%7r}tT9Jq90_PxLN;oZV~^-42eL^U&S^0*3= zYvrRl+d6rMJKOs>!B_Wx$G?y(^Y(HdC+sy2+LDJcx;*H<5Fh-DDvOhNb6jzo|AO2b z9Ke~Q#!fM+j>0_s0$U%i;meKSZt__aFZ-guGjXzSmh;$1&i2eZkZ0lqrs{*U=?5^? zKH%I@rTkQfLm#8z>9CD0H+me}rqb8|JBl--OZff1130Jq0?RMWtG{+jb=qOic~CP~ zKcPe}jB4p`u+{-3I!#EcHHj0q;nk+oygUOVez~Yt9Qs#TM%GFw>q6cuo^FxHCVU^k zc$-^3waJgiyN_EzPa@squ)hx4w_2|hdW(MLJu7@14);2&{G0A(y z)3fFsyw)#ujx{m(RBqr*jhZgTR5RHop3cW#u(LZ147rptYL% z4c|I;NTlJP<(&vdwvnz$YiiWK#h6%|{%qrYz*eyxpNg*<6L>+4i^BY@tnuBY2jyS{ zp1%=TIer@!7@vw`h8H?94KW9~$ixZhbsL|TLc?kpZ|GR*>*O1}`BG}KPNFC#jZ0Y{ z$2c!mEuDI$eJbchJ^q=6kB;XfS+#3h3_I4_@d|X@_4w#Vf3`gOJ3ni(?Gm0p2(^;^ zptOYuTVgP)7;QMHaRRveK-$(t+t1qXc2VA(Cr%^e#zNXAWVbYHAOg!h+N7K*33J=q z-))b6W}YAT9Rc%8coLJjSXGxk(*XZm;6bttX#3S59x7 zutnc>EH0nI;xFGRd6ubE~Ybt=L__yhydh3$KW`jNJXv)aeM~=zWZKxlK>>yUBJ6lb#k3sH*}p_Re`E-WHZiK z3c5^WAC@vNOExRl<3e+zttx;A)RAewC9%Q@3)g@RWCvcmF2cP_Nxgzt9`5Y|f7C-5 zi;*~9UeS2~5)jlySR{?-Mmr?SIKQ;X&z2@-5No(-K-CO%kt3RurzDUhS*Fy+6;X;e ze!>>M<3YLL7k;;DU{)D$n0L*c`rH4+=VZqh|2Tk65Ng(B2hv%-YyS0L=n~r|r&@0E z4?q7^+41n7$WS+CVVf{(1etx=3j#)oh$4UpAQ2nLt*UC_VYC|C)@f z83qZtmtEwswu7dwVTv>@xIveMF3tuvfv$xH(%i$%jNs+`8%2gATe#jsNyX$2M(brK z0su`i>G7pwjx5^-6< z$#UqSy^qWAk(cl;giqtrhtV+1ldGL(tTCf*4=92RO}+$2g>c1@o`irY4a*8h86mmk z+pn}_WFnuH6%Y>|o|Jfkw^W|Lq(#=;I$IVjog#ANI;CP10qBGF%zV=nHv8+l;rG!#td{zFv^+s}*|QDxVkX%HDSgY;Ca|hzdIraV$96 zBFfh*%m-g7t0#2j3VVUWJ69DUUi0|NlY0P<-&f+^}*#UsUATz-z-w2ueWN>GL>9yRGS1T83 zi*;?I>9U-{Os|6}ZoKX@xDu9Er;CW|oqwaFh(l+$l)>hIcsSH+oi# zh9W?x_5$X>;bj~+;>!}j_A@?fcNzWLf>Dtvp&(yo)#}V6ZMAm!^FvXZjNj^oJjpM> zQ*{h}+N<`EVJzAtw6ajNqgYQI<}c5kNyDOBrD5TX zp;<{Dc$61P6Rc=}6K3bk`^L_n<(|A+xs=w1jm+~fjDL)$exQb`oocG$Xlt~cK>RoZ zcrs0T;B0z;%Ru)X3(G+3ND=!e`?Osbb}g}cvKymr!C}45NE(x}StXZ~IV2k>wR&k@ zdQIgiRc-T(IO`YtP^sO>;iLf?08q;fej=oBzNL#F{A5E9#lx2DihPvZz z-~O`f_{{H1--*JWqy;m`!nS$8DoE+VFkYbGF|Shx_uPPBkj3+>%+Y0LpTP_n?KPPS zF3{RJQP%99sCpwGEwW}$Tf7XlQ8|39L%#LgCh5m4-eFApoz~SM^P92EGXlP&9SGz~ zi}Yh>-YFP~KaGItAXcW~Y}(Ob3=DE&NDTB+?FeYNTr>4(8Fa;u8VF}!(eL1>C>`$)hcOeZIPbtZaIQwpZIaWOmz31iMFNW(#IEV>WO-;FvR} zON**;G)#T0wTd>Z-+n^YZ$BZ$mW+;&_H8fewZ$3Emin;7`ib>V1mD_y z&ofzB^C+8vdD0rrd)(->Q;~)t!C;$R4dDt6{94Y*GRvp~<#eqYoN9yObp1m|2s8uE z|FIo`ipO9FZC-lUL%IiYCT;8zX9;sA?`xmR|$RK6|3qI~Ke^Fw(CURxU&uP(mxQ=*D1w1vGHp`7q8REgLEz+=VI7&*-3Lx}j z8)XPo;TS&np?;2&Fxj=pDj}nstvJ}>f>ug4d6@LTS@A%9V+-Vlz8Dl}FJ#9IAHT6< z+D(hEK6qczI$-R(`Wz)A*?99)S^|*BTbi<~CZ}3y9gp%m+A>*s-^zGK`%lTxjxWnd z*Io_&#!Ef3i{dPiO>H)SBOyR>0O(hO$cr?FH=cs6>Z_cOjDfjNR;L1% zt?p^YUtW5_RJr5l7t6AXr^DnZ%h@((VT+u9)eO1)XBNu7ZQb(Z|2QlMclL~5L6MTO zo%|v?)M;z0}Yn0^|pF9%qjg3j_96}+<1?84 z+V@Xs5PcZ>+U7RNJKoPNV<0s71MPOFlYZX4v0J)22JvnmY??W*32m7!3zx&DGLu}p z%FG?;hn=r<$ngVxGSD0Ue!+6$vlq3<%1frntOfi4)&x6a%7i)C(S3cg^Yu>Y!k*Ma zgZSG9f5)^;Z4fT`y>iWTnL4fdtot1sI)!#I4GvV!=-&2f2R_U-n?zP#26@v<naxw{;kT)>0{qivIDX?R_-=S`M7FKR2ZhcJsV~9S0i4qfPoI<% zhw#x1%%6>G<>vRz({_w`FrA5z?Q@E>T!fL>XbgvXg)9?lG*)*xQ9RG7&5m{~d1d${ z$8(bmQbWC^d~y%qx8%0!OlQNPx+DlE zOxL)OQU@!V7CW5ciQ~m-7bxr2A(=A~XE3W19C<4Al*uArwd7^{vZK%G@OF7!r1$kI zvYc2gI@$aKs~2BXyxOr})^_ZX!}vpHNCOr{rmRklBl-g6?aJ_KQ}Q+7PM=bFlXLbH z84trsPl7WAe>$Vho+cRNx{2AD;~E`wpkaNyB-!=Y>}AB&jGAk;OVm04r;I z8O%hd_D4X4SONl22Zqr8Q3M=pkSGiZN8Ktb3~BKT=kSNTDVoeDJ#gkdz-6H8r_7Mi z{?2sU)w_uvvP;4=^HN}cW{-|Vy=2m@(Fn)LvtSJ`xiIjQSc=zFLS%)yX-hEccNPAi z=Q|%Qfkojm%ZPHNBC=Sg2*Ap&^)i^rF4|hGE1l`G+?bg=7%RJWYUcu+I~qVm<&@x<^GYC>?PqtITx%Op_AELk3gYoJCpF zxO8#jbOiEoZ(P55pV~aqhykGCcDbQ(MDDxhGC4NVDIF(!GX@tWQ}R)Y^D%7!bCgFY#QOxf%QNDh~#A@W~@&VYxvp0o{Wc zx+55bI?-`j7EGCs*~Z;6ZQ69q=B<+^+@pv45hTVk)to$B-_)Snq>!Kg=t~VugrWxH zrX!#{8~hC|qq1b~JeiB2a#wdJmThd5nbTUO`SdB7f&eyW5%VLaov>Ru zgI_eVMltCr7?6b{d5llhsG+X!njPwIP*}YnhgGr?&Dr&@BZ#^Dfsg1?yWRV@%7O1; z?_?%gI!}p&&C|m#T|HRVUFT>|ZAEdXy_<7w|cmhVy!?TumSF(81Zj&G?XW1Rs_Ub?$b43;coGWQ9D{SRjFB z{{B&})A$01c_mL9M4Bw%^yC3*kzW-;IHc&k#_kn-RuULeM5~v=b%AHn6u)(iQBLNQ z9ys$JXlUkE6|o<4tPXuM^iCXk&(P;?=*Fz3X&kfqgpvXC{6@k6xh3Mg9%rkP z6zc(K+$FgwDM5`Bbl3m1SZ;jJ+!)++@=9!>s~JRn==WF4^ItzEKlu7l4YG|>RYpeH zCck+85|ueC0Z;%e^8FCHx35EBu1b38TgP*l3$Y}$27pa(#18h2$WvcBA{$>kExn!9 zm(ZRzvr(?Sb1s5=^RaplZ7U?SqqBWjzWT|%W}*@-zhpWBz^mlV*E;2!e|JDSPjZG~ zNVDcQYXDelW*7Z|zaw7y_HlXjsgrW@aP=A2oTYv12Nuejo7)g}h831P-D7{VU%K0?`~T7Zw$GExul~`6Apl(LKk#E;_pm(q@L}2VQoHoUz;BKj z6|Ts1>5Xk@XSB!sUm)x}H7JkZoO+k8x_r7U|KC^1>(8H(r=W)cZ%gx+Ovwj;i}o2I z^9r41=cEi~LL9C_Rtb%QT>q%xnSi_s-Y8ewOGT9Bcg6$2?zvNH&)Eb1=ro_bHU-HXxI2?43bOz(0t4CT0M?O;9kXh`i3sIm zr!6Mp%Q~~Cb9|=Xqf@!65s4yy(M9@-wp4*TDdF06cDrKs0_K5aMm_lfH)0HqZS6fO z&vopSEy#yZA76rfwVIlAKw8mXMU!Y#4ptOw^+;6ol^UEAP`wESTlfdu5N2eIU@(va zhYgJwFsJ-tN;;jM1S7HW(AG$k!$*N-u!zbsYp+2}XE870t&W^}n0$M!Yvf6|(}F3Iy(f7Q9ge zVTmF#*3Q`1E%`EGl$2ouRl2SH^7!{L0~GYl7}%LHR4>g?~4o}ocGjTy^azPSZ5oA3$!;6Oj<8)QaHi>z3@RGOf>r=wHmPsa>)%nsgn>YyC& z>6W&(HtE~FTjnlZDo3#FbbSM6KnIuTyC+xG$-gJ4$-!>;`1#k5$Zvk|Vy(|ualV{J z09c(K9nJ0*u3r?iobj_nkioUgdLi{=mh2mU_Dcom_^LD`Q)~T!ywSjjC#0CXJ-O?` z5SD{cb-22hWnkw0ClAQ>&wR|IwXA;fQ1pcy%o<`eR=1pRD>JvGhM`i-BVJjkhYM`L*|8+;R7Z4Ecr5FD-ifDrcIyzsGL~$y&U-D`tKn?zC;v#?U!Xy}1(_oJb?fIq*AABx+N1(q${DR?KB|)+Jce=jM~+kt{F;0= z<=Ic_LYh((^&@d%w_m8nCH>*+wi%`q8_GP+oIeYERfYaR;7>fa&0;Tw&#rT z_taSCbMH*1voT?Hoc8?_4gllkJDh!WQPUs(99JXMU~-MlWu4ISq8x)))#YRxZBE8m zcoJ6??r@}GGI^1w>O~f)v!mBxG9uQ?(6Xl`jjxZ&!052-=|3rto!BHBdk#ytF4dH2 zs$SxsOi_2KuS^$nZ)3H#f+j}>I^UL}A;eYa^#Y0vtY>X!0IeJQ%5`>O#z}jJmV5g! z5Qt#r^l8&%>eQ*y+S)2JW?%^l&gQ`2U$8HeL5cl+eR8@T%hqDwH^l?Z7wZ-*0XTE! zOld~$^^%9}qW+U7Ps#xKG=-u07VLjF9kXPnU_ZKGZfMg01{k|BGo=TEh714_M@wk$ zoH=tec-h<2gPA7X(u)Dj0W57eg27fwWstB11C!IHPm^hA6U&u@jQMs&qoAZt`um|9 zOBi-`c1ag<+R=x0^ACI8O{52gjTj(>kxdpK5K~zYls?rn?9I&OHPW*b%rvAQu zwSn#6ATI5n+6rAWW~fdE?KN3{u)Lsyp5)-L%EsU?4Edd-my)M4Q!C$fWQ2 z<9Q~03S?3i`)VuvKb`#*c@~f_o>yOoKHm;sRy$~qv&j`p%naw1G;y#dqXAHP!}$&6 zqA=ErFbvY;qm;poe~o>Ce^%<-R#SMOqpwQs&9qjQeA_Frc}NLu;ryt@Y6m!xD>?vU z9TkP!os!5vOZen|VZj}f$FuK&#;J3p|I{8_GBGHF{>P=V!W9|%C2L_2iS|S~yg z^6;7~T&H0mDfVsG6qToSj|==B5?G>cF8Mt73QPpR^AGweQ`Apf#r0oForhG~p2z!I z39Z^wfLGXPHpe{TIm>IuXX311sG$@l%e7#v0TqxAmS_!Ml9Sx%eA!5IFe5Z1>Q0?P z)x{2PMdsoB8VCD^$A+>8wal4^Q_6P|k?nhqBQT3uxuYF&A^rloaDJN{IX)^)__}}i z#9>)9tyxYq)ffWz~>_ZVg@ zgLUrAS@?pzTb3_8PZ}|3GH(W!cjkwKct;t;Y+?4@Q+P)@dh!JB^G$LH`_6Wq?8Y+D z^|E@|O4)JZxU|llgXcP1fsYPhSJG9N@WUs1WYL@{G6nwR8B-rS zM+f$JUQn^8kIGSMKq5WQVYX)=DMF$Qm4J5W_03uosTAbbI{8tg&rt~D&w(eA==q=~ zqy$tc=|CAiY2EAd$XG70lu!f^#Tcy@nS-I?>)IwS(U6uCXJyNc-s;6XvCvn6*tgrr zO-vw)7L&yYtP#G>GT=m!u4T@WidnZizxc-*{MCE7o|8-y1Ld1O`BAy%<6p_`70j8t z4Bi&gG|b>F?&HkhvJd`}$4ul$1+ODGO!*85?|k@=mDccl7Y=v zVgn-WFoNehzWATz`1+^h;$QlYI&(d8xQrG?*(r}`)5)qYM|8-H7d59lSI!J15q^#* z2+59KMg~PG&)3kpNa|Z=%h2%+n4TY&1Eo|_1@V~NEM}5er$&id?bYo=J&lpXoJHhWGM}A;3mX zZpBtlpU0L@r}6p|hrn|pVjGOjaLn~0W+Bq3?M7&M72PH$yr={bPLw)}tOfNdm3oV* z0#=}@z!wG7uD|;i7L5`7Eo*0#8FgQE+brqD(!@`G@o;TrMJ)NNo?8%m+}mttQMJ`M zTlEWnvP*hu%=$H2pC8%VhXCzf`NfZ|#u#ZlnciMc%rfkM<{uB22Y;2;I?1Tcfc^X* z?T}MPs?Ve?if4U0mYwD-)t~t{E3g$!9J5rya1LL7;VgkX|9_qDe;`@PJt=+7Lg4CV>S@MW;FzF7wIvb8++^NgU5|mUYQQUysQcue@~6&LA*a^mt^2DS6E(@Qw>f!{Eh#kO8ChnWy=essnb`(XKzPiUmz7StartRutPIxwb)aw9!Qj^)&)?ZE9x-zl$#9+ zfP(2V9?SUxI3kA!I^_BGUGjR*K{*xwDD&La%dveVQ2VOsCV|J9e!^>{iZ&aq<99{F zjwc^N;OyA3D#+z=CtFO9JgRG7G zLXrDRIK77sACYf=`#W;<2xd+zf1L*9mM&c)ci#DKS+e9jnB*9ufu}L3`ISe$rhCmX z;K|g~*d(h~t(2Q@xf%P>t%TPyAJg7fUU^kEZQd-sz5J3ZEQ7dk;X--;{qMs7=M=@Q zdv(2R-m+EYGHA%4>8x3^V8;@<`s%CXsw=OMl`B{1fT#`xK~hMSHu4Vx27mYL*`vDG zty?c|zPUp>IyyA?NIouK$bjZ~=Pj1YF1t+LdE2cjpEF&uz-d%rS+#SE=F%4o$iMmK zoASboYh}xpEpiw>?!`WUw3mTS`t;(9FP3+}PZwNpzRZL!&P1+teRJ@)AHnvMCr-%P zwXew9mtT<`J9fzN{*!IgBLblqn2D7 z=qG*vu>ZgTc^R@_c=08b&0sJGxha7|#-wbxuNS6p!gg2JuX zi;%L-V9V`16M?enRQ*OX(LBmDSrtm79Xey!%Qjm)tg_7gfd*gyv@|TcTN+o~n-L^^ z8E8VK5}#-M<+c%OGZ*MP9Y9h$SmOLG^=fjf%2QEc(1-}0SArUvxR29hn)JZg_dsLo z>~vLXACA{Mdm`_vVSt*qp?F^aoZVXMvHynq1#C?;!EW~FvJ`qb$brl#vQnN0D=QEUbpW# zCS5)K`mAqk=$Ch0bd79y^)=~gYmj9N7s(J-%jm|L(rd zb{U>FONKeS7lBuH6a6@^#0-0WYX64gbpJ*?Pg&=C5%Vt0%H{i>u6hGuqri_g;dzed z_Gv8J+_`P5%*4lF)26h@Fg_3*z%qrMSTdR)T5(@uz7}BhYMGA!FlQU{gUTb_9lC$< z>ET{Ea&R{s(IhAP@G%(Zr=h$E1Gi21;7?`<4H!MeZ@rBn+Muu z;p}Dv!J7~unvWTp$BJaGUOY$PL}rph-7&;sPHj=tSdW zY3BtG*+|b5Yji=B5-TdQWzXKoL%8xqeiZ=QgK^4b{?5~l+*fUO}%iEyWUXquWkuypKvR_37mPL4?Rf4F?%83UBbVg$J zX%O*dS^KuNvhF|qyexnJugj9Ve$h0<+^7oRw^HTxq6zj`QR}|q%aPn?NrnfqYS?U|75HOi0J#bDuz`q{{wexZO2rnY+lI)AAU!!0z_OwXh zF((TDNFSb$MEXQQmVDV@F1L%ufkM&vOfl>m?3SUOkIL}=r}Ub^OH&{<^<+^t<8?v_ z(zqFkqfDbW{zOg$fH6y8V^w}Y%kV{5Vx~ySBtf-A1-0^b5AHi3T%dcza>?g*%*Ne{WrVrZuQ!RabGNQ-mo>M<)#DPf(r4T= zIiX>|6zqdL8%rP$V!vDcj=~xB_}}g?4gStwIz_Iyb(S<^hHo!sB5#K7qXQ?Q?hpsS~&wcF({FC=3mugM{cW_Npd#tbGyD#h;{KzNwR0MzN@0&1_nLcc6 zs*{rluCK?Qy`24RiRXvQbFaX1-Q3?dcfyRw<$E^qoM!gXH*E`=WS|GDL-C`4YW>>D zs3?xfleM*iw-&(JnaIju75cOGCBCr=WpZorROpPv6O~g-M@?DuDN{*XJ;=(I2d3;; z4Ni)t>>iXcoSRbqiaj?v&y5y*r7zfbE}S@jVOY7C(=3B|6C*4apo}o>oTM!|yVW{w zsScA-&|j2MtS2+0e#2LEXyU!>LcK_Dawy-IlfJS-i4T;l63&?z$FRrdhOUG1JZ9OQ z!g4Ib#V1{v3WLF39Z+MFG!=EYwz{HGhrB8xBdch;=kYoX?s6@XCcyaT_VD14Y}~v_ zo__lK^1~m#Ap7?1mlK$cVF5KN=Dq{__a9K)maSW5<8{}{-FMxIpyNexMsH>w1G#J0 zu0_CaCuZG-fjrI{z5Mda5J0>(27ry;Y!l4l?2#8WP`EP%Q#nKQx{hn)qKhul0C0BR z>!iJ-T?4yMKmCl(#HB=X3){rey82sJ4Z=ZbWOaCYvHoPV~cJ9KtIiUe> zonZ}H&UmISw&(TN-jJJazEN(x@djCQ*`;ZT$0Sm9;;f^ua+dZRZ)}pMo_-p^)Hmb+ zg0-hlWA6#f(y;(MZDp{QzTCBYH|RFXH3+D_=bn3HB?7FRVH?_!^*dg+9hm9+24p_@ z)YJ0ntLwDyoH}(%&ntCPE(e_V?%k`nH#TmRn{K>G-gEEWvT(tIU^fN1#2N$m47fl2 z%=a|_&pye3HD@iG&19iZ4k0MKZQFKPk0AY(_+a6ld+wH12=sG?c6rL{8|!5%CnINT zJim5cRcw@!|`$0C;Ic zp{}6VnAAeYR!wd#oz-}f*vuQ;5B0#~pO(W(7rV=5Quplxu*9i+&M0RBAE|OD7Oohw-j9h?vI<0IV#zLsa8c=J2fOIgNyLt??8IJzWuJb)%u2T1oMG zfHos0b3wbI2v;;HuKj<$TT67paVF}!M`HjEOJ$Q?{>}e~X+(K=34&Zg#Fw`pncEdmENf z_i69f|0=nZ?KU=}G1wsli5c{5i~(NeZ5Q1j3`mkk=}_R3(LSlXqEHe5MzEo}(H5%^ zMtMFNoxyVTSV=H5+K8D~gBeX?jmFFS45m#Z=Z48m#fr5{MK*c_CnC?1ZpyFg3J{ zy$@rcoIFl?;LLb{`vB{`2z^jT zD=kElk&~Nc;Pt=3nD8lFF!r}Ek+dOX%1@9zBox3ZfC?vI9CqdCO^9QqENgd?OFHTy zAO|EOB)j0PUXhQ(whEp~0AKZP|G7n#W+eSlPrT1*TPTM0L}PLT?d?CaQ1)%@9{*C% zWUG*6GF`4ZS+8vS#Ry_+0?i35gd`W>~ z$X&2(s$6*044HyiurFbsTc5a`aS8w@MCG})W-eMaRqp*)OXR%OSVd2}0j?7SNcp!I z)7DoyWczx?H1g@4A6y`}eE_Qj;XU7c_KpYU%M<_Ou&gcYbNmVdxL4mX2eVnj`#dGR z^1b5~!PGVHm@W7JGFBLB#u#lhkiqgxuAeD?_kX=9#}N#+G>93pZ*J(6D{sqhL$L9M zb|Xpotq&{^_647=zP(v4yk>@c?mz9&;H%;2Kl-B)t1&TMclR7a$&2vyAXZHB>85+< zNizcUxkT33HGcT`@rq@i`GLTLzp-3q&dp|FuD(L#`n%@JGhaC(&p&!JiR3Q;+kM$sHTSxGIY)#_9>*JFF9x&Lb?ujDJ9fz4J_Pk9 z68w$gX}#TK1IX*KwgFbv{zy}7dz7!4@|MZpWSa@GFo4;tJ9qAsC%*eV`Nrel zlwG@a7wiu*H~?r%?J}@-;J`s0NMz9M$}29%%Ru&k8|cR}f7qXnG+Y9hX*!k;UWg?F ztseYOOfpCY5u81G^r!|RIY`OGVBN}<%P}Ja1AMuJrMeMZW>E3q!Gk&@lxPMkIUD$~ z$G#!Ecke*}a9dc4I>(E^8FaBdM~)mp`*)$;yRg*BpxklC?XqIU3YFto_;J7~EKmIm z0>9t<*0&Mhep%WPK&_S-oTY92?b)*z!N|kXk0q<8AYi%_vvnE#3{B74UzEjuME-TJ zuG982*vZ+)#l*Idj)7?EI&d%qMcD%`x%3iUdOPtzCgpO*^7{3!VaD|%nDPCRF1>9& zPqZkImT)fJ%pYx_4lY6czytTog%@7ng3O^$GDy35^A>sJtB=a_2*A_FJ~&JHluNr! zE(6${)y$XtyYIeBXJ_+Vf-srW37g+|W21Zv{{Q~7hxQI^an=KnV_vzfZ?d+)un z=JGXppOgtG+#f1PXcvEW8CtG{nazo>1XNC1B&6VC%F~SYo{;_@d|Vn=-Y1Q#ABe=B z&x`|KVoimja94LU?mXoGpvq|Mmc?_MqcKyEk20`;q(?ibc?e%j&K7XKpDdmW4>WNf z;ErDONAy1i7on76MizL~@gu@wAGWS-wke(UW4#%;ON@N@DcTqktOyMR25p#gnbc!> z$kL?OVwq%5?eSKIbW@NOJX7^@)$6}HOTxq(1DAZ>@?ZXE1m_M0PpMhSphWHq7Vsl! zJ{eyYM6f`FYoxO9tdcq}!vao0YQSYO2`z&u+&V+Shf431P(!BFWRn18$lwfM3jiNF z)}dB%-b(LKlYDLGn=*`dpSsaz*^gB-9^JT2T5t|JhY@te5{G?w_gOk0fzI}B=?A_E z@&@_13i+9^Ut`Xf8K^_BcT^6Z?2tyx!#Up90}9B*J%4a$7_)=Hfe*6= zu!J?@98w2ejd;x)tQ(SJ-KVgG^J_V>()aZ`X`F_cm^5+%$&<4TS5zjRHbNs#10tS|&No~UZqf`M{b*o4Z&rypNsZi4 zN=IHIP%%EEV?C6y>P{gbX)=nr@e=OKnRH@I6F#n+I&<8z$yt`d{goKV%_$9fI0LvW zh2ZOr8XR7H=R>%c;G zEa=>JQ5Ha+w(L^rKmeG@=roY)1hl~aToRf#Cijszs8mYhWyQcnm}fB@X^U`$0a%n{ zAG)YQJD4D=TOQ#>bn$wydZ3H_G0LdmCAEWOTl4c*|?yNK=M4xhA7p?&-?pfRAl2N%b>UKsE01_yD~cO@LFb zC6i@2;55k#Na4M1h%Kw0BXWGbUKrQ;KH{*^Oi?qa?( zm&u}xsHcc8)>U1gUA(GQ7O!rVy<57+XT*3-_B!=m9BuYxPm|MLY+qKNy`WjR|1tN8 zJ$&t0%D6{wgn~I- zV}a+zZ&rS6c@2WO?|d*HP$f6{?*12x=49?#J*g03%rCm*0^(D#GCxkB|+h=N(~ z!i?fWyLxgn*SVB7myezb`$DSTQ7^i7rhMSnmQ@6$bp~*SLIb$|;rpyME2c;V^i(*PclT5=>QDH!iCX}^}oCaqe zWRp7U8(Iqo*vCC=IrI0)r=H0Le|2wGF7t<(yIiuDvvV0RWdN7K&3%}a`kn85SEgc+ za`pMEbsyLAmu9CgSB!T0^EcM{Cd(K!91J{#rK_KO@+q~mT7b}-!r7x-@|rVWr?z76 zUMyWWe|}h+QR!eKgUVaCZj*of@>etn$zY--26Gvxo`NM2=>rC)83Z-m^w~ztaJ6N$ z=g)huF58@)E0dJZIhb_>%V;y0UJRh-DMO9)JU6tHfnx5n%e{~nV<~D~4mvV%min7- z?vU?3@q`Bc`#`G$XTY;9Joju5+d_GLSmtpMv&2n4&;2(Ze_R$XUL^D2rv(^@4t*`0 zQwDrFE1N&gRwf?@YALs^4f`P@r*F6%w9VY5f46PhE{{I?m@HkoRA#l!(q*)1GNp26 z(wmq~{rES(C13ygW7==cC%i_upJ6iw)Hws3wo)E#r*8Ux@7{g#2$mP;IpFf&T=JWH z6KVoYWh#R?D)>g*tYq#wBS{%7u@>a|OV(&|B&_5BkqWQ^cxdO>v5eHS(tN|em%6E3 zPRHy5A?+<~rzxF4PB}@QYXIQMB-2GSqZ*n}(K`PqkF0Xc?eT0fS89%*cqL4IWq#r2Ru+tfaq8WW$D+*6ky{P7v+@hqFId@eI^%x5Rd zArL#L!C&JcE#-0BkOnw*2wxtz;rTm)KR~gII|9AKup0qkyff0J8Y~8kS3(n3SLq+@ z$Lz2sv<_Ih27%tuQLGe$ATcb%hnQSqF0_N^Lia*d!tB&oyJ!=C+y|IGCoQ4JjNvF%)pfVa*$04UK;GeWQwi5Umy4!cn<-3vmtwXwXIJyS$Mcu&6n;QG8m8iS zjt!?A0ZC5Z8ECg!X(kg(0ImVOP7|Ehf>H)SZ{wJ^Am0yEHEo~?QAeiLAYM6OAW(WE zw47vCj=5F61b$HT#-II)T=?NXz`40TqP#9&_M9wJf0U~CjS_qj^p@+?Q_GgT;QHxH zr4B1344vEpHur%m?M=3hAurKUc5G`7me-kT)PZ|1Pk^e^QpBoC^kC$Ahc$VGYoCq& z)VAWIi^&v7DY#K-&^_$7_e6%<9Y3(!!df&BX;M?)CU{1ruNdn1moi+*ys5&!@| z07*naR7%4`Ny_m@9ayPFg$BofzY4DxN1aCJ%Sr=&^}lDRUcTa1%(OIFrDPMaC!@Xm zmf7PE0Gs~Q7CJeTm6_$>#={em${A%vsfJHl5sMoDSiZS3g*Kl$(vM(demP~%jJ@T4w@kNp586*NufJ!m?i=jo z9zTrLj$8nE9)kV+)lRfKD402?a{Q>bB-qN6x}zs)YD?Dt2rfpf6}dUX`igtVZH8R=PmGfQhl4Kg^##m zr!>9_coeQSdpmqNXMn3Xn#50Z(LT^AX%QYpMSpQ`vjhF7f83#GCQb82-pdyQ=wBZMJqJx1wvy5dP5PKDy66|GdtCwLw4z z0XegiOZ{>`**?tn+>YSfhSy%#y>A&%=kj zcnGtMx$H2PbY>u&$%2}k+00qP+=rLviviGW+uqdWp&5vzUuh5b?tS*z=jE20Z&rJB z7O+af!TZ5r3g#c&d}*rFwlL7y(t^G2*cP1A!NCCpJFyg`Teg|>oT$zk7Is-%x*&z`O4e%Z362pTu)^2%KLnae|m{d-5WEhkQ3 zHuU$ukN$B%3;>4?#^5q%ls}CR3K%4(J|^10K5`S5!sZgsoPo@x#JPtv`yl<#pfv-v zFTebK>6F>{%*2^KB2$o&Yi3MbkQQbtfCEEetI`-rVnTX z`zy~gXGlNw)YH1m_xuI(Wd=TQ7=NXXbi6WR;iXp zzQnG=WVH9V^gaDs(s16b(sa>JBM=;4#N&CWCM^daB?0|7<)^uY;6fP%{mjW1vHy))>^xE-&<0To*d1WSv)$p`yJQ z7lO)QkB()#|Iwl0vI@G?!A27=in_W+X_$A7)HPSRFXb*YXk@+SwQ7c{L8@|Ghng~@ z1aC_%p`bhR)aPaIm;Xeml0OrV^KpV@1-2l^6DtO{780!Gh&LX+y-=J1VmVJAr2rV< zS)JsROqb*nXcQP|6W;kH!Dt!DfO9Ma;C~#MLC$BCF13sx=IAJ9*rMK#{h|5?z=x0j z&~pSUK1&}$#0^+2f#Y!ut8x%=6hT`ZpNmFXKQx=!5BUzF{Sxn+#YDK#)FJrHXC~jB z$io1v27D2q&Dz8`0cP-G_U_zPd@Kfmr+V-{rL-^-Gl7ROz=W3Y0j@d6n}#t9co^?2 z2xZe9n%L$>oTzqe(=iqM|8k9!L3~Kr&=8iMMwA(PgUwz)nF&`MWkp{$O`D#xlX}R< z_JuPXGeuY#ITO`HyR=?7sD8>Tz>UwttCe%CHS`gcM~7=gTLDA#Tt;E8WjZEI@cwUn zGQ+wyarx#sSKk$JE{g_xoe`9XSU-l@wjJ9zdp4hpkLM%!I^Y-I`Qcnplrv)0kBTl_ z6H&;?4NoND1U1Lm%$ylKZD~H3OTuOE{|J_a-Yh59e^2?yL+4o^Ys3s-pSX;4mMZ<4 z;aI}zM>%@h!&#@QMM+s2Mv#|wFSzA{3gdycUiE)`MT65vfB4nF5hA^wJcy8Py*WiIwF84D!dMNx*;>Jx z5*c8OJfj`j{e%o|{s%1aa#CmgYVbD+&*(CNK-R+3M&c6M>7f=TCcqc66nE-!4fWL*A%2@)w;H%4SnkD>Irjm13Nt7VGmKpp!eRM#c|Ju<6uT_|j z<*~QEjE`ttdj8R4(s^=7E`?2tR!$KH+G)wzP6xJ!v1G63A}j$OP9^d;xys?JQtW#MFXo=kmyNChHlFi89vV|n$W5Pbqrph( z;l}Fm9#%$c_;ZnayX+nDOzN$+D#e-9QAO52-2gDY)<2^O11c5CcZ~F)HL7^=RPDUg z@b2zoqRR4|ZW2U3!cC{;iQmiiN|@`E3IP;R^R9U2hi-nXYQtM_}727*5 z|4qzRHO}`T1(YB31s`@Wpn37d7wNvk=dWHZZD?0FX8Ug2zFn7aW-yoblb$~YQrE3p zrvcDg-f=T#pw7@)Gt|OaxUXUwP<8e1@$fnx?z8JwJnAoGkFg@Jzcor=yK*l!s4Wl;Vdx7;EZUvjauK^KF*J9q6y z5cL(mIPMgZnjeX0Rs696)e*ErP-?zLa08n%4z= z^5BC%CD&YimCi2a2NaZj0?T!O6SIZ6Uo+1$ZKF@P)c5PJzb@BZdyQOqB{tO1_ky%kVKu1O2S6C%Dsr5X@uJRH^EEIvUUIa(#;eF4@$g$U@@uHuV#^rYug=Ka2 zIkVBAxwH?n z(Bm?PBcu305Ttbo6gS{EihwI_wc!Ip$kz8v)fE);9?dN-2v7YPc)rIG$HX#C);#tr z+Qem>nKR(a_d`BMDQ5)orqmD0HJ4m28@Fu5y&eH(tm44sq8lNI`}hvymQFA6*3S3H zx&i#Xf_w-Av<+C;ckXf}}`4p}JE-|pl^RN8Y|amK*b1$H~f!M_1&$2jC1EK3Yv^yR20 zWl@D`QaCEAp6yD61@j|(KW4<1rTMo!SP=mBvdB}cdpXBmh=EK1&3updu%!sh`WdmD zA-nOvtNmDxdd^jM=h_@*DgP0I)W4~L;A02`Tk<|& zKW2X&E9G4kjPx+;<9QhDQ~-NtY!vd$2d*KJE_Src9EAt_OoHh$B85A}Mi=0E$Af;e zAY41noak=|P{)Q`{Xzv0LVGET_;8)EBC_-0|BTt!9q{pQ1OSgptkn5(Mltac+ZIKR z$?Wx4Bd&42>zbxZnvBR`}U|4jL`8U`GiHhBlGB7Ikq_mE3KH( zrN{~(m$uDjc#fC12A#X_GAK56dV}K&*0 zin4G{;E(VI;P9zfa?U`{aisR+19EtGpB%wV*Y1u%Z6gD}T`2eW*t>rc6bdHJor9~f zwDe0@wtAp1&-2=Ir-Z*ow0Yi=DY6vHUoXP`!V8v7!Ctxe$dwf6nNH#`l z0v`F)Uj2K?>Sa0qOf0?woW^+{EAgCaJB+ZbJ+=C^@m0&qssoeCV{dn)6ZUFc#osAky6&pVnY3*Vu zre6f!kgS&OZA@JKUf}rn6lhh$^ zz!G}(mbm5${_DW2nsJ>zD%BY;z@b!wbu|h z4PS$C;Pdq9cAe48pyy=>?lvHZ%m*!llMLF@4=1tTE(6D$E&Hx_y;I(K+ig1g*Jkum zPAdYoM~@!Y8Lk!prW^(~8JMLF6#?KXzT-07Yt~#U@4N3lVVjmLS%Mk0Q+4((gSKo7 zgVkKhn=@W*0GH)A-q<7u4;_&6&tIhhaoWIu>g?IG;FHBzqWPq@g#qSkuDMFybI;ux zFmC4Zl<+raOwYp%Tl!+;AZ%VXNUV7vyFuL7nEt!S~Xa^6t;6_ z5fcOE3=)%;a^}s$a?rHrV%7G@yzYk;`t3v za+d99atTM`a91v=z8oZP7sy9@j>+Jwe)xLA8s&B9b11EZVHe%9I~rn#Fnwz!7LP#XLx|qYnB}3&>1O;$Wd# zawg?SOmz;JtPMJ<$t}Q5g^AKS46Q@|At?jD`mqd+$4{T(2$nJk%x}>F(Y{%aeulRZ zyemS2(&D}e*a)^P(V#43SwA#gd=A@>&&?v9bcAuG4Mvgs2Kw~9kIztkL`Pngjb}dJ zWhjHs)fUX-UA1VwT(I;!+4#n5YX8Ux2TEWX?9=u@F82+l{dEW&<1H6KW6W*_e?4aV zj^Lel5b!~~ZVchwfy+o!J|7wM3-#(%2sy!S%F5bEnEn9M;JKbNJ}ud10Fi?41E1Ex zL!`;^?!mEDG9OKr^h-yWAraa{*5{k|$MD2#h$7XYhCF{l7_2N;^OId%E;80bWib z7)OCKZI8!U$X9;skrZs@IpQ+S?Ujh!$3cQ78RIgT*Q^MkDOVE{|N?SAtJZBAN00|Mw0Uc}pW5*09EN;72!%$AIgGZF^+H*4_GJE7}miU3uPo z`M@1FXik`=N1t9RpZ)qXR;|b%`oJA;D**i4pZJV?4LX<@XkGz39(v#otxq1#tOx25 z0Mustc2@n5zO66xz*-09y+DZrNN+m;5X5erkXpvU_!Q;j7~bV0hhC9^4S$ah zvESf;1zuzP^$?_+?w}{aRE95`P{N|I9%O%{7@8#304*1IjMwMJn_wk86*P%BD|r88 z(6?RUzOQ2iBj2hL%0-tMUkV*0(6U^uy&mq%MJ-;Q;fk&=(Q^zlZ(n%qm~4Hey&{ll zVru4UQ&CY(j#6aTDQw+RNVDd_AAh{1GV9k$*#Me(AKlf|<+*cJ$!;*C-=V zj8U*AI-N7;Hp{&aEs@9nc7Mg}Wl9@@4lbw6pQZUrTI7a%=gAt(5N?_hFSuOWjB;Xm zS9_)ZPGTwSw~~4>6MDkQ`DMbqWejIpUYU*`7g(+H@BQG*wQR3OSEi>3JJU0O&-6;g zwc1^R8}IG7g!RW9bf&+G9QTRmop6FT&uSfVA};naik)^Ma*S4Gu;SW69TSladj6r) zIWi!xcO90ePVbOieJ5n_E$sViW@R~E9x-UepT30AE+iei;&RVe-kCFfLvCdRfI0IQ zzdGV#u1i6a95R$+Tq+lP;!Z`tk;_3dXn6_&x%mjzEnK(|vpJ`Qwxu^t+TaA1n3RDsTQXR+ z5@_{2SHov;1}|5xTqXCv?>@QjeecC=*_qKs(LgENw0hM_EprcK27x)?%Ea~`z;e%< zHf};7a&;U46*=#`MRNcB@555W2N6&_s!Jm?V99{#!bJ;p&{74&182ETpWYe=Ff&X) zg6-TFm-_^V6tBzJPcq7g1)Ran4}9PO1c2YGL1&|3z>~`ubB|vxeaxklH*9zn2vz4Oj@If1r~hjy51F6tifK#+Y#*Dpgyrc zJOjdOUtTK@Jyfz}9EC%c_BEEvlAbc7i3-W1BOhR3x7MyrT*R|Z8YX61kGZEYkik%A z(gE#I3`fX_u_q7B?g*-14>H<)MEalq1F4^TnY7&WJ5o1oVUB0w6>ETT;ty-IO$Xp< zfufO9J%9YG8?(MLK;+}~Y$^B0u>pT_at`X8?(9*6uexZ(+ZrtT$!YaJ4NEyt$u1ib z?s=&2dJ7$yQ0u25C#~X9O?)VL4stR1TZvx&QIyh>2Zj3C7si>t5gAxZj@0I8{Pj~p ztsrkeHJS;-3wD(7A41^w;Nzc){t5KjX4oHcwj{JA!_r^8k7RA6pF=Iuf;gZv8mia# zD+Tdhlo^CKE|s8o1?Tw!Ww0O^Ys`^Os}Y~hw#i`dG1Fxw+E;{=L!}gO+B!1eX3iP1 zyoX}vdIUwWO!6@HvExSvKr`OU<(2F3no@`7OxWobC|4f< z5&QAZK<{b4fIrw|JD<$09F)>pFoTG6EQUhLBGBrwzmSeenSzc0cne3WrySKC><(ga zR3|dCXJ$~W_<}0-+j2DhAMhkhRDLyhI&8|cals;C8glxM~#rl_}Ak5b5G=Yaj0 z+UMW=U`6nE|2O_hPU+IlpnxnrpFDry&zC7M2v;17&NRA^iF^1Se(EzhJ>2WpFHfzP zj~WzAEWAhG%Yx0$kllh}M1{(b`Ai$#di+ zD@o-Plo3RDylKSW$d4fijFf`FC6c3ni1BhFD0I#;&J0$hDb|hB!+n|fV% zOB!ZhBEzS)qUP=OWipi2{mCifJ&(h|E`9`;#dh^66}npLGa(>M30VrdctzJw$$xN> z(VX291HXUyg~#PDzVJ=Fk5?|QN$m{A{uF}1pZJ{*R|JC3mUVkD^VcWN1pY}(zXjjD zwsp6f{?QM;PyP7g)(!@M^-|E+AnVu6!@VQ>sLJYWLBKN$?_A;Dmt6yeRu-?_SRd`j zB$7Q(%fPz7!3Wq!v2_P*vA=Ce!xXbniN_+$XdO{_QaXSd3r1_AmqA!~4a^u~6RoKk z!j+6B33a$1iy|9o4R!_<&xfI^!3}@5@>+Up;mYi>7oLcF>08I;$%hZ)oxa2mj-UN_ z*1RU^I5}7v=yaqg)|Qp0&1!tlFD5oGC2#u#+dY6~tiSf@eX@OB<;QnPek^dW~=nMsaX$+)OHAfzh*lazpz`e{c(562Z=(T_^ za}5Lo*PuaS&~h+Og{U}bAL^CU`0-w^VLJ6|!PkK_9Mvzumf|^KK#u`8E@f;1I}X%w zM(mfr{1w@}d9z%3#TBx0zgO$b1mgo`be=bFu5=-Y+z!7DVc)tz3|4ZM>9+0Lbctlnvi6Asqyt#~ zkjo{8RNDtUH|JwU?Cr3XLDP`(zMBdfF7r&9-Mjas05EAeSbGpNj!zsvDGLy==0Gn4 zrVN7Ldh4xfGwo%7mH}DjLukt|XXPL$+uPeC`w&3hfFSuPECXIlTvn1nS`PHE53ygc zk5HBlJabeSiL-A1{_j60*J9~qen`LoJOk&`TBpfU?48Wn+59zPX1q__qj<-T9cq_{ zvnw=nzd+0++O};w&M|%B6J{Ra;}|YsJ!3kS=5}~4INoZM=-L~CzmeY*nkDdwf_T7B2YXS_KdymeJM@qC@v8qZr2E-__X*j3C=BX6 z@z?)BZomGrA44lAO)B$11NH$P>E|Dr?4a2dWY<@?iVPiS*rOG0Urc-q6&J2*zgJ$^CN!6-7e+#8kUix{k!#DY6vzDL+=pU z%-O#uI!?*F8MCFQKg~M(*8Tq7G9UW^ zFD)!pZTuPte&`Q%IqN-N`XlUTdq7dqntVAa0oa#Kn9I#<2Qt&*xr#E78Liq+2CqC; z6VBmtesXXY8Fw%q6K5adn0$jL1IWl^28CMws6wqjI8=n2U-lyiOy4fJ`2&t<0!6z} zYOxe)igog;lVF_XMVey0hQ9h%ysHoO$#CcH%ttEP-xJFOsB_8?r7)VxWcSAkZUA_7 z(R7mL@C4=nD(aja7-apK-}*$&rJT(e&c_9|Wc!&)A9(i- z^2{rnR2-L*{z;wv%iyoI<6nK?_A}+4Gb;xx=CP03JB|uxzf7Gwbkk6ceU=|7Ti+*d zEQj~Ll1^Q?c1N*7#L#P>lfl=%fNd=>bCB;W7Wh>IAkf5E?ps}iSv}f8Qf*Tb;+czO z$5cd--_X=y<jZEGyS9ol>A$J@uQWK; zeAD~pNwdx}wsTTu3vq;JIeqaHpNc-JXi%9iDu^<`nDR2xnkDPMUY;)(ncpg|C}+HN z{C%Eo9M&z2*Ibr$6~km*h!D@0dv;~y=c<&C0-P(Y=Sq*A5bE>gV!alQv^=2$*)jzL zg_8(Gtq!P!cCcPy^^)8=zelNj@G83*TC6*U3VV#l(Tr6rv%~Y`@CEq}$7Pz2V&C7V zPh)mq*M1oo_bh6!tfWj|P>=qIkN#jCH}*OVlGSlw4S}+dTRrB)>5nguq>HkgswP~R zO?X)aCZr0#8p7uVUqlpxbesjsATR@TT-KP0LEwW24{0Ejvo@zpnW{?;bH*=ch;qMG z&c2+3nWPLTCR?K1>X}h8FR`fvR4Hq0A_hb+z3fsARMYikiFPxfx?=fq1h*Gz;M5-a zoYBfzu?+NDVsMiIM`^;KCj7%ClNl&p`|>N8WqVj>1amLs6ZoCRUUuyWGM>Ux(WLc> zrz;HfdT4o>IyqaHGk|Bc%|ejOUbZTIFlWvj-H(_{Py56mEbZ*>>4wKSgvzd1hqg3f zzrIG;huLrFPYh^p-m*oG9yuyUj~&zYaHcZ%<7L2=Hr9|f>Kaarn} zJ9lY-mOKp9?%usyXYoGw+;i$b&L&^H_&n?jyhg6VOkkd~=?LEIGU-tfXAE;@v-Qmg z*4e(_{?2#hW$b@U`}H(ebSupA$8yvRT>JCDC8sHK;wg3}bwA1#r=bWa)XAc$+g1^nr6e~4o#SRR=( zWJfs~4>ArFuvK-4@^WyKvt)J45YQ1@k7z4j8991yvunAf3Fiy*gR@~>CVCV>Wxm%y z&Ilyp**O9lgm1ya8M?qRKu4Pxlm%rY{?P>fO*k~rBXed>l{;>_PNrgYn(sXKq?~N; zmUeu2Kgi{(>ktH{d=PUc^Dvi!MjM(qD2ul71F@wG=g17qEq`o1+_EG5V z!CpoKyqtH1Bzt3AV=+mZET}D(&h9HZ3h~T;~^!I7te>n5=FkC;`1P_bz*7f z@uZ&pn^hf+33}8hWo4;MH~m{o24Ze_4JzZ@C`=imKZ?w`deCn!%b~0im1!1@jB(mP zVTM~ysFpKJSZ_w)?V?}%tF$aL$xdNk-h&AK8YS(pckKi-aWN+!73hAySKcKJQ)fua zyrr6RKi=Wq4h{Yi?i1xPg{6mCqLGz8Z@`k!yp}?Wd1MY5j^+U5EpyL{v{@Dc%cPFy zSs4SjQ5}EbE5hHrn;8iH&C(gcbFiQBGz6|UVQ=LAllx&8Eu+j}p=vNwy?85|`KYtV z`vkg3E*Yr;S#dmsX;T#$4@H`SJmqmTi8aEQe)#=& zXwEtV#Gn28)1^y2GbsCZ_V}gzT8VoIuUI@^gVUUS%%JmRIy)Yy_?Va-ls858X_Wb% zVef}_DX1liW4F%kyA?N5GdW(T!~0*9fgk>b3}d-xj_>JO!qwIjHf5SyB?>H5O-**O z5<((R=*z~ztI)2*2xI#btK)IS3LX=eXi!LHLn5znzj9P(zsNTFM7x-Z@Blq?$G6-5 z3EKDM!D|GbCj$|5@2J!?U>Dxk3(+Es{25HZ1aa$n;O z&zv%mnzLEA{?r1w{_eTbI-@c~baa1V_OIuz;gj=Lw<3Vts?_{g_4Khp%nI(7{oA_b z&DT1m2m31f#31m_*Sh3_tMl)ko+ek;wihm*Xb*$-_>3`;^Lf7Jmf5mkDP|a#r5f!h zBR}h~9~XOy{fl<#{r(JjpeWzO{GSa5u{Yc7*}-*b;#e)$?*O1YNS3}>FUJj0yH zQWKVdUW}kF_n57f7zCb+8NA%fckkYPn1K=o4jHWEKDONd)~EjdK3yLA<(FT@vcl^% zNX{9vx;HXr%5oNQUthoak`Ho|=VeT^+}1Wz_u%EZ;@PW~xW_Jo`OTP_V}pdGr5#8bmap6T5$osKe z_7@-iM_n>o2eqM(viM`7jr2eF_1%Q!#-Dxm2XftY*T{WX=9)qIsZ+xM0t2_~gWRXu zC)&@YxcQrCV!!5|z;8L}WrRL#xe3y44Ipd_iDg6jya=SAn1E8TdN5!~UKCM6VxT-} zRvSL_stoVPetE46rTMyFmBvec%2@I_??I_e8H(43?`wLa;~+c}SU9MdW25Q_us^bc zgYXA=`nW;4&-lTu-^2bnl^Fp3ga7uA+GGxv{c{Zfa}Qum=%4)PiuV@n zzt$PpZ+Si9VrDQ-i)qB1L-n}t#pkrKjFs0lV%3dV7X~taedR8g5-DThOIR`xEoWmU zn7n;OR%g$^$%C@S9qkpkSDy#`&`l-42MtL>^A#xk8~5KkYMmd4y%to(sMFz&+*2+A^z;#%O+(Ujc^ z*i^iu&Y81V9(>?lx%QeXq#pPGCcKkw*tAVHzxi3bFVR*6v9&$+;ajkC1i@v_@Ljz8 zJXv|cDrtLR8a~Xz2W5~?H)tE6kIOxGc6P}0nX{prKA|CeSAgO4GsLkwGTAl9TwxTX ze&KT|^HG3B6dB=%?2H7uU}d6IDu3YY%q{=lL&57{p+493v$_fL%q&MZGo~Crfa!J; z(CL`y4Z?FB%a$8zJULrimb@(M=V~K}iBrGFJn<`2CXur)FZs8h%>_BRC+@D#|6ULh zWszUcR}^HreLmxY8)XRsrZcgp??h9Ollh7KL%sR;J<=#04_OmP8XL?$!W88cX%t6N zApU>$-UH0CqdFH|ox@D0nVy__vL=tDQ9^N)C6GiA4%Y@H*aC63)foE!Y=pS}|{ z)7^3v;qkq~s(b*7imo9Z-%xRC>v<}I>!W_7Wn3@X3OwZ)%JZ`HzU2Any^o^YaJXxO zG)eJ}7wL(|+^4Y2hV=EI?E#!(dHpHem>~D+;01w`vhhp5C(HipH{8nz;l&!@ms~W# z<>E&Lj3>*(@U3i~2OIElyiCJQ_H^&bAV_RhejF^6wN6-o!=lwK2T11=4VsgVH)0)J z&x>?SM#CI`Dh@Y`%IKv!#TxaG&wS|{3F9xldH?vg?@q|2(Up;TuDy7PeEQ4Zh`fIj zNTXP}3tqtd`$Zc45vbG`in$;mi*Lm-=Q_rpTidQ0!M#fQOo2sg&lVmWXSfE2I(JFm zx^GI~i+?Zl{4HqojVa?2btz}k>kyD$$&fkRekzSI0d+Elr(4|`tlat#y19>3@JX2J0yV{U-R@92`x%?$;xTtNS6 zb93z(2X>ype&e9j*;%=1eyHz-k@$^gLWhzenSWuk%z#%e)6Pu{%bXN^;q^GW?p>3# zJ@K9CAkx>%=l?t@#VZe%di9Q*R4e>jd2O3?9`1uz@isY>GA`3FT(ki=pD@73Pfi+o zspf$lUHJ{bMfRhB$PqLZSj2CNK1FolT*|u#0$$IMMV+z z#1OyCM(3U^e9f3!o&xg; zE2K~BU_A4|wLRn=ltaEzIdyZ2;9$gZCn0ox5uo#pc0S zdXh$*?R&))m%~HUy@kYZx-@=<9+O0+;hZ6l`Nwl*X)vURERCF(UV4d!?#=tq9H|%g zDFTIsVVa})3~4gT)Pvs5)dh`86gDJ0V=g?~mhAZ8!M@oR5Mea#Zr!>~9(()=`Pt8& zRHG$BWoIQCYZ=a%eCWAalp#2GYLqp3Rr6(mVaA5*ihXelE~%Ay7uonxFZSiBr`O0s z4?QI7*1fJ?!s$8ZIC4XH%$PB{0ZXHBrZE`&!Y?0s0AGFe)p8gf#LvS+dfT?`x~4*{ zr~`S?yO@7G=l9^j1GrQw<c!$FgujyXgQ$V)XFp;*gnldtq)PZN2}|=OWT;FJ7!+%-p%Xr$_b8|48UB z3g_(z(EFULn3rvK(pGJ9IPo>5BzA%2rO)MBIq_nA&-3kHcYWkyj0S}L7(t3J+JeOU ze)L7@JGQsLI2I(guO~Mo7|ZlN<=ivgU$iz3zrUIqjrjlzjLr78^wi1^3vXbrIpT;ekgY8+_% zAOxeTK^)J3mmDj>hv(5%vP}iz`I9_QrCDeI23|bPNiDwb2XT}|6^y+DI0B*>FP7B< zsR=JIE}K73Zo2MjnLT^D8j|r4D>Nk6SJ%h@!b01#?GTgyHdV%tYmx1EKHyi~AU&PY8JG>QiPNhu)YXr{%X`qbySo?R&>EFDJIL{12iR}^ zF==iCqMcK)p9^R7QatS`JC8?l{JC)@4+rzZ$7WBf#puJ@omi)X(JGBLfR`f1d>sSS zje+Or)z_LCU44^gY!7j)ja_A8n_B}ecThIq&*MZeUr4EtZq|B;W94+7ML7Sr|0c)y z`^I0rUk18PWDiM-300Q=qa>5K~G(lZKUMU)A!^9T? zqPfwvi&o2xmrf3;0ALyEkpk%ge|1yyrAB2w~;-v01>JiUAN#|#n0!`!f1t)QT?HPW+}XZ~8s zGX7c{^Y2Cy<)+v5%+<=eO}(MLt2^|!KdRb=aI~) zCtQ^J!W*tHf2#nDK;OW{z~!!qYnD$1F0mFhp*(bAw;Fv1cC8Wq4W9yPE0QUb)#E~Z z0Xd8S$B3+Uh6w ze7;kbUDcMi@2@<5R9<}aXhOaje+le9&FB1N>R9BA!wR)N1}Ix#l+8)OGUq(>cMr&s zgT3n2d*X1foH*7elV>)_{EO^(y(9;o6TB22xsQHhf1;tMEADTiA)}I^YJ|05Rf|0F zodb#Mf8A5ZW$D}6;(Jzv9T$!t>Xr4+b|U;W!hN?^3&Uc!Ary9Xo)-aP%8`^txPH>> zK3yM)D(54OO|a!@9nVF-`(iKhwD=L#%ju{(0tMdM24KFOR!##j!$8~F!r@@&TaY1+ zm2Ht)Zty4{?j~UE$U`3abjSyfmxgI~1O;9KY;7dHiwK8%h8h@wOG|P>x3uN(_Nm7p=fxt#f zs_%;JKS&$)J!}igG#bvDHB;_*$J^lzJW(Eg_)!hj%do*TdeZ2}khwHs+QSD8at99{ zk_R66k!mq}HqLXMG&%Ad$` zYimWAVf~HhrraFPbis@Hy+%J;taef8)z4_z}{x3;!wUr5LEl<8f}HLzjBMhy+EjO-&46&3VM>4gjD%RTRZ zpUj*wL!MrBu{oC*|YSVLs8Je4$%JmI(YKS(G z%&8mCF&;N=yc9@-m zo5?5lIoFZtXN>Ghah=UMYA7sWE>NT-m8&UjvOxwl7c-}k-8 zh2hzLk^bY3K;!|81*w;}zc};=23w?>$L)%z>mA6%Pq-{80|J9VwTl7X?l||iqKXj? z`~?tT6<0LA1?Us^uHv|sj1|Z@`s{b*=ri8|ivl{KRqq!GoOrC9*Cvr1mg!?Pic|jD zj*`{Gakil$YQ8etkW_u1E3fa`Eme31 z!&j<)?U0_Q<@JFOPoN0j44W$q#?|0ejc1^CL=+i-PEBZ-i=!Hr%%3Y`5MAX2j=88G zTZcFN;l(~wC1*~-zzkkBFd{SDvpqLe;+kMs=^=eluusO~Wy3=U_shTjfB!7UkK(*^ zJb&}q*LfmqClNB5(I6`IrLgAqdL0iQy}`b*YxbNR_S=<#pks#B0%SJ~j!4VO-r%IL zvNjky%^f5O=e&`Ii8`=|-nlwHUCDha(At3Op2xyAhv9k@^Dt83-3?&ibu;oQuA-~ZIJe+`2kx0}E8U!)fv zz>!+OQ#oXpk;rc9?Z2C8{H4KFc?EQ}@Oo&!Ocd z2BfqBc(D6qOwSj7IS39_a~;R%I{|H;F*9PaFEozRV>&bfx4|>`z@zsm5BpG3$37lQ z03&!*_DF2dqOEb%Bbaebv|9K4P2A<8^m(g6jFp`w#K@W7nAl+ z^Pp}(#qjV1EZNZ$2-|*W&39$O<%n+M=g5(!oP_f3+d?F`D6?DXQk8UrtF(RyQFeeg{HA7n45!&p(t;BT|p`F{I&d85+Fvg_Qo# zyFZ~vyB$lyUli^?G~;v#dScOt;g z3Pw)^Lo!%ap2D$v3E3%6Eu{LMqDfUFxk_q{mS^ceS!g%eSt#kYbUllvSlDo~i{(=) zp7nw9nOHYnEGIlH8%-K+b>?9*-XRR-ERWh#$9eW=cIxjLlt=z`Uv^^-beOr$!FPa~ z+DbL_KK%nc&j;y2oZmYIVU^pbCOuq6|v!VLZJ0w@$nf?9Hj}S{weCvR$d-}L>)BL@^KTEx+ z6Ts1|gljxYPPp#bo~~!nWWloJWWlm%ONFKRrt8L!aDJcI{gQnPal>-h?+|Xh%8{4b zmPIGkH!;1n4ZsXJSWb(*h66gw*|J4yc@8`Kg5ZiDCgtVf>Ga}3c{n^1Q_4j%49~-T zr{%TN`{fKgEk+~hh79#p4`4{Z2A6vGY6xhCf%ajaX#i%MwOd*1j-EFZZp^jUG|AO% z^W@^D88WeEtpAP~W*&wahp_MT@}x2CrW5~5{4}&V_JX*v*^Lm&19`#;lV5LNZ?p*- z>gUSnFZ*PC3-qrS-Y9$a?2*pS1?q{L%L@?D_d_NP**v>9^wO=XtCuE(kFLaz2;%j? zIJsfNCi%e+9#DMqf~CQ9;>3yYcD)kk*e;XV9kXO2jOa};26Ie_|Hc~|)wr3d1Aztl z!Oatn@qzsZbX@9S^h}Sd<69x85xRL7Hh4AEb0CbvWyWdJa+8^Jwr0&UYS3lf(u4`^ z!qDDVU3H~&bik;OzO}-TP0u8rwfhf$|Btx_VDQgL(3^&Eo?U$R-S3fWue}CqYA4PZ z-XL4HY=JR&2j*v=hGC{**$mLkdG7E};bA>z&TKuKnd8{p)U5nW4voSzy5IetcgyX! z-xe9Stv#7@o)MN3{j5yZ-6#M6KmbWZK~%!EN3U?5*CbMQEt(s4(qC^JPz{IXK|zyV zm^qgv0S>79B%vgNLwes98;aTJQVv?&WGLA=WaQ97AE!|^38D6;bMGUcmg@O8OEnC^ zRWmM65V*AnPR5L5V`FCec>^~M1G-6sO?nndW1EJCnqXeW3g4RN+w)8-7S6)k{|LkO z$-mV)4a2`M0P9fvhyAEv^c1dJzYtyKHnDZBMpuwWASy3rR{4jb8c*B~k^#_$1}0`o ziUMBLt8AI0;E{iLzJ(arbyx@|t1Y~Sv)V(LmqBC3{s;ahx~@YME&DNY@OY!&>JA5e z(s7E72RdXNIHeE!?8>g)jXinre#GxgMR&~oXD-B=xruElGC)Thl63J}FbY4dQ5CWs z5+GqYLePSt=>3mgvHxnBfmrSE)dl=&>;LP8!z?gYI$g=$Fp@yW|XB z06d9dIIw-IY}vL!7Iw^*tFE|I8je=$OJePK@$cC2WBS5eZ$AwJ`14<2LlubJf$#Jh zd|%U`yl{4h{Ms-5l8mjZmY@FkA=&YRAMBAWC`l0=nGs|a(?%sa9bauwgC&ouZ zK*Ozg5C-vliIGlR0+)DN6~r+o@8pbn^i-y#DSD!ihb9g>%6fS#<6uokI5Dn)Jj7)L zdOoUHqA^{e=3$E0xUM1JWMwChBO0c#7M5ci(rF)~MHTcbLUXjySO7ll?H|!IZX*;F z_WkhlFuJ~hVIn>_t5UhNzClT8&}G=?FdcaGtFrfpU+^KEJuk;m(OPjn@Vwvpn}~#Z z`6+QQl`A+~7l!B{RW;z55?;6pHx-?F0TzlLmJUUIa?>-eTWpWUE9_0y*g4j!51QUS$Kh5d_ey84AfPtIEJvKAujQDIj8-Du7DcEl)OQktSe9Mj*x` zYO{hWg*L4#QZ%-aBo9^`!)LGkgc6iSv3kS<_-WXVZ~mFIt+*avy@ihiih1}_Ft0gn z21qP60|t39JOcFMig-z8>~wh6V{^Yh`SNl^KSH_ej-MpG_d0$GjOHO;i5zR*lN|-G zb&Y4?-pq>3%xX}$Pm(=h=1r>`lo-QwW-Uff!lDQXPa>zSfHa2NE`xC(oi3~E* z2=6f&oJt2}$)@gE@Y1;tPeD00_a@VFQitV`o54+2t0!>6N?dLji^zgF`?l+3ym!5K z>lu0Gfy1)urt#R{iY87@9PN__|7oA>+E`}Kz*wEAblGhaWbI=|<;>~$*}NO&`~GB$ zT=ULJGIJ4}NLs33@)(qjFLlZ@KROH#-x!ySmcm=O72&KcWf_iNeB_ACT-Yen=VPDQ zCl25C*H6g<|F8$YTjFuCcDtOcK4E&jjGJ65M{&lmrNeuB$`*gp& z@bFQ2EoErs)GdRDt|psD&#ZY|P0pFYKluCI^0s$OkTK1OXw)?z3*q$}rmNmLQNHoN zcZ48${9F6w^vOP1dCfT0sS*bA{=PvCMg7$G56Xt;lM!uNCe+CE1@X8fn3YmV^`{_d z*4iydP{zhA*`?^7Pn9&^blvC(r#vn&!?Bz=VcBRxcsXGGO-A=Qdt*ShKw}-bUjNa!tz}lA%4iK5PpcK^!}m@c?IQu@HzwU>x|w6 zSR*Y`HWJ?mr(Ue$#;xAJH28Y&-^lPwV=wUZk2LnD8_CK^+Te=6xN)*v(bNG$Fbs=9 zo60COHjYK!&v2uWLr?5!)270R9Y5S~PUxN9gL8qYBaQCq^+aCOh36mdhGBgB_8n@F zo`!Wz<1xLAici*aznH?yk?R&2{#YT55G0>zq&SpWC7vd2GXw)7 zH;~V(n&$+KDDoO$(hI^Bi~iK>#{?8jRTyyudK`WBJJNd$AyL6OXHUzdMFVAke7Uq3@1ptJcbEDtcTK2r4yZf$3PBI%GRvep{ttW{aA^-}8>~ekvqN8@h(scrw z7|*qs_?TZT!}MgE_5=4wJ{PgfDHu@CU&n{v?+%}m@DJe3koi!OMqqBlS7R%F30_F6 z!HZ$rH*b z+lq~d)6#{rgts2pEBiW+$}Z%;{VTsFbrsmK!An(#jviHS;O;Z<_C+Xv@}}m!`2NM? zukc;sF?f0H(q+q~6))G-R1V7Q>CcO+e7<@&rQ^3XdJ)fD{+uLQ|(PL88 zfM;IF(1dp9_3XyQjY-r5q38>%{`}Xx%$Kh-bDB}ln5V%E z65*l1+2VhVpfoNZtkvc{i#CIdaw_?Rt8{1 z%}wZo67YlkVWa{cy@*3k-nJDtIB#2Hu7hWlm@5s_P4h2}0Vs9te#6y)ZWKUR;aT(@kb3BX@;bBPeN!L3X8y`>@l12Q0tdfLA4U?hXj_vb_U zqtyAs)af$?47pi4-*^9G3F9w+C){=2CDMxD!fWwc;CndMhR^T}fqgfATRi`-f0o52 zf_)AAh|k{*EAiWf;h*n+?77H8*oD&mAv~zx8`0bedGxBb^tIp_pSmnxILn$6Ir+co z$=_yl@v`jy^t<-dJ{dav1`NK>$sqEfL+gdVb#qe0Bd28;KoJ*#qJ(%sIVi?=K8j2< zI34UB5^3a>W|o1jK!aOuw9yxa=YjS#ilM%#Is2Tx_onNkt>AF-vUDs)Ck}WX+J&o{ z<)u{U05CAWQWx_tX@cDm94#azQ>S!8v4S}#tbKI>BNyf`TC!3lbIJZ%J?bu z_?<8$hjw+V_bmA`4077AoL;;f)+=tGC^X83Y0Jweg`T&Q5DvO|e6{qR8I%J%yA#HC z!@uB?W|;ubT}`R}%v;ff-%yCi8l;2J@jHLJOCdFNmGW_fn`RV3O;Bk5g)MU7>Tx;q z`utCh$O{i1fwwV^DXg!Oo-+e-5+SQoB9+bC-Z4=c(EqbeSx}+hWy)idB+m{9>8hr8R zav&-W>QNhh&Z4jO$578p8>h(it@C7d{df)ioKP|xqeMe-6&gx6Z$>!my?fLP_Ao*g z)4TGTYp#|HE?B4rGjigF+@i%7!0_9z#!z~5+7~&)`7)$1&&;*NGi%+svGErYH#d*M zn|0l*ugNSJOFLj>)Ug2305%GDB1G`hIFpv1#(5LhK@o|@!RKFi5eCN&p;zk+Y&LRC z-J`5Kd-m|*!}8FB58*7|^=eGC{*XOs^bA^TMl#U|djRLt(x@BaH8nNKMHgO(v04BF zYpde≧$P%-*+epBl@fhOkh0nMRm2h;H7zMSl3ekL8_r-JynNhCjAMS%(fCRuA2$ zp5pk$VNf`i4ByQDGpsTb&lubVgYxm?$q+2;%l!HC<9U<9t2Ia66M6!a`?P#3{jwAO3k4K#P&To~K&h9eB}Y-gh9@XN2fA~O-b{Px>!QKPP#V{O(Cu3H-JAAIOx zHF}R5H%<-v^e*n`=)l?4t77D$O2MQhu06mxR`Df};5ua~0tcnA=$MrE zGkN~+B4tjarWt>E7S^@cT*;Sc-2B*Qznarb1LlVi25r`qi8*aq02+ToqpNtYWHoeR zbBN*G{sM;9e8%YGIQz?tq1=?=22ols8e{1da6h~v$csEJh4coqoOH(9V3w!XlfjwO zyE-eRoVNM#p$9{jheAGmI3HY#X@j)&je3^TQ-L9%xjMOQHF1%mqOb_a7UF1ww!1Qr ziIc!1ZYrU@0+Bo_#!O8%B<>^0Cav+lk`E^zJcG?>fq2g1F@%4%?ngQF4!tQ?QO~O+|IIDRb}L~}U9oVXoWXbSY`pZebz)mNXVVnUniSh zZIV~lu9c3C4t!_6CetU4mt7n)ycCBWW4Z9s%jA`(pOyz7endX-tG^=M{LY6AzED>S zBQn?^q%+U^Mbr(1lSYteY#>jQnt>jfHUZBd-Cg>!SsVEAIkA7>3^u3`t`WLa;bpak z+C~_k2eFwkR>oIU!w8IL%YK|qj7_XTdMc~B`pFU!MuSy;&}gn0_+-^jm9_)L>ZFPi zX+2&9E3rTpmcp`E#p!GaK9BL7aMpWapyb)GmKdhEd+++Z`bGCF5ZkgcVagToNRBT= z*M$kOJVG=;KpTTl0%wogy8Ol*x`x2uRJ7^g0qFGzYDhhX>t_Z ztw$~LN@W|@sLKtP&7`c#@Jfww*%wC_QKL?-mh{%+tA=B3E(a9jVHAmLfIt%ENqXJ* zcB8jkNvvW#mj$$}UF+3I2rL zzg7kgZPDa!c>pI4wj*7Nk(CvzQNeHuQ71D9Iwmj|EylbL{ zQ0~O}wP8AfFvI*yr%P{YmmP1MN`x3rQrZd0_kNc&QbCVWNlZJAY?}{Of18hhTq= zB|$5$ZIk^w&&Uf89Z57$?|s|4@RtB5Dw7ee`Ih&`&*+IpR4%=>U0!|im~o* zSngv8Wj%gM(tv#1e?~MK7@c2VlML(3v7_M|BbXMYbw2C9?T&W2@VarC?Qa_J7uUbL zU*?;DJlA)GK3sc*=nLgMQkE>sZKF)24h>^jgz|DtVv@4t7-Fl)|j`w$Aqbh?wWM5)ge`-@cjJvuqM^9L8*0F9zVYb8V zLfZ|`w;NtH+Gp2~lgpcD$;z?Qq#<<4FVMeI)TN2W%L-aN&p81kdHY?er!Q+D3Z3B6Nk&|LfS%W8BCc_;b>l48^T{rly? z2Om@~*b7&#fPs2~hDoF`lt$UtV8njpk;i1y=FMstHNHHPnBKh8r%%%`(6%u~<0%cn zVXCH=4LYbE%V<#bP-kBl27KLX>vN38O3%y3UqXBdU@tbApZMv|$2XnriBoQ;IB&DsrzZ3bi6rwouaW#pb{=cxa1h7bltUOQHE6Ma{rE} zrDE3_7%o01($FH66BkS6w99aQ@Fh|?VId}OEcypo95d^bmC1}{W*i{gM@A!shE2Xf zZ^l)=y>6Qx+!)EXal*IaLnEtsp;A|Fgm6Q|_zb5%H{b1T`c4>gsau$6xTW!PxHtJp zL;An|7q@A{e$iw0IL_iUV>fw!97gMF5E9SM2WuVcyp2sJacuL9{mSqIno0oQoXY9V&+2)WX_f4IPsfm|`GSrc zkgeUcHhRkqp3WnFG0QZH)JuqZb&jIwIy?u(D#C@%#EY~* zAu1b!u{1=3vz|&un*v8XwcYazad~a=EMOXeGgD%oGBHXAM)O`eX+)95Bha<7xkCmI z9YgFKGctJ%f$Ll=?ovTtya~vt^T*({_Is8pxhE~3; znsu%*e@pP(UWRUFy6=0B<^3JQc0Nmo#$Upi?!il<_8Vr0e<{_q{QQ0n^`4TUwO^N^ z%@5#)4WnnFYJ^YI~EFAcjs3L*No5I-VAA#weg0)_bLg_s{9>l!6Cs-WtIxyr)o6?C`Iwd(`IS%1l5c(v z4i*SqoG;Py_abY$cK^xzvX>XrF~kxJo()N2`}Ru zL=T{hmDi4wYu|%?ZT=q0lj<9*6LX&WWfyoe980aXxDI7pY8rSntjN3 z49MBYEVqraL|tObQHg{<7wF}7uRfdj-}x3b2eMF`4Rk)71U$G35^&EX3ugSwoKLTB zmDMftWY*wYBMUBE4WYZQcU>{lJO8j2W7j#$leVYKb9s=g*%9Bj8WffM}b&G@>#z zGeb(hfHP%joa}}N@s_Py;pMs+o~(z|%h>oN^U~&s{b0CidX_%<mY>6JGQ_yc36KBuvP>)mUPGjX5c%;OeDUL!7y)V5CuiTkBZk$7& z#k*z8R(TL(Ncq&GsFaw~Bn3T>w{G1gU-`;E$nxb&VVs_id1;k1Fyyi?oWEVWaQ-jw zEOD)kAKxxlUimf+gUvb<*Ch?_G=y4WANeu>&wSpnag%x()9~60cb?6gHX%&&qdH#f zZ%*R!^NBM=n=}7?)4V^UuGa^LWGctJTApp2GB4-o1Ob;=T%x^Zonx zsbQNkNK2z}JH{rF3XFdOj}^UNrJxD=U{DkvAK2iJe%OVVY_zOnUX#l3*{z}A^kIewv3w8QWL277bF+G| z`TJkU0n>w)XPEJAV8ix6k3te(T!`Y$QGW z<$H;yi5|os@@FB__#3tvPNDomFzQkU6OF{*{L4?|=wf5Tc}ROGg!+WKY{!^B0sOCE zb1U>Zw>NeSBg>5uadQz3W_d0~5@N$Ze3p&Q;Ka5zE#o6S!ijdT zlkp1qklya!rn=?EHLfdmv~F0#qk+@WHTgDF;3>=0Sc7K|yj<4<4_SK8_Vk`qgDBs$ z8yf0^p%nL2{3xrz3u=SCFt7&CV9J0WssN3t2)W!a28Q2B(s=r$>_J411Nctv>!*h- z$Ar(BD4>Ik+A#=2YhPuzbRz^}>%=i~%|*-Q<+U%!vPE;{rc0+wPkptl-QSOA<)bpS zy;0gOSt*NWw5XA{8+4oZ?SUsS-cZMLYAw8ZWeDEI{gpDIxgADgLD=ZSvg60wr5eu$ zy)YIn#52r=)91)ZyzEy4ui<|FeyOU%#!9W!;7ErvT`(m>(HcCX)YLY>BN*P#=yN~% zT!ohn?Kv!&g8+ST9Yf!I(jn2ZGmyCXPOkztbV+Ek=Geus_<1~r`3X=JYz>hv)`7V8 zz3Ix@?h(57ye!eExOAM_rjVasIMdeylFqSdJYMHrs(NaTtD zh~!WTpl}K=tDM~QY$BZVjQ9LErJxbmbkmtZrFI-P*FJh*!YiA| zdmq5}INBXPA#M%Kxck3JjS=QtT zt>$wlF9Q0Bj`fLJQ1C`)EydGo=0dktP*Wbp*X3-B)=lhq6r=iE2q%2LrKfMc#NRQN z`0{9>lyR&(A|!MJ@JgF8rX#s^5}|KKw>Gwpl9ny(mLR;01gFkx&r! zIZW;@8A4KJF6-zTNVVmw>U}Iv|BhM6m8#{35SHc0+1WO(C3iS57f znfbEeg-$(t_t?Q+JzJJhS8CuK0$J29M!Xa=~>H&Kvg(Sv0-eL%wN$gm%qJT&qn4M#5B^z z2`|AeOuY~k=zH zo1V`cKN^^6WM2w>Iu?(Gj`=T4wynH|Yl{~(*ItD*k1MVZIr^0oVAn**GYb~Bk5<`+ zrWpSDbj$}QPrKxUbytk2l5qOENIGJI_*aOI}?1#}Fnd_luR`M{*hWOMgn+1Jx4ClQ{G zp1^^Yxw4Ca;3nOLO|6~Ss5`FTYxogN!yDwQftR_K!Hk=5_>zg?z|%T5&S3n#dE5nZ zaT7xK;$q~F?A&DiPit-PT#7WL6~^6_E0)6p_$dt|%uN92J-bu>?koQw5B%sS@Z@#p ztM1*q4`=;u*Ko*gvj7`VFxJsKbMcbJ>M3me8E%-NgzvxqdqVHt&@f5<3?a=kYoB}W zdHrIe(a?FNW*bZ0bY_i#NzBe^?4vP~hTe7SURT2(4UhCjrKd4HLai^H7kWM4aKrU- z`Q->}3nQVWN$`B0HEV{3My8&mVrg54&nr`GzkLlgJ_GtL)I&91yLH`(kA0V6dybn@S=-W%3g%j z-nw<0dUuoF_5X~9$YvO9h8?fLMmissI39dyp{wgm^iqMX*A>f`3k}L6O8G7?j)7Yi zdXLMzn-C{`xl##*Sp&9HP;_g=+JZd7$FPUs6c3_VO5hoA1i7wdD(huYN8G`jBH*WG z(*u1S?8Fc4Q-?%$uEBYexSpzNVFW{{^l@`V+Ge?Pgqx;lKSrQVQ6%OOOXO=WUJ}u8 z(__VgSsM13MpM3RPcPaqnQ_=)U-=}?riIZpOf4` zX6JgrXE&V_sNS3W7~~U}!s&(4ryE8N8wHo!cCbOojHUp>4I>`85G#hV0IGa*7 z?!Y0jPjMM?;)=G0)quoE6MP6Xe9I%mtU|0#)S3Z`+QI^Rs3QY{Av~8HKaGu?A$Yk0 z2_{*oz}b~BkE%gmQFrhH2 z>dR)0FIYE&;T%V0UPCmfkkE#JlF|!AT6s6igh4FIIJVl;JD=8N8<)g zQW}Z!IVW~4YguI5-+frRqU*%TCpmQq)3Im2Ei?*R;(4%3KKY0mF3;>pV1 zE)DPwKK{ysvh$z*(63iqG3WrVn|c@_Co0xEeH>tKKGaW_dW1= zVPDfzPXOnOUdd)ure0m>(;1u>%(>%v#l+z`#4XEiOq@qd-b^$ub3G@XA5+3u4X2iL zDHMXDWNo^>QHkn?f%VFHNK78v6pjX4&x#Mp#z2(_t|x7GAK~>zNVpap1M)#XDZ{rD z%axTe%Hb$bN9w}=u1wlE#aswu%_UwJpaCvl0MK)wVb~wll+de4Nh6{0tSjm#iu5=G zaB>uilnu0y&W)=dTikzbZKzQlV0XU_#vVmS!@G}85pKi7doUHRUGbQmCt&PLJ;xVM zeg0tb`PveHhuE{W!NS~LWIc|T&kLnid}sfMN?5qOhe&;sR8GBEDyCh6{WeAqLA((> z?+A>+a(IIb?0yDb^f&|fg!_)k93w95tfUu5Rzr!f=yHM}mZLiPWC;&pET`+9hk-Q@ znDTyu-!^eVnSCLMXx1-|p`lqG6TJmW!I+#)Z#YQld$^95ho{@TtQFUc6aFPq7Ow;X zo;6?$Tzpxp{taQjtEU^!yr8SC=X@n6>gspm`(c>W2;=7MADEttHJmOP{leuXG&=K- zslN}=jc{Hsb>>;XQDTw9pTQ%-L7`=Qt*n0UWL=Z}y@(nFepUFLkv4wv4BXp4n0&TX zK4BkHvS>tJa(S!%5w{-^mKYq7BsH}d%fvOJ+=l;v44%8Z7<~CxR0{MO(^M_XuWHjj z((){4H2~u$P&N1#o5r+YPH{GKQOV|_5OOg%h3L=swzKJ9xW=rX~X!O+(&M zPCA7;hHd%aA&x6IjU6k?mMv9-Cp}^9Y+oAe7!sQ2*wP@!x1mlWq%IA)=Fv(6=}esE zyL|aF4VO&M6iapR;@}y-*Is)KHX?iA5xd2jG^cTnei_yt(tVuQb3~m};Jh zd;puDtdAM9UgwqLM0xx{%(HaqY0GnP&1gJ?4ax!N6f8+6DhI%>I-_)Tb&VQeIrcmw zxzIVuq@mnp%a+O8Z@(3W>zOdd#%~mId}&O5>7|!2$J@d8gz8Eq7y_KS)1Y06A4)Wo zTVLo2&N5-{$G%frH<6(iS6vlk^PJraSFY5t{3${~(`%UcG{n+ddC#6b7!z!A14e#a z2gZ+j&YU@2F2C$D7>Z{&0r=#bjcwrjwzpl5@ZCq{yZ7I(Ytv}$1%ikmqrkPr7Za|% z<|?eqtM#1c47B1wiTScM8DD$2nsrPP42>p2!&Vka`4_=FFN1T}&TdW-j^moDCPal5 z#TyoRSOhmuUOg(U;Q@nsBvWB*M}d7tRylsIRE(z=FpR&gvv9B;9!%l&#p_`-lZ7GX zCP_NXGYyKiu|h*}Iy~CT8+Syi(U_U0w?-N&M`{2z9wF~guC=H0to|4dc}1H-*gT>) z0gcS%OpibRTEvc?)oH`HHQtGH!dm~rd0N|8TU)-In_qwQ<@e?^(?HKKc1&qweGc+S z0e;Eq?>>~>b?FMcrU{6zZC*1T$*yg!=L)aDaSrEoQvIV2XR8|Z(KVmm@|^2Fs(h}B zHvM&2_<^LE+t}APTL7XI!g+gOiVSZK*#S}Z&8T}`ip;7f4)w8njZ!;&ej1Os9P8<@ zl)z&qA=VP-s~H2mJL^HcId0WinyKRWftI64}2F$8tRS z4gC5?cu(v|@ci2)LZ9<%6F0S{i_9{H?^7N>6XUtaLHB^^0S8@l?ix8T(WSfbm3le_}~G#@|tV$#(S4+-|&)LGQM6; z<2(M^cmJ}~jGrun2v@an-LtY45jy&4Hm1JNfqFN%JZx6g*zDK^a?Kd0#9mRJ zc}t^V+PFG)-lf97bYh6;xF4!DP!LKR<2dfp*poI*m#)(&ISz)?th65nPZ}=c6ibX@ z;`EyrLJF7leBaFuhjYb51KlZj&eFhZi3VN%C%gPq^~qiz7xYtpujLpLpIz8{PL5;4Zuv#nlbhp#a85qd?C@yH;Wj(O?i1(y$!a zm^?mVmI4+A()`W7CyrEp*tbN7O02{;&X`bnk3c{cFLKS(M;a;V8CrC*IVV9{RwyGZ zrXt(5BXF$EBHv~B)SVHKzPVz%+{&^~u-AtPs!?%Q+cIDz}5`2z0@#P51x|4Gu0SonSXgx zk-Ut)tFK#5*PfI*csuZ7bsoNWnj#-=TzMGZymM{H31=PoSZsdHZ@?yZ^IVx#Hx6gC zmHJI*nq=e|eW7P1&%3?l=9_dQ?s1&kx_kE?HS+S|nZ`c;g^52B-8s3_!S7j&R;kcoQq!rL=_W^JLH8x5dK z;FWyz=rIiiY=%OU7v^>FK$$dgk}O@iMDD!f9mtoeF*wAbF}VXCF*o0Qqk7xE@x}%{ z+m^a<1C{6S@{h^JXYSlN+NV>ePO1@|d^ZAs7vou0;&LqmKa12(;P=ggTSH{Ni) zti(CT3~?PMh8X8d1-IUMGeTMRsrUHSty}e6Vjas6IViL5G%Ry%u@5)je6xm%=2#7z zIBuLLO~_f)Dn7K$niS|OmU&p%WHg)(505udj4o>O03gTH7bBq*vx$Youmoz7hoXC$ zm^4L@QB5!>p;t_c#t1LGv|oVpfET%Z>P3i0Iti~+Hex8@p$4xrh8@*1)*Mqb#9Axg z2Mvz4F%*V>HVGjt(*O*^sil<&ahxyF*cxs^<-;S~-sa~9kA+(!eQ2OHcp*NshVgQk zIkjDmZ*U#~qp>Mw<4PUxTpe%Nr*&rEc-Alb#B+;_Njjb|xTh1x=;1Hln+BJyZYx@s zIV$cu4TWf#qijf_RKhfQM5`JU#@~wYt;)oG1xP9|Mf9drqmC3My&GqK#yyTV^8;Ws zb|FI@LJ-!PFb!DTrJ0Rgc}PEIm?=RxVE#bDVAjr&p4_^ zbz|ahT>AYQ-o(5tB}~tC%uP!}L%0V*bj!S@vh=@vRJvNG%W0g+dt%cb7+S~SyB^of z5WlMs1e#%=VHBl2inH%^=3J|Itqdw61oR+2@eKOlnx|#O@(ZLE&terv4*QplV&zy; z12E3-t&)1#vHOS|JkcYQ5E8l;q8b{;NgbX?D=O=xAKtkAy;ahW>$qaDRyOV2B)hk4 zlRIy?QN}g5$*XH$k*O2gc$>Uy@x>8;y@F9dFUagBWN-anPiFFYr6 z@l0_VZ{DBiMsyAsx2r2^5HcD$WSl~HH{$DT;5(W<8o~mhahrYQzc8`yIv%9ZmxS&8_qB#Y+q&CWi55Uk*WrCF5yz?L{;P1|25%gBxng z7n}6n;Yq_b2XaCjoL67IRHzL!>_B)=^lZpI;^_+^Or?9cvM})xkpsB@o{ng6_FW$QF1n&Wsxw_(}n+#=?a-NZE&!ZX!`HoQ%bPn0_g;ROq z9148PiQ+=_&w^Nw`Yg|Nsn>$b;u{e=k9Ce`uPXdiFTGpWJiUSk5WT8@^G`IlAxhkJ z$S+Ei8C6DJP`yJ|j;X4z#XLfYz%RN&$;Lo&Pzh-gZ9t$H-b~1ok{L}uSLdjDcaicc>*e59x|SIKexbDana zTq~$OBhV+(JWXqTj1WdxC^S5wjIf**Rfq?1)4HeW&$d3={Iw7G$m(aIanWmL zn9ikf()D4;&&%elaXK4COC1xNlXI~y*so&c6pNQNR%u%6V;YzCzi9kf;NT%eFjtK~ z4af4hMN8$hJEd3`TYYOAfHlT;-r4bE6t-L0avR2=&X7AaJTj#hj)UfhTYEY4e2cYI z8TtB>kAFURsd9-Q^2(=2$QL;9XV8a7GyZCha20gqjbYB{i>FeB(F>v$hO>DM?Q%u) zELk~rs??SHEe!T0-3QcZEWPy7OK|3D3%o4bU~^FQH$lPDH<0D6tu1obU3bc1gav+j%^LL< zWte34hkc>JnZ|D#1}7uDGiBd!{dKA@$0I9En9vTK)o7~FzN}xrUcG8)*yR}UhcAuE zG-Q(JEw|jPhUHgYeN{bn=?Tr$-acOC5o=Dgeh!z{g|sTV!8xty5B;@m>^KTNGK-o6d%gC6EI?5|zBR{3{x z!xsi);*$?$P#2CF4eZxkeWkqp?YFBDoBh%hj1zIW-ahbwdt}b++49)qkE=nN9?>+A z+x(J_^Gkesu+#W^`DK^NO*h}DM&x{R>;wj%)=7e>hvxW5uRS&yjCpcuNu{u8&=lA4 zQxQh1h`wSl)4_{Z6fewB9P^+hf$QLre!d!IS-AO-V}ZIxs9HrG!fQ=fB9${Pm#UeU z>6yP$H&)lSq60|{zPRq9M470vo$Ely3x2Hla*`y<9?xZ%eH3gJ#JoYFaGOe3ck}AY#+bPu_X-*;z0tBC#@2nOC(Frxe2?P= zrxQmG0Nj$3yXvKhxweCN>z<#+D9 zQzndSl{GNf4tCK z$TEkdX8x5@*EJ-&U)dx}=FF4Feum>eaLmLY?)$ZM4bn8G35MSWIdJT_wBh-O&cAp# zc7H5VSq^15>4f{bYbTNWVlgzk)JPtt5S}g@-f4K`7EG!m)MAe0<|LUDp7fw4#I0SU zBSiH_P7h!jfhXPi5riSWDG{oecuX`Hp4t7noQB7&(YY4)IoN#)ZO=r@FKQ#Q*VSOA zv(_`(2fFRWMn^$%7pmDaO7SzkIs8(*dynppbho)8O)orjU;orJMJK_fAV@615fRi_k7R+eFaN!2an}>ZM)3AT}h(ervG~^o&KuD91?=bL+dOTym z0BkB-PBIk-P@%oKAZ%z59bbEx1Do-4TUxo+L1=GQ-U;JRm) zp^rUJaQRnGSge0F7k?1m!MmlO#^Be!2@l~l8I&I6E})=2OG?npB87#CdZ$3tHj7gP zV<&xzN(KY380L}4U)!S=MY8@IFU=J<0Vzvm{j;6&1`MjjB!>Oni5Hq5`?r1a%O9Ve zpCmn&`7yQS_@O>|_+R!7gB3TQID(_n{_TLQx^a9AEL18{p9HHcTFzM(JS5DAlMf!! zma9CRj>XF1^31sw2+IN%%d|+mP((gG(yWT1Ax=0KAx)ZJIqRWJ@-4Pc<)-L7wki^a*D;v8ka2EaEy#bkJ|_bEG!#RIyW54gZ6SqC=OT`TP*KRaIsR)B_6Hp zrG{=Uq#t>i0oWE!da)S15TB8@rDctjPns@E=h2dtmL1l!^a$Hg=0lr$Dd1NtjlKHo zm4+;AWO38Y8GwPv_5eoX>LeIVu5FzsSK_Qd8h>d@R)!hZXHsklcky%|e4WPHMK~{Z z@}x-!-Fu~;*Gg~GLx&Ej$0-eKV_-;|JY}*P;Fcr2@Jx7-(({*wwtR_g7c5*L6JZ3r z>dGr*?aQws9Q0Ng1L+Yupgdi-7Z?R5C%q^8!>mtKWY^K06+jqL_t&zyjGTJ z$Z38-aco+eo7HPIpPV$D{h2Xix*Bz_hEeei7?rm|F3;zs_b3g6?eMIf16fNJFNTNh zG&OG40-pH*3;{Gq(!2Kd+i%r#lV5)MWj$AT|AGB51b3+cmgglem_J`u;9O;fULJtQ z4voR{=FP>~68J%a{xo2da|*_hM(QxtVyv!w+Z8zbb_&8b!dQ%X=X#-@v*7tk-b5BnVr%sXO2t&?ui90$vFb`vO&W(RU ze*n3rXjHxxMsD)ojx&na!84g*#*ZF7F5S?Ly6`;b8PliZ9As=%FS#|9OaJ)6RjCUTA6&1# z9D1rcEVrqII1s`21{o*;K3!f>o8c7}-W$m5T%@$jbbUA-bSzw-h^odF9j^j}hMvNs zXk({M_|SWc=8m7i{V*z!>=ceXWNl?dB7z6#J&TnDf?`FeEEvy1<*+TpC)`p3o~QsL zszVu;`KNP$C?`WOhF0Oo4}fZVk4VL_-BRCwO6msB$N<7a_g6GXKf)o`4&vNg&^b>; zAS3BB3;AGynz3sT&zF68gnaO4Pf9CZw7PoH5}ZrbAT<>yqz6V{o+&j19KH}Yi0{lg zyzI4N*>ZW}`Jc(cnYZB?6ngZLA6}ZPI)fMa@Jxzx+$#~mp<)2%_Vzb-tvX_5mc5G$}@%`EW92xO!2?`q3p(AO&iZN^V%aD=;B$jC$(Q8jqzko|ji6Y}`oLb?)#;ZQnMo&pMXSNySE^7xPb+9KBve z2}RuZTXf|lCd@R{E-AZ2b0i?fi$Gq6;fENurVUry0-dZqofF^n)hLm>ZYhAW*xt2g zLx501k&2X>3en^!TPpJ;enl-_xq}`a~T$rv<#= z7T#d+ETnb6KCwyQwXv1WhB!G=xAF<)Z{8Ys2J?@`U>bpYp8P8rI=Lq%Qp996w?;Wh zS-Cj4R-r%+76GwJN)}gHa>>E)sW(Z3GLLa0XiA8qjar?mDV(77tcu-T!+ZXw1@xSW zpY76ZnRUBYWi}$N4$hP<^;X>1=U$%7!*X=N#VBhy>Ao9$G&HoeS#I7LOE&ucDYvXb z{Ic{YgwM7@G^05e`SeQ5ETmr+kI|ZAlaCf^`k|itMg-~`_=3|wL_jkWUTbju* z^)xN&^tg1!T|B_i&>Q{H0E~xDw)0QV0|q{fbWM2U;>Nax@cf-7Z3q?V9{r$Sp&K-1 zGlgT3*2iHK^-04Ry;JGYNdx6&@CpvSDtQjAd6_aiFTE&3qhCHDG{#PxIKlIsDxC&`!l6|N{2t<0OhKYTrp_s;KZpvx`E<-94mthg|Ue}r{T7+sXcQPf@iih>HkxBk(Ua5NIwFWtPZX>B{ zn^EFv2 zvG|O@HONOwy;p+^qt6Tu!E2XZ#R%hE(LW>uRSoiQk3A#(Rk#PhkXALYABNficobK| zuncbS^zAy+D_w)lGJnn@sm6Eox{Z6~l4S_t5AWkTgp;m-*DnpqLsiIeObI}ExeUfy zXj3&*4Wlo^GeiF~cu^2KjYnjKLwGK#Zki?Y=eNn>Jv(LRQ;*1n?bBsP&tcgBFW(** zfEoI^4$lB%5h5NTW277VYR%2<2xSc~WA4wYLEA=Y#xg%J8CqtplcPxShr&XQtZcbQ1)hG-ktP1Lk4}Ihu&++O zYbQ{}Yb(l1&x)fqEW3^jJHA3ta*9Ws9RFB~YbT!5)vbNUKS^s!_?#TUMme!yi#ROD zsKu3vrKM1(ZgG5z!J=$3^?WO8nzVoHmi95lgJ@~Ea`5<`jZ(R?!!|mX`x*D^OV>IY zbUyufI;wN+0o)-x&c&Yh`Mli*5899Xr`uDbP+B!S)`ii8I_|ixGzMpZedp>+r1dZE z)2Kx3*Jr-;4f&(oH+cxAS==s0&>za8OYVn>T?&od3U}M|3)pA*~w#l^6FE^W$EQDnBO84^7o}I z{wI$1$;(e1&uS_R!+5-iu+a-vwaD0(^VnCdK;H{@(6@4UZSIF7$igdyemMSNdolgu z`Zc_;Og>>fEQd0RDHlsS8sk9OoSbmni`8eOeG6q3!{dCwu{BVvE~7D5#mXKjUMd3T zNZCYm8lgCctuGpr!mFeKm4voHsMjTBcKkFpb zq?dD`uWHVE^oOF-V#5eVxT-RSfDXeyb0cTwvwCK!hRU+Y;%sOC3;=F|ITZz`g4~L;n_)-WTZL2 zpRq8xzIFYw!C!*_#n&HkPz4TAD?y`|gf4XAp^4#iU~DTnQLbHIA+f=;+Ol9FZ7Jm< zcyWx}MjE=9=52bW;j9Pa6OW}Kx<(yV1sP{TkaVmmH`>C>xEuO*BlWrC?AX{R9?{%1 z1K=fS6V;Cr%272cxYh(7K^$LAfbkCAho<>+EI%Y8v0}a9q$vFU}zWw7L%2>Q~I>_~iXHkw2 z-_fBlxfe#~UV6dfyZX*|zgu2@?q{+G$92p{M3@Rif^6t9gy#=|*DsB=gM6mtqpFSv z1yV5h0l%fW6`s7ca$wsYXizQF#!r@-1{^1XXWgxc1ab^7Y4tqLoOgQ<#r9KoNrVV9=cugikXbVYTz?(h!MwbvCo!#w zHEiYvvpj@l;YDl{jbWvTGE`En{E(z6Y={!MM@rMNZgastkVcaq2F{flIiog*kQSY; zdoB?xS5MD#jHUGaF!^y)cF6=HCy9~1*36T4wGD63RSb~hYN*sYBR%^>ds~Q%BMc8FHrJXl<8xi{i>|puw7_K zrExg%vgO9@LgVFf9FuYv+ViFGY+)LeJEl&Q6$@r5FTT*pmp1tvykcQTf`z^8nE<9L z;Snm<6h2c^-;eyK+ak~APecB9AAMf_=>NDor$3a}dE#`A9>%wvIbZa=4`H^MXqf)c zy|k>%PqAI@L4ME94VX#LXzV8?8PQ zW^#?ml)1b9LC0}m8}cDMBdXjCokjvWxVu}v{=c^AvuUaHornA6dtch6dM&%MtyJ;^ z{x|=6hwR^eCIKs^!lC)meS2lY3n%1P|F7A_khrlVCTM?d(%I^Iw)AH+P@JSF1!cdc z9(9M;g zPLe1&6s;yidW0-kM4KpJ`v&2ht1oz$R3p4If7}+8!m%cS7sxPHY6PZ!ih~?w-CiON z{yeH0EC4B6GH(Df{OtevpXILWR^{bA|Lwo49=hC=;bw|$#BlRSKKZvw_cAt(xZ#uD z>@lW=HhoTO5Rw%_*+aL{gwYHJG9E%;;6KNY$q${D9o)g#N*vA! z|1)VF1WJh;qT=u~b4)y*BaCpAR=N2P>f(zo=cg*@X~Mcgv~{AjxMPkHbp;7kQhr+Y zKt~>Y5{^G2pFAvsJ6@FTTEtF1wjbv?cEUIckJldOT}y7xSnc{{8}&5c@>x?Oo4|nT z48y47`-S7h_I|8y`sROvX10Ugj$m@c)axe5ogrZG* z_R1;$Vo-f;J)(FtN-w;fCr-f`#6vIwqo3L*u*yt+yxBLm&Rjn^j%ujIS;aJM6V29* z6?8s`N5-zANQz5XBAEinfuQRU?Z(!~qcskIV)@+o$8<4|Pz<3=hDSQ`4(o~%Eht3? z68qsWwOt<&TpPzmVXTrLX`^Ii%h?c=l{Tm=otG2wu)6CLYnDi9dWBq!LKT8M(=qC& z?+a;lqub*+)jd}*(P8icsVe_miX|I_xi&{QA-*+I7e`^as}=Zkq6#1+^(3N_;DdRX zC^IoV)Fp*v>g#ozKz5w0oi!_`bB9^PXQU80Bo&F)I^~!EVrdz;$Rnz-OtFfSk%w(8 zBN?iz;ghV>zzmo}L4&rjh60l=8ppS)q5RQMoRDEYqj4Pu&zimJR*mwE`H$N4MKebj z4p&%?#zcush|Bq@;|v+9u8p7RZs2ge<6X+u+Nlhec*2p_Ae`C(P!bEEsW#E-$(X)CmiFDH=_c5^DjRUg3eiau&)Pe z(yw~UAzi1xs$Kb{0 z`NlIXE1#SY&v3F}`R21&J&9-h(=`31zr>Pek*J>s9>D$;tb|%`txCBExm+H=c0pKP zXw-|rNz-!?TMCK>DqB7h-O|FTYeL_`3bR#1;qjq~hT!NgT}Oyrgg>4)W};lvHcwVG zO_N51*DHGpbuT;f5iktLvzYlwZx5 z2a{oWK0LyU!AaAH^HTV7N>i3rABk>h3E_HWTS8w>y8Rg;>nqokOX&S4Whl17VaY23Z(T5vvMsvR8^Z;gZMkTw%oZ;84S6b8DMyJ!6s}}1S_Za>$ zxfSi;j)Rr8nG4((GBSTTWVD0@|uY*rx(H13~} zgI`AOhzL~@eB3`(6+&%24*dV@y$QG_$yFX0Z(pijtzCOB)zy+(YVA^MF&ar&YGDlq zAwUugHpti?ATPjtGyZI5hGj5d418cV+rsbx0uR`j#YkZIkc?Sv2}x)}ErC!=E%mH}CRZl~gaPZpMkT$BD?i_vOimM6#E!l^`#FlX7)!8z1Cj zv5hhgRE3JWB=U6(n;VXdSPRIDhd{_{;+jhDGemF^h*B=do?{6ju4JW3}%m zAAdZwu=VpS-ZM0X?W$KVtzt)$9ppKiIFl=y}TT68#9B;SgCQn~A_d z$3Uo+2Z~4mV7yinZ{tQ~?7wzED6Bo1xJV2*~*-&&||2^b&6|+g!8Y0+8pH{AWu@g4QeK0-}Teq6{>#o^7m){8`P4Rb*lN``0|5XtImReJuG)X5ruQNmpTYkx9KpL`zJa>23>dclf3rK-#)Ekp6zB*p63G&-BYqX>VDoN_AL z`75|2o9j#j6CJIlT72f0X2Y?Y7smSRI}q21rE61kDcWe_;L%g#`Eb+e1-%|JJhW@R z_;4Ani9>^UCaJ5=mf7%qsO7CA^uaSuyHT3>KgbWBKi*#t50cI47S|ll_BeX0^cila z^qT%*Yx-k8^^1q;&3UTEH0SX)OwTBFZY#HAI*pHZjmL20F`V&_Q&;KQiQie1&P|Tc z=Nn)JFx~+?$ew+175SJE!G(LfU58&rPC*Nm#>B^dHgLW&P-e*EIzriFzI55F%`YF#FRPrt@(763H{bl=g zfAj7@8!U4#_$s-{!mX97ZUAw6x*z|g-wAKSDhKn2a!h=CKdNNO$6^U?+Gnw+`F&!T zH=kz}9xx=Tm%bDv`r6+kIEUqw~K$%;Kk2pgXB960!bYa#cy^K?0 zQAMIV;taMru^NyFHr|;ao5oX7tHnZ=ZAnUj*I=nJPBOEoLxoWDiU|JJYFNC2gzxl5 z*xp#jdv#Zlti?O+!8qN409M)Z-M*5rHCb5ULpUA01BkC1F`bMDKU_)69cf7D;>Eq& z;Mqo!cA87}kZqlwhpd?Ih670QUPj{fLm&Bz@S>MKFU+qT2(8T)wr=L%DUjn$eFlMZ zO*|JlbcVCQK3-tA6@ z_6FW-jMsDQ-?tLh!9TaKi1z?@unVTGPQx^TF8%9@<9f@0I)6+y(zPe*% z6LLvLVyuA{9@9rogISX$wh2oUZFAXlCR!9hB|a)2{Vn&C^g+eUYE0BulTn(Cn4yxJ zCPzYo6QF*Hki#V<0z_LzM{U*(C7R`d36+$%L@rLh5+Cp;-(yDtSV0w(JO4!?56WA_ zL}N?5u$U@gwMJo8c#3A!SLiK~V#BoPZyfDQ878A@&UN95Qd^7;zx;Ap@F^+;-Q%FnLE;F*s`{%UOMx1 z0|(c+Vdwi`;UPFAjtx6nr8e(;70(bj>8AJ;g%}6e5HqESIwqd$c%VnfxD8GkddKTNFJ-w5RQzR+f_hg&w=-x}<5RpIY+u4Han zsP7ZM{gc>|`n~eEOO-!nv#HKW@^!b|%1kQe7Y=??luK+ov|h7CK))^GyianR?n9KB zlg|(QbRPXsXuao$@w@JcctN7k!f*iroopl^T7-Avk8=Qm{6(3Hs4aS-%2d02728EI zX-tv|h`tPGHdReV?9(K_b4@s7`{b>Q;Tyj1X)0XB*GFv+$*z4y$ZZ-vt7ovg&fodA za~XDwW<$F}TNpP!G?>R|XeWjg=x1-(IQ7%z-I_$4ygtI5`@UpNPZ|rR-lqMmGE~?1 zCjQpRR@oT_SEaYgpDMng>_CAZrz#u6=o^)Hr|b@j&m>cNg$lim&wrf3n=gy+2(u)r*GHH)!UiS3$-_jf`9?WQ2ottK8;9;J-=yNrrg#1HcOmKf zpVKyVhyMrv*Pi?-b^zcP3vyY7CM}q`3a#38kx5hie*kmd`UXa^B#4% zj{N$S)BCl@l8uV$oJ5W4~Ze-u+D9QCKlQ z&7?55iEaUIp}BnM5Xm86#c&7q<__);AHVnG;nEtnXT*Dmv2vJO+U`ekcyVzltYM4j zS?r3#t@*a_j^G8XFlJ%$SK=fs!6YaL_}*jk>NeOmMjCS-)nkp4wKxtM4pIrlT9{RW zsECb0aF!zrF)<`U^spidQ77VL*iYfqgSo<%I#>`rpU?|g&V@uyKp`p+cub|R;9&DP z<1G4}6S8)%DYKxAp6+4uL~uNm#i|gQ!lLh9n4@a(EJhg0z3~Xsq&MwhHCA>?=uyai z<0L+sFb32`4qOT8Mtl}<(WAt&Of*fEqF65o+EuY*meF4YC4?ovyp9r&k60wsR;HZ{ zrqJVR1=BcGao8AD(G1sw$MgDgfSyubaH#h`<;BLjdo{xpLsn}vn-8^oRfKV5OZwDF zb(hCjYydJl)-xxc z8o(xNUDZNrypbCu3p2OuK5Y9&S`s6Hauj(VMpq2)Xk zHY2h@ekWt+elkj)1|_N($m#i%%|$7j?|?RJbNX|JiSJWj*J zc+|Kym22Wl(|%Uj%==!&Q->QzwoWJUP4#-dCUMGbjuW?B*C_2#d>%%|$EV6aJY+Y~ zvUqT!>PA)e`JVuubf71-1$5I9^M6%c>yxm`=V5%ZzEICFCufD-nJK(8jW^un17)}= zCO zoF7zp1B9z`E$Mg>D|`Ku^i1IL9m4;|55FzgyKq^S1Dv-}pv(PcIYK{>gd5`TNDZUf#4hd+K=jv0wge@ryLm`6K`5oBPU| z9@^m3{J(&eyl?xhKPdIj^s!HMh4M@yf8CdUA(Fs4mEA8X@z+hC+O@-5B=Vt>Ul3HS}`v z^fSWD(n{#AUnxoW?lJ}%v&aI3Tt*|FSmTKtsS?*xD*_T!hxBd0)Z*D($;IA8is;+VM~3EsDhssK&36N{*C;dtVT{7Rp+mS7uyLf7bzbR+1>Xt=T`r>zIS8jY#r8p+PH~F(jUQ0qgpzR}q z@PiL0@;$&EBwZJ=0{5O*zdHPnKmDKK6|Z_lSU5Nj8~9T!-89v{TAZkZ+efoZ!Iu?m z8O>F_D@gioqJLA+8J0j_oDcKIkB7Ja43g9;Ov}W>ofh&Y5&wrpTE-hje zF;+fHa(V{7Vf*UX9|;-mTE=f&waX*JDP6{>fmi6PML?8;P6i_4QI$zs->oX35=9r= z2@s-6M?TS2rjt@w0F4fyB3D_KobkE=iqVN-?}VBJq8`DP4`iXNSMJBA%IFpT)pdoDz*uX%s_@ z0r>%omU;&$^TySYV52vg zJS#ezSFTwCxGG$GxEmt^-Oi>=OIdhfU6zTB2In`g3!J(vtl1_YFxqkguua4SN<499 z&)yUG+4|&fg{}L3Cv0zCaLS{tWRgH?2%og5%TC0Eh-&o2jSb`L)guf*i?}pQAsaRP z$*2g7b})n9oYz!`_dHEu+8R|K$32f_on3FEshpRo(|f(+ExuM?Z~hJwW8Vi4PpVJD z_%e*mVSTOQufh%E!!W$G#ZniKI=o5^cO0i*P0!=JFHPkp+0Rz7bKYKgh5BwukwtZ#-7~4J*UY?r| z=az2@uRZq6aBk^XSg3ku&oFWEem99(CI1*5?q}2Y!{$b%{eDXN)0Xjmy4!BOB|PUj z&kk#A#f9+Xi4$Q3TN+l~l&{rjK9XTnKby$;xYRmxoe`>hw!Yf*@$qZoewEH9ay!9e zeW7maPi}|(;~z&xms%Ur^@InIVj)7VZAv{)#F>2hvn(NmLGHDfxUZuLMU`a|8_?6o zpA+Wp`kF9ag54#T?KZkjSZTaoyNt3KNpU zmO(O1#QwK`|6R3ef8?LOIq*|gEKyoVCw`PC>L<0zVO%|2Db3F?<=1}XpAN&mW4v6c zBC|5iPu)^e8e)^Q;xr>3H#kx85{4Pf7EnZ(i^N8uVIRz+AWbwW{<<|Xe^X<<2BvXC zovVN^z4tc?B4ff(AUKkUWLu&EBu$Yf+%86fBT*?n0EST-d02=w{;FDeJQp!6o?9_` zEPowoQb%~9gte5ynQ}Yf!5QI%0w;A#K}|5}Bfumu%2a0^iOIs>7(fOqGj zmc%ddNaix3+s2aGWh6?uA2hdc)_2|kK;StWyLc*CR`${zB!t$H{HVO;`e{_BjFWaaCf-l?CJ36!;gezyz6&rX&=(HumQ*EDd#%J zR}yS!x0$rXDq(mN+UUzP-W}WpGv1Dd-@NN#V-bnz1INPey!+3?pWpjw{1#rq*4Epy zYM8oakX-Jxv4!>atjKk+L(bIng7k^@n8>$&(fShlKZO?$Ge+tU64>bVGy;*fNQ566 zb3}vAQiY6x!aOog91OzJC!v!Qtpu|jiwbFjaFmzxpU(Iq@^RM7n2=~n!5i5XqjN2B z5D9(8O?(p2M(J4ai6CfJlTE48KeT98sqx&CJ^&;3ltRlYMfsu>Jv1!^Ef-*{Rh#l? z>5vS_XI-9(BWLD$|wD@KnYW!Nv0WbHkh1m zfR)4fX7k>HZ^m+cdE5LDITE4S*`gh?9C-GtNbD`n)lwIFIfuhk_G5qw>B|5fBYVGz z<4z_P3$_WfB)$k3Ua2+_5+BD#P6jC8wL|3n_=}o&eKQ?}5xstbr@MI>)FIxvoOJC0 zdl48t0$u#BvE;AJWm6UBeVWQ~niI|62||`He?ZbO!4d0p9+l;1@Awkzy!DdM{=~0^ z&Vzp%P4T2EjFwsjS{1P^=OCLo(V>hFeUtAtw(YtIFxg0e!-1ZP^aH|9Hqq(;v+e20 zXOG+=cvxHBUj}QG(nPLiPK;u1*JONb%&3LP>M9=Nt*VFRuhKCoob`eFJUp)cQO0_h zxD4y-u>9lnzp5X*X@6K--rpwYaaC-Z$ayfb3Gh0=3@fn1EK#AQrI@#;4)!{%4M6jO+`{~ z2(KWEy_zrj*u_do-MUk5`FqJdcrOAw8iCHn6?|{22|U6erzkgyQB)C zTmqP`Nq`Uw3zQj2Z8E80IRa0TMw&FX6=SV3H9C!0=81*+z>ZxR3-|d5swnQA)*#m5hZaE7>DTR;{0qljBS$F*O4^c#Cvq{9m030Gl|aK zP59|zRV>+O@bKs?e&Z14XPQY~)bz6(`AFB5!qy8l&(*Y?;aw(4WztWDdGO9*yXmcs z&G3;AemK1P6<-j}-F`MqFCmSK1TAe~_h|WWhnuUHuY}bLm%`EI{bBaXX4ty28ZINL z+*w%)+lN-d;-SOvpDTQ^3(M>rR{PF`xBm3oU==>YN8M7IeoTe-RwrCpy^6hA55p&n zCqG-}wVO3IRyjo+-E9fe1T2Koj>IF<6h_a*UB9gRpKCx}c$S?lK_{zgCsz_DD zBP~f0Ls2RD#D!cyxnpmQN##pNa;U7Hw0a?C{>An5R-25q8DnmA*T z+8V+PnzdtX%}DO8OmWUge8Ls;g&`Moq)9u24Ht)}$EFQO51|i&CZuoCUu|P7U?iH) zq=_fRI!JQlO#*eYV0AnqDeau!f}y(Y9H7PAviTz3@E}1_x#If(geYw0kG%NH$+UYV zAG9WeC7l}0#qF()vY^-HZO6DMb7b7?&Fj`=l|65u`vJKw}kDdy&<&T z`vX`Fd=Zv-9;v||)8b+eR%Oh`*iZet#E`1cLZH`5)swU(qIEes5i5yMH(zv?~5O9OpnjUyav>z26x0qnRFG z56kam`}ykma(Gg)%JtT@^LRG#dz`q``9XZ%cWdvIy-DgdU;FjXXoGkM(M``VbrYS& z!?+kc$cFJ*UBxfI`N&|!3|M=}danGMw;`n`#{T)A0A{G>v9)69-MxMwM~LM(PXqM3 zST(tD)ww&4Y@N>B*E+r&Une)JkGUL%k1HDRUv93+J4dk19pC$V4yzzucJ!(8?%#t* z(sR|qu9mvK@2V3c8msYrVPPTgbJNkIh2nfn3W`ECx@v#?IeZ);G=tv>wDU5arXEw={7!_IE z?nGN;BeU>k%(-x69au#*Q+U8=_NlK8Gv~fIOz}&-uI~dCHe?XHys3v?qHn2t5nt|| zV_@v@(d0!NTaI$=*k0L-!0tq#!&NGrtWr2jWd^6VkZ?zZr;jCxBT*{lw%M(UOr2`O zsfQb(Q}cKi-cFx`-mx6sA=}I6UL2P2S-ds z&CSiw!h3Kf0gN$|q)c>}zaw#PQ(k+)Bqs9nIS;$w%8gunjSUxstoa{bO{-HG=SZ{fQGsbTgl2Bw1>tc&=~wE?~7 zKl@-r zjsk^0K$MD{M~1Tl4QRhzKC^?EVUa8s%IoDH!qLoybuK@rE-V!8y9&$v3DN zPhP8>##U&?kQBOe%+cl!p9%Z!sM!9Qau$fBqai^3>Pj;Kf3avL(U@y{lkXMnQ@m{# zmpcDtyd$5^b?VmGN|!;Czk5WlG|<*Fk^JP@S{vX~A9wdidl48V0$sdHL$1>}r{w`R z&S6eQImcto3Lh!N;}?ar6A~!FD@*N>{9~T~Q+N&B!Yh6#Y~A;Eyd(I(Cdb5OGt36_ z)2PHn15n#aXJh4ce4FJVy?ushwa;_ zemj#RgClfrWLuLKoTTq{y6W&v`qD(!^LV(Qe&e&+c>TO%{*didN{xhV49LRN#@su` zcw;1hC%p~y=A{r8aHDY&#b2yEJdAFcsQK)Lf~mCINkM{=N{khkIChT_5|V_h-P^8VyHtLBLDP?je@)e>Ye z6NB_Bcki)D|7e3|#Rg#7miy}Q_M`bgUF3;w3J~>6CHO?_^<@Z5abu<|G=20LVg5Pa zfbBc`ykFJ)EsKuSl0QPxx!BD(EY?RF;-BQ86BVgyC^{iyir69v67~|n8k)W1u0&uP zKcFRHVA%(mqcn}VsZ&?{&?y?{tMg1SILQ3w+)nZag0k_XCV-vXH3xgUGO|lIebG0E z2j2R%*5OjzB!;HhVnf@6%?G)r>eWnGJT1zah^fj%4V{!qV$d!~j#>wrYo2a6t4T9h zYHNs)C9|RiPxG+vxZ&YvyVVL;u@Y8(KjK2k#4T6xvam1wNa7axVy>*ECz`~akrlvP zJxBdMONjC zUf7>TqM7gMWqlkwtjsJehkf`gA^W^^ekGjQHy4haJ{i`wx?z5CA#BYrh41~L9}VyP zgFgw|vv}7pRswUBr}65O1-x%~6RYFflDVD*<1mkD5@~FBS#6xxYw`)ZKT9wDvXds zfe@b}!qaodA}d*pB+gQ+$(zHPA8#*^x@;)E8!3ki%v&$Tv+ zc;2K%{p8V;4XeK_Kuin(;179?C(#t4nq}aKzz6?Tw`V9|&Oa?hE&R!d;>D`qj4z5M zc@Q%hah@8RiLp+$OrFRjhX}+8PCn5Q>l3g2$K*UBs8Vh~$FmZ$Q zlBcTJ`A|jchiej-QGM!XcM`NFzBjegZ@il57+2oguzpQar`JC&Jj#5?Wvq|%W!P7Y z4f21~9fSwz9g==yB!CwVgutZjqzazSmy4pGAYS)Qo)lHO>--pW!L5^HU%YJ2=V`v* zlZ31K8TIoy!g<`>I)EEri*pOOF|{35a6&!j@GarxN1qa&zW+ph@|QZ;pFaAdnf_IN zvFOh|8R{@`pF|()y!L$`#;0LpJ}kfYcNo7+&Sbn@-&f;f?Rh+Y5H05&wq0d6KR->U z^~c(IT_;CAFPrmuTCQ{4cI=;2xg8mcXn=6K84~@qu}U$@9j|k);7g)8Yr%pWEz4o< zx!CUc`15nF9c;rhE=xnPgo6DLr_Y4NMa}-|_(^AQU|dp}3R`%3dp1ny0j8vP57>)9 zeFV7uvs^Rdh11VS{X&K;Colz6BR~_VhK+Gh4S^qQTaU*ubun%Er;9B-j3wxR9Ibag^QOj%eK#UP2~+qN%&6B zOTt&4rop>#r;#XTAs@GY-omO{CXTsfv?Y)!t2Z>GSJ4IH$j>dH4<1+voy!-)0)D^F zBEkHjKYO1r-+aeetlXUqGk72HCbo#?Yc-g}?czp%XK^m9uFQn?`3qtHi6i0giDO}t z@(WAh(&bk8zMuHl;oX1!q0oiTTUeGdKf@$2(zNjT;L#J|@zz6O9f|KQlFBpa_cnZ< zn(AUxq_uG6;sx}#BddMUGYKl^2~yi(9=YQE_>H}U(b!nK8aBFEHGK<`4BewTK8!1h zj1~B`HVkP6Mis}l#U*mEpTelSb}Uj2)AhK+|l28u5_52I>N zFx4eo0w8GY002M$Nkl~+*7o5fi*rQJ>)RDa?6q76a7&cS*(~{ zFD7#f48}(raR^Mz)iEB%3`&1~6*ar2sA$LWB_b(O<%!1tt3^rXK=QsaB#Ejjc%(cZ zNDyUlJXELQl;Z3}Eyw=Ww+N|y;eoLJ;K#xyK2l_G*dHiG09AD%F9`{2#=b`LkvER7 z1z(7&E9o~H5GEUqqbg=R&3Jk;3v9uql9Vea9TaaeY>B(ZE{NFhMgUt=LP5Fs@w!CP z7}-d2@WbH^KK!EBheP;Gq)>m4Gkr8O-owiDQCCaaydWg|z9{oW2h!Nb4y3jPjd;TG z_dFoOP@hU+q;c){qOwzi3^1?LkQZ|**}i%{%pW{M@x8JafgO)Phr8{>DadOQr=za# z<-E146elRBsn$|OQ06!ecJ1hKn0$I7^pGkML!AFpi$}x4OTRm8-T%9x^VxSrbyG+98qUr4E(S$WM7As8N)rf za1Dy@IQpw(hYkBq#p6ai|2J{}YLaEri&97Q?Z!v|&&;{-@T{mRJiF>>#vgg`v}NC` z&9En`sc%x(=^p1~_a}4{ANui(K<*H7^92PWU`d)MKc!-ej8xQPAPZ{2@Wc-^Vz zhNta68Rl@Kt5mFiR+HFAe@WIFdB4WF_~*LJ#-!`KkK_34ee0*k$Jomd&i%>hd3#v? zTz=HHw_DrSK7;7xNA;mju1}REaL~8M(hLbw7%p7}On7!-kBne!i?|4H!lVfz!-w;lIvx{?=v=0uhAEzN3im8UQ7G$nrFi*jJy zZeg2gzMccgu~MQvr!7IngT}1D z^l}umzEDX}QxnE-B)i-YFC%9Jt4S~zwSfunIP$VYro^jQPjZ+FP^J>S;RMmDgJkSR zyNxZNv8olxP=0tVl@-0H3D3+T>5F+p+O+(h)axl}Oy;t1{!)fTRt?A1z?wi-yy!wA zmNLsrOJNS%I&WcR?<{twnZqA}+jyAtBky@%=(O75?9;IwbZCbKB!Rb(u%>=lLO6%_ z3?Dq8tAZDn!{*|?Ftu_Z{MDx(2;cL4KNvpw$YZjj!}io1wyDP7IAk-e+2D^TaUGYoj}!U=oS-2keKhHa zWF-+vZIwyPUWiDVHD1zOk@!jQI1gDe1``$@wX88GtMW$GA}t3R%Ll~c1XgxEe+p4* zEY1_Pr)P+HrW`X%2g32ch1I{xQYaV|%Dde}Po0eUWOWl=IS*y|-qSTaWQM})dT*)1 zc`i>^*ye$7`7r^a;0BZ$IxjdU%h$ZLdL)Hp9$ zFfU7UoAfx19gFf-9n*ZTBG%yQWN45ytE2erZLbZ}hn^a?KKZNI6|1`|shV zHb#+Ys=JPFoVbr8oBJ~lo`M#grI7+YaVyX|IEl-6^{cJlY8tuwttSew_guoH{!3k%udQt4;!v zZQT2*siTb}Z}V#u`&E6Z^KlSf{6I&%&iF@)h<`)Ie3OD086#H4;wp)ZNxkqRfD zjK^fHZ9`bJO$oPGo4xb(Vdg~nX0*{8)eZYzrAs_Ax9p~SMA}V5-h>nr(GHUUa`zHg zZmBJNj3Kv-lLUkPgJgIbu4_xH@!guaQ5`^8#fRW?0I+n66PF}Y*dPQ$vKKz zZ=y&e-b}GcP8Q&K&c^FUoZV5>_)r^&cd>R?9|+U=DquVBjgO{TqF!wbIOehg*el8G z=9qf;j>RKi^iRSQ@A#JzpLEVcwW@ap9GLtOCLH25q?td_afuf-=}4$WZ4)M!g_Llk z5>*SYhZ_lNI87|ClTLOrt^nS`)`eGBS7qKYA0mK9}j^)J>2BcH(Sp{Zb6wtI#GL=M|N zBN0p*qJ=hN$&N-=t#GtC0lO9hqp`C|CdM<$8;jP8WXO-d?mNQam;b#oIkvj%R}g3T zAVoZibDwS%zZ{ICux)IxO|G)dY zSW*9g>KhO-GfU@>0@}e zC%PAbW)bMLumFa?r}&_yOke-~1%$kMjkBGF?Fh3rv=WCqQZ_$_n`kf@t4#*}Odq@> z%sulPL;I7z9=5N3M*SmSrJrS_bxYI-iH5gbLPPN(>Rj-=nhSzN~HKnPD)Qd8&$NOu&v%%tjTr>~xA1d1OEgRLGxU5`i>-X8i+A)4476w`d1z0N_h!}QB0g4aKc{3yKR z+8RfGlJjenzL#XOj`(rSNJ-4k3-*PJjC`S-=!pud`YSjbJdJuym*JBS2}qWDG5D_L zABj)<>M*r%B=PkH%nq3hwz{uiLn56_@q*$M-*`(fb;21H9NS1n@MeB{6WfjMy)&#T z;DQzi6#>~GLr#qK{8-dJ96{n>H;;t}2j5mfqg2*R zDv(WT05TN9X@lUE02iC|#S#)CPZB19>Wef}L4AaUQIwMzIM0A~qAT9|Thx?Ai+n7? zhC|fT!Hr9-cg01Wt6JM&z^X1LPSNH{UnV=}x#D(IvT%g`44AM2#ZVMtv~bg;qAZw$6HrH`XL6J+pAVe2G8^AoV?1z0M=4x;kfsFzq$-^87~-txRXc=ziuZ@#V|q<}`0%twPAn+IvP=)R{Eu-8*yM~8;g*S-26 zY|%+`HU%sCpfsZrX|UCiQ7f<)+6*!dNDzg>IP3QdwWuaO=p%pDpvkZEF1F;A-&p(t z*eiPx*ue;NvHBN3Fro$i*5V|LA7VL0Sp=t`O=kQmF@)5-VhKABalV%rd}9#Z^EQFw z`9HOAILzPm55m?%e-Jtk|8aC54$&Sz)}I~+6CqjSw|r4Z&v^7lLcu~Gcmns>$>a)& z!Ey4ulZ1WO>hun}rgBbr9cljh)w#4R3D1$PT_@*Q64;M7r{(RW1i+*wyVp4?Jc=*=M?qt|Q}Qk~zE7>E ztGy0uGu)s5L(@b1A|?x`l$Va*Qd z9?tpe{HU0B(*20n6#(oPu;{uZ`Z@Q zZP(2bsp9-E(a|{iCI2@PVIL2z_%2kMQFV5fD?(PI0_^7o$bE~&J+BL)vUcO6)dH5w z5=0CaYtLW`*?;r6M322p3G9N8H_5HoO*p|s`6Kk&N3~$ zFLx2|*JZ+X4%;Y`cUo4paLed+TJ`IbmbUG4yS*jJUak!0w$J2Y&G!VaA>rBrJdH26 zZ6sP3mlpAkU#Q;JLq<95 zTUo)oj90_e&30H^ITa3{er8xaaeL^Zzne&uUVi+qL;HSwwpPOolHQDz_$nc1%RUSs zKCvW_K52M`F0jbbS1>!8it2ng@&KSS=%067$;4PuSUoE6=AlXpZz2*fIzYo)fUF(4tSQOaH@{U> z@$mTDzZdUBz8B(p7Kpg$RSet7iu^uEq5w!y&9ln~JOQg`4}_UTJQN_?&ByZ@ zi}IvhQ7%sAGYJAyKGK!OqxoR9sHr{}dq(vhsNNunekS`bz4zDg{^$d;qWmVzFBT?& z&wTyA3-|xXmrCM3sWV|9_)x_lkBnVoZjnsd5|HM9!c+ie%sNBm29urs#I})aENoaa z_QFUM@brQ>8bpMIjznN<^J@Cd zp?_Oq{&Dhht`p#Cp--gA>@PV%8rc#uoU2Jjl942lxdWGt*LUIIrh!bAEVC9nU=zQ9KHv}tT65x=IkM(qpb z`q{{7d3zkYJ1IL#>_?I5*N1BvE8iCn=l<6DSclK$KNs7di|2pcg3mnuHg2q0Z0rrM zSiGXCVwYN@?Q&g_Ioo9qcEg-(RpLj%MkpGWW;R;(<)5*N1l~E@x0tHFOp(}+H>c(8 ze)_Gu@&jWS!G212m}b73?}N z7{skg4*i3P<&Q=ADS};9?~!tk^~%6s?NowhaDAC*~;Us@zoa=KvVVt4BL&BGU6k zE87?UDoicDG`6l$MTgB*y5M1RsR}2&bp#W{{WT;sPJZpb2@n1B*UG9!jSnJZq7fmN z1&A5F&=8@FKlz#aPxd}Isxh+J%5i2YTJBRBr`5)47OY*+&8AUU8&2mNcsW<%eCc4< z7;b?qa}Auj6*RAv_y-_2!U{O*7MeP4LxD_qyx_6Se$eJ z84Ux)XXTGQPSW1$VsNxilA!d@Ehcc-cgViK>m`&GCAOM4X z-DAh`C7T{F0goeWc&j6Q77tzA_LjHFcTp}fQk$LgC(R%w>@0n%Ds}iO-Uhht>O(Nq zOldJ|$geV$vigHOPHFJj;6)kT=3YA~TI9N`O#D7crvg0#y0eZX^+8?b-k?i+EPD|c zIs#p+hU&C7u*)-dK;c~EY`5A?;i%b8XG;j1LC$BBG@M-AOh8YYM5+X6wvMk3U#X}- zP9M4xe;1#`meBtZIpC{GfE_(mol=1Mn}$xH#7a)e^kav3C*%1DlVoyiTggNWy;maw zyBV9^u+`5-PRrZ3O)C&%AYD6ZPnpN@#FJN zW;bJFwz%Na|L~TWlE^{MNhoC zap?W}?ez{DgIw>h^4|6!IJY&3e<$dZ@L?xoRMqDypKboxIaMWBg{#tKe4gfEqmNtD zSNe^QsIQ76|G2V}`lvF+k6j~Vj7c=78=uxw_ych6jyGY;=P?qb{Y{h&4$-pY16QRL zcYx3_#7<%+x(LM>YPD0$c&iQ<*nIq#`IL^(0XoVbBHT zww8sU=M^!NtvbiRzrDd#z)vCxe6(OERCPTmb4;#P<=f=6izeQHKm85A7#?O4_#(Ea zq)i0No7UKs4SRYFZeoxSSqs9H_xy6>xr6~j^4B8DZ^<@u%7Z z98)ICuaKk$fPVb}iR-1m7sq$`O2U>Mj)i^Ww#{688Z9AzQebKm7DJhi|1|+i+8Mq zg#(aj9|%ha_J#H%Pln5nJ%)#cE+gTL7+9o`H4Sr zkFL&So2yPAe%o7c9$$_cA`?|+g|dZS$YKTa>PO$1abaBW(8RuHz9!)pPTwWTz$dVR zR@9mjtI26FY6m7A2^lfQBcickII9cc3ds7`huMa~q{%8clSSLWk{W5?fH`Y)(?N+A zR?FW1ufHT5dimdzr27S|lD0W+e0e+JBjD{BoYy8JwGr81C-j6ZSd1<;ytcOWAhin- zg~-bps^2-pvCmJw^T)AO_)Aj)ohyQEB{;chK(7lFFncsY8mm|nj%abg!HkiV$QxTK z!0$l$4QqZy!J=c}b2dbgX&~NUA?U$WL=?G9LoQ)>lP-y(QEGc8z%o1$H;?b0TmIqO z(ze>hI#zA5&7G`MTE$n{fvBJ#t#z-z0pPgpQ{ElCR31 z%>}EQ>Z{UavYzH)qmNsguT~Gz*Obrn?1ayzJFkcJEtem*-L!8_`OJRKpSO)~67^2% zZt7o^4=p?(+*8QduT;?^F6ATp$?p#B#`&cy0teoUtA1sbuo^T$cI=)_9zhh1Ys|3 zf0PQ&6R2C-_(L2qkS$R6-UHk?;(LsvMWC~Wo2T8jE&$;C!?e{oiiS;LpoJ9a+Aw?Z z7Cza12G7WOjcc#W?~9)ZQzx?oaDH9RWv@khr1QUUlu6)ImIRhjY1K}KKa77L?o@A z!q%GTJXicO0E9Ibx(b-GOx$*vyIkX>DEg$K_+88$#~A(1_U}6$)|U2%)*6z}(8ux8*#)bNpTtADuLl?V zc-9JDVfEEmbd2>#-1O4H($>#c|Kj(svi-9(s6|<0!zzvqU=E-wTrvFEulzF-99F@( zBe#Sz-}Fm?=MBrD|K;n$d8`bzZH`4@ub2wEqq*f!wIJ1ro319a>G1S~Btz2@=c1Q2 z-MuO}hZW1Ql=)*!aD-cJKk<(5HH?H%V+@pZBA)*O7i)CmCZ0b@ zMIki?r26#tPV^hv&cE}=kO2NA(aW6__>SQ9``#1nfX^J4+Is}J^d02e9*(vsD#hl0 zj7!qt8&Jm?_!z z`4+7FwRb8P)C#D|j|#Slp(F;-W^wU~t8kuP19zVMi!#OZ)buS)bK|3Q&I_8%GaU4L z11`(C0Y=dB^HTc*8ud^e<)eP7Aj@4OI=J@DF5~qVdu1;II}m|x3#(#f;;M394>&1h zT5=+iCXHBgen&rqEU@tun8-4jiuTQ@*I0$~bO%ck_}m-A)`RZ~-PQY5Uw-Ws{@4fF zv|=$ZKRnHNtnNoMo+fqEzD0K>KIUIP{kh(}-A^{BF)nhA%L%bPj_w+jf*xeo%TB_F zTt|~Qdmn~{b9=+ed;Wg9Jk7&iK8JU@@3}p;>ufglxk~3w;p%)H)?U-Tk;gF=M5) zAbGN~SgozyIgVqqs_WzEYtrK?n@!{f@$7`(JLRkOrOIcs+3&}g$v3U5?Bud__L|7% zx`t`j*&Rkl6|cpyiZ*GS#mMSO>+h#;9Gg`!>ZdRA%gqfxZb^?ZIEU>{h@e2HT**cf z28Y2`7kXw+zAVh%`nT(oza^c8+*nYr8-3N;%_8Za_!Iy57OCQoZ3zH>_}GU6gk8Ob z?Lha+UIcbB0AC%QXYc-{ z@ZiPA!Y2MQ+XA^W4L`9uSg-6lCfp{S+egz!^_^%j4*0gY#r5)RnBE6ncrX0bM=pldPh1Ua_gxIrSCA}5)^`&! zoA5)notC_>`jO(wPNuma4H+AS7)KVXHKxSbht#EWFJ_g>`FCNvUN9I>f{9BX>g1R} zj2~B&hl~Y3VJ4Ly{Hg!VafYz}SzHy2J_$Rv|HhWeb4SjkkDepZj__&!3%;9$S7SgL zOHrGDP%nkGji;Qmk=O8Ai#v3w=c8JRBa?bne1gNl(+Vj<=A&YBKZzBbtCKPzlAs^s zv-S*PXt34O*m|4^S8KDTT(awQ8D3C0@SVMptTh^mhj8?<2S-2A&xA*dTV1c?W98tB z-XQX9Q;#qH7gZjwa=RSMl8)#fab^AGaWlH~MHDzXI-ql%b?h(es9SIX$G#ekILbO2 z6(k&BZ4-w+q&AtfOt4AZ7Y+VS*0^ei zXaFCaccr#;R&X%(XPTc0seD4PQ>R3mP(#j-3FyK@ z;JhC&bM(2YES_W1DEXfmlq%~UCKF7=(E+d4w3vFU4L?p@Whd8Xamn#b zWOJEe+I4n^(Q&PLcREHp)xWAaw$pv7vN?(V?S$Vu<*W6#%4f4_wegNqSJ}z+)t!e; zWOH4^wCn6P)zS1Fz)khl?Ht@xeu8`x&WcXZvq`I3I2c0hKyn5Sc{a2Mya(9(Kcs3e znqbpmbs}WI2wllE^fm|CG>N9Ro9Z*Y*Gv7m==W~=3^JC0(P^>0Yr668%f`W3@e3<3TiM_kNh;b+1@Vnw+r{4sw8TZ3k+BzN5VJp(sV z1UhR^YIiYDWj5M8<-BFVWY)P%x)QamWWqY%dBarsqW~NDM1{&;I(G3c;F;y)SZO(- zCob(|Dp|Qc8kz+D58;uY;X8pJfK!Z%1S~qJZMk_zY7CoJ;48JGc$73+s)@JpOIH{h zM-nksWFhG2iUAD-9c$y`^@upO0mwj$F#J?(p^93eoh}QFO+3WoUENvPMVhC9Ezz{F?t=k4KQG6LG{=M!)L9w>u0DAT#E ziqE{|mkU?LSQLyfSH+%x=a0eM-A0^=7^oS5yDrU@T zCB|V*oN`Uny>AP zf1RAM>wQ9GKyU1|qY{=lCb+qx4sFP`GqbXmVof{dS&$m1l zgXlT`wQ5gt4qVGV=e9@b7j@VtjYm|R^Z_tf>PU~3h#5WUAOeLIKYZ|>1yA|ToPJf9 zIrI!|PwLoXzeaIWK8Q>A_{TK=SSk;VSfx9k#C&|j9IQKXcG4tf8H!cN?2jYKn0!?qUHWi72$ zb_!chcOQFym_GgTDsmY&>6W=aNN-cVL3%)E68Q8t|Cey__kSW>`IEPa1fxR}64zKu zW%`W%83M zxQcgr79a5PO}vl_vvb(CxwQ(?R=8A!v^d!2|PPLhk=?44?OlnxbwE#!r_H^ z*v2-{P=%CpxPUF9*Sp*z8mn@SMB% zj#xb6;~9E=2A-NMsZ0JNulbgg{AGI%eLaCbwJ$zU;v@bf62f<-}h@dOQ~&|OGq?i1uz$WqfjSfyuE%!`a~J=1c1R-3qquD zATlq8vzl}d$F`wZ^Fw=vi!7}A7Y$c&xfBKNni%ONtKO~t?D|df+IR3i- z3yJyOF-cBlI#b6I!!859Bi?i!-tz$7di2k5iPdXANrS{JxhpZ_Nr!6>L((rSn%Irw z4@P~oMl^`LeUqv>j4gnY9cmXG{ewOD+rIK>m_LYzeD=y-1SS{(J}@l5r{vcP6mwGY ztgu?n5E_iQgjbZE2s|GsDZlfD2aTO5Vx&TG9lnCqP%}5Z5Z%OYpbH;1ly<^*%1(6a zAUQ1tw8}Xwd`|ldy@UC?QkDLo&7p| zA5}w>n%Zc}H?#vcfIvRq@-7de=loUeO}_t^gEYZ1sRaoWaEbRFZj8bgFLN9x^_gS> zIG?B!o^RJ|fb)Kh>c}YZpiG^8!;hl3X&=nSApWL&gY;Z0dR+|b@Yl-EVeIC<=j~y1 zHQ~+Yz)st1;?pE}@_seZ$-eUrcPfN|l$gZ8UyoF3OKTP~~NW%vnWBX?$fPq`byWOv}TcL$EUiTYjAWL7` z8?7)qHHUWqVtbUT(FI`CCEzshq9D?7a&8*9p0F&#;n5n`>p z7<*&1TIlRaQRMxRI z?idokC*Sn_r7Zn3SLJ|+#w8(a%0b-Q23jMucbr@Vy7;c|$gYQ&lbCDz_a=Y) z#YxCoKp`f>L`e}L1x-flNbgrACH|` zVDyB)4Sb|?ztixX`KZmjFedhy!Y)|TQoh`PxaaI6N`W?VqLu>(EHTgK9 z>Q4STe3hPlxPCVJ$<@)Qk7ZK+skXt#QS6yazaLk|GuVUO<(Txi4deZ=w(DY8habk5 zYsH)Up0_9ASHCz<%3ePkqx6CLSSID4YO6THP|0@~6r0g-i5A8AM;6IBjct#!_7vXl zbITWpsfFus3uNzaMRbVL%bGFzT50@)Qlce{pj$2B;B#M~B3aPJR-g0xkAQsRJPXG7 z?UkL6fNlTG*=ZlK8s{dbWV-Pou<{8H+bB}W%@LW+iZp^lc~vCK*665tOLhD5r@}U# zx|}+2J4r=x@&)obfTT0y`Elq~-yD{oaZh;s|NF;jJ6&pImvi-Or-Fvvi;_zQ2%cYH z6OcLv(QrwT;$@7Z4kPuj8X?w3w^}b`nG!f@x=VE5!Kk3Sv4Kk+R^FoAc^X?Jw_38L zGo!)8F5ivIcjZn6uDC_A7rERPzE7}z90^*ia-7F55lG-pGl@%M^GK{>wJjFd$~%3z zg8~!AEZkapZS8Vc#P#&{<0r%IhmVK9>U=cp$NPP+Y`39qL6X4d?zkg7eE)sn*5gOQ zp``_RNQWzZ=de}t{-s&u9yZ|+!Fzodur2iJ>T1}6!%Iucp>-A4`~%BjZmSjM@c_`(&-`WB zxcqpS`NRjsX6Nb}-j;JQ0Eu@7uVLLU{??i1TH_E-9)?d05Yyp^tIjCQ5e$YTA`qSg z%LEcc;*-0_r2zv8?NS05D@Luz5K=`%SY4u{QT6R5ygWeOmsz~um)kH~XEuH!9W|nzL{N5$+{C)Blz9(=y=_~L5)o}a&`@zJ|gm_-KGT4&8O!z+b zpZ;06dhhQgHm-I)`E_qi^MzY!KlD>bqI*ZlUDu9y-6lV&4YNnjgw`YXMnnvdD6!vB zs*)kpG@S-h+ir>(BD$blh1v+oIU*O@s(?aBk|Xg#tSN^Q|a3(;!QU1(7I zg{-!VW0aJh^E^56#_z{Uacq%o#oVy=Zq(+~D7O0fTcfvo`O~3$=@W4Z@rus}1IjgB zF`T+(hBVe31Er_Yuu-Y(MM+mwCEqm|L)zbF0u6;jDvAUzsC0faflOLw{YgA1goktD zcan1L9rq$IdIVZm&tvlOyPprq=?4>B3a?fEAMr|(8LY4*LBT}=uWJG{^rz-LZ6q!B zYB)#GJADN214jQlm+)Od`O1Ef;FKGvL8+E88eQ$@GwC~7hP7>d%YCZD=X}>=JNG?r zPr~PZah{aDel|w!!%pZNa~gA*U|fb>2B5E%}u)TxyLh)cK}bU;4Hz-6)8Mnta#XPb+w;lbv)zZCvAiJCZThf zIE@kmuRs0~J&Kw}GTv4rfd)*Ih;ctN{e0eO+w`lS{eFJ$7Ht^+Jg zn}p7Oagy^DMv|S#%*x{u90Q%VE&jxN8sXXfVfO5oPbT@>uP^4qu(kKMMz-p2=;R9j zD3w1fk+(du1;IlZ?RDl}E7pa7`}tvIR7h>y08#?sy|eAvTMz1e>eo z4A?7AhYabz=4EPAp0Xt1fA`6cA~{xGL1re#s&jwGQWk}?zKyDK9xLxo{DWT%`(E%B zNkuyKfe|=SA^_VSZ{0IFav6Q(Ix3Bo7&h2+MsL(sL>iA55Rw-%Cab}`jTN!TlHxtM z3*qJ?^OAt&T%1D&br#z(Pjgi)Qk^qcy~_mf6q23X9(i$oIxJ$_Ysr?7S8(#6M@SIa8!wF2>({nT7_Cx!^ zxkK~ejzjPt_K!`s!b%(O^4+=;_P5t$b+2p_jl}Hs+GbeXLc##o^ed}Rz^5nhN8Uy_ zf9Xj{YELl{jn%&`Y)`#8)k2CJKD94|&gBQgmCt@OT=~pL!p6gY89G<7LUQW@;=uR* zar0;BM9fYfz)EPuae5Y8S7Vj2eU0!W>wyi&8si{0iE$%Xt^;7URiBjeWt%HKg^#?& z$K%wV(g^3LOwuU?9`qwgt-t$I$sD(W)-9)vhkllewTl{d%Pgryyu=}43V>TcuYL5L zDY+}WATt?x=}&()F>-5WCP9sEwyd2PBVc&rqoDLZB0RoCBf)=i#cVse#Z>wSytPei z<5TZWefL{z^Ig5<-FDk~qz#E+CktVCiXq<_Zcn%e?>aaOZhqVvUf8jS-dc{JT=>kZ-;)|YB`=0sgaO=1J zMmhNl4iRHLPGLWGt7r(CTf=XJ?F%21F;`JN*Lj6ew-u|SOq_M5pcfe8^dqsA;3=QS zlZL%0(b=oB*aJmOPy4b*W@^z<9to@odn|PGf5NEhw;1a&@;6ksV~;?3QOcke2#87 z`sn@iuw$PXXm+a}S8qr`^Vl>fbPOyAkJ|urUdp!^COav7dy${e0MozFbS6 zciJ{%xf3z#H%7zKynop)FsjNkc(|XT$Ty9@o3EpCgRKB=I#^9c2)Z~qjD!$I=owjTK=JtoR%Rf5oj(Av47tZ}n`0O^_Jo2-}KeTy+h>mf~QQ2Qq;t4#? z8KncybBG`CwAU|%*~NXCmA&R(1V)cQd-c&c#dMBxs_DtXc^Buc%~P45oV#QJjR5DW zAauq?Bsr=JnWI|$YG6YY2tUc)hyQ1oIrDNn0D{+nj9RGD+@}r?PfBNQV^qD6<9mUR ze&xTyipLj+OaJXBLMN`S)Yuk^HCnuOSfuq@!44WuC>T3yvu1-g0`;aeuQ5r1DbhOf zvJx5A=%?INL~X-PG>iBr24Y()8Bx-7jLC=(eTei@6=}q6V@2%D%2GJAe<_?hwGtk_ zh$XZT3PSnRaJ8(;qN@WiDH;r@pn2uvlsw}`D8kMO;{z|WrVAj!KGHfG!5 z{G$(I#WE7PSPjhg8n0u;a|`_KS-jsD!Nj`du(S`WW|hocax-tn~Sfbv9@(je^lnP|P~ z4L<~$*NyevI2Y!zg49-+Quy-!_*u-2%kf%63}n1AVC(@FQb|;;Ubmyzwat9WbfuNQ z#K)i!T>I$ng`;2c9jXY&S@fapwmcR!BGcm@6(u?0i>*4CWKT=N89<&Ue3_WUvLuHF z+i?-2W7k*<4Ok{}tz1Q-oGY`F15qKXF1ByJ^1fe{t+L6_EvC7Zwy-c1j+b-^PmU8p zaVXEB_}x>4wP19RsN?~BYBm!9ElqhRM=*+I*rF-AV^b0?J&JgJE*EJhWTfY9iX@!L z7rZ<-4!`D~ghMZTvk}Ly&7OtF>hU#CRs-(mbok!iSj=rUdtv(?ERTcom2qC)=+Q*f z%kNE zjo(JApO!vp=c3QCpQ#7Ftzk(d0diclQD&N8i~d~8lG`7)zn=u56MZ%;Zxlkj;QpK|-d_Sf@!IQOX^ zE$8)Z@89MsC{&aekMnTO=iA_0IN%Z29KLaW9dZjeF2AnK=#MxKd_nYXEa~EvpXp}b$V#Gj#lZXbJT%7to>*` z%tIi&uRCSKyR#cMyuF=(oA!aR#XAa%`9MJ+^-hSMr-Z$}$RaqyTg|>0j1^w9Ctul{ z{Pp8W{(i-D_2U^tqdgYWWwl}pytVThe@s`otT%(Gj337#e|%GhH;lY(%du1;I<3^y1#8ms@XZ7AtQu*&l5&!@|07*naRA!SLGf>WDeK)mXOOxKF zFXynG_vvIw3d;cbdP;#4GFEkVm;^rcH}Jd7C4t?k(xW0r6e@E{^EU0Vm@caoTi~r- zR}bO$zUO~MSUCHVaQXLtJY4<2ulHzFm-HqyiPl!w45_1b^${L9m>g;qgn}qzZBgVK zvC|QyHwww5g*U(L=An6`fl&dqLmg=2za$ssI;SXVA*XNv=wJox?4e^}YHl(7ug^ak ze*O<1$4X%Amn_25VFouNJ4lR9W838p{zh2FAAWaW*Ic#Dz<;?P2n7`TypYGtDz`PHOKXLZsyYqQZy(R3Q+6)&iUI?GP za9?=niAV6AcOWb+AH@5I4~ECi^Y4~L+?3r!e7N=uNpNg2ee-R%APKxb-1qUn4C@!x z#7`Y1q$2>l=(g!_010$S0Ixn?j5VXkU|SuBMKL_87Ml`+kNi471*bwfpH#}mv5X^M z8eeOuuq1f*+cw4#S5>Y4`LBkH*s{3z-mK!vaq0)L)&~E*KN{z?DR8mz zj0lV-p3O>(2AbuBG~3iw#HVak<%B9A4&;yO#H6)t5KDfj{^IgV!6cAzDy0V*5xIJC z+tIk1*Gfw08lqI=A&RtJGw!J%sm~%_;o!X!Z-Fqc$>+Pyb}AI~C2L!gb)f?g5JvOj zg!4WpM^voW*<1nJ2!5UZ)LF9O<9(xT8#j~Z`EJGY61VTJd&2Qi-t}t=`_+Zneq7gv z#z5dVOXtz|;F^bbzBMcs(}wJQ*oxo?#6jcW;rSb$%YMxCAsQx(ZLDo>s5g`+)I~qq zmmUc7htKx0yGPoKz~Bh9Rxjv$#NUlmvIR6|80TlaxJhEzlEX6lppz4ke`iWTji(yY zZ#+SR0S~R|Y>jN!s-i#iw@Gn)(}$mn958-EZ9b;*q*0gj&nt5X&touI6AJ)m!)xh* zDbtjDeG>hk zJr>htwPFjrwd?9({I1i{1V1S|b$ZzUI$D)~K3*QqdHd0F-n#Y>zX$77l<0<82S4ePB5X)Ajlu>sAMS)Z!EDWzP)}WEFh7wSN0+>ZUkEA z?~C__^yVZ_1O0Hu#aV}hh1{G5fpeF1DFi^!w(>?wsuC|*6IN|lThusO0=Mu^Q%M4U zLGkdO2_>cp0d-DH%HEKAxB~LXSN=d)K%(XH?-#3qC5Z86UdkAhLI6Xc%PJ-G$yO`T zyo`n5BAiC9aIUzC?Qo_KIuu*bXnH!*2^&Wl7R!mI?n8&6l{wBstdPC*7#>K#s*S~i z;htw72tWJZAC<07Gx3X6z_WNbhy`nb@owFz@cdJ!|9|%01kAGJDi1ulXI55LR#jJ3 zS9e$Mt5(!PQfmPlkYpRdhi!q4u&@DvjQyF-HjEf%Fq`eqjEybE12(pVg@HkXB{A5> z9t2tt5?UJVOD}45b+@{^s%zhJ-{${M#DCwp@$P&1GV@h-Nu5!Z@0>X2KTE`od*6FE zUc|M#rblfA69an(7qIp5m>u3dVpmO$VpTAn8;ob}F0KsQsS8V(WSzAqE?~=LJiqtc z+?pLZa>y3PM(x@gZ?)ZHQ#OBT&PEVt@7TDV#3V81j%|j|*~Kc_8*aS89)9?!O@Gbv zd`oJ;Y-;~*TgFOa!)j#Q#>a0=$I%~n4)HM74^J%GZmiNfee!YqaA(E_@HezHVyn1x zFXPMVFt&%j?W+BD*VGgy{P)|;)K&I-AA8X5J&skb(+6zs^d%b`g1=R)vw!dl*oyhrlV4tM=)eq$@-vtN>r`j0W>S2X29+opCW zc^#W95}wz8^}Xbr)ZP24AN8toiXJrSE4(m`6vEt$n!otmX+CdQw(?n0#ur9Z80kt% zz4E4w&W*|u0dgiv*+xpXles8ea1KWCS&ur^hxcBGXFvao_U)bt*h*2bn7~&2T`pT} zqwgz!`?)w^gSp1@hM$Z4oM8X4g2K=296K(8*74O~f;{)NPY@Fa-2%3O-kAXQ?%R3U zWDjubXJ7q`$4jJV|8j8g6CM6llmnE1)G<)Th^MG_6=L0$WS;)Ah3nJM{=04E)JJS> znUBiIP0@*32`JCX3X?^OEqPl%WuHw%woST?${4?szfSUv#)y8(cu_~crGBHaE+@Xs z^>W7gO7^WWeWmx;<;t(q817fRe)(B%jP)x{^i%dt)G?n@zg~`)OV34~{VY2Z!2Rsa z4f-0xjfF)n>5iifBaI)jIp9>NR^9n98l!HpkAowGP#RwmRC$+_$+NHeQRI6wzP4h! znRwBrY(H~hDdkDp{<>YcZ&w_)P_fqQgZ1?7z18yFq?1hXRqsS2F7m{e^-exEBEK9y zHxhrdSmj+(`rFJgl#Tp(URl^AQ{J)@m7F%12pu}`;^xU;;VuVl%7t-Cd8gR5_O?LP zFRAGW7{BS02PJjY4ORbw4n2RljXv;uNt|K8c3!+Q=o7(?=QhxnY;^a2|B~N|w8QQ6 zz{Y!E>Ecr`!r0_E=NQi8l$;kIvzf)9tnM4tY@l}+&?hI!Ac-qJo+1pVQiYDOpmdB+ z0{>b2N?;lHi^hcL)B6Inly{038`lZ52{~5-^N*{6FMaqoY>iv|DJkXH<~QGThMdQX zrGlb8lBsb~M_Efx4GehP-AnePO4T>nhV^VhxYWGLB?nOY=lA3wT?>=rmP@R1#WQhN zX0X-$^dWoMbFQ(e@rUgE#X;ZRcy$mf3bA~40Ea+$zYMElCl}A#i*MLvcT5f07@lE0 zj_2eao*cHD_D|Y@U4u4-dE$vtK5G%r+eHHV@J!ts4o}+InR$Es*a>^=^nx9mU$)tm zF*|#7#dh6zr(Ju^HGB)Q=U=+f9{cn|HZwG43z*$qoVj3=lLPkT>63QX%qpGFvAi~G^Z2g9_AD%5q8CpVUc<`az5DiI74Kmi+dXKHJo2CoOkzuCJbQRzdE9nk zPv;r5;{mJ?p1?NK2jG9~;92|0Z+*G_*ZZEZ4=!OcdiOz_7#z3R0dC)niE+HH3}G8+ zY#aUfLl0o`dmP(M&tt1=tk7p?b8Bfn0T`GU-a27}qr1_Uvv__g&v6uVvQMtDv-7cv zlWiG7LTIhT`ZBgAAKrV!^@HP6b*y|tn?qEz<}g<{na2rUjSKeS*fr0wsaJeo1z&vf z^NEj1M7~01Cg=iNqEdfUQt!a3My7Qh)WmIa#_;!fAKR$VRW40Fl#}{L2406Uo)_{X z>Yo`H$BU@6qVn8HPaJhk`X-tBB3}oPW1NufWd*k~V@&l)bsd8;_DQPfodo#s%wPKP z31AFdbwm0b1qB4Df9Nl@qv|gP%}rx0&mq+5mvQ6y5HYUT3mr6flMp>ox{#|#n~d29 z)35j*Y^D8oYTKeWVLQrVkQkf>eQ1xzRg8{FbWyBl%Wa>JW92WO&tCN$Shb~e9p!C2 zf@uKJPO(Y7R19jNbKFnT(OhN;!t(=?e3A9JC18>@bk5|@{P3y~PQ)78w#Ze$)9JdJ za@cv@>4DyRfRCQwg^ky|v;}k?!+s&-xMV%)6K(nSu}n3`s3_IsH&UYQM(l{)ifu2k zu(RagRWGuY)7UzmtHr9eg}^RDCsexZSaqkWgrF3q6Fmqo1G`;un7U%E*RJ*SP2C{h zO*+YX!4Mm9kuP=fyH#4o*s8znvM=+F_01f^ro5xiCVe;AR&2ZZ?L}9%pSiG<@+574 z-LBlXD-K(zSnKt{diwU>>P@2fy`WdIz>|Oe9+wj$p^vh-9E#cpIDmwe9e!YaC6#B^ z3gBw?T}LG!3O~T%utasmXQrwH&l~CeDtUbM%U$J%`D*ZOHimpuP6H#KB@K`bvpgR0 zM3V0fJA%PhY&R3Hw26JU(Ofo)FJt#w->x{!=W@pC#dj~5GSAYctoPc_-Efz~C*x`S ziFV7OldhYs@-As7U+c*ki%E0Us^Zc&uL-=1&LVlLg;ym3kyy~d>1WyC_+iLpd@f69m)cj)yGyN>a2MPrReQeaM{L&%zuhikB6zl8TWGmu z8r3n85VVp9rDUQs6i-?m!(c-;>A(az(N#UmOSN0NFnOr1hYA{8ET8x?CK(Ug(8NCb zzQ1_Te)+$jMBFtS8p7(9;UPTFZN_drw8w77MlntnMAbZ)ZjZ zu{IXlB@bh(<{|7Tw79rrgGZ>MBmf+CyKu-%er$@F1Q+hXu)4IlPKV;su*sTD7U^{q_|6TpAm+TlVg@ z{dUO)ANjcbtrx${9{H08?a|o-wlpzN2pb7X>EJK zpp0JgY?~Q)XYxQ;E0oKK$)OSx^wiPU%*WqBwkossPMdhntE)-o=~w=kExhHsDt(Qq zoF{2f^>j)ZksN!HGbQrXcq9OYvLaoVH@^TWhoTKYpP0=08jR+W*A&5tC&S|p8F?9G zNG12WgR4g5T1K{P+d@Gg_bqUXV+;-vPQq@kw7iomOH0ozxAhjoA^~jl5zc2U0TvQYGXCU6P53cc}eJQwu=|iw$FIxdJW9D zEKRn`DIpR@W57E)E8G@f$D^WSC%Yy;IiQ=$9zMzX=P2;WUG_&`?pID($DbR3#rxL+ zc4OI@01o}L!}i<*D~ofO)5H(O@SgAEjDri~ElmcuCVhR-I$#AAgXW2BV!e_2l~vK0Pc6^ z;|oOBqJzGXLD$vcCX|XT+Q|iT?Sv`i-LRefZ$!>7QY>ZMB;ES!<<385xY;&rSB~2i zC-%v9@!i_iP1mpd7=vZAV<1^??NzZwJ9+EYAEj+KY$yM{%K0r(9j3T0LM5pD+hm(h z0z$!cWN^=&_`4$r!A3uIP5*0Z!$v*#m}7FEzMjwWik2Ub|UPl_4oc1B78`U|63psL=rTkFa zx_utC!fLeFsp3nTqaYu6<2iv}?5{rYe*A*}xi+xp7ODG7%iz6wPaV`Ndeb;=3%&2P zzi6Bc=8E9iPrXZrC{cL!lcJo|SDvVoB?TqpNnl6KUF=jUv0W(GeLUi8W0YxhmqRd}B7wWoI3XCFId z$L1EX3Tw?i@zImE=g{>wiV0-wFwHZ>o;dcD-EhYdo7}VCUhu*f+Ku=f!h8PsJvKf* zfj>N>7wd$-_9d^dYYtyyb8|~};_L-`_;&lr-~V%4yX_w2F=eChF~lFS;%@-Y zHXh{rC3|ai5w9sp<~fM>aeiWMI z#}!Ji6)X)PLUPe~W*2oTl`7Z?Tj?YKEoF>R$^>tcmog8Vh0;+*KBnY91c1Qhcu~JA zmQy*1LdQk{d9IAF`=`{+8}O9tIFT-&#cIVoF?;SkZ?^MzKC>4Bm2~8@SblV_tDSVt z>%7Ov_Hr|JU26iE6VEGHDcMwb9;ER>Z4ulJlE=CxjcK1K0Vb`!PBJ%vN41;v77t$` zS=zJVd`&OZv(i8*W@$M?CFkZg)M596oA0r`ul!+*{g)8kD#RpsOD3+Acf-nND^&4B zx8keG7WuDTeB4$~eWpp<>Ibz`l<20MIPg>g>u)}lJSre8sxCmB)@OH(Jp59J`MMvz zG8w++GZmu5DajV~2{-&GiH~;~nV53BotK>+=(PtHXYe@#*ONiMNpRe8X!&2Rqr!hl z2CmY(G=o#LbXm&SBHht!(hdivn@3U$%%<=6amT(?pV zuI_0xo>@wF*ekk7vR({rtFI>MU<8_L;nf&{eS0_JZuG^6#V{S*Bvd!t+Kq>8i zy=+^ITk85By}fVCV|+PccJjGi?2YutMzG3fz4*d$KsNcOtR~L_$=tsxz@k2|>u~$z zFXIFlt5-xR`=?uu!1A_Wy203@-ssXU`t|XTw|u8iZ~_6m{@5>E1-w&sdSEj>u!PmW zYj~a>3x{3$!$_@-NlGceigXa(yre`oOVcHqdi=Sb%4Cr^^66ia6Psc=lV32ZolDxN zfjuV$f_C-v=WOjPZrnVbB_-6#pegZ|wm%$W<~T!m4kRan5C5b0+t|%7NyjBmtP#fJ z((w;Yd_^embl1Y6M!T9U=(9W@jD#ha#f=hMy-G)Q=7T7@NhT?L%N$0Wyc`@Hw*6P% zU_bkvM|`7+#rXvr#jkyzbzrycTbr{9I93xWG)&?K@oZWNn zpv|7V&-M(i*d9!7@5ajK3AAB!4f$inU=UkA4`anIH@HUYZ3KD#-B%3Sjki4u{VlO|lkt_7m?w?yVo~ausl8?|$+)u6!qNo~xe=NzXbD;Mg_KQaGn|9ODyLgQT34 z8+GoN*gB52CRsZQllXjQa#7qhWYMj7={Q;IP06;>%aw55sIa86cdAO3%SXhk?c0x~t)G zUB0Meagrwn-G(wKE58{d9c@xcF~m#SD^2lp62XW+cDUw^zh#Ht_?zvMzr^Wu3N{_t zjbP=ZJtb)_4{h(*D$d&3FLs{%6^iz1r>JyWp-uguTyvaM%|AQvF$V>AL{i~F=4Y7N z^@ZbxmUv@AaUWCHV|SC?_)LEm@FaKT&dW{@tkVPh(ZCAsZ{iaHki2g3k3SDf|Edd_ zf1TuLWARbvh^oq()Gpknmy}9#uy86h12!ieoVW(}9I)NG+AHerYLzYlm>jT|DaW?J z+Z87U?zJnT&1U$rZ82`C+l>G9Y|0oh{(83k)~^@4%yqltUygX4+T3$ny8*lDIyI(? zO_^&)Xh%h-pxx#9GirBGFIwgmb1NGZd~{I-RA!^kc5Ulo8+F;HH1)U?f+=;Cc}Nbs zfc3RhI}rEP>z17DtN`9h_xT>-*ggo)f#_J`K#P1wgUh6NI%Bg*P4RiIHOc$Y1?%~} zoUwb!zl^_LzPnS#d@r{B z#5|p`*^Z|8oyMBWHDDWTqp!+G#;cBPnFgny*SQCU>x{U(nlgTD(|VDCO|1<^@&_94 z^|;u-fu}FxYrK)I2Kmwl;?!IxJypL~f%D z1+S~TJ<2%4*qV6_e)bQI*mIBU!`9Bn?Wx5Xn}?r4O#X6P={2m}y>Rvnp3`_WW|L>_ zx~s3U<0nsI@^-J?iHToME^`I)46f0auwV4b(5PK?V9E~d+iNEtpR;55q0X*R=x5*) zTTov=iSHm6&fDUdr|h&Hu>E`Y+Q+~2fSo#V$@U)_vC%Wf>}!tPU@yDti2ct$_=H^= z*kk(+-C(;%uEI9feAZEF>nc|Ra}vSpOLlN_(f;1IPWz|KeSKHiu?=F1APND;4k|&ljIvo>52SzZN z@Eqgk1QoLNRHboRI~8l1_KLiUa@+2G-}2KA&l=tp zj@``1-&wa(LZVR{Wd*OQ`ZSp#rWEQp)GJZ;-BxF+r7-3}UYJPv9*QEh|t$GSfvPoV?ZLZej7x!ycPkq|fW{;zT5Zpg+WLie?F;6Gz$tH)L8X%j}De7_~ z2LSdk2lu&NuNUe1>!&-*Hq#C1_Re^Q4OOz+30+5T_0c8^UHkK z!)zj*!QHpvGvgdS*UdCrGp2t*0?mC^2U2($N{9BIJ9p0R{rIQsbD#gb9Xn#WEaYX-_&KJgTd&g1ZSg@sFY?i5D|{KRldoQJ z9qqU3pp)Y+@_f^y3*zZhmB+HIU#`ryD~|HtOuVi`B`E2eMaMbD5==V4xKe3w|BFDo zT$g3%jyLfVbJ&D=+lR5}FY;Y|W5OY~+rMCEJMwCtx`kij$?MBJzlCz^%xW?iU*^4z zn`ApTi@J9Dj`{9=+rkT-oe6~=L>x|?7Cx{NOzp8sp;HONFVVt)P`|_84}*#WPUxT;O#lfoaroQF-l|DQ%;_$oK4U9bg%+ z6FlR_Zo0?DFcG|R?g_j2zW>waKG`ryLTuG};91YdxUp|=U|XxN!*LC{M3*@g*YXy3 zYwC)kpiP4%dkJz+F4dJL>Ffg^vOO>Qt2VOti2dYuzQEr7i9fch@!ep0c*%ybf_ENy zj`F#{Im{|1c$YcpyM{?%#2V%^Be4K?c?oy&FsaK_c$0Gtlcvj#nv(zkJL- zb@E9&HGvh*d-m8%o^`j4&ttL!lh4;*cO85V*$pGhc00cHee$vUY;T0uIT^fg^mPfA zUzd)5p*F!f{hEJbE5H4BeT(80+-%P)|DlawA~6Ex?II4cEFg^^4TwgXFPg~uPuKmdaF*qEH2lDHi@df zRJBeK!4E)7>MLj6N6|)9(?mD1$PE+pGgzg~_OR^6j{rFNe&!uN?mtNJ^WRfUeg=J8 zTl`#stGX#lO?KPrB{xZtN%y|;M=LcMjyvgV3i+%FH&_WiJiSnlo^qNk5paT%vNT~_ zAwZ@i<5=N5{mLJ5>X^&@!k}#lt`l^l_;uWMRr7hjCwTqJt2*?aA=+lF7<|V)^+4)@A%LPA-1t@;ssr|NMTYn@|QxKK{1rTC7C88t+y3u@ck7XM6sz zb7bf7F6zo1+NB4$`ge^#1mk2c$EOISK89>sOU-Df>?71HNoj7sQ-uZj~)&A@w zAF~hq>4*FWj@|rlH=MI)&-vej4?a{uhwvHs1uuBMz51KJ!M^#gyxMNPiLiyd5_hsAo;m_cDjlix>F?;VJHkK7UY z%$fjZH*gkSUjj51I(AQ?Xu@-ljCFawN;NpMud*IPH2IJE$ghX(SDYBL8^7K0y5&;p z*6XVh-%Gt)d!zkkV)yDh#(5_4>RZt(u@A~)S=M9D8)?US*nY){`E}zjOT6rqB>IoM z`au*rK8t4nD}bvaT_xxP6LaY1ZZola_0721znf$`62C!2N{1+`@SNkx$yL+h1x2uDi|N^`=wytM58)L)eNL5A((L&X@r9 z9}i(=EXoQdfAJqHfb(?|l|g@QE^m~V z1%FJjiV5S9xp})df65LIU$k2>iF;{g&h9!eWOJARw%I}3KR0JL9-6kf)$?}m#S=C@ zx@I?ztlBqRzh<|L?6sBIb9go|8gcR|`^MXDvycASL-zP1U$SXT3S4*1tu{P_?=S=7 zI6i0(a+|a>_Qn@~-mbodTR#uj{LxR^;;F}4=M7rU-miL?j09Q8s*ZP@?+8Z?h*r7y z-Z$IW_rKi*LzuYa#OwM0@$>1pXP9h7WnHTyeyz?*&WRJvU~EFf@VT^y zfBb_!QOJ1OqWa7`f86$e`@d2OcJK#M?x!(XoL1x(c@SAktTKf-CzwU-H}zd*;t8h4 zu&>5*U(tjU+5Brw0OPAJe&E3J#4kKQZ+)H5A;=E@#GksZe2H6cPhgeoHMe}Q23f#r zX|}tmDBr5H+dxGdYx<-+_Xj`klfFYacTQj*dSmKWZq>}=$FadY`N!jQ?tlCOPr%$^ zF$Oy^2EkV8IF_1VriK&F?6Wix&7+X|D0!j1xa7zuq1`FvkYz$`9OG5oWX@17a-7%d zFO;+YYCf`!ki=A_!4dmo@@rpfl$OwUaszmf~EeuGW3>EjR)Bn_<=Nm zhY{zW>oJkX_ZGJK>#fzw*lI#4FY7%<^{?OVGu@h`ng1#qpNxDGxbjN|K*y%ZUcc4J zbAt~9#N-CQ@N*R~fBn64v#7@dumdwb`*#)3{`Hk!KFTn%e4Md!Gyo}s5a+AwsIOFD zI0iw|{dO{_%w0S+Nr;~#NtHoG$w*~VTHg!jPWesk#U>2<%M?p^Im5E%gD#D;_{F!;kmiSmAqUfi@}O%Uudxkk*kAo{hY%M)Zu|)O#TjHk{8%ztk8wc z)ziD|%*jiBeO+A}v*Cpy+p~Y#P91;P?!IBdMi)-o(!ipvT%5Br*naU8Z@yydy=81M zJw9Z1WY?(Oc>Mtz#~G%u89RI{p2dqkS~&5D%^m$j)pxO%Q-9*sPh3$V)YIw6X@V^rNnom@>Mj>Bt~e1p znpd{&#!6kT?!5TEH@i2Yt0GfSjgd-6M&WD1RN>0vaux8Yx4y12q3O(rf88dY^_P6Y zP%b!8tin~JbJ(`p!UV8%oQUfb-sOC$H3s$4AlGY9mnB2Szko?#ZD+06n)Fqjba?-f z>KV()Emj8S3D$@!c}=oL`3fdqQ-9Yoa|k7_<1qu@l4OeqfqgEgD>Y?TnpU^nnjV1(Qxx@@_O^8KNx~?Mh#&msD6%cb2Jg z7hXEzRH$RgSXGm-{k6%3P;RSO5{fDp)*~;ys1gvSlRw}Eb<-}m8c=>|6nS^D&P##! z_)4PCb@e10f=aux9i=|k%h-a|#*u`gN=h+e9?C^J)ny~vWRv}qbY1D&$!EyVeGsQO z(n%31aVn5YM6TtmmhP{A6q7ufOL~XPeOql zuT%b=;&hX5HizhQD?YYj8*?Dvi!Xn(Ee$tOUoTcK$EX*~CQ@rNQLdzyBj)AssYX=3 z$;6^Y1zClKY-k)ev2P5@z(!mU_cVSYeye;#6MAylDSsKmZyi$9SOp^8ctQmqig4>N ze-6wyr6}XJUpQZu=FZ#b#BLiL#=jTfAlVTWN{^1-#j&}|> z|3^OGzV`C~4;-4L~# z=R37w^By;DxrH1!5j^pNZ}-3X`~S#hKk_zP!gGSX8~r%v!&JlwhuE(#y(Fz+Ky1b5 zaZuGUC|Z0cug#eGM?PUgxW$IfH=7ULL?;I*r-I$%SX zkX^;r$4g6??j0S+yey}EF`~VVSfPs>?n_(-JUD9H7H?r;&c??uMT|+>0Zs)&w`X$9 zMo*nXw!^sQj@c5fv&YV!v6tR?$X;lfE^LX~!!ty*Oo7Zf9Zq;^So95vq zSS>8rnd8g0X95$=SjaX$K5jEu6+D3?4`Ms%+i$qWCicwO)VV=hJU(Rae{$ZQSRAxZ zoSVQz@vi7JB&%@@u3U$@*DTsyT5eNPMtnwyLLZrQ=_A{d(ZWDXwNzOt{dKK zhp)fI1~B=%a`BAK-uI{8v9*5Yd0d@4I@qb7Q;ob&O*9-7;i+oz^ndnU|JV+E|NmoJ z0m=zZPP|^iB=Ew~54U_N8K;PYA8T+@6e0bG39ZN(C_Lg3%Sq)iOzQ5v!dA)3F*^0tt+bCqB-WNwP2ah)gjKjK>|Zt``cW)i(uE_I{p0x; z_*G2y))LD}vj0y1-+$MS`>wmc!#MHFmAhqOJnttpPW>7?3%W6Ehs-flPL`j=>T*6$ zS>~mGx|5Ert%iFBQb&2Bz}C)*(p##xFiN%+BU+@m$#-3z?5JnEroZWjo%&#_vW2qc zKALZWkG&Ag)#xDFI@=-ECLHrQzkJ>=cXVKBrK^rn56gL!M_&3S+9}^o^5mm+-E8tn z8FEW+E*ZdFQwuz6A7_ww1&10p7KaYpZEM`!4ujOMy!-*tAl{Q!@fjcQPx^7^!o}0J z>#DRfKz6=Ec6z{jU}bS0KN7fv?|^uO1;$VM!@D>KTJ^`-O3127V6Re=dy&}0@_Lyj zk99s#PGvkl#0w)o#7aj#mi6S)i^5i6JNk_Nd*y@wn%^WJ9KXg^miXBq|Ds)!F5X1E zR3~uG&%?&{QxIb~ppcb%*{|7Sk3DX0`l+9>KmAbn+$0y5k$&mnN9>1x>?iC$zV&VP zi~s!R?0L`SdpGl9t|WoiU`ZM(@uxOOD4D3_z`4s3uX@HiCfHOl)kWzKJgaR* z7*HP13L`lUvOQ@HLwToC>dJa)r@$HK)k0R9wDm&?=we@M2kl~hv{PNYDCJE&Wh}BI zU&>@BN=#Xz|A4FVEq#{utP4ZF%%}8EOe{_M;3K+rvyfwSAsF@Q3?!RS#~#%~z1=xkt@T-`~H4M|b1r`7i12k7H9~t~;{-+U>kWnp%f9BN4!wdY-pbS4On$TRw|4OSpLtUM~}qowVIlLum}lqJjp4HLh_DI5&~PfTT2IU)$pP{mfz0`85_rY&92cQ8yOqIL@(ZNIK~kamra|)B<&iX{fkM{QzuW^ zq3J0bz@#x{3j-r|9&b}0`r=de&M%MJLxYEG_vC=xwP(oQaQnDDf8@Ab#02dKu;IGYhMB;`AAt*o9TOQ}~_%f6LgudUa{R4qk;Nzi89Ng%$hs@j3g37hGri zm+_oOB=$+{Wc`*;oV5psuE(>0@qFN2=j{l#jb1u)%3gB)BvvC&*po}s_8Xr#X7^qg zw?jAFW{0Py?XSOd%D(MIn5;gCRi2nsSUz{mE_~*X@K%cl9+yR(>GIIg!WDg7g9%Q` zB462t6PZ_qN#F!ZublKd{nqcSp0yiYL>zg)e!wS=OsU#%-B0~G3jm&N?cj*W(ytL z#&evj!u`3w8L$4S^#^nZu-caszXMto8~mTcYw4c`WJtEZaoeBv%P=DPjc2rvF-op` zLw9<>dtm1DW4O3-^>3a4=7$`fMO+2!D}gcji#Lx!=>0+mK1~i&%%24DjH4=z+vd;j z8q*s8G}ugu_K}w_$e0IJUW5^qoK&)sMoc%pv}2tGeX@*QUuKVj#ab&o8U)X#a(;l6 zE5dS}dY2JLnHTj{u2w|xDnXsWdH6I^Mqw_)E*_>-*=Ao;r-7{s!rjH$R~^;Ok0i+m)0HyYNcOX9I_| z2JP04Zn~P29xDCx)kC;#J3iapu3p;S3Bz3Ve%c8W=$>A#w#W8TQX-$15b z4|2!itLMaZxcR;}Mp~a=FPHT_^cS(!d|=PdRMmwfRniY`t4#Bkbg#3olcE(m3m{(O zQZu~24PjDar|k4V*#k>>t|%wW2G*8vY2@u6j2(O&N)y4TV^H}*fjk-P*H7L<%7acr z)rYB{_l&@sO3Ah!Pa{<0ll92g(H(1YLqOy^8f3-ddB3U5n>GVu)9ax(r{73En~QK+ ztT+)de%GsQ*Gs?8Mh@edu_I%)a{LS4z427D?=?2OYroz4?Az?FBeU2wdC`tPdeW{M9kj#y zuu>S?Xb!LpY$I5SJT^LP7x4VwJ^S|CBqpc#EFQ-*g_rHb+?sv%)Uu5qyv}A$J&Cu`L99&1 z&Hu$2yJ|PKh(_B+ruN#$A3b4r-#KMJ_03E6%6qQ2N&Mi4HzF4v|Eyj5+mqX15+D<(on}FT0#Z9h-5``6M_eR09sI7s|@gBr7pxog;=t<0|nks$M*PcAjt? zeW|@{Gberdhb84zAEb8joP&jIagAk3eMWh@=Ce)?IEg4SwdfV`W1U92O{WFlV__yaTzsZJnV@upnxMKO-yMEl}KKtKl*l5>{mn&ja zDts2IUBZYG@4ASSk~IJMITGqa6H_*N!`-(3wZCZl{^~FIir;~1XO?tal?$&%$x%zv z&h>(cR$cJSlj>dz@l}q|Z{#CpJ;$=cWaouPZ1p5=+AXH@v?(nQpI!3&X)AKqrnvlq z_Iy(3^7-xlg?XRo9po-hngqs0HmwBage9+EX>u5YDPPN|PZg)GU>{PRDEaEo zWobONt^>qLMxLdtCuw?(I`N{yc_39lRTl+b7i!nZo>YZc$tjDxFp|km{*&zhe~`Y0 zAFQwPM|AAK^p_@k!AF@-tW(bkVEHNiGj7aFddk=A(xn;u(I5X`?ce>{Tk(0X;fH&K zZDUznT(m#?@JH<mbF%h*O?X)Ziv>J#y#ED@6==~Z~q zPCCkCJ~5Xjx%8s6k2yqMz9~~4pf!ke5{k-i%z-i%Vw&R1R=Q5M?j*lNU$P5+cnsvG zN}PKA(M{mVR=LSvlo23@4n|#+I2FmF59%n_pRkfgN|=0}%)U-)Hp7F+kvooP^X6U7_~9Pb(JxvmgC{ncmQ3gBft|M$@k^tb14`U`j; zFFs6bEOZ%T{Y~O4z#IF7{ULg#rM%sF^($V#{H%986i0MDJoO#0tN3zy^vM(U;Fpi% zCgzCUecO$;Z_i{$d=;vLzfN%~yX|I}C(F+HpZbBXI(DKhP2e!m8&~^=Rlv1X!Fh!+ zWdoyoZE)93!N(@qu6b?JXE(Dx#Y-!PTF!jPaYBuQkN=$)g@7x4lfqXE_$pvdq;n-O zb>O*DK&uEQv1Q!AQ1SlOtzA31ulgQXU0JrdvzS=oxWQJ*1M?@m%|7{yvBlBI!Ivf$ z(%5tvZ%X2(64p&(;yB$T;z)IDzCdue);`<2zSo!5c~H0LBo8PC^<+{;>4FvXNr|Os zyKL~xqS6bc?Y@j6>Ur=_1((3C;eH$3!i?MKi9Pe?Pl-C zAo-}-u#yLbu4mHIUDSD9N{y+io*0Zg9L;=#JRjGQz1Q0AXZ=M?JWfJ8V2kG;xATwQ zZ^!O`(nij&+9W3b2XP%-;d6e6vErQ@LGxOPyjE=lt98%W`0hQp33tiHur>1pwpCtU zTE@=Mm=MR!y$>8cZ*M<3YA5ks;nL70yL#%d{m?B}+h3e`*p@MAJG?rIbA!(k9>S#Y zu${he$xfa*Z{rgaHigedL(q+mjNlo=Yj)<;aeQ9djqN{&?7_23SY5Ct=h2syZqw+a{YPaK7^lxJ|+w(?oc?=z2_~$6# zvuY>q{u};WU~O@H;eY--CW!yA3L!I67L8cZByBZA^^$5#l=7bHWw0irHViV(@6Ao{ zZZf)J@iyoFjQ!xDc)oy1SXm^yWSh=`mPDL9sh+5gn`mzXqS;s7bF2{`i?<{S+SwQK9QpDV2EnucI4lqc`1S)K1{LqLiI=K}zC--*BGrI>?@aT!zv-k{; z&k|bg%T>NU@ylP?aMIUlYg=dzY9HpLKB=ibbSY$fk56Mi4QA+l_-0`mu-V8J0t8BR z@<*;-;HOqfA5unp+H}HE1)aNsy&TWOn%OzPam@Bm6e7@tb&`++T@qIB{_F zJ^js$TR?Lw=&z&_$NlBbTj!k4!OI0^S?q3*~-e z2vZn-^C;gi;*BG21I?R9L)Z#>VrMI8bl6T&56oXU>D$rzc5vJtZvG_pqkR;gojIw- zKd}5T&xu~=Wl4D&hnfK9c&rtURky84udoVQHFdoW?!!%3ZVO#BAqm*>4uz^Vn-WVv z7at{j!}X2&-zYvM#AkXg@_E4@eVcFH8=IbPBc_f>uN!DYr*vGNqtq}#)*;LQuXRVB zYZEu|%Np?bzdUo=md-z63s_0JasjJ%XYd_je$j^VHIl1;`2*0I`6auE=kktEOxohy zqD}4^^Hmrln6zENnE%4*C42ud!?Sv)?AXa;wlaR$UVM0uee-pTHnBQmL-50uA)HX= z_~&Ubzp!itt`#?=cGYwt9Sg;vORI?l3jo8e!FIB)fQJ) z>xm)J?3RnUvxW)IZC!?w{dV z=ZF08xjuik=Z`!2BT%j^AD_ab1a`_Zwg*=6W41X={`wa}OymyWhiksdm!Iib&y)j} zJYFyoF+lmB1C}*X=TkSjo?|lWeSDJlu}Yh=a12K|>nfe()JGlbvZK5kFMYHZo_m5RI#CRwfc!V7U@$hy+%J#9(iI|n(QIg zwV`(Y$Jo)XjHkM&2g)y!k+R5-!Z+agA|D9bUcao?b; z@@ulEj77PpTJvkjvBJwvw6yFbFLALh8_}p+hp+m9xY!r0ck@^3R4*z0uu#rY#z@k( zS8o5zZJ_&A_T6f>KVS3u<#X$Po`DmL5RW zn}Ac-v=kbHElKa(R&0BZa`};8E$z4*J;lCZ(a=h@&ad0mmm7_r_Sem>JIbpg{WUH7sI`cVfKZ>p7FeZH> zIFHTr5i3m$>vMhevCGG2YQ5j)tQ21XJ%ZK11Jk$qU-xWz*5wmFlfIq*-2-Q>;)}{C z)bp{DW?kBdmp@T?N%duH4L$#x^P{OzSsket#Y9m+natDW@u{}0~mB0L>ER{7|JoT8(J^p!H#4~@_FUqw< zCV3STiKfYkh%0SXCsnDpE=ikY!q@wQhl$1e34H3`B+G{|Rl=*=gjAf(egdpJEBo%K zq*Zf!jiJW$;yYvLT4AD@>|D!-wEGySHvV_6q8o6Ou~66{UB11d9o^Q+aQO& z-Bo>j(ln-1xojNA(srVyx3XThb90 zKC@Sozy3KMb=dGno&MP#dh!#~SKIIycHY`4&&VE_J9pex7SqN=PP_SswRLfPx!`F!2^6QF#A&eK%G^4+vyWe9@kD@N(y;G$GE$dQ6dGs%RNr9vPPBtvD`*6C;OUE{DVL<_{MyM@`IS_jBv+lZNhW=hPO?aeXFDX5eWcW} z2q&Jj$xbp+;+jg-N4^OgWyHo3kAwV(0#}U*$x0f1QO6Q}CP{N!gU;QmkD92kqySg= zD9^eL$1i=vy4pmU+U3C`2)uAH_X1K?OZ%e!#JzZw$fXM1nSovPouo6$u6}{p>b8qX_84EbBeqhhL@;|JRz*Jbc&O-Hhcb*{oF7As(tw>Y}2()`P+Z_750`l z{Q$N*#0TWQ7QHd_)oBN3-C}jqb#QmZh*slF{mktJeVaI66~Hax(#;``6T9$`t<7LdIj#ogmlw#= z+XQLiTqc$_8nEHcQL_9B=~GSwV>R%=)D1<#xozGUwX=X!)lPcKS=1v{$0c#otDxSu zvMqt#;>kg`SkXS@DAOuj#uai-1}|bFcmb<}SDw1h(e6dAly+H{-|SY^s;ROg?S_$I zkyq^I!Li*oGJO~m!MEASp2MxrJ5{iT{!zZAD&`_y)N{>-)favU^ZB!(W8c?5v37>7_5USkCmuRKv z52JQf2flRMkd&Ihlvq?xwafTgCCeCyo(5;@;B*TelUy(H(AUw7+dGe8!guthm!wHw zj~5Y2Kmk}+(h(%hX$eSk+`|4;~w`ZLmtH^ce^}SX}_R^;dM$iZZbKhz;(44z~Q~cVgJ% zb5iS?$jRO8pO0{1g|D0h)@ORePM_sT(~mmS_bJ?$+7(tr>ygnJ1CzC%pPLBn)FR|AB50KU++kb<&p{|x$4#ntT{qAqtbyyMHD(bJ6q@614mM_tJi z6XQmkPC8-Mql#71COcvJsf)f!|7AU5OJ3NLmbg%Fd;br*zOu}TrRf+ZP5Z0b(XMGp zgaLK7)A(yy^v=n5lSPad^|VoGYHRcvdD%4423&RAiWn}BeNft#^`>}DGTNyWFuoX3`SSU>|Nf(=?O%T2DLXsQ?QyT{vU2f+&3x+j@QkJl zJtaDZiQjkp(;u;Kefbvm%=iB4!?@`w>n@t@cea2yy=iSl%DP4I+=}D+1EZp>)#-yiX42Rlq*sH;m6PSaBV{_-B_p3qdlOv91mle}nFU_91J9=p}4KqVoP z*TAY!S@>}q8Kuc*jOuKVZd9duX{)+y6=U5b{JFqsBKZ0$PIL0DJnDMI5Dl?wU#xn~ zO@3lL`6TTmkC@2IUzCxL^2leLcWG0sgylBTOON2$v!8yaEj{|t()p(A%A}%V=n;H% zoy-wxX~w8f3=ECh@Z>%l#%>5hST#jj75AHO%9BUY;mWr}5e^E+wT5zn!g)Ri+{Q7q zN_gKAn%8u9nxUR3V*nLw3Gr&ydmR(Jt1FAPf*Zaoi!-)_RX=N}D;;83d6}jIq*@B-wa}-@n*t|H5n%(>CO?$b zb4Z<`Skg0$?0XLxJW8$O}k*ol=Xj4t67cyShStacB`6(`P-l zQS}l-`Bq9glh-iWi)Z@Y^(q^G)~jr2uihWzSy7cyl*f)1A1Sf4m#ujDlrKVnsflZq z&OWLG7~{q`k~5a_Ag`i05l3BFmyA?4;O0)Zp7TppQJTCE66Nt)={mGY*Usp!YHAQh zKS8`@c0IqoQ^VdnY;gMKDpvX|PfPYtdSCF#T@H5dGDw}*k2+cBcPFCp5041oXMBIe z3qIrXv)s<}fUE9(MlgKt?;LjgNZUQ*3gw^O@#6wc@N&`@CxL&)=gFW+VDyatn1MQ; zSv~~QIHX-FS(gT4LthftI*Vpk`6#1q?8r##rQS}UbZ zO_?jW-YlKP?lBk9rTifWCxE%)7nIvVXG*>?mgh@XslEJu{sVvSN9+&(=sgsE#g#j5 zzt!IT2ft^-Z3{g*^<^h{ho)D@w}XBI;u+i~d0=kMK0CW&lS2dcbyI_Oc!c@H!q3R7 z_SoD7`|}G=+6=xYzj)7ecKhUh8}@r9P2;C*lj@@MANd%s)Dg#$#z*Hdq&%Aa^1WjP z&x!XU2>TL#hxonU!&HhKFTvBRbWzrc?-#a{AIe$K=5jn#^<-PMyOP7q%?HqKUK8C> zpI=h!`Z1QQ2<3TE*5&vXCY!6Op?!=K`*hu;I<&v*dC=f=LotIrSN=Zn=Rwd1_NH%2 zKlbT^t3JAThE4!;@|Tmq{VII^?{zPRH=QsIj^mh)d>gcjk2dTk1Z}YuPjnMLyS2M? z*A~A7^tsM>ENtGUOSiu1rt1{2i%k#x^Ok#0+nfIINqhE@DSO%N`)%JOw)j&!JB56j z(J<;b|Kf zJCuz`lvfauRay#FsU;AgQe-CTOW(0Bz7v&S=~<7w^qG49P|s547VRQWEN|`5!X0E= z$lMiQ@P|sOlg%ISU6yq|@eVm<)#NX46j8>TNh>yjZA8cR>^wIN9r}zb3o}?TFoP8X z`G!!sX@oC?{@gHrLBh2<|M?9hYdTTz>Oq22uSUsrE=^6x_vskXJQY^It+Gl6r8u4-@|O&r?fGy7;e7bM># z^>i?HcrGfBB5e=ZNmi!XOB(6@kf(Lax*9{CQ1&9Vf>(72ct9j4Ty_lWsfS!rJB%RKWDn+FpZ2HP> z(*FRqTIXc%=uIzmIxv-URE4OFDe3{h#W-6*NDyLmEEI)45L;S2C^!UbErxT{gZaexIsB?l50v zJ-}Uj=CF$o$3glGKNxoN;SV`E5=r%$o|g^Yhrv51Rd~_o>MZaca$R*Da#8yWK|V(5 zD2(GaB=su7t!G1gfk{b)ld8lhj$$aLXyH%d8tsNDbo}AP!c(c+d;%Dgz5eW9PONb< znDyT7dHw5O{uTSzZ~m29CS~RI-}N_b&z>p!?B_mjAO6U_nApSpmCIN-F23gZ&$YW> z@O;}dHD$l?TfbxH&YkZV@eSYmdi(jG`QJL~+m2^>e7jh-tBPaM=&K#Ggz@_GkFVIj zIlhcZ-Q@Kk4%5H6Y1m$W08AdoT$uAa$3JI3{l)j$(fs_-2~6<+D1P|$bGLnijq14i zIY2)ebBZaNVr=Y{wk)O3B&}Yn^RJS$G4Flf`|Usc+JCG(MZhoo{Lk7QcibLD8{@0^ z>$O$wq5E~(RLh|7%Xln)%}H#1OexNqz3+X0V*mcv{)0dj9UUFDH@)d6?77c*b|tGb zMa-JAo2~{#rIkymxuWXp9z(T*S?k!5S6_%m8TqCXvDBCKCYw&O(zdK;|MO?fj$xPJ zeii=MhZDe8URmSS>zP-uU0*6304y4$sz(`l$s>+@mM_l}gd$w3CBIoFQ>r2_XhlmO zm0}Bwas}lUi?yPW?zlT*ni?hn|!jb*VA{hYaOSA2!6=w zI65D6HFsTnR5;m+O3|qs;0|$nY*q8%crOu#CqhTeU!^iv`Lq3{rE&Z<*JL)Pvnzd-Rw>^ z+133H45IEIh6nuyK;?%kg7F1~gui0-UxKe925tiI>nLv$VgET>!sN^Veyp+cJmA#J z&y?3CJoj`76TrMFjkMgg4hmzTpV>UuGwdwb9nze_W*W{YCSS2S`ihC#vd`_o#wvw zF$7&}bjusB(@H_Imgn?Sj8?sgtI}^$t|N=K9vv@S9XPP>P8-;BbFc;yZE4F^4)VbC z_YUCFH42~A_(MUEJ z0>`PpPn|k#zy0?A(lOAlzwNi}>tFG5d-bcnF<{hAii-XVs5Vvuk;k08oAM>)((bFt zcPU%5-#EE!|NMy+-W90|MD~LZFWW8SgZ8rB^gm!9J^zILBm8jn1a{d`nZtM9fAR1K z?K=E${)cXOaS~T!lGSc)l}@z8CwJ+!J@2Tk_*(2r3WhOQ*6ay9OZs>J%R6!Els?UV z>_>kXm^c9pJ5Nv8n5#R?FIiss4EV|<$QqBk^wF<)IUz1Tf}QKRjyR@ij6jNos%X+e)$I2<+ zn$)-Th<*ZwY#i%l-OUJ)P2{uBMw_f_b56N@$fs!3$$ks8YM0_gUomOL7tOfpf)ee- zH~DOm3BN&F^;~_qOHg z4UX6=rz|Zl+VA}4Z`tFIJ=Qg;7uSPD_=PmnMn@Fz$muf^lPpBh${aLQ2BKe`H4X(Q@z2j z)Wvz)`54HTD1DO8rSew_qJn%`Bn!Uaw>He83g&)OEZJn;7y~&i&%l<<3XzeI3744IEpy-(w{>p%ObyN zgzXCl@R*FXlb<%jiXOiSOFhS9c>m%TPM=UN#%WJo8g0aj(m@Bl=}T@;@iK_*3{9w; zQimJaYfpU8Yz#XVOy8QH5zNN3h^AT+(J0g%BY|kNi#+X!p-foH0;WnfV#GJuMn6q@ z`d0~Ys`#Z$_2^gev!AF!?jtw81b_G;0er6UhX{{;#1`?~;APMi+;nLb7|NDo2?xiU z%NK;;IQ8SLa6U*|Hp)!?s=Dw})Myp3C3U}u=c=qP2TE0!eF~Clk|md^9jQI7!6tlj za^6;S25BnvDV~zDo>08L*KxU)O{0h0O!wt-DNCAMmu{;%uLmt(DZC%D!jCfZV@eqG zlz9;&kmRD$vmSX?f{jADS;p05P}J(IM1N)79d&qdY;L=Jct@b3I!$vxiqvKo;l*KD zUqz|afhg<2r`TFJ4+M?Vq;VI8Jb!ekaP=@8dnghnHdCV-$tYJYk*7@fs3(R6vg#KRxnALA zCpoE#bhMWY6k9!O;+KeCO7aw)Bwok9)Jsm^ExsNt*(5}_9Lg~ku~FB=N15#SgR#K_ zFTkTDwCY!xpiQ1)%9EehQ^$d(HyS72a^ZaP7ixScRG$3B=)-qCjt!se^>M&@l6kYqlkqV_$}tGMEA;{y zei-b+x`GDy^AQ=SWTLc}FH*@%K4MBf+C-fkmwL&8)rW~_=6q?>21o+-O;0{r{sxA2 zW0SK5*mF5)$b}vW>(~bgJ2y9L|M(~VcUxGXkIvJ%Lr*4FGNn{nn?JF#(K~+c=KDbL_LV$=_)5 zW_(xqp&MS*5>>gVtxdT|m(400)|>Dx_bq+IkynxLCYdn3Q26opBE_L!@uKt-<3$YZ zW1MIc`G_g`PB=L(^^!BKz_WihT589nG>&nb_$bS^?vK3kiWtd6%XraFI%4UA1$@=s z=r{5S*^1vORwhpyad)+;x& zUiy8rnCipzW*s!xEzg;a<}IFTY7R&Yka9p)Uz#-7n+8#~l|MmMC#6~2Ni929X0&+4 z0hK5tT10__ZE1Svl!Gjqe059!M#_Qq@)c$B+eAxTj@>O>lbcE=!$`BT3Z)z=&+#0R zU%?-4l=TkXd=FGB1~`uJp3{2vF9t}yf#f%Zoadlv-9YjoLBM1cwp*=U_meolBhY1PN)}-Jd2V}wRXKQO@5-Sc;FnWIFy&R z!qRuCQ#?`@>E(~IXwN!}WWvX|lt~T_6D*^5zS{q2xq9vipAgn|(W_y*X!`XrMPT+( z)jg#g*Leq3FJ%UL>y1!lT^VJjnsySHKwXcCLEW#mNTxL*oxIV+uf?@-peuEZnDI1- zV*2;evQZi}pgN)!N60iS!gqr3F2UY}XZg)xoK!7FO;%A)zD%@LSJW1U*AO*0mJ~ z{-71Beh14{zs2!LKVX0_n6$1zxx!!HWubq*#|f(U6326r4=G{6FDPD!XJLYaeC*Dk zEnGtXLq0O0?^ur5dHE{nf%yw3u})fV>hddHU=Yhx($lPQpSF{ebtX zWOyGM#w74Ez7x2Dauw#3^KHu|+5hf4|6hCHLF}lsPT^L}tslG_?e&nNvLES<3?Wk(u**pEHRHPb5r3Gs`VP} zT9`|?$9jCJQ%tijE?}E|IHARZvu9fF3hqnLaVzN&og{6!#2BskH8-`fCVU5M)sMo_ zQ{-XiriHAAsYTBf8a0*ZN4#jnOC}n18>KN5rQ2#(BX_d+V#=Gjjr%T{tq1M@eey=05Z(2MwPET%OR?38aBX z8U|a%Glx!c>Qp$21Fjm>(o5H=9_-yV)ZL`4%TJ`8FpBMtgMs8hL*cQWt;n1 zVyBV;<7TLPEXqqiG?0vxMRoG>C7wFrqAdEBeMyC(T~mp8=@q}wvD%g!Wf2!`CC`vX z9PL$uxb@9ThPHg6DV?4`9s_`hSe9IT*DorwX0zh3?-K>RNp>^XadE=M-r1P6Z6attg zfAOUT9|Uuj?%M0Tao{+-;5sym=Sc0k>WF`#Op2Y?ucjX0Gs1ku0G|CEZx(U9=mrtT z#h{NBj22OL0tZip%e}%nCq5?*;@QCWnPDG*LXzJ1?r)ywocr85b>Ca{zF+4{=nQ?kzdGlh^PK10x^=7Gdh5PbC112j z@A-NaAW9v_Tj`QU(Ai6G$qz}j*r8ebGi_%#qO#!8yo_xl;ELxUq8P{pZ7440{qg^9 z!VN$M%C#u?xuN2iQZJnwV(Dyh3FDHVSK^V!Kb2HdKWJjdrCQ?Bl0mJRgmSwrvG6_; zmQkKd#|O^{d)aV-T9jFeGnz|Sm!fmaCP`1wMV#9hWTD6mwfW8*OsB#)wnWq84!hUN+I!8=C5{cIQ7@BaS6(&CpOAEr>C@)|+jG zuD;|1FP}cJJU`lbDen075+J-nAQ1VmOT&&k| z5idQ)MVR6L7E2f7)^1#OeMB}N?|#ck4; zKkVfAfK_$wIQ-)ip{&rCbxCKylH)S_^x@+{8Bvd8Vrv@%hV1mU@U*iiPSUNulnt^_ z6a|p1$M#!b#6-SY7k{+ZHgNUm;9s)B|M>JseI}8DIEGv41;H|(wr<^;Uh~?&$o_G0 z+;MnPnw3c&nm26Rn11JFFL8+au$&NNb0xT)PdVk}^rXi>*8Vzoox}TJ-P*N@?@*m~ zxAGg`^0xHsXZ>_K?X){(%E%Y>F5|E!ygD-1xs99aSK-3OS^?MTE9cS`d&Sw$$~R+q znM>2|$FXxujkAzL44o{bovEj>y~0TL0F6qFp&M~iKmQvvP19H#>bxXq*_y<`I7^Ne zuWXQoqA1|cdf6@^WmE_K;_rbwUNa*{OsVxB9FOAa1<6=($NUjLWG79=_3~$Y**_vz zNIj_5_>kZ7guGgRwWDxGjv>8(2b37cHn7l!zux+qBQGKjru}#Xv`i6pxcbov;KS{? z+c1vLgEy-Fe?!&osy;IlFgiXA#ClFT^!<8to*7+8GUN6 zBz(P{O8m;NSlK1TPk-Q&*`%=Ih)%^tpYX!Py72Jz4o1NqsmeC%88dNu`I+WUV4Z#4E?pu9Ko(SQ}OO! z{>VnW^hs9^;Z?8vz4j^|Siy>-c8O0?yo!~bQa+MNul=m&WaR|BB=A|@x-)Gu*e8N>UqyJy!$wnf4rU3`?{l&o#IrdB3|9|z|g?hwA(CV}@~^@((F^H=S$(TuVJ8fInT@SP~R znOO|3sahT>)I!D9+{`!8Ej0*raY_oJ`ZOs#`>wZ+3KXEO%MMvwP_$m1o8HMi(yc^! z-ie`BNDV@uCkh=F+gq-YcElw_IoP3vwsdeNB!M*^h+fBsgit*`*enYdviUw7_T++) zQZ-R#aJxrL-3rGDq2%Q{DJO7*<{~xr6J4sCUmyh;psNULmKHWc*=D(=vm0fjqHS#3 zN)Fn|!Fma#!P{9jh5WVMfLIs_omr%W%vcnA50m!+anYAa3=e(TNoS|!cR4pL zJNfLi@?MX~k8~!8h3F7$HZEGW;>=2o8RDwrSZ8d+N3LjBY>gL({F0GJHc9c0VSp|B znc^g4y!0&b8i+$XH{+$0S78D&O#CV|%8B&gD1#;f`*z=p;8#3TqhygeP%8%aN4&;F z4D7+lO#@`vk7T1c+i7Cy#nQ0qxU^)`Ju$|PW34OJr>cqsl0-(r1%LewsYd1`w%#z8 z+*x4+@9?!JE6|UBJgOKUC;2!LY;|~WZpZh;uHJOY(Me$R${oGz+j&dczk8cK-kay` zcJ8k8cas=3Hh?h>DB~Z82u(g(OtQwprTv(|YFfB2dx^lGA%o0=RUt(V*$W_WM4RFy z=~K>VgU*#{9X|{fv5`OO;+3rx)3On-SohB@JqF*Qw~NT7`rg`@@ukgk>B6_a+aAT- z4;rZPF8_(5HbBN4ww(kHn7I8)JA|VYHrl9j9p}>0Wy^fr)$Xdk1J@1z>Tmuo{l<%b z&Eh=10$El0C|NvDhp+oS*RAay(Jh4)N9U2YVcA@I=J89?CwCl7xY>80h-bjvG;2MY z&dR9vDUT#!Lp-%T#)!UUlW#`Z921OHe&&!ad28~DBeqX`l68Jz;U8)*Lu0r?CS;wz z71XkkNU_=9Iu02OxVUeYHY>iC6ODvnS{teyJ-qnIOP*XW?Vw#HVr8RL9M!rlst?5u z*~u#(C5!Ti)2-by+pX=L)iuS416KSf(f(@at*I~9>pX4^$!!z+-FpYHJqB8XXc0Qs zCX+RgG_c4U2CP&L+5(Af5I{1^>$8T#3fvelV9x-HrAz6R(MevM6q=q#Zg9|@D?0=5hI^ujEQZDdc;C6eVXmo z=8lI|KK_|s*^Z>bi|8MG|3&G>&G>RZP)<5_L;BSxKRW&E=PyZLz2e#d6uuj;Se}ku zw+4Rot)%+RIwkvO&`Y02o|s;|(Kf5D*eGLcZeJYdr9BbXZDY6QIIBpPjB(VpUbQZK zoVyKV#;VbJ=<06N2Nnx`r{UU#815MfNcmJ}&IF^WaOSg@x4hdONE8Fq1u;x zg!3A~Jb&71fw1BN5g+|L$1jwa@GCJ(@G$88`w}M#SFJzMlN??CKhXnx6yU+VyD6WkJCZOpP!IM)> z;As@n$HLao7WV97D15+pk0)T!}lQkH;O-XXf_=ivd#m=)}IwHBtsi z#zmcV7TMG@G1d{?vi9Ye(hecTsXAqCLo5eGrU*(7BA%rHvL1P)*U|#3SlJxQ3E?HY ziw}>DR^j8Kd1vtcEP2;3i`a!TL$=FCOsmK)j#zKuxw?iCum-U^~?J3SXxms*9)dd*deUUGs@md&)X>1lgHavPEPB3dk#tYK|}m!}NP9r{F|J zYy*xuHd)fe+vipGJ@IK-a5kbYw0okDDc*jmHp!W+}M%|pB|3O?&w#Df#pY~ zXQwmxq}x6KyT-j@qTOscR^vhAWXT2`7ckMwyL&nDyX@q1!h~A-o$>mJ>5H^8pwAEI9AZawSeJws~uk^dFqlv+b-O zodiZ#+`$VcfA{U&g7JW@&+~SEe+%dD{vKfZI67Q9mUWt4>X>PR$UGb+KKgRig~OqT z@m%z1Bb;E^n8RGPpP0JLf?>=6uIwYkGd7)L-8Hg%{SkY_UxJMNtxJo8pZkkxjlByva!Z#azuH*qUG5HpxQVt$oH)p@;{3Ec{Tii0!9E1hrk^)9j3o80xi6T$J)jM&Fnoa{xEkuMsC*Qv5mh5wri- z?NdABde)d}{TKa;m93UJU+L3~uj^$y)8FEdEwsO=YD0`I&a4O{d#;yu$Uc^bm>gHO zZ?GA~P#bEy@<_ILjIdhd{OqHNwpUQ?#P;}S=4lnRtL2Nfh=YFg4&c~1M~J?Xcakk) zDFa6vKSNZ4wj1jK( zvmSk+Z5l5nq|e8T*nAYUPR@<-;c4aaW$CRS`s5&v zj^j40O~18Y;3FiIiHEF7n)Wb&Kf)I!koKW%som z7kaE4uqZTHL7$ilOFcf$e{zE3j!goC%O;8ODEd7+)1Gv661d;Xcih_E9k^p)*ESrY zaIr`ij7(xg*u^8P8-4azL5>oP74AcnSW^0*EV)j>;l)rJcs@@3vCw!F^0uq+XymV0 ztV1;@VOn5ODusC_)x34G)z}W@+BAQSk9FmUww7)=c7Hp~<1gXy&}rT2X>RSAjmJaR zjI7r!tTD_OZN#(4rg+KdqaN+7j}>teLmjcr<9pj)yM5FVS8-!o^2wUl)ZdBK6)-6{ar5BRa0L$5|>W% z?3w&-52?^4B~7DyYR#=aq}7%WDf$2`4BF<4JFah zXr(AJ%p^k-3_o0_M-wulcC;NBf;6|HAUE1r*28GUXmV+I00QMT+#yo2F`4pp)x+ys#sEXMZC0F0OD&~AFXv!ZlPr- znx7s1!yKZ7=y>{C$7JgbCtpF}QCxyKLnIl`cZV;>B=1s8@~*(XzwG3*?1v$_6A8&> zD1Wrab`I&J%RV-w^lMIIHtOEyZoLCvFHUyJ%u_^cU(^erQl?>;ho#0Tzx=u0YpX}v z`r{5?f6VhYalV-E_Eo5;>%LL=t&wV`IO-g+y-^pwC)Lns%r@~BNKqUtKWlizGbep* z;@2McEG%VgaMYbfOY?x!&bL@Wna}4^eh$XTTmHF^`x$4TeScFH{(uiZ<_tgbv{QP< zz&y7EPy2y>2>#u-Y{s3yCm+2N*t_!%wcLXraUQ^Vyq&XS1D79in$B^-QGt_jN;{vY z^g-2IW*dN5fA>%pvxe_P?+}{@V)4ON%-N^GS};@!sArwMQpY#ip|){F%w1z<$)*^| zI;Lfp4g2Mi)%bBWCrH^|iMs9X`sWXRI9+$$^%v-l^OYeB+d(%^&?5}g_oLzr)wxHSe6DHV;N}twkXx#~JbF5!FmwxNC zW$B5>E=iZ{o= z`2`2R?(7C{9IzS`+1A@Bh#JkDSt~kn=gr1Ote#{UGc$Z z>q9$>Fw)JK7a3FV$`fORR~})+*Rt2P7$ZLA$i5OHtPI3QU3KwDwlLz744B@5D%!y( zIH`MMgNA^m4lLgROu8eb95`?=eek{SPW$!_Kl=Gm=iVp%r}OWhe&Lm`Pdj!GB#%^h1WR}WKj zD@JW)J?gA0Mv^ub;f5qJbqsARv@6aGzUZ};CSvL$PQ^M^P7+3ER0XMITm%vzH}Du2A(_i z>@>Ij40}JY-4Sa}#TKOH_VL@>U4$a(mrgF$TBYynVi18! zIn;#Eh@p8NkB3e-UxI$XMDUtZ(%hOmP2Lq8;?=6y!k)WSlu5l)*K2$27txrVn9MV= z!iozRqf}n2EPOH1sWFe}ltZ$^@DAZ6c(-S~OPG_uyfgTKJv#a;{x0D>DQqLCgy-X< z)t$Q=+w#%LKP=VOEVC6}waZ|>z=fu!JwUY08EyMq;8AM`cOEW=$QdAFyPr%&_<?W1T1NkY@TVJey8UO5m@s~a!$+QBDZFk3cM90N7Tf)g+O!9KS_6gtb z&y&58yWiHXmm-FGjjR2!%~2;V*2~&D0mpB%1bYu7yQG3+`=T!Ym=wO2jH&a8hj!s* zBfP@zxe0gsek~>bps7_Vcnfl?Y}5GJUadym_B!!2t{NZfImaA-(6#9-TybkW4ls;o z53Libq3-QZ(s4B$U!u65FVElcBWjKfjsrV~=k{hjP689cQGr5%KaMN2 zU_r^Ft&KTzm~PZbLqPYjM^I=P_GBE4c-<-57z|1*y1Nv zIYK*1+lSiBF!~fr9+tZ9*8VbJTKm7z08`pPL*4ek(I?L};iuu`7hYtlOUf=;+lP2) zXUX`9^;KNJM7-&vay;%GECAQ=B+jcKTF=kGMu2gTpR3>k6SB?W|jA z0i2ug1NQ6P3_SwG*T3?m^v$n-b+9GtR^rQ-vKNO zr8-J7`l3$1`Y-CXNj_Jkd^{>JdY`3jF3GPDOfbM~LU6%9h3pC&4EQlaYr8)M>I4gxVK#8Hhjz zSRy zNgPa+HbPiOm4k(U+3I>8XW3BLc2-Eqz*F4-u(M2~Eqv*w}K+F~IdXZuwC;-c2YIBydIcV3s~ z`G>xk<0GOso$Yr8v%@F8__W*9wT}MS`>G3}x_Bhzmz>ewY@hOrE6e8kRG3m7$}a%@ zF^_ag6>-$k{Yy_eC-KiGg*|S5&sMurn3Kc2TbL8XhoF}d>9f&W;yFyu7`JPzx}PrB z6pUKN+jwAqMv&zp|dXCgvU6a;g4`$0-cX?=EQG5T1+vyIBJQ| zUZG!c)36GR`4D4aij_}TO8KI#)?0Ckm2VcF$SXW0IatKywXPoRimULL^yL#Qc*k$K z+gCJ&7d$0gigFh)l<1@0!bJRl9-Cc5l%lrZntGiN@Au`z@7yXp;lxT#T8`N;YQSfN zi%6t~23w5JI=ws|8ai`!kAlV?2Adsic^+pd-091wxLDtE#+T>!OK`};W1)F|2iW|f zgTO9Hd$;59-MGPF<(gxecYvcI%O;oFMEukO&Hjv(p>rvc0LLk`&_?7p82$M*RJ%Dk6qk{jMP@GT$z6R zw_Z{q*Z}cHDOmK&){=2WqQA1^c=N2MKQ+DkJ?~3jzZ9PdGn6lU>C5SgE3Zm-x$~JL z=qk?yl76ipowZJzIMBD~`kM~&SeVU(v+x+|J3)_P_0sutJnjnS>EXf(Gw9gskvk9U zOE>M`oz`PMV&n3aBXn^cB8;5!*&3LW=ayTyZcRIO?6jvvu3WJqtzEY^tzBa?*qK0h zanL+%rHEBrrs;`(Teje??j76l6at(ZuivmPty{Mq8I&*bD2`-N?~&(9jO+YdXTD2% z>$dIqtU8oduUeHhZQ7WY;XTyddc|1j)ABI~vBI;?QrBs#xrBjTs=-*#29tGMtSd0s z%JG9_D#EE=%jg#uC5wEryS2R(w)R$btzUuBKfvEypAuLpRi4W0>k{+SIs?Q}$$dK} z*lv|!v7a=2s~R&I{M|bN%sX}M*H`(LZ;j2^M;aUYa?e4d4}_M^$3WWzu*jk$u?8Y# zt0*CSgF8gP6pEIuID=B-SXY~BpTcC9l)V)POz9u_B^56z9?IHQ*CTdJXB_jXpkAo5 zui3APD_{}aN~v`xO~u_i=qo>QF^2V6h;yEUIBCgW^&;RqqVM0gFJ1h>_v7=7vqbIk zOHcUWw0gy|^q24cFuq_`eNlz*k!}|};GD|JYPD?*5&KJe#1W)?k`|a3ijl3Z)6Tfa z*}^DZ_?A?hWQ?iw<~Xe|rP^Ar;v7-5UX()|vP+6i>rmNcF5|cua$towYqUvc915y) zOOJ8AENf0V7@OnFgu3Xo4V(R1Kq9)8Qtgu@U6rG^|3`m}shc4VV9GuuTaBHpbJe~0 zB_EzJTY>Pbc?qC<9A_AO2F~#@+=j%#$G*p4aR^_8@J(nQ?O}p7(fvdH;cZtZVOU@4eQw&hxVt8V@_jmEvlBtVGd& zF@Wwb*Ok&?#Cs;g&z!1RY!lf}k^v^xwHCEKDn(Q9sv_Pl zjuZg<7F+gCxTTwC1YRuuMDOSnBkJV5#I;PmeMEiK#|^9@-#EhzQaQX2wWcZ*rc_Gq zL;KIHN%CGb&6pW2*d$h$Ja`02`eN|ClZ|U1nw+@zRiWK2Kl8)6%31oKsY_n1Jqpi$ zL&os~((@ql#QLAJYoMlnP1*ka{kqHUSI7f-W6XRpSSM)clDmF;03p^F(W^ zgS^o-by3PqAFM;1gz&LG58l5ePg=GxSY@oBQA)>exUxW5G0w%XeRs3+-bSGM$@P)2 z9QWKgzM1=H#r)b{I%04{jZhQO%oX-COLfYIk=1H!)!bs#Mzs`HHb$GTaZm5KNvt;e zM@0|W&)Fq-Z2n+<%fVbU-oI`w>0cWrGA-D(KJDD$!)Fr6=X@BHrwrqUOoHeNQCv+ zOU_HoI5_Grdw<}!fFHvz+y8r;sQ+hB}vV@UP2u&@plkCqmcok5=7PH1e=x)H5S9HzaApPjA0gEGVkn~2n`zV<8 zcxCG=Icw%ir`c3_FKkPmchkGAwyr<#9umnZ=3?S2hp4n6I)IcjjQ2xkc#-nlyy(ExkRKna7r%L}(#R z?KZz@`S&G``tKh%0gG#H8^FmoboUyqSuU$8CoZoyFlO;RK;YSGk@c=fwV>s;>`Arj z3#uu0&@`I;AdZ!Y-FrMD0{dr%3S!Q0v#2o~YH7>EN3$1NGC+5C47yA{psb49&$zQr zySUrvj9U*aQA0p-M}It2y!=moGFg+d0{W}%Q(vlZFxS20uU%OfOJ6H?uI)k{(E=DD zvmLFdag2`Gc_c!!7h9XE1`QY20fixUKOeN4gr&jOLHw(kHk$aP?7}~-LuJhQU*UB+~fMc0a_6{ zT^w^WX0f>NC*CFJhEVaCYk^+#7menz0I#Xv&xB}wZEn7%GYU~G;o%^j_IK>_WCMF1 z<_AMnJNZRp+cDhWqnif&lUy`P**pZ}b)Gy}YhhdF1a8=Qh)-XTYVGxJ`LIeCFTy7x zzud)9ngBYf_FVach)>MxwnO$>8wh@W5{nG*cRnSv+kbJDYL1SnB|qc8i8X1ftP1bb z}vqZ@1p}H+R&$F89Bxu17A=_+g9hum?mDsZfgb)zUZ616%0ey!A_B z^ThK{8~4@y)T^$4{d@o1Vf;HAQeb=9EOx2xpV9Ple%9R2Yt%xQIYNO+CzUT|bRGYp zM^SF!3za8FtKckI|G%<{vjH`SO^}*H`0686ckg0Om`tdHQuV;@)IFfiIDW4^^=qYL z#mtYLXczZCPxoCy#D>1Ey$I$rq)n^ATuwOtq00i-!KXs3i$ntftwv?K&6PfQr+2*! z;OIxM4IlU3bc9H^26`pP~<6O|zm{^fUFGwC~R=|QZT^f2TD@fV#J_21v?Sdo`gzIubz&Jk+l z-uZRUA;E(_>OULjHE5utdvg?;%OCi!A5}SAVh_5{5mo}?O3Y+>`q9IFj=t-TMaI)@ z(4#80hF65r95s_O6`DSk-Nh@f(yi3grhC<{GC7spWU*3IdiW_)5z`W~!+otRi-*fS zFPmX;A|I_JtxeuJN zFW*aEl$wt{yekJ#^qJ*T=De}*Fcl5~vzTH1rS0t5@Jvi) zB|O^Abz#2~C6DnI4`^OfG4mT2s{xRHnf~?KXo6#}>h;ff-R-*6pF97A0tNdaYT!>5 z_X;)l!~gEMij`se=&;N2%*ViqCkpsqRkn;?Mnigy7rC8$N1+_;IAwi1qSGY#O9Z?@ zwBzW4&~g~Y;j(()uSEnQK-$BpqsrATzns^XWH%HpW>0zmb)!0!GtBu#_I{E_9I$l7q<(EZZ7j;{C~fPZ z3oLOCC-daY<@PM%BwwP5v!s({dBdWCV4Av7f^I4f)wo-_nCuSI_Lm0&oQa_wO!Mgh zw`&CWE;hy`pNNzzaQyJ#_NMOSJn%Nuw3bhMZRf~L|9c~&O>Lov~MiyMrUic61yGtv1-oV@Qxva!$4}; zx_0JgI96MKJ5(@~PHwsT=q;fgp#5RfHe%L!>;Jx&E$eSHR-z>!4=hFXxlWiDuGEPo z!}4+u?&v84f<|pN=&(N)V8k9cVsvZLx2WLuQb}UtEn4?vqkH_}L9e+5+{Wvb01$yA zQbWqZD&Cqa+9$h(W5kXJR_cg^_Q(`Z>||=PmH}4810@Km|KM6N0WARMK_|99#`>pGydrQCK3KTZ#ZB#c#z5r>9rQQw&fkTkF}EtAkden zkO7>!B}|12-f*!|IV}Z-nbu2*z3pL@X6J!XiLd-C#chOr=nHNLo*Vclp~RQY;rm-m z=X(7Zc7f?xdAS@?MwtMaNO^|8{2x+J>fz$N?TAf?T{R5W%n7pVUe>)utv84-5 zzPmw0?8(zPMIW?!Rs(D$@n;6e^T4LJ?<62r>Dj&243BCDB8GGTky&&L;pZ#Mke;MS z3yeMEas9s(`N%F6CcA1GL!%dL0mLH(^{$0g_ z{TjsBST(l>Sp0GJ)UHwaR5^zFz69xqlbc*G_c3b@)IDr@WOdN?dsw<1$FO=(%t@r? zO<{p|tepamz}=<#vKbDZt&?`w{@YMW;ruEPOFosM`1HNnbJfncu!**V_;#;RDZ}B$ z42L(z)JtmB-Hf3I>*7K$i;6r&Dm;5XEIl}-SkGK(@RjOq_|I+SZ(Kp{P{jOL&!Y!m zCntjMKd$L3L3o%H;E1(0Z{u-g6FuraBWd`N>q2`I4u>u}ol)0?(7o&#<*u5LtXA_H zCye5CA!wz3WJx5#ee?#F`zNtBkP6pyFblS&KU>~1wESl5vE{ONFXFttL=QUd&hktM zi~i{IKac9nA+WH!Fjn}6J*oBG16o$$tJaPOslGQ~s=2c=+OZd_8z-{2D>oHZnF>B^ z%m%X$9Y483DzKY%ax&{ZJa{iB4ZPQ^BW9E<01~^u&|B+&yz#6??B-LAQ?y{;o(s5D zkMn>k-&WRxi3o{3zI5A-hlgnD)QNDE)bYGOqs>42D@55NI>{s-{BHgaX>9(3<_gy3 zWUE)Jk~bLo<+ML{I!eP3ydOCz@XWGV~xrk>t= z%qt5_E%Wzau0g_o(@fscd$D1JP8niaJYqQ0~4_dQy>ceSX4yyCZH# z$Eq)10>ky2sSNvcS2{iSVMJnXWmZuNSYGu<3KIV_H4K3m^_^h^WZx`N1# zj$he0TX2MY|Ab#dLwmG%v#etN?nH((6~i61BejtALVl}o=!p*C=-s?gRy5o47rEq! z<^#vNtI@K&ow7Rna%#BWX7DJL!lvICxfy=lqeBq(q{qiFR9G19zezOKw!v08mVuf z;-(~rwx}>Wsf@(#GKf)P@}hd^zFM&N3GqFOmLcA~tOPw-2DM&PqPno{)YlimF?2~j z*`H6l6Gs!Q`7LCPVv|@UzZHCUJwmgF^~n(XWb>%s!DO_2E+#0CQx|Vk?U*thvJom7 z@~Tf#$*PMYM;;3Cph{&xqt3G0AK@WZ_g<{b+Rr|O@v-_xlbQRStRndr_pg!_LKV;R zsmCBcVw|?R+;;Id<~QmN(sHf!^VQ+hrp%7l#MR)X03r%UU`7tT^W5{~^sz!VCA2el z^CIaLGb@$ZR!sLnkFU8l#^H12{BnNGyIH|#cIoJC!*ws$oPMr`L&+_uoFtoU%frMD<1%Eg zMKjnZfNI{Zi(JXC#(VDXdgqh2{K+2_UhPeNkZBS%DlYfFdA4KuM?rOJ6vj@B!Mzr> zcZOEw^N$0*z6~{hc74;bl;GG6+nl`8Xfx=g#;gYI>j zW@sb!P119FU|{Dc>rT_NPnOI@x=o>4<6*VAa@*ogP5d_$yC_ocGdEU#|wU_%-y8*?lIt;$)_jF(u^4!*AJHZz<9= zXo+^ibfFd<-$aJ5eKUQ+H_jx?GW3e4Q3Y)bvSC|xUt6Dlu`s6fRxJRf~p7MM<`H4Z7O6XyJUo9ik z&bTps!i3j&KjrH{&~ukPrb4t-c%nuHwSx@ft|OI&9t>2QAzZh*BdYlw9^i4)w)AQB z&7G2Fdc&+Yd#T66_#ltv2=3oZ&WlvusQ&fAv@s2WN=#EyUj7~1x_vdL+vH7s=IAMY zee6cXo#ThfZKqct-%pnc-fu{!jZs@9C~8*LJ6#|R5*tX8sXC)^2kw4!bso}kvwVUe zX#_~y$nDpzjFNFL;!le65G}5vxO20cqmw=bsP0Tl;3c^E`}THGS$9SQc}C!mj^C%K z(aKC*<<@9_Gh5-0HNhH3go^R}e^)tXfv*E^0Xy~!t(?Pjhr!WwO&56)@LA{YV#BgT z-qN=k(zxG=6=|ywikcjIWA^-ix1Qte$LgZ$Mn)N8{e-p;YYa>d{9ewADlXp$HF0Y5 zh)dUpXyZAp-{5ZiHE}0`gohpJbb=URG95*tsrt8{-@+}xRvK2n* z8l8=V2T)m~vD71P1G)Rz8f}-x05^Ar47o8qUIYz9=m}}d;p)kE{xXd+Up%R;{kEZP zdcw_0-FffS6kv~;#jev!58VxWJ3i~_Ppdva?dcLE9JYI+WX2!3`WO3;oAv)ExS@*M zVTmb=uofJ%}ol4hh4(4QpIGd_kPJJlV zuZ_*v4f1b5PUT+Jl3)H7Mm_~B4LZS{iX!5Ds3Y|6)=ihJlB@atY3+tnaN*Zt~+g$Yj#nLmsdrcar8HXgRWA7%Ai%851+N0ur(uKto=FG3WfX9bO8 zBBXLyabdfiwZmMYzF}6&tA|zyvZbb4W1lFk$HU6eu_ zrUy@-c5jFA+}l`sV3H~GYA^!o?<^=2tZpl!vlg|bv_y9TyZiJRvct=HJ2UvMg=-yL zImxX!NU(!hJ>5sVB04<)c$XCHt9&j7m zXYeXCDuG6Or)q*ZS#nC38#%m~j9r_p7yD=wrJU$~w>D`i*792p@;wq(RlRHsjHH_f z8nJsigpFdUP>;V50KiNy-$*)hoMYHVn_}QR)Qz zQ(6*yTyDvS)%d$&MgKgydq!@{xG4!~Y!>?;Tx>9JB^fQj?{T$*CAwHUTOq&7?{l8t zf@vEM9yl~zKZoY-@0{R<1Ld1eOI)I2bFy69v0J6yO+|8%KMs1=toRR#W7iswhcfnr zX6Zj|-Cq8S8sj%bl=qrxAA*|5c^9tMCB}rW+Jym=t7S*7?LWQwv)s>`4&|4#T-^_* zxU7s#-3P0;LVR|QTW;|!692&tP8Y6D&GIYvJ<{~NY3?G zrzq%zu3ij8Ft94d0tE{Sh6kDsxP4o=?$>qlUly>TW1coa21!cNA`azRn;J5f7mK{_ ztxsq^W59YgRJgcq#K4FUHnBU!jUGL$PU7%wYW61Qh6{T3=-=fD<^9&YR<@km>zz5I z$%q7CX}7+o|LYR^%eo@^j&e6 z-}2r9=eBAeZiSTj>daJ!9iTEz1CA`HRJono-*NFH6!NZ)Z-M8=2J{BC6WfGICiBI6$3GpfQs-69;PVEz-mcLQVol)?5k%V^Dc4r|R zbxH4oP^~0Ni6y>!kg*RdMNkHEPDy?+^EazNm$c5*pTd(NxmFQQ3Bz)G)}1xf8Q-T` z|DFo&A=RWQ=>+gR#ddLx4Sn3{KHq~l&3wYrD;olWmNM?{AJx4!`LMy>cVV#k-9ciS zgq)NaG@mKg8U@9>wmB=XzP6@|ISd)!zu$Tf8R+#N8DrVAf5|Q7A8WE#^plJ2J(VDi zNy|?GcFi6Nd#489H6GuvzCC+m%FEEWoBG0gnds=P2v_T2>7s}ECHo&f(bXYX(@XVV zp$|>8Ar!xAl{|To%x35iVK0U$!@81x8}%~kHRPA*Wy_oDRN~+eZ$4~B8_N8M*&i(& z{YU1NXKz5Kh-oc7dYP`26YRKGRu}$VqawD~6Od%#r_n|=ax#c0(T2|=Vj^kvM3+P2 zJO7>kc6VGbfrcI))vdlgl-*}V5@fk5jx?Rc$5fBzEz&=S4f!`;`4B{+78zZ!2M-Ai z>Cg-yD?`ei8SGcnCtXs%Kl#T0RABBSzE@555qPAm)aV-H-@o@^`q4^n!Yo?~m-yR0 zad*q*=t61dI?U%k&so@EUx^b+#BGy14Fa{b+kj(df#y>Jn>R$fmojN$W8G0_pMMOh zR}LM{j?S7`&aL0W2z4^d(2>lP*SKbsjJ-vvfSSTm4oZzG$h-?zfP;;GXf9Z#*~PTg zK*wbF<%>|Dz>uvR$|I!CYG`nDI zyuw2+wQ1MbFkREtl!0}UDCy?Xn)_)bFU?t;JY)UH+wNwRto$v9x_!NlyZ7o=wnxfG zHJo1N4K_8zUBy{=hH`iA2jzStcZrer8>4zlpU1ze?zh2iI{c*Bk4@j5xuhM^ttkGnoS+FvZ8dLR)?)n2gG-KXp!@f@krz@&?)Qp>O+ zL+B!x<*Y%My9hu}8_!7DrD=$d}1 z1k1>xeN<_{nW1eS{A#C5XL+s(cgZ9Y4svd}meZ1=v3GP$!cC_Dp(<9eyx?dR1XA}Ckepu23Q)vrtGP^j=x@{M^&$_-;4@8dy zblhBU%D%azhWorVYVgw7AC3nm;nV!D(^^g|PJ#k2H@GAK{MX!NH@PR}VRBYgF^NNs zPEom~bjlx;W|%&dK4y}1skzRYo*0T-U=p|fTT5HK&e)-cy^Joxn=5dC>1}v#-8J*> zdHvq!<_7LBzN8{9W6sRwR1N*-i{#@*viYt#gfZYmx?UvX0n?m8Wu&Eb_N+^s>@MS5 z%8q0OWuM$!LBs1`6I<3fORZ^|*HVPL-!%=DNOOX9>Bk7_QmNlM759Z%C+0AwHtMrn z@d3|y+@i7)&ggjnWPCCv>342oX^Ri^75cq3PXe{`U(OL799~ZYZnICi`pY!w0xrfx z;e9%>nAA*X-5Sh%)Os|#sMmS7=bHQyXE`@m<(;@cv-HM!F z8+5|70qtwBbz0Mx6JW;@TSCATfQL_CJyV^rvZciRQI^@!B{RD}EA|bZ9@L>3?rKL$ z=XC`NKg2HIo$M7tV#G2mEHi`_o4N?N*SR~5kJ=jian|9i^T0cRpG$PL+F`iX{k<(h z>y5=K;4iD>|32tVX7X(ovW1Jtz@)~_rDA>k}L|anH?8>qEoW+Oe-2N zYHU)W!l!qdK2rFPi^YeW>~xAdcrT+1I6|vMe?LhkHS(wbpwr%!d##MS^HZ(}?UN5H zk6Dv^XWtFj6yTeopoa)Bok|y#oxFe*n4oLz=@bxI9*%IUGX89| zoaMbf`HhN|YG%?SpRU3}gzF^i_2cQlxyjJ{6NdcNFw z(A{96Ou+TfKjk3vtAw=ch`w&6)2~tvtfF)Mz!*@~7E2S<{lTD?8#SW!J#X{v;aKp( zUT-`2>F~xh-JO3F77KJo=eM}vutU}OL4vyX)MsY+AHX*!jJD~pTF?(UAMWlWyOfvS z0XD{7&F=4qIB%TJ2F#A&t}^QlKOe_vEYY7cbkZ^tU%kp7;6(kAZlGWeeyy0w)(}3m zZ%1!|`h6b8{(PbMDl(p!24CbGttS&&>s#895tX-sLHdWK*%*|X!H2IZSa!a|R-XCD zUGz&+R96o!PI?VodZvC(LpUx>8g2A2%}Dp~!b0ACSFSZ zjK!jMwqtYG*Rb3f-{pPA*0vs^{n=RVV{UiFQ3VT48zf&J_Qj;aFS^87lQh?TjVo7A z@6Tr89PvWqbS;}95pcHsK55x)+=U0>6jb6GZFbXj(k;;})wCgZpg|Q-p84W;^Y-%@ zMhIxh@0)`3;e}mhLuTNOuMhe_s~}8v^{Q$;wYoOV-{F6(8$3;C)weSKr$s5|5`U2z z%5vHM>y=p=E+7k@_3TAVXR`we>2Yf9b7GTw7<`M)Jj%7Z1{RI-&--Z4RMQO$epEqHSF=iC5b|wAkvC9d+VE<+uG=r4o#_UPx1~ztw?r7348$b2` z3q-A2;U$^AHu=h%m&=l&qO6fi^q82yveT3qiOb1eBXUxv1ACD7#*459 z6B^cF*_P`EStkO-_U6(0m{s=FfN3>XB%<_!J`n;59LU%Hrz*zyK?>X);=0$BVtF-f zg>yT>6w-{&8mZsMB9hnM)J#_PNg1((BY*JB>lae%i+ zHKoAjfK7Ulla^*?JCXy zT#AgC%H1udb#sO}yezsy27{F1v<8vT1kLdS2 zCIh)Ji3&6tU>Ne11ix863+1;G!iCLn2WBYDgw4=MMc9HkQOe;a2~AI$9y|hyY(LN| zr6(9d4SLxcuE3&5iw9I$#MvrlFd?slW6zrk1y`1sNb-_l116i!!I^R1qU_|PC0?RD zOVm#g{z;;*$EHQ#1>S$SkoB0EW)fl|70hnB?!+3@n zIF;bdzH_$&|3Vl)0yZ4pz{(08``B-s$qHd5HSRHQP(&Xq9j`c>HzqK^6kKD1^zmb`3KhJ zwmZAalilba-7}(s`X^}F6U4YzO{}ok!SjP#KikHDZX`>^Y}nYD{a|z$vSY~}C9s3<5jgGWQy%m&@6*a@Q-yrJe})wwNx>%KB@y`!&4A^M-}}-YPRVRCFuNd00}PZ^TBVg{D4e(zp#sj7C*(y75ygYq4Nfz zzvkP`(xO~dTkp?D^%k={h8bDU5$|+s?8eG4zu4zx4)T+=tVho%O)a^xI;WrgV=i+p zGlrc|k9fjibmKVs&1>AVK5RBZw7-yCxR+l3E;NTCM)L0W4;)E~dEL<#UD_MYT~!2G zrK81j@A0QJPLXirAATD>-eyLHm_$ftm8+ofU>P)~1fzp~s{D5!pXd-!fg z21a`L-3`AFf$`NAnkWRz|Av&+R5W2wlJ&?FTl1!>6zqicc^S0i$RvEn zfP=!zu*YSs%h%euhRCVs^4+~(hf^E-?f>oHTkpEx@QR8{^JazwVoD!Ii3r@7^l)9s ztb)qTuhpMy9*j&KM}aPS_L?xxtu!p>Gjt+&%l5rEVOB^m{vC(2zUhaYVJBwN(n?K* z$g9zaUX&m}*rS}dk*S>H>pNhz^Uym3;+s?3e5oso@;sdJAvlkvb}XK*eWE!*!ztI| zeSxqmL4^|WS1p>*3lwl_Nzh7YJkjF+k9)?BO;F(=c|MSnYoN?Sc%iIu{fWtyJheBe zJ{`3rB@`tPs;)L4`D4<%Bvi9!WO8+4(~vxSRwV?`>BKHR`!fdLo01OU@>zr2S5m zLAA*xL%JI=r+=c{)hXBdfxhkN%!^hTe{NNN`I#Jf>S)&0o38dXE6iM$l=`EN1gEA{ zdWC#`Q+fy^q=;cUp5!CuaL-uHiPalFRHDExD0NTa?S9ij&8v!>tAC}ZIf4W?5eU)# zo^r|FZ}q->ajHUf0p@vf|EO|0RFIn}=n;1eBWL_TW z3e$dGcx>J|_T})&v$XPAufz=RQj_3@Ab93Nr7cyFtEm6MSsL&>;7-9F%#Essyqeko4p0hN@msW9|Vr z8?IAev+kSKjJEzU-wiqXgVpOO4{R4*K^7i&n?6~#LX~*A$EGDO`O`>P{(5Wp_X55t zrNG#EYe7X|wleFw_{6y7^l?8oru-Ar#J%37a22@Z*Md5;m#(y;R#Y%Wd$Hk1241Vi zhd@O{jh^1M!-V~{I8N=jI7Bwbu8YN=_@r14$I=O5-y1M4tENW%2>t|)~mLfX|tZ6+T}<(6I;I`wJvwo6VAlz(~0U(n7TSjDUK zvDv8m<;2ux6m+ny-g1I<+R|j4Jq*Q6IKgfE+{|*S7)F`TFN8A@V^?6x#Q#>#t1i;d zSExI@{ms%~tPq|`;lHcMn$&!-Z>ug1U3qpEaam3+`Z*Fi5BLAvA1LYD!&vv6)N?I= z{^%W3oh8FDHQjNACd?@pWIez=5EtzfQGZxDQ~1*L(Gs=(bu;zGi|M|<^y?N8si`tE zEYoH~kukOM!RRFAz3lHudOA<|ws049aTAR|mxL?r^9Il)cD(%fBPBoUUcJ8SfA=w6 ztZfnGE9=S`qrngavulI86&-i$H{tu;LpwCkVfNBz4ELDBD0gL`66L20%ff^zM!uPw z0^GjOSneN57b*!He)v@|(FsX{UF#L*fJ7||EWZ+c%j3WHW-p;VuAjU=b-{{}pJ zH_qP|VZTnDfwPT)OK!!T{n=!4G}CC5@gd;~LZ{b%@g_ybyj_uW-lflzr5>yJ2iVhw zBPzFnnNX0?jcLK;f9$6{Po@44hUp~>&nSI-0RjsD*C)|wxRUl;C;A6ddj*5FLKdsI zEW~2iGQ9fzaH0YVYLHt=5*JsxF8S%WwnCA{gDvL6RFH07TIpzLc%pNstddu`XlCUw zPkDLnZ<_kvE2*&QULukRsqBxxrt_uIy&eqGR?gob;O3BM->6(=n3M zGGQuanm1lrEg~1KZ?HuB+Q-F&|8S`ALCR#7D;~kQas=!dBCXt4PT8a@I9J*KQNeX0 z)W-3<qLyR%MGUYtldQ$n%#0jsADV{cYbLn=;VoT7)*WtLS ze&Oa!V@tdYCx&0ijRjmSx{qmHb;1i!a{Gv_DxK>Iz_q-g!M+P@CCzSU@(`NJJfwm) zBdDLg^)9>=hEPEliIlm%Ola{!K&5s0`1n8c62)d&nYaPlMFVcfU9IfLTtUOt3N=+g zT<0(Hz8Qi6Voc5SXtdM&QBB|VzIV$>%`P!)}gfXFgD^kf%suMmU3D- zvEKc;7W0lGwg+`g8RfKOjASeAsOBd{XFz#iZo-(FxaYN2(S%viIPY&M>@6WRo}@?A zBTJmkxZqAi6AA8N4(y_B%`Gi&Fm?AUDYKy?gYw> zkyeX|p}*Xbb`q$d!bdCdq+T0a$ z3W>}Wa4^RYk00@7Z2hd3U+@xwRWt}L~Mw>R;M|*w~i0eUvgf| zMw{aDW9d9RBPQN&92tZIn)K4Qo?{5?r9CA`RGO}u{pQp-~rcNIrre66vT}S5V z_NMebh0?-Y5lO7{5xtzxsMDQyJ>Q{0}H>E{q?&*i7WT5MQ9sIss$eSCw~uY(UIk=iwqU+;tEz?-eMiT{aq$9k9hnUWv+9I+3< z{q+8$@l79k?W-c>CwLbk5GOfl_-Sa+K+SG1cNiG@?pudI@Z(zkn#w{0+TqglX{)cV zljYQKR{H)w9U-XH0rXDeW`TSs(5h_3Fl%zZ=cy-Tf*{sQUnMLBL0C#twA$KW0!^bV z*Fnd-Tb5e2W?XLmQYL3q#lw=`xF-AF&z`9rl|>Jg?v`ih$BMeCZTPdVgt|+%p7DLT znjJ^`#cmM6-rVO7@U3y#+OTsh>1NSXC%E+Nhw51o{uxE1dsI@IsK%)!@@KSjZJwBa+q3dhLDknCki&lF=$4k6ouCz{ueO+lSMCO@@Z*0E7vW#Gj{1eEsx{>p;3>@u*X1nt-0v3+*$ho({;JGk3h|bv(zrR2>kq_VwhZ7g zyE|j=#e#XOJnx-&gkNwx)ka$b62>NFj#(ygw;zU*{f!#HGP#sO>A3>-bwsn*{ih&8 zee18xvBLg~uHjJMFSx~g`B{wh%r6q;t|YLOvGrdbk;!pz?oh#5)rGyI`p1=>`toJM zX^U=pNs;CD6}4K^8G4q$VyWmR_N&YS#~Qj%N^RFqYSn$uMfL+$SilEkpX=C9UXGSE zTsdql23>2M-5vm`w00(oHE)jx>GINQmfEpN?QEA-04asJ4d()?XA=@c`?wzSQR8mbecrsLAYfcgDdtYm)hoo?PSEWp`@X4_75bUjTB|t4^-cfP1~EkHz*2p% zfN}_yYe`{@-m<8uI!<_MNt<&=Q{9T`W@hptgw`x+>GxS;F zUk)~kL_;aXYu0E+Mp(7taH85HQoX&ndj)KQ=E zYj51gOY?U=Ci1_2dnhX`*-okNQmm|ei=sm7?MT~@YXDL^Y+=Sa%k$>UJaCrpmG3C} zqmk9>w=7-HV)2L_CC%_%uYmrah@nYS#t3%<_K*Zn1+u95!w)8-cKe$dvoGYI>@%f@ z1w074O&0#ZDu8oy4=~snf7kWpk{?LA%0=yG2TSuY%rS5}(-9B_SHKjAnDh8ArjCWi z<<5B4cr|wzb{Kb9ppw)_wjmJwrKf{JNya4A-6i)xGEr8 zDY+b|_Ge4?=PKisSCh#fVfTye^bImvR$6zU#C05zzP2zmi{(YG?<#Mq4 zk+Zqx`ZVr3`$}<`#ja~c!*2R$LiynS(45x4Yu7~YAK6rUsMOstk?Epi-{V}ft(AKn zzD+95%2zlm!OuR;@R))F51|MPC0czL1M2O6Ne1jkzet37pVk$8L$%rNF-4Z_c{UA+ ztx}yO$V}P)Y`c78Io{%_j%g0K-i2?kVUN|!>Nqk86P?16`Lvn@tx`U{2c`JyN&T>0 zxVhe{AP}zjgPIDwqcX2@|674P8o)m)ft3muo0!Cs zGXKF_RfU_Z08z+MU~;>+>g`rm^GlG=5@u}Y=BoNEe3N7^SE_d()R4BNS8Na;E2np` zTvDSgW>pB;D4nEf7}4d?2>;MA1?VUQD!G#BPIP`V``HxlN*-Oe7-Qo z+fl%1$=s+d%AE06b@UHf>CatHrGEFPNTrchNt=PVNy+!B;a+RMOjFnv=(SjAc1mhf z#V&JMf#bcs&!ahz99U?o82o zEzLc19wQ<7nGQU5Yh2197WT%2?iQ~oG*jU6>|wlpbe!u_>;vR*rs$TK_lr*Ug zhf}pIc2eA5(X4(a&*M+=hhJ%SVY6bl2D{5t$RAplIq<)gS;y?FwIp>hj(}WY7gBoj z;8PG%FV1 z92S;ijZ|*fa&8N^7zXE9H-=^OMLj@fQiu2zthP3AY;W#cp@(H7eh^%*59=)AsHJ`x~819oE~WiPVnMAzMSyo9lq(nPHug;%4iNmHZp8&tMmZA1B zg8q(I>Af%8Ez`Ptbc`T>^a`Q8l8UM2G{5lHI^ONO5qDSd$rZhK`_?U}TOpQPD`TFz z<<>$Zpj~<^pZu-(Az$9+aQ6-cHN73b9AsMlB7z#r_VZecQgB_ThYV>GDBIj^BN_;};vq&)@ZfO@21e#*T)K z=kc}?WwQ<7F+|#DN#3yJqFV6TZX)}liMnCk$nDO;N&bEzYi;WzW~+%uQcwY@6wF8;SqR1?5LFz;}lzHbaCz9BieexLvR z7t^kRNxYhc>$-6xUO6+hOy(I5sn+Kpj#t0<=k3YgNWyc>KY4F|@|S+@7jOD#O6T4) zrN^D;5!by3lfQ3(uR9h-s;T+`OyFMn2bk5x4Mu3p`KG8`Wb%{z3L@W(NuCFYB5iuO^0rt?Gp^5OK{=l%cb&;R#p(z4MFB7Vfr&!CCVoERJR5uOM$y~wEQ8bgGQEhd|i*BL%g+pjAP6f zbG3Bk8RD4cCufYU@v18~v9*mR+7_ck?%1xHyVZ^{d>ub)U7V6JPHmvA_G>*PYk!Q9 zPf|G)8?n@7r(|JVw#fyXfBE!HQ1* zlLN#s5&vMf3;ONe+jY+L7ecV zl^2e^0aKx-_k?Qmb+&Ye=U2UTp8l6?c!>2jQLvlmQ5Uz z6$WM=_xr6fquGh(CbZ)X6l00k!_2_re)bWOZI;QZ2*~5WE_xbaCN9E)atL(hutqT! z|Lrq|YBw?FU^t0m5k=m|7{dL{nrphDXf(xIoH6q7^NSNDh5-yUTQ~BQG=|a1y0=K2 z`BT*5iC4d{NfvKyb9(QS9M6;}wstuYV@r%H4(cs)pxFq@Z8ur#y}(;hQJzQ<+Y#(} zy9djN8hF`Hqp_`gE!#*sbA_DKpk;t5k7O$ly!au_JU@5rkAUdA{;t-tP20 zvzqjc%%KB|Ij%`D-b!VRQ*B_1AzZfwCL5v{$w>sqM9E^u6x8h88-0bkwv(sF*3vP} zj=c=dIPGWlx|iIhCFH^|G{K`M6uUS99y=!mJHH>~iDHgZ)(_yZ&%MDV z|6=QoSKe^_`KlI{@&nC$e(vY&JSRsV6xWG{WJW!cqfrkz{D7EFP{I7;+C z{l3}UWE}Lto42*sv}7Q+EB|IGHC}baibt}xtG-yW&LdvhhuS90V#uNV)4A8KU6al{ zMI92`q4k!GzNpt63$4$kcfR|gnS(ZM+?dWd{j{0! z2DHIG*5=B0^|w>H9^X@j3cG}5`>vEe^d;BpB`1;J_33T``1uU9?*DOJdGqIiS@+u+*X6c&vhc|2AFk`@1TcGUIUWOT6TtP(Ti4aiL-y>q z$K%F-R;UYHLBVKyMMqPf&+FsX*nU;r`g_N4Fu9K@}8_7|2@>cunxP@@n zSn{*TF6q|xa;QzRODbA*$)OywOZwdid<3*CV!S=%)*Ck`P6F5EgpKRc(;t1lJ@)yp z-t&?F%iebY*ilvepG~rxo`0A+N#*|d73J?r)fuz=c`Jm^3pu{%3!p$BCNFWUtv!zu+_cA#+2sE>VmWex7hgG ziNTxIo#!)|78B>w$SErq69OD5T_E7l(IYLDLy1%{my$TH!f=dm=nmier5ws6P54uK zT^o<}L5DFGhluaTxu9Gm>0PpBN3d2dYXx=F`wSev&n(n>)E_i(_Oe}UAxMvGW}WjN z7T^@l_QJ7!48cLHDNU0uw3;G`Kp-^4ArW#4%7`_WU)Z==AdwGgp13lY=Sk9`^8iRa zt$17Ez3h}0^2e@=MPoQBr){rCME5Vc2XBjGXRw8o#o%ddHe1z1KDLRD11n1D{R_e} zc$GrH4OL1TkeR-W#>qB*+Fq45J2M&w(1qlPu<~YdK!=@c**An0j>|Z_^aW?I*0CNN zUH?00)D%Ld#MP7GTE*mbW$@%y1`o^9PG<&dH&Le7%k_87icdD<$trzuHmUjZ-K z8PpVAQr3*l8@@j&Q6S_zr2#yFB$fl2AcoiYhbSKl#1lYtz=w!w!uX$;m=A!0j!c%) zM}6c13!7FQAIcs9`r;A6Kq_2`vNR>w+^TiKqLEhra~ubHWmg4M%sCY`6!rAONuo0< z^GXw5uF-lTJB4L91wgJc69XL5CR^cv2C{%7O%_y;@&~&!M3M;dV?iU%UOnQMUFq#Ref&qR@k5o>0}p#R>2EIEi%x{6DHv3Rfn&hpnw<9dBihNTkLTmt)-BzF}QC}z;}HoZiwffcsyq#v4aG@96)OrQh0#2ceRpPY}{$S zm9AEJliL_;X=0=2(+FxYb|#f<<|r{_WOJH5rvMQVmKXE}EH_TpQEeM{g}Vx6E(^jTbERvz<= z?U|iD9r<+UFQG~oXvs%1rDgLQj!A0bMF}()p=cY06ITqOeT%U6b7_A~^X*I2a%ms5 zatuI5DNAabRZI#mWo`j9TP-&7G~Zm;bGF&4wgdPdcm7kZzu_j?ZP#5)S?Cj5cR7fC zFa(P|u5;-}AA3|Tzv36Q194}AghI)iNd*aH21hjCe#aehD|TOBdDT^N_0`wNBab|i zaEScrPk(~r_%3u9CzF?GGqGm zf{c6|B;c6ke0b!MuahY_Zu^U0`f>vicObw210U2~>&G5@bb@CYSaypIo#q?s$0$1z zvwt>>5z}dLM>LfP8EW}Z*-*9;Ga5j#4YK2(nXeOS(5*QFx=ux|A~ZY(x<;GUwziKB zvb58uc~h9etF(~56)o{)bSd1)(TRaN9gJBE1$>!oBWx8{@m9f0iDjtJdZ2W27;9jP|8e{GN&Z?skJ!Ft49=xw~vfXq0Eo7?=XUZ>b_^aG< z=RGa;bEoi0uX>S8Eqvd^m%XZfT8efAsSGclWFGHugQ{4QX|b7;=BbY%g$HQk)!A1- zdN^hIyb)HxNe+57p~8*=zD&01XcbrSR>4c;W$jX7YY9su$m{cIPgz%f6@QtmRHo%q z8EM|jO4Du7W_6d!sLDe&7Kpg0V65y4+P^f0{n|H3gDw=)84P(k9ChIj0{V4PgL4)a zzR8O}JUFu!bPbO6 z)--K4JCP)@h5ZH#8UU$4m$$}ppwc9CW8{^hY5~0-?HCm3uAl;((p7m-<5`}; zLInQ$pSUyNbeC}09o$8S@EH8nTD%YJ^{#2N4BmzSY47UnR#`r8 zlA7r7ZENHfn~AXv!;DNMQ*7@bmvJDCdKAtcM=Fwsc|Pk4!~+rdkw!kSFs6(EW29+b z2{$@|6&d+rI?zX2DpparWPLW@D6Aq#lR1AuR8nM)XenvZzHWpIcy7@Jh(Iv&*qxCO-{L!L~AOB>8$s=NsRW&u^b;?dr643o zgBNIY{z6(o;LxLnai3W7;4RWS?-o|>Wpf!ZcAcnc^^17KvwqeFj$a*b zs5gBE*WW`dcz9md+EiG?Yr_~V>n?{QmFLM1!S-Aa1hFoVkJ$iCv5M4ob1Xh-12nd& zM|CDmyF!0yDKE3LCVfkRRk}MRp9YvLi_Iv@SJ_~6A>MM!E#%V6e_jMO$$kFxugLem zb$g?0&opBH+p>~R zKTgEj!d89UMZ>y_{0-W$XYxmJpRVFJ~wXMSlM}} z9rf?%qmPt7UU!|m<~6UEdGqEKL@mN6`yPJy5jcPg;ED|EFa#dEy#Idt$+y4rT?1wD z4L95a@JX2E!|oC_~Q%YQ=dK+M^;~!@iZoi^}g4hdo(zJ$#d?x=gZtpH+tEKH9g(k@_+yL5xM!6 zKg+e({;r5bj^9=05!^Fp&6F3v=m3W|nHC$$@~%%Bs&?E4Z^y=em2qv@QYAv~QC2UN zM1w%2Hbz~`u&zT?rvg7I%fHnitR7YlbwzgCTi=H_c=~Z;>8h&UvQF+hr{T+BX=NC# z!PC5ldwH?P7bXUek9-Aum2A_I#$H|(ufaX7Pp2|1Uqxf`s^~o4r;VO*mFyH(#qVXc zN}CMRY57!_lLL}IEL`!?f4Dmjm%%b2F=4a@PxBt``2=Xd3ja52KTf+-5@jq>d=rhr89lR`84wuQXYe+aTR|`*DP-`OsD0^ zW3VcIPg_OPN=6kQWv9F$pI;*hXQHehfzQSW2~`HK%;?rBjhSD;H`}r3!_bchbzP{? z9l)R^94p)5m}tmEn%{clVoKiv<;qEKn5CtFC$b_;M}i3>ydZUXW!u+xw zZecw-dNdYo2KB?LnT^eGt{`S}2C|0B05uY=bQ!*mY@;=`Y2M(By*#E7()MH?WeicE z(R3ir=)+O8rYpKEove@q93&B|yurZ>VSM?==rPZ!B+>#FwQ4%2QDl%6iB&Gsl#>-r zk+^+?Sk2a3Othk+*h+gGh|gbFiUj8!~nl#DU!jQ6m}M}*F|(Kf<4hZ0S%hvEq{ zxtx{5Jq{3nNf@u-)toD*sz=_A@+41WQ8g-8f$kF3I!Mi=YKyc!?b)l~o+eF)GG>OC z8tr+E-ox5SH?y%B&gsy0^t6dh>g>hNUheAUw|k#`O!_gek*ZY)G?0z|n#Ls?4^buI z)(upi(MI6~9AH5vnUJ==sYC%2Q`M2w;Y>mr z7pgU?3sylMWq?7!KFyuJ_?~YUzwKN3vXDthH8NjiSTmk7IfH?j4P`pZU|yH;dRV(@ z%Ag*EC@$v0JQ6S+B0WVaxOZ`|ndhlh;QDK?|_6aa@nc@%xLM35TuU4a~v$ zs@+AlfFriuFzeMK4_u5L!?(4|8R?;Wy_ewk&c?O*`}+Fi4R1JBp1bR=^2TG|AnUD* z-%9ETE{fnhvfZ}Z%FLPTH#mStjvU$GI4yGfoU22Cxij`V-~FD>=bnm3PJi>8- z`yM&@e@>EJcG*crK+m(-mHeka-7IH*?QHq=udmVX_jiX{YegJ2y-yu!s z>r!<#|K_*9l@m{Vn{25s5OfKTqW%oICS^e zb9Wg9yXu5VlP1cA7oI2k?t4I~BYNS&g>vk%$IIoHT_W3Wzil0npt1Ta>)T~8FV=WH zY$(!o^wgnAZL{)O+)9SgrE==#E95U>B`_wwC#iERZX2_*Kiq9ApNH zcx7MLx@63h!2>j8xq!h%AnbC2i14*Vz%)Z#SSaFxk#+)I`9oUA5MFqp6POG83SS{h z7caoy<1(^)4CbVXGOB0nYVQoz1tfgew-?V3-1Vz}nTW*FE`1TzllECMW_zG9mwwYw;v%NLU5@qzMFnBff$nr381UMVLdhzXO+ ztQX8QgU1I*fO%SjyO=vx`N!SC(QzryJRtqt*;+f84#d$6R%fVlE{>WY(yhWFv(wpV zMRTBrq!rNOlt7P0eNwtuucjk9g}Zo!bPt}d$IvMpk84x@W{R8PQsou-%n-wyVU~9~ z^2Rh|j2%saDP~jIMQq4b$tr_;c|PsrX5%^ZKS~Mnaik%DA=ZOAj4TfQ7_t>_eK_dS z#c6A3eHa-&Y2|sT!7cve<;fLqV zF2YMf|MIXKWX1Au6z>Y=aU|agEM^h50^f@2@5Q&Gv<^Z=aNbmND3ABGSUkk}>``;*_tT&+E?9nS9qb^tpt2r&Hw;6m=j{yp3~x-k?1+ z1|gcJzg=Icutx_>9lz z+un!&h)=~V1DtavpJDNb7r;hL*-n=COqXY$d{9M=!s$OFyT__Cctkhmdd{&cDe#`r zhh4ra@PZ~^Oyxa-b)dy&%ojEhf{kIGM@I3CHBI}OWh=c}k{Xt^l4Bw~o!9TvMr$#7n&FMEld;+9^%_iMv$>lH zkHLN95xjI-Gko?7Uy_YCo+B@PF&v%49=hb-`{v2f$G)|}Vb{zQe(!ku?b5BNRwsFV zRLd~hYKjc=?n6Z;;~w(OYv8nn6Ntw?zu|=<$6*Jjj>C+yIze?7M&rJ;(?ueG|G3Bk zyvWiYo+Axi9Ye?{e1>v^*NJR&d>qHs)E;x=O@G4ocK;xkUUs>hbI!SP$RRJ6SG@dS z*?jZOWbD|n(v4?f4!OmP7s-VeeM4@(`4-Qv>GjrISEjBruu~TH+ixE@cXt-<_)PvI!uN=uf@2oXO0`0zs%9OQn zg!p)Q?6Jp%$4r-n-=of6d&H4)*PXY?gbC4M$9b|v*m$Ek*hPGf9Q?9FQKvlVwHO|F z;6XX!bw|q2uDDcY>-XvVFXWn4v{!c#ruC5$1Z z4bb+lt>k#TPg9fG2Y3Nx@b;}~y>}r|A=feXC{7B zS)EWr+6KN}0`A!*%jDL7&67LlJtX%(wm=p?yHvXI*4Na@6J^efsj?MhZZsVaZ(gh! zpTze+`h0{iL}?_ z)0A!Y0bW2Ee5m!O@(V_!$e8b>ZKfjCI}|!hmy30g!0Wa&^gA4_u|NuaW~O77K&4{> z3q?xExylv~DTlbQSQGe23Qqf@6isun2*gNpr&%~2PBmcc1IA=@0&@{*1s3I(_C6*{ zkyd9gb_Mf@=n~L{T z4783^bI}&oe*k&JVCuy4=4tkipqqLO zp2kJnvVNjqvyVIomJPXvE4y1-)&`;oD9}ZxaR1W}1T58cVc~|3Vf&^q+k^S698pka zl$Fcios3<<3x<0gWp(WF?WCQ)0$U2NQ)ck+KS>dkgJsaUA<9EuQ`sfX$5~lpUIl@O z^oomdq(d&?_#A66-7Uo|h2tIo98-VQ#ufOTNayhK-lh0kg2jLQZe%%luhP20Sn67?#p3;nfp{8 z#l%A^<=`K$$lwnzO);h@Mj8W)I7p`);H=@0BqopnK|(MRLb4zvM4DBQ2{wpHwtTyB z8NV7C1kvD75ai2fy}o96CsSEGZHhCQRdB;6F&(`;{-4J<)6vV{_B{Q8@Mar#?7 zO(>Po44CT9>RVes=Y$>FJ#t7xil$bDfQxmW=xpGNc!fJ!&BHz&_YO{-+OKiE^N6;O zcP_Ko_YI$JMO%g+Dp+b4YbS*bh3=vrt@rp`uU!W!0|nfGPY7lNpt^DZih z^~7Cn46F;i7Z8qr{IB(*NIt&@s+drIrZXNTP@(`+8I(g7VhBJqq$-#l&1kB4>%zTkpDyEXg)igj1T57X>V>;B4}8f1a=}I4s;z{( zFyH*Pcgg2J`w4mFAunsr$G*ey+M#gQU3bgtk2yi+KMRVrm;|TW^c?fgK6gXig^$$#FDKPZPD_9|Jjq}qSN-Ld=|Oc*zA9KN-Cirj>67TLWU6GRbglAUucxhodzzt4 zH!EM8w)siVr<&3DLxg-^=?&&3;l@n-wEl7ulcgY>=`m`t%))Q-(k4u11AW6>Os2Ii^T=int1@u-f#Zm4|3k+ zzl8&NnLGzh*)3+TFZ}*6x#$qSz#7$W!K14PxIyx!j>D(kmFyrk4zZLAFQo{*==zv`Z{>p$&kv-?GJdn zCUk`|lctK#_&XUVwq&BK;2FV6Otfj6uV0^TT7tSd2H954)T9r_6}EFJA}%|Ju7h%= zRw<3@!XgIWe8=K8moow<7X6h2S2D66$AxvBFSsBDTLKC==am49KyD1K#z%o!&i5nu~1w%gVWa*fwV5PB2Z4m2G^LipfK_&Ga_^R z0;YJP49A#Y#%ut@%8xi}U+T!Pk(NwMl5Z%3c8U@ORqzthVF#7iM&~2`!Z(A1qo9BB zd=WS-QM;)5z~j@+%r^QWO{3nr@k z9<)FRuzD(!Sq4jWf?td3XbXA3IsXEt&Kj^QB^wie+E)p%G_i)WSYZS!A=d9X=SLna zrc;KhjBul)(ov%)U=Ht=Zp58h+z-mzy9P(YXuYo(C!N5{@gh3?pH)pqv8GwK z2uN#6X#+?B6rzG6j8SB9kR(ZlmP83pnsxk{O%9fl*UC5JufkQqp^(m9I(hNEULM^n zOE9m{`CF^(X&t4N>@Wc6);7<)UacoUYvWGia~_GLJp=r9`JG*qYW z9E=s@{}X~An_605`Beq1LqpyUH6FxhS7Cd=UX@zacc_(R%2cxrG3Thsgoo$(?0dhU z=kDGxD*?}!7C}sUiW#;39BT+fO@(<4C5c9W3ASFHZ>xmD9t-u@%y?PRa+GjR^2!XWJt3}Ut z_y$}+vKEjhC=kV@0s@>AD#+6jPZriutR-a$wg&nrlM*AVGG!M6Spf{r4y}^_EnbZ_ z(8n4nk_=1E+c7K(hhGWXI}8r!Mp`>+D>L$XdDUSrZ_5Ep$#eq0^IfON6<7R1KJvl$ zVOJtHCX|I-O&PW}Yyq5+Up@0&eE0WT`d!r8jFIrwuRNq(mci3w4O2Eszq{+(hv_y0 zcLVcp2*Z6i&iK+x%fF%f_~Vbm3Ho?T?bD`CmE(^)7CUC?`1WOP$(j+o@P&KHo8Nqb zoN>lig*$QE37pgHw?rMjEw|W0zVyY@teCe8cMv)H=?_ zEouoiAAR)E^0&X;E@yoCtEIfxT=N@w`-$(6bIv{sJF(+>@PNjDsrVA$z}hYo)S>a8 z$tz7bC9Xb8Nrwx_XMBFHwUdFHNmrAw#sO>%)#=?rc!(YT;09P>GOvPr3qj+_6qN$X zCYhAR%PdQm$uOA3WqbpHHIvs2M_q<*w|q_P^pl=XXS%%JYB^+Gj!X92sG78+m_?7= zt2-W^essS6u%hE)`jpAC>sFh{Jr6%7zrQUkzS4opox9K3cmtXD@B%sN6KBig3m3~4 z8?G;}*mK9srf0A-_XFqrP=0>>t@6=h4uxYl>?F1yI(_(2ckN&Al;ci4Pp1vMDl+i!0CHU5CunAQB(ZD|jT^M4- zyunBV`$?u3E_5j|0D&gRAPj*pR;S`ZnsT-NVm8pkIt*MLywavrb{VV_Dx1k|hNJFQ z_!{PaD2Y%#p+}SpI5VX`5A3228v3v>p9l%VDK385Wo6 zG@Qjo0~t&4W;}NcKh5t7Q)aB6=onU~aL?L0-olPy<3((9h=NLF$NF|0Nz%%YfQK~e z?QEu>bfG@X9L}kE4G|i9R1~Q>s}nB7lfv?db(fUE6iyD%f!64h1|U5KR2{r%Z_bgV zkAHzH@bP%h?w)aa)aOX<_FaX8Ifc8&;zeSF<+$h28Qg~#d^q=qIT+<)E$bW{oFh8- zBCosZFb{`sD}zRFh>@1_Gioi258{HOm(nOp?{@&R4uj*E2n1E9RGL*1q!<&&x(@e& z2w+qhaygYGgGQKzgBH|80CeD(S#$KNlb3Tb=Ls$bwc6FIlB?|WbyP*u#I)KdFPmuw z>PA|}9`gy@@I+<7?2WXR&G5sRpp$pf95{VvVBs7u>2$>D%W_o}su_;uZiOE}-DGV; z-htXxrMF666@3afem^IWCfpZ@RSNAYdI7-d$YK!LT&4_sE)8-ycdfvVxUNxQmmBAO zoqOWEuhK!H2(RCU}VMD?9I3QMSgne6>{;9FTqaF#!~=uJ=Lj==FE}3_u9RhV8}3Kb?)oK zr<)k@$TfHg_1`(c2soA}VYADmtuX+(rqS831e<5J*?Ma|7M$sJ!`f@FEvKIPNjdo7 z10!plau^ae9a`n}}#++Zr?jUsH#EJ6Z4}CyRde=L$DKk^oG*PsryL*&;@{=DEzVPtv zZ-2MchHroSdwAhuwtW0!9}TCu73{3CxvVcXH7p{lRH9;I=1Q4m21rr z(5^C8mt?0Kt>q42R*WC)KHUn}tWr%*)qr+zJ{1-wrDk%8bG!vo(^&wzjK`PBFqp-T zbx=tsuc53CSE_?}Z+9tChk)J|pQZ_HBdWoLX$}3-hlMru14PJhL=&cODoYnWF3&D_ z07ve1OCKD-FW7djtc@d{&$;9pc^XG6(?QBzvbX*F0lDtByKz)?`0+J%bdQ{J#DTKu z%=}He@BZpKb<}?BxWnX7ICn?IBTubQj>0#BU%10o^3zYgQ}%rOCufJ%pb`jJ8!m82AqJm2)EyKwtJ{Z+A*W7O3)h5ljf`Vs^DIhr*UxYTQ2X( zO4C)et!(x9G8tvCQUlrqI=KyHb+}Tg#Cy9-iG~1}*yZi^=}dEKW5S=&F_F?1knLw^ z4}-T$(@|4gpfR#sJ@^#I82m6fr@;>;ItAz$=Di847q)|dJY>^F8Zr?dkJwZpbWCtz ziH=m|4RcQzR>Wa_7mM-zIJ&bB-`NcTKrFCx0iQoExY)y8W;BS$apvES1YIFuK`VYM zvLCy+)Y;4<;V|Fv#h4XbNY3u9EMzPzQ*M`UwwOfOOBP7)t*6VV4G+X_h!+r|HU(bV zqYwfW#EaUjvI#@p(gj{-@W&#sxGD$$-aw*_gy}+&6_fO}g9)!<@OV?;Y0F?9KhU(3 z%Q9!}L3s{WDxP?6cPUYOK=ee}58oBWZs9I|UziKlcp;-0 zOlA>U%+;as9BE0@yr->`F4IpKDTsOYwPDkp>+~upr4dOzFHUIb#0`4s9TY~SpKf4(B z2JY}hxoxhdZ#MwKNftT@^CceET$sD1i25m8xuc9gwX&{S0w`x}f!6uF!E3~EH*et&~D<4fV>_b}#3%aFnYw0JeSMQF$wu1a1Ck9qx`FPwe+rZ4|G9$dNDzjf@G5{ENT zAts)7wxTOAbs&@IE7)CTPZ_Mrj5@TWaY3sg@aeOqGY_BX&8kN!j8b>n8 z>AmawGUf%JmaeJW0}|%2K*4JeJaYVWy(ffhn49!g!+8oXcj{b7^Q^BqoE za3R{05FS-W1nh|SwpQnNFs0%p=fzyE^$C0~ld@=#UYKz7 zn#=Q!M&-sli>xxTgp=lAQFvaD3Rqbe*1!-4R!Y_%sH>GuZIv2yowhr%t6+DRoP5&T z<#k6LUr;*l{`+Oz_%X7>_S@>;YhV3JdE*Hu%5Q)7hXNhP$7NUi;&J`=002M$Nkl;_$MP0_qj_zdK%BSg0NU;MV<(_mFd z?MU;DeEiPuH@|tI{OCtNmh;ZLQ2ui3Un{?Pn{xBJy*#@4fEVo_oRcX*Wxl+w_>JFp zo%BwbyXmHK+G$@Dew&yt29yPU+G@ugca*cf_GP*J@}HHFG=*{g-F4SpvGS%_crAjJ$kh4zWejl8Ov`8mj;fts!)RBw}W|%^gTFU`}cqNV*@A0+vh%a znmU2sbi#2B_;Nr}zsdM-?5i{^;VBmkXgjo(LWUSI%r@%jJ{>Glr~QZ>G_6e3njOGa zD}3uzCjbtnbhLX|)nK!Z>tc2;?gA+tphjl~q;h@Ur;WZUZbs{MBHfI%N_;82m7rGm zR4DCaFg|a0z_fiWJp7Tnj!e_vjEPb?4yR z^xb;As|!KjNcj%Fkg7kETBNlw+||cjpqJ zjcqgrZ*;x&(Eat>$|s%iE&1Si7vsC4ee$8BUg3Up6}68Uoxedj5)U=p5!@IWbp@If zo)$dKH%cBH1o}IsqLrXl__QRf8-{lI0$1tPk0T{W>%WX^Ao^R$ZL@6NZlBJ~rHyrT zl5Qa7$rKe6g$L7s$`(doPFScx!WN03I@50EBGx1?@!m@ZFMg3w01{Z#Q35Umg*+K_ z_W%=g_#z?+9lxRrM4(hKFJX}huG(NvAXmAzP#%opcg2>f9JL!8gmPmkoB_-lR9j5D zD1voS2Vjj^j?BPlr`B6E8tJUgK)39+Go}BThotxRvt;?dE|%_14v|r__Eya*kG$kj znL%OT_wZ6lEmH z8d;OxinJMBZbOh_rD`R!3SXwH2y+_f7-onLd51w;(HRU!Fpu}9Ls)kXmpO-ni2PdA zRt+y`16i8SIR~CHTNpDy2gU_88AhR*a~2rR8FB3B+!)Q`9GvkJuYY`TC#1vt4=^2+ zq*WOqOpcva*bZSg8ow`$*&6p3j%h_@a+Et%wcbDMh8hrr^FJUoQnM@Q5Z?F^}s;h`6&5#E(&J?A2gSU$7 z@>wOcl4tm4at&v(@mL(;+|@f_rgYKS%j2CZclow!o9Ss1>-^IMUy7}`YPjZVK&FAY6x*QX{buCoAVKXv==-&|07;L|JTxc^XFs*o@+Um_1<=_jDF#n zflkXt`e+yP_|p?{_#&n1Mn03txz1>5m8BVzEtHXBZ9e0qMZoVZGL`U19uR2oRe8REvzW1CY z{8s8YXMIUtbHp)n%b#z}=zM}l_1<*zpY?D3^=HU0FaME8H%*TnJ63*p@lWIzS6%3K8>a@P3)O~o-{GPAj1t&PyH}X!v)UMQyG@r*rf#~pXdqD6e! zzDxCQvdKpB@|PVfhaGmPOr5%p+a9y|zx{U9!6NL?52phawYJD5MhvXi1&~>G@gEl z(!389%H{QR+D2;!ufwI6qHkJrXW$fIbxeXP`=XxJ==f)r2G3TNEkXQ$SD24CraE~Z z_>@gV##K+41FKx?&_1T5s*c&N7B6=YGMf(a)F#uJ!dHj<@Y?>qUpydZ-?%`gjPJ4E z55rPP^MCVo>6tW5mOMTmFVR1&I{7W#8_)TuEW~$kcR2Qg`2GXD(j{Ss&F09jPCrF= z3R^$D<<5KMg(rRzPSY`R%@^M%b2pe?!kL4vy6HCgI=&Np{`-!TQ6qz6C&yy*+_GMI z#s7X$eu3kp8NT$+*UQ@u-4Aud_GuOx+wa&40sh11|5$#C?-9TEwFk)&2RyG#U4%8-+k|)kD3fpT07Q`G zzh?Xouzm)^)>hrNqbP0jG+##+?it~KMjWK@UV@Z9ZrFV##Nim{K(3JNkt8?>>|rrH zs(=D`(y0^IXq{YQLpI81#^}^I;IlfUO~IKFsH53RUo1ZtUMQP$N)V^ZG?eJ(V(=In zu(*svI{;k%;BR%81a}hCVI6EjdhApgHTN~rJ$pZp1&4AFfvf)KMIltC zwgnx`fF6eCb6}veyp>nkgXcH!Xo*zZz%LY<)p;v1w9Bk%Mf+cX$F5*`2D^f}I~We( zv?{g#S$+9xi`AIYH`JJ~Zl+_%`Zqd|_VXAUz8D)L44@5`Ef9G{B(bGg5}DyflM1L5 zTF_9IF^Ofk6xI%H%A4hF=di}zVdrpH+(}&NTPNLp9u61sWe%hxJol`F)mX^{2V zj$4c$|HWQ?EL7)aCm?j?osMhS!6yORYqmn7HrUOq%>QzZ_FsZglfCn zR`3`cL@)k`$OCw(tSs!hnaGdc8^-2!hd1s3HlDE?iM;T7%MEGFUa=6zFhBX!lj;Co zfoJZ~IGJ(nwWrA1YvEa&^YBmyjQ?fm8;?Hns4Rv^to3?UlzK zdt4U6;mkGFF=NKcjOptkUVXmFTB}*wnpV*r0L`_&}+fx zH*x05EPOk<`-f&EwqwGoL`&~|FMe!xD)1QSwj989I2x%ONzTEYipFGJx<<}{L(KMpODN}TUY6y!sk4fPD=dBTVSFO%2^l?QR^|Yn zJ8M0ez1})<>bEbibpG;q=(A2f3eI01qnOv#!e^e9h1fa#%+h7@?*|`k=>PztKwZDy z0mn4=;;qFIe9O2YbjeqKe3e{v_z>RWdx>r>z}KTADX_8bgLU zQ4#AvK%^@vLAEBfFIZ0`oFT+r_MKmXKy2eE6G5<2M|sF)%PUxkA)T(sXo5H{kOLlf z3j{|oXf%W}DL<0Be8jWtV7J-~8eKfn-3(+f`j84gonQxKN9$E8v6|O8hj@ZRtVyMc zaHR=&;+S2I?+}i_j?n&R9tIa3DbWdx@5c7tf*lm|ej#J__(G6EhUhRMzZTzQS_~<~ zDV-*iH9$$Dl?${MFOw3b1=>MfL!&r(rlU-1sAE`DLGR&Z{06H_XY{LRJa%2YF}@y* zL!Y7pgbv|FIIeivlhVHg4kNAGXgiC{z$%Q@XlRb30<99VmUVP!PScSgE~P?D5M;4+ zmqPQHGDtB!8J+1-+oCRrwDB0x!H&$>XuKgA8xBd;;dFX3UmlX^y9^mY+9xa@;#{j5 zn-$ThGBM2(&2|ox&pC*@=n&@7(u{dJ5O)=~6>^K)V#|n8GA*jfiLur-5VrWviGlv# ztj>`KjrIw~q$jP$5y!MP0Pt9VQCh^tr!V?|XC%JA-ZOq}Jt8?X>%S~9Vq~|B7~8E! zUH3k_C^&+7tPk%ytb5Mybe=P2wd#$BIP`Yx=+Lpm0jEBC#2iibY|Qpy-VaEoLyG`I znUsx)^0eKES7C?|B7MlTx(3;eR8??C$?xydk;^}%^|)qr@M6K0pIG4h$Iw(1E64>c zkIR=OjV6t)&MYQxrrY#b90e24kjV;JZMT@z$k-TX@-yKC;!lxEt{0Q38HZO{CeRE3 zktNBeZ5TxvDYHhyG~rGxK`n#vlo4`1vt7P)_||#>#*8yVDA=dV6#b{env}oLCz{nm z6B!wsr?GZ0WSR#YeTp1~zO8cU;Kb{ zP1{-LH0`FGkD^e$pFrLSAi@(h&)Ag?&$Er-#r2Mt#)+REtqI;Tj+@$%8DM@%4 z32LQeYue2hZ#(JyWm)ya-<4A60V!SM0QS|!#_Oa5I6Ggw?f|LTanvR$W@rL6;VTbOR|*mEIKYW&3nW*DPOM7GnBP zKlZz(nUqf8`mqqhBU1VO%#qJLm5JPYhb`4f`m5-8%@8rc9kd@i_AuFH%Z*c%I&$gE z?ZvL)GcLYTcHeGu8HeMbs{+3(%p;`B!u&@cm(#xc^Xz-W#~iqqOdj9P!YbRyLcgpx zWwN|x-`(VbD}F0a;#lbqo_n!ecIrv6**)O#N1(C9IQy}ez+3gTabrfyM^I1i_~O@P zn~gS*$rHvlNbmq2P5tPT3uWfiwedU8+iq08&!tuxO`Vv$Cd=YFd`9DS`?TR1oBhOl znyR$tP1Bwy#W4?ES`5++q&#IZ%V1u%PnXeF!CI9i;bT82%$dYj$?$NWPGr{3LPlvn z1RN_R(FLS6p3%`(Rt=Yml<7B0|HhAtwJpJP<(1WQpE zx|YtWg%c?89M-1L^s0Q=4jN4Y&JeX|Z0YE3R^xRsJ#!wDKZ?%khg?w*q-YMf?u`zT z?istvvcG>zmfv?J;Is`t7`w0w7zT_Ow;p80`3G^}i=upnq9KnUT^dtduv@9k4#u&J zK}xG@kl2cOf%KgI&WymUb}HM;eot(M3kW zRUY_^-eTp;ETxdhR1ul1R7ZoH0B}-*;9M__0h)pk#}Sy(YgqtSJ=S!LlR!RQh&DLI zK}moaV?cJnL9ABbXlacB4iwBGg*NWu%O4}~{KMZM%rlPZEH+&&H{4ao&j`uyGCq&K$lh1^+vk(kUNk>HOuN;#ni)$1!x>YaG8;uRiAYj`^24g0V26 z_Z_ws?@^5D4CakW9mL^=#rpy4S^J&d;IN>9mzly*tg(H-YrQhp8QYg45i~+uY1d#T zb`dmM(5+O>E>Vytq2tze>LSj*!%L?wzrjl!oxgQMiHeN187?Dgl3+D!ErCWmvWv-9 zB0qn&aClar@srPj!C9}FEK68STufWNTi)bk%%D@5hVU`~(}r~NjEr%{=Xs)G>eY&H zlR+MWl*AGQhR_9vZ$BKpUE}c5QqyCdjU$aIn1QmR?kul~4ql)uD@O;#HWj4`n^Ke` zeO;7O6rkF!DNmX&aKua`v89{;CVL$jz|*VPsai1vvh>3d@qOk;z*7nmDl<*MW_r4CZA=D7%}x5 zJ;^jgJkh`zXMidYQ~|22yr?cx1bS0Neg=zkgG`R1Nr69of;WJIv{s^wtZdml5oG5K zolFILIw>*8GMia{{IlTG1{-V)U0RHxkX>clK0_}`Cx;*>ST)D#&CEe!uzk!%V-mSu|`M|F?D@yH`&*R3{@$DUdwH~jtI4Q9|bI#J(r$i5Djmtmbr6J!c@ z2S57cBDvzazsQH-Wc@gH-j2q%c#9$DDZ=yIH-7$mdEoJIM9V}RDgDytl{<=ajqPi?EdhRyz_iug17#d^O$A9&w z+vK93{Z78|ffMkSU0PpcHGPd@>O;&{lVx#z34zk&7+;zns9ckW*wu}LmL#DoQ^!PV zOUlv;pVC`CQ(}M)#4T)Tc=#Kr$`*R+ie;NHXcQN7n1!8MJBm;0DRZ2HkmUhQltM|d zxq=fkEUN?>d+?>hfj&~zL4Jy-fcU12ErgRsdAQ(d>C_&|A}rbg4u}de!{QAWXL9>8 zJA-*)p`Q8?6hv7W5rDwuM==FN7o5Cfc05`7u~61~$3?RIo-3f9I#)=~*2kzl6se|C za3(J%fY21;sG3wUL>kH?75}TCm{%&FCcT&9(@|utD3z1u2P)SoXF0T74py3ku1p;h zsVyl}D||{n40$>QCvOz~SOV+_7VZpQG+$&X;>@WM%Ga`Lviitvw=Q2+rK}N#G92NG z$HnkIZfOho9k0rBd6PwWRbZdiF;htZgq2yVDAbek(0Kkie8C=%OVebdfeN=6K*FOy zwT)^12VD?>%nCTj_`AboBF@ShVLDdnY%!-Wf2(xSQ9KU2h|wn)2-6+Kkm-Zk6@{jP zl{C<2_Jdc+c)?#-$j3G20SpdaEeO-3qr=ynz99}r`*ThnA!8@c_^;ma>zku0UFHbp zPG4>NaAQMX!QDjfS!~bf{ADNA-NK0ZpPdVdaEAgJ@cLpB!P?34m{g==VDnN`me7o% z!bP3BaNwf9s`J)6c1eNxM;*JQBaH?X=+ZG+GolH!t8QqQ-sEcEwoHwfwbl@-42^JK z6J_iLd5J7PcPL$gZ^qkzGea!Sj7iGmbr@;{es6GxZ_i|n`Em-yREJDSBuVooxLQI> zOzlR8u7bMMmQ+(Kd`e%IFDNV{=nTxaRc9oYOQ9Y&FR+HPIRzQ!$GqTFdHUkL;=O#i zjGDc_jNaw_c!@3S2IE-M{;W1*Zlcqb)ueLyU2_JjH{y|2T8ui-gvWVh$W&9NO^Z2i zE=Fg$U~J%tx>Xh7QJi#*4AY;M#B3l{EF3_zUFYPSNyVrT;*6G1{H6)^f*%H|37J04 zMf#8qb$~SN(-(YHAF^6*%j9-hT}A^s7@3hKGS_L4dT}Zz%@0(r(~i2Scawmwg1Xce zCsUKH@F{&+zM!y-U_h|-vD5KWAODEF=`HV+KAs%n!e4I1w_vaRgY3QM3l#eDgAbJF z?Y67jaO2JLo8SIUcvS92b2gM6ci2vM3Om-elIyL9mwpBrKKz0A$`)H})x2x-&uwLjM?eo}7&B`-bpZFr zBNHZ%ACKLtv*bEBMxR>TIFatU^(J!qJ6?y+m9hRT9yXs2AJ#3?4MCSsKoV`q9K&(p zh`+<45OwyN80!~UEYB8=FkZr96M2x%ba64s#6&&1a30f;rL-0UtlYMU11u?Xc_F2+ z2vogMpDq}24AVybX%T zkEA1z0cm5iyn+qrX_cVHr5TUuH8E-4;BCY#XPgg}%ct8Alh;WVlU3wkY#t16m0b?b z0%9iu{H!UP5Fqu(9ORWGGq(I;~5_9&7E(m^?&!nB}89WDTnfc2Su{ zT-uZr?RjZO1C7ZmiS0QcMU~0Ph6|8oIvQZne#*}Dcw-e2G!v`^K@{pT=Lz$XwMe9g zvP`DaV-2J@zEGOIR2uk-QUvN(HsON5c=XXu0Ujt>1V4R5x0qWww!#~ox zn}od#e{>3~mjU-ZZIgJD0*cLsUZD;I-ta=7j{RL<76B3C=(O$Usa3Xnmoah6@f%k0 z$kz_EjW+Yof~5^dxKA5h4h!~c2@Dxy(lD4zrrG})GcaK^3W%4CK=BP@+>{tU9KAzBHXzTPZpNn(bCamM4Li!SqNhfMa(rPbknGzBZ?1!cwLJ0vRuy zxHO;A*T|=pWffb4wMf#+7UF${6uJK^bFBN4;Gta;XGzbdhspBA_e;-qZWg>~s8`5jCn*$e@@YH)K>S04AL5?z% zJYWnTfCITwg0G2A%SdIX`2px--B>-4-KX0U*UFYw__maFocP5D>??1>H-Aq*-GIaPk$5R{P_#r;~A&noh#o8RTAXOIyq8!oy0+@8xIdl+Me@hz6Ws@rT<1JZkDj_!WiY zP!9rrvS_dT*8kl{LagXuDU3>G$hXlQreKIO8d*b97LIT)2Wx^OQ#&5r?!& zK;A%%3G;bl$Z;X13q-WT5EPpU2T=dho**$Sj*$dB6V{h8yM73}I`IsleBoj=4k$~0 z{Z<({dp|6^;VopyRGR}quA6$bJ`gtz#Cr)%h%=c@XgZCGZQ8cj0om&7p>Dm@rE9wc zyb_;WtUJTX?LeFE1hq4CieYqnX2z5j%zb%g%S5D79Z&1_4 z*eEPkn9oES9Wxmy20ej32uf**^Dv)Qc}~ABfXA|R!I7uO?h+qgpwTt~eua9CDHwm2W|EF#e47^A z`vAtXo;rz%C1?$R`tgje4%QY+03sD+`GLd~P!&ARrvrUDduYEc6=l3u2+JFB$cMQi$K~@A z`>OF8PqYD*;m2taTa`0eSw%WR>JRuZHxy}tt|BaB4s2PrGLaY2R8^8@2+spx7r$4| zZ})PCFXK{&Z^jJ<7#9lUfJ2-dsJ;Q&np9A&qSbA%TEbcr4X9kL#WqrO$?}J;lit6b zFJtyQs}ZgJn_Umze|+u-a5@FP_p1|0Ak{Q&waEol8}9X?8z~j5n_VifWLJHx2VA+M z41MRth>_8I4d=9s%gF_lyc)E=>;yHH7{S4dw6+n zt!;20os9wP=t^}C^B8Jc^S*wX5~5t79q4#$A-WPhP<<=I*2+S35b>W{u1-}^L;b}5 z-RbZDj`kbZI%WLO%30$8_VvpJ4}7Oe`j&X;;L`fWKE4xB6@2IP=>mN_HwUA&xFDz^ z<0t%Pd?mPnPR0$E&<2JQ9RU%q-qr%5Nhb0P+E!;AF{;4a`-e((&)+EG69=GVw3GuO>)@Fr)RDm&A5dzv5Bka+ z>{2!d@coZHDUUz37`u!8TRyoSO{ID>1DYhj)7RH0x5JVBhrit=fB5TNYX4a$A1z}> z2M0QT(*EoIN94;tx>C;k@zt^vNBG?L@Z)kJj)5Mp$Sg z{@PEjRvinUepaTfJxO-je2$y|C;S$(c{G>RiN&6~NqW#@%4D0}t@M+w6^+TXIPwhI zR;PERjejeXiw9jUC#z}FmA@%ng0yi#c5P<%S!9s*3m#ew#Rq;auh_CpSZayws6VCx zKgYHH*og0f(?ZQ*UWZVQSAoF<&;qW6W|NAD+6Z$7$6T}$ z7zmDNos*De8AEkM1jnnwn2)uAq?Uu?Sp!%|V<^mPR;Qrs{pZE9eBM>khi?b>{`pJN zv;B$Et&U*IMh#^0Rfx(eUZ|UeWUx5oT3#uQbi_RbfYXRQ|ISkMydOTgq&)P8S zmCn^&zy++)75T#~VD@D+OmJ-I)#NJ>urTUv?5Ad1UU|V1#u{ZACt@Rld>wb7GkMe; zxI&6r&5mHZ$p-0}{sOD4BGoWNBB01!~&Oa;%8Q1M6gC3OMmaU15%- zaQrt@@NL%qzCaU9j%iiKy`>DS8%B%+BeP7aW}KolcKw~Osd)AKG0f7fYGDK%@?$2g zD?Q^T%d_|XLHc>jyVf+Djx~B-l*Ot&G*M?>Dpt0CYyoV`0(u~Q&z`mli%#a;~ z8Zm2RFvF8c%0@10S z)H=gkTo9S?2O8F?>B`4+!k=V=)Ks_6Bdvqf^b^NGL6%06-x}wsXLS1VcwX-E<%t08 zgo2)S7*kratF*8wahrL{hTM+X3UPU3mDn%)S zyb3@ndzcTun*%uh9sy+(8x?YgZ!s|M=fO;zvqPC6*gyXh&F)v=4Z>8HR*xy8Q88rp zXhN+uR0m@!Hl-HV6yLEiRZ{qxCe$YDn61#L4c2B|)i$&}!cTqt!?JMUBDwr$*rDpe znP;Cbcm4BU@}865AzN*^xx;iOIne6ddh0FZqVv8g-Q8{8YX)j|gP}FrE#+Z*&%s(G z|C$BTjhP<)n$a1~_amP+{IJA+{8M3#`Z2rGdNO$1acV=`0$MY4%vPvcX>C(Eo^C`_Iu-Z{rqwL0aR8?c)`P{?PC9^jd{(pIJEu=Khw4u&u9Eh#$^7skLr(NNPy{(F67kpO>zTxGWL(LS zcid9;*bc{5>kb{06yh&@@8|NquYFIp-gp*vM~{{}=RKs3?Q8$?4>|wx-^xwrepKep z!b5APLtFLEK2fIvi{qf4$?ftq_Ok{(!#)7pEklFF6@VILt>A1MoHcJKi!DC0Dl-)N zjJ@q1-jD}U$w8q+b;hjX7+gj1F^MT9&I46v@xxX(g+?p zNV{dIu!IZzW3hMmi!)O1PgPhwlYvRc}bugSkuJ zbTOqdHak=|=f(Jq;Rw%;R*o}Vun&TRe^`ZNYNCt)Bs7#M%Y!+;?*gAQDy?QsugOvo zaeii*BVH%nT!5+=x=XC=PAgzpvc_s9e28plrM48$mTF;7?Q)eW=qPX$*5AJT#m~xw z3FGB^KlpJ$_ElG3BmA4a!7SN$<2kba`qO39sBT&C#1nGwJ@?9iFL{w3BVAysnc+HJ zyJ4rDwwG_5|23I75if`gS7@sr4wq3;kMBo5J*;N5=<5TurLB4&A{z!|`|36R2UNtB z$~4SvUDgkiPbqbzIvP&;?TFMN6|%+woK`R2T$D%gSJg@NF)rf$MB&p;=+bz6qXXqh zFDpXJI&03bili#anp)>?Xidvy@~Y~bf{i9sG8B1lhflX-M?3bmLz~(&6y-0MIdTGy z1ViA_&YNv8LvF-z&3p*_=&^^&DX%+tKtER|;5#B`yz@wT-ZpdP-CzBVJiLJC@`tcs z(bMv_)4ndh`qS-l;rox1iDSnaDvOsa3%i#LKxcA8@cpm>Sq&K7lTVLaRO^KkxER=O zdGL#5IkY-OXYPAmd!T&s_*cq29Ao{8|2hQn7fL<@b=d_ zu2#vK{ngj|YCHbZx~N(9w&tt4GE-YRkx%B6rtQ=TeW?tLnmCMN6c<6bpu@W`po*ZK zkyevow5j#zXEtWE%aNY2j2C%2Uh#W1mly0%(V7hMViJ)`Mhpu4S7)*sN{+B3ob!@Q ziI9ltkW#R65RU>;OEh2QhLt8jZ1Kv;Q97(dsoKEh#0NRcAG$tUoKt(^m|H?%Y0y1WdrVQ6#a2@R|4THrY*Zf*WYcPwOO9)ufHnd*scexy$1u}6d zkI|XqC(q|PjM;FZw8jx;2*a5@As=!fjVlvwTyP%aT$4-6brPoJQF)k4BFtn^yb6z6 zHBvw(Q%Te*7zHUym`@Y}g1{YMR$JlF8De-;CTVCZay{c^GUR)F5hL zG#u>RYi}se-gB+=FT;*)%3>q1iDT!;`-QcsQh_e?17%W2OKfL_qcy{gCKJS6-PUuI zl41ae(vU%juq+PH>}s@TlOfVP;W;eYS=5A_!A(k8YzE~x{{lx2txi!3rI_v2lsU$D z3{r>JO5(QXIgOha(*Ak?%rzE^)NOkDRt4>dIDA!RZ^D)GghZ^ z6b!G(BxU6sfOcE{;B~U(suM8BIY0u8 zh+H5k@fQJsHRwXw!@Zv9IQPamIS@qRC_9s(`PJm&+BdI<)xmaa_cB|pJmS8a>1U7E7V0ep3>(h~!Tg|x(xb*wN zB@<0qXKiN2O2L)b-O7%p<*FmE6%FgY6-_H6>)`9^s7ptk?a-F=u{vgVfM&!5Eb!q5 zF%G*(=gwMBor~`~;vhK%e}l1#j?mY?=mm1n^S75zfAcaNb$pdPgX5(c*loBQ_}>pa zDi?p^L>zS-oX}RB)G53K$0K(t&_QZpBpgWN#-`s0FSeWgz%-s#G4Hh-PG3jKCQleA zyKlR>I)Iz;*+X}o`o8L>+vGi8{jR+Cbq8h6U&`KZr>*sf?eAZGgR0tKU3|-=txzm? zE!H*TzezO>pgx;O8`O{OrtOp}WiRZs?Gy=_6dfN%Lu89ESg>&mCE=}q5Jyw=`@qbA zM#b1dH_hbkUp1GPxbQ>17!<`ciMS}Py8sYFQ1(4?WsOW(1X+aB$sC2y<}4r+vi_Q3 zkpP?w0j&!|#OeZ3Mn+^Lh%n|xPTy6=9sV2a`2CXf-uc6bfe~71unRjkMogR;;hl*}aWN8Rnv*0FUEb-{L`^ME_V_!n+ZICTOiRL~Lp zEMAUej9tRPDeP@8(`zsvr)4HC4U}63Pw5)-p3Bk}H&O>k89s%j`J${)4`nndEYHU| zDhg6K>fi7|VqU+5TQ1P#v>6W)I&W+ zCy=l_&vf^cO=a|Y{Pe^y9p|UE{dZqRbdQs98}FmLf%~5LXKWMn4DB3fAHB)3P5GTm z{L^+tUtrVeh5e3j=Fy6X$qHzcK{zNOhtmONC=M_liW>S2`RD-2c_@zbg`mJF+Yr>3 z5~>YRmfn9s9C`ED@IjEb%S4CR8NnpwXk_Iu!2zmBy%-;jK^hekS+$%+eTE6##+l2q zlrz9Uh`j|4jAXT>BAuh;*n@*tzu(I_n>&14eY-amHstyG!hjz@l&y3q4io=J|1HK%Em|Q{#MujJ96YmdGiTxl=q%| zV(jl#vRB2r<(M2wyAs)L)PGeiuA1%)WjhX&_ zYiWy14J-jh`tH@w`OCtraR8@HIut*g__jf*12|RQ={!5nX7UD8&Sr8~ zHQdT8XBWPY-Gvt<#*gWdDU-&-5!@s1rt_CSV))nA&4cw?>|bk7950`K)8X<;d>i=0 z)4w6t-F|mg`M2D4uN?J>v*ohS{Eti=hwpU9Fmu}4(v4lPy?uDm0^zYIo9(!dOf@6! zK(;VubdRjJHWpSYLinl3@(etTaXXHyq;My)2L0h!MHP+#eE-=$)Hj;ncIf^ELO%3A zxfpX2!oE9gCC9&PZ%sE|itW>gUzH#$Z(OWOwGeC>uDWn~IxzmTdUSnTdmz+=g%VIO z9il)U2{ht`ST&1_Gfc!qqX<^IC_%|1i^qQD&`XYf1`7v~|Y3*UDgy~k&y8{ht2hNGYRq9d3RM$LUC@Uxtr|I{Sw zd`$>7Fa&kM=VJc(zCs(=n`0VeB4`J-uj)*<>-XHbTl^#1n2b%(n`pWhj$p za*QTW=ClSkorX7ghA+!|+V;|3s&SeHhO?M>pEi0Q6Q4aI@C_Db;)KJwgtGa^OPE^# zBftc!fJg@?p)QC6uZ!^X8soo;9N8nIr(rkhI-643nlQ{Y(8X^9&)8O$^^B9H58bM5 z8rm~7rr!HvyYrbbbKGkC!q^y-B(#6v){eol02o{@no%%mSA=cgdO!Ay$C(_8Hkpx? zQ6bPo1m4p#85u0vLju4`Wkp(ZN|RJWER$tZn3jk%2uiAQqObrC*GNMHLcgaWw9C=r z*&>W5zz9}>Nu0@ad=XZF7(Z~TPX&@N6$;RZ9_;F!CjD4&>KcvTBRtZ%a?Qf{DQivm z@2P=8?;23CyYMNrQTWDh@82%aZfN|~iaH8^1DsGY!Fu>)@3#{R`0Tf1zz zv0QojDf01)ekz~;?iKjPZ#Zh^xAGc5<0>*E1z`n=inDs7Y7&GaTkO+;O*T zH+QzIKXt84;&Rl@rN6&fSeJ+G{aiWwJx8NlJX*W4Ey`gO)mT@V0!<|NqzpycRUwzy zyDFH}whbj^7_NFBu%5C$mlPbbSuzW8NjC3+#K)o=9sLv@6$}v7OPWginUDMG;BM?PUCQxl4kODMgD3h84!#9v)`T0vdM@43{ zA|OUgoQ30_KPxM+JEQlu^QG^eD|M%aX()^Pm*R-O-bLy}F2k3@%+_*j160dvwl-kb z0EVgthPvMMnHJBr6E;A9j_u2%qSYacqoet4;Xb@*#2v$FAi2Jv;Sgo8e55(Ts-y}? zkkPJ8j^#a>4J^Z1Od5~#{XV7fd6VtwO%~}q+|rCg$WsO}9?O@-potS-m|iR&q*?Q1 z#Zk3%z;P-<#$t#@GW%nK`$)NCly>VhgqHxvZm^q-7?VF&lv%U}HuN>n0|)%5N$Y1v zLQ|tUM9^Mg_|r)e+LLz@y?@4eflV4t(9p)$HfJldJE&tt8(SgSeT?uRg@hqQahf5u zu`%|6bPNXf4poz3xImfHTE1xveI_TPOKb@8i@;zP`*wg^%nH$6&=jU=XAkmP&n%M` zI%*6els-ZlqO5L-iFKlt&n)sPg8H!2TTfx=!8qf|WQ^lNld&}jF96J#0hw<-xwYE|%`CkH#MyzoRQ?o9L;M-4srF7HDG} z90pZ1CNJyVVMZbYi3#N$4fw+IMWE-Y1q>YHK@E<5Ru1J3IK9S;Dy1~=IJ?Xivmp@V zGJ-88h<3#^=NKoakT!B3lQzyv9$YV-S=WM`#?_^5A*u{Ls4|oZTmx%W1DoJ`zn5R~ z1Nr(lzAc~r?CG*_Vfn_0(lw`6!XtiplWzczA2&|kc+8PY z*%SK1k%M!lPm`@TnkCo5p~>*~`yP_Fy{eICiOXQ#TKb$cgh~uf# zkQQ5=J}FTfc{;8cXhHbNiA16#Tbv?c_N!7eh0B#U-lq9E>xJ*~J+pL~%zJo&oPEi! zk!-GZbKJoOWcF@sz>ZkvS0B;i`A9#~&YU zHk(tJj$l1X`bjv2;T&Gx;)pum&8$17F?HC`AUzj-HAdR_4Nuy#p!0ztOo8Q12=hK| z__}Z}*UMqr4D@g>-}8ESOq&QRyO)>D8(CB70y-GEAdV=X#mpAQnEliwq#=iCI(^5^ z-VM$v{6<<6R*4$mk>vf*RB3Ex5$WZW5|;o2Pb{C4 zK|5N?t7)W{Wp!gPzF5m6ocsBmUOmd0j$RxoH*CkM|9|%01YEYHs`HIA-l=X4KovtV z4rc!Zh(BKzWm?0W?6<#+XgtJS4q{4rscCsn=HN>34Tm_H3QW zG3>c_-Hv-XZ%aNUU3cdFTdnTj^3C56zUHgHD*W8be<8f)n%9N9?y}F`uI+S8;yPFh zyL;RmTVD^)|ElMOmwx}hi(65*I9Bzj6)E zeuJ2F)1uJ@Y;^*-^rRiP*?g^D;FF&)`bHc-?eV5(f(E`$?AWAl_;^AXFH!3A_eDha z1K@7d?5rH;I2jAaa1bwi<8*l#HkP4qTwQ*p7sQgTE5?A$=ikfoG7xO#G?u}ie

  • o$Dpt2%!>W%={zA&4J{BHujl6hvl(1_Iq*Q9=Q3suyMx+ z^d!dHf5gw(y?$zZq#+(vHrDn0>(=#2)_AaIJx+v(no&0W$uSO=foYb6k7Gq6N6@}K zDw+o-J<$!~;z-j-jZJBWwfH{T0F$>oo1nQqaez&*@THi)y`U z7!z?x-M2-Hi4NbeJtQ?Df8V*!4cK~~M~k6Oi+a?1Id4loCEdt1(SXed;KWo$ zfBg4982qidwj9H((jVD8i(dD=oVO*Pl5SB3#iBols%)sge9Dz~rG5i?tBShXCq|ldrzwnKDjC<;MSB}Cl?J388 zoaUhqP5*bc!$Tir7f9^0z2P0#+bZAV;aOKap)=C5joI&f{uhRy{f$2gx7~ejIBP3e zH@0-Y-+oQ5e)eaESN!&$hIhXIBjMb}X87&D{JZdDFS>j%ZfP8LoDaYL`nUA_zttw8 zAN#PhlD4PJ7>yvdm&!~di_HSy^xD%uyaE6I4{6HS-p-y&KcYWi^r?@3Wcb=I{;cq% zM?E~O^xo{+eJ5%u)qSi4UFYUlf%XV)c_Q{0ZEtR~>H~S8O>g)89PaI?yS-c=x>DO)JeXkAM_ue=VZTt4?!@0kDX*mCmSA>;^Um1>l_K$XM6FA^p5-4EF zHj=I>+DO=Gf%-L@R)+4lv&v5%Xw$2GKZh+x=O>0Qd2%15Nnj>}@3)CzO$f({VY|OD zV>ot^lZO5>R*c3zW4F+fF_S5mr7whvaP(mC_4){OF|a{P_Ffkal;glh>WvNG)Iw7K zyJ{1VI@v+v$wXOt%`<)P1x-G}Nte1o`Plk-{n9JK`ep16Fwn6o%uxk&U*KiCKk)fm zueS>#o5@{!deif2lfv0wPxtB74?>#UUAHar;SYMExA&Uh`#ohozL4xEM`;x7C*C6ZGAhUG z`_B1$!uh{{MV$PNTRvy*vTxdFKwa>cT1%dNKZjZ3X^Dl`pkAt7$6(_s;#-b6I%@3E z4422xWuWs))!$upm~v-loo~vAb1>n%#^~rhdhmlUiQ6)3Yv%X9@BQJVZPWayNBZB% zTJp3!hmU>Cqr;#7@$16vcitI3w?t$;x{-G(HphOyHjq1g}RYT*I&0ty&he)d}Fz6E}_hyfx@f+QjliTgw}ETMmB` zv|$cRual{CJSE+vJ2~wfZO7Ji9A%&MV@j9blx;Qv{E&-md$N7D8*jNIeC+nShfV-1 z&BYg-3Qu|LBjPsCmz+Ko)>a0$SUr96MEJkI>+8bR|Na%>%me4cul(_w!goFYi-u2B zx10~}`{>7Qo8-TbNB9)G_wVIk!!{~lt%&wQGh6@Dn@2WY)j#n)oP>!;$_Vkuoc6)V2R7?oOWfcjT+#lYx+;wRLy z*E_B5(00+=_t+$`Qa6Voe#a(;x5KsjoBSQC+r9(dkxqHtqVa9VwrIyOqy8SVNfWh` zmxbUbhW(1+P20vv_Zr@^NnuS6$HrL6sWWpk+>}bU$9yTT*ZeAf04jY{dCE6 zG<4&f5B3_j@NJyqUHF5o2hdf4Cx6nDy38ZnF2DTYL4OO`j@tQf)Q)!{2W9Q_)GM%U zi!mqJ*3%9?lMFelSakxpRB0{g)@og?+MQIJ^i8KH)vp7KqYu>n%N=~KKd=r?Ffqrr z|B%Pm4)%-4icP+1-c)Q=kL>PHS6h9Cw8U(SI>M}_~CE* zitwLa`McpmH{TY1`q%#`{Oossz3u!uUcELpx57(*;WxtrcF*C9FE|-~@%z6uJoJ+C zm*l}`)lcT^>RwN=W%pdsBz5T?#r?@$>+@jno`3H%T+0_yx#@_ncx<||^S%Fav(@9) z@c2jAkLfM#uKVr}uY1!w!oT_Q&u>A@Ld^lI_wcjGJBu6#eLRP;rXxOYE$2z!+iIio z47BDfGSZtYj&aiS*we{JCnUDGx{5$e(4qM=JmL)K>SLZ8^tbshuMeB=eXVT~`1+JJ z9cEa0*p)Nr1u2@O13%|uTXf2?9n^6glJnoM7|u(n$zV+i>vk(!XVT>GhVl9Res}|g z=5bo(QVsLx)nuLTZLxRh^O(6@>Wnbfh}FElAjbDj({aH{>Q8hqUGj~+rt7AXUX#6g zAxv>hj_2XBP5wTmuKZQ`7Obt?q`jWcbG8y#&upB?v~dC7TQRQViqCyBcJ7!=fT8-{5-4{3Z~(1Q`d)n>rZXzyVWuHSez}}T?j;+f(k@) z<|B56%GsI-6^`^L|9eHYG0epVjQMzxLMyY%bkEeQd6_Xm))KF~;I^`7$%3Wk9hzzz zkEegRvd1=ua=Vn6r?z>%YPP#B%~~QhjUE@sF!C3euq`Vsjldv8@ZE^i#iPZ&V*=!^ zD*he}rOJlrMKx;refi|LwH zcQ}-4G>1DZ4pXNDBTtVMa2F6$Q(aJ699M)C1Ay-t6i(2V|wf!b1TwF zO>JDNZvT^_u~){OuZy$E*$a`9c%6S%X;0!ZK;w@@j z9cvxU9n6|MZ^mBq-KTYYQurtvJ|GGZ$hdf4qtNx<)-Lz@=U=)5#s?4jn{zc$Lz-5o zQ+mP5$g`c+KApWU`B!{CEu{JvHk9G})ND6C9S>WREDDBw=XRbabh_w)y;d;T$svVr zPK35T^*5Z!eT~Yo$r`JgMRh7-!-r_KA>{}HZC+qupO_1ziuN)Ol#TBIH~6Gjq`k)~Cy1ksPrCy?>%q$s15Sw`^{2Bw zlxB}$FtN~$hZ<`fq8muVhP-gu1-X=<3);zBU15?fHz@=Z6hy37Cp$Mg?7bjPuhlor zO<~`9=eUMZcF`ghKu-jWD4m( zowicZO$Hw9d;T^Z-L7)jru8{Dd3dB*2&4(d!C7_htRmdo#piuaXR{=#aB4o1l+8?< zU&ERd-O(D3WhBTe!lC ztl=EN$Ep0LC5+MOHerT~TH4Bn>(N}Y|7LQ#^zL+ZAH!b_MqV)-!W^zd`Vd}eR zzN>Qf4IN(}W4=`FrtAM^`o?_k>umOY;BEgbb6<5l$jQ4xePdvyV)w*c6q*_@DLv}b z;6r=WLNB`is%Wx(D~^@@l@_0#yu~sTBd@$u{>M7&l%Ss)1aY8Ihm4SFhQh+0Q}_M-!`j2@0J91%7vy*{uQ6w;P#hiXKLmnP3Ra znct)yy!LRx@RdqlPMGRBWUJ zbS|MATE(&;NXkR8LHCaXBI%uYvEc=C$D>@0J2~}mc(+dd0uN4tVr_*NeO%&Wec0j< zd5TYMzpc89PJ;VW7i$3FP)dhJw-jy2`cOJx9t$uww8-mR^JQb@{iDK$lVJHi~hz9=x&AH!2e_$;&{Ck7jTsY#-21o zO%x3Fg0gPv1y6J@YoY2bPdoRZEfix6H5qj{M2IjDo$4-uuBdc#NVbq}nY8 zwBWkYqNi9~r19x!Y6{EJJ9_w0p~T#%5Q#WlDrlE-54dr|L1}I41O+Y^8>coYw34I(|%^Oi3Zwl9{cT%GhER}sPCh3$QzasjP_I?PkH=dzn@-uyV~dsv zMrWJ3{eQdpb>YJ~cINkNwEcUftY;%~U{~$H55rSY^0X^>ruvnjeasWZlco4~PnybC zIJCTO+OltX?X)K2T25Svg181D3KcOF0UmbiML8b}xcLtID71-F{^8Z{K|bsJ*)6cd z_qDTDK#}TmJ=;m)TeK4)Gz{f!sR*_r&;t^IY&-Am2n ziYto?XpJ`d)3#xWV`)D?KyLsYIR;aFL$2n0V780Q=vt_5r6TcIH{JX3Z(<&fYr}^&2 z7GM@Wn@K(tJz6%-H_9@yiRV;I!&&md8CK`{tmn)M-snWBX7MJQ6V&0t9 zx!`i!#J9U#a_ahcd|hzhfdAo_1jPFo+yJDU8v@%MPSga5NIe2QyxPiaqxpr@_s8D- znneD}p-u%lN7u)ABk^j=x$7?oaXJLpAl^7=RNRx6xD`f|HA_syd>J`Y*=R|1TA6)T zaVhyOD+d$k_KUY#Cym#su76EJM|WK_escI1ZZG4{8zt1wMVP8rf6rK9{Fb5$odlJvWCliFN@Q-joHI-80&iyDvLF_YLXN|iQ}G#TCF7qAAE`IZd-;p2 zR?fCtPuBv_!{s3wigj(*+KyS(U95|CYa|lt-QIP6mPeQ5gC|3`r&PK%+>W*ou5#P( zegJr{7p)0{I0nvyNmdKy$-)U!wXuhT@ORZBpPY~o92R9iht09 z7?P*LpBEIDaw?W`ei4t7)1QBJ5z%j(dVg_3%udBohudXqV`>U=(Q$EcoV~Sl(!zah zlr0DF*=ch~zvy$6L2w^mELp?ldqL}|#_Za(z+tZEHac@|F3j14a#7V2gY2HN6r8$T z1;3%m&*OD$1ad%Jr{>cyV_0;(%oK^bbUUoil-GGwLyIhv9aZ8r_3GNdy@-S|bhC*6 zuch?kzm{8mbTSh2`eV)M7T+?vcvZ#z{1(A1vt}xTwp>YSz#jknS;ATPf326CBkV2p z6i|R%Fv_XPR&6T`s1%L?Y(}y6O|UEtiEftz!adg#&o8S7f!nTS_m-EfZD-uisZUhQ zVV)5^$im}l$de()UU;I*UKSI3e2B9lBB$xEkP3jXp9e0YqMRQ;)&zv>bsa9?z?Et|1J2C=`jsa2cg~ZiUEdCbXnPX%{~;Me~V%lmpMtxHU=XPD&uJH;HBvg>#Op zm#;T45THxL-9wB4a^fMWQD&)ZaYxVL9e9$;%F zxP8<2cfNz_I%V+t4q)7cs9@8+UQjoQZ?BVmsKEax zNcv;Wyhl4>OMUZ}qc#!)Z!PmkR4F6My~7D-+sZ2O8*>y)cB}B28J6~gQtwRJ?3l(MovzT}5Tlr90A9CPT~d%E-GUevSpc*5 zIkM*k)Ttk8agZRF`P22N+-M(OXW0C0x5d)F{$QqL`*%|brpJTNf0OiF4RE~M2*&=BlLR|5#K~omE5IeE9SvsEzAL^-cRQQX(Z9rTv0h9*<6RBl&uXLNUq3 z937SgiIz@E`}yGTvdoOYnW%GV(_C}Z&>$&J2P;_J#I(}bMrb3}l@I;gE#(~TqX*?+ zZ(n7XT^%~OH4ez}m#(1YC`1mpX|D)^M~x$Y#(~dBZF<2ba6xLKnH;IAG&=uNCGa3 zkgp$$tvw}J=#f7pPP=uT%4G5lEe6$G;^7nLRT+SDHo%$cV-k`MPwKzd84}|I4!_%i3rbgci;spS-xqXPC@XhisHSH&#)W~b4D z2Zs{MS(fsSSiAc@AU-31QS{HoSunBppFmeK>VrG#7!nE}shx`I_wqhvl@^_K#pXQs zpvST;9*ZhJ36j@4hff?}NA z#8QgQK|ql!^aMZ?6NuU6pd_5)3Efd37jzzKZ`I#pKJjM<-uv?SIznGrG;XX)7gRct z99h9Y>I^-vgM5J{u&-&1`ar1|I_ohG=deCT`Rkq2tM+)PJf-R1*ry!KIb!dg_B1BJ zi65Hg_OSDk9caAA!=4wYL(>xcE`QPt;^;=eo!@TOYJK2 z++9?0U7AT8;=P$N6U)Uu^Q=PhT4j_?vsd&#ud9l275Og)Cn|X2t>0`dhuKGk!H1~w zlf^4{jUQzO47H;3!V=obZ<4likPf~(pWcWq7Yx~1@)gU%hSFz4iP@*gg6{R_yZ61~cZrC4YdNa;)q7lOSesKc^z*Q%zJVb9 z=om58ehQ!`rN%e9oqmk!AX)O@W*`6W#bWe`RVu)BxyaHBBN_L2x6b;QY-dXkowB{Ku1U1m#*ezr`!(QzN*ZZJ3@M>|BA#T;Go^m?98L6r0!vl5$C+IX|8Fo-$T{P{Bv8rZf^A^-Bmr}9 zqGVDtQD&`e#>FvdTjN{^zND;-!NL8~E%MUh`5UIt+41fC01hitRqum~{DmJvvlPD; zbXv<1Ge{`3E2Q1i`kYy{->QRTh?sn#BmX2I(j z_^;w!3f4zTk*nXfyb2i%RQ1?vJ0g!7*lP>rPGrThB(C~NEe#S{VX26OCi#6y2| zn}sc7=s*)dnm~(v%hA+y>QP;wX@kMwM1w~VcXRZwF_})t)`)gKun^w+pZos)J4qHf=_{aTYqY{(>YvNlK8Z*MLglA=jYNM)tj zfECG1^-J-avJQ&TBd#L1StjSyQwr&_2WZsS5Cq-%CB?FJJUu0ATWW+`MH*!nSNvbF zI@y!Sy}i@_pw2BzbW+!Xx2sn#`E6}jbd7<7Y{bvdUO3N0>xVi&{N1u0^YUqzn;G1~ zCcR(Zo~06(Lb>_+3qCnBUE~}|IvE#*A=*DR7Ozz?98oe64td8#MmF0Q*-|Nn9c8JD z%9o8RW=W5YpnTJ<4@yJ+#&lN=pN^h=#p%p+J)ePe-vwmG(N3+n6#8H$f1Fg)wNX(k-~@hb8<23K}+X{3updRrx;&sM^z1P zNzGrMC8j!d{{Qocl7m%ji@c&zQl(s?N)CyW_r;-D>g&3_$OBCbfj_*wwr?ZVDUwfh z9ecK%&sqK)vCvV|;u6a*`Vh*WiU2@(dGQA?WJ^f@#D-PbXgR*6_}4f%a01_6_8^2> zY86ROOhfIN5jXNcY7Jt5!4_Xim*=MWBEK=Yk9;1fMqJ+H3!3xE{V8urSmtoWSXM+g ztVXH|J8rE<)iws7X8yTy3E=%>D2h?hNJl=map}HN=JVI7{PhssnwEXMmxrCn46*)( z5zO*6j;um&AZOb1mlRbQdhn##WHD5_N~R`v-`@O5fu^;1On(#SUfeEIDVMpFtBI86>&? z*;zNa%skrN8(a6cl-jtm@wc z#n@SzPU<QBN`_PjE%LnTOOI$uz5@VyEYN$}LM3a?_z$@vu;$;dtWsz%j+;a%m;|pe#O!&sxeks$v}JXD zVgr+}S$|O(xNgvc4i_vrM_RM%IDPpI<{VVZ&rS8!&)xsmXOwmh{=MjVM+!f@Y6`hI zOAPE~kd1qZ-|4sfMX+(9_YFP-ztp!}D`k-HIUbk&*nD!UITBZ<&;vd>PXnWa5!R9N7I<S*}DRChhRfq;HAM+L++FvgRZA#)o_4-()|C9P^ zdZ5W_X5e$!y@=gy9ycP-X`zVqcKD{{=Wb7omCH7NN^X(^;^QUY?HQ7;x>fz2j{;~H@u`nv9ltCBer=gOM7g}UCL8XPbw3&bnR|_mYdSy)C3wY<= zHJ!2@DweOG5KP0B<4fhn1FalF*b;_}U8_uGQe2IQ*X??Rs#KA|J0j(J3A$zvU$i8G%woht^Af&^L_SY4GTK_H(0YS> z$!VezRHZXjo*Q$a_EIf1FNTe`xGL|Z*G=a%&FW4MluqyS)a|M8iFQ(*+$3mQ!}^sH z4lnn9n-bZ7t0M14D)e+%G!h(X<+3RL{2hA(gWvrj8cU&EX2_sRpEuK{$^GefDRX9c zC!>I-s$o4etsNot%RSS9yH)oL%*?gY@8W zR;Dw(sA8cw&btt=d2r>^WmA`Ga#Y%Loz0W>=H2nBf6GDX$1<;!L(BSiqlbQr)cmO; z|6z}Pzq)Vy8Dzbe@1bR8p_eA;rXJ zDqkP)`;`x$f}~8QyKi5DL*2>jpW05A7q%`1-}_21u8gbZuH|xQ`xOjW($CD4Yu>04 zJV(Ma$C561Gmr^Y=kh zmqS_ClV|(h%>#pL-TB?$Do+9kGTy!%%2Tpv@)XgkjNsnx9I#5S=G!zV7r{t2k-|&1 zL&%0+UB>mnCLvuu7;r$y@S2x_UWx9TUtw6CvG*%$PX`H^lV}W-!;6tB1x02r)P5DKf$!<)Cn1f2euwm+nc6Z;=bgjQD z)szl2he;VmV7ZBlwZ>VeAEiTkUIDHwrusho1Bb6pYH8~b-Ks)wlGrz_9>oP4I}fi<-2d>nJxxM{fMp7bozi-_){?Je`^P{u5OY zcc=Itc~CXT8LlxBbfBwxCp<<#y~vUIM!_Ou;EIFIYI50B9r&zX^-*F0?x7>qs&$wl z4h@Xzx6U(Pk@_BK+j1iUWHTd>4?-ue{hY#QqWrK&JiKMrM`=7|x*8Yc{sOwq>leQn z)ooB!P9Od>;+}?|;Y=RKx2t1a!Ul{iHhbkaOWVB~8VQ1Bf1f2$;_ox-&?F^Xj&K`H zfe)OyuvHAD3{xh{dO6au)w$YX597LgFI-BM&X2|zY2m+y$yV!p?GgNgpc(#c1a#7p*Gi+=l8e{4tL=#E_+M^3oJhOdPiDGsz)yOSxZbW-wmD{_l` zh&COVmthxqul!yC3Irp2x<1E}ML1jl*cY!#6*^l00L^&B(zQK*rfKyp)aNn)&2*+|Cm0!ea2_AP*l*${F*`X# zorEEF@{`<}|2DYQhE4!2MPr+t|Jey?(0|2pe% zt8waNXTG)i(an!8^b_L46qnv~C#@Baflr6NH@tQO0%A5vhoDiuSLv}b)7EVy(p&dZ|d~M_hLi3Ug`7pEYN;CN1Hj62J>diu{q%Vimt&D zpqV+bD2;aSX|?_~Yqzsn+?;t6BS{b~V(X^Xe*X?A(RVQeA6+6JZCwQD2NN-O_oLo) zCHi)Osb8q66Aao-;=x~bPfNOsI68{E3f(4m8Ts8kMl8cdkgA!&b90rcBeNkNjM>+L z9h+uuMGV0qrnSLDAUITN*a??}xHUu`e0T>UH(bdOBfnT+n(|z5n!IybNXuEyKe3pc zNhqSf0@;t>%VG=oiDVE%5ULfdtS4SUhK@}2xEo`vy3G~ZuZu%OfyMdwA%R$H zGt;sXD3aAuLdfV*$p?D4c6~M5;Ieym{%frwnh%kA*y>gCu~^;3>!t`$hjd}i(tcMa+l-Hj8F}L$mLm!g zYFFu_)&wV^Z|7g8muE4Sb=-y#G`ZZxFlJ0fOI}FD&`bXR-}8n@etH3F`WE5MxSF41 zw5}zhV}FhNaMOq{lkCg?=}FHTC>t+ZpOB-23qh|YV5(MYFHPqUQ-#M7^J^eQwuJ$7 zvptr>O>r%lr=Mwovovcx+W12PWBt`Tn_5(#rFFph&F#u7kCJE=Tk~6k|JdojLI%=51h$7Kuhi*!Gege&Q({|^dO7~4Ug)?Wd-}6o zw%4%HeJQ)3bwmk-VEq%UkK==MDi6}R(;zbXKq-O@|wiYTHhHt$LS z9EBZ?MTI$yN4r1M#Cf|!iWR)`qIXWZ|_6-L{})s zp6K9w!#0P|ouDcdFJEhn@vAV%CaTTl0Y?+7arzv(vAAPCvw^ypLi5cu^YrW(pY}MqOgkc-5L25jCbQ8 zKrQetDeU(lV{vFl%-C{)arpIU>zGCZ%Yz$o(EcR*nXECe01sr^Yb})M{d=WN02k!_ zSX+K$qRCFAX9;wD>zMF4%PotrkkWvVWJkw~?x@W1GZhlf2yFF_9N;uj%z?KVeM@r+ zm;Mt`Z8^WRH?T7r{!i@7ERPmpbP_JZZX5;$gF$ zAreRjJa}uoy^Q74@t!YEW2GKXN!24>-X>P9W!a!`*&@5p61aB_UES1tYeSvrb^4^+ zdA{#Xwc~>$(Iel{C%g%x5>IsE61q+RDo_5IZUux4Da%6_MtjN^6J|z#mqiA9VARH7 zm(btqBz)b-Wgi4vGEg4#^C-kIBrY{vb%%IZ)jzI14LVahqVMG`$Z6gcOP({0?!0xG zHF}XSO2#%=9ESp@YJ*US)|CSU`b6LE9w8JTu*y@f9{n7;!ixF{YKOP3@Z?zwU{0vV z^#kqn|0mj~&aC$I`neEYrl*nGnnQlV>KhR2FG&W119+u4lh?MLNp}@{zb_1o6`_-I zJ2m!Rms$dCvTU-)x}UbPtLt@+0`xZyv3|?nV;3(dwLXZ***R%4L2(jv1W`wQ?(OqD_e#%Pqc$BFVnQkT-S&tE1#!51PlBs0pA z9OtB*ez=be%$xtq)&)*HwG7%KCQY5OnmrM2jfK6k8)k(g@pRU5`d$I=~!|b>uHY&m9 zd^k`bn~aw4+j(h}Dmx-Z(Eo1m-C+F`yA_hEq={#|8g8{uA>ybiO6KBGm72P4hP-+O zL6v%-OoU@P;-si}Zv$8%1K_CPDoiR61@Jv^83*C3)UG$%jecR(4c>42_!zq*oMEyk zVtqhw%%~)giby~jzy?4g4tGO|FOT6@aaBqgfxj&q=8d|@CV8PYqSv|a`a7~jUK0CC znd}fPsvyXFf9&NFtXyhY#4qlGhz-j}*qvxwZ_4jEJLKxqS0}|+03n)*u|y@w^Im}1 z)4K`n;l7LCp96Z^^36L0%8f)nAVPrCQnjtUqKao*-f2&`ZNZ}|?h6na#AthlAEw8g z1ZPVRUXc|=uBb!Dlb`+L%`vi(;!K_lQYuje7j>3~&>_xNwA9 zx$);Y?<7c5rKJ*KbNWic)x;*#3BMla8^&uK_z|ceqh-cFkhi&HlAZ4fR{jL5?ENxR z;Q-C}93aqYADFXIEHUo4dL*-?mSGXS#TS%|=MLQ1e;f%bAm$`kIQRT;2<5 zW8XFPll3b_6&LbH=;u(XgdV+ zTz*n(89Ju*4k$uvw{PNIyZVp3g0U6vb*b??!C++e4lTViq^32E z?n8KiZ9{)v2*nMvW}fUu7jV;i@#H&Zm@9ksBn{0eHQ$vn5Po_*6Y&`E)7M9vf$>lbg`{v&3O4Q=MI@9Dzb=C86K7p4f~ ztc=rcm$z3KIY$8K1@#C~BD}0Anj`%9Y^A#X3_z}uR9_*mG}OMjDl>iX9L9eS`@x5k z{#SuCZBvr&x2|3ml;c!xdDaUzpoBa%YyQ=?$n%6pJ+!O32_BkN_VtCPbmCUN2gcyvyr0u{LJQq zm0&5b0Ad1~3-lxT?!~gG)#AQ4youuvoA3EH@QD3d&!=UDG-u?h4l?Qq7k3%-m@p$h zXz?f>QH`CDd^5Mtb^9H<-lH`eAM$P|noAMDerH(di|>q=lk*3~2S=fMd1*6E3|Maa zyKUX}=#EE7$S78p&<%WrdXG>qa3jWNV9QF{gv~QJ8h<>M-*D=|n+%VOqC3}AtM(X~ zf8H=pt*{NCa_>@Gp!XuYgV-AL44&$~33kPw4TBZ*Ffs}&_(Qx^s_&W*=b7(UeeaC< z%d9>MPX@DfzUpskV>@F#kkN_ZYivZz3s%e1lhne`k8qJK~nbd{*+c7 z|HIcfp^UYiv0E`+;MTwtTzjSS`qJ|d{_Vr*0fESN-<}tun^hU20w$2rglWVc{d=${ z-g_P=v&al)n^4W_W>yW>pRLUCmXc7A%CwDld&y$Ik_?r#*7CyB7NAl4LDuD*~t zNJR7qw(hNGH4YB+5Kcx}G}wIqEU85_%y{1q?mYVp@7InU;c`F@ z!jH&LMdEb-$?GS$G}QO#?_;-My09WYlB0XZ1u|tsPtSYGiqi#zoRgO6oN~_BOq(ar zN0<*%=f_{FYq=u*kMxHxx)`_JaYem1*Ff2od~_r0oGv)e+^IIYmkaUh~isX3eS9*7gh%NWdUs^+*0Vkp;;Jqnju7V8LOMU)JFy8{#$aslw57_R zi|lOG(v9q?1p-NkpKMdeFEKa7TKC#kXZRD4`-7OkkX_6>PvK23AP}+ccc76ds5*gc z)eS~z$qNE9+8%RulRpiBk`8TJpaOtYM*+rEi2ZnG%CzWU7Q4!R7BSdV*&fF{H7=RK z-4(b z5Qluf>YR`CM({`#ZC~WlgKKH)cgR^LD<4P}3Cot-ineQQ@rcQIr`24ML5KlP){x(r z74-F?%X!)8(4!fq#j=As29A=BVmFCU8chYvXasWC1Xc1x@-}XKwcm>-`N*b&R0fM} zzE1>yjcSBl?!hZ=_$VQ+uwE3{1ifTt7i;!dZ&h#dDzy7VsA_4GsGzh+wM-8vz*3jf z$t9VUEb{@P*?Wck3kRQ{-LqT68guWD}Lv8HjC{7S)uODP<;8f1_D2bZ><1h z$Pvfep`D4$bBWogB9crRrM$AL$M=Nt567|zz%~>y=jrhe?sW*e@5meey*5Aw!GHfx zk82JvLi!-5Vn$23@->c8AhnQpKT9)JU_(mY?$Ib%a5yY%P2PU_LV*a60Pm$)Mn&oP z(Wqiu?Xe{x6I*X<$`?k%b9-TzgN9)fzSB_PIKqYqQcF#HE=%?2EXJabvDlb3Xzc;GNB?D2d z5ISGAk#x6-{-qqmpf#)^uQt3@y|R?7f(2RmC$JnaHYR3asC!ZxcE2fJJ4Ch;j^#qwbuqaolo}ijL}Gp@GvE7t!YG z1sI-&NKXzCUH)i=KL_v3PFC?mEuSq)7bMl+e5$%xti8Rb=PO|QAX1{ z;?G+1>)%p~kx-^YH&=-YK~`icpVP8&jxMO;*EzU3qj`cWN9SCh>KKj3HGeS>Hd2^n ztvRm2_yV9?o7=tXw)a}PCviK-^S2eux}3m`6NgB0JiXSQ_Ln}+ouC{TV`r}5B6>l; z74CrwF=%;I7{V2qUg^CdieRzPnM6L!4KI=_g1fR}4J%+qq$&;^Ds|TyHJx{cUn&2N)^%^{7z|Fhxiu&Ul*!+Yy1Q%IGiRRV5E1X1rGQRt`m^B^erR5BHDg-a|I>%+rWD-Lrd zb}JPBZo3wv+Oz+|r0X&YlJKZzws-yobW((e}8`hq@`-&Izl1l zi2}GG&qse!I%4exWQb4tg?QRx6Qz3)kqxi6e+MPNro;TIn~oJN>M zYlb?qjOX!PZy%UOrciuU+AhBmgAb4Q;_A*@%J?92y)Q?8s+$y>#w2awLvM#g{uX?p z5vzWm{n!gXFifzOqOD|{8^n*-%Tp`U8m;4!EOmnZ2rChuMqGU8jQ5H>xh$B1;cI>A zs>I$XE}9JI9!sL^hb;pnHhgY)>*Bd*MxP=NXM8sIk1uEo* z2O9&aXNZ@k9+z~(Js>V4^1rK|eKH+?Rx1KCc0H=J&Q2@MQH=+bCaJ*|#`8H^*)JW> z3Xxk7UqmAdLJn_6Rv>;eYG&TS%1em?%fr8#E3;NO@thzt|D_OOy@g&rFi7*|DE?{Vh#gfaXH1Qp7?C zZ)wq|VAop_0GSbH9II3@x3eNCd5nG?bPAFg{vAfZSG^m4=ev?vy5_a=GBNbV9Sqi| z>*+rJTD!%xFqV3GYRlW|*fwb8p%x<+(+Ms%u?ew|UWZukUpe1q3#JZ(f*V&NZ=@i8 zeidxgnjjBI^0Z4@nV|OwEv~f|0D$r-9eU z%;Lc1sDVzNuV9wfd!vS|ehiA@Y*Mnnnxaja^7TdSp8Oocn{ur^*;W>H7$v-kqmNu# zl}AB6@WBubI{0K!ced~xc~k1NJ^__mmAEk=OEUP&p)#uaZ5*SDs{*g~%M?S+Lzf?E z#EPoQWFH*0z@9@K;|AWHd^+;dYJp6?=)`hoP9ye%d;3H(5=!eoW*Y?k)-|X%s(R*Fg8whD_L0PKvzzf*7Veus2ji1tN>Ce7_COg*Z3PZeh`V@ z8P%?-(UFg(W}kXN5KYol-YmnKlsjO|ijc^aD{@KbG}BBpin|g6d7T|HRtvxCiUKX^5W%-#3i2;{3jYq8nAi|qlSmCoDi zXO7bi?Xwh?i4z50T70?8d)_a1EL*z$k2aQ={8xksOTX=zSI1yb)bV$Yg%2EXgvhnb zzHCgARKUpUl6VCxoE@7wMih!|2SBIyw|q7zJ=yynE%E2BzmgPZln=7eTcm1iv`QSg zzGj}o(foZhJ}DPqNaVpK&hDraR&lwb90}rQzD$67Wxi zqUzr{xPI%3X8OJDkFB)1-AjF2UFmtCW5(%6gDVw@kn^GovBsmH^<)&2L!r**fGD~8$y#=(nX-Kbg#lO#OFQG5R%vfewa$t-#o zRZ$p~GKvCHl2HawDG`t=1RVrMX(CD!f)KF)QbJ2Y0wM}hBO*mWA|QfN1JaYw2^i@m zC{jZRO+p9|LMZo}-#OJn5b!K{Cmrg{mJIS&{WZdMb}{>VLj@h(pVmx|@xr1ZWg zj3-OeFwY?gDi`bUOFQ%iD=3@0ySl+aPZl^&KJ=na?;3tm4#~vPSZQ4B8THh9m73AD zJ=R%RyzQE?(9_$&+2$bgNurg3$d!u6T`RkW5<6F~NnZtBNdpp_Etr^CijjI3ZW$g* zo>gvG_ngSS9Eq!wYrGBfjkNzNyX3)cSrnTXJqTXU-R6iizDa~4!KPN80y?@6R%c>?g*L~d2dNEc- zc2`c?l?zs2a_s&Ljf}^ls4JS76%k0X#`fbw&xc#r?z#?W4;`8^3+tMB(mB;<{IZ?K zaS59`ZER5TwiQmuqk6QnQOyeV;;faitB0#nQl4w3DcOS^3UNxVTO_v&W7<$;^f2+e^M(B|&-e2bNQoJe3+lj3#EFF_@;RNI; zz(kf8)i1mhW$2GU|_YFpin5?rS&DGDUY1_@mu}xd_f0!32AIV>}wl6eL zTKTddb7J-A{TMpEHS%ogdG@NZ+bS2yzRVgN4o6&N;F(H_+T~N_{H%e9)|JoP(>-vG z?piYGBY+TbYPDewzO89tR|5{m-jgZGv( z8?XygM40~1OAUS#l0ZFR*RwLzP_H2nWdW(-@sX?dchzSNq%ha>Z8@VKFBm=N+JS47 zMYYeX6OHuywMmpFrh0$eHuN}?kS|-2wjRsCD)8s91}yb#-?-sVX{=g*!wJd;=7L(7 zi>}*aJ)bi4PN$fOST`qvgWgt>3*Is5M`hKtii^iW3+mo)!Eil%^!xJ8KHx}hog86q z__I%>;4>(Smb??hn(bdM{^i$Vrg!^e&;Z=vKhv;G?rlL8_g=I3VUGSmf*=dIY=h0L z>UPgTD!$ew-9QXMugu}^OM{KI*ctC%ZBxuZX>X3((IurT`D%}kte$-ubO>2yU2J#I z>yQIHW~2iSvB6ySi=GgY^1JZbw0PM?iX}9$WXdonD~uPiWv$#|0l$1v-`b`wEi45S zHC#5U8PmFk8bdPJ)ug!%bpzK}Cay+AnIt_b8!g;TfJu~@s<0IR%{ufR9~?PlTXLMm zQ4HkL%hU6bumUpj4D3z<8IA2y%Hbn-`qIv;%g9^^xyEq-rH>()zg7ZLz1Mm-^5$3B z*ko`8aP>ynYz-bexmZz;Vq(nc^AP`=YZi4ZPYRZ*=8FR1D04yC_9~a!HV`s)XsvQR z(KE-?P#a*<1ZV3S`>Npajo>Zqd!<5Uqn>px8YuZD!&&Io^Jx9F2!}SsM87)GcT%0X zo)a|cd^0slO!vX|(GkFuzd9)+CuK9arVE0|`ZwKBf_1|Q@MJ?~j6$aGe9W}R^lOut zqY9$r&fG1AgE!3D8)Mr3kw_tLnbE8B{M%Q}N=2?PR}zY%f84AO7jtV@N<$R>I9yTk z*NT>=m&SEfp9@a|f1iPfQf9EP^7ALxhd;gZ&iDU1+7=W$S!2?A)e4By3?8q|8|6mN zh#ew5m|*~jgZncs`U=SMSI3{|zPF|5C;FM^K1zhyG~DY3@#NpdT- z{;w(kK0I>=cz1GV^y@u|cJ;@+%PLwAgJRpyN>hTQC#n9=yf6jo-4cB}69cT$OJ66h znz`NCO#j>;BNPom2rNtkF=>3kXg(Dn9PA!Q4!okBBQpXKHm8^yNhy5qXec`>6TW{D z|F!p??(a9Rr73^M7}y=LJfM>seET&K^TQUc9Bm)Z(mA*QaRS@xKXButw!`LMMOqlR zzg@4$;qI;8azCmpClU%0XeiiM{*=Cfflhw!Il{Quw^{3T(%lEm0LkV@|~(VQG|Pl`Jj=LP3+5%~kDZ zwQEmqNVyx6L|hjhPrWuVueVtSNa~%jwA0DZYB$s2<7UNKbL!~-s3OaLPa2w&(D z5sU@liPkL)Halg4A2Ll8BLaqK-aw6M7`1cDx7Au-TK9oX8OJ~>@YXuCG_X@o)Zi_2 zu2$PHOb@03)$1laRqqR3q@NVJ37VeHLB+ojmRMAuF-I@dJAL-mBcHODN<0m_+#3z~ zstlHDw=tHuo9x>K4n3?VjIfG{nBc?Zb)?RtF-_FO?op05t|Kk(kEg5IxU({bD>jeB z1jq>*E3XBn{QC6|5@}3L*l9m1j6@BSCbB6d6?OND4wfW8kNC|~v&L}@pq~bBoCuFO zr>$+>;0;nDzZD`C;)bJ6TZvo=Oc!lBJQ9} zI+e*yOWe^DgS|C?+0S6TXZ|q+$?8v9BY^)=hu4#Aslno-&JF`!Fp&54cY z9oQA21_oiBEnjk?DQdCZocR}A^v*~7Rzb_3VUwqnxF-Zjk7XcP8Oxqi7`4EPP|^df zvPkaboNc|o#l@ZTWYBxZt@C<2M_(OHAtj_GkelL8#>sBg*no}qJVBY48v-Jl6PKS< zJQ=&CRr1$8e!Qei+O~w!^QRg$jrt<4Iqd}!_J7J>zWfxPG4t_sn}(mt4IH&&vQZ=J zKX^*L6f|NtpzWs8sC&ZwUcsjuk9W)o7>n&2V8RVkv*7clQj@hxbCz<`aL% z56f(8-x|L;y|+dC%MN@nHlvi*$31lhm}!m*$28xMJcd){rW7kStZu#997}X*tN0xH zVXXbU_mi^U9EGJrDI2}0m|d(j{c34g@t)TMqfg9jWn_Ln1Pd!8DUnxnTGmX^-Jy3P zlg4${Q16)wX@S|kt%2>Wlkm2p{%{+=I#`9To~VpE7UW9}K*|u$vvb~+aCX6XqS$<; z157rC>#qlM50zu zmdC=-3;VqA8#i%NIaAlW=(_8|O&MAZshbP?0Z)OkbI_ExbB`0E^K zHs&T8$dtX=ErUS(;Lbq%QnBU^FDo4SKSmpF3M9tQ5|c%#IR`CC63IvJf%a zh^xDVX&|hI1@FYiCWr_hgS0YF0nG)In&p{qo$Fv>ZO@Ovx3kT~8a`7alSoA=GpVbyT>;NGf&;S$aK9QYd$0kr!GNRKPO@FqYoFvlKdVGA z5Hz~9^^C2d@75eQmtcVM#vm}DyuXzt{2A6NW%52gRQ_4nu=`y{j|{f`ef@jpk8>}O zdQW#kd8-Q6iQHYb)XWrQkjT~wMn&LSH(O7%VU=9Pd!FO^CO}0W;E$-^d|SIt z<)bFRLeSZEK@%1Sm5J1v5f@wh4Koui8RKxrn%mrN%T^<#MO0249K=ZI{kt5y&Fc#?{Z7rgpiqHo_1VM2Bav8{`YMGmi5HV zYmM`fXIa(5{t4*&8-96l$q>?Mzb!7j%Qg9Oh6>0zpGm+HYn!DDA?r%gR~}41j>Yr4 z=GHbH(ytHJ-=OCedMfND+U>>CJl$j}{cl^H1t_WMh$Dez3moo5lG?woTAk>9rk`Bi zeqc+N-F_VQ?;!HD40z_k3GjgZO>cqS;o41A#Y->OyL8wsf5q8Tu}L{c@1lR9reOCB z{c2v8o8R_ER810DxBqKF8wE6*_~QF1G(qt<;xF)|&V!@BO;CKc3sHAe>#FYgLhd!4sr%0VkFwk=hR3kz6__BA#_W)CDU zr*TU56!xBh->uco>{Rdh>s@ETy?iN=@V}TwyQ^4Jp>CXjN^qhw4bI&L(vBae%oEaY zEH1q~$b=tFqi$9A%i^i)*U(%3aEAKWPJbwonPS8;R#O(lZm@6aE-Ty=F1$pBZ2f6} z$1?q-nzR{aRh@&ZOL+ZMFM45Y=7i)=3A0T%ZNwi-s4mBQwH!R0S^K(@E?t;JLBgPK zPRGstp3fIx{$A_ynECpjti9T)d+wI>y~e?Grq{yWwZf&ttFWTdqC}!xvgS&XGrJ`B|~U7SD(e)0P4iYml$u;Corm~&?NhDf78;JwDbn+dWoC6Hm*zzOPD0O>&nB~M&+VL|dv zEm3Sju|ZnD{Ki-~fJ#b)PUZnP{mxc%&_c`tr&CO?0A!7^!Gl3Jg>jM)?8Mp@O8CLf zO%3g}*cQ0BLL)9h^oq94f@vmhwe5g$_H7kk0mzp*_7nnp zSlhvS9@DsxOp9oZ%AzDWuL-!W^*%-I6PRxu`V1fy%Wc;S9JUw+4hvWy>6El~wkDCg z)0`C=a4!vML0#W)u07^<)ZO1dJ0ROOgVf$nF<;$#R_yDry$No7ah>aRjfbRM+ilF( znj{9g`U2&DR4I6RZi(G~+KArs9XRG*Z9P0&rHHwFuyXrj(V?QOqt@Yk$`bA#d-%hI zplgK!cwAm<abc?ExBR3%V|s)a3trK@77p%dR+U%t!wIr<}J(iz{SCCUH`?_KeNWKc{8{NP**?EvR%ZM= z!9n4$_T$E~$j3k?ehao~aH20}pfh^;bItV9ZSUgHev(*S!VDnYOtz51 zAabcsT{H-k4PTDDXfVT6X<|uX@Wq*$6Es`*^S$N&dj}a6h-1ozBCfM;Z_`^)P%cLs z5nBxu2;B(S(rP3qnZkj7i*p$on`-{cOo%(hpNM)g$j`cuF-Uv(VM4EinoR+}Kc9f< ze0s{&m#aT>)liK|a`jny6JuDqf5~Y1+i!R%i6xn?-9Txf(=Sw)>P|JIV?{2?5DQ=s z81F$r5JQN5fsoH3QfB{0vX}dY-F|R;Pk>007<)H7XcoxkJ2{h2=Aca`uLa#E5H5`(Q*Dc+Ju+t?7`f@8<>2lb5JG_lQ^76Fk{3W3NaSZ^sKjxhflc`vCAuhK?0dE2n8!~z!?|#h;VaNg+P;dSD3VJ#=?t>-b+fHRc^O%8_W&DG24S0mRr@mM0Tyq3A^qKc?JNihkb1Q1wPPWtvRJl00s`H? zXQSsfofSp(NObs6EWvyk`F(6&~yQ}53cF+;C& zZj9~C(@}4ChC4GU)Q!$AuW~R{GL^qjglpM;U!i5k$_jr{h06lcXC#HFb(1Yjmk<=$Zu3C-&Z8@Sx<_MR!XO z%gHic?9S1fCHPu=_owfdFL)P)4!)f4FiY$c{ZPnNRlmglzxfhS3AZ>$oeZUwqP`w3G;QfvQ34?ylSvjsh>9ImyF zB5GsTevU%`)g}dGFsZ+{i~;{1wufx`76mgP&zOsZS~Z`Pyn?n_=w$p}y;ZJo@x7CM z_KSIVQ*QJdu`8#p+|dQH>rHJ#a&BECm#w@0^ppxOXMis7DFKZ?`H2dvNRs@Lo~;xe z=-KuxcWEsq@rY~tYuA-H;r7OalN9a^2VPN5FTDz|?<-+B(KEQLK?7GG3iuc_jm@D5 z*lDlNuur>sjs_e{tsU);yJ@E88y)>z)dt}2ul;=;EFfX{7BiYNn$v=k3HvYg^Gz;J z2FsF^f>L41Y_O)-y zPAa)E%Ax==+b3&S1OFu`)(9xLV(JXJLO5V{M3-kpXeN`L(9|NZnRQ4(0$}P*3I+a0 zW@nzlyP;kP2((My^j^NTd~2F0V)TOqtEhZm>4M31K~F38i2`=w?t38f$E#O-;`>;x zL7TK62c0%1O6wXO{i*-$=xe-Gi@3m~v!MLXEed4G%5?HdKSmgFyevv2<114Jq^BH2aA%wSygXwYq>< zsr=TDq0Xd_>*;XBnPTpdWTvD<)}?GEQ8H-B|47(JPWaocw#_;=r&`8SR45E!k8rZO79N{XG!s{lQ;m zBBZv9jTlY`OB(9Td6C9r1(+w4JjNC@oA3#F<)K%&RWRr>m;phtX(2FqH{4h zTc!q)SSGnt9m~zJj#-vih4zs83AT9}zt0yi5?SuA>^Tm;)+1d8sWZ9qjT-;K z4kkyJ{Ik=5GMFkGVgnu=i%GF{>qB8cN|aed8bI-y@w!|w-;6pY;i6_f$-seid9Bo5 zYL^DuVAbWVEDD@NV5;Awyo3ME*R3q)1?`vp z+$4=U5W=GiS?#T^aS#>pAb?V%U^Za}EINL`e@?0kYUR@l|LWF!ZOjh}l`0c=?F-oR zg}#pDDuLI4Cn~@kTcnZk18IIF<>=I4slEP_pBYwy;kP3ge|LGbH=A1E)S)`uQ&X$r zCT2z-<*!`qXCX+t@T?As|V@+E(S>V zYcbKjiOC>g?edAaptjV~p_~3Up#u>wwd*G!=?X@OZ$b@Ris+F@?@<_L=K(-*xQU0~ z)FAg6M9mbsS>N98r!0Gk(#nmoo zpR9R)>~6E=&`sF_#Qx*j&!6+Y*c`bVlaqhz?$x^+Vi@C+>$U$LxqhrI<*$o>HXHfZ zo=>{rz4!0X&l~<W(*l5A*ASe-?*(A%{af=SRxFc}2wS-O7UX9f%8x zXE&6E2lkoaFkgoj?$SSly!;Ho*uY4S`1Pz<=|jqCs^x#2G*by;G~bu6mN;JaQlk2k zG4_E=SofmiiU!AB%u&_z628}UClB}x4UJSf@@rBRL&)kx5`sDcdPHvg)!*f=_ zx?#z>l-t!ioxcpicQ}E>p1CiHO(kZq>IM@3`je0%=O^1KN8aNY;pjsS)`z@a$ECTc zOt0)1g@VR;Cw^pa+kSbpxZu(}mG)fxw*v`T!hZ2e%b^N0 z>)`v#oM|%qL3ONQbH;Qv%L_d*6?r_-K=Z5aeGjIeqan3UF)S;A=xr_lBQTdHMWre2 zx6_;xz1mJvJtN}C6u%~SIeC0O`V&r6*ZX@OSamDoNEv#l*x!H!^cQWH`;cgJuH%q0 ztwFR+=?$}wG7<=Xf5y3}<8GK}+Hj@whfHMLT3N)vse>QZ5=`oaJ>hWmVRqty7NqAQI2Iv{_JD+ zXDD=AGyZcuv?Hh#-h881ixElD7c(l#5$J%^^3|3C&I_jTW*@-ASqxnsxv8C;m}Koj z)?Iz&QRT_|i78!z8ctp4083kvJoVh1Dhok%*&J#8Y;ikkz*wIY#HAev32Y^f?|r>^&X|5_+= zKQzW6x`0-ikpFM3;9Ftksi}IQ2*F`CTz`^g<6MobaspheD<)MZ zd7-w}hb6i2eM|^{e>*eZuVBYaCR>_ZM0MY?b>Dxx_xj9v#>==5&JVT&RgQD_4$Jw9 z3fwyBy4kVv5anb)$+@y~(zNbfXu$T~c$}9`!(M-S#>Xflr58`9(}n;&XNt@O6smcD zCzyGE5)VaY@l;h8Y$^4o%lP3b6BU&IY-L~J@XJVn>QrNKbMV(LDq7T~n3hEkV#LUa zV;{~poBAk=)-QBAzL8A@WmxN}K1}d0J}RVLbb*4%LR2}R@FGStU3p;mTK};E1yZ5j zsZVJNRj(8}>ea}-Ia%fEl?CA?qyIPs%80+}jl4F!v@QLw$reC2s@>eXb*^DYR9LyWE*4 z`M+dh(ZVsS17D8JE6CN3zOr8qI4_|+H!5ydTkDRKid32$I5g(fABeHU6Lr@dAKy}9 zNhIFm$}NSBMAviSg2l8Z>g_bw*21~CGg(U;ReMe@a~&FK-b3+(heyCXM@zktw$L05 zLhbm`neW?wB!=wUU|U#`q#m7TIBfWaLjTTO^By1f_qQ{1BD!6M%ty{$ld6qfA0YgC z^}R^mjM$6Lmy-PJvZPLU3ZBz1XlCs{j&q8|)`^m7?9ZRU+v|!-Du6y-X$s4#IMj}& zD+M37b5aTXoD`Bd{5GJ}OWz)!yxa9LrU7GI?ck0Rya)suAk_23Ss8S zk?jb8`;g*Dxbd#R?i=2Mx0=n1l9eiMq` za2B~o4e|UHLNnsWP`cnoJqkwNclFj1gAB{4LebW8iN){=gF3fA4pq)-K5h04TJw3? z8|a=WrJM~}8yGnU%44UHXElViC_U3{Cpz@hnN=Ct@HQL);j~J~mO0RM+~G+@UqMv9 z+C8csP3yffSau{p%UgBwv;V*n{s%@vPTpNbx8@6PZ4?*KC8qH$35*vcZ?uQ^961T@ z_E*HVak_i?I?=47!y>cOraq|WHg*GPMu+U)NE$-2on-~3Z?@{#KW;)~nT4?n*0PJZ zSNB7==zf9~CGmOeOQP%a{qA^GRZPP5S&pY6rT zMx7OCV}n1FH$IL?T&X>1;CxE|UC?$a=bp7-8qQ)Q1ZXXoml++tWX0U~n=rbUEjZzN zfPdVrX{jAQCFe7<_&Ln*TA558w^kZps`&0gXAy{{ z?wO8&QaTE6PWE&vz4A~E5i7@Zz~}~4YsW1$n0}{i^>ks7{;)Nlc3iEBkf03zjoFov z(-i3};jzr*Pj;X3Weo`@mJBF=NWvLkr|ui-9C#yHKJXyNI)OOmBvM+g74JD!{%zP! z#2BPZ=EuG}J9oE8)!%6=^%KXL!l@$L?(urxZnk)x7WqXo-akPIKN5ZS;Qr3x)xAsa z-~T+(=X=z^HjIyQ$kIzmej5JJ!`;uk1cU2eAt)*SDf!|bT06yRH7A<+af#sPs78%@ z6mS$#t|5nTI57_x9U;L)od+P#iB{}a&r}c$hc)QIY`eWX>K)%~Q}#o;OuKURT{W{m zP*$%yiIO&8>S8e|~Ry^iv&}J3M2^c1fNXY6~zLJS$m(dRvFD zLsqCzI)#i~w5eCrJew3)4rp6ru;|FrZ0>16l0%&T5D+D@`z+Utzj4LYCum;LWHR5@ zsP(7oJ{(zQU_w;Z`Jk2>kfO?lYJ~+>`aE0MU%6pUnav-xZ~UWXUyP+7g-$8>8xO%> zzWmsNQnvGEzMU&kL_xjBHJt`Un8BbE2S7cp?=u)g40%V9+%rC%mQ&#Bo^3^Qt3c3^ zM0SzVB+H6y#hz}=I(wu;k>2*x($nyDz6}z#vh5x zW_DEt-U*OJYbo!(;->G7W+XD-vv~7^nV8vjhyS7yjP`$O@n4BN8~wZgP+UqXQl&R} ziLl;LIvhjF72Pg**Ia8ilw%4i!pt=&lH{VZ$LjPm0?_mK7p4jPFUqE110a4g@rhCr zk}wAu_9lyWaMXjd_>UV>tlE$k;Nk!;GRI4bu^^(j=B^^ESB!vWGVgL2y1jH;%I4#U z_M7Ggsm!ho2Q-|vSZE&?7v}Zw5;Vjz*+6@5p0fp`aK{B8vv_ zZ;VD>5vKY$26}D=U^t}?SAB2cdOT&lS-)oPN@J7_)YB9e-+ngwZjZex#A2CgP!_rL z-|7CXxji}DS$+J_iksP5fP9I>-| zu_Oy^!zB-Rd@ePS+es%O^Q{D*;@CCi-%pf$?W!xwvdgNBQmx$;$w<;8S3qj!>r-ir z%JfL7B`Jox@XD!?&^lH?8>u~mVk4jVW22%TaX+_Y+Hg`+0J$DRP)&#z$j&HET^l-O zn^wlq;>sJXozp3*K`fe#^Ka55r5L|LEN1gW6i2!sRr8n3z7EJU$$&4V6!N4?_v3J{ zUox<78wjDxGT{$u_#I$XYvDAOkt%o}Q?rv>K<2JbXfmG6Sno`)$~DP1d{^(=`1NsQ zeLHI}iCWxRQ@Y{<-OD&g*q{#Lch*;w!q_^3KWNx#=5O-vO#H9!3$$9aKlAO~monpv1xtQn$Svp;!QjsEDTVOOjfT+hy@mp%VArY!J%i?Z*%K+) zVgosY;%iUVAemH}bUIuAom%#r>q5%TbIJur!sCCIozbS|0CR}sgGB>g(NSEuCEG6U zopWz!1H>ZU&@9351e`=UIr-?VgnG4^SC_EXxPmlP99`iw;IF!9tUh$kN@^=f2%I^5 zPjBHimpt#*d_EXo?>*bwt|dqNjtQJLQx>gD#Xq6Qk__++;M7dNdY>mt<*XEe;JOs2 zhX^?qgM3MSQ&wy9di(~+9E0z#GB7G&67{?-Lt>)1SFP=o7jJ=!qBo@Nc%6~B?!^GT zMFJ$F|2dA=iI4Nrx6$dCZ=oEM^!kPx#}3a)pcAQxAs1I&cjkG@8j=5nBGp4kedno9 z@QrVmkM^)`8+F3f5qsyIvhjm{6SCEx8m_m7eu&<1nhOPUUz!-Bb}U*6uwGq9wap+A zu4d_Cl941WkeJ5XJ`BSmR>ES!XVEu!p0w!u0PRmYruB+N&45NBuVz{4&K$-!^*r`7+G z6DkNcABS^4HvkBYl`Nxb9s>3*Qp}PVRo9RI?ACl8Ht=X4reDBNk{0rN*rXBZUCk9h zDEO5edw>^=8<%{TC2TDk_u~IAD6aR6niU0cCD|U9jkhx*UtY)TLWmfGsuYOnP zsGX&*YB@Ym%C_}+4Dn;{3|FInHJGo5O^v5-2t@o{+myJ!IG~=D2*2?Q@I!x2s9Nu& zI_w)X*kiDFR>qmoss_Fi_zWV%$LO9~Q!)?iz&0eFKZWFy4oyg-$f`--|)3 z_(-;+EB|!a7?vsnYYZKi1Wo+A*9i{u<^lv*LxE)(@?KGJ<3^?LOGGtO{*r9OqrG;c zpW}O5U=eH91oFqDl*~FD%ZEIp#Ypa=`u0w$)L?ukE^1--ec1(NmuDKDndd%^H;TM+ z9_9>A6C==Oy(}f;et9+Q4HH9npgCRh^3oJ`r(3h~NCiE8uTCd-jb>r|FN+aYictO0 z&b0Vt@3lB#$eo$Dw4Tu1a#&PX#QzY^WVGFd#qF&%S9`WRiIB@{rP*~S-N3iAJaVU1 zHv_gU0@pTxf6L~Q)% z}7e7oJwtH?@XbBMFI=O^{Q95E>mIYZJsS+kO~u0;sV+^i6O38u&kf@G}Kz< zk?eYRX0yMnl;@djr-%KwRS|~4MuRqqj?T%L*=NnSaq2sxMjfk!d0i{LnPSn9<3P%8 z(1EMI&t+OY@2zLU(dv9 zbC0aFpPt_%#S^{N+~ye@#d!K`Bo2G3SM}=)4op3ZwA%Fhi0DaU?G1;x zEE$YIE(_~K23-&?;7`~D<%)J5y(+5wiZ9OiR=WRr@_zbYfa)YO@t4$<>Q86%T09I8 z4(sm1MvEO%PzgE81v3k|osm@NJUSlyv>BA8>F3e>P;WAgmd6SWHpCRub4}wbC$z#; z!CI#ujTYNSd4MY%4Lxar@0T)?ShYFRTZmOyi~Z+EYO47KJg1< zw_|19G=T%3p&kVef(wJ=66tR_Qp*>-m&M^5e@Cl+2KIre@f~Ve8saJ|ezYkFpGDv7 zzGyYl&{4+FToBIOIH}|QBf8kG_>p?ne-L4{ozT(5+R;ev0M9TWf^str^Bpd8L79I9ts?`;rMoO6;4ESZyD zp@1AkEFL!V{hKL0?2k#R%m(Y;cwu3T+pWt6e0B4X>jm!VhA4Ll-m8L@>X+AqF!7o`-%UiFDiQ${c03>( zM|LlHMH5!nIY2dk3Z*oN;bc>HvW~E@Y{I)J&g>&9Z>6vOGoQMm z53bTJqOf?XM~}7sfcczS+6M0s${}$?*JxS`6x-#m%DisGLa>?dUi8-wJ-Au>P%KPT ze8c^_!KeiU@yVvBqv}9=7G;IDnsLxM3&=nF-uwpIxXtA;u0N{(RL z0kjETykM^?#bWXd#)qG~Y|r|w)FIBqYi_pQoq_IM_v zuiH~yNktF&{ZF{xkVj}h&pQs>b-K&VMZV{?n*lRy7Qj2{;|1iGE?AET&YVOt4^^Bc1(d(Zoh z=D!5|tG!xz>++w5`!NfG<*s*Dl(HgEIaqlwA1pjP)fuW{v_=H!O{IhwwOZDZh_b5e z`3SjV)9vh>%P&HwZ#__}S@%!mtDWGK(sg+-D*AOm_Igzz@CpXUQ%Q4sG5Ak-yr?Tl zaWZJOQno-=S4FpyKUx39t&{5MMv|05j3)W>QtG{?BP9e~7>eQhk`mI1l(HX%M|=3M zlRXq!cRBCVc&qa-6CC_z4O77=7*5vH??F|k*}a=r#Wu621m(hGe!`L)B}I=sv27i| z)wYMk`;`{xs;xSTxplP)xW+Y`Wv!}9!Y_ODvt`M&*@i?+D*dfM^pQu^{OxFCBi2i( zo=Vo^&kYjN_g}JQp%Nk#I?a3NaI~Vj9ZD6DZ}wn!81(^-NK67h+CUHG3o5Nd>l>s+ z=Sk}pPjh{SCM5M`(QXUIzuvr(@`v{TIw)U{q9cKn3p%Ii9hD=d-{$kb*KcMu!p?^5 zVFPx()bK`QkG}I@SxYExfN=Ev@VA@g7iSGur07{uk*2aXHtscby{Y^J)_LN%lD97TzAjmZrXY;c`7V+f0FUXB4>gC+m9Gkzgb3{;SFwVK%De;K0=#_Jj#@jfj*?u$H=?YmS#e=-` zXv0oa&CY>)@0U|IZpX!yJwfu-g1* zoJ_#b1Gs8OV)xD~T;)SqM3Om7Laui@w3};2&R0$_#U?Kq^>jJU=H-{xeSJlkt*EP% zMgAB;>`JH=HMbw5hjqN8>fx~{wYAS~cSFFK?>Px2(>KG!eq2cbJ-#nD`OPNaIIzUF z#P^(bmzI0a@3LOGYIx0V!}|U^JDBjIm0NUKb_5pb*I_u&9N-GwDoqP15|3!rgv$z37z2l)y8_G)2rQ9^`FhB>7S3Kzjid7 zOV^s?0!~`n_<`~sm(D}7qUrv({BC1 zOdt}{s#Z!_$c|j5Vl66H%+Ua6ZK*K&Y(<5GJhLew@8jd5?yVa{XET3s>-mYzk3Q)+ z+w~#_N*D`go@yJX#u>Dmhk8hd#giaEN8_(Btb%uS(4q=>Id2Ma!QYGR{xlZcxrB!= zhHi46*C*D%PuT*Gp`=@$B!TmGP8*i#`X!?B;lvrm2eC1$0EWPj z?$>OTuOLe22McUTPHbe4L*C*-9+LLc!jJ_l{ziT#+4q7D)|Gpt>_Qa{_T|dvG9Gu; z;81Iw&JM4{wjwJ}AHr4IoDv3aX`=GA(M=tH+%@?!+J&8pOb&`?j+^xc^kf!YfpFeU zXlXj97WsSfER5@Z3jdhMHT5k^O{HNZz7hyE?X)#+ERP!mADenm&-&;4A9OfF%_MP@UzbnHW5b8%&i4EWq4%uDk@ zXq@dv&-lPvM(=ZN?ak^f%x+rbG{uI}LI0_~PNe@H{lt7IlF8^oK^7>Zp&k0t-x|Pr zL(XHnukdmG0a;7k!+^P*@v56kudAp1_h)DBkOFGH66Y#EBqWej!}?wJwfPgjM<2EM zY;*Tv2D(3-_pV1$2>6eC zr2cKG`I1H<2VAvLO9;Y0VynsdFM{a=VXGwL66JCC6HNh0MWhPKZ#IVTO;aiLXO@ZP z=1GWWyVP%|?D~7#sM0N=aJGp>{Io_TE%ebrrgNZ2S0pEkzS=AviPJQ7j$g2+HiY5u z3rY7{gk+fKAY)(jdUlbR!tU<$;RUeQY=7|Bm!l!^BU#!3h0zj76&?W%AkD{mvm87P zCBoWFOQa&p7@tFc3FaI4-~Bjc)&=cWWeVZ2S$qlG6NQ{d;iM^?)vh{GJ?|nxMW+QX zJsoO7VH{02&8scL%k}&^%KWQ4UW%sQvD=cTQ{5p{wk@kY=trjI*~QC+e%!z6x-UDK zO&3x`bV3Y!R{O;9ziz8eyHI#lM7TycF{P-+)%J#>D2yJt5ZEZWvGZ5!u#})VKj5hH+(A5f{6i}O9d<%?=vDxzpERn6&c%SO6F51|cY^q%OM$=~L!-P`8+EWVJ_(=Ra( zj*S(vkA*W3rEecfV%D$!rDJY&pp?#VnoxgN=J+*hQqwi+TC3Lz?tNltzS*afUg|x% z-=3JNt~xxVBoP>_Yma_#ksv{j z&&zr^bO`4Wy!@(u=NK$SZ`orr-9JJ4VM(xM@0!@`M%gY;Jz#P(Z0h;+?q40CXIBmZ zAO5E_GVJJ#KCJkEec0=Q(U^cVEFgS2@RzcoMhZ|;=r{{Bkdco*BBP3AFw2w7m!)TO zU5ey_-XOQRV-7KuZMxGeTk}W7PiSj=)AxzJ^sofcsJ*sPY2R-~`(0<6S}OJocmKp5 zUQbw)nUm$cG+Pul(mhnqrAn1aWJVI&+kq+yRmv1X5TYQ2DTFbBL`wycAyq0MQ>+w_DG?z+fPfev zG9^Mt!W;aGvW% zbbaM~Z9{W_PbC*v!*cNyErl6`{J>oo-xQ6~_9@o&bU>0rj|l5FCrJU0JYg#_sdi=b zM|F*AD75xN?W|58&Mnx)P>!4R4@#=p|2A#Gd}+8bYaRHY^rTF6VSO4hsBPX)hh`>g z)S$;SCBUR9DT)xgs?`mnHZofwu>7=k5uHtk0N~ZuX0j!HEJe22a!YK8OhD( z5vIAho~v5#RL?!Kd z>swn}urrO@C|FXy}a|6Y`<{YML1FRM}t$W{if!W!;$im zk4tqjd3)E~MD6@=9B966bCpL`G)7|2)>798BMl-TK^LdaD0S}pw%*%)+p$T2Jzu&U zH1*4q2xtpsS42n_o}gY;Aue##HpUOVkKs#5?ei6dycy$K1I4{ao`F!DAapZuyr1RS zzYK5Y-B{?&1rPi3*ic_|fiEWAc%mb_l#xZ+XYQpbv%(VkI!Gge?B1z!P4NU7pJ#wQ zIMXxeOQS#HHG9-V9O8{gmDwMv#5Sae-Q4}=8&_qBvbICn4%yadJWlW<`cKk+#?*GA z!yPhzs3PiKU&E^+E%NUD@!RUzH5#ZKgZha!A{+W9V^mAw`XN;Y>e9(3>gDWGkCcv) z?K|5y(TXcB)p3Uw@9PZ-VFIf_P>)LsOw*Q;Klo_At9rh)oDS@@6AXIsW8pAvsM*ZL zu*_tm51Fwr+6Bo~VJ#0;b^3>5tN}x9rzL zWiOU2bbU;-&1Dv?gF?vQiM9t>b>e?KGVHo_3%&a{ZbCp1>m8SHe2{v16RDvgl>QpM zq*=N@mtvSy&2{ciDI&=q*N%wd^^{jciQ&BwTH>xM@*yun;@${~eZaByrs-I$)m8DGGg5_pQmsSKz_8pj0{a#8nyTIhfYL{P)ADL= zY1-!7i;h}=U1K*h)(v8=Gs_gx*JOwF==h1 zuhURAZ+UCn$IqU-IDZdCR8$2k-v{U&Fi`CYuRdwYP2tYoO}F9SvQMbf5InGG8+d+y z@QhEkKEqIR{pQONc#R|Fs&Rk1dw=P?R&>;@bv+{|Utp}y0D211&DCZWzT!=9)z^)- z$kuiV40$e8&SPLmC@|bYM#5~S^B_f3Jw4kQe<;aBtEsl20jdt0yQTGV^zC(UKYOjt zIdkTAE_hTmGh!!O_(q36L*WG|{n$uX5{MUZhJCO+h%(vWG3IMrm%`+Zu_moDzY)=yqD9oFdn=$B1+ri zuJ_&yx>pUuktbs$9)+rzC4XW0@$FQHjwtkFFWVx5e3AZ44HaVJKa6Hcm5boAimb8o zUFhj#o)GrJZhe7d*J2^wiQgR{9jO-3acd- zbuwU?PmJn0Mn%f3-V1qn`G=IbWu0awm4~C z7;>AU%^^=#7(rg`fFM95FFN(i`4ON&h@_Xb4xrax(fr_L*IAYGOYYT{2F+xf36cuf{R@uxlSR?pZslLq2;olE?utwynUcun&u|bq#{z=GJg)9n;X| zd>{jx+1m=H3~+XC`o^N~ewW(XbEUN0y`NR#84Qj>gpX88P|8C`V|95|m#fQyt&{&1 zfx4aSC}{uVN{!BI^&y8{_IlbKzR_5fYl&cQS3A7&@AMP? zGz@itWyGpMhAKzhGrX#Y2#IaZxz$TQ;x%mg6Kl)nt?i!PzT{&X@K)_0X1zcWWoX`W zl0Dy(*!s(7-vpnh%jRB=I0pHb9N@yoaD&f>s_};%eWG8DEwfW~)*mi?2W&V4^jyqB zALk9O!AP<-$oO&167Fb@0G%vvH3NG>MBIjnS@UWX`Q_JKr9owEH3p#fEOPe*YdqBMX)s^S<|S&Y&mBX7Yj8RrP?tL+V2B z=<7LcVX0E|U>bLr(Y)5yQ{u=KvUssmV)l{4reQtd?6bQ?X7zo)pRg_4zC^90sOM?_ zp_N0ZU$Gc}RDlVQ_OaS&>)PLzx;3pUev|wYb?Wgqu`NC)A4X^f_eZ{1UYM>EHu3gb zY1b~`PXA`>yPqRgJemorkI-6Pr~rG~5kElDdjFK1b{v#u6O>Oj)&~uaNBp$Bu+WMV z)vDNi)*(e0df7fqob^hMP4RV;Z(Q#kX64jCu$#Vh5uww2MmQG{_Tc`#VMSV>^HpIv z(MobFe0#1o)alm+_)=*#Pqw{}-hVVcu5jC(jXVr_vuNt!nv836RI4%Ivsz5ew~`;XEp@HKA%rD>Qi@uiRZjj+{S3eTNX)g_0a4diYWy1y@@1!U05% zvB|}MQ^@cdE2OQzBbgl1Qubi&*HtFhAj`9hf%$&_3Jsv&Njir6O%J|%NN6qfqb1H! z{qguq4It>5t)9npPD8J%5iwWLbCqXIMQA+v5TStXV9)4LSoqq|^DNg)LvZ1dh%Wu3 z!O7??06truan2O0ISG#>`W!Ntcyo&kISi`d=X?Bj4zz!3;Ylnng&;2Xdu38RHtXqA1*7}7A5j_eAye3LZ_pRIAj!+PLupk0mB z z8*0kTdfM)V=9-+Q$`@bL9{LxOy>x2t3|%tnIYJox!Zr|}UJnMLkK;j-HD9gmr;oy<*&>gU-FQ(h*-O{%E<<=F4O^-&PW>93EhhU zPq?Ao0PrVuezHzZWy-hKpv?6l@lzGk8mmcX%g`h6&fdo~w5c56a)~TZy)903kEwNr zGr<8#^6N(>TfKy#c+#czGr$5X-0|jirTNyshiJd~^?w}h;d;KFzaJeblD-Fa{$y|o zGhq(B@UyBhQDJS`Q1|{;Zva&z`3%56%ctC$BJit334&6$;+@j~BZ)lS?k2sD$80!& zZCDlYgF!_m&gwC*e{=(usM|vaj>0#*x!WaGm@F-jiG#&Sb^It&Z- zQnLI548eCc7GC;?wN&IR&jB{;FY-;-&S3Q|O zy_|1}Z;yW}f%9<9@$(Y!VreNk=BSi9pQ@bf%P!q+nzO5-Cn(|_6P2-TL+45=S*X={ zU9P#+)f_e3Wb+7p|C0EYZ=27U9WY6GQKPt{we=c^*6FVgWLn6oUvBkq&~osUCJZXT z=ou6)(Q3ysS$zP}8$;L5A8>G!XgOyiRE2el+3r#DEAU*X<1+E6V&u%Dqlqw*BtCPu z1V#_N4SE~Ehw7(v0y!~oTDYg{6}xta(fywI=B#QXhXtg<+P_m_^r}Gw5FgLOdS|B3 zabDlzBm%sdXsE9@eoE84hxkPD9e0-U`QD9P-N;(~mIw@av=ucUoESa&cD-5UK#9-o zDFW+Py`+(62($r3&ihq4d-vDbl4-cWIKEaps!*V?&|#oD16fAxI^+ z2yva}`gMJIDzl-~yN4ZCLdV;Lc6%pmU(V9XI2mh_2>d0P$N)WtrHlIKDh`^@h9=Iu z2r!Jl24!s|HxndlKt|J~3!&NrSBte=V9AbY{zCQtZL}1RYsNhm&Q4Lpi)!b-@Pz5| z+i6b#(H4Ykw)rHs!Bmai=H$K5`TVjUM-d!*CSu;)Z{Q<5Y_4tup#iJmZoIipyCf=T zE}vIKISFTClfqJ+Z0G}9-}XHAGGNYd<+KCNy6Yn#f7+LZZP?d0Jy;Ldp$u~VXa6-8 zNZbxT>yL?Y#5Nq~qTbN?KWAQKB~Ck4tEw6ZftyGF+3|G{fjr ztnO>|8|bBCOcO?8>@Rv#oiz1spj~~N?7x**z4dLf3+2eb@KFlL#WtZ{th2WriKYGN zwVLj=wd$jg=h`MI-!;bZz1?i;xBiG)T_8sMs9?26HNF(1nF^KTpyZlD!I+$53!QWN z6+E375z?_TRhNP1N1e_F)L>N#@=$Shek$v#kvzoqH=o~~vedMD)UP{NhkCrW5apxP ziWsR5k%1@iN!>6yJ!l7xLIwraNVj#dwN8#vUDj;^U+<;AmvnbC3+G?EWH_{VpLrUa zsW|RQ(LV$Q^z3){rf^1NjVF@6AbV#+Wqg|KjVX}q>=;ct*q=^bsvQ~HV7MuZ>7W1*{<*8{pwR}te zo$=}3(xoK!TR7Fs06SowUivw}4i{L>49>igTTH(2`j9{dvWL`c{NNgWVRpb`d%BLZ ztfqb#nQ^}M{zdh$hU2#Voj~&f%2X|M^lAMyBRCvl6Qw(b0b3-F(9A zxu*UKelEe3Ye>g=4CnHp_c=1dXHAZMO?{DHEjE1tFqw-(<@x6{|C~5s>Z=(sGV@6> zUZV$-xiq>% zo-PzWRbeJflo18Z19)h_+W^ZF0Xi!C5i@hHj)*x;fDPRBaFW7t2_V^vqs^!DVDdWx z<@xsCbzgt^Vplvp1)v`^=q%J^U*mm7m}n{e9bD7xK9N0iw4F~kb0X)xlk%~XCBI?i zIY~ua{l^aS>4`8I>#dKUdOOsS_6#O<#_8M&g6us70e z{$)y}T6tmb*x(9iHtd8A3Mbk;$FEVO;$mLOh-RMM6JbJrF2-8QCOtj+Z5zm2x8*+5aD>IOn+ z^wtK@x;6AAAN>K5>cZPZe<+oK;xa#YJC;$oJDTA$!c>krZ3Is7U$FYK9JznFfyN&Q z(}za23zuYjzRAAit9eDj9N+2_*z&Z9AOV{4?-(uu^wyEmV?7c8$RMU0gwJ(pB@JL! zv}6On=nIS7Wp$eMF9?b{++24H{dz^7P9pIX0o`zh_j z-=ZExJqwCvoXC^hVZT=8qvsGD>-ExFWN(TQqXs@_X_yG?;^z+QXNJAc{mXUzBf;Z6 z?p+Y?qiOlGj)o-lHB0jT;@RR|#r_5>6dWL)8e4@WG&&aSjeffDdwOHpF+>!+BtPS~ zbzPfiUGZK~E_?}J<{X4MGb?%j{mGtb|IMJ-Xm7!Vj`HuI>Q1v~K~BUYq~=D5vNE9b zlBogGBD+mXRctT)0895OAgfV_1+V5MZ_YhfZ+PgLj79E{}FYBT7aBi!LqskUFUx7EwJI5P+UYp{KAOR=3jB5X+Zc z<4H@|Iu$MpXi0Uh1oqsIhTYB4w2h0^m4M#()~uw9JX%^>tB=+dy`zQLw`JB5DStO; z>UXF$$4!d@FwTKTis!fgNX=OXiYciBodm->f!&CuyEHUGgBjZy;8)5e@a0J;Z?r=i zw87Mr^!NQN2Yu>w;ZvHiVs|@L?R9?0Bz39Nxd2uINVjMR{`q2|@k(iGYa&RS?Sp<-W}LaR^iL5uZKHmu%gltWdpBThUi9uf{^It<*E z$f3C9p_U%ccBXTOeYjvCpuR==vufc?ujJ+*s~={(w8RmJRuA}3LhulMGY-;}ddSVJ zo~R?NEqIBN0Hkiq;!{nyGp~BGWLJ%E>L*|P#c^jw_W2q|yly!E!e4=~sBS)TykzGL)|d~)P_ z^Pcwrx_{~MPBA=b(xdofA zik6QPbUCrwdwcTut1GR)vdV&z(E%5uaF-+38@iBc^MN%`#62k7HFyU`$0z4!po4tT+0MqZzLtaR=h$*J0HA+*pAb-KZ{80O zXszmCh#i5jBRa}%+o5FVCwNU#u6sKm7XLq6jpqpm<|T{gz#Q}}=V~ovgz*xz>8#g% z+_vy~}KhA}@x892u+@H$wP2108#ZSI! zY?D0?^L8{vLgBvgz%IFV2akQSg{`NWcHLm)x2m_y-=7rL7l8oYL~TThoUoEOFuG`OKh!=ts^2Cf*w; z8=CpjxeA`Iv_urV$+qfdeNDGco$JfHYRqCphmKj|dVpodeC+UK4L;^=O2#-jDfK+S z8f|utPoEyvU*=U40x%2W;>!5LTofagIg8R0lBV(!AY&M7&)kk62$*0TB>p)UmA!k_ zd?QfT8a-Qsmy#qe=HYHLp`h zwY}D%>u5Crp1G99JYsJ2t>76U{=9GXDSZa*v8sSyVm`3Cv3|!~VUnn0n)>DnN9m~( zK2T@f;k@Z>D%K;<>g)E0&Az5pEws;$FLx&T(=jkPtXfh%Kh$USg57LE2)S@|u-wpEdROo!>4K(`21uYs`nys)*A)u zat^DZdqW^=FQ*R>#^1j6?_6NV*+ly)e?zq?R?YgW2kt%jUE%Ugu>gw?nk?O%B831w z*4-dG4G{8ufCma#nkDbsNPxsxGKno`Z`@&9z2NSYkV5Rr%LS9#mmKOA9K|^Sa8S?i zaH!;&e^=%J&Ff{_So@FB71;Tc`EBd6x0iddr*8eU#PFeXmY+Dbnig_fcKpiBMT78~ z!r~T6RpB$>R4W#h)Fj13Ka0><=I6?qXT?fm98#JqMzhNBx_kHIsligcNQJOalKC(3 z&Qt#}-mbE9LrE?8&J6VT3U5CqKQqiU&&S2;HV*KM%L_O}J;s zbSoy<5g$uj#_^}7T_F5$7-Mw()XkszU?aUP#{zq`Nx2HS+^xw{KfNDS@!l{;*S%(L z(*Jw0qZDJc1!LP;7{He>#Ij>`U5rZE8~yrFOEgSA-BCf{`}HgJiyt7TybXzxs0cN~ zEN_%P2p7vDADM}_F3(UTs)}WPI!P3Ysf&n_vNe;=dl_7 z)szS|R2cqkq$G3nY>xhe2AsLNySxMR>=#dQ-E60MoH&Q@rFr7h*XmO(vUjUHBRZVO zBRhGQg}V=(z_ggXRkvSXW>egOlJE}r%!%*po;|_ay}WLOC_++N-u0fLQeMnkQVb-o z3J@2QOf^(WOj<&+@wp);P#hC2=ix&%wyI7l&(pJ zGLeC8KK^ z&Vrc7_S*qMV=2?cwK48$Xrf?NRcGDjaMIwVENx=06x6flLiVfXm@jnSGjef@K4QQ> zlsEsrwze}KK<(`XFP)edaju55$4XmMjj>s2#4}VE$kP(RL);*D{~b2zc+ZrRs=edC z>>~p5n{_`K+sNuG(_LA!p zKFQzLDn0sy6=RoJVSJsEA`Cw*VusE(TXqGuA9FEgZ9>=87my(ODblFmL9E~s?x5$S zej9UE37oj!n|HqHU8!?GcF-3u)`m^zqq39a7;yB$tVVpesc>w#Z>_Jc1L7yMZdt6I z=OlnOhjonq9V-%SfAMDbrae^U>Y!QYl~NUPeF6_C|L?fGj5>>{ab;rb+kGOka#3^j z2Fze8X93bu3*khbf@!aqvkaRqNxdU#gPCnxut1j%W6ECMzz<=ocFhb8`Ylzp!GcPaYUO#{+)F|}zKx7@Y4Yfon|23l`-pyP@iC7km$VtYKZ#M~@GC3MIvq~8&#RQ- z+xw2`Ywsr=*!d=stZ&4NUb_6z)TjEMtAUmC^*{fSl@N`+e+$aIs79KhS3hbqq25|@ zqn4{_6x9e5rjyT<&??GHHqt9eWNW=`&uUgA@$g|^T26&|LetH^P#vl3Z9)bT5zFMa&gzN(>7t_ZkaZaqMqjL(1Z=ZwI8!e zkIINbhipT<1Tq*ur5)sI&Z*dekZ@DYri!shlH*jXL5|T6lzA7Egzvs7+M77$Pen)W zX8@YZ^vHx|__H)|r>WZkfBLX9m|kX-v%kXJV}W(aryCn zZDfKHT)|Hm7>t>E5Tty^+&wL-Q37Rkn*JuRaxYD}bGN{vwEUv=NmhFG(P%5hQJ;_- zv|iZPG+Ydu;{ST?lJ|Tp?%r?9SKP9y9(WUG|Hl1r(Ij@^1-o-_3@#fE&K<4J#W&}s zhPni;ES;j-Ut0#D3oOibM!mfz-Ai$*g(2K%m)P7{I8U44r~rs(H=h#%eC@eN-NYJh zC>8;;L!s-y-2x%ufL53z?C+%ia3o5SQhxa(gTkK*75f=_`Nmh@oU zql!_AD0tM9*mD9O9`Y+j>G2 zaq1{wq2My=jH*UbW-oJ$+-5&jgMC5`#7V&Z`|B^lbO^J`+7Qmhgy_z1t$nasnYBv& z%}#p$ZjoPqA&bge9v5V+$<5&gSFvC1Y%9_o%HkV zBUU<=mYSZnVPx@jToY#211}EV>3!9-zktIEM1zrX_4s|kzH;W?1~U0p+!(8#IW`pCU$r`^}j0AaF{mV-p>;xFeD zLw1IdXs%NNFREs%{Z3r-xQ@7V2e(BcOefFhB@LCdcOxe=J`;#knPOPNHfw&hnbL}^ z-~CHE-!rJwTDXzn0TZ*mk0#cLolc{h4{tqJy*c=GWZPNJOFX|JD1x0Wtb!-3qiQ_W z_rJkZ00$6c|B#qj)#hK?c5fAjw#>x z$0lBj%F~UzTx_2gweZr#T2I_A?@A!X*S32Go0>E39rgsk<++5mV?EaR^`|NsoC3dD05PaF2nH24v0h~5gv=)0p;6q$D29Txl-`|D>&P; zdffgGc%b`0bY{?8Pr@p4^ojs0!ac#%NUG+Q&GtRX^oCt~1{65hd7amp$cTrUbL}fO z+${Pn3Lfe3$@Bo@Vg+U2Lsa*{KHu{U6GWXzmgBFyQV~OC42%6^xW>tk_Ex^YYRzH< z_`6{C#O`8s#ZgxyZR5=+n+5@$kIYXgRZ7S3_cUzHlqpYfR+ub(ls&0cT<}z5)Kl#c z$GVqX!=KVL>M z!AD?+ijB!nYo^Yr++DE2ku8hTDD79hSIeF$b=kfI_TXWNa#!sfETS}qOFUY z&GGZx1Q4k68GpR$a$y17(!hi~5MhBRcVP(pS*n2HEQW3{v1B!Evgo3YFk!nwH?~Gl z#1gvD$?p^0qFrhbjSUd;DAO8lngM)uFD)25AWDJjWFCD3(NmyroS@Y`_(v3ZuZ^+_p@DFfam*o z|2sAu=bweCRS|~{yD?ARnUBqprhBzHRuWwSqf|qwa3_Pf!7_K(R<=(B8N>et*)pP<%h)>tLRG4ZOT?s^Gf` zb*doZtCWd1(^M2vv}B^soV%X5CN+1zXp1(A$2&YgxPLqx`yQ+2-|r7~whts8&N%)6 zV=_Lfo#xKn>wUGTIuh-VG#6CM&0UsVh0rq@zc;bTBC0bp@Zg zu%?~Zdjc-3eukx~-aG&e3<8RG{Iw1Y^TY0R~)JLwhxVZ$Nf}Me!+unZAHa)5U z!qX8Ii5uT8-F<8@s5-q{+wsa{*!*!U_LH68B1h`y4WBtF_amzJHZ}~->a!wGZ^14& zj3GwJm&2jdu~J7EkZ2ycBww^D5ksF%V_ppXAe5EEw|$@ z&2gcre@m0^i@rJS`o zX6wclspKOL-HBdtH_hm-)NL=f#q7z(S#9dFvu1atX7WpfT#q&=Hyt{6%%)K25bd%Z zzmin3eBUf?wFn_|Nd$K2`oB=#0cF*kT}; zk!Z5t&52)ab4k#3U-{Z>6yAKN+3$J$=^7@gc<-@N@0_3#{db1nIYHg7rY|o$aeqtN z=XA8MBdZD0q;Jeqi`jW{&i8W17crvZ$d3rie#3Ntdc33bEhHygmZ>Sdp3vF0KEBGC zS7q5YamV(LyjH)-+y&(WKcN0X^I}9e!G8MG!cRwi3j>HS{wXn3T3p)3ImL8AGbNwc zy2eZjJt4l!MRGfX_%8XFuU-x%+lwu5ShyKEI(`Tx(RND|w1|O*dg83yi!iQ>vS#Pi zcoKxe*Lm*xf)fg~#my$PI(|xcN|4Vgsczcl(2iXaej_N0*m7NFW!>CEo=dWH>&-Hd zBq2AY5s9<$&GyiUPlbkmM@}a7iq@H9%e+tdCIar}kwyDY0Ol;te)sz~S-$ec;N;28 zt?Tbv0RC69XGBGk?0CtZ9;s}-^&Y!3@*}PT!><%2DTs*N`-|&jS%g;KLbiG^O=GQi zr}l~@$xgrQdD8br;n98e3k`y0y6D=jyVQ=1jXTu1OexD=aP;3FYkeYUbl9e#aoc~P zif**Vr&W~9jL65pP5+<&k-xnf9M|f$*S}YX{u7_fh>-4RZhvcVVE`zMx@{A4c@L+l zbL-*r{y%n5{P#+kHvRk0*cTh)D6ZGe%Tb_zSf$4>7pAnF+vsn4N{%}PLTSm(*+zoq z+9YwkCu%9___W~d@>m!OAR}34d4l)}42sD4YVFC%Niei}q0~GBI0TUo@%ktn3rtio z#A%5s`O_8expE{HuDh;p-swPEC>1Ea_2TR1NWqBM#{9@ZT~zW=SCAs-QgsQ^Q2>=1 zmV2TmE!u^x2G+jh2gMmp!^=ZMijhsM^iFs3#edJuGi02B zp^2t4Q(#Ua>mCp^03CI`)yT~Dbt>&HwvJ4Dj{n2V8hjefY(}+K3>`;-KPfc0ch20= zsi=b=4n2oV%Ypb5zf23KZ%WT_+uQ6|2ZFyiFDp^F~~!_(0HL zP0M4YrP2_QG8b^lq{~PavWsw*fexnB26>~}8kbl9^RZQ!8X-1|R}hc|n=67iZM(O5 zF!lAQZYc4S7<7YGE9pbaddWER!;=gD>yzcmNjf!T9b^5;AZ?}^0$Puf3B(_P=M{s& z8A3;ifkYQ;hzOc=Aijz8s8NGbamOuI!1bDe)z$rfxZ$JX>f)k(pa&EqfN-LX9KLgW{zVw%mOcvjtAAsx#)o&vtG|+2 zr)|AzLRdwZ<*|n%*sr%nYh&8DoB}jq7DN8`ym($)m^x~G5ZcF#F@uaW7c_VL+sshP zI_3EXe9yCHj~?2vg$bqWrlg+>3)rGiFhi6%@ipr`sOf&huR+b!@>eBaH;MzP?@Oqg zN9?AKG%MbqiXQR(Wwa27l4=E!HE+N7n3lj0Aw;*Jq>A=m)L%;oqVUUSbvI9poQ^|W zqq?nA$E%!y=*8x!ehJKmS`V#`jU*NH)Fmx#-`TnuYI(Y2tNDVd#L3ez)GP~c|2aJ> znNb_#T3IPQ)$Zjxs22-gQ9y)JMuCJ8U2BiVu&uJ^U7DOrRon}&%gX2{LM!*{w6CK= zk_Ig7Qd?sfWjnROEX6mx>RL4Ld74itEOu(*a}g4|?PlG6ZkX?#hV2*Q!~7dR#`hh4 ztr(iSs;z)to>9+zz0s|A=Je8cgU&YCU)<&9&tuy^PU^FDG2(7byo=*pv$r-2o@obn zs|3Gf%e=N!=fBs|Fp@r04Y~265Oyu-r``{0B_8T$yxCLnN&Wt`kfm-Vy}8HlT-s)! zIq7yX)huEzxQGJ9UrJqC65u@;pfdWZk|LxeI5ccbaFa%M9RKYo?WBF_e zsFzPwsc6+Ki_W#rlV%#WX7}JwKCzgVSeM6r)eiImY*;d&L}x?V*0%JiAgGdEzh}K- zkr*^6Pc)+?f*9|rE`}LTU!h~RLSF?p>$kd1)uQiqRssDLzI)oPF6JCG-g!>a1IDe) zldqa{44wD`^Jpvd88R5TpiO+@RE~48O~6mXH&<&ta6pqu^n2Asd78T}tSH4K@ekr{cqt#1?7y z-2u=K(K46p8SM)pIBjo0IF|oE@3}HrgDs{^kIj|u}~zE-%FjCC?A z=thi%)#=NQ2b(qBzf|p9M7dua8sFD}?B^P&(cwE%(&TeX<++{5B!0P#b>>4rLEvj# z!XQwcJ;hVZd>$n;O)=%}9eiJ=SxHRg6jTRKat_sMLvFt8YgLb6aO}oPUO`91ofonL z3GnpP&F2x-<@zJ=4z1RR>IFNQb6}d&v(l56^j)Qvbf5}umA1)W+#3fmB^fO!kYM?` z8xoP~sb+d+)c#t+kOL0^m@7ifNpF7dT*s`tKuf&dIhu&x6#ut-%*rjJhO)S~l;~>YU;G)-6 zPtqgSlpWpXMmqq>FhpyoCnhD~3lU9|&}}d@;F_6tXJjES=sz7pm!bLa*t1|uDI==5dD;hq9CwMkN<`ri!J(@Zj|`08?^)1p zYiwLmJ+wSAEaEa@e7BZbS*{-icvTgrXIz-_lmss+17U(!yG>VdPJCZX1ben5_okuO z`q$Vva8Ln#A$KcekXKcyA{jOBp^Jh|oq&fl?}!YNps$~%fH(T=yAJp}0UE#(-`&L? zBOlq@rsDQPnDzam_VGi5Y{B8*;{IkL(aV4ml&RYG$m}ia1OTRhkS=j>u7xeqKY7*j zjt!xW_p_8=udE68k9Y~$8P)3~W5SAJ_{VId!87p`K+4&^S(GDz-iQxdFfTS@y^RK} z9Z%E6L?B;jJH~KEO|2H>Xm!~bY{6<_dD<`#-tnp8SLptF^FVhm(jh@SiyYiSpJDW) z%_`5?Z00d?LT*uB0B5W7W)rA^+vp=H(_gpV?}0jrzjK=CFY19#VJ?I@cUdA``xUtvXA=;{takjw{LudAY=YhVe$3H?UEYrKyJ_>o z2!|(WSJx{K{r1UA^)^tOh`uWSIjSS>4El_9L@qO^FN!?L*?eaND5pS!>OtMma!re; z+t3KrtP`LS^M6l)O2(I9D+&-1A_b*H&)q3k#N8fBsYKQ%*|?`x&o`E&f$57un1>Yj z)>Di6I=57N8v$sJ5Nb}g$H@KYP;#PJ&}QHwMOaF2hEBTAxmhzgE!e?DyRcejT~_kj z$Pg+$78(qqN0d@Z@czjyoyerOPJ2GiYe@$ZQZ`?lT7Nvv)Dlzj%UzqC{B%2Ze2;D| zZ_kEOt<){`sy&2%JAy*1U$189;ihp8wyUPp^Cb(v+&LB7$H}`|&aq2tg5F zvc1?nC}|}Ko!cwksbEM+l1O9>t!a00G0Xom#{~Y*ANlVcj2Fn5lT4Kb$B6?8pNgLN zJG}1^@BPuxN}(MS=Ox?wn}ffU&qh8}5xiS5f2-Cwr$Ri*{SbrQx=nGzVYE<7 z=q(%2-8AnR1zxstdw8N$Grr26^slBkZ0*t%sttVxfhNu0(GO}_h7T1aMrZ^96#(zh zc1@|9H7*hlgWh%pZ8b}dz6Q=!@lFP{R!IrNKqGVoz|u@+Z|iLv9GEhkYT4OU2N>(^ z70zAFo;9Xfd7&2_EgCDF6!C{CCw8?tv50)rP2{!~9X61bB{3;s4cJjBwGE|=$4Xhv zb!RdeLd1O8VVx(YAxr!%a}c#N2DEf)dL3wd1$U4h3ovAqj=Ylm$Ib00Eh%w&Ltge}jE2hgpT8cd z+r1EdJ+yz%H`H|e!pHRKu2FqzEhDD{rvBx^U-Xr~#(nknPYAp?o8H*+L_dmf(q-jZ zCY1=^cqRqSTcfY6)=uZanIyQ(cNMN$tOzlevP^t+C(?f9CxX_R*O#$pQ2ci3(@Eeb zuaftt&iuK%Y0iU^JnwD(fm^YA8}$Y4hYHQR;^cuH+i9g6TfQcc?_T1sB<>r06&lO* zYS;oqPrX#no1QcCA#zM;&;9rb*n^xzYbVB0K3tJ5E_gW9#R(Gjw#KRPSQX9{hopEHSN+8RzbD&j^s|mnUPR>ckmtA zaf4M2{P@=i{~iB!!<3-hJd&UNx_Cp`QG}r_RiK6$7n8-}HTN}#40V!5 zfb-u!!-vBP&)>Ic^q}%$AoZ~LYmviSm%`8X6>*?bX)gj0GJWEiwI&BQw8DWQcpy_) zbC8?x@_aa@dw@v2KkWnG`yx!KACU+iX$Vc^g{!ivC_UP^^zE-#3Va$D?!Y=O9gC!> zaHrAR^)T$Gjac<2M}trZxlR1?eh3@NAK6o$brys9Z4co@FXK)%xBcgdnNPO6a7zdE z2d-Y~;JE|en%DYa(6Gap-QT_`UmWGEJzbP%SX6$t7%-ZV*SOz3(O*3S%}CcRWOrWl z?erW@ThVyoaqc%CeN*-}+>#r9&?Yp!KMWDu6;A}bSSRKnS4tC;%BQg|_AcvSx&?Hp z3)C7nC|*4k&K1wIqln#M*@MgPpZopp_Xc#yb~}CjM!1s=z^ZV0c|327v;05|1)>V) z)$&K3H+Qa5mATQmv&q@;=HYZq+-d=D!hPI#nHe(3PIdy$#W}p$#?b4*A#E3YN2jHi zQ6`-|lIr25VE)x_xVsE$0yBVvIM_3yEu@ZSKZ4)za6*09k9ts7~m``i|2_I4i+wg8bv8f{E4+vN+%xu77hzt5&1Q(ZVDv|)Do8@ldjbpv9%F%|U$QBigzXvnrQKZ5F0&;7xxiQ@oop@<4n4?+ z%N9dQtSvi#4rZ8jw@zC?xt-iPJ{`653W0g!E8lBayAw*(AU2s%?e#*6(G~~dLY!7< z_^ch%+6R8aOo~W)XXk1Zh+BHZg1#}tazq6Ep28^ddl*lJHxpAxa80~_CVus}WYMpl zx?>M@^TQO<*b9?qnTJNL$JdiXLoTj7#xi1Y>8UTHd{NtX^!qE)7JMv^>c%Xr+yHJi zZtT7GGDCccZE7_i3lA^Cw*8!hy!zsx-G=jSaj;DKda_L*mwlld|EZ`g3gaj%XWbCY zMOF45^7kC!*}^Xx?@(}&kt5K?cZn<>eFKNq=Ieq!xEtQiQ2p? z?!JfjOj=#_E`EXWLnaX*iie{oEYES3C$!(Z2_K~Vw&}fF@btazgra2!Mc=QI+S;nq zD>YTXkacnsJodRLw%cX8;>2h(0p5IFh|L(Ac#Qglp=`{XPF&bVvlWGf74iNkJIT;A zv5Gh8=;h7nn{wCE+kC%lPap$&_M}-VD^hpzwA1d`559^aN1s8# zZ%Ws=fW^QCl{a;o33K#(@GI@Bu|A%v>X$s5wKe?c&IV>S9JgZ%7@HP66|E7{4MSld z4+*S{*lj`b+lwo)Jt#}r?!eRe7m{&PD>UX{Me@dh$O!R!bhwL~!edH0^#;S#IQ+p7 z`2Wz*6vtJrN&ZBErf@il77w%BMVi z#s6y_jW(qnvSogLRMB`SijJ`2W+N))bKMnl??RfMgIO_gL_o} zV}J=qJvaH0zT4aNUERXz=1#IrNvUlg{b%(K&g)3yU%@k(d1ZovXpp^Sf1(mA0YbY> zf$wW^<w{bcgf|@q!4BQvvcxG&mJ$w~h&PYO#?`o9 z>&WfMM%3824Dgus-9B!|{U!FuKI%Y-zZ3=-WDa&Tx*DuNip$zItsA!~B|Mg&j5*!tZSC&SaeE z=mMBRA`3K#O7&9L&rCozYNddB&hl=omhF%&BgTSVYNwSii~xOF4OH0QosM21{JO=} zL2Mn>kv^o@4;Ej`*Y(L>9awHxH87WHWQF}Om>+g)b00U7e_8voAqc$jC|8U_fidee37dirhpEw;{ZA4Jy8m9-!Vv|Nn)OTiIO- z<*-i?m5{oXVNipCZ1X3GsVxFmg#}LVoGHTCtzZ!=ie~UjF5ekGm3d^gq z_`sRE7oeD9M%+=T%-_2g@rb3{kdKvC0l-dP07%LCwMtu`dL#(&fK$GSC_@#!hr)y@oH-5q7}23If{YqlMWvv-rPK@IlW(p+KyEF8hH-D&!YK7 z*)SnqwY~K-h+Yeb#oF+(@d)s$&$(ZhNcgPQ?Lqpbs7(b`R&RA1<~-sk%eoDsCy?%2ZGKCAai!?ojPfwNck>)l@aWXfV|A_$;y7HK#C z6N0a8p=xRvOo*;MAp9)})wASH=tBKOKK7VA?bTPmwwSP|b5qYaESVqWHD1)aDW7<& zGZO#+kfH;3RTZWRPN}b#rDPP5BqFx9LXdZ_;sok`3~?#onCbDONs*pJi`qvkY7;Ol z#OnU&U-Rx&dD%Pf6y%$||aFg8hv8%CRo_95^lXj4m@%b*=>wr@r~jroUSlD+ivk zRJZW1y?KSH|j(by>=$()}`jQC5Xiq5Cp4WRcpvd-1*?uZDIJTEn)G zS@@?`58i_?67#-<=TY=Lj(KL&^TdhB5~@5`NR};>TEAG1;tfbjR?BBdjM4x5=-U3T zgIlRHkt#Gqy|kP-D9-d0Ss(`49s4C2&E`%;oWz0qW){PXgr&8M)x64vT7J{)NG0PG zmkb@IovWGI?@|JaIT}L&cADuF#?sccNoATA`xZOaR8^u0Ge63@hSu8?J>-7x-&jg3 z$BJ4vLv&P-QS@E^KC9bY8jbkP4V2YJzbr#-9X!&gx zQT@@VcoaW}iJ0>wq>w%B`8TI)?RyZGgHhL(@y!yg!-$b)xLP=XwgrLPlV8IWhSKt; z#_L}Qa;z!jsaIXDqiNuJg1oP2&B$$A5w)AC7M6J)wlHdeXl;NWSX@~->reCK=jn_$ z7S)bbWq-eTJtx1l$|D+d=N4Rh8q4Pj+$2eZ)iX*ZwlOZYGT7c?5rI9zqsRVA2xvcq ze2h-NzE;3lYEUF$5>DJiv(Fz}wRvcPZS(5K^nQ)%trvhJ<3%&8g~Xf&1nmS&bgPF{ zSHp6rAg@xYD_P@@JHmTZ>IR~ZL1kTD+)Erf?~r%>I~;}`6j;~y6SEuv0B}gPJBC=V zUnw{6>u?DqMfAHSAVm^G0TVX}v7w%}VLePA2TxSVV(K1Lq=TeA!kIljUSV133j^0+ zg8+G7-LL^cxE|UFb4x^5b>jS3X9RAy@Uy()`Tt&#|8msH66nE66?|TOCBZE&mI|#E zT}3$ldHVyNi#{gf(L*b7d;lpO_h68AHy7qSk){4UuaBHS#f1$v290Hgk>>NeyYv$A zhIb0*vG=uECJXVWk1?)i*VvqG+qCGFia7P^#@T2KHM{;-hTO|vhyQNDeL&Ej#`8VQ zLCSfv!FD{a#%$=spfLLqe)+TM+~Pt0*d4k}CB_~+-o$@FjqV^;w{G=TU?TE-BfYN(K_(S(ClFpE-mLpUx#Ss6@p2YCe>Wtq9-j0HSF)H@ zm)YHc8criA({lvE3g6wRAW>O8__%DGD!MekID{~pbPp`I{r7L)!=QM4pPXZ~%;IZp z#6Lu<-XpUm)aHtip5HPY%4y&_T*Q?cm#7W#kx<)D{C8u+L!7U94Mz1}>lTV5I9>W` zpe5vLii0*}A6NIG zEh6s+hL!%iZpFQN?k{dql6;@xlT4E>Jq9p@ixkBP79})$NrXKBzu#*Nfk^7SmTwL~ zuf=Nic8D`KRJDZ(a!jjdTm|z>J7-dBI;(ea-buRamXu1$T*%!lZ<@BtMQr_7*69+s z7o^b1$~qm}MV0NB^yY|MCiaL{MoU~4yAXmred!)V^g@m^gF=-dMnU}9kM$S7Wb_^X z5mWM)2>NT)BtrrXiQ`|du&WN=BA&}6r7KqQ65b$sR6K7ekfH^bG3522GIeXO1-YXU z;2|rb0*%#HZra$78GHlxztj1V@NBnicrkzD*yKZ66S%6)6KGxd_s~cD+VQnT{rtb% zGDvI6tNnlfVUE+DVL|FuZIEb?o9K&G^a2dwBGv2e${HRTo2TP#W$t||?o}&qK4plc zBHm1wfRDA<1zq0os}K&5h_If7CMu@jc?s&h$W}I;vb>VdX@{~jUuOn;F;`}_eK;o2 zuItMjM*Uv)9qf4N)j~`sGUuyuRCA`W!*V@B(q(OXY=Rbe`W z!psGsX&0~9qh;ROyvQ`O0SbgjS2EMWjC`DZC`v^1A=|_s#ChNeZ|vm1j^AFWTw}c} z1JZ2K+vd85n-^gob-UI-5_^#@lq9B?_Z@Q4=8k@hpa4 zG=ID>=$4!YV)^kK!OQq%y~y7Bu_?VV6rNZv7@x|k5AF4@P!_A-cPXENQ^TA_rR=y& zOj=-{%w_|zNamXUFM-+a(WMC%0hdDZuZ&o64%J=pg@8N~4u8t9fYbOurU1Dtv z=94E!Y9q-r^xEvL2n7HDh!to4idfB5?HupdOLIWED9)oUwB0astDEAD__}7pyuhk; z&d2nP)vNgE<=fZp!ZJl!p0&RbFMY4)H-P-mz4f^WUCJ&LN6<@MSRPT~k1I0I$-6MT zH_XOuA%}ygKgMUVUM`I7#h z-Y0w)G4<@CJhzAQ)y?S!*n_>UMgJeYR<%IN-y0pvr4ao#JG^etCOrC=)xGOOY)wi>UrEd z`q2UF(uLE}w@RS7EN2b-$?EY=r9t+Zg)BSzd`V>pbSA7)Tm0SIb#GK=T{NRH3-~|IFZX4e2Ek`CI_v&I{Qdo2A~uHrUG1v2U8r6?;ZivR z)qW#w&L7ScD?inl{?O*?mC66|6Icb-Dov$K*3{uYk``2KRxwr)GT89+zwj*GU;Q+_ zL@3RbX2!WSZ-!NHsmJ$@$+9d#?aV06wUtU`I+Z`b??NF*YS=Aq64d9>KgUk%et@HA z;uqMxC<6_guj3sv;xOa#Wgn3tJKq;Ut}Gpyesor zWs7q`fSD-W^Y3Bje27wld21)ULu#aqtPd>d`c_B+zhs454Cz^Ktd}lRAA~%(8h8u* zJ4EOG&*pL7qK6aGZT#6meDC1=-m%(9WiDEi>&NLB>0yqM;_9!^7PTwFKdog+$uWTe zW08kY6?NI*&G6r?0}6 z$Xu?%@8T#pYg>GxBVL6Kv0?YI;*nk{N6;DriKtln>|<8V_qS;G|J9ACtK_4-##tFQ zWDuu*Ept>f4$G-x9*YqOu@L^Bx!qLRat)ABo!tz>D~{5OOhntSS%;$d7XX-Yx3D9H zxap+WO3Pf7j5|pdm`>0^&Xhcr*)h_v6K9+n{Z1V^S7z&nO_ylx*y|}K`MPhvKeWF8 z39le_vUep0Od-VB|((Zy#^R=SY7Nt@8c9+D@K5Q(r-Sczq|#Y?VW%}lg#@4(!P%=A_SUS~L9!e8cDmibSnPI-?YLLjGx_u>hmxoCdi(I6txM!tfa7 z$%(XTqT~&F*&GL=+FKdPd&EN&RAz3QsW<^6JqSD+C$x((U%eWTvm~r@F^@&u>&0pT z*G9*$%K?|7XrzB8rw`}E`L=0h)J%H?ErA}dEdN{$pc*1PWI3W+%k{l160qdsvp+v7 zPB!Zv+@lPS*93DVuZvq5Sm>&-tUju8Mid8?32oCYs5uR66|{H>>WjOJ|LHL1)Vd{k zY8xs1AnGFFku+gzbkG;vO1H}BErsRN$V_v}K7_(Q(xrkPAlpKb@)%)m zhG?%)`B)v~F!{2T_W4-sH;zGpbW^Bl zMVpO5DaeA#m;J6@oOgWY!Q0%O7WjFh&FL|ZZhoI+Rql>ZIb$;Ot#Zwyt*4r{#^$^V zY7UMZRHMBmgnYRQn3`%YE_e5qHLb-BG{@*j38ZM``uZ|75QR*W{5&Y{b}B!ctZq>$5+U zns*X3b^nFjHTLyGHB`C5s?735|EX*>=1yZ;-(=bz;a`Xpt0Sl7mQd`0XpH?ek2`QHsdh7!3{WEa?l!77^D%V%s zb)`fZdmCVN<((WB_aCd#eT&^1idOZSf0-Cm#W)I0#x0DQ6_CZ;^>BTp&T=u~qwEY_ z4x1M=kH&a#jFKkxEbQr+Pc`}8C5+lt3;C_ea`r&iMD;4BZzubr-ye&GpRDH@?nDo0 zzg%xw&gb*!DmvlR+Vult1cn!>EMNZuy5J9=I_)(5%5_YPJZ|u~F64`wB|Q27kYz1b z)==D||A{zbtVWvz{?R`3e9mIxN{tEz|KX>^H~_=#aloY@YRM$Om(7QK#6Nde+|OoR6%s&b^jx zVW))FT>Kk}!xRv$xA1SI@IR$ezB<7#(tr!dJ7=Z!fA#K#$lVjtet9l$h(y># zY#E=b+zA<*z}=&6J#Fe{D{&Z^Pe3cqu`ef+Gq*MT71Pv zw?@~bx=Gg|X!U}rTJ);PX_XhvC&pU^M2X3ST>tWx^Izi(1v9$C>QJoc(wfuQF?g^x zXG5TJV@2lFxk^ZSb-8Tqv93q*`MVsk?!wqtBh0qsuL<)l%+fIX1mjx@W|YERe5B8B z@jn;_J5T&PFUKa(F_T=)Ka5II3PGGzAh|})QQ!`a|LmH~ehBA!V9)egW97iz`nxf? z*-Gi^f~&wrsG{!fV9oCcc>5YSue4O4!v zSMMJK+~XDhaS21dnH!mcpP>o+{+RjOhW>YnysJI|6~Je;X}{IMuvaaT$2u#OCKJ2j z?P@Kb6HWGv*It?#RseiVugp9iKg3BldJUF;!c6Aoaq`AsLD@+Zxr#^| z(2I{q?IQE>W%Y6ckZ1Y&;>nS2zsW3@f0XE-Qc$!)0uGxTbZGc5PyaLP&)4_&@OwBj zWLwdl<12E-GS8`foDA7Kd>j!F5HNrYUd&@GtSb)6m-T;E zoqtN>JSB+aa)~$1jvM{xNy@5@roAe*3CqV>*x+59ee^cqb$;k>U{sbc$tR((Ua_Ij zZ@r{(>80>kgtL$H#GK&~sLbVr=sMDQ;-k^u75=(tuyd1UA*DhXXj-_QQH`F?W`AzU;!4idK zzt;rY{tiny1pMz3%v5PH4?@QKd8@^Mxaq~RxWjQ_b?Pr;Yc;6Wkg%8h8&dFuHLad` z(HYC<`&ILodTGB@R~y_oY6M~hPD6C)_|<1H)(fMnA9`jY{F_=fSTg>N#{NcR|3$KM zAE;po691=i?ZB7k&TQmfr`POVpOv@kg0Xy(F7JA3*!o{9{AXEWctNdC*eEB(LBD0H zS8#tu2k*JJ}#$o|F^8U_^>h$RQigHZFciCf-Z>J zn}Z6_Up9^rxpIaGsmK7KC?2Kf{t`#`ydhsm|!f64^o+)3F>`2xxi zNiY@R1L($C*{(ftVeobBsy%7$w(LqhUOnmqM>s%Jl&+e|Bv0X1-b^K73`q?`!@6Qm zy_STW40!$JnJ+$=TSVIEnGwAOseNt<=5pNl(d*$yEbX5^T=D33ty%!XoW~Y#GnJOu3POk7ueUJbKW4w2i*PxeJv|( zl&t+JR*D-ND-eB8krYBU8AELbP+dQ3AN(7~{dXJmQa$pNx+PkDT!y3oT=o?xTG!?r zS@(Y38t=kU(zw78eg?G8@14kW0qQ}-i}<9Qp9pXTQU*#~UZ+?!DyUKRbz1lSk=I~~ zisk5+2MwPT);?hT{_XU<>HP!nZj1k_w0RAFn2YmVN|QOidK|XA6f}SkZ4vM9@l3Tt zz^Y*w#{CxOaca`2)XXHxE|BrNT`J-u`Y`3AcnwGXx#r9u7<&IcLHpFMdf>S0@kkNm z$13mlA@}5-)`3-C?MVx8)RJC>@ERfVX~2N=^7zXSQE0+;Y7uPa$31l%$7uMR7^TW5 z$-D%A3c{WCNFDdDnDO8DZ*iSrJD zGpgm1Y!cee(~ohTrjto_)8%a@o{8>zeq?Xhx`+7}TX|4A-ia6)176&_;BOrRu$6W- zGedBKO&iuuiFZ6$J7e<==t&SASaS(T=M}uG-@je-NjiIIEgSQpANyg~bHN|~?l@0FwYN~vFWTA=V z8%j)HcZ?{hj61@-aMQ)~n&VPVHeF!CpQV}VJ4flY?(ruPyqi~(JmXAOigkS3Pfu-X z+XJ9t;zLYim-XNbS5?Pzmmqp<2islhy-2S(x=!_#pjiJhm(U($;L77aO7ffn45%|( z1_cEufMQ}JU|G@VnOf#Z#%GdjgahqO%Vqjhr!b={e(~i9GWsm)?-j-WEWhbRP#usc zXDmR1`jzB#2FUpLs;H`Iw1_{J z)k#$8R-A}N)Bxvev2~bY$}(pI6#L=-GaM5b_3xGKT|sF@g?b9|G*LLeBLynMp)0_K!I zDrqW?Ivif|c3K}{zh+$-imO$_(U+2fTb}QZT|}=x&&!UEPeM=MRMB`v?}4CjhbSOP z)YW@B)nM6yYdWvgJ&=7a44mbdGG637HvoD3H4=Znq;gQ!jz=Vsijrd#hfZmCg02-_ z96vxs|Hv9jF)h>sVIR3FP#ttWYSk3zaSy#etusb1Q3pB-(6^jhKLC2o_4rvn@;3`6 zv>f>$<*1AS<1d_xM>Lv$GR@-n`@N{me=_%^v^46=qsvhr`rq_-F3r<4Fm{2JcWC0N zzvn4yW%gZP8CeMI)BmD;=5VT(>5(DaA{^b>ihD%aAL%$bSjvmNLS#)R8W11ib_T#p zb5x;iD$RB;b;w4EzEQ9B5o#DljWbaUa)4woC(>5X;#MjEo6ZCr@d()@>)~{fZLziK zmVU8+k9FgPyn)s80-fdcHgUX{c&!?}bw%va;FdF6@V`N6l|;$%dD;RXy;!+wsXmnb zcJjAe~Npm~Q=h&u*fjCieIznOaaT;FP&wr`J_TI<9<^3rU4QYlDTyRPe^Zq)D2QElyn z$28$HNi6AY2Bn(z#3EjiKyA1B+{usn{i1{U+z^g}ICj;dJ*}6gBN)~2K8}04Mty;9 zN%&O$^a^!y21=CfdCL{F?mV2(zcER9<7O4Lyf&KZMCM;{PCG~|siHZDgH$iM0XNHH%7N3J zfD`BXPR!HBCcbvt-mhm!pHPo|{M(BDcky17X98m9UX{JMRIHg!|ERmt=|!ZPUPb=) z4h{6ar8D^0MLCAk>98>~7NV6IdxIx8j@RaSoJ8Gl~i|#C$c{MCY-}dW7 z&4+|VkUkLJYNH0&F?y!L#)Wf)VO-jpMz?$0doBIRoQRD0jyNy=<`@3lxArd=M%>I6 z78Nh*Fvv&W7!ac7W{s+E-`=khis1qrnQ5wgR_1==OB5im}lWt&HYVZ z*TcLxpo@vti}13{5Y0K7M~*T)mJ-!pWKK8?er!Up~@8MA9Xl6;E|6%)#U@0B^Y=?gc)Jm!tt_HW<~3 z-Pv{#Dr$%2Igd}>cJX$*)zE=oIla|8|F@r#&N#9}VG37pGxi-MQf$Kf0BmjiJlFZo z?8b*vdE|G^u{*~R6FV{(b?eW$?N8!fP9LBmY}nH7jmdkyL?cVc_K_s}xuG@m&j*U1 z(LPrV0#AuLZPZeoJylxlcN|{7O_ruO>*!T7`cqwsf={X+7qoz>s~akfN{{YMqe!+5 zM^D%&LsOP+w*U;hTrkVct5xH__uFj1B%ctC*k+Whyse(nm(H#s>V6IN|L0yJr@=V8 zVV2fGSlGd2*n}uhLU5m>)A;SM#W|E&6d>@?Zb8)2`v<3Hsz#b}nhy4!s4+RA+h;|; z8(n*w^Zww)YT4_Lp%1+k80#f3jA`?8x%j?aX~qR&xr@(Uyc#B9tJh2Z68i_hRx%e_ ztG@Kv@HI(L6sN`m{UY!)Vlitm?1*|!8L+c$7G?aeVa;ttChBh2(Vq8lVStof2R#X; z4;#0s1qMu|!sJPwUz}*V1+B}O6#$MK$F94t(J0dz|n(q zg4y0l;hsz;NH5n?0MQnF*_Lc$Aidc8K?5@BW%hne6r3dXwk2olq6~goPEp`PuW;^c z2R<5oW*0&?@1okZBVWpOvhVv2JU75=U8*K>jpNWb!W>tfVzct#vJQq42J|$2*2UE6 z0rCgUr#lOkLBC8NU$HUc1ns1(2c*$$nkF(!AlFLhcBzV)1@vdCwl&8oh=nYm+I%ys zVx?Sck;8oLAMiDffc@D;JrCeUa^mmqs*aR{-{nTS`P_iVasqIx75KTntt#FC&}yTc zo0GEQ8R{5yYKMAUsL9RpjN`}_&t%@TzJpZ-dOZcjy8@_VO(ex2Qvtez zY=@zwoR8+&IG?kG_8R4S9{GZt@StBBg*83CJc?-SQ@mseZHno^RCe(9=tbx{^WUVI zZB@(kA?VF;5*v6f9A;G6Uq!h7`Ra-5o>|ynhL;k2uo@9M1zPM)y2(mb+8^ zhnxUyl)`J_OLMf3+U+~tC%xf?)7sg8#MHs7ouTusCkDpgxAsF_D$EX6#>Rrbu!h6A z#TC^j+^QN+T+fY2a40K|G;-`b-~f4&HleDXh?wx$khXF2oZ#e`a^TK1Topq{Qu@Ht zvANnhw6#UqU-6e-#{gLW(!KG?->ahkBHVd#O;2a-lYMY`#G}FHle)iU#x{pUt`pn; z0|2|o`m$b5RlA&2CanfZGf-Y?5v!&&KI4M?XtPaXLfZPBgGJ-7^B=7}JRW=G4O7)* zk_b!iuJq^cj0>$i*4S>StYTjgzusBlR{)zt94?FhK#7k{cd)Vyae&~Ec_M9>y3z?H zusd-rWow!I%e51_th6joL2WJv;kuH|f31A;-`^00mT z1S`RZ;UPAZrN4jLGf#2Q{FQ@NRe>>EE3~8dblwr4)&!cUDN`_ta}N5o-^laJbq!Ye zt}YDaVx9b)-vt+cHwC|ZZzVW4zQ53ScDnlfHs4g67uN36#xqt((+*{$k5y)Zr<&zZ zTT5T=jAuYF7nJw1v~O}V9ggPi>(JLE8JMGerp*8<;7PS>mPNJ;PWZom%M8`y&7IOY z2XEz7i3)Hb4gQBQjts%R42jPNeUED<1->>%U1s!^9rM;3qP9YCPW(*{z3Oe2`iHfh zeWz6c@+pD4;zC}L=a^z9g|x4}45f70#K&Z^uZcTTAnp_OYRK!UF3AfP<4+c;fMmT~ zR0|8jctEy}%NzR7SOA6GfBbl(HEb1V3G74m)BDkuc7GDmEdlPgn5ouRVVewdL?hYo(b6 zGheIUFMn>g-1#|jeES~dm?idve4E|1mm5ctAnx7CqTK(RnP`~|suQ_o+bP#9a@|mW zY8#Gk8(nj*^0jRz099UqulYo)L>&2~G4d@^6rR5Ch2Ge!6<<@|FM#eZ8BR9ANuhGQ z*;HVI4&L5u=20_}yj!ppx1n@ip7i2l~Yq*1PS==fmmR88@ zW35#8FC7uibHNWzJ*1>Y&NNo6cTh>C#LG?qemCar}M8??GVX$Je?)pPi&X*48tS=HMm2&Qw(z zTr>DJYIEE&fNScpFwLSN3jCdazV&YNMJ0!Zi~^KXJstTeoa$tYXyxe#Pxuob_ZXbP z)lyL1FSnnlo_3tyYirKzsM25oW#{xPTODj(^)F4osFSNXexVsDYI0jOqc z)#A0s<0>}tqq4t+tuig+&a}9~C;2`{IpqsZupkDqd$l-^KjjQhjGWdMR8|f8q9Vn> zfZd!jPdm8*Z|mw6>v#J_<35)0qe_x$r?VWW$WMfe$yCTL&2Yf&0dl*;;>Cc=MjT{^N4d2_3!!IDMYREv$Wt_mgVQ8Rsd-?KTPc+WHa z#=VcPbT5ZU-AgQWST!Lw0I;YvCG*JCKIQQR3Nm^5C8C-ZcCY%ycz`6hK=Qy+p46_S zEOm)~=UkA>$}8KBQ_TT1soo=lS(`gxJ7I`^!{ zSrf|m#RdKzpOlr{cT+q@y5tMeQUhP0;kmvv3HaWru4Pbd`Y|^2Gx}F*l%;dcNbAD- z=dQsJ$WZUzT&oGLN)ZFxz9tNwM4*#9-rKh^_Dno)`Z}?nY(DUOK%v&q_@0fTFSn|| zu&?YoA2Mg`ce8oZlRRCgbC6J8!z45_q}Wh)Z2 zRy}vPIeSk`E5|7rXDdS-(ehv+p-jbuo%U9MA+8+lEPGB~=ix%0IwglJ?fvMICvM^1 znhWbNBKviw(V|P3I==F~qD`MjflhR-nZKz186h`U2rlyAi0=P1qBsqfVX5KcIC$%mWNO?TE5}LYq#OK8k0*WQ?_Y5 zGviN!d<>LVH8|2uEVRBZux~m3?=w)v>c}3&i3EoT`d^UE?jp=LZtY*15Y`vE-)ooX z&7u##)CKFq57BRruVsRN&VF2%p5>or&uMSv<*4zeb7DKLRsKk!&MzxLW$USkdC-~? z$u5EwypOtroP3K`MnzuJ9tcJiWL^_h)NoyZ)>95Kg8 zG-hb#bc5?yczaMc&2QzodDGoVO=l}W>oqo_Zb~n08(>FbKxhGa{p-%n_)wD}Zwd&# z$qT$$0+wP&xs)@WJ>`C8j$3+uzxuB0#yO9^WA(;D(fN;o2NS7nfWiWDuKH*6#5+3WlDUbvFNwst zfm6+Y?2_s}z1fF5ZTYy706(?SxuSG8XUVg#Q!&jHC+bRbT<+laF3S*vE_7fl4q3d}y3lhJ$6(2hh` zojP*I#nDWrzpVgPogCqnW8)t9;$W0nW$VG;m)`Sj=5;_@z75|F|A}a!*ln28;2etH z(tL=hm-#l1UOMJbVgO>Nsp-uT6L*o@;*V&hl||eV=`V#=?c}ru<1xqSj}FD}%4#=| zN@)0hWla{V)QQ{&HGJCgf)#+Bv@u~jZM-j;)Kn~-kzX7j$s*jUJ|t;I`O{+Od|WGd z6~6ZHvM5to^?HJ~)3br}fnnjj>)X5hd70x~#Z8(om}_uktH_`IYDh29Dk6sk3h%vg zJMSWU%Q0S3$XKP3KcEftqms9?zvd@olyDm^I-}Z8w*7Dh6ce0>24Pj$XoX(<|>q|!KMk!BSiQCPH z7HYVlo-<;-2uSFWp$xoLUo_|{=4V5k^Vk&UkCq9A*hQW7!J9@V8>p4s_>0G=O@?^y zuaBBxx5q#QxT?nA^OMCTv0adW%%(o46ro0m?w~F)8@BrA?8jlS_fCmf$U9>>m3;XN zBwjkw$meGJTJ#ofiRQ;)m$?#v>@T`2q)}-FP61+th~m-la$Vqwd!4v5-(GD3pe6Kw`cRfQ1&)Dxdus!oCadV~d6!%;*Gbw6ctX4&V z$P?N;twX-$g?1m+FKJ~ZhEj^QuI@ezuhRYM5a$n&@8S3E%FlGA&e&wmdut|J;HTah z*#pD{j{tKjyu0w?pH|%)tTi{`LDY3QCpw;`Hu%nO3~Qo`DTws4t#t0~37>JzN%yzu z1T(Z-Tk(>i_i=|G_xsvT>+M36Sa?~QOmRDv3s>q@^Xemmr}r`nHHGcw;$Rzls}nXb zNUPKR^up7Zj_*gGQMP+QP_g~x`3JqxF?l}HhNXgcGMP}ReY$Nc^G^r0iMa9lWL9$l z9n}ZB7P#IW{%KR*Nw{gqB~$Zgmp2!nDn?iz>(>W1eQkFFHNi|G$2PuEbcibbW>j=4 zie~J+MXzfya@piE-FrO^-eRYBDKhHdM1!Ws*ZAl3Pq1ad2XFfmfoJV4f4)|3jRHQ4 zvx0V-6-s%eOWbqnC3#nc0=mpgekYSW>=2U23v*`I#f)hdM{Fb~)(0|9tP3{w z(oLV_Ra{&1c|mZiFr$pbBa>MmvfuTH&!IoVX&T<Y13vJ zT>#tzesUk|Mr|#x4)q%Pb>!BFIVj`4<#RoX72ghnV|WJhYS|S`dFqh35oAcfqsF*y zkVgge60vk5g`1bEZ$mtMCE{}So~E>8JVw<>U+Z~H#uTD1AZnvA?G92$*R({1#CzAD zK;4k$H+^PDTFGhRN)E1AOBIN0*C7WU_3>$a6Bn?)CvaB3!Z24gFtQAssRapGZB_*K zp$dc0+%v!7K{n1M!NKa}-a4*IrXTNO8rm_GYYH|bjZA5q+&CJ?Y?`!;oYqecGMIEb zCwvMuzgP7FYK(~Vn)_wCq#yg?#*$+n05T~j0-7^$-u7h+UB`1$-Fp*EU%|FG;qzZk z9d1S51WG0{LxISFcFW2Hy(8cswNt;?Y52$Znln=a8MJC0W(`kAnX)DSrT8%KX1;vU zKIDJ_f6K9}5Iu{bRQsfp6^ygdJcF;C2Lui`OmD6w>{p@w$?8u8y_F??OoGc&Xq!vPGehq*VTtqHeN6q@ks&69@#bpKTMxK z<>fdTSp@_yPtXp6E?oD-vhBi4`U4(EZ9Vr%_vN(p(e&C>;IF~7%2bd>SPpFand|v4 zLlSIn=SMbIo!_%#ury6wy}GLRYJymAS?XnGkXu+j6VAMQR&>IxTO;dv)V<`>#I1s! z-PHT*ubsp5&YwLSl#wJ z>w28{hqux_;U*yuZQfe^y8PE8ZTml8u!|m9CjHsK^T|tkYdP|^GJnH^cS^~X&{(EZ zPzAT?0?@WuRjc4kdqN`mtHZs5xx3HJ&{eK3a$4w=uomm!sgHk}iiah^j3+tLYyVo_ z;+j?y+B4^6RgIdSTkcu4ge}dtJI=`JR`kJG)2MeZY%U$)PT=%Z;jo*@gmmX$u{LnOBc6UHr!C9TsllH^Lm?R^b9x5b$Y9s2Aobc^H9~P zF|c7HNK?ep+^*=ROO-c-<8Zwr(`Tm;YLrG=q#_5|=YSsK_n-D=1e#mjO(7JTZ|JI#=k>DwL{iawCU&7)U{ z9#fm*K94sa!#EPkXWR_S6uVM1erI+etH-z7!KbYP)9|nceOq$_^NtjN%so-4=U}us z&S~y0$ma1U6~f^Lo}6o2zVWIPon&Cc+QZ0dYU_(S2jRpq3C?vOHC1K0e4bs>KFw>pH*L*3RiztwWa^oZCU0f`Ve#0(P5xbv^ZmHme}uH# z9WwQjTyvhi-8|xT;7pNv=z79}?7+@vg4llHY}u9pqef)A`dnUr?tKGp7pdZC+x@x6 zP;gOV+(Tz)aNm5%+egVtM*heKO|91HhUzhCtrqcEszBi9p` z)gaz7>yX4z>sT`XzNk+uxne4Jcf*EeSsE*KKHQfA7dUIO*H~Np$ zO5Q<6&46nfhV+RPJWNslW7uzYqs!@)Kb6gyMl^zA;N-W4GZagKy{e9Rr59yMqhFIP z1@7mb3GqDio>705^2R?P69lOBdFwf&>aTC<5V7DMedAljy{j#gS%Hv=SyqV+x363$A-8(T=}-n}n)=YmN@qwumGeG3l(zoJ)x=MKc(VMkHLe>| z`OcNHG<#<9`~LFwqQSk%CXUG>dn?PT#t)m#1vbQ8>c?A~4WLiV__dIxcI6W_H+#D( z3J=P4bmTJouRoS`iw94hQDL3g*1osB$mobb5b+s6XvG$H=j7V z91}*8-@>tIbh?*f6n$A;uXH!!5Z=bogqK@suLkxDa->A$>hPuP< zkyQqH^s_Y5)CCIcv<|oaLx+J{Tr(Z#1yu^&V&)xAQgKfP<4$XOinQ)T`{@DI7lEo? zD;(K1$POVu<`H@nA9ySVXDjJyCIe-jQlu9f6t{F97a?qG4746K!PttEa8FE8<$B^n zP;h5p{h`Va0ZBXVzSMwjNj>Rtp~N|h-u0V>vETIA1h6fqvcLh59xZxhGreb+Uh;n! z`|^LN+qmB(sT8etrV?@sNwN-ixos&bWoL?t$iAB`gd!wcWtmE)EHl~HnIUVI8L|vv z#y%Jf#%#=T=6;^%ob#O5IX|3#;CsElpX>U5uj})<-tYHE4B@XonVz=K3^VT|E<={C zKUZU{VkD?aIO>DeNk!^}U|e?iOm)2hQA@r%*?2KgSTRWHU4y)r_Mgq5r9^||a(#ye zdAJa&Sc3jjh7_4Q{a9ky!f?Es985?UsRUb1y^fEXMkhY#KJu#Y!YK5-MkhV7Y4d0N zxkvYMnx~(zmE5q3YA)Y%o(3N+afwdM+jFy3_!h)vQPf3vtzl%%Wc4cSekEz`lh&f> z_lsYmh67{BpG=wRZ`ZCLTkl@5*4NNXGu&9duVCEBOT@3iA8=XZ4PT)F>FkKA*m z@BFGsaFtc&cFi|xtb!pYD6M|uOyq#(nah~%G>yQ|XTHgW9F=%WxOlh${kEe~;!6jI z7=oI<`leDDjJ>m;a-N9%NI1`caJ57U-gE1%z_t1-_Um4DZ6JBB$M8 z?jt9q#yw%E7uele2!{qg%WB6i3gO zjT-K~pbsPV!R^LL_2+mOfQwOtI^Xzsg8y<6thMY{--5smmvJCZyF=V@{iZEQO_9Hp zfe%hQ`1_<3>3|ZJ);$^rzv*xnx<4LI>CW9fW3mO-dM5?5_Eb73j=T-rntt;ck+H77 z?6P4~Y{BRq-HI7!yroQ^bKZXYWtN!!wEp$FS?=)JNHH;ssF~{K^c81R-sW(R+r};Y zTynG`9Vpri2|Aj)UB6pZ*znRw)s6Kdp+nUj_H<|=IjhDvM0vsm$~9YjbMBX$a31E; zX!P^&i3;Z=DgOCD34nBz+i^MTAh+C$E=1AjEpolrpn|Hq7;HJ{A@->TD%U@~LEQFD zwx1{2cxLmAfGyP(V%*g&q`Iu5Y^!+O7#$b-t|HlhI5$5dXMGVDYj?-s0`h7^rx9** zsU4UOYq4s?hiRc($`&Ny^U{`o+l}u{y|@LYRzfr4x5wVY#3NG8cwHO$J@k5tha;@q z7?A-W9nb~q*zCk|i=*KuawcyusCctb7&YCDTTYdG~Pm<86MD0p! zPzFOUwyjwBJ{M)hb(UFJDQGq2>v@Ar$!(*Bh7+u<&D^aFJp3wT{Bdc&_<~}XydKc7rCA9v`YV|{?+{Ek8W9iJnU-9-|wT76ReR^A#Su?;~m{Px0q{;dfKZn zU+`g2M#}p%wMO432Nfy%6mQr)ec}q#^89IE{r$G9-5w3`$+oSIpK3~0$=hz}mOrPz z-ybUly6F3S`JYImll=@{J~(SJbstAd;~t>hraxY7}`M_ z;KjbIn4jmriqyKSjjv4eYno$&DfZsWLL5c*6v@<>GliXq&woq*moG;jH!kYN^Veo( zY}gvfen={RW@bk4pKxhTrl|+_Gf;c(PwM$z?%;}DrwYB=;)+=hvaenKBo2UfkNqxa z@$1%dO@ZwEs!ujF1`}IdYi?^|F8m5N#oV?_9xMu5c=8A_ajGI81u3+Fay%xy6mxNV zb!O$+S-GLpJ?MBP)w$_hQ|6izIfJxT1}^k!we}rUhp{U)0b<4xi>+8?LWl*7Y3*$? zTP$^vWl`%j6NCtHR^Kcln6l>wK~?dcV4^^d6$_WeIA<>5 z60~f#Ces50?dIRqsp#0&I$#oCm41Wbi`OtE>jRr=# zfPSW(P2jm7b(q~cOt0ga@q1Ukd{Do+nsh)iN&oukfQG2~-*0AJOGV!UjJzJ6P+xgq z@L(v(>5W`)SCqJPh2G@tHjViKpRb$GiG|IH`zyMGn<*C48ex&G5y&h8MaVXIvRkQn zZ;x7vtl5o(?K~N2R5tzeQ)|Uc^$9=BJZSr#{*vQGkXXJ*Bm6EY2yHr3o%Pm%e4Y37 zjV$WetG%*|#TdiKVdeL$J_~WwBZ9mSJ7sP^tG@M(WdzzpPDv?0OP_zJ-uX%QSCRRx z*stEi?lTR?B43f8-QIhoIx48TxR8R=aC@oH-@1vEE3O-u!ewuz?Ofl)4Q44B?3o$f}gAUvb$9HBCI2t$(R21?`|@2HmG9w^$sb zV9&869J*qYJPoRdH}YzE|5@~N!nKa{VYJE0$Qwf>dol<2AAkn-;)bTq>CFn-Ts=^| zfxmejAI^6GC`Vit?P?0hFCU5e6;>DerMU=mr#bZU!U2gE-!jkV{+!rN7iTGl(;Dfi ztGb{qt)0K}EorAPWg^JN9NuL5gKNrZeVd-Bk?vc7*setOcaN@<{695}@voEX#XiZR zky}FH))H3f)?Mj$r$#)ENZ8^1v^mu(?1|i@Bm`eHgYpZ&!;A5ZSLi+1<6i{=`m+J^ zU2td=tHpJRUgEWRJyT;U7i+lC6~NvR`U&8rFEWkEn=bd8RZM=Zc3B`FR+=rN5I`}7I)097^351hy2tNkBA>kpZG0jC*ke!;9EgMis@E}ZKvqB zO?^?=$iP`U!~Ea0KfND~f4J7<10b6UT+x)bOzZXYDhRLE^GPtb9*IucylKTVOT%zx zNGwx!Jw8bv=$)rB&x8bR=%-ORzEafo&nZ=LCq|9YY(9be-m?_ z18}zi{g!N7y`PNxw~Zw({0=S-3wd3g{QdEK+eR0gAi}p*7{lXgAQDr(&G4`NBV`GlAvhy;p$xP{howske*Uz>sP_pHWKtuY zTQrQhc!2Tu9SeFgioaXDd9vwJ_8dBd<> zjzG(kFiDYHD|2~br-?#kZIdxnc0GA#6MwyQ_nbI5``F{?WZ5%+rANBje|kJ+dGCnT zFZ=P1Lx}u4n$AZ97W8;UJ2~K!_FD1HN|SqvjMsvfEOSNDKRa}abDy~!P3yUj|9SOU z6Kgorp$Ro|9y1;5N({OSiInpeW3rvD2Qi|Y=m$aFeUBpS)G!@~Eu~wEq}gf~fQ;*h z50ccz>qYE+LDGMH8i_)y#N_DCw1>`}NQPW$bic?oIgxdvp8`=v@e(CpGul>~0PtcYmIC4NL%38za`{+!FBi`I`wkr@82D{r+e(H=I^<3R)dmJ)JRpM-60V`a$w}8|_*kREtxt z%68!IN<7F+@w;eyzt1v%DmSd7`h`+y9XnMHTTfVtJlx{|OJ3NynsIRe*)y6qd)@s4 z*|(AK4?d)|qU|)mr;ZR)g?T>mMjbURl+yP>BQO6f9?FI9G~~M%?5f_lXP1&v;s762 zCGciU!$bd)vJ)r)LB@?>m6fE6rd;w?%z5n18PJEKB#vi=6lGTZ@{to-3~Db)h_?vd zYi^i3V;EO2&zs$sa_+(N$is~`Av&hII;suH;KRl+)+G-Z-YCIu(<{5uCF zju&Q>kGWuFv@V!@hPaF)i92O)9SS4qii_g=`8j>`%C!bp?V#=RMojAqyT7uxWsydY zk9f1r#{%EX9`*58OESk+)`heLTE`sgq@xYeiY#M7Ob9@48&c1i#FOb^8jEw#X^EDe zOtRRUh8b6D(~!(`j;&&xwCW7C~+fn9Kkx$@)nY*K;Cd(wIhlmZSWP zpZ*}@omF5dd8WIPo;mg4gjtVFLh^H`JH6bIp)>tuXXlPHXOoVlw4aLSs66Q%9MARd zV#r8h%(aGvF1V&pP@^-^MF@|gd5fLcCSr(z--VxN{lRC%Q_KigsWbN-Sv$c4x{li8 zn^@Q$w~d&jppSW?t+Fe;FX><&9mTJLG%*`EZYcTr9J8sIJ#Opn?5iNwHO1`}$7YPM z(@4ubcP9G6OV)#rA$h3Db5B5d3Pj$?$RFzmJ9bS{4{Iwr#4E}>%gu)!(Ehylcg^XX z;Se}I%u1)UTc50Xz(>l!bwB%N+E$g;gxStd0{O2!;d^>VkB|GL?!*c^Z+()gO8<6J zT|MSWy*YpWtU6?uojgV~J@o|HZGK@_jyM@EmQ9olP13VL3OUcBJybd*EeA8l>(;M6 zdH7RLK!VK^6b_ra^4r3#EGnljijG_&97Sc_!tqmL!xA%=<4cZ8N* z+}tR^GpHBhPadBt)JhMPI`QWaaq|W&vxu|W%lL79#&y+fWlv7Ia%F1GHxbdwdGpCt zr4k2kI^FK4q^R`#sR}f_-d{1rNm}IYxsp2r8Gj^F8rt#}re))V`Bt@Y=$sLWn1vtv ze)}31+6&X8`%ymW21yj#EP7lXif^11JGIylj@W_vERQSx=!Am)pQDk@vAlP;n`{vW z4MUg|zRxZ7s)x1yX|hqM4$jP_!v-O>%&mm_Ghj$EQ8iOa*wmU@3#3h+WO-+Wfe(9ZK-_*{dhtux3n8_(fsMYIe|>P~v-#zNZ!BO%X9+=xh#c!*MtkU}S@LeA+9>+285V${tja z{0Rl{c>vp(oQ26oc#XYrDPBB+`IL)qf8Fa-Q|mdc)9FuWwVBNw?jhVpPvCLdJ%Paq zpANG+WqI={1Kq`YVCOJazINMZUP(sO*qSgs?9Lwf+tf-dp>fgiwe)d8H}(STAhiyrC2 zUkC7^?1CZEP=D4HAq5WX0+q$xS~dd~X#m)LMv=+}13(xd5L$-{urxg{i4sp=5Oc?W zJatG?JXqLoksphx$3ER%QQcTn0yK0(pAWLXDS!X+_lcRa9#h(O=+W3YkM8`cjykKSi3^s9$0*z} zMOi<>89hO4tzE53rRWDGu}F8nEPzvQdA9=IpsRbgOy}|6O-nT$Rj3+Lm(LgRSHss7 z&)&1)nIB0J)Jk2->zModgdLBCI0TKB5){Y_1eOP|)qT_)6jn%3WYb#sBUO9; zDd?FbjOu&Dp0gv=D#6ECby?wcCnEv~p@p6s9`7YgC#~u`z$J;~`DP$ATH-e$Bt&8B zb@A*Ga_&i_eYD{F97_K@H8vb@LZWKKD7D_k)&oq)L?F$Zmf1=6AF$>TCWOFtgB|Yw;U}1zKcJC55Ih zVyK!rTXW_~n3d=H$CccZ&#ofwUyGRx_trCA>+Jx>r)Q-dytNt8byZc=dOdDvg>i)9 zcKv6L$A%^Ub>hDerZ*tz>W*S=HED?NS3i$mS2}rjbNKIK{h2q<+aW={BXl8LsFAJp zcI9YNNBUN>*Nh*eQS_z)qf9#5imLU-=&Eoe`3%8LtR{4}CVE>MQ$wkm#1zldj5F5U z9lYP}rJj}s2DSsgfB?9wif@&OLRWnHQ1TiLZ$%&>Pr`3J>pM2M^N)CCl1uqV&<9)M zr5}%SCSfR9383afo3*{-cxr2poQi(BpyM8--$C}wuZu1Dv->PPezuhd5!7nmOauqL zS&a&7N_>|4a3R-k;Mn@d$HCd-T@}d5V8Hc&CBymhih9%JgK9Fov)ecjo1@TjNEEqX zS$3EA7i^=6Q(SoClw@lCvpN~->eWSaz*$^)+-a9+QS@LzTZ5 zU-&@JijJF=j}Bt08jmexDtOH>*M$#Y5(MD>QC&BFDGd;`dQ5bycp7WvoXnyY!X1Q1FS4 z*Wcm@--3jaevqeM?_0$H4Wpe4GxL6+u|I#Ab~kA~XnHcXuJeU#WDE3D8*88aaCcL( z)XZf2#6gYq$)Ay~r^zoqw`I<`N&NFG#jj3wtM`=%^?hHxCtzgH(C4nf46*aNQ{%F8 zFb!l=d!y;daqQ^Iq@TX#q=6)K5dT4Z**&gfa8(ymv}^5=3DlygOlG{>9LI5NPnS8U z2`nv}PG)80)cz1ym7#)GA)lxhn4dE&a8OKc+4}Wxo4OQz+hXIdr9>Q9>>U zcJ?af4P{cy^+V!8NX$xf2Q{YUy2o(k{|)S5%+uP=9mtYR_oqmB?{mjHe&Or7koK#v zo0|Ck49aWb7pAgz6@itu?yXvK9pBr0F!JGJNUiHNa^&6zHP?T1xti44T(y4kM9kG> z@#v0$-FCsko1(x+4JjWP;x~W&mA>-oKt%m>t@Lk48-9*jUhHUsnV$*kfN{$?4e!%5 zN=(H6g!UM{Fc5I%cLB+~T3C@Q_1h?k#TA&p&lVNZcS@f<%n-`jl^HONXYT( z&)3$x3I(R?Gl2)YHS11`Cnflmp7yNY# z`*4p@o8M>5Up1?MFZ}oL<}gRMmb<=u_*`9`paIg)66lTv(cO6cpV3A9pV3`w6jlON zN$EUs+IiWW7{1;CJl4%VySy<>OYWuron?$#&`^+0&S6*iPZ!BbX08N>J&aS#D{*z8 z8qhPMe<;_u?6jV~1r%DE?68DA|9PMZuJp1URF~!J??E94*J>Hkg(}Q zu;*?xX;HpNbN`u=q(aKyC9KI4%j$c~9%vBSZtwN53D(#c@fDBTGr8V!^+<{}U2)*w zacetc@RjB1eep*g2D_{2C7%M31BQX3ke?h5KUi{y;ofrhNP5#9>6 zdQ9g@YUk#R-GbgPKjIT z8jMiT&HZW#9d}ud!LO8Gx_~IhUAk3vk^(&`GKD>#2_Lqf6^cA}0wZ{hku>lz5;FTBBgz6)bhmi8 z%mVxoe>6_lpb{OJk{tBDY+u)9`O8INgxrsxL zB}D@R5=iT%xE@a;C_VhQg<|ZGU5ad+z4z;w=ixVSnf+&PZ}lyFw|&RFUfd7e7F4 z>OEGqr;v9oKYj$bWe$jBcQj)i7B?D22*MLRpAtXFu`S0m1eZ5fS;nE!CHBdQV{yNC zm{Ehf+CkA8T{C3|TC8$LxDVdCKgQ?}i~wJwg4;MzT&lc2YK|JWYKFNtZ|g;|8oM}cMmzb1^Tu7A(w3_jdN|JL-OoX)rt=d zRklw`S@Z^vRMFn0_y?iRNIkGFH&=)|^zhj;|5lk_`YCQS(a*sWlsatHQc<^CdbF%I-N{i%$WNL}~M_gTy`x@NFULwHf=1iiU zubpX#6(cuR)T^{!*-HOGsqQkCYj(Xn{EuP8{KN_=G^u{Lh~-S9gH&g9A`1*2ML&O{ zW3r`Q(azF)aii;l(kbs$NINcL!^*cp;ats&q^q|q1_h!4xCWfBhcZtSA#nD;jDd5o zhqx0vj~)P8v*`jo(?TpU#}**WO)=RY^Qa@`TQiH3Vv)#@dXK&jXGtuWkHFqeM?I+F z08B?RJvbfX(Mlgb23?yE*r_&Q9TLuO9Qdbk!{u2?4J6?0TeDfx`~Ekdos^jes1VD8 z>INNCsMf89eGT;y-%}coT`*}8^07-*ub(kLRQa`T+uVaza5A9^e{Xu&F{tpI!G8IL z?~�pn_gGqzSrl#|6xU%9hr7a?0s0Zt`ch)JxiCl6kQYWTEF)f7QNtr?qy*p4`I7k|R(+eU!eGjq_S(({$#Gc&MV@t0`X1}H@wM=f z%KfYAsS2ZS8gLP)xxhVQCkD3G-ML4mw?rReC1o0vKS*TrG*)L%{D`A8!S9ui(Vsa* z@0=?-+p6ZE7^AuoY08;vi^T5El}0;m5VQo|E4(d&K8w4<_8K=b{8pYmX7zhcso>Oa z=7Y-KRKbb2qldJ2w1j#%=T4|m?M#^J^E5sMbA9ua+qIW=m1VO-8b{6D@32lBR}|gc zOK>h_@i(-M>8}%4eAAshBvcZvc!u7;e1j}AK0CU%`i)I}TyH4lpnfsD7)#F?(!TTFw7&JU2BurPi1`qc={p0jLh&zM#Cn^U zhJ9YF{~Ah4tYYly?K@XI^F8TC_r*F-8Lcu&RGVNe^i};B$^4I{G_zm!V}wS_cd?r` z)LqPk`t|v7$UdW4mtP%FO<1`FxdJvnTCZCPU0kN6-M^zYS<qS49UI-Y>| zV=_b~*692PTk0>*aj9DU8kZAOgw>G-(I1N+_e%g12LqmL9zm5pI4S^@pM*WP?@E{X zxf{-^lt;+-wPW5zur$WEEm_B|Qdp?^WbVl1HvRsc5Cw8?MOKMoB>rK$G9pK_tQ?ja zq-X8+<}&k0xX_u;`%RSV#f9dlH@zYMBBF0=0Oy)+D$Gm1?C{~Q60pG!YnTsXS1Gl0 zIg=_!vTaDlx7$6TDZ-dcutb^F^!bpCB*4?O%+e^e3#^qMw>_3Hi1Sx@L_DQsCp_Hp z_H-EOJ@H4uL}=)R&@9&ayI1w|Lw7c7o71NQbYIxKS;TxK`f4u5N}MfKkbmtB?=+Io z{*^;OnPC*v{{x1&=2aIt?(c@OLUB-zLQvUu;e{;dSYssL6dXA5)HTP=`(CMQ&hvho zqkr!MJVX2hkfruq-G?~5-{ffLOiN(wBkP>u70oRf9mHhA;yBsCx^ZMBhnmIc>C5nX zmG8HX#+9#6k#hp?E|Bo><-O~M`82uG?1?x4SEytMi4jul8)a`vyVIItuk3J6{f@eI z0vC9YPt@W~H-Ux&1*ZNI{F%sktc^N$*%iCCO9AoNk@K8f=V-r|?9%+w;}m#Tpf3)A zot3#_FwV&y$XZ#kak~?J3oH6fYtXeTdSzz(YRbmJli{K2WT^gp_8!K2SjO;Tf99>= zZ831(wc!C7&jS(2*u|}mKwddIENyB_Ye5h0OP0nytc(c&y_=Bh3DCbW_`2|Abt-Yp zz3s@N@v{Q^s&+#Y$g093Yk@X6=KTPY({=v^aXKB7pKPj6O_kb;)QJP3TO~2fO4?WC36!E?o2|Uh@2TS<@A}MB5lbggpO_3?3{Qrgl?u|FiV?A8s zKC0TPmvHb)iX4z|+>Oi{yFx}(UHNXQZ_87##Igk5fDNSJ%^5)tdB^Ke^8K#do-tjqv2Yf#wU}U5NNOJo&AkVN+LwK00$1S7c41ezF3 z{RN%p{0U@|leEz2g=8&JlZsg`sKXY6?6?0`l-T$)|sOy z_Q~c|V-k+rJ${>?0Aw`oNVxG<#Lx@(Xq|wXUCoQE^i8xu6Oo-azD`dA+pQ~+39u$p zghUMZ)N*T4gUS|DW>Cau<4-&> z$Z9wpP|q2Wis>y~Of~goy5HXb%z;BA&@{cODT)HKa54#hN^XK1{qzv_(Xm-CJ(6BHypXQ^RlV9oWG>!rCeNV3@E!)%mzG+O+c zVu%Q)dqEGrb= zoH2!hv8j|m)7_yz%myegP{oG1{x_IzWKPbZONGW{ncN_#B4 z_3GA}QrFG3X1&6|k6X9-wS3`eA_-dCq-U`ESSakMp%sXUIenR5cy*2E{lCyW{x38Q zmLb}kk%lpvELYM(ZN?5mktey6MA|xtS+OIN^4%lX4=Z^f78oyFZZ>nK5389I=5_Dm zfA~WP!lBwL9(9XI5>&CRfw^{MO1KeLm%bK?Z}4XjsX!M>7p?8j`*;Wp8g+85z;OaM zaYAs~3k0YHpvsR)w3eTmf$^AbPnhzQrofxSN%?RSBe`AuKyl>0xxCb(r!Z<}OwD=x zZ&KrIl)LnTX!>a2kp@57!ld?OP5L&<1*<@Qx{v7*;Q{r&rtDpQEEE)JXUj7fU(CP~ z^N_mik9ayU<+p$TjnTy^?v&B06sd4?X5olh<1Em-dgZTmJXer!?B#FaM{SQU6g3cSDsf0khKwrl$=)`>mDZ_=B$Z$f;A{ed`{8b2~geRNFx z&rjY4mWAYrxOGL|jv1hwNdxT52`!h{sb6+&629AuLkm z(`s%j==zZcuHxtl{KX#a+JaH(2GAD-_d#Uh6_9Ds&DqYs1Y%h4{LZPQKuNBjWZoEoN9PdFpkghZJelft8wYwK_Z?Q^X+1IE8wt5|j+5!x>!RMx~2pF)rp1b-( zEQi?}b2nq+;fr;f1%bVhETcZWMF2#uOunGk|G25^JEh>vE48$K?a061K^p`0BEZga zq^Lu{StE?jxgKr74GP|6xsJ@2SF~hAppAMHzW-`SmTPLj=Z`jdyWyIMUWpwN9mIG{ zXWb>HAH*gm4#D<^kX^ar@FXahNBBNP?RPgjr6U=JDAmoNud%72`ZII%DQC?aS8?|y z$NHg*)r-(OZntqwh1D|$AZiT7VQJF!Nz|ss@&uWY`3`B?CP~8Fk<-+UU^`R@Q9?4lyV#K(B%$0Nbh;)j z$9PUVIwbDl+FnoAxy~n?qkm}Z9ey-2 zqh)$Ny#}0(uWGW+8;XMbS{~W4E`-0LjyEA8i$9@tlKcvCxJ9=jx%%=@rtkoFlj7lG z)3m!?mMW(NFZ0_ko5T3Wp}8cAN!z~Y;YeOFC(qc^`-2PJY7ooQ%N6~iu2A&AkNhvp ztN459LE>=olQ1N<{H2QdJ#2%kR`ybIr$ubcH}FOTX@3RX7f?uTp76G|2H^ROD2gjb zR55~)ZdS{j>%cgXjG_~&}sKI#vMLd`SUdfGG1tey$4!>1}~;h;=OsZFDH8QyW?7p zn~u=_OiFlvMa~uxJko*23Z~^It4y6mZ=FNlT4h8=X^`3JewlAvi-$$gT@T$Cw0wS- z7LROOUn$<|Vp})sx8zBYT$^;)<}?Q0(-Za3fIOe2XReOiXe~p>t$O~K3GW&jo@HbB zeIj_YO>`8U+sV1{YEbIUS_92>>kCne`m$e%7fXMKjhba#QmxEC0~;XMH0)OCJs&mD zVkH1$lpqMm7!~}-*fd5C8kj+^MTn#ITFZN#&sScB)M+9jPimK!ov6cXX%(z(sE;?Z zh=0~5gwY}{Rm6?2Os^A16oM!v{AC(Ew23IdqGh6#T+p(9bl4ELg4aD!2M&~*i* zNiBN7deP%hVt3Kz1rwT-UfOj~AW>%4toh9f6;BLvWxfr4kWM^6Qk~%qc)W&PDcWH7 zq2+?3@x=C*7v$O_ZFo(@geUZ8xx966{zzaCg))6<19-ZSFVUHs!M-_lYsHo10juZ* zE%!-pZ_SRVkW)asm8IA3yAC97t8X1WWTcY_pG*;Ku#*Tr4Ccx@##Ya!kScbo5Zq?W zE#)1#>OOEeM>2#r)lP>7KpT2foUuqP$TD{&mrkW}=~`kXY%VAuUrUgPdXIwsghbdo zI_R{$NYwH(bK>y!vV_xA`S^t;+`-of83mm2hoGeJMe)Mt@kh!_^@Ip>n_t;+CbVOE zY1c@rG5tpYv)OkMdamRD{mpB6z@kC?cwiML1}`H}c3ZkvM!|yTR)7`Xo7|&PT$uqv5HzK`;7I zXDqIUxx5OroO+SFUO2;DH^_?*qjnfl;kprllq;A{_zi{0P=|M>r^)DViA>hu{At|h z-$`$k@1tjldK*T7jWyj}U!I9X^p5OiJzDRp?JBX7t}qj*q1!_A`q8+Gel|t#uL>O2 zW0qb`nLp~B4y3~r-+n%BeA$nx-H6_2WSAR5&SMC9D~TkZa5jn^S!B<-hH6L69 zdXG$Yp?hTp{lo_t5$P$0R8(O|t!Ch}zf%?r+IGW@j128ky2@16iEF7IsUCn&!lfT! z#-)0Q860-LI8Ek{IB2?UzelJ)nl`ADzx5t^>NT_uzIEl2-rmfn$-K9^P+dk#OnZ_~ zx_)UlIDK{p<`56(mr^miRq!)&ln&D!6h-PJe}lq?hR*K8K!rF)Yy;K;wjBP8fn_(k zlCdY*Mf?)jt!=wE(PP|Sn*na2WL10q^no(mH{zc$R^Np27TtceRSjtRx%v#uDXycb zW@M|PChpn)eoJ>tt-OFDe(`JjP)-tLrWwG ztB*d8c8b}K3fIo@V3#&!V> zx4G{&d^UA5Y0g7e%&#{Tjm1DD*Wg*Cx1x>g_@6uS+*Q4aih<>T$iF7mNVFmzUrHs9u@k)G$}ZyXoy zt|);+i$-5R1EQqtESl)&@@y82raIp=k<&awiHBd?f9FDB<7UB}@xLFQ*?qcPrOT6& zS%#_%S9@DE={6A?I7Y<$VdBtDp5LfMAVcfcpg}s#EtJII8`27x%17jL1Rm2#evHan zesjM48av~$p&FPM1yk&I&iQOgVe5+CgLIK(8dVsHN}^?Wk=T3n6;l)3a(}W+sr_2X zdI0dI*O=nqc$?T`6eK{S-Il}C;=6OZ3jRz{`9%b!>C~9vA+-$-xD2k>aOeW zPrAb&On{7sgpK0bfcXpASz<2rs6xHBT9u*j;z-D@qWU(KtN39-X60R!?GX5hYVXbV z)m4J*Pn_lbPv6aCvH!l;mB?m;?|!2gRZG$zye}|y=E2!p+TY(=Fegh<@;kUlAnSMX z)F$M9nha2~5@V+~vWL%Etr~#x1Yi$-7YMsiG*)>u&#!28 zBwHhN{Pay~0%u+Ka@KW4yuy2z?%Eo5+8M^9^ag__QLbPSZay{0&5u?fI>LF{-gG%y zge@M}Zl=rRn&FappVMPDbVaY_rc2Mrd2EEUpE6RF8pwX3bM|@bDb=O0g^d%CI`LJ=vdUC}OU^-BQ87sWKiE%-2v z)cDT3GKf?(67tV%XTNF6fu%LN6dk3?E!~mJz%2HF_#6`CW>=t~3&el^CakC7LVRz2 zHO#7+M_`amAa_VpBe^mCd{Mew3rA&R?jt7r9?7(Ylq$v$@rRAA@zT4wAJ1p&o7Pir zTK!=qtO4rt7&uzWF7ySWqp$w4sk0+JO{{apY-t065}%8PlIaioWK0-`y!#vZdy+dA zfIB&j3qc(@k6B{zyDcIwY7~LVV0Vuu;GZLJ>K51i?D8JLH+=i5rYBPs#v70rawAZW zPD~F?DkAJDC>sY2SDWN7=n9f(N7Ie>6;A?bT0YcqVwKL~tDG((X#2GzzalA;m5|zH z#v%$}q3NZCGK5ug_FK$cT*XC5!X)piNdtz~_`N@R^%U;CAot)azFebR1 z8&e2G3E7({hZha=D|j-=1!PdUK$FrdjEyx_*n_zTq^QkjZBs1V2>PYYoaL6+rcC4v z@zMY(riSW;ddqk{?Z@bA`Y~9yO`KS(V$U_yMb>?Du6AaK zqB@Pma8qL$1(X#qaw628tK*M1GqFJl89G;u5VPEqs+vPU;lJ?DRrZ&1ytDK9rsUU* zC%D{7PZE}~xf4=P&v!(B`sHKnprv?g#dM;j$iiOc3`iwK$osDH%)o)FY0tQqI_fsJ zYj|w_9X_&T=Qs$j~FD zS~q0QRo=@6^igyS9@QOk!o9b~Uw#dP_3f#X5P0d{Hk~bR053V?^hX+qPAkN`=B252 zRg)Rbf^8pH+QyLOr<%`5jk&7&>GWM>Awr6}oE9@xUjr3a)FS9!p^Bl+57H-SaITw+ zce~8`!aJ%CM`DGIYTG!hFGcH$cB@CUMS8y!rMTPm$s|Q1^>P~bG0AY4boT1#E7EW6 zP+GTpI@hXfaj}j2!Ff`GyCTSXLEdkxAfYPx6W%sQMENtTHr2ZmO7+};r-xtE1)!Sj zr~=|z?>>nfKuX^a{qicZ`5)N?uolzAYp5`<_)&Va|0kh_A&~y}iLgS*C%@1LP-?TQ zlI`6{a!3SRUw7IM$me5VySb#jys+p@#Bq}=ylGPucJGcU_XXUHSF5@K<>qB$%SjC< zrs3AS6!`X3B$hKrY?R10m0{Q&Mnr+F=D}ol8sR!0COAVleHq$2X&R=d%H0}6-#_%S zEP33;eT#JWg{bk#=+gJwU#HxhewibA*xgnf!I8f{_l>^| zS#+-FpZ@x_s~~9kap&1n%8E@=uX;W187U27KDY%_()2VoX5WZg%C}6iUJ6LzfSW*! zE2%*?$_VaA$*yP8eX{Ii`k{BVidtlw$*-Dse4LA@va9jp$EW`vXt5(S5_n(;>^%2a zE>z`8>e_=Rhe5Z4Z@kR7@N`jAYiQ}hU+?26@7gUwzY^p=aW{P3)*u1NpRY)FFji&R z>!pKN1a)oG17sNMDGm}v??G%z5oBJzc8V)D^rW2%ba9EfoAGX|zK>vC}4h$cP$R?*XWRYV6hO4Yhp?vhnI#w>)+h1jd*SW?0qb3 zpYswPF!*~2T%l4q@Ljnw(f;LFXZ(1*zU++&ldtF-Gksu}>CO@S;=mQvMusnImA18~ zZ`UJ=v-0M}Dd~=zcDoBCBL)-D44ifdOkN<>VbxXa2)tW4UxSvf(W2UvtZPW_s(WQd4%k_e!wjog60Gv~D`4u>o&9IkDbk2XP8j zF@GZ^Zmz5czr68e^sI5zy)eqt!B0`|Dp;;{v`>eb8FjhdlN0%|n}Iln-+@vBFq6;= zy!~0TrHTp3*KvF0`#o2S8iw-QjsKast7+j3iP1!)qz;0My+Ic)g9GoczjLb?Thj=5 zj$kTGE8FoRaDUu(zJT?V_Cq&KI<~)z;tJ_)_CKt1SluV85?6qXa&su{E5T#5ea82X zJld;1oNDV#_~(R592TmVc69FVC+4^n(DfKUr`YiB_e8Q60zQj5)o-aKt(`B zKt)AbqN4O(1QJ3-1VlhYlukgACM6;uH3_{4B-GFoYC;c?MhFQz_p{%3UwdEsT<4sx z>&yDBF~^*1&N2RT3`X;fLng@^$&8@Y@!*YLO*0+ZwMX>0x$3|^ z7qH8er<$7tbp7^B@~C`m1cJiT%F0IenU3%J6QSBjfBTE&b5``Pc*OV5sl-mliM}5z z7R-abN@!}?%p2BwfV57+m=W0?79_|DUP02IuT%xBoces>;ovhObOk%8paSQvFX_GD zh1Lr#{WFWUUNt0*^@p#7vaA_fgV5i()k}N^zXyolnmt=9vktOyBY@8YTkEy&3*znE zIHyITyg3hO4iZ_?pEU!xaBjE(mTYZTF$)y0=0zIHQ}f%`k9zW79QA$AfE&aP>})`& z*>~s#g;Ni`X&wOm!={xosJ&q8?+Tv3%t%NlPyD*i>Y5Rtn+cmX{B7xknU0w3;mb1nDynhtLx+kQp5FPUO z_KbLhAd%@>!JCUV*&NC=9sc zPGE!h&Df6x{Zz2fZ1*x}?>%I-~o!A|r6LD|*cZ%_pAJ zEkv4%&Bpe|Wk{zyYl(`xqv|EfHYA|!lW&_kT zP*?U|vFWpgzEo9B-USKdlK|VO=EX7qX2<13I>gV3Fqo3to|tGvhA~<)px@R!UK7_Z zZKA=dp=-1B_WIx_4)0FFuJjRIUvLvQIB5|N_V{SQmZ(p%BE;df5-P`j{dNe)b%jbUrqCOL#FR`XP8xKT=&$d z?d^put@JVz{YeR%t2>I!I%{3?Wt+$=q34c4Z4Z|;7N*v(&dKsRe_p#k-P1i*F7Nq- zbNjd?_>I+znfv2L>)F{Df@V-k*W;7t;-U^#7Ph#?496Tth35-igKt1MY;f~8ddVMWNMKir?SRqR_KY;id zlP(!a`_V#t^O`f}xH+YIzE!Jb^2vHqRn)@x*2Ym9*?N^N8)aGuA{vA)3;~QOGk(e3 z=89ZUTH(pa_FVLU{>*z1Q*%P?g%*d%w~rwiAy+;aF;4C5lMX3Q+m$You6@(;s-F{g z*f_o}$irGU<2-9}=|$kabKYKU>PnrY05y-fuRn5&zo!h}muz}pTe+e8@VC2;-{cyt zm)pKDqA@2k!&SVC@n+@MwhSS?6}`n$|!E=H=baW$G9_;wi( z=3v?xIQR^bBJ8AAs`PG|3rmp&lQG8_g70zN`ZIeyKJxB+Yzg;;Zb8EK(ic!H206&> zBZ>}2i83o#@o9Ax@%%dH88OcNbaH zBrOm4ey14qMv;Yq6sDKbMIFRZ%ChLf#VS!vhpiFN2PJNA?Re|i#MX^Si>(Rsr!B}U z=CQ-ZjJI^YX4d7E^jAF6i1b!BO@2vZOEKsx4bO?-PGc8L5R?{#R45`|XyjEqSz+`^&FHDe=32F^Pq1^WU)v;j{0!3blh)!l zec1J-(d!DbiSjNl=9~+jIQ;OCK#@N=|7Z;p&2R7Y$~P%AWZZAVgOO=(^nd;aK6$$!f;!9R=zd zEBD}_++k}2=Qbs=>E;x{d0I863HBqNN|9z7v$}u! z)5gWIYh7RUQ8b_1l27{f?#uWP4DJ8P8RG|Cp;ODcg2E?XvgEPR*eb?oP0;*s_}aIJ z7H@b9+;c}vd$)tuHys(-o=%H?@}uV%a|1aWmxk*g*_C1a&dPtN0X;$G4_`uwrrTyh zX%B^;s&}4FK^zyMlzxxW;tUz8;;pJ=G?~!QCbLwqf9wMtYDG}&R9a&XNRWK>^}x05 zj}+PZw@t{BQ!mR+@ANqIa2AmfN8DYkIo0?V??rwBPkm@E1eYdefBVWCZ+e665pVS; zCcj3ENKtqJ%xcMK;{j^0MD4yjlVq&>0koga$8_r?bXu**ves!eg9d%j=3M1iQaLVF zTTbEE;oTdLd;!j^xA8oWV(+_Jf7U}9>IMP>IwdI&yq+r^v>UWu+*{Ig*8e>j@qNgK zNs35XtOY;f9Kim;k8JqaandKb+$u78rMWbyE@F#J-6d1+4q->4)XqF(043 z|H8WxKem?mTwG2>LwSF{N>?gR)KvV>QHu@P`=a~wR@9P0|IgNcIDqczRJ#u1(J`K|Fg72s@AXs*Rti&Le=rN$y-UGalIv-&$2!hIN4DBa+WJ@(3xe=<@1hE8tL zu#n)V)5tqc+LV+8f~rLe(Wg0-G3S_cdF$YRU9NWZLZXNE1Fxe>SZhF0#W&cCsEP=k zPIchewa}DGukv*^;w5;b`qp5m_K))Nw3rMRmUkrDwl;6N+rfie34g{lN&dx&k|~{) zbui3tYo3j@% z+h(<#4$$kjIt?8n=~02hpg(gt7CTYbdAmH}jwd)*H1^=AVlKpueuKYr7m`7Fidx@J zo)#59d$620Js|JaWG=o^sS}pvL@D!^I1xAGqE9GGe7ai;v^h{Il!krM>r6=vwmm$M zo9A@k#RCi7Gk1L02*6_(#L3!w_9xtpc^q_vp91rzgXw6{o=*i87n7=Uq8&8>}hSGGEgS!iY*hc2xr^3H4 zM)@>%m#P=1F~}QT=F+iUmmc`ONQqt>_Gj8m)LVMN;c7%g^efvj)CL5MRoMstxK2}d z?9Q@OO55p;`z-!wv@C+y@;OT?deK-eF0jy;*Fy&G^OXiw%>KT*mw2J5N97! z*v*9`MmHfOgIaQ`n%A7#UlgnU9#%b(96V%1*ZNF|FwZ0kYlxL3xG-^}7s`4j25)BR zHa+vJZ!EoDvt9c|D!rvhMEntu<8~m!*lYSmv7pYW5@qcf5t~CQZl82_)l{E-l+OEX zbF&qrjWZp0*9E0A`A^o7t6&QA+^gsc+nW+ zF8@}cegQP-v12=aV{7SO@e^@DBSdxo54LB{HLNrHC`CQD5O|7V;Fi|UCMZUquQm7K z>vG?JZW5l2hUFP!b%Bd_WsdtZJx%$QmtQ{N&779iIo6ou_H)$X{NVdoo#~Ez#6aCC zu}3ClKE#EieJ{(yeNSkvYWMoM;p=acx$;k~P9`WXYZ!vdyM7J>eTZ^^tS2G$X0ndF zZo5mVyRI636A(P;8_rL?h&MVuSor9m-lIlodMysOR`7kpp&T09-lNkVhNUc-c^xIK z7ey+U`1|=97n;8RCmgB+El}Aw{ELPSKQ+X!S6b7}K2+XgrCV9GH97Psh}&l7`rveW ztValkQF_tH^m_}>y};8j6!ytt>53w@dScQtbDUU^w)d+0!J+Gi3Mx4O2i}8Hrr-9o z9k|eEU&W$=D(8%ep2jU^MvfjF7C|J3YRM-s*h}f9=Uwb} zG>PWr`i8Y;C(rjQB$oK1iqO)%igdw1}OuIdGv1`352_zVm8m+5r^M0W6RMM^a4yVQjE z1ipQQm-$RtZ><1Hk9a9@Z&DXS)3JqxSdipYM$tk5thPrdaeVR6`4n z16?jff-b+=(^~2b@dxYn-S!)aiSb{|Z#GnKpLdh^xDJ!k^r40);rApl>2b9sBJ==eMp7E$W+RpeNJp?*-!3 zwUwVNPJeYkTYVA`BuUOuk@}YC(O8@;{Z33JZVI7{wY-!GNCbYORqn9n=0&!z@H^OgG)^7Rwy7w+R*ELQY?l`s zhvu0=n^)p$)OG2xCU)X;(*>L{3r3x#;Y-h%KJh=A%mxny`4X+hfl{rMv$=+&kv^-V za*mrJ1$$v7HmAcT>qnrecRdDYJR{{WSKc69_-6`OHjUc7+@<-F=?KgH)-^oB-dF0~ zJ5!IkNp?Z39n9?7wM{;0tht^}Kt`4);ygSkVC~^LbEzBkN8{I1e+Sk7^_V1yU&hB- z2MES%A8*&L&NO9!6iR+kraK-ok0$R+0BWI{ugC{w>5F3o*rx5x?V#~Xu-)5B8vJ#a*cldQ)4LZ z!M3<=ZMgiy0a3@#Dlz`jxNBPd-fxTIHgDWNM^)VzGS+A`D0KVnL}d|I{Hk=w?3E8m=)eq zzUsM9drdNn{(bhd2ZSt|M1i>M;r=(eJ7dh~|2I1AQk_`Rf6xyL(a&gAfAD_a9u;J_ zlB&i2{76OiuuJb%sL%duFV*{Ma~%CP6>-X*pMJfkI``#u6b~HIP;eJv7qRZy0v9}s zTS&?D+k)Zm6++M3PLV2%`PcDAbKc>=>rFEzr!9>IO?PK*?#d+;NU3ZpTPbr%)3$H8 zoBDvgHMHeXbIGWx$YH=~g3fIn>;5)5r^M@TPU-LHbaz$DE1D zgCDDBDu8JrHv^U(HcZ-N)N*HxjBGIyVlILJ>k517^M_F>i6j!!ree=na%be9gV%0V z`;8`!@y`HiARQCbhZ(8b)!jmE4f7g+421W=V(L!?sntnF=WN~&idpG?mJ3Wb=x#{# z?>&2_-=M3prtS=4W*wsH(h`@Y`nK!M5sa~~pVvyx!odXORkLyd{IWg>(KFloGkvjO z@+Sm5pZtIy;jvivR>RU{U%6G-`mCGadMC(Rv9Y5FQ=XKVnzn9Eq594N5 zz=6DlK%e~aM}+ulTF#)>FBe3lq*(0gfCwt!$-M6Sti{@!n?06?T$Y8hn-IFpWWC!M zV~2x*e{WWS4WVsllf9nGA&YM-1P@u^PQ<-?Vyys&omGUlGw5-si@D2zll3W( z$GW)rG$_0GrJ7U4eQc7vUvPL`Xt~B@BLhIj^HzWy54O zx*9^eDYw$tk#ZJhgTCe!v=N)qstpTQpiU}mltpFe!U{k0!ob^>xf*d`1h=6=lLdMM zP0L`=*CB{Dm`pl2j7z*7wzeH?Y0UQ!aC*@!KAwASzy+U?0rulgRo2a|>cA!%w7AK} zpy{Lt6mGXJRIdOWzqYE|u!y~^b%kI|JX$cS_qTw;YjPmXbRJWq(A{Qj!^INedZ@P6 zEZ#HkezAfmg{Xs zz5YTnr}W0w?T9|p7liVa*9}D?@9;21b?T?0(f^EM6sxAH9}XuRh{%A_+=Msb$y1WJ zYpWpi<7&VZTfBltUBOJG69jdf1A)`FUD)h&?MBs7l6h>8>&_q0kj0&5#gDMxMpWO{ zXOVVATXhCC9e$6USbD|RfD1-%$9_SolH-%o#`KS}>qEiAxt1y<5{ zs<%gED&D)$e_!I@v#*`J;Y|MIGvV~HpcYm4TK3r7bdWvMnpmDCq6M{7#<8j7VJZmUB9hm;>}D z6G>cwt$HlyKE*!`3k=v;21+aOJVKZC{{tjR>ZMZ+6FYkDgi}_NQ(LNBF`{_;f0pdo zwu#I8ng@mULr_cOT1H$USFz{%RPrt>d9flAa~YzCV3v%Nn)UKD2N7VdUe&LHYyp>cVtyKE1C#b}bfwQLDkwbG6i-tV zOP2tbYDv}{mU zH6r-|(qTyBqmf7{DAl6hPN#r~ww)N&_qd!;T@fe^;^bo$NG7dU@ii$}ZW#3{ED|Ad z2O3_^+1dksI?pxEm_ zt%TcA4EC|?(*9k&nPF?HF~}V2R79`Tim|fkGF$x?plc}Alt-VR_N$E&^e_tV46DPA zzvJa!M3s+>I3CCfUiRK|r2lo_80!qL&fqlO2yQ5);Shc?eTWoli6V&+U6l=R+#V73 zx{MqAKEud0CTTNmd4M6$!f}4NY}tf@@imFu0snC1bik1bsBnq81!*b$m9fC3Alej! zZ8b~cY;HTN{e!A-G>?^dhH?JOAv-P_=>9t@5skgHN3#!ZQOrsJwTCBxL~4gjP}FSk zZ8>-9U|3~2Y2F{xuw-$mM~%DQXC&bjU=hqoJ4hI*4z0aR8(WL;-E=*k#BxBcE=3r} zc?A2u!3LS7D)etjTA#`x6Gh7*dI*C0&tWy$!HLu5WY(3eO@e0Upr4Kvei69%5+3bP zFI;eZ)cMCc3H#O66aD&aJf-@}=zBjVFay81q zR>v5dUe0=92%kxY38z_luuspDm4xR1Gf*px&npKT9PMcrRX_JTdcCfbyO@CztR%`Q zBCTPIyEpY%!Ix@0bn$Ca6N-~jR>9ZTuCM(CbduYH145`G1vbIv=ibo1DSK~K$AjL+ zxGfXDUF#EJT23|9E_~l!sXu-&=0Zbmk8CftmbT&aqXrmPanxgQ_@&J)VD7kuk)73MvlxXN)CC zCRaWvC_4UJqfbd{sz^Kxs@5y)sFVX=i~lv#{q=sTCYuK*||RX@uJ%1yi|qcuUYD%bbT92P~m} zJv;G~pR^2NIU~putwjyNmUfkTd?{uGSw%Dm^mJG7)49N1MPH&6r9LmvW27X#ap3i} zW>^+7@5p`v20g!TQ$ZTRq3NFdd7&X~_{Hu12aRGUfzJaZga>f=ML)x}K8VF-f{{er zECcnkuT@&mC{}c`{phZAGB;*~0n#%gSfsO1+)G2$20GZPo{{0Ru6MUc2mehxma;<` zB-Fk61xr<+5Klj%3>fs13OxZW0{RoSUAmqB2Z1X)j#>AOl?n|}1*cl4HG|Da!w<)$ ztTD!?+xy&NuW1(6?c-jlc;S4=q8j5vtczccClz7O+O zzEhVayor;RY6RiClQ+NXY~?=Hlz$?TmNa#XKWAc^F;GWtZIPI_@hB=!Bjda$mkdx> z+m%!jD_z!Y8++_F45ZPGLYcRMar%QTU*gfFpdA@LNI`lQ$tqTcvODl!_rFP$g=o24 z-SPN9?qP%?yP0z>IHioZ5=IWTHd{GBKYjp@FV))~uCpThvmb3#cRe4DH=ZV#R|FuE z=mJs>3>ernZ*fDyJ_EiP<3Z@kLI-PjARj0Q%rDAIbZ{U~{CX&8GQ?S32^jwl_NMj;)T|R8a8G z)zTNjH+}6mxA~LFs#?~8DBET%Y5BvuvY<|||c6lN=IALp| zI`)TO#wVTx9Gy=NrNe!{Y62vbYClZi>eihFEd{KnoO`|(PhQJPD%bHO*+zwos7JiZY8hPBJ(??%>R3`JWZsa9`;_;ce=@Pd@)_P(uL z^m^BJuC|E4I(+MA5CjsKSNW?NJv6jG0#GNEG0_DJW=i?F4{E~2q%?XpIEos3FmF?A z#!$a*c2u*hIo*%+F>_aok{clv()&BzlxX$nt2MtC;+IC$QcL{t7f$gH|_$6nYIORiY+*z=abYdv^4U zZhunjQrN{@+tZz=3U*wH=VnFRH-@c;uLESJ)+1E`-r%dL;s?&UOAz3m1y0)`z*y{v zeqx&V;zu!l_vf6K3uB!f_A_CPaSo5nwtkt_Sxv0wQlQMI@L@As(Q;`TFCezt$x0>v zC8Q^*BJs%gz-)&nyX0CY9_W*!>;dfx&{_L46kTtPd^ZIm!|}p5y7xstLXO;j(|-#j zJ{a|F)qMd6-jF-x1|>{&h~!d33RGLc(j}jJc9CRb|H{dt zk*rkX*jKS*x=EE<$b_^e=MmIIvmJ)reTKF(uI&nXK_m<{so$CfHSch_H+Fke{(MKJ zm-iY!Fbp4P4wMn-o8NNg2HWqb+gfr3cya-H8;20tgLN&Edd{MTDUdhM=I=Q*EuZq| z)V~Ej;1|WwDC!RrspO#rjFAO4bMD!tTKF|934NH7u* z3L`tuBU!@K``0RLJ_PrT@{xvT{|&Y`n>oVEbUU_m_+&~Sq955;142%&U$K{bBKtFu zdanPKW1v8!H?TQ65B!J`ro^*CuES@yw?3=GWPzq8gzd))$H#)6^M2yDqfnf2%=WCF zZtEj9WqVYZ_3%e=&t%lgt;&U5p`PCq;@omZKXLGdXdu0S&t*!tm#qdyt z=irI{m@|dC^ySB<>741=_*juMLGX*~b8JI20$EG`8cG&o9(2nT zX;xQ>kuM=VqOYqc7QbiU#Nz@B&A~I+sLYr+b+F4t^|JzN)>dh|6_3Q$ZN`G>v^=QA z)l_4#dt>rxtcfRmf?Z&=X5815sHRL17$9&q@)%d}4qGGFj%)bWdQHzv;me6AN+Iu_ zr5vi?=LD#od@61b`zLm+>w%b=aJW%EGaeLeK<>c`D6z@8&U}<9)_f8h^+~2E!YDN{ zSi`Vugoxkr7s3h{DB=wxY$9)+xYvbKo>jf9vURs9a-mJ*V`~k$WxhiMHCM1!Ouq*& zUafR|W@lh+4gTZEAU>8m#Tjej1eGi&Li`$&zs&Hs6l_k${ey62wRI^h?Zcgl%y%5L z69w#B7z6r&F&O#-3aH^8LZ9RbuQ~5)IGm0MMa0J0dHB>94#dDj*wLd=H{@D7vc-Y~ ze})PpDoalO6|FkYO^r_3ufjhT#9M{|sOMt%8BkQO45bsbAhpqq>IWzRh)~i|eyAV1 zEx0?!a8TMN*io>MhyiK#2HtK&h`#bApz=%LB8!K|kFLEO)*f)3{$g^n&e$??tBEri(EQC&YDGr5*|BxNX*^<076!gPgGqhw|Qxw8Irc7@q3hc6Xbf=S=F z`-vNmeo((wH**_(MbhjD565M99)v{M498fWv%19^+4aKu7M7{@$MtQkNbznka#C0D z{F^LcMCa1hfd_gz#VNQkgkJJ_{D)<&1unxE)-b?}e|42-X~^L{#9B!rw&g@o_Uv+td99AZI9PjuB|JgH}mA{88LWN9nUt zjmqM!DD`g#9{um|FSo=a78!@F)Y8iXtpX_hOv|;r%Ebw696}EeeAF7KyyFh`p}$t> zWmpuyH7iDle-PX}86{N({tj-N3k(~yKb`}GhD@;Qp7z*2_=r8UxZbT1xdZ&_%t27( zo}-QVIo+}lOKR~q?TzI$gCpS5&f5Ah$a-;ug%`FCgbXuu{7opTSKpQhTd@66w%PF+p1tDz z;U{O)El@CSPRLV-R!qWPcE-%8^AakH^ra>`tgb_YL`Gq0XBFIW&;0gCo)7vQq+;FI zupQXSFi`$M-}dA4P}9h{8OpZtW&F~3Ns5Xt;!XU(<)Wo*El(Pzm~d#w;3rULC3Tx@ zhb?G@L2TxV_x{WTn08Ly$)YlZRmX-AIZXGhaVhTcl(YKYBOK=rV=wZf;lG zH5*L}4LG}lOFpBwYIDlTHeygjO&sMAbWCl`<}#!?zd3p|UWX_%WyLo2Tkw>vYuu!| zAFQ%j_gwtV$pj!1wsiu3k}bshO#s0_<`N~z@4La`KfAsT9eV&q##~B0;qgXEX1ihX zntn>DIvBfC=<5Z2c7x3E2+3&Hghh$pr1EvQ@69F2ixD)uc5k`djWf@tZmk&qAJ7FT zpoeMu??2E}mv#D|8g*02ysX?4O@qyxk8G1W;}guZo?~BlqGMkoO^~Y-bNLErX|HLj z?l#HM=7lr;Hs#FVUU&CL_{B*P(t>BO^4GdeUs$;&`l3r#X|%p3^UEarfH!ngvdemX zFSB2ImI7IHo48osRCrfN8?|VHq}4o`zQ^6{2Ea1+SKV?b2qmt|+_!%u9wBVIWJK>8 zPU*ztph>G;kr!!{I5PE9qZerN_UD=`n}`59{FUL+ew?u0in%5vG3}^wA|bx)KJpjt zz0C4*GW)&T@*jPm>Vk+~it`v2AYV29hCY^B0NzM1Fkc*7l|B7t`*-kz%NdCm8m4aw zilJD~Ol9|={k&$qi(8}k^gpIk=V1R9xoD5w(760&yS&M44WG0zn~^5g58AEEq@C-n zDq$`tCfHqJ`EB!6CvL)K=T7|IlZTamnK`gv>hn`%P*)`|B;Mk%>zCXot)R2iTcnTF zsQ_W)%mc2|Gs;z@d9_Nl>me1D1~=itCLfaRHG(du#dpgtrZcWj_u0JWU-;H3^I2m# zq)HIJbmWWmOYTyN!XV$T<8if% z6#0PSWfujC`rV1&ixx6+oEtr5!`6HKhRN$qdGUz>x>+^*LLLvXEA~hMFkq`gfo>nM z{z1RGvPq3($_5uay&MKoA_lXB1)Vqp87OMM3kAV`nAkbaH}Ey{K5b@Ojh(6rQ39pQ z$xM`MC{F)*UnqNv*EAz)3cd5|OwJR|G8cvRCk!y=Lyi9>upD00X-`#mIM6ae?q3xm z05^oceayknR`&E`uDC=F`YAGte|!IF@_NP+7h}29m`p{Op|ysX=K{yY?vqaM?0SBW zwdrsQ7LUUn3g7Qt9B~tQ{MKH-`R&;NX@g*-j1Bg^oUupdX~$r`*>>w7`5KRf-=vrx z6KA@H-$Xv=E>Hc8gq(xzbs*H&@!clhS4FXtMP5L(pC5N33`5yB*0@!_TQ8o6FYleS z-KNUt`i$eKP0R7$L&V62pp7t(10(F5*Jd+?Oz|1{K66ju{ZH(q#m>P&MQpLqeDyxV zrDxq;eU^uFTXpH#XG=B>1LKa|uARjTb1|Gnz6@nN12Q$I^G*axJNa@9{_6iQR>dX* z4@sXzvvpKja|bhdnPNu*qO4E5E2*bl? zpaL2%m2laCo>y%omBHm@{qcC~RAU&x8?L*Z>VSUw*2op0F}YRLPTaAlEMY`G=?o0J z=9^(rlUqSh@v44iww zup7u-h(wI5VTtV9U|qi+VDwk`bb6z|TNgn?Y^4VM^ab#R^Xuh%Ck4#tXZ@3yNuJJR z&;(}(cA|1Zxu9p^IkAegK+kiZwvMmuT*2Niow4dD)h&#LuN`OYR2`%jqaF*R@<{&C zZWvPqG<$o0~P%K^|9|T)HsN5xc%1m_J;&&X4%r#9UZk z5!rl{ z*?P01d3pV}#UW~#WtKK)Yf!+crh8FnI174UMhH?RXf`e?N?5w3C0)!%YJ5oN#Jm5C zZt_#V(&o;l$yeYz5(=h+Yc3PQ#GS*zcR8=?y?P_0O{LTUV-BKm(54x`;jMO{V3|vs zK|A<=63F{{5I(}wDb&xjF}Yi%e(KHdR|ljA+7T(WWFJUME9y)3qn`fD44`9~7y4%gdH;pC+GPYng zlqkmuiw0fYrC0X=V#GqhCh+)|Zm12u-$W_x@9&}yq?W@OC_Dz%Fh%o_1PQ*O1(@xO zSlEv3h3!qylr|n4bs%-`qQ+aZqo)4Xh+WKt@0v#85=hv2t(3+*7unqX%~AKM$21*A zv}z~s|9bJd_lvF6dhpfe5ozT_mwb_MC5q4oqvg&~wz^JH#%x2a{jVV^Dnjay4eOIy z`FA8y79D<^guPbIDpYlBUoKv%Z z&}gtiVdT31ZvWVs*v9Oo$#?z;eedaK7imcd(9|uJEC@}e-j?cJuko5eW?Oq^m`_x1 zY?*639<2f+5On>8TN2rvn`41ni=Uq!JjpM70}f8aK-4Bmv+3+gwb4|al#{~RNrCjK zrTnmsadiK}z@hQMbPqyO*dyInS5@I>C&`HjM@y;(@}fETJCfEq_iQEV>TNIBnhuK=sclK+!&f3dAeE*EF9Q4aKD|ZB_2J7*1V=7EH#!A z^R49UN*Wo;u6wOux{HS#)6sM3b}uT2unAEkyvxU~ZcvwWg8l9kwyskR=)j7KdEciwGqxcK-kxhKsR7xz*&NZL+8zF42PDH4lLNA!gZxNrIJ2b z3iq*Bp3x9j#vsAgm|OR7nsG90VWA$RnWww^?ZtIVP!K}cmyF-4Fxc|eAN#C`yy<~1 zt!rD3v^&i%(97Mdj-qVw&j%;3Ev~H7V@8E5%{H#~>lWth)?z!33gLf1)oXNQ=;Wqk z>|}&~JB+&A7V~o2O;yKDqx)$YaK(|IKN}U;oZW$!aBOwAMA?G3kKRPr zarDT+tH+kZEEWr|!kirahMC`dZ%&9Bq2;H&bOxUVs3&JC>7| z+2_AZ58u6ht5u;|Er`GKYOGG>GXuX{KBJBNA1Wz#-Q7>id2CN=dF+ZYSUkH@neroU z@YU#nY^k?4f!@)Gd%tEQ4Iw(~{ayQD2X0~z3A*fo2a8U-L-85LmlLh@II2;GN00wN zO=laJ4`tQULAj?w<(p6oHy?3wcC6aGrDW99`I551^;5&C(9W9gOJ2{ z07XF;``UxXE~#3>Y;J*34u{jvCseEJccL#0%dZ_|OQtcp9Rst574G+c(tDy|Xx{EQ zdit9e;#qs5poS09udiw4k?F|$4D&|?hlAywLQk$w8*N{gOdAJY#xEm2*`WAf!5X(~ zoJ~;J;_Pj#ixQS7r!ao&!W>Q|+{Ay_^6Nj!lb#Zf^qa$|(p;$q55*-6zpU3=ns95j z8QZQ7?7mlQZI1b~l~)>ayZ%1+TSkV%fC!%*CT)BR98mhq<~thc#E=NzsQ z=o~;zGV5oaOA+?Sic5SWrJF}d#`&N}mT*lm^`o2P1yA75;Adg7T1`A;eLJ@Ll&P)Eb8T;r_wrLBPW8pe1@at* z)-4#kooJqwRmXyBXU4fJqth2>?8MLm z?fs$+rDr$yqXt%IWM`%8Z7X6oKBnT=v|Gj9p~k2GIPh(CwzsHs7TqpodmtWi;Y?rIOkBJ1rnxjwtJ^(tTU^2+`cK1;BS?nzuyG|8Q2XD;P^GfJH4`K zW*cYZl;P-U)O#_ExZaQGR>!Jr_)B5kY0M87IqV;x@qtS0>X#Sb z67ikLDgHyT8_-`DmhwxKQyXn}$S0@-9*w;gJ(#9UgM3=tnzv|>>EX;eey`>Obb8c< z+mV@r5x)bq{S}4?$=MWX)*hx2W1_recm+s~7%*v|S}uAmDsUbdEQo$42Mcuu^%D|! zNZ}-8bH^ojXAuWCvrhp>{wX%=lTvR9{5|1uFtAqE!|Jg^d$w#5RP_BU$Xy(SZ+PN@sY+LKU!*}of4|9pf7;CX>s(#YkSw10C}e8$D&)DHuE%OcxDGTX zo_+@CT4n;@;==e4z;E&>ag2YTqMDyx17VeFK)X1q`+^bQBUhZqpw=!zGr#4XqF_pj zZ~bfM_6mDwrFf>jOuWTfUSmMlyf@moijWa}MmN+mKr1DW@U+{~-sf4T$b#s7=B($D=&z|nl*Z8)#~s8C0AJQ(q`5y2F(8tdOl7(t&{ z`{%w*M$S3cXvWKWitKuTnxOk)VQ=EfdasX*L$?#PW2j*(F66im>IrObL>!9jn)R3Q z%F8eKF^bRNpaiYo=p7u?S}P3`9*&SV)rMWh|AE)7H(%>KU8L0(g@l8<9&_As&0O$1 zaw+>1og|m@OAN)RJfCT%rB+5f8a``1?Gt)V2@+L2OF@VvIyZ%8V@7O4xhZmP2X#GJ zqg78IPz7h)QJaV^1@(a0(bO&5Wps?yT*gSlKlzY~3f1VS6z*6bbp1`d_@hfl+kjSU zjz4dB*ik(#`vV8U_GX-MH|dX3FvhWNhMVf%m|Q@PjLa6=?y;^;s7PKhVp{qq;lrY|k zWQo+q#-3H6_5%3wT;k&3b>6RFTfk8ZW&Cy5uDjPRE>nN5MbL%M2QhESu;Bz5*zRza zf}P$Dt?K^I=WyJ+{j;F;Gbl-=@?3|3B0F)qhOf2MHQLzb&-)%_78bns$sKab6)iN9 zc^KdEN(O|~L^g}meqsVj6nrHo;0)Uci-w)}6ShqS$o0-SEt88GtG~>T#|^}x8>^i@ z2)#i`KiNN-ku9H^_COX);q5* z1QEL<;}%6pSdI8qeVYQcj!eXU$EEM1h(WEq4TznS>W@d`?DL9&Q~h0oMW_7E%$G)H z8?+9jRF9X1)wrj0hm;D_)OHNT-?2%7sm)!%iWl7>kB4H~SH*?KgzqziN z`2*m2J@@*J)@QuLGO?U9MAHmwlpW*)ZhZ=p8ESf-8 zD3~(a{PzK@$&2Z=L=PjasUyTSA?)$!r0)DuUf;PHN@v(vLg3(#PjbLy*y4K_E_>)9 zTa48`jb9uHHs!M?D2c1s#C430p6t!H!}+zo9B*WFTz6MY!n8?nIHL_428;xoa{tTL zXA}E3WBld$jqk{tN`+OMI-ucsGSk0$5qm>RJ}@5pPmCv)QXgy*toD;QJ}@1OUey-& zNdZ_{_$a2l+@m|$e4~?n*ws+6d+}~E*AgNWAMRmX2YOo3d@H=-IwyoFUO$(MfeE7e zc8$$%;Z{RV~69c;fsi#eLC_5HeZH3AM?a%K2o`YcsN)ws|W< z@m&>G+1CM6R@`s;N|+P;0PiK!C*&8E&^G1TziEdZ3ox@`IsQ;BSc;X#Q^RWXiiQyk zJoUY;wqJKI1(Mgh)OLEZ+f9u3O3jSh6RZWs12Tolmk;pq7u&ju_FUs>W)3Wl9S^pu zq?`F40QSdT6%Y!v{B40Rm;?2bt$|7GCz~)}2kljKeE;V^3bd&i5Rq&te%!pXa%216 z!0cC4@A2lppdL;Z($&y#*!Q+fgDC2x*5guI)x4i$pq*bR01nGLDx&R>-q&-pS_tVy zjPam;4AE=n2s^K zEB^1<8(R~Hzh!4q{W+JJwhzh*(O%zDcm$nji$R^|PPR-=6)Sp�e2r8C%}f!UTw3_@C&;`^8n7xl*zVib)Dp$c+dNLUce|&)QDEKEdAX} zdiFy~UfkMhJe8DN``z{)x9n92cpkbVcE% zITXF9&w`dQ_Te2TDcfHQFvTYCLAO0Hw+0*X#u`#&S?&H-L>Je=90-(iAjrCcyMhz$8;`JPZkT@dmsUVu#(jA(Kme9b<)^?}*VZ<&vC^rffSO*2NVc(tCwoCXiLH(X1B-fQ(F+VEk zGgNEO?OXmgR>F@erEQ)0^{1^^WuSmKi@LN52h5?nv!QG~2$%|IuCUGUbZf@K!}94a z=qC*9S-scka*yl->IOP9FEFYU=HLqMcKV1&FB+&5#f`8)5nJEmn;(;L&`oFib1 zrso0=vz17~$Olvd-}KkuV!PSh50$9*SGsR%m&<>&U?ZHpoB2SiHG}uD>Hk33e{Ini2Yp=I&8)(KHXyZDSjY5yxICQX{;m{wC zJmKAx7IN*#N70>|Jd23G&JgI0y*bs(;J)qH-#YZP#NUOnv6fC97_YS=`x4W&N1x)0(U0|C1wXvfoYGu6+Q8Fsyl|y)^ncY#PZ2V3cWG(9P_M+WX zR6?$(JLi9#p!&E`(&o-deYdvq%9%-soFZyO1I)=Q4zy6qg-`a^w1wR&&j{II1`Zot zyAh1*QJ*Rus9Y0!=qT+1`tcZg>xBLjOrY~W@oneJidiEg)VB_4wj^hB)wB?OZlXqp zF^j3Uy0gl7aK-X*4du6nMbFwlL|LPCAYk7J0wF4!=6zSna%U$3ax;b+SMR_<*aE$K zSQkJ&?WUVWbeHD24N9*0Yc02%EDBTEN^1#moNy%Do zKM6Ni&-?hT`oF?zUQqfv%;K+rxD6%8op+A%2afgWQ}A}lmq!e`&7339*mfS{$Tv{G zVnDd6@Ed!&>wG#c?H$*G&6fO~?0iJce8LCja%EzqhV5m3DJi|4Ftw^g>;wJIC8 zzv^536H`*p)H4e=MwTNjyKG*t%~5Y7!TK|Xaq;7z1fmT)Zo){Al^){5ukyJJUr20G zA0+T#-f!h0xv=pw!}%F@0Q(I8cW6@YQPadAG9;w)o|xJU&hGF{8cqX7@p=$vMfMIT z@kv(R04Npgp=H+ugk0>)c%vvI^L!u16imQj3s*V%Y1aauoxvI6n*6oJE)gRQ>H1gR z^}1o;$y+bSHZU_1E9o56=Cn(<-19FIqSA`A>k>V$v57znkxw2?JIIBOvz@;b@QCoH zRW)a&Y8(ZxQ2iDA4C_5;$n`!Z4Q1qz9M|K^56@s;S**yySzD9W)7CTDEGM^-FeWQ$?2__$s`p1K zw2KIRDlaEKGIBdCebZc+AqjqsGij{07wU2n!gQTu7w%fF!9u;bkMe*(Y3&KCPkE)Nd5#QpM|F1z z4}@z;R|SNb7x+(?*1R7BsVhf*6Vuo`xw7hCXs)l0klq4;TOMvW3!7C_^HC30_PBN< zPKUZ#gw#4aYKdQ`*FWRgC3-4 zws1_}{CQQe!Ci91Sni?jO}h4uV&TtUl-J$;R3!;KedMzJ1W&QzTuK)SN*#EBSRt&Lgl20SCU1*CeVsan2eFImMOB$ej?rHTF`vojhQgN& zUQql#hYu0$%?!^OL+!xK8e5hs8yYBApL53M=mncMJOiX=<2c^)ZLn}{!W+b_r1t*1 zb)`t88!)@X?ZM-+p2(29up2qXz(3sFE3C9105!Aw19}Pa`ta51aabYdH5m=C^N6{> zuS56^;>%o-RaM-S0-GDa!tIpl{}e;nTD_DJd4qUv(KZ`7;LCj-gu8`*XmcV&;z@8C z2G{g^yWh4o%J(y$j(Veq%|>Kv7o^zW%%Fqch0X)btsW z{}+(2lHe<9f?The2O7ZJ-8;^6wXc7-Q?orcnQKv6CaJBa@MeEcJ=5HDu-}RYkl-W_4@$3m)zd&mt zIblM7T{&yVbp7aWGkhtOer63?_wBT<0F1d>v9idM5p!g6-a*{=xb%ztOO!_d^REit z(;9(ZaE&FVqTrr{lmpMt=4#t)_AX)=vEdDglh>@oedNBz3R>uc&+2^Y?`UHbu*H7( zvfS=#G+cslQjKB~D4*%aYBp^Ge!VB5#pOmh)deV*i)|AxvmU(c&->2;LGu4=*1fG4 z?cy)6NKN{D39hX|`K7t*-7IHID+uWs{&&aH6_=4vaaWul)6N<*{SL2q5^oy+DQ21;%-ey}2A&>&J6@S*^h&#Z*LjN+4qzscf~{rx>)5!H=+(Y*zP+al;NyQ)aZ2yDJn6F$ zgDISKa^ig2)@vRn6dww&HZsbjrVdQ&eBaGFpS*<2LWa(td6sSJQi|_etL}5K-}Nnn zT$R=2Idx{{r~lKv9w`_XdnCn6WA^xJd{1K?0i`pwTtyNqR}cm$Gtp~3su_^qORuDh zo*R=*;Z_1hIDcOn*gu@wcbv~jmvsNow~v$2Uc2Ha?5$5$OR3F{uJNzE(2z-qZm+=| zw-fal;}AIW+tY5%zvJs9ZQB^goq8V4xQRo~lXV8pr*MBi@D25eMq47~!GgwM1z# z8ggGprKwyZ+g`yFSq|j{duvvo(cv+C5h~PD{OYd7p3)6)#c3C9<(JQ9Q3o?*XS6v{ z{jI*XUerv8rmE9;xl6oAHnM{j7Rh^K7Y8r(N7I7@?*4zck4WxCtJNVVXN$tQ3vASj z|0yWM0bbP~o*hdIjB&RyNKb4(`}`h4WnU=m5nE=E3~yLIccK2cIr!x0W{u5929c(I zs3TZOMX(5rVMfC~IjkG$2W{|0UbBWt*N_Wd(<5(P_y=xn$@WWh?!_4!zEi^KK!r=W z*Nhpp6`q(>XXeqeN=Og6+&A$L%(I2!-H}0-E?d-;pL|@EZ&6(2o0VX}*btbWY>}s! zD)0g>ittF5`Rx(5!XM#b>o4aN>pKRz%mg($7QQ(RilBvWtN0I67HauxtaNJu5#5J0 zo$$f8d>01t##eUIPWI4vo$(E{tUoM1_@fg3cMu2}n{NXV9^BBx5z#N`OHbP{)Gx9Zu+m?iJ?oQ~7EYMTJV6+MjU0kopT`N-uZ zvb*{~5kusA*jXo0OE-nfl@~PkWK?d88DSszz&^aqwlexm+*FoPR*~udusnoQ1m24{ zXYn5H0V+Ipa*$AJEY`ETp8{JEd;i4ph{<9AAM|p^)V?MSX8b|hbX5H%@R#?C{fy7; z)q~Y+$U?8)PE>f$oBNRk_F7kO0kt-A9>j&Z*Pn&C868Bo>-H7pczcFUo2liSp#8Nt zlfl>(7t3zKl*|_Aw-X&2mzML==#s)Rm#GJcAj<**U{kK1n6u^d2D4zThRtS!KKDnK zPp!eP#e2tTn#2o{9YtQH*0p}{qP|~ae%`jb(02&AT>>^)V^curGylagbPr}*aVOcL z`Sp<iu36_J7T9)2* zf!;3y?9qVTT62xWc<-I;QL^dQh-BlpL{GK0V?=wNv^h;rn6zAhTpi}#pFo@I2xKNO zaZ#Uj?^oD3l5>C~iytoN{fl|*Q&ML6;v0=J@hC5R;75CkqX1}TiWOk7>ie>-1sVQvcm%fLM{2{R~uKohL z2G=E@&!zHqYOvac1y-9JtdPEOWglV2*x``eV@x>bVt@hSs+@%dULepYqQ*?aO6sPk z0H}|8(syDxw?2gP6Fs3N*wA4$(fKOsOU@Lj!45dx_>ZNT9$L=p_r?a1yQ1FDUmkzj zJiItLNS^XO8e43I{Wp*>;<~(c9oAEuZMFOp@FTuOqiudjc;T9M&yw3VhN9nyvCD7! z!b~j^cRX=(*?AEhCL5lihR8R^!-Q?rk0;OMG_0D;lIc;X;B|mY^ zk*RQhI=9}e26_OPP5Nrw47^yys_!d&9K}!d22V#L-8SIH^;5ylfl`t-u!$a76AG8Q zGQWIQN6CphQU;Q>o|P&@&wICl<8^a+H&?^yqOp^T;4g+5M<$`^~f!Yqb?eOy6DpD?0sZT7R|Gs<1HXQJJJT&|Y6B4BH?^LP(Jyo^S z??kI0Bs^VB zc54}{9iM1%qJnE?Z}b!yBr4VxuUo=Zyax7WPxzZa1Q~g+Y%5OFJ$tKrc0blr8?&mH zUl2Q$p7|$8@GUvY!L@m>>vigekGge?QQHp(7r6WL2x|Q)JPU_-qZd3-bzpzssPqq@ z=;HDeNF{Ro8p9c4su$_2ZB?GRKDOVIjgwAVVS96SNiHHW{9`!2_JZ( zyLKgweGccx1VP_=S(Y_}frF|WO6Tj0fc=5B`^9d*Fy{t~8=aR0gVDPJiBeTez2;lA}@O`ZnfKuaVUxIPRxEYY_{I(zfz4H^QDxnE{XZHga&q5=Dm z=qY`FU09adl5sla^{m3@q+}>pj^A3r&d%q3#9I$SOIizcPGo?FLPZ~r&i;bJSEkYOPnY{^ z$Ib8n*{y*>aTWw^{OY-_u}e-Mw#9qq_sM~ylGmSa-1N7mawllTP*JzL`C)#&61OM3 zG+ym4-~(+BO4}k5>+5_ZcZ+kDzCj`hrq+Od&)1MSog9FH__jaiwr(QH=F`mZCcU102Yeq@2foP(VSkPA{p!2BfcdK`e!D?B z+QaxZiwfxDob8wFow>o)82~k%OHMtnwxn$s!B%ls+x_C-6EJ>_b=`!357X`7Ke~?I zV5rq}dItN$SCUPHX>zm-Z=sI0psrF}35m0qzmE^ZWWum5H}O}(9^HZMM?ddBe55q< zKVa2&HrZzUW@R|E`bj-ozi2$-%@yTamWujFnbnN>%!tAKpm<#)AY<>oKRQKqL7vtY z_B*2Rw-ryfsj^VZiru9-7Y z`!3?6$70@sY*z1XZU%vZEt^V*2G2wnsf=sQ0uDf6xb$#-?{EWxY==NIY#dQE!=!Ghkv)w$)ju$z1>wBn*kIc4gnh_Bgfy-2Ek3y~u-|Ffy0gJS;;M_`^4$bDK0sV1`u{$bf z%6%znInb=JTbxz>8iU1K!5&8Ai9Y2skb_h{oY~QJ04*wS7`-v+9E~0;X&cT_tc=sE z_>|E@zfQo*vd#v`MJr;`|3nKmQM8@xW&aPxZI+%*>6d=>9#l2O!j*F92bRy$`w;Br zN}dBul6za)g8kvyp*V0(i>ej}*fr!4Cih6LMhuBpg;j@h;U}$8{tIj_fBHu0@6l+A z>p3kWu$!u}*94ZlA+WUm$2aqSGB_FC2%;^WduNF;JK3(We*+Xv;?|JW9q!AsadAg($ShCXJ4c88$ zJ*8+f|1Ccvr!j2sm1F&ynWzs9Q^A(5Tk^k~f^U^F@!a>%D{RsA?4kK`5uqBWj^oUY zpMC0I-L90gD>J6k6j95ueTqq66tiB+G#a3?s#n0nWTGQoIhnvLTkoTx;ydg7Eh7#p zUf2>aLlP#>*bsQ${oVI>lGD0Td~ow}eV@5cAkrq1c_TK&qX~j;or69?cmQ?K3tqfG z!ggian9WX$E|TMMZAQ^~I2Hro&nyV86ZRyA3LZI^boiG^906+!yh1obXsah)C(Sc3 zSNDO9mfo)PhMt6OP+ildcN6SEa)Y|o5A`3p^c5LlSNboQxNOnO!4STPYrhXP3u2!* zyC}wn`}8rlu%MFp^EvoNm0BTb#pPw4*N2M>uo6IFlmdM%I;R7^Q|a28evjt(|qYt1v^tG_r^)qgERupDb*CldIX8Ix1JJ7qK~d- z9?!7T9;lC7O;uvH}y`}@ElJ5>3E0=uvox9eq+`=gs#@KNpO;d3@SXPU-EFG zTenhY!kAeA6!WjX^)r7UcEzXz$;`uf(C*bB`{-S619(mP4E!pGS+JbPau)J`?mp!m z{NKF*WLr4;{Wjao?S)CS!3u`e-M0Lj&f!BXC5E$*qCKjpWwMa5Vb6@>17w!9eDv|t zzb9ji3x{8r>3I`k+R&u_+7o&IS_af&-=b7+{@Lyvia&3PCcAsP1|kt-j$8J!t(<5*Q!t+5dKN9B$?33q47Qk<8M5GlDBy8I$`q;{m+pD!|$&+v{?# z4D?jJYrsvMGePO%md3^s4@9FaMO96SzCT#!4lo zEXgoP5wZHeKLvPki6My;@O#YBPkQ>+kB6-?$x!4vtNw64z?0TIh=eur@SSGH0%a9@ zH%N%fS8=wGzIPZ#qtuNm9yor*W%`Bva}=wWgS-~(&ws(9zdjSrLGgrSD;#9ZStH)a0p=GdQ|I)jcGZ0g-r=P9n1x(Kzndy1}MxLGn*L)OBO z9XhRzPDc4`uWJ;T?lA-3F;$U3(P*2R@9&t=p0E}nnaj@DM#GGWB1~N@A(N0H$i43T z2|C8k)g6^9cm6);tofPobh6Faxi`zPsSq^PJH4^*_V)ezt&fvT;iej33)hxxgB8e( zJpL+?F2#19xWo|#U;Zdv0`9{(AsTaG)t~!|(p;Qh4lXwasCwUnYE~}wIy440@zj?u zgHxu|zacNcYKdUz`S|`wvG#q%+Ti7J?`mEtdB5_}*xc52{&X5ZIYw_Mt^nkC>)MPR zI_{Z-?A@OyZr{6qm+Bs@^57((Dhzli58eLBBVzJgB3G_crriToX;71hTUE_L@jj7U%kEvJEw(MT8&!ZKV4u_(`_H*pMe}ecP4bh-a=8e zi&%77}t#bQwV0@$}c4DZmGv`v1PX87| zw`B37^aH^^f*uy=PSspIIrZ-R-zRIFweC3*1=M9sgiImvD+&$hm|E#QvIVif}s9(W6D)^kdliS!&r zqtBFqS(ARWy6GEL)mj%m_SHtK__0YNt+-72$>N z;^EACtRzb|VFDJ=E82fy-piRU`n#1(dNO^{q=0ie#ip)Vob3>e8Scobp4$BWVj6&k zImsUzpV-PWx}C8k+2pfo-cqk?`Gkgc=|G{XN}pdsVylr_jb(RHU2hKqWYh-L4)$G z2i8TA8-{6ra|Yk%J5iE+8BrHOYlfyc$Z!J4{4b$fp_fw_Tp>COc?OxEUK!a4GhVso zRZ;~uLO`f;tCDIzYH+(Dz48*|2GuTa0)^!nokZ7P$e_T(I5RLp&TLwH+wgIy|DYZ-0T!N=Nyl5vS#Q_S&f6}?@=zNme&O2VJ_^nGPe4%<> z6krnhWlxHlyXR{bdoUUZ1W%3GWUw-wqB))!is<&XG_tu+WD~p4SYwuKH2cldDl>{{ zZH6LUbK$ZN94v>s*eQSbHU|7qTEYee!b{hgZN=0hk9SncIR|Ev@2m{<0G98{p%c|A zUWbUm_hr%Qvt4nzMvhf>5WK}~nSXmJnd%g>X z##CUp-V59-rR)eS6edMr&(Gj{p8xW^&VrAL&Tp@SH|{(->JYuVL2r>1&vO1XCI}l? zseRt!FwLmGcsL+5*diRZF!L=sv`rM|bFb1N%377Tz9A2rZ~g~n#A3ra2K#yB;HnZq zOLvQf4*hQN!)o$cdHi9Bqg7f58VU=eeS?ET;MzNB^cleN<2UcRsPr}ado;?WpKGU+ z)6H8NPUW$hjI6^(-e5YI7q9g_cy$lmhzzj3N)B?#Roq^eJ>%;{?R(mos;+QqI^}Fw z@hpiQdA)#M6$_%9}5T=8v>-a#|DyhwynuAA1 z4+O7|G(KukR;2E19y4A5XMZjf=OVhO{Agf1LIrX?4I~t;M z8*xLQTj^BQCbWeOzc1dV^$u%fxrMaIiw zRRBY4GN+OsduOp>>S?UXYPrsPP?_djc~0GDEj#c@g>+0haQ3k`r+d=Sdg|$9kzQt{ zpA%NVb6%Re!K$*?ZboJcAg!4SF}nvVElOcMsx-ppu5i9l&jzbRX*P#0)gUz2Zspay z*%J)B_G|jE6ur>%CH|p)^gf;ZyT)dg)`+V$qG_;UuKx&gosD;nygPr-XtVg7KdV06 z>U9EpBGrd0zc_c?;&HI$!CuiMQAus|D_?Ud8p z0UJS?&0uSr=YJT6OA5~z9>~C7W**sdgarVgcBj)om$8sKc;IBJU6p@F7YINcNc7z< z06bvX!xaE0fO)YUYkJHP@JWihXt!T_eJ0wk7se{pn_FkK(kD>EeFny?Ma%Eg3P5x= zZe%(qTe`@~wFZ{VOE%}s(`BJ;W8K$FAKOLHbt0WFb49@$Y|-r98`9mt2cg?_a(LMW zz|Bqm#s{6rmuY0tX~Tfh$uL5;=WKm(vc#Z{XGl{T;Ip@S;h;w_jM0i34*A}4GUrM@ zV`<0I4IbCc>37LWY@2r z)95V+sY9317FtNe#Yk8ue{pr2Vd)^nG`ojuo%C+cYY!qBK$(cxbB4Dv51CF=m%}MH zHwk}peca_Qw;ynLcX?rmi%LB2__fd_FjN^e%wE79<-x-XVy*kRm+nCW8HkK9sbS#~k_od*=T-%6h#5V4v9`hMcxw^}0o^P(b8BP_F)S{} zT{%bkM{=hDZ{^Xr?=T3l|K$TfUqi3)1S%K5YSZ$WReDc;B+wV#KtYuhZv3Vq^ z*DvwJ&5|!extcF!#|#3eH@Q>3CHDkO;)swq4NG(|cn>W7!Dv*$o z!c)nwFY1pYUJ~9BQ$}^do##ho41(Yy9famo2(b>oHW%6SfSs;1LYL>47z1(t{$RRZ~x#B;((te?*Wp2a%>^D z%l$wEFmQV%t5XkRp`_JzlFndlEqC}6pwlE^o~+z;atzmz`C!e?&`r~xp9<+x-^fw5 z`t%JCwoV^bCyF}9hkCU1C|?m!E5VgM5~A@Eq+$f%sXZb}?N|-jzEI8H*bDuQ;yNSJ zYo76?&zx%J^(;S~(Kvt%=yFe?rQjldPD0hUtyH??@M?-li@sYgO<$UqrML{5nXqR9 zXtVqLr?#x9OiyUde)3b7Dg}jEBuK7rC@`y3jvZL+CN>P{mgX3all0~uCIvYgaputd zPd;-SUH!FVs5@D1T4g+|E0Q0|EbQ{=BYBTg+G~mZ{YEM6Z3x%&q@$Pvx7RD4GToJ7 z%c>M3B$-7Uxg5zUsFUx?!~%xWJXeR8;{6Vw zhkJ?PX4SNbQ>^x>_nd(F{hlVTwjG-9Y_GW*BD`?oCc$)fg==Xv(!3^qoG|4XPc-M< zJD)Gju2yqlGj)7ryx6W}h%KrB+B*Brd8tS>RRmMj4Gs*pino7W62W4>R@CfV5?9H$ ze;LjBGN|fc2s^c7<>afzVJ0$%%e*krxjtKKVfP7vLv**gVg=5{Ls4~&9pDXwO-to| zdM%C?S9zTw;q^&4tfe>is!f3g4%pC0Y{=^9fXq$Xnq`BvkfoxYC;(K|U@r4F45W_P zyZQ&>eXULWCEbKfC7dl=Y9d@^PS#Ytla3)=_~B7oD;(CvfmyGe9lsHwFS{G9%9?ky zD%R)Gb?p(?O9Gv!B@NTQA2%dUT>DDBf`L?g!*s+t>j>cVncQeNR}}ru z!|17hY<`b^P73$5bSlraZ|@Q5aV6=MQHa3W0|dCuuMJ2HV%WFg@Xg|b1sU74z(7LM zXi>ToFTpXzuX%k2Mq(DsFhok42qWzC#Qz&>sFNX(B%HmHMC5d20-1mADUAn`Y`{z$ zh|F$`OPzxKos$}bmy3yodImtEZus^) z^HuiS$3)K0s$XU>Q29>uX5^>p%uRHItNbDESqmI0uS-Rt;=AJy@S}3Gri? zeSVf&+qjx&OjRaAYk;mVFmir{GrGuC;CV7Qg(5b*MuzK?8r7mBV54W%Q@hfKdC^NwKAl4MAdz2%Kp`dvO~m8c^}L9D3w|US_tbpzB^adVf!Wmmyu|`L+wI#z!Cq zSuGJh^J3{C%&(M{d6K7v!%p$_V4OoGU3bDTVn~$#$$7q6kZY|Fb+Vw{MpW>oTp&~3 zxc`#BOXx>4Br`4EWVY(ZSm(XOd=|hSRXgo&VPDzRVN>*MB3nqA$@=Zr-(|FmX^iNd zS~ZW#+?uk;pY9&9J>p|KCEBHt;i-UBx0LQu1_#2k@<*!?meozb#_hwM_p{7A@R}{v zLjw2N?hGVf6vx6OOlcA90ZpuIdN#lL*oH^{2&(6mdo2EzZ#$3O@f)sLPqMEY4Ux&YMm^Z|xS$y5CD`8L zc6CMPk8jD_f;UTi0Yu^`j2#$L!IY+LSB%@Y{aJYj4yZKhees!>@Pdk}G$ zRsh-2=8p;emH>9({k#NC@s|fJ_o9{wk{SG1cZ$8@pl#J4Nrz?hZ{7s8a6GN5xq~pU z-Fs}T?F06YWqUua951>T84kvNs^+~SYb&>tcRsgu7)9*zx&g&Q#ztJKZHUYuZ3E^3 z3pYSB{t{g!06s?~Owg)EcJwhq_$^_2L&AO;{6U)}oFQYa!y z8@Ad+KMHf5~fEGG4`x z&0an8ZJJH{znbF=0U*hf!ktmuzRg?P7F0N?0W?AHG_Vti>3#41r^Y8%k0qBSgA1B} zM*k1Pt0SP4g>%qmgvo5|3}r(pa;pp$T4VguTNNq!GC{*I3U3b>0$i4(+f&48gntUm zVizigG;jVH%f)u9EnZ+W}@d5hRWp@0)kVFE(0}R zbIu^F$!Ik>9kNunx$Ap^lQXn`jZYI+dZYikenMn`trNYLZMKfNDrX9@Bx)YeS*KkJ z4bAND+tpdg>dP_2(yAEuNbW${SVx?{@=V5T5`;gv=(KUtEd`L8-n}O!eXVx7+>_w9 z%N#(FUMNQ2thMj9a+$s;H#?VjK1@tALySnUX5Lc0ahdd7LiOErXzQs>BLQ7nC3>0i z`sPG}pJ!4as>dq$*5BY<187{?7`Hl!9t*0U?sPMbKsF}n53?OFJzFI41|j8Gx*2PH zX_7!84jA1I{^f?(Tk5!=L7>#a%Kezj0O;Oql)a1lOK6P(_? zo;}|!?4h|%;B8)#Ol^gFv&AysK{=B-c(WKufl)ZKX1=YMnGnw9G~{@1z0xI1vsARU z@*pJo1zREeSJJwr8{^9tcxo`BRJUf}kI8-ExxkQbP-6$QAj=?3M$&WsruOTmR}&1W zX!WCXcJ>u-M7HVMQ#cXviULzVay!g13(B*7G0Vz9{RNtay7tXs7X@wwrg)w(hDaQ~ zu2+?-muxM;i|O&t$LVmjw3hx!Bvv9NueTB~6Vp^^Xz@4^va|(E*P&>u=Q^WQzi}Df z_#~d|7Mq{B%!|yLZs9{PS=1;sj}T5H@omweb>mOrC#&0MZ`=)?_}T=4ZW|_eg~D|g zJAQVP5H;0E`43aB(U{t-|M~v8bji77>JmFixEiaRBCOqyN0}8Es>fn1DSNIdrCs0U zjo^QCys}GkYmdw&G5%J?eIHgu)Wxw@%S3ByOJo~~M$?~FF#Q8>9L|;_<}<#rtA{n8 zR}iwBdW?_(RtslVmk#_01pO#cA1qJGV04?j(N#LIr@dc}RD4K^Rt*@LHWo6lJ>!9S zw;#l%+&8Iu8kj9n69uY>)+Nh`N+y`mOE9DB7b^Yw)~UY zR%zOWNz!1nJT*wfsM(X#R2SA+!6Sd*C0^~RBQ>X2Wo#bJliq}0Zu4ImS_i*BC3|~p z_9@$}fVfTEI7`GXcN5UftnYmcgSnaCYP-gLkESL$Pwp`E`lT5e-fxs-Pth-gTMl1|~M8r`rBB(O6)3@J)_r&n!oZ6QmI z#Q`vuYy}Vfn9dMA=D$ureC>P2}xU3xCzh& zboRRqOx($mN?erug{?7WL9%I5sb+LJ6oE9gZ=7QBC!fa0Far6>6YYV4^Jystqii3? z6S>stviVaU?vfXmI+E^QWsijTtMll{G5^vuh~+g@La&?Xg^7b}04IwDp@|L={N`DS zGbU7`FMp`{4Esq_BGD>Z*k%SZP90GDoBwZ*C2I+se>!7Q)^PxNdx`SacnbO-uhq9& zEAX<8%&{waTl7ZE-o!-N3SoSRrTB7x;EKTAn_)`+c0s>Mur@WbMqnL2LDVg_YVk_` zE5T^NK29}!RqkE_90{UiEU)532VV_s|8AJeac&ors7LM&n)ajYqF>}%)E5^ zO=-JWep%ZP_`@NdJp6Q9ScBwJatJ|mx`z_3CgG<9IU$CE7+a)s_2S~sBCd_%m#5^1 zj?!kIpx{W@o&F51SNYvlXYXQLO<$r{LdjRzlO`L|?HqJ7v)6G14|5kMNr93$@zxO! zw=Jy$N%WJ^){^ITRCB;piD%j+mRb&UL{#=Ys=a-5tuvM4p^cEY<(AKopgzC0S(7;H zpzj~sgAK|_2(V-Va7|I-QVvG#7WmroCOVCZGVSNsy;7qt$_2Za0^VnqYU0}w<@`^B z<%e(nf#h+bIPr7W4s&awg?Qw0VwiS;%hRYY9!ny&m7-4mdjv5sR$RnT5T;>Vtg^*c z3|oeDEuFbMxBS}`l`;_P7ZnglUhFqkCM&=zDTCXh1uH*z&CDK$NE;`w#OwPv$D){wlt_!Xya8eZR*1{@;3!b(ot^rPbrT3aFLQg1T=4q?Db| z4R#O5wD;K9qo48~4YBjgqEmMG%RC z5&@MVAY>x812d$RmN6s>Dj-8dK*j`_RYD>%M5X`<5Fn5MNeCn)IkETt&OP6`-~P@$ z_qq2x=ef`Q2UgXps`p*Be)X$bL9KHI7S+(e`7AQTCDN(N$!4J_*Dkwu8XonD1sYI} zP#NDx{;igp!K*?|fdeTqdu$2NC7auS!B2j0mADVO6)eufWGNQjw6WD!yT?lC8W!kQ(-0O^D6l{M zBG&hK=_OF6l`LosKXRGT&+>fQUuagTNDjf@D4Z_2bK6l9UX$?iLPwOftpE|zKigE% z0Tx83Taxf8AuD@!25KfbwV;q?w)YWV1X{o-fQ$I(rMaj8*59I#_BXX}%^3dnhD`YJ zhf$A^cd5pxd^8LJK~TE}gaXy1?+cgQFb1VJ?IP+7k)q`!2k)r$xnCYA zZ-@LaGT3_{(|f7JL)%@%zY#$tqmMaAA@6SCoY0>j<8wBgxp_w2WN@ajqRpEc+f?LQ zdO?9IJ8@*Z@2XR9E{5%3bfkwQAey#r#-vNYkMq3X%6T(Ql&q&w)1XFMGG;pM(ZT|( za&MC?je(4cQMHN>X%sn%gz>s~STB)}SIRY0GKyl^mQASD$phCm;9PfbpR=<6Tcv=O zDkf?)aK~Wl`-*RP} z4|iejD*w)|ofx=KkP4=EznXIu z`IXhzwf^c#iJUzK3nZtA&{NYKO#@2x&Gr7dlU+Y#IB4$)B_yhv&KgIBYqUIM_C(6c z{-KpgBo4q|FFe(W?8h%8Of9IL%Ww?UY_XUq<7FMCOQpKIFyP5)|1NLl>XF2u_NefO z`8R$E0R`vR*tXAczH=cF{9KfyJx`oF>As-P zN^=*{H9!26qDQoORUkm7#&fe=LOH_{_WWuT)djh}+sB%{=|=x-{4%4!J?=IoO%+~$ zBEe|gm4U5u_YuErUkudUsjZ{3(0m~86rL#!l zhw3G@-A6on&y7Cq{ljpRFQ=NQ3F$+u)4UJ%oO>@9J@C!Ch(X-jX{trlkheG%#kA%{ z^n=6C-j&(?-Idn^xK1YT(bhW(WQU+QH}qJ~`m_B@PM(rsu2#vwe6no<~y>9Z_!y9-@PyWHZ5&a3S zHY-J8>fp4#0v%gzkXb}__I)dWPF~L>?=iM{)uY%&g%p4mW`4H_ z#^e=aZi!2N8p?;2{wpz13K79eq>O_t&+(klAnd$OPL*RGT^!i^^ei&WoE+m)n>=A1 zQDi`M-ySA z&g#6#cJ8m!Yl(LQU~7->N!qmJjjtU!kL;adX5C@9HdOCDP0bvqas$r;v0YAqt$8#O zKwA;%WO~1$lGjvA21br8NoO-O>zjI?_z%cikuQa6N_*B!AdP04l0mjbruinE9l`mq zPUqIDvA0d1I7VL%GT)Qr$gXaxTlFrjI*VBHLTI~}yAHiDYpCi52)SB5kuvMTkCA_7 z+0>olN$XJb`7ZR`e8kPYr56?J+>;=(lK#?)m_*h*=Oreg4M7mCw*KA(lb!U7v7Sz= z;25V~J3A4c>R`OPrXdoZqH7$TPUzwLiRJR+wn4bT`CvHz0E)?Z=IQ4l2WW3-sIo@N zC7r?@fXqQH$AZOs5LYrP`G{L^~(hnM73#OA^-KBhE&(uK9elMA7U_I^1^(Xd%F3kuL~DH^f>@)T zv3!V-`W?TRf{$uj&zy6q!cD@d;Hv%;koPEvtUz1b&x~2PHi0yrWRl>nweJNchrF-t4jF+_m|A*(kHxf0Jtw94`1S zb+-@KF&`83)@MfOJ8_H!3SayCsIE4hX>g$}Kec}N`P^4NnXxA}pq&KPxKiAx{uXfKeB5IXvCW>Od%SEUzL3h8-qq(i`I$L~0CSrjoNK9*KSQ+Pq86&gx_>T|6`L>U!>l*}s(} z1jX|vygUb7>5gv`y5w`S_>o+cIH~rSYWSWlYOwfrIMy+EX?Z4}^;uOs6KhaTB`)n| zux>uyTTKaD?m~T~3S?_%5P{&SnZCTDTt@hS&TZlLU%`Jn!fh?eqFtgXr;-mC9O7hc7ujWQ^tDW zH^Z-M@tOmOl;KvgWymgVJ8iND5LxdlWx`xv+oM%&$ymL%-knXYDP#XnsIp%3UL)zN z)(A9G#ZSJ(JUKdV^q@;HG-l_@5KJ9{glz;<*U6nDR*jR#ME15a?fW=weMTOV`w&?o z6)ZjG)`g$PKGhW83bv;y=iGaLX;v>A&gM?!j;FPyJ>YaFe8H zwR8!=4g~k+I1(ljuvgDe$XpOEh-@eLTtND-N`$`e$#7*cR<}KQT)`gPEF!n|qRwy! z-lr7=g!d!pJWG;TlRHA2rV7QTk7!-isFggTnAVAJrM~}bkOpeW1z&!1ZAnhF&!5%o zYixWgc`JF)X7d$(G4!GKvwRy@GFjo)^u8s_1*Oo=7#vpTo&Rw`-e0g%>lvH}Qm>q` z5gK(@w9;lLGZ>-$E{fOkLmc^`S=1TR3yS7zgxMd=Z`~;Q2AA-DAnn2wbvCU7RVJ_L zb=0L(4@E1-YfHv2EMMvqQtISbR3pKtE0V*`&V){v609ke2{{PjTEkH{&5)!qLUA<$ z=2yYp8?zAl!rg4tN?suDkchX?&Ey!&~{ixp$FEsoJ*ZFxJo1FMSgVBM+Su^w&_?N1I!_Dl#&) z4Jlc~mk0p0mdpQD2$l}`?_giMNh9>P_tH5hmGhm~%c^7gTctmQoQ;_+5ConjLIw*? z=c$p?tJ+}|Dnlee7NTjB3CTjv33;P@Z#l6`Qijy*2-WO;D@z%r)oO`6rlp>9NZqc+ zjcXl5C4N8SyqDGqWWh7Hxm|tIEbrfX*$1!PBv*X0L@TLzG3~v-pQV)`Akw70ZF5=z zI`!XqfUum|g7z8;rdHWTie;=A<*{sGDb>!F@bO|ARWXC{?m?244?QZ>7-H3OCb>(E zLs(hJ7v)4ZK~HcaN#_t*V3k`%4|fSOkH$_a|I|(p6)+2+7@5&1|5w3{FZ-v`ntYX7 z{+fH^KMf#1^g@v=$i_Fm)res(m=4mJ9{PByu{m zEMbrdv?sWKI{d6JEPv38?KP8Dt3tRV{b%3a^4)lqF#8lad@#VqR@<<2EKYl{&)|yG z+JV7SoY&Xtmj+kE#5gSV_9{K^t97!Uu6+Bq4KADaeM|h>bnx_o&d29X8uugDKbCI# z-uQ3E=Ps8#D*5rw)uZhX4jG)7{Jt?{Xl0elOpDv2x0nR!9|roB(%J9vSq-M2ywEJ$ zjy=Hhb0lVtw$|{5bB>+G)E~8*m=z`&A8`!IlbjzcgbUm;6Si^F1c6nD75^^gYUAbT z->9E{y9#jknG8!0JtDXkc|g|rp#_z+BjcTkb2xTHy?;)&_`~UWU~d{inrH`T{TvnI zkT`ZZEL|DB1L;1xT0E*z4hzq%4$nBRZgG{%+;iWm){l{9$5+0}!FVyYBav+SY|bX} z_mE$2aThm5bAKSD9nSciXt#lwuip{ubLpZg1#Y7pbH%R3ryfFed$xMia#*?Z2C47{ zQ*+dAJ)egI(*~>I6hWw|giJt5rc;bub_QIll4|yRJ4S#O7Pn5k9^X{j)3#UXweV~a zC-o?t?62M>P8g);1rAQKYoV zIGtp-fqE#Fv#0)zVlRoSl8w4qorJO69|EU_UjtA~|L;;?71lPYRnj*YuvO%PYc;R{ zGF@^k_b3O1tiWT~XoqI$WQ_Fl!pD@WM^F6phNx$K)pQ~2ZbSR$s+E@fD59#mhv(x^ zzX#;c>QYJ_{D~j$J9jO~#O*(cd_T}{*DaJ&HzJH1qu6~(!6$S_f)L$S#X!v$<@5hD z<=-#cG(RX=5B2z^$c(6<_q2%BK`Idv`qs3ury3t$j8DoSCVyTlM8&M3*LIAZ7v8%< zKrIZ7s)do~M_|fduF^ix%bZ$1-eL0+I}YdJj_#%JN3tX)W&RX75FpQ#wQn2x^Qcwv zoLV988Jb!w=`~0nS7(MTvpT=n6W_Ho31N?K?#WPg`?s93f7JB(y8*Rx%^#6(QQs^X z`*V1@BraPEs4iC<4g|OFRqCE)-7P#J2NdRn+qpWeWeWYU{;3b|dwE?m8xoF+C*Oe_ zs3y50JFX4c+_r}W&N_sgRD6)mR`f=VB#I&I5i3Qvzxh7|RjAlk7Xc0J4nbK@p>$0n zLmf#XCyZ7v+-T~;Hb?mKLT@!+khYtcU&~esscH4ewaxPL@3lVDR3#@+6zA-7l0$2Bw>K5yord zifnH6=I0C03#{V`*Xr~A`qoE~FFlh$Mscc-7sJM1S=KDt6fgKSd~|Nk3)l^Cd#YnbCo~y|^*15Z@ zg6|i%qth~eG!{2`N+%ryGamr9nH=HvCK_!5$flny8hu!NfBegu9Nuin^wW4d2LZyA z&-LHA`qD1=1bY?S&f0iSpcQ1$lpr1U%nS-Mv61DBDul9A+%8f`zfPm--q5M?r8M2x z4xP3(S}0?Usu{$X4W@~`YB^k#xViE-w3%&2oP5km5uVF-(S0$!RSY>p2+IeULa6tm zUTD8{Q0;C{l(VjLNfQV+yQdGH1F?8W^Tr?dGTR0d+;vW!{hUPp9EB7(ii{^`F-XU8 z>2DR}I7Bkfr8EKvZ~zt((y=d_{6rG+JpU|5-3KyZ{fe~ z+whD@$E8zj<%b77E%5Fy(d669`w8Lh3YHqY8blQp7$2U3vO%9#!*fFe@;x`8FQo%5 zm+${q=|oisA}aE{^p{p+az#OEnAkP}-3RZ`O57hND z5PZ)#S}YNKq=ApgW$37{X&=Pv`o-&G@KG`Am+ZID^`Z&VJ5nO4!I}%4XBslpO_zv2 zgaRP*P3S(BM^_@4_Sm)H`7qAF$A_Fm@}KKam7{%QF);OkLpcX@r`k-2d6Ks$B;RC) zjqN0bjs>`5k5EVckVN)LR-49Saf7hk_9_-vs1`J{0B&3&!F0z-KrmQBiq>&{f($I_0wH}a?EYSA5=!3L0cG70R=fot>$IJ8Hx#}j8L!AWn&ooA zVn5~(HMda_1~N43XwQmzDhGFP%FlAQ9(8W${@!t_7QLSY;J!quLlcUPLeKw)8+nb3 z!)YDIjyM+<5cB3C?4R0N+OW?>HO7r9`+8bnD^<(+)CUEw6Zux5hwK_B#4&3_1yQgS zZTd)@$*9Kdq@icO8>IYzpI6rkteELt{PL%xw{*nw2 z^+ipdK$kg+gpiJ~uael#ibT=6)KqM{B<98Yhyk!X!Fa_?!PeAR(gxD}KY-RR&w{b6 zQ)2L|WJAcadjk3n#Jzu7F6)csCIE{ruJ?gLZI~C?kRYkia0gyjy3~8F_S{gh9Bim< z0<1bmwGw<2X(I-u8lUN|l^Os|MgVMOmW6~pRg36-E3h-D?d1ioLO;G?l@|+9iCH$@ zU!*QceX1nCRqSU6PkstKB=_BDXei+E_b9`NbL5OGTuXVpz4v~y7qa0Tf`FL|YdzVl z7xLyA$B$h)=t~#WUVxg>N)J7RqfN_0B|M@e+zd|)U<>-GLtJGn0?)8Mw0K(#Vh-`9SYD{7=R6lVm zq+1Dp#TkuggJ|O2#?+>7&ARU`{!qO%D9(Y!Z_ed=N`Y5X{az$xN~3GjO`z^Ig0cezw9^1pVZ!xuuBYY!(M51;=+^Bri{0z8 z->n~AaMfEZlz98}U5{t&L#oVourR!8FEh$<4aio8DUNCdeifgUhx7k zEJ+I{7Z}rdDjChgk@{1yHH~bJ(pgW=-lJV9yJN%lZqUS+Z>NDE3Wo|rCwj8N%Z6A+ zBtUN>1x^o=FAvuiL*hHOaiZO*H3G|fS4>MNq(zm7c40_6h1xFZI~1! zI9Oo8!Vj-UlFHbj9e=jykkr0OLgkM_lOj&>i0x-iZdW|)PeIk7&Gqq+mUJDLNHd6~Jg1J);AcAwa!gs6x({uAC z@~;dtOz3$y2e(vESS{;D= z1bs{vw5Qnv%+rSy8bG3u;iLK5lh_j%$~{cNeU{)Zs&N+o+@*c=q2D;PrBNTbnTC0Y z5V5FDkl^w^@K3hW)h?LdXY23SA#6UYoe41;s~NK$io{!0g2zJy?y}kX(qCP79&zTL z{{FJz_=UarhjkPa;=8e4z-s5w3%%b&-I&@a@{yCrMK)S?&;zQ1algkLiv(3HD|qJ{ z!++pwGVf6iGSX+8JWV(M>2&<1slG_^TgQPIFll<+m^xnTQ08wf9|utCV~6GXGGD8L zexs)uu$u7kUZ+rJq}0DPCo@nxy_#K80QC|4fn%c;URS3+T=bo7>B8S%J+oA}jtv&k zGz)7LE&SnlGBxPBHcnxdXsF>n$GxndP*Z}<*1llG6>nC^y8&H@p0yrhze&f~ysS4) zhz%EG++ayeA55n!p(cxTl=>6EZY-;#V?lvJ#;_|OTMOV$hzYe^!Q;op!VG6Hzm*;6 z8Y|v$?_k39-%eT#3yM-*@m=A$0wXG8e{D1cn4ye^_Ll9FtDNYZ4@J+NZ9+mPn~M_0 z5*gDS@%FYo4x4nT=XA@^@3aZ8>hQ6&%&_}KjU9_w5TcT(O6lPn!oYo_-4~&2=c2H` zW&PVM0CLP@-H>1!@pQ@Pmf;xtP~~O$1I1FIJ4m)F*CCCXueFifbQ>keOWdwGD32bf z2~{zM-5nr#^2hvoj-es!c!Txyf2zCoI;vHj5X4DS#^iB>Cws$e#XZ1K5UVR&k9<4 zErQ5G@I_vSQFluuv;{3Vh_aUJDSM$w{|tdt+&YeltneRZd&iB>YPXGEDZz&3o)SUW zGpL7It;yzRRFG8mcO>J58>v{9+=Sr|v{HZfrct>fc)iH%D`KT?7mk|= zUF##=U7iftKUsA$U9f&`3#3x9W2|H8fDdxaDKuiGNLPmmqV#zF84J)$&fbi4w_>3W z3u{SQR_L>&!NUC8Wk*9X4?7CEK}}I^u|;gy)JMh|XYk1%NQc_exPX?*Z>8tT-tWr>CE~KQlu+Twl<)-e%%E zcMlGz*-tNQGb3+K-C-jezXR&fW~HA#n%{NTAGZo>!=zq=$ivFQ(<9vXM)tA{Hd)&& z?diLCWQFzqsEi2k)yPaf{D5G;)%_Xux=@al+9lC0dxk|jIfRj<27TtumX4{hl>H2D z=dz(P`bmNIx!s^e9m~7N81jt1pLKrLDMVs}s{;eMA?FDf@YXf%n> z^tkUT^-V`LY)e~KD;n|J`2N~EiEM3d-8(?%-0*|(Q>_+DGgf&?CV?|)R*E0*QL)W$ zb6vm0lK#v!?(FaS4;CN9?FJLYr+KmN23Y7*K|RB>=S zc>f+dcPv$3&@C?{PePjm6!G%{>z4^lcy2M}1cIfu3Z9!mb-7OaJ7SQ+T=!l8@XW~^Sq?;|2iwnLopbjxkS zwG&(k8T!z7subYhz6Tk7@TIPfNyzNspVyN%yPW-#D`>??A>X5FNw2b?yfP2Bd0ZG7 zlNg%7?OaOExbo>WLT1Kbni&e340m&Gw4=1gmkDXs|0NQfF0;Kk&B)M={#yKjjo0vW zGS7+Na7;V; zMtXfeD68=mU71=(cVs;~-|OdFOp$*mnVyYiwxzJwU1535yFy9_=p~h(=4aZv2PJ_e zYsOXOE_N;cX1>Wrh&`yE0hr!ur{y~*`kR~LLlc^-K3kF|^kxfoCu7$Nhb8@c3n?8mDpZxwMX@uQW-GDk?>~Z{cjQB4aCh zSI7k$hQhUgO`L>*=+T$dDDQ@arxtf{S4CVx{nTjy>emhoyrFFJsMV|qskUYj^fxBv zC84OGZJ=rve<`qSu!mnMSZ|Z$zBl+d5WGCzmbrL8?8U@GIKlO*?sfkoCdr#K4*Db! zmM#Fs?I$NAUqnvnrLGvU%e_S2f)&8nLD5K5?|fgFMOEHziMOo5Gr-xi!{7QAe#d4s zB?vhi*d@C5{P8V>O=>>{;XlbKOtE`u1W+#cF{7IuJeJ<&GY-7gsVv{U!{xr~uCg{L z<}hg?XKBf?$5FBwzLqTbd^oBUjn@s`B^RBXU7mGF`=1Sw0Pq#^AL zX^+{z$BcU&7F&oXHvl>{JUkLsZTTdGO_;#~#8jHEyk0JGQuJ z{vzoQ0KloEV%RqDH;F|oeE0Yh6x+(AObLpO^PiADyS51$T9~`_g+t4DGz{wq$IN-? zkL!;Np%ul^e~K$SSDA32;g1( zGeP?)PV!~4`g_2na_*cchNUk`qDbg8d_Q_vQs~)5E~$>I?H4eYvZ%`VQ)hQgQBtiu zNl^Ffg2U8(W;DA~Ta!P3l=Lln#RS;H8cf;Yjfj6rH2Gg3v5}`*7Hc>Ka8>?;m}Ioi zFjf3JINWBorS)Ym0H9VA(O6Z6hAyGIY;CkD>Lq>t#uE|zB6#HXwcFAHi#nHD91ei- zB7CuPtrDa)v^IxfEP1iR*!jM8=+|7pls6UFiHZ@K@33>v#5tDvKom}al-KxJd_(`X zBS-yCu{}Fbt63v!3%9|YD(L&}W1V3~<>A}P{yW!ds|LR$1B()(cm5xq{r{}Q@1biE zCzbC^IP4V#)lV$UhyFg%NP*3&xc2g4%Y}jJ4^iugnz;{2pmrdCscU1I!-OJhX)QkR zsQlegX`9a*2JG`Iv^LU=H^=7L-ed$gP=4mIk z%wvZqrri_P(gu4yOib^jPMRETGZK-Ls z#e0C(dwlvPpzF6WBqr-UeP(7#@qLm9E)N0jU`1I1$b_1tLuYPLOKmR zhVq?$O%eXta*ndt#|~X29hOHi_)93z4(;cgo3^;%LLEu+Us!z1QjP%@cTa(QQ)_QM z76(r218tT~{o6O*E6yH9-D!%V_>U!8LFkWZSjNYLpUe~Cqjt7&eDvaz3`~=yBWG1l zzIxrXbLp|p8guKVespel%?BVuVPvg-IH_hu`KS+fH0{zJpvM5*=?YxfHYnp0#!QQ; zG=n=jZ8@b&knIG&sWyf`v*vQ>xisarqbn@*HlMJk#1*y18~T+xq?3sJ(~Nx>pk6Dp zpP}B|E-B&l?Q1sS7i*Aza^khgob4Qf|jdxI8zqq{R`a@|SEj~Ozb0+X_( zWLivY67gznqr@}=rj7Xj-`@X`y`L9UFP&o>8ard17XND$AG29;5;($mP_t5hFUHax zu`g*-i_h?>UflKOFAFAt#~2FQ2gL7mjd~R8VnqBhNc)| zmN(t`CUy3Mm9~TSQsPp5EL}%a%fAt;c0Z^*Bml+?drq`DF43VM3=m27{e?-9{vk9V zYg?3^iF4@ywD(@|uxBrpgn#k8(Xd;;O^!#12{V;7obxwnz>rFuqIBp@b56}X_cpTI zsz0o~+t|#xbdEVzhydhc#lf~#3S^Ra1{LF8pg8CWKEkq_^&9y-BuoajT-pwI4}PO7 z8~a{vP{lQ;2F{3`rA~{G(HnsDcb*a>d{eq$ajU+1#8a9WNe-)Qhr3&y z1UhJ$2ZdavH#1Sq;o%fn$ljvAc7RT)yI{Y(?8s+^dbYUtX3w93)O;W~m&)IvycIY- zh&!GwmvS@Ql5jWsmK`N7^#!AKH?0~HhD0~z26R7Dl!1|Gc~Z25sDC_O`i>sP7@}n`T3#O51*~p48N=9h|07PU?%YJ_1h& z_F5WF#_z_2ncKHkptMUjm} zK@N%D6@)?^&stic46u5}m1vV^nJ8YRaFw3|!)RKJ7R9|TmtL&C`M^GGh(6EA^DN;f z=i5OOy$7Tx=O%M6i}of5_qNrQS96R|vGvBOdHpxcW}D85 ztb*upXwRq7r0E16j!__IM0gJe7r)_T*$+Zg{WmX;pB=s(Qcs&U5IXR$r;zf_-wp`v zwIsRI zsmKhobp)iDWDA%J`%0Z@M$xURt|mq}(hr4f$nj*v%A+1A@&uQzR2?E39;{W{-WPwJ zUZRi|X4~hQ_w&pyF;eoggE7oMtVL91Ynr2rqBwr)5P4cJ7=yY%HUgEWu4RS1=sddi znsOAmX!}Iq&F(9(2*@_jc10#u&D&|VdHai~QRGi@0zO`q=-_t5LRdyt(E_5DjX}?2paw{=MMz(_z$L;w&p2?(j z5DvBsYG>P1a#a2|Px8DoRvmHTD7Cv<_XauR5H#zUgn)_Gk zR&dC{kc{-~cw|ZL*0^b(N$(1J<*oWU)?z;9MHCZ_`Bk6b7JI2DO7uNS>pLyHTCM3I zhGAF6Lr$nFE)9HK*AlI3fmtnWj8@EP;a?W&EZdI51$sBUuK8;Nz!qM~yM)LIHXe8> zc05CNe>Iyv~&i6oA+^W5`53eo_`)W)EAj*)&->dQ##YKr_smevKeSk5PDZt z8R5wBK6Rf;K2U9&xi1pmP>UcJ`9Et+yiRFO0FbAC`cP_2BN4UV6KB{RB?@Ie9$gI~U7tG*eO{)?Q3>!)u&E z+qOy6zLXjB-NE1o!CkEKNE;fk@g4X>&P*P(A0EjotyEtc0a8Mbu)YD5M@ocxJ3bi5 z`zZ~VgdlWCipT(sSyD_6XYzfH?uX>@Clb5U0Cjt2tUmou3XyY&;P?D0YA|y$oT#Ew zaWPPGXl(b%oj^jXUkWX>l&a)3<~DU#+=Z9ufND*~|8^-XWd8k76$L2opZ2xQ5Wv?I zL}fiuC|%I3bzKy%l}MD(d_i)IO1yi=#4y0?6IO*#*B5wB2G=dz{;}0>yJtLuAxnyUf?pX)L>S;(t^$*u@@Ghx2t;(2c|Mx<`8a<4B;m0SIN#R=T zr;T1Vd&aE%0^h!6hRr)8FI&rIRTDq`1{MKH`89ZHurrdVD&(=01G#Vcs;I9tb2~Kr zthKzg%qh>wjm6>(F|(g?x-LwPjE&^*R2a36E8d@{yP3Ce=qGJSxAXaxSmFDba#Scr zTY_U(WKA#p@@G3LT3Z~M1d@d{HO&2a@O*FMDL7<}p1E3Y2y%~cU*CQ>Y~1QKDjZw3 zm;R`xQ6M6r`q@W0kMwiJwc19pJO@T$2P7K!ek5a9u>bulFI{Ur%6_2Vjt=EzcwPk4 zJTJ)(7{9PfTb%R~Ra`=_@XkjA}b}SlB0hY)i(m+b z*Mq<8x|Wl*BSrq6VBN4SM>e)|{LnG;sn7=9+u!}%0p4GC0eEjStu@X}-9Ixf*C?0v zUi%h8_=RU&zlHmkw-IzkHtH7!CKI5>qCeR$aF5 z0k%D$y`#LJsb%3r;#y@IO115txT1+H#evM}Hv~I*lGu0k~Tx_VBUaekzy$0JvYsAFd>(0>&`K7|%;)-~XIL!Cq{d00EwmO=!jCK)3j0SI>k2-XQ$TMe2d$L}j*FG&39^OaiI{aQr(P*P zQUl3bJM1VZ!YePP6ew~xLF7eHP*5+;!Ks+6*qAwtDf;-pYEP%1G;5}<=T~C7XY&LP zO}?9Plsb=R=l9!j&Eb2^ReOMxqelYT>LTT|=$2%==;Q@(VoS_1wJ*|p%}4jeyCslx z=FnX|x-g0&XksJTCQT3p4W*NR}&yU8q^U z;3E`!FW)U`u2jj&B*HD^11TnEZK*@w?`tK14q0G;W_=xH(Wwc$4%leET3WTy#1$AK z55ZLN6-`t{VeQ2zEyH-}?*jL=fi=3S79m{#;KFwhu!&kFFtDkG07nIYHePq@G5@Ds z9Lbp+8OcwS5jfpJ;n>3YB!kc2|3e2E>Ysa#-Xa-b$-zOF_>k~Q+fO80{+1rU^CcIf zG>P_1ErVz?JKtf>k}sA$Z)3|YCmyDrqEhzn>BezMpoXkeMn`Z>*~Q7|oozC3Pk?G$ zXJu;X@p8jp{QZix@~=t*yK9NY~%6Q;?^yr5fE7b3LO$orY>t+-lB?C>Girz_LhFPPJC36p# zeGvnG@P9*$pu1yLJ<G&?PS?p-;!VZV%jVh)%gK z_4A&aunDqxWU{;KsNnZ&-5APAP8d5^AH9edm&b}@9_j~kRzTlGnFUeJsw#}vPW#Lw z6gSiq@rNGm=RPDM5#)>bwoYtw4N|^naw)bu$2qWaZJTj8=7DP*p(x;lZOgRYVwe^* zGaAKxAZQj69&R-QC%JEh*QAf)PQCFIU_^(t=%*XAO)~Jmr$CiRazSk)vu~79Gm!52 zy2Ood+TM8`Su6iod{;S7Id{r;%l-^n_WIxYyD|(XJx3eV#hRv>2b$4^?rcI}B6e;a z*spwfq#K=#r&&_iv4{w>@a5B{{=J_J%Oah0LtcapOB^qU>#Sj91{5RC$(5H@Uiq(fq$O~Cmvo>1Prtj((wLRTDKc1lS$0#8d5ZFaN3!0)~D+aT^!C@yOV*r;D7`n zlme&HDJ#R`L@TZ@lH51gQ_S{5^j=SBevi^CMVp$#5v40rmXkh|anG2#f+gCYqbenD zkosxYS&>Y~@vppo`Uxz>R?Il8`S>ezLyYJ-@*6c~)%vpL-d&@C9Q{VVt?;QiVEk>0 zyLah8PMGi(ZJ;6Ey&m?te}1+2#*RH2wQR4NnpiEBwabhCdU7Y zi!ke`z_)iTKn@F0zz2}WNznFzhHda1+49j!+r0G!=Nq(4>EmUcJ(9z_2XG-%CNkeN z{Y%7Mr}%hw1$0mM>W3;Vbz+Tvw<57Tcd*=Q(0}g8)|<(%-WC}&#dDKZ_1t=YaV<8W zp0r|@7}^Fom*&&x?J|N0W+1IWJfX9Y2i2djh`-dYBG-|EqN)wbXKS<|UAg7`2BWUN!2GPy2LefmV2J zRtF$m#s|+9gm-tuYaYfgZ?+Hr*uGhp?5&qPP0utNciLW6=?x2^X`(`?0uJF#&q<_s zRE2{kAjvH5YS|=&JUJIG zLZ?o!%XOx{UDTfFyK{vgpN;^~@L|?*BSze~8K$|SakGQS7$5J2$UHAKn8FL3!9732 zE|xXM@^PW2F-|ftyC$`3DXSw{TvO@onDdwEYDaezCkl2`ze9XsYf`-mPJU7wWRYX$K<_k^mLRO ziq{YwdFkkO$ioQZ3dqzBosU)Ti^XeJ1)fCFD0Ix@;DrRjcd)6t0Nc3DC;P{|BFY4z zz%z8C)YRz)F9xqJpj{t;4E_}OI|`ceaMZQ8C8e8y!t^qOw6e11?IfMA21<<7yL3l| zTC+2Bk8AS;H|jK9{!mFaUq#RT4srtfZ>Km5usiHqdUM97<5@YAR%O8f;PD1lEy)Wq`*@+H&1V@iF3 zmsg@kBR@sYgT)|tv=2wh-`21UE}LwkwmFcpYd#g(pA`*$nLF0j_sThytGfWyLUh|?|U zQwtYpq!@-5a}c`31>qCO%hfZ*-j6%;0lm=5c2T4KHv^*EzGPp59BG4W{FIp-Zdwt* zwh?f%*;Bqiprqy+4319?O=YzwWzP6%iL>4n6-x}^v&BKoY&m)T?XwXo4^$1u4i`T> zed=s7ewGex*pu&8)&H=g#I~9k^ySHj-)-x zm;PTCg;QM1(%OYtB=ob|+qHkGKS*$ZDSpw<6|VY@)>7cPL8ay-FaKM#?vSC8^N2~& zeB{abH{TEW$CeJ$CfNS2~MNu!~fE-3G)>=P3V^Thd`yTW9`)fb2>^aGseL7d9|Iv6`VB#afs9N)iN*j$X; z)wuRqV552EwEQU4xmZhvux5O&4@5THfT?S@h&TxThA(s}V^WU}chYdwYQ5PMaV+p8 zfBQ952urzk@qrKbVCDUaX63epc#-W}N;JttJnf47HJtasez{N!*%u!y-Hp3(uD;F& ztS~}CILx4NARX(y^6g&iT3x}A&@6WXYD)s(g0mBVVa*?fPG~LF8WN`>F4S^TQC;oW^UZxbI29SoXtc=dLqTT5p|~zIt$q9qdps z%>c5FIN+|@F!!;*a>cavA6(+FckOfpF}xw)hOqibpI>4mYA`nu;Hc zI#4`m+ta9Bdeh+9RzeukvyJzDwDZ|siYdugMrncWM|oL#2ZRSR3zf5YY;;R^Y-l^YZR&eE)h-R;_6Dzmopzfr|*n&MzHr)=R zH|B2l37u$JSnusVtGV;?yV*L=O-a!7Mc&O;@9b*guh79mjk6NJjnrWAd_@S=P4QnC zd+&I*zCV7vTNkQYd$d*6*4~29R!dt&we~EEqGs$ww56z(mf9MvU0ZD;YQ{|Lpu~s> zLWGEj`OW+Dd;I?U{_*`I|K4+Q?mhRu&U3vu2I;hW|FiTNtPJhF0f+2{_DNrm*1Yq^ zlaX=8)95fHoPKQg3kg;KODZRXUie~jwDkFcz%3Qog~|w`tPc}rCv1PIY$+PL@@2=g-!~Oq2>W=s>c9x4L!}Mb1iS zmu~2#n_(a(^%yTr)KD1n_!RJ@YMZ7GND>v{f&F?%dqU zJA3z#;KUhlvMs(9R~{m~Jqf1%IjRZXtT~X46$1N#-eJ3GI2)mwq8gQUvpTY$Y1TY6 z9)Di@jF|tyi~)3idq?;v;HP5a;#p@))m*5q^X0La&Fa}yoJFSlzB$)}RIYYQKkpD4 z>{yM-S09KI>9Wp`VS%sF!1Sg91sieaF2j}_bvm2?wkhLO9tZDPDw4tLFE(oeg#zFI z=-W3NFr!g2Ityvd&p1hGn2U5?GEpU1=9bEkH)cir6K69qgu)9ulH^nWLas^4xv6TK zY63yOo$i|c4-~S|>6Es; z^4X?xea$xMa{qBy3|`3Nab8n9%h6>x5r=~7Y7R_37`0qiZOz#GaP&yzgmvty%f~ub zwJHaZGi6@uhB3*g@e6drzrnUwtY5ItOJs}s}-{DYEk9 zh7e1+l;F*UN}Z*v0vD_F9+Pt!iund9yvccDQ!cfaK+ zC+?Q}%q6S2%n2@^Z&B4eF0UWf_a?^u=h4p8d(r5TzwXG>RACjB|)+%(Px} z-kn^}{MF7mlU6wpzg1gAWt?|*TI^r#hS6Rqw_6KS3+KK2(VaDhL?A}Qvs|O-x&dh_ zM9H|ROg%G&kfuZij&A{?JJTi+-R5JH)7NLg@4l>l6L;N2xEMD%!Q$wfUJ`w2zl7jr zKM3;Dv*J)*Q=Te%pke3$+{9wXYaK$*T>lIPNjWDDfP}Ffz_LIlGn+GY-E)i@wBX`M zpHii|<;Q^>BSZ_8*CKn1dWOHFMOlnBDhK2cb3FnC5z()UM3<6TV z>u6=ykHbGXR0LbNOt#lhXF#>w@%G+6O42^Thh+9+^2)sMQITKF1hJ93p%UemM*KwAj<<7?c}hAHbFUb@AB8M1 zJ)USW);M$2r?;X3cSde+PJ`EATMH6P=jrNOe^j>|ez=&Vk{pDXQpCxIdZkqaF=%mp zOs7U1S459y*mOfDCRxv1&%s0+?OW5a{!SiT9PdVw*vo?TY5; z%QTAbx1Xj7*xQwyzyjcpGAxN8dbRY zgCmGVSvMDZ|50@Zn`gX4Z1F1z?T;Vr&A*qX+p0BR-F?tsBO-kom1eLuw~$62s(uYu z8IoA0L?}(+c-|N+06X}Q>JtJJx8oVD;)$Wd<;T!F&=%U$Km0ZL#P`&Qa=f>>QUcwQ=xn)yj{5bs178qCoW_GOwXoh25y zZqH0SxRH$9kE7N>1#Ml)&A~;sT;QUh2BUgV5bUM2lv8|&u1a(tq&l|1bFG+Zk{wVe zp}xCN)UbkTy-d|+hPRe8Gq>o5cb=Jey80*3*!rU*B2ds8VD)|126kAEn`#&L_ zig?nYjyS0f4K+}Q3|?_Y$_xC+W>OvT#Dxl{{a?r5>!&V(=R!g}h0%0isZ*3r7LP0< zl^ympR9a}hTtx@G;8Hnj@?!&J5;l9)6r92M^<{{$Ef50`uwUC4OOtA+^e~CD_=tKe zr?iF#cq)kqPlm>By&c%mI=<&!6TnOx7Z;-bV9&2F$TRTOTe<*St}aM0;zON%ohJgHYd^qr~<6s78nE3{dirhtQM09(nY7 z!F6M8{%Frr3=v?Wt`GG%ns^*i@&oJ+jp0t`2~h%~?AaoD_Q8JneHCOX83rY8Q(#bc z(kcW)64uZ*Hi$tz2c-INVS>isBf_$ru%-29HDeoRj+B|ls?bgUEMVT!uDME;JV+G>D;q;|_2Y^<-Zq=)RXX)zu9&4 zWPr0sS#IX6Q+kZerguM81-#wQ9v^H`6>23orOl7!)i^H-XyZNjQx_9@#R(Lq@azDo zo;8RF~)LI!R>Lf7W%Gr6)$`Fw(;wHS`vaYntFh%APx($nRsOOkN_GC#AOJ?^IRcwJT^43xuwTc^#kFbqEcI z`tR!^FQpE|DxW>Fzwx_m%3ZdS#f4FU z-1KzOQj=}ZcTJ7QLbDCzc?MHIt-~~WR!x@CAYCk3-Yd5Jgn}gCIgJ?gu6!gp8U??< zRrtkFvt4B49__zr51{?Vi?g9=%t@Dt!lun)QtalUH-(r-k9w?xOHFpD)<32yV;Akm zj)8e~Xtt@fr429%a(QMIsCzthSF?0YmSVmrt3<0u?&q|aLWvu*LbSw$U3P=D>#x@V z_Bz2y@|^Zw>c~BEi+3<1uBGDo8%;IS$|`tMw+K^qg-y`$DCz8z@#?H+E|nCSoRIdI z=rupvxW0O1T}xnT*@Ss}WFx54(y!+3#uMQTougs#1l{!ma~sF1<~`)qP^?Wg;dfqZ z?Ohkk;&m*&4U*m6Z0lDwt*1+-3t13{oqewfddu$@ZUnU{QJcYHa}Kqj?l^IH^3QrD z;K*A<8g%Y$QWBxD4_DS{=&m!nP|)Q= z5C1{iO0AG^)z*#5M>7s#^o%m+tbygjBI28n)7x4wIkh^~7R)W@qd>M@o7C26JGQ}v z!6IMQgLwHE<;%W)(q-$7A4l3T^g^3ji14b8`-bPvwUGDmeJD~TT?dwSx}pJCdX1Qr z2`a>|RB{JhAi-6#k@a}^qTvNeK1ZqwU>1b!?WG&Kq4unP4zXYOXP3ndA(tw2 z*-WUseet~Hw@a4_UZ!|BQ#?Ld266vQ3NFmy2X*bIqc33!5vbKHhFQ;$K96wkhLNiIzmLR8} zv&GKp^UPh4|4}PkIflu7?jvn3rRUHz(9M9X^63%YNqB+RPR>EdOcla82FP43;m*x} zc+j!B5Lk7u19)tlHMtj2VHd5?488|`@ppm4zcn_h5{`>4LSy2S&+kY?%LAQB-yC* z<^Pu{O9!fR=(g9uF$!K$6ekXwI7bf#Dmp-OZ&sgOb1&{_>LosnTfSJb^CRHpTHv@^ zQ(F^%^TB7PU|{uMi`9MM{5yVPHsS3VQ};t+%!>#dzdW^ZJ{Lin2O#w3oktj%zBmGQS;dKPxL|Mju?oACO&_m*)lCQ$x z4v(a^B@}730c@9?K_2aERQy9Ice{zKDat=LSoco;xB+B%BE(-x?dFIMo4z$}e|04( zIdlCkuk(~*r4z1#XQ9+TC+x-dfF8FM`4!H6q4R5FeyefR;wKG{n_X?!cp8OHRer0H0pFrz^3r<8v3MAqX8?g*kq(`1o_ti*)}BpHS#wG<(SO9C-|Uc z-?ZiQE>feDvz|#Q+|zIsevg3>;WnZ+ny!hymW8DCsY2*YbXNy56D3}xN+fm7_| zZg?mCTlwW&_?ofz0A-S#XTE0PY6I!i6Vw7g4Iz4>^UM4oq#T zgDJM(2N2|GtmY|AKdPK5Gndz#x5#{5jHW*p)?cb>`y(WOjlPE-@Y(L@_O@y;L0}^^ zLZo*E;@0A#q{hK2A-95W?e0fwpg;rEDXIwg%Ym7*5L5UXSklTLytbNdE+w{6>PlQE z;52LhDY`9*S;c@{#~ASC_8y3d*|PTZfbukh8S3e#KLp*9I|TWxl4{%{O{lWso>c9&7`Ar_+!}VJ{dIx>!q4@b0E3 z9P=j-E4w=t%bh3R^*#5MM!Zzs-f~4&ez{gWrK}M$ zzfg$t3aID}xEUeH59KWgv@Q9oWe|Jtk=r_i^WGWrSjWz72B2Hi4k?3ahR-j&qiKLe zhBMZ4w&XVMOQd)#mY*CV@jd$uxzS*6r6E2N8I<4cjK( zLzD058#}y$30CKBB{FoLhrtZ-G%HXy`9S!B{h?kd zGRsi8+WNF-l}>etk|T{2#uSxRyp;${c{zUGBdxAUnz)u zy0;Uu$9n(fM0YVdl0UA>tqSdA38sIW6tfX)Z^AGc`-$WQWT=x5FhU{*$t!N(R zs4JG-`gGFGeb=Rmdhr{on_knyPeW|DdIV>f`cc}U(&XzlunaJIM*{AZq3MI_$hq_B zp1(+k2aTh0JboD>oyZXrh`yKjLbo@4@{RWIQFIyZN7!vK%%z$6PPXgbWqu&**g zprujANLFmYrv1whpl(sVCF-?&So(P(yp8PvQ{%mVnTZ-AI~x69)*lR1q0 zztm&B?0wN5XjUHYC2num+|kDr9_5fFPPL$R*|2LVCb|P49!xnKtg*6JvA;yc45onz z(Y6W1Yj#I?Kc%cyfK@p&pTf+G9Iu-az&V$cG-_Fx7eMZ=2f8cV-xEMc@10#vUbksO z&dI}rcbT++*R2C%#N0W|FUfi#OD=_MFQ3lF6NTIyq+g02Ga{@}W?4}t&T2po;RF3uesjcN2yc&j;ei3|F6kq{aY!YB=`g&Z3H zqrFS7FL3Sbl(-eLR0Ll|44vf{-g%||*G)nNCQfzjz%)~C-1@1V!~4Wpw4blZk#x0O z4FCUU0c0p4$E}R$_fJ4QKXE$D0=rqb|0+MPLe-0T>Z1K4I-fr0{1eq%bLIQ!P1KX( zR|v}H`AD;Re1F};ioe>=?15hC7V4QqTxNJXg_)o0idd1L8!i^g|9{7k|_+{zskC*aCpi2(v|t`!Mx zp1e=Lp!|47`4WFNWqVU+F3jGBdHX;zXcf<(kKi*>86S1OFWUby)&lfxw16nT4H4*H zWeOQFW7=YIm}|c=PeO-KPe&i|5l`7vTyj5qqnb(Y>=`NtPO}pf_7IPXz*ie)!Fqtm zc<~pev!*k0M3FyRe<;F-=S&d=c=*9uQ5o3CMp0$oxPQ+ZtvyTchNo7|cgt+8ex-iq zy?%jS1m}Vo6!+H5ao5hjSK4@f`aUP%;%eOtmV$B&_Vl5n@)`6ds3Ztd4}jGU_m*aJ##$yzH?B`3p!UY z(k=*(u}V^^>9S(Ewq*GVt^p!|@yO7;t_K!7t`}4b}OMm?<#%0a@<|MUB}2d^7Li6wDZoY+eK0q$Cw{IntbPX! zfJJ}RaLum6qypLJtoWU)oHQt3C{8tACI|yca}?^uM#yX=zKWOf1$|m%_`js84r6w- z#PebTEMST0-*!~tF+>zdA?!<#?{N`-<(IuIYQ7NPCwsY=RT0@kU>W90iHDp+GS2-s zew`fhvUu<^JD|fkB+zB_itq&0t@(aS;8;uUzn{xmrQOl=3rOzG`awFF@35l$Bjy~B z?eyv_Q1qmTJ>GAixZ=`{G~7==KBt(=iZ~cz-fM=e zmXyn?1#4M>6^{9iM!W{{D6;PKyF`@?pE-8IMfS z))ekz4|)RqjiQ#(v)OBI>5dXW=%t^A9XYGbc2#Fdn;{S|lUzFv3|d-tKMSiQu#vQ?+=#z1baRor?Fsze}@XNnxI4H;QG9}AS=f~upfIfv$b&Z zGwF>yxle`XBkrs@g0$bc8@Mpd;(?rFb(#BL{uss-k11O+&hmqoZH6Kn`-+~_T!iL) zyWk3n^)UFR;i+yL9nX8D{(W@Q&=ch74o6+HaG zQT>R;C?PJ3&yiun_p%JVu1@q&z;_kzL3$`rNsW*CMHcLkC4_B}? zAML}Xo&2&Iuaif}Fu--W%t^(a{Tt41ezvE;Eoc+TtcR+a<2f4w^%@yLk2ke!`qH>U zpOij|(A*iUnd2?DC&-aGAKWUfCq~5Y&kkn(3&OAIdNxRJlC*gT-R9=vuwS>Kor#dZ zfRlTwl7Xg|9iB+ypI$O@S=9^70F^F!u?@H)Om~k^a5d*}vb?J(2Qx9U7e~2m=_#ntwCo#?Ii<%ll~hPXrFqfAN-c&Qm*`s&nhGD5$*;!cM==fwUG1|1?}+zE6N^7dMJimPUm=H}i((Is`6>}3lZFs|{|_wt3LopU`2 zioE^1egJEr$H-cCAfz9)R*_}M=ZXXKYBi>RW>Qv!*eE!KH{ z&4^>NZTtdf{C~jgJj+JAyS4BMO)2ChGf%Ef)`f1eO^Wh2?kr)uC4o@(ZS_Bs{GP7j zW!2!rdG+uef-Si;JXLH)R^$U)w zzT?0e5HW(WAAQLw&uX^V!Dquqd-K%mjWxjyDlZrqduL!o1Pu2|%@eab)aB$nWvgDg z$6fjAvUQkr8Tjy0tKx%M@vH7*+*M4PgL#$Wcw}11a-0C*FF^dpv$)Nv?gO zyI-t`&|t`-L254z$xy~)D63&`tt$;Bg}=%;q&kXJY|rUDGk<64XzIjoB}T63yD z4oN<(b88#7Q87ZHS3Z>!I^ej;e&g940Vn9y@=)@xjy+-XL#4C(3-GAbF$AgKX%7GF zRn&s3v2C~D#6hH^z)O_}Rd@N}4v|X_CZWh-9Ous0R{If62f?I%v&LZb0i z%hdZ>&A#u|%WsjPiyhgeHlw1iuu&WKXzmorb`PsBc8Kq#tTb-2>s2l-xo>Qh>=$4^#-MT&8tvFe z09%8NPVuu98+m{laqtOzmmcX#XnA3(o0>2rvk4nx@F0q@tO zxBohHtWF)~9rU~yctcKg{t|4VZmK*zcMq2@J=gsl;v~0|0|i3Cms9nwMP_zS##-be z!~gRtx?*EB_nw$~{#tXS>;dC~zw+x4$eCorJa`7y#)8Owb)Qr7U*dVMVI*txp_$gq zoX(CXxSpc&bGAQYMyyMSJYS*c+Pt=`5d7Yx_6i0Dn!wf8qTX>Y*;D^IGB+5I0PubMG- z)$7i3C(jgvgULd&n81Es`R~_ceCVqxZYH+sRa6m>;_Jq3phb~CpsPCP6?mMS$V|)g7mzi5;YJ(AX0u^yL z$FrBrO<|r$euzW+1Woxgwn~Pq)mbbwMUFIW3AcOBB7r~+grsGtIoxE!6+&C3tq@3C zv@PS`vTwsg6WETC-t|!7q}Lx}gy?v~w@dc|MA}IQWb=EJxx%vCj`F$cqT{=<{D;ro z*7B$%2UdfSc_e}bR}J%oLYOAW<5v>1!xJ!%P&>hNKhHlB9hDfgi{%7!|9cGO;WO<$ zabJBxMQK6LFgqRE#?_%VBfq|bviidrPR6mg6S4U zu1y_{bqCYpMuFL`WA2l<1-Oo+57xRL29kAtK+@!z;kJdEBj@M)Mo3#(NzyjG<+m-2 zUrB9wY`Vb#nSJ#kGiH79z-SyCk<-1I9pr+_P=c5KE&Nn z5|_`#s;OK`zDHM4RdSZkxpJ-!3=3Wog)pC3Le6!fV)a1j;iD+|&tV)x?%4w%h$46l z1arhOV|^E1B`Tz-wkTu5FrQJM)N&IKg*UH8`t8;*BgDEh-JGn}vV#2Ycufmm-WwQN zvI_ie<4)ZppV|2(*MuFwnH(v3wR5$zaiBNhzRIUY^aLcfYAQ) z;5B#Uh^lDk+TxAyJn}ed@29@y8)$6tVN72mA?TyOv>Y*=cN*2pAHN?~>KhqcTqO;x z5$+`_u`_ui)E_EhcR%7Od4(bKuBUHH51e(Fb^_ODK>44b?GyVH#;FfHdlo_}vk5Il zYP(( zlZ#HAW5Y#?pKLCbTZk5aW|LcrMh1sc_t?#5&ZiG^n(AV5Vz5uK9tufTQfm(t_pfNS zb6@L0-JDCbL#Dt%Sz{uulR7YN`nYpH#aozcsW2A5UlP{$x!G|4z04Ehb++p0*LSCi zyas=>x-<6J_uqyu#Z|ROrEM2F_!<;p8p$Bw*IR*^tHl2s!;JW7GR|E z(B{O|C&GYqC>!2pFT}52@8=u;!9Q`{5fqod*n{{lp9HHnQy;t%34W-wSuaM*=CXk$ z#jsTNPXx|Y%`9frdFqEAw1;}_Z3-XE7Gxc?Ze&9D@Uv=%E5f12+vEWQ18Lmh_V#LL z)80)AzCB|kN8|SJvEU*338Q40wqndUvAa2j)h}<^Djgx(?tdOpM(&&Hw@_v@L-+Qi zk2nj;L-#Ron^3M$i?~^xmeS1w`%ppCG+H>elebI0o6N8GB}3j$^Pjw|Kk-r;gA3O9 zd9F3nd|T`}VVn1CD1BsByk&!4S0^&*y3(>NjaD)gp19;@Y1F2FM$nRWj?Wl8)b{w> z**G5W@+8md8Phj3HqacNRS@GS!F&a|9rv$vVvkqa+8*4K@BQoD#lu(%Ph;ynM&U9# zr;@F)cBI-3Byum}`_t!7US(f61(U59tZFX(Snq8+OXYg(mDnpJeZ=*>z)kE#e` zL``d{xs5`Y)jx4HZt0ZunIC~b6pN~oa-|h5{SiQzBJvsCH-o$*t;-3*M8E8qg?h{ry)og9bqi-SDuCN{M<>lZqJZh-#x%C zE<^T@D9c-6F*dv8Tzd7jl6bcKv05`KGr}1V4C1}ziI!c}`9-J+oVfTJw7RKhS8xDi z+e1fZEnH~%ktJ#sr#F_9<*-dWo_mydx%&-~cB8I$O2efbS z$`jv2qp%tdZ*^AKgPU$@!LLrnj76Pc7THsD8JnK0fQGmgJbKBf?eEIm4rMzKc zAoZ+{G>UqXh-B zICh;>2TE~Ec_dxp_U}cbxs*KWBGpbkY^sS#yh-Mv)4)`#IwPAFDOOn z>sOeE9~n@nb8m{TK@3P_8vVO7k|@SB?lHdk*ujKt9)H3ZV$t2~u{1$|tloh9r!O(c z6UOGU7A&?Rd)L@n-fzkOJgK%PXX%=lR5*{&`Si9fJhzaeJF(rzhe+KCY58Cgm=^so zewsMv-k@-{^p|L>62JD7&!0*`T|u?7&p#>uV@2L~fBVuu_)GqRtkqSz6n^iTRh2I}^2_8X9N3fmG*Kqy;vyhk7KH4`p=S92$Uw>)TY){<_Bi*6K=*wx;Np0=^Y!E6FpS&%=g zL3s^#J&iQ!TG>-00#YD-LN#*yWwwyFxQ#fk@{=F?S#3YYq-}bBAB>Bg6kl2tNJ~+Q zL<{?&wii0yshA)|%`uFGtoR1A=VoKNpN`>a7MwlPQA-a)J!f=+#K)b(&)U|4)&byq zb+6SN-hti;HP_ppEXf2hJ9N3-CZ3s1kL(up?{ssV;Ug_DBXU|h#3xTZTj>NNzt{SP z$V9edzEQUqw7R@}OZIhwiK={^SOpW>pF4VgDFM<4j=K`PBs*ma{f)*E1A-7VnS-3( zUH9Ue{R0p{d{TY|G(eh^Zj|qVoOi2YL(k_uKzu8D-Fb5bWz7vagH6?%@Ow+RDH(}_ zi4t4;k56@lS`yP!DysnqE70BZkz2PeFkbR99sd`%zgl&~wi-*VW#RI{e63ny@c=61h5dAk%E4 zmyor4QEF09VdJWJP zx|_{*RdfvPHGIyk!x_*fm!efIqV-TECxXuXH~p@Sh>M@NzL9D{4(M*#UHc13<=$Ux zRmL2j$G3K>$1AVXFnmRV{VPAAAKYrhZx6dd-HSzaNZveKMXDWcY^>fL!A32R(sHl! z>MtM17S;bLsi=*ppr#k+?-TgPoIE6-AS3MJxMW%wrye!M*PHx=sa)&-)1Kod`RF&d zkI(YdTtYSU*ZoNH(90j`v*RzIAF!*~XV{+g(HMmRU5G3PZ(nn4@acy+#x`H2w$7Rr ziK_of(jkglQ5-X%^dTGP$CxukOZ6yI+XH(>Z^1E?(M3FV0ZfJdwweOAMr=q4%{PYW z&00?%)_soqx&9|^05`}8boMy+jUz+nE#aKkdp5hUC=K+=A`dJqUhmB^#7bf9rvF8x zCEz|qMA|bSMJuy6PbUz)0_3LzT(%p z)YLQ29&y}#MyRuoFonO>8*nR2C#QHCv8q2bb~El@8Iqi)?Kkb}MD1%KXu4j4>0RF? zLrwV%;)}D!)lPgW&QHEmp>o%`!Djn+YU!T-?`-#Wda22i)?b2p!1xqw7y3N54xyX#}LMn^U<@0+MqfsMEHhYS58J< zfb^VVBPYyzb|RwVQl{{B6c#j;^OIx&qH?QGpOFfTV=wnZ;x@zL=Gs}PDPW z#Sj+FFiwP?hOQo~5<@ih;7^M)W}L%N$4M%(B>MLqZ(s-o8KgtQ)4HWve2rsMo`sa& zttB&uHvJa)bx4}(>bYv0a1-l-svsr!b62$qtE;>d%vT8~J;QvHdZzBjHr{=-#{ZS+ z^zl3_IT@5}WhV-*@hNeZH*lN5|1=0n;7vIMW&ny;-`Y&2^~o07cdSBoe2KyGzBH|# zUyNRZEPD=5mituD*hYVvuHv}}Wg?H_Q@^7m)ZpR;eo*UOyW=|aLXoPxt(+?hB5ElQc6Jo%NGkP<)lqHg| zr}a6W!jQJxo_{S0x#k;F^`LEVETX$OXUzMb3;-ASg4fQ-(i@+kD@Uw(CNgM`7PC%x zyhtnr7!k6Cv_-=7LR@7GH;bBhT_`AiFyXu_CMT;l;{4m!_l0^YSVg#Hb2Po~-&s)P z3cXSjZt-)WsOAd1io#X{x-0;+_&fD(6Fw6Bu0Gl2BIt9ex;y$)>jtUR&&Bb&Cz~jn zoX_XqzYGn2APm{?PhV!_4mQFd96S{{R9#ISLQkVg=Igu#RO;pLjUS%l!*t3rYg)6%TEM^DHP;P>_g4q{LbCH=BI60sPj53{xf<`f zC_>8*Z1SwUhFP6+@mCr_&)D01-@WC8`rvgA=}S3*#r$me*Q}t=>0rIhF4Mz-vV+80 zYM^utdjP=K<&e}^$);neO#{}8RG3I#mwx}0akZr|qeM?U1-i<|IADfz)aHx70+7q6 z7nnUbUeTvMKC#ISE@{7>7x+@5&x9wsemUmx)A^P5D2;P|Dyn6BB2S=u9rJ(eEd|@I zz=AG`U0(AtMvtF;msdYRv0_2z7o(oBt}YkC z&r}9+VqLLNZMS4VXN`)m&O~a^X29_i#(^fIm~ce0l}M3V|E`-N{e1@be$Sp7zygEJ zOi$fyYHF%9??WkqPQP=DfqI;%l-i&Ol5eQD=1co&>;#<-xCHm9;s$Oy@3PI!w{}bj zwh3`m9I$7!Th=#GC@0D4NN~$^V^A?-ZvgB_+}rQn4_(!ifN2~yXRcJhzq_Ny0=P05 ze5#rW+f7o_PsbJg1pHWO!_*5SZwapcuR06?2K1IsD2-5&k43+sxA}{9#-DFaTeh&8 z&RmQk`sVX>PIW2Ca+`dI>Z2r$fbUHV~vb zXr%JS0l~WEAe=?{gJEbO@ZSrsQi|sE6s*r__bZF$aw|I|b8d)&3XDD246_s2B@03( z9Hiouw5HFbm=U<;!LdFqT80l&R-b;Kj`fhznMzC@uB~58{BG;BXiMGWA$+|{knA+> zU%Yz9o5wd-ieNtK0GtVVo&(cz1DH9hEj5LLGj0CS8lDpaj?ty)I)^o8UG;CXs&r>41}UhKGNeJYOwbdn!lJ4vYG2kVl*H zdog(ad!FmF{Q5u@+vby;s=*E{Pn)aFbOpAa7XSL{6KpjPdQ-Y_RGWOu{^L|As%EsR zV#u_Ys+x1QyuQ1XGg`xle|UfR8jt^vokFMz7Y}WA{2UwOzVEwM?Aen)a>kur^K`Jg z$HS$vxVH{&f>MS3IxL#mJS|x;oVGL<*6eDPYnEEIdmSd^{;|E(bYTz&KVfLD8|WB% zn{_bHL2Nv@=M8av@hrmrRxEOAI#Iu5H9WVScoW+5^eNAtOos?CQ>B_DcdC6V&c16# zWx48R6-tqb6l8WKx))!+IpOnpahg!rAo9;)&{DtaqL?{8D9$o#;VPS)z7{zWB0z~L zZn$N4zDkxM4*4cx)meR2@3+9!+kY|#2^k5BrobZG#(w}KDTuqEy1}7Q)~a^;p5c4e z9zKCmjqRSskGCIO%pDUTOsZc7E?S_yDr2u)%4wG^s(ip^!IE{e@tlfnRuie;P_Rc7 zeqw$OwDLjSR`EQQmfw6|sSO)+-}zdx)x0igzPZo|otGt2@qKs2n`0yb`w{2E_w#;y z)r6I;qJOlSw{75&13^CYSo(WuSW0h_8+R{G6t`LTTFRa?Du6+@`b(#itv(>b^n^W5 zjK$eb@b98$=k;w@Cq_FXFz1jh?56% z&qKc4i%VTZ=3^5eU+#>DWvb^WU(E|9wjupFGnsyDEI3ss)tEusQLv+laLyNEChmG@)8#QEy51z!NBTl;6{D2VV5R9G96w-P9O!dsa#ooM2d3DZ0@usZ zeq;Ce9vtO|5%ZGNc`LqXWh(>`a1j=H31(u+?L7GO^IU#7f!OeSBiUk~JtO44X@b;p4x=@maz>+GKuhQLzSZvp;*!+cr z*Y&lyoLjd9-r{+hBA@&+IP_n5m;olwH45MoNs2AB&phn{h8H8ba;g$_17hVn_zDPv zs9zwQOjr}`o44Y0IFVKXwAIzG`4c*98AHmp)X3%8c2BVAn znS+&y)6zIT36{`~^`=}#8GEA|rH+h|Hi#5bz2Ek;c(iKV?iKd#cI1)H+dgel@%YV0 zZnO4%E?WW`^|m$#3#dNg@#L(8vh8l^R<{V4&^s1GxC-5o+DK}S;jY+>VSNK7iYbR| zb`vEvR)fIo{111neZm5^d_>OkHx=kOa<s~0xWAr#d&-QSI zY-%1%PzaXSmA>2m%67(y#%ATPP#m;)VQs2_ddnS8qy>2zVMyK({%-1Nd!M;MkBu6( zy5-Y*Z(viYDy=1%8SY`@_E%_#`{RAgA|l0#C5)B&8X~j32t|@oxF_1<>J{8pQyt&` z=n%|A5#AhoKw#p+v*0K-6^C{>mVa-y%le-hIM9ef79w9ki6jM?s%%^lG;Ch_+CayO5K?GGiUv}?5Eh~-=h;XlqHf#3}S`Ll6-6zmtJNi z)|@lbz%_%*AqUta?FRqt=M8}bIkc!!=;l0|#!^U?`w4d810IbvL*)J2(%62$Rofv?iVN3}Igp&3uHm5Qu^S@-^&8~B1<>CoBi-U?PW-<7p z-BW<^jtv~VoZI#@HS-=2#3cL+wwCEuSTKND8||17{>=m+Padp8&&}=~ZE_QtICl{Y zr?QrEmady3py&?p=9W2bb$9XwL@C2%?DjK476B4R*FQYH{6=RbHcntH`5!($QNL$i z@l8=AMNK=X|D%-rZ50LQXD9iDsYZQ?GX{cM0wO&h2A)+K3X;MohOxD)ugk;K1)xIT zbwZ0d&wVsX2=%JT@yWDAo)}ACyr}uZxZJgvb2s>%fQ2UeD`lL(79h?ZowSv*dO`em zdXV0=tc04AS^I?rigDvvc#vL4WBnqx_V7J1tj8G(9&5IUG0V?RneThf;=l5*_?7BZ zzV)Skeg^E8 z#n^jS{tsL4;?MN|{*PBG zolsGfp;Ae5&S7lx>g5$ls8lLrAt{6zjTtH-$GvhI&7qQnoRXN+gc*jF)1296hG{dy z%wc}({ds?Gzwhn$`~CyFuE%5d$Mt+XuIql?uib_LZ^%+^J9%bC(Pg?jtx5*3c-mij zg=?Iez#nLH0oIB2ZI&0~m|}WB-Ns_^Vz$bbJ+s_n!l*MJ3FsQz{#{ztXk#o8q%m&g zvD7ZQDa}~{4{Z&XH7GBl=Xf63R`q=|^vTgvYVnsa&y}{(&W_bnVd_=Rq2;4N!pOy8 zYgmNnW^fq+Ce7P3;fBVr;cXF({%+ca`-QaUU9wPXc`}nsCFk0OB7^5Mkdv%2X3w%3 znUkln`tS3%6Hj6%mumzUOF}@v*$d{ZGuEu@ z*FxLV=3U3`1=4{vRLu=lh-S~=);5f*XhwT$+5ZS~3s#3#Hw+IJm=U;Gq{wGcE4*WE z(8FgNNe~*bE+_6I#7T1QY~Nhqz*dfw@`B`+$_{}*`;MzTZall7%iSqXw4pyg$2G3v zgIS-U>y0YsC$=QR{8tZdX9;xNE(#3xoaH^e{%uoV`>#-?rXgj`uoj_N({wxG}3Qke~0z!D;~=khi^^662FKGuYRJDo3&W z$2pZz3-@9j!-m*bm=9<1u}ne6w2>brU&jsLi=%GoWEnAyt9$UNsYI6CAI&v`S+Zy#IsRbo95Xl5BA|_5kCzD#hse1cbGynQ1k; zE8ggBrKN}(_xAII6Pvp?DEb~+eql!C_6F=)rge?Af85W-TN**PRk~N1rx{+Lovv>* zw1}RzagiS;|DHCoPg1wkZO?0vzqmi49Z;#lysFn1u$j&`=~B3D`#6z=s{ zy7c7vFYSmu7pn)VOojo6?Mz{Neb4N!JVb@Og6+@(d@0bKleO)-jF8u|=B|Iyr6a~V zb=@&@uF7va30?CauW`z{S0M}Fund7D3+0vK~v`QG~1P~r`Z*o#zp;8(vugXN+9 z-v|H6(JXm5xg(Z+L$`gX^83bh_VO2~RqI<081IZfUNWqD2}J5-f5Q0&%H{VdWVx*> zg8FZ0@jqH?B`LJnb+{+4J38-VzMfI|8@%WgR`BMDJ`6gN{ryetj<3!ZT9ta{s*Yk?^m z?NBPK`VqXq7UN+!v3A1NEg+HR>mEhz+)oMrfTmT2=YfKj?U@~%tig@3)<-f%f#08f z_akwSa_FP277NnKyF#UKe+@1W&*~UO7#o)9w$?s(OO{vsQTM4D_~q~X!GqJE7FzFw zUPE~AaO1O9x9c=B-nqF|cO@Vtl}{=WaBHCF(_@7E)$X5NP8&=G#SY8$s*VJC!d=dI zjgxcuW|*)+Ms#d+?}psJffsFo*J4AyL5{-m606xYdLFTMLG8CUfQdHT^_h}FZ$$aHi$G~8)eG9@@QEaL4_6t(NGuW&~-qZjxg8Ac0Z6k~+D zMz^Nd13tzm?Cb97Qf?rmX_}`ig1@r%_kUGv*5(9Nq?W=o?ZPSRyvKo~Jd8N!vwLA7i-3krMsXLw<8?)* zhG_NRXynfW{yOx*lD$rfUqYMWUZ|{1s=m8{-Fn?BH5mk0`mvp}yH&<8mpc)D-G`f# z;t@v2qzdY`BvOCAn)WXFR1$kAotl59^tztW(?oR$?TqBoG0c}Y-6QuDZiU<~^`K=o z6{e9wAQQGnoaC!jxX;pkJByJVIE?Oyco`@eVWJ19?q&y1kzV{f_ z>`H2K-dxt@72_#KVuhAZtjFyJddhJjO3ngqCB7=iJ#xbPD8rAlSJdmKpvAX!{ikZ^ zPG|Iy*LFq!@!o+Ku0a<=T(_TnFx1Vm-#;yz!suc7d53Zw-Z__`?-h>U`-oWJ7L4Nd z!Z4=|hKYylDbeRv<+8@q9%hlNDEl&fw-G|SnT|l&Ix9e3tPx~`kv_idOnriSj?V1n zxlu>#0@rU@Wn@@okL^^=Ym=M4@wxvpQJE%|MMmkr2g}k3d-Tfh$>cvb`mAABRCRWw zdD5y_cpj#Q1s6^5sqI-!#u)aooTsF#@=-~ul+cB4!0*wxxEb{^x27xSE!rVp2~?a; zQm0c$A5c)zs}5NM_K_dlD>YCiCry{VdYVWx!Dir@`GDmkmq9i6RhavIK*~99y{yfh zmpp~Bl}3%zL3?)9T?!Sg!Mu1Iqq-+Yz=vHH@o5CC{^Af`kg1-9k999lI8&-YWK!85 zSV$F~mlPY!$X}gdUDu9quOA4yo)5g>f|C&ToYb$1wD4NgDJ|#JeHeNlOUj=v3Zm%T@= zqBdH%TZb5~eoDY=`9&r6uYwN7qY{7RzgQa$SYPu9FGA0$5?*j$h`jMt;gYyIT+m1T z@b6?ph+J7r7cBd5wV%_%`~h5eUAXD05GfZHtuHeDabKCndEg@+I3%&UIem6@n~T^d`TvayZJung8WL!0i{_`0iiNa`{h|*uhZEFaE^-8J5!VV zG~Hx_A|`(2@z0KD%RL(NiVJed^6elKvDQ*fI`>aFSFjUwqegPhQ zRVo)aQAnrDGY*%-#(X0Al;YAk(E*Au=PcY`56snNUZ*`?PH!layfevKXy)9ilgXpSQ z1BYjgs>k!Ivw1_$z67|O11^qAa#5D>L*TrSYYJAxb3>LZ0+g&p65h8pot~RxUVk8M z`MCB*JEEtAyk*TOS4@G5Ua?*5LEc(R|FGC7s`k$=B@~-_$5E8Ovj*g*lO% zZZ5We@d)ktmzBdNz#RV6*#+zjVdw<4u=Y8_W_R>Bu5kSEQfpp&Phxo2kFyIsIiGgu z_A!nW&`_S_U67meN~J^-gAYclp^!w({VZhwqlQvS`dyD%1pT{oyE?C0;Du_=pjcN{ zo4)U*yf^5m_LiB6Vf^#-gM*lvVH#bQgvVtQSmaEPobU9pA>YXjnbdX5QkuyxpV|_IJc^pzhJnq6Xg4VG!X}^_92CVkN0G3C zMLNc=AIFXRP4jPRa%^Xo#N>oy*x%d1@XXIPOXst1!&wLK=plRg0yL2Fly30N@T)qd z!zeZ6jxwzxK$NY8);_DE3qbI@K&tCfnOpDuw`L5WYQs;dM{<{h590}+VwisMZ1Vu) z9tv$V!o%2>35;4hKU!G5dWZIj{=epwNT#dGW8n+on=;J)(y%Y{zn@|)OJL_Qkg#HC zZKCChbNwsR@bcN{gdBy{RL$?M<-&@H+Hi*HC8V~S+sr9LUwD~I zvd(ho#h4)JkOg9tZ>H(s2E-AfbssUgTaQ0!1{{qZ^nkxBFMrKYpUWC0I7xHI8(~S> zlZihf{Qb6kf_c`k^DxnvHr8yRV(Y1}gu5Q|-dCAeyYM_J@VDSPrnm=8UA`S0zdwih z4`=pQu?xdUIRU&q374r$e|U*;-vPV7yVfPT@fS@3y~WQblSIF?Q%l2E?8{G9#c@N% z>KpmsD^GXuZS8z^__iV;6+7c5>z-rHjB&jBQjkYEPZ38D$H&%jp1ShyI1L` zsC<#mwNvtD+sZ?aU^TWxeaFVF)kdL3e)jO?0xuxr>)1XmjrG;;F^p&;91jHt*UvjO zwrY288FIEw3q;Zr%T7iw@Y~}NN01wfK7Ms8<{0P4$+aOg;_%{enippA)x_RTu0#oP z2SPO+DZw{=!MO2rwXE?ZX9uLwsS(MY$0i^}enMTS3NN&WY=1W>>g;YuuZq{w)W0a) zboDW6-?Dn$dL*Ss7woj^d=27ijN;#Hn0gKkSMtwZq`t{!n;^!XIq6=_v1`@I{)1n@ zfAM=O+wF5{Q*msZ?-8H#wr0`OZ{S19KRwJ!==Y9zTz2`|Id+Z{X4^a73hwJ~fB)ya z3>DFMz%hhV4*ABl)eA>*lA7#@vuaUpJ`KT2RN5IEBY4nua`*O{Cq=#~qlf$zWcSmDvA{^{Cn6kF0uv`El(IUvq)v)mTNXKZ) zyH+A6l%$IP)Wi!4Y2@iH+htur)ksS>i(l;g;^~HJ^Inneh4Je7ENfpqnjT@zC9`?r z^^;dNAZ5al35p>A1FwH5AW|&V0)_69gVIvs0YpzS8Nr36 z0eO2W#SP7lwe`7r3MgQE-wJn*bxNTHbHRYi%tIB_rPD$2< zW2Wy5iD!Vs%LJXIV;UoDac(8OEF~7N&8`PA&wrP;Tkzym?%}unI9c-J{vbzS!V#cJ zudU(j&th+wYL(8lWoFxj9;u>F9U5Q$Q9F49%nVLMCv_Y-JO5buzLO>CszWGK<1)w^ zzAZ(g0Fu!gpnBNW;Oj$ZuvR2vk*v~yg8U8pk7Je_=QG(o+)63=_ZjJQXG@d3C=~f7 z+^RLTYF`nc6pN6PO}nWeaIeSaLx}@4xHC4%-ax?C5#gmSJ=V_o$P z_P)u>kp1PGK z=A+a%++e6|^}y6sLUpHg506L})42@#S%Wb#d~@6`vNR#=3^;H*qTCkT10%xn@3V|3>g! zzA9FSq$7pd0Ghzjd&Xj0`1Wa~PiiDwklcLn;DJQ0e5>S9{IM?X!Eplbu(EEv&1H~Y z8uBcx=BopQ|AvqtHK{_vD_2{xDr<%VPt>ZZ4QTowA+yIA@SKH|smX)X2a%zu07>NE z^c$27%iW@gZDt?u(O!0S9D4Tf0Q28#+Stci176IWt>NenwJ^TQgJPMEGoZQkMOAq+ z(OQ1NctL6OO~`h$paVLbeXK0nn>G(HLi+Tc82*ng&|r0RvMGVrEHyc}N@Rovj{%ex zr6-lzTqKMQU&uV`h*-B|LJVIL)`;3ErJ{{3=(wPna1XM|-OOiZAnU_*eGNL7kK66F z`S>eAA0y>;Fy(1=4ZdYBZ2QSc)>$w?GG6fqZdsRg{yjg_U0Vxgr$;an6Khy(Yf$^v zGRw@tkW&XW)aF;VC5+Zos^q~>AU763Zi_lbwtnMA?XpiKUXbr$=9q*B z)5Ji1Z*hDx_G_ttaCJ(}&?=}+>zs3?bxX3$0*{GHEv}EXlHwn0j^-aAJ`_CE#u!hF z(T_pw*OqQ=Ig{yawU%l*w&`OU6(&Uoep*D8Uny%o??b#D_nrO0{|~@4EFo6ReGJ28 zkT$cRVIk38lcCfkBxLL2#Wkc3awMi{L)~L7#oi z#?gKe2Hz3a6x!7}D;}=93ezYQL|#$0_a_a@2IJ7#7L890=ZI%=bmlIHkqXjWQ-Il_ z$`09{|9{BebL$9CTWgvQer>8%kJ>D#xkb7+#VK= za6h3ctA&8d#PE*`v_6pYic*|^&-(}Q#IAcd#CBk{j-0el?fWOnJ{)hmcwdeb{ zPP0$EjHA)V?80S?Sn~3DtEb0|dWyBzZrdk8q*x!cN0xLkBEv`Bhja^*-5Jhr>=L8$ z%3VKq?;G^5?v4}M0~W1g|Jig8Pu#B-E>Bt8@z*omqm;~jx)@z4){Ra?o~bR~K_6x#301s2Cm!aV8_7O%23A5Y3(AXw-2@xd`u7a@NelI|Man+i+FDn6RyEq} zZw9yQZ-!lE%?*j2s1A&tdpP82qNtwi~aIGX(W|(lu*PC5p#SuxfdKtU|QHxn$}Mz?`^IHiM%T?pSdHWsmPnp7RDL} zcaBfFWwNsf<>h1>ayry|LC*Uyu~i3aGTQ7!7`-?eUmI0k@QQSa@8inZt~5bX#grea zYnOVoc#3rpDO3gzl2l!Ij~_4Tj9y0H=ZrVpRt6cLms#PuMfm5VXAvsu>qxGvge>Nl zCmWcO1==vxdm(NN(Zqhq}mi+3T>P=A*^SFY^V+X!(2niZYfZIs1q32 z^?Dk^Eh|{-7)h}8w=$jM47tB{T6qiodNb5pq&(Sed$r|z6$UOv56R-ap6x1Td?kcm zhb;dJzvH~Ii0z<=NLyz(yG6~$)Jivl5~`)6{CR+sPPzwhu5QWyzIRj(ZbdQZG=Q^P z`RPtJKq%}M|1AcDN7PS`{}+eY4NGGg*!q-Z$CI6~O44-$w)VzC+a zy3@L!XrS2Ok^qvr;KEJN8+!^cP{2AqXBpOxuW2&o0vhDWfiZ_l#V08?-$P>>u;^a5 zdIUK{78nQq7r-r=>SlQe{6t{(&Dt-ZzW&>4yok4!JHbm!hp&3-|z(*t$W9{yDl!EW$<@iHj3-#Nqh=jyHD+(^-Krfm#?# zB~{0-v!9!RQ{=!IE^T^){y{G10( z)C=H3r=4eGD{Msv)pc2nrxkyCMtpJh!VsN95YG$BF(hQ_ zTGU4)*?O~IiAG;yL`#oy{RU^X9=Mzqi-l;Z7=9Anj>tqn3ujj|d&%+;>wfG!vv3+3 zuK@Q5O@Y~6#aK7|`)qMag?Fpj>%7*iF7*hq-Pp2(3BfEcJ-#RZpiEPmjwSI~C@*72 z8TfS*-{w1nkvICk99!m2vfA!ol3vwv06j-2;tLhg-F^kVRHQNonG)aFOFTs0vKl!b ztFtWEnp;y!kAGuTqyFPWcpBYQ{Fu}D5{H8RjA*NQf#LYy??wnR5liA9=!W z!Rd5es>T$=&>DmB#d>7pE@sj1`wYxZy)fy{5 z#&Cm^^|v`=!3Qyirc*fMQq%09Ntz-VjOQgYg7UR|DCS5rigpZ zv){e$$gFg5)>K)G+p-tthSL?9uuY^Ww|i>6*Kx-*;zVt6LYP?F=2^5~_*l*8P_Vz5 z7#il?eny}YWR`=glS2tQNoI46y4;*R`s+63jF=%IPjF6z3H^tfawpvO8-2oTOrD^W z0c#K8D*st9usvuPhH>GWZ=XEYAdw!_`tr1n@xkNK;(CM4LYc)HZCcy;$kkZ!4D#>1 zi!Z3zTLD8`5oY#UPOXxliytVS-}pt7Z+n30ryS8q@pxNP8R8iP^qKZJ|Bwnh|DWVJ zed~z$zRsMdFPX`5g4dsqi(!ZT1G~cz2HFWFq*Ho?daQe{EwQF-IFg%_!%S7Ge+~(?29@GjzPaV0MPZ+#=J8FQCHC?wH~?kF;=*x+GgV2$32r5;gO$5?&jI`&kKn;dDW*w@S11c|MtvM zxT6$pQpIj+!{!qn;@nCSNl*tcHXiXg`p5CaMXN`d8wi6IZD;1sY%(I#-^rxZjb#ir zV|UYZvm9Ass%Os;Y>FA#x$aM@sEB((iBU7H3M-L)nOVcFR{R~WT}@S6H7&FV6@GhCm`G3Q{#~Q92GFiZS3i}v+g)6x*0&S2&Cm$Vf5b)2yUUll-k zhq=Z~dz10ad-B+Yd;7EjPpM#ArDCc?D(|3CeF>?_@{|N4GyBN0*E_0MMt`pFIXWp3 zIfhqai^Lg%`~VhQ6rU64?)@E%EXgM6SyG_4P7Cx#12&Bh|M{oQH@?_4)46ioR{l z%F2c>c;L)`>-wBUYZ}ac-|=%8FsibS?_`%o%0}(L?1qT*$I6C#gi7yg2Pd0zW6AYj zW4J+)vWl?LZLLu!4B^qH5#>YVT|2|k6WRsk?d>*%F8}Q~%R06|xV|HibmerJdZu5%UAGgj~4Q5z;uNeQWTT{)N#pPqtD(NEU9n-=yCj8n1(&%5&uK_#e-gWq0QU9u8@zTKfmXY_A z--}ckVaCLopOBfeUNP8gdfpBcS`3OLg_;SM+?c}*yA(_1;JSI|&^m9f6VYPp2wG=b zxI3{`vB1`r=hS5>)*2WiSqc`mZ_5nnq@_#@#qN)un5~J-ksTkZHJ{Km43O#gbu_@6 zLl5)4woBz=qYUKl=N9F`ZKOT9gle*W11y~?rBeF+-U@e2Bb+TCUNYL$Dw5pV+&b{o z??pOQ@jmYS-rSD&DHl|C=QFCGH6-@LEGzuRzu==fmSfofwiGV%Ow3DV;t z-onYO1u_r*x$PwXQo!w5F^DdO+|tQqE;1_hVi`%`wWbnhN_EXQ8kX)1pXkVI zUf!L4z0DeAIdeNoLXze0#H+Z%tit!Tw;jcnzVVmK{fJRzNsZHH*cYSunb{46@|27s zeR8|2ewjinC*g`fN5{dpOp*CtrDtRpa*A>l`J-<-*7!k?Xqra^5AN zIMzt;m$L9x9wpj;7BQv^&Z=ucymEFo_VX)o<~9|p68oobs;N2xoGpQ|H&BFco16)g z)D?kb>yvn6Ne8~VTA9JwP%@gp0I zG}-IvnFE`=-KR4bCs~S$;j2nMqO(IG_P3y4qo07&zwT3m-%2Whe>+BcmJMrk<5`dM<8K&>z#_~j(tL<#DN+{s|mhz*& zF6ewcld6IHN@74L@G&5&#`x1m1YR7_2ljWDwnFWIcMYbL_nQLWJgB@11T%(yQ;@wP+_+ z`HY?ylnh6?eZNo@C4BO(g9&Iqa*dVKbLl15YPqv;gdilm^bUCh}QP#wY zS9_KV0RI^Ku#rtE-XByWwNO{I6cmArx2!f@KB_E4t0?wWGvv&o1;P2;2!9nE0qG~X zP*lpnI{1!i8u^ZDR6Q_j6twxk>h5H3as<*E|FZ0Sog%hh$8h)ns^wlWXUtx&y6o$Q zGi>y7oMYCdCIi}ZwUlXSmxc=7tG9O=FR{&^qZ1@VTXU@N{EgzRO-fqa;JeU` z7&0@%Bj+5Yj$g32+Dl2%z<}e#u`EUruaZz(W(0@OeeAr)d=@~oS@TuJ9iqY)no#ct zzCL`2P0Q*wxc4d}DTd!}DM5OqX_$`Tz26q5Gr1G$=vZwUl+02Tj(U&MWxT!5`nWdB z+r7{-9Yl zmloxJm7g6yvsa;jN}F?;O1{O&=Qt2$Rae$q~)2ofxj#zwuNSXL^w5FD2eeGi1tae;e7VGBrQk&bbA#Wz|Unz(| z`DmS_2;|ylp>Y$UK%mp&5&k_ZxrRSIm@>vlvFkznW*+i^<&HzAQHLE$6R9a$b@LYx z+Q0@|CD-v3>ekCgK^T2gK`Qm!h`7%0g^!$JaINTXakV;{`19a!3@J35!BRzdI0CE> z|FvlB+nqZ0$9TITu*qY)J)=?~eNL{_)6S}k#K^X;k3I=mulSwWmxX0HQ{k=nF-Ck} zOoLu==?!14-0bV=DueD_D<7U;)!*Ijc>!&3Fhu`n^U}*#y?ZBwV}$aTzJlgIfo=0Z zIGGh~6mNqT^DJ+;T%?b=Ph}Vayi5p#psk3M@ogc#-_D0f!!DkrSB1EOtV5?P#<^WZbvMu4h>pqfdXPw2&n=aPhAM-&WnZPt4qK-ssaBd(G)vQ3#I`^c1(bDl1n%*nqG`Ym2<*#NVO#)Q1 zUHXMA_Ju)UHh?`;e}4%3l-nQ3%2||Ulz09H^eAboz&2FO@3zlLzY!aq|ERL9 z|4>?>9%Ljjk5hjs{5P{SZDK8f@T%*k_dl*CmemLZm;MZoX71zcAzA=9JEv8%ky?|= zHs1TPT0f;4s@s*3Ldv1l0Y`8FgG*x#uWbmL-fJ$Zdq6nFRkE((KC+?m88T_Nsz44C zmS}o%NK%C#w-rP^!Ihq#d_>nZ47QVg(ad-iEWdD)a}HuMd`?E%j$A(?SWqIYGrPM+ z#BZ-ZT_R%|Mlb@VYr<4)L|edRbYEV=SM0Y<5i!CS39W9$<;Rq!(%(_S7qm#9bnI8N zVE}M@>jL6xL2|66GcvmVAJuNJ6KK%P%PS^cizc5{KP(XQUPPR#@~OKoYTa6#z&`bc zASAX5@>Mh`4g8@+<1ppmMKH5TtW}^ix*SsT!t{>nUZi>js~UF%haX%L$L@yaRY%_^>Q9{Z^BtMfYz{P)TGD}%#-e&5E zWA4N?hXjFuwS-8oNv@~~c8-hYNRrn@sX2WYqk*K+jJTZdcltjiixe0JNytOd`7U1H zNDh=sUkZyuKK4xi#FquFGB#vmR5rmHwl}->|LnYkE;OIH)o@OUjnYIYQd@o`$n%^i zYx#RmOK-{SVbCPaR~2TeD^wJ>jAK@hZ7aX0$iD+&-AlF%j9$I@CaOUAjVG(vWUdBB z1?{b0t7P#SBD^lML6y7h!xn?T^p`}Unt008i^THNN*lWa`cD#XX@gNNL-K)A)cy)r zts}A+(#QR(IK8#YHVK)fYsb{Yq8PgEo$3VtGtB$|nDzuC+Y-z$sCTw)edIW5A4YWg znh2AO59DvZX_wSeBYvl{I_`Ge1}3K3`D>kxCqv`PKYLu(7taRg)Y*r*g3|C=<~3qs zcAxMdDJft<@#k$d&taj{<${L)iw~82EdRC{qvaRl)-^puM=8`ws9v1+%izQ{ZOd|~ z9kf0(zH3EJEV$BcQto_oesRag?9&jh~mCeW1SoG4W-0xIdby|OKbPz?6vdzrzRMyA==T!%t;+sBK~*HVVWsn-64+mJ#Ec# zU<8%KN?t!&x{bTTd3alxtmmT2xmDS%85TEXGCS1mOXa4N0mEU)a{`D8*HhPO2T_T= z$xS!>gY3W)&+h}22n#C)uD3C-ol8i>Q<)z(l7_g?rpe#`T!U;}rqu3iB*nV78%M7? z&?J{$!VL5LiI;QOv1IOdv=$;$SBiL=iJYw*;{y8(0NRB0SL7bup8DN9dahRd$FihF zS@OxP2bwDSVaIf*+g5LXU%j*ZzWOvDDsN}E&$68cj+CJWphgs*FVC#rc;|Mo2z5Z< z57yd8JI%y)hE?gqz7uuNWO?mVH7loMZ(Xo%1-20OnZ5f#0UW!1-T@j=TT;E@LuTob zj`d!@b~6m?JhGW>?$pd%thKBD^N?q>Smx*?%~{?IW0JK^$?@V8efJw)kv9(*jn+DX zT^c;^1WXb4wYZvp3=cr7lrJ1+XVyb8+Io_jFhQ)i;>=ifjfvU%u^GZN63vB2)S8w5 zicJ{T4x8=w-#an8K9x)*yJ4KvsU_kr-SS|Ri*MDut3Y8wrS*RyOSF5gm1}IOi zyYmKz6Rb(%PMG?|`C1iiJMi+|;3-`+^0)FDcrEshr!nD))G&}*!(2TT0vAo|(0O$~ z;mUNulTI9KmziSutOrYNhx!|Ip=CQ%rG6>u$-Z-Ypx&az8wA2e+?FGrzh=$cJ1SgX zwWltudVqS?pP&i+UUB9T1Bo{EgR``|m6UfR_7W{`F-&M~g&6JwgfeSCYksHV8gJ0U zdr1Zv<}V?S+;DA9!v(4-8XMI~C{)68eOK|9>hLk9QE(~UR;iG#ILB5oAuEI=Gw@i# zl!P0p-jV||=FVd=$PSy#E!Zl5%Sl)&BISq|xUTge`UlC@*R|QW)pgCl^8@j%-p*)u zy$3hsL>JoW7P97k$; z&i3w(3HFU;eJsU}ecn5*lX)}EN)VxrceF99)u|c5#pH}-m=X!K!gYS7Wy`U@#Tjn{-R5e40{3C zK;lCF;{u$L)yo<%nD%&Hu_!>@($3JBjy^$t;uP7Hga^=Jkt#p=mT;hUAZtaL_z9$G zpN;kVvFq#P=N`8nqN-!h`p=DH_Mvl&wHVR(f{A_5K>V)f2QBp0w#Q6s5Io!eyB!b@ zF1GxPsp+03zr-KC`a84t}Z56R|Sxwc}wFbn8`~jlxN;L`Ug3XEar#Ges=5LoTfYV9g$Gp2>@D2jzkkvKc1u&i)4%5blnH)yfa9 zJaVR^AS^PR_!VYwCNkMZeFAFsr+?@D+bMWR*_tKu%E}G5(zRRCXF?ZcixmO|z1^y$ z3e7r1htV10Nvlk@eQ+Xq`74-63;eXCEN%nuNd3J$s+JWbU6mJY_JI*WBE2a$=#Sg@ zo5E8+TL9?jWa!R`op5_w<(Hu`(o$^duQ?5bC2FK?;Naad-JaXUI^j;G<4b zi*dNNC7gM^N6ic&m&*wo4xS479*MLST6`4=|IRT!-5ecpX=YBE`Ov#?Ytg|B7AELb z(V&+6cHu9bG7LsCLIMa28%0bcgm2@+pmmRT4c;BA4|qRMhyOIK-j9$+O8O@wlaULp zV)lZhHg~h-xT`(}DdkH;wrctuHeaj_J;pLm#K0Z6za$`M({Zu+%!8Ov2&l>FRZ7r9 zK8jf@E`q%T2Q5tre8s`!$lhvvgXvRy&?N7A?Hu6&}0jWK?^ zbv$S3wC%yQkv(O*-k;~_&_W=snUD5X+z4a2sc5OJcfm9*88-~pGAF1| zOmWX*(w7BkS@p>0JHx@uRxR!@q#=R38d{$Tm~XC>QJi3gv~VklSq$`)_D^GW`naD@ zHNMN;u08&;=h=1VfGkODR=0d5BsS?+Dx3rw- zZtc9y?rO(nG5LL~azj3Rn$iz|sy04dlqfo#e%zWBJA415ZT7;;E3q*6aQQ*wvar^@ zW=fA=&!`!n$5xyE)=Vn=6sGsg$0j{?wF^r~JTl#?-RTDpG5qF3)pfGy(?BdVcTKvi zo@z9jd+)P(-^bd`zxj^EFi-ZbCRV|;4ei4~xZNeM6`dYIFz%WrF@JMy5i{p2)=krA8Ooor%vs5b9wzZ$bpv@ zcfzZ~ZvHjKFiW9b6pl@I~{2?}P^ z4)7!AVTcFCA))R4jcCuP{gQu9rl;|DDvou2-2c!+8)1wR@7Jf^D4)dr^2tj7J|#O^ zGNnRU3{%%#-A2y|sSKRQniVo5tMtXG!a&lam~ z0K13n8@^;&Zv;yZtpJGrJ`@g9J^ZQ(hE;3E>i%Q7omB~nMxlh-PO{?fC3b2u%dAjK zY+A2HJ^rDLbeQYP4bDnlOaf%kls7oBM_ikG_WMH~&Bwe?L8PX;8+EBi+KZ|NM7RYjDkh+( zG#a!FSMCV6(VV;wLimaKWP5H)ZX8dkN&No2#i7~KebLJmOuWi!!PV%UFcqp~%hI8O zT*M>`858|L+R*rM#9s5e0>y_P_sMz@IJ>s(W*Y3x8(^Ajb->o+nDoeEe`&g;n+*IFLw68ezXplcDMYLmuIxuj^*7tuCTE-&P% z<~ZG94`+1QHtKA5x0V*JmdQ{N^)K>dM2tmMv&|nf%$=D1nBX=1G0k)F-$j8o(`B7U zApEwKY6SfE$j+VFZxWB>pY8=g%=L$~Ll_711^bMQDBQZW1e(F#EUH!A*+X%N)=>os zjCd&H#$Og~#-GeJYx~R)3&Xwy)rZi*z@B-aC?7mSA88z$5iGboxA)#=src&g6%U9c zkeRD#wtQQaRa38Jcb|VQ1A+B^hYBuQTMkAwtm~7Yo#lAT))e+1C}r9s9w|@zw`q6( zFb%)uG<}up{@PKYT{#UxqsEwGVJh}`jsRcy=`>tfjN_0*(xBoWAO~l?;k5o$84zGQ z5R+8ExtV18C2H-KajE9!ZeQ&%ft5T~ATQkUxh=jE?-Lh(7W_9v(j|8nTNR<(N46KG zT4XhzI1?HTiP?afN|8*bhX^_mL#5l`{5_RR0(^Q)`t2(L}I zE9r~3LQ|Bnv_}Ydm2gztjZ6HOdUO2zlayR`&t`_3*7V@0s#`}EJ5^UDL#_Mdw#B$! z#HWCM_mU;$JEJD@N#F~i^~$Sbgr^FP_-WK*ycJM9mPE5{WCS#^Ei5EwqRQvlhCCiE zUq(2_Gy*@H=HYD_S`R?qDbcH=mZ4|VCNA*02SX6h3@@Ud;dsRFgrGt*?hOSijQiNt z=(lXa!qjgXYOvGHLtq>NVa*Uj#}l0_xjbEM#3NiVpnfA>>EF0qv1s21mfIHxYv5co z9$`$^e^i)VEoLj30JF90v8>S&4N_*rJ5J`(VHqg^UWSU|;MW!D41D5&{xSm*5+0W!Mkyz&)ixpt{ip11b1= zleemjlHQf~P?yu<#DQElB2TOnX*oWRBRhDf&cj#G-Mule!P>i`wwzT8d19SNI83gr zK)m91k2NX1$98Pz)P(xUBN?s|LGnnRzkQJGL@$~9aI6Vg6ZJ7MXEn@Wq1VXhwd&u+ zEg7v*I!2MlenuT;&>G)lev3YCT>KM%veU-gXQw{aPvp%w%E--)_!?=N8cdqo9GPg@ z&A5c;^*C7n+O6Z4dx-dRFYbn$>hohSUMMBlU)8;K=g*#IL_E``;PKn=N@5*@2KnqQ zsBn#+bHUC`cmrrQ8aK$G5FRon4g6zUE{ewYO~#424VV?OG)FnnPI^*y#|CFo z)%$?&QxyrB?yly+#stJckL2DTO7(TMxE$l3qpO#8c^h(_T9Hz@h6MRFDr5=UAsIHG zUrwltlX7*w2Hk(=!1T=Lz(W>ECt#K|i}wB*;#Z93!<_0*8)AW6XCDd+P+v_^yqk@w z4cfV6I~tf!>vfE(cgoD!BV}1_+G2doy!>J{0!r~{IUpBr>=b7h<=U+NAONmXe(t68 z-sV&T(4prO=4gID_OC7TxUl*|1KyW+uN+Mbn*&)^N8LU5w&Uj`!oUvjsH!n2i zowE`7Pj=x*soVzV?pVV+QCS4Zf#WN#zc5FuBz0h=iPKlo*=a`${UhHz{7L<%I#b1X z8@QAehkxb=_AV7ui>O$^7@5udg6{*@{4xQaKtw&YUHS3rH_1=J6TP&|xdi59f_O2@xn2++_D|=P^NA`YuNn~^&Gug84l=+pn^$&|(w2y9n zsrY<_)Bg+5{u@=2_Xnzc19)g`^Cmr2dwSntmcs=%Cd_ihpM^T((b7A77LnB>r7zB% zi|tRtm!^L@=5GfBz&wLQr|6p}KrznwK% zw!N_dn4%H}l(MWmu<{lxU5p5kHMqXii~H>Iab+&3klpd-R>{CWNpP4fHPyO3Upa8y z@+IO)2}c%#`d2eJOi+4Jy>%cLk-n9=82&$?l1MNr_yc z0+O(_8UcT_nMDm`#!=lCpZK)+iyxQE7-ur@n>3w69K~vM6JIaa6ut@V2FfF#b^>Rp z{4=K<)Vrw%+2{z5O}EldU$g$lur>FIG`qUQTH2kO#m6J-nS;!oJ6yjiFPpK(02)b4{p6Zyd_~gs)jrWv`r=|Np2IN$a8btxkX4o95ytV=e!|3Oyu`@*Ec zM!C&J?39p>01ZbK>9PrgyGt&A#eg|CS{68xEwcR}wbEU30?~S?DTg4SGASK%N|FjqO;8 zEV`?WhVf||D1*cb~eL=_ZR2jE^?CeKg|IqwGfSC3a0Hc^fKol+%hOCE?OW!q0wRh<<0`V=Ygo zjKOuLAkINn#Q;)aq3{5-Xg94>1R1%xL zsV+~ zil7h@k*btXq(h%o}EtliqEJs?M$jZbX z-fPc`)}v|a%yv{0ccYd+H{76Q=8K~OFK&8q=mKbybI%Eq4GoNSA<*E&=O+N{ zGx)K&_jBgq~7w2wW~7@0zHo(lQgorc!mOA?&;;?uonO%t<_4er38lc<~7LA!{hMz83 z@q8Y7yx&=oxv)D#Tk{}_@;_DfGv9AekXgus$h<}3yTFBb#2sTzzXID|QS*^4Gn5U& ztT{XsW4;uLL`7^~2(6jE6VTKDkCFxHB2A)Uy*aT@RZ}{cDcJ2Yro(F{=9N?eK$m&8 zJzBfC>pPicHgWuAt9e8&z9aGyHDHn;Gt%W$R3DcExGIs%`&7U=1DB^b3f&y~PhP zRuEiDX!5PB<()2V7p^xJYEVGOq66IA7W(IMdgkl-vVZSXe}4n^34BJ=)~gEN^w!is zSt?cJLSisF+x-g*N8d=)+MqU-jv2J=x4rWgv+TXBH)$cWL49|`BIsl}l)4^vNb)<+ zZ3R0Tf3u^wLPUioG#P3jp|v3}ipsy#M@|ul8cDgS|HU=dme1FkW-Aeb(3jb=-(`3cpTmE3iUdluJ8(7WM<7!ZMcBteR4> zu$9%XHsnye-*BT_NG$qo;Ko&+RTi<(-m(MO4m^ZVkeLnkFt^<7-n~IF)F*VScV7dh zU3z3EvNNU^^rE~q4hZO;PIEMvUj7RcQHWl(>VC{WS}cP5`0T^m&W)~y;5=&;o<;Lx zjWDFqhNWmQ)u%;#tmHxechw1m`z|}*r5{O06RwM+g|9+nXh7JD2!YH?vi-j`b*;`_ zWqRuV4eNRJDIcub$eF&u%NaIRlQ`%{Q`nV+_BFW030E9sJ-WAgYe8}w74DcIN zcw0t5V#W50o-B3rh}I=x{biFoh^9`(@AG5sTWkj{r348^b+x^T;|otvz8gQt!p``l zC52r1QY>)iobneHTq57QSwYG3j(~q#;Nq)mr1p<&Yu?NOK+ZsM0VyIzz6Z$9q#3x-f=%PdxRkIngh45lrT2l2arUHcrk zagcR}K)?v5rV#sSl1Qd4U3y40uRS(3*42|H|H_5g&V}S_#yNkpHc&}zVAxllsc*iB z_eidnbY9%#{?Ggu#Bm(s0W)74&H9{EnNWy#`FAcmPwx^I8F?cEh`@kmdlhV5=(>Go zn&J%$zUM}xBr30-M{tLStGS%UENr$!A)uk=&V#N7Q#71wOejMbzrqBM)t<<4U-l`U zr4=@P1djgRSgHY+dX;&yTJyAvN^$%+%J#6GJ^w#QvJk70eaFG_ix)$ ziIO$Ind`IedL_X{Z)+U;b^Pf5u1qLB@B8uN_KWlQWZ<0v=vhejCsHzQa6s?X*~Wv3 zcJq*cY&;o;R?!^S%ynjDkJmr>-X}aW#pOQ9Jw`}6@Dr6JWwZ-W5XBV4Nz3*0<*FN(v zzy+2*!95VgRNabAmyAt+6w9F#$NAs`-K7t7H#F!p0?-@E$y5}yKj5&5wC=M3Wxo0> zrtW;E_07KJdyw55)pHI@RgT9Hf5WtxVcWFhwXz!Ovij z5Wl8ortu)9?H*HwWU+TxV9BzfIw1h`>fBK>{T79Jnm$<6T}Z23$k;a7?Csny1EA(v zKwu!f-yB%nYulMK&Y?$ZB`w>vQll}6Z~^boUvD3{npx*2pexs)LVmGLpM{ru?Z><| z^e)xJmNmPcg;E1h%t^9s`C@-M?dgcN^l~?Hi03KI>*~Mh#@xK|Sms5p$JulBNv8Er zJBg(a-}L%Mtj7s};~vr`28{WB>hZggTwMd_$S?XJ17mfT7nKkd7!)YHGWoe&eX!uD z&Py-3rvr_`kDhNlH=+M*RK{SeSaT(!@&*|F#by_HJ5mtD9w4El%aaBK--Ws?1fRm@ z-51n&0m0TfBYBgG;-$}XHl*KJ#H3Yz^Gq6087qGxhI`YmPCphHTbu-1;4sFE=Lv3` z7|DfUE@M}+j65%VH`o>)+BF0kRS*=5?|k0_mz76QcUG9fn{WS>fG?NC8lV}wwbO0x zlHbVO^T3V76?^88q*kZn0qwadu(-6}fw4z-q58TT0#9W-02<@6e{FgF`bINs^wF7t zacS77aMky+48Mb&?(~-*_dSFaziWb#>M#GUcayU$y7n)YZcC)ue(%8T<=|aW zAC^EDz+Yv{$j%{X@Ri61_UtQ5!u`dT(^2%71tMHIi{*R++VcEH$Cplta~q1ssx=#2 z@6bldd#*}lkjva>zi_N~u#AafqmY#cM1Nwep9bc5j|shtEMzrFYLRJLEN8V4-qUj8 znDR?ePP(3FDANQGE$|fikQTmY*3&S$$87*J)fFIMZTW@6R+~3Jo6T*T!bM@e-G5G; z;=u;o4oz;YG0CY?nAez&p(dxfshgF211L;C_?iNx4ZIiw0_$pEs)!V6uwG6DZrd-; zDp{!6pgn;9$WDC_gAvst_=muv@em_9!Q@P&9i1&f?i&)b5@!qph|VbQlU)D9A@sNl z*eEW{O1Kr;H!4Rd>OV@lvkTqmu8v4E3Tmq<(CCnIfa#qm-O+qf%a_g1Yp|IL^|T8D z^dAYRVRU*s*)bcy)%fb3!V~fTaP*Kai0%&R_TD77i%zt&Qz3jl*Ae+s267QSKCSly z^(Qs#QU2lmm2DU~KQ}wFizSRN??O3}dFhFuCxzWOxexLM*rED$!w7^5L4COG!a49ECrbmiQSZZ`GoR=Sau>^eorx$>Q;E`+ zGm57;U#Me+^Ze;D-NBf8^)bvhUTscv>|61I8q8VGcGDN|a|WjTVY#f_yuQXs8UM|7 zMeJ*j*i*THu@B$z|IA9!#6_#S=w&ZALds?0o3bS@{K>>#Fpj58psBTkmpU9rCReSk z?d*)FN(`PK3}x-T_+b--ZDEVPUlq%)vi{bTOK5Sv{VDWk%2T=VcHb(F|vgE z<;`)=+1BiKY_9DW!B*tH_%VgC?wq|{>pI$!t0GGL)Uodc-E!8l^V+uob993hBmWMS2Jtv2Y|Pm@0m^rF+B&XPKE;uw*z8 zEM9eWX2-ICdVBi{K^WE|CN5;5v*wWv(Qfl>Bkm?DHQSXn<<-yOn@7^T92E9sP`;~3 zLhUm1y=~`jS;)#~{8XRC6S^tI9jk61u1=2b@Sz)X@y9rZq$9#{gWyB)VwMGHA9^30 zJO=LBXfH7!9*&Y+TwHjtJ+F=Yt`s#;so;T={ruSP`cDN>L4zFg7NvX{K~+K>s}yh5 zkX7GCu)C1^d`sUzfx{O6uj=ot{3@4JqDc`&y}#?fBL&_ipAiIMdl&+@mRRuRU%O_? zt}m>!ZCsvHcS6=DxhC3p#+1!zt{+$8m#aA$V|r!5u6Cj^@LO^+s9Yc(O4to;TT)rj zfzYZ&&COa5xPtIjm6JPF5=Kd;^jPYk{oDUOxrduug#V8w!BCQ`JmMN_W(pbzV}hT$HG)k{@X62#a_w3S&Bc2A`qjSh##8>d<%i)kVB z7860#pTt*|uwFa5COb{jAwxi&eo?dNf1upJ55IE$FHn=qgwua9?QvrpB2y%(J-5FT z-_GLVLBuJ*)J~jvs-YWq7torwU5c9N3x@KsyBEOXRfQdr+%Yz>E)i68W&s(-THk|SZP3R~P1SF$WZ@j|&e4LyA2##1 zM@3-J{wSaAmW0TUs@W8YI^7{{0n-)C0@9xrvnIn z`vs(S^+aj5*b@-06>V2b->g>vaOXQ&lM8KgE&ZCn?w9g#d@7}XMoFxly>{ZZ-|DZb z5P<>>-;gy4M*TWhsp9y(+eS07djbg6%@|@AkQ?yCxJx;b@-=}kVR-a$W#;}<-mvUh zkgH*O7z^{OE=yH?$A$}E^6Z&bo0l5yo63hg-M_P&{rT390!jelKOi#=8vzrSw*)?U zzr~vfxcjFzNZ}MMOdRv1y)T8RnQap>#GrfMAVT~9OABBs--v&_A>BY<%trsMJH21j zT}GA&c0Kl@jYlEL#)bl*oziND{G#Kmma`I@wW^!S3W>ul=JotLBYc-#8HbL~sayKI z{zpuS+B-UUtRScI#n^sz?6>4`LKR(t_MmKBh?+R3VO4$fEi>sAhn64aFu&Xkv0yo@ z&`O=D$qjx)r&#<8r(1A_>D5JmxhTT|9^tx^asa2mp}lNUg3in(>fHs*Pr6tjzQtm3X` zMng1d@>JIE3=4n=vZuj*N(5PQae&Z7=*3pg~}Ql4wx`Yhl1ZdC~0+n>gg9G zdNL_<{I(H7Hk%Dw^VRI?F+XcoQi10&)P{$BD4>l>Du4j3rPN%t}J7Szq;es!VgQwnG z&7D3WZ9ed_I$a@$$nv}`MS|!gp%1$`h52O=8j0w^v{2AZOJzf;-X&4BQML>)F_x znr?1yS*-<3+)_%a$&iy-_!rH7Vqjvs9-MDD=j9qMbMvOzwvbZvC2(8HHr+U0x7er4 z6KQswlC3@>chTmjL~Z{6KuM9ov{oTCa-CjIM)>hnp4>PYcXV6jh=$fEohr2)i+{>< z8gnqAJlAY;gCWzb!;n65ShxpQ*w0U6F;1pvR{_q-p4SzQmaaV8Z1t6O=jeRXC>cf| zvYaLOi5@k0d0xFg$H(Lr%Mbi|x716R#OI3wZ|w{26@#wSzOh`B1k*`R&gdz1J&oZ4 z12Uj}A!j=>mUyX&i^cgZqS#kqLr7-^iq_A0jx82AA-|CIe&QWFf}mLvSyQWmQvHsc z>9+5eaCoxTYN{)Vuh*QcF8go~c_{17;iq@l8*BU;3TT2K7jWl)w3nwGSxuLN5U4l; zH~7hA-V;V1XZv`(CeD)OXV6^b>Tv(!KQ`i3NSul;EH%7?{F#;? zZ5B`3=_e{}s#%;gGX#>Sord|Qm!S))$nUC_(x`()OrIoqaJDehvp@Sh{$|(!go#!e z0oftB6`}o8-=~p`t_}4_kbl{GUQgO{B?)BK*iRVbG}=yc`}1l;8dMP^a4!X6csMlq z$j;`pThXUgKQs{zmgK|-v)eb+OYKF@6huED^U><#he28t-$Vr&{6}HBcB0bapATJk z6`YtfSudv*hr zS>ht!_fcLiSi`r|y_Z-=Y-QJkfJ)VtThg@^AG%xdDNg{!L@32se={HpJ2u(Zt91Dd;L?w(DnNZo$pq( zW_DFpBqYIKyk?-P3Xte3f@C^8NR~p-N6B-&H%(vME+()FJgKf8CXQOd8Bw%%9;EB| z`9^PUp`3T=TsgN-QA0B-gwG)8B21LA@$PvuKi2< z@>~`VT4h|Gg(#(J9vYzG{mm5Xtd3X`SznXXaQZ<{nr=J(_c+s9|3%dOiYR(A2Pz@A zBC)sf^K_ZUa^sf&1}M;9`G^Wr-sA6@m;Vv>i%Faf7<&3Fcp-9_*fMw6?>jJM^e$Ze zQ_itXv!P0PbW~R5C5OD7hJ6gmv~dL_0q$ReQk>bV^j$64@G z-?`5%>3xc8B=(zqUNX~i%0{0;L{4tny7%PSihlaqK{1z{5WSvV6h;lmo^n|m_C@90BZI3Bh^>TFoJs^Y{Imb~uQ=1xQL z={`&b&m5eS@_T>m$m8V|gx+-?2bv_`t4~E^GRYmYt?SKkmZ|Q5rKz;ErBz$&hx&Ej z=QxWh&)*Dd&nQcI+_CMllZ&sM+=>&u6Zd*eM7DNWL@(_cZ}APMu{zQ5uajy5n4=9L zs3muu!>NICc|kT-rZBu(SbQs~sNoOB3+G9%Q&ah~HjusjCdc8gruMX2@niDHig=hw zY007Z1w6n-`c!)W^p48eyS0!`P0Jp;kveeo)%%a`F_8~B-$zEPPLcYY$@*H5{yt*MT=e5E?mh-sdO5B?FOS2h`+o_<{N5yUIeQ1QvjjJC=L&m4B< zV>Ukuxt@SmwY7LYj4VB&yjfcm_fkXRK8bj70oAfCGPs6%)lqzL9olmj$KEj4?b_Mc zx1v4W3YmAXmZldvSP_WkmaY$Km&sNV@QbeyOXDdErqdrngcCh}$@gpX8DI9C=j^K& zmEF5!X_Uk8cRGOMQjlu4t9cH7Y1Ohw!zY&u`zUlw#&;ZL+os2SmEkStfslfpPOOJ! zO0R8@!Pa@k9F8roZ-VQpIgK! zciMsXi~W1x;A;2WrEk|6<%?$UcvD9fZg2-j1ggXTlQm1 zi0{={3wfFe0l)qb-gz!CT`B1dd(A19Y#?QnNs4q$JlphOc*Q)IsCa(nCo4;Du=pbh z{in_X9?|Bp*?i&m45}GXTt;>ZsTz-Vze*)lczDLow95!QAy5?k66!@>xpo+_0V3Vg z+^KpHmcfjd7q~iT=fUy`C6O?dMdghJ6nmFG*c(aY>qmgNf7RutPknu#ScMT?{nEor zIjs{%Ti-{3Ck>96wMfUqQockq^b{{;Y_#Ng$svs0Nc zdl#v^k&wsolPY`AHD}L1%Pn!d7B_v)lx8G6xBz4INW*gpo%=Qu*R z4EfRNQ6%dVS8dEjoT)@xuDW93i^fn?)znD-YR@2@nkqbPe`!d@c;Q<*!YOtN8WWGc z$6VEci#ewBvBejuN62)2ewdkjAZ*+l?oUW*$rm2me_^#cfvX>~(1eFvI9*J$%~n}f0n zNCb%{L&F~^KIV!%yh;#IItX4cPyh3ApK(>&dU+f4`P|v{mgwoxWEJs!yZhpkd+2+{ zm~PtWQL_eA@Ma+dq!|&k(IB`54?oTsI7+n3`QX+wmy27Aol)@GDMR_p4Ot+3G-o5L zcg@@|gwX$vBH=9;!}TO7`mfJey3O%xtn`9UglAWpGAl7;6o8^`@S8!rCtJDv z+oh(c;bwqJJSf*EI{910AM@&LYQ*N>tHym*)6o>><=<&2_3vtNo1Fc8C|IF0*xQp$ z?3@poOU$EA%%ttlW~2>(sXo!B<{P@^+?MY1~jeF=A(d9dW=<8wV| zD`M+LT!#8mbJ|#j$1;04Uj0?)SYy-WM?_){70o)c$ghTHV;3Wua8TO1&U!4D$Be za&v}Xa316;@{iUdOTIZSO*Sl80Iy*IasGL<-2t*5JZ1mjv$r4qT{3S~Z%HJ*6H8LA z(1Y~*?p8its1i zMOP#$Ba~7Us(M1fpwi17){!$-y}*m(t+RDvO{>g5%Nedy!4&6BbnGL$^k@ z?iy{`qZ>2eYT+{J(}6-#r#qNRt!(it#)Z+FO%gL9xW}sZl;Oyzf=|1?8$-K0#|DI9 zS4*yK_a$d9>%h=Zfq_GfkGD-awY=XoPf>&Z^Z;T}KkGl2%SaYxD+`ff^T}a{+x5{Z z9*W6oY<#M+*+zU{jK#q5E8*x9;?Bw38Kb9R<4)+e8b4-NOR0h*gMj#!Rh@DGC;W5~ z9wA_`bl3xE$t`>DXOOqpMKk#}Lb~Yot!c-NQjl`*q9i^D#YyFbJlU|FaZr~@~ zMd{HbM@j0Y&fWjp_QC&`?IW6S3et>nFFSNFwAJZ=2Ob5K%2dDtlLUhSRmUw5&sx9Kk7IbX~+R7 zt@7EplwjekZyaa15AAB{+$o*g(ZW!TI)L)Pz>#~i>70@UOuBz18_Vdv0r^q6ZpB=oxs_!@9X z4YA)29O_bv*_n<_hQNoV-T2>qeqg;=XuO!;57r=)03KrSL{*H%z0?GiHn8y(L(QwZFW+W+du4V?-N2;R$4C%qff4td<;LdoVEdg!IrSpDaaC@) z@SmNAh)(?+d@v3Ro;FhF^-C)IIa-1=y<^Wiwp)OrY}F5469iGmk5Z;ozLnkM%p{n$ zHuPg31yhwFHNPt?Wnh1PdgUz+I;cO~rE~I==eVv4yFByQz`&qhW9zjhLvvq83)a|>t}hN)gzv4?BPnp4-CKlt^4AEYEF%+GvRxE zj$6k@yCqm@xx#Vd95@vPb^X(vq(aSVc;5x{d2x)DWKsLvw96PR?i-=d`yX3qP+B zH5Hp&0Z4YG2i{*I8b0b43#;4Ok93Djy!3&Jy3bn-_ryyOCzp7MlLZpv10=wgW*FM{ zmrX+TO#tM|Ku$Z+o->*&)8akw;W;l+_wt1sH}r&Vgf#UNt|QBqK5R{|LHbEJqWPWm z0=m-O5o;<+U+<}{jbI26lG-n1m&uXo#AQ)CF06Wib08f$!?4Vd5V&k3kg?Hf+xFzs#D3<8SKTxdNRm&trpw?LE!m0+y=YAsb*m zcX*He_VvtspPF3*xqGZ+lPVR9?X=RXO~Ce1Ry|{ffa*2-hf8d#V8H%R?)BHriEJgweHq#ju*DwT_o2lY7aD+H zEB?5N&h_ypHZ2)j9_Sg=G9HWcr6v{K+#81@_Cb*S*jk5UyG+L2y(t@ihCQZVo)cwZ z?6;G`-sv~D{~Dugyd;O~3qoFa>Jo*|d+cUxC2Nj~`N`HoZ?2wKoRZS@LPnjeJ&L^V zV3q%AsB+daiMd=USoOuLxE0~K)Ez4g=#@_4$rdm9q~kXIuoEFtP-i*xlkd~DfF-sQ z{;AjThulcl(&H&v+B(#vB72p`-2zzC;LKJN?DaoT4$O9uwDMKeqNB=9&B0|5LHv;W zSK}9LYCHAuCirkSzH&ii!!7xrM?<0hxQAb56B0B)m|&pFW!V0uhCtOMv3_@oYud)t zFy>ul`}OTN_%!=aTt3>HE6U7&y(Ayxh?dA)*&J808NmeFftKcIdd9N>>bu2vp zIz)+|%egm70B|k8hWCF}W;|t}ge?Gb^tsaPzHXU*y~8NbJ0m%zl*UT@G!7J*{W?`L5=5ptpvfCK<2)Dn_avy z@!QuP0=QgSM!UQ~jssL@a;c-T=U!~;-|-!5)j*ut4S3Kc^dbL!xn*h1KrXQdrYkn+ zgfv8Pr^oh)IGj;6fUPLZ^6Fb5X5+8LJ~=v=bqL7{ex=OgEZ!0(FOY?E5C0wATsyCJ zFIZ%MTMF)+bW{HL;3<$Z!xR35oe?~>np5I}XK1tk!*P%s^*6KM&KM+qbwFl@Zs2Yl zO7<2TQ<5^$?rC(=?2EF9v5tbV7}sGW&Hpy^JUoL1ch^+T?V{B7{Eq~N@FS2S#F=&y zM(+jL>7KD6634OrP)zV~GGzOR%x3{x)_LG}vdq8{1y*~h9v1j87G}wy7hu``-qxY$WtI6!`T^5vmcxu1!mogCV|uwD?^EiiSlh_H zTg7_ohV>P>l}))szIk~o9MHKOLbU?)PDEhWnSbL2+7&4YSU-O z&jzhNoyoXEi( zF_YTTb*|HF&hOULu7lLW_#LeXjmMUn3AsxqEIR55atN~etxn8_$D@ z>S4r~p7Ow4qlP!Llob1BN}Ana%rF2Kyd|YOV0xf*=W^$8T)C9^yxQ$Chv zE0Et~e6%1f+Fbw1COaRwY=$EP`YX9kJ6O+g2pcfd{hicT(me00o+%wRaSv!(M|@SZ z!#!Jf2LKs>F5PT!{_x@awo^RJovLPp74fr{*)RDVfWA!1C?2kNU$1IuUr`B8FavU= zieB+MSxYkANbOg-l#H)|FTUlRI2Vc9`(s#8kMp-Hyk8{B;=}-%*Af&`e8{9h>&pJ{uk2tdXh~7v~vw zOP>uO?_J>bE%;GGOM>=}14lTR=`9BOQS#TX5ovJYfI>sgLJP~Gm7TC~sVGG3c{hAj#49RZyOSBscUKRSU*eUQx`H-Zj$DfJc>CoQ&fb_xCE0a4G-r(e~fPb#uMkU89Y!|7(KUp zZn`mu&jtTRv`_qi{7X4Na$jzi=Ru{wcQCN9sED#FFCS$-Gmh3-o10K@9{Qr-Jj~~@ zq!uv$I7<_d%#JgE`OCe*w9U@;SJyhp(mQ4EZ>8FhU4Yg*ZQLcweQ+R%M=aJfP*;cx zC}Ajk5Ym3hh@REqj2jWz4#~mAUu3U;{o3T-Ylk54KcN7j-d0ghLyb7n0gmd^@ar+! z&X5$_uoP>-TfsDz_cyeDXx}6l>^gm$*mICB3Rglupyr_+oxYy~Swc~I{mlnU_nILZ zhK@26nkO?LO8SKNB)gGII7!c`miIPFNXJcT(0iQBW%M+!=6P5sjC;8BhVicBJ~*du zzU3e(Bq^WQK!QjeR^DoPSLq8{2%a@xPC3iFpoF;a`kE?Nc#t+f!vd`L zHJ1>*eKSP5)X`Kor$Zow3)MdU&40g8rql^^DJRswHInARMxqI%#zSjk?{({ZPQ8s+ z9oa1$meUs{{D~zE>49-Z%fqidhb43~ZqSvwKC9|O=Ubls^rK3^@YTkKH+E}OnSjQa z*x|~$Var)h4nZHo@^kYO&1 zD!B+FEwzPK@c{iIwhli#sGa%Z+t~;^mI|+MR-|2CPeSzNr0k{wy1mz7yqu?^pOFCmyYsH<7S#|k^9 z%dj{5Je6`7uHwU!D-%nR-@dOBV{>XpRjKo$5b6bXTD!UW5ekp5?#w*t|0((xhJn?pI#wycN0#+p5U1V7V1`_d+j}av;qfB&23Jh1_pMW*3INFVHvL~7-G+CJmb=FD>!Eer1L|Xx3Wqi z;C~S04%mQmuwTnJi1AH}bLZQ>wuzm^jM7d5kXZnzfwC7-?IDM0;uX2`QS|))ns#d7 ziM49Tq3t1sfG|+*m&ym#^KUIsCu|eGC?Iqy-6f@3g4r_{O*Hj` zp$od!*1-1dhn8&J+JQ$N1^OIug(jbywpaLxTc#Y>gUqfLJ)!zqq0m0T;)kWSb8Y&+ znTSILt}f^54rd+>23^{Zef{2xukJJaGq)jQvOt?pH0#0z$^s;t5ZmVycyYxstF3GB zQ{O+m4kB}}_i#%Ez5+e~FvaTmV%tBKvvCIjnx`o{s7$^)AfKp<8nQ1@Px}F!{r42hUK<2crmu8w?c$5NADs#3Mv=IRs z&nZ)RpZ%~in-)F0Bu(zpa#Y-K=IVcSCuwRhY~jm5kt^^xap%`w3GoQ74u`8jHMty3 zH!(VYxHcHy{tjG-olhLxg&1A|l{Gj&EN)vq5kiioOfeviMb9^%g{~z-WuaR$$@oY6 z-iNVaCndzR0r>BlKq;=Ipx{i?9|Pw(-;={XRLA|6ytKJB_P5@?4$KVt=xN+%B}qU1bR2FjiGB9|She#|6;&a}zkgkG zqX8n?B~-etlaoACN5tm5UUNd`&9xIq=9h(i++B_K-z~3 z+`K5NN!2Uu5EY!5T>Pq;h4#iC>~5(tZqHj82I=1|UrR>`w022LlXca=0>Dt9)ORbD zWK|wS8bQphw;dXp$zg#?9npKLPvG8nKlCf&k(ei?+d)v81+xG0ht1z4r~G^Gs|a`z zPPOQP-OMmoozE_vn+Yxr{X4i(6d`cmLAE&AJE`jam*?SIaq%o|KBc$Ax^P)Nm&8b~ zFM~}t!EMG9g#o?1qn4#G=bX}ku5B)*4u9Z+XyhlP$nG`sA(akjb|{Uxmk(55aUqb# zcM{gR?W!X9pB3#}Ez4^Un1dC>!sad{`JblWaB)gY061iQq}xE8CYJ1E@NND-l@?>` zqIcT}&b}g(0Jc+yWoXbV{(Ao{p;+fo#l+yqzl_p}8iJ*5BR4VZMHyOw4je{@$f#$i ztTfEaSvPm;&%P4MDl~E2-nB;8R(*+mJv?D*th&dN3`xQfGpo0|qgBD(vkBQoCyZjS zy+%xuvT9^EZK2vl-ar%>uE}XMB>uyy@M@tHigZ2CokiE?MBC=Pusto+i<;6v1?CTr zL-!}K$3!vvJq^Y>6?m}Xp|0S>?3?dF3Ymcm@{BEF2GmD611ifrl}&3k+SEr!H}SQ* zYn12eKp*l>&qUDD!yLdX&kjR^)Zr=i!+n&gD~aT>V~E8c?0zr%XoT+|E2+Zc1NHGL zUXt1P@0NKQhn;)627TELZA_Ue5PsBI7{T()uF;=-ox`|;V&PUa=)1h6Kn&12X%hct zXBe$ZFj@Sgpe%P}$nml;sSo#}tlH&hl-6~{S$9GATp&jgT~N~)FR90cw{F`GRhv4t z1+(CEuYc_-&bH3?*+@d687gsEPkf{TmN|DY4us!dTK|Rw+B`vc(xnDpgg4 zv$u#}th}fgk%q7dJY73n_HTT5>$dS(;(#GOqm9x0#zRw|9V3o2E7^{&wgP^2i9KD_ z3IOx*RTeoM$DPw73PCf)_^SXQ@B*1+;pr~W?%IcG)$azHVOcS)D~FuARg6qtyhefg zWbZXTzNSR{_)FjevODyZV&eJU*69@C=;5_Br^e7-i0X%L8;=^#bFOhQdDO4-JiJ1y znB1A>1uIHTpbz<{d z;Tw7Py}CpWfS*@zK&-`h`slvuNw-8GtufxGI^1>ViS>)cJAbv$0m|b$tc}Y-wzjto z`Q_FyCvlB$#0sq2p2&Q`gT6xY=i*C;`P(8lhb3e*GG9k~;ZFa)-}x0w-APJg92zb{ z=9@nA@*(nn777)m!>{{szOQsv|CESuSaS(ghmB&%b71eGng0P_ie^})i|s_NnDdKULLCc!Yv=I(Q?)`ICR)2hKWW} zTylxe>dKrm({QGD^~nFHVf5K4;nt3)ohzx9Eo}-aID!o^#j|0)Hr84-mbc}7PRdNA zxSpP392cF>fdq+NSRtZcwXQa5KSFeH_^b#ynRYc9pkb)mi%h5I>C zu-P`MFV3~J=8A)Y&AKsu1y)1XjLU0p+oW(Ai9#36N<)MDs(-&%?+_G$%MNBXk0|;J zUf`{yDPpavY*f8!I;TC(X1D7s0$EgwNsd{}t8}sjt{d>eLkIP2?WpyAM;kqfZ}6`* zHwb{u_+-^SoksCjGE}u%S1CU1m?capqzt_^N!-~!+ds=18><7yan^aY6Z?3X42Z-c zR61w5OwpI~v>}cnSqzvyb6~k`qRDr)C)?#UftGA<9ex+o^orwy$E@uWXKA|!rv55Y z3sl%tpa4k;z}nZBuQGl6a}kx3%W?}g9_j0KdLN~;$#S```IRIVQ5S398arqX@C#fz zbj;F{{S+UciJW=LWl}NSDh0)i)eeuh8mR`;4aBt^_1}xSCF~ka!YU7aFR33TO*>^R zufr|L36326Vq4V-j^xWmw>)tZxy?G{i^eRDEQrG;#1p~86u}Y;q4Lr4mIc%pQz0~^ zbW}&^>5k|)Qli6i_T_I~H#b~ja8i?7%?V9FiTE?(+tk**xMuOM{Hp3X<+g3xuu6M{ z>gb`BUS^KJ&L&>%>-CA^Qfj_P_owNS$}0C zyN4K8=X+Z083U0yPo@s4h%D%!nxuY)6A8}cKU_jmaww`_S+yFIT8g1huUUG*rO+n-^X!x#h9jV9mh{m9&; zGAZfZ4T4IbR@z5K7P57!p&3Lp%t3t0+xw{{5ZoyH({I^EEZ0^fXX;46zzX}xu?rCx z8u(KYH~!=*_*u*z)(rA3FBCg_^GyPHGNp1FXF_`?+3g?e$#G_0ioc$*heXCPu_vSa^P;HTzM9B$VH#(ASVJ zhyP`tuX)s`fHlU4yD4QGg*`dO2m7XSG>-%QnmyJ<7-E-w&uZ(xnLNeDoa27w$20n{ zl!i}OkuA+a0jCSsmJi;)OG;Rz4K;EY(NoX^U)rM&zs{TDdWe>LF#Qf%m<3dF?83sj zx^_Ff*1C#%=_j!xNK^VxO{nQkajF0g%f70nyFL3+%6(eXFF%8ky%`dbtlC<-s`aW` zL+gz;sl>U}<|Yx8x(iyDHi>j@1chS!+jcxcD?y`KZdpOF!Mf^GjP!wsF;Q? zo5p+W3WZjD<03m{s%2+&X-Nhvw+{-GW@lO@&l7aDV45cYYowGbo82(}!qA{#7Xq;D zm2I}l^7A6&OxNj=oh)0=kzZy6{PcV$_2+)jWK)ks)^5gu*}KH9Ks#msBY~@Pk2Fy} z^9@x{aIlVr9OP}c<(wz;pXQB$9Q>k}?uPo15cTKLBSD~ZU<1Q~Y+ua^(HyA}d2DKF zSpK;DpYy(w!ljX)p^{-h=>1!i6FWoXxMzBqnxqia?Cx{FKea*?qZZt)D(XF<7TWGp zPvwMvNaKnul*JXS7>yd&thQ3;8fwfax+6U{lCd_KOR96G8^EfnitpFJvLPw4f195P z%+HrI!$oe+mhVIo#7l2r*NJVOVRi6fqS+mqMZ^cg@<&O#pw!$(`wkPXd8#x9-&iCm z4%^^-P2&Vr<kp-d31&7>T zQuQwEd;G)i3B@UVIS^P{S;T`kuXGJF4G|j#cwIEl6ugon95OvAJKf2uy*v(G)vD6m zfB(D17BMAXfd~z;&ctfG4>Oq0L2WqgjpKNcdz+#au$7Hp-x{8u)U*uKc7g~e63$6} z#QF>F?+(9ZZi}q9ON-VJex|%1$9g5>J}$2HpMEM-(K{jKA5{^jFx94fbt!nv&DPc8 zAJey_N%rJPiJdF|%RNdBGillU#F%Fz-1e?Fhp$~4+jVfkw}@F#aKdA7WgFq89N~Zy zSrN}|=YAQD*B$?CsHA$vogAmU%>q9x)I`;`zD4mkR;3e7O-IiKL`Pq2TY1xhujUNp z_DCCKAmuWR#jTYczv_{%cq}OKTgZ-s@ zVB2s}oD#vP?nmwD?FhkUusF$aIw0WNVY6N-I!sP$xT=E<^&B(Y5j|tC~~-QG)ze*n-tXuodPrRCmwKoQ#1&({h5?TJUpA=FV?V;FbZ0oge5UP+ zp}ZAY%xTI(E787NslYou--zZtIobT8LI2)CNNOOT7E@##zLLAcf7>f)?_cTI1- ziU&G<-c;Us%kymj!zgZ|TI-m~-jnIMdFzh7@NoWxE9e+G1@DQ!$vhe#%5>gaDe(=y4#u|3k__R-$lf=@sXD{gIt9p?o8JvF* zlz^O9$kgFIZk&YPxlYNw=yXpmgi*s*dZ9&$z( z4$7=SSrXG6Qcl_L+vvwlT@_j01ZO%N`-c%Iw$&045AJhBIp1+8D+i@JqhiLp3=W07 zPP(!*mB#O#8P3LDI~Ti}E;LwtP|Iq~Y)LR7K-#L)Og-z>@ON@p5AZf!#pPR0_onJZ zsl==Fl%|?v>9(=coJ*DuS^;k$2+S!+l{?dC!(YWUs-P86dq&MSxuiDmmPw^v4K9DV zRZLDlk%CMmM?~bQBwLos>e}O3_SNrS>%8TQwOyFM?(+aucUv(3i1C3`<(1uiE6HeN zLj!&y$sRvY;Aa+ywJNPB)JuCo{5zaEg#vO&X}nJ6dR&gpLvZ#w2$GV~B+(eVp^{j; zLLJFk`PgfiUTza9ryy@q>}TlXG=8hvxiS5*XZi6RhckHvmOF;q4M85RhEcl|qpavT zE3U(yCvO)}Ce7!#ypu-*<)e42n3G$9D%7wG9AE)}6K=5VMyGa3RH;Jgwp6cx@Q{Nj|5r3YOGJ2oZIhHYDw|mS z1?jRyJWxi|O#vQmc{kupGlPL{>hsGgS<1CT=b+TAR$NJUO-;nyPzH6GKW*g(A4W0rlt?}3ZK zW}v1?|B% zZ~J9nX6t~X$Oi5{4gaO~k(K3~9haV?IR7@(Q^?wZbk%AH=A3*ZKfu4pIb2+@WHaFV zjv_%5B6K-=pg+*JAE)xp*Iq1U13vvqvH%RVIO7fr#*`rP?em7V3S)K>Ty4F#%|e!c z-KLxUd(QmBUK0KYN>3cNS_0kt9hd_lZkaL%u%uJ9!CwYaqE~WmdW1YHP;FPNgJ=C8Qr%k>{#_=D;-CGm&O;$jt1_g(o^C*cX70HbID z@nvWymQQ7Mo&_r)&wXV)y_izl*i0Hme^-&rzM&Ny`(^?d)adlo>Xsb}sJWr(+!l^7WQ>H-@1?QxW_)k$c z%e)#rHveg+aNVgJ^FpAgq!%n`+H}WltHo;(M<3m2H!I2L35& z&PLK777!S9ZOy4UGpRF9e6U>6M7(UxUH6OZRWWJ_6Nw%F`c+FZlz_jqy||q9oteQ~k{%H(oNevx0Q&Z}zH|%& zbUocb&V)(g9191%F!-j(?2W}FX?&I}0pGR!&t3<_xDfIjR(LA&X&R-|cG zg$cn9=H-@ei3*|%qSR{=GteM<(lz)Vi(q|R&UBXTEHctJ7#m3nk|!+ef)Zcpjau(5 z0Qr4$ydCaC)U|8CLsF%A<(hK8!Z`mWY zs`GPE`hkIJoF-b7XR|2M2Pe!K=-OHG58o`#pbjJDEj)1rR@id?m5|nBSpR_>eySg3 z^6d2E6EaP9&7Tepz*$XmpvMC%%q+}TCO^j)KZ*X-l$4c=t>tUchEW2sDfu12m~%H7k}e}*5ij_Vkt6>L z8NNQ!2o}qMN4V{tWs1zx8`ldddC*H=mqyaG*VWn_-P^CbAS0kG_&~aIW0k{%9oBtT zuLSxHQ%g2ul(l`u?3+!Go~S7QPHC(FUQd!lJ`(+s=;0+1m>f;Y2xnxCG9e37LDRFAkYFl?I|DM-ShO@J=M>pRhgCZ`E)| zeL3D1KN&cUmws=Y=vXIghxzMzfSRun0A`%uo!()yH%)FnOq1F1@C9>Z*I?5?u{G2y zIf^GQ{Rw)l`ucaldFa{g91nyr>Yds%aR9hP6njAZkkN*BZcCX}OME4kIS8oRoiaiT z4k6BNEZyZk&*dHWFERKP6$Mu_`k^GMd4Cc1K+EUg@1%X3?t4EaA=c-lp z%En8WxrI4n^+`if39?;S*5n3fi4?ZI;rbJ2zpIma(=THM*{yYvg894D4|Hn!QN=Nk zS!Zi_%b@<)ffi7N;paD--td2{<=FYR!JMGv`XqdQWEDhYn@Ujs$oi;8e5`q`HO+A) z!lpHo6jZQh%zZJU7wJnXR&Q)-$`uJ?v$kHpe9jI}trFK9yzKT(vUFx@AWt0ust3|&>F-JW|*hJ3Pr%{2*^6i0%MUArP zdQ#p5jW^G`WVl7+-hANDco+)S&J`|+l!u*zx47*mwixD*!NP;(vdSuj0_Tb>L^hnr z@{y*nNViKq#7KySGy3&XYQ8rwu$_=H+H6;rQ>xL>;Po7|$Kw7CO$lD}n#QOm_v@p9 zkgWvfJc5g?%>fPT>AmxdZF}{BcQNtF%1Yj0UACnWqaK|=qUl?Xte1LBuSYEXEM|7a zh|k^K?hRT^m3VrL@FRHoWO&#qoR2)f>P8wQk+M~In_`K6;YJV6A832WP2;UWOVQi9 zTqpf-tl`rjH??DagC)n231~6?WSE{Bq8&Q2skqDTl=-yfIKGny8V;NPZjW!OufS7tEGt+OT9TqBBhrNiIqOZ7p{t#a z&&hfnUOizF!tTVSh)6lyb0X?(;obtS0z1nnzG|qw@;Tu1>~}=Ws`%Ud5+B4KOfRmk zr0T!#3TLcl$qhN6RiS zKh^20e(px^+@qnZohG`ZK^O69+d@6Z7E0La$Wq-AN zY#seZIaTkR>tNKJZ=qGsuYxE(Oj*Ig_EmjWPU-ya!wyep+?>=W>t>i@QNiuh(^=5FCckaIqs6JWw=Z!r-^hFs4E}x#> zd}8By-6*;iWHQBNk^{sjYyX?wF2g5`3>4or95U;Ldq=pS1zrFA)$fzx)%jRtsl-x4 zuUdDD0|L?e z-N24*h2IiAdha-gA%m~cqohzgrvWY4AjlSe=$On|&#Mt^75<@9DC}fpQpt*`V!gj3 zcK6%2_(8x+YZ5>RZ@v4PA>Mn75cy>6)$VhvmX$80)2!R%fdesY6@o!T~$v<90AJMrdjkD=BFt$_W=ekmpX>avDvOgUOLGGO09Da&)1z zUO<)g5oJx&H2fG&ZsE!^l6Bqi#e(ikVrI0*8f*5tS`- zyG0TkXZh47f0fK1x^+S_!uqqsl! zt89(-FmnHGjvmxIaNrqRMNCQ7XXL3lb&%scTMgiVEqm?%V=NU_2Kt$1CI3UC$mV)e zq=wIX{{~cZitT$x>IOZ*>17@SepL9OBqHE|406%=z8S+rjFjD*@$@ui_WR&>rpD~n zIZ3aZBL&K{+3QV#25lT-0kamE%BSPWnIh)n{9DFb)=e2EGz;u{gt8?mr7UcEBnS)_eVk zM=CRV$YVn-_+qknSx)Lq-c9LjdOof;NCrcemosoOrhAGCpOcEw=}BQ#&tILBEHv%6 zO#C-BdZScXxz@p={CaZn( z=9O{p=FLmoPff2n)W;-48AHMk$Jj2B)PV4{%{wkF*Yf8ekytvjhnzNlbytY>wiUfG zJbPQ2hLDV%k)W0UIKtDH_|GCH!(78zW-7DG0DZ2FnFSClM=9eMMQx^Sff4voTzK z3_5~GN}A+9&g%+n#(IjE2SuGG{9*aZ&#%nHN};oNG7j%q6s0tSh&+i5@SKt2J;P+6 zNY+mN$H<&(FG(6&&?fzKR1no^FM&rA!P8sddpU#yKO%R8;yzp{n%_t5fcdYz)SM9@ zZ^(=qBX05jka^)HG0{O}BD&G|s;_gQ)gRiz-(m+7m~`8m5%E?Uo%yr3v(Z;`ew*3& z@x+spgx<{_bClGTacE{M5eSi{%F&`&&6?Xj&Lx$eUmCk;;k+A*AzKlLI^L`83hRgv-)(+QsVTz-EE#K-5WC}o-nc%Gm|RVCO00rr3ni%n)iNFtzZ>G2grvb|UhaT8kM=`Y)+jllA^+GW7hRhptNX zMh72I1pMUniIm$e4R6Dp+Yzk3DyC**PXB_p#O-177Qj_pwg3P%1w z%g{S9gc4SNk`;J+JBS{O2iNVxLa|(4#jeYRQZd^HDMPaqIU}M!olBI(@dw&jFXp|KE=v=gf zvad3IdQ=1u4Vq!h2~j5~P)h&{Gkf#EcHYP=cgiSr>Umm4hBD0(L8EcnzSVqt2iYIC zst5&#gQM^g;%;lmkk_ue=O7RzSPvXK8Og{uBFnEq!upv@OSD_s29eXp z9yqzB@S}~@aXKkt*iSsa+r62{9-1kM`(Y$LBgJ-x4e03Tzq@EHKzz^|@5vOS01s}w zZA0wsAhdlMZTZ|;pp&^3Q9DloKJ_LjQVb_VdAAAZyG%J3S?nf(bb(shQaiqvF$emS zsQ0Gp*wy=Q{H$o~F~3Jm(omiD2nF^JJnzPwe0PG6Z;#{=oY8hsDuf8E2y z%n@GgNBU#qkej(Vu6%G1qW-(E}TF{hPp2Gnsgcb<9 znjIw1j=4IU)VBH@>zzcNPJN0uxXGyk@%1$#-SeY!l)LA?1BD zBl<|!5}K?YH#~~R&-uj~tx?jPZ2`1Bt%xh{?>y^P^DiaJyAxq$o`XC;-VI%#r)gP` z;~aceyAEI|1RT?QV#t?24E$v&5ZCQkoSI0^!|%jDEEM z8Z`X^Ukom5ybmBX&7P&pRgY&@*{|xL_*!{q5UNMgWh_UUNPvfB`A6=i^wCpB^c9l+ z0pRV!%x;>abPgoLLg59fz?I8>CI?Lhv2Y#QHutw^%tuELxa!0dBkE7x#(J@_t zt!}o>F15~t7$5D?_tD&!Cpx8Z_Xz+CzEE_2R@wgY?#T{!zFgYgrB{!-tc!xbXZp7W zMP#3~fv{f-|q^R zDrT^RweYl~CxP9n82eQ_@4VuRE0iM2bKCYti)H7~nF1o)5OLXgcZ5R!f>V_|2)iy> z;Th`h79xbhIh)MCGM+n;KbH6I-L3lejfr*x_s*xR>C=*)kiv_p#0>6k8b_D9=xOxY zZVdJMrr6Bebp$T0)O7k?D5X2;>5L)>!)kZtMIc znrGC?^HXx!%8d9~{Z+G~0w%jqQ51I3kiKp3Y3etLwB!?gUu6(CVGP?plNbrV;x$$P z3Ohf;Yv)iGrE#SQjxFGZmXDZl%NwUI*&7E~-6?tSRN(%J41NwaE$!0HJvM)VW=K`T z70aYabXys*%YqiVv?AxD4#tM93UQ~}17nPME$F;#dz}%f-NMM#H%!?gxEQ9hlIb(c zm1lk1wuwG0VEp5=eU&HRt|;tNpaEwU7$wytUg5{e4lQk&4Y6--^4BX8lQ*W*M=KfB z^$ZjIc$ZAWX=J9QBR@^17y&ir^e_~B*QlKDvDUqa4YjKwAw66U(-=aO#r9E|FZaIYR=hR-N(SDP7+3c=3uFT4{2(cCD zx#9E#ViKW0`}i%NJMnZrYjNf2VcahWILUTCZ6<^Nx!@L16O;j_^>Iu1vE|#`9>AXm zLJ#3Mk59lKeb9e{PKnYBXWrVQ@kYeUpsZcb|CG&`W<^Fhb`rkEM!Fe~{SEwx9s(Y7 z-{Kw9piuZR?3g`%ioUwZ+Y~`xi^4?|bx}qiG}pD}qZev>aVI0IYTLojr=sg+roT08 z4G5^mk8Q2|=FAR6{j@AJ_~G!SYO9Z6CEP#CsnQELToOE#T22@z_nGMQDHsU6u^Q*Y zk(8Z@GK(%i@few8edZVKUXJT$>XKZlgfKWZa4!<+{2WaA_=aeg}02QR9K zNHI&7(V-+pJ2&*T5N7Fo6D#C@O=JdKL<~&1hod!ac0c>OHrlF{_x7$?htl_e9Tw4Y zmg17AIMm4ZjnAAqx}3_Sk=PU+xA0YgzfpWm2~CWKsbf_vTp;xNZ0%{k?FR54^UquU zP32=xjROUwr97Zp7rzMjnbw3c#zbU|x;CK!dzgbmM#^nP&QB>fM%PBhL>>|1KE@4( zjdl&2fMEZ$N}mqgmKnZCtb+5Eh0`7_Tu4m`FY@a0u%7q$2?|OXms9*>`CZ-(KV?F` zQ2K@pCSQMviV|Z?I~BQ)CB{#jni5b@CY?t&dDt4Y?wf%yDfydJWyOka6x2tq<4Rnz zpU`dbdelcHwK z5nxPru~*lU%sFeqv|PAB(~{ilmspjhQ7tRn4_BW(x%z`Q2dc&o{_Yzl*ZKKQNQNo8 zkWX5|6e}Y4dV4BsY4);lH3R3!Q_n_(C}H8y*DBYHFzIcB1V$<(#V@a3K>kW|c=8j8 zl%@BzW-PPj6i$z+oa`2a5a0j4qyIhZ_nBI~o2Pyg;{aybDjyWUm$O`2LbNrU+Oow; zRO(R;i4<>N3gA4;eC)L3z3%c2CyV@snd`2*OH^t6XsA~Q&gzm%e&)FN<b0s z&hh>MW*7i0sw3&rBhO>h6X|-NRLbZ3--h*u?(W-7>zqdJEYYZ-yabY(CBGS87b&ES zFgoDvLSizdi!2a(xc#?5SUQ<6>A*T#bxaagi=5V$qCmDLr14V#@Y__7=kLS?7&$g=1z=?|SJr=ai0+x0iw!UbscfZeLl3i0Spp{MeMz9ZXQQioe}s^<#^ z^wxeBb2&?R`pp@_0k@4d!x%x{a8qxPAYoh`rGCZ0 zD94Z9nz{oq3bbP_p8TSU_OEHGE$n{0^f~xf^sRsnB4vE%7yE?C7hPwAk*!Wq`}9Ov zJ+tvYNr%V;yM!ct*S9fyJ`PkvD_XyThith8EeyF>dM&AzFIZId$nhv;IZ+v5x}&z0 z;O-t-^m((lJ2j^Pq{NFK%oRA=S;&_)aEiDdb#NHCbYbTsVLb47cAbTlY}7>j332TI zV;U*b0w6}YLt%=ZT`=%1IagA1C|yg0mE~W>0Jr_8VSJKV80u*GKs!zQ2^6L@Y8(s&Owa4qqT{PKTU)^NS8j|p^K;J@K9^-fN8OKhEq5L5VUQ7x0%6>k#0 z!&vEIuirqA=f^Ze@BXH_^BqsB4dOMZqbr!73IDraU*Hyhzd1Fd-(COPZhb?pb2ujJ zQL+XYRrmR@V~2`~DR#ApyY*|AHy(jMYgV@cUL8f*)B1yUf^;84YX={S9C~*4`m=|Z z&nA?6_a5oXKCPqCn|&(#E5=pr3n1jBqW5y#`Gwbi$GMuG$X0rD)%e*-)8k!#J##oH zppyQ0g%Ee9S5<;dkmKsE8N4Y0QDMz zg!m?XTaWrm=)gVB?agd0m$aQNAKbmGB);QbL)B$l2HE@+)7LTNdQe0X#&l)U`*0SGH>vimg8xjdfL+L0u zEh_qq5G&sP%ATk)b*(Z)EQf?+shLbDR_s--q^Dh|b*x?FuORXM0od=L`pRnl2Sr63 z;HrkGVCv6?yk2{((VjBgU_ZQBr9}{!Sq{%f+X=#>kW>zuJRK%0UsNNcLK+y-nCM6B z>OU3{e|T!?nj~q=JM3YZ%7}N(Kk?uupeL{W_~Y>psHBO8JQYceA@hk%je#nSs+fpi zH@&BlFp;>8ub%q~jj2awE_&vVqyk*@lX}#}U<#@TJ1yJSX2|VhN5{`+d#&Hky%ABK z8}(rK;jKOEg{dy{UxgNuS~d$*kp_hS&zm;pZs(q4VW0y~oL?+#*PDo0j$b%pjQ3NY zynG}}F+(C`bBGbYE+)3M7R__sZ76S9^Vu6$J$QW1t+k}~m&j5XAi9%C9}0EfNBg;x zWsZMIX-$3c;J!|U5qIgiVFueF%eXdJ27@ZWrcLY=M)naK;e+8?UfDZvg&kS~4PtYg z;o|!+%tv#jMGQbR&{XFv*a9abh+)KX7mWEJRnM_&mE3Dri-^JXkdg<9?{3V`@^#Gd z+X&8z-}`6DtY#GzZU%yxwwlAE8>tqGXwJ0#=?j(>HUe#wj&J1!hEV&y73hck(QjS! z&EDF2y>shJF=znz$A-eDnXsq|IIw!I<#K1ExG|QDO`BxQa$Xqjk6X<(1!@1K-Dy`j zGy|xnv^@=gJGG`E=^To7dqJ4E8-k)+3)Ml_z~u3f5jD~b7+6#$T=t#ZckSH4{-|$B zajz`l2))8K2loQ#_#B(4+n(}*odgsyhc>?iCOtgtFX_jAb+DfVtV-hXr%#>OJ>Aiv zxg!mo&8;o*tO;m06j@V8J*yd_h#EUX-1kokpf7ZsTN20Z|8>Z-7&r(#FF$1Gf;|02 z@MlsKCW3Wz&g_7)c##VIjA!qQ&VnO%^7jqrcI$xvxAE+tbszotwziCrM5D!`evEsT z*>W>Db?stgm#PuWcE?U0LX)xD!D8)v^_=_GYb_@A#H!Ppmf(g%P&Ilh#4u8U(i9M$ zX5;8!;+X4J)Hgbw7}=XIYm8PMJqHNSmY!au4g$<{NkfMi+flgq~4P;9`G_%nG6K@2B zH(_fx;I1nCVzp*))ac5_cscC%3d3(pSxli;(Q{}*CGoO^grZK$;xlL%$zx#G_?#4` zDSCCH_roR8=jz@5P2&e7og%FFC)$sqSre)Q?PL_HE%!}A$K^y6r?WHn6xgP;r)b z1vvnA1V?tTgDc1dmdP7`xVF%kIFY2L0uuWG@0xhlsbVfK2dF)#t{t_zZj$%`KL+wn zad&%obu4=N{J<1A8o4HkZfpqfQC%)P(SA`GySfl1J}GZ&J60cA0w1%pR$s&18OqzG z$u~G)lATtkk~u-T)^FvpBdGkt`+Hu}_tm<`KU_}xi`{)DDQbE!%Q#|PcHo0t(w+yb z0pMg0gd*v56Q2Y10rqqCU2id<#1{Z=V_mY+djkFFQPOGZ#Oimw)pN;v)mw9;F)s{( zal)>ehE9>L0=4}U^SN1xf1e;`Q|#A9FlHf3U9gsb`Fr5dT|q&veWdOILS6HV#rPaM zEw5ABe_ItIW7LE~c1rw^_OttLy_h`@Iqdm<{u?cuoqnM?UhSS!v#&MUY+43nnkZ}dxX;A!CwObkU}hw&?#=p@z* zhrDL5GA&v{sEP7M5l40oeirb*sr&f%_OVTfn;r}d*q>NH9(c_QeyCiNZ;<1+Bz=9i zGiIj8IIP|%uDYuEz7idqnn~=dX76N*xB|tVf(%kh9VIEfI*;2hq zI$mxW-U|B7-)r@M?X{xHsx?z#>Z%wgl3N*FoOJe*nplyUuy_BcYGG>Y&5O9vPy2jY z*tArR8^uj2y2w=T?2c}gMYf_>3r+M*i;RM6p}+6kK5^mEz1BZk zeWvehXI8PfNFzVF5-~qptuOp7&30ZQUXm4p7oLA8Qt`VVA`Y;XsaCUDYs|ES@VE5( zvJ{%qpxU2`O^V6Rcaf|MJT>YPsZ|#dWO7zpa7NJo@x$ijsmp@<&q(GE(Ja$2{{Ub@^#8>TnNs~L<-Esl`R|0x7@%_XE^OWlStd>%yOJ8=M zsg5a)@YDcnr7*Ef+V!-d%d-25l@=+#R11*0Pbr{nvuZh#!zi7yN@9$-N9BL=9AvXY z`jr0-$hi>dYTS4J^Gw<$;z^rA&b4m1g&w$Q^37*UV1)9OYp6~8_4EzJXUN(Vv^{x(?#5a;C;8jgsp+01J5edi=8y}Yxp4&UF)vuH`h}v0YQC%;UpHwFPk1i=sTxc_z6mmEi0pENrf8z(Udqp?tbe4Su zOq{Lb9Rll=vQY;B6p&O^^|w>#r^+_Z9Pj6=t#?`*tpko!_qX~vI3lIBA*{Duf_c%P z==>9qD~$=YCN|=@o^hGSQQPmY$I(4uului%m)u|NT&d|f%oeVGFVmQ?h>EZga1!3R zcw_+cTt_r@UsI~+RQJ4=eoxd#g3Z-JV}&@I0c^l8I9Jo9-JJaVUc{zI_2lmF;5<}V zf0YaLo2_zt!dptd2QdkF<>qf!ZwFSOR5hu~jgyMVovz`k8B}-M@*-{4YS7^1?bFU(&P2zr5k#~Bby?*cAsyfqf z9_L9$PMjM7bE1m*k5TAy9x1&l^|N6>gq7UdB%dGl*@dfRxoYAxq?w9cR zR4oFbYH4ASk^d{8T4;zp*66P3p4L=a!+OR#jKB6fwFX-jFjISMRwA$fG+Oa!O$a@8 zF-@|tJ>TU*-A;-bK5OR0t<>vCfqc2_s?CNJ0bLbJ`r!Uu2B2#1xb1nqJ8O%1mhS)X zgbd>6XHL60=luD1Dj8t{ce8FU#B=iflCwJB0E3U2%GbQnUBW+|#oDB%7bfW|B+?K~ zCtVs&Hl^G{TP7;UCGB^e3Y#yDydyK;I*1IU-`V@bF9KcBTU64d(Wdxpexv1B`}Iu7 zMJ-}?G#KpS;MS#~YLu2UL~gV6!I?R)irOo?YpOKkmYxKcJp@#uSd_h zte**B{h~(6EvitXD#^vWT$bej#Wc8^!P4P?Q#s`(3-oB1`rG`?lS6EF!)p3)TKIgH zL0OtbaQ2i7kqdVSgXS{tAEHY91>HdI&` zEVVvn{c{b_ak5q|_b})s2dvc}^32ST@k8yC?%5^nv{|;pADWNZ#nzo|_w~G9n_;A6 zN8C<3oOV7WHOf*NEGbie7bmV5f&A>#QeqvdvUd(af*_i55i$5FzjRMo5_xe z0hji}5U>cX2a%aK|J2rb`4{kU?DmIo-2o58bMlvmQnL{?g4Q;dyW8Zu&_V~43&eyL0`YtDztx@BJZ@}UEo}{&dZ3V_|WCeEmZ@=`VfhGs{gyR z@!T3vfZ3jN)mUcpvdBJKJc~O)eVUh7fc$e+%@7Yg!fB$rzjtCZIq-D!7L znnLlGVPD51BO8u1oX32%RWq4n#fnRn+|OJJSo$|O%NqyEX!q%M+?-TKi^Y)aJYQWonn{Ug z=-|wvRwKOcwOo3&|L)<-!NuXjag7)9{zXE=Xk&$cpF45{djefbDNT**{%KUy(QkJi zS-VUyr7!ruDQc7t)APhpre2md=6f}q4g>$38Ykk}v;;>Vx?1RM1n&@|A=@$UcpSD) zqpdXmJTF_}7$)8F%CbAOQU7$H>3rV9g`EBp2{D+d&eqqCGVe;5)qEz_w=7LD+7xFh zFP`GM!vSJDi#Uy^$gvp!WjDo}WNO&BC3R6vwk&9KM~B+Vgu6b?ak&HGvR?n6*p^7% z4+snDIH&0%Y4>*W3{oTN({lmiWOG4SazxxSg6d{F+- z-NWEmRPOB&($rK>cCkh6%>0#~dA`88o*xi#9$;L<`ROFRA7<8eV;8r$>uT^e#B@U4`JO**PjyWz9HmO@lU^R4D2)MobQv=TX`SULoy(Soh$ zzTK!#4O_0MlZJq_fQ3PZmEc7@KXtB@^RV~cRI8Rr+S7=<`U>TL2Rj~Xc&S%B24~F8 zydNbhNnPF`*;Uz$Xcp91l;M;DYH*5ftyTZX9ifa>rU-S>-`RruudkmI3uWN73`%6dfC;~E-;YH)CMZsC?zQUf4%Qb{s`VEt(R&d;P=3^G}e zwAmq;9oKyYrLqL$SxI^7+MHb&K&|=NNSd&X_N5`~D$XIoU3%yIMjr7^u{9 zdmC@31GtX;I*lPsSJOG6hSUheQ8Q;hd6@T;pSi0t{eR?s(%6^sYCf0$w6B3B>7F3yvatuaWo9G^a#_-uuvV}t{W*7Qv8NkKX!Z@iFL z-VWKZ88E;3oHrl0ejwE>B9Kb8kd-}M_huL(D=*)!UGp$-oE>~(C;Fd|ADSp;;!Lhf zm-#$I9f-OM$*ZKR3(mWp?1Z{_gY5rBd(`duzj7z5Hl=?43;2I8udAo)cJU53w~an6 z?z6U>leEKKPN9-SE+re_`d(`>p2f zqV>%5O*-L%yhoQRK_ww8bZEwNcnNy3Y~EriR{_E+}HInCQe#&WE}Cyl>E z+ZWTTZY{YjtOJ>cXqgU`M}^rXwYn2d5uHn$Pe23-4PEJNJu8E%YjylH@9z^Vc&?bD z;Jx_^OF>)P`;Tjq&gQrlL7#ZYzp=KW)sC+J{?e{q5|@~Zmi~Bs3uWe(O4NApI5-G> z;h6f&+nreDii?c+j6Q?7w5eRBhl_!?gA-?n*h6d1UtBk;!INE&xeSzUl{ z`k?5Vc&x(Pz64}$Q)>$nZkzg7V*P80N|-%6s-oCNG|loa-V5udIKswKXW?s;m}pem zgRf4|r_GPu(^h|e9Mr;(LX0i4o`yAmW+aQ+HC-hyMQ+;7QR$(Zz`9^nVBA7LWhG-b zu9C4pD79S(m7RTEkglPnYI`V*j}NS#Ph1AXeaX1BPe>-iuo=M%b1wRRlI-6M0QrWf z4W2c6MBsH(6|TE?|4lf?VYB3L2BVq(2zB&ZkbVS5+FgiJVK%<#W^5tK{6GXTU3I57 z9{Z5`^ZBXY<4AE(w}XA;W8w23OVd9zxNLgBw7yRrc~z6?=)mP)TgEh)f5b)v{gjPZ zKN!B;Npn&5calj1LpN}!3v6{?_~jW$J(&TXOP;I! zH3Y3M?>sjT73V+0Ga0{fbTF~hEtfeNAm-=0L3fiz_VFbE4{G~Oy@ahvaNn7^UR+P% z_8`0m)0@L(h?+=qb6e2yGF$OR3BDaC(G?bT-EZp37-6F?8vnK+9qovF1@Y=qH}4@o zZA>w(jH{0E;hS1Im<<+f1`afB;I?NVr8Ma{IoROp51SkX zwF444hoN}8>kFtmzs~whW%r4)O_-y|eQMtr61HIt9oLbJ$zRwNkzM^)r(GEreeRaP z;>Q3+<|Mm4SOu4@j5M2Wbi^n;x6Z&B3<1J>dbcd8qDW6KPv3jXGB#4OGTgEsX+xdq zNnJ_DZu8`u1?!|WhfKcfTsWpOGc`A>T6ovMsa`4HqKXX{@pSBdW?>i=zvO4+ATfR| zZp)Rj=rF>2nb*OxsYN^IFGl4%8OKIdXF9=^{|l(So66M}yj~2VqIRF6$sd8SSu;uB z5>A?%U}s;n=Fd{Z$jN%AHLY|9q|r87O98s>#VIfR?w)$s*4(*>PCrkFF6G4o``6fJ zHLXB6Z`)h5PexQ&u12Ohs^&wPUXfH3$mSP(F=??8!M~g0C=gYl`MVFgO|_O_>Jw!Aht|<+-bmg%wb4*~ z;+Nd;(RHCv*p4`3cc%Bm9^(35)VTSR-8Y{o)J0_4t)Kjb7eYnz&G-%3oHzRL-(d!! z!Qpdd9&w0LjLa*QJ&mtAc?hac`1hJ%2aC8qa6oQXo3K6c>zd%{O_OQE_8NKeFYLV} z9p9^)pLn#D%(2JTw)bR{&_mTZ^MhsI)?)ByJ|u$008fdIJ_7bAi>~Z5@?5n}#mM|i z1x($Mc{>PGBSMX(5M*xRkeL5;^uvR_-;H8nrI>`z_gJ^NBnsn&PbYY*-X{6BM78+Y z4pnY2W7TQP^v~2ac3o+nz>a7aQ2SXYTnigws%PS&9C{mPH3mxniTefiW+za`d%;J+2A-vL~Y23`i6vC}}SkpSbKp~`Z7-<$_P z4hFoN5J-FNbSDWC`n*5vat2ziI!H8dtHE9<4eCxWNM|)vyu}*&kcPDZ`48e1UTe6O zr|aI2SUI=S>^XHqZL@nG66#P7CEsc9@PbBED3Sb3Moy}UjlZE_VsHK}FeIh4mNJIWKtDMyE?zQOgn`#FFj?f9HF6@08p8X}k)ox}O(St>Z60Z}Yy-2ect0WfpGYyxNg;G3>jWlPa-g#XT-1o@(=6 zDe1XnKr5(hCSB8P$C_s1C34Ubp5mt@(y0fxcPW7(JToej#}Y4tT7 zoEgX+&lg9+8*w^MXkjDr)xIoUHSCy2(V9-|{1=Q(fSh|QQ%F40Z8FELLy+8d7qmvM z!qVvctD})NUU@#9f-V_fi_qSr;f(!s;rQcCAR|Ew&rwC$weQAjqqjLQ#w#T3YkEn< z?#{u6^^HxV$n>XExw*}*lx1F*>8wv5Ya%}cWe_ST5&*O5-3NixR?U8WCs7&IsLR?M zduBu_#_X2ZK9px(089P84GHXI`1X=zm3^!J^w}1jgUFfGTM+43}YxwBLf1Dnyai=a73p(}mSIyi8+Uvs?`T>UFl^?6_nRYEuN^(@XpQPl{|@X8PA*y- z_6p;UCHHI2e<<k~sjZKg@N3P64=W8@?mc+o78#{J_=Ta{brZN4!iw|%utp7`pV(f9`-$Pe6zE)~N z{7kGA@fYi*`L`PkMM1ml2rI2!dNcPc3_JO0+DM+uS))L_L|QIovU&AYv1st()D%8kf#-ei)+e#iCNi&wVgocsnT9jCxqNTw-kuuL*}Chd#d z?B!RY7nlA0+E6J*nOE)$4rm?GNbHjjLRWlgp4wE>aXTA@G8y<-(WCbjFPJpMI*Ll( z+Rn@-*31(zn>&}VXByrs;~alp*gTKKQ%XEGFw4}ID-hWh)3nhIYEbm5=3*3wAvY|E!e9uGTF_7-&^5t>_w}e28dXVpG0Z zV>VYKS?&8gdF5)m(;_Cwixr+ZQUJv|!Yvg+Ces%pQK?SJ@GAOUmppZeq9;Fc#1v-{ zjOh^aAb4-lNEi|rNP1^EbqNJEx*-7^Kb~HxT9>NHJhT=CJ83j=KFDA&gJknqq6r%z zvFJ`+_+Uzy#2X{!zI)h|*~z)Tsc6a%pVYqm_Rz%3?R;p!+;6||{UGY2@TDsP$?{5) zhvNzg!{Y#g=LP1D#Qr2y^bzCcv+)keXF#RtLG_6(=fIcxb94;67ik9WMH(4F!hFrG zOiCoU@_}9aY^N|W-UNO*D-xGI7{ID_@E&CMd0>N%hfkG_SCK#RsZqw`&I1J?KVtam zhfj8=w|{*m-V=419g-DkCHl)9?fCsxNcQ*EBJKq!^qUbIXl+XxcKimmQWCk@kIux7ZYyyl8nvYx%K1kv{&tC1|{X! z_QPk|Ziog-P`8$x*d=}YRj|bx#DqB#O){1xIAN4_)$>W9SB8-mIWIwJVQ~7>%4Rnq zvOJCR9=kEHspVcvF(uiHS0YZDKG-}iP+23suIW)35NCAoH1b&5D<_pQRON^82hnOi z$=)|j7uGVIC$k5aWK9JWl?6?f6qbyokpHp6d++w_{QljuuRa_l==O_tj@qy9g(@>A z4-MVN1cui|X&)K$9gqHBv;ZXd9K@Xw+!ac-wz@-=hMEHK<@fribF8OAvYBL1^vvGQ z@8X_39Z=jniKTGr6F;4-5&JZ^qy0|o(?;Wtcd<8prlXl|aPP7y*$$^6Io1#MB@#kxuqQn}isq+4tGnFm*~Ajdwta zmC1iRBX#OBM5avnQO4KG;|{=!V{SPcn|kvLK{GGT&(knYsG03xmQmK;g~$|9C#x`% z-Trp@$e4PE%;a;3$C)Y!pUu^D`>Of;wW^;sBM*NFT={q*q+)ew$VF@{{1*%A={YzO z@Mk`X9FYm`yj57%`O#yw#lIUGZBa3l20;%>hG%vB`aVzd`yZ!@hyK~#6G%NZjXIsG zM>4V2^E5A^CTn^-+}!kccX2*M8ka`HmsOf? z0D19Plm7y=&wl~&xDAzk{0iNq%ltIVs{RW&ga!u1PXuot4Lsg7JUjS(vRb%FQ5JI0 zrz*B-*Vh#G_kw?yOPpQP9z%zDxc%H(g$*JRN=S-7VTnexg~8_HrKuu)w`@(84J6o{ zzs)O7o#>F3*bmT>>#H%Gtf}!Q^A$0-F~NhAmr(e$e`_DrPPFrsb>q!-^$8uMW!0#{ zh!$hSa%i+M_%3N#-~QlN9fG9nveyiQ@o#WjoavR_JJ>y}Q~mFTVg8p;*_L}&i*+Ps zly7p-)c@2pMZEKAwmCprDj~@ehhP0}n5Ns%@z}2)G+FaoiY-eU<0UwwxO9Emou}?q z>1Jf)O)o$i-`ae@gRj07cA}28_+^#C#ERdepsM(pO9)ge)k*z0@zCWRU3N(5^X9Y# z_c%K|R%y*V|E?woZ%gHGOvHwdh-*|z^8BMYe{lc`wy=Rw`@6ThkNo?)YI+RG=T^on zLAJs{tD1yJ4gU+B3M~Bwi?n-Rn82NF&bzh=41O}uo7Hew*=zJ$>0mJB4NZ+|-v=d+ z?URu?aw8Yxvt|M^yUw+0N5LMWF!8j}Qw)+(u8h5|6h5kM0B_g*!=a_S)7}=&E^9!F z&QiwWTJ+Y0AP3QEJ);ev9eBgWu5$Qx9p$?|zxQa&Y2)J6v z!dzT)d!*cfd8B(cC>@Df)cG&u2tq>dkLQr-b3~^L($*UwdF^;2a z9~-5IWP1HcT0$Eq*n)Nq5EliL#i4_r zcjgd2+=SX&1L=XWOw5mS2sFxE!z%d?(9%Zt>~u`zwC5i|ELd0jL!IVtg3vxKv#^Y* z(#tc+Ut8AN9|w7{#VS?qIQFu$Zdv2fD|eG;TymmlrH=n>K>P~+p8S<+VURTgQ}h1; z4vRQg-G9SCh{f|S+D?P-ul91x;!SNnNb$TP9qlWQ`>S#Xdk?7#G#&jW1ahAq^RinK z8CDJ;xr$!~p51(s_=Rtfzf5NsX_bA?ICx1RAdIYBqa$srhYWB>n^!-2$+)wp@nt7C zXyC}_9R;ks`Xyb(DlkLlG7&CgZ zYKJ9cGqgA>?p%0Lg^ITSFjcvWu%uIWLOJK{sh!$uvhGeQH)~b5umB>$7cCUU$=VpHPn^h(@J2 zU%Hs6)31LtU)lYbzHi;zy>iPhonW)pqhF(gJl&Q)5dswruLd5!FBBU<45rQ)>35OC z)CBW&+FaK~-7|5o3}4utt&jYe>C>?2so}BnD`7<|25^!gl#us6nsT}s`|9T88G&}y z9hd2JBWH0$t%Vk2Bg;(Ig=N?v))Wy)zE`iPpFx8@`w?q6LEWXo;gm zD}6zGoffXgeAL+bQKx5YcTW%AOcLXS#zEdz8rvO}ZgWB-u}sVG-4Y4vuMZ<$Grym+ ze?x$fLG8j-@<>i)2e+vombdZmsG^V$>aaRNf|)8Alt=iGa6S=ZD2z-F!##w zo|8a5*@_7x|G}r&h+Dy?jt_J9p?>5rNx|!ElG7DJ#vhmzm2>JN#@w)zHHL-H$Jj;w zo56kL7$Cv4OxifBXE8Te{T-Eksnp*`TJ`>%Zx)xL7@jlhU5v+61u(b=Y8|L|;XV%JVW3za+nD~ZcBy;}O?e9907Ewra zwP)(aii~nc+gSbT+R=ycydai?hK}Rls_emt`t2FH0jbTCJR!%sDU(g&rhvD`lZdI^ zV0x|q9|u}K`-U=`jA7*6f3J=0e(Rwn;$*W{d|6CAtIdS)H~vZDPzT)>Z9yMdnzQKS z&b(0LwSi3ervsYB&JwdKCt}$W_RNcqzL5mSa zjYMsTTMs@@=SPb`mdjjEk0^B4uR6A$LX#v?5eIA`2W$C>m(kxwuehHO6cifE9fWuZ z7>yrCd5aT`DWAXD9NtNDB3hQG)VBA_&oyy(Dbib**xT!RggPO&d)3vI z3!Z2lH|$yp#W$LHnM_!879;mX&FlKBEoj_+{oc{Y#WFF|C;5#>>JqUCBD=1(@tv!^ zt|oJ-2te)ta^A}{*Y*Lvl7hx7r6im%Z%A)~s+cb?bx%~hF-DFii73XpC>?P-tr@2g z7s6S{P#O>#D?%_Jm=2nseP&(!p*4fF1G0B8}Pl8gx1HZ?1%Nj$`B;a6%xw^L=Sp{Xs0rQ7|)sUmz$5Bae@ z-7fZNOHTNb8TCfPv*U3}2WFir4>aNuSK2f&(JfOdD#%;ulJFTScHKoiTxV~;B(HN~ zB~?gneB9DS#X&D7CH5TLBx)KK))5YThTjKpPft3ki{acYu-<{J zH1{6AI+;^TF$Zo~>LV!o!OVRj7k8R7=HcE>lBQNSwm?@yj&_NOYBzvKNE{HG{B@<@ z$VKwy)31Lyo7Q-;miaQMj;$&OYAF(BV@ZeeNkY&zb*Dy8fC0B6OF#S!nA5Zw^Lk6O z5C38_&UPb%h<`I%#xJX!mKKb{RF-)3BsiK|T=cQFzj7ybmxP2eK1hw3O(JGkgKsl3 z4gSrp;Z+)jv@UHj9n41m%gFgQ6Zd3CF0?yoXuuQEDUJWG89O$b&wTM0!#@$YNWZ{7SFDBPj_ zfy&A(yZR3sX7a?9u2KJYX*gbul8Php|K5@neyLj5PKcFBX??_|DsiRW=-h+;_YE^s$N139xz~pE=IzpOL%pn)zty(^m|X(`ZJ%e*mV6E zfpJ3wQSDa~#gde>An(y5gkTwddQf`3P7p^!aSNGg;FiNtMT~HUK|8z~RRRo%t*||I zrqBNLiGo&FTA!HOVZ*nFsLLvF{?#Qa{oKxjUJdPdF3M-@84=NvCz#wH0bV=8TApz zie;r_38x0rLx1F*Wy(6<8uzDwyN^Efw*B`L`#9R~qwSaQ)guD;l*GR=;+>C8=Nv}r zTe+bIbWz{9>MXw=)@>M-*O+F5{>+27m+0GCa4v<;k*l=HX;w4u{xp~FtFbRw;uN-&cgcBIIgT8G6Gz!RIMLP(-kJR8AIw3~4BZA6gfk8h*X+F(@!hI5 z=L|cwSEOrX#kC>v&5qvv6det3vmEp(6nH_xATd+txv`+x=nb{w@F#(Ui(%fRQh?iY zpT?-D4h)L+s?&90ZG5IQcy>6y`t>(h?G}4??_@YFT(-tq$S@JIptHt)VEJ=V4IVLZ zfX}&`&>rs#Y>UVlp#uRf_;sGIRyC}htrA;{DjP5Nz|#w6;^gDvRDW)d31x?g6YJ$v zV(}Dib0x_dD%+>&{(V+=0VO3HI^s5e@8Go&+jMK*7YtP=@57RMXGw{>Bqp@4Lksx} z@=rg5aq~vQncUSOvisZ$hlyBx@H}GHR`}yU=n+uuZx zqag9hpd~kO*ggNv;+CJ;Ved-%WR!8Ky=>wd+C~rQroZe)nKh*R+ScRuLFH)Dq809& z-@y%$VnD6|nc>5#vY`K(a+PES83L`I9BhpIJLSF zuponZ+u8X;g1sez=t`TNh;yPxc+!_ba?|6ObS<<*6v~KRBRD7X? z=$_^LE$LO=_(l4vWFPyugvJp6#2X~yC#RQ}aTEQ=W>uTh$DM#Pb2zQ8$82u0K9xMH zjQ<#NOR1I)`sU$b$YY|YuS7^{BBG4TB@~<9q@Uh>C1mJC?PL!fmsp+IKHYHD5Q2g{ zxO(SYG-1q7Z8L1|XYB-xk#5M?$tQJe{w<&j(}HjPrDNl{yDav=1#BxW>i0EwsC|0Keg)`&!y;Dx0#ep7yRixhLu|wdqIkH#O(yzj4j33;5BCt%#25K$>spJxiTv0)n-U$gE2tl~byVOrbn-KTL5^c&(F~(r2h@$w3>aS) z;wfUikBwes@Hs!kdYz1Hb&9Zbc@ohGFSm*wBAKG^F%Q0$l898H`z^`FSB~Yr+8N2u^7ipr-D;z)9|zB_7t) ztkkOX)Y=~(p-$R$f>*?Fhy6dvz?3qbdJY{=W zA)-T)_mc0q(M!IZ#*o#22Y@?s7q?YMR!P(J85wW~c8<#H464iCu;Co2#7bOtOYhrK z$##ioK1^dzr-Y2ckd1~R!}`G4jiw`M_3Rm%%NNsl#2C!nuP897CWZ4KplJOc0cE8s zYvx1m;>F2Sb1eYjM%JHwSe3O_@-WX< z<`YZg5R)PlpP-cUuKWA<^>m)L?ZO{TKGHGLDrj8f!tg8-uy^>r?(y0WdED!hroRYLmvMYf5hCNl1fdO5$j`)2W}Dt;00fC3 zv%2UMAD)1R<7KwNc`b(NLpHf1*$AFw6E>aqwW1?4A5Am%oJ$C%ja4}^kLN-CF|Ot< z;dS$IchsE{A;b}p`rxdI8&cZ((+?-jBHlhaj{(5$-SMOrMSS}GY0fOWkZu)WIg%Qu z!zzq;G8k0BtKj5i?Z4;1)a>RYLJK6+yHvuvb$55+ZFeT0F>z*Nbxe)jMOQ**o*a)= z8r8Ri^^pnb!bv$g-tQ}E%-A`q$|a$I3i4VEYoJ-6*~UeSL8vmW*rUrRGr}5JG3*HG z(%#*%t>{GhK|l9l_4vyhH?x=^&y~B0re7yh5sqCV2B+<22`-?8vDf;P2>Xsz|e4zEV_{RQCt+Hw!JlN(O;V)Bwt zIfsqTz?3eSe?Hn+QS~gq+FC32ypxd_# z?#TR|IKW}Gy!VDR(XecK<=dOuIgb{;$9k+R5#kqzo%G@SxC7-m#%plu0%yQDLK#6` z-mqXDk?VcGnB1ue%_(z?m?*<-+-eA&wzF^aYyO3Tl-qBfv9haamNk%Afg1aPB+9!t zTE<`ZxV+o$Ruib+In|sH8n4eta%v)}3*INmhsae5;l0Ltd9|_q{lfNlk{BvG{Ah4< zz|~mx_~@(COq|YonSUW&FGn$=H~v8D(>7M786~{}k`r2HyAUqZcN7HCTE}hH2CY1% zDYus!Qw>JH{miorF>j285gt>PP4R){VrlkT&0P5 z%a4xDw(9bM4&0XVX$&T3gO&etzTHKe_1_me8M} zBm%~qYTGP7lwM9{3&$DML3Isb|0eQ=?f4s#lKD0XxftW+Qh|TUqmr~6FCOhk8z|~man0yr*7bT{=c&I=BH#(@dMH-yQ00Nl)`hLPk_v(jwP-`UH-Ht~rS2FDShjN5KqljKBjzrZUn-Bd zAn&8NFIgl)iSF^E0|Hdql@>+Qv}CJ7!@KYY)&@H}P8A@P9q)D7jG$WP0yoUa*UXcJ zQwEJ4%5vheX3SiyYg5%FKv6wQoz_oH2`2NGG8Z>iQyuF?!9xYLb8-r>fSn)q&i2l% zyLTqdcQwoval#q18?6{H!^C9_Kr^hvm(?iRV=mxtZ>P?4)?(G`8&zV+=<_! z)>r-%FO(}g+>>Ap_qhaw?LH#6tvprnA@j2LMbv?Uoji4d0#|7%qt)1Hcb9qAf3-R% zI$-3MPYowYLlkBk_%x~f0>rO|pPS_-94sEbG2pv4$-W#=BUfpF;i@w1pZcNsi3GvK z#Icgf5V9>sdP_KbcH7i8JG4;gJThL89Aj;~O8saZJkz_Wb;Yt*dh!5IBpY}_+iy-% z;9gv?hkN@)3{_1?JY6?`m|K)q=X>NbgfFMn=}Uv&DYy4nK-~f5MCs}nr@qK1B01s< zBzg*iBgZyj4vUghMoY9$e0sys`TMB4}SZIBWa2Af!DZ1UbJ{_;9oI=%;Cn@d0Q$}B#@z=k*@Pz z?i#2JcL|wV)@f+YiqX8cF~447dvX#nDaSz^BUVrvLkA}#Ruvl7+ibj87h|#M6JrfA z^P_bHp*4*)puo4d>bEm%=iS2q&O%P=Ik@s#&%w&tBBh;Pwa=3AdHU}}O#_(Z^`FHu zKphvMETAhh2lSjdiO^1a(a{ZVOzkt+ztyllN^sR>z#{}t%$Ul&ISl&-;n&=@9C9QG z#q}G=hW~N#+WayafKMrGPRh=}0o;L?9&NLa;dTeN!M%sv>7jgZhvf{A!=ZYgXX8M| zQcg?v25d+3p8wY*=X>BM**Zb5&1z{6mg?S*A0!pzsrNl>Otla|4a^U8^Q>~?A=%&0 zKdf(ltfeTh#P4sXEAxu>sdL0>Ym7hX$CwF7tVjfb?D1nY!p7JYW>P{MP<7hu7#~#5 z9GLc7FCk^-?-B1WGp1|rm(nA$#vAsrwkOd-+*?e z=6G5r1EMSlT`qsH`!Lgd&rqvlev{!vBWigW{Ftq4MEXcf!E{)*c`H}VV{bV$B*g;i zq!M|-N7sDA*Rq5NJ1#$TlqV8*b}p;CA97pzOGeiTtynFL zznc|rkQCP_oNsGMdlu(jMMSngi^EZmQ;v=uA{t*INCgR(LX+Dnd*ma{mX7 zdb!x^S^lV&7dn05iRNx60#v|N4X~bcaN^y(XmvX)TR#&tjv8bI7gm%VB`;W3_4nHz zmA60WUnE`g#`79)16H;Jw}AGyPo7Cq^cNdBy(6YNzjBKwPaYkkMJuXaPx#MaM|i~Z zOT>_RvdW(Kz%QjTxAunol-3dro*X!sQ8F&|rC+!$(vylJsurQoKaMbQ329ZJs3UMvbdK~kOK(0!!+eq%~V_8pD%@KAG!@VEYH zi)RJi?e7@-^<77wOh_cVs7)K32%XarFdVct684eQH0UU&PwL8IeA3#h{A9kY-A) zU#qth)|QIt0o^}&l1au`cYHCSubeSgjWQ{w7+Np?x2pI(8v7Ax9 z@cr#Ls00g`_c{L1*7)8{`bW#e!vTxHroHCbzj$h>>!}ldGjAR1g302SXLIq?$C7VmM515P6lS9T7?fLH-3~E`-jh(c4Bu#F! zpDeVpuX35<2MD>45<}+$hl&JgIkVeg{?Hszh`B`Qd5KW@JD5CRdvq{MSi-9x1)J7y zE`%-z#>zXW$Oai$ky3F7v~@y(l*F=%`HcsHCFAlVPVBA%k?j9Kv4&?d4N~f?$0qbE zvSS9ZT6(;^j5Kn{ZuVjZ9^8L19@P@^dYfZ57Aqg|KQ|sClY;nlCeUmC(FX{qtbUr?nta<7m1`28ZPk5(6y0&c0OY)$%XCkP}i+4(Y;l3O<6R?*n+4r6rBiG3qaEeL@_6t5=s$*4G5EzddEb{Lp-1mcKF*kP~ z?me@Z$K>ec*o*meo5BZ5b7r1hZpil)LFu^SRo+Ed4Qy6@ckH-kE&5$=UL1X`L)CB} zS`21<%E{OR37h1W8?38-~WRVr2HR3DBT@=|%Vw z%==NMh6T$64Uf(5TA{oqnFo+U(fH!V)Xch`PA7D+0Z{v)`i7Ci;&KD zviu(xv4(o+4Kz0$c{9^p$3N*!fzg*-DLs$GU)7;i1kkEVSN$H#qI~8(r^qE4)o;l; zncMnTH4+P)J7PaJ?eCMAB9YhCmxx@X^K%|oL}J>3s;K|+<6CUg*IdcE7;+m?>44cp zt+(|EI`?yI)Q$6u^sM?Pc;>v%SPhOX9hrYB zv*qXS1F@<5S`?5cf`)>VWy9uV?teE}ZjUdH?%$8z6`%jbURm7`Zs+xI_}a?5bx!%q znm*%>E^>v~S>SzC@E3%z(XgL>7zfU#<9D>FKQSpSQN z6m(Pe=^cn%-T3YiyjrS#84gW*Zy)Lt9`|(CZfddNU%O6e!AVx$(Rc_?Zo1zobpO%h z=%K!h2fgcySNeBc4^3{nwqHKJ|D#5UGXs-rf^;r&#=%XVbGdEL8u|V$WS*b&`D3ao z1YV&>9C0P0K^e((8QZM>gN6L?e4Kwus&%4G*i7jEiiP<9FR+jpsByW$0Uj0tm0i5N!eFjzLWvTYkAkM88BOvt?SX@6c*?Cqfa z`p2$&+l3LuDd67h!IAk-6{a>4nop5>egzwGr09}L;|Qt^A(6CC)$Y{)U@wBlE_{s5 znBB5nSYYes6pvi%wAqh#18cd4Qm?spR($I4)0IIT2xIc%TTVN+uzQBz&}on__?OLq~k-X@t0N!7Gx z@YMvOEn_>@u@U&@yc04Z|H0Mhn^R}qPcU77J(GhUDL>(9xo2cfIE7X^TPAM$)0H*t zYVnWSeBAks^8&Cq+dh=$Q443<)F#AYG%F;#>W1jwHkhltG*+Bfihpv zgT2hKb&e}*sja}XRPVG1avr|BKLkE6U6BiL|C$xYr@R zfv2MOi{j;Y6?dqs)QIav0F9qE{0|_`>u0{?4uJw~Nt8BtLW6rwvG$67RYpXKq{wSr{Lyj>De`*|~sBb<~?cevwaA z4j+n9B?$ldLLob}i2YIqfYS^hUs9XiJ2V-W4=5X>)3{CUi#F5%#6F_DgmpSYPR|{H z3oJ=r)i=c3sk7r>`v|pjf5r@^Te9KosSZTTB%Kug;0x&KNSVX;5hwWYB$UOPk&&f# z#Jlz`cUS%Z7FD8!goYlJe5#s z;LD5$tL?Ghp5zCgopQNifMN&VY+*m0YFQ%M>2X> zxC7_;zsFKSa@)>|8SB9!UHASyFv^1$9C7SUHC%4{&~?dGzOYx8jsc75yD}>&7ibT? z&Gs0dAS&L8gKi%)Xp0efP9qn<+wzG#@y~h8NV)=Xt*=Y>%G{PPYI)_1LJaQ@Z{+sQ z2Bgb`=}i+09vLtH^QAOChT;+KJ%|!2-Jp$fZ2wTp_BwVM`^WC$c-0aa9FB+%v$MJcJnKE9oXC9I zoeC`2gf~17?=>&G#*0CHIPOM|Ch>SVO93KZ@r74SHNC_v)RCFESXFoVuTQG9SB<%( zzIhc6Z@~sdqscS8MB9f}OPVgMp$h`gBK*G4G0|o%O(Ui&!|pBa2M;nbvm88lQ79FO z_8DOekB2g_c+nPN_B_pfR3+O%miL;l>Aqvz`OIe&$-(3hAMNohGt~UM0wE`icOph$RgFKI|xph4*jI`4Dq>DD(&jFVgWzoT!`r(-PjL!Y%I%ADzd ze~Y4$vfP3rTuDbRV}0R?>>p+M=?2kCJ=`AOsP( zS#Q3OQTJ=^@}Ho1revHkZ=Essax$FvuNBw{tp502oPdmXc2^Tv%P-Z6W&8RDlFBai zxV}?xA1ZTutSxJ>wm%jXPW*^fZBkQ{jBTP+i75IZ-uJC{y*?>;l9vtpSpVSj^^Vi6 z00VX&Y|{gL%d)(0lEdI%Z8l!3=>Ykmwgsyhp6%M}+6!gmS2*L#V_O&9bIr#j;QJv| z3+}kZ=+TWczvY^`X4DSM=Csrn28r&7i@Q@<65tzj2_n$#BV9HX&R++)oE`IM%@~XO zr~4+DaNk*6+?c+XklWN_SE6%6Z8HIQ(BfE?_ZfmqZ>VqKk!gf5Wqvz|n>z#6=L=>ibQy_LnJ|&nj9ksej z3(diD^W`epauFm!8QpkSJqB$dp~;Uwwh6()@7psd++nV$VZ_pFK5#q$Uyex(L7JMQ z(S9X9Q!FDVgRRVcd(l^+hmgF`kG{|(NHn>*)Ab7X^bbH|#yhNq zpRTWDf?Pq&O+*O^3{`~OY<(!|bmib!ZY+sJnLfbx|5KaqH%V-WDbkrlX;|;_lIyF5 ztGfDizoHZNAF9U_{*!De=rb$ld>T;esd{8kXW+l9Qs$u5K&LzOQ<%JLDffD@p4CF} zX66f~%M#?5dcASTUyRFtV!yIS&?{m3cMjx0VGaUk5W@fNIzLhAclwZBo}qTg4S|`E zo$2SV+-;aQWhH5D;KlqRsCsaoxPhy_KU9vA2w&E2K5DPvCficDHJ}`vy0LHhp$qgO zr%VBo58Um*Meyn(v0r0XLeKXyVfN#ei*;{1OPNth&h8 zw3jmap~iOWt&_w07B5KJvVp~h0C zV?3(tOu*=Wr$YJ-@ORFmc+{ZlF1~{78o^P6cAsK|SY@c?KZ|On>IYBeoD=0dc-KnX z&5Vp8Hz}3jLbuak^Qso)B7}dNmJMb|^LUd{ZneWNUZz)@O2ltJjZpq9!PnNX3KxAD zwH|qpWA{Y@0d+Z-l$l{W8M=4CT?D@Z9AAM@2O{kmG!6w#DuOQ`u6`HZljo1YYyK=% z+A;4LucGW`(ej)d9d?k;c8it~b}tdWb}zFuo9v{Y9ITKV@pF#&(T=%IS7LA-ZJjWi zi?oyZblDAZiG%HvjfC3VUI3y40#VD79L}KwL`|p zw)?L&aI+Aut$Fb%+7%NK0NA=8_lCgyB(rUwa4C%Am}qg7;sMWjiE1!hk;vgU!qlkk zsZW{89w%n#ahSvco; z50K?*tW1%6RI+EyTKdOdYdIf5C2AL;CW!ymW-HD_P-+M=|Br^%??H}q%I|i-V@6|A zfC|^%DcdLJ*wPlqW@749)LFOdq~!X}A?EXd{1vtw@|zIyMTis#KD~N+T)}SSoBp9O z`Ja~#_#lmHw)6E45u#*%322IX>|?fFRzAp7v2y>}lMuSS_omrt=ii9!=^kHP4+k!r z-B6qT@0U}r0(|>aYos4DQn!G(tQM=0zfv}Nl{O=)qB@&xHlyY#*>6%tQPLo zdEE7zFMovL#iSP_J~{j2!uwak6gr1Z{tS;BU`t!;`Jn$BZ*RiYWEQOriW8*>h{!yt z2v{PM%n+ay1r>o(N{}&1WDGJzAYoKdK&B{)%!!CVDMOe;NFYohAdm^6VBbxOSW%6T2iXuK;m|Rm(_(Lr4#7?zGGxSHLN3%Db4l+nM=YWB0c}q2{@N*Il zLS^a=2?tk>Cx_dl*j#@G4GkR^k(ON!0c$)CTlI2t0p+zGJ&;6C&FU_5ri02Ff-sZY@W`i8(BU<9x6dTzu z3QQrV2>gN{-qE!oAE6P`Eq*|d0Qv1d+gYuSTE+KT5!K2?fwDgr36o?3nx1osy`xYi z@ROKmy^O%xk6c6)eO|2H+SIb}TisbJYW-LxdSP`@_V}K?*=CJA9q~tKp9!u+rh{v=3QNaVsv%9 z&z8OM}79`nyLJ=%`f`ErCe=r5@Izo!Q1s8-)=xLEn0SOb}x;E?}h6vNI**n~Lf zf$3!tAAIY{-3WNt7U9OyGXj22lY%Jw5GmL-`1NeQTlJ|N@5})?&gktaPi(JI{a;E zj&mPlLAHX}Khs;y|Iz>BMB_(_8-HxtQdCdjXH;bb+DRp@r(3z1Y~7TU7Q_8>{WbE@ z=f@TlYA1E&$E0{ka@mCPggE@swdG7?wDHQLa>v%c#=FILW_lOA*q0@UW03z?y`_L& zKBRk8G^E(`ebQLOq>YGeOjt9v`6AcGN^v2^eDHd}Qg32LBJaG-;~fl1l@yNJLTKM} zTUJ~^K+h}tqjofxHk`RE?^A%#fhMW*@rv_e zpz*7g;qz_Q%fEE(M>m$vB|q*kNTt4C9El3^4kvBjSzEqxHmSF<<|i?Obiq4W(IRrB zq$G&i*H><9JJGKEY_@kl3oa;RR6%<)^5{;;iP~4z)s$6L?_&@=Ele^}$MSWk2w@(x z;GEadM>oIZlzQup#sj>=3M>*FOEu>?D8;vIl7COjdL*x~aHUqi;s5&WuETB4)i(Cd zg(cp>DJfoSQ?$sANSh|6x}JtPANIy8)rQ>hf633Fa5D3wbjbXwXbaA;y1}a*bCZVT zb2{&zcCAm+_TtsFy&(N7O*{OK^HDg?sXtb~o%CLxfh&)zXCImR_}hsA!{6}7qKzL& z_il+iv}Y(^kmWasP{8hv2qwm2^d8&$ykqJ>W8a zTXg>f;uY6(D+ahKd%Ss^CdZb7Jq}!_1!WJUxZMFJbjtCI!!CUfrLxzHX)UMCqwe37 zWmk_cX6ZIjI9`Xly-r7^eAGIQXF-n|AA%~>4(=D>w+)xxB6kDC(Cb(AJTk;CH7nUK z@D){amOYlS8O05|Za(5ZSf?oa?2DD*@F(_w46%Br*!8)_GSA}wN2HCnuslM2f0Zp} zE^YjpRg>8*W^->yRaa{%-K3WB76abcPB)=IOh0%D?9s{b1L8 zwQ`$XZ}As$AgV;$C0k#f+4^eVA|G+D{6G9IW!tv=Q76sV!P=_exoQ|E0~E0p6#A&? zt9$AnG#a5=2w!OvaX4`Gx6^Tb)4AK6;55PggH=k_i=tMUf9;4}Bu;Po+c>Ho0XewM z@}pecsuMn$HWqCvg*~Rqa4kj6RMz}p4kFgsO>Wp@5y$D=yWzinY1cS>DWGSx{BFl7 zxlF_YSL5CSLXGv95~}|$_tj7>Z{{POcfKeFzkQE4IX{LOvDG%FnZ!s$WLBhSZN0-& z=0o(#n@S9ebxe@Ce7d>OQUy0W4b>RwrJ9{gb=+8C-}6@IH8;x=eH zt`y7Y-RfN3JAV92wnmEQuY*~AT_YM5!TXQ?f<04ck1^7AnG~FaPkM}7@V?-mAD_5* zyaK{13uh>ZH?B5c7<~NUj~%_^8{qKyB?Z3J>3ni}k%57ZpXFOYZ5vM2<_4(8S939S z$Kw(!h2a_FrKlTMstt}l%9KjUDbC+CHq&?NJ2RItb?GNQWV*y`cU*$=*fX4e*J+Ra zcIhC*ct#@n_XqxxN8$oPdu0mUVmYlN2V!4aY-M;CLL!UU2>Mj|bE2 z9ko&)$!QPxC8t#K&v9EK+jKg8OYwB9#rkLR$RSY+e?d`&(a5ZeNCl-awENOOqc>WA zHpVQnTmHJ#<{mqHDAj6UUTK^|)aSj6+WvS>Z3dDvr*EHF0Y=idw5(DX2A>hC{D zAvbBK)uJ78=o(51C6}T)cH@?sk5ze5?hYzvw-GQFTrEIXc`FV5XGEV!`)UUUzmOX{Z1f>75OC)FN$(nIm9xo(w~8}v z=|2+AaW-Zkqbg#^Cj3Gq5@xjp8UHgW?o%AwJPOsk)xv0D#}3n0$H%@rlpK~!W#-T1;*{yK)vd`?wQ8{XCEK8PqEumrFNBn zUfxsarp>H{qoTgN?AQwO2r~I5%Adlk9;~phUrT!@7$T@%MV83!sC_!5!keYt=e_AQ@8oB- zs8R_kzngmX&+pzr9#I0{TNeMU%O@9ZgfC<$It`g=&X-MlIplv@ z0vUBZ=(OIGoZRtLNM_e0_=W5kEr=~L^aHzKsZj4s{lK82NR%JD}PV6-MQP#np1ad@cDF8?1aw?Vw$uVQ9CqPVvl zQ6jEpS5k^JNwd-#Rw9Eu+Dx>HU|$Qq2YjPGj;P4NgUMk9NFagbK^eNY)IC1#T^plr z7PgIZXO|+jtMobc6CtOtu~`+>Xb^cc*AgU3E+9NEj-W^d5LJ~{zQ#55Kdu;q6b;BU zXbA*IT%c(anbAM%Aiu|OEbTu zcV4yx{c*`$?10lW@Cqasg(>2kYVFGO84`!@#hQdLnkT-#&|h$e;KTP^Ze(pV=B|Y3 z0EM;kX3l#lb=+wS7XA{?lfXS})*3#0xwB=@!CWO~w0G4Gzdt>+bvrnAiKY8=)yp6P zW)rwFHTQU$t0HRflUpphvGPV1c(j{~?b2>})N0fjupXAcHV)d2mO!dxF(a{_z`Ly^ zpx!HB6s=%E7`f+1q44Hl-%0&re}mH=QQQ{)aIS^npM;zsKvQRM8~Qz!yo?%$;eg3F zv&iy$7|zuZ@}Im*)#g7&I7uvdb2K_?0_4&}Bt}El+HkN=qU*!BB3pzcvyzIG)>$25^%giXQ*EdR7;@5vG!)X75ZW}4$pQ*$PBpcw{ zrLS85;a-#?qD!XwC~^Kz-hDubxs%4^o@;0PN%4?2_rWMEc^ciw(Hnoz2c|af8n}>b|^BSzFY$dM-gDIon08>Ev0y7 zJ>Q_Wdb@f944T(G(VJ{4X61BoHWhS$I`P#}RU~;QmX90Jz%~9Q3gbi+esX&XMaH z9F!0DDAIw02@EwBwMovmu3Cp!(C|~N)DoMr@N?MH#d_Q%5X0-_>m^pV?_mRpL8g5k z&F=WL<>Czljdx?4%x@vG@tq~rq>#7hdr=v+>mY!7eI#1_fdnR9!TE-0%dGGAjG_5! zk!hLwF>GV8UT)*~D_*r4!WKOdevW_Y$f>KTO7XGQDlYQfQ@kRcjlv6mukLp}928JQ z9Wjd!Kh`KQPKuNvtIV@fU_#USdd2n=uyYC)VR?>Tt7i2+GN^mQ-=DjNo6y5#-fFC; zO-si!F<|K2raATM(z!t9?vw($xCpwsPZ2HXf_yX#6_@G^^n zfLYEn=fW)jCW+Ezm`|a{P~6QMp&{CdjLpctAOU3&MAUC95SY7;d0aoRqsPFp0qPpQ zzTH%5$d47}Fn?%4BD=@2cVeB(amhzt56F)y-_Vf;=1~aMO2(?I(v!PuKjl5k=QF-) z;pQpIJ%l!S1Z7bNeYrC z{C6iKK8SwoAw`Ux&BlSC?2aNx65qux;@5J4@bglF5U2-=$dlBbnZhJanP*WX=&U@Y zqu>KVuZxLCDBnM?*RXXGCy8xF_n*l%9uyRwl55Ns{0sfy2uDMDN#w%**8#zQ1Hvu8 zhn(r<2mx^^ZjX8%d0=KEd-vxXCrnX{ZOEFuYHuTL+xkHRsM#dm&8h8 zokWb@@$1U%uPy)Ecf@ z3RmH>d-i`yF~gH^~Ku_X_V0F<2(Eq0Rv2qDX(T5W4ha> zVa;~P^={3ZKyYfC_WQC~2FIOpIe?*S1ggE5?zXDT359j_`DvDfm{ zY6GJ#x8O=+k_R7`1}2JjP?p2Cc}7FKh_x!SBDTU$hJaWkuO_y zh%u^OSe?yFqXfJ9p1)-+GTktMo)C9}#6e~&(%&~9SA2LHiAN~6SIT|FA^!HR1;5e~ zDX%CtU6bXepxkeYTEJ9eW?u^VlIY$?#%R1!2+&)i}-I4>kdlXEw!2{pEOm>aek z2|w^wS`82Pdzd6)cbB>I#uC=aU_o(cA=8xeQpQFA6lGz|9?^XTF}h}ivhNt??bO$= zH!M-|d@L3*wEWbv0_*;gCY*gkHr@+v)URw#ay6o=#60#Wr9mRyt21=$!j*>FPpapC znqey^t|yThOlXi)xa3XE&|tos4xy2NH}Qb_=@1WOLIsx%2G2dFq72Eg!w|f&jFTxm z*ES4>4A6<|RSe0sj?PC1*Vt^2;_UE@jV4bOQ2vs6$;-2jMmGto)*^FaNHU!{skwA1 z<6o!pC=IfJofCxlchGT@?Zdfv{iRC=a|Na&yQaN03J-`Ctyc~~$4wMI?2VTnFlSm5dk4sL`pE#Hz1mFPLuMOCL4^c{6L~RF_c6 zfZ1$GxkbzPSZAO_ni^A1nJZ1znH)~`Bf#5sM&5gr^?-6p6LQ|; zCF!uw6r&K=hfg&3$ywrpJgJRQuxLBN^YCmk_~+K7~Gy>fO6P@eDTHl*ii@A434H>FVe9*L7O+U1uYXdvxf6wdf7)II~L;)%zJcEc`msx4}eg5T`- z^PBrk7OOV+if&zT(+K^-BKyNp127ji)tjX?!^KMtN{oNqsWs=`aIuKUr5$P&4LZ`N zP-wd428?z%fc_g{pGa|B3-~EfmI+jS5TAp}($EumTzWaLC52y%6wENrO<{G1cCvGXcsN;tGPL74o|bRlE57KtlKWVe zoSpkGrisB9tnMoE%=xoLH}|-x5qdHD02zO?}G5-7uT`bmhU3z~SR-9VgMNHm@uw#xq(c zV_&ntJl?lC!D=N%Ig3yH5EWA%kYVYjXc?1~xF<`glkVb98@p617L7WFqa;_4(V28aWUHNof}1P6%&$IQ9uZKDOq7%+(E8B`+lDGq^A4jP<7Q&I-pD4 z?(&RJfhbcO&HtZ8|LI5U>YAG(A+QshXBD@>ZbP2Zj6{YnAu`p|^*%RocC#}X?f5p@ zvL@4Xw1+IVTu_hS(nzh+UjX?tE^FZ7aGrik(&v6~{u>)I2({Kf#%9?Soy@AqB;z4NDutoag`>REU-4L!8+nyP0=yL3DCQsR|o<2>aA< zjU3L)Qvj1n#*d4RJnIeK;u8@HQ0MuFjD5#y*7}-kc=(KQ?+AlBp(;yB+`mR^*LRAp3o~J;W zrx3wxu#@3Hu*VH+d$a6xdD8*l9mMQrDh}cBd)G|KDX%}uR$Mbno%jPm8V!D~m87ZQ zoI-?tng;JIlVSZXkz&|&rKqid$SvO769Mcq%-iU;*rtLhTx_K18Wq14pP;oDL@qK9 zoBcELH}p!2IGWc`q7z<%nt4CeJ0d_L9@JQGnVp@Iu2t2zP5jehJ9~87u6LCVN{|J1 zexKJTb*rTEDY#2P!cwqzHZ_vEDUXv9G5QI??Kg(2^z+t0kK7U+`|i7`n~%DN(Y^qx z5ry1Xuzvxl?k!Sz)D+B(mg)S>^(_J&t~s>6!|4XnQ?f^KT{4&#%y1NZu44KeJoM(U zr+2k5AKhIi?WB8T8@$D1Q&SheCCj9M3D!~nyuRA7t{yGOwgQsM_nT``K73+tXOrDD zOza(&jXbg0U1ZdggbXw9ELyZBoz3Sml|*Ir1Nv2Yda!T2f`+Stdoh*&e3g+x5hu4o zJf0064*Ve&2dN8g3w+2?mI%UVZxou%3cYhEeWOmg$)5mZ*Jo~@Q`mfVMH1LMsf@WI zK0lM~_?CFTRTyvq{poMI+tzM5zl6yxW8A~3vO4treIR}q2S1{*uh8BnXllGiFcQ-RvQ1Okk4w_VBb`uZuh`%;4p3ivtv_U6#5gnJf z{v$4vzA2D(&L|jHJL(dxu~W_it@RP!klB-hz}%M2o!AR8t8x2b3puq}%UdWXO7)Hu z7J_+8MhK>=4qVPn9OoZ!uR_pgkh{IEBDD{DT`{AT57s{(>MWV<>N4>(9Qc-3ThQr* z@~~vF2^)P2x(oa^IBVsj!cp_9DNyfaCU(V!wn^TX2o#FSKJk`rRSvI2ov($)Twbj5 z`o}&`;uJbnke7Q&uwmd{6ZuAI9OqV3WA$4Su#@#3H64!i{j@&Zi(58`2q_cmbsxoP z2JC588K*vOO%&;;8{i-d>pw7cY3{8Xqv`Gj;SgP@9Pr>s*QRSHD_3fOP+$pxO7%N0 z?OwA)l9vb-IbyilFkuV#L%9mT`I(AOm|9Bs%fM+&XJgvh#XyVZa9ZZgfl{-| zzn{uOLZ+g*P50Y1Xjxg`^7%E{*;#9m?K>f$L+B7<)b8v+N8?ebIeQMgFjJrQWwYbIY-_QRF=-oKSoxML64YzgGK#3V(=6U zp1en~m`vKdquGNyx_eEx4?wQd=9@D@;j2lvnmMv#aUK3f-;NqBT$47Pe}oQWM~T$V zmOTW+iZn<)bTEoZ@&_~PmulDHZMss{%h9If$&eG?{I(?GsM)%1xoY#TDn0ogNJq;J z@~OqetpArtyJJct)ket2Q!U|?PIY6Abv^(>Z(c5?l>RumTidz4UA(h+Mw9!_CY;o) zxi9TZf7eerGbT-P)<#4u8IM#TiO*wn%yVj^z8J?cgS)U~qc4Xx9~?<=ocbUDs5234 zvB0ZqCuV6{$VViG3oII1(e?b1`0cfN*DG4Lj}CjP-Z31$Y*6Zt)W^DpdSuw)GMHx+SkX-)h=f);vCialp9#ehPgC&JRJc?yx^0}Q5^;W^5s zFv@z5YR@)qWwGEos(__8>C$(}I7l_zWw~O!!iX9)Z;WpA@)7>7A5>u3Pm&fXur^#w zAL5j7&9a`%y?NKHLY!Tb{v{9Mnr<`}k?G3sYzB9_e${?=?^Vt_&x(u*P!Mx6W%%Lh zv%7bgx%Oqv_ng%2w(?*kjX%FdsxVUZFJ`wNLk5zBnWMzW$d`|^_ z8msQz(9Sg}^F8QLqw|O?a2?{Kh)$Sz#wW_(7;bu5`le%V4op%10KG;>&$}m}Tf;=K zvB;=t!p2fg%EH0i+foAu=5?=XxsTnV?ZV^q3L2XSXNMwhHVnIlN7!Aqy#X&I>Ac5V z!cDgU=2tQ2n}c4&lFitqSuulhLqqnvrB9}3yhqy(#SN6!k1dB%wB$a&3s3PX-#4f{ zR(UXRI_0RQY-e=k;+^qyF2TlkcE(@;XEiR+7poW%7-9QBKNPD_Fj4D*sg<^9@czy` zb(K!rigN`76o@NAdlJ2wmjk(2e-u(BD!trzs_rP$z;o?-oWVIpwfegTjqjaf@xV^- z?B(2acJtEQf?Ufo*1EjU_UYPrwysM^4cbF)r$++hGG0@A6r1oGT79YN3cLWL-i!4; zOt(?Aabo8C>OJGCoW#MizTxI}5LzdfSLXF+i|501FXBW@ZrvE=Qd_l@A5gTAH=Cc& zul_naeo&q)Hy`)_AU)Dje$ob+4Q@WKcA%~GT**VT67|T)+c$Lmf3Y|ReyA4+({R^Jkv%Ap#(jSvw$|Tfw`T-0{^gocCuYmkbmFXyC{q&v)k)`S3 z85xy;j2iT8w!ETc0q9a(qGH4bEc!+0%}Cn)nD z#$EhaUN8r#zglCB)s2X%UU&}qxYNR~b;;G<8ptL^ys zCkZ3p1GG;s%|0|AQEwF`F8AKhTXu+2s$WCh=0NVSr4AxJXAE1-yT$GneWrHDirb-F zo~YZ`5n-7D$#)o|Gwb0f`@&^R;*5(qRplPPF6QX%66RNwN%r7k_2KEFm?gJy4MeWH z&QNG7p&sgwaUIEfxH`9LyM?Tpe-2@bsz?UN^>wBmwl_5<{Db06=^1iC%K#fG#X zZ<|mgv(QmyjK~Ew+)=CsV*oH-XT`sv^&ee>jUV4SkD$R0W4D)#D}9eveE3Z4A|1q< zjSHL*858L9R?dY6oC}ruX&`&U>D!X={<*;2=#{&XiWUqAJ!`Mm_wsV3f(_eZV{kV= z#KMX}L$CDDvKcFzW{*mbDJ_E-Gl9(SOUW|bZ6%9NvCD>~?7dM`sgP7+}(kgZNkNGlB5nIBXvECjhvTg6-lB|zI zHcD*fLPP|EX_-^?7AAzsTFDtOO~OC7TJyniZ3bUCpp|>x-Ek%7K0e;B5d!JwB|%o@ z$`;*R-6k~^bhZM5qBOO_526A_r2vuxr&|(K*Hn>*`28yv{mJ27n=?lk^)vPn%#fTM zIl-N)2h2sGK2NW^Evl@o2_5M5)kb-;weZ*43pyxkqrY1I`XgOV@5!Eq2{&w|6K2-+ z-z=5$9`s+kxzo=-MV3gpdsh%*$Z=9?``E&d=+<4ZhpmtUvzMxAT z|7%VE2j?Y<+com8l;BXS?k&52-z}x|J@#d@%vRnTe3x_WL@FyMQ`ZA;gv^9P3&1J8 z{I<_Fm4%IGl_1?H6Q3UbEw-)qh2H#G{I3tx#rB)WQQY#o|B2VM|H7-%*Pxi^G5HVD zbVuj8(sDdO@;^*)Ufn-Ta9&-NVBJ4V@N~Cm&&1|5Fumd~k6~aDZHyC+GiXOfYy~6; zoQeI@bt*N{10nBP3v>B#!?p9P+D_WvcQ9s7eae01cf&4|Smdv|l1ht;c|#Oq1B!G$ zL%}tLv8m(1<}=7Gno6{qsJ_@uzs;TT&d_Ul$cUr`Yb6J|M0{{U+as6eWVsAJ)y&V8 z-BW%nrjA@P{Ae||<)#DIuD$i6$B1m9PQD*q9u;5*WQ@3hf)Nn`8VCvzIsw`$+G&c8 z?p@K@`BC~~6(Zg%_BeL(Y>86L?KGzo?J`H-`fXkeypcQv@;6v@N~^nG9$iCAlFb~0 z5CH9c7w@Uj0sFrxn(uG=#H~mTUPiE+Vwr@xG}qM{W^H=HIBcmC0NJ}`67obt!MVfE z9MA#j4?LE}sQ=j3QF3mdsL=Y8{m`0`u76S{>WJ+po1{1~GN<`zmzG@QFpqy2Jr^Bt zxOt96%Xf4PY(>|g=)A|Tc)75c&TZkV(e8>PHBq-M_dii$Zfzr!c&|3n@$9rluhn}W zzNG?ZC95hTtCxd&hK&Y*WC-=w9$kq7F!qeX87kKF% z*3@^8QE~}2a8EB&Yr3g|9^NX{o97pAYRIJta-O%6=Ifu#@rs{JUq&dWDs*F^30i?O zClIz{A-5+yUfj2CafFW1u8;d0F}KK^eS_TAardt(Mxi`t*wrnpxlhwH)Y281sgCoiQyLIdO(-=?1AG&3K6{NCwwu(=yNCA^I zI`|ihb#-IzrAKz2A3zB9GoW;vBRI!^gDjaTcNW^FOWA?xRXDGO;mp0h-a=aAR=qf? zO`}B*YXc9-P1Q1@b=R!YbI2CweavRoBA@mHBz#T;P?ZBMSpQ(ENn~K20Rpe-=zB1K zQ|qgXlrTI`SkU3;Pt`5{KLpe<-3kwa@Xe6O+kBD3SNs1JFQ|95Ii@{j*=1(TP)ELL?GC%fIINHwQB*l5I1ur|+NkDWBJXFLTNK}b(+U@qCG*Tj8N z9N&fo35(X{RsZX>)n5ej(Sb)s4$OD7aVR)Bok--|?5t7&N9s^g_D65*9sN$X+2V>! z-I-mSgl>Z)d2Ul0PXk!y>kwlZI@bC2^odo>a#n;(%;f5(9~XxYx8qZ>7@6(t?R!qb zuC-hfnO>b2a_c&d+|S_e0qgGY0A@|sStNOZTq;3lS~fA(BU7nCh_j?@5T2E-Oe$rr zu*bK0O)Jd#%9Xn4NuX(IZa;DSM9l5oFJ%c8)aZiLIq7y`u5=miyS~2xx6--+>P&x4 zW^6Eql9`;d6A*q>T{0w}^yz!X)xz(XEhNUy0!vV^MW8LbWrwlmMg=bnZilg!$I*V(n$#$$NdP|P*I&>c^fd2NU=Ud-HXy%;AjJofZo24!+K23Rh z4TR2`Cjl?}#}ZkHH3U2GC@0QZ+vykbYiyua&@0XH}s$&FBAewCI6@vtP#k-BkR7Dc&@O z>V(rTFoSf-Qpm_y)dJYwlP2iO?d{wkPToTI04Pl&yKTJbC;)yIX+I4V=Zkcd2FT%iD=@K>t#x2xd8}nmK*W48 zE6p9N+lm7pWKpLBG%agx_F)eNCvFSV1jw_oPqfN`xY$ldCs505(dyz;VS5{bI$U1h?D#H2Cc4jnG5+ zpkGezeDY+z*YgtbB>#|gf3CFhPHj(wSq-6AHZj_~)B@?4O3bS~+%}EDDL&{QJ*P=Z zG*TX(Pcu=g67kvpZT9M{4#e(=2mHzANQ&5IU1fjWHjefr#HPz+0+T0Xv+_^*7{#_WS})p>kUMPhuskC;GYnHTaUP`*MMiF#QW zBWs_kg7Q4CtV(iid~enT_TamkEwsm(bwTs%S;S8{2d7y|^zDGY()(1fyuKX$v~qf` zd^^-*`hu~)`RL0O6NY&LYxK`(4LDJBx@(r{R{P5w&5ugtcCB>BR5GRgn|YdASB8^L zhL|`*!>w15u8%5k=vT$fmcvd<&7HL0Nc*h54mMXcn0F{&(ofG#3rQBUwiS5@Kn1^( z*H>C@zg_@Q>VQ4I(DI&0PYedFLo1!bW?MqJx3&{$tlfnXCTL+L3kN7hNBc!?m{}kV zIPz1rdP!ApBV^JZ7#zT;b54c(l7L;cmIIu6*FSXC%DGG)P$mxcIG~GlOQnY1WX?VL&2~gr%3yGajG{~Sjy06Y$wdq;NNJ9U zOeU^ayz$t|7#mVh%NhjRRTgKBM_D)RAh1Jb>`7$$WUP!5Y-r)L!~~WB{!H+6 zfXNOIvas|+MN|D@es=+l&qY#*PlI9!$LI9iK(-Yo5 zZOk)lT|X5l6zyvm^Hpv#N#XC5g>=)^8sy%wIcoN%OgjgBMqb6b-x?cyhcQkJ_K-_P z&GEzMcs2k5mQ)xw^&pB9Z?3itBi;x;7m+p#>x0SpnJYm{=27dZW`>nHp65#m4Z#{wDX8#f{|0Fb zFhUx|{dfOuaCg#QrExpYMx_;bgYrE)@4U5?CaeFCk0uGX7;< zkCBWGsq^G_bWYgv1L(ZRCBI3{HVT?{*^)-Vmh=4$rd53UiyAK^LO%xGc7Fq8=~U|= zJ-tvN-vd$|Qk$7ZuMRycE<7ER9pw@7%DdhAP=5Ox(qjIOG)e8~0Z04!LcD}>;7#(6 zWWUOIQOCQdh*xIZ@;-ly(fo1Fx!v#ET2p}C`;q)!Ou~<+T7cB!=2&gd-p%hM&^bGu z9C9c$Fo=vh?sseIRv^)9U+0<#Ss5RYQKSB9DL3jSu(kKE2kVya+13qrIytA*t~2wo zE|wnUn+>iBtm}y<} zGLNuA_Pbzbtn%`Q+ubeaN2v;~4t-**_PhIN89 zKg;Jsd?)(@dDR43jp)6TpeJ_bs-8IVq8I~%Lls9=o-JU4hFxIi6OD-5JY!+Ph0;$| zxi(+TQ&Ouz;AG=-_8XM>WPZLS+Uy@cqUU+DxaS()`~0RvH-B& zCAQ;x>;>8$p|0*3Uqj*0J;tmIDrDvvFazwDc=bm`&*z!|tPSEnubrM}3c|zmk`1fD zPsG!TgqIFaCZu8amKv&rMz|>)i6uS26Hf5mzP1X3t9|kH>~{P5|AU0P5ia{T*p6 zry=GX*pGG6LrU$gNlQbvV&m@p?G1Y)1gU^_n~ZGEUcv7`n;7Zzh3>O}eTn^fApZHp ztd!<-!;I5VO4j?K>albRsU#?6QJnOnRcy#-B=0)E4`a*w7NTCc4q{v$QC7R8F!y$x zwFG1_zCU;<9!~!yv2#jr8UkZ$%GHgF^_2i34h7L+--Zv&*XD5nez+`*IPS#ZF^a_* zek6!JX+egrTs$hMvVQ=RW_s|?%WMPL-l7B>{p0qp`R01|KQkATuQ(E9$md4X%EbjR z(My&Rozeww;jg4uS&^ME%~kLM0(`@VmtF73XD~_C=5cnGI$wYPoiBl^A)f;+jpTZ! zcZ=`VWBBW5-xd9%so+Z6TMk1rCKz3m?3@rsnd;pZBF0BnAdxeXsP6KzjVU zkhO^Ov1IC+n|Nb@cHjNI-!b<-T97>^|8y$1hwPYHs5rqXww;BWGcKp)BqSENUMS|b z`D&4&yEZMi@{7@jetk@pKAc4f*0@saXxi52eD!h=x!mpIpOB+olh09ezt1`gl%QL* z)hEx3s7MG)8%QN31eCfYpoM>&MP@wxQ0~4a)5-9$DsQ!QeHMRo&DM4F(2Q%-K}e%lyRF{=)+NqE@|e!7Xz1}6?=h|4`VzaO`~C#P zXo&o{tPz_V=ZJ7-4z0tP@P1>-(tHhGc{p?8gbXUKtf3lHN+3q_@5Hy*P^!PqIt&n! z>u_9|U)Yua&q+{Nhfj-Hg(ktx3&!-uU*icn4GCuhx4q|bBrG)crT0hjK_OqM?PPx` zTK{Y2HrihHgwQC^ek2%?XBWL%e6(62Y6wzC|NZgS_V<)IlYD9_Tc&k~28yf)kPuGLBlKi~yZ_^C?inq$1y z(pWne4`-XWee6DE!+w$p|MnvGbs^fjb1|-Y(L%#~p5?OuDvrVh)Jt;#ijDSrL6g~g z97Ecxf`^a=nCxllRZ zF`4A1@H@RT=OSLOei8)kB|qUcyp39wC`hp&=PHuwkLLJ;LsBaqx;%G=c@yk=EeQBm zT`Mf5nD4R;TSUuQv;qzqG`jc#xc-#nYN0jl!jfslO$O|J5$MaMq_4?q&LhA&6l7I7#v;I`9}1h z|H|#;1x|Kg^Tiq2phzh5f*oJs?3==pRUMJ`jPKEj)Zb7oz{`U%{N{zJw*_Q?xqjx8 z3{rUU{9l#^{l6FW(-$a!p{@CitT*5bkc+>`?u`B<_{|s**M7R){t`?)>+*IjYyK{I zTD9W7kCUvFmw&y-bD3VG^xqizN|I`!H(QX|K3p_>KGXzPsuR<#Rz>^+g($0fXN>>K ztUTL1l>_f!abz!7eSZ@osqAKJLQ))7HF|-&oM*<+PHGhBE`IWD@;vLaffOCKEdSya zGus}wuK;gjxfSO7cb6D@krQ4KAs^W{N;J4pMqz37RR?$O|Kr!@lFMgi$_YOaY{RcbgqZgl2m2`*B}O}(7t0@5;`14tWIc``)0^E#oIf#Slf^4D?Zc-N8gcee zLa!QjK0^b`tL@H)1O${n1IX(~)g3dm350J(d!P?q)W3ktYQJR_+pqG9)x=jlg>^f< z)zDo39zCg=3T?J;a8*epMZIrIfIiXu|M4IEJI!|cbQfG(=EjCF5XR%INzK63uLY6T z%)WaD&+H%g%)i2}+Qw~E?yI|-?7q;CX&5;0%RnF;9npZ-m9_{M{^-4jHqU!;y}f(v zTCG@JlK0>#+1EG)9l6$C^hBmPt9Q>Oa<7l7hi=T>!{YbS7WQ}JVht3GLqFYN-eAR2 zG%ICbM*dsA;(_nSj|g4ft+oQZi>+H1b6~acoRMsmg+q8IX`>IMR0VEd>^Mq0m>Z%F zRa{ift(RJJW26Z$EnPbV73`-i_Z#blQvV*aTclK3vd4`9qLIoP2We)DIrf3`74Z>+ z_r^_lJSwE|C1z*G#5Yf(&*j!;WuIQAd{yLIe21(E8fUbOcVl zd3S8Ta9OV&a;DnKSxzRfFrd8jp0FzDqhIV+WS;VeIR=d;2MhGcZ+7WRq(N{d=vu9qP<(ukt<#xCBtjqP| zjUT2GWKX5d5uU8XI#2Ls%{csfa$((2%$&vnrDt&JB z)p$DU=>v7ZZ_=B4PS5*F0U74Po9&|Rg&u>x6su>GuO8S5Ca%SQh+R1-j8V=+#eC#k z&B&B4hrQFOG_X#^OCD)|u3cVP9`Qa#5%PEs;5QicA;+5Wm(Aj@%axK=@~w;dtBY$7 zYlM8v2~iKeWdfN`dP^XeC_i=p=;y!FlME6wM}@>t`8tYIlg5{&rQ6J$VC3!`%)55z z=|6y5QZ<0mD*d)L4+u5TfZ)(RNq?7CbACBk&+l4n-XY*Gwn_X!snU2$sOXoG`%yi= zm!q#RxV7eT&T5&$7agPDAB>Dj95;=`C7nhm{?cOxA8lsuWoZ#*D;f#nFp0O^udnVc zHE7m>-cb(BdpjYzX>Apb4$30TIr+;GZFdUObT|WGkJC@`kf*GuV3ftxfF%1jK& zzyztgq?`j5X0fA2@5XycL)=e-6m>J{GTQrwT6>jxDLD2t>bYk~9w*AXw&LJZ~v)7%klXOO8s~ z%vN#_CPb5tflJsmK4J}eWX5qUb6_sPa7E0Diq=U%N_QO@kS zH0vYL+$NCwfD@etujt|@3j%?)Xz~|zd%mCqsc$cY;;qxl`3IH7uX0}HDSNpZU0hh7 zt__Zuk;pPShi8j&0fwN2Dg;Dwg7N3>SMj;D$}7D3NU(VjD~#Cm5!HoPa!o^fv&LJz zgOK-}5PT7gIT&$t?^JF$kiCU}qqx6DZ`9C2^rV!eEw6RNm1`AIiKUJ&|3tpT zdgT@zzmFc&UENQs3z_?<|Ex;%n+Kj36t!}+Zr+~sl3!VP&RO|bo*h=9)%QZhr4Wi% z#F2BfSEfT!`~9o7a=w?D&V^`N?8V(IV64-2o6`214fg(I#8%m`%Vx#0vm4fV#_T;H zpD4y{j_YP%WE`sM&m*23otQHU=Uv-YYFQ-?DYdZ879y(N?!1JXY84OZ&8PI3TF7Hc_nenbyI$B!NeU1Y$ z?}o)XO4b0RS7hkqAL2RWRCf>Ot8}HbYi=NeY^?{SYZF>K-#4g1yB{|)oNxvTChzig zD+7!8m9x$p{Z;bu-(*qL?EK@26xR18OF<=im{bv<+2Z>}pT41~;3wi?ThaMbzosLb zp?o3Nx@BCx2b6;^DOP6;PG?@%gHeAjuXG(w5(Xc1J(MN$xGP}nl0H?dlp2W{ha%ojgX^V7EQ-ad~Q>uQg?VH!Z!cwVueR5_SZM) z=UI?d6cu{yJD?VZhf*{@7aDX z$85PYd@}MUWlV&Bmf)T89g5$xy%j84Bi1izE_y^iggkBFWn)`6N6ZZ%b(= zlDICOL*fa^(-BiicRp`C6wPx^?hq=C8MZ`gao|;XVphGr=P1SrwR_*y?oF_UNLsDr zt=w&}<7NIZC<+0wPL7+!U<@;Az=2nD$xaI9ePa_TNixWMnk8)ai*Ly~BmvP$)Z`w4 zW}qGnn4`Dzc{&cpk&nza+p#(aao5O=!jkbl-2&;`LYjFH33-Ft?{(j;2nqadxd)<{ z1%k36V5!Kdv0~p{OGi@wtP(L8tPxq&x_&Dyg`|0Gqj3c(02L-iKOapI!t0JTAh>5hSj0JdH@^uH z=uZ`Ci`U+T@Els0^18cq;X&Z%HZWVq$o6Bv&iKKjSwc%>!o2(bLFFT5Hj=$DdrH5D z@xqG_^;@hl!mA<+6g-0olb9)I0h_;r{yBaW3rzxwLZZ2jbvv?DM^sa^UOkNxz5PFB ztdShOP_JW(5h$9u_i$T=(>i9?di!j~us%M%?c=CJ`%>dJQ&L{z@7419Tn6BfK{c%5 zr{tQ?lBnrU6FF?s|MzV9nM{wop26@VG?IZ}?~jR!XJ{WC6BlXE^&2;@a{j-m>70eyf14)e8sAGm*VRYAd$4tRnoQ*43kdu_Z{}(6?Klp_zcoNI32p z9%R`RxTSN^ad4G(JRyHd?07l&WOvXER>gP}lME77)m(&^xv6do<0T4G=Ov|^NPI>`XD=r*k19}2AlHxs2oR@BXbOG0d zUQdd19L(9QmSLY(o&VX@f5^N2p5u45rd60Ohx(4=t6pBVT@Z!G!&gF{*&ZtvuRgc% zn-;ZVF*4EiD>Y-ihHGaFkS*(Yyk*n*&$GhrW`l8+maTfKvRPN>>(yAq_+YrEOv#E% zRv92>NigdQyQ=-d`u|t}4oIEH(6PlAGVsrUk!9ys0%D;9jvoGtht)(tIl~V7;lVlM z%z1w~*~=y1`y#d=qrlCRyo~*Z9rJE)nm>c%TX=~|)$n1`p&dp4nG8SV71ZmN=7-GT zY@AxmEn-PNLF6|B*5XHsp`*$T6!f}lvF;JtsZL2)n!o9NaQ!6bjEXd_^FW^ggS7;z z?4=ytMzt}y9LD( z{m&V~lfiX~$~NRH{h(HVjh5Yi1Z=#%3?`_Uk$otTr2ThkO8%rHHFFQt*t6AE+lF4# zBe_at5N-7y!E~5{IR07*|?4nFTU z^k;(1HjYP9#6V#1_C49_RVnzr!~cvGCiVYmv?le_BpI%-2g9q-yIxti?hC2MP4Ep? z$kpSHGDbObMIV)>W!aC3yNQZE4>-0O9o9g@AMgyNednMh&ES6eN=2OgYE%mwv~hYV zFKx7Y9uzFvY$Y?gGl6Gq2DW~rZv?q+C0cvFD}_@BTc1Dc#f~5$Gfc7uW{F3pwrR|R zfS3aGuUM>*;*oU)>l!vd`s69FhZ2<+!G#HF*)R?YHJ74t!=6m-MjsJ!PS~K`kP~CG zbxdQSTHF9_r5r)!S%omb?d2HX$7q8_rvqHOv?V=tsQ++i1?_A)C58TZ*1ckJqd;bK zZOx)^q4-ufx6?y5bEPTYGiP*FtW6$!5Gr=n1;7^_cghDc)Z<{3THe0?Om=oPrGJv( zcNS-6UT4eJ2UF*F)xfgYFI~!=M zd2rr$!^HS4ZQKvP=T@KdMUaZT-tI1~3%B|URf@8ddRmLPM;~>BGL?<+s_%)x1-mr? zIbQN#&+1CgwtYf|T)?dev)orVa|!ud!b_O6i8K5}-uuvVX{sV?F#W_Lm%;dv=< z84WaB&}imC+E_BM&&h_Q(s$mxz`{D-5jSU%AL>VMK!%8`3ou=vR;HU^Dbg%Jdq^Lt zrHN07F6dk&OxRD@iZCr>aCwPsds){C21&g2q1VP_Dpbj_T*5B*^BGoc(WY{PGN_YE zp65SjZ9}B{0VE2{*}8BqueEj#r>S9*`nr2Cme0)Lo(=gk>fJU+hjlavwQ~-Op%urA%aRK8|$!hquFEk!i z78BLkORA+EPK1MKWbm|M;z5JRS8S40V-3)4C+Q)RB;~p>~Ty z1@_h=7T&y+^j_oxZZMfD=7kp^ll6i#hWvdV_C^mVZRL`cFF7eP^aL4CtWFTxvKVeC zK|~RzIvED~XKTo126ofGQQr6$)K$^-ht;YeD8o8PNNj)vM#^R0WSev>2A&9fU?-r# zphz4t{5+^GLtCulYo(Vh!&+6IC-Ov*^+H(5=?8=VX{2Bk_q0lJufdD^pZAND6xv9w zm05K&QVe4}DWgv;W?O7N@TR#F9GZ$klM(srKePfkZHw03k6LTtrcGjW0!so_WM?h2 z<*!OvEhEBdicDX~idRNF&;JGNL{7=51-bMv49k{nABvF~FgFsnTalCGg|;gJ1#GqM zl*^LT?C!Mw)@Qic(Qf*bL=)8zk(86zmYK7mf1C0@6Xy8;O3rbV+v;iFU@!QU14aDPkJVslG=2W1(aTqxINK_y=`*kKn%acxO2@!>J>)=*>eYMvc<42>0K;CsdaTjiepDw1H&T z29V8HC0X|y3<=p_O+^>yd)DCkb=*!KUH-uJXfN3C%V0`2=^puYEc1l-+G^OlhE=DR zQtl{u)>r11mAQ|JHKA!VDcKuNvuYMaJ)jz6g2>reu=ZsAmgdds!JCUuE0Y1L7t7(Y zt#F+j+?;w}XF)#?_PdJLZKql$O}WHQ_AH)=AHQz7A>^8DxU`uGp|Vl0>&zi%+V-hT z;!hWEgIBn3R!vF(o>QLB;_N7sx+E?qy|%i};*kAxp#r&N75pNed7$m$W9jy*=B=X8 z4f_caxkGS+{=vP>$`mV^&1Kg!Q+ioExdc#K@XaPDktbi7zJ4Ja3wjP=N;~pg@^84 zBYult71kFO*5*&^$$`$li)P`}$KHtq8+;u5)`NYG(7qINWx;pL;{oG_IKf7F>6bVE4Nez zxKgylLK+xOFs@oBR$$2PKt`koeRNiq0h{gGPUdlOx3ca8)DB_ts7F#pE^nG z=O_t`FZo?B6e#*`z2w@{`p!rmgwWy*;`D&wV3myPy$8d{cp2OATisc{0X1=0xj5_E(jPWG$tY*z{_D1O9% zv5_||Jdd<)o?d1VO}y(5#L^v*VezG(Db#%xC!OsA|LW$r{|zMV2rF8rRP)#)xPo$3R}Po-p7%q3WT37!ekgeIwXe-jO( z(PS7_qnxvW{{?5oDH>UWi{?teM}mVNy&rV}S(NU?yN77za9qZi)QwiBB{AR%Ai~yL z0A@^Qub_s0=yG}^88>y4;o5f~j$5{Iw@SN7+q3({U#olt|INC#=#iB#g|cftEG=4M z5kX6a2Y19sW_ixBA6yQzj7}bOH<%V_`!_$qbXr@y#D$$b9fvG?oO|&rJYW}aH{!ku z@E>KR$G0{@r?B+T?yV>#ZsNkw6d6a+Oy_yd)MCWg_l8sB#hi~2K z(b{r}E3qduYc8JniA()g3YQqHtmyld7~t8LM}T3H*FSHu{cUEtg0DJe^nvW=?Imv> z49K!Gl%&#@u776R?UG`2hDy+$9mvPQ@vWo-Z?9Qk>D0! zUTThqqTCwiYgpFL;6u{~`N?Ktulntrmx#ilixs!Kg;s?>S0+o5y*NxQxKpDPL!`MC z^mHj5r)o}eEC!YC&ov%!869pX@fLmBd(Dxcx%%8P+IB9~R6@QxdD@zco{0JOyT$C- za0pL8#{8^W?g!oQN@+HWce?Jmy1gAL_rWTwoWymC56EXRWSdw2B=zOq;9Kw{Kdq`o zT0SQ;z@{}w;v+{?)F=;al3>y1Z#96UZk^+_Z;dJg1h!MjNUH6N1!rXny&)5Ks_-O2 z%+zv7kd>v4^{r5ePlS!=_gv}RSwCH4Y*--)m7vV3(T?8-svHC&07c-NbFFbvkzo4S z83lV=T8fVX@)P_&SF2(#0{oUG7lLica%AT#$vQI7c_aqn_L}=0YgiLBntqJD*CoV& zp!es4C*H}holox77hwTcU%fBjOKAf5fuM0@@7?C9>O!JE(dUNEXVl|Pa+lD8B&xQ- z(N&4e{t}1R)w3b8=ZLj$1G>jN=HGa2tM6k0D zHA|@)eHe6n&67v=)zUn~&%)ShbM32QXL8k;K!tNIMC$2bLY~x7mB*(#=L6}2X(h#&Kyhi;x`&zrbp3dLRG}{3oT+hi0O$Wwk!9*>je4tylI+6 zwWvn#-G@x=4I{7QNP1kQy@c}msxtz3H$?j84;3oLn!&&B2Ap#~+Mlx(smD|&sL?$5 z96w^obU2?T*D)^|N4hi9r1QuvPxw6XzVA)eXfI#~84n9569`%2<6p(D4k}Mnw;v@O zum6;u*vmWL+WKkGHYf*>`e=6od7UGwIu2dk8--uE^s^mhHZx?XZ=Am&W+e>P{3)Rt zHeBiVfdW-aFn?@4NNeYe$iJf`m@&j$dvswO^;cNh#rU&X0XtGig~NlH@&`75cA{oC zruJ|cW!AZImQSZ_7C#^XFwN=>dy>zmad8W!I*?|VhQVLgK8aoJGi z+oAHL#15t8Ggkpm-rS935awkI`*(L_LO`QK&kG{0%KHQ8Dv8(??rg~JT;g9V&LCI#s!y2S#CI)2iwAstvocIUwZbpvoqTx8v>|#*1KEf^GSxKE z&?7gMxb$ZFaCZ5FXYP8eS}$2JE7Ne>Lds;5=Ks~~%}XS+u2Tfz)`zM7ivU}j@bhVV zFLEB=kRMn;;v!qZgP4skJkwXa7p<#LY_I`@BtiH2rc{>S;Z<;(^WN*j7jq+1y5 ziNO+p*1QC;rr~FkX<`;VQZ=dC0!Je?^s{$6qM?4V#9&LBHQRMBxu!v;_&XUB4OWZk z;>$NkXVhTJmlMy8nvY~e$j^L;r&(L6p|{;eW!p#JZ9JphbkfnBWiMvblY9Ic;MCE0 zI4QYeKf)a6g8OuS{Gg!Q z@e)bxXuI?HLZtyF;_laSQ9aH=)$+JGQmcRiOle&N$kcXt?ltV<_G3&0Mzr zH6n@U`{l_?fhRStnbS>}z?MlL)d2SeXK7huw+VdW`O{H3A z^iBS}kbdu{_sA?ir5U9qkM#~bRSZoQ%e!)yYH_E4pTS1wICxKU4>C)Fc*k-8ZX|t^tz>*)g|9LY@cQ*u121;JV@1etx7r9 zs?p#qp4PXKj*;Sew<7r9$ObgW)$j@NyrRC-y^Yy*~qP&Iw3g*VgK66AR1--Vmsp?}EuW^!1#erTmV~Os&`!248(EzB-eAf3Ty}tD z3&5R@t>WYF3bC!OpxSW(U}|Xzc&qEw9a*rrlMR6cvZ7if;r`Sz5A(ng(SZ39pId-* zD+mqSElwzAo!!%urd?xLB)}asreaV=xkj;)JK|9{3ix_fq`K?>fc-KM2TJ%ibjhY5 zo1MiQA>V1mJD|ip9Qzs);ffv-oLYZBWGrDazz!1fR)vOuk4y(gzA^g1x#M06azW2k z+sK88$~P|AKAZ26e{dzEB)LdW<3Q@gKNtGvvR#R%y5F?I-AIabm$(Q_r%WKdG=zEN zXUZnOpZU*SLrA<3XomH!WmK;g$7wrAj%8f$wtBgomhKC;K5-7!M*@hhp7r+^SKe7? zh%P=SuLsHqq~-MiRjnnw8qJ8>Sf}VYol?r~kQAcezBzy*MMa6ExQV`iR(BMZ+Y8EV zaewXTax9^H{G7SQW8Ve&VrITIH@G)Va2T1=xT)G`L{<0 zUvs|JD*RyLByl-B@n26C>Umk8pH;58_FD6X>WcIY4Dl(8PVH5%E#-r;fBKQktY{=T zdSm1)G)}w)q4tbBu5bJkE9cLucjXfFngN)Fb1&7hFn03?T*Ztk*2JofN^N)>Wz%#Yc4^)za`_!xmvnc7A;hv(|^C(Oa4b_iY!cWR;>OgN5X zeyG;B&XZ7rnYM}wKlXFS@ehwspf&uoo@Qb530~}52yQ;I5pN(s7{7fI7My*40YV!9bXW7!EqyIrlFibR`0fGLF`CT zAFf1vcGaF?epS^sKHrXkj1N#3(R@lg+GIBFb|}lo)@tu2WX2qek<}X>9QdCe-hMro`6Od4Dev@WEiFJ% zF-F5SY4YS5fDm;YT&pCfPTNgpTtd5eZ4IUjZFPrYI=xTF&WaT0(G!+3^M0MK*qEGa z|GZ>?TLn4gMrG{)BL2klDy%TR*;mqAW4CGD5c^Lnf|=Pj@Y%udW4{@`PK|RJIqUP` z1GC-x_N;PRGvl2DQbxpaN>(-ANHx-)efCHVBxj5HbX|EtY+ne+)mZ+4#@4#x)-@s| zu<2|mXwT~@J!0ykETb2?a{U93(GOY;gWT#=tDQGZ)*_yoOMHRtMODy(5s9Ik*k9F* zJt&(>vi`T@oQ`WBp3QKX9vUreu9$itf5iCWKrIB8A*WAVOm%JXk?)^<2FWWaoD>U` zs)!X@gyR5g*t(GZnVcdUyLe*Ms~aymwn6L^a9aubE;FdIHURb;d*Vn6QEXTWAYR7? zEg}O#n4ia^|9;grel6FJb{U7!3ssSkIQrbZd|O5d)HiFf;;9v&OF~aZWHh|c#~cRg z2)r*wo)z)7`e`@}E5HOSIO;RZe(41DiU*jM_y1&6Rqb=D`>0W+_L#gCB&L*`_@g_8 zXH9tek5x7rpn#KdSn8vrqt2T}Khu+>kl4|CDVbifG^CjS!x&-fR zSa1lGiKvsgr+!r5G?DH*m1q_o31OIx2(M}S68!5U82VShyfWFC9x~vyO$dSLqehh0 z#u~Zl3-rP}0r%14L6ssKKdk8gy=Npz`!kvQQzN&3M?z0=U?W(h*N})1NSIl=%=61W zx@IT|7?z?AD)tF5BUDZx+!z ze|+Q@_EhCg-yLB1?-hdXiuwF>(Z-(9Z`c%-#&w@hYeTg8af3|wdURP>GIV1|EGK*_ zEd1&jE7E4+zIi@9)gg-QNfizsrX{M6^)E#T1J!6Wd49%4HSE@h@=5aPYLY*R>ZW>! zBhk1=reo!`M}2zRJxsFwh;ZZCFF9<0^gzRfx2s!wcU(A?%P41`({k@SfZOY@S&Ix+ zdp&GIi^Ifluj)0b%|S@QHxwp*o!Jcvgj3~A?Aom_J-o>+oUk!qw~>_BO1?@J_H-9u z9r*Sr?F`{PlidBrU2p);oc;dHi+Jqw)AowS)7%`vnW4;=zb)zC0otuVu6cP)pAOTR z?X#Dl&qdAcv3jZsj@{USNW=U(;+PCxj5k?qVs-nW_EF^^QPyzeiHBW3$!c&{OszkT zmO4Ntl>wg5FvyS=94MROv}#R*c5*oU*4`rjwPb3|rQ^ihX)w?0)I9v@=%=`b7@<*9 z;=9l+m7|>nZdvG=y{j-zCV?ByH9d~KNKch5gkJn@&%9otT8huf%&JTBB^`MzrkARX z7h`JplTvS0Yxj3=(^ioIWXL6U?&}O;O{I>Ok+-gf}l`8w3RsUnr2nb$yPyYi71**kg^@7Jk&r=T6md|p4d2NSS`92H- z6;r>%zHv2UeX4nv*JrI<3D@#>3sr%S&e-gz({CQX1^1QXnA_MT`bZ+IDkP7c+OJKv zq_0Q)3U9E$n+DOgW;k2B>s!y!M+m|B!5z-L0~#uSxM4Jg8u9oe zl8LReD^)3>P|?LONJB%NRlVm%?ZW&Kublhg%|h7-0K}eqkaJB{>?r)l48A|OmieWZ zvBsg_v;O)vB3HUM;EJcIYS(9wc|OZOQoQ_(vVC}Gy1|Lt4;B=TBCO8nwqQ;q$o zPdU=0eJ&wAzh5vita!RpJE2Af^gSDfF=Q8dy8(JzP3yM1KG=~1K1#CL7C>J;_$br! zb`d?wOh;cii=amSMftU~2Ied_^gLDJ5WI&KK+&G(qnQGyC-ETO6 z=udfSWO-|G<>cXkozdXaKL(yArag9}fBT)Lv64$m7iX{2|F9110&10I{7G=ka!6B^MW-i* z)k5{~gD_-%yPf@?cv`ukr2r9R&{O{MRF=-cpHlaJwCaf+SwJVAZ0qN~AOF9#Z9{9F zlleit$ud97-#l6q*4(j@m?7^~jOCi=qbFuA(mmT1Jl#$0Vfj*>9bQj0X{p|G(FEcn zI@VVjKn2T99|gYOTWAe^6OZfMK`iW0SN>IgMf|sR0&MCF(?}dA!^viA46*DTU48JeJV3C1#C^Zr7_RssX_? zBZxt*z+_Qr%f{))Zk-%d8M@4LD7frI|Jzv;Lk88@S^XxVHBaa z1pN)snshZ6`0FfZ9>EI$eaVP2WU#5`;i8Qr&pAv<&knb_Zna&PoblRhHF1tE3RBc+ zg7RMWXitCkg(kr(~*Q@2O*#b*C0=6dVjqBdxlL-s;6 zo?%6}R`<>*DEpb_Pflgh;d2T2MwRa{=VLAnTRxfz6c!}P^yXOZfbgQLa&z%$9zD9X zI9#Re+2PQ#SSlSzn6NG0m*Pcdpp4+ecszni7P^mDYaPU6nv#J21Svb@J@CZ{Czx3- zGGtCT4>P_CHZP)^Tj8k<46%UZe3h(AQ^rNn-cc1UdO&UX%4>+C3V=fb)Sc%-4$iKr zn_c3RTTJYw$6s!i(0RsFLkGc9dwrgJZRkFLhy&g{PRBn(PiWheG?W6XcO>?b-5 zJy%&SY(Hv+II=S~f70=s*{#usw0K9vexb%kb^#2YYK_ zUsCC+v!xrBztUC3LHs!Z7g`grzEBFx)^QlswPVxH2{8A1&>%F2i z|Jv*7a=J9wcV{}4cGRdZt@z(p>#gtjJTvNBx2ii4On#o8KMKJT1jrJguUlOqS7R zMc-V2ueAeFENK%ge#=R5*$uplr~gdGkEB@#rRDiue3^4Oa9IJ-bq^)osiWKfr}r9BU$F zDjqa>@!+vknmSTu5GMei8olDbpP6>YNC+9@c1S%tl-2lxn_sdck^EQ+UArpC8Q-4+ z{o3_$xQmvH#tqvfI4ib_Y3Z12dS!Q;`xl>=(BIaMaM`ySm{$*ldXub&qPh(HSrR;@ zCJHhGV%d|DB~X^h-YRgKBy^*BP@-JVF(bVTLqb)xlrq0qxG}EAm+tQ!$-Hy5((~@d z`^rWYuQnK}Cn62YY^j($>$K`P=)mJMwcJUrWr6rngWY~d)K*KBHp|k6Rha0BgqjeCqS;$>j&IKg zv^+M8+Y0P?zs&avZF(Q5WJ2&fQy|JQ^A8W6ID5_c;`qz@e9@dnVSCbtoJOa6KLB$N z4&BZ`tcNJtugC4B(y#smvu~$06!@X)3FDVD&({Dq$Ciru2oGj?z5>n0cdhIfZ$+}5 zwK2q+Y^r(*iXbsM6%8#WCTG%l@;zdM79QyPQi+Wnpo6=Ih&)yC35Sbov}sg0yXcG# zrCGxt_=bfhdxBm$(j6~GHFI~W<-SVjpYK2(*jm9pPgY4Dq`ROzEHeStW%%-_phvYl zy<#vXvaK5P>PlZb zkF-Dqy?^9d<0lWBHckOUqLdd^125!MW@Q9UDRj1rd*X{D*3yH$zWK)ZxRBq=8XhZq zn!u{Mnw}^+BO)IMo9}xZ?_<>3i-X)V_}BFoq8DW4Tl-VVv+k;+QetX!LVONTfikDGH%fZ?Q1lToDQpg< zy*yGe))c8Aa%4N21AprEWWsPMyiswU~>RUQ*OOL1c>4P=^ezN(7 z|D_Da>bW(LqFOlZ1E`JD)NB2rZzv^rNFqAW!-G^hEUgPa3={M_GBwO>X9&4Khw#V5 zk$*k7X*;O>1%O13l)s_#u3(~3zK^}X^K|zz4u+5Oh=L1pJk?= z3r{dQ%0#!M){sh}AXtE<wG9* zH=$dhmr?GR1gNFPcj@aeTZ)};iLMPOTXAsEeygzht{Lf2pVo@8?8CO>!lXl(fN?n| z#M@ArAbU#gSv*R>D#N}{xYT|5Lgr+Ll3%2%@Gv;E?S7=icVmz96I=nYuUACo^rw?N z2rtT&WYLtzXB_@E*rOC*@(*snoicUJp;iyCsX%<$a=`-33+*KEGFDPAZoN>{*p^_+ zPOqS7t+2YL`d90C`NvCVOUtBgSJDV%pq7I8lV0CN`u)H?@rYK$;$tO0mR_L=usd{R z=7`0*UwR`cHFLn@byVu{CbiR9xKSp3Tw&TsFNQV`D{i`Oz=uoJ2PGN{awb*8Wrch? zTuYdx0oOkcbh+CY_T&-4zwlSNZ0b9F6NS^fH9#6nVX&?qC z|1srNn-C6a2!Hl{p0G24Edq&gY&jaf@@}7}UPnui+C31#pD4Vs5y37hPqe8MV$ODH zm&8^mn79-f(k0zI{r(k7fMDJIyVW9lTHWaM5WUSa&dfrBO)zid3B}T~fnH@#cnM%Q zYuyvY48U53MP59dq0pV(W;}IdODiMD*|qCjW}S&>mU;a-=?!5_)^q=u)S3Q_KPZ3- z8-WWyp&STHC{UYLy>Y0iy;n4Ldtxgu!6l41zH5x%4F08?s>I{nv*N}eOLc^ybN z%X17$pxs|uF{|0R47f}+W->Qs%Df6qW%=55u6KYfjFuqg^b?`Fx%_XXJoND%qXYZ6 z8ImQ_Z?W0h&gCg*tOJ(Nv%p4;KfEk=_==ZO| zBAMrqg(N?X(7Rp({vscSB{Xrgftg8V$7L4OtSr~fZKCULAGq>47n#b0(8C`Gm7GE| zX5}s<1$yiJc?>L?Z{c;yuYGsv?eFd?>@3)K0k`pmrNH3_@a4lvh2QYImIWO%>|KKq za_1`VEViD;s>?9%D6zeX3<&z=*N!}MO<)kmog&Sua`Em-@-eXUMtn$RxG{b)7!xcjW zIR%cSv$Wlr8+AsJzvGdxw(_4N%a>zucE^*|jfS%fry^7^@s8gRPZgSXnoT6a=9Dxh zpj=?xAGL0Vw?g?Pq{8ol#Mq>;T%M%atB$EqqQl3*eqADVhWR#IG6LMvRHE{E>;VUEM1ovBK za*znVa*OugEC{L3w}l{L!~2t46RXS*29)ENM&Y7cXkuSZtLBeo9H*sdJTd&S#? zV&Y>(n(t`)+dK`TgxLn!31MsnK)IzX@(>|1!#bxYo~$iFXS<~B_@VZP`%PF>7UaW@ z?NHgyt>R_b*}23HGvb~qC3P}H`b7w5nn%yqXXxQZYfI}b@(0f7+b`QKT~D1GyifHc z&W0xp5oD`(d=EWI(D$O7=nvHwx!`g%a))8^_L9a)_%iNdgR}*XRF+O7K}hdH1EsN%LU(1ua0rSBT*II4-Q6T`!0#( z`<+-2aXTaE_tAr-3#daQbm=#`d-@-4)H2+w*a^BG&v3swK|~ZU26atdJ9V#L=UaN8)mqx1Yb_m| z-58kis$>#OpRRrXf?zkJ*A-D}>{l`^vkiee_zK##Ea1iR{;9 z7QE-Jw&cpHmd66t=nJVhdvuzZgg7g1SgaojXp8BzC%i#x;rL6FbrHv*FKOHpRqoDG zU$TOtK-#l>Y~a`oS*PKoGZZB=g=`d{ewg(p>#&21t4r4H;uO@@t3mJkY+&l}y52~T zbG=|E#j|jX3cucJ{+u%J{23H%b0xs~c^7H3G7^STbu9+Dj!Vu$)EcAtVqs5g$ED4e zPke{eu2pr$B?+$`U1210cTj#}C<@;Of7&+;)(8;gXg=L#ye9#Rv76DH{c#yT~Y<*yoo3-k@6K+eyYn@2!+*lQF=k*2XnREo})Lk-pMPKh!@0OdW@YlW2( z`RW&9t&T0SYG%YLXn0FY-n9OQ*(MD9*z;NYfmgprOPa%}Z?7P&P}dZm$q)!NGB4mi zuL}CGvzsogznaxR7&t6FDOPU-VWB2Zy;~Z?(Fk_b(3MmD@qMWe3SGLnHtyF)EIv

    bS2A)QwNpW7C0B21XR7RwDnDK z8LHq(3!oiN_<%+XPR)|@Jwq9t7d7`qaTA1Jg1ZY<}kU6Fz_$pi`db9(NwJ?GRP_Kc^;<&L!ziw*M)f zmpMwFCG@xPt@?`|P9wrVu@qtO`n2JzwHSs6W2#e8BDZuj1YnpFWy*7?CV2Z%Pz2Y=iUkTuPkgHQ3SSSxfcj9K!1I*oU=Jpk<&Q6Dld z9x*#>#48wzOv)o)zSt1|=|4denlUk4nDP5h55D4sOjRIpGu12_zCCB0-s$D;XTf^2 zk#_CVaOMLoG%19g{4O+w+eGgGk2K{5#3gAROy1q=)CyY_J-IH9mw#nF0$6cCS9sEi zE(=@Ug$=8rwIYmUf&yH9@4Y*Dw`tIIJ37ZYUxJkhuFTr?Xci8-2KldN;11y-n9w?T zR;Z=&M(-Tzu-8C60?hjQXRsp$!j+#dpS?aNXDOdMnq@)!iLX{Hcuh<0QC#S@Rr-SL zlO_Ci>nhX10+SsgvO7FJn?fr$qw@l}b31&Yc7W?vK240<4))x3G$s+drn&MPjs*B! zV(vTA;0(WZYcKJ=_Vhb_;QDQ`n`sp#&P-Xq^o1jftHOy1NOL};d{7^>Tiy)qQ<>VC zSsX&s!dK4^p2{HnWwIqD88zjqznOK?Kcb>I5`eDGPD^M7vNmd3pm!MY=@Yxd-u@Ro zfeeyfFV(Xp=wAG0eGqiYMjk}TLZM6IM#-B*qR7xLwmTQx^QS7!+r>MUJpebeE9JAu zL^^3vZ7>&o+0plNLjz`X{Oc5`8E39=@AH$w^;bn3a`17a``mf>3mmRaOh^T40q zB0GJt!fce}?}?2kGu~V8+`6~&@VvvNPdR)(_W%+Efm56J)mnm{ zOf0BOj;(WKXmnjZf5jb~rx?>3x;+H+NB%00c$BKceu^4u%bbW(*7=?}j436O@{XE^ z?S0<(G?IS|u|D$b5BS8FktE8n{dTBLJK%0gd7&hPEm6*yu4qU+jM4d2mFepF?7QXj zU;BhVUM*Orz;900V{@1vpzyMOu4zsrxw)aG-CMMnK{RWEr>(e!YOO*=%4D$C$|)OJ zG9-#ie$khOvtnl(aNd)df$<2<;y@Bh zs`K9}N&Htx!xm;w4bjwv=h3ZQfTluGm(`!|z3AkhJI?UMc{=N5K}l|)*$8yTJ@J^3$ZVW_LZl7R<6iqxYZwz7zVYTL8d zP*65MR^i#ey8jSsVU+taHHxiDF z`3WHAL_SYeVT-4>wvUK4hD5rhzci|ibJv=oZSlG^O3)vZWg8P)l@UJRX`DD!PSeuit7x2HBmXKR^ryf1 zniRFm?H6`Ob+dWH)z_Pg&Wga64fE88S2hIvG!mgs2ly0WSk0=ZwuE@K}*WD9KVLF zXC6cW-c0sqPtUa62-zXDi;&lK&+qat zwE{Hn;7}z%EuI1tqBnHc5c_3*9HdB1&ZsTkS{Z`R9^NKy@#ZUiG#SeOntxlHkZnQab z%&%;*9j)aVIp`5gEpQW-m7CoKD4MER9L9-5#Z(KEv=W?l$mDk%-Z2DMND;f~R9mEXXh;KDE zftr{yS}1^)?=(+ywsJ&)rgKzSDKK_=P1Nz-b** z^T#)sk?=U@18p@;d4I=MZ!TT>j>oYb(DjKPAvVbEdvya!Cz(cUwYOe$#DNtKH?C+K z|4;_qe|ek0Vaq&7Gn(HUe7KI&;Z2?os>{EBXSCwM$YYG%7r2rz^o_TnRUPzp`{l{F zco7dZxvg-SX)+d>wuuCFG>b8>N@|cYwU2we<#YBr&KM8-fZr8ymdp1%R;!6FA>)nY zv!Gc!1}^8p#)l$|Y4*)}U%?;ya=rT51gIQUWBtrPsZS2+zZ6wjqDX3p!ZpHLPS<}$ zL5JG$$#iX&h-yu-vC>mm9zpDVcb}k3wq-nlDuWxCdzcR_yBrf~qd7RuAR@z`$VU7a zEId(zQ22Od*Z8W~2Bv=4J7HJ5{AICWw|;81>&Il{UAjc4N$ihGBVexb?rXcgN-{^s z5bz|kqc9~m0n`6~hj8`(65*ds%??RKY14?||A7}T&Eqq#o87mZ%V08|0?u9KTn;oD zyPp=FbQ?5$M<5r=!Hup!7umuKRKVC@P45qI02^~Ms)}eRu%CwHSQr&^iV;ma_H_%S zaoGI#p6U2$`CRinp^<8qCNVVfRZfUHls!~EH@yJBSXNSULIW(Qfwk`qK`achVLlHOCb3<2{F*kY!B1;r*wFQ>99 zl%T>OGpr6_`g3aRkcpsSd8&30b5Kr4kTcWTwwjsFfLscr zv#67Fo1uSPeaKO7NJ<#xF-lgdrpomi3YY#JUcNExd0w{j)e>s3QyryC?AE)Cda;TRaKG>5`Fh+LzrGysS=)b2(&1F+OB#aZv_a8fCPkT-_v1o=yo0 zZCX0ny7a(^kD3-}15b@~-orVkXbbB2T`WXSwQX{UQ#iwMvxywp>TECG8C~l6)+mMJ zy5dlUb@bh^V&~g$8EeN z!r50{%1({NME4A4)w%y6<_Y_sx&-Yx|yw(bB;eD3J;Uk(^9Q z>T$blE^at#5whhmPp%1eC9fi$jYvCi^>h}z;1|@nQJ|&H=Ww)XDLhH%`)+yOCXX@3 z1GT#l+uoq$`QTv2hzpT$;*^E-(ipPS;wvi%QNZhZ>rMNtl+^@nSWWxyY}Y_Xm7lvz z_;~1(B ARbbh`aKkAbH*ks;&{0~AD5!QcEqv+z@!G1p-XMwJAZkB2+--mFEL@gi zhx^4mv(|P#She#Qf`{_XatxjJc<`+MRdKN@OX=mFEM*ipQr6>JMsKUn`w`=w?<*=S z<~FtYs&pDn^mMbxTTJ^j7(Y#;#Y7{TXZli$lKr7#*XfaDZ8Vm^OSh!;=6MF|#Yj`M zCxcX;zXpFd{IN&tnF?!9nf0s3h5|V(s&o2o;aOhaA&IU+N5;2C#QV)pe)PXxy8&9^ zim@hBxm{|3hZ{m7{Zzh;XQUTL$2C;(f3nniq_UA~x@*%bfze+Kx>R{I*@vfqfPT^e zYs>cze~EZXi=ornd(xMyo)?sNzRWK**-r&3-Oh8;4@4z&_M6yt8N+)B zkZXnzt$Cd5%{Ev*tPP0wTfNziHLW#VNQ|FSFi}@|hbni@T9X9~VZ6uGP7a64BU;Ue zmA5kL@FI7I%X_>kz(N~xHf~?W+vwa;60YCH+OFl{zjMsKH6)Mdt{U5Kn6G@myEvde zPzUpAJXV%LjMkHyu<L2+^S`4zymL1VArC)2Vn zWT!RRoloW=C#%)W@!nGWx9K}ieiYf*iAJUAVi2;glO|#!Yf`T_ZGgYm{^@MLAN-eE zZo-EY@d(<7jh%|Boy`X1-iEA~TWMpnQtieR1(rYKs z&`Y%eL^hmZ#WgKu#X?>aKck^EluPJW+h)zt8=l8L3o6t-xnA!7vv0*H_ZasB`eWOl z&bB3lB`pXo>#_GyM2ogyDy778(C(l0?lP-k@zB2*i#0)>m4Up)Bw5s-h25i_j*Fqz?peG{IW`o^|XM(itP@IXJsz3hD()MCF_0iD$#kRqD2=NaF7%f(y5iytb z%_7hG0VRyORcYZ66l&SDy2jTnhebf9a4REo(~JRb+y*Qs-#}-tVT)a~UiS}!)KZqi zXqP=+a8{}*x=XF7%Psk+ZIf`J+is}(sjp$QF0Y5afCXM89C`nBDVxt(HU#qg>IhH^m|chq5$T)1$NtSy3>`#U8&#WBS(qi2YoS}^{K?~y~N z{P_NKeLL$KBEgSk)ZMwpTHwM)XT$nu^0tMItLj@+;)wq!+QTpoXnA za%$IQq!cZ}4u!kZ$`_Ja5~;p%_>URN!Aeu-Dj8)XljTc9_Ki+S6KH6_SU&$FuswyaV)cJX+)>a7g;N0HAd>Ip5LSiFHd^P{yGtwvc`a zuQ(c6=QbMCE|wCr<=Mg*!i5?lfl)<#4xXc9_1x!vb|taZ=%^ug?w{L9IaLRB2#=O{ z#G;jrP4Dg;&?!dNH()<}5DWu7AA#?VSkd~%1Up8IqE@*?tX5novj~a)1sYXUEhvO#CIi?dP|B|jb`gf1jyp7^ObmzSrE~3bC=RzWJA`8#) z&&^Ne|0Gu?ke?ClaV$T@$;Ia>rvcQUx1BPFhg~%=e{m^FKWrSviIUsjY9|^5^{Dk6 zS5joF=Y-%DQz|m}YmFv@icQG98~)s3&a3?h0#xc;+}8j4#Hzug>8~NB%*{XZjFG8V z!{=@eFb_yECHCZ+ba=(C+YO3s_7MKY8IV&~ zgVN2@3-n~3N$7HGIzJOA8DA~RO7)iXA4Hs;YIn+TG*7xPuD`{q#*v#S-?YA|?tJ#0 z>JQE0w{<7?@;#x;i{TlqCTE4!AoI1e)JebAOkrrT z%VYp(p(DJiBNJS?3eg>1O@m{=#57(xeO`MExl$ei34-eUnzipcAuWe9?0Q@x<{ zHY>dj@YQ#-CmL-{J;oKvF-y~4Nu|e<}*d)?yRuI&qvOeO4HT?p67Kg=0pQ)-L& zvkU`~7sdOCq>_a=_a z19pS*T?6f?x#kej*HXK8}p}uggPflzm4DfK3&caEb!ASEvloi z)qN!clrW5G#}E0pa)}8~&hHr;%a!j>n#&faA}n<1&c>n^nS+iSBag`g1Z;K(S9e;9 z?mIWCLgpAIJe?=;Bye#Mh47??S?s`?&L;mnQR`t^jzO}@IJAYKgbVx=gai|`q^KbJ zvpYoX&|}T+3nJTv68=x)Xj)H*%N*-hr-@*_#O&qzqmz|trf_#b`ut!R0*b`?>0&Dq3%s?1%$;vvY%PYAJu}e8v1s zBJ>ll66Kk~yZmijvn z-U+aEA0;l{;tV!WL5U|b0{FT;KUz5_MUjF`Gtt$e}{5M?XmF3XeFcesP?ij%yg)%iK|Gv&XQrVn%2D01lO*>5RdDc zg@s*O<=x7v1&mYkEjJ2ai;tT&wlBF%BrW?32idAR>7D%@Gvvizq=f&s0WV5}N+76> zz1NgNuxD%#jyMNfam=bvrdTt5E-iV^6sPzxrh+0dl&#yxoeo8D)3;8Kn>-W&Di8ZE z&`oxwd4_$xL#xHn5h<%;_+QyPinsQNrI4am&MTBmDE1{UJP=%F@#O( zB%IdHcSZ4b2Zf`7j_ne>HKds`54{j}8gN6G&++<$JrS=LS(L=i!W#4Se=mCdZBA?dqdp;|}oGji>23 zxu3`rr%7MLr);+8dy&2P-Vm%PJg3`K#9d*~WMkg~Xo1UMUax4q&DijeEfi`m|M^u|h;7XfYA ztH0(SHFH;%LyEQ{A{T_PRo9XSGs$hYf>ZCrAo&s3-sz5AqdwnW8T00FQxswmk57^c~G3kcOmni?==b{!Whts%(zY zdSwLGPdqLf+X%v^gCno~6FLS1IQ>lR7#%#Od8zF|4A;>$9B3>9t)MTyqhE2%Hc_JvP_*_;8)BBtz!>mL!hq z9>Xt4ub)P6ey5lKmFFuXMU?`Yi26wdo*zXeewmDBAuSgD?E4?)_DT@F)b?e`5u9$f zfdQ(G?5e(Iv*YDgyzx^qMz?AC#GduQ3NQOB<#r{xANRPDj&JEplTO=$KzGE_QYL8| zdSpTUIfWC}mWC+Y*N_WI&k8HrmTCJh4~jn=dHI^$MS&Za~8=Fg8B zqYKZn3+Y48W=5U;O^2w59x2B-J0VuKfO5t|wg} zlbxGE?e=ddg#mvdgQtJ@H!8nd%!qr>Ug^Omcg9MlgnxB;Ed(FWY%f6;ClOm|G{q8l zy0iY!bGD^Z(=>0$Xq`Lade?d2!yCtwSCLp|M0!@lQ+Qs*!K!@iT#{3Xi` zL$8PaRm@EP(@tR?*e$-d=if6MHxTIjzBSnT<995934aGu1!52J+vaE1gzys!sA+fW zbn&`DZ?f`!vlV3d|4xQn%%TJuI-69rR5Jpj_jV3 zj&_9tpAWo)chy|U?$6tw+|b|U7<7#SNnQ~a^*gt@m1UsctrFH@K4Ushp6jc5DL11% z%s%57(P0h3{2la|(7_LcujYr`~-Ia3M z_v{|_l>W$lokOcSfM=^V(Kf6#jLYx1QVW(jIJ>*1AHhzTTch_|@KoJ$S`pV%iCBbc^>$q(;R_8LP^82I<}#V;$?q z7>PW1zrhx@GnTNFOV;8!m7g-RPc}~s*%9D|JhXv52RHja&NOmKUR&sLMvj#aY(Pa! zocpC<{OKx*X#=Ymn0sd7!S(6sfc62Gw6;42=aYd$8ylwies`bo4OIICWBFe+k{`Zj z^>zQ@vZ?kGq7VN>K$u8)Y%HV7s&M_RhS#>Z#R8QXd{*iR56I7d( zY_2Ao#_ZgaNem>4>Z%($^q;(6SVo%;FeUD#f665U=Ewv$Sd4Y8MQ7zh6SvG(51LO% z{_ViTv+-z%Su?ov5*z$qY_(G;QMmCQ!`zipy3WW|wcdO9UjCGV4Gi5JP-ok$+01=3{m^nva&u)F_H}o4(OE&? z{gPqR7pssfa8a?_FzXQh&6%cwzS9!pGd+Su+ffFcBGu`5HNzWEToy7cPoe<2FAwfI z5r21x-?!rejl%&q_aYvb{S40c zmW0Lk)63;R|JZUPjdKRG&3;3BcO98$t7;SeGH}~rv2h%DCFn(?GIjOZY=Y62WW^^) zv-)+o)4_}(Vp&Tu#5bk&e$=yF(D~-8c=O!fVUY}Zi>+}b(Ji&+h5)`KMNij8!p|6TZ^V`%Yn+upxG_P zn`ZMOjpR@8pQa%NJfTV5)ds^d`L>eg{mcs4X0+E1%w@12Z|ft+(=LO^`*T;My_>g# z^1+pjpwx!42>DVL^?uBy)Z_f;!vO7M==m?usp`@NIRnJparTE$PbG*OD0yK`|E@+L zvZs3K^W132n&Ofm{-)sF54G2SOC_E3K*V-}k9Ao*f=S;{mgj4AjshXV;@;b+x;HTc z0n>mZu*LjqLV1 zy6R8d?gu&DgnYF4=aj_1bgfJTy0q4#lA3^PC$GpuktC9lBg9o_Xk-}s(2X-3j#%a$ z&3GV^qzgybX3{j&50?1yHwEKTX$;nLR%^`ihvUEX2nq4|CGF){n|?qWY~O!yx6sx+ zo4H!IpRR|9D7%^1%8SSv= z6`I*sE4tt1xI#88FA8@OI?l_*iOIhqzf|r0ZqFXpZtXB^z+br(%kn5V<-0hE&?x5!gPT^mP;w7OTxv{hH&JLl zp>So%8mH@;?jNMmNa)my*m^HTrCLtKfYotN_K9X`mJ$x4u(o^8 zKSVsewT?Ct@F$w z7KeZO8G=9k4$Y%_K>Jl##~Cu6T2^~jt+7vtv5w`GU4*>lcw)*=Y1B3)JJgJUl{%b<@lDz_XR6m{+H0itlXSI_ zZHb>{-vYXs9$4#Nk}jM67V$lrE~7Vxp23joOi64*1Z|p;T>V{)O{4eHcQFUfRFB9t zAIAIGx8)cNh(S>w6PG3SKXk&iz_bUe9KMQnToU8Jb7QCj4vHehu0;zhV=~l9Gt@03O|ZEOLh24YjX(V zoc4IXsQW~~DQkKE%oI*l8GTC3?G4F~Oi^eZJsqCg=SbTXO#pEGI&IxC)?3YDpUanV z7@otWS-pPLA-L|gh2573UZwR$e^=||VfWqq=C3jTwLS5H)5bdAskI&bwnJq3z_Gyn za|N)}L-kC-RGQ|{^Rx>+*sA0<1A#;WUBf+jVS}^7(?;ES3T<-sy4D0-IF8%VBLs;R zRL9$wRs2(gh&BBDyE{dfL+5l6;q~`$s^q46gs?vxg5Q5iyfpH-M=Za1G4D%R_k$jI zws0WaMMno^*4_Q24fhfA4G9@#4hbdh0xnD?Z{|c$)lc3_6YH$3JS<5AD%rC62@JP$ z8yw^Qkue6{>++%5io(jmJ+m-3Q;P2RTmdVwOnP~b-~ehII_FaWM!>~S>ZN|M(S7-9 zM}KF=x;wi}tuLDs4*QV(a&2xM90sberucpB>N_uuHD{AFgUU_SDp^H|xKVxXLo4hCW z0~L#vX`G;=S*iq%dCeJZHZfV#`qMxKN@sqrO~Gw6pS+ZnZ1GNt zpDBucrUxEg4!w3 zA2$syx?SAzd35fnd&7>JGu~gRZI0H;tyNl$loe!*{PIZzVDV^!Bb&IUrU{MGg?$$OFX{rOHqwI9{a(KR0?+1(*4uq|6;L|or_=+vEP;PQw)nrY zTNZZT6Gm@y*sikvh+mZ;vV#477F+Dc{`G;jAv{-Of?)tWR8Ud^zgw4P$x1)5vd2H=z8emGj>?;OM-8 zQ<>@UQOGGzLmXL3HhJ!M;DwAsNfmSJ-vx-h%N@A(i;omIF zF1kgyLP94T{((O9?kO`3yx`)!yifR>nS4*#pgl=qz#66dJ7Li2>^mVy^Yjd@C9OU} z!QC#VidkiIMyhO5N`xkYz_#9dV2B7H4%|Qf$q&rbyK>thaU$SpY-&=_YYscCxt-IG zsVCsZFR?GMsR#0@is_~K|CEE#T%#7_nAmAf%S1hG+jyhk166?HUg=ya^G?Ql!&gn* z<-_AekgX>|W_FInk59&nFirI`9PSB?S?+@-Oe;Up(rqumyGqqUT-~QWSCXHgCFVY< z@)Ap71(qfuCZ=$bCSY?Wv3iZreC@6C$?bUuWbGJec$b^@kO>a^l8H>8=fvIR9d&kY zyRCy3;X2`^n=*Uq#H(^rZiNyNf~)G?dXf{_ECl>Lm3C_8YRQn=`D1B6p*{{85cqE(0b^%}m(DN}AnkTb1^_e(C2HNYtG_ zEAYBF1KlIWI+ilDGSea=_NU{@yQ!IVV%^R{6yx=i>QDk>r&T8cz|U&oNe2*C9VJZ9d7<{tKq*z+8&^UtxkR&UkKI5siVmc!}Sol6xu zwx#V>!idw4>Q}4$YDZA%zj9!c+b=8GGR~9$!dN!AyLyGemAYirVa$zBRRL1TA1t-#lix zkh=x8C}{(~=r8@Im--5!4~ccy8CE2t-sgfC zC>g%;DWmw-=D2oRr*V0cn-gopymQle5Ys+Y@{YrU@QkRjj9ctpxBM1c8@lzxiB9eY zcS=U<-}qA30S+y=_3b(9t#uT$Je~hsPh@}NCuja3gG&x<3@OxL+I0et;RjZsCDzNU zr^yU-GP+wxxpsyA3(Q5;koRhhoo}lA?c; z<87nJJs<$rgQ) zsQ%Qa*?Tvm+kZYi7oYmpRClC1tF-R!ek#%KJTHM!5{9!OWa_MPJ4mP=n3FXw4Uceq zrg26M+_?cN0Lv*!lG6K0@E&E%n8n%z)&pVJEQFS}YdxTm;`2~8cxT&Y)7|&8)*zUx zaVOP=us$il0H}tC*UbNvFli=_C&;1G-kJSdUMx=rlL8tNM^8_6!aeZ&rC;hKs+q!8 z^>e#PLFOJKGGAXL?7yFfn!^8ISZ#6T-^@?aor$HhL1Y=EI6A6J z&E6R>vXm8}=`EwdYa1$yrTUF2hN|e_n+ejGRs=ZOC4NdZQQ-Y5A1i^iT)xj#na}v< z=3X?WDi<3N7^w{?9+Kt5WQ`jtc;sBFWA?)m_l#Pabk0NAdj}K$jM@hG3pLR)EY*Y{D?PeSXwmlp4LeQ zP=mdu&Fx0TI{HY(9T#(USq+{#3!f~JhD(!WH7;OLE&14uH^0Hx!w_oW z3f(`UWP?z4OiII;o^DG(h(gdFeM(fWXREYb4l>NXyQBf?nMl*I zw7YYz+bY|(Pm9##SM&OqE$VkRri}FFl1vEIJps;h%%3+9D0CZ{Psoh3%V@_5e&II$ za-SpclP7Q;S6}%nK)WdE4ZfQR&zHp)A(*WPTAvRTkG1*F_mI_#{@=ej3TAvyNPq=N z)0L^AX9{SvqR+Rr)0Pm+ijJ%_v%&_+kzeA9yt=~?UJz$i$vT!1P}7Yy&L&}~KvY+0 z4ecniLsomF(C+}NyGvjf7l}k;shF`}Xt_SDWPyNIWC_F+z(B3$8o-TSA1s-6Or*;d z*h;|iUW~a?>+-8=hFRP7R?S#ZthrA@{xW}+aR)8!96xu+%<)d7Cqh%fcmYK6st#I5KtKoA4rVn61IQjf`k za3E^I|B!L1fp0f&CD=K(QBcM{=Q>bp?}|4zvPSN_t7&DTnUK zyMJ5@oTlsQ+$~s?c^;@EcY9*_5KVu9VFt#@!l|TEJ~Rl)T)LAUqksPc z3*+lijLq#Rnen6xuw8B+oS=S6Uj2SIZh=djXag{K@9ZX9mg;*}McMOCv2efjDt`j9 zTRfidr%sGt3wFccGbq8nA5NE z`K>ojr(p$~v{ktG!^#(c^T)$UF3VXFZ&Mivxb=x$?u|5=DqxHG74a9nl|DCnkJXW> z^^_{BcR@<%S7Q#hJi8l6kLDFJQ{eCE7+%dOc*r*dt)@NPGm)+`csY`Ccx~urc?JxV#6{}%qn}6%aIm^HGqdI~xaTkosZ$0VEY?d%dIHL0(e7_>? z%u)ioPN1@FOteiLULf5ToceL*H>gJp8@iKeD@{vMc5K%vk<1=08a5$K4;U6w<_yrLdUEbtCqZAXCu03UPtnxXn7%Mb1T9=mE76z z`OyO|&_-a9 zj`~sTR=;~*HN6~tdlhArqMk|oj@*;qBbu$7J^Et4!airl5VQY1|15TNQeo|;{fAW3 zQW$@DN%V&fb+tQd;NAiH-JzsQ0+XehL9_CU+-mEP+|6x=>=c9EyuJ+_{A9p771`O~ z4VKU#2DzI(Bhx)pd>UjJo)?-E;qIWX8&R@gX$OJJYkT6$55GyJ&rbO(- zc-+xrx0`JTSAD%}adxxSb*Km_#qq2v}%>8{6#jhpy0_AqCg>q$QY&^ft zEJNA}uv5QC)!=>A=!KKN3yg$|PJnIKt5_Oc_8q~X#qb^CGVqc&ev-lcXC4Ssj>=oO zSj3pl^4Hn>NgY4NuRud{ODvn|52hz3)P578OMx9*Z+wBZ*M5>ys5s+&DGdY`{4vH$ zzp8_>A(K6;dy z?>lh)DFQ#R=JbFte)z^QcgqyiO*ZAY4}n~=n^)xfXGMlk06zL;YAMb?G-X|(Tq<#1p?C>|-vttxMY7g1pt ziQ=pN!}$X!I&4iRC# z#KX@R%sKkF;I}%zhqh7_PDD1k4!+iXszauT$LcNp*>1npwl~>5Egf*}vVrgJkY`fw zat!1!6>ko6S4P1+r%@kex8GLZZ{5e4{+@d7xAkN3oBMHXu=TsCD;%cVwV=C&7})+b z0tbI9GM-94CCQ=p5Y(mKFGa^(q5y7T z4wLym9vrrPA?%!=h@5h~)ynW2+}n??(wT~{)L;KEBhG?vg+BD*!=8Y#VKc|t8pCMJ zF2!LhUWUcnnx6#QSnKz@T)URv)HE^oL30Y$fl5xWj8QKKMA^RO z{R6F*blBSax2wDy%aKs^qi;|dTVL>&Q2r+|38?tE%F8tzMQJt8I5-9f&P}wO+W<9hWYCGzS=1}$0T2#%y8GAUw-?uAs1lN zoAn_XhqBeyHXxE(P7j+;sqC+_O|8EcXKydmKE6#=`T|fyEr5`IFTDw-OeqFRUr zMz5TmGCHtz3R_-LZBv^)V7@6%Vsa%zQ zVraR(kxTMfa!!?Y&(>(c zz7(VIe1?m&lnX1^l;(vgF+w*elsJviSiW`^W>r%vEz(>A=}*OYiH3lj{Q+~P#x_l4g^$O{i#mxj}RFkpW zSLpHryQLci={io3F{r9vlz0#A8y>BskJ{Zw(Iqk6HU=clIJdZrxciR@+< zcFL)48vG~w`%B&-oHWlvx>%3C^b5c&@UdkzgKkYtTm1nmwFu?pJ4QNJN zf5xy3P3LRJ7Iz4IFj9{cKs7~Es|5s{jN8E$&#R+TLRT&r6Q-jyDb8J0Mf@nBuXf1R zUONetmn;tf_$kvi^TLkw0=t9H=-f1vLBR)KcGj1v9ep9f$qo-bUdNX3LP@BGdZ&R?Blf0sMg@phFz zCm%^hQTSb4dYVgJ0ri?3-kk*rs}TY(s^%P-ert1F@UBU zcn2)aNZ^W~Z(42oGP)<0Q^PHed*6v=~cM2Fwb;(9v!m$r*!5GqBJBkbv8LmvpYG2oe zudVt>FK~}K2Z4xYVjlf6c?ao&wtN10CpO>%X8s5nv3l&8+0u%TP+uaXNB3vde)_)dx9iU8)f+*=kglytvZf zB^35l=jkD;U!+@1BwzV*V;x;+X#NSHyHep^s4`_4gI>A z^^bqsTggu7$u7Cdm8)ia{p9AC^+QUbDYHG0Fy2a?JMs{~iyUQ^<1=7gG8(~0m;k=J zc&ujKMsY@3Gu1wDAL!cm+4-To6lc1>FO-54DqBhLWh;o89*4ISKf_V$HruE%u54kD zvaM+=Zbr~I(SN6SfyQnx-W(V3Rwm#gWO8#GKMW-XugocWIUj)CgTJx>!9p_$@!X>m z^pdvp)#{Jvrf)Gu`-txk_S)NV1g}~4O6{Od)QLJ%qrD#th^Z=beM&vxoQ==2PUaak zD$_yz-tSx5EMEtqG_t+RI&#*2p-pqCYpxz^t!!bRNcC+7^-OhdiwF4jk7lm@X82QG zZwJ;82Dcvnd}*%*c>B~dW6I))eX4IJ>(`%Xxp}R$6TTYm# zkqH0OP(2mKao7zNjxnp>Z=Y0A zIhsWZt2i}!;=CMV(Xi`i_)Fil;*y=Am-%|C7+AzIxCBeNcNYlrMx@@M zyG_SXc?zCvyw6vv&|AgkuS`_%hHN5IjL(I7#Dpq2j0i$qi9t>W{Oa`cfG8G5$6Do@ zc@II{^M0}uaaFwuDKB_F)G2$ldB!O@v!SPz)KwW|&K2V$P*p?!vF;if@$FUzHjcMj zt$YjSC%dmTy1pRaBfVkMsa$knlhdh|_j*PJv$dChm;IF>5>+ofxV`}|& znE^ssnZI^tBB==mb`v}w!An138sJANrSY&))K|Rnbe&Ymi0YuqJMOT_n28dSvCj&+ zr7;sj(`pm}A97BP$z#AHLHwgSKJL>o^COFG#y?5O_6Ilo6D_VKR|i!3Bw&|1NImUF zt9oX3*Oa|K;6)wWPq{*5VzT`Y>4E$)KcB{63TWSx!vvh%5<6XD_C^3ZlfVy@^S*#T zzzAS9*n%%pwN#F6DyUK8JhTq=vVYeCU|t>NhLZbb==my$b1eKyf&$9YyxqnI7wZlt zQ6WBSRdR>ZT}&|oupDcd{`w~|u~iI)7}#~WQL(9bHW32X@yO{;H$FA({!Q2Q%aju= z>kI;;UGJ148frZBj7%Oj_&GQTxSVuhUcbLqg~NQ{Z>kZ|C1d{)!xgu(xN{8X=UJVN z?qgz0ls)-lXY+^iaB&2{c|&dbmEMK2zLSAgb!`K8Ze*DSHbb2vOsR5pSMNjuq9UJ1 zhK}BPtF;NUg^^@st<>?9!4`{K8PLvrTvWYzFct+sk2AokSmRK zb)c+R#Kf@cZo48ldi%{IBWDfk=h#3lyiRg{69?2ap}^bzwgjr3XFJ}pl3=;I2${K2 zK=LT$@wg9KN<%DX)%iH&}SK;l&`}K2kuwrUKie1aPT3>eisy!c(b0N z=xaznO$q5ZKXIyHa}8tga=6=qe)PVXeZn`ZjYP z980zkLd^!G_Z90TlaGHB-;6g-(5}9i(~XYGGkOo~E)vdxFtgj?*!|#DwqRrQZRe^l zP)FyV8^m`;c2J^?oQV%TYr2=A{0Sk8Dt=VL=lwhFoV2*6^!P8iQ|x6NR-KgaDet%; z5RjA;>y2Jmyq&TlN0Ph8MR*<2kWG2Y%5^aa?hK9z7Y{{x#%6tAB%T0=O`o6p z@~%kfv!lS#o74{hqX=t^9fKTU*A=lv@s&Eol75(5&wev`oTj=qB13 zax0U)#uY!d!5gqUo1=I3K=FJlQLz5G3Fy||R_E2?dPx{tyoh`BX}hz`>P4~CLc>Dr z{^~ulk3_nv+3vKb(BIQDYcbJ3ah))ORFO7FrabGUsNizf{Q=sRwuG7@(<9iIB#Anv( zk6Hojk&~YTwK)Q`C-@sUA9+Snm`O+7W4@sP*Cm^>Grwf1+V7XC;3JIQlH?9 zz*jyj8}GY2L6iw^Dip^V@{<>{T11hFA>q=*>1JVu{gX zlaT{MwSrC!@Zh2M#D{?UGwir7m*{iCqwG$?nPMqywHHW`>UW@Kn7Ya|I__^psAG20 zpOR2VoNttxIN_&@7_QoF2qqbcshGB--|N!8Os^Iw)^`hE(ZKM?F#7~ zr0At}IzJzG&W#1wir1eK#`g6I=3be1)BtHsHzjjBs!rn*cRLjXw^j|CZ)l9ydbKY7 zz*#ANi;zW`8D>AK-TZ1fUDv2D=A?Zv(p)mTvYEdiD=2Ib{XKWZ3O@Pc_mCxy*{}JP zMRQHQoHJzZrVd~*z6A0d^VnzbQ|@;IL*Cu*zKB_0--YJcgj$nk(v@|;2>l>V|j*r#$UfIG6RW|Ef&^@4vGD$Du(?Pt?an%}FIW zuG}>eBr!mHIZjIm_5u^jaj*NNqa^(j&7Do!LgQ9d@~HvwE<1U9kM;k}@yF;i*4tZU z#|OJ$CFZryPi-1x$r<ai5=93#e=IH#zXKGG z^uV9(hSzD<{D=9-SczyN&fgiIa2DzKbG{-88M3ZUWPzz9`)N3r^I~u`5_c zz5RPWl8abJfx*ykv=f_xTu_s+1n>*YMQ}Slzr-H^6&$DD|AbwhXqD=zOVvv1qI}CF zzq!&wRJF2gJDWE<;U=6^&J8>HV{YL5*sUwXgqdd$Y@~lqT;bQ}sPJo|stR(L%^&n5 zP*q#kw|i%EeA#v24}aEH>h8)sbqdcqWO&u8f(wa}6%sRX+8I{M0GPyJ!3X_FizR~oM2Ho2#CZ}5ahJRoF>WtcZs7ddW z1hz42w$ooylQu;yr*2auoseJ6tCoMWL!@tDUq?SfftmqQmYe}eV4narF!nRc_kE7M zE5z@nR21-ze_-60Qc>OM+==gXh6eBHRKy4x$#&1rI|cUwZ=)k|%VISHyBpg6>`7_^ z5k$bp^`;UY)Y&+*ZviM@@4@4U02(K}!>p{fyU^|P=bwCOwH2Ac-&dyAdwonWjO;q# z&r7_u#3RNNM_6(khIZ5(zWvf+FdcM!ejhhU6vEv(k3u=QVVL$P0*;ca@}OT7Z4$O^Oy76pz5ujYO&f) zjr)b!Sw0Ei+88qkNGsE92Cx`}9+!c1s!YcR%xIKJ5W*Zvfl%VNTdtBPM9W;3gqaH8 z33r}9CcV_zJmmCP&C7l{!TbximU^jD|>*rh!AqNbajzhb`U(G-_EzQy97P?y1H;pyu5_InNP38 zx_j+IX!&vy1{;~lv7@i!@8VP-_%@#_?yTyYtGA8$a^d0_laj;hzvdZr9ILw0jr>K= zxIucSjPmHC(Vkru{_5$jC?sCmWCyPBLZs%%>>fpE%vm(!L&7($pLhGVpNAixV>2w? z>OZ_;g~uf)?U}qee4Il{IhBMPNPeknxd{8@iL83rIj1u@^7K(a1TO^Hxci4qD>a5wXD*Rh)w8|>@gHg+&pxD}FJQzAWQbqwKAi4%3dY3%TaLbm4} zof=(ZQEN&Y-vRIM@fKNd^NMYVMBE~sz-^_r<7Y z#ega1=Qi9QFRG#f+3tAsQ}|_Hn@RCIFWt(Wi9YY-NUxH=Iu0IWdU^j_>}`rfi*g2U zmbpfvWNK#i%3$&`*$yRaJn9`+$EVYhh_!n)0NG1Y+s_q#nsH_T;L-LIy;m)JtEJmg zvXn0q&fJdeFyM1sUm_kN$`60-%zk?--1nVR3wvDPvf7ZlEw#8tG~iqM;D{N=NX%sv zC3tPUO4v)BMs!DMqlGm%yR=^J*mZ7uG812-t1V@7KC_D=dben$R0)H)X}RL^mYtyk znxGG6$J_gK!aMc{|6JYuw5i?cn)7(-^5qk4y6yw7%4{U7UegnfMTCjMwE9tEe-cJn z&vClYS>EAPOGWPWGc|f0x9X0>R8Bxq13}cq`u(#D)WQ7kTZPPrm40knJB}%S7@-7} zk;R}JETNnCF5e&aX8Fn`9l%W;^kN>Ly#0PkVK(Wi#WzaiCq^BuZid#Rh9$-^y^Q@| z!9pBa43%jboq>dRUq70*{1|a8pHcL5U~lyAlr|vu*>!_cN1ltrd%V26(B6pf;4_ho z9~0n%eI8|4Esne7?9k+jvXI}8U6&(VomO-acok*8IInxeHU#~s?-Hb!oL zI7+toHI+M))dMQv*GJ^$i$o6uuAYasV+ zn3+=68=wL_Z5N>#*}Z72HM413zEWfsIrA@0mmB_*llX`IFuh3YLo5#JkdaG_T}jl7 zvY0g}(-GJ{vpDsLHg#B{k{OW}{6gh&L{DTLiPV9l zY$?W#UdeYZFzU#mfZbLH90tvrxVCSwvd%`}n*#YQF3t}e88PCYjjC)P_Z_U;#&qKR zxRFL^WQ;#^YMBvWC}{igZ$Oo_20=z?qh&|?_pC4rvzLtk;7Ik^9KL~r}4zaBGP3(&@f}PA?T^p}pjNX9} z40tO{TlAV9jHw#+=i;DXQ{FRLjKl_4hN)^)8r_h{U2Vgj0(?`C;2apMh7n$EHA|1T zW@w2Tz2X6CYp87U3^b?|;oYr(n(~2dtTP^q$=%T-`=mEZX+0^_EaSt8Q|@I3-=Yf_ zUii)6({S?yxgk1szLA4s>@ zU}J{Dt^Jfm)5|%|% z)OyWM`6+7TS|%40ctgq`mMqie^W$j25Y4MMg0SGhm%|jR2H?Afb4oZKj!j$V z#DE*rllX=2%})HFfY$N%b;ys{-PII%v2DQvJ%YMKr?Kyq<^J(+k7~O6Z~T?r^wXE*=OAGN8ke^x0G=TeuV%cOTTRHB=H-70v38}pfqZfKT0pN(>MG*_K6 z#k$HLW9_gS@#=F;mWUOvYdwYQoBcI)(54_f#SSU*G)7om|IzP-U-!>OgHTm z#^+;57sbiSPPY%^P%9D|Q7501qzO{7kcg5)p-L7{HGpu)^2DC%vB07IBXOJ~z9yy6 z1eIcVaGhOvec_3|`jb#VIP#5@E3N9Jl281nk_Wnsh=HJO-g^Af;gsJh^Wiad$MgvD zMfQn-ARPo8)Pebvu0|JDq8o4yD|? zSP(qV@QFH36F^^_w=^($2&-3$huzdgV*Y^V6n?3*K4gvTgA4o!D&6osaR)Sg&4CVH zD^ysZ`l3aDa;o5(z?nF&zl{_vlEQVr`= zQkOa*pL|&YXshEP>FiaC8$A4abteyb4vJpY7%|RJ4g-#aKMAuWteO=BOx$J>^fEg% z7&H+kMo?CG!lti-W}HEG1THN5xORRwz<>1zk{uCTGQ4pQLcV->ZnKLY{olDQA7jW`lzUmtXz)hHX4IoLGdqMvG?bN@a)L=H zSXom>I_`5=pR~8%^(2EbKiH^<0GKtmc^!*bZVnz9zm!{b3Y7?d@;x zIhs$V+cDQ+-P@J^@m%+GnC0Yk=FlvD1mh!fG397(jhbpYHw8p``!(iC1kN_2Ya6GV z8;xA9uhe@?DcAy%uS(-IBeSih-bO+*7rrMxn|~rt`EjH)D-fYf3}dQ1x58HbMiD8> z+?OioyuYWjGMpWvO_9;PTka%o_~B$`LW@s}>rArHDx~4YaFg=QOU)KHh|@2RocSm{p-kpG>NK@B|Ded4Yq4eE^c+Q(N}Ur|@V)u` z$@m|+V!-jqIlAO+>MyxFw#RW(3s(XzX3YWk62gKl25(DM54TU#E&Wm5Pc+#wq8m6R zjqrR|ea-pN_+(qezEQ206sZ+vOCNa}U#n=sEv5tx(wjlUys|I{5= z!yiU{SyRofBViY;W#<+kvJR|Bi>;x&Wul7saxs#*<`H8V&Cd*@%c#rP$$YqfVC_Ek zW%XQxDlg03^=tnqP5nB7hfXmYUtuhmnhtB$zWCbc-1wA?^DIE=1EAlhusF;Z`V~5$ zCAO2Tfenx*nP_>be;kxom$$X@Xt4WztzS4M8*KBY`NofZHu|}qJIUj{^Y0wEfPhGJ z3u|o}K3WL68+4A!PzEgX)X2ADV8+qw_VsyrM~&Q3^Le|gIm&x)(nBh5BoFc^9`TrO zKpz_{r%pU4ApHSwoS{1SNd$}%`Pg8CMQqWJ6*PFZD@|$gM?2grsWz2cxRf5p_}kw1 zckjn1FSbR)>woM@_(?8=TpJRe|9VEAew!9P2&<^M@*a}qjMy>5Ob4w?ErBp<4%}JF zioQ8(7r$&MalLlvU2$g1cm+G-(c=1+z0 z$=U+-RN!8DPyd7CpE_(o+GN9hqvMOJzcjj?F8+2kMKiM=ObiSGwGN8L$n_pvZV0GQ zd1OzmAXtZb=EW|5}uhR!tHh&5%>0yqqyVl+o7g-waB!g(t zp2v1Mg<*Qn4qV*;3iw4K=nqG;%^^c7Yg-bppE#shdwu-TxRlMme_;z!(uOqtOG%NNGOD{C3% zY8R-1PeW2lu%7PElai0JGH3Bo+Xnoe9n6PNl@tCQeum#1SL@dU9L9x?@xh-xKmJbp ztwAbmtUD`Dxw^Kh!{n}EheFsP^1qw0xL>$7BmX!K04Vd*A3+sz$O}2y9REPHa=z#{ z(pml)tK1ZzJ)TqvA{;LtjTf|u6qEC^<$KN5<4g<5c=yx)5g+cQvBj=?1mQ%jG zx!ug_t@w@huebSs%Ev3Ic3im7qsWxoe>6i;z#v|dA~X>r;{-{gNIf2zLd!LboU+2Q_oD_Mc@L~;<*uc;uOoH?%BPtvp|vQva3b_ zPWMQjMg!J@*)e-r&}z%jz9-A>U2b#bx@amPYwsPC1Pfn^HUAT(km#iC9g_$(2vZm< zh?4@;s-{fkH05MFi4X+Z;l3L6#y-}WMl1y6lPTB*(3(o2~W15zHe z29uYiwNswyCj_T09u}PR`oRci%Ec1G`*={L6?+xs_q7y~=0%t%(j$l8Ibn=Q(za*e zQAb6-MFShZ1mR4)U{iXtd37UuzAjE*8?T9P%AOmdP0^Fh<^Prukts_~-zX5>lvb0D zW!ZiR)UAcVv2UV?H4fl4`#*Z@g)z|8@S2=$j3%dBp^5~{s2v7Pef|X!cDr{4|BKNC z)Nul4zic9%zNl{4CSwKDwI=k1{%72Q!!LE|9j;y4hCY==76p?Z1rIJ`3ID;jD^w4U zn#OF~)J{BzXo*Fub4lhHDRpj-NPy zKAdu)o(_29`eybV&dYoCraQ2(xv+I{P3yG$baaJ~$r+`{!F>sdB+kqPK*u4MS$TRKJy*#0`dJmB+rpjpvVa?d*hdnoGsFMu(7$C((OW8KXQN6-L}j|}XA6Ci1Z z?y@_K#U^aT{asMU4HrMem@*!h9W~IBRFgpLWWnrq9>A_tqoh!aeaGfa|B|G=%K*67 z1gOTe=?BB^$y?Gj1oZIGjMS8-&S}GWHp%Z8lG{H>1+}><6E@rD3ghR0>?w#$mHF1= zTJ>`GdXjYbhRgh!YO&6Z3LHw&OQr1dgPMpaS~gz8edT5jD{tygNu)YT_PMU=MfK@K z**9Wx7RAfJwNHc_@OVKIm+V?lc^ZbRU0R`4@Og^Zg+mu_BSglvzw-FtT?%zAc!kU5 zvkdZTIK{4*BSkFQez|OhEwh8%aTb<^2Us*Ao#Jzt z&gyIkcCxS(hdW?b%iL&4cjXb*{D5?u)yoIcsL88^9+vzdPLRGy7XakpbT+02B#A#x z*xpX~Z!j8e?sBMew1iXa1XzA~dc}@5MY`C6=>~T5|EqIZp*|!2v^oJoVZ!tCH3|V@ zI!Xep{QPFQQkMOl?eOVj_#S<9b-3s`Cn9rP`|J4cQ)IshFU34bl;Tjn?y1CU)m541 z7eF2iikg-p0*jAPUEH%*J)-g%P~(4mVpN^F#$?A^Q=f{%Jz8CVD?^B&WzC$|>uQi@ zdak&W)SbjKa_W3s7BSMb1=J*nEsB}HF=r8(~7TOod+I@M|{S^T1m7t9=a5KwDT;?2Yt>B~|2zj;qz z`Q56dz{aTTQk7>H<+5^pL#y5p4*tirlj-KCTnJ!m0wc!1j!tV+&Nix z*LdiqBo+&I7r48;5)mmi9!Cm_I+TUlsJRY6;3|!8=GO0a6MoMy z=7RAP{$cid*T=FMhIJ^!owWMRDZyg{IJ&I~weRBZg!4+(@EyvbXYcL6Gw2b`E((%S z#J&{4<=;K;^*RDKMEG&hf;~(49!1!-4<+Jaf268;A6Xisx1JW ze6QrXEy-GJcft>4HR&8B@S9n3k@RYgWd$5Rm3hTvAO3-=A&fl)aS${em@@5CHBbt= zcsFBj39^JIPbQJ0tZdOuBJ;=~7wT$<2lXa4O#32WE^ZfWn|>VO^}1~)&nS7Tsv0HeJl49W3#b8g zL=Qs+N4F85w!c-TYlc_m4}FXva`y`V^0A6tM<*EHm>MQ@8g)P` zS}iowT{nK0J^hqlb|qEi_O*C1>CLK5qhe-6fOJ4Wl<&B9<)C;$3h>)uJ9u7^0@g0^ zRxuzaDBAv!J51&fIxjl@5VL9Ia*_Ml*NN!-^&Kb%kSE8E}bE~B$sZTN!;Q30F|7!9C(=v=B>DXD>O zA9t_>1RQN^Oz+c!JKX%c82=N8+`N@}6{QTrEFNU--<@!bKH4swvf@=zJH%Qyr*ht5 zPL@ZOp(*glD`y6=EvL5g1PZCC?1SAy)g`Z@B+zn=gSM0UWv&EQ2)^sOwOXeUHd1JrIc@?H!?|m&8pbmFcNnrBQNmZ3 z16Sf}psRbd@3v!*WspIcSLAxc-7J8N)L8lZ^(-U0+ab7O=V-*V+0WG!`WG^1xc?w> zTFF|svpe&06;`jNtzTKQLQUFW@9p7F#xwyhbkw}b*g7h9T`3Qo_AaZIN%3@ib_aM7 zlZyT7yq#(Z(!}T?pP>W;ncoM)25WrLuuAa@ZT4N|TUJs9$sGO>#JskWbHrOAq4t9q zZ#VH4GAO*SHqouQ=Uo%JMA|BI3)(gHyTZH6ZLyNm=TIBkSYjXn>d+00dXm`jcy!$# zUi%&J-VFPA{O!7UhIxr6Mz2HiFpG<$5LU9Z>3!mYSnlq1k#|?JzF&*w2|&$ElR~BGYeDWv&B$Es6{KH}UZYC*S7}3{kTO@B zRYr+ZVe?;^8s)eFcwxQ=!Y|+2*|6+!i;amI<&ohTAy(Fb!6D8lVLEA^5;x`E_pwHV z6y>yZoiu#!8G%6&45S2jw-BnTx_(QMsIEeFcbvs|G9G(6`)Q0V)x+IQX(x;P_m|vW zDym%AW{C9T;5!h8%o{4m8lGtiZ`&-HOXa{jl6}xZ?lz^nq!1*G7hf9Enro4@EzURB zYW_{WbygNXIj;@8^j`ZAG{0*z7SB4lxWBE~zDh>>cVWRyX-9GS6l8j;1l`V-d-|@= zBIe6?F{H~%zYKisN~TCC*@s|$UL4^3r<#q5O#w zruYabEGw>8H)o!Cy3N0BU{CjXS7JkvdA4Jf2L~s-?2tPRo7o1B3ewG&B$#6L6(;Dp zz1}!|U}pyQVb}kPivNy$u%$KB0nkh-1yO50DfVwGW*?l&nVe-+j_aH~zw zDY25eBP|d^SiwHpxqN&Ua&R44a4ozqxp>Z~BeS%t(X3WHr!a*Gg4uNjH`UP2+Hk>* zF21m~*#dWK+T1PnANASMFB(Gq%W|<{WY1sL0LkK*4fTp4&No&UwbOB*W#i0Nmp?^-QUIV<2a9q%;b9xA#3^buEx;;b9mwS`0z!w9p zS>_W~^pS(WpIu9B1G2;&^j{vT$ho7?60@y}f>aqd1FwrNJHIcmNGTsp#r%g+oJyl5 zFh%AP{J%%?X1U3K5gL~I21@^0*5r>Wg#7VP8%Vs_> zytCN}fgPNh*MpDcwKNvl@jy^WKGF-<&lY>17}F8b5j_+fuXnQQoUX*jRsIxJ3mdRl z*`p*}pD(HkXJUEXkI!N|3_f2Oni4i?6j6f3qX{*yW9ZQ$`cK4Aq3G*eAOCa|=^qKu z%*k9>dXVC?iNMd)*YPx zf8bdEcR0cs-RzO-k-@N4t!9foYg4@nJBvT0oP6;{rOT(j?iG+YjC1`IrTqx+s23BQ zSF2DTCu64v*Se6HNj(kL12`pejwfW6SRvt-HK)TI$(VxUEIE(1d~Kg~RB+|v^DDPq z^Aj&TXH#WkF-ygV+tU@yWh}!>>-kL$xtSo_6~;E0$I*S5K+G@M0%qR_jQ&Ss(99RDd1h`CZ}@kQREAZjRbsX_C(sT_AS3AB(EZF@ z8oHPI>q|HHk~&(Ag5fEy7zDdKR6gS93%dD|7LXJh{m4Cdah(Tq-X-lKVpQ*34CT9#mr#(9lu*AfDP z!?N-OE`>6=%t5;2b3Tdg-=Yc~v*o%o^kMit#W#b^Mr7qlyQo1RVWmsmXL8bdrHa|6 zXNM>8u)1yx;4$Em6yP?YthnJrUtapy^}pO}=O@u(J-r(F0A35N9s85(4pcrL!Xe-{ zgC!<}Uuf*(uhs&yf2v{W!AR#9u>6}*LVNVp#0ZicD_Qt{nl#ofLXI4WSBcB2MB|bh z)Q-|siPh(Wd;y=FG07?Je_VD*Of65&oQ*!dkpPqks6|7gglZ88>70Wi;OSDpbz>vO z7BnWq`2oQDaSUIfswTZ_?q&IRdo3TJ!V3p_T>-yk9?4oMFd0s7^^2Zc!3nP8aOozAGYck-;Y~ewS_>nJX_;9M4hnLbN07dtOer@0JQ+2wXsr4*C~&V@66f+>(#7Ua2il)wg3Ac8Dqt+*sX-AxM1i3MckVQ>ta7?X*%IN+8j zx2=RLH2bmsW%$7`Usde1x3k`wjj zHs%aspfQ_Iz!vR1$z00z+)5TcWNyTT=urHQJ}@g8g3*qrM?v*r>osL6vMLmBG(wra z#&0d(DWAQVoxoy8nCdb#SH4h24@xMvi|j>;!cEOBm65Kv9Tyo8Hy=ypYKhbHc(-5*by=&Scm8&_cuR14Aa=I9cHamLh_iNZwkc`7Rk*pGtEo5Zmp;WoGFIWP$p2;k}>* zF#OEZ3!BKJZEq|o*$`c?rg^ulSq-@HhOU-(^g{qulkmfg&Cu4=u0OlwLQJ8dg(b1X zDH+8mqa)+GP}w5tKBk&MEWvqgxER`!i$F@QYSJ6}erUVM4p%V_65srPT4}V`2ZuG< zx|36&-E^zWso)^yd1gz`*d{`{nB>JWNK|U^+SvS0jB2g!wQ-v06grI_Tc3Rp&L^S&8oNssuSAJ#LgIh_M2^XA)K? zA#V>dzYDp=%sg;huAt7oUaMQtf}gy9D6`Mqy6C>D?r{*OTrK40Dv3A5#>|wtSWOxF zob4ni8ca6`P5+e|tRrc>j8W>%dnF-jC7qwGeviq6gTn2Mgn48;bkBOhM};bpMk%`l zfqzO$qhn=8+D}IbWjPfdsPr~0yHZOIN}q`q$GSFGuDd5@&8;Yp)LM?Ko{Ts+X?T}; z+m6A(k6GQ|POTeF#@O4T)8AeG++azMw{@jrw_kZlr`y8bSkr1p6>Yxz7ec}khCh=j zGUIK*(bqxT;c&=^*hbYk1^^D2bm2z)yEDuMF@eW3qsFD9BPV^?et|yD1e4(jwA+pb zTf9kUHCpCUx;WVQLvg=BV2=#cR7u*Np8viJZuNR z@sBItY+M%kV|%(9*{F_yY`D%B#$GouFm-p09d1)kYDcff4rQN>I3P6zr|a?&J{Xmq zEVtt8V&tS2oo01AktDxIs&x)Zj9{iqAW#s$H z{>r~hhk|vyp`Mu1Nlv9f~T;FZNzS%+xA%`m*HMEV1&0VW{F2ZJw0CmUR4R6c&G^X^vOv1^00HP zDeDWzvmZkD(V@R~BAwM;xEWmsS$-x^gXgb^Y?p3a7gW%DUm~Z5VazeL8RaR*iS4~K zY|fQN8K{ckbOjcfsA`)+1q7K6Zy?0gC0!Qwtko)w?g~WBF$AnnUdx-+bW#aqkNTk$ zPWBb5!@Ai#-{;CLcn zW3I3l@jGaoHa1pcPctSrs!B#6r)RH)GkS3dvF3W+QGj-8ipQu9OFXA%x!EprbIC?) z(>i5NibrM*eWJDd^$%_F$aZoWqTLQx{O&(XW!ynH-_%VUpZaB|4{A0ZaGbz%!E8@) z;JEisS>T|Zz2BUF$zcd&p=Dh=eia{+7af{LNNzqzG)Jx#d_bxMfE*dzP2mX&md^jm zA#VY&<-_-%^$Xl7OC}%)>UByKm_312)?9LoyancKwPSi`I}@aSTd0R z`#>=;=G~d;1;^1cfAMpk811na1ZdbNo`>WZf=S>_&6+9$pOs0^D>7sfXQTjOV21$h z>}PO@R3;&hmX$O0qcFQa{wO?@yr?x-L-3psL<$0B)KG;40Usa&rwQ6QofYapR! z6?@^iX&|rAiiFU9a@XR&475PkzgEt=8*(!T$3U|=s!x&jb}O~rasoxAc%~0)7PQDT zjSWR`r`Mm5S0fp!ZAqu~btGVtFuT7qXYc#kcc!B>HKQ1hd-j85EVh3kwxW^3l?&@N$?%a)>ikN*UsMNQccs^z?k+yU3WVX|C+M}L=E@D}*oxJTs44#BEHUjo&bA_)@1~rg? z?FY(Y6vw6-YE6Hcj}6{bPIYtm2G%>uU)B0RJqIovUy3P2yF+2CLd)hC5g8WVbEQ?q z$vn9^kQPG_y?1mwm4>s`OS+%+Gv)`B9))dy8(Ow=yUo8Z=pVFJCHI!NYT`jUK4&1) z{aZ_(5e)Nktnk^os%PGJmq#9!ev9FAWdu+#L+Q)-bd8SptQC>W_QMi&WW|t?I zz{2lHo*1z27tfzp4v zWGBKARdJ_w2U0_;&fz?O9v!T0ygat%*AqN>WX)SPQ>)ELFO6~#(nQ-ihvU8KtMi4$ z$|12vKaD)+T$tz6V`;L5sCi%_Zrsa__qQS<8oaEO>uX&zzlXXELKkaC^;Nu&ZL{3U zOuhmVB^NVbb;T(BL`|`P>3Ai+x58^|_;QhbXLKa%sw@3AfRW!)T z1Te?#jQB86hxeTaUfGA&+i**4E9;rF07cGYZ$fX@x^<9P12ieb11hO7&bREC9!Qjrl(F^?QM7LDb1%=Xkx8FzYy z+2#1Q`xm^$D~nFT2(5g`+5?m>K&8BR=i1LjAb9788umgW!x2JAzM5&@>jjrJ5{Z5?kj&eIgvY!2C zy1l1*9)VHUsFFLM{U#yK!VCJ$?rc3+F8lL~v3c`!;AATCD3e4w_W~$S;5Ox5pFA~m z_ro8P@l=R>O1;;2`%24ZO)BY9pr74i(XTalEYP`87ImP4Mzel#aww3gmm6z3_v_8s zb%f8(T_>%pvOzhoZ$!^}$)c~FI3Rs``M@hP!g=ZgoTD&*Pkgc9{z2wfb+{*iXCAk7 za`@Y^@y`rdDSQ=eB#J_vrfMzv5<)VpkONEgGKxjufA+bJP1059n?g;q#BoZgwIIP$ z#{8N(SPVK0x+sH)&l*yrxFN@eyk%y$A6e*CD$Yfh=4KI^Y%-NKjajI-V3kUP?bxoVO-NedVGd9TGhgC8>>J%BiD;C>VeH;o##Me84 zTI%+KLUo}(-CR+36h1cG@&plg$A**yjacCnCsTDqXhemLU0WA{&+LI~w&7LU73?}(9*5<7G8+S&s_hHTYp_8nw0I< zS;s;~mg?32W?iW}EZ<)G{%5jDl$Y{65q8f@YLPJ`I^}ii>xz;siS&85iM$fC3`f*c zF+xokZ0*De`lW&o@6$_k?0JyX53(u9{kNS3RpN#EB&KnFZ)l4kxCneEp!?ULKi=CL)6=gUOXz`@V)%^)Py@lu5`!)ubV* ztw(x9WHo{?(Z5#(UdEqoc;w%#O?gvjaJZ?G%K*&vD5g}VI}^SryUty&)dW}A3hncd z2c#;rO7(W$>&!3j6OQH!k2)2)7c&MZmCgDY4JdqhFgMw1Q$n*Nq*l#WS75k8%MR7m z@RQ=^cO}>26z`raq7_y7jWp{6WpsMJ{;D44fYX1!)0q;nduMMVFKPka3~8DG510?K zJkLNa#{>C=fUU4jLgk!omkF8r_Qd>_KpB7o>?+gE^9$B()ST4D2(drKf-|U@od@gt z`)1p0e zdD4#Jclg=HCRt|1Ph~Q4D`0;`!Cnc)R-OE$fZ5%he=k&cmcR}sP60t>o^$=+3u-RD zkOG?X=Lq_L!zULqeX<|a8-2>Xk<{6{&V9x-SqhE+uKA>{J<&ne23-rn##CpAM zg0LvqV^bEuWNw%;lqm0H7p?RrZFaph+0#{uGBn%&&PrHrAK-=--RgNOPZG;V)2%Et znXh3CQ?UHwFOITRk5X;xF=0=aK1{_~>KOL$*pcU9Fpn`DD!?j}0RDQ4#}O49iE*v% zENiA=ILgXdS%ieF!Og^}pGPQ5 zp@;5qvrd_*$&}dj3IeV_sJ76-fVb}0$@1K#eDdK3SY&iY64FK3t+@d8d2-M$o0WNLm1fXt@D=IG)Y z2}?wsH;!dC>Oxh7EkF2uY0JJ^Ymu?I_oG_tzseDOV`-+k%vp9-#dN#P7FU}$U>>Dy zMiI%E-|0o)AVepp+2PB_pc9l2OEkXXLxIo&*>BiGZ2~JpM9B0wy!-U^ZC`50V(d9EU z?-SW?ZubOgGJ6Mb=H6*!YPoE;u@m|5mdmgDt@c6r7{DiOvAJ0QA=V6{1TpIHA9<&_ z;M7QGp58(5Tq2IvtTrF0jiL&!6$OI)IYwLky#?c-W~?%QF{5&wJJu{&^j|x1(#H~H z=Y~Hlo3-JdaLPQmN(Lx5=~v-q(5GKWsz^|P4Vs(9NCu)LNOdzB`ovn7MGW+CxEw*ks zcH%2~J2&O50s~CghImNU61^5&s`k6h1#4hq70QQ&9>>_OR*$_1a@^(S9VxUDGW@HJ zb1PB;(M!pRZru|^gNDMlBx# zbtU;s;J4A3>3a7!s}^^Na3!snn^lSVCzLeHPtz}Vy(NU_PN}9sPt}@-qTp^SrDqAc zXTT!Z5mNYiFuQub&yDCSE3rOVor#>sxz+KaSr;Z-5U zb2wK~?hdEI-9ypyU33}D{UW&>8_Of2FgBCtmWt2wiUX)_OJ+CULL4Gwwgk)qq8?vF zmIyKq`WoRomfW|PXaN?kLrB8MLAq*gRFY34$~OpwydrFHu#V7V)%ULJ9At#%Rp8DEVTuh?y956+$6$?D?KKt>)ROPgLZhu}Tw z8NDRfI~j!EOTwxf)#v$Z!v<13zp)>|zdQfCXBlcnbWzH^UG2~B$nfMRJE6Y#*e-K~ zZ13~XA#}!n)|cdlI!^ibh;c-%d4{(c&*CcVl0(2wG=Bqbzn-tA;*SrQj_LlGUFf=i zf4b1!!1DB6#g#t3rfh4Dy$?JjOOV2?t^9ojW%?g4p3QXeNh{+TztI~~Ir2}3bXV$9 zxx}y=!P2t@0qZSh9aZyt57{z>gi=f1R(s1D`YpJY{P`s@HB4w62?Jn!7NyS^YrBw* zqJSCRi&|x_Nb2Xr=yf7m1ZyCj#g9Rq*?tX!nZtc4-J!g zv_&D^`0{Lht|lyg8#Ba>!?cZgYXtVOisDG=MF%mGk{mg~tN2SG=+cmy5im4`E5fH* zJaWF97l>Z|6ViGEd@}n6N^r_brJT&AMh&S!w0(JQPgtK_LOZFi3sxHrPlV;^tgejy zF&}1RZ5)Ifv~E{{^%+Rue66`>ohi_&Cv*UxwDVaDkWC;exyh3{xt0)pveK6^zIb>7=li@ z>ukEOGbaOr4`358(_9U}T^UFWwsi{T3_Q#No0j|N261}xwlzUI=E}>iLhm77if#1t zaL2+(`)^2=X)V!}^4zc8?bBIf{y$~pWv&XcsKnz$z(KdM`~ZAo;+%=`obmEKRr7QB GzyAZe6ch3Q literal 0 HcmV?d00001 From a544f88ee6f9675df49f5760a3666df722a8dbe9 Mon Sep 17 00:00:00 2001 From: "Yorke E. Rhodes III" Date: Mon, 30 Dec 2024 14:50:20 -0500 Subject: [PATCH 36/69] Update agents.md Minor update to correct "should" --- docs/docs/core/agents.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/core/agents.md b/docs/docs/core/agents.md index 8c923df4c8..29cd6fc1a1 100644 --- a/docs/docs/core/agents.md +++ b/docs/docs/core/agents.md @@ -90,7 +90,7 @@ const runtime = new AgentRuntime({ ## State Management -This section should cover how agents manage and update state, with a focus on initial state composition and updating methods. The runtime maintains state through the [State](/api/interfaces/state) interface: +This section covers how agents manage and update state, with a focus on initial state composition and updating methods. The runtime maintains state through the [State](/api/interfaces/state) interface: ```typescript interface State { From 19ec40b5b4e5ff6c2873520818f08735c1370347 Mon Sep 17 00:00:00 2001 From: treppers <90061012+treppers@users.noreply.github.com> Date: Mon, 30 Dec 2024 20:53:42 +0000 Subject: [PATCH 37/69] add an client-direct endpoint to get memories by agentid and roomid --- packages/client-direct/src/api.ts | 62 +++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/packages/client-direct/src/api.ts b/packages/client-direct/src/api.ts index f74174e445..6d5ac569f5 100644 --- a/packages/client-direct/src/api.ts +++ b/packages/client-direct/src/api.ts @@ -11,6 +11,7 @@ import { import { REST, Routes } from "discord.js"; import { DirectClient } from "."; +import { stringToUuid } from "@elizaos/core"; export function createApiRouter( agents: Map, @@ -121,5 +122,66 @@ export function createApiRouter( } }); + router.get("/agents/:agentId/:roomId/memories", async (req, res) => { + const agentId = req.params.agentId; + const roomId = stringToUuid(req.params.roomId); + let runtime = agents.get(agentId); + + // if runtime is null, look for runtime with the same name + if (!runtime) { + runtime = Array.from(agents.values()).find( + (a) => a.character.name.toLowerCase() === agentId.toLowerCase() + ); + } + + if (!runtime) { + res.status(404).send("Agent not found"); + return; + } + + try { + const memories = await runtime.messageManager.getMemories({ + roomId, + }); + const response = { + agentId, + roomId, + memories: memories.map((memory) => ({ + id: memory.id, + userId: memory.userId, + agentId: memory.agentId, + createdAt: memory.createdAt, + content: { + text: memory.content.text, + action: memory.content.action, + source: memory.content.source, + url: memory.content.url, + inReplyTo: memory.content.inReplyTo, + attachments: memory.content.attachments?.map( + (attachment) => ({ + id: attachment.id, + url: attachment.url, + title: attachment.title, + source: attachment.source, + description: attachment.description, + text: attachment.text, + contentType: attachment.contentType, + }) + ), + }, + embedding: memory.embedding, + roomId: memory.roomId, + unique: memory.unique, + similarity: memory.similarity, + })), + }; + + res.json(response); + } catch (error) { + console.error("Error fetching memories:", error); + res.status(500).json({ error: "Failed to fetch memories" }); + } + }); + return router; } From d643a238dd58dcf0d1839b3b7965ba524f701f0c Mon Sep 17 00:00:00 2001 From: 0xFloyd Date: Tue, 31 Dec 2024 05:26:33 +0000 Subject: [PATCH 38/69] docs: fix Contributing Guide --- docs/docs/guides/local-development.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/local-development.md b/docs/docs/guides/local-development.md index 4f46f967fe..b831319db3 100644 --- a/docs/docs/guides/local-development.md +++ b/docs/docs/guides/local-development.md @@ -447,4 +447,4 @@ npx knowledge2character - [Configuration Guide](./configuration.md) for setup details - [Advanced Usage](./advanced.md) for complex features - [API Documentation](/api) for complete API reference -- [Contributing Guide](../community/contributing.md) for contribution guidelines +- [Contributing Guide](/contributing.md) for contribution guidelines From c1576059b8b4839c60cfc8ede59c06d7eb458b1d Mon Sep 17 00:00:00 2001 From: chandiniv1 Date: Tue, 31 Dec 2024 11:36:24 +0530 Subject: [PATCH 39/69] feat: add docs for image generation plugin --- packages/plugin-image-generation/Readme.md | 155 +++++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 packages/plugin-image-generation/Readme.md diff --git a/packages/plugin-image-generation/Readme.md b/packages/plugin-image-generation/Readme.md new file mode 100644 index 0000000000..3aa868121f --- /dev/null +++ b/packages/plugin-image-generation/Readme.md @@ -0,0 +1,155 @@ +# Plugin Image Generation + +A plugin designed for generating and managing images, providing features like image manipulation, storage integration, and optimized handling for various use cases. + +## Overview + +The Plugin Image Generation offers developers tools to handle image-related operations seamlessly. It supports image creation, manipulation, and integration with storage solutions, making it ideal for applications requiring dynamic image generation. + +### Features + +- Dynamic image generation +- Integration with storage solutions +- Optimized handling for high-resolution images + +## Installation Instructions + +To install the plugin, use the following command: + +```bash +npm install plugin-image-generation +``` + +## Configuration Requirements + +### Environment Variables + +Ensure the following environment variables are set: + +| Variable Name | Description | +| ---------------------- | ----------------------------------- | +| `IMAGE_STORAGE_BUCKET` | Name of the storage bucket. | +| `STORAGE_ACCESS_KEY` | Access key for storage integration. | +| `STORAGE_SECRET_KEY` | Secret key for storage integration. | + +### TypeScript Configuration + +The plugin assumes a TypeScript environment. Ensure your `tsconfig.json` includes the necessary compiler options: + +```json +{ + "compilerOptions": { + "module": "ESNext", + "target": "ES6", + "moduleResolution": "node", + "strict": true + } +} +``` + +## Usage Examples + +### Generate an Image + +The main functionality allows generating an image dynamically. + +```typescript +import { generateImage } from 'plugin-image-generation'; + +const image = await generateImage({ + width: 800, + height: 600, + backgroundColor: '#ffffff', + text: 'Hello World', + font: 'Arial', +}); + +console.log('Generated Image:', image); +``` + +### Upload to Storage + +The plugin supports direct integration with storage solutions for uploading images. + +```typescript +import { uploadImage } from 'plugin-image-generation'; + +const uploadResult = await uploadImage({ + imagePath: 'path/to/image.png', + bucketName: 'my-storage-bucket', +}); + +console.log('Image uploaded successfully:', uploadResult); +``` + +## API Reference + +### generateImage + +#### Parameters + +- `width`: Width of the image. +- `height`: Height of the image. +- `backgroundColor`: Background color of the image. +- `text`: Text to be displayed on the image. +- `font`: Font style for the text. + +#### Returns + +A promise that resolves with the generated image. + +### uploadImage + +#### Parameters + +- `imagePath`: Path to the image file. +- `bucketName`: Name of the storage bucket. + +#### Returns + +A promise that resolves with the upload result. + +## Common Issues/Troubleshooting + +### Issue: Image Not Generated + +**Solution**: Ensure the input parameters for `generateImage` are valid and properly formatted. + +### Issue: Upload Fails + +**Solution**: Verify that the storage credentials and bucket name are correctly configured. + +### Issue: Poor Image Quality + +**Solution**: Check the resolution and ensure that high-quality settings are applied during generation. + +## Additional Documentation + +### Examples Folder + +Include sample projects in the `examples/` directory for users to reference. + +### Testing Guide + +- Run tests using `npm test`. +- Ensure integration tests cover all major functionalities. + +### Plugin Development Guide + +To extend this plugin, add new image generation or manipulation features in the `src/` directory. + +### Security Best Practices + +- Store access keys securely. +- Use environment variables for sensitive information. +- Regularly update dependencies. + +### Performance Optimization Guide + +- Optimize image generation by reducing redundant processing. +- Use efficient algorithms for image manipulation. +- Cache frequently used assets. + +## License + +MIT From cdbbb9e76b8b5618c2d32e1e10ce293b02ae47d1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Salazar=20Solano?= <112297389+salazarsebas@users.noreply.github.com> Date: Tue, 31 Dec 2024 01:18:09 -0600 Subject: [PATCH 40/69] fix: fix the image redirection --- docs/README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/README.md b/docs/README.md index f3d0e262b5..5e4da17b9a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -1,16 +1,16 @@ # Eliza - Multi-agent simulation framework -# https://github.com/elizaos/eliza +# https://github.com/elizaOS/eliza # Visit https://eliza.builders for support ## 🌍 README Translations -[中文说明](./README_CN.md) | [Deutsch](./README_DE.md) | [Français](./README_FR.md) | [ไทย](./README_TH.md) +[中文说明](./README_CN.md) | [Deutsch](./README_DE.md) | [Français](./README_FR.md) | [ไทย](./README_TH.md) | [Español](README_ES.md) # dev branch -Eliza Banner +Eliza Banner _As seen powering [@DegenSpartanAI](https://x.com/degenspartanai) and [@MarcAIndreessen](https://x.com/pmairca)_ From e9a0db00f3939342b2b2af7b2096e9bb4eed46b4 Mon Sep 17 00:00:00 2001 From: zhourunlai Date: Tue, 31 Dec 2024 11:06:04 +0800 Subject: [PATCH 41/69] update volcengine model --- .env.example | 8 ++++++++ packages/core/src/models.ts | 21 ++++++++++++++++----- 2 files changed, 24 insertions(+), 5 deletions(-) diff --git a/.env.example b/.env.example index f54f552f6a..7c41a8b33b 100644 --- a/.env.example +++ b/.env.example @@ -162,6 +162,14 @@ LARGE_GAIANET_SERVER_URL= # Default: https://qwen72b.gaia.domains/v1 GAIANET_EMBEDDING_MODEL= USE_GAIANET_EMBEDDING= # Set to TRUE for GAIANET/768, leave blank for local +# Volcengine Configuration +VOLENGINE_API_URL= # Volcengine API Endpoint, Default: https://open.volcengineapi.com/api/v3/ +VOLENGINE_MODEL= +SMALL_VOLENGINE_MODEL= # Default: doubao-lite-128k +MEDIUM_VOLENGINE_MODEL= # Default: doubao-pro-128k +LARGE_VOLENGINE_MODEL= # Default: doubao-pro-256k +VOLENGINE_EMBEDDING_MODEL= # Default: doubao-embedding + # EVM EVM_PRIVATE_KEY= EVM_PROVIDER_URL= diff --git a/packages/core/src/models.ts b/packages/core/src/models.ts index 7609533425..99e8507821 100644 --- a/packages/core/src/models.ts +++ b/packages/core/src/models.ts @@ -395,7 +395,7 @@ export const models: Models = { }, }, [ModelProviderName.VOLENGINE]: { - endpoint: "https://open.volcengineapi.com/api/v3/", + endpoint: settings.VOLENGINE_API_URL || "https://open.volcengineapi.com/api/v3/", settings: { stop: [], maxInputTokens: 128000, @@ -405,10 +405,21 @@ export const models: Models = { temperature: 0.6, }, model: { - [ModelClass.SMALL]: "doubao-lite-128k", - [ModelClass.MEDIUM]: "doubao-pro-128k", - [ModelClass.LARGE]: "doubao-pro-128k", - [ModelClass.EMBEDDING]: "doubao-embedding", + [ModelClass.SMALL]: + settings.SMALL_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-lite-128k", + [ModelClass.MEDIUM]: + settings.MEDIUM_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-pro-128k", + [ModelClass.LARGE]: + settings.LARGE_VOLENGINE_MODEL || + settings.VOLENGINE_MODEL || + "doubao-pro-256k", + [ModelClass.EMBEDDING]: + settings.VOLENGINE_EMBEDDING_MODEL || + "doubao-embedding", }, }, [ModelProviderName.NANOGPT]: { From 4e3e5b886517bb6e82522d872b95222c744ae6b6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebasti=C3=A1n=20Salazar=20Solano?= <112297389+salazarsebas@users.noreply.github.com> Date: Tue, 31 Dec 2024 01:49:29 -0600 Subject: [PATCH 42/69] feat: Add Spanish Translation for Documentation README --- docs/README_ES.md | 179 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 179 insertions(+) create mode 100644 docs/README_ES.md diff --git a/docs/README_ES.md b/docs/README_ES.md new file mode 100644 index 0000000000..419ca205ee --- /dev/null +++ b/docs/README_ES.md @@ -0,0 +1,179 @@ +# Eliza - Framework de simulación multi-agente + +# https://github.com/elizaOS/eliza + +# Visita https://eliza.builders para ayuda + +## 🌍 Traducciones del README + +[中文说明](./README_CN.md) | [Deutsch](./README_DE.md) | [Français](./README_FR.md) | [ไทย](./README_TH.md) | [English](README.md) + +# dev branch + +Eliza Banner + +_Respaldado por [@DegenSpartanAI](https://x.com/degenspartanai) y [@MarcAIndreessen](https://x.com/pmairca)_ + +- Framework de simulación multi-agente +- Añade tantos caracteres únicos como quieras con [characterfile](https://github.com/elizaOS/characterfile/) +- Conectores Discord y Twitter con todas las funciones y compatibilidad con canales de voz de Discord. +- Sistema de memoria RAG completo para conversaciones y documentos. +- Capacidad para leer enlaces y archivos PDF, transcribir audio y vídeos, resumir conversaciones, etc. +- Gran capacidad de ampliación: cree sus propias acciones y clientes para ampliar las posibilidades de Eliza. +- Admite modelos locales y de código abierto (configurado por defecto con Nous Hermes Llama 3.1B). +- Compatible con OpenAI para la inferencia en la nube en un dispositivo ligero. +- Modo "Ask Claude" para llamar a Claude en consultas más complejas +- 100% Typescript + +# Primeros pasos + +**Prerrequisitos (OBLIGATORIOS):** + +- [Node.js 23+](https://docs.npmjs.com/downloading-and-installing-node-js-and-npm) +- [pnpm](https://pnpm.io/installation) + +### Edita el archivo .env + +- Copie .env.example en .env y rellene los valores apropiados +- Edita las variables de entorno de TWITTER para añadir el nombre de usuario y la contraseña de tu bot + +### Edita el archivo del character + +- Mira el archivo `src/core/defaultCharacter.ts` - tú puedes modificarlo +- También puede cargar caracteres con el comando `pnpm start --characters="path/to/your/character.json"` y ejecutar múltiples bots al mismo tiempo. + +Después de configurar el archivo .env y el archivo de caracteres, puedes iniciar el bot con el siguiente comando: + +``` +pnpm i +pnpm start +``` + +# Personalizando Eliza + +### Añadir acciones personalizadas + +Para evitar conflictos de git en el directorio core, recomendamos añadir acciones personalizadas a un directorio `custom_actions` y luego añadirlas al archivo `elizaConfig.yaml`. Consulte el archivo `elizaConfig.example.yaml` para ver un ejemplo. + +## Ejecutando con diferentes modelos + +### Ejecuta con Llama + +Tú puedes ejecutar los modelos Llama 70B o 405B configurando el ambiente `XAI_MODEL` en la variable `meta-llama/Meta-Llama-3.1-70B-Instruct-Turbo` o `meta-llama/Meta-Llama-3.1-405B-Instruct` + +### Ejecuta con Grok + +Tú puedes ejecutar modelos Grok configurando el ambiente `XAI_MODEL` en la variable `grok-beta` + +### Ejecuta con OpenAI + +Tú puedes ejecutar modelos OpenAI configurando el ambiente `XAI_MODEL` en la variable `gpt-4-mini` o `gpt-4o` + +## Requerimientos adicionales + +Puede que necesite instalar Sharp. Si aparece un error al arrancar, intente instalarlo con el siguiente comando: + +``` +pnpm install --include=optional sharp +``` + +# Configuración del entorno + +Tendrás que añadir variables de entorno a tu archivo .env para conectarte a distintas plataformas: + +``` +# Variables de entorno necesarias +DISCORD_APPLICATION_ID= +DISCORD_API_TOKEN= # Bot token +OPENAI_API_KEY=sk-* # OpenAI API key, starting with sk- +ELEVENLABS_XI_API_KEY= # API key from elevenlabs + +# CONFIGURACION DE ELEVENLABS +ELEVENLABS_MODEL_ID=eleven_multilingual_v2 +ELEVENLABS_VOICE_ID=21m00Tcm4TlvDq8ikWAM +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.9 +ELEVENLABS_VOICE_STYLE=0.66 +ELEVENLABS_VOICE_USE_SPEAKER_BOOST=false +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=4 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 + +TWITTER_DRY_RUN=false +TWITTER_USERNAME= # Account username +TWITTER_PASSWORD= # Account password +TWITTER_EMAIL= # Account email + +X_SERVER_URL= +XAI_API_KEY= +XAI_MODEL= + + +# Para preguntarle cosas a Claude +ANTHROPIC_API_KEY= + +WALLET_SECRET_KEY=EXAMPLE_WALLET_SECRET_KEY +WALLET_PUBLIC_KEY=EXAMPLE_WALLET_PUBLIC_KEY + +BIRDEYE_API_KEY= + +SOL_ADDRESS=So11111111111111111111111111111111111111112 +SLIPPAGE=1 +RPC_URL=https://api.mainnet-beta.solana.com +HELIUS_API_KEY= + + +## Telegram +TELEGRAM_BOT_TOKEN= + +TOGETHER_API_KEY= +``` + +# Configuración de la inferencia local + +### Configuración CUDA + +Si tienes una GPU NVIDIA, puedes instalar CUDA para acelerar drásticamente la inferencia local. + +``` +pnpm install +npx --no node-llama-cpp source download --gpu cuda +``` + +Asegúrese de que ha instalado el kit de herramientas CUDA, incluidos cuDNN y cuBLAS. + +### Ejecutando localmente + +Añade XAI_MODEL y ajústalo a una de las opciones anteriores de [Run with Llama](#run-with-llama) - puedes dejar X_SERVER_URL y XAI_API_KEY en blanco, descarga el modelo de huggingface y lo consulta localmente. + +# Clientes + +## Discord Bot + +Para obtener ayuda con la configuración de su Bot Discord, echa un vistazo aquí: https://discordjs.guide/preparations/setting-up-a-bot-application.html + +# Desarrollo + +## Pruebas + +Para ejecutar el conjunto de pruebas: + +```bash +pnpm test # Ejecutar las pruebas una vez +pnpm test:watch # Ejecutar pruebas en modo vigilancia +``` + +Para pruebas database-specific: + +```bash +pnpm test:sqlite # Ejecuta pruebas con SQLite +pnpm test:sqljs # Ejecuta pruebas con with SQL.js +``` + +Las pruebas se escriben usando Jest y se encuentran en los archivos `src/**/*.test.ts`. El entorno de pruebas está configurado para: + +- Cargar variables de entorno desde `.env.test`. +- Uso de un tiempo de espera de 2 minutos para pruebas de larga duración +- Compatibilidad con módulos ESM +- Ejecutar pruebas en secuencia (--runInBand) + +Para crear nuevas pruebas, añade un archivo `.test.ts` junto al código que estás probando. From f515f1f2bc07005617663ef58d8119d2b86245fb Mon Sep 17 00:00:00 2001 From: CheddarQueso Date: Tue, 31 Dec 2024 03:51:39 -0500 Subject: [PATCH 43/69] added README files to all plugins --- packages/plugin-0g/README.md | 214 ++++++++++++++ packages/plugin-0g/readme.md | 127 --------- packages/plugin-3d-generation/README.md | 210 ++++++++++++++ packages/plugin-abstract/README.md | 201 +++++++++++++ packages/plugin-aptos/README.md | 231 +++++++++++++++ packages/plugin-avalanche/README.md | 229 +++++++++++++++ packages/plugin-bootstrap/README.md | 162 +++++++++++ packages/plugin-coinbase/README.md | 198 +++++++++++++ packages/plugin-conflux/README.md | 218 +++++++++++++- packages/plugin-cronoszkevm/README.md | 150 ++++++++++ packages/plugin-echochambers/README.md | 200 ++++++++++--- packages/plugin-evm/README.md | 198 +++++++++++-- packages/plugin-ferePro/README.md | 199 +++++++++++++ packages/plugin-flow/README.md | 157 ++++++++++- packages/plugin-fuel/README.md | 147 ++++++++++ packages/plugin-gitbook/README.md | 184 ++++++++++++ packages/plugin-goat/README.md | 129 +++++++-- packages/plugin-icp/README.md | 222 +++++++++++++++ packages/plugin-image-generation/README.md | 150 ++++++++++ packages/plugin-intiface/README.md | 190 +++++++++++++ packages/plugin-multiversx/README.md | 169 +++++++++++ packages/plugin-multiversx/readme.md | 12 - packages/plugin-near/README.md | 210 ++++++++++++++ packages/plugin-nft-generation/README.md | 218 ++++++++++++++ packages/plugin-nft-generation/Readme.md | 185 ------------ packages/plugin-node/README.md | 227 +++++++++++++++ packages/plugin-solana/README.MD | 312 +++++++++++++++++++++ packages/plugin-starknet/README.md | 148 ++++++++++ packages/plugin-starknet/readme.md | 17 -- packages/plugin-story/README.md | 228 +++++++++++++++ packages/plugin-sui/README.md | 165 +++++++++++ packages/plugin-tee/README.md | 235 ++++++++++++---- packages/plugin-ton/README.md | 237 ++++++++++++++++ packages/plugin-ton/Readme.md | 124 -------- packages/plugin-trustdb/README.md | 214 ++++++++++++++ packages/plugin-twitter/README.md | 259 +++++++++++++++++ packages/plugin-video-generation/README.md | 264 +++++++++++++++++ packages/plugin-web-search/README.md | 190 +++++++++++++ packages/plugin-whatsapp/README.md | 220 +++++++++++++++ packages/plugin-whatsapp/Readme.md | 154 ---------- packages/plugin-zksync-era/README.md | 220 +++++++++++++++ 41 files changed, 6959 insertions(+), 765 deletions(-) create mode 100644 packages/plugin-0g/README.md delete mode 100644 packages/plugin-0g/readme.md create mode 100644 packages/plugin-3d-generation/README.md create mode 100644 packages/plugin-abstract/README.md create mode 100644 packages/plugin-aptos/README.md create mode 100644 packages/plugin-avalanche/README.md create mode 100644 packages/plugin-bootstrap/README.md create mode 100644 packages/plugin-coinbase/README.md create mode 100644 packages/plugin-cronoszkevm/README.md create mode 100644 packages/plugin-ferePro/README.md create mode 100644 packages/plugin-fuel/README.md create mode 100644 packages/plugin-gitbook/README.md create mode 100644 packages/plugin-icp/README.md create mode 100644 packages/plugin-image-generation/README.md create mode 100644 packages/plugin-intiface/README.md create mode 100644 packages/plugin-multiversx/README.md delete mode 100644 packages/plugin-multiversx/readme.md create mode 100644 packages/plugin-near/README.md create mode 100644 packages/plugin-nft-generation/README.md delete mode 100644 packages/plugin-nft-generation/Readme.md create mode 100644 packages/plugin-node/README.md create mode 100644 packages/plugin-solana/README.MD create mode 100644 packages/plugin-starknet/README.md delete mode 100644 packages/plugin-starknet/readme.md create mode 100644 packages/plugin-story/README.md create mode 100644 packages/plugin-sui/README.md create mode 100644 packages/plugin-ton/README.md delete mode 100644 packages/plugin-ton/Readme.md create mode 100644 packages/plugin-trustdb/README.md create mode 100644 packages/plugin-twitter/README.md create mode 100644 packages/plugin-video-generation/README.md create mode 100644 packages/plugin-web-search/README.md create mode 100644 packages/plugin-whatsapp/README.md delete mode 100644 packages/plugin-whatsapp/Readme.md create mode 100644 packages/plugin-zksync-era/README.md diff --git a/packages/plugin-0g/README.md b/packages/plugin-0g/README.md new file mode 100644 index 0000000000..97f2766490 --- /dev/null +++ b/packages/plugin-0g/README.md @@ -0,0 +1,214 @@ +# @elizaos/plugin-0g + +A plugin for storing data using the 0G protocol within the ElizaOS ecosystem. + +## Description +The 0G plugin enables seamless integration with the Zero Gravity (0G) protocol for decentralized file storage. It provides functionality to upload files to the 0G network. + +## Installation + +```bash +pnpm install @elizaos/plugin-0g +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +ZEROG_INDEXER_RPC=<0G indexer RPC endpoint> +ZEROG_EVM_RPC=<0G EVM RPC endpoint> +ZEROG_PRIVATE_KEY= +ZEROG_FLOW_ADDRESS=<0G Flow contract address> +``` + +## Usage + +### Basic Integration + +```typescript +import { zgPlugin } from '@ai16z/plugin-0g'; +``` + + +### File Upload Example + +```typescript +// The plugin automatically handles file uploads when triggered +// through natural language commands like: + +"Upload my document.pdf" +"Store this image.png on 0G" +"Save my resume.docx to Zero Gravity" +``` + + +## API Reference + +### Actions + +#### ZG_UPLOAD + +Uploads files to the 0G network. + +**Aliases:** +- UPLOAD_FILE_TO_ZG +- STORE_FILE_ON_ZG +- SAVE_FILE_TO_ZG +- UPLOAD_TO_ZERO_GRAVITY +- STORE_ON_ZERO_GRAVITY +- SHARE_FILE_ON_ZG +- PUBLISH_FILE_TO_ZG + +**Input Content:** +```typescript +interface UploadContent { +filePath: string; +} +``` + + +## Common Issues & Troubleshooting + +1. **File Access Errors** + - Ensure the file exists at the specified path + - Check file permissions + - Verify the path is absolute or relative to the execution context + +2. **Configuration Issues** + - Verify all required environment variables are set + - Ensure RPC endpoints are accessible + - Confirm private key has sufficient permissions + +## Security Best Practices + +1. **Environment Variables** + - Never commit private keys to version control + - Use secure environment variable management + - Rotate private keys periodically + + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run the plugin: + +```bash +pnpm run dev +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Storage Management** + - Multi-file upload optimization + - Folder structure preservation + - Automated file replication + - Storage redundancy management + - File versioning system + - Archival storage options + +2. **Content Distribution** + - CDN integration + - Bandwidth optimization + - Geographic replication + - Edge caching support + - P2P content delivery + - Streaming optimization + +3. **Data Security** + - Enhanced encryption options + - Access control lists + - Key management system + - Data integrity verification + - Secure sharing mechanisms + - Privacy-preserving features + +4. **Integration Features** + - Additional blockchain support + - Cross-chain functionality + - Smart contract integration + - NFT storage optimization + - DApp integration tools + - API expansion + +5. **Performance Optimization** + - Upload speed improvements + - Parallel processing + - Compression algorithms + - Caching mechanisms + - Network optimization + - Resource management + +6. **Developer Tools** + - Enhanced SDK features + - CLI tool improvements + - Testing framework + - Monitoring dashboard + - Analytics integration + - Documentation generator + +7. **Content Management** + - Metadata management + - Search functionality + - Content indexing + - Tag system + - Collection management + - Batch operations + +8. **Protocol Features** + - Model service deployment + - KV store implementation + - State persistence + - Database integration + - Enhanced file metadata + - Protocol governance + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Zero Gravity (0G)](https://0g.xyz/): Decentralized file storage protocol +- [IPFS](https://ipfs.tech/): InterPlanetary File System +- [Filecoin](https://filecoin.io/): Decentralized storage network +- [Flow](https://flow.com/): Blockchain for open worlds +- [Content Addressable Storage](https://en.wikipedia.org/wiki/Content-addressable_storage): Storage architecture + +Special thanks to: +- The 0G Protocol development team +- The Protocol Labs team for IPFS +- The Filecoin Foundation +- The Flow blockchain team +- The decentralized storage community +- The Eliza community for their contributions and feedback + +For more information about 0G capabilities: +- [0G Documentation](https://docs.0g.xyz/) +- [IPFS Documentation](https://docs.ipfs.tech/) +- [Filecoin Docs](https://docs.filecoin.io/) +- [Flow Documentation](https://developers.flow.com/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-0g/readme.md b/packages/plugin-0g/readme.md deleted file mode 100644 index cf24cc94ce..0000000000 --- a/packages/plugin-0g/readme.md +++ /dev/null @@ -1,127 +0,0 @@ -# @elizaos/plugin-0g - -A plugin for storing data using the 0G protocol within the ElizaOS ecosystem. - -## Description -The 0G plugin enables seamless integration with the Zero Gravity (0G) protocol for decentralized file storage. It provides functionality to upload files to the 0G network. - -## Installation - -```bash -pnpm install @elizaos/plugin-0g -``` - -## Configuration - -The plugin requires the following environment variables to be set: -```typescript -ZEROG_INDEXER_RPC=<0G indexer RPC endpoint> -ZEROG_EVM_RPC=<0G EVM RPC endpoint> -ZEROG_PRIVATE_KEY= -ZEROG_FLOW_ADDRESS=<0G Flow contract address> -``` - -## Usage - -### Basic Integration - -```typescript -import { zgPlugin } from '@ai16z/plugin-0g'; -``` - - -### File Upload Example - -```typescript -// The plugin automatically handles file uploads when triggered -// through natural language commands like: - -"Upload my document.pdf" -"Store this image.png on 0G" -"Save my resume.docx to Zero Gravity" -``` - - -## API Reference - -### Actions - -#### ZG_UPLOAD - -Uploads files to the 0G network. - -**Aliases:** -- UPLOAD_FILE_TO_ZG -- STORE_FILE_ON_ZG -- SAVE_FILE_TO_ZG -- UPLOAD_TO_ZERO_GRAVITY -- STORE_ON_ZERO_GRAVITY -- SHARE_FILE_ON_ZG -- PUBLISH_FILE_TO_ZG - -**Input Content:** -```typescript -interface UploadContent { -filePath: string; -} -``` - - -## Common Issues & Troubleshooting - -1. **File Access Errors** - - Ensure the file exists at the specified path - - Check file permissions - - Verify the path is absolute or relative to the execution context - -2. **Configuration Issues** - - Verify all required environment variables are set - - Ensure RPC endpoints are accessible - - Confirm private key has sufficient permissions - -## Security Best Practices - -1. **Environment Variables** - - Never commit private keys to version control - - Use secure environment variable management - - Rotate private keys periodically - - -## Development Guide - -### Setting Up Development Environment - -1. Clone the repository -2. Install dependencies: - -```bash -pnpm install -``` - -3. Build the plugin: - -```bash -pnpm run build -``` - -4. Run the plugin: - -```bash -pnpm run dev -``` - -## Future Enhancements - -- Model service deployment on 0G serving network -- 0G KV store for plugin state persistence -- Upload history and file metadata storage -- 0G as a database option for Eliza state storage -- Enhanced file path and context extraction - -## Contributing - -Contributions are welcome! Please see our contributing guidelines for more details. - -## License - -[License information needed] \ No newline at end of file diff --git a/packages/plugin-3d-generation/README.md b/packages/plugin-3d-generation/README.md new file mode 100644 index 0000000000..91f5c33899 --- /dev/null +++ b/packages/plugin-3d-generation/README.md @@ -0,0 +1,210 @@ +# @elizaos/plugin-3d-generation + +A plugin for generating 3D models using the FAL.ai API within the ElizaOS ecosystem. + +## Description +The 3D Generation plugin enables AI-powered creation of 3D models through FAL.ai's services. It provides functionality to generate 3D models from text descriptions and save them locally. + +## Installation + +```bash +pnpm install @elizaos/plugin-3d-generation +``` + +## Configuration + +The plugin requires the following environment variable or runtime setting to be set: +```typescript +FAL_API_KEY= +``` + +## Usage + +### Basic Integration + +```typescript +import { ThreeDGenerationPlugin } from '@elizaos/plugin-3d-generation'; +``` + +### Model Generation Examples + +```typescript +// The plugin responds to natural language commands like: + +"Generate a 3D object of a cat playing piano" +"Create a 3D object of an anime character Goku" +"Make a 3D model of [your description]" +``` + +## API Reference + +### Actions + +#### GENERATE_3D + +Generates 3D models based on text descriptions. + +**Aliases:** +- 3D_GENERATION +- 3D_GEN +- CREATE_3D +- MAKE_3D +- TEXT23D +- TEXT_TO_3D +- 3D_CREATE +- 3D_MAKE + +**Default Configuration:** +```typescript +{ + geometry_file_format: "glb", // Available: glb, usdz, fbx, obj, stl + material: "PBR", // Available: PBR, Shaded + quality: "medium", // Available: extra-low, low, medium, high + tier: "Regular" // Available: Regular, Sketch +} +``` + +## Common Issues & Troubleshooting + +1. **Generation Failures** + - Verify FAL API key is correctly set + - Ensure prompt is descriptive (minimum 3 characters) + - Check network connectivity to FAL.ai services + +2. **Storage Issues** + - Verify write permissions to content_cache directory + - Ensure sufficient disk space + - Check if content_cache directory exists + +## Security Best Practices + +1. **API Key Management** + - Store FAL API key securely using runtime settings or environment variables + - Never commit API keys to version control + - Monitor API usage + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run the plugin: + +```bash +pnpm run dev +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Advanced Generation Features** + - Multi-object scene generation + - Texture customization options + - Animation support + - Material property controls + - Advanced lighting systems + - Physics-based rendering + +2. **Model Optimization** + - Automatic mesh simplification + - LOD (Level of Detail) generation + - Texture compression + - File size optimization + - Performance profiling + - Mobile-friendly exports + +3. **Format Support** + - Additional file format exports + - Custom format converters + - Batch format conversion + - Format-specific optimizations + - Metadata preservation + - Version control integration + +4. **AI Improvements** + - Enhanced prompt understanding + - Style transfer capabilities + - Real-time generation + - Multi-model support + - Quality improvements + - Consistency controls + +5. **Scene Management** + - Scene composition tools + - Environment management + - Asset library integration + - Scene presets + - Batch processing + - Scene version control + +6. **Developer Tools** + - API expansion + - Testing framework + - Documentation generator + - Debug visualization + - Performance monitoring + - Integration templates + +7. **Rendering Features** + - Real-time preview + - Custom shader support + - Post-processing effects + - Render queue management + - Batch rendering + - Cloud rendering options + +8. **Collaboration Features** + - Asset sharing + - Version control + - Team workspace + - Review system + - Access control + - Change tracking + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [FAL.ai](https://fal.ai/): AI model deployment platform +- [Three.js](https://threejs.org/): 3D graphics library +- [glTF](https://www.khronos.org/gltf/): 3D file format standard +- [USD](https://graphics.pixar.com/usd/): Universal Scene Description +- [Blender](https://www.blender.org/): 3D creation suite + +Special thanks to: +- The FAL.ai team for AI infrastructure +- The Three.js development community +- The Khronos Group for glTF standards +- The Pixar USD team +- The Blender Foundation +- The Eliza community for their contributions and feedback + +For more information about 3D generation capabilities: +- [FAL.ai Documentation](https://fal.ai/docs) +- [Three.js Documentation](https://threejs.org/docs/) +- [glTF Specification](https://github.com/KhronosGroup/glTF) +- [USD Documentation](https://graphics.pixar.com/usd/docs/index.html) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-abstract/README.md b/packages/plugin-abstract/README.md new file mode 100644 index 0000000000..ba3adf4962 --- /dev/null +++ b/packages/plugin-abstract/README.md @@ -0,0 +1,201 @@ +# @elizaos/plugin-abstract + +A plugin for interacting with the Abstract blockchain network within the ElizaOS ecosystem. + +## Description +The Abstract plugin enables seamless token transfers on the Abstract testnet. It provides functionality to transfer both native ETH and ERC20 tokens using secure wallet operations. + +## Installation + +```bash +pnpm install @elizaos/plugin-abstract +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +ABSTRACT_ADDRESS= +ABSTRACT_PRIVATE_KEY= +``` + +## Usage + +### Basic Integration + +```typescript +import { abstractPlugin } from '@elizaos/plugin-abstract'; +``` + +### Transfer Examples + +```typescript +// The plugin responds to natural language commands like: + +"Send 100 USDC to 0xCCa8009f5e09F8C5dB63cb0031052F9CB635Af62" +"Transfer 0.1 ETH to 0xbD8679cf79137042214fA4239b02F4022208EE82" +"Pay 50 USDC on Abstract to [address]" +``` + +## API Reference + +### Actions + +#### SEND_TOKEN + +Transfers tokens from the agent's wallet to another address. + +**Aliases:** +- TRANSFER_TOKEN_ON_ABSTRACT +- TRANSFER_TOKENS_ON_ABSTRACT +- SEND_TOKENS_ON_ABSTRACT +- SEND_ETH_ON_ABSTRACT +- PAY_ON_ABSTRACT +- MOVE_TOKENS_ON_ABSTRACT +- MOVE_ETH_ON_ABSTRACT + +## Common Issues & Troubleshooting + +1. **Transaction Failures** + - Verify wallet has sufficient balance + - Check recipient address format + - Ensure private key is correctly set + - Verify network connectivity + +2. **Configuration Issues** + - Verify all required environment variables are set + - Ensure private key format is correct + - Check wallet address format + +## Security Best Practices + +1. **Private Key Management** + - Store private key securely using environment variables + - Never commit private keys to version control + - Use separate wallets for development and production + - Monitor wallet activity regularly + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run the plugin: + +```bash +pnpm run dev +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Smart Account Features** + - Multi-signature support + - Account recovery mechanisms + - Batch transaction processing + - Advanced permission management + - Account abstraction improvements + - Social recovery options + +2. **CosmWasm Integration** + - Contract deployment templates + - Smart contract verification tools + - Contract upgrade system + - Testing framework improvements + - Gas optimization tools + - Contract interaction templates + +3. **IBC Operations** + - Cross-chain transfer optimization + - IBC relayer monitoring + - Channel management tools + - Packet tracking system + - Timeout handling improvements + - Cross-chain messaging + +4. **DEX Integration** + - Advanced swap routing + - Liquidity pool management + - Yield farming automation + - Price impact analysis + - Slippage protection + - AMM optimization + +5. **Security Enhancements** + - Transaction simulation + - Risk assessment tools + - Rate limiting controls + - Fraud detection system + - Emergency shutdown features + - Audit integration tools + +6. **Developer Tools** + - Enhanced debugging capabilities + - Documentation generator + - CLI tool improvements + - Testing utilities + - Deployment automation + - Performance profiling + +7. **Analytics and Monitoring** + - Transaction tracking dashboard + - Network statistics + - Performance metrics + - Gas usage optimization + - Custom reporting tools + - Real-time monitoring + +8. **Wallet Management** + - Multiple wallet support + - Hardware wallet integration + - Address book features + - Transaction history analysis + - Balance monitoring + - Token management tools + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Abstract](https://abstract.money/): Smart account infrastructure +- [CosmWasm](https://cosmwasm.com/): Smart contract platform +- [Cosmos SDK](https://v1.cosmos.network/sdk): Blockchain application framework +- [IBC Protocol](https://ibcprotocol.org/): Inter-blockchain communication +- [Osmosis](https://osmosis.zone/): DEX infrastructure + +Special thanks to: +- The Abstract development team +- The CosmWasm core developers +- The Cosmos SDK maintainers +- The IBC Protocol team +- The Osmosis DEX team +- The Eliza community for their contributions and feedback + +For more information about Abstract capabilities: +- [Abstract Documentation](https://docs.abstract.money/) +- [CosmWasm Documentation](https://docs.cosmwasm.com/) +- [Cosmos SDK Docs](https://docs.cosmos.network/) +- [IBC Protocol Docs](https://ibc.cosmos.network/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-aptos/README.md b/packages/plugin-aptos/README.md new file mode 100644 index 0000000000..d6a10fa986 --- /dev/null +++ b/packages/plugin-aptos/README.md @@ -0,0 +1,231 @@ +# @elizaos/plugin-aptos + +A plugin for interacting with the Aptos blockchain network within the ElizaOS ecosystem. + +## Description +The Aptos plugin enables seamless token transfers and wallet management on the Aptos blockchain. It provides functionality to transfer APT tokens and monitor wallet balances with real-time price tracking. + +## Installation + +```bash +pnpm install @elizaos/plugin-aptos +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +APTOS_PRIVATE_KEY= +APTOS_NETWORK=<"mainnet" | "testnet"> +``` + +## Usage + +### Basic Integration + +```typescript +import { aptosPlugin, WalletProvider, TransferAptosToken } from '@elizaos/plugin-aptos'; +``` + +### Transfer Examples + +```typescript +// The plugin responds to natural language commands like: + +"Send 69 APT tokens to 0x4f2e63be8e7fe287836e29cde6f3d5cbc96eefd0c0e3f3747668faa2ae7324b0" +"Transfer APT to [address]" +"Pay [amount] APT to [recipient]" +``` + +## API Reference + +### Actions + +#### SEND_TOKEN + +Transfers APT tokens from the agent's wallet to another address. + +**Aliases:** +- TRANSFER_TOKEN +- TRANSFER_TOKENS +- SEND_TOKENS +- SEND_APT +- PAY + +**Configuration:** +```typescript +{ + APT_DECIMALS: 8 // Decimal places for APT token +} +``` + +### Providers + +#### WalletProvider + +Provides wallet information and portfolio tracking. + +**Features:** +- Real-time APT price tracking +- Portfolio value calculation +- Cached wallet information (5-minute TTL) +- Formatted portfolio reports + +## Common Issues & Troubleshooting + +1. **Transaction Failures** + - Verify wallet has sufficient APT balance + - Check recipient address format + - Ensure private key is correctly set + - Verify network connectivity + +2. **Price Fetching Issues** + - Check connection to DexScreener API + - Verify cache functionality + - Monitor retry mechanism (3 attempts with exponential backoff) + +## Security Best Practices + +1. **Private Key Management** + - Store private key securely using environment variables + - Never commit private keys to version control + - Use separate wallets for development and production + - Monitor wallet activity regularly + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run tests: + +```bash +pnpm run test +``` + +5. Development mode: + +```bash +pnpm run dev +``` + +## Dependencies + +- @aptos-labs/ts-sdk: ^1.26.0 +- bignumber.js: 9.1.2 +- node-cache: 5.1.2 + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Advanced Token Operations** + - Batch token transfers + - Token creation templates + - NFT minting and management + - Token metadata management + - Custom tokenomics implementation + - Token upgrade mechanisms + +2. **DeFi Integration** + - Liquidity pool management + - Yield farming automation + - Staking optimization + - AMM integration + - Cross-chain bridges + - Price impact analysis + +3. **Move Contract Management** + - Contract deployment tools + - Contract verification + - Contract upgrade system + - Testing framework + - Gas optimization tools + - Security audit integration + +4. **Wallet Enhancements** + - Multi-wallet support + - Hardware wallet integration + - Transaction batching + - Address book management + - Custom signature schemes + - Account abstraction + +5. **Price Feed Improvements** + - Additional data sources + - Real-time price alerts + - Historical data analysis + - Custom price aggregation + - Price prediction tools + - Market sentiment analysis + +6. **Developer Tools** + - Enhanced debugging capabilities + - Move language IDE integration + - Documentation generator + - Performance profiling + - Testing utilities + - Deployment automation + +7. **Security Features** + - Transaction simulation + - Risk assessment tools + - Rate limiting controls + - Fraud detection + - Emergency shutdown + - Multi-signature support + +8. **Analytics and Monitoring** + - Transaction tracking + - Portfolio analytics + - Network statistics + - Gas usage optimization + - Performance metrics + - Custom reporting tools + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Aptos](https://aptoslabs.com/): Layer 1 blockchain platform +- [@aptos-labs/ts-sdk](https://github.com/aptos-labs/aptos-core/tree/main/ecosystem/typescript/sdk): Official TypeScript SDK +- [Petra Wallet](https://petra.app/): Aptos wallet integration +- [DexScreener](https://dexscreener.com/): Price feed integration +- [Move Language](https://github.com/move-language/move): Smart contract language + +Special thanks to: +- The Aptos Labs team for developing the blockchain +- The Petra Wallet development team +- The DexScreener team for price data +- The Move language developers +- The Aptos Developer community +- The Eliza community for their contributions and feedback + +For more information about Aptos capabilities: +- [Aptos Documentation](https://aptos.dev/) +- [Move Language Guide](https://move-language.github.io/move/) +- [Petra Wallet Docs](https://petra.app/docs) +- [DexScreener API](https://docs.dexscreener.com/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-avalanche/README.md b/packages/plugin-avalanche/README.md new file mode 100644 index 0000000000..6259c88e64 --- /dev/null +++ b/packages/plugin-avalanche/README.md @@ -0,0 +1,229 @@ +# @elizaos/plugin-avalanche + +A plugin for interacting with the Avalanche blockchain network within the ElizaOS ecosystem. + +## Description +The Avalanche plugin enables comprehensive DeFi operations on the Avalanche network, including token transfers, YAK swaps, yield strategy management, and token creation via Token Mill. + +## Installation + +```bash +pnpm install @elizaos/plugin-avalanche +``` + +## Configuration + +The plugin requires the following environment variable: +```typescript +AVALANCHE_PRIVATE_KEY= +``` + +## Features + +### 1. Token Transfers +- Send native AVAX and ERC20 tokens +- Support for multiple token standards +- Built-in address validation + +### 2. YAK Swaps +- Decentralized token swaps +- Automatic best path finding +- Slippage protection (default: 0.2%) +- Support for all major tokens + +### 3. Yield Strategies +- Deposit tokens into yield-generating strategies +- Support for multiple strategies including: + - YAK staking + - USDC Benqi + - gmYAK Token Mill + - PRINCESS staking + - JOE staking + +### 4. Token Mill +- Create new tokens +- Configure custom tokenomics +- Automatic market creation + +## Supported Tokens + +```typescript +const TOKENS = { + AVAX: "0x0000000000000000000000000000000000000000", + WAVAX: "0xB31f66AA3C1e785363F0875A1B74E27b85FD66c7", + YAK: "0x59414b3089ce2AF0010e7523Dea7E2b35d776ec7", + gmYAK: "0x3A30784c1af928CdFce678eE49370220aA716DC3", + USDC: "0xB97EF9Ef8734C71904D8002F8b6Bc66Dd9c48a6E", + // ... and more +} +``` + +## Usage Examples + +### Token Transfer +```typescript +// Send AVAX +"Send 10 AVAX to 0x049d36570d4e46f48e99674bd3fcc84644ddd6b96f7c741b1562b82f9e004dc7" + +// Send ERC20 +"Transfer 100 USDC to [address]" +``` + +### YAK Swap +```typescript +// Swap tokens +"Swap 1 AVAX for USDC" +"Swap 10 USDC for gmYAK" +``` + +### Yield Strategy +```typescript +// Deposit into strategies +"Deposit 1 USDC into the strategy" +"Deposit 10 gmYAK to earn yield" +``` + +### Token Creation +```typescript +// Create new token +"Create a new memecoin called 'Test Token' with the symbol 'TEST'" +``` + +## Providers + +### 1. Wallet Provider +- Displays wallet balances +- Shows tokens in yield strategies +- Real-time balance updates + +### 2. Strategies Provider +- Lists available yield strategies +- Shows deposit token requirements + +### 3. Tokens Provider +- Lists supported tokens +- Shows token addresses + +## Development + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run linting: +```bash +pnpm run lint +``` + +## Dependencies +- viem: ^2.21.49 +- @elizaos/core: workspace:* + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Advanced DeFi Operations** + - Multi-hop yield strategies + - Auto-compounding features + - Yield optimization algorithms + - Risk assessment tools + - Portfolio rebalancing automation + - Cross-chain yield farming + +2. **Enhanced Token Management** + - Batch token operations + - Advanced token creation templates + - Token migration tools + - Automated token listing + - Token analytics dashboard + - Custom tokenomics implementation + +3. **YAK Protocol Integration** + - Advanced routing algorithms + - MEV protection features + - Gas optimization strategies + - Liquidity analysis tools + - Price impact predictions + - Custom trading strategies + +4. **Benqi Protocol Features** + - Collateral optimization + - Liquidation protection + - Interest rate monitoring + - Position management tools + - Risk assessment dashboard + - Auto-repayment features + +5. **Token Mill Improvements** + - Advanced token customization + - Automated market making + - Token distribution tools + - Vesting schedule management + - Governance token features + - Token upgrade mechanisms + +6. **Security Enhancements** + - Transaction simulation + - Smart contract auditing tools + - Real-time monitoring + - Automated safety checks + - Emergency shutdown features + - Multi-signature support + +7. **Developer Tools** + - Enhanced debugging capabilities + - Testing framework improvements + - Documentation generator + - CLI tools for common operations + - Integration templates + - Performance monitoring + +8. **Analytics and Reporting** + - Portfolio tracking + - Performance metrics + - Gas usage optimization + - Transaction history analysis + - Yield comparison tools + - Risk assessment reports + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Avalanche](https://www.avax.network/): High-performance blockchain platform +- [avalanchejs](https://github.com/ava-labs/avalanchejs): Official Avalanche JavaScript library +- [YAK Protocol](https://yak.exchange/): Decentralized exchange aggregator +- [Benqi](https://benqi.fi/): Lending and borrowing protocol +- [Token Mill](https://tokenmill.xyz/): Token creation platform + +Special thanks to: +- The Ava Labs team for developing Avalanche +- The YAK Protocol development team +- The Benqi protocol developers +- The Token Mill platform team +- The Avalanche Developer community +- The Eliza community for their contributions and feedback + +For more information about Avalanche capabilities: +- [Avalanche Documentation](https://docs.avax.network/) +- [YAK Protocol Docs](https://yak.exchange/docs) +- [Benqi Documentation](https://docs.benqi.fi/) +- [Token Mill Guide](https://docs.tokenmill.xyz/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-bootstrap/README.md b/packages/plugin-bootstrap/README.md new file mode 100644 index 0000000000..d44412572f --- /dev/null +++ b/packages/plugin-bootstrap/README.md @@ -0,0 +1,162 @@ +# @elizaos/plugin-bootstrap + +A plugin providing core functionality and basic actions for ElizaOS agents. + +## Description +The Bootstrap plugin enables fundamental agent behaviors including conversation management, room interactions, and fact tracking. It provides essential actions and evaluators that form the foundation of agent interactions. + +## Installation + +```bash +pnpm install @elizaos/plugin-bootstrap +``` + +## Features + +### 1. Conversation Management +- NONE action for basic responses +- CONTINUE action for follow-ups +- IGNORE action for appropriate disengagement +- Built-in conversation flow control + +### 2. Room Control +- Follow/Unfollow room functionality +- Mute/Unmute capabilities +- Automatic engagement level tracking +- Smart participation management + +### 3. Fact Management +- Automatic fact extraction +- Categorization of claims +- Deduplication of known information +- Support for multiple fact types: + - Permanent facts + - Status updates + - Opinions + - Biographical information + +### 4. Goal Tracking +- Track objective progress +- Update goal statuses +- Monitor completion states +- Automatic progress evaluation + +## Providers + +### 1. Boredom Provider +- Tracks engagement levels +- Provides status messages +- Monitors conversation quality +- Adjusts participation accordingly + +### 2. Facts Provider +- Manages fact database +- Retrieves relevant information +- Formats fact summaries +- Maintains fact context + +### 3. Time Provider +- Provides UTC timestamps +- Human-readable formatting +- Time-based operation support + +## Development + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run linting: +```bash +pnpm run lint +``` + +## Dependencies +- @elizaos/core: workspace:* + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Enhanced Conversation Management** + - Advanced context tracking + - Multi-thread conversation support + - Conversation state persistence + - Improved conversation flow control + - Natural language understanding improvements + +2. **Advanced Room Control** + - Dynamic room creation and management + - Room permission system + - Advanced moderation tools + - Room analytics and insights + - Cross-room communication features + +3. **Expanded Fact Management** + - Enhanced fact verification system + - Fact relationship mapping + - Automated fact updating + - Fact confidence scoring + - Cross-reference system + - Fact expiration management + +4. **Goal System Improvements** + - Multi-step goal planning + - Goal dependency tracking + - Progress visualization + - Goal priority management + - Automated milestone tracking + - Goal optimization suggestions + +5. **Provider Enhancements** + - Improved boredom detection + - Advanced engagement metrics + - Enhanced fact retrieval algorithms + - Real-time status updates + - Provider performance analytics + +6. **Memory Management** + - Enhanced memory prioritization + - Memory compression techniques + - Long-term memory storage + - Memory relationship mapping + - Context-aware recall + +7. **Developer Tools** + - Enhanced debugging capabilities + - Testing framework improvements + - Plugin development templates + - Documentation generator + - Performance profiling tools + +8. **Integration Features** + - Enhanced plugin interoperability + - External service connectors + - API gateway integration + - Webhook system improvements + - Third-party platform support + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +Special thanks to: +- The Eliza Core development team +- The Eliza community for their contributions and feedback + + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-coinbase/README.md b/packages/plugin-coinbase/README.md new file mode 100644 index 0000000000..78ac8cb487 --- /dev/null +++ b/packages/plugin-coinbase/README.md @@ -0,0 +1,198 @@ +# @elizaos/plugin-coinbase + +A comprehensive Coinbase integration plugin for ElizaOS that provides access to Coinbase's various APIs and services. + +## Features + +- **Commerce Integration**: Create and manage payment charges using Coinbase Commerce +- **Trading**: Execute trades and swaps between different assets +- **Token Contract Management**: Deploy and interact with ERC20, ERC721, and ERC1155 smart contracts +- **Mass Payments**: Process bulk transfers and payments to multiple addresses +- **Advanced Trading**: Access to Coinbase Advanced Trading API features +- **Webhook Management**: Create and manage webhooks for various blockchain events + +## Installation + +```bash +npm install @elizaos/plugin-coinbase +``` + +## Configuration + +The plugin requires several environment variables to be set: + +```env +COINBASE_API_KEY=your_api_key +COINBASE_PRIVATE_KEY=your_private_key +COINBASE_COMMERCE_KEY=your_commerce_key +COINBASE_NOTIFICATION_URI=your_webhook_notification_uri +``` + +## Usage + +```typescript +import { plugins } from '@elizaos/plugin-coinbase'; + +// Register all plugins +const { + coinbaseMassPaymentsPlugin, + coinbaseCommercePlugin, + tradePlugin, + tokenContractPlugin, + webhookPlugin, + advancedTradePlugin +} = plugins; + +// Register individual plugins as needed +runtime.registerPlugin(coinbaseCommercePlugin); +runtime.registerPlugin(tradePlugin); +// etc... +``` + +## Available Plugins + +### Commerce Plugin +- Create charges with fixed or dynamic pricing +- Support for multiple currencies (USD, EUR, USDC) +- Charge status tracking and management + +### Trade Plugin +- Execute basic trades between assets +- Support for market and limit orders +- Transaction logging and tracking + +### Token Contract Plugin +- Deploy ERC20, ERC721, and ERC1155 contracts +- Interact with deployed contracts +- Read contract data and balances + +### Mass Payments Plugin +- Process bulk transfers to multiple addresses +- Support for various assets and networks +- Transaction logging and CSV export + +### Advanced Trade Plugin +- Access to advanced trading features +- Support for complex order types +- Detailed trade history and tracking + +### Webhook Plugin +- Create and manage blockchain event webhooks +- Support for various event types and filters +- Webhook status tracking and logging + +## Supported Networks + +- Base (Mainnet & Sepolia) +- Ethereum (Mainnet & Holesky) +- Polygon Mainnet +- Solana (Mainnet & Devnet) +- Arbitrum Mainnet +- And more... + +## CSV Logging + +The plugin automatically logs various operations to CSV files: +- `trades.csv`: Trading operations +- `transactions.csv`: Mass payment transactions +- `webhooks.csv`: Webhook configurations +- `advanced_trades.csv`: Advanced trading operations + +## Dependencies + +- `@elizaos/core`: Core ElizaOS functionality +- `coinbase-api`: Coinbase API integration +- `coinbase-advanced-sdk`: Coinbase Advanced Trading SDK +- Additional type definitions and utilities + +## Future Enhancements + +1. **Advanced Trading Features** + - Real-time market data streaming + - Advanced order types (OCO, trailing stop) + - Portfolio rebalancing automation + - Custom trading strategies implementation + - Multi-exchange arbitrage support + +2. **Enhanced Commerce Integration** + - Subscription payment handling + - Multi-currency checkout optimization + - Advanced refund management + - Custom payment flow templates + - Automated invoice generation + +3. **Improved Token Management** + - Batch token operations + - Gas optimization for token contracts + - Token metadata management system + - Automated token listing process + - Smart contract deployment templates + +4. **Security Enhancements** + - Advanced API key management + - Multi-signature support + - Transaction monitoring system + - Risk assessment tools + - Rate limiting improvements + +5. **Analytics and Reporting** + - Custom report generation + - Trading performance analytics + - Payment flow analytics + - Real-time monitoring dashboard + - Historical data analysis tools + +6. **Webhook Management** + - Enhanced event filtering + - Retry mechanism improvements + - Webhook monitoring dashboard + - Custom webhook templates + - Event batching support + +7. **Developer Tools** + - SDK expansion + - Testing environment improvements + - Documentation generator + - CLI tools for common operations + - Integration templates + +8. **Cross-Platform Integration** + - Mobile SDK support + - Browser extension support + - Desktop application integration + - IoT device support + - Cross-chain bridging capabilities + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Coinbase](https://www.coinbase.com/): Digital currency exchange platform +- [Coinbase Commerce](https://commerce.coinbase.com/): Cryptocurrency payment solution +- [Coinbase Cloud](https://www.coinbase.com/cloud): Blockchain infrastructure +- [Coinbase Advanced Trade API](https://docs.cloud.coinbase.com/advanced-trade-api/): Trading interface +- [Coinbase Prime](https://prime.coinbase.com/): Institutional trading platform + +Special thanks to: +- The Coinbase development team +- The Coinbase Commerce team +- The Coinbase Cloud infrastructure team +- The Advanced Trade API maintainers +- The Eliza community for their contributions and feedback + +For more information about Coinbase capabilities: +- [Coinbase API Documentation](https://docs.cloud.coinbase.com/) +- [Commerce API Reference](https://docs.cloud.coinbase.com/commerce/reference/) +- [Advanced Trade Documentation](https://docs.cloud.coinbase.com/advanced-trade-api/) +- [Coinbase Prime Documentation](https://docs.prime.coinbase.com/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-conflux/README.md b/packages/plugin-conflux/README.md index bb71cf1174..04f5b10fb4 100644 --- a/packages/plugin-conflux/README.md +++ b/packages/plugin-conflux/README.md @@ -1,25 +1,219 @@ # @elizaos/plugin-conflux -This plugin provides actions and providers for interacting with the [Conflux network](https://www.confluxdocs.com/docs/general). +A plugin for interacting with the Conflux blockchain network within the ElizaOS ecosystem. -## Actions +## Description -### ConfiPump +The Conflux plugin enables seamless interaction with both Conflux Core Space and eSpace networks. It provides functionality for token transfers, cross-space bridge operations, and ConfiPump token management (creation, buying, and selling). -Buy and sell tokens on Conflux's implementation of pump.fun (ConfiPump). +## Installation -### Transfer +```bash +pnpm install @elizaos/plugin-conflux +``` -Transfer tokens from one address to another within Conflux core space. +## Configuration -### Bridge Transfer +The plugin requires the following environment variables to be set: +```typescript +CONFLUX_CORE_PRIVATE_KEY= +CONFLUX_CORE_SPACE_RPC_URL= +CONFLUX_MEME_CONTRACT_ADDRESS= +``` -Transfer tokens from one address to Conflux eSpace. +## Usage -### Sponsor (TBD) +### Basic Integration -Provide gas for Conflux core space contracts so they can be called without the need to have Conflux in user's wallet. +```typescript +import { confluxPlugin } from '@elizaos/plugin-conflux'; +``` -### Swap (TBD) +### Example Usage + +```typescript +// Core Space Transfer +"Send 1 CFX to cfx:aaejuaaaaaaaaaaaaaaaaaaaaaaaaaaaa2eaeg85p5" + +// Cross-Space Bridge Transfer +"Send 1 CFX to eSpace Address 0x119DA8bbe74B1C5c987D0c64D10eC1dB301d4752" + +// ConfiPump Token Creation +"Create a new token called GLITCHIZA with symbol GLITCHIZA and generate a description about it" + +// ConfiPump Token Trading +"Buy 0.00069 CFX worth of GLITCHIZA(0x1234567890abcdef)" +"Sell 0.00069 CFX worth of GLITCHIZA(0x1234567890abcdef)" +``` + +## API Reference + +### Actions + +#### SEND_CFX +Transfers CFX tokens within Conflux Core Space. + +**Aliases:** +- SEND_CONFLUX +- SEND_CFX_CORE_SPACE +- TRANSFER_CFX + +**Input Content:** +```typescript +interface TransferContent { + to: string; // Conflux Core Space address (cfx: prefix) + amount: string; // Amount of CFX to send +} +``` + +#### BRIDGE_SEND_CFX +Transfers CFX tokens from Core Space to eSpace. + +**Aliases:** +- BRIDGE_SEND_CONFLUX +- CROSS_SPACE_SEND_CFX +- BRIDGE_TRANSFER_CFX +- CROSS_SPACE_TRANSFER_CFX + +**Input Content:** +```typescript +interface TransferContent { + to: string; // Conflux eSpace address (0x prefix) + amount: string; // Amount of CFX to send +} +``` + +#### CONFI_PUMP +Manages ConfiPump token operations. + +**Aliases:** +- SELL_TOKEN +- BUY_TOKEN +- CREATE_TOKEN + +**Input Content:** +```typescript +interface PumpContent { + action: "CREATE_TOKEN" | "BUY_TOKEN" | "SELL_TOKEN"; + params: { + name?: string; + symbol?: string; + description?: string; + tokenAddress?: string; + value?: string; + }; +} +``` + +## Common Issues & Troubleshooting + +1. **Transaction Failures** + - Ensure sufficient CFX balance for transactions + - Verify correct address format (cfx: for Core Space, 0x for eSpace) + - Check RPC endpoint connectivity + +## Security Best Practices + +1. **Private Key Management** + - Store private keys securely using environment variables + - Never expose private keys in code or logs + - Use separate accounts for development and production + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run the plugin: +```bash +pnpm run dev +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Advanced Token Management** + - Batch token transfers + - Token allowance management + - Advanced meme token features + - Token metadata management + +2. **Enhanced Bridge Operations** + - Multi-token bridge support + - Automated bridge fee optimization + - Bridge transaction status tracking + - Cross-space batch operations + +3. **Smart Contract Integration** + - Contract deployment tools + - Contract interaction templates + - ABI management system + - Contract verification tools + +4. **Performance Optimizations** + - Transaction batching + - Improved caching mechanisms + - Gas optimization strategies + - Network request optimization + +5. **Developer Tools** + - CLI tools for common operations + - Development environment templates + - Testing utilities + - Documentation generator + +6. **Security Features** + - Transaction simulation + - Risk assessment tools + - Address validation improvements + - Rate limiting controls + +7. **Monitoring and Analytics** + - Transaction tracking dashboard + - Performance metrics + - Error reporting system + - Usage analytics + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Conflux Network](https://confluxnetwork.org/): Hybrid consensus blockchain +- [js-conflux-sdk](https://www.npmjs.com/package/js-conflux-sdk): Official Conflux JavaScript SDK +- [ConfiPump](https://confipump.io/): Meme token creation platform +- [@conflux-dev/conflux-address-js](https://www.npmjs.com/package/@conflux-dev/conflux-address-js): Address utilities + +Special thanks to: +- The Conflux Foundation for developing the network +- The Conflux Developer community +- The ConfiPump team for meme token infrastructure +- The js-conflux-sdk maintainers +- The Eliza community for their contributions and feedback + +For more information about Conflux capabilities: +- [Conflux Documentation](https://developer.confluxnetwork.org/) +- [Conflux Portal](https://portal.confluxnetwork.org/) +- [ConfluxScan](https://confluxscan.io/) +- [Cross-Space Bridge](https://bridge.confluxnetwork.org/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. -Swap tokens on Conflux DEXs. diff --git a/packages/plugin-cronoszkevm/README.md b/packages/plugin-cronoszkevm/README.md new file mode 100644 index 0000000000..a662890d81 --- /dev/null +++ b/packages/plugin-cronoszkevm/README.md @@ -0,0 +1,150 @@ +# @elizaos/plugin-cronoszkevm + +A plugin for interacting with the Cronos zkEVM network within the ElizaOS ecosystem. + +## Description + +The Cronos zkEVM plugin enables seamless token transfers on the Cronos zkEVM network. It provides functionality for transferring various tokens including ZKCRO, USDC, and ETH using Web3 and zkSync integration. + +## Installation + +```bash +pnpm install @elizaos/plugin-cronoszkevm +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +CRONOSZKEVM_ADDRESS= +CRONOSZKEVM_PRIVATE_KEY= +``` + +## Usage + +### Basic Integration + +```typescript +import { cronosZkEVMPlugin } from '@elizaos/plugin-cronoszkevm'; +``` + +### Example Usage + +```typescript +// Send USDC tokens +"Send 100 USDC to 0xCCa8009f5e09F8C5dB63cb0031052F9CB635Af62" + +// Send ZKCRO tokens +"Send 100 ZKCRO to 0xbD8679cf79137042214fA4239b02F4022208EE82" + +// Send ETH tokens +"Transfer 1 ETH to 0x123..." +``` + +## API Reference + +### Actions + +#### SEND_TOKEN +Transfers tokens on the Cronos zkEVM network. + +**Aliases:** +- TRANSFER_TOKEN_ON_CRONOSZKEVM +- TRANSFER_TOKENS_ON_CRONOSZK +- SEND_TOKENS_ON_CRONOSZKEVM +- SEND_TOKENS_ON_CRONOSZK +- SEND_ETH_ON_CRONOSZKEVM +- SEND_ETH_ON_CRONOSZK +- PAY_ON_CRONOSZKEVM +- PAY_ON_CRONOSZK + +**Input Content:** +```typescript +interface TransferContent { + tokenAddress: string; // The token contract address + recipient: string; // The recipient's address + amount: string | number; // Amount to transfer +} +``` + +## Common Issues & Troubleshooting + +1. **Transaction Failures** + - Ensure sufficient token balance for transfers + - Verify correct recipient address format (must start with 0x) + - Check network connectivity to Cronos zkEVM RPC endpoint + +2. **Configuration Issues** + - Verify CRONOSZKEVM_ADDRESS is properly set + - Ensure CRONOSZKEVM_PRIVATE_KEY is valid and secure + - Confirm RPC endpoint is accessible + +## Security Best Practices + +1. **Private Key Management** + - Store private keys securely using environment variables + - Never expose private keys in code or logs + - Use separate accounts for development and production + +2. **Transaction Validation** + - Always validate addresses before sending transactions + - Verify token amounts and decimals + - Implement proper error handling + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run the plugin: +```bash +pnpm run dev +``` + +## Common Token Addresses + +- ZKCRO/zkCRO: `0x000000000000000000000000000000000000800A` +- USDC/usdc: `0xaa5b845f8c9c047779bedf64829601d8b264076c` +- ETH/eth: `0x898b3560affd6d955b1574d87ee09e46669c60ea` + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Cronos zkEVM](https://cronos.org/zkevm): Layer 2 scaling solution for Cronos +- [Web3.js](https://web3js.org/): Ethereum JavaScript API +- [zkSync](https://zksync.io/): Zero-knowledge rollup technology +- [Ethers.js](https://docs.ethers.org/): Complete Ethereum library +- [Viem](https://viem.sh/): Modern TypeScript Ethereum library + +Special thanks to: +- The Cronos team for developing zkEVM +- The Matter Labs team for zkSync technology +- The Web3.js and Ethers.js maintainers +- The Viem development team +- The Eliza community for their contributions and feedback + +For more information about Cronos zkEVM capabilities: +- [Cronos zkEVM Documentation](https://docs.cronos.org/zkevm/) +- [zkEVM Bridge](https://zkevm.cronos.org/bridge) +- [Cronos Developer Portal](https://cronos.org/developers) +- [zkSync Integration Guide](https://docs.cronos.org/zkevm/integration) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-echochambers/README.md b/packages/plugin-echochambers/README.md index 6e515088ac..5b8e0f2715 100644 --- a/packages/plugin-echochambers/README.md +++ b/packages/plugin-echochambers/README.md @@ -1,4 +1,4 @@ -# EchoChambers Plugin for ELIZA +# @elizaos/plugin-echochambers The EchoChambers plugin enables ELIZA to interact in chat rooms, providing conversational capabilities with dynamic interaction handling. @@ -8,59 +8,181 @@ The EchoChambers plugin enables ELIZA to interact in chat rooms, providing conve - Respond to messages based on context and relevance - Retry operations with exponential backoff - Manage connection and reconnection logic +- Real-time chat room monitoring and interaction +- Intelligent message response generation +- Context-aware conversation handling +- Comprehensive message history tracking +- Multi-room support with configurable polling ## Installation 1. Install the plugin package: - - @elizaos/plugin-echochambers - OR copy the plugin code into your eliza project node_modules directory. (node_modules\@elizaos) +```bash +pnpm install @elizaos/plugin-echochambers +``` +OR copy the plugin code into your eliza project node_modules directory. (node_modules\@elizaos) 2. Import and register the plugin in your `character.ts` configuration: - ```typescript - import { Character, ModelProviderName, defaultCharacter } from "@elizaos/core"; - import { echoChamberPlugin } from "@elizaos/plugin-echochambers"; - - export const character: Character = { - ...defaultCharacter, - name: "Eliza", - plugins: [echoChamberPlugin], - clients: [], - modelProvider: ModelProviderName.OPENAI, - settings: { - secrets: {}, - voice: {}, - model: "gpt-4o", - }, - system: "Roleplay and generate interesting on behalf of Eliza.", - bio: [...], - lore: [...], - messageExamples: [...], - postExamples: [...], - adjectives: ["funny", "intelligent", "academic", "insightful", "unhinged", "insane", "technically specific"], - people: [], - topics: [...], - style: {...}, - }; - ``` +```typescript +import { Character, ModelProviderName, defaultCharacter } from "@elizaos/core"; +import { echoChamberPlugin } from "@elizaos/plugin-echochambers"; + +export const character: Character = { + ...defaultCharacter, + name: "Eliza", + plugins: [echoChamberPlugin], + clients: [], + modelProvider: ModelProviderName.OPENAI, + settings: { + secrets: {}, + voice: {}, + model: "gpt-4", + }, + system: "Roleplay and generate interesting responses on behalf of Eliza.", + bio: [...], + lore: [...], + messageExamples: [...], + postExamples: [...], + adjectives: ["funny", "intelligent", "academic", "insightful"], + people: [], + topics: [...], + style: {...}, +}; +``` ## Configuration -Add the following environment variables to your `.env` file: +The plugin requires the following environment variables: ```plaintext -# EchoChambers Configuration -ECHOCHAMBERS_API_URL="http://127.0.0.1:3333" # Replace with actual API URL -ECHOCHAMBERS_API_KEY="testingkey0011" # Replace with actual API key -ECHOCHAMBERS_USERNAME="eliza" # Optional: Custom username for the agent -ECHOCHAMBERS_DEFAULT_ROOM="general" # Optional: Default room to join -ECHOCHAMBERS_POLL_INTERVAL="60" # Optional: Polling interval in seconds -ECHOCHAMBERS_MAX_MESSAGES="10" # Optional: Maximum number of messages to fetch +# Required Settings +ECHOCHAMBERS_API_URL="http://127.0.0.1:3333" # Base URL for the EchoChambers API +ECHOCHAMBERS_API_KEY="your-api-key" # API key for authentication + +# Optional Settings +ECHOCHAMBERS_USERNAME="eliza" # Custom username for the agent +ECHOCHAMBERS_DEFAULT_ROOM="general" # Default room to join +ECHOCHAMBERS_POLL_INTERVAL="60" # Polling interval in seconds +ECHOCHAMBERS_MAX_MESSAGES="10" # Maximum messages in conversation thread ``` ## Usage Instructions ### Starting the Plugin -To start using the EchoChambers plugin, ensure that your character configuration includes it as shown above. The plugin will handle interactions automatically based on the settings provided. +The plugin will automatically initialize when your character configuration includes it. It handles: + +1. Room Connection Management + - Automatic joining of default room + - Reconnection handling with backoff + - Multi-room monitoring + +2. Message Processing + - Context-aware response generation + - Thread management + - History tracking + +3. Response Behavior + The plugin intelligently decides when to respond based on: + - Direct mentions or questions + - Topic relevance to agent's expertise + - Conversation context and timing + - Message substance and engagement level + +## Common Issues & Troubleshooting + +1. **Connection Issues** + - Verify API URL is correct and accessible + - Ensure API key is valid + - Check network connectivity + +2. **Message Processing** + - Verify environment variables are properly set + - Check log files for error messages + - Ensure proper character configuration + +## Security Best Practices + +1. **API Key Management** + - Store API keys securely using environment variables + - Never expose keys in code or logs + - Rotate keys periodically + +2. **Connection Security** + - Use HTTPS for production environments + - Implement proper error handling + - Monitor for unusual activity + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run in development mode: +```bash +pnpm run dev +``` + +## API Reference + +### Core Components + +1. **EchoChamberClient** + - Handles room connections + - Manages message sending/receiving + - Implements retry logic + +2. **InteractionClient** + - Processes messages + - Generates responses + - Maintains conversation context + +## Future Enhancements + +- Enhanced message filtering +- Custom response templates +- Advanced room management features +- Improved context handling +- Extended retry mechanisms + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Socket.IO](https://socket.io/): Real-time bidirectional event-based communication +- [Express](https://expressjs.com/): Web application framework +- [Redis](https://redis.io/): In-memory data structure store +- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for message handling +- [node-cache](https://www.npmjs.com/package/node-cache): In-memory caching + +Special thanks to: +- The Socket.IO team for real-time communication infrastructure +- The Express.js maintainers +- The Redis development team +- The chat room infrastructure maintainers +- The Eliza community for their contributions and feedback + +For more information about chat capabilities: +- [Socket.IO Documentation](https://socket.io/docs/v4/) +- [Express Documentation](https://expressjs.com/en/4x/api.html) +- [Redis Pub/Sub](https://redis.io/docs/manual/pubsub/) +- [Real-time Chat Best Practices](https://socket.io/docs/v4/rooms/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-evm/README.md b/packages/plugin-evm/README.md index dc7c695e5a..7e3dda7a04 100644 --- a/packages/plugin-evm/README.md +++ b/packages/plugin-evm/README.md @@ -1,22 +1,44 @@ -# `@elizaos/plugin-evm` +# @elizaos/plugin-evm This plugin provides actions and providers for interacting with EVM-compatible chains. ---- +## Description -## Configuration +The EVM plugin provides comprehensive functionality for interacting with EVM-compatible chains, including token transfers, cross-chain bridging, and token swaps using LiFi integration. + +## Features + +- Multi-chain support with dynamic chain configuration +- Native token transfers +- Cross-chain token bridging via LiFi +- Token swapping on supported DEXs +- Wallet balance tracking +- Custom RPC endpoint configuration +- Automatic retry mechanisms +- Comprehensive transaction management -### Default Setup +## Installation -By default, **Ethereum mainnet** is enabled. To use it, simply add your private key to the `.env` file: +```bash +pnpm install @elizaos/plugin-evm +``` + +## Configuration + +### Required Environment Variables ```env +# Required EVM_PRIVATE_KEY=your-private-key-here + +# Optional - Custom RPC URLs +EVM_PROVIDER_URL=https://your-custom-mainnet-rpc-url +ETHEREUM_PROVIDER_=https://your-custom-rpc-url ``` -### Adding Support for Other Chains +### Chain Configuration -To enable support for additional chains, add them to the character config like this: +By default, **Ethereum mainnet** is enabled. To enable additional chains, add them to your character config: ```json "settings": { @@ -60,34 +82,168 @@ The **Wallet Provider** initializes with the **first chain in the list** as the - Creates **Public** and **Wallet clients** to interact with the supported chains. - Allows adding chains dynamically at runtime. ---- - ## Actions -### Transfer +### 1. Transfer -Transfer tokens from one address to another on any EVM-compatible chain. Just specify the: +Transfer native tokens on the same chain: -- **Amount** -- **Chain** -- **Recipient Address** +```typescript +// Example: Transfer 1 ETH +Transfer 1 ETH to 0x742d35Cc6634C0532925a3b844Bc454e4438f44e +``` -**Example usage:** +### 2. Bridge + +Bridge tokens between different chains using LiFi: + +```typescript +// Example: Bridge ETH from Ethereum to Base +Bridge 1 ETH from Ethereum to Base +``` + +### 3. Swap + +Swap tokens on the same chain using LiFi: + +```typescript +// Example: Swap ETH for USDC +Swap 1 ETH for USDC on Base +``` + +## Development + +1. Clone the repository +2. Install dependencies: ```bash -Transfer 1 ETH to 0xRecipient on arbitrum. +pnpm install ``` ---- +3. Build the plugin: -## Contribution +```bash +pnpm run build +``` -The plugin contains tests. Whether you're using **TDD** or not, please make sure to run the tests before submitting a PR. +4. Run tests: -### Running Tests +```bash +pnpm test +``` -Navigate to the `plugin-evm` directory and run: +## API Reference + +### Core Components + +1. **WalletProvider** + - Manages wallet connections + - Handles chain switching + - Manages RPC endpoints + - Tracks balances + +2. **Actions** + - TransferAction: Native token transfers + - BridgeAction: Cross-chain transfers + - SwapAction: Same-chain token swaps + +## Future Enhancements + +1. **Cross-Chain Operations** + - Enhanced bridge aggregation + - Multi-chain transaction batching + - Cross-chain liquidity management + - Bridge fee optimization + - Chain-specific gas strategies + - Cross-chain messaging + +2. **DeFi Integration** + - Advanced swap routing + - Yield farming automation + - Liquidity pool management + - Position management tools + - MEV protection features + - Flash loan integration + +3. **Smart Contract Management** + - Contract deployment templates + - Verification automation + - Upgrade management + - Security analysis tools + - Gas optimization + - ABI management system + +4. **Token Operations** + - Batch transfer tools + - Token approval management + - Token metadata handling + - Custom token standards + - Token bridging optimization + - NFT support enhancement + +5. **Wallet Features** + - Multi-signature support + - Account abstraction + - Hardware wallet integration + - Social recovery options + - Transaction simulation + - Batch transaction processing + +6. **Network Management** + - Dynamic RPC management + - Network health monitoring + - Fallback provider system + - Custom network addition + - Gas price optimization + - Network analytics + +7. **Security Enhancements** + - Transaction validation + - Risk assessment tools + - Fraud detection + - Rate limiting + - Emergency shutdown + - Audit integration + +8. **Developer Tools** + - Enhanced debugging + - Testing framework + - Documentation generator + - CLI improvements + - Performance profiling + - Integration templates + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +The plugin contains tests. Whether you're using **TDD** or not, please make sure to run the tests before submitting a PR: ```bash pnpm test ``` + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Ethereum](https://ethereum.org/): Decentralized blockchain +- [LiFi](https://lifi.io/): Cross-chain bridge and swap service +- [viem](https://viem.sh/): Ethereum client library +- [wagmi](https://wagmi.sh/): Ethereum client library + +Special thanks to: +- [Ethereum Developer community](https://ethereum.org/developers/) +- The Eliza community for their contributions and feedback + +For more information about EVM capabilities: +- [Ethereum Documentation](https://ethereum.org/developers/) +- [LiFi Documentation](https://lifi.io) +- [viem Documentation](https://viem.sh) +- [wagmi Documentation](https://wagmi.sh) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-ferePro/README.md b/packages/plugin-ferePro/README.md new file mode 100644 index 0000000000..383e394d95 --- /dev/null +++ b/packages/plugin-ferePro/README.md @@ -0,0 +1,199 @@ +# @elizaos/plugin-ferepro + +A plugin for enabling WebSocket communication with FerePro API to provide AI-driven market insights within the ElizaOS ecosystem. + +## Description + +The FerePro plugin enables real-time communication with the FerePro API through WebSocket connections, providing market analysis, cryptocurrency comparisons, and financial insights. + +## Features + +- Real-time WebSocket communication +- Streaming and non-streaming response support +- Market data analysis and comparisons +- Cryptocurrency insights +- Debug mode for detailed responses +- Automatic connection management +- Comprehensive error handling +- Credit tracking and management + +## Installation + +```bash +pnpm install @elizaos/plugin-ferepro +``` + +## Configuration + +### Required Environment Variables + +```env +# Required +FERE_USER_ID=your-user-id-here # Default: 1a5b4a29-9d95-44c8-aef3-05a8e515f43e +``` + +## Usage + +### Basic Message Structure + +```typescript +{ + "message": "Your market query here", + "stream": boolean, // Optional: Enable streaming responses + "debug": boolean // Optional: Enable debug mode +} +``` + +### Example Queries + +1. Basic Market Query: +```typescript +// Get top cryptocurrencies +"What are the top 5 cryptocurrencies?" +``` + +2. Comparison Analysis: +```typescript +// Compare specific cryptocurrencies +"Compare Ethereum and Bitcoin for the past 6 months" +``` + +3. Historical Data: +```typescript +// Get historical performance +"Compare top 3 coins against Bitcoin in the last 3 months" +``` + +## Development + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run in development mode: +```bash +pnpm run dev +``` + +## API Reference + +### Core Components + +1. **FereProService** + - Manages WebSocket connections + - Handles message sending/receiving + - Processes streaming responses + - Tracks credits and usage + +2. **Actions** + - SEND_FEREPRO_MESSAGE: Primary action for API communication + - Supports market queries and analysis requests + - Handles both streaming and non-streaming responses + +### Response Structure + +```typescript +interface ChatResponse { + answer: string; + chat_id: string; + representation?: Record[]; + agent_api_name: string; + query_summary: string; + agent_credits: number; + credits_available: number; +} +``` + +## Error Handling + +The plugin includes comprehensive error handling for: +- WebSocket connection issues +- Invalid message formats +- API response errors +- Credit limitation issues + + +## Common Issues & Troubleshooting + +### Connection Issues +1. **WebSocket Connection Failures** + - Verify your internet connection + - Check if the FerePro API service is available + - Ensure your FERE_USER_ID is valid and active + +2. **Message Timeout** + - The connection might time out for long-running queries + - Consider using streaming mode for large data requests + - Implement retry logic for important queries + +3. **Credit Depletion** + - Monitor credits_available in responses + - Set up alerts for low credit situations + - Contact FerePro support for credit top-up + +### Response Parsing +1. **Invalid Response Format** + - Check if the query is properly formatted + - Verify the message structure matches the API requirements + - Enable debug mode for detailed error information + +2. **Missing Data** + - Ensure the requested timeframe is valid + - Verify the cryptocurrencies exist in the database + - Check if you have access to the requested data tier + +## Safety & Best Practices + +### Security +1. **API Credentials** + - Never expose your FERE_USER_ID in public repositories + - Use environment variables for sensitive data + - Rotate credentials periodically if possible + +2. **Rate Limiting** + - Implement appropriate delays between requests + - Monitor credit usage to prevent unexpected depletion + - Cache responses when appropriate + +### Data Handling +1. **Response Validation** + - Always validate response data before processing + - Implement proper error handling for malformed data + - Log unexpected response formats for debugging + +2. **Stream Management** + - Close WebSocket connections properly after use + - Implement reconnection logic for dropped connections + - Handle partial responses in streaming mode + +### Best Practices +1. **Query Optimization** + - Keep queries focused and specific + - Use streaming for large data requests + - Implement caching for frequently requested data + +2. **Error Handling** + - Implement comprehensive error catching + - Log errors with appropriate context + - Provide meaningful error messages to users + +3. **Resource Management** + - Monitor WebSocket connection status + - Implement connection pooling for high-volume usage + - Clean up resources properly on service shutdown + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-flow/README.md b/packages/plugin-flow/README.md index f258981ee9..23987c6cdd 100644 --- a/packages/plugin-flow/README.md +++ b/packages/plugin-flow/README.md @@ -1,13 +1,158 @@ # @elizaos/plugin-flow -This plugin provides basic actions and providers for interacting with the [Flow Blockchain](https://developers.flow.com/). +A plugin for interacting with the Flow blockchain within the ElizaOS ecosystem. -## Actions +## Description -### Transfer +This plugin provides essential functionality for interacting with the Flow blockchain, including native FLOW token transfers, fungible token transfers, and EVM token interactions. It offers a seamless way to manage Flow blockchain transactions through natural language commands. -name: `SEND_COIN` +## Installation -Transfer native FLOW token/arbitrary FTs/ERC20s on Flow from agent's wallet to another EVM address or Flow address. +```bash +pnpm install @elizaos/plugin-flow +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +FLOW_ADDRESS= +FLOW_PRIVATE_KEY= +FLOW_NETWORK= +FLOW_ENDPOINT_URL= +``` + +## Usage + +### Basic Integration + +```typescript +import { flowPlugin } from '@elizaos/plugin-flow'; +``` + +### Example Usage + +The plugin supports natural language commands for token transfers: + +```typescript +"Send 5 FLOW to 0xa51d7fe9e0080662" +"Send 1 FLOW - A.1654653399040a61.FlowToken to 0xa2de93114bae3e73" +"Send 1000 FROTH - 0xb73bf8e6a4477a952e0338e6cc00cc0ce5ad04ba to 0x000000000000000000000002e44fbfbd00395de5" +``` + +## API Reference + +### Actions + +#### SEND_COIN + +Transfers native FLOW tokens, Cadence fungible tokens, or EVM tokens to specified addresses. + +**Aliases:** +- SEND_TOKEN +- SEND_TOKEN_ON_FLOW +- TRANSFER_TOKEN_ON_FLOW +- TRANSFER_TOKENS_ON_FLOW +- TRANSFER_FLOW +- SEND_FLOW +- PAY_BY_FLOW + +**Input Content:** +```typescript +interface TransferContent { + token: string | null; // null for native FLOW, Cadence identifier, or EVM address + amount: string; // Amount to transfer + to: string; // Recipient address (Flow or EVM) + matched: boolean; // Indicates if token and address types match +} +``` + +## Common Issues & Troubleshooting + +1. **Connection Issues** + - Verify network configuration (mainnet/testnet/emulator) + - Check RPC endpoint availability + - Ensure proper wallet configuration + +2. **Transaction Failures** + - Verify sufficient balance for transfers + - Check correct address format (Flow vs EVM) + - Confirm token contract compatibility + +3. **Authentication Issues** + - Validate private key format + - Verify wallet address matches private key + - Check network permissions + +## Security Best Practices + +1. **Key Management** + - Store private keys securely + - Use environment variables for sensitive data + - Never expose private keys in code or logs + +2. **Transaction Safety** + - Validate all addresses before transfers + - Implement proper error handling + - Check token compatibility before transfers + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run tests: + +```bash +pnpm run test +``` + +## Future Enhancements + +- Support for NFT transfers +- Enhanced error handling and recovery +- Additional Flow blockchain interactions +- Expanded token support + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Flow Blockchain](https://flow.com/): Decentralized layer 1 blockchain +- [@onflow/fcl](https://www.npmjs.com/package/@onflow/fcl): Flow Client Library +- [@onflow/types](https://www.npmjs.com/package/@onflow/types): Flow type system +- [Cadence](https://docs.onflow.org/cadence/): Smart contract programming language + +Special thanks to: +- The Dapper Labs team for developing Flow +- The Flow Developer community +- The FCL SDK maintainers +- The Cadence language designers +- The Eliza community for their contributions and feedback + +For more information about Flow capabilities: +- [Flow Documentation](https://docs.onflow.org/) +- [Flow Developer Portal](https://developers.flow.com/) +- [Flow Block Explorer](https://flowscan.org/) +- [Cadence Documentation](https://docs.onflow.org/cadence/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. -Message sample: `Send 5 FLOW to 0xa51d7fe9e0080662` diff --git a/packages/plugin-fuel/README.md b/packages/plugin-fuel/README.md new file mode 100644 index 0000000000..104a416a88 --- /dev/null +++ b/packages/plugin-fuel/README.md @@ -0,0 +1,147 @@ +# @elizaos/plugin-fuel + +A plugin for interacting with the Fuel blockchain within the ElizaOS ecosystem. + +## Description + +This plugin provides essential functionality for interacting with the Fuel blockchain, focusing on ETH transfers on the Fuel Ignition network. It offers a streamlined way to manage Fuel blockchain transactions through natural language commands. + +## Installation + +```bash +pnpm install @elizaos/plugin-fuel +``` + +## Configuration + +The plugin requires the following environment variables to be set: +```typescript +FUEL_PRIVATE_KEY= +FUEL_PROVIDER_URL= +``` + +## Usage + +### Basic Integration + +```typescript +import { fuelPlugin } from '@elizaos/plugin-fuel'; +``` + +### Example Usage + +The plugin supports natural language commands for ETH transfers: + +```typescript +"Transfer 1 ETH to 0x8F8afB12402C9a4bD9678Bec363E51360142f8443FB171655eEd55dB298828D1" +``` + +## API Reference + +### Actions + +#### TRANSFER + +Transfers ETH between addresses on the Fuel Ignition network. + +**Aliases:** +- TRANSFER_FUEL_ETH +- SEND_TOKENS + +**Input Content:** +```typescript +interface TransferParams { + toAddress: string; // Recipient's Fuel address + amount: string; // Amount of ETH to transfer +} +``` + +## Common Issues & Troubleshooting + +1. **Connection Issues** + - Verify provider URL is accessible + - Check network connectivity + - Ensure proper network configuration + +2. **Transaction Failures** + - Verify sufficient balance for transfers + - Check correct address format + - Ensure gas fees can be covered + +3. **Authentication Issues** + - Validate private key format + - Verify wallet configuration + - Check network permissions + +## Security Best Practices + +1. **Key Management** + - Store private keys securely + - Use environment variables for sensitive data + - Never expose private keys in code or logs + +2. **Transaction Safety** + - Validate recipient addresses + - Implement proper error handling + - Double-check transaction amounts + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run tests: + +```bash +pnpm test +``` + +## Future Enhancements + +- Support for token transfers +- Enhanced error handling and recovery +- Additional Fuel blockchain interactions +- Transaction status monitoring +- Balance tracking improvements + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Fuel Network](https://fuel.network/): High-performance modular execution layer +- [fuels-ts](https://github.com/FuelLabs/fuels-ts): TypeScript SDK for Fuel +- [Fuel Wallet](https://wallet.fuel.network/): Official Fuel wallet +- [Fuel GraphQL API](https://docs.fuel.network/docs/graphql/): Network interaction + +Special thanks to: +- The Fuel Labs team for developing the Fuel Network +- The Fuel Developer community +- The fuels-ts SDK maintainers +- The Eliza community for their contributions and feedback + +For more information about Fuel capabilities: +- [Fuel Documentation](https://docs.fuel.network/) +- [Fuel Developer Portal](https://developers.fuel.network/) +- [Fuel Network Dashboard](https://app.fuel.network/) +- [Fuel GitHub Repository](https://github.com/FuelLabs) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-gitbook/README.md b/packages/plugin-gitbook/README.md new file mode 100644 index 0000000000..b6bdd05b1a --- /dev/null +++ b/packages/plugin-gitbook/README.md @@ -0,0 +1,184 @@ +# @elizaos/plugin-gitbook + +A plugin for querying and retrieving information from GitBook documentation within the ElizaOS ecosystem. + +## Description + +This plugin enables seamless integration with GitBook documentation, allowing natural language queries to retrieve relevant documentation content. It features intelligent query validation, keyword-based filtering, and clean response formatting to provide accurate documentation answers. + +## Installation + +```bash +pnpm install @elizaos/plugin-gitbook +``` + +## Configuration + +### Environment Variables +```typescript +GITBOOK_SPACE_ID= +``` + +### Client Configuration (Optional) +You can customize the plugin's behavior by adding the following configuration to your character.json file: +```json +{ + "name": "YourCharacter", + "plugins": ["gitbook"], + "settings": { + "gitbook": { + "keywords": { + "projectTerms": ["term1", "term2"], // Optional: Project-specific terms to match + "generalQueries": ["custom1", "custom2"] // Optional: Additional query keywords + }, + "documentTriggers": ["docs", "documentation"] // Optional: Trigger words for documentation + } + } +} +``` + +The plugin will work with default settings if no configuration is provided, but adding custom configuration can help tailor the responses to your specific documentation needs. + +## Usage + +### Basic Integration + +```typescript +import { gitbookPlugin } from '@elizaos/plugin-gitbook'; +``` + +### Example Usage + +The plugin automatically processes natural language queries: + +```typescript +"How do I get started with the project?" +"What are the main features?" +"Explain how to configure the system" +``` + +## API Reference + +### Providers + +#### GitBook Provider + +Handles documentation queries and returns relevant information. + +**Response Type:** +```typescript +interface GitBookResponse { + answer?: { + text: string; + }; + error?: string; +} +``` + +**Configuration Types:** +```typescript +interface GitBookKeywords { + projectTerms?: string[]; // Project-specific terms + generalQueries?: string[]; // Additional query keywords +} + +interface GitBookClientConfig { + keywords?: GitBookKeywords; + documentTriggers?: string[]; // Trigger words for documentation +} +``` + +## Common Issues & Troubleshooting + +1. **Connection Issues** + - Verify GitBook Space ID is correct + - Check API endpoint accessibility + - Ensure proper network connectivity + +2. **Query Issues** + - Verify query contains valid keywords + - Check if query matches project terms + - Ensure proper query formatting + +3. **Response Issues** + - Validate GitBook API response format + - Check for rate limiting + - Verify content accessibility + +## Security Best Practices + +1. **API Configuration** + - Store Space ID securely + - Use environment variables + - Implement proper error handling + +2. **Query Validation** + - Sanitize input queries + - Validate keywords and triggers + - Clean response content + +3. **Response Handling** + - Implement proper error handling + - Validate response format + - Handle sensitive information appropriately + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +4. Run tests: + +```bash +pnpm test +``` + +## Future Enhancements + +- Enhanced query validation +- Support for multiple GitBook spaces +- Advanced search capabilities +- Custom response formatting +- Caching mechanism for frequent queries +- Support for authenticated endpoints + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [GitBook](https://www.gitbook.com/): Documentation and knowledge base platform +- [GitBook API](https://developer.gitbook.com/): Official GitBook REST API +- [Axios](https://axios-http.com/): Promise-based HTTP client +- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses + +Special thanks to: +- The GitBook team for their documentation platform +- The GitBook Developer Relations team +- The Axios maintainers for reliable HTTP requests +- The Eliza community for their contributions and feedback + +For more information about GitBook capabilities: +- [GitBook Documentation](https://docs.gitbook.com/) +- [GitBook API Reference](https://developer.gitbook.com/reference) +- [GitBook Integrations](https://docs.gitbook.com/integrations/git-sync) +- [GitBook Space Management](https://docs.gitbook.com/space/space-management) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-goat/README.md b/packages/plugin-goat/README.md index 6dca2160d5..5c99145284 100644 --- a/packages/plugin-goat/README.md +++ b/packages/plugin-goat/README.md @@ -1,24 +1,31 @@ -# GOAT Plugin +# @elizaos/plugin-goat + +A plugin for integrating blockchain capabilities through the GOAT (Great Onchain Agent Toolkit) framework within the ElizaOS ecosystem. + +## Description + [GOAT](https://ohmygoat.dev/) 🐐 (Great Onchain Agent Toolkit) is an open-source framework for adding blockchain tools such as wallets, being able to hold or trade tokens, or interacting with blockchain smart contracts, to your AI agent. This plugin integrates GOAT with Eliza, giving your agent the ability to interact with many different protocols. The current setup adds onchain capabilities to your agent to send and check balances of ETH and USDC. Add all the capabilities you need by adding more plugins (read below for more information)! -## Configure GOAT for your use case -1. Configure the chain you want to use by updating the `wallet.ts` file (see all available chains at [https://ohmygoat.dev/chains](https://ohmygoat.dev/chains)) -2. Add the plugins you need to your `getOnChainActions` function (uniswap, polymarket, etc. see all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins)) -3. Build the project running `pnpm build` -4. Add the necessary environment variables to set up your wallet and plugins -5. Run your agent! +## Installation -## Common Issues -1. **Agent not executing an action**: - - If you are also using the EVM Plugin, sometimes the agent might confuse the action name with an EVM Plugin action name instead of the GOAT Plugin action. Removing the EVM Plugin should fix this issue. There is no need for you to use both plugins at the same time. - - If you are using Trump as a character it might be tricky to get them to perform any action since the character is full of prompts that aim to change the topic of the conversation. To fix this try using a different character or create your own with prompts that are more suitable to what the agent is supposed to do. +```bash +pnpm install @elizaos/plugin-goat +``` + +## Configuration + +### Environment Variables +```typescript +EVM_PRIVATE_KEY= +EVM_PROVIDER_URL= +``` -## Plugins -GOAT itself has several plugins for interacting with different protocols such as Polymarket, Uniswap, and more. (see all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins)) +## Configure GOAT for your use case -You can easily add them by installing them and adding them to the `getOnChainActions` function: +1. Configure the chain you want to use by updating the `wallet.ts` file (see all available chains at [https://ohmygoat.dev/chains](https://ohmygoat.dev/chains)) +2. Add the plugins you need to your `getOnChainActions` function: ```typescript const tools = getOnChainActions({ @@ -33,14 +40,100 @@ const tools = getOnChainActions({ }) ``` -## Environment Variables Setup +See all available plugins at [https://ohmygoat.dev/chains-wallets-plugins](https://ohmygoat.dev/chains-wallets-plugins) + +## Common Issues & Troubleshooting + +1. **Agent not executing an action**: + - If you are also using the EVM Plugin, sometimes the agent might confuse the action name with an EVM Plugin action name instead of the GOAT Plugin action. Removing the EVM Plugin should fix this issue. There is no need for you to use both plugins at the same time. + - If you are using Trump as a character it might be tricky to get them to perform any action since the character is full of prompts that aim to change the topic of the conversation. To fix this try using a different character or create your own with prompts that are more suitable to what the agent is supposed to do. -To set up your environment variables, you will need to provide the following information: +2. **Wallet Connection Issues** + - Verify private key is correctly formatted + - Check RPC endpoint availability + - Ensure sufficient network balance -* `EVM_PRIVATE_KEY`: Your EVM wallet private key. -* `EVM_PROVIDER_URL`: Your RPC provider URL (e.g. Infura, Alchemy, etc.). +3. **Transaction Issues** + - Verify gas availability + - Check network congestion + - Confirm transaction parameters ## Wallets + GOAT supports many different wallets from key pairs to [Crossmint Smart Wallets](https://docs.crossmint.com/wallets/smart-wallets/overview) and Coinbase. Read more about wallets at [https://ohmygoat.dev/wallets](https://ohmygoat.dev/wallets). + +## Security Best Practices + +1. **Key Management** + - Store private keys securely + - Use environment variables + - Never expose keys in code + +2. **Transaction Safety** + - Implement transaction limits + - Validate recipient addresses + - Double-check transaction amounts + +3. **Network Security** + - Use secure RPC endpoints + - Implement rate limiting + - Monitor for suspicious activity + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: + +```bash +pnpm install +``` + +3. Build the plugin: + +```bash +pnpm run build +``` + +## Future Enhancements + +- Additional protocol integrations +- Multi-chain support +- Advanced transaction management +- Enhanced error handling +- Custom protocol adapters +- Smart contract interaction templates + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [GOAT](https://ohmygoat.dev/): Great Onchain Agent Toolkit +- [Crossmint](https://docs.crossmint.com/): Smart wallet infrastructure +- [Uniswap](https://docs.uniswap.org/): Decentralized exchange protocol +- [Polymarket](https://docs.polymarket.com/): Prediction market platform +- [ERC20](https://eips.ethereum.org/EIPS/eip-20): Token standard implementation + +Special thanks to: +- The GOAT development team for the onchain agent framework +- The Crossmint team for smart wallet solutions +- The Uniswap and Polymarket teams +- The Ethereum community for ERC standards +- The Eliza community for their contributions and feedback + +For more information about GOAT capabilities: +- [GOAT Documentation](https://ohmygoat.dev/) +- [Available Chains](https://ohmygoat.dev/chains) +- [Chains, Wallets & Plugins](https://ohmygoat.dev/chains-wallets-plugins) +- [Smart Wallet Documentation](https://docs.crossmint.com/wallets/smart-wallets/overview) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-icp/README.md b/packages/plugin-icp/README.md new file mode 100644 index 0000000000..7afd424351 --- /dev/null +++ b/packages/plugin-icp/README.md @@ -0,0 +1,222 @@ +# @elizaos/plugin-icp + +Internet Computer Protocol (ICP) plugin for Eliza OS. + +## Features + +- Create meme tokens on PickPump +- Interact with ICP canisters +- Handle ICRC-1 token standard +- Manage ICP wallets and identities +- Support for anonymous and authenticated calls + +## Installation + +```bash +pnpm install @elizaos/plugin-icp +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +INTERNET_COMPUTER_PRIVATE_KEY= +``` + +## Usage + +### Import and Register + +```typescript +import { icpPlugin } from '@elizaos/plugin-icp'; + +// Register the plugin with Eliza +eliza.registerPlugin(icpPlugin); +``` + +### Available Actions + +#### Create Token +Creates a new meme token on PickPump with AI-generated logo and description. + +```typescript +// Example usage in chat +"Create a space cat token on PickPump" +"Help me create a pizza-themed funny token on PP" +``` + +### Providers + +#### ICP Wallet Provider +Manages ICP wallet operations and canister interactions. + +```typescript +const { wallet } = await icpWalletProvider.get(runtime, message, state); +``` + +## Common Issues & Troubleshooting + +1. **Identity Creation Failures** + - Ensure private key is exactly 32 bytes + - Verify private key is properly hex-encoded + - Check if private key has correct permissions + +2. **Canister Interaction Issues** + - Verify canister ID is valid + - Ensure proper network configuration (mainnet/testnet) + - Check if canister is available and running + +3. **Transaction Failures** + - Verify sufficient balance for operation + - Check cycle balance for canister calls + - Ensure proper fee calculation + +4. **Authentication Problems** + - Verify identity is properly initialized + - Check if agent is configured correctly + - Ensure proper network connectivity + +## Security Best Practices + +1. **Key Management** + - Never expose private keys in code or logs + - Use environment variables for sensitive data + - Rotate keys periodically + - Use separate keys for development and production + +2. **Identity Security** + - Create separate identities for different purposes + - Limit identity permissions appropriately + - Monitor identity usage and access patterns + +3. **Canister Interaction Safety** + - Validate all input parameters + - Implement proper error handling + - Use query calls when possible to save cycles + - Implement rate limiting for calls + +4. **Network Security** + - Use secure endpoints + - Implement proper timeout handling + - Validate responses from canisters + - Handle network errors gracefully + +## API Reference + +### Types + +```typescript +// Token Creation Arguments +export type CreateMemeTokenArg = { + name: string; + symbol: string; + description: string; + logo: string; + twitter?: string; + website?: string; + telegram?: string; +}; + +// ICP Configuration +export interface ICPConfig { + privateKey: string; + network?: "mainnet" | "testnet"; +} +``` + +### Utilities + +The plugin provides various utility functions for: +- Principal/Account conversions +- Candid type handling +- Result/Variant unwrapping +- Array/Hex conversions + +### Helper Functions + +```typescript +// Convert principal to account +principal2account(principal: string, subaccount?: number[]): string + +// Check if text is valid principal +isPrincipalText(text: string): boolean + +// Create anonymous actor for public queries +createAnonymousActor(idlFactory, canisterId, host?) +``` + +## Development Guide + +### Setting Up Development Environment + +1. Clone the repository +2. Install dependencies: +```bash +pnpm install +``` + +3. Build the plugin: +```bash +pnpm run build +``` + +4. Run tests: +```bash +pnpm test +``` + +### Testing with Local Replica + +1. Start a local Internet Computer replica +2. Configure environment for local testing +3. Use test identities for development + +## Dependencies + +- @dfinity/agent: ^2.1.3 +- @dfinity/candid: ^2.1.3 +- @dfinity/identity: ^2.1.3 +- @dfinity/principal: ^2.1.3 +- @elizaos/core: workspace:* + +## Future Enhancements + +- Support for additional canister standards +- Enhanced error handling and recovery +- Batch transaction support +- Advanced identity management +- Improved cycle management +- Extended canister interaction capabilities + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Internet Computer](https://internetcomputer.org/): Decentralized cloud computing platform +- [@dfinity/agent](https://www.npmjs.com/package/@dfinity/agent): ICP HTTP client and agent +- [@dfinity/candid](https://www.npmjs.com/package/@dfinity/candid): Candid interface description language +- [@dfinity/principal](https://www.npmjs.com/package/@dfinity/principal): Principal identifier handling +- [@dfinity/identity](https://www.npmjs.com/package/@dfinity/identity): Identity management + +Special thanks to: +- The DFINITY Foundation for developing the Internet Computer +- The ICP Developer community +- The DFINITY SDK maintainers +- The PickPump team for meme token infrastructure +- The Eliza community for their contributions and feedback + +For more information about Internet Computer capabilities: +- [ICP Documentation](https://internetcomputer.org/docs/) +- [DFINITY Developer Portal](https://smartcontracts.org/) +- [ICP Dashboard](https://dashboard.internetcomputer.org/) +- [Candid Documentation](https://internetcomputer.org/docs/current/developer-docs/build/candid/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-image-generation/README.md b/packages/plugin-image-generation/README.md new file mode 100644 index 0000000000..a793abb1a3 --- /dev/null +++ b/packages/plugin-image-generation/README.md @@ -0,0 +1,150 @@ +# @elizaos/plugin-image-generation + +Image generation plugin for Eliza OS that supports multiple AI image generation providers. + +## Features + +- Multi-provider support (OpenAI, Together AI, Heurist, FAL AI, Venice AI, Livepeer) +- Intelligent prompt enhancement +- Customizable image parameters +- Automatic image saving and management +- Support for various image formats and sizes +- Fallback provider chain for reliability + +## Installation + +```bash +pnpm install @elizaos/plugin-image-generation +``` + +## Configuration + +The plugin requires at least one of the following API keys: + +```env +ANTHROPIC_API_KEY=your-anthropic-key +TOGETHER_API_KEY=your-together-key +HEURIST_API_KEY=your-heurist-key +FAL_API_KEY=your-fal-key +OPENAI_API_KEY=your-openai-key +VENICE_API_KEY=your-venice-key +LIVEPEER_GATEWAY_URL=your-livepeer-url +``` + +## Usage + +### Basic Image Generation + +```typescript +import { imageGenerationPlugin } from '@elizaos/plugin-image-generation'; + +// Generate an image +const result = await eliza.execute({ + action: 'GENERATE_IMAGE', + content: 'A serene landscape with mountains' +}); +``` + +### Advanced Options + +```typescript +const result = await eliza.execute({ + action: 'GENERATE_IMAGE', + content: 'A futuristic cityscape', + options: { + width: 1024, + height: 1024, + count: 2, + negativePrompt: 'blurry, low quality', + numIterations: 50, + guidanceScale: 7.5, + seed: 12345 + } +}); +``` + +## Supported Image Parameters + +- `width`: Image width (default: 1024) +- `height`: Image height (default: 1024) +- `count`: Number of images to generate +- `negativePrompt`: What to avoid in the generation +- `numIterations`: Number of diffusion steps +- `guidanceScale`: How closely to follow the prompt +- `seed`: For reproducible results +- `modelId`: Specific model to use +- `stylePreset`: Visual style to apply +- `hideWatermark`: Toggle watermark visibility + +## Common Issues & Troubleshooting + +1. **API Key Validation** + - Ensure at least one provider API key is configured + - Check API key validity and quotas + +2. **Image Generation Failures** + - Verify prompt length and content + - Check provider service status + - Confirm supported image dimensions + +3. **File System Issues** + - Ensure write permissions for generatedImages directory + - Check available disk space + - Verify file path accessibility + +## Security Best Practices + +1. **API Key Management** + - Store keys in environment variables + - Never commit API keys to version control + - Rotate keys periodically + +2. **Content Safety** + - Implement content filtering + - Use provider safety settings + - Monitor generated content + +3. **File System Security** + - Sanitize filenames + - Limit access to generated files + - Regular cleanup of temporary files + +## Dependencies + +- @elizaos/core: workspace:* +- tsup: 8.3.5 + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [OpenAI DALL-E](https://openai.com/dall-e-3): Advanced image generation model +- [Together AI](https://www.together.ai/): AI model deployment platform +- [FAL AI](https://fal.ai/): Serverless AI infrastructure +- [Heurist](https://heurist.ai/): AI model optimization +- [Venice AI](https://venice.ai/): Image generation platform +- [Livepeer](https://livepeer.org/): Decentralized video infrastructure + +Special thanks to: +- The OpenAI team for DALL-E technology +- The Together AI team for model deployment tools +- The FAL AI team for serverless infrastructure +- The Heurist team for optimization capabilities +- The Venice AI and Livepeer teams +- The Eliza community for their contributions and feedback + +For more information about image generation capabilities: +- [DALL-E API Documentation](https://platform.openai.com/docs/guides/images) +- [Together AI Documentation](https://docs.together.ai/) +- [FAL AI Documentation](https://fal.ai/docs) +- [Heurist Documentation](https://docs.heurist.ai/) +- [Venice AI Platform](https://docs.venice.ai/) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + diff --git a/packages/plugin-intiface/README.md b/packages/plugin-intiface/README.md new file mode 100644 index 0000000000..782f3d47fb --- /dev/null +++ b/packages/plugin-intiface/README.md @@ -0,0 +1,190 @@ +# @elizaos/plugin-intiface + +Intiface/Buttplug.io integration plugin for Eliza OS that enables control of intimate hardware devices. + +## Features + +- Support for multiple intimate hardware devices through Buttplug.io protocol +- Automatic device discovery and connection management +- Battery level monitoring for supported devices +- Vibration and rotation control (device-dependent) +- Graceful connection handling and cleanup +- Built-in device simulation for testing +- Support for customizable vibration patterns +- Automatic Intiface Engine management + +## Installation + +```bash +pnpm install @elizaos/plugin-intiface +``` + +## Configuration + +The plugin can be configured through environment variables or runtime settings: + +```env +INTIFACE_URL=ws://localhost:12345 +INTIFACE_NAME=Eliza Intiface Client +DEVICE_NAME=Lovense Nora +``` + +## Usage + +### Basic Device Control + +```typescript +import { intifacePlugin } from '@elizaos/plugin-intiface'; + +// Vibrate device +const result = await eliza.execute({ + action: 'VIBRATE', + content: { + strength: 0.5, // 0.0 to 1.0 + duration: 1000 // milliseconds + } +}); + +// Check battery level +const battery = await eliza.execute({ + action: 'BATTERY', + content: {} +}); +``` + +### Advanced Features + +```typescript +// Rotation control (for supported devices) +const result = await eliza.execute({ + action: 'ROTATE', + content: { + strength: 0.7, + duration: 2000 + } +}); +``` + +## Device Support + +The plugin supports various devices through the Buttplug protocol, including but not limited to: + +- Lovense devices (Nora, Max, etc.) +- WeVibe products +- Kiiroo devices +- Magic Motion products +- And many others supported by Buttplug.io + +## Testing + +The plugin includes a simulation mode for testing without physical hardware: + +```bash +pnpm test-via-bun +``` + +## Dependencies + +- Buttplug.io (v3.2.2) +- Intiface Engine +- WebSocket support + +## Troubleshooting + +### Common Issues + +1. **Connection Problems** + - Verify Intiface Engine is running (`ws://localhost:12345` by default) + - Check device Bluetooth is enabled and in pairing mode + - Ensure device is charged and within range + - Try restarting both device and Intiface Engine + +2. **Device Not Found** + - Confirm device is supported by Buttplug.io + - Try manual device pairing through Intiface Central first + - Check if device requires specific firmware version + - Verify device is not connected to another application + +3. **Command Failures** + - Check battery level is sufficient + - Ensure device is within supported range for command values + - Verify device supports the specific command (vibrate/rotate) + - Monitor Intiface Engine logs for detailed error messages + +4. **Performance Issues** + - Reduce command frequency if experiencing lag + - Check for Bluetooth interference + - Monitor system resources for potential bottlenecks + - Consider using wired connection if available + +## Security Best Practices + +1. **Device Privacy** + - Use secure WebSocket connections (wss://) when possible + - Don't expose Intiface Engine to public networks + - Regularly check for and apply firmware updates + - Monitor device connection status + +2. **Data Protection** + - Clear device pairing history when needed + - Don't store sensitive device information + - Use unique device names for identification + - Implement timeouts for idle connections + +3. **Access Control** + - Limit device control to authenticated users + - Implement command rate limiting + - Use device-specific permissions where applicable + - Monitor and log unusual command patterns + +4. **Network Security** + - Keep Intiface Engine behind firewall + - Use local connections when possible + - Implement connection timeouts + - Regular security audits of configurations + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + + +Intiface is a Registered Trademark of Nonpolynomial Labs, LLC + +Buttplug and Intiface are BSD licensed. + + Copyright (c) 2016-2022, Nonpolynomial Labs, LLC + All rights reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: + + * Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + + * Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + * Neither the name of buttplug nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +## Credits + +This plugin integrates with [Buttplug.io](https://buttplug.io) and [Intiface Engine](https://github.com/intiface/intiface-engine), developed by Nonpolynomial Labs, LLC. diff --git a/packages/plugin-multiversx/README.md b/packages/plugin-multiversx/README.md new file mode 100644 index 0000000000..5316312271 --- /dev/null +++ b/packages/plugin-multiversx/README.md @@ -0,0 +1,169 @@ +# @elizaos/plugin-multiversx + +MultiversX blockchain integration plugin for Eliza OS that enables token management and transfers. + +## Overview + +This plugin aims to be the basis of all interactions with the MultiversX ecosystem. + +## Features + +- EGLD and ESDT token transfers +- Token creation and management +- Multiple network support (mainnet, devnet, testnet) +- Secure transaction signing +- Automatic nonce management +- Transaction status tracking +- Built-in denomination handling +- Comprehensive error handling + +## Adding a new action + +Reuse providers and utilities from the existing actions where possible. Add more utilities if you think they will be useful for other actions. + +1. Add the action to the `actions` directory. Try to follow the naming convention of the other actions. +2. Export the action in the `index.ts` file. + +## Installation + +```bash +pnpm install @elizaos/plugin-multiversx +``` + +## Configuration + +The plugin requires environment variables or runtime settings: + +```env +MVX_PRIVATE_KEY=your-wallet-private-key +MVX_NETWORK=devnet # mainnet, devnet, or testnet +``` + +## Usage + +### Token Transfer + +```typescript +import { multiversxPlugin } from '@elizaos/plugin-multiversx'; + +// Send EGLD +const result = await eliza.execute({ + action: 'SEND_TOKEN', + content: { + tokenAddress: 'erd1...', + amount: '1', + tokenIdentifier: 'EGLD' + } +}); + +// Send ESDT +const result = await eliza.execute({ + action: 'SEND_TOKEN', + content: { + tokenAddress: 'erd1...', + amount: '100', + tokenIdentifier: 'TEST-a1b2c3' + } +}); +``` + +### Token Creation + +```typescript +const result = await eliza.execute({ + action: 'CREATE_TOKEN', + content: { + tokenName: 'TestToken', + tokenTicker: 'TEST', + decimals: '18', + amount: '1000000' + } +}); +``` + +## Troubleshooting + +### Common Issues + +1. **Transaction Failures** + - Verify wallet has sufficient balance + - Check network configuration matches intended network + - Ensure correct token identifiers + - Verify recipient address format + +2. **Configuration Problems** + - Validate private key format + - Check network selection is valid + - Ensure environment variables are properly set + - Verify wallet permissions for token operations + +3. **Token Creation Issues** + - Check token name and ticker format + - Verify EGLD balance for issuance fee + - Ensure unique token identifiers + - Monitor transaction status + +4. **Network Connectivity** + - Verify network endpoint availability + - Check API rate limits + - Monitor network status + - Ensure proper network selection + +## Security Best Practices + +1. **Key Management** + - Never expose private keys in code + - Use environment variables for sensitive data + - Implement key rotation policies + - Monitor wallet activity + +2. **Transaction Safety** + - Validate all transaction parameters + - Implement transaction limits + - Use proper denomination handling + - Double-check recipient addresses + +3. **Network Security** + - Use secure network connections + - Implement retry mechanisms + - Monitor for suspicious activity + - Keep dependencies updated + +4. **Error Handling** + - Implement comprehensive error logging + - Handle network timeouts gracefully + - Validate all user inputs + - Provide clear error messages + +## Testing + +Run the test suite: + +```bash +pnpm test +``` + +Watch mode for development: + +```bash +pnpm test:watch +``` + +## Dependencies + +- @multiversx/sdk-core: ^13.15.0 +- bignumber.js: ^9.1.2 +- tsup: ^8.3.5 +- vitest: ^2.1.5 + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with the [MultiversX blockchain](https://multiversx.com/) using their official SDK. diff --git a/packages/plugin-multiversx/readme.md b/packages/plugin-multiversx/readme.md deleted file mode 100644 index 0c26c8b537..0000000000 --- a/packages/plugin-multiversx/readme.md +++ /dev/null @@ -1,12 +0,0 @@ -# MultiversX Plugin - -## Overview - -This plugin aims to be the basis of all interactions with the MultiversX ecosystem. - -## Adding a new action - -Reuse providers and utilities from the existing actions where possible. Add more utilities if you think they will be useful for other actions. - -1. Add the action to the `actions` directory. Try to follow the naming convention of the other actions. -2. Export the action in the `index.ts` file. diff --git a/packages/plugin-near/README.md b/packages/plugin-near/README.md new file mode 100644 index 0000000000..2d7b20aa3f --- /dev/null +++ b/packages/plugin-near/README.md @@ -0,0 +1,210 @@ +# @elizaos/plugin-near + +NEAR Protocol integration plugin for Eliza OS that enables token management, transfers, and swaps using Ref Finance. + +## Overview + +This plugin aims to be the basis of all interactions with the NEAR ecosystem, providing seamless integration with NEAR Protocol and Ref Finance DEX. + +## Features + +- NEAR token transfers +- Token swaps via Ref Finance +- Multiple network support (mainnet, testnet) +- Secure transaction signing +- Automatic storage deposit handling +- Real-time price feeds +- Portfolio tracking and management +- Smart routing for optimal swaps +- Built-in denomination handling +- Comprehensive error handling + +## Installation + +```bash +pnpm install @elizaos/plugin-near +``` + +## Configuration + +The plugin requires environment variables or runtime settings: + +```env +NEAR_WALLET_SECRET_KEY=your-wallet-private-key +NEAR_WALLET_PUBLIC_KEY=your-wallet-public-key +NEAR_ADDRESS=your-account.near +NEAR_NETWORK=testnet # mainnet or testnet +RPC_URL=https://rpc.testnet.near.org +SLIPPAGE=0.01 # 1% slippage tolerance +``` + +## Usage + +### Token Transfer + +```typescript +import { nearPlugin } from '@elizaos/plugin-near'; + +// Send NEAR +const result = await eliza.execute({ + action: 'SEND_NEAR', + content: { + recipient: 'bob.near', + amount: '1.5' + } +}); +``` + +### Token Swap + +```typescript +const result = await eliza.execute({ + action: 'EXECUTE_SWAP_NEAR', + content: { + inputTokenId: 'wrap.near', + outputTokenId: 'token.v2.ref-finance.near', + amount: '10' + } +}); +``` +## API Reference + +### Actions + +#### `SEND_NEAR` +Transfers NEAR tokens to another account. + +```typescript +{ + action: 'SEND_NEAR', + content: { + recipient: string, // Recipient's NEAR account (e.g., "bob.near") + amount: string, // Amount to send (in NEAR) + tokenAddress?: string // Optional: for NEP-141 tokens + } +} +``` + +#### `EXECUTE_SWAP_NEAR` +Executes a token swap using Ref Finance. + +```typescript +{ + action: 'EXECUTE_SWAP_NEAR', + content: { + inputTokenId: string, // Input token contract (e.g., "wrap.near") + outputTokenId: string, // Output token contract + amount: string, // Amount to swap + slippageTolerance?: number // Optional: default from config + } +} +``` + +### Providers + +#### Wallet Provider +Provides wallet information and portfolio tracking. + +```typescript +const walletInfo = await eliza.getProvider('wallet'); +// Returns formatted portfolio including: +// - Account balance +// - Token balances +// - USD values +// - Market prices +``` + +## Troubleshooting + +### Common Issues + +1. **Transaction Failures** + - Check account balance + - Verify storage deposits + - Ensure sufficient gas + - Confirm slippage tolerance + +2. **Connection Problems** + - Verify RPC endpoint + - Check network selection + - Ensure valid credentials + - Monitor API rate limits + +3. **Swap Issues** + - Verify token pairs exist + - Check liquidity pools + - Confirm price impact + - Monitor slippage settings + +## Security Best Practices + +1. **Key Management** + - Store private keys securely + - Use environment variables + - Implement key rotation + - Monitor account activity + +2. **Transaction Safety** + - Validate all inputs + - Implement amount limits + - Double-check recipients + - Monitor transaction status + +3. **Network Security** + - Use secure RPC endpoints + - Implement retry mechanisms + - Monitor for suspicious activity + - Keep dependencies updated + +4. **Error Handling** + - Log all transaction attempts + - Handle timeouts gracefully + - Validate all user inputs + - Provide clear error messages + +## Testing + +Run the test suite: + +```bash +pnpm test +``` + +Watch mode for development: + +```bash +pnpm test:watch +``` + +## Dependencies + +- near-api-js: ^5.0.1 +- @ref-finance/ref-sdk: ^1.4.6 +- bignumber.js: ^9.1.2 +- node-cache: ^5.1.2 + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with: +- [NEAR Protocol](https://near.org/) +- [Ref Finance](https://ref.finance/) +- Official NEAR JavaScript API and SDKs + +Special thanks to: +- The NEAR Protocol team for developing the NEAR blockchain +- The Ref Finance team for developing the Ref Finance DEX +- The Eliza community for their contributions and feedback. + +For more information about NEAR blockchain capabilities: +- [NEAR Documentation](https://docs.near.org/) +- [NEAR Developer Portal](https://near.org/developers) +- [NEAR Network Dashboard](https://nearscan.io/) +- [NEAR GitHub Repository](https://github.com/nearprotocol/near-api-js) \ No newline at end of file diff --git a/packages/plugin-nft-generation/README.md b/packages/plugin-nft-generation/README.md new file mode 100644 index 0000000000..e0b96e677b --- /dev/null +++ b/packages/plugin-nft-generation/README.md @@ -0,0 +1,218 @@ +# @elizaos/plugin-nft-generation + +NFT collection generation plugin for Eliza OS that enables NFT creation, collection management, and verification on the Solana blockchain. + +## Overview + +This plugin provides comprehensive NFT functionality, including collection creation, NFT minting, and verification, with automatic image generation and metadata management. + +## Features + +- Automated NFT collection creation +- AI-powered image generation for NFTs +- Collection logo generation +- Metadata creation and management +- AWS S3 integration for asset storage +- Solana blockchain integration +- NFT verification system +- Automatic nonce management +- Comprehensive error handling + +## Installation + +```bash +pnpm install @elizaos/plugin-nft-generation +``` + +## Configuration + +The plugin requires environment variables or runtime settings: + +```env +# Solana Configuration +SOLANA_PUBLIC_KEY=your-wallet-public-key +SOLANA_PRIVATE_KEY=your-wallet-private-key +SOLANA_ADMIN_PUBLIC_KEY=admin-public-key +SOLANA_ADMIN_PRIVATE_KEY=admin-private-key +SOLANA_VERIFY_TOKEN=verification-token +SOLANA_CLUSTER=devnet # or mainnet-beta + +# AWS Configuration +AWS_ACCESS_KEY_ID=your-aws-access-key +AWS_SECRET_ACCESS_KEY=your-aws-secret-key +AWS_REGION=aws-region +AWS_S3_BUCKET=bucket-name +``` + +## API Reference + +### Collection Management + +#### `createCollection` +Creates a new NFT collection with an AI-generated logo. + +```typescript +const result = await createCollection({ + runtime: runtimeInstance, + collectionName: "MyCollection", + fee: 0.01 // Optional: royalty fee percentage +}); +``` + +#### `createNFT` +Mints a new NFT in an existing collection. + +```typescript +const nft = await createNFT({ + runtime: runtimeInstance, + collectionName: "MyCollection", + collectionAddress: "collection123", + collectionAdminPublicKey: "admin123", + collectionFee: 0.01, + tokenId: 1 +}); +``` + +#### `verifyNFT` +Verifies an NFT as part of a collection. + +```typescript +const verification = await verifyNFT({ + runtime: runtimeInstance, + collectionAddress: "collection123", + NFTAddress: "nft123" +}); +``` + +## REST API Endpoints + +### POST `/api/nft-generation/create-collection` +Creates a new collection with generated logo. + +### POST `/api/nft-generation/create-nft` +Mints a new NFT with generated artwork. + +### POST `/api/nft-generation/create-nft-metadata` +Generates metadata for an NFT. + +### POST `/api/nft-generation/verify-nft` +Verifies an NFT's collection membership. + +## Example Workflow + +The plugin provides a streamlined process for generating and verifying NFT collections: + +```typescript +import { createCollection, createNFT, verifyNFT } from "./handlers"; + +const runtime = initializeRuntime(); // Replace with actual IAgentRuntime initialization + +(async () => { + // Step 1: Create Collection + const collectionResult = await createCollection({ + runtime, + collectionName: "MyUniqueCollection", + }); + + console.log("Collection created:", collectionResult); + + // Step 2: Create an NFT in the Collection + const nftResult = await createNFT({ + runtime, + collectionName: "MyUniqueCollection", + collectionAddress: collectionResult.address, + collectionAdminPublicKey: collectionResult.collectionInfo.adminPublicKey, + collectionFee: 0.01, + tokenId: 1, + }); + + console.log("NFT created:", nftResult); + + // Step 3: Verify the NFT + const verificationResult = await verifyNFT({ + runtime, + collectionAddress: collectionResult.address, + NFTAddress: nftResult.address, + }); + console.log("NFT verified:", verificationResult); +})(); +``` + +## Example Prompts + +Here are some examples of user prompts to trigger NFT collection generation: + +- "Generate a collection named MyCollection." +- "Create a new NFT collection." +- "Compile an NFT collection for me." +- "Build a sci-fi themed collection." + +## Local Testing with TEE Simulator + +To test locally using a Trusted Execution Environment (TEE) simulator: + +1. Pull the simulator Docker image: +```bash +docker pull phalanetwork/tappd-simulator:latest +``` + +2. Run the simulator: +```bash +docker run --rm -p 8090:8090 phalanetwork/tappd-simulator:latest +``` + +3. Update your environment variable for the simulator: +```env +DSTACK_SIMULATOR_ENDPOINT="http://localhost:8090" +``` + +## Security Best Practices + +1. **Key Management** + - Store private keys securely + - Use environment variables + - Implement key rotation + - Monitor wallet activity + +2. **Asset Security** + - Secure S3 bucket configuration + - Implement proper CORS policies + - Use secure URLs for metadata + - Regular backup of assets + +3. **Transaction Safety** + - Validate all inputs + - Implement fee limits + - Double-check collection ownership + - Monitor transaction status + +4. **Error Handling** + - Log all operations + - Handle timeouts gracefully + - Validate metadata + - Provide clear error messages + +## Dependencies + +- @elizaos/core: workspace:* +- @elizaos/plugin-image-generation: workspace:* +- @elizaos/plugin-node: workspace:* +- @metaplex-foundation/mpl-token-metadata: ^3.3.0 +- @solana/web3.js: 1.95.5 +- express: 4.21.1 +- node-cache: 5.1.2 + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with: +- [Solana Blockchain](https://solana.com) +- [Metaplex Protocol](https://www.metaplex.com) +- AWS S3 for asset storage diff --git a/packages/plugin-nft-generation/Readme.md b/packages/plugin-nft-generation/Readme.md deleted file mode 100644 index 2944713942..0000000000 --- a/packages/plugin-nft-generation/Readme.md +++ /dev/null @@ -1,185 +0,0 @@ -### NFT Collection Generation Plugin - -A plugin for handling NFT collection generation, NFT creation, and verification on the Solana blockchain. - -## Handlers - -### createCollection -The createCollection handler generates an NFT collection logo, uploads it to AWS S3, and creates a Solana blockchain collection. - -#### Usage -```typescript -import { createCollection } from "./handlers/createCollection.ts"; - -const result = await createCollection({ - runtime: runtimeInstance, // An instance of IAgentRuntime - collectionName: "MyCollection", // The name of the collection - fee: 0.01, // (Optional) Fee for transactions -}); - -console.log("Collection created:", result); -``` - -#### Features - -Image Generation: Automatically generates a collection logo based on the provided name and theme. -AWS S3 Integration: Uploads the generated logo and metadata to AWS S3. -Solana Blockchain: Creates a collection with the generated logo and metadata on the Solana blockchain. -### createNFT -The createNFT handler generates individual NFTs for a collection. It includes metadata creation and uploads the NFT information to AWS S3. - -#### Usage - -```typescript -import { createNFT } from "./handlers/createNFT.ts"; - -const nftResult = await createNFT({ - runtime: runtimeInstance, - collectionName: "MyCollection", - collectionAddress: "collectionAddress123", - collectionAdminPublicKey: "adminPublicKey123", - collectionFee: 0.01, - tokenId: 1, -}); - -console.log("NFT created:", nftResult); -``` - -### verifyNFT - -The verifyNFT handler verifies an NFT against its collection using the Solana blockchain. - -#### Usage - -```typescript -import { verifyNFT } from "./handlers/verifyNFT.ts"; - -const verificationResult = await verifyNFT({ - runtime: runtimeInstance, - collectionAddress: "collectionAddress123", - NFTAddress: "NFTAddress123", -}); - -console.log("NFT verified:", verificationResult); -```` ---- - -### Example Workflow - -The plugin provides a streamlined process for generating and verifying NFT collections: - -```typescript -import { createCollection, createNFT, verifyNFT } from "./handlers"; - -const runtime = initializeRuntime(); // Replace with actual IAgentRuntime initialization - -(async () => { - // Step 1: Create Collection - const collectionResult = await createCollection({ - runtime, - collectionName: "MyUniqueCollection", - }); - - console.log("Collection created:", collectionResult); - - // Step 2: Create an NFT in the Collection - const nftResult = await createNFT({ - runtime, - collectionName: "MyUniqueCollection", - collectionAddress: collectionResult.address, - collectionAdminPublicKey: collectionResult.collectionInfo.adminPublicKey, - collectionFee: 0.01, - tokenId: 1, - }); - - console.log("NFT created:", nftResult); - - // Step 3: Verify the NFT - const verificationResult = await verifyNFT({ - runtime, - collectionAddress: collectionResult.address, - NFTAddress: nftResult.address, - }); - - console.log("NFT verified:", verificationResult); -})(); -``` - -### Configuration - -#### Environment Variables -``` -Ensure the following environment variables are set for proper functionality: - -Variable Name Description -AWS_ACCESS_KEY_ID AWS access key for S3 uploads -AWS_SECRET_ACCESS_KEY AWS secret key for S3 uploads -AWS_REGION AWS region where S3 is located -AWS_S3_BUCKET Name of the AWS S3 bucket -SOLANA_PUBLIC_KEY Public key for Solana blockchain -SOLANA_PRIVATE_KEY Private key for Solana blockchain -SOLANA_ADMIN_PUBLIC_KEY Admin public key for Solana operations -SOLANA_ADMIN_PRIVATE_KEY Admin private key for Solana operations -``` -#### Example Prompts - -Here are some examples of user prompts to trigger NFT collection generation: - -"Generate a collection named MyCollection." -"Create a new NFT collection." -"Compile an NFT collection for me." -"Build a sci-fi themed collection." - - -#### Local Testing with TEE Simulator - -To test locally using a Trusted Execution Environment (TEE) simulator, follow these steps: - -Pull the simulator Docker image: -``` bash -docker pull phalanetwork/tappd-simulator:latest -``` -Run the simulator: - -``` bash -docker run --rm -p 8090:8090 phalanetwork/tappd-simulator:latest -``` -Update your environment variable for the simulator: - -```env -DSTACK_SIMULATOR_ENDPOINT="http://localhost:8090" -``` - -#### Dependencies - -This plugin relies on the following services and libraries: - -[@elizaos/plugin-node] -[@elizaos/eliza] -[@elizaos/plugin-image-generation] -[@solana/web3.js] - -### Action Configuration - -#### GENERATE_COLLECTION -The action for generating NFT collections is configured with the following parameters: - -```typescript -const nftCollectionGeneration: Action = { - name: "GENERATE_COLLECTION", - description: "Generate an NFT collection for the message", - handler: async (runtime, message, state, options, callback) => { - // Implementation - }, - examples: [ - { - user: "{{user1}}", - content: { text: "Generate a collection named Galaxy." }, - }, - { - agent: "{{agentName}}", - content: { text: "The collection Galaxy has been successfully created." }, - }, - ], -}; -``` diff --git a/packages/plugin-node/README.md b/packages/plugin-node/README.md new file mode 100644 index 0000000000..518ec77e3c --- /dev/null +++ b/packages/plugin-node/README.md @@ -0,0 +1,227 @@ +# @elizaos/plugin-node + +Core Node.js plugin for Eliza OS that provides essential services and actions for file operations, media processing, and cloud integrations. + +## Overview + +The Node plugin serves as a foundational component of Eliza OS, bridging core Node.js capabilities with the Eliza ecosystem. It provides crucial services for file operations, media processing, speech synthesis, and cloud integrations, enabling both local and cloud-based functionality for Eliza agents. + + +## Features + +- **AWS S3 Integration**: File upload and management with AWS S3 +- **Browser Automation**: Web scraping and content extraction with Playwright +- **Image Processing**: Image description and analysis capabilities +- **PDF Processing**: PDF text extraction and parsing +- **Speech Synthesis**: Text-to-speech using ElevenLabs and VITS +- **Transcription**: Speech-to-text using various providers (OpenAI, Deepgram, Local) +- **Video Processing**: YouTube video download and transcription +- **LLaMA Integration**: Local LLM support with LLaMA models + +## Installation + +```bash +npm install @elizaos/plugin-node +``` + +## Configuration + +The plugin requires various environment variables depending on which services you plan to use: + +### Core Settings +```env +OPENAI_API_KEY=your_openai_api_key +``` + +### Voice Settings (Optional) +```env +ELEVENLABS_XI_API_KEY=your_elevenlabs_api_key +ELEVENLABS_MODEL_ID=eleven_monolingual_v1 +ELEVENLABS_VOICE_ID=your_voice_id +ELEVENLABS_VOICE_STABILITY=0.5 +ELEVENLABS_VOICE_SIMILARITY_BOOST=0.75 +ELEVENLABS_OPTIMIZE_STREAMING_LATENCY=0 +ELEVENLABS_OUTPUT_FORMAT=pcm_16000 +VITS_VOICE=en_US-hfc_female-medium +``` + +### AWS Settings (Optional) +```env +AWS_ACCESS_KEY_ID=your_aws_access_key +AWS_SECRET_ACCESS_KEY=your_aws_secret_key +AWS_REGION=your_aws_region +AWS_S3_BUCKET=your_s3_bucket +AWS_S3_UPLOAD_PATH=your_upload_path +``` + +## Usage + +```typescript +import { createNodePlugin } from "@elizaos/plugin-node"; + +// Initialize the plugin +const nodePlugin = createNodePlugin(); + +// Register with Eliza OS +elizaOS.registerPlugin(nodePlugin); +``` + +## Services + +### AwsS3Service +Handles file uploads and management with AWS S3. + +### BrowserService +Provides web scraping and content extraction capabilities using Playwright. + +### ImageDescriptionService +Processes and analyzes images to generate descriptions. + +### LlamaService +Provides local LLM capabilities using LLaMA models. + +### PdfService +Extracts and processes text content from PDF files. + +### SpeechService +Handles text-to-speech conversion using ElevenLabs and VITS. + +### TranscriptionService +Converts speech to text using various providers. + +### VideoService +Processes video content, including YouTube video downloads and transcription. + +## Actions + +### describeImage +Analyzes and generates descriptions for images. + +```typescript +// Example usage +const result = await runtime.executeAction("DESCRIBE_IMAGE", { + imageUrl: "path/to/image.jpg" +}); +``` + +## Dependencies + +The plugin requires several peer dependencies: +- `onnxruntime-node`: 1.20.1 +- `whatwg-url`: 7.1.0 + +And trusted dependencies: +- `onnxruntime-node`: 1.20.1 +- `sharp`: 0.33.5 + +## Safety & Security + +### File Operations +- **Path Sanitization**: All file paths are sanitized to prevent directory traversal attacks +- **File Size Limits**: Enforced limits on upload sizes +- **Type Checking**: Strict file type validation +- **Temporary File Cleanup**: Automatic cleanup of temporary files + +### API Keys & Credentials +- **Environment Isolation**: Sensitive credentials are isolated in environment variables +- **Access Scoping**: Services are initialized with minimum required permissions +- **Key Rotation**: Support for credential rotation without service interruption + +### Media Processing +- **Resource Limits**: Memory and CPU usage limits for media processing +- **Timeout Controls**: Automatic termination of long-running processes +- **Format Validation**: Strict media format validation before processing + +## Troubleshooting + +### Common Issues + +1. **Service Initialization Failures** +```bash +Error: Service initialization failed +``` +- Verify environment variables are properly set +- Check service dependencies are installed +- Ensure sufficient system permissions + +2. **Media Processing Errors** +```bash +Error: Failed to process media file +``` +- Verify file format is supported +- Check available system memory +- Ensure ffmpeg is properly installed + +3. **AWS S3 Connection Issues** +```bash +Error: AWS credentials not configured +``` +- Verify AWS credentials are set +- Check S3 bucket permissions +- Ensure correct region configuration + +### Debug Mode + +Enable debug logging for detailed troubleshooting: +```typescript +process.env.DEBUG = 'eliza:plugin-node:*'; +``` + +### System Requirements + +- Node.js 16.x or higher +- FFmpeg for media processing +- Minimum 4GB RAM recommended +- CUDA-compatible GPU (optional, for ML features) + +### Performance Optimization + +1. **Cache Management** + - Regular cleanup of `content_cache` directory + - Implement cache size limits + - Monitor disk usage + +2. **Memory Usage** + - Configure max buffer sizes + - Implement streaming for large files + - Monitor memory consumption + +3. **Concurrent Operations** + - Adjust queue size limits + - Configure worker threads + - Monitor process pool + +## Support + +For issues and feature requests, please: +1. Check the troubleshooting guide above +2. Review existing GitHub issues +3. Submit a new issue with: + - System information + - Error logs + - Steps to reproduce + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Node.js](https://nodejs.org/) - The core runtime environment +- [FFmpeg](https://ffmpeg.org/) - Media processing capabilities +- [ElevenLabs](https://elevenlabs.io/) - Voice synthesis +- [OpenAI](https://openai.com/) - Transcription and AI services +- [AWS S3](https://aws.amazon.com/s3/) - Cloud storage +- [Playwright](https://playwright.dev/) - Browser automation +- [LLaMA](https://github.com/facebookresearch/llama) - Local language models +- [VITS](https://github.com/jaywalnut310/vits) - Voice synthesis +- [Deepgram](https://deepgram.com/) - Speech recognition +- [Sharp](https://sharp.pixelplumbing.com/) - Image processing + +Special thanks to the Node.js community and all the open-source contributors who make these integrations possible. \ No newline at end of file diff --git a/packages/plugin-solana/README.MD b/packages/plugin-solana/README.MD new file mode 100644 index 0000000000..9ff8634b31 --- /dev/null +++ b/packages/plugin-solana/README.MD @@ -0,0 +1,312 @@ +# @elizaos/plugin-solana + +Core Solana blockchain plugin for Eliza OS that provides essential services and actions for token operations, trading, and DeFi integrations. + +## Overview + +The Solana plugin serves as a foundational component of Eliza OS, bridging Solana blockchain capabilities with the Eliza ecosystem. It provides crucial services for token operations, trading, portfolio management, and DeFi integrations, enabling both automated and user-directed interactions with the Solana blockchain. + +## Features + +### Token Operations +- **Token Creation**: Deploy new tokens with customizable metadata +- **Token Transfers**: Send and receive tokens securely +- **Balance Management**: Track and manage token balances +- **Portfolio Analytics**: Real-time portfolio valuation and tracking + +### Trading Operations +- **Token Swaps**: Execute trades between tokens using Jupiter aggregator +- **Order Management**: Place and track token orders +- **Price Monitoring**: Real-time price feeds and historical data +- **Automated Trading**: Configurable trading strategies and automation + +### DeFi Integration +- **Liquidity Analysis**: Monitor and analyze pool liquidity +- **Market Making**: Automated market making capabilities +- **Yield Optimization**: Smart routing for optimal yields +- **Risk Management**: Advanced risk scoring and monitoring + +### Trust & Security +- **Trust Scoring**: Dynamic trust score calculation for tokens +- **Risk Assessment**: Real-time risk evaluation for trades +- **Performance Tracking**: Historical performance monitoring +- **Simulation Mode**: Test strategies without real transactions + +## Security Features + +### Access Control +- **Wallet Management**: Secure wallet key derivation and storage +- **Permission Scoping**: Granular control over trading permissions +- **TEE Integration**: Trusted Execution Environment support +- **Key Protection**: Secure private key handling + +### Risk Management +- **Trade Limits**: Configurable transaction limits +- **Slippage Protection**: Automatic slippage controls +- **Validation Checks**: Multi-level transaction validation +- **Simulation Support**: Pre-execution transaction simulation +## Installation + +```bash +npm install @elizaos/plugin-solana +``` + +## Configuration + +Configure the plugin by setting the following environment variables: + +```typescript +const solanaEnvSchema = { + WALLET_SECRET_SALT: string (optional), + WALLET_SECRET_KEY: string, + WALLET_PUBLIC_KEY: string, + SOL_ADDRESS: string, + SLIPPAGE: string, + RPC_URL: string, + HELIUS_API_KEY: string, + BIRDEYE_API_KEY: string +} +``` + +## Usage + +### Basic Setup +```typescript +import { solanaPlugin } from "@elizaos/plugin-solana"; + +// Initialize the plugin +const runtime = await initializeRuntime({ + plugins: [solanaPlugin] +}); +``` + +### Services + +#### TokenProvider +Manages token operations and information retrieval. +```typescript +const tokenProvider = new TokenProvider(tokenAddress, walletProvider, cacheManager); +await tokenProvider.getTokensInWallet(runtime); +``` + +#### WalletProvider +Handles wallet operations and portfolio management. +```typescript +const walletProvider = new WalletProvider(connection, publicKey); +await walletProvider.getFormattedPortfolio(runtime); +``` + +#### TrustScoreProvider +Evaluates and manages trust scores for tokens and trading activities. +```typescript +const trustScore = await runtime.getProvider("trustScore"); +``` +## Actions + +### executeSwap +Executes a token swap using Jupiter aggregator. + +```typescript +// Example usage +const result = await runtime.executeAction("EXECUTE_SWAP", { + inputTokenSymbol: "SOL", + outputTokenSymbol: "USDC", + amount: 0.1 +}); +``` + +### transferToken +Transfers tokens between wallets. + +```typescript +// Example usage +const result = await runtime.executeAction("TRANSFER_TOKEN", { + tokenAddress: "TokenAddressHere", + recipient: "RecipientAddressHere", + amount: "1000" +}); +``` + +### takeOrder +Places a buy order based on conviction level. + +```typescript +// Example usage +const result = await runtime.executeAction("TAKE_ORDER", { + ticker: "SOL", + contractAddress: "ContractAddressHere" +}); +``` + +### pumpfun +Creates and buys tokens on pump.fun. + +```typescript +// Example usage +const result = await runtime.executeAction("CREATE_AND_BUY_TOKEN", { + tokenMetadata: { + name: "TokenName", + symbol: "SYMBOL", + description: "Token description", + image_description: "Image description" + }, + buyAmountSol: 0.1 +}); +``` + +### fomo +Creates and buys tokens on fomo.fund. + +```typescript +// Example usage +const result = await runtime.executeAction("CREATE_AND_BUY_TOKEN", { + tokenMetadata: { + name: "TokenName", + symbol: "SYMBOL", + description: "Token description", + image_description: "Image description" + }, + buyAmountSol: 0.1, + requiredLiquidity: 1000 +}); +``` +### executeSwapForDAO +Executes token swaps for DAO operations. + +```typescript +// Example usage +const result = await runtime.executeAction("EXECUTE_SWAP_DAO", { + inputTokenSymbol: "SOL", + outputTokenSymbol: "USDC", + amount: 0.1 +}); +``` + +## Performance Optimization + +1. **Cache Management** + - Implement token data caching + - Configure cache TTL settings + - Monitor cache hit rates + +2. **RPC Optimization** + - Use connection pooling + - Implement request batching + - Monitor RPC usage + +3. **Transaction Management** + - Optimize transaction bundling + - Implement retry strategies + - Monitor transaction success rates + + +## System Requirements + +- Node.js 16.x or higher +- Solana CLI tools (optional) +- Minimum 4GB RAM recommended +- Stable internet connection +- Access to Solana RPC endpoint + +## Troubleshooting + +### Common Issues + +1. **Wallet Connection Failures** +```bash +Error: Failed to connect to wallet +``` +- Verify RPC endpoint is accessible +- Check wallet configuration settings +- Ensure proper network selection + +2. **Transaction Errors** +```bash +Error: Transaction simulation failed +``` +- Check account balances +- Verify transaction parameters +- Ensure proper fee configuration + +3. **Price Feed Issues** +```bash +Error: Unable to fetch price data +``` +- Verify API key configuration +- Check network connectivity +- Ensure price feed service status + +## Safety & Security +### Best Practices +1. **Environment Variables** + - Store sensitive keys in environment variables + - Use .env.example for non-sensitive defaults + - Never commit real credentials to version control + +2. **Transaction Limits** + - Set maximum transaction amounts + - Implement daily trading limits + - Configure per-token restrictions + +3. **Monitoring** + - Track failed transaction attempts + - Monitor unusual trading patterns + - Log security-relevant events + +4. **Recovery** + - Implement transaction rollback mechanisms + - Maintain backup RPC endpoints + - Document recovery procedures + + +## Performance Optimization + +1. **Cache Management** + - Implement token data caching + - Configure cache TTL settings + - Monitor cache hit rates + +2. **RPC Optimization** + - Use connection pooling + - Implement request batching + - Monitor RPC usage + +3. **Transaction Management** + - Optimize transaction bundling + - Implement retry strategies + - Monitor transaction success rates + +## Support + +For issues and feature requests, please: +1. Check the troubleshooting guide above +2. Review existing GitHub issues +3. Submit a new issue with: + - System information + - Error logs + - Steps to reproduce + - Transaction IDs (if applicable) + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Solana](https://solana.com/) - The core blockchain platform +- [Solana Web3.js](https://github.com/solana-labs/solana-web3.js) - Core Solana interactions +- [SPL Token](https://spl.solana.com/) - Token program interactions +- [Jupiter](https://jup.ag/) - Token swap aggregation +- [Birdeye](https://birdeye.so/) - Price feeds and analytics +- [Helius](https://helius.xyz/) - Enhanced RPC services +- [Anchor](https://project-serum.github.io/anchor/) - Smart contract framework +- [FOMO](https://fomo.fund/) - Token creation and trading +- [Pump.fun](https://pump.fun/) - Token creation and trading + +Special thanks to the Solana ecosystem and all the open-source contributors who make these integrations possible. diff --git a/packages/plugin-starknet/README.md b/packages/plugin-starknet/README.md new file mode 100644 index 0000000000..e666291b55 --- /dev/null +++ b/packages/plugin-starknet/README.md @@ -0,0 +1,148 @@ +# @elizaos/plugin-starknet + +Core Starknet blockchain plugin for Eliza OS that provides essential services and actions for token operations, trading, and DeFi integrations. + +## Overview + +The Starknet plugin serves as a foundational component of Eliza OS, bridging Starknet blockchain capabilities with the Eliza ecosystem. It provides crucial services for token operations, trading, portfolio management, and DeFi integrations, enabling both automated and user-directed interactions with the Starknet blockchain. + +## Features + +### Token Operations +- **Token Creation**: Deploy new unruggable tokens with customizable metadata +- **Token Transfers**: Send and receive tokens securely +- **Balance Management**: Track and manage token balances +- **Portfolio Analytics**: Real-time portfolio valuation and tracking + +### Trading Operations +- **Token Swaps**: Execute token swaps through aggregated DEX liquidity +- **Order Management**: Place and manage trading orders +- **Price Monitoring**: Track token prices and market movements +- **Trust Score Analysis**: Evaluate token and trader reliability + +### DeFi Integration +- **Liquidity Management**: Monitor and manage liquidity positions +- **Yield Optimization**: Track and optimize yield farming opportunities +- **Risk Assessment**: Analyze and monitor DeFi protocol risks +- **Performance Tracking**: Monitor investment performance metrics + +## Configuration + +The plugin requires the following environment variables: + +```typescript +STARKNET_ADDRESS=your_starknet_address +STARKNET_PRIVATE_KEY=your_private_key +STARKNET_RPC_URL=your_rpc_url +``` + +## Actions + +### deployToken +Deploys a new unruggable token on Starknet. + +```typescript +// Example usage +const result = await runtime.executeAction("DEPLOY_STARKNET_UNRUGGABLE_MEME_TOKEN", { + name: "TokenName", + symbol: "TKN", + owner: "OwnerAddressHere", + initialSupply: "1000000000000000000" +}); +``` + +### transferToken +Transfers tokens between wallets. + +```typescript +// Example usage +const result = await runtime.executeAction("TRANSFER_TOKEN", { + tokenAddress: "TokenAddressHere", + recipient: "RecipientAddressHere", + amount: "1000" +}); +``` + +### executeSwap +Executes a token swap on Starknet. + +```typescript +// Example usage +const result = await runtime.executeAction("EXECUTE_STARKNET_SWAP", { + sellTokenAddress: "SellTokenAddressHere", + buyTokenAddress: "BuyTokenAddressHere", + sellAmount: "1000000000000000000" +}); +``` + +### transferSubdomain +Creates and transfers a subdomain. + +```typescript +// Example usage +const result = await runtime.executeAction("CREATE_SUBDOMAIN", { + subdomain: "subdomain.domain.stark", + recipient: "RecipientAddressHere" +}); +``` + +## Security Considerations + +1. **Access Control** + - Validate transaction signers + - Implement role-based permissions + - Secure private key storage + +2. **Transaction Limits** + - Set maximum transaction amounts + - Implement daily trading limits + - Configure per-token restrictions + +3. **Monitoring** + - Track failed transaction attempts + - Monitor unusual trading patterns + - Log security-relevant events + +4. **Recovery** + - Implement transaction rollback mechanisms + - Maintain backup RPC endpoints + - Document recovery procedures + +## Performance Optimization + +1. **Cache Management** + - Implement token data caching + - Configure cache TTL settings + - Monitor cache hit rates + +2. **RPC Optimization** + - Use connection pooling + - Implement request batching + - Monitor RPC usage + +3. **Transaction Management** + - Batch similar transactions + - Optimize gas usage + - Handle transaction retries + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Starknet](https://starknet.io/) - The core blockchain platform +- [Starknet.js](https://github.com/starknet-io/starknet.js) - Core Starknet interactions +- [Unruggable](https://unruggable.meme/) - Token creation and security +- [Ekubo](https://www.ekubo.org/) - DEX integrations +- [Avnu](https://avnu.fi/) - Token swap aggregation +- [Birdeye](https://birdeye.so/) - Price feeds and analytics +- [Helius](https://helius.xyz/) - Enhanced RPC services + +Special thanks to the Starknet ecosystem and all the open-source contributors who make these integrations possible. diff --git a/packages/plugin-starknet/readme.md b/packages/plugin-starknet/readme.md deleted file mode 100644 index 799d6592ab..0000000000 --- a/packages/plugin-starknet/readme.md +++ /dev/null @@ -1,17 +0,0 @@ -# Starknet Plugin - -## Overview - -This plugin aims to be the basis of all interactions with the Starknet ecosystem. It contains utilities along with actions for DeFi protocols. - -## Adding a new action - -Reuse providers and utilities from the existing actions where possible. Add more utilities if you think they will be useful for other actions. - -1. Add the action to the `actions` directory. Try to follow the naming convention of the other actions. -2. Export the action in the `index.ts` file. - -## TODO: - -1. Ekubo DCA -2. Unruggable diff --git a/packages/plugin-story/README.md b/packages/plugin-story/README.md new file mode 100644 index 0000000000..9f8661626d --- /dev/null +++ b/packages/plugin-story/README.md @@ -0,0 +1,228 @@ +# @elizaos/plugin-story + +The Story Protocol plugin enables interaction with Story Protocol's IP management and licensing system on the Odyssey testnet. + +## Overview + +This plugin provides functionality to: +- Register IP assets on Story Protocol +- License IP assets +- Attach license terms to IP assets +- Query IP asset details and available licenses +- Manage wallet interactions with Story Protocol + +## Installation + +```bash +npm install @elizaos/plugin-story +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +STORY_PRIVATE_KEY=your_private_key +STORY_API_KEY=your_api_key +STORY_API_BASE_URL=https://api.story.xyz +PINATA_JWT=your_pinata_jwt_token +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { storyPlugin } from "@elizaos/plugin-story"; + +export default { + plugins: [storyPlugin], + // ... other configuration +}; +``` + +## Features + +### Register IP + +Register a new IP asset on Story Protocol: + +```typescript +// Example conversation +User: "I want to register my IP titled 'My Story' with the description 'An epic tale'" +Assistant: "I'll help you register your IP on Story Protocol..." +``` + +### License IP + +License an existing IP asset: + +```typescript +// Example conversation +User: "I want to license IP Asset 0x1234...5678 with license terms ID 1" +Assistant: "I'll help you license that IP asset..." +``` + +### Attach Terms + +Attach license terms to an IP asset: + +```typescript +// Example conversation +User: "I want to attach commercial license terms with 10% revenue share to IP 0x1234...5678" +Assistant: "I'll help you attach those license terms..." +``` + +### Get IP Details + +Query details about an IP asset: + +```typescript +// Example conversation +User: "Get details for IP Asset 0x1234...5678" +Assistant: "Here are the details for that IP asset..." +``` + +### Get Available Licenses + +Query available licenses for an IP asset: + +```typescript +// Example conversation +User: "What licenses are available for IP Asset 0x1234...5678?" +Assistant: "Here are the available licenses..." +``` + +## API Reference + +### Actions + +- `REGISTER_IP`: Register a new IP asset +- `LICENSE_IP`: License an existing IP asset +- `ATTACH_TERMS`: Attach license terms to an IP +- `GET_IP_DETAILS`: Get details about an IP +- `GET_AVAILABLE_LICENSES`: Get available licenses for an IP + +### Providers + +- `storyWalletProvider`: Manages wallet interactions with Story Protocol + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +## Dependencies + +- `@story-protocol/core-sdk`: Core SDK for Story Protocol +- `@pinata/sdk`: IPFS pinning service +- `viem`: Ethereum interaction library +- Other standard dependencies listed in package.json + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **IP Management** + - Batch IP registration + - Advanced metadata management + - IP relationship mapping + - Automated IP verification + - Collection management + - IP analytics dashboard + +2. **Licensing Features** + - Custom license templates + - License negotiation tools + - Automated royalty distribution + - Usage tracking system + - License violation detection + - Bulk licensing tools + +3. **Rights Management** + - Advanced permission systems + - Rights transfer automation + - Usage rights tracking + - Derivative works management + - Rights verification tools + - Dispute resolution system + +4. **Smart Contract Integration** + - Contract deployment templates + - Automated verification + - Contract upgrade system + - Security analysis tools + - Gas optimization + - Multi-signature support + +5. **Content Management** + - Media file handling + - Content versioning + - Distribution tracking + - Content authentication + - Storage optimization + - Format conversion tools + +6. **Revenue Management** + - Automated payments + - Revenue sharing tools + - Payment tracking + - Financial reporting + - Tax documentation + - Audit trail system + +7. **Developer Tools** + - Enhanced SDK features + - Testing framework + - Documentation generator + - CLI improvements + - Integration templates + - Performance monitoring + +8. **Analytics and Reporting** + - Usage statistics + - Revenue analytics + - License tracking + - Performance metrics + - Custom reporting + - Market analysis tools + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Story Protocol](https://www.story.xyz/): IP management and licensing platform +- [@story-protocol/core-sdk](https://www.npmjs.com/package/@story-protocol/core-sdk): Official Story Protocol SDK +- [@pinata/sdk](https://www.npmjs.com/package/@pinata/sdk): IPFS pinning service +- [viem](https://www.npmjs.com/package/viem): Ethereum interaction library + +Special thanks to: +- The Story Protocol team for developing the IP management platform +- The Story Protocol Developer community +- The Pinata team for IPFS infrastructure +- The Eliza community for their contributions and feedback + +For more information about Story Protocol capabilities: +- [Story Protocol Documentation](https://docs.story.xyz/) +- [Story Protocol Dashboard](https://app.story.xyz/) +- [Story Protocol Blog](https://www.story.xyz/blog) +- [Story Protocol GitHub](https://github.com/storyprotocol) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-sui/README.md b/packages/plugin-sui/README.md new file mode 100644 index 0000000000..a903f0dc69 --- /dev/null +++ b/packages/plugin-sui/README.md @@ -0,0 +1,165 @@ +# @elizaos/plugin-sui + +Core Sui blockchain plugin for Eliza OS that provides essential services and actions for token operations and wallet management. + +## Overview + +This plugin provides functionality to: +- Transfer SUI tokens between wallets +- Query wallet balances and portfolio values +- Track token prices and valuations +- Manage wallet interactions with the Sui network + +## Installation + +```bash +npm install @elizaos/plugin-sui +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +SUI_PRIVATE_KEY=your_private_key +SUI_NETWORK=mainnet|testnet|devnet|localnet +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { suiPlugin } from "@elizaos/plugin-sui"; + +export default { + plugins: [suiPlugin], + // ... other configuration +}; +``` + +## Features + +### Send Token + +Transfer SUI tokens to another address: + +```typescript +// Example conversation +User: "Send 1 SUI to 0x4f2e63be8e7fe287836e29cde6f3d5cbc96eefd0c0e3f3747668faa2ae7324b0" +Assistant: "I'll send 1 SUI token now..." +``` + +### Check Wallet Balance + +Query wallet balance and portfolio value: + +```typescript +// Example conversation +User: "What's my wallet balance?" +Assistant: "Your wallet contains 10.5 SUI ($42.00 USD)..." +``` + +## API Reference + +### Actions + +- `SEND_TOKEN`: Transfer SUI tokens to another address +- `TRANSFER_TOKEN`: Alias for SEND_TOKEN +- `SEND_SUI`: Alias for SEND_TOKEN +- `PAY`: Alias for SEND_TOKEN + +### Providers + +- `walletProvider`: Manages wallet interactions with the Sui network, including balance queries and portfolio tracking + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +## Dependencies + +- `@mysten/sui`: Core Sui blockchain interaction library +- `bignumber.js`: Precise number handling +- `node-cache`: Caching implementation +- Other standard dependencies listed in package.json + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Transaction Management** + - Batch transaction processing + - Transaction simulation + - Gas optimization strategies + - Custom transaction builders + - Advanced error handling + +2. **Wallet Integration** + - Multi-wallet support + - Hardware wallet integration + - Social recovery options + - Account abstraction + - Transaction history tracking + +3. **Smart Contract Features** + - Contract deployment tools + - Move module templates + - Testing framework + - Upgrade management + - Security analysis + +4. **Token Operations** + - Batch token transfers + - NFT support enhancement + - Token metadata handling + - Custom token standards + - Collection management + +5. **Developer Tools** + - Enhanced debugging + - CLI improvements + - Documentation generator + - Integration templates + - Performance monitoring + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Sui Blockchain](https://sui.io/): Next-generation smart contract platform +- [@mysten/sui.js](https://www.npmjs.com/package/@mysten/sui.js): Official Sui SDK +- [bignumber.js](https://github.com/MikeMcl/bignumber.js/): Precise number handling +- [node-cache](https://www.npmjs.com/package/node-cache): Caching implementation + +Special thanks to: +- The Mysten Labs team for developing Sui +- The Sui Developer community +- The Sui SDK maintainers +- The Eliza community for their contributions and feedback + +For more information about Sui blockchain capabilities: +- [Sui Documentation](https://docs.sui.io/) +- [Sui Developer Portal](https://sui.io/developers) +- [Sui Network Dashboard](https://suiscan.xyz/) +- [Sui GitHub Repository](https://github.com/MystenLabs/sui) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-tee/README.md b/packages/plugin-tee/README.md index c66bebf852..d5b70909da 100644 --- a/packages/plugin-tee/README.md +++ b/packages/plugin-tee/README.md @@ -1,16 +1,50 @@ -# Plugin TEE +# @elizaos/plugin-tee -A plugin for handling Trusted Execution Environment (TEE) operations. +A plugin for handling Trusted Execution Environment (TEE) operations, providing secure key derivation and remote attestation capabilities. -## Providers +## Overview -This plugin includes several providers for handling different TEE-related operations. +This plugin provides functionality to: +- Generate secure keys within a TEE environment +- Derive Ed25519 keypairs for Solana +- Derive ECDSA keypairs for Ethereum +- Generate remote attestation quotes +- Manage wallet interactions with TEE-derived keys -### DeriveKeyProvider +## Installation + +```bash +npm install @elizaos/plugin-tee +``` -The `DeriveKeyProvider` allows for secure key derivation within a TEE environment. It supports deriving keys for both Solana (Ed25519) and Ethereum (ECDSA) chains. +## Configuration -#### Usage +The plugin requires the following environment variables: + +```env +TEE_MODE=LOCAL|DOCKER|PRODUCTION +WALLET_SECRET_SALT=your_secret_salt # Required for single agent deployments +DSTACK_SIMULATOR_ENDPOINT=your-endpoint-url # Optional, for simulator purposes +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { teePlugin } from "@elizaos/plugin-tee"; + +export default { + plugins: [teePlugin], + // ... other configuration +}; +``` + +## Features + +### DeriveKeyProvider + +The `DeriveKeyProvider` allows for secure key derivation within a TEE environment: ```typescript import { DeriveKeyProvider } from "@elizaos/plugin-tee"; @@ -19,59 +53,52 @@ import { DeriveKeyProvider } from "@elizaos/plugin-tee"; const provider = new DeriveKeyProvider(); // Derive a raw key -try { - const rawKey = await provider.rawDeriveKey( - "/path/to/derive", - "subject-identifier" - ); - // rawKey is a DeriveKeyResponse that can be used for further processing - // to get the uint8Array do the following - const rawKeyArray = rawKey.asUint8Array(); -} catch (error) { - console.error("Raw key derivation failed:", error); -} +const rawKey = await provider.rawDeriveKey( + "/path/to/derive", + "subject-identifier" +); +// rawKey is a DeriveKeyResponse that can be used for further processing +const rawKeyArray = rawKey.asUint8Array(); // Derive a Solana keypair (Ed25519) -try { - const solanaKeypair = await provider.deriveEd25519Keypair( - "/path/to/derive", - "subject-identifier" - ); - // solanaKeypair can now be used for Solana operations -} catch (error) { - console.error("Solana key derivation failed:", error); -} +const solanaKeypair = await provider.deriveEd25519Keypair( + "/path/to/derive", + "subject-identifier" +); // Derive an Ethereum keypair (ECDSA) -try { - const evmKeypair = await provider.deriveEcdsaKeypair( - "/path/to/derive", - "subject-identifier" - ); - // evmKeypair can now be used for Ethereum operations -} catch (error) { - console.error("EVM key derivation failed:", error); -} +const evmKeypair = await provider.deriveEcdsaKeypair( + "/path/to/derive", + "subject-identifier" +); ``` ### RemoteAttestationProvider -The `RemoteAttestationProvider` allows for generating a remote attestation within a TEE environment. - -#### Usage +The `RemoteAttestationProvider` generates remote attestations within a TEE environment: ```typescript +import { RemoteAttestationProvider } from "@elizaos/plugin-tee"; + const provider = new RemoteAttestationProvider(); +const attestation = await provider.generateAttestation("your-report-data"); +``` -try { - const attestation = await provider.generateAttestation("your-report-data"); - console.log("Attestation:", attestation); -} catch (error) { - console.error("Failed to generate attestation:", error); -} +## Development + +### Building + +```bash +npm run build ``` -### Configuration +### Testing + +```bash +npm run test +``` + +## Local Development To get a TEE simulator for local testing, use the following commands: @@ -81,9 +108,117 @@ docker pull phalanetwork/tappd-simulator:latest docker run --rm -p 8090:8090 phalanetwork/tappd-simulator:latest ``` -When using the provider through the runtime environment, ensure the following settings are configured: +## Dependencies -```env -DSTACK_SIMULATOR_ENDPOINT="your-endpoint-url" # Optional, for simulator purposes if testing on mac or windows -WALLET_SECRET_SALT=your-secret-salt // Required to single agent deployments +- `@phala/dstack-sdk`: Core TEE functionality +- `@solana/web3.js`: Solana blockchain interaction +- `viem`: Ethereum interaction library +- Other standard dependencies listed in package.json + +## API Reference + +### Providers + +- `deriveKeyProvider`: Manages secure key derivation within TEE +- `remoteAttestationProvider`: Handles generation of remote attestation quotes +- `walletProvider`: Manages wallet interactions with TEE-derived keys + +### Types + +```typescript +enum TEEMode { + OFF = "OFF", + LOCAL = "LOCAL", // For local development with simulator + DOCKER = "DOCKER", // For docker development with simulator + PRODUCTION = "PRODUCTION" // For production without simulator +} + +interface RemoteAttestationQuote { + quote: string; + timestamp: number; +} ``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Key Management** + - Advanced key derivation schemes + - Multi-party computation support + - Key rotation automation + - Backup and recovery systems + - Hardware security module integration + - Custom derivation paths + +2. **Remote Attestation** + - Enhanced quote verification + - Multiple TEE provider support + - Automated attestation renewal + - Policy management system + - Compliance reporting + - Audit trail generation + +3. **Security Features** + - Memory encryption improvements + - Side-channel protection + - Secure state management + - Access control systems + - Threat detection + - Security monitoring + +4. **Chain Integration** + - Multi-chain support expansion + - Cross-chain attestation + - Chain-specific optimizations + - Custom signing schemes + - Transaction privacy + - Bridge security + +5. **Developer Tools** + - Enhanced debugging capabilities + - Testing framework + - Simulation environment + - Documentation generator + - Performance profiling + - Integration templates + +6. **Performance Optimization** + - Parallel processing + - Caching mechanisms + - Resource management + - Latency reduction + - Throughput improvements + - Load balancing + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Phala Network](https://phala.network/): Confidential smart contract platform +- [@phala/dstack-sdk](https://www.npmjs.com/package/@phala/dstack-sdk): Core TEE functionality +- [@solana/web3.js](https://www.npmjs.com/package/@solana/web3.js): Solana blockchain interaction +- [viem](https://www.npmjs.com/package/viem): Ethereum interaction library +- [Intel SGX](https://www.intel.com/content/www/us/en/developer/tools/software-guard-extensions/overview.html): Trusted Execution Environment technology + +Special thanks to: +- The Phala Network team for their TEE infrastructure +- The Intel SGX team for TEE technology +- The dStack SDK maintainers +- The Eliza community for their contributions and feedback + +For more information about TEE capabilities: +- [Phala Documentation](https://docs.phala.network/) +- [Intel SGX Documentation](https://www.intel.com/content/www/us/en/developer/tools/software-guard-extensions/documentation.html) +- [TEE Security Best Practices](https://docs.phala.network/developers/phat-contract/security-notes) +- [dStack SDK Reference](https://docs.phala.network/developers/dstack-sdk) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-ton/README.md b/packages/plugin-ton/README.md new file mode 100644 index 0000000000..d854c605a1 --- /dev/null +++ b/packages/plugin-ton/README.md @@ -0,0 +1,237 @@ +# @elizaos/plugin-ton + +A plugin for handling TON (Telegram Open Network) blockchain operations, providing wallet management and transfer capabilities. + +## Overview + +This plugin provides functionality to: +- Manage TON wallets and key derivation +- Execute secure token transfers +- Query wallet balances and portfolio information +- Format and cache transaction data +- Interface with TON blockchain via RPC endpoints + +## Installation + +```bash +npm install @elizaos/plugin-ton +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +TON_PRIVATE_KEY=your_mnemonic_phrase # Required - wallet mnemonic words +TON_RPC_URL=your_rpc_endpoint # Optional - defaults to mainnet RPC +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { tonPlugin } from "@elizaos/plugin-ton"; + +export default { + plugins: [tonPlugin], + // ... other configuration +}; +``` + +## Features + +### WalletProvider + +The `WalletProvider` manages wallet operations and portfolio tracking: + +```typescript +import { WalletProvider } from "@elizaos/plugin-ton"; + +// Initialize the provider +const provider = await initWalletProvider(runtime); + +// Get wallet balance +const balance = await provider.getWalletBalance(); + +// Get formatted portfolio +const portfolio = await provider.getFormattedPortfolio(runtime); +``` + +### TransferAction + +The `TransferAction` handles token transfers: + +```typescript +import { TransferAction } from "@elizaos/plugin-ton"; + +// Initialize transfer action +const action = new TransferAction(walletProvider); + +// Execute transfer +const hash = await action.transfer({ + recipient: "EQCGScrZe1xbyWqWDvdI6mzP-GAcAWFv6ZXuaJOuSqemxku4", + amount: "1.5" +}); +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +## Dependencies + +- `@ton/ton`: Core TON blockchain functionality +- `@ton/crypto`: Cryptographic operations +- `bignumber.js`: Precise number handling +- `node-cache`: Caching functionality +- Other standard dependencies listed in package.json + +## API Reference + +### Providers + +- `walletProvider`: Manages TON wallet operations +- `nativeWalletProvider`: Handles native TON token operations + +### Types + +```typescript +interface TransferContent { + recipient: string; + amount: string | number; +} + +interface WalletPortfolio { + totalUsd: string; + totalNativeToken: string; +} + +interface Prices { + nativeToken: { usd: string }; +} +``` + +### Configuration Constants + +```typescript +const PROVIDER_CONFIG = { + MAINNET_RPC: "https://toncenter.com/api/v2/jsonRPC", + STONFI_TON_USD_POOL: "EQCGScrZe1xbyWqWDvdI6mzP-GAcAWFv6ZXuaJOuSqemxku4", + CHAIN_NAME_IN_DEXSCREENER: "ton", + MAX_RETRIES: 3, + RETRY_DELAY: 2000, + TON_DECIMAL: BigInt(1000000000) +}; +``` + +## Common Issues/Troubleshooting + +### Issue: Balance Fetching Failure +- **Cause**: Incorrect RPC endpoint or network connectivity issues +- **Solution**: Verify `TON_RPC_URL` and network connection + +### Issue: Transfer Fails +- **Cause**: Insufficient balance or invalid recipient address +- **Solution**: Ensure sufficient funds and valid recipient address format + +## Security Best Practices + +- Store private keys securely using environment variables +- Validate all input addresses and amounts +- Use proper error handling for blockchain operations +- Keep dependencies updated for security patches + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Wallet Management** + - Multi-wallet support + - Hardware wallet integration + - Advanced key management + - Batch transaction processing + - Custom wallet contracts + - Recovery mechanisms + +2. **Smart Contract Integration** + - Contract deployment tools + - FunC contract templates + - Testing framework + - Upgrade management + - Gas optimization + - Security analysis + +3. **Token Operations** + - Jetton creation tools + - NFT support enhancement + - Token metadata handling + - Collection management + - Batch transfers + - Token standards + +4. **DeFi Features** + - DEX integration + - Liquidity management + - Yield farming tools + - Price feed integration + - Swap optimization + - Portfolio tracking + +5. **Developer Tools** + - Enhanced debugging + - CLI improvements + - Documentation generator + - Integration templates + - Performance monitoring + - Testing utilities + +6. **Network Features** + - Workchain support + - Sharding optimization + - RPC management + - Network monitoring + - Archive node integration + - Custom endpoints + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [TON Blockchain](https://ton.org/): The Open Network blockchain platform +- [@ton/ton](https://www.npmjs.com/package/@ton/ton): Core TON blockchain functionality +- [@ton/crypto](https://www.npmjs.com/package/@ton/crypto): Cryptographic operations +- [bignumber.js](https://github.com/MikeMcl/bignumber.js/): Precise number handling +- [node-cache](https://github.com/node-cache/node-cache): Caching functionality + +Special thanks to: +- The TON Foundation for developing and maintaining the TON blockchain +- The TON Developer community +- The TON SDK maintainers +- The Eliza community for their contributions and feedback + +For more information about TON blockchain capabilities: +- [TON Documentation](https://docs.ton.org/) +- [TON Developer Portal](https://ton.org/dev) +- [TON Whitepaper](https://ton.org/whitepaper.pdf) +- [TON API Reference](https://ton.org/docs/#/api) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-ton/Readme.md b/packages/plugin-ton/Readme.md deleted file mode 100644 index 604ac490a9..0000000000 --- a/packages/plugin-ton/Readme.md +++ /dev/null @@ -1,124 +0,0 @@ -# Plugin TON - -A plugin for handling TON (Telegram Open Network) blockchain operations, such as wallet management and transfers. - -## Overview and Purpose - -The Plugin TON provides a streamlined interface to interact with the TON blockchain. It simplifies wallet management and facilitates secure, efficient transfers while maintaining compatibility with TypeScript and modern JavaScript development practices. - -## Installation - -Install the plugin using npm: - -```bash -npm install plugin-ton -``` - -## Configuration Requirements - -Ensure your environment is set up with the necessary configuration files and environment variables. Update the `src/enviroment.ts` file or set environment variables directly for sensitive information. - -### Environment Variables - -| Variable Name | Description | -| ------------------------ | ------------------------------------- | -| `TON_API_ENDPOINT` | API endpoint for interacting with TON | -| `TON_WALLET_PRIVATE_KEY` | Private key for wallet operations | - -## Usage Examples - -### Importing the Plugin - -```typescript -import { WalletProvider, TransferAction } from 'plugin-ton'; - -// Initialize wallet provider -const wallet = new WalletProvider('YOUR_PRIVATE_KEY'); - -// Fetch wallet balance -const balance = await wallet.getBalance(); -console.log('Wallet Balance:', balance); - -// Transfer TON coins -const transfer = new TransferAction(wallet); -await transfer.execute({ - to: 'RECIPIENT_ADDRESS', - amount: 10, -}); -console.log('Transfer successful'); -``` - -## API Reference - -### WalletProvider - -#### Methods: - -- `constructor(privateKey: string)` - Initializes the wallet with a private key. -- `getBalance(): Promise` - Retrieves the wallet balance. - -### TransferAction - -#### Methods: - -- `constructor(wallet: WalletProvider)` - Initializes the transfer action. -- `execute({ to: string, amount: number }): Promise` - Executes a transfer of TON coins. - -## Common Issues/Troubleshooting - -### Issue: Balance Fetching Failure - -- **Cause**: Incorrect API endpoint or private key. -- **Solution**: Verify `TON_API_ENDPOINT` and private key in your configuration. - -### Issue: Transfer Fails - -- **Cause**: Insufficient balance or invalid recipient address. -- **Solution**: Ensure sufficient funds and a valid recipient address. - -## Additional Documentation - -### Examples Folder Documentation - -The examples folder includes sample scripts demonstrating wallet initialization, balance checking, and transfers. Use these as a starting point for your integration. - -### Testing Guide Expansion - -Run tests using the following command: - -```bash -npm test -``` - -The `src/tests/wallet.test.ts` file provides unit tests for wallet functionality. Add tests for additional features as needed. - -### Plugin Development Guide - -1. Clone the repository. -2. Run `npm install` to install dependencies. -3. Use `tsup` for building the project: `npm run build`. -4. Add new features in the `src` directory. - -### Security Best Practices - -- **Key Management**: Use environment variables for sensitive information like private keys. -- **Testing**: Validate all inputs to prevent injection attacks. -- **Dependencies**: Regularly update dependencies to patch vulnerabilities. - -### Performance Optimization Guide - -- Use efficient data structures for large transactions. -- Avoid unnecessary API calls by caching frequent responses. -- Use async/await for optimal asynchronous operations. - -## Contributing - -1. Fork the repository. -2. Create your feature branch (`git checkout -b feature/amazing-feature`). -3. Commit your changes (`git commit -m 'Add some amazing feature'`). -4. Push to the branch (`git push origin feature/amazing-feature`). -5. Open a Pull Request. - -## License - -MIT diff --git a/packages/plugin-trustdb/README.md b/packages/plugin-trustdb/README.md new file mode 100644 index 0000000000..5d8b3acf26 --- /dev/null +++ b/packages/plugin-trustdb/README.md @@ -0,0 +1,214 @@ +# @elizaos/plugin-trustdb + +A plugin for managing trust scores and performance metrics in a secure database, providing recommender tracking and token performance analysis capabilities. + +## Overview + +This plugin provides functionality to: +- Track and manage recommender trust scores +- Monitor token performance metrics +- Record and analyze trading performance +- Maintain historical metrics data +- Handle transaction records and validations + +## Installation + +```bash +npm install @elizaos/plugin-trustdb +``` + +## Configuration + +The plugin uses SQLite as its database backend and requires proper initialization: + +```typescript +import { TrustScoreDatabase } from "@elizaos/plugin-trustdb"; +import Database from "better-sqlite3"; + +const db = new Database("path/to/database.sqlite"); +const trustDB = new TrustScoreDatabase(db); +``` + +## Usage + +Import and use the TrustDB functionality in your application: + +```typescript +import { TrustScoreDatabase } from "@elizaos/plugin-trustdb"; + +// Initialize database +const trustDB = new TrustScoreDatabase(db); + +// Add a recommender +const recommender = { + id: "uuid", + address: "wallet-address", + telegramId: "telegram-id" +}; +trustDB.addRecommender(recommender); + +// Track token performance +const performance = { + tokenAddress: "token-address", + priceChange24h: 10.5, + volumeChange24h: 25.3, + // ... other metrics +}; +trustDB.upsertTokenPerformance(performance); +``` + +## Features + +### TrustScoreDatabase + +The main database manager providing comprehensive tracking and analysis: + +```typescript +// Get or create a recommender +const recommender = await trustDB.getOrCreateRecommender({ + address: "wallet-address", + telegramId: "user-id" +}); + +// Update recommender metrics +trustDB.updateRecommenderMetrics({ + recommenderId: "uuid", + trustScore: 85.5, + totalRecommendations: 10, + // ... other metrics +}); +``` + +### Performance Tracking + +```typescript +// Add trade performance +trustDB.addTradePerformance({ + token_address: "address", + recommender_id: "uuid", + buy_price: 1.0, + // ... other trade details +}, false); + +// Get token performance +const tokenMetrics = trustDB.getTokenPerformance("token-address"); +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Linting + +```bash +npm run lint +``` + +## Dependencies + +- `better-sqlite3`: SQLite database interface +- `uuid`: Unique identifier generation +- `dompurify`: HTML sanitization +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface Recommender { + id: string; + address: string; + solanaPubkey?: string; + telegramId?: string; + discordId?: string; + twitterId?: string; + ip?: string; +} + +interface RecommenderMetrics { + recommenderId: string; + trustScore: number; + totalRecommendations: number; + successfulRecs: number; + avgTokenPerformance: number; + riskScore: number; + consistencyScore: number; + virtualConfidence: number; + lastActiveDate: Date; + trustDecay: number; + lastUpdated: Date; +} + +interface TokenPerformance { + tokenAddress: string; + symbol: string; + priceChange24h: number; + volumeChange24h: number; + // ... other performance metrics +} +``` + +### Database Methods + +- `addRecommender`: Add new recommender to database +- `getRecommenderMetrics`: Retrieve recommender performance metrics +- `updateRecommenderMetrics`: Update recommender metrics +- `upsertTokenPerformance`: Add or update token performance +- `getTokenPerformance`: Retrieve token performance metrics +- Many more specialized methods for tracking and analysis + +## Common Issues/Troubleshooting + +### Issue: Database Connection Errors +- **Cause**: Incorrect database path or permissions +- **Solution**: Verify database path and file permissions + +### Issue: Data Consistency +- **Cause**: Concurrent database access +- **Solution**: Use proper transaction handling + +## Security Best Practices + +- Implement proper database backup procedures +- Use parameterized queries to prevent SQL injection +- Validate all input data before storage +- Maintain regular database maintenance +- Keep dependencies updated for security patches + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [better-sqlite3](https://github.com/WiseLibs/better-sqlite3): High-performance SQLite3 driver +- [uuid](https://github.com/uuidjs/uuid): UUID generation +- [DOMPurify](https://github.com/cure53/DOMPurify): HTML sanitization library + +Special thanks to: +- The better-sqlite3 team for their excellent database driver +- The UUID.js maintainers for reliable identifier generation +- The DOMPurify team for security-focused sanitization tools +- The Eliza community for their contributions and feedback + +For more information about database management and security: +- [SQLite Documentation](https://www.sqlite.org/docs.html) +- [Database Security Best Practices](https://www.sqlite.org/security.html) +- [Data Sanitization Guide](https://github.com/cure53/DOMPurify/wiki/Security-Goals-&-Threat-Model) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-twitter/README.md b/packages/plugin-twitter/README.md new file mode 100644 index 0000000000..46064214f3 --- /dev/null +++ b/packages/plugin-twitter/README.md @@ -0,0 +1,259 @@ +# @elizaos/plugin-twitter + +A plugin for Twitter/X integration, providing automated tweet posting capabilities with character-aware content generation. + +## Overview + +This plugin provides functionality to: +- Compose context-aware tweets +- Post tweets to Twitter/X platform +- Handle authentication and session management +- Support premium Twitter features +- Manage tweet length restrictions + +## Installation + +```bash +npm install @elizaos/plugin-twitter +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +TWITTER_USERNAME=your_username +TWITTER_PASSWORD=your_password +TWITTER_EMAIL=your_email # Optional: for 2FA +TWITTER_2FA_SECRET=your_2fa_secret # Optional: for 2FA +TWITTER_PREMIUM=false # Optional: enables premium features +TWITTER_DRY_RUN=false # Optional: test without posting +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { twitterPlugin } from "@elizaos/plugin-twitter"; + +export default { + plugins: [twitterPlugin], + // ... other configuration +}; +``` + +## Features + +### Tweet Composition + +The plugin uses context-aware templates to generate appropriate tweets: + +```typescript +import { postAction } from "@elizaos/plugin-twitter"; + +// Tweet will be composed based on context and character limits +const result = await postAction.handler(runtime, message, state); +``` + +### Tweet Posting + +```typescript +// Post with automatic content generation +await postAction.handler(runtime, message, state); + +// Dry run mode (for testing) +process.env.TWITTER_DRY_RUN = "true"; +await postAction.handler(runtime, message, state); +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Development Mode + +```bash +npm run dev +``` + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `agent-twitter-client`: Twitter API client +- `tsup`: Build tool +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface TweetContent { + text: string; +} + +// Tweet Schema +const TweetSchema = z.object({ + text: z.string().describe("The text of the tweet") +}); + +// Action Interface +interface Action { + name: "POST_TWEET"; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory, state?: State) => Promise; + handler: (runtime: IAgentRuntime, message: Memory, state?: State) => Promise; + examples: Array>; +} +``` + +### Plugin Methods + +- `postAction.handler`: Main method for posting tweets +- `postAction.validate`: Validates Twitter credentials +- `composeTweet`: Internal method for tweet generation +- `postTweet`: Internal method for tweet posting + +## Common Issues/Troubleshooting + +### Issue: Authentication Failures +- **Cause**: Invalid credentials or 2FA configuration +- **Solution**: Verify credentials and 2FA setup + +### Issue: Tweet Length Errors +- **Cause**: Content exceeds Twitter's character limit +- **Solution**: Enable TWITTER_PREMIUM for extended tweets or ensure content is within limits + +### Issue: Rate Limiting +- **Cause**: Too many requests in short time +- **Solution**: Implement proper request throttling + +## Security Best Practices + +- Store credentials securely using environment variables +- Use 2FA when possible +- Implement proper error handling +- Keep dependencies updated +- Use dry run mode for testing +- Monitor Twitter API usage + +## Template System + +The plugin uses a sophisticated template system for tweet generation: + +```typescript +const tweetTemplate = ` +# Context +{{recentMessages}} + +# Topics +{{topics}} + +# Post Directions +{{postDirections}} + +# Recent interactions +{{recentPostInteractions}} + +# Task +Generate a tweet that: +1. Relates to the recent conversation +2. Matches the character's style +3. Is concise and engaging +4. Must be UNDER 180 characters +5. Speaks from the perspective of {{agentName}} +`; +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Content Generation** + - Advanced context awareness + - Multi-language support + - Style customization + - Hashtag optimization + - Media generation + - Thread composition + +2. **Engagement Features** + - Auto-reply system + - Engagement analytics + - Follower management + - Interaction scheduling + - Sentiment analysis + - Community management + +3. **Tweet Management** + - Thread management + - Tweet scheduling + - Content moderation + - Archive management + - Delete automation + - Edit optimization + +4. **Analytics Integration** + - Performance tracking + - Engagement metrics + - Audience insights + - Trend analysis + - ROI measurement + - Custom reporting + +5. **Authentication** + - OAuth improvements + - Multi-account support + - Session management + - Rate limit handling + - Security enhancements + - Backup mechanisms + +6. **Developer Tools** + - Enhanced debugging + - Testing framework + - Documentation generator + - Integration templates + - Error handling + - Logging system + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Twitter/X API](https://developer.twitter.com/en/docs): Official Twitter platform API +- [agent-twitter-client](https://www.npmjs.com/package/agent-twitter-client): Twitter API client library +- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation + +Special thanks to: +- The Twitter/X Developer Platform team +- The agent-twitter-client maintainers for API integration tools +- The Eliza community for their contributions and feedback + +For more information about Twitter/X integration capabilities: +- [Twitter API Documentation](https://developer.twitter.com/en/docs) +- [Twitter Developer Portal](https://developer.twitter.com/en/portal/dashboard) +- [Twitter API Best Practices](https://developer.twitter.com/en/docs/twitter-api/rate-limits) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-video-generation/README.md b/packages/plugin-video-generation/README.md new file mode 100644 index 0000000000..9f251473d0 --- /dev/null +++ b/packages/plugin-video-generation/README.md @@ -0,0 +1,264 @@ +# @elizaos/plugin-video-generation + +A plugin for AI-powered video generation using Luma AI, providing automated video creation capabilities from text prompts. + +## Overview + +This plugin provides functionality to: +- Generate videos from text descriptions +- Handle video generation requests through Luma AI +- Manage API authentication and responses +- Cache and serve generated videos +- Monitor generation progress + +## Installation + +```bash +npm install @elizaos/plugin-video-generation +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +LUMA_API_KEY=your_luma_api_key # Required: API key for Luma AI +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { videoGenerationPlugin } from "@elizaos/plugin-video-generation"; + +export default { + plugins: [videoGenerationPlugin], + // ... other configuration +}; +``` + +## Features + +### Video Generation + +The plugin uses Luma AI's API to generate videos from text prompts: + +```typescript +import { videoGeneration } from "@elizaos/plugin-video-generation"; + +// Generate video from prompt +const result = await videoGeneration.handler(runtime, { + content: { text: "Generate a video of a sunset on the beach" } +}, state, {}, callback); +``` + +### Progress Monitoring + +```typescript +// The plugin automatically handles progress monitoring +const result = await generateVideo(prompt, runtime); +if (result.success) { + console.log("Video URL:", result.data); +} else { + console.error("Generation failed:", result.error); +} +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Development Mode + +```bash +npm run dev +``` + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `tsup`: Build tool +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface Action { + name: "GENERATE_VIDEO"; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory) => Promise; + handler: (runtime: IAgentRuntime, message: Memory, state: State, options: any, callback: HandlerCallback) => Promise; + examples: Array>; +} + +interface GenerationResult { + success: boolean; + data?: string; + error?: string; +} +``` + +### Plugin Methods + +- `generateVideo`: Main method for video generation +- `videoGeneration.handler`: Action handler for video requests +- `videoGeneration.validate`: Validates API key and requirements + +## Common Issues/Troubleshooting + +### Issue: API Authentication Failures +- **Cause**: Invalid or missing Luma API key +- **Solution**: Verify LUMA_API_KEY environment variable + +### Issue: Generation Timeouts +- **Cause**: Long generation times or network issues +- **Solution**: Implement proper timeout handling and retry logic + +### Issue: File Storage Errors +- **Cause**: Insufficient permissions or disk space +- **Solution**: Verify file system permissions and available storage + +## Security Best Practices + +- Store API keys securely using environment variables +- Implement proper error handling +- Keep dependencies updated +- Monitor API usage and rate limits +- Validate input prompts +- Secure file storage handling + +## Constants + +The plugin uses predefined constants for API configuration: + +```typescript +export const LUMA_CONSTANTS = { + API_URL: "https://api.lumalabs.ai/dream-machine/v1/generations", + API_KEY_SETTING: "LUMA_API_KEY" +}; +``` + +## Example Usage + +```typescript +// Basic video generation +const videoPrompt = "Create a video of a futuristic city at night"; +const result = await generateVideo(videoPrompt, runtime); + +// With callback handling +videoGeneration.handler(runtime, { + content: { text: videoPrompt } +}, state, {}, (response) => { + console.log("Generation status:", response); +}); +``` + +## Future Enhancements + +The following features and improvements are planned for future releases: + +1. **Generation Features** + - Advanced style control + - Multi-scene composition + - Custom duration settings + - Resolution options + - Frame rate control + - Audio integration + +2. **Video Editing** + - Scene transitions + - Text overlay tools + - Effect templates + - Color correction + - Motion tracking + - Timeline editing + +3. **Asset Management** + - Asset library + - Template system + - Style presets + - Resource optimization + - Version control + - Batch processing + +4. **Quality Improvements** + - Enhanced resolution + - Frame interpolation + - Artifact reduction + - Stability features + - Lighting optimization + - Detail enhancement + +5. **Performance Optimization** + - Generation speed + - Resource usage + - Parallel processing + - Caching system + - Queue management + - Load balancing + +6. **Export Options** + - Multiple formats + - Compression settings + - Streaming support + - Progressive loading + - Thumbnail generation + - Metadata handling + +7. **Developer Tools** + - API expansion + - Testing framework + - Documentation generator + - Debug visualization + - Performance monitoring + - Integration templates + +8. **AI Features** + - Style transfer + - Scene understanding + - Content awareness + - Motion synthesis + - Character animation + - Environment generation + +We welcome community feedback and contributions to help prioritize these enhancements. + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Luma AI](https://lumalabs.ai/): Advanced AI-powered video generation platform +- [Luma Dream Machine](https://lumalabs.ai/dream-machine): Text-to-video generation API +- [Node.js Fetch API](https://nodejs.org/api/fetch.html): HTTP request handling + +Special thanks to: +- The Luma Labs team for providing the video generation API +- The Luma AI research team for their groundbreaking work in AI video generation +- The Eliza community for their contributions and feedback + +For more information about video generation capabilities and tools: +- [Luma AI Documentation](https://docs.lumalabs.ai/) +- [Dream Machine API Reference](https://lumalabs.ai/docs/dream-machine) +- [Video Generation Best Practices](https://lumalabs.ai/docs/best-practices) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-web-search/README.md b/packages/plugin-web-search/README.md new file mode 100644 index 0000000000..6126ee3206 --- /dev/null +++ b/packages/plugin-web-search/README.md @@ -0,0 +1,190 @@ +# @elizaos/plugin-web-search + +A plugin for powerful web search capabilities, providing efficient search query handling and result processing through a customizable API interface. + +## Overview + +This plugin provides functionality to: +- Execute web search queries with customizable parameters +- Process and format search results +- Handle search API authentication +- Manage token limits and response sizes +- Optimize query performance + +## Installation + +```bash +npm install @elizaos/plugin-web-search +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +TAVILY_API_KEY=your_api_key # Required: API key for search service +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { webSearchPlugin } from "@elizaos/plugin-web-search"; + +export default { + plugins: [webSearchPlugin], + // ... other configuration +}; +``` + +## Features + +### Web Search + +The plugin provides comprehensive web search capabilities: + +```typescript +import { webSearch } from "@elizaos/plugin-web-search"; + +// Execute a search query +const result = await webSearch.handler(runtime, { + content: { text: "What is the latest news about AI?" } +}, state, {}, callback); +``` + +### Token Management + +```typescript +// The plugin automatically handles token limits +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; + +// Example of token-limited response +const response = MaxTokens(searchResult, DEFAULT_MAX_WEB_SEARCH_TOKENS); +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Development Mode + +```bash +npm run dev +``` + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `js-tiktoken`: Token counting and management +- `tsup`: Build tool +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface Action { + name: "WEB_SEARCH"; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory) => Promise; + handler: (runtime: IAgentRuntime, message: Memory, state: State, options: any, callback: HandlerCallback) => Promise; + examples: Array>; +} + +interface SearchResult { + title: string; + url: string; + answer?: string; + results?: Array<{ + title: string; + url: string; + }>; +} +``` + +### Plugin Methods + +- `webSearch.handler`: Main method for executing searches +- `generateWebSearch`: Core search generation function +- `MaxTokens`: Token limit management function +- `getTotalTokensFromString`: Token counting utility + +## Common Issues/Troubleshooting + +### Issue: API Authentication Failures +- **Cause**: Invalid or missing Tavily API key +- **Solution**: Verify TAVILY_API_KEY environment variable + +### Issue: Token Limit Exceeded +- **Cause**: Search results exceeding maximum token limit +- **Solution**: Results are automatically truncated to fit within limits + +### Issue: Search Rate Limiting +- **Cause**: Too many requests in short time +- **Solution**: Implement proper request throttling + +## Security Best Practices + +- Store API keys securely using environment variables +- Validate all search inputs +- Implement proper error handling +- Keep dependencies updated +- Monitor API usage and rate limits +- Use HTTPS for API communication + +## Example Usage + +```typescript +// Basic search +const searchQuery = "Latest developments in quantum computing"; +const results = await generateWebSearch(searchQuery, runtime); + +// With formatted response +if (results && results.results.length) { + const formattedResponse = `${results.answer}\n\nFor more details, check out:\n${ + results.results.map((result, index) => + `${index + 1}. [${result.title}](${result.url})` + ).join('\n') + }`; +} +``` + +## Configuration Options + +### Token Management + +```typescript +const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; +``` + +### Search Actions + +The plugin includes multiple search action similes: +- SEARCH_WEB +- INTERNET_SEARCH +- LOOKUP +- QUERY_WEB +- FIND_ONLINE +- And more... + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-whatsapp/README.md b/packages/plugin-whatsapp/README.md new file mode 100644 index 0000000000..875aa50a87 --- /dev/null +++ b/packages/plugin-whatsapp/README.md @@ -0,0 +1,220 @@ +# @elizaos/plugin-whatsapp + +A plugin for integrating WhatsApp Cloud API with your application, providing comprehensive messaging capabilities and webhook handling. + +## Overview + +This plugin provides functionality to: +- Send text and template messages via WhatsApp +- Handle incoming webhook events +- Manage message status updates +- Process message delivery notifications +- Handle authentication and session management + +## Installation + +```bash +npm install @elizaos/plugin-whatsapp +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +WHATSAPP_ACCESS_TOKEN=your_access_token # Required: WhatsApp Cloud API access token +WHATSAPP_PHONE_NUMBER_ID=your_phone_number_id # Required: WhatsApp business phone number ID +WHATSAPP_WEBHOOK_TOKEN=your_webhook_token # Optional: Webhook verification token +WHATSAPP_BUSINESS_ID=your_business_id # Optional: Business account ID +``` + +## Usage + +### Basic Setup + +```typescript +import { WhatsAppPlugin } from "@elizaos/plugin-whatsapp"; + +const whatsappPlugin = new WhatsAppPlugin({ + accessToken: 'your_access_token', + phoneNumberId: 'your_phone_number_id', + webhookVerifyToken: 'your_webhook_verify_token', + businessAccountId: 'your_business_account_id' +}); +``` + +### Sending Messages + +```typescript +// Send a text message +await whatsappPlugin.sendMessage({ + type: 'text', + to: '1234567890', + content: 'Hello from WhatsApp!' +}); + +// Send a template message +await whatsappPlugin.sendMessage({ + type: 'template', + to: '1234567890', + content: { + name: 'hello_world', + language: { + code: 'en' + } + } +}); +``` + +### Handling Webhooks + +```typescript +// Verify webhook +app.get('/webhook', (req, res) => { + const verified = await whatsappPlugin.verifyWebhook(req.query['hub.verify_token']); + if (verified) { + res.send(req.query['hub.challenge']); + } else { + res.sendStatus(403); + } +}); + +// Handle webhook events +app.post('/webhook', (req, res) => { + await whatsappPlugin.handleWebhook(req.body); + res.sendStatus(200); +}); +``` + +## Features + +- Send text messages +- Send template messages +- Webhook verification +- Webhook event handling +- Message status updates + +## Error Handling + +The plugin throws errors in the following cases: + +```typescript +try { + await whatsappPlugin.sendMessage({ + type: 'text', + to: '1234567890', + content: 'Hello!' + }); +} catch (error) { + console.error('Failed to send message:', error.message); +} +``` + +Common error cases: +- Invalid configuration +- Failed message sending +- Webhook verification failure +- Invalid webhook payload + +## Best Practices + +1. Always validate phone numbers before sending messages +2. Use template messages for first-time messages to users +3. Store message IDs for tracking delivery status +4. Implement proper error handling +5. Set up webhook retry mechanisms +6. Keep your access tokens secure + +## API Reference + +### Core Interfaces + +```typescript +interface WhatsAppConfig { + accessToken: string; + phoneNumberId: string; + webhookVerifyToken?: string; + businessAccountId?: string; +} + +interface WhatsAppMessage { + type: 'text' | 'template'; + to: string; + content: string | WhatsAppTemplate; +} + +interface WhatsAppTemplate { + name: string; + language: { + code: string; + }; + components?: Array<{ + type: string; + parameters: Array<{ + type: string; + text?: string; + }>; + }>; +} +``` + +### Plugin Methods + +- `sendMessage`: Send WhatsApp messages +- `handleWebhook`: Process incoming webhook events +- `verifyWebhook`: Verify webhook authenticity +- Message and status handlers + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Linting + +```bash +npm run lint +``` + +## Security Best Practices + +- Store credentials securely using environment variables +- Validate all phone numbers before sending messages +- Use template messages for first-time contacts +- Implement proper error handling +- Keep dependencies updated +- Monitor API usage and rate limits +- Use HTTPS for all API communication + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [WhatsApp Cloud API](https://developers.facebook.com/docs/whatsapp/cloud-api): Meta's official WhatsApp Business Platform +- [Axios](https://axios-http.com/): Promise-based HTTP client for API requests +- [Meta for Developers](https://developers.facebook.com/): Meta's developer platform and tools + +Special thanks to: +- The Eliza community for their contributions and feedback + +For more information about WhatsApp Cloud API and its capabilities, visit: +- [WhatsApp Business Platform Documentation](https://developers.facebook.com/docs/whatsapp/cloud-api/overview) +- [Meta for Developers Blog](https://developers.facebook.com/blog/) +- [WhatsApp Business API GitHub](https://github.com/WhatsApp/WhatsApp-Business-API-Setup-Scripts) diff --git a/packages/plugin-whatsapp/Readme.md b/packages/plugin-whatsapp/Readme.md deleted file mode 100644 index 9324a5705c..0000000000 --- a/packages/plugin-whatsapp/Readme.md +++ /dev/null @@ -1,154 +0,0 @@ -# WhatsApp Cloud API Plugin - -A plugin for integrating WhatsApp Cloud API with your application. - -## Installation - - - -npm install @eliza/plugin-whatsapp - -## Configuration - -typescript -import { WhatsAppPlugin } from '@eliza/plugin-whatsapp'; -const whatsappPlugin = new WhatsAppPlugin({ -accessToken: 'your_access_token', -phoneNumberId: 'your_phone_number_id', -webhookVerifyToken: 'your_webhook_verify_token', -businessAccountId: 'your_business_account_id' -}); - -## Usage - -### Sending Messages - -typescript -// Send a text message -await whatsappPlugin.sendMessage({ -type: 'text', -to: '1234567890', -content: 'Hello from WhatsApp!' -}); -// Send a template message -await whatsappPlugin.sendMessage({ -type: 'template', -to: '1234567890', -content: { -name: 'hello_world', -language: { -code: 'en' -} -} -}); - -### Handling Webhooks - -typescript -// Verify webhook -app.get('/webhook', (req, res) => { -const verified = await whatsappPlugin.verifyWebhook(req.query['hub.verify_token']); -if (verified) { -res.send(req.query['hub.challenge']); -} else { -res.sendStatus(403); -} -}); -// Handle webhook events -app.post('/webhook', (req, res) => { -await whatsappPlugin.handleWebhook(req.body); -res.sendStatus(200); -}); - -## Features - -- Send text messages -- Send template messages -- Webhook verification -- Webhook event handling -- Message status updates - -## API Reference - -### WhatsAppPlugin - -#### Constructor - -- `config: WhatsAppConfig` - Configuration object for the plugin - -#### Methods - -- `sendMessage(message: WhatsAppMessage): Promise` - Send a WhatsApp message -- `handleWebhook(event: WhatsAppWebhookEvent): Promise` - Process incoming webhook events -- `verifyWebhook(token: string): Promise` - Verify webhook token - -### Types - -typescript -interface WhatsAppConfig { -accessToken: string; -phoneNumberId: string; -webhookVerifyToken?: string; -businessAccountId?: string; -} -interface WhatsAppMessage { -type: 'text' | 'template'; -to: string; -content: string | WhatsAppTemplate; -} -interface WhatsAppTemplate { -name: string; -language: { -code: string; -}; -components?: Array<{ -type: string; -parameters: Array<{ -type: string; -text?: string; -}>; -}>; -} - -## Error Handling - -The plugin throws errors in the following cases: - -- Invalid configuration -- Failed message sending -- Webhook verification failure -- Invalid webhook payload - -Example error handling: - -typescript -try { -await whatsappPlugin.sendMessage({ -type: 'text', -to: '1234567890', -content: 'Hello!' -}); -} catch (error) { -console.error('Failed to send message:', error.message); -} - -## Best Practices - -1. Always validate phone numbers before sending messages -2. Use template messages for first-time messages to users -3. Store message IDs for tracking delivery status -4. Implement proper error handling -5. Set up webhook retry mechanisms -6. Keep your access tokens secure - -## Contributing - -1. Fork the repository -2. Create your feature branch (`git checkout -b feature/amazing-feature`) -3. Commit your changes (`git commit -m 'Add some amazing feature'`) -4. Push to the branch (`git push origin feature/amazing-feature`) -5. Open a Pull Request - -## License - -MIT diff --git a/packages/plugin-zksync-era/README.md b/packages/plugin-zksync-era/README.md new file mode 100644 index 0000000000..0cf8a7b081 --- /dev/null +++ b/packages/plugin-zksync-era/README.md @@ -0,0 +1,220 @@ +# @elizaos/plugin-zksync-era + +A plugin for integrating ZKSync Era blockchain operations with your application, providing token transfer capabilities and transaction management. + +## Overview + +This plugin provides functionality to: +- Execute token transfers on ZKSync Era +- Handle smart account operations +- Manage transaction signing and submission +- Support multiple token standards +- Process transaction receipts and confirmations + +## Installation + +```bash +npm install @elizaos/plugin-zksync-era +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +ZKSYNC_ADDRESS=your_address # Required: Your ZKSync wallet address +ZKSYNC_PRIVATE_KEY=your_private_key # Required: Your wallet's private key +``` + +## Usage + +### Basic Setup + +```typescript +import { zksyncEraPlugin } from "@elizaos/plugin-zksync-era"; + +const plugin = zksyncEraPlugin; +``` + +### Token Transfers + +```typescript +// Transfer tokens +await transfer.handler(runtime, { + content: { + tokenAddress: "0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4", // USDC + recipient: "0xCCa8009f5e09F8C5dB63cb0031052F9CB635Af62", + amount: "100" + } +}, state); +``` + +## Features + +### Supported Tokens + +The plugin includes pre-configured addresses for common tokens: +```typescript +const TOKENS = { + ZK: "0x5A7d6b2F92C77FAD6CCaBd7EE0624E64907Eaf3E", + ETH: "0x000000000000000000000000000000000000800A", + USDC: "0x1d17CBcF0D6D143135aE902365D2E5e2A16538D4" +}; +``` + +### Smart Account Integration + +```typescript +const web3 = new Web3(); +web3.registerPlugin(new ZKsyncPlugin( + Web3ZKsyncL2.initWithDefaultProvider(types.Network.Mainnet) +)); + +const smartAccount = new web3.ZKsync.SmartAccount({ + address: PUBLIC_KEY, + secret: PRIVATE_KEY +}); +``` + +## Error Handling + +The plugin includes comprehensive error handling: + +```typescript +try { + const transferTx = await smartAccount.transfer({ + to: recipient, + token: tokenAddress, + amount: amount + }); + const receipt = await transferTx.wait(); +} catch (error) { + console.error("Transfer failed:", error.message); +} +``` + +Common error cases: +- Invalid configuration +- Insufficient balance +- Network issues +- Invalid addresses +- Failed transactions + +## Best Practices + +1. Always validate addresses before transactions +2. Keep private keys secure +3. Monitor transaction status +4. Implement proper error handling +5. Use appropriate gas settings +6. Keep track of transaction receipts + +## API Reference + +### Core Interfaces + +```typescript +interface TransferContent { + tokenAddress: string; + recipient: string; + amount: string | number; +} + +interface ZKsyncConfig { + ZKSYNC_ADDRESS: string; + ZKSYNC_PRIVATE_KEY: string; +} +``` + +### Plugin Methods + +- `transfer`: Execute token transfers +- `validateZKsyncConfig`: Validate configuration +- Transaction status monitoring +- Receipt handling + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +## Security Best Practices + +- Store private keys securely using environment variables +- Validate all addresses before transactions +- Implement proper error handling +- Keep dependencies updated +- Monitor transaction status +- Use secure RPC endpoints +- Implement proper gas management + +## Example Usage + +```typescript +// Initialize plugin +const zksync = zksyncEraPlugin; + +// Execute transfer +try { + await transfer.handler(runtime, { + content: { + tokenAddress: TOKENS.USDC, + recipient: "0xCCa8009f5e09F8C5dB63cb0031052F9CB635Af62", + amount: "100" + } + }, state); +} catch (error) { + console.error('Transfer failed:', error.message); +} +``` + +## Validation + +The plugin includes validation for: +- Wallet addresses +- Token addresses +- Transaction amounts +- Configuration parameters +- Network status + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `web3`: Web3 library for blockchain interaction +- `web3-plugin-zksync`: ZKSync Era integration +- Other standard dependencies listed in package.json + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [ZKSync Era](https://zksync.io/): Layer 2 scaling solution for Ethereum +- [Web3.js](https://web3js.org/): Ethereum JavaScript API +- [web3-plugin-zksync](https://www.npmjs.com/package/web3-plugin-zksync): Official ZKSync plugin for Web3.js + +Special thanks to: +- The Matter Labs team for developing ZKSync Era +- The Web3.js team for maintaining the core Ethereum library +- The Eliza community for their contributions and feedback + +For more information about ZKSync Era and its capabilities, visit: +- [ZKSync Documentation](https://docs.zksync.io/) +- [Matter Labs Blog](https://blog.matter-labs.io/) +- [ZKSync GitHub](https://github.com/matter-labs/zksync-era) \ No newline at end of file From a6d5293c2c2cbf768b28742986ad6cdd92cc23f6 Mon Sep 17 00:00:00 2001 From: zhourunlai Date: Tue, 31 Dec 2024 16:58:57 +0800 Subject: [PATCH 44/69] use tavily sdk --- package.json | 1 + packages/core/src/generation.ts | 35 +++--------- packages/core/src/types.ts | 15 +++-- pnpm-lock.yaml | 97 ++++++++++++++++++++++++++------- 4 files changed, 97 insertions(+), 51 deletions(-) diff --git a/package.json b/package.json index 983a479390..ea93104e64 100644 --- a/package.json +++ b/package.json @@ -56,6 +56,7 @@ "@0glabs/0g-ts-sdk": "0.2.1", "@coinbase/coinbase-sdk": "0.10.0", "@deepgram/sdk": "^3.9.0", + "@tavily/core": "^0.0.2", "@vitest/eslint-plugin": "1.0.1", "amqplib": "0.10.5", "csv-parse": "5.6.0", diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index 67ed1b664a..f6374f2caa 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -36,6 +36,7 @@ import { ActionResponse, } from "./types.ts"; import { fal } from "@fal-ai/client"; +import { tavily } from "@tavily/core"; /** * Send a message to the model for a text generateText - receive a string back and parse how you'd like @@ -1300,34 +1301,16 @@ export const generateWebSearch = async ( query: string, runtime: IAgentRuntime ): Promise => { - const apiUrl = "https://api.tavily.com/search"; - const apiKey = runtime.getSetting("TAVILY_API_KEY"); - try { - const response = await fetch(apiUrl, { - method: "POST", - headers: { - "Content-Type": "application/json", - }, - body: JSON.stringify({ - api_key: apiKey, - query, - include_answer: true, - max_results: 3, // 5 (default) - topic: "general", // "general"(default) "news" - search_depth: "basic", // "basic"(default) "advanced" - include_images: false, // false (default) true - }), + const tvly = tavily({ apiKey: runtime.getSetting("TAVILY_API_KEY") }); + const response = await tvly.search(query, { + includeAnswer: true, + maxResults: 3, // 5 (default) + topic: "general", // "general"(default) "news" + searchDepth: "basic", // "basic"(default) "advanced" + includeImages: false, // false (default) true }); - - if (!response.ok) { - throw new elizaLogger.error( - `HTTP error! status: ${response.status}` - ); - } - - const data: SearchResponse = await response.json(); - return data; + return response; } catch (error) { elizaLogger.error("Error:", error); } diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index dfc19c2eb2..e94a4edcdf 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1226,21 +1226,26 @@ export interface IAwsS3Service extends Service { generateSignedUrl(fileName: string, expiresIn: number): Promise; } +export type SearchImage = { + url: string; + description?: string; +}; + export type SearchResult = { title: string; url: string; content: string; + rawContent?: string; score: number; - raw_content: string | null; + publishedDate: string; }; export type SearchResponse = { + answer?: string; query: string; - follow_up_questions: string[] | null; - answer: string | null; - images: string[]; + responseTime: number; + images: SearchImage[]; results: SearchResult[]; - response_time: number; }; export enum ServiceType { diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24a75803b8..e7e4911704 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,6 +20,9 @@ importers: '@deepgram/sdk': specifier: ^3.9.0 version: 3.9.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@tavily/core': + specifier: ^0.0.2 + version: 0.0.2 '@vitest/eslint-plugin': specifier: 1.0.1 version: 1.0.1(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.10.2)(jsdom@25.0.1(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.37.0)) @@ -4871,67 +4874,79 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] + libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] + libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] + libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] + libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -5798,24 +5813,28 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [glibc] '@nx/nx-linux-arm64-musl@19.8.14': resolution: {integrity: sha512-ltty/PDWqkYgu/6Ye65d7v5nh3D6e0n3SacoKRs2Vtfz5oHYRUkSKizKIhEVfRNuHn3d9j8ve1fdcCN4SDPUBQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] + libc: [musl] '@nx/nx-linux-x64-gnu@19.8.14': resolution: {integrity: sha512-JzE3BuO9RCBVdgai18CCze6KUzG0AozE0TtYFxRokfSC05NU3nUhd/o62UsOl7s6Bqt/9nwrW7JC8pNDiCi9OQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [glibc] '@nx/nx-linux-x64-musl@19.8.14': resolution: {integrity: sha512-2rPvDOQLb7Wd6YiU88FMBiLtYco0dVXF99IJBRGAWv+WTI7MNr47OyK2ze+JOsbYY1d8aOGUvckUvCCZvZKEfg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] + libc: [musl] '@nx/nx-win32-arm64-msvc@19.8.14': resolution: {integrity: sha512-JxW+YPS+EjhUsLw9C6wtk9pQTG3psyFwxhab8y/dgk2s4AOTLyIm0XxgcCJVvB6i4uv+s1g0QXRwp6+q3IR6hg==} @@ -6766,51 +6785,61 @@ packages: resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.29.1': resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] + libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.29.1': resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.29.1': resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] + libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.29.1': resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} cpu: [loong64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.29.1': resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.29.1': resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.29.1': resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] + libc: [glibc] '@rollup/rollup-linux-x64-musl@4.29.1': resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] + libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.29.1': resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} @@ -7529,24 +7558,28 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [glibc] '@swc/core-linux-arm64-musl@1.10.1': resolution: {integrity: sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] + libc: [musl] '@swc/core-linux-x64-gnu@1.10.1': resolution: {integrity: sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [glibc] '@swc/core-linux-x64-musl@1.10.1': resolution: {integrity: sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==} engines: {node: '>=10'} cpu: [x64] os: [linux] + libc: [musl] '@swc/core-win32-arm64-msvc@1.10.1': resolution: {integrity: sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==} @@ -7600,6 +7633,9 @@ packages: peerDependencies: react: ^18 || ^19 + '@tavily/core@0.0.2': + resolution: {integrity: sha512-UabYbp57bdjEloA4efW9zTSzv+FZp13JVDHcfutUNR5XUZ+aDGupe2wpfABECnD+b7Ojp9v9zguZcm1o+h0//w==} + '@telegraf/types@7.1.0': resolution: {integrity: sha512-kGevOIbpMcIlCDeorKGpwZmdH7kHbqlk/Yj6dEpJMKEQw5lk0KVQY0OLXaCswy8GqlIVLd5625OB+rAntP9xVw==} @@ -19572,7 +19608,7 @@ snapshots: '@acuminous/bitsyntax@0.1.2': dependencies: buffer-more-ints: 1.0.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 safe-buffer: 5.1.2 transitivePeerDependencies: - supports-color @@ -21505,7 +21541,7 @@ snapshots: dependencies: '@scure/bip32': 1.6.0 abitype: 1.0.8(typescript@5.6.3)(zod@3.23.8) - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 axios-mock-adapter: 1.22.0(axios@1.7.9) axios-retry: 4.5.0(axios@1.7.9) bip32: 4.0.0 @@ -23336,7 +23372,7 @@ snapshots: '@eslint/config-array@0.19.1': dependencies: '@eslint/object-schema': 2.1.5 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -23362,7 +23398,7 @@ snapshots: '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -28047,6 +28083,13 @@ snapshots: '@tanstack/query-core': 5.60.6 react: 18.3.1 + '@tavily/core@0.0.2': + dependencies: + axios: 1.7.9 + js-tiktoken: 1.0.15 + transitivePeerDependencies: + - debug + '@telegraf/types@7.1.0': {} '@tinyhttp/content-disposition@2.2.2': {} @@ -28704,7 +28747,7 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.16.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 eslint: 9.16.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 @@ -28737,7 +28780,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3) - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 eslint: 9.16.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: @@ -28768,7 +28811,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -29558,7 +29601,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -29907,13 +29950,13 @@ snapshots: axios-mock-adapter@1.22.0(axios@1.7.9): dependencies: - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 fast-deep-equal: 3.1.3 is-buffer: 2.0.5 axios-retry@4.5.0(axios@1.7.9): dependencies: - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 is-retry-allowed: 2.2.0 axios@0.21.4: @@ -29924,7 +29967,7 @@ snapshots: axios@0.27.2: dependencies: - follow-redirects: 1.15.9(debug@4.4.0) + follow-redirects: 1.15.9 form-data: 4.0.1 transitivePeerDependencies: - debug @@ -29953,6 +29996,14 @@ snapshots: transitivePeerDependencies: - debug + axios@1.7.9: + dependencies: + follow-redirects: 1.15.9 + form-data: 4.0.1 + proxy-from-env: 1.1.0 + transitivePeerDependencies: + - debug + axios@1.7.9(debug@4.4.0): dependencies: follow-redirects: 1.15.9(debug@4.4.0) @@ -32009,6 +32060,10 @@ snapshots: dependencies: ms: 2.1.3 + debug@4.4.0: + dependencies: + ms: 2.1.3 + debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -32898,7 +32953,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -33482,6 +33537,8 @@ snapshots: async: 0.2.10 which: 1.3.1 + follow-redirects@1.15.9: {} + follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7 @@ -34562,7 +34619,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -34620,14 +34677,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 transitivePeerDependencies: - supports-color @@ -38006,7 +38063,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 - axios: 1.7.9(debug@4.4.0) + axios: 1.7.9 chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -41033,7 +41090,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -42062,7 +42119,7 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -42751,7 +42808,7 @@ snapshots: vite-node@2.1.5(@types/node@22.10.2)(terser@5.37.0): dependencies: cac: 6.7.14 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) @@ -42864,7 +42921,7 @@ snapshots: '@vitest/spy': 2.1.5 '@vitest/utils': 2.1.5 chai: 5.1.2 - debug: 4.4.0(supports-color@8.1.1) + debug: 4.4.0 expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2 From 1a0615cb7874656ac6bcd51a1b58e86cd118b247 Mon Sep 17 00:00:00 2001 From: CheddarQueso Date: Tue, 31 Dec 2024 04:00:37 -0500 Subject: [PATCH 45/69] file updates --- packages/plugin-0g/README.md | 2 - packages/plugin-3d-generation/README.md | 2 - packages/plugin-abstract/README.md | 2 - packages/plugin-avalanche/README.md | 2 - packages/plugin-bootstrap/README.md | 2 - packages/plugin-conflux/README.md | 2 - packages/plugin-ferePro/README.md | 20 ++++- packages/plugin-intiface/README.md | 18 ++++- packages/plugin-multiversx/README.md | 17 ++++- packages/plugin-near/README.md | 10 +-- packages/plugin-nft-generation/README.md | 17 ++++- packages/plugin-node/README.md | 85 ++++++++++++++++++++-- packages/plugin-solana/README.MD | 18 +++-- packages/plugin-starknet/README.md | 18 +++-- packages/plugin-tee/README.md | 2 - packages/plugin-ton/README.md | 2 - packages/plugin-twitter/README.md | 2 - packages/plugin-video-generation/README.md | 2 - packages/plugin-web-search/README.md | 17 +++++ packages/plugin-whatsapp/README.md | 8 +- packages/plugin-zksync-era/README.md | 12 ++- 21 files changed, 197 insertions(+), 63 deletions(-) diff --git a/packages/plugin-0g/README.md b/packages/plugin-0g/README.md index 97f2766490..4d6503fd38 100644 --- a/packages/plugin-0g/README.md +++ b/packages/plugin-0g/README.md @@ -112,8 +112,6 @@ pnpm run dev ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Storage Management** - Multi-file upload optimization - Folder structure preservation diff --git a/packages/plugin-3d-generation/README.md b/packages/plugin-3d-generation/README.md index 91f5c33899..c10c34d548 100644 --- a/packages/plugin-3d-generation/README.md +++ b/packages/plugin-3d-generation/README.md @@ -108,8 +108,6 @@ pnpm run dev ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Advanced Generation Features** - Multi-object scene generation - Texture customization options diff --git a/packages/plugin-abstract/README.md b/packages/plugin-abstract/README.md index ba3adf4962..9a1f0539cf 100644 --- a/packages/plugin-abstract/README.md +++ b/packages/plugin-abstract/README.md @@ -100,8 +100,6 @@ pnpm run dev ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Smart Account Features** - Multi-signature support - Account recovery mechanisms diff --git a/packages/plugin-avalanche/README.md b/packages/plugin-avalanche/README.md index 6259c88e64..4b1fa676b2 100644 --- a/packages/plugin-avalanche/README.md +++ b/packages/plugin-avalanche/README.md @@ -128,8 +128,6 @@ pnpm run lint ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Advanced DeFi Operations** - Multi-hop yield strategies - Auto-compounding features diff --git a/packages/plugin-bootstrap/README.md b/packages/plugin-bootstrap/README.md index d44412572f..9fdeb69d7b 100644 --- a/packages/plugin-bootstrap/README.md +++ b/packages/plugin-bootstrap/README.md @@ -83,8 +83,6 @@ pnpm run lint ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Enhanced Conversation Management** - Advanced context tracking - Multi-thread conversation support diff --git a/packages/plugin-conflux/README.md b/packages/plugin-conflux/README.md index 04f5b10fb4..fd60a605a3 100644 --- a/packages/plugin-conflux/README.md +++ b/packages/plugin-conflux/README.md @@ -141,8 +141,6 @@ pnpm run dev ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Advanced Token Management** - Batch token transfers - Token allowance management diff --git a/packages/plugin-ferePro/README.md b/packages/plugin-ferePro/README.md index 383e394d95..161aff3321 100644 --- a/packages/plugin-ferePro/README.md +++ b/packages/plugin-ferePro/README.md @@ -193,7 +193,25 @@ The plugin includes comprehensive error handling for: Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [IPFS](https://ipfs.tech/): InterPlanetary File System +- [Filecoin](https://filecoin.io/): Decentralized storage network +- [Web3.Storage](https://web3.storage/): Decentralized storage service + +Special thanks to: +- The Protocol Labs team for IPFS and Filecoin +- The Web3.Storage team +- The decentralized storage community +- The Eliza community for their contributions and feedback + +For more information about Ferepro capabilities: +- [IPFS Documentation](https://docs.ipfs.tech/) +- [Filecoin Documentation](https://docs.filecoin.io/) +- [Web3.Storage Documentation](https://web3.storage/docs/) + ## License This plugin is part of the Eliza project. See the main project repository for license information. - diff --git a/packages/plugin-intiface/README.md b/packages/plugin-intiface/README.md index 782f3d47fb..c7a2acd049 100644 --- a/packages/plugin-intiface/README.md +++ b/packages/plugin-intiface/README.md @@ -147,6 +147,20 @@ pnpm test-via-bun Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with [Buttplug.io](https://buttplug.io) and [Intiface Engine](https://github.com/intiface/intiface-engine), developed by Nonpolynomial Labs, LLC. + +Special thanks to: +- The Buttplug.io team for developing the Buttplug.io protocol +- The Intiface Engine team for developing the Intiface Engine +- The Eliza community for their contributions and feedback. + +For more information about Buttplug.io and Intiface Engine: +- [Buttplug.io](https://buttplug.io) +- [Intiface Engine](https://github.com/intiface/intiface-engine) + ## License This plugin is part of the Eliza project. See the main project repository for license information. @@ -184,7 +198,3 @@ Buttplug and Intiface are BSD licensed. OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -## Credits - -This plugin integrates with [Buttplug.io](https://buttplug.io) and [Intiface Engine](https://github.com/intiface/intiface-engine), developed by Nonpolynomial Labs, LLC. diff --git a/packages/plugin-multiversx/README.md b/packages/plugin-multiversx/README.md index 5316312271..90e1aa1fd4 100644 --- a/packages/plugin-multiversx/README.md +++ b/packages/plugin-multiversx/README.md @@ -160,10 +160,19 @@ pnpm test:watch Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with the [MultiversX blockchain](https://multiversx.com/) using their official SDK. + +Special thanks to: +- The MultiversX team for developing the MultiversX blockchain +- The Eliza community for their contributions and feedback. + +For more information about MultiversX blockchain capabilities: +- [MultiversX Documentation](https://docs.multiversx.com/) +- [MultiversX Developer Portal](https://docs.multiversx.com/developers/getting-started/introduction) +- [MultiversX GitHub Repository](https://github.com/multiversx/mx-sdk-js) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-near/README.md b/packages/plugin-near/README.md index 2d7b20aa3f..fe3d6d5aad 100644 --- a/packages/plugin-near/README.md +++ b/packages/plugin-near/README.md @@ -187,10 +187,6 @@ pnpm test:watch Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with: @@ -207,4 +203,8 @@ For more information about NEAR blockchain capabilities: - [NEAR Documentation](https://docs.near.org/) - [NEAR Developer Portal](https://near.org/developers) - [NEAR Network Dashboard](https://nearscan.io/) -- [NEAR GitHub Repository](https://github.com/nearprotocol/near-api-js) \ No newline at end of file +- [NEAR GitHub Repository](https://github.com/nearprotocol/near-api-js) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-nft-generation/README.md b/packages/plugin-nft-generation/README.md index e0b96e677b..f7e953f2a5 100644 --- a/packages/plugin-nft-generation/README.md +++ b/packages/plugin-nft-generation/README.md @@ -206,9 +206,6 @@ DSTACK_SIMULATOR_ENDPOINT="http://localhost:8090" Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. ## Credits @@ -216,3 +213,17 @@ This plugin integrates with: - [Solana Blockchain](https://solana.com) - [Metaplex Protocol](https://www.metaplex.com) - AWS S3 for asset storage + +Special thanks to: +- The Solana ecosystem and all the open-source contributors who make these integrations possible. +- The Eliza community for their contributions and feedback. + +For more information about Solana blockchain capabilities: +- [Solana Documentation](https://docs.solana.com/) +- [Solana Developer Portal](https://solana.com/developers) +- [Solana Network Dashboard](https://solscan.io/) +- [Solana GitHub Repository](https://github.com/solana-labs/solana) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-node/README.md b/packages/plugin-node/README.md index 518ec77e3c..a995168129 100644 --- a/packages/plugin-node/README.md +++ b/packages/plugin-node/README.md @@ -201,14 +201,78 @@ For issues and feature requests, please: - Error logs - Steps to reproduce +## Future Enhancements + +1. **File Operations** + - Enhanced streaming capabilities + - Advanced compression options + - Batch file processing + - File type detection + - Metadata management + - Version control integration + +2. **Media Processing** + - Additional video formats + - Advanced image processing + - Audio enhancement tools + - Real-time processing + - Quality optimization + - Format conversion + +3. **Cloud Integration** + - Multi-cloud support + - Advanced caching + - CDN optimization + - Auto-scaling features + - Cost optimization + - Backup automation + +4. **Speech Services** + - Additional voice models + - Language expansion + - Emotion detection + - Voice cloning + - Real-time synthesis + - Custom voice training + +5. **Browser Automation** + - Headless optimization + - Parallel processing + - Session management + - Cookie handling + - Proxy support + - Resource optimization + +6. **Security Features** + - Enhanced encryption + - Access control + - Audit logging + - Threat detection + - Rate limiting + - Compliance tools + +7. **Performance Optimization** + - Memory management + - CPU utilization + - Concurrent operations + - Resource pooling + - Cache strategies + - Load balancing + +8. **Developer Tools** + - Enhanced debugging + - Testing framework + - Documentation generator + - CLI improvements + - Monitoring tools + - Integration templates + +We welcome community feedback and contributions to help prioritize these enhancements. + ## Contributing Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with and builds upon several key technologies: @@ -224,4 +288,15 @@ This plugin integrates with and builds upon several key technologies: - [Deepgram](https://deepgram.com/) - Speech recognition - [Sharp](https://sharp.pixelplumbing.com/) - Image processing -Special thanks to the Node.js community and all the open-source contributors who make these integrations possible. \ No newline at end of file +Special thanks to: +- The Node.js community and all the open-source contributors who make these integrations possible. +- The Eliza community for their contributions and feedback. + +For more information about Node.js capabilities: +- [Node.js Documentation](https://nodejs.org/en/docs/) +- [Node.js Developer Portal](https://nodejs.org/en/about/) +- [Node.js GitHub Repository](https://github.com/nodejs/node) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-solana/README.MD b/packages/plugin-solana/README.MD index 9ff8634b31..ed4f95d198 100644 --- a/packages/plugin-solana/README.MD +++ b/packages/plugin-solana/README.MD @@ -291,10 +291,6 @@ For issues and feature requests, please: Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with and builds upon several key technologies: @@ -309,4 +305,16 @@ This plugin integrates with and builds upon several key technologies: - [FOMO](https://fomo.fund/) - Token creation and trading - [Pump.fun](https://pump.fun/) - Token creation and trading -Special thanks to the Solana ecosystem and all the open-source contributors who make these integrations possible. +Special thanks to: +- The Solana ecosystem and all the open-source contributors who make these integrations possible. +- The Eliza community for their contributions and feedback. + +For more information about Solana blockchain capabilities: +- [Solana Documentation](https://docs.solana.com/) +- [Solana Developer Portal](https://solana.com/developers) +- [Solana Network Dashboard](https://solscan.io/) +- [Solana GitHub Repository](https://github.com/solana-labs/solana) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. diff --git a/packages/plugin-starknet/README.md b/packages/plugin-starknet/README.md index e666291b55..b55ebf87b8 100644 --- a/packages/plugin-starknet/README.md +++ b/packages/plugin-starknet/README.md @@ -129,10 +129,6 @@ const result = await runtime.executeAction("CREATE_SUBDOMAIN", { Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with and builds upon several key technologies: @@ -145,4 +141,16 @@ This plugin integrates with and builds upon several key technologies: - [Birdeye](https://birdeye.so/) - Price feeds and analytics - [Helius](https://helius.xyz/) - Enhanced RPC services -Special thanks to the Starknet ecosystem and all the open-source contributors who make these integrations possible. +Special thanks to: +- The Starknet ecosystem and all the open-source contributors who make these integrations possible. +- The Eliza community for their contributions and feedback. + +For more information about Starknet blockchain capabilities: +- [Starknet Documentation](https://docs.starknet.io/) +- [Starknet Developer Portal](https://starknet.io/developers) +- [Starknet Network Dashboard](https://starknet.io/dashboard) +- [Starknet GitHub Repository](https://github.com/starkware-libs/starknet) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-tee/README.md b/packages/plugin-tee/README.md index d5b70909da..32d281ff13 100644 --- a/packages/plugin-tee/README.md +++ b/packages/plugin-tee/README.md @@ -141,8 +141,6 @@ interface RemoteAttestationQuote { ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Key Management** - Advanced key derivation schemes - Multi-party computation support diff --git a/packages/plugin-ton/README.md b/packages/plugin-ton/README.md index d854c605a1..8b0497f098 100644 --- a/packages/plugin-ton/README.md +++ b/packages/plugin-ton/README.md @@ -154,8 +154,6 @@ const PROVIDER_CONFIG = { ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Wallet Management** - Multi-wallet support - Hardware wallet integration diff --git a/packages/plugin-twitter/README.md b/packages/plugin-twitter/README.md index 46064214f3..1bea72c20f 100644 --- a/packages/plugin-twitter/README.md +++ b/packages/plugin-twitter/README.md @@ -179,8 +179,6 @@ Generate a tweet that: ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Content Generation** - Advanced context awareness - Multi-language support diff --git a/packages/plugin-video-generation/README.md b/packages/plugin-video-generation/README.md index 9f251473d0..07ec6d7e39 100644 --- a/packages/plugin-video-generation/README.md +++ b/packages/plugin-video-generation/README.md @@ -169,8 +169,6 @@ videoGeneration.handler(runtime, { ## Future Enhancements -The following features and improvements are planned for future releases: - 1. **Generation Features** - Advanced style control - Multi-scene composition diff --git a/packages/plugin-web-search/README.md b/packages/plugin-web-search/README.md index 6126ee3206..0414ff058b 100644 --- a/packages/plugin-web-search/README.md +++ b/packages/plugin-web-search/README.md @@ -185,6 +185,23 @@ The plugin includes multiple search action similes: Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Tavily API](https://tavily.com/): Advanced search and content analysis API +- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses +- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation + +Special thanks to: +- The Eliza community for their contributions and feedback + +For more information about the search capabilities and tools: +- [Tavily API Documentation](https://docs.tavily.com/) +- [Token Management Guide](https://github.com/dqbd/tiktoken#readme) +- [Search API Best Practices](https://docs.tavily.com/docs/guides/best-practices) + ## License This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-whatsapp/README.md b/packages/plugin-whatsapp/README.md index 875aa50a87..a81c80b0ce 100644 --- a/packages/plugin-whatsapp/README.md +++ b/packages/plugin-whatsapp/README.md @@ -199,10 +199,6 @@ npm run lint Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with and builds upon several key technologies: @@ -218,3 +214,7 @@ For more information about WhatsApp Cloud API and its capabilities, visit: - [WhatsApp Business Platform Documentation](https://developers.facebook.com/docs/whatsapp/cloud-api/overview) - [Meta for Developers Blog](https://developers.facebook.com/blog/) - [WhatsApp Business API GitHub](https://github.com/WhatsApp/WhatsApp-Business-API-Setup-Scripts) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-zksync-era/README.md b/packages/plugin-zksync-era/README.md index 0cf8a7b081..8a122cfadb 100644 --- a/packages/plugin-zksync-era/README.md +++ b/packages/plugin-zksync-era/README.md @@ -197,10 +197,6 @@ The plugin includes validation for: Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - ## Credits This plugin integrates with and builds upon several key technologies: @@ -210,11 +206,13 @@ This plugin integrates with and builds upon several key technologies: - [web3-plugin-zksync](https://www.npmjs.com/package/web3-plugin-zksync): Official ZKSync plugin for Web3.js Special thanks to: -- The Matter Labs team for developing ZKSync Era -- The Web3.js team for maintaining the core Ethereum library - The Eliza community for their contributions and feedback For more information about ZKSync Era and its capabilities, visit: - [ZKSync Documentation](https://docs.zksync.io/) - [Matter Labs Blog](https://blog.matter-labs.io/) -- [ZKSync GitHub](https://github.com/matter-labs/zksync-era) \ No newline at end of file +- [ZKSync GitHub](https://github.com/matter-labs/zksync-era) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file From 47306d4138d6d4958b59d88b201fa27e212effd6 Mon Sep 17 00:00:00 2001 From: zkvm Date: Tue, 31 Dec 2024 17:29:48 +0800 Subject: [PATCH 46/69] tweak of evm transfer template --- packages/plugin-evm/src/templates/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-evm/src/templates/index.ts b/packages/plugin-evm/src/templates/index.ts index 68c6be91d7..3bd01797ec 100644 --- a/packages/plugin-evm/src/templates/index.ts +++ b/packages/plugin-evm/src/templates/index.ts @@ -5,7 +5,7 @@ export const transferTemplate = `Given the recent messages and wallet informatio {{walletInfo}} Extract the following information about the requested transfer: -- Chain to execute on: Must be one of ["ethereum", "base", ...] (like in viem/chains) +- Chain to execute on (like in viem/chains) - Amount to transfer: Must be a string representing the amount in ETH (only number without coin symbol, e.g., "0.1") - Recipient address: Must be a valid Ethereum address starting with "0x" - Token symbol or address (if not native token): Optional, leave as null for ETH transfers From 7a1cf93342ab4c5ccf1c0036203888b533691cfc Mon Sep 17 00:00:00 2001 From: bendanzhentan <455462586@qq.com> Date: Tue, 31 Dec 2024 17:28:20 +0800 Subject: [PATCH 47/69] refactor(plugin-conflux): output detailed invalid content --- .../plugin-conflux/src/actions/confiPump.ts | 9 ++++++--- packages/plugin-conflux/src/types.ts | 18 +++--------------- 2 files changed, 9 insertions(+), 18 deletions(-) diff --git a/packages/plugin-conflux/src/actions/confiPump.ts b/packages/plugin-conflux/src/actions/confiPump.ts index c5d143787d..bd23f71a45 100644 --- a/packages/plugin-conflux/src/actions/confiPump.ts +++ b/packages/plugin-conflux/src/actions/confiPump.ts @@ -213,7 +213,8 @@ export const confiPump: Action = { switch (contentObject.action) { case "CREATE_TOKEN": if (!isPumpCreateContent(contentObject)) { - throw new Error("Invalid content"); + console.error("Invalid PumpCreateContent: ", contentObject); + throw new Error("Invalid PumpCreateContent"); } console.log( "creating: ", @@ -235,7 +236,8 @@ export const confiPump: Action = { case "BUY_TOKEN": if (!isPumpBuyContent(contentObject)) { - throw new Error("Invalid content"); + console.error("Invalid PumpBuyContent: ", contentObject); + throw new Error("Invalid PumpBuyContent"); } value = parseUnits( contentObject.params.value.toString(), @@ -260,7 +262,8 @@ export const confiPump: Action = { case "SELL_TOKEN": if (!isPumpSellContent(contentObject)) { - throw new Error("Invalid content"); + console.error("Invalid PumpSellContent: ", contentObject); + throw new Error("Invalid PumpSellContent"); } const tokenAddress = getAddress( contentObject.params.tokenAddress as `0x${string}` diff --git a/packages/plugin-conflux/src/types.ts b/packages/plugin-conflux/src/types.ts index a605b5a714..9764386437 100644 --- a/packages/plugin-conflux/src/types.ts +++ b/packages/plugin-conflux/src/types.ts @@ -64,25 +64,13 @@ export function isPumpContent(object: any): object is PumpContent { } export function isPumpCreateContent(object: any): object is PumpCreateContent { - if (PumpCreateSchema.safeParse(object).success) { - return true; - } - console.error("Invalid content: ", object); - return false; + return PumpCreateSchema.safeParse(object).success; } export function isPumpBuyContent(object: any): object is PumpBuyContent { - if (PumpBuySchema.safeParse(object).success) { - return true; - } - console.error("Invalid content: ", object); - return false; + return PumpBuySchema.safeParse(object).success; } export function isPumpSellContent(object: any): object is PumpSellContent { - if (PumpSellSchema.safeParse(object).success) { - return true; - } - console.error("Invalid content: ", object); - return false; + return PumpSellSchema.safeParse(object).success; } From 0d044b37e3c80f043d97f8f4742be1d7a9ad7fbb Mon Sep 17 00:00:00 2001 From: zhourunlai Date: Tue, 31 Dec 2024 17:42:23 +0800 Subject: [PATCH 48/69] add experimental telemetry model option --- packages/core/src/generation.ts | 19 +++++++++++++++++++ packages/core/src/types.ts | 29 +++++++++++++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index 67ed1b664a..e645da9ad4 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -34,6 +34,7 @@ import { ServiceType, SearchResponse, ActionResponse, + TelemetrySettings, } from "./types.ts"; import { fal } from "@fal-ai/client"; @@ -164,6 +165,9 @@ export async function generateText({ const max_response_length = modelConfiguration?.max_response_length || models[provider].settings.maxOutputTokens; + const experimental_telemetry = + modelConfiguration?.experimental_telemetry || + models[provider].settings.experimental_telemetry; const apiKey = runtime.token; @@ -209,6 +213,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = openaiResponse; @@ -232,6 +237,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = googleResponse; @@ -258,6 +264,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = anthropicResponse; @@ -284,6 +291,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = anthropicResponse; @@ -314,6 +322,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = grokResponse; @@ -335,6 +344,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = groqResponse; @@ -386,6 +396,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = redpillResponse; @@ -413,6 +424,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = openrouterResponse; @@ -439,6 +451,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = ollamaResponse; @@ -466,6 +479,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = heuristResponse; @@ -515,6 +529,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = openaiResponse; @@ -541,6 +556,7 @@ export async function generateText({ maxTokens: max_response_length, frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, + experimental_telemetry: experimental_telemetry, }); response = galadrielResponse; @@ -1357,6 +1373,7 @@ interface ModelSettings { frequencyPenalty: number; presencePenalty: number; stop?: string[]; + experimental_telemetry?: TelemetrySettings; } /** @@ -1392,6 +1409,7 @@ export const generateObject = async ({ const presence_penalty = models[provider].settings.presence_penalty; const max_context_length = models[provider].settings.maxInputTokens; const max_response_length = models[provider].settings.maxOutputTokens; + const experimental_telemetry = models[provider].settings.experimental_telemetry; const apiKey = runtime.token; try { @@ -1404,6 +1422,7 @@ export const generateObject = async ({ frequencyPenalty: frequency_penalty, presencePenalty: presence_penalty, stop: stop || models[provider].settings.stop, + experimental_telemetry: experimental_telemetry, }; const response = await handleProvider({ diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index dfc19c2eb2..dfb82ff8a5 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -165,6 +165,9 @@ export type Model = { /** Temperature setting */ temperature: number; + + /** Optional telemetry configuration (experimental) */ + experimental_telemetry?: TelemetrySettings; }; /** Optional image generation settings */ @@ -628,12 +631,38 @@ export interface IAgentConfig { [key: string]: string; } +export type TelemetrySettings = { + /** + * Enable or disable telemetry. Disabled by default while experimental. + */ + isEnabled?: boolean; + /** + * Enable or disable input recording. Enabled by default. + * + * You might want to disable input recording to avoid recording sensitive + * information, to reduce data transfers, or to increase performance. + */ + recordInputs?: boolean; + /** + * Enable or disable output recording. Enabled by default. + * + * You might want to disable output recording to avoid recording sensitive + * information, to reduce data transfers, or to increase performance. + */ + recordOutputs?: boolean; + /** + * Identifier for this function. Used to group telemetry data by function. + */ + functionId?: string; +}; + export interface ModelConfiguration { temperature?: number; max_response_length?: number; frequency_penalty?: number; presence_penalty?: number; maxInputTokens?: number; + experimental_telemetry?: TelemetrySettings; } /** From 1afd727537081f2f0e85e395926dec0d43051d00 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 09:43:39 +0000 Subject: [PATCH 49/69] chore: console -> elizaLogger --- .../plugin-conflux/src/actions/confiPump.ts | 38 ++++++++++++------- 1 file changed, 24 insertions(+), 14 deletions(-) diff --git a/packages/plugin-conflux/src/actions/confiPump.ts b/packages/plugin-conflux/src/actions/confiPump.ts index bd23f71a45..ada3c50f8c 100644 --- a/packages/plugin-conflux/src/actions/confiPump.ts +++ b/packages/plugin-conflux/src/actions/confiPump.ts @@ -4,6 +4,7 @@ import { Memory, State, HandlerCallback, + elizaLogger, } from "@elizaos/core"; import { generateObject, composeContext, ModelClass } from "@elizaos/core"; import { @@ -38,7 +39,7 @@ async function ensureAllowance( memeAddress: `0x${string}`, amount: bigint ) { - console.log( + elizaLogger.log( `Checking allowance: token: ${tokenAddress} meme: ${memeAddress} amount: ${amount}` ); @@ -54,10 +55,10 @@ async function ensureAllowance( args: [account.address, memeAddress], }); - console.log("allowance:", allowance); + elizaLogger.log("allowance:", allowance); if (allowance < amount) { - console.log( + elizaLogger.log( `allowance(${allowance}) is less than amount(${amount}), approving...` ); @@ -73,11 +74,11 @@ async function ensureAllowance( kzg: null, }); - console.log(`Approving hash: ${hash}`); + elizaLogger.log(`Approving hash: ${hash}`); await publicClient.waitForTransactionReceipt({ hash }); - console.log(`Approving success: ${hash}`); + elizaLogger.log(`Approving success: ${hash}`); } else { - console.log(`No need to approve`); + elizaLogger.log(`No need to approve`); } } @@ -213,10 +214,13 @@ export const confiPump: Action = { switch (contentObject.action) { case "CREATE_TOKEN": if (!isPumpCreateContent(contentObject)) { - console.error("Invalid PumpCreateContent: ", contentObject); + elizaLogger.error( + "Invalid PumpCreateContent: ", + contentObject + ); throw new Error("Invalid PumpCreateContent"); } - console.log( + elizaLogger.log( "creating: ", contentObject.params.name, contentObject.params.symbol, @@ -236,14 +240,17 @@ export const confiPump: Action = { case "BUY_TOKEN": if (!isPumpBuyContent(contentObject)) { - console.error("Invalid PumpBuyContent: ", contentObject); + elizaLogger.error( + "Invalid PumpBuyContent: ", + contentObject + ); throw new Error("Invalid PumpBuyContent"); } value = parseUnits( contentObject.params.value.toString(), 18 ); - console.log( + elizaLogger.log( "buying: ", contentObject.params.tokenAddress, value @@ -262,13 +269,16 @@ export const confiPump: Action = { case "SELL_TOKEN": if (!isPumpSellContent(contentObject)) { - console.error("Invalid PumpSellContent: ", contentObject); + elizaLogger.error( + "Invalid PumpSellContent: ", + contentObject + ); throw new Error("Invalid PumpSellContent"); } const tokenAddress = getAddress( contentObject.params.tokenAddress as `0x${string}` ); - console.log( + elizaLogger.log( "selling: ", tokenAddress, account.address, @@ -315,7 +325,7 @@ export const confiPump: Action = { value, account, }); - console.log("simulate: ", simulate); + elizaLogger.log("simulate: ", simulate); const hash = await walletClient.sendTransaction({ account, @@ -335,7 +345,7 @@ export const confiPump: Action = { }); } } catch (error) { - console.error(`Error performing the action: ${error}`); + elizaLogger.error(`Error performing the action: ${error}`); if (callback) { callback({ text: `Failed to perform the action: ${content.object.action}: ${error}`, From e59c807979208c24ed51e28f4155966fe56353b4 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 10:19:22 +0000 Subject: [PATCH 50/69] chore: pnpm lock file --- pnpm-lock.yaml | 73 +++----------------------------------------------- 1 file changed, 4 insertions(+), 69 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 24a75803b8..d21bab63e0 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -1923,10 +1923,10 @@ importers: version: 8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.17.9) + version: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -31422,21 +31422,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 @@ -35310,25 +35295,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.9) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35350,7 +35316,7 @@ snapshots: jest-cli@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 @@ -35804,18 +35770,6 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.9) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35830,7 +35784,7 @@ snapshots: jest@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.10.2) @@ -41881,25 +41835,6 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.9) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.6.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.26.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 From 46d75bc03e4f565cea3fe887ba891e667da59f83 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 11:39:45 +0000 Subject: [PATCH 51/69] chore: fix conflicts --- packages/plugin-web-search/README.md | 207 --------------------------- packages/plugin-web-search/Readme.md | 180 ----------------------- 2 files changed, 387 deletions(-) delete mode 100644 packages/plugin-web-search/README.md delete mode 100644 packages/plugin-web-search/Readme.md diff --git a/packages/plugin-web-search/README.md b/packages/plugin-web-search/README.md deleted file mode 100644 index 0414ff058b..0000000000 --- a/packages/plugin-web-search/README.md +++ /dev/null @@ -1,207 +0,0 @@ -# @elizaos/plugin-web-search - -A plugin for powerful web search capabilities, providing efficient search query handling and result processing through a customizable API interface. - -## Overview - -This plugin provides functionality to: -- Execute web search queries with customizable parameters -- Process and format search results -- Handle search API authentication -- Manage token limits and response sizes -- Optimize query performance - -## Installation - -```bash -npm install @elizaos/plugin-web-search -``` - -## Configuration - -The plugin requires the following environment variables: - -```env -TAVILY_API_KEY=your_api_key # Required: API key for search service -``` - -## Usage - -Import and register the plugin in your Eliza configuration: - -```typescript -import { webSearchPlugin } from "@elizaos/plugin-web-search"; - -export default { - plugins: [webSearchPlugin], - // ... other configuration -}; -``` - -## Features - -### Web Search - -The plugin provides comprehensive web search capabilities: - -```typescript -import { webSearch } from "@elizaos/plugin-web-search"; - -// Execute a search query -const result = await webSearch.handler(runtime, { - content: { text: "What is the latest news about AI?" } -}, state, {}, callback); -``` - -### Token Management - -```typescript -// The plugin automatically handles token limits -const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; - -// Example of token-limited response -const response = MaxTokens(searchResult, DEFAULT_MAX_WEB_SEARCH_TOKENS); -``` - -## Development - -### Building - -```bash -npm run build -``` - -### Testing - -```bash -npm run test -``` - -### Development Mode - -```bash -npm run dev -``` - -## Dependencies - -- `@elizaos/core`: Core Eliza functionality -- `js-tiktoken`: Token counting and management -- `tsup`: Build tool -- Other standard dependencies listed in package.json - -## API Reference - -### Core Interfaces - -```typescript -interface Action { - name: "WEB_SEARCH"; - similes: string[]; - description: string; - validate: (runtime: IAgentRuntime, message: Memory) => Promise; - handler: (runtime: IAgentRuntime, message: Memory, state: State, options: any, callback: HandlerCallback) => Promise; - examples: Array>; -} - -interface SearchResult { - title: string; - url: string; - answer?: string; - results?: Array<{ - title: string; - url: string; - }>; -} -``` - -### Plugin Methods - -- `webSearch.handler`: Main method for executing searches -- `generateWebSearch`: Core search generation function -- `MaxTokens`: Token limit management function -- `getTotalTokensFromString`: Token counting utility - -## Common Issues/Troubleshooting - -### Issue: API Authentication Failures -- **Cause**: Invalid or missing Tavily API key -- **Solution**: Verify TAVILY_API_KEY environment variable - -### Issue: Token Limit Exceeded -- **Cause**: Search results exceeding maximum token limit -- **Solution**: Results are automatically truncated to fit within limits - -### Issue: Search Rate Limiting -- **Cause**: Too many requests in short time -- **Solution**: Implement proper request throttling - -## Security Best Practices - -- Store API keys securely using environment variables -- Validate all search inputs -- Implement proper error handling -- Keep dependencies updated -- Monitor API usage and rate limits -- Use HTTPS for API communication - -## Example Usage - -```typescript -// Basic search -const searchQuery = "Latest developments in quantum computing"; -const results = await generateWebSearch(searchQuery, runtime); - -// With formatted response -if (results && results.results.length) { - const formattedResponse = `${results.answer}\n\nFor more details, check out:\n${ - results.results.map((result, index) => - `${index + 1}. [${result.title}](${result.url})` - ).join('\n') - }`; -} -``` - -## Configuration Options - -### Token Management - -```typescript -const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; -const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; -``` - -### Search Actions - -The plugin includes multiple search action similes: -- SEARCH_WEB -- INTERNET_SEARCH -- LOOKUP -- QUERY_WEB -- FIND_ONLINE -- And more... - -## Contributing - -Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. - - -## Credits - -This plugin integrates with and builds upon several key technologies: - -- [Tavily API](https://tavily.com/): Advanced search and content analysis API -- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses -- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation - -Special thanks to: -- The Eliza community for their contributions and feedback - -For more information about the search capabilities and tools: -- [Tavily API Documentation](https://docs.tavily.com/) -- [Token Management Guide](https://github.com/dqbd/tiktoken#readme) -- [Search API Best Practices](https://docs.tavily.com/docs/guides/best-practices) - -## License - -This plugin is part of the Eliza project. See the main project repository for license information. \ No newline at end of file diff --git a/packages/plugin-web-search/Readme.md b/packages/plugin-web-search/Readme.md deleted file mode 100644 index 78b819e71d..0000000000 --- a/packages/plugin-web-search/Readme.md +++ /dev/null @@ -1,180 +0,0 @@ -# Plugin Web Search - -## Overview - -The Web Search Plugin enables powerful and customizable web search capabilities, offering flexibility and ease of integration for modern applications. - -## Features - -- Efficient search query handling. -- Configurable options for advanced customization. -- Optimized for performance and scalability. - -## Handlers - -### `search` - -The `search` handler executes web search queries with specified parameters, returning results in a structured format. - -#### Usage - -```typescript -import { WebSearch } from 'web-search-plugin'; - -const search = new WebSearch({ - apiEndpoint: 'https://api.example.com/search', - timeout: 5000, -}); - -try { - const results = await search.query('example query', { - limit: 10, - sortBy: 'relevance', - }); - console.log('Search Results:', results); -} catch (error) { - console.error('Search failed:', error); -} -``` - -#### Features - -- **Query Customization**: Specify query parameters such as `limit` and `sortBy`. -- **Error Handling**: Handles common search errors gracefully. - -## Configuration - -### Environment Variables - -Set the following environment variables for optimal performance: - -| Variable Name | Description | -| ---------------- | --------------------------------- | -| `API_ENDPOINT` | URL for the search API endpoint. | -| `SEARCH_TIMEOUT` | Timeout duration in milliseconds. | - -Example `.env` file: - -```env -API_ENDPOINT=https://api.example.com/search -SEARCH_TIMEOUT=5000 -``` - -### TypeScript Configuration - -Ensure your `tsconfig.json` is properly configured: - -```json -{ - "compilerOptions": { - "target": "ESNext", - "module": "CommonJS", - "strict": true, - "esModuleInterop": true, - "skipLibCheck": true - } -} -``` - -## Example Workflow - -Streamline your search operations with the following example: - -```typescript -import { WebSearch } from 'web-search-plugin'; - -const search = new WebSearch({ apiEndpoint: 'https://api.example.com/search' }); - -(async () => { - try { - // Execute a search query - const results = await search.query('example', { limit: 5 }); - console.log('Search Results:', results); - } catch (error) { - console.error('Error executing search:', error); - } -})(); -``` - -## Local Testing - -To test locally, you can set up a mock server for the API endpoint: - -1. Install `json-server`: - - ```bash - npm install -g json-server - ``` - -2. Create a `db.json` file with mock search data. - -3. Start the mock server: - - ```bash - json-server --watch db.json --port 3000 - ``` - -4. Update your `.env` file: - ```env - API_ENDPOINT=http://localhost:3000 - ``` - -## Common Issues - -### "API endpoint not defined" - -- Ensure the `API_ENDPOINT` is set in your environment variables. - -### "Search query timeout" - -- Increase the `SEARCH_TIMEOUT` value in the configuration. - -## Dependencies - -This plugin relies on the following: - -- `axios` for HTTP requests. -- `dotenv` for managing environment variables. - -## Development Guide - -### Setup - -1. Clone the repository: - - ```bash - git clone https://github.com/your-repo/web-search-plugin.git - ``` - -2. Install dependencies: - ```bash - npm install - ``` - -### Testing - -Run tests with: - -```bash -npm test -``` - -### Contribution Guidelines - -- Fork the repository. -- Create a feature branch. -- Submit a pull request with a clear description. - -### Security Best Practices - -- Validate user inputs to prevent injection attacks. -- Use HTTPS for secure API communication. - -## Performance Optimization - -- Use caching for frequently queried terms. -- Optimize query parameters for faster responses. - ---- - -This documentation aims to streamline onboarding, reduce support queries, and enable faster adoption of the Web Search Plugin. From 532a0ada805c41fbf5151a282bb50ab5528a1bcf Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 11:44:26 +0000 Subject: [PATCH 52/69] chore: add readme --- packages/plugin-web-search/README.md | 225 +++++++++++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 packages/plugin-web-search/README.md diff --git a/packages/plugin-web-search/README.md b/packages/plugin-web-search/README.md new file mode 100644 index 0000000000..3f60eaa902 --- /dev/null +++ b/packages/plugin-web-search/README.md @@ -0,0 +1,225 @@ +# @elizaos/plugin-web-search + +A plugin for powerful web search capabilities, providing efficient search query handling and result processing through a customizable API interface. + +## Overview + +This plugin provides functionality to: + +- Execute web search queries with customizable parameters +- Process and format search results +- Handle search API authentication +- Manage token limits and response sizes +- Optimize query performance + +## Installation + +```bash +npm install @elizaos/plugin-web-search +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +TAVILY_API_KEY=your_api_key # Required: API key for search service +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { webSearchPlugin } from "@elizaos/plugin-web-search"; + +export default { + plugins: [webSearchPlugin], + // ... other configuration +}; +``` + +## Features + +### Web Search + +The plugin provides comprehensive web search capabilities: + +```typescript +import { webSearch } from "@elizaos/plugin-web-search"; + +// Execute a search query +const result = await webSearch.handler( + runtime, + { + content: { text: "What is the latest news about AI?" }, + }, + state, + {}, + callback +); +``` + +### Token Management + +```typescript +// The plugin automatically handles token limits +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; + +// Example of token-limited response +const response = MaxTokens(searchResult, DEFAULT_MAX_WEB_SEARCH_TOKENS); +``` + +## Development + +### Building + +```bash +npm run build +``` + +### Testing + +```bash +npm run test +``` + +### Development Mode + +```bash +npm run dev +``` + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `js-tiktoken`: Token counting and management +- `tsup`: Build tool +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface Action { + name: "WEB_SEARCH"; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory) => Promise; + handler: ( + runtime: IAgentRuntime, + message: Memory, + state: State, + options: any, + callback: HandlerCallback + ) => Promise; + examples: Array>; +} + +interface SearchResult { + title: string; + url: string; + answer?: string; + results?: Array<{ + title: string; + url: string; + }>; +} +``` + +### Plugin Methods + +- `webSearch.handler`: Main method for executing searches +- `generateWebSearch`: Core search generation function +- `MaxTokens`: Token limit management function +- `getTotalTokensFromString`: Token counting utility + +## Common Issues/Troubleshooting + +### Issue: API Authentication Failures + +- **Cause**: Invalid or missing Tavily API key +- **Solution**: Verify TAVILY_API_KEY environment variable + +### Issue: Token Limit Exceeded + +- **Cause**: Search results exceeding maximum token limit +- **Solution**: Results are automatically truncated to fit within limits + +### Issue: Search Rate Limiting + +- **Cause**: Too many requests in short time +- **Solution**: Implement proper request throttling + +## Security Best Practices + +- Store API keys securely using environment variables +- Validate all search inputs +- Implement proper error handling +- Keep dependencies updated +- Monitor API usage and rate limits +- Use HTTPS for API communication + +## Example Usage + +```typescript +// Basic search +const searchQuery = "Latest developments in quantum computing"; +const results = await generateWebSearch(searchQuery, runtime); + +// With formatted response +if (results && results.results.length) { + const formattedResponse = `${results.answer}\n\nFor more details, check out:\n${results.results + .map( + (result, index) => `${index + 1}. [${result.title}](${result.url})` + ) + .join("\n")}`; +} +``` + +## Configuration Options + +### Token Management + +```typescript +const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; +``` + +### Search Actions + +The plugin includes multiple search action similes: + +- SEARCH_WEB +- INTERNET_SEARCH +- LOOKUP +- QUERY_WEB +- FIND_ONLINE +- And more... + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Tavily API](https://tavily.com/): Advanced search and content analysis API +- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses +- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation + +Special thanks to: + +- The Eliza community for their contributions and feedback + +For more information about the search capabilities and tools: + +- [Tavily API Documentation](https://docs.tavily.com/) +- [Token Management Guide](https://github.com/dqbd/tiktoken#readme) +- [Search API Best Practices](https://docs.tavily.com/docs/guides/best-practices) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. From 8aa99a73b411a4b28552ef328aa43d49440c3305 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 11:59:38 +0000 Subject: [PATCH 53/69] fix: set publishedDate to optional as stated by the docs. --- packages/core/src/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/types.ts b/packages/core/src/types.ts index e94a4edcdf..38fda22f83 100644 --- a/packages/core/src/types.ts +++ b/packages/core/src/types.ts @@ -1237,7 +1237,7 @@ export type SearchResult = { content: string; rawContent?: string; score: number; - publishedDate: string; + publishedDate?: string; }; export type SearchResponse = { From 5ff2aa77c1f8edf7ed039eb3419de7a0c4e27040 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 12:02:17 +0000 Subject: [PATCH 54/69] chore: move tavily package to the core --- package.json | 1 - packages/core/package.json | 155 +++++++++++++++++++------------------ 2 files changed, 78 insertions(+), 78 deletions(-) diff --git a/package.json b/package.json index ea93104e64..983a479390 100644 --- a/package.json +++ b/package.json @@ -56,7 +56,6 @@ "@0glabs/0g-ts-sdk": "0.2.1", "@coinbase/coinbase-sdk": "0.10.0", "@deepgram/sdk": "^3.9.0", - "@tavily/core": "^0.0.2", "@vitest/eslint-plugin": "1.0.1", "amqplib": "0.10.5", "csv-parse": "5.6.0", diff --git a/packages/core/package.json b/packages/core/package.json index e25b865ae1..94c67af288 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -1,79 +1,80 @@ { - "name": "@elizaos/core", - "version": "0.1.7-alpha.2", - "description": "", - "main": "dist/index.js", - "type": "module", - "types": "dist/index.d.ts", - "scripts": { - "build": "tsup --format esm --dts", - "lint": "eslint --fix --cache .", - "watch": "tsc --watch", - "dev": "tsup --format esm --dts --watch", - "build:docs": "cd docs && pnpm run build", - "test": "vitest run", - "test:coverage": "vitest run --coverage", - "test:watch": "vitest" - }, - "author": "", - "license": "MIT", - "devDependencies": { - "@eslint/js": "9.16.0", - "@rollup/plugin-commonjs": "25.0.8", - "@rollup/plugin-json": "6.1.0", - "@rollup/plugin-node-resolve": "15.3.0", - "@rollup/plugin-replace": "5.0.7", - "@rollup/plugin-terser": "0.1.0", - "@rollup/plugin-typescript": "11.1.6", - "@solana/web3.js": "1.95.8", - "@types/fluent-ffmpeg": "2.1.27", - "@types/jest": "29.5.14", - "@types/mocha": "10.0.10", - "@types/node": "22.8.4", - "@types/pdfjs-dist": "2.10.378", - "@types/tar": "6.1.13", - "@types/wav-encoder": "1.3.3", - "@typescript-eslint/eslint-plugin": "8.16.0", - "@typescript-eslint/parser": "8.16.0", - "@vitest/coverage-v8": "2.1.5", - "dotenv": "16.4.5", - "jest": "29.7.0", - "lint-staged": "15.2.10", - "nodemon": "3.1.7", - "pm2": "5.4.3", - "rimraf": "6.0.1", - "rollup": "2.79.2", - "ts-jest": "29.2.5", - "ts-node": "10.9.2", - "tslib": "2.8.1", - "tsup": "8.3.5", - "typescript": "5.6.3" - }, - "dependencies": { - "@ai-sdk/anthropic": "0.0.56", - "@ai-sdk/google": "0.0.55", - "@ai-sdk/google-vertex": "0.0.43", - "@ai-sdk/groq": "0.0.3", - "@ai-sdk/openai": "1.0.5", - "@anthropic-ai/sdk": "0.30.1", - "@fal-ai/client": "1.2.0", - "@types/uuid": "10.0.0", - "ai": "3.4.33", - "anthropic-vertex-ai": "1.0.2", - "fastembed": "1.14.1", - "fastestsmallesttextencoderdecoder": "1.0.22", - "gaxios": "6.7.1", - "glob": "11.0.0", - "handlebars": "^4.7.8", - "js-sha1": "0.7.0", - "js-tiktoken": "1.0.15", - "langchain": "0.3.6", - "ollama-ai-provider": "0.16.1", - "openai": "4.73.0", - "tinyld": "1.3.4", - "together-ai": "0.7.0", - "unique-names-generator": "4.7.1", - "uuid": "11.0.3", - "zod": "3.23.8" - } + "name": "@elizaos/core", + "version": "0.1.7-alpha.2", + "description": "", + "main": "dist/index.js", + "type": "module", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsup --format esm --dts", + "lint": "eslint --fix --cache .", + "watch": "tsc --watch", + "dev": "tsup --format esm --dts --watch", + "build:docs": "cd docs && pnpm run build", + "test": "vitest run", + "test:coverage": "vitest run --coverage", + "test:watch": "vitest" + }, + "author": "", + "license": "MIT", + "devDependencies": { + "@eslint/js": "9.16.0", + "@rollup/plugin-commonjs": "25.0.8", + "@rollup/plugin-json": "6.1.0", + "@rollup/plugin-node-resolve": "15.3.0", + "@rollup/plugin-replace": "5.0.7", + "@rollup/plugin-terser": "0.1.0", + "@rollup/plugin-typescript": "11.1.6", + "@solana/web3.js": "1.95.8", + "@tavily/core": "^0.0.2", + "@types/fluent-ffmpeg": "2.1.27", + "@types/jest": "29.5.14", + "@types/mocha": "10.0.10", + "@types/node": "22.8.4", + "@types/pdfjs-dist": "2.10.378", + "@types/tar": "6.1.13", + "@types/wav-encoder": "1.3.3", + "@typescript-eslint/eslint-plugin": "8.16.0", + "@typescript-eslint/parser": "8.16.0", + "@vitest/coverage-v8": "2.1.5", + "dotenv": "16.4.5", + "jest": "29.7.0", + "lint-staged": "15.2.10", + "nodemon": "3.1.7", + "pm2": "5.4.3", + "rimraf": "6.0.1", + "rollup": "2.79.2", + "ts-jest": "29.2.5", + "ts-node": "10.9.2", + "tslib": "2.8.1", + "tsup": "8.3.5", + "typescript": "5.6.3" + }, + "dependencies": { + "@ai-sdk/anthropic": "0.0.56", + "@ai-sdk/google": "0.0.55", + "@ai-sdk/google-vertex": "0.0.43", + "@ai-sdk/groq": "0.0.3", + "@ai-sdk/openai": "1.0.5", + "@anthropic-ai/sdk": "0.30.1", + "@fal-ai/client": "1.2.0", + "@types/uuid": "10.0.0", + "ai": "3.4.33", + "anthropic-vertex-ai": "1.0.2", + "fastembed": "1.14.1", + "fastestsmallesttextencoderdecoder": "1.0.22", + "gaxios": "6.7.1", + "glob": "11.0.0", + "handlebars": "^4.7.8", + "js-sha1": "0.7.0", + "js-tiktoken": "1.0.15", + "langchain": "0.3.6", + "ollama-ai-provider": "0.16.1", + "openai": "4.73.0", + "tinyld": "1.3.4", + "together-ai": "0.7.0", + "unique-names-generator": "4.7.1", + "uuid": "11.0.3", + "zod": "3.23.8" + } } From f2524a2e64119d8d6f61b528c4821d2f8014bccd Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 12:20:22 +0000 Subject: [PATCH 55/69] chore: pnpm lock file --- pnpm-lock.yaml | 165 +++++++++---------------------------------------- 1 file changed, 28 insertions(+), 137 deletions(-) diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index e7e4911704..5142694837 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -20,9 +20,6 @@ importers: '@deepgram/sdk': specifier: ^3.9.0 version: 3.9.0(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) - '@tavily/core': - specifier: ^0.0.2 - version: 0.0.2 '@vitest/eslint-plugin': specifier: 1.0.1 version: 1.0.1(@typescript-eslint/utils@8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3))(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3)(vitest@2.1.5(@types/node@22.10.2)(jsdom@25.0.1(bufferutil@4.0.8)(canvas@2.11.2(encoding@0.1.13))(utf-8-validate@5.0.10))(terser@5.37.0)) @@ -876,6 +873,9 @@ importers: '@solana/web3.js': specifier: 1.95.8 version: 1.95.8(bufferutil@4.0.8)(encoding@0.1.13)(utf-8-validate@5.0.10) + '@tavily/core': + specifier: ^0.0.2 + version: 0.0.2 '@types/fluent-ffmpeg': specifier: 2.1.27 version: 2.1.27 @@ -1926,10 +1926,10 @@ importers: version: 8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3) jest: specifier: 29.7.0 - version: 29.7.0(@types/node@20.17.9) + version: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) ts-jest: specifier: 29.2.5 - version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3) + version: 29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(esbuild@0.24.2)(jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)))(typescript@5.6.3) typescript: specifier: 5.6.3 version: 5.6.3 @@ -4874,79 +4874,67 @@ packages: resolution: {integrity: sha512-9B+taZ8DlyyqzZQnoeIvDVR/2F4EbMepXMc/NdVbkzsJbzkUjhXv/70GQJ7tdLA4YJgNP25zukcxpX2/SueNrA==} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-arm@1.0.5': resolution: {integrity: sha512-gvcC4ACAOPRNATg/ov8/MnbxFDJqf/pDePbBnuBDcjsI8PssmjoKMAz4LtLaVi+OnSb5FK/yIOamqDwGmXW32g==} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-s390x@1.0.4': resolution: {integrity: sha512-u7Wz6ntiSSgGSGcjZ55im6uvTrOxSIS8/dgoVMoiGE9I6JAfU50yH5BoDlYA1tcuGS7g/QNtetJnxA6QEsCVTA==} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-libvips-linux-x64@1.0.4': resolution: {integrity: sha512-MmWmQ3iPFZr0Iev+BAgVMb3ZyC4KeFc3jFxnNbEPas60e1cIfevbtuyf9nDGIzOaW9PdnDciJm+wFFaTlj5xYw==} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-libvips-linuxmusl-arm64@1.0.4': resolution: {integrity: sha512-9Ti+BbTYDcsbp4wfYib8Ctm1ilkugkA/uscUn6UXK1ldpC1JjiXbLfFZtRlBhjPZ5o1NCLiDbg8fhUPKStHoTA==} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-libvips-linuxmusl-x64@1.0.4': resolution: {integrity: sha512-viYN1KX9m+/hGkJtvYYp+CCLgnJXwiQB39damAO7WMdKWlIhmYTfHjwSbQeUK/20vY154mwezd9HflVFM1wVSw==} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-linux-arm64@0.33.5': resolution: {integrity: sha512-JMVv+AMRyGOHtO1RFBiJy/MBsgz0x4AWrT6QoEVVTyh1E39TrCUpTRI7mx9VksGX4awWASxqCYLCV4wBZHAYxA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [glibc] '@img/sharp-linux-arm@0.33.5': resolution: {integrity: sha512-JTS1eldqZbJxjvKaAkxhZmBqPRGmxgu+qFKSInv8moZ2AmT5Yib3EQ1c6gp493HvrvV8QgdOXdyaIBrhvFhBMQ==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm] os: [linux] - libc: [glibc] '@img/sharp-linux-s390x@0.33.5': resolution: {integrity: sha512-y/5PCd+mP4CA/sPDKl2961b+C9d+vPAveS33s6Z3zfASk2j5upL6fXVPZi7ztePZ5CuH+1kW8JtvxgbuXHRa4Q==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [s390x] os: [linux] - libc: [glibc] '@img/sharp-linux-x64@0.33.5': resolution: {integrity: sha512-opC+Ok5pRNAzuvq1AG0ar+1owsu842/Ab+4qvU879ippJBHvyY5n2mxF1izXqkPYlGuP/M556uh53jRLJmzTWA==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [glibc] '@img/sharp-linuxmusl-arm64@0.33.5': resolution: {integrity: sha512-XrHMZwGQGvJg2V/oRSUfSAfjfPxO+4DkiRh6p2AFjLQztWUuY/o8Mq0eMQVIY7HJ1CDQUJlxGGZRw1a5bqmd1g==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [arm64] os: [linux] - libc: [musl] '@img/sharp-linuxmusl-x64@0.33.5': resolution: {integrity: sha512-WT+d/cgqKkkKySYmqoZ8y3pxx7lx9vVejxW/W4DOFMYVSkErR+w7mf2u8m/y4+xHe7yY9DAXQMWQhpnMuFfScw==} engines: {node: ^18.17.0 || ^20.3.0 || >=21.0.0} cpu: [x64] os: [linux] - libc: [musl] '@img/sharp-wasm32@0.33.5': resolution: {integrity: sha512-ykUW4LVGaMcU9lu9thv85CbRMAwfeadCJHRsg2GmeRa/cJxsVY9Rbd57JcMxBkKHag5U/x7TSBpScF4U8ElVzg==} @@ -5813,28 +5801,24 @@ packages: engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [glibc] '@nx/nx-linux-arm64-musl@19.8.14': resolution: {integrity: sha512-ltty/PDWqkYgu/6Ye65d7v5nh3D6e0n3SacoKRs2Vtfz5oHYRUkSKizKIhEVfRNuHn3d9j8ve1fdcCN4SDPUBQ==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - libc: [musl] '@nx/nx-linux-x64-gnu@19.8.14': resolution: {integrity: sha512-JzE3BuO9RCBVdgai18CCze6KUzG0AozE0TtYFxRokfSC05NU3nUhd/o62UsOl7s6Bqt/9nwrW7JC8pNDiCi9OQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [glibc] '@nx/nx-linux-x64-musl@19.8.14': resolution: {integrity: sha512-2rPvDOQLb7Wd6YiU88FMBiLtYco0dVXF99IJBRGAWv+WTI7MNr47OyK2ze+JOsbYY1d8aOGUvckUvCCZvZKEfg==} engines: {node: '>= 10'} cpu: [x64] os: [linux] - libc: [musl] '@nx/nx-win32-arm64-msvc@19.8.14': resolution: {integrity: sha512-JxW+YPS+EjhUsLw9C6wtk9pQTG3psyFwxhab8y/dgk2s4AOTLyIm0XxgcCJVvB6i4uv+s1g0QXRwp6+q3IR6hg==} @@ -6785,61 +6769,51 @@ packages: resolution: {integrity: sha512-Py5vFd5HWYN9zxBv3WMrLAXY3yYJ6Q/aVERoeUFwiDGiMOWsMs7FokXihSOaT/PMWUty/Pj60XDQndK3eAfE6A==} cpu: [arm] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm-musleabihf@4.29.1': resolution: {integrity: sha512-RiWpGgbayf7LUcuSNIbahr0ys2YnEERD4gYdISA06wa0i8RALrnzflh9Wxii7zQJEB2/Eh74dX4y/sHKLWp5uQ==} cpu: [arm] os: [linux] - libc: [musl] '@rollup/rollup-linux-arm64-gnu@4.29.1': resolution: {integrity: sha512-Z80O+taYxTQITWMjm/YqNoe9d10OX6kDh8X5/rFCMuPqsKsSyDilvfg+vd3iXIqtfmp+cnfL1UrYirkaF8SBZA==} cpu: [arm64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-arm64-musl@4.29.1': resolution: {integrity: sha512-fOHRtF9gahwJk3QVp01a/GqS4hBEZCV1oKglVVq13kcK3NeVlS4BwIFzOHDbmKzt3i0OuHG4zfRP0YoG5OF/rA==} cpu: [arm64] os: [linux] - libc: [musl] '@rollup/rollup-linux-loongarch64-gnu@4.29.1': resolution: {integrity: sha512-5a7q3tnlbcg0OodyxcAdrrCxFi0DgXJSoOuidFUzHZ2GixZXQs6Tc3CHmlvqKAmOs5eRde+JJxeIf9DonkmYkw==} cpu: [loong64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-powerpc64le-gnu@4.29.1': resolution: {integrity: sha512-9b4Mg5Yfz6mRnlSPIdROcfw1BU22FQxmfjlp/CShWwO3LilKQuMISMTtAu/bxmmrE6A902W2cZJuzx8+gJ8e9w==} cpu: [ppc64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-riscv64-gnu@4.29.1': resolution: {integrity: sha512-G5pn0NChlbRM8OJWpJFMX4/i8OEU538uiSv0P6roZcbpe/WfhEO+AT8SHVKfp8qhDQzaz7Q+1/ixMy7hBRidnQ==} cpu: [riscv64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-s390x-gnu@4.29.1': resolution: {integrity: sha512-WM9lIkNdkhVwiArmLxFXpWndFGuOka4oJOZh8EP3Vb8q5lzdSCBuhjavJsw68Q9AKDGeOOIHYzYm4ZFvmWez5g==} cpu: [s390x] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-gnu@4.29.1': resolution: {integrity: sha512-87xYCwb0cPGZFoGiErT1eDcssByaLX4fc0z2nRM6eMtV9njAfEE6OW3UniAoDhX4Iq5xQVpE6qO9aJbCFumKYQ==} cpu: [x64] os: [linux] - libc: [glibc] '@rollup/rollup-linux-x64-musl@4.29.1': resolution: {integrity: sha512-xufkSNppNOdVRCEC4WKvlR1FBDyqCSCpQeMMgv9ZyXqqtKBfkw1yfGMTUTs9Qsl6WQbJnsGboWCp7pJGkeMhKA==} cpu: [x64] os: [linux] - libc: [musl] '@rollup/rollup-win32-arm64-msvc@4.29.1': resolution: {integrity: sha512-F2OiJ42m77lSkizZQLuC+jiZ2cgueWQL5YC9tjo3AgaEw+KJmVxHGSyQfDUoYR9cci0lAywv2Clmckzulcq6ig==} @@ -7558,28 +7532,24 @@ packages: engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [glibc] '@swc/core-linux-arm64-musl@1.10.1': resolution: {integrity: sha512-x0L2Pd9weQ6n8dI1z1Isq00VHFvpBClwQJvrt3NHzmR+1wCT/gcYl1tp9P5xHh3ldM8Cn4UjWCw+7PaUgg8FcQ==} engines: {node: '>=10'} cpu: [arm64] os: [linux] - libc: [musl] '@swc/core-linux-x64-gnu@1.10.1': resolution: {integrity: sha512-yyYEwQcObV3AUsC79rSzN9z6kiWxKAVJ6Ntwq2N9YoZqSPYph+4/Am5fM1xEQYf/kb99csj0FgOelomJSobxQA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [glibc] '@swc/core-linux-x64-musl@1.10.1': resolution: {integrity: sha512-tcaS43Ydd7Fk7sW5ROpaf2Kq1zR+sI5K0RM+0qYLYYurvsJruj3GhBCaiN3gkzd8m/8wkqNqtVklWaQYSDsyqA==} engines: {node: '>=10'} cpu: [x64] os: [linux] - libc: [musl] '@swc/core-win32-arm64-msvc@1.10.1': resolution: {integrity: sha512-D3Qo1voA7AkbOzQ2UGuKNHfYGKL6eejN8VWOoQYtGHHQi1p5KK/Q7V1ku55oxXBsj79Ny5FRMqiRJpVGad7bjQ==} @@ -19608,7 +19578,7 @@ snapshots: '@acuminous/bitsyntax@0.1.2': dependencies: buffer-more-ints: 1.0.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) safe-buffer: 5.1.2 transitivePeerDependencies: - supports-color @@ -21541,7 +21511,7 @@ snapshots: dependencies: '@scure/bip32': 1.6.0 abitype: 1.0.8(typescript@5.6.3)(zod@3.23.8) - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) axios-mock-adapter: 1.22.0(axios@1.7.9) axios-retry: 4.5.0(axios@1.7.9) bip32: 4.0.0 @@ -23372,7 +23342,7 @@ snapshots: '@eslint/config-array@0.19.1': dependencies: '@eslint/object-schema': 2.1.5 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -23398,7 +23368,7 @@ snapshots: '@eslint/eslintrc@3.2.0': dependencies: ajv: 6.12.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) espree: 10.3.0 globals: 14.0.0 ignore: 5.3.2 @@ -28085,7 +28055,7 @@ snapshots: '@tavily/core@0.0.2': dependencies: - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) js-tiktoken: 1.0.15 transitivePeerDependencies: - debug @@ -28747,7 +28717,7 @@ snapshots: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) '@typescript-eslint/visitor-keys': 8.16.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eslint: 9.16.0(jiti@2.4.2) optionalDependencies: typescript: 5.6.3 @@ -28780,7 +28750,7 @@ snapshots: dependencies: '@typescript-eslint/typescript-estree': 8.16.0(typescript@5.6.3) '@typescript-eslint/utils': 8.16.0(eslint@9.16.0(jiti@2.4.2))(typescript@5.6.3) - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) eslint: 9.16.0(jiti@2.4.2) ts-api-utils: 1.4.3(typescript@5.6.3) optionalDependencies: @@ -28811,7 +28781,7 @@ snapshots: dependencies: '@typescript-eslint/types': 8.16.0 '@typescript-eslint/visitor-keys': 8.16.0 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) fast-glob: 3.3.2 is-glob: 4.0.3 minimatch: 9.0.5 @@ -29601,7 +29571,7 @@ snapshots: agent-base@6.0.2: dependencies: - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -29950,13 +29920,13 @@ snapshots: axios-mock-adapter@1.22.0(axios@1.7.9): dependencies: - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) fast-deep-equal: 3.1.3 is-buffer: 2.0.5 axios-retry@4.5.0(axios@1.7.9): dependencies: - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) is-retry-allowed: 2.2.0 axios@0.21.4: @@ -29967,7 +29937,7 @@ snapshots: axios@0.27.2: dependencies: - follow-redirects: 1.15.9 + follow-redirects: 1.15.9(debug@4.4.0) form-data: 4.0.1 transitivePeerDependencies: - debug @@ -29996,14 +29966,6 @@ snapshots: transitivePeerDependencies: - debug - axios@1.7.9: - dependencies: - follow-redirects: 1.15.9 - form-data: 4.0.1 - proxy-from-env: 1.1.0 - transitivePeerDependencies: - - debug - axios@1.7.9(debug@4.4.0): dependencies: follow-redirects: 1.15.9(debug@4.4.0) @@ -31473,21 +31435,6 @@ snapshots: - supports-color - ts-node - create-jest@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/types': 29.6.3 - chalk: 4.1.2 - exit: 0.1.2 - graceful-fs: 4.2.11 - jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - jest-util: 29.7.0 - prompts: 2.4.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - create-jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/types': 29.6.3 @@ -32060,10 +32007,6 @@ snapshots: dependencies: ms: 2.1.3 - debug@4.4.0: - dependencies: - ms: 2.1.3 - debug@4.4.0(supports-color@5.5.0): dependencies: ms: 2.1.3 @@ -32953,7 +32896,7 @@ snapshots: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.6 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) escape-string-regexp: 4.0.0 eslint-scope: 8.2.0 eslint-visitor-keys: 4.2.0 @@ -33537,8 +33480,6 @@ snapshots: async: 0.2.10 which: 1.3.1 - follow-redirects@1.15.9: {} - follow-redirects@1.15.9(debug@4.3.7): optionalDependencies: debug: 4.3.7 @@ -34619,7 +34560,7 @@ snapshots: http-proxy-agent@7.0.2: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -34677,14 +34618,14 @@ snapshots: https-proxy-agent@5.0.1: dependencies: agent-base: 6.0.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color https-proxy-agent@7.0.6: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) transitivePeerDependencies: - supports-color @@ -35367,25 +35308,6 @@ snapshots: - supports-color - ts-node - jest-cli@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - '@jest/test-result': 29.7.0 - '@jest/types': 29.6.3 - chalk: 4.1.2 - create-jest: 29.7.0(@types/node@20.17.9) - exit: 0.1.2 - import-local: 3.2.0 - jest-config: 29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - jest-util: 29.7.0 - jest-validate: 29.7.0 - yargs: 17.7.2 - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest-cli@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35407,7 +35329,7 @@ snapshots: jest-cli@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) '@jest/test-result': 29.7.0 '@jest/types': 29.6.3 chalk: 4.1.2 @@ -35861,18 +35783,6 @@ snapshots: - supports-color - ts-node - jest@29.7.0(@types/node@20.17.9): - dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) - '@jest/types': 29.6.3 - import-local: 3.2.0 - jest-cli: 29.7.0(@types/node@20.17.9) - transitivePeerDependencies: - - '@types/node' - - babel-plugin-macros - - supports-color - - ts-node - jest@29.7.0(@types/node@20.17.9)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)): dependencies: '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) @@ -35887,7 +35797,7 @@ snapshots: jest@29.7.0(@types/node@22.10.2): dependencies: - '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)) + '@jest/core': 29.7.0(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@20.17.9)(typescript@5.6.3)) '@jest/types': 29.6.3 import-local: 3.2.0 jest-cli: 29.7.0(@types/node@22.10.2) @@ -38063,7 +37973,7 @@ snapshots: '@yarnpkg/lockfile': 1.1.0 '@yarnpkg/parsers': 3.0.0-rc.46 '@zkochan/js-yaml': 0.0.7 - axios: 1.7.9 + axios: 1.7.9(debug@4.4.0) chalk: 4.1.2 cli-cursor: 3.1.0 cli-spinners: 2.6.1 @@ -41090,7 +41000,7 @@ snapshots: socks-proxy-agent@8.0.5: dependencies: agent-base: 7.1.3 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) socks: 2.8.3 transitivePeerDependencies: - supports-color @@ -41938,25 +41848,6 @@ snapshots: '@jest/types': 29.6.3 babel-jest: 29.7.0(@babel/core@7.26.0) - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@20.17.9))(typescript@5.6.3): - dependencies: - bs-logger: 0.2.6 - ejs: 3.1.10 - fast-json-stable-stringify: 2.1.0 - jest: 29.7.0(@types/node@20.17.9) - jest-util: 29.7.0 - json5: 2.2.3 - lodash.memoize: 4.1.2 - make-error: 1.3.6 - semver: 7.6.3 - typescript: 5.6.3 - yargs-parser: 21.1.1 - optionalDependencies: - '@babel/core': 7.26.0 - '@jest/transform': 29.7.0 - '@jest/types': 29.6.3 - babel-jest: 29.7.0(@babel/core@7.26.0) - ts-jest@29.2.5(@babel/core@7.26.0)(@jest/transform@29.7.0)(@jest/types@29.6.3)(babel-jest@29.7.0(@babel/core@7.26.0))(jest@29.7.0(@types/node@22.8.4)(ts-node@10.9.2(@swc/core@1.10.1(@swc/helpers@0.5.15))(@types/node@22.8.4)(typescript@5.6.3)))(typescript@5.6.3): dependencies: bs-logger: 0.2.6 @@ -42119,7 +42010,7 @@ snapshots: tuf-js@2.2.1: dependencies: '@tufjs/models': 2.0.1 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) make-fetch-happen: 13.0.1 transitivePeerDependencies: - supports-color @@ -42808,7 +42699,7 @@ snapshots: vite-node@2.1.5(@types/node@22.10.2)(terser@5.37.0): dependencies: cac: 6.7.14 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) es-module-lexer: 1.5.4 pathe: 1.1.2 vite: 5.4.11(@types/node@22.10.2)(terser@5.37.0) @@ -42921,7 +42812,7 @@ snapshots: '@vitest/spy': 2.1.5 '@vitest/utils': 2.1.5 chai: 5.1.2 - debug: 4.4.0 + debug: 4.4.0(supports-color@8.1.1) expect-type: 1.1.0 magic-string: 0.30.17 pathe: 1.1.2 From f50ec5cf84e71c6c15510b96972cdb832835fcb5 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 12:20:43 +0000 Subject: [PATCH 56/69] feat: add error handling for TAVILY_API_KEY key --- packages/core/src/generation.ts | 99 ++++++++++++++++++--------------- 1 file changed, 54 insertions(+), 45 deletions(-) diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index f6374f2caa..3eead5ef70 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -967,33 +967,35 @@ export const generateImage = async ( }); const apiKey = - runtime.imageModelProvider === runtime.modelProvider - ? runtime.token - : (() => { - // First try to match the specific provider - switch (runtime.imageModelProvider) { - case ModelProviderName.HEURIST: - return runtime.getSetting("HEURIST_API_KEY"); - case ModelProviderName.TOGETHER: - return runtime.getSetting("TOGETHER_API_KEY"); - case ModelProviderName.FAL: - return runtime.getSetting("FAL_API_KEY"); - case ModelProviderName.OPENAI: - return runtime.getSetting("OPENAI_API_KEY"); - case ModelProviderName.VENICE: - return runtime.getSetting("VENICE_API_KEY"); - case ModelProviderName.LIVEPEER: - return runtime.getSetting("LIVEPEER_GATEWAY_URL"); - default: - // If no specific match, try the fallback chain - return (runtime.getSetting("HEURIST_API_KEY") ?? - runtime.getSetting("TOGETHER_API_KEY") ?? - runtime.getSetting("FAL_API_KEY") ?? - runtime.getSetting("OPENAI_API_KEY") ?? - runtime.getSetting("VENICE_API_KEY"))?? - runtime.getSetting("LIVEPEER_GATEWAY_URL"); - } - })(); + runtime.imageModelProvider === runtime.modelProvider + ? runtime.token + : (() => { + // First try to match the specific provider + switch (runtime.imageModelProvider) { + case ModelProviderName.HEURIST: + return runtime.getSetting("HEURIST_API_KEY"); + case ModelProviderName.TOGETHER: + return runtime.getSetting("TOGETHER_API_KEY"); + case ModelProviderName.FAL: + return runtime.getSetting("FAL_API_KEY"); + case ModelProviderName.OPENAI: + return runtime.getSetting("OPENAI_API_KEY"); + case ModelProviderName.VENICE: + return runtime.getSetting("VENICE_API_KEY"); + case ModelProviderName.LIVEPEER: + return runtime.getSetting("LIVEPEER_GATEWAY_URL"); + default: + // If no specific match, try the fallback chain + return ( + runtime.getSetting("HEURIST_API_KEY") ?? + runtime.getSetting("TOGETHER_API_KEY") ?? + runtime.getSetting("FAL_API_KEY") ?? + runtime.getSetting("OPENAI_API_KEY") ?? + runtime.getSetting("VENICE_API_KEY") ?? + runtime.getSetting("LIVEPEER_GATEWAY_URL") + ); + } + })(); try { if (runtime.imageModelProvider === ModelProviderName.HEURIST) { const response = await fetch( @@ -1183,28 +1185,31 @@ export const generateImage = async ( }); return { success: true, data: base64s }; - } else if (runtime.imageModelProvider === ModelProviderName.LIVEPEER) { if (!apiKey) { throw new Error("Livepeer Gateway is not defined"); } try { const baseUrl = new URL(apiKey); - if (!baseUrl.protocol.startsWith('http')) { + if (!baseUrl.protocol.startsWith("http")) { throw new Error("Invalid Livepeer Gateway URL protocol"); } - const response = await fetch(`${baseUrl.toString()}text-to-image`, { - method: "POST", - headers: { - "Content-Type": "application/json" - }, - body: JSON.stringify({ - model_id: data.modelId || "ByteDance/SDXL-Lightning", - prompt: data.prompt, - width: data.width || 1024, - height: data.height || 1024 - }) - }); + const response = await fetch( + `${baseUrl.toString()}text-to-image`, + { + method: "POST", + headers: { + "Content-Type": "application/json", + }, + body: JSON.stringify({ + model_id: + data.modelId || "ByteDance/SDXL-Lightning", + prompt: data.prompt, + width: data.width || 1024, + height: data.height || 1024, + }), + } + ); const result = await response.json(); if (!result.images?.length) { throw new Error("No images generated"); @@ -1226,19 +1231,19 @@ export const generateImage = async ( } const blob = await imageResponse.blob(); const arrayBuffer = await blob.arrayBuffer(); - const base64 = Buffer.from(arrayBuffer).toString("base64"); + const base64 = + Buffer.from(arrayBuffer).toString("base64"); return `data:image/jpeg;base64,${base64}`; }) ); return { success: true, - data: base64Images + data: base64Images, }; } catch (error) { console.error(error); return { success: false, error: error }; } - } else { let targetSize = `${data.width}x${data.height}`; if ( @@ -1302,7 +1307,11 @@ export const generateWebSearch = async ( runtime: IAgentRuntime ): Promise => { try { - const tvly = tavily({ apiKey: runtime.getSetting("TAVILY_API_KEY") }); + const apiKey = runtime.getSetting("TAVILY_API_KEY") as string; + if (!apiKey) { + throw new Error("TAVILY_API_KEY is not set"); + } + const tvly = tavily({ apiKey }); const response = await tvly.search(query, { includeAnswer: true, maxResults: 3, // 5 (default) From 7d1212177edfe2f7d6d13ad5fa3070f318ff3d77 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 12:53:14 +0000 Subject: [PATCH 57/69] chore: remove conflicting files --- packages/plugin-image-generation/README.md | 150 -------------- packages/plugin-image-generation/Readme.md | 155 -------------- packages/plugin-web-search/README.md | 225 --------------------- 3 files changed, 530 deletions(-) delete mode 100644 packages/plugin-image-generation/README.md delete mode 100644 packages/plugin-image-generation/Readme.md delete mode 100644 packages/plugin-web-search/README.md diff --git a/packages/plugin-image-generation/README.md b/packages/plugin-image-generation/README.md deleted file mode 100644 index a793abb1a3..0000000000 --- a/packages/plugin-image-generation/README.md +++ /dev/null @@ -1,150 +0,0 @@ -# @elizaos/plugin-image-generation - -Image generation plugin for Eliza OS that supports multiple AI image generation providers. - -## Features - -- Multi-provider support (OpenAI, Together AI, Heurist, FAL AI, Venice AI, Livepeer) -- Intelligent prompt enhancement -- Customizable image parameters -- Automatic image saving and management -- Support for various image formats and sizes -- Fallback provider chain for reliability - -## Installation - -```bash -pnpm install @elizaos/plugin-image-generation -``` - -## Configuration - -The plugin requires at least one of the following API keys: - -```env -ANTHROPIC_API_KEY=your-anthropic-key -TOGETHER_API_KEY=your-together-key -HEURIST_API_KEY=your-heurist-key -FAL_API_KEY=your-fal-key -OPENAI_API_KEY=your-openai-key -VENICE_API_KEY=your-venice-key -LIVEPEER_GATEWAY_URL=your-livepeer-url -``` - -## Usage - -### Basic Image Generation - -```typescript -import { imageGenerationPlugin } from '@elizaos/plugin-image-generation'; - -// Generate an image -const result = await eliza.execute({ - action: 'GENERATE_IMAGE', - content: 'A serene landscape with mountains' -}); -``` - -### Advanced Options - -```typescript -const result = await eliza.execute({ - action: 'GENERATE_IMAGE', - content: 'A futuristic cityscape', - options: { - width: 1024, - height: 1024, - count: 2, - negativePrompt: 'blurry, low quality', - numIterations: 50, - guidanceScale: 7.5, - seed: 12345 - } -}); -``` - -## Supported Image Parameters - -- `width`: Image width (default: 1024) -- `height`: Image height (default: 1024) -- `count`: Number of images to generate -- `negativePrompt`: What to avoid in the generation -- `numIterations`: Number of diffusion steps -- `guidanceScale`: How closely to follow the prompt -- `seed`: For reproducible results -- `modelId`: Specific model to use -- `stylePreset`: Visual style to apply -- `hideWatermark`: Toggle watermark visibility - -## Common Issues & Troubleshooting - -1. **API Key Validation** - - Ensure at least one provider API key is configured - - Check API key validity and quotas - -2. **Image Generation Failures** - - Verify prompt length and content - - Check provider service status - - Confirm supported image dimensions - -3. **File System Issues** - - Ensure write permissions for generatedImages directory - - Check available disk space - - Verify file path accessibility - -## Security Best Practices - -1. **API Key Management** - - Store keys in environment variables - - Never commit API keys to version control - - Rotate keys periodically - -2. **Content Safety** - - Implement content filtering - - Use provider safety settings - - Monitor generated content - -3. **File System Security** - - Sanitize filenames - - Limit access to generated files - - Regular cleanup of temporary files - -## Dependencies - -- @elizaos/core: workspace:* -- tsup: 8.3.5 - -## Contributing - -Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. - -## Credits - -This plugin integrates with and builds upon several key technologies: - -- [OpenAI DALL-E](https://openai.com/dall-e-3): Advanced image generation model -- [Together AI](https://www.together.ai/): AI model deployment platform -- [FAL AI](https://fal.ai/): Serverless AI infrastructure -- [Heurist](https://heurist.ai/): AI model optimization -- [Venice AI](https://venice.ai/): Image generation platform -- [Livepeer](https://livepeer.org/): Decentralized video infrastructure - -Special thanks to: -- The OpenAI team for DALL-E technology -- The Together AI team for model deployment tools -- The FAL AI team for serverless infrastructure -- The Heurist team for optimization capabilities -- The Venice AI and Livepeer teams -- The Eliza community for their contributions and feedback - -For more information about image generation capabilities: -- [DALL-E API Documentation](https://platform.openai.com/docs/guides/images) -- [Together AI Documentation](https://docs.together.ai/) -- [FAL AI Documentation](https://fal.ai/docs) -- [Heurist Documentation](https://docs.heurist.ai/) -- [Venice AI Platform](https://docs.venice.ai/) - -## License - -This plugin is part of the Eliza project. See the main project repository for license information. - diff --git a/packages/plugin-image-generation/Readme.md b/packages/plugin-image-generation/Readme.md deleted file mode 100644 index 3aa868121f..0000000000 --- a/packages/plugin-image-generation/Readme.md +++ /dev/null @@ -1,155 +0,0 @@ -# Plugin Image Generation - -A plugin designed for generating and managing images, providing features like image manipulation, storage integration, and optimized handling for various use cases. - -## Overview - -The Plugin Image Generation offers developers tools to handle image-related operations seamlessly. It supports image creation, manipulation, and integration with storage solutions, making it ideal for applications requiring dynamic image generation. - -### Features - -- Dynamic image generation -- Integration with storage solutions -- Optimized handling for high-resolution images - -## Installation Instructions - -To install the plugin, use the following command: - -```bash -npm install plugin-image-generation -``` - -## Configuration Requirements - -### Environment Variables - -Ensure the following environment variables are set: - -| Variable Name | Description | -| ---------------------- | ----------------------------------- | -| `IMAGE_STORAGE_BUCKET` | Name of the storage bucket. | -| `STORAGE_ACCESS_KEY` | Access key for storage integration. | -| `STORAGE_SECRET_KEY` | Secret key for storage integration. | - -### TypeScript Configuration - -The plugin assumes a TypeScript environment. Ensure your `tsconfig.json` includes the necessary compiler options: - -```json -{ - "compilerOptions": { - "module": "ESNext", - "target": "ES6", - "moduleResolution": "node", - "strict": true - } -} -``` - -## Usage Examples - -### Generate an Image - -The main functionality allows generating an image dynamically. - -```typescript -import { generateImage } from 'plugin-image-generation'; - -const image = await generateImage({ - width: 800, - height: 600, - backgroundColor: '#ffffff', - text: 'Hello World', - font: 'Arial', -}); - -console.log('Generated Image:', image); -``` - -### Upload to Storage - -The plugin supports direct integration with storage solutions for uploading images. - -```typescript -import { uploadImage } from 'plugin-image-generation'; - -const uploadResult = await uploadImage({ - imagePath: 'path/to/image.png', - bucketName: 'my-storage-bucket', -}); - -console.log('Image uploaded successfully:', uploadResult); -``` - -## API Reference - -### generateImage - -#### Parameters - -- `width`: Width of the image. -- `height`: Height of the image. -- `backgroundColor`: Background color of the image. -- `text`: Text to be displayed on the image. -- `font`: Font style for the text. - -#### Returns - -A promise that resolves with the generated image. - -### uploadImage - -#### Parameters - -- `imagePath`: Path to the image file. -- `bucketName`: Name of the storage bucket. - -#### Returns - -A promise that resolves with the upload result. - -## Common Issues/Troubleshooting - -### Issue: Image Not Generated - -**Solution**: Ensure the input parameters for `generateImage` are valid and properly formatted. - -### Issue: Upload Fails - -**Solution**: Verify that the storage credentials and bucket name are correctly configured. - -### Issue: Poor Image Quality - -**Solution**: Check the resolution and ensure that high-quality settings are applied during generation. - -## Additional Documentation - -### Examples Folder - -Include sample projects in the `examples/` directory for users to reference. - -### Testing Guide - -- Run tests using `npm test`. -- Ensure integration tests cover all major functionalities. - -### Plugin Development Guide - -To extend this plugin, add new image generation or manipulation features in the `src/` directory. - -### Security Best Practices - -- Store access keys securely. -- Use environment variables for sensitive information. -- Regularly update dependencies. - -### Performance Optimization Guide - -- Optimize image generation by reducing redundant processing. -- Use efficient algorithms for image manipulation. -- Cache frequently used assets. - -## License - -MIT diff --git a/packages/plugin-web-search/README.md b/packages/plugin-web-search/README.md deleted file mode 100644 index 3f60eaa902..0000000000 --- a/packages/plugin-web-search/README.md +++ /dev/null @@ -1,225 +0,0 @@ -# @elizaos/plugin-web-search - -A plugin for powerful web search capabilities, providing efficient search query handling and result processing through a customizable API interface. - -## Overview - -This plugin provides functionality to: - -- Execute web search queries with customizable parameters -- Process and format search results -- Handle search API authentication -- Manage token limits and response sizes -- Optimize query performance - -## Installation - -```bash -npm install @elizaos/plugin-web-search -``` - -## Configuration - -The plugin requires the following environment variables: - -```env -TAVILY_API_KEY=your_api_key # Required: API key for search service -``` - -## Usage - -Import and register the plugin in your Eliza configuration: - -```typescript -import { webSearchPlugin } from "@elizaos/plugin-web-search"; - -export default { - plugins: [webSearchPlugin], - // ... other configuration -}; -``` - -## Features - -### Web Search - -The plugin provides comprehensive web search capabilities: - -```typescript -import { webSearch } from "@elizaos/plugin-web-search"; - -// Execute a search query -const result = await webSearch.handler( - runtime, - { - content: { text: "What is the latest news about AI?" }, - }, - state, - {}, - callback -); -``` - -### Token Management - -```typescript -// The plugin automatically handles token limits -const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; - -// Example of token-limited response -const response = MaxTokens(searchResult, DEFAULT_MAX_WEB_SEARCH_TOKENS); -``` - -## Development - -### Building - -```bash -npm run build -``` - -### Testing - -```bash -npm run test -``` - -### Development Mode - -```bash -npm run dev -``` - -## Dependencies - -- `@elizaos/core`: Core Eliza functionality -- `js-tiktoken`: Token counting and management -- `tsup`: Build tool -- Other standard dependencies listed in package.json - -## API Reference - -### Core Interfaces - -```typescript -interface Action { - name: "WEB_SEARCH"; - similes: string[]; - description: string; - validate: (runtime: IAgentRuntime, message: Memory) => Promise; - handler: ( - runtime: IAgentRuntime, - message: Memory, - state: State, - options: any, - callback: HandlerCallback - ) => Promise; - examples: Array>; -} - -interface SearchResult { - title: string; - url: string; - answer?: string; - results?: Array<{ - title: string; - url: string; - }>; -} -``` - -### Plugin Methods - -- `webSearch.handler`: Main method for executing searches -- `generateWebSearch`: Core search generation function -- `MaxTokens`: Token limit management function -- `getTotalTokensFromString`: Token counting utility - -## Common Issues/Troubleshooting - -### Issue: API Authentication Failures - -- **Cause**: Invalid or missing Tavily API key -- **Solution**: Verify TAVILY_API_KEY environment variable - -### Issue: Token Limit Exceeded - -- **Cause**: Search results exceeding maximum token limit -- **Solution**: Results are automatically truncated to fit within limits - -### Issue: Search Rate Limiting - -- **Cause**: Too many requests in short time -- **Solution**: Implement proper request throttling - -## Security Best Practices - -- Store API keys securely using environment variables -- Validate all search inputs -- Implement proper error handling -- Keep dependencies updated -- Monitor API usage and rate limits -- Use HTTPS for API communication - -## Example Usage - -```typescript -// Basic search -const searchQuery = "Latest developments in quantum computing"; -const results = await generateWebSearch(searchQuery, runtime); - -// With formatted response -if (results && results.results.length) { - const formattedResponse = `${results.answer}\n\nFor more details, check out:\n${results.results - .map( - (result, index) => `${index + 1}. [${result.title}](${result.url})` - ) - .join("\n")}`; -} -``` - -## Configuration Options - -### Token Management - -```typescript -const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; -const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; -``` - -### Search Actions - -The plugin includes multiple search action similes: - -- SEARCH_WEB -- INTERNET_SEARCH -- LOOKUP -- QUERY_WEB -- FIND_ONLINE -- And more... - -## Contributing - -Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. - -## Credits - -This plugin integrates with and builds upon several key technologies: - -- [Tavily API](https://tavily.com/): Advanced search and content analysis API -- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses -- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation - -Special thanks to: - -- The Eliza community for their contributions and feedback - -For more information about the search capabilities and tools: - -- [Tavily API Documentation](https://docs.tavily.com/) -- [Token Management Guide](https://github.com/dqbd/tiktoken#readme) -- [Search API Best Practices](https://docs.tavily.com/docs/guides/best-practices) - -## License - -This plugin is part of the Eliza project. See the main project repository for license information. From f397690b22a9e0bcf6def070590377ece99f351d Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 12:55:25 +0000 Subject: [PATCH 58/69] chore: README files --- packages/plugin-image-generation/README.MD | 155 ++++++++++++++ packages/plugin-web-search/src/README.MD | 225 +++++++++++++++++++++ 2 files changed, 380 insertions(+) create mode 100644 packages/plugin-image-generation/README.MD create mode 100644 packages/plugin-web-search/src/README.MD diff --git a/packages/plugin-image-generation/README.MD b/packages/plugin-image-generation/README.MD new file mode 100644 index 0000000000..f3488fe44f --- /dev/null +++ b/packages/plugin-image-generation/README.MD @@ -0,0 +1,155 @@ +# Plugin Image Generation + +A plugin designed for generating and managing images, providing features like image manipulation, storage integration, and optimized handling for various use cases. + +## Overview + +The Plugin Image Generation offers developers tools to handle image-related operations seamlessly. It supports image creation, manipulation, and integration with storage solutions, making it ideal for applications requiring dynamic image generation. + +### Features + +- Dynamic image generation +- Integration with storage solutions +- Optimized handling for high-resolution images + +## Installation Instructions + +To install the plugin, use the following command: + +```bash +pnpm install plugin-image-generation +``` + +## Configuration Requirements + +### Environment Variables + +Ensure the following environment variables are set: + +| Variable Name | Description | +| ---------------------- | ----------------------------------- | +| `IMAGE_STORAGE_BUCKET` | Name of the storage bucket. | +| `STORAGE_ACCESS_KEY` | Access key for storage integration. | +| `STORAGE_SECRET_KEY` | Secret key for storage integration. | + +### TypeScript Configuration + +The plugin assumes a TypeScript environment. Ensure your `tsconfig.json` includes the necessary compiler options: + +```json +{ + "compilerOptions": { + "module": "ESNext", + "target": "ES6", + "moduleResolution": "node", + "strict": true + } +} +``` + +## Usage Examples + +### Generate an Image + +The main functionality allows generating an image dynamically. + +```typescript +import { generateImage } from "plugin-image-generation"; + +const image = await generateImage({ + width: 800, + height: 600, + backgroundColor: "#ffffff", + text: "Hello World", + font: "Arial", +}); + +console.log("Generated Image:", image); +``` + +### Upload to Storage + +The plugin supports direct integration with storage solutions for uploading images. + +```typescript +import { uploadImage } from "plugin-image-generation"; + +const uploadResult = await uploadImage({ + imagePath: "path/to/image.png", + bucketName: "my-storage-bucket", +}); + +console.log("Image uploaded successfully:", uploadResult); +``` + +## API Reference + +### generateImage + +#### Parameters + +- `width`: Width of the image. +- `height`: Height of the image. +- `backgroundColor`: Background color of the image. +- `text`: Text to be displayed on the image. +- `font`: Font style for the text. + +#### Returns + +A promise that resolves with the generated image. + +### uploadImage + +#### Parameters + +- `imagePath`: Path to the image file. +- `bucketName`: Name of the storage bucket. + +#### Returns + +A promise that resolves with the upload result. + +## Common Issues/Troubleshooting + +### Issue: Image Not Generated + +**Solution**: Ensure the input parameters for `generateImage` are valid and properly formatted. + +### Issue: Upload Fails + +**Solution**: Verify that the storage credentials and bucket name are correctly configured. + +### Issue: Poor Image Quality + +**Solution**: Check the resolution and ensure that high-quality settings are applied during generation. + +## Additional Documentation + +### Examples Folder + +Include sample projects in the `examples/` directory for users to reference. + +### Testing Guide + +- Run tests using `pnpm test`. +- Ensure integration tests cover all major functionalities. + +### Plugin Development Guide + +To extend this plugin, add new image generation or manipulation features in the `src/` directory. + +### Security Best Practices + +- Store access keys securely. +- Use environment variables for sensitive information. +- Regularly update dependencies. + +### Performance Optimization Guide + +- Optimize image generation by reducing redundant processing. +- Use efficient algorithms for image manipulation. +- Cache frequently used assets. + +## License + +MIT diff --git a/packages/plugin-web-search/src/README.MD b/packages/plugin-web-search/src/README.MD new file mode 100644 index 0000000000..4fbd27dad0 --- /dev/null +++ b/packages/plugin-web-search/src/README.MD @@ -0,0 +1,225 @@ +# @elizaos/plugin-web-search + +A plugin for powerful web search capabilities, providing efficient search query handling and result processing through a customizable API interface. + +## Overview + +This plugin provides functionality to: + +- Execute web search queries with customizable parameters +- Process and format search results +- Handle search API authentication +- Manage token limits and response sizes +- Optimize query performance + +## Installation + +```bash +pnpm install @elizaos/plugin-web-search +``` + +## Configuration + +The plugin requires the following environment variables: + +```env +TAVILY_API_KEY=your_api_key # Required: API key for search service +``` + +## Usage + +Import and register the plugin in your Eliza configuration: + +```typescript +import { webSearchPlugin } from "@elizaos/plugin-web-search"; + +export default { + plugins: [webSearchPlugin], + // ... other configuration +}; +``` + +## Features + +### Web Search + +The plugin provides comprehensive web search capabilities: + +```typescript +import { webSearch } from "@elizaos/plugin-web-search"; + +// Execute a search query +const result = await webSearch.handler( + runtime, + { + content: { text: "What is the latest news about AI?" }, + }, + state, + {}, + callback +); +``` + +### Token Management + +```typescript +// The plugin automatically handles token limits +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; + +// Example of token-limited response +const response = MaxTokens(searchResult, DEFAULT_MAX_WEB_SEARCH_TOKENS); +``` + +## Development + +### Building + +```bash +pnpm run build +``` + +### Testing + +```bash +pnpm run test +``` + +### Development Mode + +```bash +pnpm run dev +``` + +## Dependencies + +- `@elizaos/core`: Core Eliza functionality +- `js-tiktoken`: Token counting and management +- `tsup`: Build tool +- Other standard dependencies listed in package.json + +## API Reference + +### Core Interfaces + +```typescript +interface Action { + name: "WEB_SEARCH"; + similes: string[]; + description: string; + validate: (runtime: IAgentRuntime, message: Memory) => Promise; + handler: ( + runtime: IAgentRuntime, + message: Memory, + state: State, + options: any, + callback: HandlerCallback + ) => Promise; + examples: Array>; +} + +interface SearchResult { + title: string; + url: string; + answer?: string; + results?: Array<{ + title: string; + url: string; + }>; +} +``` + +### Plugin Methods + +- `webSearch.handler`: Main method for executing searches +- `generateWebSearch`: Core search generation function +- `MaxTokens`: Token limit management function +- `getTotalTokensFromString`: Token counting utility + +## Common Issues/Troubleshooting + +### Issue: API Authentication Failures + +- **Cause**: Invalid or missing Tavily API key +- **Solution**: Verify TAVILY_API_KEY environment variable + +### Issue: Token Limit Exceeded + +- **Cause**: Search results exceeding maximum token limit +- **Solution**: Results are automatically truncated to fit within limits + +### Issue: Search Rate Limiting + +- **Cause**: Too many requests in short time +- **Solution**: Implement proper request throttling + +## Security Best Practices + +- Store API keys securely using environment variables +- Validate all search inputs +- Implement proper error handling +- Keep dependencies updated +- Monitor API usage and rate limits +- Use HTTPS for API communication + +## Example Usage + +```typescript +// Basic search +const searchQuery = "Latest developments in quantum computing"; +const results = await generateWebSearch(searchQuery, runtime); + +// With formatted response +if (results && results.results.length) { + const formattedResponse = `${results.answer}\n\nFor more details, check out:\n${results.results + .map( + (result, index) => `${index + 1}. [${result.title}](${result.url})` + ) + .join("\n")}`; +} +``` + +## Configuration Options + +### Token Management + +```typescript +const DEFAULT_MODEL_ENCODING = "gpt-3.5-turbo"; +const DEFAULT_MAX_WEB_SEARCH_TOKENS = 4000; +``` + +### Search Actions + +The plugin includes multiple search action similes: + +- SEARCH_WEB +- INTERNET_SEARCH +- LOOKUP +- QUERY_WEB +- FIND_ONLINE +- And more... + +## Contributing + +Contributions are welcome! Please see the [CONTRIBUTING.md](CONTRIBUTING.md) file for more information. + +## Credits + +This plugin integrates with and builds upon several key technologies: + +- [Tavily API](https://tavily.com/): Advanced search and content analysis API +- [js-tiktoken](https://github.com/dqbd/tiktoken): Token counting for API responses +- [Zod](https://github.com/colinhacks/zod): TypeScript-first schema validation + +Special thanks to: + +- The Eliza community for their contributions and feedback + +For more information about the search capabilities and tools: + +- [Tavily API Documentation](https://docs.tavily.com/) +- [Token Management Guide](https://github.com/dqbd/tiktoken#readme) +- [Search API Best Practices](https://docs.tavily.com/docs/guides/best-practices) + +## License + +This plugin is part of the Eliza project. See the main project repository for license information. From fe976361157a298c3534197ae1a9f5a4b00c36e6 Mon Sep 17 00:00:00 2001 From: Shakker Nerd <165377636+shakkernerd@users.noreply.github.com> Date: Tue, 31 Dec 2024 13:06:12 +0000 Subject: [PATCH 59/69] chore: Update local-development.md --- docs/docs/guides/local-development.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/docs/guides/local-development.md b/docs/docs/guides/local-development.md index b831319db3..d988dd1b83 100644 --- a/docs/docs/guides/local-development.md +++ b/docs/docs/guides/local-development.md @@ -447,4 +447,4 @@ npx knowledge2character - [Configuration Guide](./configuration.md) for setup details - [Advanced Usage](./advanced.md) for complex features - [API Documentation](/api) for complete API reference -- [Contributing Guide](/contributing.md) for contribution guidelines +- [Contributing Guide](../contributing.md) for contribution guidelines From 681026479221b85f09869d3199f9266042070411 Mon Sep 17 00:00:00 2001 From: azep-ninja Date: Tue, 31 Dec 2024 07:27:49 -0700 Subject: [PATCH 60/69] fix continue double responses --- .../plugin-bootstrap/src/actions/continue.ts | 93 ++++++++++++------- 1 file changed, 61 insertions(+), 32 deletions(-) diff --git a/packages/plugin-bootstrap/src/actions/continue.ts b/packages/plugin-bootstrap/src/actions/continue.ts index 24dca5d142..4583fc1bbc 100644 --- a/packages/plugin-bootstrap/src/actions/continue.ts +++ b/packages/plugin-bootstrap/src/actions/continue.ts @@ -91,19 +91,61 @@ export const continueAction: Action = { options: any, callback: HandlerCallback ) => { - if ( - message.content.text.endsWith("?") || - message.content.text.endsWith("!") - ) { - return; - } - if (!state) { state = (await runtime.composeState(message)) as State; } - state = await runtime.updateRecentMessageState(state); + // Get the agent's recent messages + const agentMessages = state.recentMessagesData + .filter((m: { userId: any }) => m.userId === runtime.agentId) + .sort((a: Memory, b: Memory) => { + // Sort by timestamp if available, assuming newer messages have higher timestamps + const aTime = a.createdAt || 0; + const bTime = b.createdAt || 0; + return bTime - aTime; + }); + + // Check for immediate double response (responding twice in a row to the same message) + const lastAgentMessage = agentMessages[0]; + + if (lastAgentMessage?.content?.inReplyTo === message.id) { + // If our last message was already a response to this message, only allow continue if: + // 1. The last message had a CONTINUE action + // 2. We haven't hit the maxContinuesInARow limit + const continueCount = agentMessages + .filter((m: Memory) => m.content?.inReplyTo === message.id) + .filter((m: Memory) => m.content?.action === 'CONTINUE') + .length; + + if (continueCount >= maxContinuesInARow) { + elizaLogger.log(`[CONTINUE] Max continues (${maxContinuesInARow}) reached for this message chain`); + return; + } + + if (lastAgentMessage.content?.action !== 'CONTINUE') { + elizaLogger.log(`[CONTINUE] Last message wasn't a CONTINUE, preventing double response`); + return; + } + } + + // Check if our last message or message ended with a question/exclamation and warrants a stop + if ((lastAgentMessage && lastAgentMessage.content.text && + (lastAgentMessage.content.text.endsWith("?") || + lastAgentMessage.content.text.endsWith("!"))) || (message.content.text.endsWith("?") || message.content.text.endsWith("!"))) { + elizaLogger.log(`[CONTINUE] My last message had question/exclamation. Not proceeding.`); + return; + } + + // Prevent exact duplicate messages + const messageExists = agentMessages + .slice(0, maxContinuesInARow + 1) + .some((m: { content: any }) => m.content.text === message.content.text); + + if (messageExists) { + return; + } + async function _shouldContinue(state: State): Promise { // If none of the above conditions are met, use the generateText to decide const shouldRespondContext = composeContext({ @@ -120,12 +162,14 @@ export const continueAction: Action = { return response; } + // Use AI to determine if we should continue const shouldContinue = await _shouldContinue(state); if (!shouldContinue) { - elizaLogger.log("Not elaborating, returning"); + elizaLogger.log("[CONTINUE] Not elaborating, returning"); return; } + // Generate and send response const context = composeContext({ state, template: @@ -150,32 +194,17 @@ export const continueAction: Action = { type: "continue", }); - // prevent repetition - const messageExists = state.recentMessagesData - .filter((m: { userId: any }) => m.userId === runtime.agentId) - .slice(0, maxContinuesInARow + 1) - .some((m: { content: any }) => m.content === message.content); - - if (messageExists) { - return; - } - await callback(response); - // if the action is CONTINUE, check if we are over maxContinuesInARow + // Check if we need to clear the CONTINUE action if (response.action === "CONTINUE") { - const agentMessages = state.recentMessagesData - .filter((m: { userId: any }) => m.userId === runtime.agentId) - .map((m: { content: any }) => (m.content as Content).action); + const continueCount = agentMessages + .slice(0, maxContinuesInARow) + .filter((m: Memory) => m.content?.action === 'CONTINUE') + .length; - const lastMessages = agentMessages.slice(0, maxContinuesInARow); - if (lastMessages.length >= maxContinuesInARow) { - const allContinues = lastMessages.every( - (m: string | undefined) => m === "CONTINUE" - ); - if (allContinues) { - response.action = null; - } + if (continueCount >= maxContinuesInARow - 1) { // -1 because we're about to add another + response.action = null; } } @@ -598,4 +627,4 @@ export const continueAction: Action = { }, ], ] as ActionExample[][], -} as Action; +} as Action; \ No newline at end of file From 0ab1f17db699be90edd0fcbf2a6a2ae80c0d2c59 Mon Sep 17 00:00:00 2001 From: azep-ninja Date: Tue, 31 Dec 2024 07:33:01 -0700 Subject: [PATCH 61/69] fix google api key --- packages/core/src/generation.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/core/src/generation.ts b/packages/core/src/generation.ts index e5b69cb6ad..f30204ceba 100644 --- a/packages/core/src/generation.ts +++ b/packages/core/src/generation.ts @@ -224,6 +224,7 @@ export async function generateText({ case ModelProviderName.GOOGLE: { const google = createGoogleGenerativeAI({ + apiKey, fetch: runtime.fetch, }); From acf87d81fbd41b10363b36913bb31b6f3be3d727 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 14:59:05 +0000 Subject: [PATCH 62/69] feat: include priority to plugin-tee build --- turbo.json | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/turbo.json b/turbo.json index 2f404476cb..d0aa3b96de 100644 --- a/turbo.json +++ b/turbo.json @@ -16,7 +16,10 @@ }, "@elizaos/plugin-solana#build": { "outputs": ["dist/**"], - "dependsOn": ["@elizaos/plugin-trustdb#build"] + "dependsOn": [ + "@elizaos/plugin-trustdb#build", + "@elizaos/plugin-tee#build" + ] }, "@elizaos/plugin-nft-generation#build": { "outputs": ["dist/**"], From e565f9810217fe91170fbc6c6924f5c27db2c8ad Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 14:59:35 +0000 Subject: [PATCH 63/69] chore: remove build cache with clean command --- scripts/clean.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/scripts/clean.sh b/scripts/clean.sh index 5bc2eef840..7bb40b6e70 100644 --- a/scripts/clean.sh +++ b/scripts/clean.sh @@ -5,7 +5,8 @@ cd "$(dirname "$0")"/.. echo "Cleanup started." # Find and remove node_modules directories, dist directories. find . -type d -name "node_modules" -exec rm -rf {} + \ - -o -type d -name "dist" -exec rm -rf {} + + -o -type d -name "dist" -exec rm -rf {} + \ + -o -type d -name ".turbo" -exec rm -rf {} + # Remove core cache rm -rf ./packages/core/cache From 79738194207e2d1dfac4507e4168cf2b6d7331dd Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 15:02:30 +0000 Subject: [PATCH 64/69] chore: changes to settings --- packages/core/src/settings.ts | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index f6e42a1add..274f637f66 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -3,6 +3,10 @@ import fs from "fs"; import path from "path"; import elizaLogger from "./logger.ts"; +console.log("I AM STARTING AGENT...."); +elizaLogger.log("LET US GOOOOOOOOOOOOOOOOOOOOOO"); +elizaLogger.log("I AM IN SETTINGSSSSSSSS"); + elizaLogger.info("Loading embedding settings:", { USE_OPENAI_EMBEDDING: process.env.USE_OPENAI_EMBEDDING, USE_OLLAMA_EMBEDDING: process.env.USE_OLLAMA_EMBEDDING, @@ -156,10 +160,10 @@ function parseNamespacedSettings(env: Settings): NamespacedSettings { for (const [key, value] of Object.entries(env)) { if (!value) continue; - const [namespace, ...rest] = key.split('.'); + const [namespace, ...rest] = key.split("."); if (!namespace || rest.length === 0) continue; - const settingKey = rest.join('.'); + const settingKey = rest.join("."); namespaced[namespace] = namespaced[namespace] || {}; namespaced[namespace][settingKey] = value; } From a93839c86dac43dbf0df8df2dff2d9544471ec18 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 15:03:56 +0000 Subject: [PATCH 65/69] fix: add @tavily/core to external libs (almost took my life) --- packages/core/tsup.config.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/packages/core/tsup.config.ts b/packages/core/tsup.config.ts index 1ff744633b..cca094e999 100644 --- a/packages/core/tsup.config.ts +++ b/packages/core/tsup.config.ts @@ -9,8 +9,8 @@ export default defineConfig({ platform: "node", target: "node18", bundle: true, - splitting: true, // Add this for better code splitting - dts: true, // Generate declaration files + splitting: true, // Add this for better code splitting + dts: true, // Generate declaration files external: [ "dotenv", // Externalize dotenv to prevent bundling "fs", // Externalize fs to use Node.js built-in module @@ -18,5 +18,6 @@ export default defineConfig({ "http", "https", // Add other modules you want to externalize + "@tavily/core", ], }); From bfcdc7be2a69fd1c0eaa47a2d1e4bac38ef0326a Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 15:07:09 +0000 Subject: [PATCH 66/69] chore: remove logs --- packages/core/src/settings.ts | 4 ---- 1 file changed, 4 deletions(-) diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index 274f637f66..54992d778e 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -3,10 +3,6 @@ import fs from "fs"; import path from "path"; import elizaLogger from "./logger.ts"; -console.log("I AM STARTING AGENT...."); -elizaLogger.log("LET US GOOOOOOOOOOOOOOOOOOOOOO"); -elizaLogger.log("I AM IN SETTINGSSSSSSSS"); - elizaLogger.info("Loading embedding settings:", { USE_OPENAI_EMBEDDING: process.env.USE_OPENAI_EMBEDDING, USE_OLLAMA_EMBEDDING: process.env.USE_OLLAMA_EMBEDDING, From 9126cb17d6b4dd3f55e9867260b616dc8ded0145 Mon Sep 17 00:00:00 2001 From: Shakker Nerd Date: Tue, 31 Dec 2024 15:07:34 +0000 Subject: [PATCH 67/69] chore: console -> elizaLogger --- packages/core/src/settings.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/core/src/settings.ts b/packages/core/src/settings.ts index 54992d778e..d403d16379 100644 --- a/packages/core/src/settings.ts +++ b/packages/core/src/settings.ts @@ -93,7 +93,7 @@ export function loadEnvConfig(): Settings { const result = config(envPath ? { path: envPath } : {}); if (!result.error) { - console.log(`Loaded .env file from: ${envPath}`); + elizaLogger.log(`Loaded .env file from: ${envPath}`); } // Parse namespaced settings From 9aedbdc541e8fe4c03db231a8984519923a118bd Mon Sep 17 00:00:00 2001 From: Cole Gillespie <745064+cole-gillespie@users.noreply.github.com> Date: Tue, 31 Dec 2024 11:43:26 -0500 Subject: [PATCH 68/69] add plugins to the key components section of the faq during a recent discussion on discord it was not clear to some folks the conceptual difference between clients and plugins. this just adds a bit more high level info up top on the FAQ for future creators. --- docs/docs/faq.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/docs/faq.md b/docs/docs/faq.md index 7071cda3b6..2679234299 100644 --- a/docs/docs/faq.md +++ b/docs/docs/faq.md @@ -28,6 +28,7 @@ Eliza's architecture consists of several interconnected components: - **Agents**: These are the core elements that represent individual AI personalities. Agents operate within a runtime environment and interact with various platforms. - **Actions**: Actions are predefined behaviors that agents can execute in response to messages, enabling them to perform tasks and interact with external systems. - **Clients**: Clients act as interfaces between agents and specific platforms, such as Discord, Twitter, and Telegram. They handle platform-specific message formats and communication protocols. +- **Plugins**: Plugins are modular way to extend the core functionality with additional features, actions, evaluators, and providers. They are self-contained modules that can be easily added or removed to customize your agent's capabilities - **Providers**: Providers supply agents with contextual information, including time awareness, user relationships, and data from external sources. - **Evaluators**: These modules assess and extract information from conversations, helping agents track goals, build memory, and maintain context awareness. - **Character Files**: These JSON files define the personality, knowledge, and behavior of each AI agent. From 07e7a549579c4d182ae56fb63ac825c30f0fcad2 Mon Sep 17 00:00:00 2001 From: azep-ninja Date: Tue, 31 Dec 2024 13:35:34 -0700 Subject: [PATCH 69/69] re-build fx --- packages/plugin-bootstrap/src/actions/continue.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/plugin-bootstrap/src/actions/continue.ts b/packages/plugin-bootstrap/src/actions/continue.ts index 4583fc1bbc..29d41504be 100644 --- a/packages/plugin-bootstrap/src/actions/continue.ts +++ b/packages/plugin-bootstrap/src/actions/continue.ts @@ -133,7 +133,7 @@ export const continueAction: Action = { if ((lastAgentMessage && lastAgentMessage.content.text && (lastAgentMessage.content.text.endsWith("?") || lastAgentMessage.content.text.endsWith("!"))) || (message.content.text.endsWith("?") || message.content.text.endsWith("!"))) { - elizaLogger.log(`[CONTINUE] My last message had question/exclamation. Not proceeding.`); + elizaLogger.log(`[CONTINUE] Last message had question/exclamation. Not proceeding.`); return; }