From 94b39ba310bac114398f0b3fee8c3d8e49d789ec Mon Sep 17 00:00:00 2001
From: xxl <505279206@qq.com>
Date: Mon, 16 Dec 2024 14:54:45 +0800
Subject: [PATCH] First commit
---
README.md | 223 +-
README_EN.md | 217 +
assets/github-mark.png | Bin 0 -> 6393 bytes
assets/megrez_logo.png | Bin 0 -> 645809 bytes
assets/multitask.jpg | Bin 0 -> 576400 bytes
assets/opencompass.jpg | Bin 0 -> 590219 bytes
assets/wechat-group.jpg | Bin 0 -> 317428 bytes
assets/wechat-official.jpg | Bin 0 -> 146851 bytes
assets/wechat.jpg | Bin 0 -> 312794 bytes
audio.py | 228 +
config.json | 125 +
configuration.json | 1 +
configuration_megrezo.py | 87 +
generation_config.json | 7 +
image_processing_megrezo.py | 386 +
model-00001-of-00002.safetensors | 3 +
model-00002-of-00002.safetensors | 3 +
model.safetensors.index.json | 1238 +
modeling_megrezo.py | 328 +
modeling_navit_siglip.py | 937 +
preprocessor_config.json | 46 +
processing_megrezo.py | 587 +
processor_config.json | 7 +
resampler.py | 783 +
special_tokens_map.json | 10 +
tokenizer.json | 240093 ++++++++++++++++++++++++++++
tokenizer_config.json | 257 +
tokenizer_wrapper.py | 63 +
28 files changed, 245627 insertions(+), 2 deletions(-)
create mode 100644 README_EN.md
create mode 100644 assets/github-mark.png
create mode 100644 assets/megrez_logo.png
create mode 100644 assets/multitask.jpg
create mode 100644 assets/opencompass.jpg
create mode 100644 assets/wechat-group.jpg
create mode 100644 assets/wechat-official.jpg
create mode 100644 assets/wechat.jpg
create mode 100644 audio.py
create mode 100644 config.json
create mode 100644 configuration.json
create mode 100644 configuration_megrezo.py
create mode 100644 generation_config.json
create mode 100644 image_processing_megrezo.py
create mode 100644 model-00001-of-00002.safetensors
create mode 100644 model-00002-of-00002.safetensors
create mode 100644 model.safetensors.index.json
create mode 100644 modeling_megrezo.py
create mode 100644 modeling_navit_siglip.py
create mode 100644 preprocessor_config.json
create mode 100644 processing_megrezo.py
create mode 100644 processor_config.json
create mode 100644 resampler.py
create mode 100644 special_tokens_map.json
create mode 100644 tokenizer.json
create mode 100644 tokenizer_config.json
create mode 100644 tokenizer_wrapper.py
diff --git a/README.md b/README.md
index 0c88e4e..4cf5862 100644
--- a/README.md
+++ b/README.md
@@ -1,3 +1,222 @@
-# Megrez-3B-Omni_a13954817325658112183931
+---
+license: apache-2.0
+---
+# Megrez-3B-Omni: 首个端侧全模态理解开源模型
+
+
+
+
+ 🔗 GitHub   |   🏠 Demo   |   📖 WeChat Official   |   💬 WeChat Groups  
+
+
+
+ 中文 | English
+
+
-Megrez-3B-Omni
\ No newline at end of file
+
+## 模型简介
+Megrez-3B-Omni是由无问芯穹([Infinigence AI](https://cloud.infini-ai.com/platform/ai))研发的**端侧全模态**理解模型,基于无问大语言模型Megrez-3B-Instruct扩展,同时具备图片、文本、音频三种模态数据的理解分析能力,在三个方面均取得最优精度
+- 在图像理解方面,基于SigLip-400M构建图像Token,在OpenCompass榜单上(综合8个主流多模态评测基准)平均得分66.2,超越LLaVA-NeXT-Yi-34B等更大参数规模的模型。Megrez-3B-Omni也是在MME、MMMU、OCRBench等测试集上目前精度最高的图像理解模型之一,在场景理解、OCR等方面具有良好表现。
+- 在语言理解方面,Megrez-3B-Omni并未牺牲模型的文本处理能力,综合能力较单模态版本(Megrez-3B-Instruct)精度变化小于2%,保持在C-EVAL、MMLU/MMLU Pro、AlignBench等多个测试集上的最优精度优势,依然取得超越上一代14B模型的能力表现
+- 在语音理解方面,采用Qwen2-Audio/whisper-large-v3的Encoder作为语音输入,支持中英文语音输入及多轮对话,支持对输入图片的语音提问,根据语音指令直接响应文本,在多项基准任务上取得了领先的结果
+
+
+## 基础信息
+
+
+
+ |
+ Language Module |
+ Vision Module |
+ Audio Module |
+
+
+
+
+ Architecture |
+ Llama-2 with GQA |
+ SigLip-SO400M |
+ Whisper-large-v3
+(encoder-only) |
+
+
+ # Params (Backbone) |
+ 2.29B |
+ 0.42B |
+ 0.64B |
+
+
+ Connector |
+ - |
+ Cross Attention |
+ Linear |
+
+
+ # Params (Others) |
+ Emb: 0.31B Softmax: 0.31B |
+ Connector: 0.036B |
+ Connector: 0.003B |
+
+
+ # Params (Total) |
+ 4B |
+
+
+ # Vocab Size |
+ 122880 |
+ 64 tokens/slice |
+ - |
+
+
+ Context length |
+ 4K tokens |
+
+
+ Supported languages |
+ Chinese & English |
+
+
+
+
+### 图片理解能力
+- 上图为Megrez-3B-Omni与其他开源模型在主流图片多模态任务上的性能比较
+- 下图为Megrez-3B-Omni在OpenCompass测试集上表现,图片引用自: [InternVL 2.5 Blog Post](https://internvl.github.io/blog/2024-12-05-InternVL-2.5/)
+
+
+![Multitask](assets/multitask.jpg)
+![OpencompassBmk](assets/opencompass.jpg)
+
+| model | basemodel | 发布时间 | OpenCompass | MME | MMMU val | OCRBench | MathVista | RealWorldQA | MMVet | hallusionBench | MMB TEST (en) | MMB TEST (zh) | TextVQA val | AI2D_TEST | MMstar | DocVQA_TEST |
+|-----------------------|-----------------------|----------------|--------------------|----------|-----------|----------|-----------------|-------------|--------|----------------|--------------|--------------|-------------|-----------|-----------|-------------|
+| **Megrez-3B-Omni** | **Megrez-3B** | **2024.12.16** | **66.2** | **2315** | **51.89** | **82.8** | **62** | **71.89** | **60** | **50.12** | **80.8** | **82.3** | **80.3** | **82.05** | **60.46** | **91.62** |
+| Qwen2-VL-2B-Instruct | Qwen2-1.5B | 2024.08.28 | 57.2 | 1872 | 41.1 | 79.4 | 43 | 62.9 | 49.5 | 41.7 | 74.9 | 73.5 | 79.7 | 74.7 | 48 | 90.1 |
+| InternVL2.5-2B | Internlm2.5-1.8B-chat | 2024.12.06 | 59.9 | 2138 | 43.6 | 80.4 | 51.3 | 60.1 | 60.8 | 42.6 | 74.7 | 71.9 | 74.3 | 74.9 | 53.7 | 88.7 |
+| BlueLM-V-3B | - | 2024.11.29 | 66.1 | - | 45.1 | 82.9 | 60.8 | 66.7 | 61.8 | 48 | 83 | 80.5 | 78.4 | 85.3 | 62.3 | 87.8 |
+| InternVL2.5-4B | Qwen2.5-3B-Instruct | 2024.12.06 | 65.1 | 2337 | 52.3 | 82.8 | 60.5 | 64.3 | 60.6 | 46.3 | 81.1 | 79.3 | 76.8 | 81.4 | 58.3 | 91.6 |
+| Baichuan-Omni | Unknown-7B | 2024.10.11 | - | 2186 | 47.3 | 70.0 | 51.9 | 62.6 | 65.4 | 47.8 | 76.2 | 74.9 | 74.3 | - | - | - |
+| MiniCPM-V-2.6 | Qwen2-7B | 2024.08.06 | 65.2 | 2348 | 49.8 | 85.2 | 60.6 | 69.7 | 60 | 48.1 | 81.2 | 79 | 80.1 | 82.1 | 57.26 | 90.8 |
+| Qwen2-VL-7B-Instruct | Qwen2-7B | 2024.08.28 | 67 | 2326 | 54.1 | 84.5 | 58.2 | 70.1 | 62 | 50.6 | 83 | 80.5 | 84.3 | 83 | 60.7 | 94.5 |
+| MiniCPM-Llama3-V-2.5 | Llama3-Instruct 8B | 2024.05.20 | 58.8 | 2024 | 45.8 | 72.5 | 54.3 | 63.5 | 52.8 | 42.4 | 77.2 | 74.2 | 76.6 | 78.4 | - | 84.8 |
+| VITA | Mixtral 8x7B | 2024.08.12 | - | 2097 | 47.3 | 67.8 | 44.9 | 59 | 41.6 | 39.7 | 74.7 | 71.4 | 71.8 | - | - | - |
+| GLM-4V-9B | GLM-4-9B | 2024.06.04 | 59.1 | 2018 | 46.9 | 77.6 | 51.1 | - | 58 | 46.6 | 81.1 | 79.4 | - | 81.1 | 58.7 | - |
+| LLaVA-NeXT-Yi-34B | Yi-34B | 2024.01.18 | 55 | 2006 | 48.8 | 57.4 | 40.4 | 66 | 50.7 | 34.8 | 81.1 | 79 | 69.3 | 78.9 | 51.6 | - |
+| Qwen2-VL-72B-Instruct | Qwen2-72B | 2024.08.28 | 74.8 | 2482 | 64.5 | 87.7 | 70.5 | 77.8 | 74 | 58.1 | 86.5 | 86.6 | 85.5 | 88.1 | 68.3 | 96.5 |
+
+### 文本处理能力
+| | | | | 对话&指令 | | | 中文&英文任务 | | | | 代码任务 | | 数学任务 | |
+|:---------------------:|:--------:|:-----------:|:-------------------------------------:|:---------:|:---------------:|:------:|:-------------:|:----------:|:-----:|:--------:|:---------:|:-----:|:--------:|:-----:|
+| models | 指令模型 | 发布时间 | # Non-Emb Params | MT-Bench | AlignBench (ZH) | IFEval | C-EVAL (ZH) | CMMLU (ZH) | MMLU | MMLU-Pro | HumanEval | MBPP | GSM8K | MATH |
+| Megrez-3B-Omni | Y | 2024.12.16 | 2.3 | 8.4 | 6.94 | 66.5 | 84.0 | 75.3 | 73.3 | 45.2 | 72.6 | 60.6 | 63.8 | 27.3 |
+| Megrez-3B-Instruct | Y | 2024.12.16 | 2.3 | 8.64 | 7.06 | 68.6 | 84.8 | 74.7 | 72.8 | 46.1 | 78.7 | 71.0 | 65.5 | 28.3 |
+| Baichuan-Omni | Y | 2024.10.11 | 7.0 | - | - | - | 68.9 | 72.2 | 65.3 | - | - | - | - | - |
+| VITA | Y | 2024.08.12 | 12.9 | - | - | - | 56.7 | 46.6 | 71.0 | - | - | - | 75.7 | - |
+| Qwen1.5-7B | | 2024.02.04 | 6.5 | - | - | - | 74.1 | 73.1 | 61.0 | 29.9 | 36.0 | 51.6 | 62.5 | 20.3 |
+| Qwen1.5-7B-Chat | Y | 2024.02.04 | 6.5 | 7.60 | 6.20 | - | 67.3 | - | 59.5 | 29.1 | 46.3 | 48.9 | 60.3 | 23.2 |
+| Qwen1.5-14B | | 2024.02.04 | 12.6 | - | - | - | 78.7 | 77.6 | 67.6 | - | 37.8 | 44.0 | 70.1 | 29.2 |
+| Qwen1.5-14B-Chat | Y | 2024.02.04 | 12.6 | 7.9 | - | - | - | - | - | - | - | - | - | - |
+| Qwen2-7B | | 2024.06.07 | 6.5 | - | - | - | 83.2 | 83.9 | 70.3 | 40.0 | 51.2 | 65.9 | 79.9 | 44.2 |
+| Qwen2-7b-Instruct | Y | 2024.06.07 | 6.5 | 8.41 | 7.21 | 51.4 | 80.9 | 77.2 | 70.5 | 44.1 | 79.9 | 67.2 | 85.7 | 52.9 |
+| Qwen2.5-3B-Instruct | Y | 2024.9.19 | 2.8 | - | - | - | - | - | - | 43.7 | 74.4 | 72.7 | 86.7 | 65.9 |
+| Qwen2.5-7B | | 2024.9.19 | 6.5 | - | - | - | - | - | 74.2 | 45.0 | 57.9 | 74.9 | 85.4 | 49.8 |
+| Qwen2.5-7B-Instruct | Y | 2024.09.19 | 6.5 | 8.75 | - | 74.9 | - | - | - | 56.3 | 84.8 | 79.2 | 91.6 | 75.5 |
+| Llama-3.1-8B | | 2024.07.23 | 7.0 | 8.3 | 5.7 | 71.5 | 55.2 | 55.8 | 66.7 | 37.1 | - | - | 84.5 | 51.9 |
+| Llama-3.2-3B | | 2024.09.25 | 2.8 | - | - | 77.4 | - | - | 63.4 | - | - | - | 77.7 | 48.0 |
+| Phi-3.5-mini-instruct | Y | 2024.08.23 | 3.6 | 8.6 | 5.7 | 49.4 | 46.1 | 46.9 | 69.0 | 47.4 | 62.8 | 69.6 | 86.2 | 48.5 |
+| MiniCPM3-4B | Y | 2024.09.05 | 3.9 | 8.41 | 6.74 | 68.4 | 73.6 | 73.3 | 67.2 | - | 74.4 | 72.5 | 81.1 | 46.6 |
+| Yi-1.5-6B-Chat | Y | 2024.05.11 | 5.5 | 7.50 | 6.20 | - | 74.2 | 74.7 | 61.0 | - | 64.0 | 70.9 | 78.9 | 40.5 |
+| GLM-4-9B-chat | Y | 2024.06.04 | 8.2 | 8.35 | 7.01 | 64.5 | 75.6 | 71.5 | 72.4 | - | 71.8 | - | 79.6 | 50.6 |
+| Baichuan2-13B-Base | | 2023.09.06 | 12.6 | - | 5.25 | - | 58.1 | 62.0 | 59.2 | - | 17.1 | 30.2 | 52.8 | 10.1 |
+
+注:Qwen2-1.5B模型的指标在论文和Qwen2.5报告中点数不一致,当前采用原始论文中的精度
+
+### 语音理解能力
+| Model | Base model | Release Time | Fleurs test-zh | WenetSpeech test_net | WenetSpeech test_meeting |
+|:----------------:|:------------------:|:-------------:|:--------------:|:--------------------:|:------------------------:|
+| Megrez-3B-Omni | Megrez-3B-Instruct | 2024.12.16 | 10.8 | - | 16.4 |
+| Whisper-large-v3 | - | 2023.11.06 | 12.4 | 17.5 | 30.8 |
+| Qwen2-Audio-7B | Qwen2-7B | 2024.08.09 | 9 | 11 | 10.7 |
+| Baichuan2-omni | Unknown-7B | 2024.10.11 | 7 | 6.9 | 8.4 |
+| VITA | Mixtral 8x7B | 2024.08.12 | - | -/12.2(CER) | -/16.5(CER) |
+
+### 速度
+| | image_tokens | prefill (tokens/s) | decode (tokens/s) |
+|----------------|:------------:|:------------------:|:-----------------:|
+| Megrez-3B-Omni | 448 | 6312.66 | 1294.9 |
+| Qwen2-VL-2B | 1378 | 7349.39 | 685.66 |
+| MiniCPM-V-2_6 | 448 | 2167.09 | 452.51 |
+
+实验设置:
+- 测试环境:NVIDIA H100,vLLM下输入128个Text token和一张1480x720大小图片,输出128个token,num_seqs固定为8
+- Qwen2-VL-2B虽然其具备更小尺寸的基座模型,但编码上述大小图片后的image_token相较Megrez-3B-Omni多很多,导致此实验下的decode速度小于Megrez-3B-Omni
+
+## 快速上手
+
+### 在线体验
+[HF Chat Demo](https://huggingface.co/spaces/Infinigence/Megrez-3B-Omni)
+
+### 本地部署
+环境安装和vLLM推理代码等部署问题可以参考 [Infini-Megrez-Omni](https://github.com/infinigence/Infini-Megrez-Omni)
+
+如下是一个使用transformers进行推理的例子,通过在content字段中分别传入text、image和audio,可以图文/图音等多种模态和模型进行交互。
+```python
+import torch
+from transformers import AutoModelForCausalLM
+
+path = "{{PATH_TO_PRETRAINED_MODEL}}" # Change this to the path of the model.
+
+model = (
+ AutoModelForCausalLM.from_pretrained(
+ path,
+ trust_remote_code=True,
+ torch_dtype=torch.bfloat16,
+ attn_implementation="flash_attention_2",
+ )
+ .eval()
+ .cuda()
+)
+
+# Chat with text and image
+messages = [
+ {
+ "role": "user",
+ "content": {
+ "text": "Please describe the content of the image.",
+ "image": "./data/sample_image.jpg",
+ },
+ },
+]
+
+# Chat with audio and image
+messages = [
+ {
+ "role": "user",
+ "content": {
+ "image": "./data/sample_image.jpg",
+ "audio": "./data/sample_audio.m4a",
+ },
+ },
+]
+
+MAX_NEW_TOKENS = 100
+response = model.chat(
+ messages,
+ sampling=False,
+ max_new_tokens=MAX_NEW_TOKENS,
+ temperature=0,
+)
+print(response)
+```
+
+## 注意事项
+1. 请将图片尽量在首轮输入以保证推理效果,语音和文本无此限制,可以自由切换
+2. 语音识别(ASR)场景下,只需要将content['text']修改为“将语音转化为文字。”
+3. OCR场景下开启采样可能会引入语言模型幻觉导致的文字变化,可考虑关闭采样进行推理(sampling=False),但关闭采样可能引入模型复读
+
+## 开源协议及使用声明
+- 协议:本仓库中代码依照 [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) 协议开源。
+- 幻觉:大模型天然存在幻觉问题,用户使用过程中请勿完全相信模型生成的内容。
+- 价值观及安全性:本模型已尽全力确保训练过程中使用的数据的合规性,但由于数据的大体量及复杂性,仍有可能存在一些无法预见的问题。如果出现使用本开源模型而导致的任何问题,包括但不限于数据安全问题、公共舆论风险,或模型被误导、滥用、传播或不当利用所带来的任何风险和问题,我们将不承担任何责任。
diff --git a/README_EN.md b/README_EN.md
new file mode 100644
index 0000000..62ca91d
--- /dev/null
+++ b/README_EN.md
@@ -0,0 +1,217 @@
+---
+license: apache-2.0
+---
+# Megrez-3B-Omni: The First Open-Source On-device LLM with Full Modality Understanding
+
+
+
+
+ 🔗 GitHub   |   🏠 Demo   |   📖 WeChat Official   |   💬 WeChat Groups  
+
+
+
+ 中文 | English
+
+
+
+## Introduction
+**Megrez-3B-Omni** is an on-device multimodal understanding LLM model developed by **Infinigence AI** ([Infinigence AI](https://cloud.infini-ai.com/platform/ai)). It is an extension of the Megrez-3B-Instruct model and supports analysis of image, text, and audio modalities. The model achieves state-of-the-art accuracy in all three domains:
+- Image Understanding: By utilizing SigLip-400M for constructing image tokens, Megrez-3B-Omni outperforms models with more parameters such as LLaVA-NeXT-Yi-34B. It is one of the best image understanding models among multiple mainstream benchmarks, including MME, MMMU, and OCRBench. It demonstrates excellent performance in tasks such as scene understanding and OCR.
+- Language Understanding: Megrez-3B-Omni retains text understanding capabilities without significant trade-offs. Compared to its single-modal counterpart (Megrez-3B-Instruct), the accuracy variation is less than 2%, maintaining state-of-the-art performance on benchmarks like C-EVAL, MMLU/MMLU Pro, and AlignBench. It also outperforms previous-generation models with 14B parameters.
+- Speech Understanding: Equipped with the encoder head of Qwen2-Audio/whisper-large-v3, the model supports both Chinese and English speech input, multi-turn conversations, and voice-based questions about input images. It can directly respond to voice commands with text and achieved leading results across multiple benchmarks.
+
+## Model Info
+
+
+
+ |
+ Language Module |
+ Vision Module |
+ Audio Module |
+
+
+
+
+ Architecture |
+ Llama-2 with GQA |
+ SigLip-SO400M |
+ Whisper-large-v3
+(encoder-only) |
+
+
+ # Params (Backbone) |
+ 2.29B |
+ 0.42B |
+ 0.64B |
+
+
+ Connector |
+ - |
+ Cross Attention |
+ Linear |
+
+
+ # Params (Others) |
+ Emb: 0.31B Softmax: 0.31B |
+ Connector: 0.036B |
+ Connector: 0.003B |
+
+
+ # Params (Total) |
+ 4B |
+
+
+ # Vocab Size |
+ 122880 |
+ 64 tokens/slice |
+ - |
+
+
+ Context length |
+ 4K tokens |
+
+
+ Supported languages |
+ Chinese & English |
+
+
+
+
+### Image Understanding
+- The above image compares the performance of Megrez-3B-Omni with other open-source models on mainstream image multimodal tasks.
+- The below image shows the performance of Megrez-3B-Omni on the OpenCompass test set. Image reference: [InternVL 2.5 Blog Post](https://internvl.github.io/blog/2024-12-05-InternVL-2.5/)
+
+![Multitask](assets/multitask.jpg)
+![OpencompassBmk](assets/opencompass.jpg)
+
+| model | basemodel | release time | OpenCompass | MME | MMMU val | OCRBench | MathVista | RealWorldQA | MMVet | hallusionBench | MMB TEST (en) | MMB TEST (zh) | TextVQA val | AI2D_TEST | MMstar | DocVQA_TEST |
+|-----------------------|-----------------------|----------------|--------------------|----------|-----------|----------|-----------------|-------------|--------|----------------|--------------|--------------|-------------|-----------|-----------|-------------|
+| **Megrez-3B-Omni** | **Megrez-3B** | **2024.12.16** | **66.2** | **2315** | **51.89** | **82.8** | **62** | **71.89** | **60** | **50.12** | **80.8** | **82.3** | **80.3** | **82.05** | **60.46** | **91.62** |
+| Qwen2-VL-2B-Instruct | Qwen2-1.5B | 2024.08.28 | 57.2 | 1872 | 41.1 | 79.4 | 43 | 62.9 | 49.5 | 41.7 | 74.9 | 73.5 | 79.7 | 74.7 | 48 | 90.1 |
+| InternVL2.5-2B | Internlm2.5-1.8B-chat | 2024.12.06 | 59.9 | 2138 | 43.6 | 80.4 | 51.3 | 60.1 | 60.8 | 42.6 | 74.7 | 71.9 | 74.3 | 74.9 | 53.7 | 88.7 |
+| BlueLM-V-3B | - | 2024.11.29 | 66.1 | - | 45.1 | 82.9 | 60.8 | 66.7 | 61.8 | 48 | 83 | 80.5 | 78.4 | 85.3 | 62.3 | 87.8 |
+| InternVL2.5-4B | Qwen2.5-3B-Instruct | 2024.12.06 | 65.1 | 2337 | 52.3 | 82.8 | 60.5 | 64.3 | 60.6 | 46.3 | 81.1 | 79.3 | 76.8 | 81.4 | 58.3 | 91.6 |
+| Baichuan-Omni | Unknown-7B | 2024.10.11 | - | 2186 | 47.3 | 70.0 | 51.9 | 62.6 | 65.4 | 47.8 | 76.2 | 74.9 | 74.3 | - | - | - |
+| MiniCPM-V-2.6 | Qwen2-7B | 2024.08.06 | 65.2 | 2348 | 49.8 | 85.2 | 60.6 | 69.7 | 60 | 48.1 | 81.2 | 79 | 80.1 | 82.1 | 57.26 | 90.8 |
+| Qwen2-VL-7B-Instruct | Qwen2-7B | 2024.08.28 | 67 | 2326 | 54.1 | 84.5 | 58.2 | 70.1 | 62 | 50.6 | 83 | 80.5 | 84.3 | 83 | 60.7 | 94.5 |
+| MiniCPM-Llama3-V-2.5 | Llama3-Instruct 8B | 2024.05.20 | 58.8 | 2024 | 45.8 | 72.5 | 54.3 | 63.5 | 52.8 | 42.4 | 77.2 | 74.2 | 76.6 | 78.4 | - | 84.8 |
+| VITA | Mixtral 8x7B | 2024.08.12 | - | 2097 | 47.3 | 67.8 | 44.9 | 59 | 41.6 | 39.7 | 74.7 | 71.4 | 71.8 | - | - | - |
+| GLM-4V-9B | GLM-4-9B | 2024.06.04 | 59.1 | 2018 | 46.9 | 77.6 | 51.1 | - | 58 | 46.6 | 81.1 | 79.4 | - | 81.1 | 58.7 | - |
+| LLaVA-NeXT-Yi-34B | Yi-34B | 2024.01.18 | 55 | 2006 | 48.8 | 57.4 | 40.4 | 66 | 50.7 | 34.8 | 81.1 | 79 | 69.3 | 78.9 | 51.6 | - |
+| Qwen2-VL-72B-Instruct | Qwen2-72B | 2024.08.28 | 74.8 | 2482 | 64.5 | 87.7 | 70.5 | 77.8 | 74 | 58.1 | 86.5 | 86.6 | 85.5 | 88.1 | 68.3 | 96.5 |
+
+### Text Understanding
+| | | | | Chat&Instruction | | | Zh&En Tasks | | | | Code | | Math | |
+|:---------------------:|:--------:|:-----------:|:-------------------------------------:|:---------:|:---------------:|:------:|:-------------:|:----------:|:-----:|:--------:|:---------:|:-----:|:--------:|:-----:|
+| models | Instruction | Release Time | Non-Emb Params | MT-Bench | AlignBench (ZH) | IFEval | C-EVAL (ZH) | CMMLU (ZH) | MMLU | MMLU-Pro | HumanEval | MBPP | GSM8K | MATH |
+| Megrez-3B-Omni | Y | 2024.12.16 | 2.3 | 8.4 | 6.94 | 66.5 | 84.0 | 75.3 | 73.3 | 45.2 | 72.6 | 60.6 | 63.8 | 27.3 |
+| Megrez-3B-Instruct | Y | 2024.12.16 | 2.3 | 8.64 | 7.06 | 68.6 | 84.8 | 74.7 | 72.8 | 46.1 | 78.7 | 71.0 | 65.5 | 28.3 |
+| Baichuan-Omni | Y | 2024.10.11 | 7.0 | - | - | - | 68.9 | 72.2 | 65.3 | - | - | - | - | - |
+| VITA | Y | 2024.08.12 | 12.9 | - | - | - | 56.7 | 46.6 | 71.0 | - | - | - | 75.7 | - |
+| Qwen1.5-7B | | 2024.02.04 | 6.5 | - | - | - | 74.1 | 73.1 | 61.0 | 29.9 | 36.0 | 51.6 | 62.5 | 20.3 |
+| Qwen1.5-7B-Chat | Y | 2024.02.04 | 6.5 | 7.60 | 6.20 | - | 67.3 | - | 59.5 | 29.1 | 46.3 | 48.9 | 60.3 | 23.2 |
+| Qwen1.5-14B | | 2024.02.04 | 12.6 | - | - | - | 78.7 | 77.6 | 67.6 | - | 37.8 | 44.0 | 70.1 | 29.2 |
+| Qwen1.5-14B-Chat | Y | 2024.02.04 | 12.6 | 7.9 | - | - | - | - | - | - | - | - | - | - |
+| Qwen2-7B | | 2024.06.07 | 6.5 | - | - | - | 83.2 | 83.9 | 70.3 | 40.0 | 51.2 | 65.9 | 79.9 | 44.2 |
+| Qwen2-7b-Instruct | Y | 2024.06.07 | 6.5 | 8.41 | 7.21 | 51.4 | 80.9 | 77.2 | 70.5 | 44.1 | 79.9 | 67.2 | 85.7 | 52.9 |
+| Qwen2.5-3B-Instruct | Y | 2024.9.19 | 2.8 | - | - | - | - | - | - | 43.7 | 74.4 | 72.7 | 86.7 | 65.9 |
+| Qwen2.5-7B | | 2024.9.19 | 6.5 | - | - | - | - | - | 74.2 | 45.0 | 57.9 | 74.9 | 85.4 | 49.8 |
+| Qwen2.5-7B-Instruct | Y | 2024.09.19 | 6.5 | 8.75 | - | 74.9 | - | - | - | 56.3 | 84.8 | 79.2 | 91.6 | 75.5 |
+| Llama-3.1-8B | | 2024.07.23 | 7.0 | 8.3 | 5.7 | 71.5 | 55.2 | 55.8 | 66.7 | 37.1 | - | - | 84.5 | 51.9 |
+| Llama-3.2-3B | | 2024.09.25 | 2.8 | - | - | 77.4 | - | - | 63.4 | - | - | - | 77.7 | 48.0 |
+| Phi-3.5-mini-instruct | Y | 2024.08.23 | 3.6 | 8.6 | 5.7 | 49.4 | 46.1 | 46.9 | 69.0 | 47.4 | 62.8 | 69.6 | 86.2 | 48.5 |
+| MiniCPM3-4B | Y | 2024.09.05 | 3.9 | 8.41 | 6.74 | 68.4 | 73.6 | 73.3 | 67.2 | - | 74.4 | 72.5 | 81.1 | 46.6 |
+| Yi-1.5-6B-Chat | Y | 2024.05.11 | 5.5 | 7.50 | 6.20 | - | 74.2 | 74.7 | 61.0 | - | 64.0 | 70.9 | 78.9 | 40.5 |
+| GLM-4-9B-chat | Y | 2024.06.04 | 8.2 | 8.35 | 7.01 | 64.5 | 75.6 | 71.5 | 72.4 | - | 71.8 | - | 79.6 | 50.6 |
+| Baichuan2-13B-Base | | 2023.09.06 | 12.6 | - | 5.25 | - | 58.1 | 62.0 | 59.2 | - | 17.1 | 30.2 | 52.8 | 10.1 |
+
+- The metrics for the Qwen2-1.5B model differ between the original paper and the Qwen2.5 report. Currently, the accuracy figures from the original paper are being used.
+
+### Audio Understanding
+| Model | Base model | Release Time | Fleurs test-zh | WenetSpeech test_net | WenetSpeech test_meeting |
+|:----------------:|:------------------:|:-------------:|:--------------:|:--------------------:|:------------------------:|
+| Megrez-3B-Omni | Megrez-3B-Instruct | 2024.12.16 | 10.8 | - | 16.4 |
+| Whisper-large-v3 | - | 2023.11.06 | 12.4 | 17.5 | 30.8 |
+| Qwen2-Audio-7B | Qwen2-7B | 2024.08.09 | 9 | 11 | 10.7 |
+| Baichuan2-omni | Unknown-7B | 2024.10.11 | 7 | 6.9 | 8.4 |
+| VITA | Mixtral 8x7B | 2024.08.12 | - | -/12.2(CER) | -/16.5(CER) |
+
+### Inference Speed
+| | image_tokens | prefill (tokens/s) | decode (tokens/s) |
+|----------------|:------------:|:------------------:|:-----------------:|
+| Megrez-3B-Omni | 448 | 6312.66 | 1294.9 |
+| Qwen2-VL-2B | 1378 | 7349.39 | 685.66 |
+| MiniCPM-V-2_6 | 448 | 2167.09 | 452.51 |
+
+Setup:
+- The testing environment utilizes an NVIDIA H100 GPU with vLLM. Each test includes 128 text tokens and a 720×1480 image as input, producing 128 output tokens, with `num_seqs` fixed at 8.
+- Under this setup, the decoding speed of Qwen2-VL-2B is slower than Megrez-3B-Omni, despite having a smaller base LLM. This is due to the larger number of image tokens generated when encoding images of the specified size, which impacts actual inference speed.
+
+## Quickstart
+
+### Online Experience
+[HF Chat Demo](https://huggingface.co/spaces/Infinigence/Megrez-3B-Omni)(recommend)
+
+### Local Deployment
+For environment installation and vLLM inference code deployment, refer to [Infini-Megrez-Omni](https://github.com/infinigence/Infini-Megrez-Omni)
+
+Below is an example of using transformers for inference. By passing text, image, and audio in the content field, you can interact with various modalities and models.
+```python
+import torch
+from transformers import AutoModelForCausalLM
+
+path = "{{PATH_TO_PRETRAINED_MODEL}}" # Change this to the path of the model.
+
+model = (
+ AutoModelForCausalLM.from_pretrained(
+ path,
+ trust_remote_code=True,
+ torch_dtype=torch.bfloat16,
+ attn_implementation="flash_attention_2",
+ )
+ .eval()
+ .cuda()
+)
+
+# Chat with text and image
+messages = [
+ {
+ "role": "user",
+ "content": {
+ "text": "Please describe the content of the image.",
+ "image": "./data/sample_image.jpg",
+ },
+ },
+]
+
+# Chat with audio and image
+messages = [
+ {
+ "role": "user",
+ "content": {
+ "image": "./data/sample_image.jpg",
+ "audio": "./data/sample_audio.m4a",
+ },
+ },
+]
+
+MAX_NEW_TOKENS = 100
+response = model.chat(
+ messages,
+ sampling=False,
+ max_new_tokens=MAX_NEW_TOKENS,
+ temperature=0,
+)
+print(response)
+```
+
+## Notes
+1. We recommend to put the images in the first round of chat for better inference results. There are no such restrictions for audio and text, which can be switched freely.
+2. In the Automatic Speech Recognition (ASR) scenario, simply change content['text'] to "Convert speech to text."
+3. In the OCR scenario, enabling sampling may introduce language model hallucinations which cause text changes. Users may consider disabling sampling in inference (sampling=False). However, disabling sampling may introduce model repetition.
+
+
+## Open Source License and Usage Statement
+- **License**: The code in this repository is open-sourced under the [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) license.
+- **Hallucination**: Large models inherently have hallucination issues. Users should not completely trust the content generated by the model.
+- **Values and Safety**: While we have made every effort to ensure compliance of the data used during training, the large volume and complexity of the data may still lead to unforeseen issues. We disclaim any liability for problems arising from the use of this open-source model, including but not limited to data security issues, public opinion risks, or risks and problems caused by misleading, misuse, propagation, or improper utilization of the model.
diff --git a/assets/github-mark.png b/assets/github-mark.png
new file mode 100644
index 0000000000000000000000000000000000000000..6cb3b705d018006a2bd4200ea94c9d5fb98b6f76
GIT binary patch
literal 6393
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
Hu0mjfZ$b4`
literal 0
HcmV?d00001
diff --git a/assets/megrez_logo.png b/assets/megrez_logo.png
new file mode 100644
index 0000000000000000000000000000000000000000..87f77af8bb85b1a0fd6a296e5602123b246adabb
GIT binary patch
literal 645809
zcmeEvcT^MU`u_kbt|*8Nm8KBD6$BLN)d~>=6{Sd35LBw5bVyuOM4E&mNK>(_(nWen
zTqzqBP?07j2%$-dlu$$F_XZ6&iRIqC_xI2D9Os-}$7C||yiff+5Msl9Q^T{tB$EV1WAk1{$ulcpy>fYTOj2AJ;%KghuZh>
zLR(kkvb!n1mg{8w{}MfVgwsN9oDKZ$M~6K;{G+dEpL-?E2>;~!CF7bu`F43P>L=f>
zehn7)!(&Sv{1dXZWMPgU{uDx6Q#pV9E%cni^OJA?__bh0?);K4BR8O5D$T@>UpCCd
zj$clTi5D-T1`~Mh-BZ|I&?L++gGYOZHjR)RjC;
zlrI16Ejy1>BP*spaHK}Y{ki(dheKx`Us-Zbr+xYI$03i2S9jT+zXk<8M~p@|Xp+fu
z9f72IzlTkI{v_{Y6mFLNUn~JQ_~{hP)}NM_el3}qnb0pOvoJ*KmtwPUU6lC}bS~*+e
zM#J@K)BWbk)Xe=9IT0g*U{#iV`9_9|Xr~von4oWAcHYsUnCpX&%4D*H0!ByLr{6l}
zGXrf1J+kto4C8IgogGq}L*)KKRkw9)taeVBWBd}FYY8)J01h{brD6TIFWmx6#gd}GcS|If`Oz8XJQw6YWliOo`Vj>#t0@Zok#w@=;
zcQB^{^|Q~HqObzIDV{mYS?HKJ%*30x#sZbX?oYi+0fgu3ESJ8KWJ*7*Ps08E$xVvY
zIjwIkSTE&bxm4KGt0|-ALi$B7)=c5zllLdhNQ}QXKjx6?CB&=C%i9x5dKnxPOn@at
z%EzNhatLpI7%v3pZ{qh1E@k)(tvl=@*pau6*FdF|bp&2Tlqu6NuP_rNc%E?=@D(Kd
z#&8STDW5pgrFz59Wi>*sKN7U^o&Tuhp<2F{<$CG;Ok6DdlgFoUeDcMG^a)ocEdoE&
zJHT@3l*qkFSJE6$^@WTeUlyhBY-83cE^pb;`Rmh9gVJ>O`@MZp#zKaxGm}zj@db3$
zm%ZYt&S|P|XSwuqSj_j#sgE~j_ke}+s4H=Ff@C$*-_h>n{(<$ko%fcp*lv}CddGZK
z>afZ1XaLKDl%klD!#6QU>!u=vovLe+?OCqG?SIht!H2O5Vy&MZ(Uo?+(1%i*=%qB~
z_1AsRp3cvv``f(w^oIrnd~)A9vfQ@!
zI&Ass2%xk5v*-E6V9{eKXtsm+eFa!G1i}X{`^9ctH(sdn$fqed8P3#wC!7rhXf1nr9urh*P(2l87gijFd7K!6}j-AiQ@MOHhhQF(nsDiwKZdHm=
z9WjOhuCC@1iGuSsf7PX|G=Ak-XTl;{$a3>DOU4_RD50FnaB!)@hsPxuw-~&h{6&R<&pic~{%S$Bl%#A?
zCe7A%r`Vt5>k%0~msG!;7?O7E%!MthrOY_=xBR9rTlp}Qy3ujyie_xs1@4_Og~!Y;
zKOGgWX?}Qqs|m_+rOB&5IL8$ob*ge&5G7`nf1Xb(G&$9~M3Km)()`JuM_u&N)Wy0`
zAD`KQM}6cco9&VxrS#2E<7SZZsZS?H)cW0hZxCw`O&YGKoHiF$|0#Qd$$g>)2L?~b
z+^NY#gq)CJRf17wH+B3Y2@`!n=3Y(5TK67@?_AETU!iUG!hgGA;6Hr?EhbaqBvT&y
z@UloCRDubt+}UoG?!%_ucIk9xX~w4mEEmfL+;}RLX2~Ried=x^E{K)}|MLC|PHzW^
zJr1vg`c!yk+d2mQOxJn8ve&SXnkr)P^=QGfPd+hyruxAk%~Ff!04AkQ!&Kk6Y&FZH
ztAd!kz>x>o$3ATSL;7P;Pxx51c$!(MwvTsmc+2Cno>*!N&)KI)ffatk1x{uzoF`=Y
zuniVon#7M$zq!8_`CBf$09>d+RDQbfw)^(ICj6_WSoPXVLK8*)a=9->iUz0#d|8v;
ztP_T+xZ@2>aY@H5^V8DwRGqQzB8gW6Pxx50LF*E;+r02ur-7>(H-dnT$RaHK`cwaC
z?3o4!#!vqil^9ESCgS_MPpRdEiucTir`1KZff@xa=Z#uFzM4W6#|?~cWBdU)7jI@E
z(PWhTgfIKIpx$ID;mmLOn9L+4S!pU*kmEb68gilP1PT-b8p4_gm^d
z#rBV$d^>21X&m@U148I97{ER>!duK|=IOQNKV%2watt_0&e=Z
zUCibT6;qylT55ik!$8AS!|)rqGzTyRRb1gr!V^B%7>!AyVUN?d20eTt`iv==>6t2i
zANL0&*}BXX-Rt*v8ob!jZQi#hrPVi?l-w|WyEafUg!o}@L^5_R^s-=&752hFzR1il
z;&+TydADn~V}k>;QlT?Gu+Z-_ZGzw?px4
z983+*1AVK{MA*v$&CoQQ;FZ*3evv
z&lA6gpAO(W<_4N%)G75@RuQ6i!jCK&@^nO
z4;x4E;NwRxTc21iS=pLqRdVrjLzcyCivc!ZAPm7HUSx;U9@gKbSsKH*WDx7mt~+CD
zR7Ts{O+V1d<*p)Fq~y9-z=*@&G9uIACBmhMRDQas&g9Rl#^oO8RPg(d8pjd7QMFdW
z!*k{Rvv>MEYhs!-$0vCdd#{z+((nA`&t?U~6HFPGwIFC&B;9Vu^gnk(Y<2UH%Stc_GJ4ymjl)6Q*ne8Z6YrXPl5ZtyL05LE!VitrWU@
z`eY9C;mvQf9SiLx2@VTCU&&0*#@mmdFqJvp)LE(D>_POUSypctLd`xNs|3z<(0gV^
zmj_FsJg^csJtUd0eB-kfh6tCs4p5KQuqrEaF`%klG0hUUp?!A3@Bwa<&6$rgx}1E;
z*ooY$eKKW{#OH{n<7F&}d!y&K>S#IP5ZP#snFl
znv8Xq>9YV3WS#4Af(hfH4^Jl`vW}Ns-|-=dNWf4$8n{l4%@fmV0+H0GI?niMs^C2?
z7udDC;hW%=AkX3s6vm8shz$t7CzjQ#&BrSry}bH_?>TW6?_Lvx8f)m4slRciOJP<3S9#`uRXlCfz_k&x&&sdZukh0WS!L>IQSWn2RN
zwmg7hKCXo+yym9
zTZd-uuOBEW?~~+sPtM;+h4v)Wo&a)`UjQTJ_`X=!V)fS*Wn#Xx5|kE6wwwYwvXK
zHQRD(K)pcmgB6H1=$!F>$A|Tkxx-f~;FpLXQc;0YYu`@2Y~kc{bj579LA{r!D#Eod
z!gwaV)-iMAJ!TPLsWwI=JB{c{cHWAaD%0pVUXitdt(cd49VE~jmMW0fixnLRUnV^<
zJ576d9e6lSM@=Q62{U9ME>69La1k$>1Wf4Bh&cThrBiR5il`2WDNCFn2+N1SF-W25
zGGKy25zH2i{=k41tm6VMKJ?y_VQqzZolbG6_l*)TQ7(|dPh|JSZn9`~iq2gosPsv`
zv1?rOuLIl~Pjrm8oif1ebE+N|hKE0K!V?X;!{e5g-l(m{e_hsyGo=Tz@z2LUX0{b@=<*{0{Dr9j{Ps)>^;}5L|0bUP_WHP)69SBY%ePI*jj$4_35^On}s(c&oa4dy_yt}t)
zhe<(&o6;h2Ks@nCr5%iy?>sXYpUaRmc1MGJ0>cnxS+74PV{jwDapAb
zmKGQbTq1u9gUcwHqG9nu1wOJ1hsSm!)c0YH3?Uqr8w5`|%CHM3krN6|$ZDsdH)b?6qjKy~YofD?M
zFRN_Ph&ZF?KXuU^fSUtu2>eLHxG_IrFu*Ca8+8UFQ$DEET`p7rmcVe}_AeTrwY8>F
zz4@xSVM&btfL}sKZA+A(IX}rXkgoYB(xA?RK&`NE$N?96O}hX3Yy>PBw@qCo!HN&x
z0ahJ@>==8zp!#;9r5B%gqmB~2F!RWithrCsQEOq}T%GW;L7jc~*Dz23Y*+A<@nX7W
z?Kj`4=WeAE7?75On8vof=LmXme4FU<9BDkU*=c3kss+=rpaqqR>e1EhB8K(6;w
zV7GcU+&&8u>_NT?0E!sC2*HPu$}F|g!Nl8yUA-#>Y#lv3mVxj*QFh(w7-Gg7LjW#*
zV)EVN-sgxEUAKK69fbO#n?zhm`0k3|nPt|z^TyNCSybYxFEpd^qk(cY@#eqHW|R|d
z+4|h<3)`(#5aTUs-oHB9%(v*_Ex}Ya5+=K1Y~y&PDIw>`j=sNn&~K_PUOj6-rFm#PBr}R%Lsc0D%ygJjOJ3pE
zcYHh^A-w%0>YX`!_F8l;5OER#5Ge>PluZe~gkPDeTEF^xL
z?%Z%!=AOsf`MzQt$HAh)vcCh@P=
zIaR06NCH3KyhkXZ#sOJ`oo~BR2_IV*4--eb0{sulvX4t706*UsRhnlqcSi3isBKE{
z2syR2cb{RBG8E^v7;n~gaoXROD_TP~TSXCka$Y?zxTHa(P@x0(HIoGOT`x`Znj_fJ
z947itqm4GY{*FH#DJ7`VX!69BR-Rqklhe``8!huJB>^{Wh4Jf+stzgAuxVZUkqjZ8>5UQ4EK5Jw
zuiG~^990t(LaYO^;X}EQsv^~MC;pP6kdqV(e)W)DBxvWve0@zk(XGuzJfo99Zf|PX
z<}6PgKhOKc7Sn5lHua>R9MT3p!o)r}OTzSZ%$Cl*mEZJa+VKcObLbL72s6qhrab1Jp*jyBE^V_kKrB
zUdY}TyTJ}rRJFqKAm~ouA{kJ*XR){P=UcXRJ>3JAO*hOgJvrQ#vEfUgSagH{
zn_T0S8SUvhw9a)WzUy%HX1;?ZzzLu~`T|`LZ9i3jr+H^?RF~I<{JOIkzj4W$AVXp}
zqG^JwSF8&qS<8p7Q3R4>(Mywk^v;8|AVC#qgHfjo*~tpC&v;JYLYn>$%;d-@)kk1|8K*bVq+`%BHsYEpScX@4XZ0yCN9(c>*>ko{nB0b0-
zIJ!^{Bd8f*T6)ZSi7x+FE{47^T2^10Vz45s2*y6Ym>$6$5Pdr&hjtos$+XW
zun=t*6-|`yUt|$2R=goaCT;J4>m^-o?JI!CC=U?c${E`_Ph%<*!sRy{EZ7S;mgeDt
zF$Ptd<-_`8F35nAPgjo*4;kOCM+zMpyDQRSM)o;>UvKOxFt?NppRLR^%8o3=3fHf(
z;?4*VUeV?mGk?`*RKXWJU&hrJR%c*%Is5Z>xm@8A91z;{k-_hFTf^!%2%@SD*09W@
zvz1Vk6vDK0;B5C_uExN}$i`LMy|VJGAlwM|beK>f%;(zF(UNG8iVYI4)pb<(+^`+(
zt_~?6oBp-m_oF0T=`#&TJ#~f=>aOxB-2ru`q)qDBk%Xj%ZsjlVX|4tvN2~>5GMB~v
z6cBX8q*n^SP3?WT2~Yo+LEeH-#{&x+Hn<239%Vlgb&whW>PqIMZ0?nQo}wkpyAC)bpQc%zHK4e(PZI!i
za|hv3nVF-whl_4tZBNOg1i8wMSE;i!B0>rqVx7MsVvvAX4r-F2ZNL>=jHHO9Y32+i
zPFuwjKUYWa+0RKmm@FTiqPb+C`iOzKy!9}^M~5jcG(6+P!hy^ibSpe!Mo@20M5es4
zT6I#t%gEw9Z^4ImVK(ZApzJR1s4`*T2JUW{gFiVJ3oMZ``U9=Fg65C*O-?(`oCNsC
z;}}Ke+=-5ku~FX}JsPhbC%I7k$E`7s>SyIT@6C;OOlHnKnxEpSnYTjok2V1-s?OpuI1k)pLmGBA&2(o@^Kx8&!DX*2#*D{EOWt5o@4y
zuMS%hElmAcNhO?wvRjMHe`A;K@OqXb+g#5Ep_4w1wv2@#N<6G7GRRsKCAsT^hVEuF
zt2sAX$`myuGwau00q@eGkWNRMPk{s`Z`EGFRfYqnvAdS^P6JgrLSm4~Xeqt}V2T$$v_G?l?|uY
zWYCd51IOL1F!A^PzWnSDR8z!h=bz~f%9jH@Y*}|`xh(##Fl~OWz{8-nDgG7+>Nz57
zsB_xt29aphX4uwle=f#{`l?3`*^xrLjrhHo+NMQuNit1{fRjpRCLiZeW&yHfIJ5+V
z>D7_ePY(>g@FxeWo|YA+l6m}R@)EY7$?M`Wwp;mB9T1N)g;I8);!n#}=hA}%=
zKmlak9;e^OW)LpJ)aYP1&%czsU}iN121#GtADt4}-E`oGdjqn9A{k>5lpHdX&@aS>
z%d5yxX%KPFd%$1q6Af8cj*I(hu7J4r?U+PeV#9g7GX0HB+_ZG`tj(#y2oRg9S^!sG
z{61#=G_@Oryvl~_D?h%7`81m)sGc+38I`c~!@n;n5;XDz=p=mk)B4Xv30*D&glwKQ
z^Vd}W+kFYtwC0B%rJENTnshTd4Xg+NhQjPJ5aZF?)isP2a%&^JRS`5~6GH6O#6H@H
zTsKlA6T>4hlZ%*BZ4{vvBmszZz-_!nn3u{d8T9btuz=$S-AA|O214hDH#O!i{V64z
zAV*K>q@B12Z^M9wQiqo@fL-qh4w6n{g>EdHxtJpdtev>3~ve>@>ln
z67EI8qK3jOW#nw9MSdh(sx-7ENJe7g5kdLB524PJT}DaYcXKETP}f+R`GD{QB$IQS
z2J~Nio;LS3!|+wWDxgL*^G;R-ZBI2*P9oj~Y0HhFcGvuALN>@lBh^073CG`N!Cl!I
ziN(9`)qp^z|$gCz%t3Dm|c>H-GcpkKx
z3S$dTJo>(C%W{FTlNLyL4M>nX;ARX+@Su?vSQ*w#2W{X|3*s}hlZ_#ruEH+vNq;6TgkAa9e}5Q@_kQ_Uk>G$2yjSYt_Ge)
z15e~3lp^^k#P)HMLl=tQT(fh$0&eu~XzWJGV5dY4Sy~d%!Nu_s@#DTjGU}&MHUhOp
zdXVc58pQj)3-xBhy}ALSeFek@Sv#ujG%k;|MNN5+VpnDI!TgVCu7Ha)-~Zm8S?{6H
zM0!lsyB>BLRrX#aQ4}h?_CxNb3_;c@YU8hq1=07Z=S1t+^d&aLFHaG7JBju&Ei-8(Bf4kpk`-fxh^J}u)nPNxLmzSk59LB~=cTNLTRVM5u}`{DA*8wf_pQtk5IVl7s#VRN`tnl`
z*3Xt)>X}a-zJ21~Jk$!xZZAr&fIzM;wbEM|#K2VboyJ0XV~6IHzlbqyJJncRnH(gX
zRLnFy25LSgi=5rL3-zQ(G2?H7-boO7PhLqq2udmFxxim;ASuxH
zJ)KE8gK;p5sDu>?Eh$+y7Q%>dz{O9F%w~zsS)3hTpP<>GcGIZeMI3+Evgy5ufc)N{
z*$0XZ7baydwj|D$+WEHX>PNK=5abaq(fiUK)0XEWMJ;$v?n0%8!xo?&O8xw;SgRI+
zU}!VtaWAb(0APlCLQ&R+kAL#6fy{N=o*3@vGBPW^kgok3WTfWubP5zvWZ$2Lxgg6h
zcVusrlz`d?la17FU@f}oq32eMP69r06
z!SfbYL2-w7{G|*Qd;N#bV6$J{?mwN(y9bdQ+{BiFq%;)-@D5-#AotP&LFuD=C46u_
ztU9CZsn;&Z%wuauI%2>n#A&v)-IB}!5y7|7{CMDh_+Z|QQF9P1LD^-)K{-(8`}8rm
zXe=Kgg8-gL!EO5ygMWYz>PXK^HF-!9ZsHi%PfF(!4%tzFYO7B`Zpqq=z7DEl|>$
z!@Rz~el7v|)cy`BuAZC#>UQ7+MBsVEkTqHz4}GZ#J*@*
zD`0#IKnvwI=Yh#F9$Gu-nGWs*V7=N+V)(Pus3xA_=knKE{+*l5dOoEW_yjaaK9LdQ
zMQb=pWxGI)SW65@{ZSO+W*$F4oMr
zW74rTdvk^3dEQ!H$b8=qb-bz5_u-zfJv4uUu*XQXx!%uFxnFhDtt2t??R}N-
zhww`H+9p^s%J1X6r@p@eQ`e87#
z3M9oZlec5Top^=ptzW@b>oWKUPO9!Yo
ziIq_`9LNzJ$!SmjsX@?os@WXPG)sf0H;q=hQb7Tht2G+|K^u#}C>cM}
zgXY5>R5!r<2Pq`u17o#Q1ZCEce@Og{m<+>;)}II@-|^unG;Y!GgF5>4l%7FWHS7DO(+N;33hsV&7V
zr*mEJ*%z75m5AcWFT5T?)|YaZiTxCGE$I6x$hE-@a}_bJC~)pI&+uaq!@~4m$7G4M
zV1ZX}@{pn`g6y$IMA-v8o)wAct)#nG@!AlH1kQIi=4)(qo@1RCg}&)v#|io@zz<{h
zf&x6L0?L>5HGtnW013iYrJcqaiNxm(K=EkGmlg(F=(u$nj3mN8PurF>Tk@q-?lY47PYPBdQbyHK&>H(ey`vQLfeAbA2tCp0A?3rOSRD6tScH1
ziZ6p;?KC(jLT$PLf@{k(0k1jV{Jx!)gjhNh%zGy}-ITH6=xtt}v;#`#uYA?`1cLVW
zs@|ZSu;A`)zk#eBjNE|UFK1(ij@$*-_5vxSM@v8el(<1FcfteJ4{L!FW<27~($y}s
ztY!&Z+#qsDuIp6Za_z92Uk!bHPG`p-4&CYwZ!YJxh^8i<2%(p_7OZWp5M(X}Sgj=n
zbgdp4yJi#{4kQd91YeZ-)Fa`9ZzMcQm+(eaAmIfgi+9}hUo82Mc6w&3eigB>E5KJDd%5Zr`c}vdwnz#3tnA4LDCQ
z1Sb2`(w<0uj)Uz<0jG(jBsDDR$w~J&<`wE^{LUY~|4L|0J)fCgl`b3G#U^|qLOAx6fYmvU#`*Vh>m9$Cp~Z3KVy7gnF0eWZQuA%S`20>9H`Jkgu|
z2TC>O`n!v2>HC$Q>|;ll1e+a}bPtz082xx6{UOJzA)Q;fhlWxiYyLw+sLS>bABLZW
zK1sVsUbYhT3Y7*R9oCASk1#
zRKr^xj~vB1WmUo>)V?XXmzo;nnNfb$hawgqnzLitb31;Yzxlr4ZHKF09J-RKf`AGW
z3LBp7>ihfj!T3Wp=T)*_hhJ1qtI${h<=?HK@_E^v2j2Y#?TPNZaKh+GicBi83=xs!
zR%>`h6tY7zB6qAw@dY1Px_j<
zZBX;IHFH*-@sEFJ!^K|#DPo~Z7fQ}D1a7Ac)pu93fDZw0y0o5sB2dqcdtq{gsX42k
zW0MYj%fs{g<2U$xmxt`=IWUUI-?D29wT1e+pS(FxjOgvY!P;}-1P-Td4FTq4&rweWeLQyfB9+%t!`nNLg_wu2V_E*Br63WzSg9sPUFkn2a`RR}5
z9?A==v6{wvs`pu}CrAO`Yl$)>NnN
zXM8+3xAVF~`daj{9xcny@m4T+&`t2-9NFLh-9t;~esx;7scpMrH?e))J~d6R;I!5IMm
zwwv*WR&7u}6m?P9dElbui&GYsHka2A_(kZpMM>MQFWd@v#VvF3O`lF6-Jo+?ux8z%
ziAEspQH?
z{8;8W3JC2_N70{Evz#1-4BQmVo@09yG|j#v=Z^>CRZ_k$XKROCFqv5eC~i^_;DWS*
z0L2RK1)dVrskeits^JcUF&>!MHf_YrN@!%y*ScBfbzh+1Ci#D$?4$fBvi8C6Ce*UD
zUO&X$SPs>0ahA_`t-Pykn_v^bXBA?qR6A`^}9jAa89Um
zH83wng!k--1I;N0@x#7-2DM?rEa@ALjh?v*90hAnKJ2y~Z(p1!d8mH8lznFcyQB!D
z1o~DqmzWJ~OZ|He@$(V8_Cszv%(mh@RZBsw^rVNk{}?Rh-TC#=o8Y;(DargPEX7Nl
zKfM~FwAZq=SuNRC9_V(^Y%%xI+sS?FueYo-;bp^Z`Vs@e4@RHc%K255L3czUx*2A#
z(>wedB=jl00Fy3JbOEe2hN{9y}Pjx
zsIPFX(U6Ng-VJL!&ig$IjH1uor5h6y1s=NwA2=R>TrRrpgrMD%ZL_xC(WObm%fnWD
zz`gh=eQ|BndiQQcmNL{E^j9p0(^|Cc3BTWc*E|^Tw!9p7`0{#QC~;5Q`IGVP#IpzE
zH=O>Sd$G39brvg%w4JYrf8fb81FA!3JBvUBP9;VreW76EDAp50;W0?$C$MZ5)7nRm
zAsl1lVKv=IqullLzJKm_y^lK(ON;)F&rfeJTMM-v{z63m!FV5G6FcqVL{|NqVUWU$
zVlXksJpzb0he+cyEnI
z|I&l>BYF?kE~3EeyT}UP^8~J^?AnoTJMgo>2a;;x3lP*s2Ie4&uUExNQ#~W5nr^^l
z-m{eHwJfkqX$f5mxIXpqCsaqJiz~+v@8)Y1FpyxP*YoB#XheL$5sJKg-}+tPbT#3U
z96oQYeQajlR3rpx*FPZRWe%Fb33Jk2s3|X0*farw$13{=_(`)cA&8D_tS?h&s+b=z
z`uRL2Lbx$;&GSfhK2woH^`qJMcE;@c_qxdE)|iA)#H6PvnUD6<9q3lCZ~3A%d{4CSKETjPgxr;-(MwXc<_x
zH><^FG!pGIUXJM)mgs$`$oxxXaoADdbxDgE3OcjM}g4eP%9U&F^5bT@F#)=9NXCx;J
zZWFsXXW}m(*w!olZKV96htjPnjv^k!(3G=d*bV{VP8Us6h)u}wx*H#Z;Z@>P2?|TG
zXM(<4y>oS0aSj-d%5%I53l$Smgsrcfmi`Xx{*h&7ccdc}(c~ZNxmv!mLRRgL-$ME&(ru5?4uG7ySa7LZFaqK?|VV=M^4Ga
zr7?(ugeZyyQR?Np5)06j?*FT@&s`;+qJ-!01mkR;=qbSocRqlX_F%M)r9)Yv_#IBV
zQS9)(M9Tt}!bVYQ?|bceRQA3_ej7YxU!sI;
z-^zbZK^4vnnJH$fne+5w$)GM9boLcba$Q!G0Kw;d3vYPB=w3?JMNoo^;p#SEnMu8)
zP3Oa^QlCq-c)95e04>JuoPu}HYJCe>d5=Eq_%3Q`OvtOl-NKlw<~*J7dDO%X$p#6l
zrSyO~eC60S|JNYBC7<3hibY~H&5LBq*E9P{v=ALOwgnkyISUy)y-hrh3Bp{oJiqbc
zm3wU8!B0O?4fSQ^F$;>3SDU#Mx^o%OQIDi<#|P3BLvebVKw|`J`uj%iYi`NiyaV-fIq-xrguG)4v1vwTEch9=Gh?(lTbptaVeo-b1q0bSpi9HBZ0x_~Y>na%E
zonpzMp*H#3dLuAj&=;q^@@-wFbMj%JFWsKl#%;xKF2tn1x)35HfZU)7l17xUYEqMH
zoO*I2S?E@w1h8J$eV|ezXxV?KE^-+i_u1s4BC0njXM8EiJQ<&}>cX~$sHZ*0seU!9
ziIJ`5s~}u7$*NXZY$gHhi}cmxaQ64!)$LF(GwCxCPbMej+LhZ^hXe*t&sOu1W?DE4
zlTA_OQ+|X!ngt*GhG#m|sXn0|RCxh0d+AU~N;k_6aM%5GXQ2H7EJ^4U=({;$dQ3@R
z@WsW*@Spi+_FnS3
z8>peZc_lrDrSAR>QW1R=^Cj=S6acHX;n&z(RC9PznhlZ3vkhcI$7`b{pAV|?aY8E_
za&LkCEMzIFjdc5%088R4weG9yw05P*YZQ2`WR=i5CZ)-#mg{|hQx7g|@BkH?HP7=Z
zlYdb4C^H>jnK)`A5tT@x(QxQ#GVz0rq;5f9xdvo?B)Kdx3}Gi(vhRGBPa
zhw~2@($}~FmA4Mnv!S)
zT!|39L`i2V`UM@YMo+wKs0kWBIzhTSOyGBWo%(o>_O{Kd{{dho+ttW@Mr(S=;b|hx
zQcPfnj*q|Y0UHsz5j;avrCX?;s3tiu_Ua3Kq$ZdTVLZ@F>60hXW2YuucHj-?%3S{5
z8S!x0KZYtmdUMk`W-T`$O9zGDpg%j~`^GfwqfxQ#hl?yg?m+Tcwi)(?Utb+1{m>%vuIv#-ag(mE;{kP&MtrISZA)dsLtBqov6%&?2QupkWUkxJlJ0yJy2%yw4G8!*u
zxh?|C>c0RyVTG~QY;+IBH5`)$@N~NPj8{~O@P8|u?B@~fcx_&sXTss7(1zzz$*(w$5{*F&(*@PPlb9ZF&Hr9Z%9-O2
z5Dp?}=tvzPW&nYTAwEy~SRe>r;G=14G8?FaD!ZSefFeB8v4LI+%a+v$rDg<7SMPHQ
zn7nBtba>T2hu6uM-7WiSKuyjng=7PvrTs`n>EcC+N%Kmhnt+NB_;9WH#t4>vN;dR0
z)j@aA?DiwV0jd9>r=Q@lFWh^#eE;$T9RDn)doRm(O;U`a#gB_N)ChKn`vu^L%u_OU
z4i29tgg14eIK$vG(P|}br@m>jOz3?r$n@9b_Y({)Y6Sjk4S6tF8e=;Q{D;G^p8zDA
zMN+@@1+OIm^=Jh>EE0GH2r0vSBT9-%A`qm$_Un7YRHlFp
zUl;>khP4Gk?%#8qUaAIoTaCl4v=(5ED05%OGXoyJAnR<4AZgr!J)$W9_UD$%Pz$>A
zrU~;EFoyUMfPXU<*wY{RHR`^JFHc3au2SxO`~HsTx>eU{6?542@4Yp&MxEk9Yvv~z
z5O6E8S>yWoBIrS&v2QW}3H8WKQau(hW`@R?Zj_=CaBM7lz5bQ`1dS{jaow$5XPBH@
z2rsv3oGGYK|GSEnPj2rfujNhNitJuAF?qJaUSN6?&;kOd1ZU_>FdPhnJ<$HyKu=iT
zNw~-e*RwRU5i=c`Iy9+3jMFv@3_r4a3#~X&`CE`wMf$^kTP(6(h&C02e!t^yFW&+Q
zgaZl+qSV}`fFPc0SW#TENF;tR<}Z_FzA=l%%ifXr3PZI91B!RdN{GLGS4zvohG;e1
zoN7Uy-0J%OkO1P~I<_U~4gOO_QW7(VF`NY`3ku0P1!zRm6loLeYv1#27BoSx+?}m7
z0NJSS)7g*0JWg^GBb)d9AI5!mvAI4BVzP$QPL3M(@A29A!z+3Ea1>)pw#ZFh_
zU_n|vd9twk)TGz##Xj&)N)^eM1ugn&796T8s@(l|{?wxyDeBbN9gH-H;Uj>S*0CgB
zixm?sQO+=`)Bhloq0cHV;g~#wV2B;3?%#KehMNNFkidV<`Hf=B%29VfT^nS_SeDm`
zqJ`+eZmQ>zG0@L2ZlU>BeZ6}Ryg9f%W14A2)zcBGLjPfU+`FlHRJ~{uuND+HpnB_R
zBADK<#>}TgR>0hoGhHZOe^_f28;UW|^gcy7$l}UW=tGhMe;Z^uY9!k3z&~yaqpqK>
zoIlL$J#aJsF*Fg
zoB!kLN0UKdnKuL#MU~PeP=9-YOb_{}n_D9QL6gZ_sZFL}gHpf*sOJ{3a)I7$h;y?7
z#<7CZMSaK&$T}&EvjjgWYI-l5^fPc4GhNHJ#Ja!S|Myo&ssdir_u3GkAra7UjzTH}
zjQ9qcg3Xj)c!TV{PIWT=pQPZ*HWCaRW*~W3cP15qiXuL@O}UvgO-PmlLsek_2tG%bpwu4`)V#=58WtXHDC|lgfDt!Utnj@W+pPW6=tvg$7D3C^Rg|u
zb00h()C=Ot>Wt6FZ?g&*qj<5t{7~>~6B;erH5*f7gEZ2{E2{9HTvQ0I4d(qx3pI>H
zO@?`opM#2}r4j&7M1RiEHPs(WI6Bs8N#cc7alRg1V87tTrB0aP`Ir2vec3FYM&t^e$l?vZ*Efk)WP>eG{KaH+j0S5aaHsHIY
zdxjAaj__@Ob?j>Z%+SPJNz4rJl`9F(s{Vi9q0*fQ23B!miv6)Fe
ztWt4a_1{JFJvk{Ps`P?&=6W$#LFAeK6&uX>ofM8Nw;b
z^wJuED@L3Ey!>qHTLE|Ij*+kv58f83YZR}g5%_6aQDVt0@7-Vv=h)D|csDBu@4WdH
zZfR`=qSZ(S7zh92_SUZ|xP6^@|CN90$WAX9agqP{>DVZcnF%9u1ASYAVL`vf{9D3^
znGyslXZ8VLp`UG^CFLXWB4!YIP+N&Q)d9$hV8NsRB9F~tKb*g|^L#ZeyxPuJ0~rH!egeZu3IMy(XDbtF6ECI3fVQTo>9~%0X-MhAoXk9q
z#=3#}zG|+uXIT1b*XVD8-_T5!OyIGXoSiz}l)Ln+{w)pU3OcmVT&qoCn2Gvfr+2XC
zw!QURUpGlJUYx_QKLXlEt_fLaDV2nXQ=8PNQvn#P{?pkWnK0+!(QdAuN@0C{`{QuoRO8x=ggz?4kjclzwoEW_v3^GT4fU7^2lY2l%G0!)3RK1k{;J
z7oAgHZSSt+6Q|8qEUyCP0z43}*o!b`6ULpU`{tz==3n-n+_3Fm;q8f+>)lHWr5#r)
zvT6LAuV<*Uk24X9C~2HWKWZ3Y;qgFJ_pn3>AjA;0a+E?DWe|
z{b3+^yw7J9N4fPjTu@mAC?}AxCd=DP(6L`JsaBn3`BQI?=yZ_H&z+nU{c6CQwOsF>
z_{Vg*8CV{AD$cbt2v3HO+%?P@E3Z2n>SlF+@@n<#S3_c;i&jl`)!-)ecd!hH_VM
zgu#ao;)Mf7zMTj;Nq@hEy7$b>-fm=O&x`()<$G0Mw1M}BtO8xn(+ka4^${=7#1sFw
zLt8XM>C^(=5VU+6HS?ZcoCCul+1nbWd-;(1f)k`2T_{5tD&gqZA&d(=-taau_%93Z
zQ(&lzJTx*bw#kt;fUTXPs;R;BUQaN@zk$xo>V>+9a?!Z2$nxQp?!spOZ6eN5Ea8bs
z_dkE;+`MZw^yX1sh_@Z}v*e*XoR;Dqu!Yx+o{
z<0MH!nXy->OY!v0v9FPH{d3ATx-{CB90eM5ssda%0bpqW_zsch1F8PD&jvLGDDIQ9
z9RYQcoU^5GL$d@w=jPXxClT`ys7V>D018#YV{8?dsPCpO+|iYUQupkb0zI-?3U#uH
z)0=cQi(~-H5zp354TDCS??HU7L835|exqgq3diehMi`qBeqc
zELw|;Zl6oP*e6zLUM^^K=6@$rxV9Kn;{p4@jQA=Xn_u^7eTkXTZQdY7R6jk6g;nte
z<+Cw<{wW3SDVgQ6U{ecT6uhbek9u~#KJ7KdXq}?TB*91#R3}e9VI;RRJEHQ2B+O{78)y4h?pJ%b?Pi
zO3aE%4;D1WAkXKXOkjWRMQDnL(+^0J6A{u(!8&HX`S+uWmw6e^v|yIci#
zpt>m2Q!MQtS^7UbPzVZ$7icIS@yZjc@ZRb#LNq-Q{`2|Ohu_KKR!(?l?~Q)^oxMU}
z?9O``H#zxr99dJ$bdCsyX1HZII(6o%c)rvxCqvR|c4aRlO8&!=$^~^1?m7z81{#uX
zX`j)x^UFC)k=fLPm#7UpKzn^9!+|dP3iokr^Tf)UZZNZ)lt`YxOI<^KNY9)0t&-mT
zoqW#rPF>*odwSn)sA5Ocir+LZQI)RRvI5HV^x6bzzf%mjNlWdBml1PS4R)KfKo*Zc
zDITJBIauNO=O`Nmo2QMV>@j{jHqoZm0Iix})Rgf+E7NIJrvO@Q0IlkmvZlDnw>~S1
z(ecfB*So)eClTQA7fN4!X8ZR?`I0XK!}on%9JAnxElHn`LE)h;lr43Lne+L=FSNlt
zp*|HgIU?PdIbO;`K@IzJlRvWCk}#6nV=fm(yX`rA`NPf2>~efIW)s?J-FsB;?q?r{
z>UmXj>I;#G^CxjaY=VXdP6>WErsrQ7ZBf1J4ZG9jJw3;lu9y>9Ba80a>-;()`0^g!
z^Wr&(vBa|8KkmKQCwQzcy{z`bpebb@jZg{l#nzQrY0R}dI4vV#@t#-;miVf`Yn$Zf
zp{7>grZql(#!k8<-DY{UIF!BQhS5nJcf`jPviiyU?Jl|6mUIdPYU
z9(UlP1fH4)3vF^G4LsQ|%ww)6Oxk@>_?Ai3%4X5YNb09mN^g-QQNb0l1Cd)DV*0Da
zE!d&qNY$8rn7v8QVpTbH?fl5yzwB$)7!2AX^1ypHBs6CyC+m^5YM-ypJh=RDiLA1L
zT1+aEYKXBiC7UmMCq7e$4CoVv?JP~nw#~WNc%lSyQms0?GTp|2yeye`v**x+&Shk5fA{5(f$pSh
zBi(Bp0K?h2jx9)_vvbG0yVmhSo1Pj42MkTZ)wU6BkN3lTg?69Le9EHA#@3?EkeA0zJf!#cT7#aC2*S$@_J-RQu)7Qop|#uj|IzjyKuvGk8|V-5SdI!}
zLli*~!GeGw(uoSnq1yqe0)j~Iop5ZRGzFy!u>ndi(o0a9k)|Mo9;CMrdVsXIlYm0>
z-1~p`otK$=hH>W3?7i1o-}=_K*51FVdpdy*S+K$;r@umVm8Xi~#AwOcm!ZZ_V+rnr
z3|{zCyiT_e1$|YVJPYq0ESAa1Z$;pW#4W8C^H|BYSyf|~rh5@EF%QN}yl=yj2F(jx
zj1$%L1&JAQ=y=EV5%Ua6^;VUvd7Z>|e}BN83sF1K$I>Y~Zm}`>6mGT7z8vXg@(O)-
z=h?{5GoK!3E6==!O68u?O|%h8*0hMcb6GD`_FF+jUpccu1k(A715?Bu{@Bl&A;j07
zExUB2i8jYjaMh_oeXX~N<;2fj9aI=l6n`r+C~qdQyRf4=vFO7%A6w!N#76Zty&;m?<
zT|cyV5i;afo`L^u5udsiYEH^l{qQao#brU-j~ZTIB1~yLQ}@S<%qqlZqyOJl>GKSEy0eB;_aINe}GeuHEVSSfm-;NkJXv#>-;D%rM5-eWz}-ufaM#wU=cP?TqVC=AI+ztz~BuLqCp
zBJ%vn<)gh5ICvOpyr)ynDHHN$|&~h$%W7&
zjNtZ-;H*95;J2MmtjvGlZ^HiN^?v+;kWCJeBL|3j8@orUo|efJ?6KSMQF%k0wq5ZW
zg2vyw*r2>k->*qOYgOcPm(@D(^qp$(X6+;e@X*_s{6n&kZSA*bP^o)%*b#{)vEd7&
z3%XmFioOv{pz|Y>2~(CKq2lBc!+FfL5K2U!3moU~<`sN1A`b(P_mV)}H@Wm3UhhTz
zrkZ|e^*YmqK2m7^67e2*@OVAIg!P)T;iGD^TgjmuWh(_wDF*P^U<$h}@kGCHaO!!kJHiq#PaaFvG^8B)!m|c)InZ%CL4@#0A#MG!
zdm_*18Ag%G$LsJ{${(qb1=}F4v}Tb%5(@bCSrkX|C2+SyAe%?QD!V5W>`$UJLOPtX
zssdy{$-uX8mzUCqFNyH?;0$SR!ND3!nmV>RYD*A>)TSouW1@-~C#__+(cc9v?JIIj
zmHqlgHo9*jad7I!sullvZ~tcH{|&;nA;jwWB}t`~#7n`AOj?lu!pfBNl{1}_sse?H
zX=+oZA@GTL_JcD4UW8^*EaH%)J$A6?JKV-|{M#59Ze8_DS6n{cfbhC(Jilag--o`t
zzITI~RwC}zhg(Uc^SIBd*ytPHOuS5?tk3
zd*k%~=CEPJxF_88Xn-~oW^YcsbSWYuqbQm>dTd#*C@gTMYK
zKTu*th=Jk1#lHg=>fIw)O80~1f(NWV>2o9RP(c>1J|(T;c_eKtTV@QM8*7dL*Ll`}
z$fI<;YfWS5NE))?0I451rk*j`x4cXm1kgqr^j>
zdm9>)+d>+dB!q)u&p^|%quzl7+2H>yuFm85%;h-(6l>&3S!#2|><
z$f}9{`6!=a_hn}<HRp=7G|!e5LOpYv<*+u8T3QGHT99aA(%A|73s2-K4ZQA!(bJ
zjO_`pqQ);?x<+auhQTe0i%H_$3jD>vj)%446(1yDeZ?K^xDk45f;A%EDA4{~9H-dkBIz
z-=b-|_D6nASqAp-;z4U7KYdf&10eWFLNOKwDpM(ro5_Xo`$%>a&1`1V9YHV_yKYHm
z0n>dRiQ*Hyz5<%B6#rDsT*dtlSnSk#Ob6!mHcwdosHU?@<6I9}k3RLK+U0H<{2_iW
z&w`ep8+y%ZZFm=2g9R-S`lfQw_8Ik%!H^Dz0hNWf-LT4@a!L#Mg3DjGb=@&FZTMKd
zyg7!`m%Gw#*P2LZ9NyE(^T|b5=H`ntH=P~wwspVdv_dwZ(1=n
z^Wye~e-9H`y0Zp`dCj<5A`C{PPM+olyHE@zTEgmwca!ncyp+Y7aQoY^Y{RBHkQkd!
zx=pmzSA3+j#iP=^=K98r7))V(c8N5L0E@HIU}KZ_f)>5Vg4>9fjyB+(By8B9*7=V~Lmaal&G|?+=Q%8KcsB@*}aiL3P-p_NlPBd?y
zT?s6
z0s1OnJci376gw8f3xC{)kXg{lZ$TFs3dCY8VPSp2QG2`A)NY~J^%8n3;aL{TC2dFI
z!1`E+S$1y97^;=A3~RZ+lx43`afwC>a(dqJ0zz$(@?F`9Z%IE%RM_y*=Uzi{p8nsY
zgwy^YK`(P8O?2|>d##)D@=}`)KsALPc|1V@~(^3(ZTn=EUSE-I)vZ&|X
z*nY@1{Ce555!I#o_WuLhlI*UJ8lG&tRJrc
z=@M8vAJ>Mv%^7ddD?PJHb@|^pl}PE&2+Q69eL=9FY6oiAoBTO*IWqOQ=D~64Gmb7f
zEipY?Lw%Vg;#5d-3oM(l@C=q)SyKOhAkym=lifst$^uZ>>G*nRruTmB+;_hG$8VJ9
zF-g?pVtCjTN)^?arB7)@#Ix6fJXZ81dM)LU-s@ctn!+T;Vdm>~YxclxdWHU7Y9RtJ
z%1en%qEZXe*ZbImdMaz6Y63Ueds;bU@S1F}*L>eH@A+Zi01ZGV4$lG@Q1TvL
z>i1oXJEPGn1tiGn4A_c)N#UK7C>=dRiTn(VIKX!)?}SbDn0oM`_9}68Os@aqj!3~)C{N{INU$BAl8iEXsg=eOf%TZ{
zF(o|Y9Sr5{#D{KLd(-j2zn5>cfpQ%p<7R2>9dF?V8B#!nOEwQN;INy=>;;P=%(AL7
zB*8pv&9$YPtrAyJJNL;y8r#ZCk<+_F2~p4AxYKC1ZCe$IAM4|<-HWp#{@>dgm%2;h
z%NN6ks;u$ubDv_Crjb0cZBv!OGp6CxdT?M@Frn1JdcI;yFlk{jG|QmV
zsfPgrtmKy*m3v~@QDxJ4{_QiCfP|G|)$IpbfEI~<2ZWCCeg}Vah)hI)Ah;1SF6nLW
zY?tfCP_yQ)Ut+<;2I}$BionNr{%=b=*U0Ce^7rjo$z}obW_QkswmcH6oAB&^SIs%j
zK;3}F2U*n^j7sf3|N_3shN81ZI5*pA
zS*&DjQ44f*c86Cl&dk?6sxNSM9lYnQ%CikOqo&Mi-xGe@&f2gB3he{+IoOwwQw$4a
z>p*SqsZE8(qx4X3KT>jn5YJOEj*Q;Xw~^ir%&RRRadwhq{^DN#g
z+d>Sb6Q>rpkRXnjU)(`FHx>Tf9=qj?7naAj4O=58jJzA!Rk9wT40WHm-8?-WgcxkK
zPTjPFc=~a-jQK!eK%?6lJ%q%_rE!aEx;AaU?N*!cGWoEFK9|Tj0Z$oqgnXhs7CL&2
z)k0yP1;d{n+e}f3vgCw2&V5$nXLu!AHHw}veA-(!MPny*w~(bhdl6S9ii#?4EQ*!*
zB38Cvj2V$N)CYf@Qfo6kjtqEg+1y@+UKf#qF-iyBkb*RAD_PKCXdb;_ArRei{Ff%_6KcKz
z?Q4*43`S0gK(?ariNK0sUW2{b^B9d_m=s}1jepB(C;YjqFJM=+SQ)w&oMh`tXYA~-
ze`4&S@w?1((>6^Ph8VoDN-d&bTn0!x-c~eGx^gp_oYz3>8}TwxZo4A&wrqS}n-!y-
z)1bR$Q&En%cN9W0F(+qNRyb>LpO05P!W#F2+jFkdxDv
zX0a)}7FqIG#Sq@^omsN|
zYYKwAE_`0svJv8}xuxH$#?_HL*x5&VT&kTDrCr#S+&|81&T?GaLFvEl$Yh0)hM-dG
z5>jA=P)NtK03IT)VN%fyJ}dvrZi1F~Qwny&Z!b2FyM;b+blE`F|7f7Gw@m<`$M%fn
zwtU`a?twa?^YH7v!hPM{R}Ff#7EMm3*&((s^#4t;XjKkPsmbcp<=!fx5|vE~%s2SI
z?Bl0pz`OIQc&v>;5Z^**hpS|M)CBS*s*2m)ac{v=T+vh%-dhntmd4p$9
z=-)4^wxHJIg$uv0#}Br_+pur+c(Klcx$U*mSm)-FDGE=)wT)dMJOTE>rge!p45|H1h}woecxW8VI#Bhc;Gw8@
zHb3TbOz!=(j}CYY${j3e){@UdcOc{_giI?1%}H7>
zZ-_wKP!o1fX;Ut>H~yoLw<#r=*&RahXj_WeB-9ple!gB9Bah|Dy8AYl-S{?gwV@_`
z)<8CrmF`_?p*h;s{ie;S;uiVRAc|PUeZ7v@8eHyie^X9+NSg+M<1I-|$9|5voZk&a
z@M>^@B4GI1;qywS%d-IBnd`1xWQJ>wk~(>cJ!uoA-F@h5>tdHFHaTQ5DZR^2c_#
zq@Y7jWMgi9>}0W>NKCU6@Dhna=iPxyql0AYd9rk^n=_yB)l!XC6JlzWCpjjUaV9qN
z=}My&nvJIE|LjVLG=Pgd^gQ)i2k?ogO&BerT?ipGSpNvSSwcAThSg|Z%DYs|
zMmz?Lf?k%LK_@PQga!>Hj&hWWou$rv{YboB`u@e-6XDE%&J%>!KvmK?Q0e!80kNRN
z&_ukL%f@w<&KuXsM9i&GNdF0to0pTDEw>x#EENJ1Nn+Zp|vD{0pK~YF41l|qAI4oZNVmCCoR@rNk%3J#Ffwf
z^^mZgK5;PKx|pQ-vojO`{(qn)4mexAbJAK!cOJz1$pvTU{HL74po6FZm_UtOJVQ+E
z;G;J@U!()qX;do78F9O^Om4F1>*HQ1o~nrVJRa=(367nk(_VZ$E+|0TdVL4bp)nI1s=%{mjA
zO0n3F;_TG+7NBVDi!-mYX1!DyzNB(km7erZpAoXm!ShNYz_&l@`hGnKEkQiY4Jh~lnFFcJ_{NOPj->>TrEdzY-(
zv5t3m33Z(4UX34&(&nQMm|bD?BpFbEc|Qizo#6#n*ZQ=hk70C)Kq|deiAT5
z@VHGS!)DGcZ^qR-OSS=M7&7li@;j85@s&WJC&W_vSRhrPF2Ks0x8d)SQ~TKcQ{roR
zrU9%8shd9GD>ONX`fnD=GWM6ffEjJ&o^FZ%d&vtWNzUON7atz7BOu
zRAG%)C-NOo9_S3u7J-M4!ZJI}HMeE+iEYw>IAJ1=#{kT}1@gZ)77h(5%CrgZ(-O4YAhd3PW1^o8nv=cN1&
z>zh^?&!ii;It=bZrFKE>6|2+RVaRqkBRbpiX6&)r>$_@S&K;~>oba&zVGH4Yj|Xe2
zg`jjp`ncAkwNOc9UwKC0!rsnU7AO}%wFH>dJhp*SI0K>r?u49XxaWDBjXvole5u|h
z2h0v3`bxkZs2}UE{&oF{FHdrBSS$>YUXRcMDCE>3Sh+*p`NCaIuR!DBP?`^sf@SMp
zX;*uIMQ7oenONPwE9(Y7%>#4hExt!EqC2#_nSB1Bj|N=grRondIiSTz0>|z_J$9Tp
zYSQEjt^EPgL2(IYfk9DrT5_J_%%ry2Ki^SISAC3|+B`g1TKRcwA
zPM5#$uYurTya*g{eE};IlpBombf8KQ>scs-?_jN7Mu^J{2mI&q0rOA~n1-3fa#cSL
zxbfEm&bZg`zFo77yi2FH9SgWm%jcKx#SK0_QPqLE|Ej{ix+I~E{*Y8snK6U9r4MF#
zKU7&a+aI#X??}#8%Ze?GmL~;B?^v#40p|Q>6PUUts8q9%x&>db1(1R@qWV&K*T-IGs(f+sLad($SG;fezgp>7Gg0wnRXHC{tR}I*#wHC7h@wBbP9#wHDC89
zMWqo8bGe($^;?TF)U1{2OR@Th9;>HNHUgqS^4)|ZTE_bJ+2L)z(u~zVL(Ct`3^a^;9TY!Wh|!ga=Hm}N^AYInu^O@>g)LU}3vxd)
zR%yhNRHgNV9DM_EuvP+W6Yd;aUr
z&uXs%D|dc!ya4dVp+oTVToUklK%f7Fl0}_qwavhVoG73XM9Iqr7UIk|lgbaMY=p+j
z82tuRc&4;W1=I093`NA_19dnOE%{kjK+sOqguU%g);+x2FN=2~cO?^4pBXrv;*BiyAp^qod^|9UtES6(=DX
z{jyoB>s~HncKVZAys(B)g+b)EdRs_%AI8hs?!6MYy%xrKYu+Hl(sSfV>#)>!9)5mp1a)-I5K*9OSns~?c3{7n>n6tIzeQD_
ztAee-ESQ-D6cGep7z06zsS^wjmIe24CV~GTOUkb>1TNdsB(ZHNn63h!G;iWnOe0w*
z`aX8KO4VwC4W!{DWGM8Lsd;e-kJ*U#Ge^#yrjeUhmdHP80uq3FRDf6Lonl`mFjW4J
z*tq9M;cf$#`GC62R$hKq31S-Q+rg|>k!gmv6e<;$P?1TBqUs@qLOT<(-f^Anx=JOJ
zRB$KFQq+N2m!aM9i$41tI(0u-WaytJ1smx|xWcXZMd!F4;kT^=H<|wNFm0i3)=*9u
z)e|s}p$izKr}HEtst;L0b^(VO2dZzBqN#ztJ)=AOE#)BzXb@o@%nNYvZmxUB71jf|
z#E;+msrlc9vIys2Q47kI&)$Ih>wP3weu=IX(5V%GchyV}5MaoHQRa4;mYjto?LOpf
zcF7Lw!Bp8mOs{S@XafRzaPib>)fKKnx@Bq(C}lh6?e>8$^|CnYM}I
zi-r^6)`HIaMx`}!6WY%O6U~U%TOB>_!1P5rlkX&96EnD1
zVOGqNUD=@UYv8V@s@{O#ClK~+gGLs+vix5wd57qdtmhyq?DtZ)wAc{Jz_ho5aE8CIP#I{VmeyLr47q4QZ-+hV1-aCxu)MWQ;7$Y87ZJlZ
z7=3ZWk}nQ@STJkz2q}u{D@iq0U12ezv=14h1R2tAJVl({x=RP7HSdhPhLhB8k`=5`
z+7I1QlPMD4K(jHpbm&4O7_#*|
zgtFnjFpp{G=Z;Llp8y~9T=_GcU6Nb`hKZusNoto|-#K|DF2FZ^p-6)yOA{=vU)^xF
zozEX{??$k9xCzV`S8M54pb{ur-8>fLIsCmUDob`tE6OF-S|e9;s(kjqKl|exA@WP|
zV6myJ4z=LPlGpQh_Uw8Q2XxmPpYfaj2s3~TKhVeecCdn?ZO}n%?ZhRDJoD+}7!T)3
zQaoyM6pp@3OD9txoye-v$F_fLPHQ=(?*jw7bY*gp6WpTuiO3k{nV*RF;An1Mh(MP`
zm$oiy(dd{3cSIGFy2-nj(eJ0Fr|$Y{h$DtAG8z5I
zl_JJC#liY}d{)3G&0KP(O=W$f7D{5J!F7TpF@`#hZ!6?_0yPPG$l{CKd!XA3WrMqH
z4&~$9>SZ5LNHd|qHF9nB0t}hvYSi-N%}%hfVi?L|SaM!Ssf|gr?P&RjEpk;XRIYx%
zmpn@eTrsCU_2P4OJE~b|%D>u199Kl3oXq!phiaD2x5({A_8DTP^?YMf1_v!%`q7oU
zh~d0&f}_K2Y$_4xY-qwTc06Mqd=HHfU)n^Wf(8bdgWW@=cw%pr%Ipo?704M=O@|;
zZk*ktUDIFG+7@CKFkIfr3sWCz<6#)L0@CNX!UaY1^_?O%!}|wMM6pNS^@us>{%}3P
z#m&bUXZBO5u79Y7q_!Zv;Cv@X-E5o{3p+VKch;ubRdCEyxCk|2^=&>O(I>oOF*P*O
zN|_j4F^KM%DwgU*JQK2=+R|b%b%k~#VW9aHy%_
zIWfVUp=dtFLsuUSsc_6iyFR)*abRWYL~a?P#DF-X-5SH@>K4XWBEt;?1jVUZ(bsmF
zYrCPAn(4Z+3*=~DZVP=_p7so`kWxfyne$k10oBo-YJ$cRW$}qvX6VmrS_pO*5F2Y{
z{7q$XHRHEn4V<6r*mdawF#}Ga6xKjOe3IUl#^lNmn^~b=yl?$+E_M5tgFxYigK$op
z6I1*V$+SNV#g>3-j0(eaLHQAb^0ek94Y&3g$x&<-ZJN_OdXZm
zN~9Di?$o}r$A~%WQ}P&x$M*d`yKA-z3$qyQKVAQEi&o|SZP?vg#pdkyf1Pvu!nNOz
zxn}>y$1PXfqjcZTKdH@o0~x#dX!~v~+U>)vwPmJ(OCjlvmDl5KD9zcCP8YK?7gKq(
zD+=(%9yrNdZ{#^BVktf+!?h
z@6>+S*(ZX@rx+D~o*7cia^7Cd!V+6)pUH-AL@kOppvHT+qRO6dKzS_2H0~B?Uw`1y4aEt1?O#dFohbTB^9ps@*^@G#=1z
zNO5*oK3i0k*}aIL`jW2@fM2m6mzDd`666VMH_zz^G#fehd`M`jcX4;0X#58_D+eU8
znHieaYllk7CYN6``MlOHe5k)3A}?-oYV*T7X2zq@YrmtUmi!~X0pHETaV{ouYHur
z>vFJUO9#fV?Ld+!Z}lB4IaImPJJQN{N2Ol1J!~Nz?rirKYMN%fEMS@;In#~w&3DRi
z4se(-P$*ZyC?OD*w=U5)$ERrLzx_10Eb*$X!@LE3~AKP|M47e5&{S}l}netfmD451}s$@BnY
zot4>5#1qpaWvr8ZALm{LRR8A8SE#hgXqG)uY{~s%^RDc?XjSFu&0p)>rIJCo_~Vd>%NP_rIHR(`NvYK+R08<1h0#a^fdVR`!`WP8#=`~(<*
zD8^*@ZLcmIcAWKoRN-NsPdwb2GDsSjFj)tsmPNqL4!~AlE17&Y+Z42u1Kc7M70T_|GV-|bE^?~=F|3!yyq}*6n{F99+;KgH
zVCL;E(j^D$0j{YQ`%vhOc}?a&Zg2)F)wp^>yRJt(5qN}mv`PIDZP7IL0ETBXu{iiYN272|k-3WIz8w(plC)0TPMOCVxQW><>>lP-Xb4VF{@&H2$2IT(&+TkW*XkbqG0QKqW4&?j3U
zqN)OMtofQ#M!PWdIGnvia^adnk?1e`O24G{5v4>k;l2XzIPU{I)(Yhg9+cvHCvLr~
z;`JX=WMZlwGUk9wr&I8wVpU-uX6)1^S@PbtJ=7Y1A3?}3j
zviL8s9~7=StOt7-$D8s|4}
zCnK`J&kAPI>E8&L7kY(#GEYkMP|fu7-mp48n!_j{pn`S|Gl5w3*XSbb%>f#Fl4`
zk`L7Nmt>P8H7;t1_dM%8H7~@|!>X@hqpnfW3y#b1Az%$oY7)H}IJaH*y=BxQ*3SGwO-7&YxANxvo#3q=+&+gYyFZ
zPVjpnJwtq!>
zqOD(5CMR_9Uariq&+n?cq
z;@3*Ning<{*T*2bhU9iYn{il+>hMeD!95$f+41DEg9bWp{OaKg&rpSWgX^gq{P}aN
zqN{D)E%{)}m#DzoaWU=4sz9z1AqN>!aAp9S`b27a&6z1d1$9z=_L!hWQAGR+!Xi>B
zp|F;^(W@kl>dyJvA4UaJCDUynaQT-5cZVc2@x854D?VZK8UVps`NX<(vj5Zqhg<--
zAW?DsP`8$c2vAhm*x(KzWuAq-gbcM{`8l3Pc)Xu-xkbww&KvAwGa#VTRJ+FbrGM^&
z`qztN%b9bi5qL2EU=Qxqhi;@_j$#i!Y5W9=XYu0cQjtZik9Od@U9a71Gj0ld$;jyI
zDPCzmfq*|XZO0`_JRKR(2v~8|g@1~N4=-(}q3Sq#UusW~phe(|8hXQ=WU^IJ7X50@uO
zz9;CV)f1u`2@7Wy)ibWjAhS}0y8c4QKAqTXb-%iD?=hTQ*F(QegLN91aq4bIDFr#6
zfWC6FQO+sb@o;S>dce*Rag@bpsJI(h3|-}B6y13ZXHpH`)mPsA07qz7xu4^7mury!
z)P58wuE5%rm>pvj5;X^<+Ivb&q(vp%&VTSXJXoskuBWtiVgX=X$
zqu=3X4%~&h(&0R1Q0a5@DJUJbOu&tJH#i_I{Uw&V58BN(
znE>{J#27HXQw$A-(R&M}Z-IpXy&fIa&-Ih9R|KVt&LN=ro#(EeFT6uSB0&BEzEa3F
zkAK@M@yX1d#~O}>t5fVFET{0zaf^YsrArnjkpIkSJ~R2Ssu@czm~1t?EwkYZRO&<}
zrt6?E_9YGjn5!3^k~+f=tdC-SqthLsoju-05eqWPp@Li
znITNzdhnlNA(~_VaCY!VGGgf{hjfvb;HP-Hg8T*xgRYjp96Ts{uP9|3i;&Rk;G0CR
z4`fU|R62Vr#8@ntmYdaO+O^LrKCRs!#S*vU317ziB6pnGgSxo2HsqV6@AhnFTx6GJ
zH{T4^xLGkngiy7>bx@EgmM^FRD)o)ecn*e$hp#+WZ%pvY0;U3On)IJEgN+pm@N@0&
zSQrlUmS?EQq0&Xw2kNwa7{&mH1wP>N%J&1D%__JYr`c&7a&G3ekI&7SjC;LgEJblP
z%DCFlcnB;#0{(owwo7A{_>@!Zc-rm>2D
z%r9e$niVE1@~DR$GL>at^8K4uk!LIg<0pB>--w<59FS$uM~Z_>BT++6(?C
zszJH7(jwHqKLsyY
z!Pn%@@(jS8C)&Q}Awc%O+Zn6kEez(7+svziXj&aHKjq78c5k__}b*`JBaMYi5
zjI4g_q^@2L=MwhJ(Dyv97Zv*`$%Aq{oYXd~UmN#nD77v?Spe^p@ZmSy?d%a!l8aGR
zL5$I4^%YH*hGcz(_xmW{mNKDNLd(%EKW{USE32vO&M#Gdu7W(|aZqfLez!SbvbA)R
z@#lHRm271T@A<&=q4n^M&DTeMCi_YZCxCxyvQOt+)T%w0NOcioho)@%w}USQ9XMXq
z4Ws4>XL(TZeObO&zc5!FS2HJGs;l9AW>o;g{0^hGdYUP(b$
z!o}OY5NMhVKU>FT3UjM>@!8@f1>NA9b(C`oY`yg(T%iK5xc^uy@H+SqC*FnvOGI<(
ztlOIyTz#&5yvjU>?eetlU144)o11Q
ze^$*Wr9cG-%@&-c8UqDo@*>T}j9bDL@3`SKpbDhj4b5`>T2ZyQ4|n(m5l;p^g0<%PYyh9#L{}kBvnoIgroz
zGFqtN1@5I!>*fX;8MugWxLzFrCE}7$vymA>6gd}z5bDu2FKr{f*yeYVMIhbZGo}RX6i+gsvz3pYJu&-zIvTC9%io(puq()&
zK9lHziw`UTfYO&OR8SKaE~OGFb=`;EfL7NT$SmUWPv$iiN2xsd&*|tA0pHT*^k&h!
zO}7L_b2l%cPT1kUmoF&gNrMj;${1uAb(`&xh*hG__N+QQ19)vIg?u7p3dppSrS-
z%?A4Ak%y4swh^uh9Bx6ssxGJIn0%aeW_ZA`mhi`6(k_>-NKcM^i55%nx;U~w%FhpV
za@>)#N6T$8d!`r#;6jli8&0|n8ODz0TpSw>TB&KSgSfn~?ri*FE{($@;h|bxfcg(k
z2Dkj`ZX#5r#cmoX63!753^)Ky2W&u
zmOZX7^S1Orlg!m7nN#Q;-dKCo!B_3N1=l^O9Fl~218@C0Rn@#K%W{$Mx^or@9%A7<
zuM4F_k7j&A$Hf0mg@~KO{biwH9I4(6P;S;#b+3LQAFbfV?a-+h{qB7n=7f-KAXHfOO99WBY0)DA|N+jN3j*FyE6!wG5%<|B#d3k)#{is70E2
zmb=ZiYCONcd)UB5yvI)pg#L=NlpHFi9Q2yI@KN;rPQkr4$!iw#svOuRdx7KOeK#_^
z)Br)qB?Ua3N@`hXJ#(TB^|Ej
zxPck+y$Kn*Wn9}R(HzSeN-M7IEt1>`!1GM=7zPs{NMd{msxzrjeS{}fvD`r|?f7@$
zNk5S(&d~#XR?ond0uJ!z<3xrQ>Hh7Mr%XQ8oqh{d!(DUh-^GFgy85X44Bh*95I0V2
z9<9)9)JRC^vCvq&E{F%DjV9=!_c22rKe#n0&&mJ_xJz3JVi4s$#VC6>p-x=yy1^N5
z@2#sh0Q7eQ5DXyfv&!Na!=}_OY-F4IDH;UCxg*za2CyGHSpV%O%ML)Q
zwNMDNQN3(;o17G~_u-SYrLKbBjKh3ge~6+&Zho=_7U*}}g9m$D0V#bW3K}u
z4yPc)Yy|`bz0Tfu=TGW(zcd3tYxQ&GZx#kZ+MgW9uAPtl9i7wI2wE8t@TcS0B7~8h
zP>lXyH}c>;oSLAUf@5@bL33(Si*Dm3&h84(tqBdBuLvz!&3JZA7G#b5j?KLz={RBC
zrDb)zB8(=xO!AAu$6cOT{zyaD`Ls_H2#je+t|#Abz7T{>#rI2$M(dVPcG}3lhlUfc
zov_NJvkD!4>(|ewUghYm`20z9Ho}CBba=lZhnGOF&5k*Wckw_TzZQs_tUP2y++`16
zl9LzZ2;uGh+>-bHqV`7PT
zYk*l}ENdN>YpvAYAl)F?+FU6eN!=B?C6dIm}rgDpo2j{?ah4_l%Y#rc3Y|^c7z5>
zMDu01HlSA%x-kQn<_tzr=INsL`={BX*cr>&8=%1v+CQaVfUK+dQR$&YP;1&SaEjvM
z*vornw~pza>eBjSW^$u`5G}~~SrUKAtxh8J+&a{mT|FBKpl&bQB)?wO(SOE>QO;2*
zqZ9rFYNc04Wpgrw_c)wD_;{E#FBR&zcU`WsNju2Og6~Nh?gT0J{2P8urtVx4laE_!
z`}yWHX^ZR2I@?k&^jrO_b18bXQdXa6zpW|8F)cQ25dVqVkuq9M>_AUr!Ee3_cwg&{
z#?^L$Aj7dGymNQL+5^GE`usj2{LZX0hKLiuPewiz@5+v;I6AUTpeBg
znsPkp+sk8WeE>H~%8W*C62&c4?#UO=Uw3zKKT7U-kv5oVum!4d=sacb)u}zW992tg
zP^#zIEk)ETcX*~&U4v)SX=;WoU!^ZqSwh_objEO_h4INDDNw1Pyi5NA|+tTfzUJFBU9m@7Kc+)
zuf%ZA%>FP)7%+(buLh||r4#MS9?j5#f>2YZ?2p&;Enms6l6Lxbvp_}O7D)vsEg8PD
z13>{-6ICRNX&+=c+y$KLJ|J%8LUR(+Ndc2aH~S(xa=qN^GtN;}+)B)GP}sHgX=$?g
zYeyY-?)g@b0CQde1Xj)DO8g>m;~}1&T4W-{Jby3J?F-r=|GZ`nIv$1
zq>a!cvwix#c9lt1*DWV6!RVo_{{gz0iM%|5&!u6-vW`5A4i-?g#It=S3!U>zcC6n5
zy18;@Ue8WkOAe5+z*`}fTDqpTyz^`zCyAjlq7-Xj%2`;@vdb~f@{jK7C!zYisqU4V
z|6ZG*7(N2i@!;V+D!bj_uf~XdRKu(wawiJWF@nG73zuO2VFhy~5``HV#KTqsUC{#J
zE{*DXVnuR*B>0tFw%nO^Gvtr=NXjZX`p=N9<4vG8L&++r!PWcPMgIJ#IQ((Ad8mN6USpiz8-VFQMgx
z2i`4qnTW;$DW9@WGyy+-cP7Rt$@O@szzY&-RdWbb5v;cSJSC3Q_WaB3j7;@~XYsyN
zTGHhdLJOinP(|B)1NHUS!Q?a%TA73`!8UpX9jEFjn}gQEz&HU?(IGhrupv;8Q%j_{
zMlTj1+0Bvr>|t~|9+eFGp1IO0_n3?4Z!ZqdT=5)C$DwW_SCoHQZk@ySjAFy#*{oad
zEVy?&&@%55P7n_(^#O|X_&=Es)O3i>wnV|rF$^C%f}nmCr;Q0aY1=-R@18HWmrcC!
zF0)hgsNH}jJ@@9@5N2YH{i(8K0MZyZ=hb#L|Cp0$F2=?~x;zENu>6i--6_AJQ{k^u
zy^KWbfcV=rCcKkn0w~p0P0mHOE%?4n1L@AB<(7$d(YRyr?{d_)?BK0Mu~c!@u{bhb
zW1(61)Yk*loq-K$SH;Uv#&~<7yQE-SIL+F79pFiY5pgA~taUQq
zl$BQkI@r)nPCUr~&DP}HVNlcX&YdIFmlCUz8pon%&I7X21MXd-t$r>g;xK)*!Jg|;U;oqOPy-0{D5>A_?5>tGWo#hoevw<
z-&iJ6hNMH=SSzQgm&!``S4nuBM5lz{U&t&-
zwQ;FlS7z1QlI2u0JmHyd&CJQ=IMji!2}4xn;rEn}tA}3R&bIz0vSgNQbgU4#oddAb
zK^}dN2J{w47qRU(RfhYke(UnOn3EW?@VV^m(Y~E;UOITaUCO!Tr6A}21uM8h(e^z8
z$WiE|&Jz~o)t{n}?-dU4GSBkR2OTA>jq-nJLd8YV&ac`iv%jGZQdH{TI!G=H_8KCZ)HL6EDD9vmIgJIQB>6B5*Hrr%b$#@`w{Rb5I3(#*m_-PkVQGj(FMb_n;
z#r5FvkrhBd(JCldo&{I|3RVH;;OiFUM*LVXaFj8!1I!R8r7%$hwfwa|_KLN!x^
z%cGQ@Y}HJkIXs5KChM{LD1FYO1o7Q$CW}OC!oeIF-dTg7J{u87T5)(f5}3@u@4;OP
z&nwcWRIcBpV@KZk1C{BNaDO_S1NKak$PXGA%&aOX0xdxa$2A^67r$YFuAc8@k#|@t
zq_2vJvMiU@Ae5}i$9C!H7&&&v=_(pZIByRgxQMH)oN|6NQjE%sjdLsJ