diff --git a/week1_06_question_answering_and_tts/practice_question_answering_and_tts.ipynb b/week1_06_question_answering_and_tts/practice_question_answering_and_tts.ipynb index 8ef668548..df3c322db 100644 --- a/week1_06_question_answering_and_tts/practice_question_answering_and_tts.ipynb +++ b/week1_06_question_answering_and_tts/practice_question_answering_and_tts.ipynb @@ -4,15 +4,14 @@ "metadata": { "accelerator": "GPU", "colab": { - "name": "Question Answering with a Fine-Tuned BERT.ipynb", + "name": "practice_question_answering_and_tts.ipynb", "provenance": [], - "collapsed_sections": [], - "toc_visible": true + "collapsed_sections": [] }, "kernelspec": { - "display_name": "Py3 bot", + "display_name": "Python 3 (ipykernel)", "language": "python", - "name": "py3_bot" + "name": "python3" }, "language_info": { "codemirror_mode": { @@ -24,363 +23,18 @@ "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", - "version": "3.7.9" - }, - "widgets": { - "application/vnd.jupyter.widget-state+json": { - "019b4f79cede42e89bdf3b2f5047a3bf": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HBoxModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "HBoxView", - "_dom_classes": [], - "_model_name": "HBoxModel", - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.5.0", - "box_style": "", - "layout": "IPY_MODEL_934f348be42346bca1e374cec6f7acac", - "_model_module": "@jupyter-widgets/controls", - "children": [ - "IPY_MODEL_14686b543b9349119fc7cec9c0f60963", - "IPY_MODEL_bc8fb4da9de84df6ab7605b2b7d2d32f", - "IPY_MODEL_f25f21412946491ab11381dbe23cccd1" - ] - } - }, - "934f348be42346bca1e374cec6f7acac": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "14686b543b9349119fc7cec9c0f60963": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "HTMLView", - "style": "IPY_MODEL_0fedb09e3c9d4a6eb47d08e4bc013e54", - "_dom_classes": [], - "description": "", - "_model_name": "HTMLModel", - "placeholder": "​", - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "value": "100%", - "_view_count": null, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_ad07800df53e4feba295d0202e17bba9" - } - }, - "bc8fb4da9de84df6ab7605b2b7d2d32f": { - "model_module": "@jupyter-widgets/controls", - "model_name": "FloatProgressModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "ProgressView", - "style": "IPY_MODEL_87c33c91fc584bfbbfe6ea9a61e8b1b2", - "_dom_classes": [], - "description": "", - "_model_name": "FloatProgressModel", - "bar_style": "success", - "max": 142264026, - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "value": 142264026, - "_view_count": null, - "_view_module_version": "1.5.0", - "orientation": "horizontal", - "min": 0, - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_ad8a0ff477c94faa9a9d3ed4ca8fddf3" - } - }, - "f25f21412946491ab11381dbe23cccd1": { - "model_module": "@jupyter-widgets/controls", - "model_name": "HTMLModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "HTMLView", - "style": "IPY_MODEL_7b11de7d759d490791097ef1019848f3", - "_dom_classes": [], - "description": "", - "_model_name": "HTMLModel", - "placeholder": "​", - "_view_module": "@jupyter-widgets/controls", - "_model_module_version": "1.5.0", - "value": " 136M/136M [00:01<00:00, 83.3MB/s]", - "_view_count": null, - "_view_module_version": "1.5.0", - "description_tooltip": null, - "_model_module": "@jupyter-widgets/controls", - "layout": "IPY_MODEL_ad6595b0760144d8899f6a2e1d41ed24" - } - }, - "0fedb09e3c9d4a6eb47d08e4bc013e54": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "ad07800df53e4feba295d0202e17bba9": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "87c33c91fc584bfbbfe6ea9a61e8b1b2": { - "model_module": "@jupyter-widgets/controls", - "model_name": "ProgressStyleModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "StyleView", - "_model_name": "ProgressStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "bar_color": null, - "_model_module": "@jupyter-widgets/controls" - } - }, - "ad8a0ff477c94faa9a9d3ed4ca8fddf3": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - }, - "7b11de7d759d490791097ef1019848f3": { - "model_module": "@jupyter-widgets/controls", - "model_name": "DescriptionStyleModel", - "model_module_version": "1.5.0", - "state": { - "_view_name": "StyleView", - "_model_name": "DescriptionStyleModel", - "description_width": "", - "_view_module": "@jupyter-widgets/base", - "_model_module_version": "1.5.0", - "_view_count": null, - "_view_module_version": "1.2.0", - "_model_module": "@jupyter-widgets/controls" - } - }, - "ad6595b0760144d8899f6a2e1d41ed24": { - "model_module": "@jupyter-widgets/base", - "model_name": "LayoutModel", - "model_module_version": "1.2.0", - "state": { - "_view_name": "LayoutView", - "grid_template_rows": null, - "right": null, - "justify_content": null, - "_view_module": "@jupyter-widgets/base", - "overflow": null, - "_model_module_version": "1.2.0", - "_view_count": null, - "flex_flow": null, - "width": null, - "min_width": null, - "border": null, - "align_items": null, - "bottom": null, - "_model_module": "@jupyter-widgets/base", - "top": null, - "grid_column": null, - "overflow_y": null, - "overflow_x": null, - "grid_auto_flow": null, - "grid_area": null, - "grid_template_columns": null, - "flex": null, - "_model_name": "LayoutModel", - "justify_items": null, - "grid_row": null, - "max_height": null, - "align_content": null, - "visibility": null, - "align_self": null, - "height": null, - "min_height": null, - "padding": null, - "grid_auto_rows": null, - "grid_gap": null, - "max_width": null, - "order": null, - "_view_module_version": "1.2.0", - "grid_template_areas": null, - "object_position": null, - "object_fit": null, - "grid_auto_columns": null, - "margin": null, - "display": null, - "left": null - } - } - } + "version": "3.9.7" } }, "cells": [ { "cell_type": "markdown", "metadata": { - "id": "W-1zl5XdYInf" + "id": "DphyQXreodzp" }, "source": [ - "## Practice: Question Answering with a Fine-Tuned BERT (and TTS example)\n", + "# Practice: Question Answering with a Fine-Tuned BERT (and TTS example)\n", + "\n", "This notebook is based on great [post and corresponding notebook](https://mccormickml.com/2020/03/10/question-answering-with-a-fine-tuned-BERT/) *by Chris McCormick*. It contains some minor changes and additions (especially parts 3 and 4)." ] }, @@ -396,11 +50,9 @@ "\n", "**Part 2** contains example code--we'll be downloading a model that's *already been fine-tuned* for question answering, and try it out on our own text! \n", "\n", - "For something like text classification, you definitely want to fine-tune BERT on your own dataset. For question answering, however, it seems like you may be able to get decent results using a model that's already been fine-tuned on the SQuAD benchmark. In this Notebook, we'll do exactly that, and see that it performs well on text that wasn't in the SQuAD dataset.\n", - "\n", "In **Part 3** we will apply the same approach to Russian language using the model pre-trained on SberQuAD dataset.\n", "\n", - "And in **Part 4** we will generate question and answer as audio (for now in English).\n", + "And in **Part 4** and **Part 5** we will generate question and answer as audio in english and russian languages.\n", "\n", "**Links**\n", "\n", @@ -409,632 +61,51 @@ "* The [original Colab Notebook](https://colab.research.google.com/drive/1uSlWtJdZmLrI3FCNIlUHFxwAJiSu2J0-)." ] }, - { - "cell_type": "markdown", - "metadata": { - "id": "EQ4-_Rsy7rRJ" - }, - "source": [ - "*If running on colab, uncomment the following cell*" - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "-5uC3kgC7rRK", - "outputId": "7560e890-ffea-4b91-96ed-4e13f5584c0b", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 1000 - } - }, - "source": [ - "!pip uninstall -y tensorflow tensorflow-gpu\n", - "!pip install numpy scipy librosa unidecode inflect librosa transformers\n", - "!pip install deeppavlov" - ], - "execution_count": 1, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Found existing installation: tensorflow 2.6.0\n", - "Uninstalling tensorflow-2.6.0:\n", - " Successfully uninstalled tensorflow-2.6.0\n", - "\u001b[33mWARNING: Skipping tensorflow-gpu as it is not installed.\u001b[0m\n", - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (1.19.5)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (1.4.1)\n", - "Requirement already satisfied: librosa in /usr/local/lib/python3.7/dist-packages (0.8.1)\n", - "Collecting unidecode\n", - " Downloading Unidecode-1.3.2-py3-none-any.whl (235 kB)\n", - "\u001b[K |████████████████████████████████| 235 kB 11.2 MB/s \n", - "\u001b[?25hRequirement already satisfied: inflect in /usr/local/lib/python3.7/dist-packages (2.1.0)\n", - "Collecting transformers\n", - " Downloading transformers-4.11.3-py3-none-any.whl (2.9 MB)\n", - "\u001b[K |████████████████████████████████| 2.9 MB 45.6 MB/s \n", - "\u001b[?25hRequirement already satisfied: pooch>=1.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (1.5.1)\n", - "Requirement already satisfied: scikit-learn!=0.19.0,>=0.14.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.22.2.post1)\n", - "Requirement already satisfied: audioread>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (2.1.9)\n", - "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (21.0)\n", - "Requirement already satisfied: decorator>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (4.4.2)\n", - "Requirement already satisfied: soundfile>=0.10.2 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.10.3.post1)\n", - "Requirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.7/dist-packages (from librosa) (1.0.1)\n", - "Requirement already satisfied: resampy>=0.2.2 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.2.2)\n", - "Requirement already satisfied: numba>=0.43.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.51.2)\n", - "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from numba>=0.43.0->librosa) (57.4.0)\n", - "Requirement already satisfied: llvmlite<0.35,>=0.34.0.dev0 in /usr/local/lib/python3.7/dist-packages (from numba>=0.43.0->librosa) (0.34.0)\n", - "Requirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=20.0->librosa) (2.4.7)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from pooch>=1.0->librosa) (2.23.0)\n", - "Requirement already satisfied: appdirs in /usr/local/lib/python3.7/dist-packages (from pooch>=1.0->librosa) (1.4.4)\n", - "Requirement already satisfied: six>=1.3 in /usr/local/lib/python3.7/dist-packages (from resampy>=0.2.2->librosa) (1.15.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.7/dist-packages (from soundfile>=0.10.2->librosa) (1.14.6)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.0->soundfile>=0.10.2->librosa) (2.20)\n", - "Collecting huggingface-hub>=0.0.17\n", - " Downloading huggingface_hub-0.0.19-py3-none-any.whl (56 kB)\n", - "\u001b[K |████████████████████████████████| 56 kB 4.1 MB/s \n", - "\u001b[?25hCollecting tokenizers<0.11,>=0.10.1\n", - " Downloading tokenizers-0.10.3-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (3.3 MB)\n", - "\u001b[K |████████████████████████████████| 3.3 MB 37.3 MB/s \n", - "\u001b[?25hRequirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.7/dist-packages (from transformers) (4.62.3)\n", - "Collecting pyyaml>=5.1\n", - " Downloading PyYAML-6.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (596 kB)\n", - "\u001b[K |████████████████████████████████| 596 kB 46.1 MB/s \n", - "\u001b[?25hRequirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers) (2019.12.20)\n", - "Collecting sacremoses\n", - " Downloading sacremoses-0.0.46-py3-none-any.whl (895 kB)\n", - "\u001b[K |████████████████████████████████| 895 kB 46.2 MB/s \n", - "\u001b[?25hRequirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from transformers) (3.3.0)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from transformers) (4.8.1)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.0.17->transformers) (3.7.4.3)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->transformers) (3.6.0)\n", - "Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (3.0.4)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (1.24.3)\n", - "Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (2.10)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (2021.5.30)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers) (7.1.2)\n", - "Installing collected packages: pyyaml, tokenizers, sacremoses, huggingface-hub, unidecode, transformers\n", - " Attempting uninstall: pyyaml\n", - " Found existing installation: PyYAML 3.13\n", - " Uninstalling PyYAML-3.13:\n", - " Successfully uninstalled PyYAML-3.13\n", - "Successfully installed huggingface-hub-0.0.19 pyyaml-6.0 sacremoses-0.0.46 tokenizers-0.10.3 transformers-4.11.3 unidecode-1.3.2\n", - "Collecting deeppavlov\n", - " Downloading deeppavlov-0.17.1-py3-none-any.whl (929 kB)\n", - "\u001b[K |████████████████████████████████| 929 kB 12.4 MB/s \n", - "\u001b[?25hCollecting fastapi==0.47.1\n", - " Downloading fastapi-0.47.1-py3-none-any.whl (43 kB)\n", - "\u001b[K |████████████████████████████████| 43 kB 1.8 MB/s \n", - "\u001b[?25hCollecting pytelegrambotapi==3.6.7\n", - " Downloading pyTelegramBotAPI-3.6.7.tar.gz (65 kB)\n", - "\u001b[K |████████████████████████████████| 65 kB 4.3 MB/s \n", - "\u001b[?25hCollecting uvicorn==0.11.7\n", - " Downloading uvicorn-0.11.7-py3-none-any.whl (43 kB)\n", - "\u001b[K |████████████████████████████████| 43 kB 1.9 MB/s \n", - "\u001b[?25hCollecting overrides==2.7.0\n", - " Downloading overrides-2.7.0.tar.gz (4.5 kB)\n", - "Collecting uvloop==0.14.0\n", - " Downloading uvloop-0.14.0-cp37-cp37m-manylinux2010_x86_64.whl (3.8 MB)\n", - "\u001b[K |████████████████████████████████| 3.8 MB 33.7 MB/s \n", - "\u001b[?25hCollecting pandas==0.25.3\n", - " Downloading pandas-0.25.3-cp37-cp37m-manylinux1_x86_64.whl (10.4 MB)\n", - "\u001b[K |████████████████████████████████| 10.4 MB 47.3 MB/s \n", - "\u001b[?25hCollecting requests==2.22.0\n", - " Downloading requests-2.22.0-py2.py3-none-any.whl (57 kB)\n", - "\u001b[K |████████████████████████████████| 57 kB 5.1 MB/s \n", - "\u001b[?25hCollecting sacremoses==0.0.35\n", - " Downloading sacremoses-0.0.35.tar.gz (859 kB)\n", - "\u001b[K |████████████████████████████████| 859 kB 54.4 MB/s \n", - "\u001b[?25hCollecting pydantic==1.3\n", - " Downloading pydantic-1.3-cp37-cp37m-manylinux2010_x86_64.whl (7.3 MB)\n", - "\u001b[K |████████████████████████████████| 7.3 MB 24.8 MB/s \n", - "\u001b[?25hCollecting scikit-learn==0.21.2\n", - " Downloading scikit_learn-0.21.2-cp37-cp37m-manylinux1_x86_64.whl (6.7 MB)\n", - "\u001b[K |████████████████████████████████| 6.7 MB 17.7 MB/s \n", - "\u001b[?25hCollecting pytz==2019.1\n", - " Downloading pytz-2019.1-py2.py3-none-any.whl (510 kB)\n", - "\u001b[K |████████████████████████████████| 510 kB 50.0 MB/s \n", - "\u001b[?25hCollecting h5py==2.10.0\n", - " Downloading h5py-2.10.0-cp37-cp37m-manylinux1_x86_64.whl (2.9 MB)\n", - "\u001b[K |████████████████████████████████| 2.9 MB 47.0 MB/s \n", - "\u001b[?25hRequirement already satisfied: scipy==1.4.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (1.4.1)\n", - "Collecting tqdm==4.62.0\n", - " Downloading tqdm-4.62.0-py2.py3-none-any.whl (76 kB)\n", - "\u001b[K |████████████████████████████████| 76 kB 4.1 MB/s \n", - "\u001b[?25hCollecting filelock==3.0.12\n", - " Downloading filelock-3.0.12-py3-none-any.whl (7.6 kB)\n", - "Collecting pyopenssl==19.1.0\n", - " Downloading pyOpenSSL-19.1.0-py2.py3-none-any.whl (53 kB)\n", - "\u001b[K |████████████████████████████████| 53 kB 2.2 MB/s \n", - "\u001b[?25hCollecting nltk==3.4.5\n", - " Downloading nltk-3.4.5.zip (1.5 MB)\n", - "\u001b[K |████████████████████████████████| 1.5 MB 41.5 MB/s \n", - "\u001b[?25hCollecting aio-pika==6.4.1\n", - " Downloading aio_pika-6.4.1-py3-none-any.whl (40 kB)\n", - "\u001b[K |████████████████████████████████| 40 kB 18 kB/s \n", - "\u001b[?25hCollecting ruamel.yaml==0.15.100\n", - " Downloading ruamel.yaml-0.15.100-cp37-cp37m-manylinux1_x86_64.whl (654 kB)\n", - "\u001b[K |████████████████████████████████| 654 kB 39.6 MB/s \n", - "\u001b[?25hCollecting prometheus-client==0.7.1\n", - " Downloading prometheus_client-0.7.1.tar.gz (38 kB)\n", - "Requirement already satisfied: click==7.1.2 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (7.1.2)\n", - "Collecting pymorphy2-dicts-ru\n", - " Downloading pymorphy2_dicts_ru-2.4.417127.4579844-py2.py3-none-any.whl (8.2 MB)\n", - "\u001b[K |████████████████████████████████| 8.2 MB 22.3 MB/s \n", - "\u001b[?25hCollecting Cython==0.29.14\n", - " Downloading Cython-0.29.14-cp37-cp37m-manylinux1_x86_64.whl (2.1 MB)\n", - "\u001b[K |████████████████████████████████| 2.1 MB 42.2 MB/s \n", - "\u001b[?25hCollecting rusenttokenize==0.0.5\n", - " Downloading rusenttokenize-0.0.5-py3-none-any.whl (10 kB)\n", - "Collecting pymorphy2==0.8\n", - " Downloading pymorphy2-0.8-py2.py3-none-any.whl (46 kB)\n", - "\u001b[K |████████████████████████████████| 46 kB 3.4 MB/s \n", - "\u001b[?25hCollecting numpy==1.18.0\n", - " Downloading numpy-1.18.0-cp37-cp37m-manylinux1_x86_64.whl (20.1 MB)\n", - "\u001b[K |████████████████████████████████| 20.1 MB 53.8 MB/s \n", - "\u001b[?25hCollecting yarl\n", - " Downloading yarl-1.7.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (271 kB)\n", - "\u001b[K |████████████████████████████████| 271 kB 51.7 MB/s \n", - "\u001b[?25hCollecting aiormq<4,>=3.2.0\n", - " Downloading aiormq-3.3.1-py3-none-any.whl (28 kB)\n", - "Collecting starlette<=0.12.9,>=0.12.9\n", - " Downloading starlette-0.12.9.tar.gz (46 kB)\n", - "\u001b[K |████████████████████████████████| 46 kB 3.2 MB/s \n", - "\u001b[?25hRequirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from h5py==2.10.0->deeppavlov) (1.15.0)\n", - "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.7/dist-packages (from pandas==0.25.3->deeppavlov) (2.8.2)\n", - "Collecting dawg-python>=0.7\n", - " Downloading DAWG_Python-0.7.2-py2.py3-none-any.whl (11 kB)\n", - "Requirement already satisfied: docopt>=0.6 in /usr/local/lib/python3.7/dist-packages (from pymorphy2==0.8->deeppavlov) (0.6.2)\n", - "Collecting pymorphy2-dicts<3.0,>=2.4\n", - " Downloading pymorphy2_dicts-2.4.393442.3710985-py2.py3-none-any.whl (7.1 MB)\n", - "\u001b[K |████████████████████████████████| 7.1 MB 24.1 MB/s \n", - "\u001b[?25hCollecting cryptography>=2.8\n", - " Downloading cryptography-35.0.0-cp36-abi3-manylinux_2_24_x86_64.whl (3.5 MB)\n", - "\u001b[K |████████████████████████████████| 3.5 MB 41.5 MB/s \n", - "\u001b[?25hCollecting idna<2.9,>=2.5\n", - " Downloading idna-2.8-py2.py3-none-any.whl (58 kB)\n", - "\u001b[K |████████████████████████████████| 58 kB 6.1 MB/s \n", - "\u001b[?25hRequirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (1.24.3)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (2021.5.30)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (3.0.4)\n", - "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from sacremoses==0.0.35->deeppavlov) (1.0.1)\n", - "Collecting httptools==0.1.*\n", - " Downloading httptools-0.1.2-cp37-cp37m-manylinux1_x86_64.whl (219 kB)\n", - "\u001b[K |████████████████████████████████| 219 kB 32.7 MB/s \n", - "\u001b[?25hCollecting h11<0.10,>=0.8\n", - " Downloading h11-0.9.0-py2.py3-none-any.whl (53 kB)\n", - "\u001b[K |████████████████████████████████| 53 kB 2.2 MB/s \n", - "\u001b[?25hCollecting websockets==8.*\n", - " Downloading websockets-8.1-cp37-cp37m-manylinux2010_x86_64.whl (79 kB)\n", - "\u001b[K |████████████████████████████████| 79 kB 7.8 MB/s \n", - "\u001b[?25hCollecting pamqp==2.3.0\n", - " Downloading pamqp-2.3.0-py2.py3-none-any.whl (28 kB)\n", - "Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.7/dist-packages (from cryptography>=2.8->pyopenssl==19.1.0->deeppavlov) (1.14.6)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.12->cryptography>=2.8->pyopenssl==19.1.0->deeppavlov) (2.20)\n", - "Requirement already satisfied: typing-extensions>=3.7.4 in /usr/local/lib/python3.7/dist-packages (from yarl->aio-pika==6.4.1->deeppavlov) (3.7.4.3)\n", - "Collecting multidict>=4.0\n", - " Downloading multidict-5.2.0-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl (160 kB)\n", - "\u001b[K |████████████████████████████████| 160 kB 49.6 MB/s \n", - "\u001b[?25hBuilding wheels for collected packages: nltk, overrides, prometheus-client, pytelegrambotapi, sacremoses, starlette\n", - " Building wheel for nltk (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for nltk: filename=nltk-3.4.5-py3-none-any.whl size=1449922 sha256=b535ba891e5af09414ccded1641b6e86ca64e8d3e8219d9cb8f0ba15872f83af\n", - " Stored in directory: /root/.cache/pip/wheels/48/8b/7f/473521e0c731c6566d631b281f323842bbda9bd819eb9a3ead\n", - " Building wheel for overrides (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for overrides: filename=overrides-2.7.0-py3-none-any.whl size=5605 sha256=f35d81cf19d4ea2d5df0e1979e861ab029240bf285e1fff1e58b2e04d356cca9\n", - " Stored in directory: /root/.cache/pip/wheels/c9/87/45/bfdacf6c3b8233b6e8d519edcbd1cf297ad5ff5f0bf84bb9c1\n", - " Building wheel for prometheus-client (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for prometheus-client: filename=prometheus_client-0.7.1-py3-none-any.whl size=41404 sha256=78963bdfe71b742101d3fc6aade52c3de5465dbc90d2ae272f728e1e56ca010c\n", - " Stored in directory: /root/.cache/pip/wheels/30/0c/26/59ba285bf65dc79d195e9b25e2ddde4c61070422729b0cd914\n", - " Building wheel for pytelegrambotapi (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for pytelegrambotapi: filename=pyTelegramBotAPI-3.6.7-py3-none-any.whl size=47176 sha256=8067d09e771447680123cd23fdded8909a014c3b8aa5c9e4a569f7d5e9e62eb1\n", - " Stored in directory: /root/.cache/pip/wheels/7f/7c/54/8eddf2369ef1b9190e2ee6dc2b40df54b6c65529a38790fdd4\n", - " Building wheel for sacremoses (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for sacremoses: filename=sacremoses-0.0.35-py3-none-any.whl size=883989 sha256=1a5b249c82615565091d0ec58a31c47612d7a54454a17a7ee640ce35ba93cbc9\n", - " Stored in directory: /root/.cache/pip/wheels/d1/ff/0e/e00ff1e22100702ac8b24e709551ae0fb29db9ffc843510a64\n", - " Building wheel for starlette (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for starlette: filename=starlette-0.12.9-py3-none-any.whl size=57251 sha256=bfa1618898c82f0be44db86e36f0a0e360ac6dcc41818d9bb614c8f46526f307\n", - " Stored in directory: /root/.cache/pip/wheels/e8/78/be/f57ed5aed7cd222abdb24e3186b5c9f1074184fcc0a295102b\n", - "Successfully built nltk overrides prometheus-client pytelegrambotapi sacremoses starlette\n", - "Installing collected packages: multidict, idna, yarl, pamqp, numpy, websockets, uvloop, tqdm, starlette, requests, pytz, pymorphy2-dicts, pydantic, httptools, h11, dawg-python, cryptography, aiormq, uvicorn, scikit-learn, sacremoses, rusenttokenize, ruamel.yaml, pytelegrambotapi, pyopenssl, pymorphy2-dicts-ru, pymorphy2, prometheus-client, pandas, overrides, nltk, h5py, filelock, fastapi, Cython, aio-pika, deeppavlov\n", - " Attempting uninstall: idna\n", - " Found existing installation: idna 2.10\n", - " Uninstalling idna-2.10:\n", - " Successfully uninstalled idna-2.10\n", - " Attempting uninstall: numpy\n", - " Found existing installation: numpy 1.19.5\n", - " Uninstalling numpy-1.19.5:\n", - " Successfully uninstalled numpy-1.19.5\n", - " Attempting uninstall: tqdm\n", - " Found existing installation: tqdm 4.62.3\n", - " Uninstalling tqdm-4.62.3:\n", - " Successfully uninstalled tqdm-4.62.3\n", - " Attempting uninstall: requests\n", - " Found existing installation: requests 2.23.0\n", - " Uninstalling requests-2.23.0:\n", - " Successfully uninstalled requests-2.23.0\n", - " Attempting uninstall: pytz\n", - " Found existing installation: pytz 2018.9\n", - " Uninstalling pytz-2018.9:\n", - " Successfully uninstalled pytz-2018.9\n", - " Attempting uninstall: scikit-learn\n", - " Found existing installation: scikit-learn 0.22.2.post1\n", - " Uninstalling scikit-learn-0.22.2.post1:\n", - " Successfully uninstalled scikit-learn-0.22.2.post1\n", - " Attempting uninstall: sacremoses\n", - " Found existing installation: sacremoses 0.0.46\n", - " Uninstalling sacremoses-0.0.46:\n", - " Successfully uninstalled sacremoses-0.0.46\n", - " Attempting uninstall: prometheus-client\n", - " Found existing installation: prometheus-client 0.11.0\n", - " Uninstalling prometheus-client-0.11.0:\n", - " Successfully uninstalled prometheus-client-0.11.0\n", - " Attempting uninstall: pandas\n", - " Found existing installation: pandas 1.1.5\n", - " Uninstalling pandas-1.1.5:\n", - " Successfully uninstalled pandas-1.1.5\n", - " Attempting uninstall: nltk\n", - " Found existing installation: nltk 3.2.5\n", - " Uninstalling nltk-3.2.5:\n", - " Successfully uninstalled nltk-3.2.5\n", - " Attempting uninstall: h5py\n", - " Found existing installation: h5py 3.1.0\n", - " Uninstalling h5py-3.1.0:\n", - " Successfully uninstalled h5py-3.1.0\n", - " Attempting uninstall: filelock\n", - " Found existing installation: filelock 3.3.0\n", - " Uninstalling filelock-3.3.0:\n", - " Successfully uninstalled filelock-3.3.0\n", - " Attempting uninstall: Cython\n", - " Found existing installation: Cython 0.29.24\n", - " Uninstalling Cython-0.29.24:\n", - " Successfully uninstalled Cython-0.29.24\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "kapre 0.3.5 requires tensorflow>=2.0.0, which is not installed.\n", - "xarray 0.18.2 requires pandas>=1.0, but you have pandas 0.25.3 which is incompatible.\n", - "kapre 0.3.5 requires numpy>=1.18.5, but you have numpy 1.18.0 which is incompatible.\n", - "google-colab 1.0.0 requires pandas~=1.1.0; python_version >= \"3.0\", but you have pandas 0.25.3 which is incompatible.\n", - "google-colab 1.0.0 requires requests~=2.23.0, but you have requests 2.22.0 which is incompatible.\n", - "fbprophet 0.7.1 requires pandas>=1.0.4, but you have pandas 0.25.3 which is incompatible.\n", - "datascience 0.10.6 requires folium==0.2.1, but you have folium 0.8.3 which is incompatible.\n", - "albumentations 0.1.12 requires imgaug<0.2.7,>=0.2.5, but you have imgaug 0.2.9 which is incompatible.\u001b[0m\n", - "Successfully installed Cython-0.29.14 aio-pika-6.4.1 aiormq-3.3.1 cryptography-35.0.0 dawg-python-0.7.2 deeppavlov-0.17.1 fastapi-0.47.1 filelock-3.0.12 h11-0.9.0 h5py-2.10.0 httptools-0.1.2 idna-2.8 multidict-5.2.0 nltk-3.4.5 numpy-1.18.0 overrides-2.7.0 pamqp-2.3.0 pandas-0.25.3 prometheus-client-0.7.1 pydantic-1.3 pymorphy2-0.8 pymorphy2-dicts-2.4.393442.3710985 pymorphy2-dicts-ru-2.4.417127.4579844 pyopenssl-19.1.0 pytelegrambotapi-3.6.7 pytz-2019.1 requests-2.22.0 ruamel.yaml-0.15.100 rusenttokenize-0.0.5 sacremoses-0.0.35 scikit-learn-0.21.2 starlette-0.12.9 tqdm-4.62.0 uvicorn-0.11.7 uvloop-0.14.0 websockets-8.1 yarl-1.7.0\n" - ] - }, - { - "output_type": "display_data", - "data": { - "application/vnd.colab-display-data+json": { - "pip_warning": { - "packages": [ - "numpy", - "pandas", - "pytz" - ] - } - } - }, - "metadata": {} - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "8u4iQePy7rRL", - "outputId": "ef608de1-efd4-46d5-eb90-081a44c53fde", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "source": [ - "!python -m deeppavlov install squad_ru_rubert" - ], - "execution_count": 2, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "2021-10-14 22:33:40.165 INFO in 'deeppavlov.core.common.file'['file'] at line 32: Interpreting 'squad_ru_rubert' as '/usr/local/lib/python3.7/dist-packages/deeppavlov/configs/squad/squad_ru_rubert.json'\n", - "Collecting git+https://github.com/deepmipt/bert.git@feat/multi_gpu\n", - " Cloning https://github.com/deepmipt/bert.git (to revision feat/multi_gpu) to /tmp/pip-req-build-ftxsdnuo\n", - " Running command git clone -q https://github.com/deepmipt/bert.git /tmp/pip-req-build-ftxsdnuo\n", - "Building wheels for collected packages: bert-dp\n", - " Building wheel for bert-dp (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for bert-dp: filename=bert_dp-1.0-py3-none-any.whl size=23591 sha256=13ea88229fd57bab42fb565a3b7f876500637c40b390c4ee78bb0bcf23a25756\n", - " Stored in directory: /tmp/pip-ephem-wheel-cache-x4j2jdpe/wheels/44/29/b2/ee614cb7f97ba5c2d220029eaede3af4b74331ad31d6e2f4eb\n", - "Successfully built bert-dp\n", - "Installing collected packages: bert-dp\n", - "Successfully installed bert-dp-1.0\n", - "Collecting tensorflow==1.15.5\n", - " Downloading tensorflow-1.15.5-cp37-cp37m-manylinux2010_x86_64.whl (110.5 MB)\n", - "\u001b[K |████████████████████████████████| 110.5 MB 753 bytes/s \n", - "\u001b[?25hRequirement already satisfied: wheel>=0.26 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (0.37.0)\n", - "Requirement already satisfied: absl-py>=0.7.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (0.12.0)\n", - "Requirement already satisfied: protobuf>=3.6.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (3.17.3)\n", - "Collecting keras-applications>=1.0.8\n", - " Downloading Keras_Applications-1.0.8-py3-none-any.whl (50 kB)\n", - "\u001b[K |████████████████████████████████| 50 kB 6.3 MB/s \n", - "\u001b[?25hRequirement already satisfied: opt-einsum>=2.3.2 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (3.3.0)\n", - "Requirement already satisfied: h5py<=2.10.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (2.10.0)\n", - "Requirement already satisfied: six>=1.10.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.15.0)\n", - "Collecting tensorflow-estimator==1.15.1\n", - " Downloading tensorflow_estimator-1.15.1-py2.py3-none-any.whl (503 kB)\n", - "\u001b[K |████████████████████████████████| 503 kB 43.5 MB/s \n", - "\u001b[?25hCollecting tensorboard<1.16.0,>=1.15.0\n", - " Downloading tensorboard-1.15.0-py3-none-any.whl (3.8 MB)\n", - "\u001b[K |████████████████████████████████| 3.8 MB 40.9 MB/s \n", - "\u001b[?25hRequirement already satisfied: google-pasta>=0.1.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (0.2.0)\n", - "Requirement already satisfied: grpcio>=1.8.6 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.41.0)\n", - "Requirement already satisfied: wrapt>=1.11.1 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.12.1)\n", - "Requirement already satisfied: termcolor>=1.1.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.1.0)\n", - "Requirement already satisfied: keras-preprocessing>=1.0.5 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.1.2)\n", - "Requirement already satisfied: astor>=0.6.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (0.8.1)\n", - "Collecting gast==0.2.2\n", - " Downloading gast-0.2.2.tar.gz (10 kB)\n", - "Requirement already satisfied: numpy<1.19.0,>=1.16.0 in /usr/local/lib/python3.7/dist-packages (from tensorflow==1.15.5) (1.18.0)\n", - "Requirement already satisfied: markdown>=2.6.8 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (3.3.4)\n", - "Requirement already satisfied: setuptools>=41.0.0 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (57.4.0)\n", - "Requirement already satisfied: werkzeug>=0.11.15 in /usr/local/lib/python3.7/dist-packages (from tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (1.0.1)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from markdown>=2.6.8->tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (4.8.1)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->markdown>=2.6.8->tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (3.6.0)\n", - "Requirement already satisfied: typing-extensions>=3.6.4 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->markdown>=2.6.8->tensorboard<1.16.0,>=1.15.0->tensorflow==1.15.5) (3.7.4.3)\n", - "Building wheels for collected packages: gast\n", - " Building wheel for gast (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - " Created wheel for gast: filename=gast-0.2.2-py3-none-any.whl size=7554 sha256=06dac371e24c972318370b7d71a23cf99c25c4525fe1be144e4984a9d32082d6\n", - " Stored in directory: /root/.cache/pip/wheels/21/7f/02/420f32a803f7d0967b48dd823da3f558c5166991bfd204eef3\n", - "Successfully built gast\n", - "Installing collected packages: tensorflow-estimator, tensorboard, keras-applications, gast, tensorflow\n", - " Attempting uninstall: tensorflow-estimator\n", - " Found existing installation: tensorflow-estimator 2.6.0\n", - " Uninstalling tensorflow-estimator-2.6.0:\n", - " Successfully uninstalled tensorflow-estimator-2.6.0\n", - " Attempting uninstall: tensorboard\n", - " Found existing installation: tensorboard 2.6.0\n", - " Uninstalling tensorboard-2.6.0:\n", - " Successfully uninstalled tensorboard-2.6.0\n", - " Attempting uninstall: gast\n", - " Found existing installation: gast 0.4.0\n", - " Uninstalling gast-0.4.0:\n", - " Successfully uninstalled gast-0.4.0\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "tensorflow-probability 0.14.1 requires gast>=0.3.2, but you have gast 0.2.2 which is incompatible.\n", - "kapre 0.3.5 requires numpy>=1.18.5, but you have numpy 1.18.0 which is incompatible.\n", - "kapre 0.3.5 requires tensorflow>=2.0.0, but you have tensorflow 1.15.5 which is incompatible.\u001b[0m\n", - "Successfully installed gast-0.2.2 keras-applications-1.0.8 tensorboard-1.15.0 tensorflow-1.15.5 tensorflow-estimator-1.15.1\n" - ] - } - ] - }, { "cell_type": "code", "metadata": { - "id": "r9oKlEV07rRM", - "outputId": "ef207053-3ed9-4e8a-9bbf-3f6d52168206", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "-5uC3kgC7rRK" }, "source": [ - "!pip install numpy scipy librosa unidecode inflect librosa transformers\n", - "!pip install deeppavlov" + "!pip install -U transformers deeppavlov unidecode omegaconf\n", + "!python -m deeppavlov install squad_ru_rubert\n", + "\n", + "# Pre-downloading the BERT for Russian language. Same result can be achieved with\n", + "# `!python -m deeppavlov download squad_ru_rubert`\n", + "# But it works significantly slower.\n", + "!wget -nc https://www.dropbox.com/s/7za1o6vaffbdlcg/rubert_cased_L-12_H-768_A-12_v1.tar.gz\n", + "!mkdir -p /root/.deeppavlov/downloads/bert_models/\n", + "!tar -xzvf rubert_cased_L-12_H-768_A-12_v1.tar.gz -C /root/.deeppavlov/downloads/bert_models\n", + "\n", + "!wget -nc https://www.dropbox.com/s/ns8280pd9t9n9dc/squad_model_ru_rubert.tar.gz\n", + "!mkdir -p /root/.deeppavlov/models/\n", + "!tar -xzvf squad_model_ru_rubert.tar.gz -C /root/.deeppavlov/models" ], - "execution_count": 3, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Requirement already satisfied: numpy in /usr/local/lib/python3.7/dist-packages (1.18.0)\n", - "Requirement already satisfied: scipy in /usr/local/lib/python3.7/dist-packages (1.4.1)\n", - "Requirement already satisfied: librosa in /usr/local/lib/python3.7/dist-packages (0.8.1)\n", - "Requirement already satisfied: unidecode in /usr/local/lib/python3.7/dist-packages (1.3.2)\n", - "Requirement already satisfied: inflect in /usr/local/lib/python3.7/dist-packages (2.1.0)\n", - "Requirement already satisfied: transformers in /usr/local/lib/python3.7/dist-packages (4.11.3)\n", - "Requirement already satisfied: resampy>=0.2.2 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.2.2)\n", - "Requirement already satisfied: numba>=0.43.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.51.2)\n", - "Requirement already satisfied: joblib>=0.14 in /usr/local/lib/python3.7/dist-packages (from librosa) (1.0.1)\n", - "Requirement already satisfied: scikit-learn!=0.19.0,>=0.14.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.21.2)\n", - "Requirement already satisfied: audioread>=2.0.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (2.1.9)\n", - "Requirement already satisfied: soundfile>=0.10.2 in /usr/local/lib/python3.7/dist-packages (from librosa) (0.10.3.post1)\n", - "Requirement already satisfied: pooch>=1.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (1.5.1)\n", - "Requirement already satisfied: packaging>=20.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (21.0)\n", - "Requirement already satisfied: decorator>=3.0.0 in /usr/local/lib/python3.7/dist-packages (from librosa) (4.4.2)\n", - "Requirement already satisfied: setuptools in /usr/local/lib/python3.7/dist-packages (from numba>=0.43.0->librosa) (57.4.0)\n", - "Requirement already satisfied: llvmlite<0.35,>=0.34.0.dev0 in /usr/local/lib/python3.7/dist-packages (from numba>=0.43.0->librosa) (0.34.0)\n", - "Requirement already satisfied: pyparsing>=2.0.2 in /usr/local/lib/python3.7/dist-packages (from packaging>=20.0->librosa) (2.4.7)\n", - "Requirement already satisfied: requests in /usr/local/lib/python3.7/dist-packages (from pooch>=1.0->librosa) (2.22.0)\n", - "Requirement already satisfied: appdirs in /usr/local/lib/python3.7/dist-packages (from pooch>=1.0->librosa) (1.4.4)\n", - "Requirement already satisfied: six>=1.3 in /usr/local/lib/python3.7/dist-packages (from resampy>=0.2.2->librosa) (1.15.0)\n", - "Requirement already satisfied: cffi>=1.0 in /usr/local/lib/python3.7/dist-packages (from soundfile>=0.10.2->librosa) (1.14.6)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.0->soundfile>=0.10.2->librosa) (2.20)\n", - "Requirement already satisfied: regex!=2019.12.17 in /usr/local/lib/python3.7/dist-packages (from transformers) (2019.12.20)\n", - "Requirement already satisfied: tqdm>=4.27 in /usr/local/lib/python3.7/dist-packages (from transformers) (4.62.0)\n", - "Requirement already satisfied: importlib-metadata in /usr/local/lib/python3.7/dist-packages (from transformers) (4.8.1)\n", - "Requirement already satisfied: pyyaml>=5.1 in /usr/local/lib/python3.7/dist-packages (from transformers) (6.0)\n", - "Requirement already satisfied: tokenizers<0.11,>=0.10.1 in /usr/local/lib/python3.7/dist-packages (from transformers) (0.10.3)\n", - "Requirement already satisfied: huggingface-hub>=0.0.17 in /usr/local/lib/python3.7/dist-packages (from transformers) (0.0.19)\n", - "Requirement already satisfied: filelock in /usr/local/lib/python3.7/dist-packages (from transformers) (3.0.12)\n", - "Requirement already satisfied: sacremoses in /usr/local/lib/python3.7/dist-packages (from transformers) (0.0.35)\n", - "Requirement already satisfied: typing-extensions in /usr/local/lib/python3.7/dist-packages (from huggingface-hub>=0.0.17->transformers) (3.7.4.3)\n", - "Requirement already satisfied: zipp>=0.5 in /usr/local/lib/python3.7/dist-packages (from importlib-metadata->transformers) (3.6.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (2021.5.30)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (2.8)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (3.0.4)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests->pooch>=1.0->librosa) (1.24.3)\n", - "Requirement already satisfied: click in /usr/local/lib/python3.7/dist-packages (from sacremoses->transformers) (7.1.2)\n", - "Requirement already satisfied: deeppavlov in /usr/local/lib/python3.7/dist-packages (0.17.1)\n", - "Requirement already satisfied: prometheus-client==0.7.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.7.1)\n", - "Requirement already satisfied: pytz==2019.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (2019.1)\n", - "Requirement already satisfied: uvloop==0.14.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.14.0)\n", - "Requirement already satisfied: pyopenssl==19.1.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (19.1.0)\n", - "Requirement already satisfied: fastapi==0.47.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.47.1)\n", - "Requirement already satisfied: h5py==2.10.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (2.10.0)\n", - "Requirement already satisfied: click==7.1.2 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (7.1.2)\n", - "Requirement already satisfied: pymorphy2==0.8 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.8)\n", - "Requirement already satisfied: tqdm==4.62.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (4.62.0)\n", - "Requirement already satisfied: ruamel.yaml==0.15.100 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.15.100)\n", - "Requirement already satisfied: numpy==1.18.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (1.18.0)\n", - "Requirement already satisfied: aio-pika==6.4.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (6.4.1)\n", - "Requirement already satisfied: pytelegrambotapi==3.6.7 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (3.6.7)\n", - "Requirement already satisfied: filelock==3.0.12 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (3.0.12)\n", - "Requirement already satisfied: uvicorn==0.11.7 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.11.7)\n", - "Requirement already satisfied: sacremoses==0.0.35 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.0.35)\n", - "Requirement already satisfied: scikit-learn==0.21.2 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.21.2)\n", - "Requirement already satisfied: requests==2.22.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (2.22.0)\n", - "Requirement already satisfied: rusenttokenize==0.0.5 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.0.5)\n", - "Requirement already satisfied: nltk==3.4.5 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (3.4.5)\n", - "Requirement already satisfied: Cython==0.29.14 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.29.14)\n", - "Requirement already satisfied: overrides==2.7.0 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (2.7.0)\n", - "Requirement already satisfied: pandas==0.25.3 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (0.25.3)\n", - "Requirement already satisfied: scipy==1.4.1 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (1.4.1)\n", - "Requirement already satisfied: pydantic==1.3 in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (1.3)\n", - "Requirement already satisfied: pymorphy2-dicts-ru in /usr/local/lib/python3.7/dist-packages (from deeppavlov) (2.4.417127.4579844)\n", - "Requirement already satisfied: aiormq<4,>=3.2.0 in /usr/local/lib/python3.7/dist-packages (from aio-pika==6.4.1->deeppavlov) (3.3.1)\n", - "Requirement already satisfied: yarl in /usr/local/lib/python3.7/dist-packages (from aio-pika==6.4.1->deeppavlov) (1.7.0)\n", - "Requirement already satisfied: starlette<=0.12.9,>=0.12.9 in /usr/local/lib/python3.7/dist-packages (from fastapi==0.47.1->deeppavlov) (0.12.9)\n", - "Requirement already satisfied: six in /usr/local/lib/python3.7/dist-packages (from h5py==2.10.0->deeppavlov) (1.15.0)\n", - "Requirement already satisfied: python-dateutil>=2.6.1 in /usr/local/lib/python3.7/dist-packages (from pandas==0.25.3->deeppavlov) (2.8.2)\n", - "Requirement already satisfied: docopt>=0.6 in /usr/local/lib/python3.7/dist-packages (from pymorphy2==0.8->deeppavlov) (0.6.2)\n", - "Requirement already satisfied: dawg-python>=0.7 in /usr/local/lib/python3.7/dist-packages (from pymorphy2==0.8->deeppavlov) (0.7.2)\n", - "Requirement already satisfied: pymorphy2-dicts<3.0,>=2.4 in /usr/local/lib/python3.7/dist-packages (from pymorphy2==0.8->deeppavlov) (2.4.393442.3710985)\n", - "Requirement already satisfied: cryptography>=2.8 in /usr/local/lib/python3.7/dist-packages (from pyopenssl==19.1.0->deeppavlov) (35.0.0)\n", - "Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (2021.5.30)\n", - "Requirement already satisfied: idna<2.9,>=2.5 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (2.8)\n", - "Requirement already satisfied: chardet<3.1.0,>=3.0.2 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (3.0.4)\n", - "Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.7/dist-packages (from requests==2.22.0->deeppavlov) (1.24.3)\n", - "Requirement already satisfied: joblib in /usr/local/lib/python3.7/dist-packages (from sacremoses==0.0.35->deeppavlov) (1.0.1)\n", - "Requirement already satisfied: h11<0.10,>=0.8 in /usr/local/lib/python3.7/dist-packages (from uvicorn==0.11.7->deeppavlov) (0.9.0)\n", - "Requirement already satisfied: httptools==0.1.* in /usr/local/lib/python3.7/dist-packages (from uvicorn==0.11.7->deeppavlov) (0.1.2)\n", - "Requirement already satisfied: websockets==8.* in /usr/local/lib/python3.7/dist-packages (from uvicorn==0.11.7->deeppavlov) (8.1)\n", - "Requirement already satisfied: pamqp==2.3.0 in /usr/local/lib/python3.7/dist-packages (from aiormq<4,>=3.2.0->aio-pika==6.4.1->deeppavlov) (2.3.0)\n", - "Requirement already satisfied: cffi>=1.12 in /usr/local/lib/python3.7/dist-packages (from cryptography>=2.8->pyopenssl==19.1.0->deeppavlov) (1.14.6)\n", - "Requirement already satisfied: pycparser in /usr/local/lib/python3.7/dist-packages (from cffi>=1.12->cryptography>=2.8->pyopenssl==19.1.0->deeppavlov) (2.20)\n", - "Requirement already satisfied: multidict>=4.0 in /usr/local/lib/python3.7/dist-packages (from yarl->aio-pika==6.4.1->deeppavlov) (5.2.0)\n", - "Requirement already satisfied: typing-extensions>=3.7.4 in /usr/local/lib/python3.7/dist-packages (from yarl->aio-pika==6.4.1->deeppavlov) (3.7.4.3)\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "OfzJwB_17rRM", - "outputId": "7343c565-8604-49db-eef6-1b41d0a2df59", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "OfzJwB_17rRM" }, "source": [ "import torch\n", - "if torch.cuda.is_available():\n", - " device = torch.device('cuda:0')\n", - " tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2', **{'map_location': device})\n", - "else:\n", - " device = torch.device('cpu')\n", - " tacotron2 = None\n", - " print('Unfortunately, Tacotron2 by NVIDIA infers only on GPU, so the Part 4 will not work on CPU-only machine.')" - ], - "execution_count": 4, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Downloading: \"https://github.com/nvidia/DeepLearningExamples/archive/torchhub.zip\" to /root/.cache/torch/hub/torchhub.zip\n", - "Downloading checkpoint from https://api.ngc.nvidia.com/v2/models/nvidia/tacotron2_pyt_ckpt_fp32/versions/19.09.0/files/nvidia_tacotron2pyt_fp32_20190427\n" - ] - } - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "0Eo7EPQT7rRN", - "outputId": "ca159a7d-bdb3-4098-8847-3b281765dcd7", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "source": [ - "# Pre-downloading the BERT for Russian language\n", "\n", - "!wget https://www.dropbox.com/s/7za1o6vaffbdlcg/rubert_cased_L-12_H-768_A-12_v1.tar.gz -nc\n", - "!wget https://www.dropbox.com/s/ns8280pd9t9n9dc/squad_model_ru_rubert.tar.gz -nc\n", + "assert torch.cuda.is_available(), 'Tacotron2 by NVIDIA infers only on GPU, so the Part 4 will not work on CPU-only machine'\n", "\n", - "!mkdir -p /root/.deeppavlov/downloads/bert_models/\n", - "!mkdir -p /root/.deeppavlov/models/\n", + "device = torch.device('cuda:0')\n", + "tacotron2 = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_tacotron2', **{'map_location': device})\n", + "tacotron2.to(device)\n", + "tacotron2.eval()\n", "\n", - "!tar -xzvf rubert_cased_L-12_H-768_A-12_v1.tar.gz -C /root/.deeppavlov/downloads/bert_models\n", - "!tar -xzvf squad_model_ru_rubert.tar.gz -C /root/.deeppavlov/models" + "waveglow = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_waveglow')\n", + "waveglow = waveglow.remove_weightnorm(waveglow)\n", + "waveglow.to(device)\n", + "waveglow.eval();" ], - "execution_count": 5, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "--2021-10-14 22:35:20-- https://www.dropbox.com/s/7za1o6vaffbdlcg/rubert_cased_L-12_H-768_A-12_v1.tar.gz\n", - "Resolving www.dropbox.com (www.dropbox.com)... 162.125.66.18, 2620:100:6020:18::a27d:4012\n", - "Connecting to www.dropbox.com (www.dropbox.com)|162.125.66.18|:443... connected.\n", - "HTTP request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/raw/7za1o6vaffbdlcg/rubert_cased_L-12_H-768_A-12_v1.tar.gz [following]\n", - "--2021-10-14 22:35:20-- https://www.dropbox.com/s/raw/7za1o6vaffbdlcg/rubert_cased_L-12_H-768_A-12_v1.tar.gz\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: https://uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com/cd/0/inline/BYDBS5Bfh4mRY4PPZxgT35OmzVNMdPk-EqUTu6qrFFi219ERjwKRH379E_BmXwhfICcOEWhmufZsuoXrXJosp1YhtxyrKaopgNjFzsbeQB-9NeqSGmIePE2PeB033CLbrj-P9nGFedoJO34VHc5izRGS/file# [following]\n", - "--2021-10-14 22:35:20-- https://uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com/cd/0/inline/BYDBS5Bfh4mRY4PPZxgT35OmzVNMdPk-EqUTu6qrFFi219ERjwKRH379E_BmXwhfICcOEWhmufZsuoXrXJosp1YhtxyrKaopgNjFzsbeQB-9NeqSGmIePE2PeB033CLbrj-P9nGFedoJO34VHc5izRGS/file\n", - "Resolving uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com (uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com)... 162.125.66.15, 2620:100:6020:15::a27d:400f\n", - "Connecting to uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com (uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com)|162.125.66.15|:443... connected.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: /cd/0/inline2/BYALptvPCHi9Y0VW6CALJI_Y0Pnt0wGtPLScpY3YbfGQtrv0lD7gfiE324E68ajiM8mRtxo9zTBK8w2-a7Rj7mGJP1eggnd7a1ss2qTsnSs5XkIhVW4qec9Ho7JYC28HwLv7KYK_8rl-yeSm89wdCRQrgIRxv3WEGEvAVJAsiow6qOf7JGwGP0m6xhTMHbU4N-2_8D8lse78RFK16wpJAcqGtYYuOXdPxnC_YJzh9nZMIfY2W8rCYu4afR1Lqb9FgxQmAL17gpri5H612BLXlLn2v9Owt-kAkFsZv5LM22lfEXJyhSvCfthjhapc9FTrFUIq9NowQSQv_2mJu0oCLxo9XoyMLoOs2cXip9vKsHm71MkfLgEwiTZDpP-Umtll18w/file [following]\n", - "--2021-10-14 22:35:21-- https://uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com/cd/0/inline2/BYALptvPCHi9Y0VW6CALJI_Y0Pnt0wGtPLScpY3YbfGQtrv0lD7gfiE324E68ajiM8mRtxo9zTBK8w2-a7Rj7mGJP1eggnd7a1ss2qTsnSs5XkIhVW4qec9Ho7JYC28HwLv7KYK_8rl-yeSm89wdCRQrgIRxv3WEGEvAVJAsiow6qOf7JGwGP0m6xhTMHbU4N-2_8D8lse78RFK16wpJAcqGtYYuOXdPxnC_YJzh9nZMIfY2W8rCYu4afR1Lqb9FgxQmAL17gpri5H612BLXlLn2v9Owt-kAkFsZv5LM22lfEXJyhSvCfthjhapc9FTrFUIq9NowQSQv_2mJu0oCLxo9XoyMLoOs2cXip9vKsHm71MkfLgEwiTZDpP-Umtll18w/file\n", - "Reusing existing connection to uc713e477e604b7cf18cb46ad6ba.dl.dropboxusercontent.com:443.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 666147468 (635M) [application/octet-stream]\n", - "Saving to: ‘rubert_cased_L-12_H-768_A-12_v1.tar.gz’\n", - "\n", - "rubert_cased_L-12_H 100%[===================>] 635.29M 25.2MB/s in 29s \n", - "\n", - "2021-10-14 22:35:50 (21.8 MB/s) - ‘rubert_cased_L-12_H-768_A-12_v1.tar.gz’ saved [666147468/666147468]\n", - "\n", - "--2021-10-14 22:35:51-- https://www.dropbox.com/s/ns8280pd9t9n9dc/squad_model_ru_rubert.tar.gz\n", - "Resolving www.dropbox.com (www.dropbox.com)... 162.125.67.18, 2620:100:6020:18::a27d:4012\n", - "Connecting to www.dropbox.com (www.dropbox.com)|162.125.67.18|:443... connected.\n", - "HTTP request sent, awaiting response... 301 Moved Permanently\n", - "Location: /s/raw/ns8280pd9t9n9dc/squad_model_ru_rubert.tar.gz [following]\n", - "--2021-10-14 22:35:51-- https://www.dropbox.com/s/raw/ns8280pd9t9n9dc/squad_model_ru_rubert.tar.gz\n", - "Reusing existing connection to www.dropbox.com:443.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: https://ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com/cd/0/inline/BYCOSap_BO6iW_IFwYyrbCxuFhsRMyFCU0YYh3kmx-mle3_0LAgKEBXhMWjU-9_RS56XN6gFI1QuFtr04cd8RyDm0P8KIygxe7IB5wGsUVI6pzEJO79xWB3rYAbpdh23Mes9gQiT84_CDA2iFLUqiiO0/file# [following]\n", - "--2021-10-14 22:35:51-- https://ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com/cd/0/inline/BYCOSap_BO6iW_IFwYyrbCxuFhsRMyFCU0YYh3kmx-mle3_0LAgKEBXhMWjU-9_RS56XN6gFI1QuFtr04cd8RyDm0P8KIygxe7IB5wGsUVI6pzEJO79xWB3rYAbpdh23Mes9gQiT84_CDA2iFLUqiiO0/file\n", - "Resolving ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com (ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com)... 162.125.66.15, 2620:100:6020:15::a27d:400f\n", - "Connecting to ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com (ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com)|162.125.66.15|:443... connected.\n", - "HTTP request sent, awaiting response... 302 Found\n", - "Location: /cd/0/inline2/BYB1fbIxGEWEFAsDaD4e8r8B7_zt8i8urfo3_uGN-dHV3CkX1WsqBMwoKCCVospxbzhRnOpPbEPrQNXYa1OrIWpv0KzlvQRR7zSW6V0ts8vXragHK1Bqaq0xpvqI8uiFZFAovwP1FojsGxZjl9dcL7A2v6CEqkbLFKA6UDHEEbQoc4OM5z3XnrqEfg1YdUIdDcLelkRyy7BaID4v2Vu9gFwr5dla7lNNVRU0uMbuaXzkiLGreV5Va0j6lZ-eKUtBcVk5OoLVGEAEG9OzlrjlJF2U9dTviCDlVNA77fQxdrq-haksglPaPMMj9eMXZdBVoZBd1nIKGYkirQgzf2VezY6iVkodb9Jrr3mg-9y5GR2eZW1P7U8aeFfyd6AzWkQBFmw/file [following]\n", - "--2021-10-14 22:35:52-- https://ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com/cd/0/inline2/BYB1fbIxGEWEFAsDaD4e8r8B7_zt8i8urfo3_uGN-dHV3CkX1WsqBMwoKCCVospxbzhRnOpPbEPrQNXYa1OrIWpv0KzlvQRR7zSW6V0ts8vXragHK1Bqaq0xpvqI8uiFZFAovwP1FojsGxZjl9dcL7A2v6CEqkbLFKA6UDHEEbQoc4OM5z3XnrqEfg1YdUIdDcLelkRyy7BaID4v2Vu9gFwr5dla7lNNVRU0uMbuaXzkiLGreV5Va0j6lZ-eKUtBcVk5OoLVGEAEG9OzlrjlJF2U9dTviCDlVNA77fQxdrq-haksglPaPMMj9eMXZdBVoZBd1nIKGYkirQgzf2VezY6iVkodb9Jrr3mg-9y5GR2eZW1P7U8aeFfyd6AzWkQBFmw/file\n", - "Reusing existing connection to ucde331d1be59b6d375177d093b7.dl.dropboxusercontent.com:443.\n", - "HTTP request sent, awaiting response... 200 OK\n", - "Length: 659197396 (629M) [application/octet-stream]\n", - "Saving to: ‘squad_model_ru_rubert.tar.gz’\n", - "\n", - "squad_model_ru_rube 100%[===================>] 628.66M 15.4MB/s in 39s \n", - "\n", - "2021-10-14 22:36:32 (16.0 MB/s) - ‘squad_model_ru_rubert.tar.gz’ saved [659197396/659197396]\n", - "\n", - "rubert_cased_L-12_H-768_A-12_v1/\n", - "rubert_cased_L-12_H-768_A-12_v1/bert_config.json\n", - "rubert_cased_L-12_H-768_A-12_v1/vocab.txt\n", - "rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt.data-00000-of-00001\n", - "rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt.index\n", - "rubert_cased_L-12_H-768_A-12_v1/bert_model.ckpt.meta\n", - "squad_ru_bert/\n", - "squad_ru_bert/model_rubert.data-00000-of-00001\n", - "squad_ru_bert/model_rubert.index\n", - "squad_ru_bert/model_rubert.meta\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1042,7 +113,7 @@ "id": "X2bUvKUffHNY" }, "source": [ - "## Part 1: How BERT is applied to Question Answering" + "## Part 1: Applying BERT to Question Answering" ] }, { @@ -1062,7 +133,7 @@ "source": [ "When someone mentions \"Question Answering\" as an application of BERT, what they are really referring to is applying BERT to the Stanford Question Answering Dataset (SQuAD).\n", "\n", - "The task posed by the SQuAD benchmark is a little different than you might think. Given a question, and *a passage of text containing the answer*, BERT needs to highlight the \"span\" of text corresponding to the correct answer. \n", + "The task posed by the SQuAD benchmark is a little different than you might think. Given a question, and *a passage of text containing the answer* (often refered to as context), BERT needs to highlight the \"span\" of text corresponding to the correct answer. \n", "\n", "The SQuAD homepage has a fantastic tool for exploring the questions and reference text for this dataset, and even shows the predictions made by top-performing models.\n", "\n", @@ -1091,7 +162,7 @@ "\n", "The two pieces of text are separated by the special `[SEP]` token. \n", "\n", - "BERT also uses \"Segment Embeddings\" to differentiate the question from the reference text. These are simply two embeddings (for segments \"A\" and \"B\") that BERT learned, and which it adds to the token embeddings before feeding them into the input layer. " + "> _Side note:_ Original BERT also uses \"Segment Embeddings\" to differentiate the question from the reference text. These are simply two embeddings (for segments \"A\" and \"B\") that BERT learned, and which it adds to the token embeddings before feeding them into the input layer. However today we will be using DistilBERT model, which relies solely on the special tokens." ] }, { @@ -1141,9 +212,7 @@ "source": [ "In the example code below, we'll be downloading a model that's *already been fine-tuned* for question answering, and try it out on our own text.\n", "\n", - "If you do want to fine-tune on your own dataset, it is possible to fine-tune BERT for question answering yourself. See [run_squad.py](https://github.com/huggingface/transformers/blob/master/examples/run_squad.py) in the `transformers` library. However,you may find that the below \"fine-tuned-on-squad\" model already does a good job, even if your text is from a different domain. \n", - "\n", - "> Note: The example code in this Notebook is a commented and expanded version of the short example provided in the `transformers` documentation [here](https://huggingface.co/transformers/model_doc/bert.html?highlight=bertforquestionanswering#transformers.BertForQuestionAnswering)." + "If you do want to fine-tune on your own dataset, it is possible to fine-tune BERT for question answering yourself. See [run_squad.py](https://github.com/huggingface/transformers/blob/master/examples/run_squad.py) in the `transformers` library. However, you may find that the \"fine-tuned-on-squad\" model already does a good job, even if your text is from a different domain." ] }, { @@ -1152,7 +221,7 @@ "id": "gVq-TuylYRDW" }, "source": [ - "### 1. huggingface transformers library" + "### 1. Load Fine-Tuned BERT" ] }, { @@ -1161,75 +230,28 @@ "id": "f9nhy3PzGQ44" }, "source": [ - "This example uses the `transformers` [library](https://github.com/huggingface/transformers/) by huggingface. We've already installed it in the top of this notebook." - ] - }, - { - "cell_type": "code", - "metadata": { - "id": "-ONLrgJK99TQ" - }, - "source": [ - "import torch" - ], - "execution_count": 6, - "outputs": [] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "1WThOUtpYvG-" - }, - "source": [ - "### 2. Load Fine-Tuned BERT-large" - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "AaweLnNXGhTY" - }, - "source": [ - "For Question Answering we use the `BertForQuestionAnswering` class from the `transformers` library.\n", - "\n", - "This class supports fine-tuning, but for this example we will keep things simpler and load a BERT model that has already been fine-tuned for the SQuAD benchmark.\n", - "\n", - "The `transformers` library has a large collection of pre-trained models which you can reference by name and load easily. The full list is in their documentation [here](https://huggingface.co/transformers/pretrained_models.html).\n", - "\n", - "For Question Answering, they have a version of BERT-large that has already been fine-tuned for the SQuAD benchmark. \n", + "This example uses the `transformers` [library](https://github.com/huggingface/transformers/) by huggingface. We've already installed it in the top of this notebook.\n", "\n", - "BERT-large is really big... it has 24-layers and an embedding size of 1,024, for a total of 340M parameters! Altogether it is 1.34GB, so expect it to take a couple minutes to download to your Colab instance. \n", + "For Question Answering we use the `DistilBertForQuestionAnswering` class from the `transformers` library.\n", "\n", - "(Note that this download is not using your own network bandwidth--it's between the Google instance and wherever the model is stored on the web).\n", + "This class supports fine-tuning, but for this example we will keep things simpler and load a BERT model that has already been fine-tuned for the SQuAD benchmark.\n", "\n", - "Note: I believe this model was trained on version 1 of SQuAD, since it's not outputting whether the question is \"impossible\" to answer from the text (which is part of the task in v2 of SQuAD).\n" + "The `transformers` library has a large collection of pre-trained models which you can reference by name and load easily. The full list is in their documentation [here](https://huggingface.co/transformers/pretrained_models.html)." ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "apS1yS6CdRyX", - "outputId": "bbf150db-579b-4094-c705-6624de9935a7" + "id": "apS1yS6CdRyX" }, "source": [ - "from transformers import DistilBertForQuestionAnswering\n", + "from transformers import DistilBertTokenizer, DistilBertForQuestionAnswering\n", "\n", - "model = DistilBertForQuestionAnswering.from_pretrained('distilbert-base-uncased-distilled-squad')\n" + "tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased-distilled-squad')\n", + "model = DistilBertForQuestionAnswering.from_pretrained('distilbert-base-uncased-distilled-squad')" ], - "execution_count": 72, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.7/dist-packages/cryptography/hazmat/backends/openssl/x509.py:18: CryptographyDeprecationWarning: This version of cryptography contains a temporary pyOpenSSL fallback path. Upgrade pyOpenSSL now.\n", - " utils.DeprecatedIn35,\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1237,35 +259,7 @@ "id": "8imoOxoqGZ0h" }, "source": [ - "Load the tokenizer as well. \n", - "\n", - "Side note: Apparently the vocabulary of this model is identicaly to the one in bert-base-uncased. You can load the tokenizer from `bert-base-uncased` and that works just as well." - ] - }, - { - "cell_type": "code", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "bv60qO4teAUL", - "outputId": "63160a72-6b5c-42f2-e047-35dd017475f2" - }, - "source": [ - "from transformers import DistilBertTokenizer\n", - "\n", - "tokenizer = DistilBertTokenizer.from_pretrained('distilbert-base-uncased-distilled-squad')" - ], - "execution_count": 73, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "/usr/local/lib/python3.7/dist-packages/cryptography/hazmat/backends/openssl/x509.py:18: CryptographyDeprecationWarning: This version of cryptography contains a temporary pyOpenSSL fallback path. Upgrade pyOpenSSL now.\n", - " utils.DeprecatedIn35,\n" - ] - } + "> _Side note:_ Apparently the vocabulary of this model is identicaly to the one in bert-base-uncased. You can load the tokenizer from `bert-base-uncased` and that works just as well." ] }, { @@ -1274,7 +268,7 @@ "id": "I__1ubvcZYow" }, "source": [ - "### 3. Ask a Question" + "### 2. Ask a Question" ] }, { @@ -1285,9 +279,7 @@ "source": [ "Now we're ready to feed in an example!\n", "\n", - "A QA example consists of a question and a passage of text containing the answer to that question.\n", - "\n", - "Let's try an example using the text in this tutorial!" + "A QA example consists of a question and a passage of text containing the answer to that question." ] }, { @@ -1297,9 +289,13 @@ }, "source": [ "question = \"How many parameters does BERT-large have?\"\n", - "answer_text = \"BERT-large is really big... it has 24-layers and an embedding size of 1,024, for a total of 340M parameters! Altogether it is 1.34GB, so expect it to take a couple minutes to download to your Colab instance.\"" + "context = (\n", + " \"BERT-large is really big... it has 24-layers and an embedding size of 1,024, \"\n", + " \"for a total of 340M parameters! Altogether it is 1.34GB, so expect it to \"\n", + " \"take a couple minutes to download to your Colab instance.\"\n", + ")" ], - "execution_count": 9, + "execution_count": null, "outputs": [] }, { @@ -1308,34 +304,21 @@ "id": "llLvxhScKLZn" }, "source": [ - "We'll need to run the BERT tokenizer against both the `question` and the `answer_text`. To feed these into BERT, we actually concatenate them together and place the special [SEP] token in between.\n" + "We'll need to run the BERT tokenizer against both the `question` and the `context`. To feed these into BERT, we actually concatenate them together and place the special `[SEP]` token in between.\n" ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "tYoX33CfKGsr", - "outputId": "906e30a7-f04c-4e1b-a2c9-e47369b8a910" + "id": "tYoX33CfKGsr" }, "source": [ "# Apply the tokenizer to the input text, treating them as a text-pair.\n", - "input_ids = tokenizer.encode(question, answer_text)\n", - "\n", - "print('The input has a total of {:} tokens.'.format(len(input_ids)))" + "input_ids = tokenizer.encode(question, context)\n", + "print(f'The input has a total of {len(input_ids)} tokens.')" ], - "execution_count": 10, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "The input has a total of 70 tokens.\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1349,134 +332,29 @@ { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Iow838yPNDTv", - "outputId": "e4454942-906f-4b11-d11f-3f1e3ff016cf" + "id": "Iow838yPNDTv" }, "source": [ "# BERT only needs the token IDs, but for the purpose of inspecting the \n", "# tokenizer's behavior, let's also get the token strings and display them.\n", "tokens = tokenizer.convert_ids_to_tokens(input_ids)\n", "\n", + "# Display tokens and ids as table.\n", "# For each token and its id...\n", - "for token, id in zip(tokens, input_ids):\n", + "for token, token_id in zip(tokens, input_ids):\n", " \n", " # If this is the [SEP] token, add some space around it to make it stand out.\n", - " if id == tokenizer.sep_token_id:\n", - " print('')\n", + " if token_id == tokenizer.sep_token_id:\n", + " print()\n", " \n", " # Print the token string and its ID in two columns.\n", - " print('{:<12} {:>6,}'.format(token, id))\n", + " print('{:<12} {:>6,}'.format(token, token_id))\n", "\n", - " if id == tokenizer.sep_token_id:\n", - " print('')\n", - " " + " if token_id == tokenizer.sep_token_id:\n", + " print()" ], - "execution_count": 11, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "[CLS] 101\n", - "how 2,129\n", - "many 2,116\n", - "parameters 11,709\n", - "does 2,515\n", - "bert 14,324\n", - "- 1,011\n", - "large 2,312\n", - "have 2,031\n", - "? 1,029\n", - "\n", - "[SEP] 102\n", - "\n", - "bert 14,324\n", - "- 1,011\n", - "large 2,312\n", - "is 2,003\n", - "really 2,428\n", - "big 2,502\n", - ". 1,012\n", - ". 1,012\n", - ". 1,012\n", - "it 2,009\n", - "has 2,038\n", - "24 2,484\n", - "- 1,011\n", - "layers 9,014\n", - "and 1,998\n", - "an 2,019\n", - "em 7,861\n", - "##bed 8,270\n", - "##ding 4,667\n", - "size 2,946\n", - "of 1,997\n", - "1 1,015\n", - ", 1,010\n", - "02 6,185\n", - "##4 2,549\n", - ", 1,010\n", - "for 2,005\n", - "a 1,037\n", - "total 2,561\n", - "of 1,997\n", - "340 16,029\n", - "##m 2,213\n", - "parameters 11,709\n", - "! 999\n", - "altogether 10,462\n", - "it 2,009\n", - "is 2,003\n", - "1 1,015\n", - ". 1,012\n", - "34 4,090\n", - "##gb 18,259\n", - ", 1,010\n", - "so 2,061\n", - "expect 5,987\n", - "it 2,009\n", - "to 2,000\n", - "take 2,202\n", - "a 1,037\n", - "couple 3,232\n", - "minutes 2,781\n", - "to 2,000\n", - "download 8,816\n", - "to 2,000\n", - "your 2,115\n", - "cola 15,270\n", - "##b 2,497\n", - "instance 6,013\n", - ". 1,012\n", - "\n", - "[SEP] 102\n", - "\n" - ] - } - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "zm208EApN16k" - }, - "source": [ - "We've concatenated the `question` and `answer_text` together, but BERT still needs a way to distinguish them. BERT has two special \"Segment\" embeddings, one for segment \"A\" and one for segment \"B\". Before the word embeddings go into the BERT layers, the segment A embedding needs to be added to the `question` tokens, and the segment B embedding needs to be added to each of the `answer_text` tokens." - ] - }, - { - "cell_type": "markdown", - "metadata": { - "id": "a30sBTcqQv6X" - }, - "source": [ - ">*Side Note: Where's the padding?*\n", - ">\n", - "> The original [example code](https://huggingface.co/transformers/model_doc/bert.html?highlight=bertforquestionanswering#transformers.BertForQuestionAnswering) does not perform any padding. I suspect that this is because we are only feeding in a *single example*. If we instead fed in a batch of examples, then we would need to pad or truncate all of the samples in the batch to a single length, and supply an attention mask to tell BERT to ignore the padding tokens. " - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1494,30 +372,29 @@ "id": "HK0obn5x-1EI" }, "source": [ - "inputs = tokenizer(question, answer_text, return_tensors='pt')\n", - "start_positions = torch.tensor([1])\n", - "end_positions = torch.tensor([3])\n", + "import torch\n", "\n", - "outputs = model(**inputs, start_positions=start_positions, end_positions=end_positions)\n", + "inputs = tokenizer(question, context, return_tensors='pt')\n", + "with torch.no_grad():\n", + " outputs = model(**inputs)\n", "\n", "start_scores = outputs.start_logits\n", - "end_scores = outputs.end_logits" + "end_scores = outputs.end_logits\n", + "start_scores" ], - "execution_count": 17, + "execution_count": null, "outputs": [] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "DQiKr6Aw-YTg" + "id": "a30sBTcqQv6X" }, "source": [ - "# Run our example through the model.\n", - "# start_scores, end_scores = model(torch.tensor([input_ids])) # The tokens representing our input text.\n", - "\n" - ], - "execution_count": 18, - "outputs": [] + ">*Side Note: Where's the padding?*\n", + ">\n", + "> The original [example code](https://huggingface.co/transformers/model_doc/bert.html?highlight=bertforquestionanswering#transformers.BertForQuestionAnswering) does not perform any padding. I suspect that this is because we are only feeding in a *single example*. If we instead fed in a batch of examples, then we would need to pad or truncate all of the samples in the batch to a single length, and supply an attention mask to tell BERT to ignore the padding tokens. " + ] }, { "cell_type": "markdown", @@ -1531,46 +408,7 @@ { "cell_type": "code", "metadata": { - "id": "uC2ArgLf-Pi3", - "outputId": "43834471-7224-47df-9437-414b05c9c89a", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "source": [ - "start_scores" - ], - "execution_count": 19, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "tensor([[-4.6549, -5.4920, -6.9543, -6.7978, -7.1190, -6.0274, -7.6631, -7.2082,\n", - " -7.0247, -7.7690, -5.1297, -0.3305, -5.2058, -3.4652, -5.0982, -3.6160,\n", - " -3.1994, -5.3622, -4.9089, -4.3704, 0.1852, -3.1188, 0.8591, -4.5655,\n", - " -3.5403, -5.3101, -2.1212, -2.7155, -5.5414, -5.5158, -3.3945, -4.0354,\n", - " 3.2313, -3.4973, -3.2838, -3.3052, -5.1053, 0.2443, 2.3932, 2.4217,\n", - " -1.7133, 8.3842, -0.9214, -2.0461, -3.8585, -0.5486, -2.0815, -5.2040,\n", - " -0.2521, -4.4770, -1.9723, -4.0387, -5.5288, -5.0099, -5.4694, -5.3426,\n", - " -6.2675, -5.2602, -4.2696, -3.3130, -5.1041, -6.8950, -4.9450, -7.1310,\n", - " -6.1638, -4.3083, -6.5881, -5.6170, -6.0569, -5.1298]],\n", - " grad_fn=)" - ] - }, - "metadata": {}, - "execution_count": 19 - } - ] - }, - { - "cell_type": "code", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "LeUQ44hAJmn9", - "outputId": "4a0b27eb-cbe5-45b2-cd86-46c37f284c31" + "id": "LeUQ44hAJmn9" }, "source": [ "# Find the tokens with the highest `start` and `end` scores.\n", @@ -1578,20 +416,12 @@ "answer_end = torch.argmax(end_scores)\n", "\n", "# Combine the tokens in the answer and print it out.\n", - "answer = ' '.join(tokens[answer_start:answer_end+1])\n", + "answer = ' '.join(tokens[answer_start : answer_end + 1])\n", "\n", - "print('Answer: \"' + answer + '\"')" + "print(f'Answer: \"{answer}\"')" ], - "execution_count": 20, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"340 ##m\"\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1623,39 +453,14 @@ { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "Khral6HZXCuI", - "outputId": "814ba769-d3cc-48af-8a0f-9c2275ac8f74" + "id": "pBrAsWMJrw7i" }, "source": [ - "# Start with the first token.\n", - "answer = tokens[answer_start]\n", - "\n", - "# Select the remaining answer tokens and join them with whitespace.\n", - "for i in range(answer_start + 1, answer_end + 1):\n", - " \n", - " # If it's a subword token, then recombine it with the previous token.\n", - " if tokens[i][0:2] == '##':\n", - " answer += tokens[i][2:]\n", - " \n", - " # Otherwise, add a space then the token.\n", - " else:\n", - " answer += ' ' + tokens[i]\n", - "\n", - "print('Answer: \"' + answer + '\"')" + "answer = tokenizer.convert_tokens_to_string(tokens[answer_start : answer_end + 1])\n", + "print(f'Answer: \"{answer}\"')" ], - "execution_count": 21, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"340m\"\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1663,7 +468,7 @@ "id": "-hh6nkIdXq-O" }, "source": [ - "### 4. Visualizing Scores" + "### 3. Visualizing Scores" ] }, { @@ -1688,10 +493,10 @@ "sns.set(style='darkgrid')\n", "\n", "# Increase the plot size and font size.\n", - "#sns.set(font_scale=1.5)\n", - "plt.rcParams[\"figure.figsize\"] = (16,8)" + "plt.rcParams['figure.figsize'] = (16, 8)\n", + "plt.rcParams['font.size'] = 16" ], - "execution_count": 22, + "execution_count": null, "outputs": [] }, { @@ -1710,16 +515,16 @@ }, "source": [ "# Pull the scores out of PyTorch Tensors and convert them to 1D numpy arrays.\n", - "s_scores = start_scores.detach().numpy().flatten()\n", - "e_scores = end_scores.detach().numpy().flatten()\n", + "start_scores = start_scores.numpy().flatten()\n", + "end_scores = end_scores.numpy().flatten()\n", "\n", "# We'll use the tokens as the x-axis labels. In order to do that, they all need\n", "# to be unique, so we'll add the token index to the end of each one.\n", "token_labels = []\n", "for (i, token) in enumerate(tokens):\n", - " token_labels.append('{:} - {:>2}'.format(token, i))\n" + " token_labels.append('{:} - {:>2}'.format(token, i))" ], - "execution_count": 23, + "execution_count": null, "outputs": [] }, { @@ -1734,38 +539,11 @@ { "cell_type": "code", "metadata": { - "id": "w2Np8FON7rRg" - }, - "source": [ - "import matplotlib" - ], - "execution_count": 24, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "Xq3ZsP3L7rRg" - }, - "source": [ - "matplotlib.rcParams.update({'figure.figsize': (16, 12), 'font.size': 16})" - ], - "execution_count": 25, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 756 - }, - "id": "y6OAV1dL3-UB", - "outputId": "9ae0038f-6c63-4365-ef06-0f750358a2c5" + "id": "y6OAV1dL3-UB" }, "source": [ "# Create a barplot showing the start word score for all of the tokens.\n", - "ax = sns.barplot(x=token_labels, y=s_scores, ci=None)\n", + "ax = sns.barplot(x=token_labels, y=start_scores, ci=None)\n", "\n", "# Turn the xlabels vertical.\n", "ax.set_xticklabels(ax.get_xticklabels(), rotation=90, ha=\"center\")\n", @@ -1773,23 +551,10 @@ "# Turn on the vertical grid to help align words to scores.\n", "ax.grid(True)\n", "\n", - "plt.title('Start Word Scores')\n", - "\n", - "plt.show()" + "plt.title('Start Word Scores');" ], - "execution_count": 26, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6QAAAMNCAYAAACPrLn7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzde5iVdb03/s8MA4IyhuBCUcyMXepTKgqktu0g1i6QVA6ZFh6eNKM85K62VvsxD+1SxA7u1NRd2snqUTwQ4KF2WrnLDLg8/NTd1out2RaBERgc0Jm15vD7w8eRkcG15p7FfG8Wr9d1eV3OPd/39/6sWcMwb9a91qrr6urqCgAAABhg9akHAAAAYPukkAIAAJCEQgoAAEASCikAAABJKKQAAAAkoZACAACQhEIKADnyP//zP7HvvvtGe3t76lEAYKtTSAHItaVLl8YJJ5wQEyZMiHe9611xwgknxKOPPhoREbfddluceOKJ/dq/XAFcvXp17LvvvvHCCy90H/ve977X67HTTjutX7NU4o2+HgCwrVFIAcitDRs2xJw5c2L27Nnx5z//OX7/+9/HWWedFUOGDKnK/pU8Cjl69OjYe++9Y8mSJd3Hli5dGm9961s3OzZp0qSqn39TW/vr8aqOjo6q7gcAW6KQApBbTz/9dERETJs2LQYNGhRDhw6NI444Ivbbb79Yvnx5XHjhhfHwww/HwQcfHBMnToyIiN/+9rdx3HHHxSGHHBLve9/74rvf/W73fq8+GnrLLbfE+9///jjllFNi9uzZERExadKkOPjgg+Ohhx7abI6JEyfG0qVLI+KVsvb444/HySef3OPYQw89FBMnTozOzs645ppr4sgjj4zDDz88zjvvvGhpadni+Ts6OmLu3Llx6KGHxlFHHRW/+93vMn09XnXzzTfHlClT4uCDD46pU6fG448/HhERy5cvj5NOOikmTpwYRx99dPzmN7/pznzpS1+KCy+8MD71qU/F+PHj48EHH4xVq1bF2WefHYcddlhMnjw5fvzjH3evf/TRR2PGjBlxyCGHxLvf/e649NJLK71LAaCHhtQDAMCW7LPPPjFo0KA4//zzY+rUqTF+/Ph405veFBER48aNi4svvjhuueWW+PnPf96dGTZsWMydOzfe9ra3xZNPPhmf/OQnY//9948PfOAD3WuWLFkSd955Z9TX18cLL7wQRx11VCxZsiQaGnr/a3HSpElx4403RkTEE088EePGjYvDDz+8+7xPPPFEtLe3x4EHHhi33XZb3H777fHjH/84Ro4cGeeff35ccsklMW/evF7Pf/PNN8d9990Xd9xxRwwbNizOPvvsTF+PiIi77rorvvvd78bVV18dBxxwQDz77LPR0NAQpVIp5syZEzNnzowf/OAHsWzZsvjsZz8bt956a7z1rW+NiIhFixbF9ddfH9ddd120tbXFJz7xiZg8eXJ885vfjFWrVsWpp54a++yzT7znPe+Jr3/963HyySfHcccdFxs3boynnnqqr3ctAESER0gByLHhw4fHz372s6irq4sLLrggDj/88JgzZ06P526+3qGHHhr77rtv1NfXx3777RdHH310/PnPf+6x5uyzz44dd9wxhg4dWtEckyZNiqeeeipefPHFWLZsWUycODHe8pa3xNq1a7uPHXTQQTFkyJBYuHBhnHrqqbHXXnvFTjvtFJ///Ofjzjvv7HF57qbnv+uuu+KUU06JMWPGxIgRI+LTn/505q/H/Pnz4/TTT48DDzww6urqYu+9944999wzHnnkkXjppZfijDPOiCFDhsThhx8eRx55ZCxevLh776OOOiomTJgQ9fX18eSTT8batWu7Lwfea6+94vjjj48777wzIiIaGhri2WefjbVr18ZOO+0U48ePr+jrCACvp5ACkGvjxo2Lyy67LH7/+9/HwoULY/Xq1fGNb3xji+sfeeSROOmkk+Kwww6LCRMmxC9+8YtYt25djzW77757n2YYO3Zs7LbbbrF06dJYsmRJTJgwISIiDjnkkO5jrz5/dPXq1bHnnnt2Z/fcc89ob2+PNWvW9Hr+1atXx5gxY7o/3mOPPd5wljf6ejz//PPx5je/ebPM6tWrY/fdd4/6+tf+2t9jjz1i1apV3R9vOsNzzz0Xq1evjokTJ3b/d+2113YX369//evxzDPPxJQpU2LmzJlx3333veHMALAlCikA24xx48bFjBkzui8Rraur22zNF77whe7nYi5btixOOOGE6Orq6rFm01xve/Rm4sSJsWTJknj44YfjkEMOiYiICRMmxJIlS2LZsmXdhXT06NHx3HPPdedWrFgRDQ0NMWrUqF7PWSgU4vnnn+/+eNP/L+f1X48xY8bEs88+u9m60aNHx8qVK6Ozs7PHeXbbbbde9x0zZkyMHTs2li5d2v3fQw89FP/2b/8WERFvectb4lvf+lY88MAD8alPfSrOOeeceOmllyqeGwBepZACkFvLly+PG264IVauXBkRr5SoRYsWxUEHHRQREaNGjYpVq1ZFsVjszmzcuDHe9KY3xQ477BCPPvpoLFq06A3PMXLkyKivr4+//e1vb7hu0qRJsWDBghg9enQMHz48Il4ppAsWLIgNGzZ0X7Y6bdq0+NGPfhR/+9vfYuPGjfHtb387pkyZssXnp06ZMiV+8pOfxMqVK2P9+vVx/fXXZ/56zJo1K2644YZ47LHHoqurK/7617/Gc889FwceeGAMHTo0vv/970epVIoHH3ww7r333pg6dWqv5znwwANjp512iuuvvz5aW1ujo6Mjnnzyye63l1mwYEGsXbs26uvrY+edd46I6PHoKwBUyosaAZBbw4cPj0ceeSRuvPHGaGlpicbGxjjyyCPjvPPOi4iIww47LP7u7/4ujjjiiKirq4sHH3wwLrzwwpg7d25ccskl8a53vSumTJkSL7744hbPMWzYsJgzZ06ceOKJ0d7eHt///vd7fU7kpEmTYs2aNT1K3P777x+tra3xjne8I4YNGxYRETNnzoxVq1bF7Nmzo62tLY444oi44IILtnj+448/Pp555pk49thjY6eddorTTjst/vSnP2X6ekyZMiWam5vjC1/4Qvelw5dffnnsueeece2118bFF18c1113Xey2225x+eWXx7hx43o9z6BBg+Laa6+NuXPnxlFHHRXFYjH22WefOPfccyMi4v7774/LLrssWltbY4899ohvf/vbFT8fFwA2Vdf1+uuYAAAAYAC4vgYAAIAkFFIAAACSUEgBAABIQiEFAAAgCYUUAACAJBRSAAAAksjN+5CuW7cxOjt7vgPNqFHDY82aDX3aJ6+ZvM6VJZPXubJk8jpXlkxe58qSyetcWTJ5nStLJq9zZcnkda4smbzOlSWT17kGKpPXubJk8jpXlkxe58qSyetcWTJ5nStLJq9zZclsaX19fV3ssstOvWZyU0g7O7s2K6SvHs+yVx4zeZ0rSyavc2XJ5HWuLJm8zpUlk9e5smTyOleWTF7nypLJ61xZMnmdK0smr3MNVCavc2XJ5HWuLJm8zpUlk9e5smTyOleWTF7nypLp63qX7AIAAJCEQgoAAEASCikAAABJKKQAAAAkoZACAACQhEIKAABAEgopAAAASSikAAAAJKGQAgAAkIRCCgAAQBIKKQAAAEkopAAAACShkAIAAJCEQgoAAEASCikAAABJKKQAAAAkoZACAACQhEIKAABAEgopAAAASSikAAAAJKGQAgAAkIRCCgAAQBIKKQAAAEkopAAAACShkAIAAJCEQgoAAEASDakHAACoROOIYTF08Oa/uhQKjT0+bi21R0vzywM1FgD9oJACANuEoYMb4rj595Zdd8esydEyAPMA0H8u2QUAACAJhRQAAIAkFFIAAACSUEgBAABIQiEFAAAgCYUUAACAJBRSAAAAklBIAQAASEIhBQAAIImGam103333xZVXXhldXV3R1dUVZ511VvzDP/xDtbYHAACgxlSlkHZ1dcV5550XN910U7z97W+Pv/zlL3HiiSfGBz7wgaiv9yAsAAAAm6taW6yvr4+WlpaIiGhpaYnRo0crowAAAGxRXVdXV1c1NnrggQfi3HPPjR133DE2btwY119/fYwfP74aWwMARETEcfPvLbvmjlmTB2ASAKqhKpfstre3x3XXXRfXXHNNTJgwIZYtWxbnnntuLF68OHbaaaeK9lizZkN0dvbsxoVCYzQ1tfRplrxm8jpXlkxe58qSyetcWTJ5nStLJq9zZcnkda4smbzOlSWT17myZPI6V5ZMufWFQmPFe5XbZ1u8/dtSJq9zZcnkda4smbzOlSWT17myZPI6V5bMltbX19fFqFHDe81U5Zra//zP/4zVq1fHhAkTIiJiwoQJMWzYsFi+fHk1tgcAAKAGVaWQ7r777rFy5cr47//+74iIWL58eaxZsybe/OY3V2N7AAAAalBVLtktFApx0UUXxec+97moq6uLiIhvfOMbMWLEiGpsDwAAQA2q2vuQHnPMMXHMMcdUazsAAABqnPdlAQAAIAmFFAAAgCQUUgAAAJJQSAEAAEhCIQUAACAJhRQAAIAkFFIAAACSUEgBAABIQiEFAAAgCYUUAACAJBRSAAAAklBIAQAASEIhBQAAIAmFFAAAgCQUUgAAAJJQSAEAAEhCIQUAACAJhRQAAIAkFFIAAACSUEgBAABIQiEFAAAgCYUUAACAJBRSAAAAklBIAQAASEIhBQAAIAmFFAAAgCQUUgAAAJJQSAEAAEhCIQUAACAJhRQAAIAkFFIAAACSUEgBAABI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AAAAW0trqT1un3lEResAGHgKKQBQs1qaX46W1x0rFBqjqen1RwFIwSW7AAAAJKGQAgAAkIRCCgAAQBIKKQAAAEkopAAAACShkAIAAJCEQgoAAEASCikAAABJKKQAAAAkoZACAACQhEIKAABAEgopAAAASSikAAAAJKGQAgAAkIRCCgAAQBIKKQAAAEkopAAAACShkAIAAJCEQgoAAEASCikAAABJKKQAAAAkoZACAACQhEIKAABAEgopAAAASSikAAAAJKGQAgAAkIRCCgAAQBINqQcAALY/raX2WDDrQxWvBaA2KaQAwIBraX45WjclM6sAACAASURBVF53rFBojKam1x8FoJa5ZBcAAIAkFFIAAACSUEgBAABIQiEFAAAgCYUUAACAJPr9KrsXX3xxPPDAAzFkyJDYcccd45//+Z/jgAMOqMZsAAAA1LB+P0L63ve+NxYuXBi//OUv49Of/nT84z/+YzXmAgAAoMb1+xHSI488svv/x48fHytXrozOzs6or3c1MAAAAFvW70K6qZtuuine//73K6MAAGxRqdQZp8woVLQOqG1lC+n06dNjxYoVvX7uj3/8YwwaNCgiIhYvXhwLFy6Mm266qboT9qJQaKyZTF7nypLJy1xZ9qzGHnnN5HWucplq3I+V7DNQ56lGJg/3S7UyeZhrW7rvt0YmDzOkOkfWzECcO69zZd2zv3sMHlyf2++JvM6VJZPXubJk8jpXlkxe58qSGTVq+BY/V7aQ3n777WVP8Otf/zq+/e1vxw9/+MPYdddd+zRcFk1NLRHRty9E1kxfv9h9zQzkbcmSyetcW1IoNG7x83m+LbV0v1Tjvnyj+7Fa59ga56mlnxe1dFt6szW+x/J6v/Sm3O1PlcnLXI0jdoxbZx5adp/WUke0NL80YPdLLf392tdzZDlPLf0cc1vcljxm+rJ+zZoNWyyl/b5k97777otLL700brzxxhg7dmx/twMASKql+aV4fS3KUnwBKK/fhfTLX/5yDB48OM4555zuYz/84Q9jl1126e/WAAD8P62ljrhpxt4VrQPYVvS7kP7pT3+qxhwAVKi1VIy7jvtOReuA2uGRW6AWVfVVdgHY+lqa26Il2noc80spALAt8v4sAAAAJKGQAgAAkIRCCgAAQBIKKQAAAEkopAAAACShkAIAAJCEQgoAAEASCikAAABJKKQAAAAk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\n", - "text/plain": [ - "
" - ] - }, - "metadata": {} - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1803,16 +568,11 @@ { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 756 - }, - "id": "6tXEqIp-Tzou", - "outputId": "24e6ca48-f649-49b4-f08d-59d0ba691f13" + "id": "6tXEqIp-Tzou" }, "source": [ "# Create a barplot showing the end word score for all of the tokens.\n", - "ax = sns.barplot(x=token_labels, y=e_scores, ci=None)\n", + "ax = sns.barplot(x=token_labels, y=end_scores, ci=None)\n", "\n", "# Turn the xlabels vertical.\n", "ax.set_xticklabels(ax.get_xticklabels(), rotation=90, ha=\"center\")\n", @@ -1820,23 +580,10 @@ "# Turn on the vertical grid to help align words to scores.\n", "ax.grid(True)\n", "\n", - "plt.title('End Word Scores')\n", - "\n", - "plt.show()" + "plt.title('End Word Scores');" ], - "execution_count": 27, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "iVBORw0KGgoAAAANSUhEUgAAA6QAAAMNCAYAAACPrLn7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdfZyVdZ0//vcMM4Asw4IwKKjRzSPTbkwSxIe1lth3K8UbbjJ1tbxLTSzbNLP65mp+vxZqm5aYufsNd8v6/QwEVEhti4xV8hdsZba5uq5ZGyIjMDSAwzlz8/ujLyMHZjxnrjnM55qZ5/Px6JFzzfv9ud7nnDln5sV1nevUdHZ2dgYAAAD0s9rUAwAAADA0CaQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAjBkff3rX48rr7wy9RgRETFz5sx47LHHUo8BAP1KIAVgQJk5c2YcccQRMXXq1K7/ffGLX6z6ft73vvfFypUru75et25dvOlNb9pr29SpU6Otra3q+9/dhg0b4uMf/3jMmDEjjjrqqJg1a1bce++9+3SfANAf6lIPAAC9dccdd8Sxxx67T/cxffr0+PnPfx4nnnhiRESsXbs2Xv/61++1berUqVFXV/mv07a2tl7VR0R8+tOfjsMOOyxWrVoVw4cPj6effjqampp6tca+mAsA+soRUgAGjXvvvTfOPPPMWLBgQUyfPj1mzpwZjzzySNf3//CHP8TZZ58dU6dOjfPOOy+2bNnS41rTpk2LtWvXdn29du3a+OhHP7rXtmnTpkVExI9+9KM46aSTYtq0aXHOOefEs88+21U3c+bMuPPOO+Pkk0+OI488Mtra2mLZsmVx/PHHx4wZM+Ib3/jGq96uJ598MubMmROjRo2Kurq6ePOb3xzvfve7S+Y444wzYtq0afHud7+76+hpS0tLXHXVVXHMMcfE8ccfH7fffnt0dHR03VdnnHFG3HDDDTFjxoz4+te/HoVCIRYsWBDvec974thjj41rrrkmWltbIyJi8+bNcfHFF8e0adPi6KOPjrPOOqtrLQDISiAFYFB54okn4nWve1387Gc/iwsvvDA+//nPR2dnZ0REXHnllfGWt7wlHn/88bj00ktj6dKlPa4zffr0eOaZZ6K5uTk6OjriySefjBNPPDH+9Kc/dW37t3/7t5g+fXo899xzccUVV8TnPve5WLNmTRx33HFxySWXRKFQ6FpvxYoVceedd8batWvjd7/7XVx33XVx4403xurVq6O5uTk2bNjQ4yxvf/vb47rrrosVK1bE+vXrS773xz/+MT760Y/G2WefHWvWrIlly5bF4YcfHhER119/fbS0tMS//Mu/xLe//e1Yvnx5LFmypOS+OuSQQ+LRRx+Nj33sY3HzzTfHc889F8uWLYuHH344Nm7cGAsXLoyIiEWLFsUBBxwQa9asiUcffTQ+9alPRU1NTe8fIADYjUAKwIAzf/78mDZtWtf/7rnnnq7vTZ48OU4//fQYNmxYzJ49O5qamuKll16K9evXx69//eu4/PLLY/jw4V1HUHty0EEHxeTJk2Pt2rXx1FNPxZQpU2LkyJHxjne8o2tbsViMt7/97bFy5cp497vfHe985zujvr4+LrjggmhtbY1f/OIXXeudc845MWnSpBg5cmQ8+OCD8Z73vCemT58ew4cPj8svvzxqa3v+lXzrrbfGtGnT4vbbb48TTjghTj311HjiiSciIuKBBx6IY489NmbNmhX19fUxbty4OPzww6O9vT1WrlwZV1xxRYwePToOPvjgOO+88+K+++7rWnfixIlxzjnnRF1dXYwYMSLuueee+NznPhdjx46N0aNHx8UXXxwrVqyIiIi6urpoamqK9evXR319fUybNk0gBaDPvFkEgAFn4cKFPb6HdMKECV3/vd9++0VExI4dO2LLli0xZsyYGDVqVNf3J0+eHC+88EKP+9l12u6kSZO6Ts096qijurYdccQRMXz48Ni4cWNMnjy5q6+2tjYmTZoUL774Yte2SZMmdf33xo0b48ADD+z6etSoUTF27Nge5/jLv/zLuPLKK+PKK6+MzZs3x4033hjz58+Pn/70p/HCCy/Ea17zmr16tmzZEsVisWSuyZMnl8y0+wybN2+Ol19+OebMmdO1rbOzs+u03AsuuCBuu+22OP/88yMi4kMf+lBcdNFFPc4MAJVwhBSAIaGxsTH+9Kc/xY4dO7q27Xn66552Xdho3bp1XYF02rRpe22bOHFiyVqdnZ3xwgsvxAEHHNC1bfejiRMnTiw5Rffll1+O5ubmim7H/vvvH+eff35s3LgxmpubY9KkSfH73/9+r7px48ZFfX19yVyvNtO4ceNi5MiRsWLFili7dm2sXbs21q1b13WUd/To0XH11VfHj370o/jGN74RixYtijVr1lQ0MwD0RCAFYEg46KCD4q1vfWvXxXvWrl0bq1atetWeadOmxW9/+9v4+c9/Hu94xzsiIuLQQw+N//7v/47HH388pk+fHhERH/jAB+KRRx6JNWvWRLFYjG9961sxfPjwmDp1arfrvu9974uf/OQnsXbt2igUCvG1r33tVS8QdNNNN8XTTz8dbW1tsW3btvje974XU6ZMiXHjxsXJJ58cjz32WKxcuTLa2tpiy5Yt8dvf/jaGDRsW73//++OrX/1qbNu2Lf74xz/GokWL4pRTTul2H7W1tfHBD34wbrjhhti0aVNERLz44ouxevXqiIhYtWpVPP/889HZ2RkNDQ0xbNgwp+wC0GcCKQADziWXXFLyOaTz58+vqO8rX/lK/OpXv4oZM2bEwoUL47TTTnvV+te97nWx//77x4QJE2LMmDER8efgdsQRR8S2bdu6AufrX//6uOmmm+L666+PY445JlatWhV33HFHDB8+vNt13/jGN8Y111wTV155ZfzVX/1VjBkzpuT02T21trbGZZddFtOnT4/3vve9sX79+q4r806ePDn+4R/+IRYtWhRHH310nHbaafHUU09FRMQXvvCF2G+//eK9731vnHXWWTFr1qyYO3duj/v59Kc/HVOmTInTTz893vGOd8S5554bzz33XEREPP/883HeeefF1KlT40Mf+lCceeaZccwxx7zq/QcA5dR07rr0IAAAAPQjR0gBAABIQiAFAAAgCYEUAACAJARSAAAAkhBIAQAASKKuWgutWrUqbr311ujs7IzOzs647LLL4q//+q+rtTwAAACDTFU+9qWzszOOPvrouPvuu+PQQw+Np556Ks4888xYt25d1NZWdhB2y5bt0dFROsr48aNj06ZtvZolrz15nStLT17nytKT17my9OR1riw9eZ0rS09e58rSk9e5svTkda4sPXmdK0tPXufqr568zpWlJ69zZenJ61xZevI6V5aevM6VpSevc2Xp6am+trYmxo37i257qnaEtLa2NlpaWiIioqWlJSZOnFhxGI2I6Ojo3CuQ7treW3ntyetcWXryOleWnrzOlaUnr3Nl6cnrXFl68jpXlp68zpWlJ69zZenJ61xZevI6V3/15HWuLD15nStLT17nytKT17my9OR1riw9eZ0rS09v66sS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CYEUAACAJARSAAAAkhBIAQAASEIgBQAAIIm6aiyyZcuWuOqqq+L3v/99DB8+PKZMmRJf/OIXY//996/G8gAAAAxCVTlCWlNTExdeeGE89NBDcf/998chhxwSN998czWWBgAAYJCqSiAdO3ZszJgxo+vrI488MtavX1+NpQEAABikajo7OzuruWBHR0ecf/75MXPmzPjwhz9czaUBYNCZtfjusjUPzPubfphkYDht8Y/L1iybN7Pk69lL/rVsz9K57yr5eu6Sx8v2LJn7yj/Gz1vyy7L1ERGL5x5ZUR3AUFGV95Du7vrrr49Ro0bF2Wef3au+TZu2RUdHaTZubGyIpqaWXq2T1568zpWlJ69zZenJ61xZevI6V5aevM6VpSevc2XpyetcWXryMldjY0PFa/W0Tl5uSzV69sX91R89vanffT97yuvjkqUnr3Nl6cnrXFl68jpXlp68zpWlJ69zZenpqb62tibGjx/dbU9VA+mCBQvi+eefjzvuuCNqa13AFwAAgJ5VLZD+/d//fTz55JNx5513xvDhw6u1LAAAAINUVQLpM888E9/85jfjta99bZxxxhkREXHwwQfHwoULq7E8AAAAg1BVAukb3/jG+I//+I9qLAUAAMAQ4Y2eAAAAJFH1q+wCAPtGw9j9YmT93r+6u7vKa2uxLVqaX+6PsQAgM4EUAAaIkfV1MWvx/1tR7QPzPhS9u7g/APQ/p+wCAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJBEXeoBAAaLhrHDY2T9iL22NzY27LWttbgzWpoL/TEWAEBuVS2QPvfcc3H11VdHc3NzjB07NhYsWBCvfe1rq7U8QO6NrB8Rpy1/f0W1y059MFpCIAUAhraqBdK/+7u/i7POOitOPfXUWL58eVxzzTXxz//8z9VaHqBPxowdHiMqOHq5s7gz/uTIJQBAv6hKIN20aVP8+7//eyxatCgiImbNmhXXX399bN68Ofbff/9q7AKgT0bUj4irFpc/ennjvAcjHLkEAOgXNZ2dnZ19XeTJJ5+Mz3zmM7FixYqubSeeeGLcdNNN8Za3vKWiNTrb2qOmbliv6jrb2qKmrnym3r2utz2V1pf2FKOmrr6C+lfqsvUUoqZueAU9r9R1tBWitoKeXXW9rc+yj6w97W2FGFZBz6663tZn2Ud/9WTZR1t7IeqGle/Zva4/eiqt372n2F6I+gp6dq/rj55CeyGGV3hbdtVW2rN7XaG9GMOHlX+92L2utz2F9rYYPqyy175dtZX27F7XHz39d1vaY/iw8r/Hdq/rbU+l9Vl6+jJXlp7+uy0dMXxY+Ws47l7X255K67P0lM7VGcOH1VTQ80pdsb0z6ivo2VXX1t4ZdRXUR0RXbaU9u9e1t3fGsAp6dq/rbU+l9Vl6dq/raO+M2gp6dq/raOuM2roKev5vXaX1WXp2r8vS09nWGTUV9Oyqq7S+tKcjaurKP192r+uPnkrrs/SUzpUlJ+37niz76E5uLmpUUzcsmr7xnbJ1jR87O5qaWv78340N0XTH/ynfc8kFe/QsrKBnfjQ1tURjY0O8+I0by9ZHRBzwsau6el64/Qtl6ydden3JXH9cOL9sz0HzF5b0PP+108r2TPnEspKepxaeWrbnsPnLu27LL79xStn6Iz92X8k+/r9vnly25+iL7y/pWf0Ps8r2/NVHHyjp+dE/nlS254QLV3Tdlgf/z4ll699/wcqSfdz3rQ+U7Tnl/B+U9CxeVP5I3LzzHizp+d5d7yvbc+a5D3Xdln+666/L1n/k3IdL9vGP/1x+Hxd++KGSntu/U77n0rNLe275bvmeT571ym1Z8P+Ur4+I+MwZr/Rce0/5nmtPf2WuP9tZ8v3GxoY9vl9a19jYEBffW/6x/OacB3dbp9J9/Lm2sbEhPrD8I2X38YNT/6nkPv7Ask+W7zntlpKeE5d9vmzPytP+d9d9fOLS/1W2PiJi5ez/2dVz0tLyr5crZl9VMtdJ995SvmfOJ/foKf86vmLOK6/jJy25s2x9RMSKuRd19cxa8q2y9Q/MPb9krllLyr9V5YG5H36Vn4lyPzO9r29sbIiTFy8uu8798+aV3JaTFy+voOfUkp5TFq8o0xFx37yTuu7jUxc/VLY+ImL5vPf1eBt7e3/lpaexsSFOX/JU2TXumXtYyX38N/c+X7bn7jlTSno+vfS/y/bcNPvgrsflS0tfKFsfEfHZ2ZO6ehYufbFs/fzZB5TM9U/3NpXt+cicxpKe7y95qWzPB+dO6Jrr/nvK10dEnHz6Kz0//F75nv9x5oSSuX76nfK35bizS2/Lz+7aWLbnmHMnds31i38sXx8RMfXCV3r+/Y7yj8ubLyl9XJ792oayPW/4xIGlf8PeXP5n5qArX/l52XBT+Z/jiIgDPz3llZ6vPF2+/opDS+ba8Pe/Lt/zqbeV9Lx4y7qyPQd88qhXcsKtPytbHxFxwOXHvNLztZ+Wr//EcSVzbfz6j8r2TPz4CaU9t/2gfM9lHyjtWXhf+Z75p3Tdlo23l//9MvHSebFp07YYP350t9+vyse+TJo0KV588cVob2+PiIj29vbYuHFjTJo0qRrLAwAAMAhVJZCOHz8+Dj/88HjggQciIuKBBx6Iww8/3PtHAQAA6FHVTtm99tpr4+qrr47bb789xowZEwsWLKjW0gAAAAxCVQukb3jDG+L73/9+tZYDAABgkKvKKbsAAADQWwIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACRRtc8hBQCAfaVY7IgPzp1QUR0wcAikAADkXnPz9r22NTY2RFNTS4JpgGpxyi4AAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkERd6gF2aS8Uo/FjZ1dUBwAAwMCXm0Da3LIzOjpaS7Y1NjZEU1NLookAAADYl5yyCwAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQRF3qASAioq2wM/7qow9UVAcAAKTVXmiLiZfOq6ju1Qik5MKWrYWIKJRsa2xsiKamljQDAQAAPdq89eW9tvX093ttbU2P6zhlFwAAgCQEUgAAAJIQSAEAAEhCIAUAACAJgRQAAIAkBFIAAACSEEgBAABIQiAFAAAgCYEUAACAJARSAAAAkhBIAQAASEIgBQAAIIm61AMAAEC1FYsdcfLpEyquBdIQSAEAGHSam7d3u72xsSGamlr6eRqgJ07ZBQAAIAmBFAAAgCQEUgAAALoNGv8AACAASURBVJIQSAEAAEjCRY0ASKa1WIwVcz5ZUR0AMPgIpAAk09LcGi3RWrLNFTABYOhwyi4AAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJ1PV1geuuuy7WrFkTw4cPj1GjRsXnP//5eNvb3laN2QAAABjE+nyE9Ljjjov7778/7rvvvrj44ovjb//2b6sxFwAAAINcn4+QHn/88V3/feSRR8aGDRuio6MjamudDQwAAEDP+hxId3f33XfHe97znkxhdPz40d1ub2xs6OtYmdfpj568zpWlZ1/sI9Xjn9f7OEtPXufqr548/IwN9texLD15eFyq1ZOH176BdH/ti548zFDNnlT7HSrPl6w9qfY7UB+XVD15nStLT17nKtfT2/XKBtLZs2fH+vXru/3eY489FsOGDYuIiBUrVsT9998fd999d68G2GXTpm3R0dFZsq2xsSGamlp67OnNjd21Tm97enuH9rYn61z91dNfc3Wn2o9/Xu/jLD15nStLT389x7qzL15j+mMfHpd83pb+uv29rR9MP2Pd6e39lZeewfS4DKTnS7kej4vbsq/mytKT97/hutPT86u2tqbHA5BlA+nSpUvLDvTDH/4wvvrVr8Zdd90VEyZMKFsPAAAAfT5ld9WqVfGlL30pFi1aFAcffHA1ZgIABpjWYlvcN++kiuoAYJc+B9LPfvazUV9fH5/4xCe6tt11110xbty4vi4NAAwQLc0vx54naWU5nZKhoVjsiI/MaayoDhjc+hxIf/azn1VjDgAAhojm5u17bfMPGDA0+WwWAAAAkhBIAQAASEIgBQAAIAmBFAAAgCQEUgAAAJIQSAEAAEhCIAUAACAJgRQAAIAkBFIAAACSEEgBAABIQiAFAAAgCYEUAACAJARSAAAAkhBIAQAASEIgBQAAIAmBFAAAgCQEUgAAAJIQSAEAAEhCIAUAACAJgRQAAIAkBFIAAACSqEs9AORZsbAzTjn/BxXVAQAAvSOQwqto3lqIiELJtsbGhmhqakkzEAAADCJO2QUAACAJgRQAAIAkBFIAAACSEEgBAABIQiAFAAAgCYEUAACAJARSAAAAkhBIAQAASKIu9QAAAACk1V5oi4nzT6morpoEUgAAgCFu89aX99rW2NgQTU0t+3S/AilAD3YWd8Y35zxYUR0AAL0nkMIQUSi2xoUffqiiOv7sT82FiCiUbOuPfykEABgqBFIYIrY2FyOiWLJNuAIAICWBFAagYrE1PnLuwxXVAQBAXgmkMAA1O9oJAMAg4HNIAQAASEIgBQAAIAmBFAAAgCQEUgAAAJJwUSOgR4Via1x6ts8uBQBg3xBIgR757FIAAPYlp+wCAACQhCOkAAAAg0h7oS0mXvaBiupSE0gBAAAGkc1bX95rW17fduWUXQAAAJJwhBSAQa21WIwVcy+quBaGskKxPT47e1LFtQB9JZACMKi1NLdGS5R+NNG+OG2ptViMB+Z+uKI6yKutzTu63Z7XU/2AgU8gBYAq6K/gO1i0Ftti+bz3VVwLwOAkkAIA/a6l+eXYM6oL8ABDj4saAQAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEq+wCVVUotsYnz3qoojoAAIY2gRSoqq3NxYgolmzzUQ4AAHTHKbsAAAAk4QgpAOyhtViMB+aeX1EdAJCdQAoAe2hpbo2WKH2fs1PPAaD6nLILAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJVC2QPv7443H44YfHd77znWotCQAAwCBWV41Ftm3bFjfffHMcd9xx1VgOAAAYhNoL7XHgp6dUXMvgV5VA+uUvfzkuuOCC+MlPflKN5QAAgEFo89Yd3W5vbGyIpqaWfp6GPOjzKbuPPPJItLS0xPvf//5qzAMAAMAQUfYI6ezZs2P9+vXdfu/BBx+Mr3zlK7Fo0aI+DzJ+/Ohutzc2NvR57azr9EdPXufK0rMv9pHq8c/rXOV68vqzkbWnGuvsi8eyP54b1Vonrz15eI7l9b7J0pPnn7E8/C4ZaD2p9tsfz8s8vCZn7Um137y+hgzUn7GB1JOX+3hfz102kC5durTH761duzaamprigx/8YEREbNmyJVatWhXNzc1x2WWX9WqQTZu2RUdHZ8m2cofue3Njd63T257e3qG97ck6V3/19Ndc3an245/XubL29HauvPb013Ost3NVqycvPy95fe3rzr64z3q7j4HUk5efsSyz9bV+IPfk9bnfk2rflt7uo7968vq4DLa/R7vjcaneXD1J+TuptramxwOQfXoP6bRp02LNmjVdX1999dXx1re+Nc4+++y+LAsAAMAQUJWLGkEKxcLOOOHCFRXVAQAwdLQX2uPAT72tojrSqmog/fKXv1zN5eBVNW8tREShZFuWUxEAABhcuruar78T86nPV9kFAACALARSAAAAkhBIAQAASEIgBQAAIAlX2QWAQay12Bb3z5tXUR0A9DeBFAAGsZbml2PPa0q60iQAeeGUXQAAAJIQSAEAAEjCKbsACbUWd8YPTv2niuoAgKGnvdAWEz9+QkV1A5FACpBQS3MhWqJQss37+wCAXTZvfXmvbYPpbwWBFICqaC0WY8XsqyqqAwCIEEgBqJKW5tZoidaSbYPpX3ABgOpzUSMAAACScIQUACjRWmyL++edWlEdAPSFQAoAlGhpfjn2PNHa6dfV1Vpsj3vmHlZRHeRZe6E9DrpyUkV10B2BFACgn7U07xD6GRQ2b92x1zY/y/SG95ACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACRRl3oAAAAGrkKxI+bPPqCiOoA9CaQAAGS2tXn7XtsaGxuiqaklwTTAQOOUXQAAAJIQSAEAAEhCIAUAACAJgRQAAIAkBFIAAACSEEgBAABIwse+ADCgtBaLsWLO/IrqAIB8E0gBGFBamlujJVpLtvnMQwAYmARSyIFisTXOPPehiuoAAGCwEEghB5qbixFRenqhIz4AAAx2LmoEAABAEo6QAgAMAK3F9rh7zpSK6oB8ai+0xQGfOK6iuqFCIAUAGABamnfEnm/k8PYOGFg2b315r21D/XnslF0AAACScISUIaNY2Bnvv2BlRXUAAMC+J5AyZDRvLUREoWTbUD9FgoGptViIH5x2S0V1AAB5JpACDDAtzTujJUqP5PvHFQBgIBJIAdhLa7EQK2f/z4prAQCyEEjLaC8U44CPXVVxLcBg4CgsANAfBNIyNm9tjYjWvbb7wwwAAKBvBFKAIaC1WIiVp/3viuoAAPqLQAowBDgFFwDIo9rUAwAAADA0OUIKAAARUSx2xP84c0JFdUB1CKQAABARzc3b99rm7Q2wbzllFwAAgCQEUgAAAJJwyi6QVKHYGp8546GKa3f9/7Wnl+/ZVQ8AQD4JpEBSW5uLEVEs2Vbu/TpZegAAyB+n7AIAAJCEQAoAAEASTtkFAACirdARb/jEgRXVQbUM6EDaXihG4yUXVFQHAAD0bMtWn8NK/xvQgXTz1taIKL2KpicNqRULO2PeeQ9WVAcAAEPZgA6kkEfNWwsRUSjZ5h9KAABgb1UJpN/+9rfj7rvvjvr6+qitrY3ly5dXY1kAAAAGsT4H0ocffjgefPDBWLx4cYwePTpeeumlaswFAADAINfnj3351re+FZdddlmMHj06IiImTJjQ56EAAAAY/PocSJ999tn41a9+FWeccUbMmTMn7rnnnmrMBQAAwCBX9pTd2bNnx/r167v93mOPPRbt7e3xwgsvxHe/+93YsmVLnHnmmfG6170upk+f3qtBxo8f3e32xsaGXq2TtSfLOtXYT3/dvv7o2Rf7GKhzp+rJ61xZevI6V5aevM6VpSevc2XpyetcWXryOleWnrzO1V89g+nvnrzex1l6+us+TtWTh7/Hsvb0do28PpZ5vo/39fOlbCBdunTpq35/8uTJMWvWrKitrY3x48fHscceG0888USvA+mmTduio6OzZFuWK5OW6+nNHVRunZ6+n2Ufee3pr7m6sy8e/xT76K+evM6VpSevc2XpyetcWXryOleWnrzOlaUnr3Nl6cnrXP3VM1D/7qlGfZ579sV9vC//HsvSk/rvsXI9/XVb+uNxyTLXQOrpqb62tqbHA5B9PmV31qxZsXr16oiI2LFjR6xbty4OO+ywvi4LAADAINfnq+yee+658YUvfCFOOumkiIg49dRT453vfGefBwMAoG92FtvjptkHV1QHkEKfA+nIkSPjpptuqsYs/aK9UIzGS+ZXVAcAMJD9qXnHXtuynLYHsK/0OZAONJu3tkZEa8k2L8wAAGTRVuyI485urKgO2NuQC6RDXVthZxw2f3lFdQAAvLotzdv32uZgB1ROIB1itmwtREShZJsXTQAAIAWBFAAAoJfaC+1xwOXHVFxL9wRSAACAXtq8de+LhkU4+7C3+vw5pAAAAJCFQAoAAEASAikAAABJCKQAAAAkIZACAACQhKvsAgBAP2ordsQx506sqA4GO4EUAAD60Zbm7Xtt81EhDFUCKQAADDJthY548yUHVFQHKQmkAAAwyGzZ6igsA4OLGgEAAJCEQAoAAEASAikAAABJCKQAAAAk4aJGvKq2ws448mP3VVQHAADQGwIpr2rL1kJEFEq2uUIbAABQDQIpAACQW+2F9jjwikMrqmPgEUgBAIDc2rx1x17bnLE3eLioEQAAAEk4QpoT7YVCHDR/YUV1AAAAg4FAug+0Fwox6dLrK6rbZfPWnRFReqVapyIAAACDmUC6DwiXAAAA5QmkVF1bYWccffH9FdUBAABDl0BK1fnsUgAAoBICKQAAMOS1F9rjgE8eVVEd1SOQAgAAQ57PO03D55ACAACQhCOkA1h7YWdM+cSyiuoAAADyRiAdwDa7eBAAADCAOWUXAACAJARSAAAAkhBIAQAASEIgBQAAIAmBFAAAgCQEUgAAAJIQSAEAAEjC55ACAECOtRU6YuqFEyuuhYFEIAUAgBzbsnV7t9sbGxuiqamln6eB6nLKLgAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkIZACAACQhEAKAABAEgIpAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJBEXeoBdqmtrenV9ixrpe7J61xZevI6V5aevM6VpSevc2XpyetcWXryOleWnrzOlaUnr3Nl6cnrXFl68jpXf/Xkda4sPXmdK0tPXufK0pPXubL05HWuLD15nStLT3f1r7ZGTWdnZ2evpwIAAIA+csouAAAASQikAAAAJCGQAgAAkIRACgAAQBICKQAAAEkIpAAAACQhkAIAAJCEQAoAAEASAikAAABJCKQAAAAkMezaa6+9NvUQu9uyZUv87ne/i5deeinq6upiv/326/Uazz77bOy///7dfm/9+vXxzDPPxPjx42PYsGFd2x999NF4zWtek3nurPN0Z+vWrfHkk0/GiBEjYtSoUftkpn1p586dsWrVqli9enU8+eSTsX379jjkkEPK9q1fvz6+//3vx8qVK2P16tXxn//5nzFx4sQYM2ZMP0xdXltbWzz11FMxcuTIGDFiRMV9vX38e+sPf/hDPP7441FbWxvjxo3rtmbVqlVx8MEHl/zMl9PR0REPPfRQtLS0xKRJk+Lhhx+O7373u/HCCy/Em9/85qipqem278UXX4zFixfHihUrYs2aNbFhw4Z4wxveEHV1dd3WV/Nx35fP4ywuvvjiOPnkk1OPkcmvf/3raG9vj4aGhnjiiSdixYoVsW3btpgyZUrq0QaMPLz2Z3nuZ9Xb536etbS0RGtra4wcOTK2bt0aq1evjpqamh5fY7tz++23x/Tp06s20+bNm2PYsGFdj+Xy5ctj8eLF8eKLL8Zb3vKWqu2nO1u2bHnVv8ey/t6vlld77S8UCvHSSy/F6NGjS7bv+ltwT08//XRs3rw5xo8fH7/73e9i2bJlsWPHjl7dnmuuuSaOP/74iuuzPPe3b98ezzzzTIwaNSr+f/a+PK6m/P//WWSrhjEf21jGYEi2zDQKiSxJe6EGodKClCE7CaGSfY2QtTGMylbMjMa+JINsoUTWtKFbaX39/uh3z/fe7jn33nO67vSZT8/H4z7onNfrvF/v/fV+v1/v16tevXpKp/VvQ0FBAWf++dZ9VQjV++TJVJOhLr2PDRpERKrKSHWQkZGBgIAAPHjwAM2bNwcAvHv3Dvr6+li6dCnat2+v9LcGDRqEc+fOyTw/fvw4Vq5ciWbNmkEkEmHt2rXo3bs3AMDBwQExMTEyPK9fv0ZwcDA0NTWxaNEibN26FceOHUOXLl0QFhaGNm3aSNEXFRXJfMPKygpxcXEgItYBPSgoCAEBAQCA27dvY+rUqWjZsiVev36NsLAwDBgwQIbn0aNHaNOmDbS1tVFaWoqIiAgkJydDT08PkydPRoMGDWR4QkNDYWNjA319ffaCq4KsrCxs27YNLVu2hLu7O4KDg5GYmIjvvvsO8+bNY+pJEleuXMH8+fPRuHFjpKenw9DQEO/evUP9+vWxefNmfP3116xpHTlyBJs3b8bQoUPRqlUrAMCbN29w9uxZ+Pj4YPTo0UrJDAAeHh7YuXOn1LO8vDysXr0ab968wZAhQzBu3Djmna+vLzZt2iTznatXr2LGjBnQ1NTEhg0bsGrVKohEIuTm5mLDhg0wNjaW4RFS/x8+fEDjxo2Zv3/77Tf8/fff6Nq1K1xcXGQGgMmTJ2PlypVo2rQpzp49i8DAQOjr6+PRo0eYOXMm7OzsZNLo2rUrGjduDBsbG4wcORJ6enosJSeNZcuW4d69eygrK4OJiQkSExMxZMgQXL16FR06dMCiRYtkeI4fP45169ZBT08Pt27dQr9+/SASifDkyROEh4ejS5cuUvSqrHeAu+8DwM2bN/H69WsYGxujWbNmzPOYmBg4ODjI0PPt+9OnT5f5xoULF2BqagoA2LBhg0L5r169ytT94MGDWWkuXryInj17onHjxvj48SNCQkJw9+5d6OnpYf78+awLoAMHDsDS0lLpxdHmzZsRHR0NDQ0NTJo0Cfv27YOxsTFu3rwJS0tLTJkyhZUvOTkZx48fx+vXr1G3bl107NgRY8eOlSrvqkhKSkJ8fDzevHkDAGjVqhVGjBgBQ0NDpWSVREBAAIKCgqSeCen7QOVCTlNTEwMHDkRSUhJOnz6NLl26cLZJdYz9QsZ9IX0/LS0NoaGhaNmyJfz9/TF37lxcv34dnTt3xsqVK9GxY0cZHr59H6hcUFWtewsLC9jZ2XEqPlxgq3ugcsMuICAAb968weDBg/Hzzz8ziqWzszN+/fVXGZ64uDgEBARAU1MTy5Ytw7Zt29C8eXOkpKRg0aJFsLCwkOE5ePCgzLNNmzbB19cXAKTaHRuU6fu2traIioqCjo4Otm3bhgsXLjBjcufOnTF37lwZHj8/P9jY2MDMzExp5TApKQmBgYFo2bIllixZgqlTp+LFixfQ0dHBpk2bGL1JDCHzfnFxMXbu3In4+Hi8ffsWwP/V/6RJk1jbsjxwjf2XLl3CjBkzAABt27bFunXrmE01Nr1v//79iIyMRFlZGSZNmoRjx46hR48euH79OsaPH89aj6tWrZJ5duTIEWasmDNnjsx7IXrf4sWL8fPPP6Np06a4efMmfH198eWXXyI3NxdhYWEwMTGRond0dIStrS1sbW2VHvuF6H1AZZ85ceIEXr9+jTp16qBTp05wd3fnHG9UWf+qqntAmN7HhiFDhuDs2bOs7/jqfICwsd/IyIgZ97t27aqU3OrQ+zhBNQTOzs507NgxKi8vZ56Vl5dTbGwsOTk5ydAfOHCA89enTx/WNGxtbent27dERHTt2jUaNGgQXbx4kYiI7OzsWHk8PDxo7969tGXLFrK2tqbw8HDKysqiffv20ZQpU2Tou3TpQnp6etSlSxeZn56eHmsa9vb2zP/d3d3p8uXLRET04MEDGjVqFCuPtbU1FRcXExFRSEgI+fr6UlxcHC1YsIDmzZvHyvP9999Tv379yM7Ojvbu3Ut5eXmsdJJ5Dw4OpkWLFpGLiwsFBQXRnTt3aOPGjeTt7c3KY2trS8+ePSMiouTkZPL39ycioqNHj5KnpydnWubm5pSTkyPzPCcnh4YNGybzvLCwkPNnamoqQ+/r60uhoaF05swZcnV1JR8fHyotLSUi7rofNWoUPXz4kBITE6lPnz507do1Jl/Ozs6sPNWt/507d5KTkxPt37+f3NzcaPXq1TL0NjY2zP+dnZ3p+fPnRESUnZ0t9U4SdnZ29PDhQwoKCiIjIyNycHCgAwcO0MePH1npiYgsLS2prKyMRCIR9e7dm/Lz84mIqLi4mKysrDh5xPWYkZFBkydPJiKiK1eu0NixY2Xo+dY7EVFoaCjrLyQkhL7//ntWnt27d9OwYcPI29ub+vbtS2fOnGHeSZa/JPj2/X79+tH8+fMpOjqaoqOj6ejRo2RkZMT8zQbJsS0mJoaGDh1KISEhZG1tTbt372blsbKyYsbJhQsX0ooVK+jOnTu0efNmmjp1KitPjx49yMDAgKZMmUJnz56VGmfZYGlpSYWFhZSdnU0GBgb07t07IiLKz8/nrPtdu3aRra0tBQUF0fDhw2nx4sW0ZMkSMjExoevXr7PybNmyhWxsbGjXrl0UFxdHcXFxtGvXLrKxsaHNmzfLlZENAwcOlHkmpO+vW7eORo0aRfb29hQSEkIuLi60fft2cnFxoY0bN7LyqGPsFzLuC+n7Y8eOpX379jFtf+fOnZSdnU2//fYbubi4sPLw7ftBQUHk7u5Op0+fpjt37tCdO3fo9OnT5O7uTkuXLuWUjQtsdU9UWa4HDhyge/fu0bx588jZ2ZnJO1f929vbU2ZmJj19+pQMDAzo8ePHTL4cHR1Zebp27Ure3t40b9485mdgYMD8vyqE9H1ra2vm/w4ODiQSiYiIqKSkROqdJIyMjMje3p769u1LK1eupEePHrHSSWLkyJF09uxZiomJoYEDB1JcXBwREV29epVGjx4tQy9k3p8xYwYtXLiQ7t69Szk5OZSTk0N3796lhQsX0vTp01l5hIz9jo6O9PDhQyIiio6OJjMzM+Zvtvq3sbGhgoICysrKop49e9KbN2+IqHJO4movvXr1In9/f9q0aRPzMzQ0ZP7PBiF6n+T8Pn78eLpz5w4RET19+pQcHBxk6E1MTGjq1KnUq1cv8vHxob/++kvh2C9E7wsNDSUPDw+KjIykcePGUWhoKEVERJCZmRnFx8ez8vCt/3PnznH+jI2NWdPgW/dEwvQ+Y2NjmV/Xrl2Z/1cFX52PSNjYb2ZmRitWrCBjY2Oyt7en/fv30/v371lpxVCH3seFGrMgHT58OK93+vr6NHfuXKnBX3ISYENVZf3JkydkZmZGCQkJnEqpra0t8//+/fvL/R4R0bx582jBggVMJRJVNgp5kExbMj22v8WQbBgODg6MglVRUSF3UVJaWkpnzpwhb29vMjAwID8/P7pw4QJVVFTI0Iu/U15eTv369WN9x8XDljd5dTx06FDW5xUVFazv2JQ/8d9syp+kXBUVFbRkyRJyd3enT58+cQ5Mks+rysDFI6T+Jb/l6OjIdOzCwkLWAcDc3JyZVKoqB1xKiWQ9lJSU0KlTp2jSpElkYGBAM2fOZOURl1lFRYXg+pfM24gRI2To+dY7EVH37t1p/fr1UpO/+PfDDz+w8lhbWzN1kpqaSsOHD6ejR4/KyCgJvn0/JyeH/Pz8KCgoiAoLC4mIX907OTnRixcviIgoLy+Psy4tLS2Z/1cdt7jGCzs7O8rJyaHdu3eTtbU19e/fn0JDQyk1NVWhXAMGDOB8J4kRI0Yw+c7JySE3NzciInr48CGrskRENGzYMPr06ZPM86KiIs76Z5v8jY2NycjIiPT19WXohfR9a2trKisro/z8fOrVqxezeVdQUMBZL+oY+4WM+0L6vmTaVTf4uMqMb9/n2nAqLy/nfMe37tnk3bFjB9nb21Nubi7nvC/53MLCQu73xLh27RqNHj1aarNLXv0L6fvW1tbM/DBu3Dim/onYy1gynXv37tGyZcuoT58+NHLkSIqKipJqq1yyVc0D1yJOEsrM++bm5qzP5b0TMvZX7UfXr1+nQYMG0Z07d1jrXzJ/VedfrvaSlpZGLi4utHv3bkaX+hx6n2S5VN0YYWsz4rxkZ2fTrl27yMrKikxMTCgsLIyePn3KmoYQvc/CwoLRSQoKCphNq1evXnG2Zb71r6enR+PHjycXFxeZX48ePVi/w7fuiYTpfRMnTqSFCxfS8+fP6eXLl/TixQsyNTWlly9f0suXL+WmoYzOR1S9sb+kpITi4+PJ09OTDAwM6Oeff6ZLly6x8qhD7+NCjbnY0aRJE5w8eRJWVlbMcTUR4cSJE6x3yTp27AhPT09W06ErV65wpvPx40fme506dcLu3bvh4eGBDx8+sNJLHp1XNXVlO1YPDg7GX3/9BVdXV/j5+cHU1FSh6VFmZiZWrVoFIsKHDx9QXl7O3BGpqKhg5alfvz6eP3+Ob775Brq6uiguLkbdunVRVlaG8vJyzrzUrVsX5ubmMDc3R1ZWFmJiYrBixQoUFRXhJALB7gAAIABJREFU/PnzUvTl5eUgInz69AmFhYUoKCiAtrY2ysrKUFZWxprGl19+iRMnTsDExAQnT55kzDCByvrkgomJCTw8PODk5MSY97x+/RqHDx9G//79ZeibNWuGY8eOsZqhDBw4UOZZaWmpVDkEBgYiNDQUXl5eKC4uZpVJsuyr3gPkKmMh9S/5XkNDg8lTw4YNWU2sRowYAX9/f/j7+2Po0KHYsWMHbG1tceHCBbRu3Zo1Dcmy19LSgqWlJSwtLfH27VvExsay8rRq1QqrVq1CQUEBOnbsiJUrV8LGxgYXL17Ef/7zH1aeNm3aYNu2bRgwYABOnTqF7777DkBlebGVGd96B4DOnTtj+PDhrKZAR44cYeUBwNwh6dixI/bt2wd3d3eUlJRw1g/fvt+0aVNs2LABx48fh4uLC2bPns2r7ktLSxkz4CZNmnCa13355ZdITk5Gz5490axZM+Tk5OCrr75CQUEB53ghbldubm5wc3NDcnIyjh49ip9++gkdO3bEoUOHpOh1dXVx8OBBiEQiNGnSBLt374a9vT0uXLjAaUpVp04dxiz1iy++QE5ODgBAT08PJSUlrDxExFpGGhoanOMFEWHPnj3Q1dWVeT5mzBgZeiF9v27duqhTpw50dHTQrl07NGnSBADQqFEjzruY6hj7hYz7Qvp+WVkZiouLUVBQgI8fPzJtrKioiLPM+PZ9AHj//j1TtmJ8+PBBZXUPQEZeT09PNGjQABMmTGA1sxbLLMbEiRM530nCyMgIkZGRCAkJQXx8PAICAuTWv5C+P2XKFEyYMAHu7u4wNDSEn58fhg8fjsuXLzNXA7jS6datG7p164a5c+fijz/+QHR0NFatWoVbt26x5j83NxcikQgfPnxg2lxubi5rXxYy72tqauLFixcy9zIzMjI4y03I2F9eXo7i4mLGTLtPnz5Yu3Ytpk+fztqWJfvdzJkzpd5JjiWS6NChA/bu3YsdO3ZgwoQJWLJkyWfR+/r27YuQkBBMnz4dRkZGiIuLg6WlJS5fvizTj4D/q/uvvvoK7u7ucHd3x+3bt3H06FE4OTnhxo0bMjxC9D7J9qqhoYH8/HwA4LyiBfCv/2+++QYrVqxgvcfLpvOJ88Kn7gFhet+ePXtw4MABzJs3D4GBgejSpQvq1q3LqY/x1fkAYWO/GFpaWrCwsICFhQUyMzMRExODoKAgnD59WoZWHXofF2rMgjQkJASBgYFYtmwZWrRoAaCyw+rp6SEkJESG3sPDg3OgY7PXB4Dx48fj0aNHUk4G2rdvj8jISKxevZqVp0GDBhCJRNDR0cGOHTuY53l5eZyKiZmZGQwMDBAUFIS4uDiFFTJ27Fjm/6NGjcL79+/x1VdfyXVUMGvWLLi5ucHBwQF6enpwc3PDoEGDcO3aNdjb27PyVC2vZs2awcvLC15eXvj7779l6Pv164cxY8agpKQETk5O+Pnnn2FsbIyrV6/CwMCANY0lS5Zg/vz5WLx4Mbp3747g4GAAlc4YPDw8OMsgICAAx48fx9GjR/H69WsAlYOZlZUV651IIyMjPHnyBEZGRjLvevbsKfOsbdu2uHHjhlTdz507F2vXrkVERASrTIaGhkzd+/n5Mc+fPn0qZf9fFXzr//Hjx+jbty+ICAUFBcjNzUXTpk05B5rp06djz549GDt2LN6/f4+SkhJs374dVlZWTHlXBZcNf8uWLTF58mTWd8HBwQgPD0eDBg2wadMmnD59GgsWLECbNm2wdOlSVp5ly5YhODgYp06dQvfu3TF//nwAlQ5CFi5cKEPPt96BSiVBW1ub9d3atWtZn2tpaSErK4u5y9i8eXPs3bsX7u7ueP78OSuPkL4PVN7zMjIywuLFiyESiTjpACA9PR2jRo0CESEjI4NJD+BWfhYuXAhfX18YGhqiWbNmcHJygrGxMZKTkzn7WNW+37NnT/Ts2RPz58/HH3/8IUMfFBSEsLAwaGpqIjw8HL/++iuGDBmCtm3bcrYxfX19BAQEwMTEBGfOnMEPP/wAoHJBwJUXe3t7jB49Gvb29lIbErGxsZzjWPfu3ZGXl8eqlIrnDkkI6fsVFRXMYnnlypXMcyLiVMqAzz/2Cxn3hfR9GxsbjBgxAmVlZfD19YWfnx+6dOmCmzdvYsiQIaw8fPu+h4cH7OzsMGzYMKbuX716hbNnz2Lq1KmsafCtewD47rvv8Ndff0k5mBk/fjy0tLQ4xzFLS0umL/7000/M87S0NNZNcDG0tbURFBSE8+fPw83NDZ8+feKkFdL3LS0t0bZtW+zduxdpaWkoLy9HfHw8rK2tYWVlxcpTte/Xq1cPVlZWsLKyYu7uVcXEiRMxbNgwAMDSpUsxd+5cNG7cGPfv32cdY4TM+7Nnz8aYMWPQvXt3RnF/9eoV7t27h2XLlrHyCBn7LS0tkZSUJLXB2bt3b2zYsIE1HVdXV2YRJnmXNy0tjXOTFKhcYE2ePBmDBg3C/PnzUVhYyEkLCNP7FixYgFWrVsHU1JTZKJwzZw6MjIykxikx2HRkAwMDGBgYsN4FBITpfX379oWXlxf69euHhIQEpq+JRCLOMZBv/Ts5OeHDhw+sC9IJEyawpsG37gHhep+LiwtMTEwQEBCAPn36yD2A4avzAarR+YHKcXLy5MlK633x8fEq1/u4UGOcGomRm5sr5eDgc3onVQZcO/i5ubnIzs5G586d5fLHx8cjMTERgYGBKpctMzMTUVFRzMT09ddfw9raWsbhgBj79+/H+PHjlf4+EeHs2bPQ0NDA4MGDcf/+fcTExKBNmzYYN27cf5UHsffv30NDQ4N1QElNTUWnTp14fY+rXVSFMvX/6tUrqb+bN28OLS0t5Obm4ubNm4xiwAbxgC9voKwFcPbsWTRr1kxmsyIvLw8RERGsm1jV7fvKIDExUervbt26QVtbG1lZWfj99985HaEUFRXh5MmTSE1NZfr+iBEjpE4mJLFmzRr4+/tXW155KCwsxPbt25GSkoJu3brBy8uLWdS/fPmS07nFjRs3EB8fL7UhYWFhgT59+rDSl5SUSHkaVQQhff/ixYswNDSUcUT07NkznD17FpMmTVKYblxcHG7cuKHysZ/vuC8UKSkpACpPuF+/fo3Tp0+jTZs2MDc3V1kaL1++xJkzZ6TmfHNzc05vpnzrHvg/pYytL4sXHp8D+fn5ePz4MbMxUxVC+z5fnDlzBsOHD+fN9/79exARvvzyS4hEIly+fBlt2rRRqTffwsJCXLhwQar+BwwY8NnqRF0oKytDVlYW53hcXRQWFiIjIwMVFRVo1aoVp+fnW7du8R4Xqup99+7dQ2xsrFy9r6KiAr/99hsz9js6OkJDQwMlJSXIz8/n9Gb731b/yuh9RISdO3fi5s2bCA8PZ6WpqvM1a9YM9erVU6jz8R37X716xXlKWyOhtHFvLWrxD4HL1v2fhNiZRE2DELmElK8qeV69ekU3b95kLuwrk4YQHnUgKSmJjh8/zjgBEoPLqVFNRnFxMeMEThJiBy//zVDk2EGdePToEVOm6enpFBkZyTg4+W9KQxXpCBm/uO5By8OWLVt48wQEBHx2HiH59/Ly4s0jpMz4thch5cUXaWlpFBMTwziq+Rw86khDKM//MjIyMujMmTOcd2GJKn0ZSOoIsbGxFBQURIcPH1ZpOv8tEIlEdO/ePc6740TcZXbkyBHePHzKmagGOTWqRS24wOU9kQuTJk3iRc916V4e+MpExF8uIqJFixbxohci1z/Jc+zYMTIyMiJra2saNGgQ/f3338w7LqcDQnjEfNu2bZOZ8MPDw1npc3NzacGCBeTm5kYHDhyQejdt2jQZeiGefIXIJZSHz2L54sWLZGhoSD/88AM5ODgwHjQV5UXIgjwhIYHOnTtHREQ3btxQOJF9/PiRQkJCKDQ0lEQiEUVERJCNjQ35+/uzeg4XO1UaOXIkpaamkqenJ/Xs2ZNMTU3pwYMHKpPr1atXNG3aNPLz86N3797RkiVL6Pvvv6effvqJcVhTFfv27SMzMzMaMGAA7dmzhxwcHGjx4sU0fPhwmTYnVC4hafAtY6HpVMXgwYPlvmfzqm5mZkZFRUWMQ62qYPPEb2RkxPyfDWyeXA0NDZn/q4qHb/79/PxkfmLnhH5+fqw8QsrsyZMnMj9TU1NKTU2lJ0+eqCTvkhtbJSUltH79epowYQIFBwdzyiU57p47d4769+9Pvr6+ZGpqSrGxsSrhUUcaQnkkx9G3b9/SmDFjqFu3buTg4EDp6eky9JIbtB8/fqRZs2bRkCFDaNq0aZSVlcWaRtXNuiNHjtD8+fNp//79rM4v5fHs27ePk+e3335jnPm8ffuWJkyYQL1796YxY8YwkQMk4e3tzdD/+eef1L9/f/L09JRbXjY2Nszia+vWrfTTTz9RREQEubu7U0hICCuPkHQk8/LmzRuFeeFLT0SUkpIi5VV7y5Yt5O3tTevWraOioiJWnoCAACadpKQk6tu3L1laWpKxsTETYUQVZSaEhw015g5pLf63wRbHC6g0fxBfkJcElzMKoDLgcVWkpqZy0ufl5bE+r+rkSRJcF+L5yqUIFy9eVIlcfMtXXTy7du3CsWPH0KJFC1y/fh0zZ85EUFAQTExMOO9gCOFZtWoVbt++DX19fXh6emLSpElwdXUFAJw+fRre3t4yPIGBgWjTpg0GDhyIX375BVevXsX69etRt25dvHjxQoY+Ojoa0dHR0NHRQVpaGnx8fCASieDo6KhSucLCwnDr1i1ePJGRkfjll1/QoUMHBAcHY8mSJYzp5b59+2TisK5btw779++Hnp4eYmJi4Obmhq1bt0JPT48zL3zTAID169fj8uXLKCsrw7Vr13Dv3j0MGDAAx48fx9u3b5kYjpIICAhAixYtUFhYiClTpqBjx44ICgrCmTNnsHLlSpk2uHz5cvj4+CA/Px8eHh6YMWMGduzYgYSEBISGhmLPnj0qkSswMBADBgyASCSCu7s7rK2tcebMGcTHx2PlypXYunWrDM+RI0dw8uRJFBYWYsiQIThz5gxatmyJ3NxcuLu7y5htCpGLbxpCylhIOn379pX5xocPH5jnV69elXnfu3dvVodXBgYG0NDQwMOHD2V4VqxYAVNTUymzxuLiYty7d0+GVoyoqCgMHTpUJv55o0aNVMZjbGwsY/6nKP9JSUkYOHAgcx+aiHD9+nUMGjSIUy4hZWZtbY3WrVtL8WRnZ8PT0xMaGhoy8RWFlNecOXOYOJCbNm1CamoqXF1dmTbGFVNWjJ07dyIiIgJdu3bFq1ev4OPjw+p3gC+POtIQyiM5jq5ZswYDBgxAREQETp48iRUrVsjciV+9ejVzf3LdunXQ1tbG1q1bcerUKSxfvhzr16+XScPV1ZWpl127duH333+HjY0NEhISkJmZyXr1Qx7Pu3fvWHkiIyMxcuRIAJX3Fs3MzLBu3TpcuHABixcvlhmXX79+zVzhi4iIQFRUFNq1a4ecnBy4ubmxlhcRMfey//jjD+zfvx/a2tqYOHEiHB0dWeP2CklHMi8hISEK88KXHqi8Q3r06FEAlXX/+vVr2NnZ4dKlS1i6dCmrb4fbt28zedmwYQPCw8PRs2dPpKenw9/fXyZurdAyE8LDhtoFaS1qBPbv3w8PDw/Wu0FsNvtsk6z4bzZ6tglWjPfv37PKNHnyZPz444+sPAUFBaw8fOUC2BUzgHsRJ0QuvuWrLh4iYpyRGBkZISIiAl5eXnI9VArhuXDhAmJiYqClpYUpU6Zg6tSpEIlEmDZtGucC69mzZ9i4cSMAYNiwYVi2bBm8vb1ZFxZi8PXkK0Su8+fP8+bhu1guKytj7nw6ODigdevWmDJlCjZs2MCZFyEL8rNnzyI2NhZFRUUwMTHBuXPn0KRJE7i4uMDZ2Zl1gZWWlob169ejvLwc/fr1Q2RkJOrUqYOePXvC1tZWhr6goIBxxLNhwwaGZvDgwUz9qkKud+/eMc41oqKimI2B8ePHc3oA1dTURKNGjdCoUSO0bdsWLVu2BFDpsZmtnIXIxTcNgH8ZC0mnS5cuaNOmDby8vFCnTh0QEcaNG4eoqCjW7wOVbVFTUxPz589n+trgwYORkJDAyRMZGYk1a9bA0dGR2SC5fv06p3MuoLItBwYGolu3bnB1dYWGhgaio6Mxbdo0lfHo6enxzv+JEyewdOlS3L9/H/7+/mjYsCE2b97MutkjhpAymzZtGu7cuYOlS5cyDqfk8QgpL8kx4eLFizhw4AC0tbUxYMAATictku1IJBKha9euACD3nhxfHnWkIZRHssxSUlIQGhoKDQ0NODs74+DBg3Lpb968id9++w1aWlro3LmzjAdZNp64uDhERESgadOmGDlyJEaPHs26uBTCI+kc7vnz58zi2N7ennVBVlxcjIqKCmhqaqKiogLt2rUDUOlBmGt+AcA4DGrUqBHjbVdLS4vTeZCQdPjmhS89UFnG4vu7iYmJOHz4MOrWrQsLCwtOB5CSBxQFBQWMD41vv/2W03EawL/MhPJURe2CtBY1AnzdufMN+9K6dWtERUWxemLkchkuxM04X7kA/qEMhMglxF2+unj4hmISyqOlpQWgcmLZtWsXpkyZguLiYk6lnG+4ECGefIXIJZSHz2JZiLt8vmkAwsKriN3i16lTB61atWLoNDQ0oKmpKUMvqURU9ZLJFV5BiFx8wwRVTV+ZEBNC5BISxoJvGQtJh2+oBEBYaB2+4VgAYWE8+PIIyb+Q0FJCymzatGl48OABZs6cCTs7O4wZM0Yuj5Dyov8fWoSIUKdOHcaRTd26dTlDX7x8+RLTp08HESEzMxMlJSWMks7l/ZovjzrSEMojEolw/vx5EBHKy8tlwodURUlJCdLS0pgNcfG8AYCzHwsJSSKEp127dkhISMDgwYPRrl07PHv2DO3bt0dWVhYrvZBwd0LCJAlJh29e+NIDwsK+8A0TJLTMhPCwoXZBWosaAb7u3PmGfTE3N8erV69YF6RcHs2EuBnnKxfAP5SBELmEuMtXB4+QUExCeHR0dJCRkcHsduro6CAiIgLe3t54/PgxKw/fcCE+Pj548+YNsyAFKheMe/bs4QwvIkQuITx8F8tC3OULWZALCa+iqanJLJYl42hyhVlo3bo148Z/+fLlzPO3b9/KeNGtjlxCwgTxDTEhRC4hYSz4lrHQdPiEShCDb2gdgF84FjH4hvEQwiMk/wC/0FKAsDLT19fHvn37sHHjRri6uso9UQH45/3Ro0fo3bs3054zMzPRokUL5oSKDQsWLJDKU2FhIerVq4fMzEzOcER8edSRhlCeVq1aYefOnQAqNyfEZZaTk8O68Pv06RO8vLyYdiWmF4lEnAtSISFJhPAEBgZi2rRpiIyMROPGjTF69Gh069YNb968QUBAgAy9kHB3QsIkCUmHb1740gPCwr7wDRMktMyE8LChxoV9qUUt/tcgJJRBLfjh1q1b0NXVlQnxUVJSgiNHjrDeo1N1qCBVySWER0jYG74QkoaQ8CpZWVlo2rSpTH95+/Yt0tPTOU3gq6KwsBBFRUWsIQmEyMVllq/KMEGqCEejDFRVxsqCiLBr1y4kJSVxhkpgg5CwaorCsbBBSBgPPjxC8y8EQsrs9u3bSExMhJeXl1L01Ql78vHjRzx9+pQz5mUtZFFeXo6SkhLODbaqKCoqQnZ2NuumtpAwdNUJXXflyhWkpqYyIWxMTU0V5kNd4e74psM3L3zphYb8UjZM0D+NGr0gPXnyJKytrZWmDwkJwbx583il4eLiggMHDvDiSUxM5IyRpwp6oPKkiesUSpUoLCyU63iguvSAsHqpRS1qUYta1KIWtahFLWrx7wf7mX0Nwa5du3jRX79+nXcaXE5g5EGeMwRV0ANAeno6bx4XFxfePHyDbwsJ1i2kXmpRi1rUoha1qEUtalGLWvz7UaMXpHwPb4Uc9kpe8v5c6QiRSwiPkMV1Tc1LLWpRi1rUoha1qEUtalGLfz9q9IKUy0ELF7hiIMrD4cOHefNYWFh8VnoAnK6f5UHI4rpNmzaflR4QVi9ApalzTYMyji3+CQiRS0j5qoPn5MmTvNMQwqMO7N69+58WQWWoif3x3wh1lLO66rKmtplnz57x5lHXeMkXNXXsU1fdq2O+UNecJISnpuok6oC69J7/5TIG1Dj2US1qUUNhb2/Pi37GjBm86MeNG8eLnoi/TET85SIiCg4O5kUvRK6ayqMuufiWMRH/NqMuuYTw7Nq1ixe9kLzwTYOI6MSJE7x5+OZfSN8XIpeQvs+3nIXIpa52yTcdIWmoo4zVxaOOMiYSVmbqGPtqal3W1PYihEfI2KeuOenfpPfwzYuQ8hIy9qtL7xXCU6NPSGvxvw3iaerL996tOkycAWH3gfneuxUiV03lUZdc6rhzri65hPCcOHGCF72QvPBNA+DvOwDgn38hfV+IXEL6Pt9yFiKXutol33SEpKGOMlYXjzrKGBBWZuoY+2pqXdbU9iKER8jYp6456d+k9/DNi5DyEjL2q0vvFcJTuyCtRY0FX1Nnvh1AHSbOgHo6sxC5hJiSq4OHr6m+UB4h9cK3zcyaNYt3GjV1khVS9zU1L+rwHSCU53OPe0LSUFc66irj77//njePOsY+IXmpqWOfutqYOuYLdc1JQnj4zv01eeyrqXqPOvQ+dZWxkPpXl674X2+y++zZM94827dvp9zc3M8gTfWwY8cOpZ7Vgh15eXn/tAisECLXo0ePPoMktZBETS1jIXIJ4bl48SJvHnWkcfToUd486qhLIXKpY0wSIpcQqKOMhaRRU8d9IVDXmFRTy6ymyvW/DnXNSTV1ThYCvnkRknd1jf3qQo2JQ6qM4xsdHR1MnTpV6pmVlRWKiopgZGQEY2Nj9O3bF82bN5f7neXLlyMuLg4mJiYYN24cevXqpTDtuLg4mJqaQkdHBxs2bEBycjJmzJiB7t27q4QeABwcHBATE6PwGRf4xG29evUq0tLS4OLiguzsbOTn5+Pbb7+tNn18fDwWL14MLS0tLFq0CJaWlkrJU4ta1KIWtahFLWpRi1rU4n8PNWZBamJigp9++kkuzYkTJ3DmzBmZ51lZWbhy5QquXbuGy5cvQ0dHB3FxcXK/VVhYiGPHjiEqKgpaWloYN24crK2tUb9+fVZ6GxsbnDhxAsnJyQgKCsKECRNw8OBBHDp0qNr0ly9fxqVLl3D8+HHY2dkxz0UiEZKTkxEbGys3L2Iou3jdsWMHzp8/j6ysLPz+++94+/YtZsyYgV9++aXa9BYWFti8eTM+ffqEGTNmwMHBAUOHDsXXX3+NvLw8tG3bVqm81KIWtahFLWpRi1rUoha1+Pejxtwh7d+/P6ZNmyb3Z2BgIMNHRHjz5g1ev36NV69eoUmTJjAyMlKYXqNGjeDs7AxfX1/k5uZix44dGDZsGOdCtm7dugAqF4+jR4+GjY0NiouLOb/Ph15LSwva2trQ0NBAo0aNmF+HDh2wefNmhXkRQ9m9hZMnT2LPnj1o1KgRAKBly5YQiUQqoa9Xrx46deqE7t274+DBg3j06BF8fX1x48YNLF++XOm81OJ/C2lpaUo9q0UtasEfFRUVOH/+/D8tRi1UhNrxsmZCSL3U1mUtalGJuv+0AGKEhoYKovnxxx/x3XffwdnZGWFhYWjRooXC72RnZ+PQoUOIiYlB9+7dERYWhh9//BEvXrzA+PHjWc1MNTQ0EBcXh7i4OGzduhUAUFpaypkGH/o+ffrghx9+QJMmTeDi4qJQfi4oeyG+QYMGMhebNTQ0VELfokUL3Lt3D927d0fz5s2xYcMG5p2ZmRlnGgcPHlQod6NGjeDg4CD1LCIiAp6engqfseFzmjhLIicnBy9evGDdUJHE7du3FdJIIjU1VeaZrq6uUn1AEvfv30e3bt3+UZ5Zs2bJnO6zPZNEZGQkRo0aBV1dXcyePRt3797FokWLYGJiopQ8aWlp6Nixo/IZgHJtJiQkBD4+PmjYsCEmTJiABw8eYOnSpVLWDzUdivrjuHHj1CSJLFxcXHDgwAGEhYVh9uzZ/5gcnwve3t7Yvn27Sr+pqamJ9evXY+DAgSr9riQULXirpl3devz48SMA4IsvvlCaJyMjAxkZGSgvL+eUSxJCrt7wQXl5OQIDA3lv1goZLyWh7JykCvCZK65cuYJ+/foppBOJRNi6dSuuXbsGADA2NsbUqVOho6OjtFx//vknWrVqxSlbUVERtm7diitXrgCoPDSZMmUKGjZsyPlNIfUitC5TU1MZz6zGxsYK57L09HSkpaVh6NChKCgoQGlpKZo0aSKXRyhyc3PRtGlT3nwlJSX48OEDmjVrJpdO2bxXdx7jU8ZC+7K6oIr65+rLQvX3qqgxC9KqyMjIQEJCAtq0aYOhQ4dy0nl7e+PatWvYuXMnbt68iX79+sHIyEhuZ7C3t4ejoyMOHjyIli1bMs/btm0LR0dHVp6AgABERERg1KhRaNu2LZ49eyb3JJYvfZ06dRAdHV2tBSmX7FXRsmVLJCUlQUNDAxUVFQgPD8d3332nEvrQ0FCUlZXxln3jxo0YPHiwXJobN27INOi4uDiZxSfbMzbs2rVLqQWppMmyi4sLysrKsGDBAk4TZwAYO3Ystm/fDiKCvb09vvjiC5iammLu3LmcPIGBgahTpw7Gjh0LGxsbTvNxMby8vPDmzRvo6uoCAPLz8/HVV1+hXr16WLt2rdLKxoYNG7Bjxw6laFXNk5ubi9zcXBQXFyMtLY055c/Pz1cYjDo6Ohpubm64du0acnNzsXLlSixfvpx1QVpUVCTzzNPTE3FxcSAiuUqGJJRpM1euXMG8efNw7tw5tGjRAuvWrYOXlxfrgnTkyJFyN4N+++03zndPnz7Ftm3b8OLFC6k+J48nJycHBw4cQEZGhhSP5MYRANy7dw8AkJeXh8TERPTt2xdA5caMkZGR3Incz89PJk+6urowMDCAo6OrN1agAAAgAElEQVQjNDVlDXNycnIQHByMN2/e4ODBg0hJScGtW7cwZswYVtq8vDxcunQJvr6+MpYhytYl8H9XK5SFPCU2Ly8Pq1evxps3bzBkyBCpMvL19cWmTZtkeKZPny7zLDExkXletV6EyCWGnp4ekpOT0bNnT6W+CVT2w4iICDx8+FDKwmffvn0ytDt37uT8joaGhszCT0g95ubmYvXq1YiPjwdQaRWkqakJCwsLzJo1S+68v2rVKsTGxuLbb79l2iCbXJLYtm0bLC0tkZycjEuXLmHChAlYvnw569UbtnYvrj+uRXedOnXw6NEjzvSrojrjpZA5iQ18+wzXXMG2oTp//nzs3r0bRIROnTpxfnPBggXQ0dHBokWLAFTOBQsWLMDGjRuVluuPP/7A/fv30aJFC9bwGUFBQSgvL8eCBQsAVI6ry5YtQ3BwsAytkHqpTl3GxsZizZo1TNvdvn07Zs2aBVtbW1b6mJgYbN++HaWlpRg6dCgyMzOxbNky7NmzhzMNPn1fjDt37uDnn39mLDLu3r2Lw4cPIygoiJNnxowZWLZsGbS0tGBnZ4e8vDx4e3tj0qRJ1c57deYxvmXMty8DwspYyGaMkPpnA1dfFqq/V0WNWZC6urpi3rx50NPTw9u3bzFy5EgYGBjg5cuXSE1NxeTJk1n5PD094enpiZKSEsTFxSEsLAxv377FgwcPONNKSEhAvXr1WN/5+fnJPCsvL8fFixeZk04AaN++PQICAjjT6N27Ny96ADAyMsLp06eFuUvmgYCAAMydOxdPnjxBr169YGhoiNWrV6uEXsiuGADo6+uzDvSScHNzY/4vvnf77t07KYdYIpFIadNlPibOR48exejRowEoNnEGKu8o6+rq4tixY7CxscGsWbNgZ2cnd/I/duwYkpKSEBUVhfXr18PGxgZjx47lvHc7ZMgQGBkZMRs2f/75J65du4Zhw4ZhxYoVOHLkiFL547uwVCXPiRMnsHfvXrx7905qE0FXVxceHh5yv1enTh0AlfG7bGxs8P3333PWae/evaGhoSHz3sDAABoaGnj48KFSeeBz5f7GjRsYNmwYWrRowbnoFLeHc+fO4enTpxg1ahSASgVL0Qn8zJkzYWFhAUdHR6YsFGHq1KnQ19dH37595fKI+6KXlxeOHTvGtMEXL15gxYoVctNo1qwZ7t27BysrKwCVG0S6urqIj49HSkoKo0RKYtGiRTA1NUVUVBQAoEOHDpg9ezbrgtTc3ByDBg1CSUkJs+kirlu2umRTfMXIy8uTm5eqkKfEBgYGok2bNhg4cCB++eUXXL16FevXr0fdunXx4sUL1u8lJSVh4MCB+PHHHwFUtq/r169j0KBBKpNLjPv372PMmDH45ptvmOsXgPwNjAULFqBjx4549uwZpk+fjqNHj3Iuevfv389LZr71CACzZ8+GoaEhEhIS8OWXXwKoVOwPHTqE2bNny43L9+eff+Ls2bO8NizYrt7s3r2blVaeBdAPP/zA+c7Y2BjLli2Dvb29VL2wLciqM17ymZNU2We45gpra2u0bt1aakzNzs6Gp6cnNDQ0cPbsWc5vPnnyhNmUACrD+IwYMYKXXGKLu/fv37O+v3v3rtTC+/vvv+dcjAipl+rU5e7duxEdHc2cJGZlZWHSpEmc8u3duxdHjx5lFmAdOnRAdna23DT49H0xgoODERERwYQ769GjB+bNmyeXJz09Hbq6ujh9+jSMjIwwf/58ODk5cS5I+eS9OvMY3zIG+PVlQFgZC9mMEVL/bODqy3z1dy7UmAXpu3fvoKenBwA4fvw4+vbti40bN+Ljx48YN24c54L0zJkzuHr1Kq5evYry8nL069eP2QXhAhHhyJEjMicLc+bMYaWvU6cOLly4wLpY5cKzZ88wf/58ZGZmIiEhAffv30dCQgJ8fX05eWJiYhAZGYkGDRqgYcOGzMR89epVpdNVBs2aNcPu3btRVFSEiooKaGtrq5ReCCIjI3nRVL13K0bz5s3h5eWlVJqfy8QZqDQ9ASoXS1ZWVtDU1FRq0WBoaAhDQ0M8fPgQU6ZMwd69e2FqaorZs2fLmIskJiZi4cKFzN9Dhw7Fpk2bsGjRInz69EmpvP3TmDhxIiZOnIjw8HDOPs6FBg0aYMeOHTh16hQOHjwIIuI0i3dwcICmpibmz5/P7CQOHjwYCQkJvNJUps189dVXCAwMxMWLF+Hl5YWysjIpE0FJ9OnTB0DlCcrhw4eZdmVmZqbQyVtFRQXvMisqKkJgYKDS9K9fv5baEGnbti1evnwplyclJQX79+9nNv2cnZ3h6uqKvXv3wt7enpUnMzMTY8aMwa+//gqg8i4620kqULmjPmPGDIwbN04pUyE2xVcMLmWUC/KU2GfPnjFKwbBhw7Bs2TJ4e3tLbUxWxYkTJ7B06VLcv38f/v7+aNiwITZv3qxwJ5mPXGKwbQQowvPnz7Fp0yacPXsW1tbWMDc3V6oP5OfnIz09XWrXX7zoFoNvPQLAq1evZBadTZs2xdSpUzF8+HC5vK1ateIdg4/P1Rt5dSbv9ODUqVMAKjelJNNlW5BVZ7zkMyepss9wYdq0abhz5w6WLl2Kr7/+GoDyY3Lz5s2lzELz8vJ4X1URQ57ZYmFhIaNfsFnZiCGkXqpTlwCkzFoVmbiK9SVJKNJHhPT90tJSmcWXoj4n1sFv3LiBgQMHomHDhpxjvxh88g4Im8eEpMOnLwPCyljIZoyQ+ucDvvo7F2rMglTSPPHvv/9mTn2++OILuQX3+++/w9jYGB4eHkoHr50+fTpKS0vRs2dPzpPSqhg0aBB27dols/PBtdu6ZMkSTJkyBWvWrAEAdO3aFXPmzJG7ID169KhSslQXbHd9dHR00LlzZ8b8UxITJkzAqFGjYG5u/lkWo0DloHTo0CGkp6eja9euCk0ZVXHv9nOZOIvls7S0RHl5OZYuXYqPHz8qHGSByhOTgwcP4s6dOxg1ahRGjx6Na9euYerUqTIepisqKvD3338zQd5v3bqFiooKAFAqrZqAkpIS1KtXDxMnTmSd8OWdZgQHByMqKgqzZs1Cs2bNkJGRARsbG07av/76C66urvDz84OpqanCTQU2KNNm1qxZg+PHj8PBwQGNGzfGy5cvFe4OfvjwAcXFxWjQoAGA/7tLIw8GBgZISUlhNvKUQa9evfDo0SN06dJFKfr//Oc/2LJlC2MdcPToUfznP/+Ry5OdnS2lhNStWxd5eXmoV68e53grPokS4+PHjwpPo8WLGLF5m+S4LInWrVsjKiqKVWEVeqeSTYmVXKhoaGggMDAQoaGh8PLy4nRo17RpU2zYsAHHjx+Hi4sLZs+eLahdypNLDPHmh6LykoS4vrS0tPD+/Xs0btwYubm5cnni4uIQGhqKjx8/onnz5sjIyICenh7nnThl6xGo1BNu3bqF3r17Sz3/+++/Fc7l8+bNw+TJk9G/f38pWnlme3yv3ggBn02x6oyXfOakz9FnqmLatGl48OABZs6cCTs7O4wZM0Zh2xdbQ3355Zews7NjTqXPnTsHQ0NDlcglho2NDZydnaUsPRT5AejZsyfy8/MZPerjx4+4f/8+6yFJdeqyXbt22LhxI5ydnQEAR44ckRvBoEmTJkhPT2fK99ixY1LX1dggpO/Xq1cPBQUFTDqpqakKrx517NgRHh4eePr0Kfz9/RVupvPNOyBsHhOSDt8NbiFlLGQzRkj98wFf/Z0LNWZBqqWlhSdPnuCrr77CjRs3pHZz5XmzFS/4CgsLpXaz5OH58+dSOwzKQOztNiwsTKFZEVC5Q2xqaoq1a9cCqFwgKNopat26NUQiEZ4/f87bYQwfbN26FXfv3mWU0sePH6NLly7IzMzE8uXLZUyP3N3dER0djeDgYAwZMgSOjo7MIkhVCAwMRFpaGn744QccOHAAr1+/VngirYp7t8qAr4kzUJmflJQUtG3bFlpaWsjPz1d42d3Gxgba2tpwcXFBWFgYo6Tb2dnh+PHjrGnMmDGDWcR8+vQJa9asQUFBAVxdXYVlVs1wdnZGTEwMq0mtIlPab7/9VuqEuF27dvD29uakNzMzg4GBAYKCghAXF8d5alkdlJeXY/78+VJOadq0aaNws2zEiBFwdnZmHKrFx8crjOGbnJzMmPZKTvryTDB/+uknuLi4oGXLlkrxhIaGYsWKFcxC39jYWKEDuj59+kjdmT1x4gQMDQ1RUFDAuWgYNmwYFi9ejIKCAkRHRyMqKgojR46Um86LFy/g7++Phw8fQkNDA/r6+ggLC5NRGszNzfHq1SvWSXvYsGFy0+CDtm3b4saNG1IngXPnzsXatWsREREhl9fW1hZGRkZYvHixwusAQqFseUmiffv2eP/+PaOc6+rqKpybwsPDER0djUmTJiE2NhaXL19mDdcmRK6lS5dizpw5qF+/Plq3bg2g8tS0uLhYYSzzHTt2ICsrCw8fPlTqdEDIVR2hkHSal5OTg48fP7Ka7FdnvOQzJ6mrz+jr62Pfvn3YuHEjXF1d5TqKBP5vs6JTp05SJ3FOTk4qk0kMLy8v6OnpMRZqs2bNgqmpqVyeVatWSW286OjoyDwTozp1uXTpUixfvhy2trbQ0NBAv379sGzZMk76BQsWwN/fH+np6Rg8eDAaNGiA8PBwuXkR0vcnT56MSZMm4d27d5g3bx4uXryIsLAwuTyhoaG4dOkSunTpgkaNGiEzMxP+/v4qy7s4Db7zmJB0uEzduUx2+ZRxdTZjhNQ/HwjR39lQY+KQXrt2DdOnT0dhYSGcnJyYQf/y5cs4ePAgp9mTkEnWy8sLa9eu5eWRjS+cnJxw8OBBODk5ISYmBpmZmZgyZQqio6M5ec6fP4/FixejTp06SEhIwN27d7FlyxaVNhyg8h7OxIkTGU+B9+/fR2RkJKZMmYKZM2fi2LFjrHx5eXk4deoUYmJiUFBQgNOnT6tMJktLS8TGxqJevXrIz8/HxIkT5ZaVGKGhoejVq9dnv3cLQCmTZfGuJ5d5j7xdz7t376JHjx68ZCopKUF6ejqAygWasif+/wYIcQggRnx8PBITE3mZryoLZ2dnHDp0iPcOYUJCAhITEwFUTpiK7hGKaatCfBLGBktLS4wcORL6+vpSSrk8Hr4oLS3FoUOHGPn69OmDn376SeGG3PHjx5GQkAAiwuDBgxWeRri5ucHKyopZuEZHR+PkyZNKmQZ9Drx//x4aGhpo3LixzLvU1FS5TlrUgeqWV1JSEvLz8zFgwACZE21JODo6Ijo6Wsr5jbwY2XzlIiLcu3cPb968AVBpitu9e3eF/c3c3Bxnzpzh1S9HjRold4NHFeAbF5wvqjMnqRO3bt3CjRs3lL5yo04o6/3Vzs5ORn+ytbVl3VCuDkQikYz+yvZM8l3Dhg3x7NkzEBG+/fZbZGZmMqbSiqBs3wcqdfKLFy+CiGBiYoJvvvlG4fclPcCKRCKUlZVxWnvwzbtQCElH0jS/pKQE2dnZ+Prrr5U6OVVUxopCQE6bNk3u+/Lycqn6V6XJrlD9vSpqzAmpsbExrly5goKCAik37r1795Y7kS9evBhOTk5Sk9nixYvlTrK6uroYOXIkBgwYIKXAc90hFYOP2+SxY8di2rRpyMvLw6ZNmxAbG4sZM2bI/f7GjRvx22+/MRfce/TogYyMDLk8QpCSkiLltr5bt254/PgxOnbsKNdMTmzeQ0S8nLsog/r16zN1oaurq/T31XHvlo+JM9uup6ITdfGuWsOGDVl32Kq2/6oKRrt27QBUDjhFRUU1RsH43BDiEECMESNG8HaCoSx69eoFHx8fWFtbS21eKDJ1Gzx4sEJPdZIQsoisX78+p7MINhQVFWH79u148eIF1qxZg7S0NKSnp8v1fK6lpYXx48dj/PjxSqfz6NEj2NraSjmMePbsGdq3b8/Jk5ubyziBAio9FiuzGfG5IJ4L8vLy8PbtWwCV5v5ffvmlwsXotm3bMGXKlM8qX3XLS1mTyHr16oGI8M0332D//v1o3bq1XK+hfOXS0NBAjx49mM27K1euKLXIbN++PQoLC3ldO+F7VUcIhDjN4wMhc9I/gd69e6NDhw5K0bKdhos9eSvyIaIs+Hp/BQBtbW3cuXMHvXr1AlDpdVYZqz2+GD9+vMwGD9szMXx9fbFz507GD0VWVhY8PT2ZO4+KwMccum3bthg7dqzS9FU9wL57906uB1i+eRfj6dOnSElJYe5SA+D0aSA0naoLz6tXr+LChQty5RJDURkrWnDKw5UrV9CjRw+m/uWZkguBUP29KmrMghSoNMGsGlOsUaNGsLS0lLokLAkhk+y3336rdAxJMaKjo7Fjxw6l3Sbb29ujTZs2+Ouvv1BUVITQ0FClOnXVHbjPceLVsGFDqXiKJ0+eZMw+2Sb2hIQExMTE4ObNmxgyZAgWLlwo12ugEGRmZkpNMlX/5tosUMe9Wz4mzuLBKiUlRenvy9sRZrsQXx1Tn38T+DgEEBKSQyjE5S95wqEovISQEC5CTogHDBiACxcuKDQ9E2PJkiVo1qwZ055btmwJf39/uQvSnJwc7N+/XyYv8kKY2NnZYfjw4QgLC2PGvBkzZsid/DU1NfH06VNGiU1PT1fpri9fZGRkICAgAA8ePEDz5s0BVDrr09fXx9KlS1kX18eOHYOxsTHOnz/PLEjlnSZWB+oqr+nTp0MkEmHWrFlYsmQJ8vPz5Voi8JGrOqFCdHR04OjoyGsjmu9VHSEQ4jSPD4TMSepASkoKFixYAE1NTYSGhiI0NBTXr19HkyZNEB4ejq5du3Ly5uTkICkpiRmHzp49ix49eiA+Ph4jRoxQyeYOX++vQKX1mY+PD9MOU1NTFZ5s8UFZWRlKS0tRUVGBT58+SYWKked0acCAAZg3bx7CwsKQm5sLd3d31pBTQlGd8GXKeoAVmnegck789ddfkZWVhR49eiApKQk//vgj64K0OulURd++fVk3T4yNjVnLS5kDFSGbl3xMyYVAqP5eFTVqQcoFRad2fCdZITsN+/bt4+022dDQEPr6+gCUcyChra2N7OxspqFev36d1clQdREcHIzZs2cz8bU6deqEVatWobCwkLXh7N+/Hw4ODggLC2MWrqpG1R01ZXfY1HHvtl27dggICJAxcQ4LC8PMmTPluvtXBnwvwtdUBUPd4OMQQEhIDqHgG/4CEBbCRcgJ8eHDh7Fjxw5oa2szJ1nyJsBHjx4xd3yAyjFK7DiLC76+vujYsaPC0DKS6NKlC9q3b48JEyYgPDwcTZo0UbjLKvbQKlZcU1JSFN4j/JyYM2cOxo4di8jISMaapKKiAidOnMDcuXMZD8KSePnyJfz9/fH48WMEBARAX1//s3nIVld5NW/eHLq6utDV1WU2bNPS0lQiV3VChXTo0EHpEzgx1DHGCnGa92/A8uXL4ePjg/z8fHh4eGDGjBnYsWMHEhISEBoaKjdG4rt37xAdHc2Yx/v4+MDX1xdRUVFwcnJSyYJUiPfX3r1749SpU7h9+zaASsdzbCb8QhEeHo7NmzdDQ0NDKs64jo6OXMd57u7uWL58OVasWIGbN2/Cy8sL5ubmKpOLbyxbSSjrAVZo3oHKee/IkSMYM2YMdu3ahcePH2PLli2stNVJR3LDrKKiAnfv3pU6kRVDyEFKdTYvxfO8GJqamir1oSFUf5cB/Rdg4MCBnO/Onz9PxsbG5ObmRq6urtS3b1+6ePGiwm9evHiRduzYQZs2bWJ+8jBq1CgiIrKzs2Oe2dractI/f/6cRo8eTT169KAePXqQs7MzZWRkyE3jzp07ZG9vT4aGhuTi4kImJiZ09+5dhXnhg7KyMjp06BAREeXn51N+fr5Kv69unDt3jkxNTcnMzIyIiJKTk8nb21ulaVhbW8s8s7Gxkfq3OigsLJT7k4ecnBxKSEighIQEys3NrbYs/03w9/envLw82r17N5mbm9PIkSPp559/ZqWVrKeKigpasmQJubu706dPn6T6tCpQUVFBhw8fprCwMCIievHiBd28eVMuj5B2JOYRt8/i4mJydnaWy/Py5UvWHxdGjx5NRP837n369Im1P0jCyspK6TyIYW9vT0REhw8fphEjRtCzZ8+YZ/Ig2f5zcnJ4p6tKDB8+XNA7IqKRI0dSYmIiRUZGkqGhIQ0fPpyzLfNFeno68391lBdbvSmqS2Xl2rRpE3l4eNCrV6+YZ+Kx/3Ph6dOn9McffxARkUgkory8PJV+/927d+Tm5kbdunWj7t27k6urK2VnZ6s0jZoIyTYxaNAgqXeKxuQRI0ZwPlPVeO7n50eTJk0iMzMzKigooKKiIrk6nxifu70QES1dulQpuidPnjC/lJQUcnR0pJCQEObZ54JIJCKRSKQUrYeHBz19+pRpD7GxseTl5cVJr2zeJeHg4EBElXNlRUUFEcnX34WmY2ZmxvyGDRtGHh4elJycLJentLSUHj9+TI8fP6bS0lJOus2bN9O4ceOod+/etGjRIoqKiiILCwul5BozZgzdvn2b+fv27dsKdYV/AjXmhFReIGZJs6+qMDU1xcmTJ5GcnAyg8v6W2B0yF1avXo27d+8iNTUVQ4YMwdmzZxXaUvN1mxwYGMj7bmvPnj2xb98+/P333wAqd9uqmjBXF3Xq1MGvv/4KZ2dnpS+BV8d5jLI4cOAA4y23qknhpk2bOMPlqOPeLV8TZ75gM70VQ5552O+//46AgADmVGzBggUICgqSa075b4LY07Gbmxt69OjBOARgg5CQHEIRHByMnJwc3L9/H7NmzYK2tjZWrlwp12xJSAgXIS7j+VoUGBoaIjw8HCUlJbh+/ToiIyMV3nP97rvvkJmZySsuoLjtjx49Gq1atYK7u7tS5lFNmzattoWCqtCkSROcPHkSVlZWzLhARDhx4gTnOD5ixAh07tyZqb/x48fj2LFjiImJwf3791Ui18yZMxEdHY2JEydi7969n628cnNzkZubi+LiYqSlpUmZusm7QwooX49CQoWIIcTUje9VHSFQR5zvmgjJ+a5///5S7xRZYXTq1AkBAQFMGK6YmBh07NgRJSUlKgt5xtf7q1gOyfuQn6O9AJW+U5QB23WgM2fOMM695FkUCEFaWhrmzJmDx48fQ0NDA507d0ZoaKhMDHVJzJ8/n5cHWGXzLomGDRuitLQUenp6CAsLQ6tWrRS2MSHp8LV2u3v3Lvz8/BhrpbKyMmzatIl1bvbx8YGPjw9GjRoFW1tb3L9/H9nZ2bCwsEDXrl2xbt06znQkTcmJCGlpaSo1JReqv8vgH1wMS0FyZ4HtpwjFxcVKnypZW1tTaWkpc8Lw9u1b8vDwkMuTlpZGDg4O1KtXLzIzM6MRI0bQ8+fPOenZdl+U2V1Txw52SEgIxcfHK00/bdo0WrduHQ0dOpROnDhBrq6uzOmPqiC5W1p1N13e7rqjoyMRSe+KqvrEKzU1lRwcHJjTbgcHB3ry5AkVFBTQpUuXVJoWH1hYWNDTp0+Zv9PT05XeMfs3QZm+7+npSYmJiTLP16xZQ3p6eiqVx9bWlioqKqTaoaJTRTs7O+rWrRtZW1vTyJEjmZ888DkhFoOvRUFJSQlt3bqVRo0aRSNHjqQtW7bI3cUlInJ3d6c+ffqQt7c3+fn5MT95OHz4sNTfKSkpNG/ePLk8NQ3p6ek0YcIE+vHHH8na2pqsra3pxx9/pPHjx1NaWhon34MHD8jMzIx8fHzI3NycevfuTVu2bKFbt26pRK4RI0bQ6dOnaejQoXTu3DmZn6qwZ88eMjMzo27duknN3ba2tjL1W10UFxdTWFgYTZw4kQYMGCCXNjY2lt6+fSt1IqDM6TtRZb8UiURSfVmIBYAiPH/+nC5evPhZ6qWmYurUqawWWm/evCEnJye5vPn5+RQSEkIODg7k4OBAwcHB9PHjRyotLf1HLSXU1V5qKkaPHk0xMTFUUVFBFRUVFBsby1jZyENZWRmlpqbSkydPqKysTOVyPXr0iAoKCig7O5sWLFhAvr6+9ODBA5WnQ0R04cIFCgkJoZCQEIX6obOzM125coX5+8qVK5wnlxYWFuTn50dDhgyhR48eUVlZGTOO3bt3T6Fc79+/Z8aW9+/f88iRYgjV36uixpyQ8t1ZEOP333/H8uXLkZWVBQBKOR2oV68e6tatCw0NDZSWlqJFixaMV0QudOjQAUeOHFHabbKQu63iE6/u3buDiD7biRdfz7R8nMcIBUnsllKVk8Kqf0vic9+7LS8vR1JSEqKjoxnPh5Iny1V3dtWJ+vXrSznnat++/We741sTwafvr1q1ivUkZebMmVKeXVWB+vXrS6WlaCcWAHOfmw/4nBCLwdeiQEtLC1OmTOF1smRtbc1YEygLsYdRMbp06YLg4GBe3/in0b59e+zduxe5ublSIUkUWex07doVzZo1Y3asxfckDx06JHWHSShmzpyJX3/9FdnZ2di5c6fUO0XOtvhg4sSJmDhxIsLDwzF58mSVfJML9erVw6xZs5hQIfJQnXu6yt5vqw7WrFmDI0eOoGPHjszpnirrpaaC6w7fF198wRnmTwwdHR3Oe4uK+tvnhDraS3WQk5MjZRGkbNgXZVFYWCjlKMjOzk5mzKmK6dOnY8OGDVKnqOJnqkLnzp0BVPpyWbFihcq+WxU7d+5EbGwsrKysAAAhISGwt7fndIRVVFQkZZ3Zt29fhISEsNLGx8fj4cOH8PHxwcaNG/HkyRNkZWVh69at6Nevn0LZGjdujL59+zJ3R1UZkUGo/l4VNWZBKi7cqgV75coVNG/enNN7XlhYGNavXw8DAwOlTTW0tbVRVFSE/9fenUdFcaV/A/+CSjSCBI0hZwxRo1GC+zgRxTUmISwCgkiLio7jjj9FVA6IgAF0NLYaowFMBpNIguIScIMsJkzQjIhBj8uwOKMIAsYNEFuFsN33D96u6cZuequqbuD5nOM5UNBdV+3qrnvvs4waNQphYWHo3bu3xrqFqlYAACAASURBVBt5XS8axUINjDFcv35dYwGJjz/+GCkpKdwko7i4GMuXL+d9QqprQrU+oYG6UryBbzlxaC0ka926dVi8eDHKysoQEBCA4uJiJCQk8DYufUKc9VVYWMg1L1dMhG85wZKHMr777rtISEiAr68vGGNITU3Fu+++K+gYTYku17669kyA+qbV+ho0aBBOnDgBxhjKysrw+eefa6xKbWgfUF3K8utSyfvJkyeIj4/H+fPnATR/YC5fvrzVa8Hb21vrsYSEhEAqlaqt0ih0D0gh9OzZU+ebYsUFid69e8PLy0tjH1Ztvffee3jvvfewZcsWrF+/npfnbM2yZctw48YN5OTkAGiuKNlayJ4htGkVYkiom66pOvr4/vvv8dNPPwn++dJWvPjiixqLQIrRJkkfYrxe9JGdnY2wsDBUVFTA3Nyca1nIZ3s8oLmFYG5uLvd5dPHiRaUWg6qoWhAtKiridVyVlZWIjY3lWkSNHz8eGzZs4H3x4vjx40hJSeGu5YCAAPj7+6udkHbr1g05OTlwdHQE0NxbvLVJor6Ll/ps3OlC3/v3lkxmQrpjxw6sXr36ueO9evXC9u3b1caUW1tb489//rNO59q5cyc6deqE0NBQfPnll5DJZBpXY3S9aCZNmoT09HRcuXIFgHa5rWLtePXp00en3+/Xrx8ePXoEDw8PSCQSWFlZ8V7RVrFMtOLXjDHcv39f7ePEyLt1dHTE999/DxcXF16ft6UPP/wQq1evxpYtW5CYmIjk5GSV+UQtc04VX7tmZmYG9atqS/S59sUQFhaGrVu34sGDB/Dz88PUqVMRFhbW6mPEyNMGdI8oCA8Ph6WlJSIiIgA059SFh4dj9+7dz/3u/v37MX/+fLULb6oqeM+fPx+AYVUa2wN530IArdYZMIQYk1EAOHbsGHbs2MHt8H322WdYt24dL5EI+rQKMSRPV9f8Nn307t2bJqNaErNNkj7Cw8MFf73oQyqV4quvvuJaaR09ehRlZWW8n6ewsBABAQFcb/TS0lIMGjSIa82ouMB4+PBhHDp0CMXFxUqtG2Uymc5tGTXZuHEjBg4ciLCwMDDGcPjwYURFRfGaRymneC1ruq7Dw8MRFBTELQrX19er/Gxt+Rg5bRcv9dm404W+9+8tmTFd9lMF5Ovrq3Y13MPDAydPnlQ6Jt8lSkpKgpWVFdzc3PDCCy9wP+drK1p+0RQVFSmt8sovmpZvNpoKcagal/wxiYmJ6Ny5s9KOV0NDA+8TjN9//x1SqRSFhYVKN7/aJLjn5uZyoYGdO/O3nqHpjaG1f4PKykqdJv66Gjt2LB49eqR1iLO+fHx8kJqaqvR6nzFjhii9VtsSsa59MclbpaSnpyu1cFm3bh2v57l69So2btyIsrIy2NvbcxEF6laxXV1d8d1332k8BgApKSmYNWuW2mtZ2/exuro6VFdXP7eT255lZWW1mxBNT09P7Nu3j/v/e/DgARYuXIgTJ04Y/Nxz587FggULuEXk4OBgeHp6IjMzE0lJSWqLx8hD3RwcHLhorEWLFsHJyUljWHRjY6PWqTq6yMrKAtC8KHT37l24uLgovY+1l9cDn+Li4pCdnY38/Hy4u7vDwcEBSUlJKt+PjEWo14sh5PcW06ZNw6lTp5SO8enChQut/lwxEqi8vBxlZWWIjY1VKiBkaWmJwYMH8/rv5uXlhePHj2s8Zij5op88BeXo0aNgjLWaflJfX49bt24BAPr37/9cT2I+tDa/4oMh9++KTGaHVCaTqf2ZYoVMuZa7RDExMVo3ri4qKsLevXtx+/ZtjU3ox48fj759+yI2NlZphV9+0agblzqqxiX2jld4eDjc3NxQUFCA7du34+DBg9yKVmvq6uq4ndH6+npeJ6T6/h3FyLsVa0IofwO2trZGYWEhbG1tUVVVJcq52xJDrn0xuLi4YO7cufD29ta6YqYYedqA7hEFr7zyCiorK7lFnqqqKrXVc2fNmgVAv2s5ODgYMTEx6NKlC7y8vFBVVYWlS5e22oS+Pbh79y5effVVJCQkcBOQyMhIxMbGGnlkhlFcTOBzYeHp06dcWsInn3zC7bpOnTq11Z0FfUPdhMxva5lbp9i/uCPkkOrDkPBrsdy8eVNpYsZ3Sog+5Pdqtra2yMzMRJ8+fVBdXc37eXRJPenTpw/69OnDTZCF1NTUhIqKCvTq1QtAcy6tNrUddBUZGYm4uDhs2rQJAODk5ITAwEC1v3/u3DkMGzaMy3F9/PgxcnNzW+36oc/i5fvvv48DBw4ItnjP1xzFZCakPXv2RH5+PhwcHJSO5+fnq8z/MqRhdVBQELy8vODt7a1xFablRaN4c6aKfFzx8fGwsLCARCIBYwxHjhxRObFWfIxYqqqqMHPmTCQlJWHUqFEYMWIEJBKJ2heV0PHnQHPbH8Xcq4yMDJw6dQp2dnZYuXKl2tAHMfJudQ1x1pebmxuqqqqwZMkS+Pv7o6mpCatWrRLl3G2J2NeLrnbu3Ink5GTExcXB2dkZc+bM4T5w1BEjT1vOyspK4weaPOTGxsYGXl5eXEuOX375RW2+qqYceVUhu3K3bt2ClZUVvv/+ezg6OmL9+vXw8/Nr9xPS0NBQVFZWoqqqCidPnsSQIUNw7do1Yw/LIK+//jp2794NiUQCADhy5Ajs7Ox4eW7FgC5dW4XoE+omZH6b4gSUaEeMNkmGSE5Oxt69ezFlyhQAwOeff45ly5Zh9uzZRh3XvHnzUF1djaCgIKxduxYymUyQEH59agGIUT9g4cKFmD59Ovf/kpWVpbGFjz46deqEkJAQrX9/27ZtSuHmlpaWzx2TM2TxUr5QI9Tivb737y2ZzIQ0MDAQgYGBWLFiBYYNGwaguUdPfHw8oqOjeT1X586dsWjRIp0ec/XqVQQFBaGpqQlZWVm4du0aDh8+rPbFcPr0aaUX1cKFC+Hj4yN49UFtyEMCXnzxRdy5cwcvv/xyqze/QsefA815d/LKeteuXUNERASWL1+O69evY9OmTWorj4mRd2tIiLMuFixYAKA5//jChQv4448/KLeoDXJwcMDmzZvx+PFjfPvtt1i8eDFee+01zJ8/H87OziofI0aeti7kRUUGDhyotMLv5+en8TG3b9/Gb7/9hvfffx8A8NNPP+Htt99u9XzySJXffvsNkydPRrdu3QR7rzEl+/fvR01NDWbMmIGSkhJkZGTg1q1bWLVqFcaNGwd/f39jD1Fn0dHR2LRpEzw9PWFmZgYnJyfExMTw8tzyPrqWlpbcLgTQfLOmabVflzxdMfPb/P39cfDgQY3HiOGVRoWWlJSEY8eOcTtxlZWV8Pf3N/qEdMqUKbC0tMTw4cNx+vRpAOC6BvBJsRbAH3/8gfT0dLzyyiu8P0ZX06dPh4ODA7dzPW/ePLz55pu8ngNojtTw9PTE7NmztVqEk08M5czNzbkquC0Zsngp9CK+vvfvz9G6QYwIzp49y/z9/dmIESPYiBEj2OzZs9mZM2d4P8+OHTt07vMlkUjYf//7X6X+Um5ubmp/38XFhRUXF3Pfl5SUmEyPyK1bt7KqqiqWlpbGHB0d2cSJE9nmzZvV/r6mfoh8UOzTKJVKWUxMDGOsuT+Vqj5e8p6Tu3fvZvHx8ez+/fvs3r17LCEhge3Zs4fXsf31r39lhw8fZi4uLuzSpUssJCSE93MwxlhTUxM7fPgw27ZtG2OMsdLSUnbx4kXez0PEcebMGbZ06VLm7OzMEhIS2IIFC1hQUJDGx/32228sMzNTY79PUxUQEMAqKyu57ysrK1lAQECrj1m1ahVbuHAhe+edd9jTp09ZTU2NVn2b27qVK1eyb775RulzxdPTkxUUFLAvvvjCiCPTn6rekqqO8UneY7A1unzml5WVsfPnzzN3d3eWk5PD/cnLy+O9T2LLPn0NDQ3M1dWV13O0N4p9St3d3dmxY8dYaGioEUfUzNvbW6tjYlPVC1KX/pD6ampqUttXk8/HmIqHDx+yuLg4NmXKFLZw4UKWmZnZ6u/7+/uzy5cvc99fvny51b/7s2fPmKurK9uzZw9btmwZGz58OFu5ciU7cOAAb38Hfeh6/66OyeyQAsCECRMwYcIEwc8zbtw4BAYGwtzcHBYWFloVqamvr38uF6C15OPg4GD4+flxxULy8/NNJi9IviI1ffp0jBkzBk+ePFEZUigvHiN0/DkApd2QK1euYM6cOQCaQyBUhVWLmXera4izvrZs2YKKigrk5eUhJCQE3bt3x9///vc22fqiI9u3bx8OHToEOzs7BAQEYPLkyTAzM8OyZcu4XcPW6NLCRWj6tFd4+PAhbGxsuO9tbGzw8OHDVh/z0Ucf4ddff8XgwYPx4osv4t69e4KEVJma//u//0N2djbu3LkDZ2dn2NnZoaKiAk+fPhUkh1gMAQEBz4WcqTrGp9ZahegT6qZrqo4+EhMTkZiYiCdPnijljNXW1sLDw4PXc7U3QrZJMoS8nYh8Vz0tLQ0TJ07EjRs3AIifT9rQ0ID6+no0NTWhtraWu1+SyWQaC3Dy4cmTJxrf+/l4jDrqwoHl+L636tWrFwIDA7F06VL8/PPPiI6ORmxsLObOnYs5c+Yo3T8DzW3PVqxYwb0ubty4obZA0KpVq+Do6AgLCwvu3tPLywuBgYEaC2xq21JQX7rev6tjMhPS7OzsVhN5tf0dbURFRWHLli0YMmSI1mFhFhYWePr0KffivnHjxnMvLkXOzs4YPXo0V/115MiRRm3YDKiuAGxjYwMbGxuVTXLFLB7z6quvIjk5Gba2tsjLy+P+n+vq6lTm3oqZR6hriLO+cnJycOzYMa6Po42NjVKIMGkbysvLkZCQoLL3oikU3dCGIe0VBg4cqHRTlpqaqvFGrGvXrkp537a2tmqLJ7UngwYNwqBBg5CRkcGFiP7tb39DamoqNm7cKErBD74Y++ZXHUNC3XRN1dGFRCKBi4uLyiqj1tbWBj9/eyZGmyR9pKenA8BzE4STJ0/CzMyM9zQfTfbu3YtPP/0UZmZmSsW7LC0tuRQhPilOAJuamlBWVqbxPPo8RlvGaCdWU1OD48eP48CBA3j99dcxc+ZM5OTkYPHixc+1cRs1ahTS09Nx+fJlAM3zBHXXviGLl9q2FNSXrvfvavG4a2sQT09PVlNTw4ViqvqjGNZkCH1CUH/55RcmkUiYk5MTCw0NZU5OTuxf//oXL+MRy+DBg5m9vT0bPHgw90f+vb29vVHHVl5ezpYsWcK8vLzYiRMnuOO//PIL++ijj4w4Mt1DnPU1c+ZMxhjjXueNjY1KoRCEiOXTTz9lc+bMYaNGjWIRERHswIEDWqccyGQytnXrVubt7c28vb3Z1q1bBQ/ZbOuSk5O5r/n6nBPbnj17VH7GjB49mn366adGHZu+oW66puroSyaTsX//+9+8P297pWvKVUcXHR0tynkUw9tzc3PZvXv3BHmMqYqOjmbjx49nkZGR7Pr160o/++CDD3g5hzxc/datW+ydd95h4eHhGsNi5WHjiveTPj4+vIyHMf7u302mD6m9vb3Sbpwi+fGXX34Zv/76q8Hn2rt3L6ytreHq6qpTCGppaSnOnj0LxhgmTJiAvn37GjwW0rbcuXNHbYizoSIiIjBmzBjs27cPcXFx+Pzzz2Fubo4PP/yQ93MR4YhVBEsMvr6+CA0NRV5eHuLi4tCrVy+Taa/QXpWXl4tW2VsIMTExSjt+xiYPdTty5AiOHTsGoDnU7aOPPkJ2dnaruzHyPtDTp0/nHqv4NR+ysrIQFRWFTp06ITMzE9euXUNcXNxzPc7J/8KvZ82ahZSUFACm1SbpzJkzmDRpktKxQ4cOcRWnO4KGhgalvpp8tgfUV1FRERISElBaWqqx1aMh9u3bB19fX5W7nPfv3+elWNOBAwe4IlnavhfNnDkTR44cwdy5cxEREQFbW1vMmDEDmZmZBo+HT8Z/pfx/YoZg7tq1C0BzNUBdQlDt7OyMXi2tvRIzZFtbuoY4GyosLAxbt27FgwcP4Ofnh6lTpyIsLIzXcxDhyfv8FhYW6tTn15QY0l5Bn7xT8j9teTIKwKQmo4BhoW66puroY/fu3Th69CgWL14MABg2bJjKdjPE9NskSaVSXLhwAWvWrEFtbS0iIiLw8OHDDjMhvXbtGlatWsXVZmloaMCePXtarRh/6dIlSKVSlJaWorGxUauaLrpas2YNXFxc4OPjo1NOo65aa1PGV+VgxTlIXFycVo9R1VJw5cqVvIwH4O/+3WR2SE1dbm4udu7cidu3bwt20XRkXl5eOHTokModcjl/f39eV6Y1UbVrL1QObWNjI+Li4qjvaDsgX7X08PDAyZMn0dTUBIlEgiNHjhh7aDqRt1dwcHDg2issWrQITk5OSvlIcvK806CgIG73Qtu8U0KEJpFIlPJ0x40bhytXrrSap5uVlcXtrEycOBFnz56FVCrltcWIGLuw7Ym8TZKbmxvy8vJw7tw5TJ482STaJNXU1CA2NhZFRUV4/Pgx3NzcuAKaHcGsWbMQFBTETTyys7PxySefcJ8Hqri6uiIwMPC5toJ8Lsx5enrixIkTvD1fW1ZfX897S0G+7t9NZofU1G3YsAGrV6/G0KFDO8ybi5iuX7+OUaNGaQzZFpOYu/adOnXCmTNnaELaDohVBEtob731Fnr37s1V/Zs2bRr69OmDlJQUlRPSsrIyrF27Fv/5z38QGRkJBwcH1NbWij1sQlSSV2Ht168fevTogc2bN2t8zOTJk/HGG29wqTrLly/nPVWne/fuePjwIbcLm5OTAysrK17P0V4YUmlUDN26dYODgwPOnj0Lc3NzODk5daj7xZqaGqVdsHHjxmnsQdm1a1fBq0qPHDkShYWFsLe3F/Q8pkqxr3GXLl3QpUsXXnsd83X/ThNSLfXo0QOurq7GHka7Jebkz1RNmTIF+/btw/Tp05VaGPAdGkyE9Ze//AWPHj2Cv78/fHx8YGFhARcXF2MPSy+6tFdYsWIFVqxYAV9fX3h6eiIvLw8PHz6Ei4sL5Z0So9Mn1A0QPlVn3bp1WLx4McrKyhAQEIDi4mIkJCQIdr62zNTbJK1cuRLPnj3D8ePHUVpaipCQEPj6+mLJkiXGHpoounXrhpycHDg6OgIALly4oPH+ZdKkScjKyuJaMgnh6tWrSE1NRf/+/ZVC7jtKS72WC8ONjY2orq7m7fn5un+nkF0t7d+/HxYWFjoXQiJEW4qrd0KFBhNxCVkEy9TI807z8vIQHx+PAQMGwNfXl8s7bS2PiBBTJFaqjkwmw6VLlwA0t4Lo0aMHr8/f3ugTfi2GhIQELFu2jNvtrq6uxoYNG9T2lmxv5G2SLCwsADSHh+7evRtDhw5V+5ixY8fi0aNH6N69O5d7yvc1duHCBZXHx4wZw9s5TJFir2PFqAt5r+OYmBgjju55NCHV0qlTpxAZGcmtNNBkgRCiSFOvxba4eKXryrWueaeEmLIPPvhAZaoOn/ltqt432uJ7hZj0qTQqlidPnqCkpIRbgJPfK3YU9fX1SlV25Sks6pSXl6s8zuc1VlJS0iG7YshkMlRXV7eZXsc0IdXS1KlT8cknn2DIkCEdKieAEKIdMYtgCc2Q9gry3QugOe908eLFyM7O1phLRIipkbdLEJL8fUNR586dMXz4cMTGxuKNN94Q9PxtnSm1SeroLXzOnTuHYcOGcbtxjx8/Rl5enqjdEVRxd3dHTU0NHB0dMXbsWIwbN463qrdtTUVFBUpLS01ygZhySLX0yiuvYNiwYcYeBiHERLWnPGhD2ivokndKiCmbNm0aDh48KGiqTnBwMF544QX4+vqCMYa0tDRUVVXBzs4OGzduxNdff83budojU5mMAtTCZ9u2bUpV1S0tLZ87JhcSEgKpVIoZM2ao3EHmM78zPT0dDx48wLlz53D+/Hns2LEDlpaWyMjI4O0cpmz27Nn47LPPwBjD9OnT0aNHD0yaNAmhoaHGHpoSmpBqaezYsZBKpXBzc1P6YBo4cKARR0UIIfzbv38/116hpKQEGRkZuHXrFlatWqWxvcKIESO4r7/88ksxhkuIIHr16oXIyEgu10qIaIcffvgBqamp3Pfz5s2Dj48PUlNT6fppg3r37q30vTyfsiNoGZ5sbm6OxsZGlb87f/58ABBlUsQYw++//447d+6gvLwcL730EkaPHi34eU3Fs2fPYGVlhePHj8PDwwPr1q2Dl5cXTUjbKnkPo++++447ZmZmhp9//tlYQyKEEEEY0l5B6IqJhIhl586dSEpKEjRVp6amBqWlpbCzswMAlJaW4tmzZwCa24GRtqOjt/Dp3r07rly5wi1KXrlyRaljgCJ5oSMxCgu9/fbbePPNNyGRSCCVSmFrayv4OU1JXV0dgObXo7u7O8zNzU3yvYUmpFrKzMw09hAIIUQU+rRXkOedJiQkcBNSbfNOCTFFYqTqrF69Gr6+vhg6dCgYY8jPz0d0dDSePn3aZttFdVQdvYVPSEgIVqxYwUUO3rhxQ2OF4aKiIuzduxe3b99GQ0MDd5zPkN2lS5fi/PnzSExMxMWLF+Hk5ARHR0f07NmTt3OYsjFjxsDNzQ2NjY2Ijo7G48ePTbIWDhU10lFFRQX++OMP7vs//elPRhwNIYQIR5f2CvPnz+fyTkNDQzFkyBCsWbPGpCpgEqKLXbt2ob6+XvBUnYqKCly5cgVAc8h7r169eH1+Ip6O3sKnuroaly9fBgCMHDlSYzVXDw8PeHl5YciQIUq7dkLsnNbV1SEjIwO7d+/G3bt3kZ+fz/s5TBFjDIWFhbCzs4OlpSUqKytx9+5dODg4GHtoSmhCqqXs7GyEhYWhoqIC5ubmqK+vx0svvcR7PzJCCDEVurZXkOedurm5IS8vD+fOncPkyZM15p0SYoqmTp363DEhUnWqqqqUJqQ2Nja8Pj8hpsrb21tl0SM+/fDDD8jOzkZ2djYaGxu5Srvu7u6CnteU1NTU4O7du0o5vaZWA4dCdrUklUrx1VdfITg4GGlpaTh69CjKysqMPSxCCBGMfDIKAHFxca3+riF5p4SYIjFSdc6ePYuQkBA4ODiAMYbr169DKpVi/Pjxgp+bEGObOHGi4HUHfvzxR4wdOxaLFi3Ca6+9Jth5TFVycjK2b9+Ol156ictvNsUaODQh1UH//v3R0NAAMzMzzJw5Ez4+PggODjb2sAghRHCa2ivok3dKSFsgZKrOxx9/jOTkZAwYMAAAcPPmTYSEhNCElHQI48aNQ2BgIMzNzWFhYcFV6uVzEXPHjh0AmqvNPnv2TG2hpfbqiy++wKlTp0yqRZIqNCHVUufOzf9Utra2yMzMRJ8+fVBdXW3kURFCiGkYNGgQBg0ahIyMDKW809TUVGzcuFFl3ikhpkyMVJ2GhgZuMgoAAwYMUCruQkh7FhUVhS1btghaybq0tBRr165FQUEBzMzM4ODgAKlUylW2bu969+5t8pNRgCakWps3bx6qq6sRFBSEtWvXQiaTKTWAJ4QQ0hymCwD9+vVDjx49sHnzZiOPiBD9iJGq07NnT6SmpsLHxwcAkJaW1mGqfxJibW0teDXpqKgo+Pn5YcaMGQCA1NRUREVFdZg+v05OTti2bRvc3d0FLc5mKCpqpIWmpiacPXuWeusRQogOysvL28TKLCGq+Pj4IDU1FdOmTeN2+OXH+FJSUoKQkBAUFhYCAN566y1IpVK8/vrrvJ2DEFO1d+9eWFtbw9XVVWmy1K1bN97O4eXlhePHj2s81l6JVZzNULRDqgVzc3Ps2rWLJqSEEKIDmoyStkyMVJ2+ffvi8OHDePr0KQCge/fuvD4/IaZs165dAIDo6GiYmZlxOaQFBQW8ncPc3BxFRUV44403AAC3bt1SajHT3olRnI0PNCHVkr29Pa5evYrhw4cbeyiEEEIIEZgYqTr+/v44ePCg0kRUfoyQ9k4eGSCk4OBgzJkzB2+99RZXyXrbtm2Cn9fY6urqYGFhgZqaGpU/53MXmg80IdVSXl4e/P390bdvX6UKXUePHjXiqAghhBDCt6amJlhZWcHa2hrDhw/H6dOnBTlPbW2t0veNjY1UMJEQHk2aNAnp6elKvX47Qp62RCJBWloaRo0axe0+y/G9C80HyiHV0oULF1QeHzNmjMgjIYQQQojQvL29kZaWJshzJyYmIjExEU+ePIGVlRV3vLa2Fh4eHoiJiRHkvIR0FOp2BuVMbYewo6MJKSGEEEJIC+vXr4e/v78gqToymQzV1dWIjY1FVFQUd9zS0hLW1ta8n4+Qjsbe3h5mZmZqf25qO4QdHU1ItSSTyfCPf/wDBQUFSg2yk5KSjDgqQgghhAjB09MTN2/epFQdQtqw+Ph4WFhYQCKRgDGGI0eOoL6+HsuWLTP20IgCyiHVUnh4OAYMGIDi4mIEBQXh22+/xZAhQ4w9LEIIIYQIICIiQrDnnjFjRqu7NzTpJYQfp0+fVgq9X7hwIXx8fGhCamJoQqqlkpIS7NmzBz///DOmTZsGZ2dnzJs3z9jDIoQQQogAhKwRERoaKthzE0L+p7a2FiUlJejbty8A4Pbt2xrzS4n4aEKqJQsLCwBAly5d8OjRI1hbW6OystLIoyKEEEKIEIRM1aGCiISIIzg4GH5+fhg6dCgAID8/H7GxsUYeFWmJJqRa6tevHx49egQPDw9IJBJYWVlRyC4hhBDSTomRqkP1KQgRlrOzM0aPHs21fRk5cmSHaPvS1lBRIz3k5uZCJpNh4sSJ6NyZ5vSEEEJIe+Pp6YkTJ07Aw8MDJ0+eRF1dHebNm4eUlBTezrFy5UoMGDAA6enpSpPedevW8XYOQggxdebGHkBbUllZiX/+85+QyWQYMWIETUYJIYSQdqplqk6XLl14T9UpKSnB6tWr0bVrV0ybNg2fffYZcnNzeT0HIYSYOpqQaunHH3+Eq6srvvnmG3z99ddwd3fHTz/9ZOxhEUIIIUQALVN1Zs6cyXvIJ63N8wAAAWxJREFUrhiTXkIIMXW0xaeljz/+GCkpKejfvz8AoLi4GMuXL8d7771n5JERQgghhG/bt28HACxYsADDhg3jUnX4RPUpCCGEJqRae+GFF7jJKND8IdK1a1cjjogQQgghQqqsrOSKoQiRqiPGpJcQQkwdFTXS0p49e9C5c2f4+vqCMYbU1FQ0NDRg0aJFYIyhW7duxh4iIYQQQnjy448/IjIyEkOHDgVjDAUFBYiNjaXIKEII4RlNSLVkb2+v9mdmZmYoKCgQcTSEEEIIEZKrqyvi4+OfS9X57rvvjDwyQghpXyhkV0uFhYXGHgIhhBBCREKpOoQQIg7aISWEEEIIaYFSdQghRBw0ISWEEEIIaYFSdQghRBw0ISWEEEIIIYQQYhTmxh4AIYQQQgghhJCOiSakhBBCCCGEEEKMgiakhBBCCCGEEEKMgiakhBBCCCGEEEKMgiakhBBCCCGEEEKMgiakhBBCCCGEEEKM4v8BxaHeTPSpe6AAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {} - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1865,66 +612,41 @@ "\n", " # Add the token's start score as one row.\n", " scores.append({'token_label': token_label, \n", - " 'score': s_scores[i],\n", + " 'score': start_scores[i],\n", " 'marker': 'start'})\n", " \n", " # Add the token's end score as another row.\n", " scores.append({'token_label': token_label, \n", - " 'score': e_scores[i],\n", + " 'score': end_scores[i],\n", " 'marker': 'end'})\n", " \n", - "df = pd.DataFrame(scores)\n" - ], - "execution_count": 28, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "85HYAszU7rRi" - }, - "source": [ - "sns.set(font_scale=1.8)" + "df = pd.DataFrame(scores)" ], - "execution_count": 29, + "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/", - "height": 292 - }, - "id": "07xyo-I97Ntt", - "outputId": "9031d54e-5e9e-4554-b480-750854e77dc2" + "id": "07xyo-I97Ntt" }, "source": [ "# Draw a grouped barplot to show start and end scores for each word.\n", "# The \"hue\" parameter is where we tell it which datapoints belong to which\n", "# of the two series.\n", - "g = sns.catplot(x=\"token_label\", y=\"score\", hue=\"marker\", data=df,\n", - " kind=\"bar\", height=6, aspect=4)\n", + "plot = sns.catplot(\n", + " x=\"token_label\", y=\"score\", hue=\"marker\",\n", + " data=df, kind=\"bar\", height=6, aspect=4\n", + ")\n", "\n", "# Turn the xlabels vertical.\n", - "g.set_xticklabels(g.ax.get_xticklabels(), rotation=90, ha=\"center\")\n", + "plot.set_xticklabels(plot.ax.get_xticklabels(), rotation=90, ha=\"center\")\n", "\n", "# Turn on the vertical grid to help align words to scores.\n", - "g.ax.grid(True)\n" + "plot.ax.grid(True);" ], - "execution_count": 30, - "outputs": [ - { - "output_type": "display_data", - "data": { - "image/png": "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e+6Z66+/Pscee2w+/fTT3Hrrra09IgAAAAAAAJSUkikb1+fUU09NkrzyyisbXLvlllsmSZYsWXd7X1VVlS5dujTdcAAAAAAAAFDESr5s7Nq1a5Jk6dKlG1zbs2fPJMns2bPX2jd//vwsXbo0u+yyS5POBwAAAAAAAMWq5MvGv/zlL0mSnXbaaYNrBwwYkCT54x//uNa+L7b179+/CacDAAAAAACA4lUSZeM777yTZcuWrbV91qxZGTt2bJLk+OOPX7192bJleeeddzJ37tw11n/ta1/LVlttlUceeSRvvfXW6u1LlizJzTffnIqKipx00knNdC8AAAAAAACguJS39gBN4bHHHsttt92Wfv36pVu3bunYsWPee++9PP/886mtrc2QIUPyjW98Y/X61157LcOHD0///v0zceLE1du7dOmSK6+8MhdffHGGDRuW4447LltssUWeeOKJzJkzJz/4wQ+y8847t8ZdBAAAAAAAgDanJMrGAQMG5L333subb76Z6dOnZ9myZdlqq61y4IEH5uSTT87gwYMbnHXcccdl6623zq9+9as8+uijWbVqVXbffff80z/9U4455phmvBcAAAAAAABQXEqibOzfv3+j3ktxwIABmTlz5nr3Dxw4MAMHDmyK0QAAAAAAAKBklcR7NgIAAAAAAAAtT9kIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAURNkIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAURNkIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAURNkIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAURNkIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAUpLy1BwAAAKDlraqtSWVl53rX1FavyKLPqltoIgAAAIqRshEAAGAT1K68ItPHnFvvmr4jxydRNgIAALB+LqMKAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAURNkIAAAAAAAAFETZCAAAAAAAABRE2QgAAAAAAAAUpLy1BwAAANgYnbt0TMfNKupdU12zsoWmAQAAgE2LshEAAChqHTeryNCRd9a7ZtKYYS00DQAAAGxaXEYVAAAAAAAAKIiyEQAAAAAAACiIshEAAAAAAAAoiLIRAAAAAAAAKIiyEQAAAAAAACiIshEAAAAAAAAoSHlrD9AUFi1alKeeeirPPvtsZs2alXnz5qWioiK77757TjzxxJx00klp165hvWrv3r3Xu+/YY4/N2LFjm2psAAAAAAAAKGolUTb+/ve/z6hRo1JZWZkBAwakW7du+eSTT/Lkk0/m8ssvz/PPP58bb7wxZWVlDcrr3r17hgwZstb2L3/5y009OgAAAAAAABStkigbe/bsmV/96lc5/PDD1ziD8fvf/35OOeWUPP7443niiScyePDgBuV17949I0aMaK5xAQAAgCKzqrYmlZWd611TW70iiz6rbqGJAACgbSiJsnHgwIHr3F5ZWZnTTz89Y8eOzbRp0xpcNgIAAAD8rXblFZk+5tx61/QdOT6JshEAgE1LSZSN9Skv/+tdbN++fYNvs3jx4kyePDkLFixI586ds88++2TvvfdurhEBAAAAAACgKJV02VhbW5sHH3wwSXLIIYc0+HYzZszI5Zdfvsa2fffdNz/96U/To0ePgmbZZpstG7x2Q5dl2RiyWyZXdulkF+PMslsuV3bpZBfjzLJbNrsYZ5bdcrnFnN2cxy/Gz0kxztzc2a19/GLM3pReM8WaXYwzy27Z7GKcWXbL5counexinLmYsyltJV02Xn/99Zk1a1YOPfTQBpeN55xzTgYPHpyePXumvLw8s2bNyi9+8Yv88Y9/zFlnnZWHHnooW2yxRaNnWbCgKqtW1W1wXWVl58yfv6TR+Q0hu2VyZZdOdjHOLLvlcmWXTnYxziy7ZbOLceZNLbuh3xC3pZnbSnZDFHL8YvycFOPMG5PdlD9Ias7jN9ffB82Zvam8Zoo1uxhnlt2y2cU4s+yWy5VdOtnFOHNbylZK8j+VbNl4xx135Ne//nV23XXXXHfddQ2+3SWXXLLGx/vtt19uueWWDBs2LK+++momT56cs846q4mnBQAAoLl07tIxHTerqHdNdc3KNpcNAABQDEqybPzNb36Ta665Jrvttltuv/32bL311huV1759+5x00kl59dVXM336dGUjAABAEem4WUWGjryz3jWTxgxrc9kAAADFoOTKxgkTJuQnP/lJdt9990yYMCHbbLNNk+R27do1SbJ06dImyQMAAAAAAIBiV1Jl4y233JLrr78+ffr0ya9//euNPqPxb7322mtJkp122qnJMgEAAAAAAKCYtWvtAZrKL37xi1x//fXZa6+9MmHChHqLxmXLluWdd97J3Llz19g+c+bM1NTUrLV+2rRpmTBhQpLk+OOPb9K5AQAAAAAAoFiVxJmNv/vd7/Lzn/887du3z/7775+JEyeutaZPnz4ZNGhQkr+epTh8+PD0799/jbW33XZbnn322fTt2zc77rhj2rdvn7fffjtTpkxJkpx//vnZf//9W+ZOAQAAAAAAQBtXEmXjhx9+mCRZuXJlbr/99nWuGTJkyOqycX0GDRqUqqqqzJgxIy+88EJqamrStWvXHH300Rk6dGgGDhzY5LMDAAAAAABAsSqJsnHEiBEZMWJEg9cPGDAgM2fOXGv7oEGDNlhIAgAAAAAAAH9VMu/ZCAAAAAAAALQsZSMAAAAAAABQEGUjAAAAAAAAUJCSeM9GAAAA2o5VtTWprOxc75ra6hVZ9Fl1C00EAABAc1E2AgAA0KTalVdk+phz613Td+T4JMpGAACAYucyqgAAAAAAAEBBNurMxtmzZ2fhwoX50pe+lF133bWpZgIAAAAAAACKQKPPbKytrc24ceMycODAfO1rX8vQoUNzyy23rN7/0EMP5fTTT8+sWbOadFAAAAAAAACgbWlU2VhTU5N//Md/zC9/+ctUVVWlV69eqaurW2NN37598+c//zmPP/54kw4KAAAAAAAAtC2NKhsnTpyYqVOn5qCDDsozzzyThx9+eK013bt3zy677JIpU6Y02ZAAAAAAAABA29OosvGhhx5K165dc8MNN6SysnK963bbbbf813/910YPBwAAAAAAALRdjSob33///eyzzz7Zcsst613XqVOnLFy4cKMGAwAAAAAAANq2RpWN7do1bPm8efPSqVOnggYCAAAAAAAAikOjysaePXvmzTffTE1NzXrXVFVVZcaMGenVq9dGDwcAAAAAAAC0XY0qG48++ujMnz8/N9xww3rXjBs3LlVVVfna17620cMBAAAAAAAAbVd5YxYPHz48DzzwQH7961/njTfeyNFHH50k+eijj3Lffffl8ccfz/PPP59evXrltNNOa5aBAQAAAAAAgLahUWVjp06dctttt+Wiiy7K1KlTM23atCTJiy++mBdffDF1dXXZc88984tf/CIdOnRoloEBAAAAAACAtqFRZWOS7Ljjjrnnnnvy3HPP5fnnn88HH3yQlStXZscdd8whhxySo446KmVlZc0xKwAAAAAAANCGNKpsvOOOO7L55pvnlFNOyWGHHZbDDjusueYCAAAAAAAA2rh2jVk8evToPP300801CwAAAAAAAFBEGlU2br311unUqVNzzQIAAAAAAAAUkUZdRvWAAw7IK6+8kpUrV6Z9+/bNNRMAQJvXuUvHdNysot411TUrW2gaAAAAAGgdjSobL7roopx00km56qqrctlll2XzzTdvrrkAANq0jptVZOjIO+tdM2nMsBaaBgAAAABaR6PKxgcffDCHHHJIJk+enCeffDIHHnhgunXrls0222yttWVlZbnggguabFAAAAAAAACgbWlU2XjTTTelrKwsdXV1WbRoUR599NG11nyxX9kIAAAAAAAApa1RZeMFF1yQsrKy5poFAAAAAAAAKCKNKhtHjBjRXHMAAAAAAAAARaZdaw8AAAAAAAAAFKdGndn4t6qrq/Pmm29m3rx5SZLtt98+e+21Vzp06NBkwwEAAAAAAABtV6PLxurq6owbNy6TJk3K0qVL19jXqVOnDBs2LBdeeKHSEQAAAAAAAEpco8rG2tranHfeeZk2bVrq6uqy0047pUePHkmSDz74IB9++GH+7d/+La+99lrGjx+f8vKCT5wEAAAAAAAA2rhGtYF33XVXpk6dmi9/+cv50Y9+lP79+6+xf9q0abn66qszderU3H333fmHf/iHJh12Q/7jP/4jP//5z/PKK69k+fLl+bu/+7ucfvrpOe2001JWVtagjLq6utx999357W9/m3fffTcdO3ZM3759893vfjd9+vRp5nsAAAAAAAAAxaNRZeODDz6YLbbYIrfddlu23Xbbtfb3798/t912WwYPHpwHHnigRcvGl19+OWeffXbq6upyzDHHZLvttstzzz2XK6+8MjNnzsyVV17ZoJyrrroqd911V7p3756hQ4fm888/z6OPPppTTz01t912W/bff/9mvicAAACbns5dOqbjZhUbXFdds7IFpgEAAKChGlU2vvvuuxk4cOA6i8YvbLvttjnggAPypz/9aaOHa6ja2tr88z//c6qrq3PLLbfksMMOS5JcdNFFOfvsszNp0qQcd9xxGywKX3rppdx1113p2bNn7r333nTu3DlJMnTo0Jx66qn553/+5zz22GNp3759s98nANhU+OEyAEnScbOKDB155wbXTRozrAWmAQAAoKEaVTauWrWqQe/DWF5enlWrVhU8VGNNnTo177//fgYMGLC6aEySDh065KKLLsoZZ5yRu+++e4Nl4913350k+d//+3+vLhqTpE+fPvn617+e+++/P1OnTs2BBx7YPHcEADZBfrgMAAAAAMWrXWMW9+jRIy+99FKWLl263jVLly7NSy+9lB49emz0cA01bdq0JMnBBx+81r6+ffumU6dOq9c0JOeggw5aa98X2VOnTt2YUQEA2rxVtTWprOxc75+uW3Vo7TEBAAAAaAMadWbj4MGDc9NNN+Wiiy7Kv/zLv2THHXdcY//cuXNz5ZVXZtGiRRk6dGiTDlqf9957L0myyy67rLWvffv22WmnnTJr1qwsW7Ysm2+++Tozli5dmo8//jidOnVKZWXlWvu/yJ49e3YTTg4AlLIvSrv61FavyKLPqltoooZpV16R6WPOrXdN35Hjk7StuQEAAABoeWV1dXV1DV38+eef59RTT80777yTioqK9OvXLzvttFOS5IMPPshLL72U2tra9OrVK/fcc086derUbIP/rXPOOSdTpkzJbbfdts5LnJ5++ul59dVX8/zzz2e77bZbZ8a8efNy6KGHZvvtt88f/vCHtfa///77GTx4cA4++ODceuutBc1ZXbMyHSrqf7/HlTXVaV9R/5kCq2pr0q58zfe2KsbshuQ2Z3ZDcpszu1Qex+bMLobnSKl8ros122u9NLKL4bXenNml8jg2Z3YxPEdK5XPdnNnF8Dg2Z3apPI7Nme05UhqPY3NmexxLI9trvTQex+bM9hwpjcexObM9jqWR7bVeGo8jfKFRZzZuscUWmThxYkaNGpUnn3wyL7zwwhr7y8rKcvTRR2fUqFEtVjQWiwULqrLNNltu8D2pJo0Z1qAzCebPX7LGtsrKzkWX3ZDc5sxuSG5zZpfK49ic2cXwHCmVz3WxZnutl052Q1RWdm5Tz5GGqKzs3MDbLF/rdq39OLaluX09KI3s5nwcG6Ihf4esK7sYP9eNyW7O13oh2Q1RyNeDpsptzuy2+rW3LT1Hmja3ObPb3tf1tpRdDF/XmzO7VB7H5sz2HCmNx7E5sz2OpZHttV7cj+OGruLEpqdRZWOSbL311vn5z3+euXPn5uWXX868efOSJNtvv33233//dOvWrcmH3JAtt9wySbJkybr/0f/5558nSTp3Xv8L4It968uoqqraYAYAAAAAAABsShpdNn6hW7du+cY3vtGUsxRs1113TbLu91NcuXJlPvzww2y//fbrfb/GJOnUqVO22267fPzxx5k/f/5a79v4Rfa63hcSAAAAAAAANkXtWnuAptC/f/8kyR//+Me19k2fPj1Lly5dvaYhOVOmTFlr3xfZAwYM2JhRAQAAAAAAoGQ06szGhx9+ODfccENGjRqVQw45ZJ1r/vCHP+Sqq67KD37wgxxzzDFNMuSGDBgwID179szUqVPz3HPP5bDDDkuSVFdX58Ybb0ySnHbaaavXL1y4MIsWLUrXrl2z9dZbr95+2mmn5ZFHHsmvfvWrHHnkkasvmfrWW2/lkUceSc+ePZWNAAAAAAVavqImk8YMa+0xis6q2pr0HTm+3jW11StaaBoAgDU1umysqqrKAQccsN41BxxwQKqqqvLggw+2WNlYXl6eH//4xznnnHNywQUX5Nhjj01lZWWee+65vP322/nWt76Vfv36rV5/55135qabbsqFF16YESNGrN7ev3//fOtb38pdd92Vb37zmzn66KPz+eef59FHH02SXHPNNWnfvn2L3CegePnmGQAAYN2WLF6eJVm+wXWVlZ1bYJri0a68IvPnL2ntMQAA1qlRZeOsWbPSu3fvVFRUrHdNhw4d0rt378yaNWujh2uMfv365e677864cePy7//+71mxYkV69uyZUaNG5fTTT29wzpVXXpndd989d999dyZNmpTNNtss/fv3z3e/+93sueeezXgPgFLRkG+efeMMAAAAAEApaFTZuGDBguy///4bXFdZWZk///nPBQ9VqL322is333zzBteNGDFijTMa/1ZZWVmGDh2aoUOHNvV4AAAAAAAAUFLaNWbxFltskY8//niD6z755JNsvvnmBQ8FAAAAAAAAtH2NOrOxT58+efnllzN37tx069ZtnWvmzp2bV155Jfvuu2+TDAgAAABQrLynOwAApa5RZzYOGTIkNTU1Of/88zNnzpy19s+ZMycXXHBBamtrM2TIkCYbEgAAAKAYLVm8PPPnL6n3DwAAFLNGndl4/PHH55FHHskf/vCHDB48OAMGDMiuu+6aJHnvvfcyderU1NbW5uCDD84JJ5zQLAMDAAAAAAAAbUOjysaysrLcdNNNue666/Lb3/42U6ZMyZQpU/47rLw8w4YNyyWXXJKysrImHxYAAAAAAABoOxpVNiZJhw4d8qMf/Sjnn39+XnzxxcydOzdlZWXp1q1bBgwYkG222aY55gQAAAAAAADamEaXjV/YZpttctxxx63+uKqqKu+//37q6uqy7bbbNslwm6JVtTXpO3J8vWtqq1e00DQAAAAAAACwfo0qG//0pz/l8ccfz2mnnZY+ffqs3j558uRcc801WbFiRdq1a5dzzjknF198cZMPuyloV17hzeEBAAAAAAAoCo0qG++555489dRT+f73v7962+zZszNq1KisWrUqO++8c+bOnZvx48dnwIABOfjgg5t8YAAAAKDtWr6iJpPGDKt3TXXNyhaaBgAAaG6NKhvfeOON9OnTJ126dFm97YEHHsjKlStz+eWX5x/+4R8yczadIqoAACAASURBVObMnHTSSZk0aZKyEQAAADYxSxYvz5Isr3dNZWXnFpoGAABobu0as3jhwoXZYYcd1tj24osvZvPNN8+pp56aJOndu3f23XffzJw5s+mmBAAAAAAAANqcRp3ZuGrVqpSVla3+uKamJm+++Wb222+/dOjQYfX27bffPq+99lrTTQnQClbV1qTvyPH1rqmtXtFC0wAAAAAANA8/C2VjNKps3H777fPuu++u/vjll19OdXV1+vXrt8a65cuXp1OnTk0zIUAraVdekfnzl7T2GAAAAAAAzcrPQtkYjbqMav/+/fOf//mfufXWWzNjxozceOONKSsry+GHH77Gurfffnuty60CAAAAAAAApaVRZeO5556bjh075mc/+1mGDBmSP//5zznkkEOy1157rV4ze/bszJ49O3//93/f5MMCAAAAAAAAbUejLqO688475+67786ECROycOHC7L333jn33HPXWDNlypTsscceOeKII5p0UAAAAAAAAKBtaVTZmCS9e/fOT37yk/XuHzp0aIYOHbpRQwEAAAAAAABtX6PLRgAAAACgNKyqrUnfkePrXVNbvaKFpgEAipGyEQAAAAA2Ue3KKzJ//pLWHgMAKGLtWnsAAAAAAAAAoDg5sxEAAGgUl1sDAAAAvqBsBAAAGsXl1gAAAIAvuIwqAAAAAAAAUBBnNgIAAEAbtHxFTSaNGdbaYwAAANRL2QgAAABt0JLFy7Mky+tdU1nZuYWmAQAAWDeXUQUAAAAAAAAKomwEAAAAAAAACqJsBAAAAAAAAAriPRsBAAAAoB7LV9Rk0phhrT0GAECbpGwEAAAA2ryGlD3VNStbaBo2NUsWL8+SLK93TWVl5xaaBgCgbVE2AgDQpjmTACh2q2pr0nfk+HrX1FavaKFpipeyZ22+RrYtXusAwKZK2QgAQJvWkB8uJ5veD5iB4tGuvCLz5y9p7TEoQQrYtsVrHQDYVBV92Th9+vQ8/fTTmTp1aubMmZOqqqpst912GThwYL797W9nl112aXDWuHHjctNNN613/2OPPZbddtutKcYGAAAAAACAolf0ZeN3v/vdLFy4MPvuu2+OP/74lJeX59VXX829996bxx57LL/+9a+z7777NipzyJAh6d69+1rbu3bt2lRjAwAAAAAAQNEr+rLxzDPPzDe/+c1sv/32a2y/+eabM3bs2FxxxRV5+OGHG5U5ZMiQDBgwoCnHBAAAAAAAgJLTrrUH2Fjf/va31yoak+S8885Lx44dM2vWrCxatKgVJgMAAAAAAIDSVvRnNq5PWVlZ2rdvnySr/9tQ06dPz+uvv566urr06NEjBx54YLp06dIcYwIAAAAAAEDRKtmy8fe//30+//zzfPWrX210UXjjjTeu8XGnTp3y3e9+N2effXZTjggAAAAAAABFrSTLxg8++CBXX3112rdvn0suuaTBt9tjjz0yevTo9OvXL5WVlZk/f36eeeaZjBs3LqNHj06HDh0ybNiwgmbaZpstG7y2srJzQcdoKs15fNktkyu76bK9HmW35VzZxZFdrH+PFOvcrZldjDNvTLbnSNvJ3ZjstjhTMRzf14OmsSm91orh+LKbJrutzdMWslv7+MWYXYwzy265XNmlk90WZ27trwcUrzZRNh5xxBGZM2dOg9dfdNFFOf/889e5b8GCBTnvvPOycOHCXH755dlvv/0anHvUUUet8fFOO+2U4cOHp2fPnjnvvPPy85//PKeddlrKyxv/aVuwoKrBheP8+Usand+Ufwn8z+M3V3ZT/8VVjNkt9bku1uy28DgW8npsiEKPX4yPY3Nmt4XnSGNzZa87uyEKed0053OkISorOxft1/W2NndTHt9rvWmyC3k9NKXmPP6m9BxpqddaU2oLz9GW+nrQ0OyGKPSxbs65myO7ub/2FuvjWEj2pv51/X9mN0RbfP61hezGHr9Yvs9rzuy2+G+GtpTtcSyN7GJ5HJszuy0+jg39eqCU5H9qE2Vjjx490qFDhwav79q16zq3L1iwIGeeeWbee++9/PCHP8wZZ5zRJPMdeuih2WGHHfLRRx/lnXfeSe/evZskF6DYrKqtSd+R4+tdU1u9ooWmAQAAAACgtbWJsvH222/f6IyPP/44Z511Vt59991cccUVBV/udH26du2ajz76KMuWLWvSXIBi0q68otl+mxsAAAAAgOLTJsrGjfXRRx/lzDPPzOzZs3PVVVfltNNOa9L8qqqqvPvuu0mS7t27N2k2AACtZ/mKmkwa07S/pAYAAACwKSn6snHOnDkZPnx45s6dm2uvvTYnnnjiBm8zd+7cLFu2LN26dcvmm2+e5K+F4vz587PrrruusXbp0qX54Q9/mBUrVmTgwIGprKxslvsBAEDLW7J4eZZkeb1rvBcFAAAAwPoVfdl4xhlnZM6cOdlrr70yZ86cjBs3bq01Z555Zrp06bL640suuSTTpk3LHXfckQEDBiRJPv300xxzzDH5yle+kl69emXbbbfN/PnzM2XKlHz88cfp1q1bfvzjH7fY/QIAAAAAAKB4XHrppfnd736Xn/zkJw06Oa5UFH3ZOGfOnCTJm2++mTfffHOda4YMGbJG2bguX/rSlzJs2LC89tpree6557J48eJ06NAhu+yyS0477bSceeaZ6dzZb7UDAAAAAAAtb1VtTfqOHF/vmtrqFS00Dfy3oi8bZ86c2ejbTJw4ca1tW265ZX70ox81xUgAsNH845EN8RwBAACATUu78orMn7+ktceAtRR92QgAraU5yx7/eGRDPEcAAAAAaAvatfYAAFCsvih76vuz6LPq1h4TAAAAAIpW796907t37yTJ5MmTc8IJJ2SfffbJwQcfnKuvvjqff/55kuTTTz/Nj3/84xx++OH5yle+kmOPPTb333//OjP/8pe/ZPTo0TnxxBMzcODA7L333jnssMPygx/8ILNmzVrnbS699NL07t07999/f958882cf/75GThwYPbYY4889dRTG7wfv/3tb7Pnnnvm4IMPzn/8x3+s3r5q1ao8+OCDGT58ePr375+99947Rx55ZH784x/nk08+WSvn/vvvT+/evXPppZdmwYIFueKKK3L44Ydnr732yjXXXLPBOZqDMxsBgJK1fEVNJo0Z1tpjAAAAALCRrrvuuvzmN7/JgAED0q1bt0yfPj2/+c1v8u677+Zf//Vfc/rpp2fZsmXZb7/98sknn+Tll1/OZZddlnbt2uWEE05YI2vs2LF56aWX0qtXr3z1q19N+/bt8/bbb+fhhx/Ok08+mfHjx6dfv37rnGP69Om54oor0r179wwcODCLFi1KeXn9dduNN96YX/7yl+nZs2duvfXW7LTTTkmSmpqaXHTRRXn66afTqVOn7L333vnSl76Ut956KxMnTswTTzyRO++8Mz169Fgrc+HChTn55JOzfPny7L///qmrq0uXLl0K/OxuHGUjAGxiNqX3+luyeHmWZHm9ayorO7fQNAAAAAAU6uGHH85DDz2UXXfdNUkyb968nHDCCXnhhRdyxhlnZK+99sro0aPToUOHJMndd9+dK6+8MuPGjVurbDznnHNy/fXXZ5tttllj++TJk3P55ZfniiuuyGOPPZaysrK15rj33nszYsSIXHDBBevc/7dqa2tz5ZVX5t57781Xv/rV3Hzzzenatevq/WPHjs3TTz+dAw88MGPGjEllZWWSv57teOONN+bmm2/OpZdemjvvvHOt7Oeeey6HHXZYbrjhhnTq1KkBn8Hmo2wEgHVoyBlx1TUrW2iapuW9/gAAAAAoNhdddNHqojFJtt9++xx//PG5/fbb81//9V+ZOHHi6qIxSU455ZSMHTs2H374YebMmZPu3buv3nfooYeu8xinnHJK7rvvvrz66qv5z//8z3z5y19ea81uu+2W888/f4NF49KlS/O9730vzz33XP7X//pfGTt2bDbffPPV+xctWpTf/OY32WqrrfKv//qva5SQ7dq1y0UXXZRnn302L7/8cmbMmJE99thjjfyKioqMGjWq1YvGRNkIAOvkjDgAmptLPQMAQOnZlK4o1dIOOuigtbbtvPPOSZK99tprjbIuSdq3b5/u3bvn008/zccff7xG2ZgkCxYsyDPPPJN33nknS5YsycqVfz2x4Iv3SXz//ffXWTYeccQRadeuXb2zLly4MMOHD8/rr7+eU089NaNGjUr79u3XWDNt2rSsWLEihx9++FqzJ38tHPv27ZsZM2bkL3/5y1pl45577plu3brVO0dLUTYCAAAlryHf8Cct+01/Q36xZZuuHQv6QUUpn6EPbBr8oBaKn1+sYlPlilLNZ4cddlhr2xdn9a1rX5JsscUWSZLq6uo1tt9555257rrrsmLF+v89UVVVtc7tDSn4xo4dm9ra2hx77LG5+uqr17nmgw8+SJI8/vjj6d27d715CxcuLGiOlqJsBAAAVivVkqpYv+EvdG5n6G86FDKUqmL9exv4b/49AjS1+s4m3NCZhn/rtddey9VXX53y8vJcdtllOfzww7PDDjukY8eOSZKLL744jzzySOrq6tZ5+y/W1Wfw4MF58skn8+STT+app57KoEGD1lqzatWqJEmvXr3yla98pd68dZ1h2ZA5WoqyEQAAWM0PhaC4KGQAAKBxnnjiidTV1eWMM87IWWedtdb+2bNnb/QxDj744Jx00kk5//zz873vfS8/+9nP8rWvfW2NNV+cjbnnnntm9OjRG33M1qRsBCBJ6Z7JAgAbw+W/AAAASstnn32WZN2XXn3nnXfy1ltvNclxDjrooNxyyy35zne+k4svvji1tbX5+te/vnr/wIEDU1FRkeeffz6ff/756ku+FiNlIwBJnMlC03Apt7bPLxZA4/j6CAAAUFr+7u/+Lkny4IMP5uSTT15d8i1cuDA//OEPU1tb22THGjBgQMaPH5/zzjsv//RP/5Ta2tqccMIJSZLKysqcfvrpmThxYi688ML8y7/8S3r06LHG7RcvXpzHHnssJ598csrL226l13YnA4ANcLZJ2+NSbm2f4gSanl+0AAAAKB4nnnhiJkyYkDfffDNHHXVU+vbtm5qamkybNi3bbbddBg0alKeeeqrJjte3b9/cdtttOffcc3PZZZelpqYmp5xySpJk5MiRmTdvXp544okcc8wx6dOnT7p3755Vq1blww8/zMyZM1NbW5shQ4YoGwGgOShNAGgL/KIFAABA8dhqq61y7733ZuzYsXnxxRfz7LPPprKyMieffHIuvPDCXHvttU1+zH322ScTJkzIOeeckx/96EepqanJ0KFD06FDh4wbNy5PPvlk7rvvvrz++ut56623suWWW2a77bbLySefnEGDBmWzzTZr8pmakrIRAAAAAACANmnmzJnr3XfiiSfmxBNPXO/+iRMnrnN7ZWXlekvF0aNHZ/To0Q3e3tA1e+21V6ZOnbrOfUcddVSOOuqoerO/sKH73BratfYAAAAAAAAAQHFSNgIAAAAAAAAFcRlVAAAAYJO2fEVNJo0ZVu+a6pqVLTQNAAAUF2UjAAAAsElbsnh5lmR5vWsqKzu30DQAbKxVtTXpO3L8BtfVVq9ogWkASp+yEQAAAACAktGuvCLz5y9p7TEANhnKRgAAoNk15BKFALApchlfAKDYKRsBWkFDLufhUh4AlJKGXKIwcZlCADY9LuMLfMHPi4BipWwE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t6XPQ6lINpqYmEBbW1tweX19/XyfCwgIAAA4Ozt/cr2krKysULt2bTx9+hT3799H06ZNiyw2ERERERERERERERERUVlVKpKNvr6+RRInISEB58+fh4GBAXr27FkkMaX09fXx9OlTpKenF2lcog9lZL5TuiVo1rv3xVQbIiIiIiIiIiIiIiKigpWKZGNRCQoKQk5ODhwcHKClpVVkcdPS0vDgwQMAUHlrViJVpL7OQCoyCizDJepERERERERERERERFRalJtkY05ODvbs2QORSAQnJ6cCyyYkJCA9PR1169ZFxYoVAeQmFF+8eAEzMzO5sm/fvsX8+fORmZmJzp07o2bNmmr7HYhInpCVngBXexIRERERERERERERlZRyk2w8c+YMnjx5AktLS9SvX7/AsnPmzEFERAT8/PxgaWkJAEhJSUH//v3RsmVLNGrUCAYGBnjx4gXOnTuH58+fo27duvj555+L41chov8nZKUnwNWeREREREREREREREQlpdwkGwMDAwFA6arG/FSrVg0uLi64fv06wsLC8Pr1a2hra6N+/foYPnw4Ro0ahSpVmNAgIiIiIiIiIiIiIiIikio3yUZPT0/BZbdt26bwmK6uLhYuXFiUVSIiIiIiIiIiIiIiIiIq1zRKugJEREREREREREREREREVDYx2UhEREREREREREREREREhcJkIxEREREREREREREREREVCpONRERERERERERERERERFQoTDYSERERERERERERERERUaEw2UhEREREREREREREREREhcJkIxEREREREREREREREREVCpONRERERERERERERERERFQoTDYSERERERERERERERERUaEw2UhEREREREREREREREREhSIu6Qp8LjQ0RGopq856fA6xy2KdGbt4Y5fFOjN28cVl7PITuyzWmbGLN3ZZrDNjF19cxi4/sctinRm7+OIydvmJXRbrzNjFG7ss1pmxiy8uY5ef2GWxzmU5NpVvIolEIinpShARERERERERERERERFR2cNtVImIiIiIiIiIiIiIiIioUJhsJCIiIiIiIiIiIiIiIqJCYbKRiIiIiIiIiIiIiIiIiAqFyUYiIiIiIiIiIiIiIiIiKhQmG4mIiIiIiIiIiIiIiIioUJhsJCIiIiIiIiIiIiIiIqJCYbKRiIiIiIiIiIiIiIiIiAqFyUYiIiIi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YqIsFku9cz7//HOtXbtWVqtVV69elZeXlwYNGqQpU6aod+/ezX6NAAAAAIDmRbERAAAAwCOnW7duev755/Xxxx9Lkp5//vk6Y+x2u2bOnKns7Gy5u7tryJAhslgsslqtWrNmjbKzs7V27Vp17979vp937NgxJSQk6Pr161q6dGmtotwnn3yiOXPmyGazKTQ0VP369dPFixe1f/9+5ebmat68eXrxxRfrPW9qaqrWrFmjQYMGKTo6WoWFhdqxY4esVqu2bt2qTp06NfEO1W///v1avHix/P391b17d4WHh6usrEwFBQXKz8/X0aNHNW/evHrn2mw2TZgwQcXFxYqKilJYWJgOHz6s9957T//85z+1YcMGeXp61prz5z//WampqTIMQ3369NHAgQN19uxZbd++XZ999plWrlypmJiYZr1GAAAAAEDzotgIAAAA4JEzaNAgDRo0yFFsXLJkSZ0xGzduVHZ2trp27VqrqFhVVaXZs2dr27ZtmjVrljIzMxv8rD179iglJUWGYWjVqlX66U9/6ugrKirSnDlz5OHhodWrV+vJJ5909BUWFio+Pl4LFy7UkCFD1KNHjzrnzszM1JYtW9SrVy9J0o0bN/Tb3/5WR48e1caNG5WcnPzgN6cBffr0UWZmpvr161er/cyZM5owYYI++OAD/epXv1J4eHiduQUFBQoODlZOTo58fX0lSVevXtWrr76qL774QitXrqy12nTPnj1avny5/P39lZ6errCwMEff7t279frrr+uNN97Qrl271LFjx2a9TgAAAABA82HPRgAAAACPpb/+9a+SpJkzZ9Zaveju7q558+bpiSee0LFjx5Sfn3/Pc2RmZioxMVHt27fX+vXraxUaJSkjI0M2m02zZ8+uVWiUpPDwcCUmJspms2nTpk31nn/atGmOQqMkeXp6atKkSZKkw4cPP9gFN0JwcHCdQqN0Z6Xo1KlTJUk7duy45/w333zTUWiUpI4dO2ru3LmSpM2bN+vWrVuOvvT0dEnS4sWLaxUaJSkmJkYvvviirl27pr///e9NvyAAAAAAwEPHykYAAAAAj53S0lKdO3dObm5u+vnPf16nv0OHDho+fLi2bNmivLw8DRo0qM6Y9PR0paWlKTAwUH/5y1/0k5/8pFZ/TU2N9u/frzZt2mjEiBH15rh73qNHj9bbP2zYsDptQUFBkqSLFy82fJFNZLPZdPDgQR09elTl5eWy2Wyy2+26dOmSpDt7U9bHy8tL0dHRddr79++v7t276/Tp0zp+/LgGDhyo7777Tl988YU6depU756V0p17s379+nveGwAAAACAc6DYCAAAAOCxU1ZWJkny9/dXmzZt6h1zt3h4d+z3Wa1WHTlyRBaLRRs2bKi1mu+uq1ev6vr165JUb7Hy+7777rt627t27Vqn7e6+hzabrcFzNsXJkyeVmJh4z4KiJMc1/ZC/v/895wQEBOj06dOOe3nu3DlJ0pUrVxQaGtpgpnvdGwAAAACAc6DYCAAAAAAPqGfPnnJxcdGJEye0dOlSLV26tE7Rsrq6WpLk5uam0aNHN3i+Tp061dvu4tKyO19Mnz5dJSUleu655xQfH6+goCBZLBa1adNG+/fv1+TJk5vlc2pqaiTdec3qM8880+DY+vayBAAAAAA4D4qNAAAAAB47fn5+kqQLFy6ourq63tWNZ8+erTX2+zp06KD09HRNnjxZW7du1e3bt7Vs2TK5uv73K1anTp3Utm1b3b59WwsWLJC7u/tDuprmcfLkSX377bfy8fHRypUr69yT06dPNzj/woUL9+w7f/68JKlz586S/rti08PDQ0uWLPlfYgMAAAAATNayj8kCAAAAQAtyc3OTJN2+fbtWe5cuXfTjH/9YNptN//jHP+rMu3btmnbt2iVJioyMrPfcXl5eev/99zVgwABlZ2dr+vTpqqqqcvS7urpq6NChqq6udpzLmVVUVEiSfH196y2+fvrpp/edn5ubW6f92LFjOn36tNq3b6+wsDBJdwq4vXr1UmlpKXsyAgAAAEArR7ERAAAAwCPr7kq6kydP1umbOHGiJCk1NVVnzpxxtFdVVWnBggWqrKxUv379Gtxv0WKx6L333lNkZKR27dql119/vVbBMTExUa6urpo/f369Bcfq6modOnRIhYWFTb3EZhMYGCgXFxd9++23ys/Pd7Tb7XZlZGTUaruXP/zhDyovL3ccV1ZWauHChZKkX//612rXrp2jb9q0aZKkmTNn6siRI3XOVVVVpd27d9f7bwcAAAAAcB68RhUAAADAI2v48OF6//33NXHiREVFRal9+/aSpIULF+qll15Sfn6+tm/frtGjR2vIkCGyWCyyWq0qLS1Vly5dtGzZsvt+hqenp1avXq2pU6dqz549mjp1qt555x15eHioX79+Wrx4sebMmaOkpCR169ZNPXr0kMViUXl5uYqKilRRUaHf//73Cg8Pf9i3o0He3t6Ki4vTBx98oFdeeUWDBw+Wt7e3jh8/rrNnz2rSpElas2bNPeeHh4erurpaI0aMUFRUlFxdXXX48GFdvXpVoaGhSklJqTV++PDhmjVrllJTUzV+/Hj17NlTgYGBatu2rcrKynTixAndvHlTq1evVnBw8MO+fAAAAABAE1FsBAAAAPDImjFjhgzD0M6dO7Vz507ZbDZJd4qNLi4uWrFihYYNG6aPPvpIn3/+uaqqquTv769JkyYpPj5e3t7ejfqcdu3a6d1331VSUpL27dun1157TRkZGWrXrp1++ctfql+/flq7dq0OHjyoQ4cOycXFRb6+voqIiFBMTIxGjBjxMG9Do82dO1c9e/bUpk2bVFhYqLZt2yo8PFxLlixRVVVVg8VGd3d3ZWRkaOXKlcrJydGlS5fk4+OjF154QUlJSbJYLHXmxMfHa+jQoVq/fr2OHDmi3Nxcubu7y9fXV8OGDdOzzz7b4MpSAAAAAID5DLvdbjc7BAAAAAAAAAAAAIDWhz0bAQAAAAAAAAAAADQJxUYAAAAAAAAAAAAATcKejQAAAADQiu3atUu7du1q1NgePXooISHhIScCAAAAADxOKDYCAAAAQCtWVFSkjz/+uFFjBw8eTLERAAAAANCsDLvdbjc7BAAAAAAAAAAAAIDWhz0bAQAAAAAAAAAAADQJxUYAAAAAAAAAAAAATUKxEQAAAAAAAAAAAECTUGwEAAAAAAAAAAAA0CQUGwEAAAAAAAAAAAA0yf8BlBQkFul9dVYAAAAASUVORK5CYII=\n", - "text/plain": [ - "
" - ] - }, - "metadata": {} - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -1932,7 +654,7 @@ "id": "8UyBYNmeegGf" }, "source": [ - "### 5. More Examples" + "### 4. More Examples" ] }, { @@ -1950,31 +672,17 @@ "id": "rH8NbBlsfxZ_" }, "source": [ - "def answer_question(question, answer_text):\n", - " '''\n", - " Takes a `question` string and an `answer_text` string (which contains the\n", - " answer), and identifies the words within the `answer_text` that are the\n", - " answer. Prints them out.\n", - " '''\n", + "def answer_question(question, context):\n", " # ======== Tokenize ========\n", " # Apply the tokenizer to the input text, treating them as a text-pair.\n", - " inputs = tokenizer(question, answer_text, return_tensors='pt')\n", - " input_ids = tokenizer.encode(question, answer_text)\n", - "\n", - " start_positions = torch.tensor([1])\n", - " end_positions = torch.tensor([3])\n", - "\n", - "\n", - " # Report how long the input sequence is.\n", - " # print('Query has {:,} tokens.\\n'.format(len(input_ids)))\n", + " inputs = tokenizer(question, context, return_tensors='pt')\n", + " input_ids = inputs.input_ids.numpy().flatten()\n", "\n", " # ======== Evaluate ========\n", " # Run our example question through the model.\n", - " outputs = model(**inputs, start_positions=start_positions, end_positions=end_positions)\n", - "\n", + " outputs = model(**inputs)\n", " start_scores = outputs.start_logits\n", " end_scores = outputs.end_logits\n", - " # token_type_ids=torch.tensor([segment_ids])) # The segment IDs to differentiate question from answer_text\n", "\n", " # ======== Reconstruct Answer ========\n", " # Find the tokens with the highest `start` and `end` scores.\n", @@ -1982,26 +690,13 @@ " answer_end = torch.argmax(end_scores)\n", "\n", " # Get the string versions of the input tokens.\n", - " tokens = tokenizer.convert_ids_to_tokens(input_ids)\n", - "\n", - " # Start with the first token.\n", - " answer = tokens[answer_start]\n", - "\n", - " # Select the remaining answer tokens and join them with whitespace.\n", - " for i in range(answer_start + 1, answer_end + 1):\n", - " \n", - " # If it's a subword token, then recombine it with the previous token.\n", - " if tokens[i][0:2] == '##':\n", - " answer += tokens[i][2:]\n", - " \n", - " # Otherwise, add a space then the token.\n", - " else:\n", - " answer += ' ' + tokens[i]\n", - "\n", - " print('Answer: \"' + answer + '\"')\n", + " token_ids = input_ids[answer_start : answer_end + 1]\n", + " tokens = tokenizer.convert_ids_to_tokens(token_ids)\n", + " answer = tokenizer.convert_tokens_to_string(tokens)\n", + "\n", " return answer" ], - "execution_count": 34, + "execution_count": null, "outputs": [] }, { @@ -2016,80 +711,50 @@ { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "y4VPq6FdjxyX", - "outputId": "e2991979-0599-43fd-ab82-10d9795018e9" - }, - "source": [ - "import textwrap\n", - "\n", - "# Wrap text to 80 characters.\n", - "wrapper = textwrap.TextWrapper(width=80) \n", - "\n", - "bert_abstract = \"We introduce a new language representation model called BERT, which stands for Bidirectional Encoder Representations from Transformers. Unlike recent language representation models (Peters et al., 2018a; Radford et al., 2018), BERT is designed to pretrain deep bidirectional representations from unlabeled text by jointly conditioning on both left and right context in all layers. As a result, the pre-trained BERT model can be finetuned with just one additional output layer to create state-of-the-art models for a wide range of tasks, such as question answering and language inference, without substantial taskspecific architecture modifications. BERT is conceptually simple and empirically powerful. It obtains new state-of-the-art results on eleven natural language processing tasks, including pushing the GLUE score to 80.5% (7.7% point absolute improvement), MultiNLI accuracy to 86.7% (4.6% absolute improvement), SQuAD v1.1 question answering Test F1 to 93.2 (1.5 point absolute improvement) and SQuAD v2.0 Test F1 to 83.1 (5.1 point absolute improvement).\"\n", - "\n", - "print(wrapper.fill(bert_abstract))" + "id": "mqfBGgc8AKk2" + }, + "source": [ + "bert_abstract = (\n", + " 'We introduce a new language representation model called BERT, which stands for '\n", + " 'Bidirectional Encoder Representations from Transformers. Unlike recent language '\n", + " 'representation models (Peters et al., 2018a; Radford et al., 2018), BERT is '\n", + " 'designed to pretrain deep bidirectional representations from unlabeled text by '\n", + " 'jointly conditioning on both left and right context in all layers. As a result, '\n", + " 'the pre-trained BERT model can be finetuned with just one additional output '\n", + " 'layer to create state-of-the-art models for a wide range of tasks, such as '\n", + " 'question answering and language inference, without substantial taskspecific '\n", + " 'architecture modifications. BERT is conceptually simple and empirically '\n", + " 'powerful. It obtains new state-of-the-art results on eleven natural language '\n", + " 'processing tasks, including pushing the GLUE score to 80.5% (7.7% point absolute '\n", + " 'improvement), MultiNLI accuracy to 86.7% (4.6% absolute improvement), SQuAD v1.1 '\n", + " 'question answering Test F1 to 93.2 (1.5 point absolute improvement) and SQuAD '\n", + " 'v2.0 Test F1 to 83.1 (5.1 point absolute improvement).'\n", + ")" ], - "execution_count": 35, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "We introduce a new language representation model called BERT, which stands for\n", - "Bidirectional Encoder Representations from Transformers. Unlike recent language\n", - "representation models (Peters et al., 2018a; Radford et al., 2018), BERT is\n", - "designed to pretrain deep bidirectional representations from unlabeled text by\n", - "jointly conditioning on both left and right context in all layers. As a result,\n", - "the pre-trained BERT model can be finetuned with just one additional output\n", - "layer to create state-of-the-art models for a wide range of tasks, such as\n", - "question answering and language inference, without substantial taskspecific\n", - "architecture modifications. BERT is conceptually simple and empirically\n", - "powerful. It obtains new state-of-the-art results on eleven natural language\n", - "processing tasks, including pushing the GLUE score to 80.5% (7.7% point absolute\n", - "improvement), MultiNLI accuracy to 86.7% (4.6% absolute improvement), SQuAD v1.1\n", - "question answering Test F1 to 93.2 (1.5 point absolute improvement) and SQuAD\n", - "v2.0 Test F1 to 83.1 (5.1 point absolute improvement).\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", "metadata": { - "id": "tEB654YCknYv" + "id": "ay_mwbBJAP87" }, "source": [ - "-----------------------------\n", - "Ask BERT what its name stands for (the answer is in the first sentence of the abstract)." + "Let's ask BERT what its name stands for (the answer is in the first sentence of the abstract)." ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "wfntqRCBegGj", - "outputId": "92f2877e-5f6f-41a9-b268-cd86ca69ebca" + "id": "y4VPq6FdjxyX" }, "source": [ "question = \"What does the 'B' in BERT stand for?\"\n", - "\n", - "ans = answer_question(question, bert_abstract)" + "answer = answer_question(question, bert_abstract)\n", + "print(f'Answer: \"{answer}\"')" ], - "execution_count": 36, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"bidirectional encoder representations from transformers\"\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -2097,8 +762,7 @@ "id": "B6HcijzxkTO9" }, "source": [ - "---------------------\n", - "Ask BERT about example applications of itself :)\n", + "Let's ask BERT about example applications of itself :)\n", "\n", "The answer to the question comes from this passage from the abstract: \n", "\n", @@ -2111,27 +775,15 @@ { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "MVNVGN5-gI06", - "outputId": "5f001a04-862d-4b8b-d7ba-b75ff259a141" + "id": "MVNVGN5-gI06" }, "source": [ "question = \"What are some example applications of BERT?\"\n", - "\n", - "ans = answer_question(question, bert_abstract)" + "answer = answer_question(question, bert_abstract)\n", + "print(f'Answer: \"{answer}\"')" ], - "execution_count": 37, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"question answering and language inference\"\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -2139,145 +791,30 @@ "id": "WXAJ2wkV7rRl" }, "source": [ - "### Part 3. RuBERT for question answering.\n", - "Here we will use the model pre-trained on the SberQuAD dataset from the [SDSJ-2017 challenge problem B](https://github.com/sberbank-ai/data-science-journey-2017/tree/master/problem_B)." + "## Part 3. RuBERT for question answering." ] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "3JslS5CG7rRl" + "id": "TcnPsGzEbGL6" }, "source": [ - "from deeppavlov import build_model, configs" - ], - "execution_count": 38, - "outputs": [] + "Here we will use the model pre-trained on the SberQuAD dataset from the [SDSJ-2017 challenge problem B](https://github.com/sberbank-ai/data-science-journey-2017/tree/master/problem_B)." + ] }, { "cell_type": "code", "metadata": { - "id": "eUQ7oNQq7rRl", - "outputId": "8f86904e-238b-475c-a6b4-d29f166e6a9b", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "3JslS5CG7rRl" }, "source": [ + "from deeppavlov import build_model, configs\n", + "\n", "model_ru = build_model(configs.squad.squad_ru_rubert, download=False)" ], - "execution_count": 39, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "[nltk_data] Downloading package punkt to /root/nltk_data...\n", - "[nltk_data] Unzipping tokenizers/punkt.zip.\n", - "[nltk_data] Downloading package stopwords to /root/nltk_data...\n", - "[nltk_data] Unzipping corpora/stopwords.zip.\n", - "[nltk_data] Downloading package perluniprops to /root/nltk_data...\n", - "[nltk_data] Unzipping misc/perluniprops.zip.\n", - "[nltk_data] Downloading package nonbreaking_prefixes to\n", - "[nltk_data] /root/nltk_data...\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/tokenization.py:125: The name tf.gfile.GFile is deprecated. Please use tf.io.gfile.GFile instead.\n", - "\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "[nltk_data] Unzipping corpora/nonbreaking_prefixes.zip.\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:37: The name tf.Session is deprecated. Please use tf.compat.v1.Session instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:222: The name tf.placeholder is deprecated. Please use tf.compat.v1.placeholder instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:222: The name tf.train.Optimizer is deprecated. Please use tf.compat.v1.train.Optimizer instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:193: The name tf.train.AdamOptimizer is deprecated. Please use tf.compat.v1.train.AdamOptimizer instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:81: The name tf.ConfigProto is deprecated. Please use tf.compat.v1.ConfigProto instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:178: The name tf.placeholder_with_default is deprecated. Please use tf.compat.v1.placeholder_with_default instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:178: The name tf.variable_scope is deprecated. Please use tf.compat.v1.variable_scope instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:418: The name tf.get_variable is deprecated. Please use tf.compat.v1.get_variable instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:499: The name tf.assert_less_equal is deprecated. Please use tf.compat.v1.assert_less_equal instead.\n", - "\n", - "WARNING:tensorflow:\n", - "The TensorFlow contrib module will not be included in TensorFlow 2.0.\n", - "For more information, please see:\n", - " * https://github.com/tensorflow/community/blob/master/rfcs/20180907-contrib-sunset.md\n", - " * https://github.com/tensorflow/addons\n", - " * https://github.com/tensorflow/io (for I/O related ops)\n", - "If you depend on functionality not listed there, please file an issue.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:366: calling dropout (from tensorflow.python.ops.nn_ops) with keep_prob is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use `rate` instead of `keep_prob`. Rate should be set to `rate = 1 - keep_prob`.\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:680: dense (from tensorflow.python.layers.core) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use keras.layers.Dense instead.\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/tensorflow_core/python/layers/core.py:187: Layer.apply (from tensorflow.python.keras.engine.base_layer) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Please use `layer.__call__` method instead.\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/bert_dp/modeling.py:283: The name tf.erf is deprecated. Please use tf.math.erf instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:154: The name tf.matrix_band_part is deprecated. Please use tf.linalg.band_part instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:166: softmax_cross_entropy_with_logits (from tensorflow.python.ops.nn_ops) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "\n", - "Future major versions of TensorFlow will allow gradients to flow\n", - "into the labels input on backprop by default.\n", - "\n", - "See `tf.nn.softmax_cross_entropy_with_logits_v2`.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:234: The name tf.train.AdadeltaOptimizer is deprecated. Please use tf.compat.v1.train.AdadeltaOptimizer instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:127: The name tf.get_collection is deprecated. Please use tf.compat.v1.get_collection instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:127: The name tf.GraphKeys is deprecated. Please use tf.compat.v1.GraphKeys instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:89: The name tf.global_variables_initializer is deprecated. Please use tf.compat.v1.global_variables_initializer instead.\n", - "\n", - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/models/bert/bert_squad.py:94: checkpoint_exists (from tensorflow.python.training.checkpoint_management) is deprecated and will be removed in a future version.\n", - "Instructions for updating:\n", - "Use standard file APIs to check for files with this prefix.\n" - ] - }, - { - "output_type": "stream", - "name": "stderr", - "text": [ - "2021-10-14 22:46:59.972 INFO in 'deeppavlov.core.models.tf_model'['tf_model'] at line 51: [loading model from /root/.deeppavlov/models/squad_ru_bert/model_rubert]\n" - ] - }, - { - "output_type": "stream", - "name": "stdout", - "text": [ - "WARNING:tensorflow:From /usr/local/lib/python3.7/dist-packages/deeppavlov/core/models/tf_model.py:54: The name tf.train.Saver is deprecated. Please use tf.compat.v1.train.Saver instead.\n", - "\n", - "INFO:tensorflow:Restoring parameters from /root/.deeppavlov/models/squad_ru_bert/model_rubert\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", @@ -2294,209 +831,148 @@ "id": "l5pDyTRL7rRl" }, "source": [ - "text = \"\"\"Первая многоразовая ступень ракеты-носителя Falcon 9 успешно отделилась через две с половиной минуты после старта и автоматически приземлилась на плавучую платформу Of Course I Still Love You у берегов Флориды. Через 12 минут после запуска космический корабль Crew Dragon вышел на расчетную орбиту и отделился от второй ступени ракеты.\n", - "\n", - "Сближение корабля Crew Dragon с Международной космической станцией запланировано на 31 мая. К стыковочному адаптеру на узловом модуле «Гармония» американского сегмента МКС Crew Dragon должен причалить в ручном или, при необходимости, в автоматическом режиме. Эта процедура запланирована на 10:29 по времени Восточного побережья США (17:29 по московскому времени).\n", - "\n", - "В испытательном полете DM2 астронавт Херли является командиром космического корабля (spacecraft commander), а его напарник Бенкен — командир по операциям стыковки и расстыковки (joint operations commander). Фактически это означает, что именно Херли управляет Crew Dragon в полете к МКС, к которой они должны пристыковаться в течение суток после старта. Херли и Бенкен также будут выполнять необходимые для сертификации НАСА проверки систем корабля в полете.\n", - "\n", - "Во время полета Херли и Бенкен провели небольшую экскурсию по Crew Dragon.\"\"\"\n", - "\n", - "# Source: https://habr.com/ru/news/t/504642/" + "context = (\n", + " 'Первая многоразовая ступень ракеты-носителя Falcon 9 успешно отделилась через две с половиной '\n", + " 'минуты после старта и автоматически приземлилась на плавучую платформу Of Course I Still '\n", + " 'Love You у берегов Флориды. Через 12 минут после запуска космический корабль Crew Dragon '\n", + " 'вышел на расчетную орбиту и отделился от второй ступени ракеты.'\n", + " '\\n\\n'\n", + " 'Сближение корабля Crew Dragon с Международной космической станцией запланировано на 31 мая. '\n", + " 'К стыковочному адаптеру на узловом модуле «Гармония» американского сегмента МКС Crew Dragon '\n", + " 'должен причалить в ручном или, при необходимости, в автоматическом режиме. Эта процедура '\n", + " 'запланирована на 10:29 по времени Восточного побережья США (17:29 по московскому времени).'\n", + " '\\n\\n'\n", + " 'В испытательном полете DM2 астронавт Херли является командиром космического корабля (spacecraft '\n", + " 'commander), а его напарник Бенкен — командир по операциям стыковки и расстыковки (joint '\n", + " 'operations commander). Фактически это означает, что именно Херли управляет Crew Dragon в '\n", + " 'полете к МКС, к которой они должны пристыковаться в течение суток после старта. Херли и Бенкен '\n", + " 'также будут выполнять необходимые для сертификации НАСА проверки систем корабля в полете.'\n", + " '\\n\\n'\n", + " 'Во время полета Херли и Бенкен провели небольшую экскурсию по Crew Dragon.'\n", + ")" ], - "execution_count": 40, + "execution_count": null, "outputs": [] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "e9Llg3Jb7rRm", - "outputId": "7d49cc67-8868-4fa4-89cb-33a236b1b0d4", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "5tVX9PJ_GPE-" }, "source": [ - "print(text)" - ], - "execution_count": 41, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Первая многоразовая ступень ракеты-носителя Falcon 9 успешно отделилась через две с половиной минуты после старта и автоматически приземлилась на плавучую платформу Of Course I Still Love You у берегов Флориды. Через 12 минут после запуска космический корабль Crew Dragon вышел на расчетную орбиту и отделился от второй ступени ракеты.\n", - "\n", - "Сближение корабля Crew Dragon с Международной космической станцией запланировано на 31 мая. К стыковочному адаптеру на узловом модуле «Гармония» американского сегмента МКС Crew Dragon должен причалить в ручном или, при необходимости, в автоматическом режиме. Эта процедура запланирована на 10:29 по времени Восточного побережья США (17:29 по московскому времени).\n", - "\n", - "В испытательном полете DM2 астронавт Херли является командиром космического корабля (spacecraft commander), а его напарник Бенкен — командир по операциям стыковки и расстыковки (joint operations commander). Фактически это означает, что именно Херли управляет Crew Dragon в полете к МКС, к которой они должны пристыковаться в течение суток после старта. Херли и Бенкен также будут выполнять необходимые для сертификации НАСА проверки систем корабля в полете.\n", - "\n", - "Во время полета Херли и Бенкен провели небольшую экскурсию по Crew Dragon.\n" - ] - } + "And here is how to use deeppavlov's model:" ] }, { "cell_type": "code", "metadata": { - "id": "a8SNVPlk7rRm", - "outputId": "ec147003-7b0c-48ec-c252-3f9c08a63c3d", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "05BDo1IjGFPG" }, "source": [ - "model_ru([text], ['Когда отделилась первая ступень?'])" + "question = 'Когда отделилась первая ступень?'\n", + "model_ru([context], [question])" ], - "execution_count": 42, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[['через две с половиной минуты после старта'], [72], [2055731.625]]" - ] - }, - "metadata": {}, - "execution_count": 42 - } - ] + "execution_count": null, + "outputs": [] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "98PIvy4g7rRm", - "outputId": "3fab7b6e-31b8-4704-9bb6-e3a2ff1b63ff", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "yyRAYAc_GxAL" }, "source": [ - "model_ru([text], ['На какую дату запланирована стыковка?'])" - ], - "execution_count": 43, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[['на 31 мая'], [418], [31752.884765625]]" - ] - }, - "metadata": {}, - "execution_count": 43 - } + "The model returns list with answer, answer starting position in context and the answer logit.\n", + "\n", + "This yields the following `answer_question` function." ] }, { "cell_type": "code", "metadata": { - "id": "K1BK3PAm7rRn", - "outputId": "eddcc670-5fab-49f4-c08a-f85801747d0e", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "UXi5hm_AEFB4" }, "source": [ - "model_ru([text], ['Кто участвует в полете?'])" + "def answer_question_ru(question, context):\n", + " output = model_ru([context], [question])\n", + " return output[0][0]" ], - "execution_count": 44, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[['астронавт Херли'], [729], [139.62789916992188]]" - ] - }, - "metadata": {}, - "execution_count": 44 - } + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "0wfCi3FvHBuL" + }, + "source": [ + "Let's ask a bunch of other questions to the model." ] }, { "cell_type": "code", "metadata": { - "id": "Ugo2Wyd57rRn", - "outputId": "82312fa9-aede-47b6-8db1-d512391c200d", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "98PIvy4g7rRm" }, "source": [ - "model_ru([text], ['Кто участвует в полете кроме астронавта Херли?'])" + "question = 'На какую дату запланирована стыковка?'\n", + "answer = answer_question_ru(question, context)\n", + "print(f'Ответ: \"{answer}\"')" ], - "execution_count": 45, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[['Бенкен'], [1063], [13.483261108398438]]" - ] - }, - "metadata": {}, - "execution_count": 45 - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "I-AwQsIU7rRn", - "outputId": "94c9b358-d85a-4734-8a82-d1328b9beb68", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "K1BK3PAm7rRn" }, "source": [ - "model_ru([text], ['Какая ступень приземлилась на плавучую платформу Of Course I Still Love You?'])" + "question = 'Кто участвует в полете?'\n", + "answer = answer_question_ru(question, context)\n", + "print(f'Ответ: \"{answer}\"')" ], - "execution_count": 46, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "[['Первая многоразовая ступень ракеты-носителя Falcon 9'], [0], [582400.5625]]" - ] - }, - "metadata": {}, - "execution_count": 46 - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "dMn2sAWL7rRo" + "id": "Ugo2Wyd57rRn" }, "source": [ - "" + "question = 'Кто участвует в полете кроме астронавта Херли?'\n", + "answer = answer_question_ru(question, context)\n", + "print(f'Ответ: \"{answer}\"')" ], - "execution_count": 46, + "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "ldHiNgRW7rRo" + "id": "5B4vytlCYTvs" }, "source": [ - "" + "question = 'Какие астронавты участвовали в полете?'\n", + "answer = answer_question_ru(question, context)\n", + "\n", + "# Notice how model finds the appropriate answer dispite slightly different context.\n", + "print(f'Ответ: \"{answer}\"')" ], - "execution_count": 46, + "execution_count": null, "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "IvT6gNk27rRo" + "id": "I-AwQsIU7rRn" }, "source": [ - "" + "question = 'Какая ступень приземлилась на плавучую платформу Of Course I Still Love You?'\n", + "answer = answer_question_ru(question, context)\n", + "print(f'Ответ: \"{answer}\"')" ], - "execution_count": 46, + "execution_count": null, "outputs": [] }, { @@ -2505,848 +981,244 @@ "id": "ZU4ZxB6o7rRp" }, "source": [ - "### Part 4. Text to speech (with Tacotron 2)." + "## Part 4. Question answering with speech using Tacotron 2." ] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "xDAPjR_Lx-uZ" + "id": "NVstcIVxadEr" }, "source": [ - "import numpy as np\n", - "from scipy.io.wavfile import write" - ], - "execution_count": 47, - "outputs": [] + "### Text to speech using Tacotron 2." + ] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "wZLptq5F7rRp" + "id": "aoj8MMIJbTji" }, "source": [ - "assert tacotron2 is not None, 'Tacotron2 by NVIDIA requires CUDA-compatible GPU to infer'" - ], - "execution_count": 48, - "outputs": [] + "Tacotron 2 is a network proposed in 2017 in [Natural TTS Synthesis By Conditioning\n", + "Wavenet On Mel Spectrogram Predictions](https://arxiv.org/pdf/1712.05884.pdf) paper. This network takes an input text and maps it into the mel-frequency spectrogram. This spectrogram is then passed through a modified WaveNet (generative model for audio, original paper can be found [here](https://arxiv.org/pdf/1609.03499.pdf)) to generate the actual speech." + ] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "B1s3RHawyAJ6", - "outputId": "aa35fb1a-f5eb-478f-e252-ed72f1a5ea75" + "id": "btil2I1zejk3" }, "source": [ - "tacotron2 = tacotron2.to(device)\n", - "tacotron2.eval()" - ], - "execution_count": 49, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "Tacotron2(\n", - " (embedding): Embedding(148, 512)\n", - " (encoder): Encoder(\n", - " (convolutions): ModuleList(\n", - " (0): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (1): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (2): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " )\n", - " (lstm): LSTM(512, 256, batch_first=True, bidirectional=True)\n", - " )\n", - " (decoder): Decoder(\n", - " (prenet): Prenet(\n", - " (layers): ModuleList(\n", - " (0): LinearNorm(\n", - " (linear_layer): Linear(in_features=80, out_features=256, bias=False)\n", - " )\n", - " (1): LinearNorm(\n", - " (linear_layer): Linear(in_features=256, out_features=256, bias=False)\n", - " )\n", - " )\n", - " )\n", - " (attention_rnn): LSTMCell(768, 1024)\n", - " (attention_layer): Attention(\n", - " (query_layer): LinearNorm(\n", - " (linear_layer): Linear(in_features=1024, out_features=128, bias=False)\n", - " )\n", - " (memory_layer): LinearNorm(\n", - " (linear_layer): Linear(in_features=512, out_features=128, bias=False)\n", - " )\n", - " (v): LinearNorm(\n", - " (linear_layer): Linear(in_features=128, out_features=1, bias=False)\n", - " )\n", - " (location_layer): LocationLayer(\n", - " (location_conv): ConvNorm(\n", - " (conv): Conv1d(2, 32, kernel_size=(31,), stride=(1,), padding=(15,), bias=False)\n", - " )\n", - " (location_dense): LinearNorm(\n", - " (linear_layer): Linear(in_features=32, out_features=128, bias=False)\n", - " )\n", - " )\n", - " )\n", - " (decoder_rnn): LSTMCell(1536, 1024, bias=1)\n", - " (linear_projection): LinearNorm(\n", - " (linear_layer): Linear(in_features=1536, out_features=80, bias=True)\n", - " )\n", - " (gate_layer): LinearNorm(\n", - " (linear_layer): Linear(in_features=1536, out_features=1, bias=True)\n", - " )\n", - " )\n", - " (postnet): Postnet(\n", - " (convolutions): ModuleList(\n", - " (0): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(80, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (1): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (2): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (3): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 512, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " (4): Sequential(\n", - " (0): ConvNorm(\n", - " (conv): Conv1d(512, 80, kernel_size=(5,), stride=(1,), padding=(2,))\n", - " )\n", - " (1): BatchNorm1d(80, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)\n", - " )\n", - " )\n", - " )\n", - ")" - ] - }, - "metadata": {}, - "execution_count": 49 - } + "Let's look more closely at a mel spectrogram (for more info on its nature please refer to the [Tacotron 2 paper](https://arxiv.org/pdf/1712.05884.pdf))." ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2y009rzTyBVi", - "outputId": "10277601-fb03-4cab-cb35-0f0d8cd5542b" + "id": "xDAPjR_Lx-uZ" }, "source": [ - "waveglow = torch.hub.load('nvidia/DeepLearningExamples:torchhub', 'nvidia_waveglow')\n", - "waveglow = waveglow.remove_weightnorm(waveglow)\n", - "waveglow = waveglow.to(device)\n", - "waveglow.eval()" + "assert tacotron2 is not None and waveglow is not None, 'Tacotron2 by NVIDIA infers only on GPU, so the Part 4 will not work on CPU-only machine'\n", + "utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tts_utils')\n", + "\n", + "text = 'Some test text.'\n", + "sequences, lengths = utils.prepare_input_sequence([text])\n", + "with torch.no_grad():\n", + " mel, _, _ = tacotron2.infer(sequences, lengths)\n", + "\n", + "sns.reset_orig()\n", + "plt.imshow(mel[0].cpu().numpy())\n", + "plt.title('mel-frequency spectrogram');" ], - "execution_count": 50, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Using cache found in /root/.cache/torch/hub/nvidia_DeepLearningExamples_torchhub\n", - "Downloading checkpoint from https://api.ngc.nvidia.com/v2/models/nvidia/waveglow_ckpt_fp32/versions/19.09.0/files/nvidia_waveglowpyt_fp32_20190427\n", - "/root/.cache/torch/hub/nvidia_DeepLearningExamples_torchhub/PyTorch/SpeechSynthesis/Tacotron2/waveglow/model.py:55: UserWarning: torch.qr is deprecated in favor of torch.linalg.qr and will be removed in a future PyTorch release.\n", - "The boolean parameter 'some' has been replaced with a string parameter 'mode'.\n", - "Q, R = torch.qr(A, some)\n", - "should be replaced with\n", - "Q, R = torch.linalg.qr(A, 'reduced' if some else 'complete') (Triggered internally at /pytorch/aten/src/ATen/native/BatchLinearAlgebra.cpp:1940.)\n", - " W = torch.qr(torch.FloatTensor(c, c).normal_())[0]\n" - ] - }, - { - "output_type": "execute_result", - "data": { - "text/plain": [ - "WaveGlow(\n", - " (upsample): ConvTranspose1d(80, 80, kernel_size=(1024,), stride=(256,))\n", - " (WN): ModuleList(\n", - " (0): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(4, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 8, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (1): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(4, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 8, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (2): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(4, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 8, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (3): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(4, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 8, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (4): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(3, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 6, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (5): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(3, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 6, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (6): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(3, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 6, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (7): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(3, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 6, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (8): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(2, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 4, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (9): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(2, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 4, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (10): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(2, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 4, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (11): WN(\n", - " (in_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(2,), dilation=(2,))\n", - " (2): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(4,), dilation=(4,))\n", - " (3): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(8,), dilation=(8,))\n", - " (4): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(16,), dilation=(16,))\n", - " (5): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(32,), dilation=(32,))\n", - " (6): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(64,), dilation=(64,))\n", - " (7): Conv1d(512, 1024, kernel_size=(3,), stride=(1,), padding=(128,), dilation=(128,))\n", - " )\n", - " (res_skip_layers): ModuleList(\n", - " (0): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(512, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(512, 512, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (cond_layers): ModuleList(\n", - " (0): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (1): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (2): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (3): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (4): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (5): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (6): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " (7): Conv1d(640, 1024, kernel_size=(1,), stride=(1,))\n", - " )\n", - " (start): Conv1d(2, 512, kernel_size=(1,), stride=(1,))\n", - " (end): Conv1d(512, 4, kernel_size=(1,), stride=(1,))\n", - " )\n", - " )\n", - " (convinv): ModuleList(\n", - " (0): Invertible1x1Conv(\n", - " (conv): Conv1d(8, 8, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (1): Invertible1x1Conv(\n", - " (conv): Conv1d(8, 8, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (2): Invertible1x1Conv(\n", - " (conv): Conv1d(8, 8, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (3): Invertible1x1Conv(\n", - " (conv): Conv1d(8, 8, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (4): Invertible1x1Conv(\n", - " (conv): Conv1d(6, 6, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (5): Invertible1x1Conv(\n", - " (conv): Conv1d(6, 6, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (6): Invertible1x1Conv(\n", - " (conv): Conv1d(6, 6, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (7): Invertible1x1Conv(\n", - " (conv): Conv1d(6, 6, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (8): Invertible1x1Conv(\n", - " (conv): Conv1d(4, 4, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (9): Invertible1x1Conv(\n", - " (conv): Conv1d(4, 4, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (10): Invertible1x1Conv(\n", - " (conv): Conv1d(4, 4, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " (11): Invertible1x1Conv(\n", - " (conv): Conv1d(4, 4, kernel_size=(1,), stride=(1,), bias=False)\n", - " )\n", - " )\n", - ")" - ] - }, - "metadata": {}, - "execution_count": 50 - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", "metadata": { - "id": "83WLbVnv7rRq" + "id": "9odRMQS3fISF" }, "source": [ - "Let's take a look at [Mail.ru group blog post on Computer Vision on habr.com](https://habr.com/ru/company/mailru/blog/467905/)" + "After obtaining this spectrogram, we can generate the audio with `waveglow` model." ] }, { "cell_type": "code", "metadata": { - "id": "m2eMzsMY7rRq" + "id": "BdFfCjmsUUxQ" }, "source": [ - "text = \"\"\"One of Mail.ru Cloud’s objectives is to provide the handiest means for accessing and searching your own photo and video archives. For this purpose, we at Mail.ru Computer Vision Team have created and implemented systems for smart image processing: search by object, by scene, by face, etc. Another spectacular technology is landmark recognition. Today, I am going to tell you how we made this a reality using Deep Learning.\n", - "\n", - "Imagine the situation: you return from your vacation with a load of photos. Talking to your friends, you are asked to show a picture of a place worth seeing, like palace, castle, pyramid, temple, lake, waterfall, mountain, and so on. You rush to scroll your gallery folder trying to find one that is really good. Most likely, it is lost amongst hundreds of images, and you say you will show it later.\n", + "from IPython.display import Audio\n", "\n", - "We solve this problem by grouping user photos in albums. This will let you find pictures you need just in few clicks. Now we have albums compiled by face, by object and by scene, and also by landmark.\n", + "sampling_rate = 22050\n", "\n", - "Photos with landmarks are essential because they often capture highlights of our lives (journeys, for example). These can be pictures with some architecture or wilderness in the background. This is why we seek to locate such images and make them readily available to users.\n", - "\"\"\"\n", + "with torch.no_grad():\n", + " audio = waveglow.infer(mel)\n", "\n", - "# source: https://habr.com/ru/company/mailru/blog/467905/" + "audio_numpy = audio[0].cpu().numpy()\n", + "Audio(audio_numpy, rate=sampling_rate)" ], - "execution_count": 51, + "execution_count": null, "outputs": [] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "zH2d6QX17rRq", - "outputId": "d2faf80b-be76-41a6-ca1b-4b4bcb2b217d", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "W0mnDWpdhpdi" }, "source": [ - "print(wrapper.fill(text))" - ], - "execution_count": 52, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "One of Mail.ru Cloud’s objectives is to provide the handiest means for accessing\n", - "and searching your own photo and video archives. For this purpose, we at Mail.ru\n", - "Computer Vision Team have created and implemented systems for smart image\n", - "processing: search by object, by scene, by face, etc. Another spectacular\n", - "technology is landmark recognition. Today, I am going to tell you how we made\n", - "this a reality using Deep Learning. Imagine the situation: you return from your\n", - "vacation with a load of photos. Talking to your friends, you are asked to show a\n", - "picture of a place worth seeing, like palace, castle, pyramid, temple, lake,\n", - "waterfall, mountain, and so on. You rush to scroll your gallery folder trying to\n", - "find one that is really good. Most likely, it is lost amongst hundreds of\n", - "images, and you say you will show it later. We solve this problem by grouping\n", - "user photos in albums. This will let you find pictures you need just in few\n", - "clicks. Now we have albums compiled by face, by object and by scene, and also by\n", - "landmark. Photos with landmarks are essential because they often capture\n", - "highlights of our lives (journeys, for example). These can be pictures with some\n", - "architecture or wilderness in the background. This is why we seek to locate such\n", - "images and make them readily available to users.\n" - ] - } + "We've generated a `.wav` format audio. We can save it using the `scipy.io.wavfile.write`." ] }, { "cell_type": "code", "metadata": { - "id": "4tkwZk-B7rRq", - "outputId": "d2d3e580-5089-4f7a-d3c9-38e9bf34333a", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "rTMNu9Krh2cW" }, "source": [ - "question = \"How search is performed?\"\n", + "from scipy.io.wavfile import write\n", "\n", - "ans = answer_question(question, text)" + "write('audio.wav', sampling_rate, audio_numpy)" ], - "execution_count": 53, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"search by object , by scene , by face\"\n" - ] - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "markdown", "metadata": { - "id": "GBWNS3pE7rRr" + "id": "0pjEZy4TfT3w" }, "source": [ - "Let's simply use the pre-trained model to generate audio" + "This yields the following `text_to_speech` function." ] }, { "cell_type": "code", "metadata": { - "colab": { - "base_uri": "https://localhost:8080/" - }, - "id": "2QQIZteNycoD", - "outputId": "ed77e2fc-6317-4a68-86fc-d388fcf103f1" + "id": "YEvDynkPVscj" }, "source": [ - "from IPython.display import Audio\n", - "utils = torch.hub.load('NVIDIA/DeepLearningExamples:torchhub', 'nvidia_tts_utils')\n", - "\n", - "def get_audio(phrase, rate=22050, audio_name='audio.wav'):\n", + "def text_to_speech(text):\n", " # preprocessing\n", + " sequences, lengths = utils.prepare_input_sequence([text])\n", "\n", - " sequences, lengths = utils.prepare_input_sequence([phrase])\n", " # run the models\n", " with torch.no_grad():\n", " mel, _, _ = tacotron2.infer(sequences, lengths)\n", " audio = waveglow.infer(mel)\n", - " audio_numpy = audio[0].data.cpu().numpy()\n", - " rate = rate\n", - " write(audio_name, rate, audio_numpy)\n", - " return Audio(audio_numpy, rate=rate)" + "\n", + " audio_numpy = audio[0].cpu().numpy()\n", + " return audio_numpy" ], - "execution_count": 74, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Using cache found in /root/.cache/torch/hub/NVIDIA_DeepLearningExamples_torchhub\n" - ] - } + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "RwqwZoxsWNmq" + }, + "source": [ + "text = 'Another test text.'\n", + "audio_numpy = text_to_speech(text)\n", + "Audio(audio_numpy, rate=sampling_rate)" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "gYittYwlfZfU" + }, + "source": [ + "### Tying text to speech with question answering." + ] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "83WLbVnv7rRq" + }, + "source": [ + "Let's take a look at [Mail.ru group blog post on Computer Vision on habr.com](https://habr.com/ru/company/mailru/blog/467905/)" ] }, { "cell_type": "code", "metadata": { - "id": "Bvo-0pR77rRr", - "outputId": "8228a6f3-98d4-4b09-ad7b-70b1d98bc904", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "m2eMzsMY7rRq" }, "source": [ - "question = \"Why photos with landmarks are essential?\"\n", - "\n", - "ans = answer_question(question, text)" + "context = (\n", + " 'One of Mail.ru Cloud’s objectives is to provide the handiest means for accessing '\n", + " 'and searching your own photo and video archives. For this purpose, we at Mail.ru '\n", + " 'Computer Vision Team have created and implemented systems for smart image '\n", + " 'processing: search by object, by scene, by face, etc. Another spectacular '\n", + " 'technology is landmark recognition. Today, I am going to tell you how we made '\n", + " 'this a reality using Deep Learning.'\n", + " '\\n\\n'\n", + " 'Imagine the situation: you return from your vacation with a load of photos. Talking '\n", + " 'to your friends, you are asked to show a picture of a place worth seeing, like '\n", + " 'palace, castle, pyramid, temple, lake, waterfall, mountain, and so on. You rush to '\n", + " 'scroll your gallery folder trying to find one that is really good. Most likely, it '\n", + " 'is lost amongst hundreds of images, and you say you will show it later.'\n", + " '\\n\\n'\n", + " 'We solve this problem by grouping user photos in albums. This will let you find '\n", + " 'pictures you need just in few clicks. Now we have albums compiled by face, by '\n", + " 'object and by scene, and also by landmark.'\n", + " '\\n\\n'\n", + " 'Photos with landmarks are essential because they often capture highlights of our '\n", + " 'lives (journeys, for example). These can be pictures with some architecture or '\n", + " 'wilderness in the background. This is why we seek to locate such images and make '\n", + " 'them readily available to users.'\n", + ")" ], - "execution_count": 75, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Answer: \"because they often capture highlights of our lives\"\n" - ] - } + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "code", + "metadata": { + "id": "4tkwZk-B7rRq" + }, + "source": [ + "question = 'Why photos with landmarks are essential?'\n", + "answer = answer_question(question, context)\n", + "print(f'Answer: \"{answer}\"')" + ], + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "chBm8WdIh_Bc" + }, + "source": [ + "Let's cat question and answer into one phrase and convert it to audio!" ] }, { "cell_type": "code", "metadata": { - "id": "j9NhT0Np7rRr", - "outputId": "dce5129b-ec6e-4a6b-fe18-c126f6ba78ed", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 73 - } + "id": "j9NhT0Np7rRr" }, "source": [ - "phrase = 'Your question is: {}\\n Answer is: {}'.format(question, ans)\n", - "get_audio(phrase)" + "text = f'{question}\\n{answer}'\n", + "audio_numpy = text_to_speech(text)\n", + "Audio(audio_numpy, rate=sampling_rate)" ], - "execution_count": 76, - "outputs": [ - { - "output_type": "execute_result", - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {}, - "execution_count": 76 - } + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "cFDgT4OuijIp" + }, + "source": [ + "And another one." ] }, { @@ -3356,10 +1228,12 @@ }, "source": [ "question = \"Which places except mountain are worth seeing?\"\n", + "answer = answer_question(question, context)\n", + "print(f'Answer: \"{answer}\"')\n", "\n", - "ans = answer_question(question, text)\n", - "phrase = '{}\\n {}'.format(question, ans)\n", - "get_audio(phrase)" + "text = f'{question}\\n{answer}'\n", + "audio_numpy = text_to_speech(text)\n", + "Audio(audio_numpy, rate=sampling_rate)" ], "execution_count": null, "outputs": [] @@ -3385,33 +1259,12 @@ ] }, { - "cell_type": "code", + "cell_type": "markdown", "metadata": { - "id": "R-orfjjL7rRs", - "outputId": "5c6ff25c-a10d-4d93-c59f-bca7aee05f57", - "colab": { - "base_uri": "https://localhost:8080/" - } + "id": "_0uhvcBhj2k6" }, "source": [ - "!pip install -q torchaudio omegaconf\n" - ], - "execution_count": 61, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "\u001b[K |████████████████████████████████| 1.9 MB 11.9 MB/s \n", - "\u001b[K |████████████████████████████████| 74 kB 3.1 MB/s \n", - "\u001b[K |████████████████████████████████| 831.4 MB 6.8 kB/s \n", - "\u001b[K |████████████████████████████████| 112 kB 51.2 MB/s \n", - "\u001b[?25h Building wheel for antlr4-python3-runtime (setup.py) ... \u001b[?25l\u001b[?25hdone\n", - "\u001b[31mERROR: pip's dependency resolver does not currently take into account all the packages that are installed. This behaviour is the source of the following dependency conflicts.\n", - "torchvision 0.10.0+cu111 requires torch==1.9.0, but you have torch 1.9.1 which is incompatible.\n", - "torchtext 0.10.0 requires torch==1.9.0, but you have torch 1.9.1 which is incompatible.\u001b[0m\n" - ] - } + "Of course, text to speech is not specific to english language. Here is how you can do it with russian." ] }, { @@ -3420,192 +1273,82 @@ "id": "TD79JX0g7rRs" }, "source": [ - "import numpy as np\n", - "from scipy.io.wavfile import write\n", - "\n", - "import torch\n", - "from pprint import pprint\n", "from omegaconf import OmegaConf\n", - "from IPython.display import Audio, display" - ], - "execution_count": 62, - "outputs": [] - }, - { - "cell_type": "code", - "metadata": { - "id": "jnFrVq3l7rRs", - "outputId": "2adc2bf8-61e9-45ba-8548-f05bff5a08fb", - "colab": { - "base_uri": "https://localhost:8080/" - } - }, - "source": [ - "torch.hub.download_url_to_file('https://raw.githubusercontent.com/snakers4/silero-models/master/models.yml',\n", - " 'latest_silero_models.yml',\n", - " progress=False)\n", + "\n", + "torch.hub.download_url_to_file(\n", + " 'https://raw.githubusercontent.com/snakers4/silero-models/master/models.yml',\n", + " 'latest_silero_models.yml',\n", + " progress=False\n", + ")\n", "models = OmegaConf.load('latest_silero_models.yml')\n", "\n", "# see latest avaiable models\n", - "available_languages = list(models.tts_models.keys())\n", + "available_languages = list(models['tts_models'].keys())\n", "print(f'Available languages {available_languages}')\n", "\n", "for lang in available_languages:\n", - " speakers = list(models.tts_models.get(lang).keys())\n", + " speakers = list(models['tts_models'][lang].keys())\n", " print(f'Available speakers for {lang}: {speakers}')" ], - "execution_count": 63, - "outputs": [ - { - "output_type": "stream", - "name": "stdout", - "text": [ - "Available languages ['ru', 'en', 'de', 'es', 'fr', 'ba', 'xal', 'tt', 'uz', 'multi']\n", - "Available speakers for ru: ['aidar_v2', 'aidar_8khz', 'aidar_16khz', 'baya_v2', 'baya_8khz', 'baya_16khz', 'irina_v2', 'irina_8khz', 'irina_16khz', 'kseniya_v2', 'kseniya_8khz', 'kseniya_16khz', 'natasha_v2', 'natasha_8khz', 'natasha_16khz', 'ruslan_v2', 'ruslan_8khz', 'ruslan_16khz']\n", - "Available speakers for en: ['lj_v2', 'lj_8khz', 'lj_16khz']\n", - "Available speakers for de: ['thorsten_v2', 'thorsten_8khz', 'thorsten_16khz']\n", - "Available speakers for es: ['tux_v2', 'tux_8khz', 'tux_16khz']\n", - "Available speakers for fr: ['gilles_v2', 'gilles_8khz', 'gilles_16khz']\n", - "Available speakers for ba: ['aigul_v2']\n", - "Available speakers for xal: ['erdni_v2']\n", - "Available speakers for tt: ['dilyara_v2']\n", - "Available speakers for uz: ['dilnavoz_v2']\n", - "Available speakers for multi: ['multi_v2']\n" - ] - } + "execution_count": null, + "outputs": [] + }, + { + "cell_type": "markdown", + "metadata": { + "id": "ZVaR1xG8k94K" + }, + "source": [ + "Let's choose our language and speaker and try using them!" ] }, { "cell_type": "code", "metadata": { - "id": "zKCT72on7rRt", - "outputId": "2022cf35-c757-4d78-e134-10b64ebe6e39", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 140, - "referenced_widgets": [ - "019b4f79cede42e89bdf3b2f5047a3bf", - "934f348be42346bca1e374cec6f7acac", - "14686b543b9349119fc7cec9c0f60963", - "bc8fb4da9de84df6ab7605b2b7d2d32f", - "f25f21412946491ab11381dbe23cccd1", - "0fedb09e3c9d4a6eb47d08e4bc013e54", - "ad07800df53e4feba295d0202e17bba9", - "87c33c91fc584bfbbfe6ea9a61e8b1b2", - "ad8a0ff477c94faa9a9d3ed4ca8fddf3", - "7b11de7d759d490791097ef1019848f3", - "ad6595b0760144d8899f6a2e1d41ed24" - ] - } + "id": "zKCT72on7rRt" }, "source": [ "language = 'ru'\n", "speaker = 'kseniya_16khz'\n", "device = torch.device('cpu')\n", - "model, symbols, sample_rate, example_text, apply_tts = torch.hub.load(repo_or_dir='snakers4/silero-models',\n", - " model='silero_tts',\n", - " language=language,\n", - " speaker=speaker)\n", - "model = model.to(device) # gpu or cpu\n", + "model, symbols, sample_rate, example_text, apply_tts = torch.hub.load(\n", + " 'snakers4/silero-models', 'silero_tts',\n", + " language=language, speaker=speaker\n", + ")\n", + "model = model.to(device)\n", "\n", "\n", - "audio = apply_tts(texts=[example_text],\n", - " model=model,\n", - " sample_rate=sample_rate,\n", - " symbols=symbols,\n", - " device=device)\n", + "audio = apply_tts(\n", + " texts=[example_text],\n", + " model=model,\n", + " sample_rate=sample_rate,\n", + " symbols=symbols,\n", + " device=device\n", + ")\n", "\n", "print(example_text)\n", - "display(Audio(audio[0], rate=sample_rate))" + "Audio(audio[0], rate=sample_rate)" ], - "execution_count": 64, - "outputs": [ - { - "output_type": "stream", - "name": "stderr", - "text": [ - "Downloading: \"https://github.com/snakers4/silero-models/archive/master.zip\" to /root/.cache/torch/hub/master.zip\n" - ] - }, - { - "output_type": "display_data", - "data": { - "application/vnd.jupyter.widget-view+json": { - "model_id": "019b4f79cede42e89bdf3b2f5047a3bf", - "version_minor": 0, - "version_major": 2 - }, - "text/plain": [ - " 0%| | 0.00/136M [00:00\n", - " \n", - " Your browser does not support the audio element.\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {} - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "code", "metadata": { - "id": "U0O3eCX87rRt", - "outputId": "4cac2c8d-0d52-47f7-c0f8-46d9cae7b82b", - "colab": { - "base_uri": "https://localhost:8080/", - "height": 73 - } + "id": "U0O3eCX87rRt" }, "source": [ - "audio = apply_tts(texts=[\"Дерзайте знать! Спасибо за внимание!\"],\n", - " model=model,\n", - " sample_rate=sample_rate,\n", - " symbols=symbols,\n", - " device=device)\n", - "\n", - "display(Audio(audio[0], rate=sample_rate))" + "audio = apply_tts(\n", + " texts=[\"Дерзайте знать! Спасибо за внимание!\"],\n", + " model=model,\n", + " sample_rate=sample_rate,\n", + " symbols=symbols,\n", + " device=device\n", + ")\n", + "Audio(audio[0], rate=sample_rate)" ], - "execution_count": 65, - "outputs": [ - { - "output_type": "display_data", - "data": { - "text/html": [ - "\n", - " \n", - " " - ], - "text/plain": [ - "" - ] - }, - "metadata": {} - } - ] + "execution_count": null, + "outputs": [] }, { "cell_type": "code",