Skip to content

Instantly share code, notes, and snippets.

@brockmanmatt
Created August 8, 2020 03:00
Show Gist options
  • Save brockmanmatt/572d8f98830f6202446c5737a43ee014 to your computer and use it in GitHub Desktop.
Save brockmanmatt/572d8f98830f6202446c5737a43ee014 to your computer and use it in GitHub Desktop.
commas_vs_ints_davinci2B.ipynb
Display the source blob
Display the rendered blob
Raw
{
"nbformat": 4,
"nbformat_minor": 0,
"metadata": {
"colab": {
"name": "commas_vs_ints_davinci2B.ipynb",
"provenance": [],
"collapsed_sections": [],
"authorship_tag": "ABX9TyOe3bQGyNGhhzMNiOM9OPET",
"include_colab_link": true
},
"kernelspec": {
"name": "python3",
"display_name": "Python 3"
}
},
"cells": [
{
"cell_type": "markdown",
"metadata": {
"id": "view-in-github",
"colab_type": "text"
},
"source": [
"<a href=\"https://colab.research.google.com/gist/brockmanmatt/572d8f98830f6202446c5737a43ee014/commas_vs_ints_davinci2b.ipynb\" target=\"_parent\"><img src=\"https://colab.research.google.com/assets/colab-badge.svg\" alt=\"Open In Colab\"/></a>"
]
},
{
"cell_type": "code",
"metadata": {
"id": "J7wnsgT2kPut",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 89
},
"outputId": "b06c74c9-1fbb-404a-b835-4ead99e9baab"
},
"source": [
"from google.colab import files\n",
"uploaded = files.upload()\n",
"print(\"done\")"
],
"execution_count": 1,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-0743d66a-d8b9-4f61-95c3-e08bcc962ffc\" name=\"files[]\" multiple disabled\n",
" style=\"border:none\" />\n",
" <output id=\"result-0743d66a-d8b9-4f61-95c3-e08bcc962ffc\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving key.json to key.json\n",
"done\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "WHPHrUnhpKnI",
"colab_type": "text"
},
"source": [
"I'll install the API"
]
},
{
"cell_type": "code",
"metadata": {
"id": "zq0ltp2xn4yt",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 292
},
"outputId": "0eab0c06-b186-4192-c7ea-56a371c55c5e"
},
"source": [
"!pip install openai\n",
"import openai, json, pandas as pd, numpy as np, random"
],
"execution_count": 2,
"outputs": [
{
"output_type": "stream",
"text": [
"Collecting openai\n",
"\u001b[?25l Downloading https://files.pythonhosted.org/packages/a8/65/c7461f4c87984534683f480ea5742777bc39bbf5721123194c2d0347dc1f/openai-0.2.4.tar.gz (157kB)\n",
"\r\u001b[K |██ | 10kB 18.9MB/s eta 0:00:01\r\u001b[K |████▏ | 20kB 1.6MB/s eta 0:00:01\r\u001b[K |██████▎ | 30kB 2.1MB/s eta 0:00:01\r\u001b[K |████████▍ | 40kB 2.3MB/s eta 0:00:01\r\u001b[K |██████████▍ | 51kB 1.9MB/s eta 0:00:01\r\u001b[K |████████████▌ | 61kB 2.1MB/s eta 0:00:01\r\u001b[K |██████████████▋ | 71kB 2.3MB/s eta 0:00:01\r\u001b[K |████████████████▊ | 81kB 2.6MB/s eta 0:00:01\r\u001b[K |██████████████████▊ | 92kB 2.7MB/s eta 0:00:01\r\u001b[K |████████████████████▉ | 102kB 2.6MB/s eta 0:00:01\r\u001b[K |███████████████████████ | 112kB 2.6MB/s eta 0:00:01\r\u001b[K |█████████████████████████ | 122kB 2.6MB/s eta 0:00:01\r\u001b[K |███████████████████████████ | 133kB 2.6MB/s eta 0:00:01\r\u001b[K |█████████████████████████████▏ | 143kB 2.6MB/s eta 0:00:01\r\u001b[K |███████████████████████████████▎| 153kB 2.6MB/s eta 0:00:01\r\u001b[K |████████████████████████████████| 163kB 2.6MB/s \n",
"\u001b[?25hRequirement already satisfied: requests>=2.20 in /usr/local/lib/python3.6/dist-packages (from openai) (2.23.0)\n",
"Requirement already satisfied: urllib3!=1.25.0,!=1.25.1,<1.26,>=1.21.1 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->openai) (1.24.3)\n",
"Requirement already satisfied: certifi>=2017.4.17 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->openai) (2020.6.20)\n",
"Requirement already satisfied: idna<3,>=2.5 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->openai) (2.10)\n",
"Requirement already satisfied: chardet<4,>=3.0.2 in /usr/local/lib/python3.6/dist-packages (from requests>=2.20->openai) (3.0.4)\n",
"Building wheels for collected packages: openai\n",
" Building wheel for openai (setup.py) ... \u001b[?25l\u001b[?25hdone\n",
" Created wheel for openai: filename=openai-0.2.4-cp36-none-any.whl size=170709 sha256=4ae5feab1611e97f68fc99db74a07d1f06a1b23fc1a629630d6567a1a0c2ac53\n",
" Stored in directory: /root/.cache/pip/wheels/74/96/c8/c6e170929c276b836613e1b9985343b501fe455e53d85e7d48\n",
"Successfully built openai\n",
"Installing collected packages: openai\n",
"Successfully installed openai-0.2.4\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "markdown",
"metadata": {
"id": "Q2yE0jcnpMEV",
"colab_type": "text"
},
"source": [
"Loading in key.json that I uploaded; I do this so I don't need to worry about accidently leaking creds if I share the colab (which I'm 99% sure is just a json file that won't expose them)"
]
},
{
"cell_type": "code",
"metadata": {
"id": "bwNXXwHen5x9",
"colab_type": "code",
"colab": {}
},
"source": [
"openai.api_key = json.load(open(\"key.json\", \"r\"))[\"key\"]"
],
"execution_count": 3,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "k67w5H0fpTkT",
"colab_type": "text"
},
"source": [
"Default keyword arguments to pass the aPI"
]
},
{
"cell_type": "code",
"metadata": {
"id": "s4Xl3jO9py9V",
"colab_type": "code",
"colab": {}
},
"source": [
"def query(prompt):\n",
" \"\"\"\n",
" wrapper for the API\n",
" \"\"\"\n",
" kwargs = {\n",
" \"engine\":\"davinci-v2b\",\n",
" \"temperature\":0,\n",
" \"max_tokens\":40,\n",
" \"stop\":\"\\n\",\n",
" }\n",
"\n",
" r = openai.Completion.create(prompt=prompt, **kwargs)[\"choices\"][0][\"text\"].strip()\n",
" return r"
],
"execution_count": 63,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "zZubgPoOpWDH",
"colab_type": "text"
},
"source": [
"Quick wrapper to automatically save prompts and responses sent for later analysis if needed"
]
},
{
"cell_type": "code",
"metadata": {
"id": "MXxpacj5oPMJ",
"colab_type": "code",
"colab": {}
},
"source": [
"random.seed(42)"
],
"execution_count": 64,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "VoGjY-vDj9Kw",
"colab_type": "code",
"colab": {}
},
"source": [
"train = {}\n",
"test = {}\n",
"\n",
"# for ints of int_length digits, randomly add them together. Train set will be context, test will be test\n",
"for int_length in range(3,12):\n",
" sums = []\n",
" for example in range(30):\n",
" a = random.randint(1,10**int_length)\n",
" b = random.randint(1,10**int_length)\n",
" c = a + b\n",
" sums.append({\"a\":a, \"b\":b, \"c\":c})\n",
" train[int_length] = pd.DataFrame(sums)\n",
" \n",
" sums = []\n",
" for example in range(100):\n",
" a = random.randint(1,10**int_length)\n",
" b = random.randint(1,10**int_length)\n",
" c = a + b\n",
" sums.append({\"a\":a, \"b\":b, \"c\":c})\n",
" test[int_length] = pd.DataFrame(sums)"
],
"execution_count": 65,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "l85AaDxSkvfs",
"colab_type": "code",
"colab": {}
},
"source": [
"ints_context = {}\n",
"commas_context = {}\n",
"\n",
"# set up the contexts (solved); convert comma one to commass\n",
"for int_length in range(3,12):\n",
" int_df = train[int_length].copy()\n",
" int_df[\"format\"] = int_df[\"a\"].astype(str) + \" + \" + int_df[\"b\"].astype(str) + \" = \" + int_df[\"c\"].astype(str)\n",
" ints_context[int_length] = int_df.copy()\n",
" \n",
" comma_df = train[int_length].copy()\n",
" comma_df[\"format\"] = comma_df[\"a\"].apply(lambda x: \"{:,}\".format(x)) + \" + \" + int_df[\"b\"].apply(lambda x: \"{:,}\".format(x)) + \" = \" + int_df[\"c\"].apply(lambda x: \"{:,}\".format(x))\n",
" commas_context[int_length] = comma_df.copy()\n"
],
"execution_count": 66,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "9jJP5cfioh7w",
"colab_type": "code",
"colab": {}
},
"source": [
"ints_test = {}\n",
"commas_test = {}\n",
"\n",
"# set up the prompts for the test sets ) + b)\n",
"for int_length in range(3,12):\n",
" int_df = test[int_length].copy()\n",
" int_df[\"prompt\"] = int_df[\"a\"].astype(str) + \" + \" + int_df[\"b\"].astype(str) + \" =\"\n",
" ints_test[int_length] = int_df.copy()\n",
"\n",
"\n",
" comma_df = test[int_length].copy()\n",
" comma_df[\"prompt\"] = comma_df[\"a\"].apply(lambda x: \"{:,}\".format(x)) + \" + \" + int_df[\"b\"].apply(lambda x: \"{:,}\".format(x)) + \" =\"\n",
" commas_test[int_length] = comma_df.copy()\n"
],
"execution_count": 67,
"outputs": []
},
{
"cell_type": "markdown",
"metadata": {
"id": "EdFXafcJpZ3Q",
"colab_type": "text"
},
"source": [
"Test to make sure my query works"
]
},
{
"cell_type": "code",
"metadata": {
"id": "B4mEj1pAo_z4",
"colab_type": "code",
"colab": {}
},
"source": [
"int_results = {}\n",
"comma_results = {}"
],
"execution_count": 68,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "4SlyKgjyopPn",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 51
},
"outputId": "252500e0-1fba-45b8-c4c1-2a0c409adc04"
},
"source": [
"#actually do the tests; trying with just 3 first\n",
"for int_length in range(3,4):\n",
" #check ints\n",
" if int_length not in int_results:\n",
" print(\"Checking int results for {}\".format(int_length))\n",
" int_results[int_length] = []\n",
" context = \"\\n\".join(ints_context[int_length].format) + \"\\n\"\n",
" for example in ints_test[int_length][\"prompt\"].to_list():\n",
" int_results[int_length].append(query(context + example))\n",
" \n",
" if int_length not in comma_results:\n",
" print(\"Checking comma results for {}\".format(int_length))\n",
" comma_results[int_length] = []\n",
" context = \"\\n\".join(commas_context[int_length].format) + \"\\n\"\n",
" for example in commas_test[int_length][\"prompt\"].to_list():\n",
" comma_results[int_length].append(query(context + example))\n",
"\n"
],
"execution_count": 69,
"outputs": [
{
"output_type": "stream",
"text": [
"Checking int results for 3\n",
"Checking comma results for 3\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "CFUH3pO_urcw",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 289
},
"outputId": "cc4794a4-cabe-4c37-8678-cedd853cee16"
},
"source": [
"#k, doing the rest now\n",
"for int_length in range(4,12):\n",
" #check ints\n",
" if int_length not in int_results:\n",
" print(\"Checking int results for {}\".format(int_length))\n",
" int_results[int_length] = []\n",
" context = \"\\n\".join(ints_context[int_length].format) + \"\\n\"\n",
" for example in ints_test[int_length][\"prompt\"].to_list():\n",
" int_results[int_length].append(query(context + example))\n",
" \n",
" if int_length not in comma_results:\n",
" print(\"Checking comma results for {}\".format(int_length))\n",
" comma_results[int_length] = []\n",
" context = \"\\n\".join(commas_context[int_length].format) + \"\\n\"\n",
" for example in commas_test[int_length][\"prompt\"].to_list():\n",
" comma_results[int_length].append(query(context + example))\n",
"\n"
],
"execution_count": 70,
"outputs": [
{
"output_type": "stream",
"text": [
"Checking int results for 4\n",
"Checking comma results for 4\n",
"Checking int results for 5\n",
"Checking comma results for 5\n",
"Checking int results for 6\n",
"Checking comma results for 6\n",
"Checking int results for 7\n",
"Checking comma results for 7\n",
"Checking int results for 8\n",
"Checking comma results for 8\n",
"Checking int results for 9\n",
"Checking comma results for 9\n",
"Checking int results for 10\n",
"Checking comma results for 10\n",
"Checking int results for 11\n",
"Checking comma results for 11\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ycFPWpInpK-Y",
"colab_type": "code",
"colab": {}
},
"source": [
"#now I should have results\n",
"test_scored = {}\n",
"for val in test:\n",
" test_scored[val] = test[val].copy()"
],
"execution_count": 71,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "HJ7QXjNZpXG5",
"colab_type": "code",
"colab": {}
},
"source": [
"for int_length in int_results:\n",
" test_scored[int_length][\"ints\"] = int_results[int_length]\n",
" test_scored[int_length][\"ints\"] = test_scored[int_length][\"ints\"].apply(lambda x: int(x.replace(\",\", \"\")))\n",
" test_scored[int_length][\"commas\"] = comma_results[int_length]\n",
" test_scored[int_length][\"commas\"] = test_scored[int_length][\"commas\"].apply(lambda x: int(x.replace(\",\", \"\")))"
],
"execution_count": 72,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "htmYEKkor_Nn",
"colab_type": "code",
"colab": {}
},
"source": [
"mape_df = pd.DataFrame()\n",
"exact_match_df = pd.DataFrame()"
],
"execution_count": 73,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "gaIy7yDVsiM3",
"colab_type": "code",
"colab": {}
},
"source": [
"for int_length in int_results:\n",
" mape_df.at[\"int\", int_length] = 100*np.mean(np.abs(test_scored[int_length][\"ints\"].fillna(0)-test_scored[int_length][\"c\"])/test_scored[int_length][\"c\"])\n",
" mape_df.at[\"commas\", int_length] = 100*np.mean(np.abs(test_scored[int_length][\"commas\"].fillna(0)-test_scored[int_length][\"c\"])/test_scored[int_length][\"c\"])\n",
"\n",
" exact_match_df.at[\"int\", int_length] = 100*sum(test_scored[int_length][\"ints\"].fillna(0) == test_scored[int_length][\"c\"])/len(test_scored[int_length])\n",
" exact_match_df.at[\"commas\", int_length] = 100*sum(test_scored[int_length][\"commas\"].fillna(0) == test_scored[int_length][\"c\"])/len(test_scored[int_length])"
],
"execution_count": 74,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "0mmKqB2G1ivK",
"colab_type": "code",
"colab": {
"resources": {
"http://localhost:8080/nbextensions/google.colab/files.js": {
"data": "Ly8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIExMQwovLwovLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgovLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLy8KLy8gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCi8qKgogKiBAZmlsZW92ZXJ2aWV3IEhlbHBlcnMgZm9yIGdvb2dsZS5jb2xhYiBQeXRob24gbW9kdWxlLgogKi8KKGZ1bmN0aW9uKHNjb3BlKSB7CmZ1bmN0aW9uIHNwYW4odGV4dCwgc3R5bGVBdHRyaWJ1dGVzID0ge30pIHsKICBjb25zdCBlbGVtZW50ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpOwogIGVsZW1lbnQudGV4dENvbnRlbnQgPSB0ZXh0OwogIGZvciAoY29uc3Qga2V5IG9mIE9iamVjdC5rZXlzKHN0eWxlQXR0cmlidXRlcykpIHsKICAgIGVsZW1lbnQuc3R5bGVba2V5XSA9IHN0eWxlQXR0cmlidXRlc1trZXldOwogIH0KICByZXR1cm4gZWxlbWVudDsKfQoKLy8gTWF4IG51bWJlciBvZiBieXRlcyB3aGljaCB3aWxsIGJlIHVwbG9hZGVkIGF0IGEgdGltZS4KY29uc3QgTUFYX1BBWUxPQURfU0laRSA9IDEwMCAqIDEwMjQ7CgpmdW5jdGlvbiBfdXBsb2FkRmlsZXMoaW5wdXRJZCwgb3V0cHV0SWQpIHsKICBjb25zdCBzdGVwcyA9IHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCk7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICAvLyBDYWNoZSBzdGVwcyBvbiB0aGUgb3V0cHV0RWxlbWVudCB0byBtYWtlIGl0IGF2YWlsYWJsZSBmb3IgdGhlIG5leHQgY2FsbAogIC8vIHRvIHVwbG9hZEZpbGVzQ29udGludWUgZnJvbSBQeXRob24uCiAgb3V0cHV0RWxlbWVudC5zdGVwcyA9IHN0ZXBzOwoKICByZXR1cm4gX3VwbG9hZEZpbGVzQ29udGludWUob3V0cHV0SWQpOwp9CgovLyBUaGlzIGlzIHJvdWdobHkgYW4gYXN5bmMgZ2VuZXJhdG9yIChub3Qgc3VwcG9ydGVkIGluIHRoZSBicm93c2VyIHlldCksCi8vIHdoZXJlIHRoZXJlIGFyZSBtdWx0aXBsZSBhc3luY2hyb25vdXMgc3RlcHMgYW5kIHRoZSBQeXRob24gc2lkZSBpcyBnb2luZwovLyB0byBwb2xsIGZvciBjb21wbGV0aW9uIG9mIGVhY2ggc3RlcC4KLy8gVGhpcyB1c2VzIGEgUHJvbWlzZSB0byBibG9jayB0aGUgcHl0aG9uIHNpZGUgb24gY29tcGxldGlvbiBvZiBlYWNoIHN0ZXAsCi8vIHRoZW4gcGFzc2VzIHRoZSByZXN1bHQgb2YgdGhlIHByZXZpb3VzIHN0ZXAgYXMgdGhlIGlucHV0IHRvIHRoZSBuZXh0IHN0ZXAuCmZ1bmN0aW9uIF91cGxvYWRGaWxlc0NvbnRpbnVlKG91dHB1dElkKSB7CiAgY29uc3Qgb3V0cHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKG91dHB1dElkKTsKICBjb25zdCBzdGVwcyA9IG91dHB1dEVsZW1lbnQuc3RlcHM7CgogIGNvbnN0IG5leHQgPSBzdGVwcy5uZXh0KG91dHB1dEVsZW1lbnQubGFzdFByb21pc2VWYWx1ZSk7CiAgcmV0dXJuIFByb21pc2UucmVzb2x2ZShuZXh0LnZhbHVlLnByb21pc2UpLnRoZW4oKHZhbHVlKSA9PiB7CiAgICAvLyBDYWNoZSB0aGUgbGFzdCBwcm9taXNlIHZhbHVlIHRvIG1ha2UgaXQgYXZhaWxhYmxlIHRvIHRoZSBuZXh0CiAgICAvLyBzdGVwIG9mIHRoZSBnZW5lcmF0b3IuCiAgICBvdXRwdXRFbGVtZW50Lmxhc3RQcm9taXNlVmFsdWUgPSB2YWx1ZTsKICAgIHJldHVybiBuZXh0LnZhbHVlLnJlc3BvbnNlOwogIH0pOwp9CgovKioKICogR2VuZXJhdG9yIGZ1bmN0aW9uIHdoaWNoIGlzIGNhbGxlZCBiZXR3ZWVuIGVhY2ggYXN5bmMgc3RlcCBvZiB0aGUgdXBsb2FkCiAqIHByb2Nlc3MuCiAqIEBwYXJhbSB7c3RyaW5nfSBpbnB1dElkIEVsZW1lbnQgSUQgb2YgdGhlIGlucHV0IGZpbGUgcGlja2VyIGVsZW1lbnQuCiAqIEBwYXJhbSB7c3RyaW5nfSBvdXRwdXRJZCBFbGVtZW50IElEIG9mIHRoZSBvdXRwdXQgZGlzcGxheS4KICogQHJldHVybiB7IUl0ZXJhYmxlPCFPYmplY3Q+fSBJdGVyYWJsZSBvZiBuZXh0IHN0ZXBzLgogKi8KZnVuY3Rpb24qIHVwbG9hZEZpbGVzU3RlcChpbnB1dElkLCBvdXRwdXRJZCkgewogIGNvbnN0IGlucHV0RWxlbWVudCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKGlucHV0SWQpOwogIGlucHV0RWxlbWVudC5kaXNhYmxlZCA9IGZhbHNlOwoKICBjb25zdCBvdXRwdXRFbGVtZW50ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob3V0cHV0SWQpOwogIG91dHB1dEVsZW1lbnQuaW5uZXJIVE1MID0gJyc7CgogIGNvbnN0IHBpY2tlZFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgaW5wdXRFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NoYW5nZScsIChlKSA9PiB7CiAgICAgIHJlc29sdmUoZS50YXJnZXQuZmlsZXMpOwogICAgfSk7CiAgfSk7CgogIGNvbnN0IGNhbmNlbCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2J1dHRvbicpOwogIGlucHV0RWxlbWVudC5wYXJlbnRFbGVtZW50LmFwcGVuZENoaWxkKGNhbmNlbCk7CiAgY2FuY2VsLnRleHRDb250ZW50ID0gJ0NhbmNlbCB1cGxvYWQnOwogIGNvbnN0IGNhbmNlbFByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gewogICAgY2FuY2VsLm9uY2xpY2sgPSAoKSA9PiB7CiAgICAgIHJlc29sdmUobnVsbCk7CiAgICB9OwogIH0pOwoKICAvLyBXYWl0IGZvciB0aGUgdXNlciB0byBwaWNrIHRoZSBmaWxlcy4KICBjb25zdCBmaWxlcyA9IHlpZWxkIHsKICAgIHByb21pc2U6IFByb21pc2UucmFjZShbcGlja2VkUHJvbWlzZSwgY2FuY2VsUHJvbWlzZV0pLAogICAgcmVzcG9uc2U6IHsKICAgICAgYWN0aW9uOiAnc3RhcnRpbmcnLAogICAgfQogIH07CgogIGNhbmNlbC5yZW1vdmUoKTsKCiAgLy8gRGlzYWJsZSB0aGUgaW5wdXQgZWxlbWVudCBzaW5jZSBmdXJ0aGVyIHBpY2tzIGFyZSBub3QgYWxsb3dlZC4KICBpbnB1dEVsZW1lbnQuZGlzYWJsZWQgPSB0cnVlOwoKICBpZiAoIWZpbGVzKSB7CiAgICByZXR1cm4gewogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbXBsZXRlJywKICAgICAgfQogICAgfTsKICB9CgogIGZvciAoY29uc3QgZmlsZSBvZiBmaWxlcykgewogICAgY29uc3QgbGkgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOwogICAgbGkuYXBwZW5kKHNwYW4oZmlsZS5uYW1lLCB7Zm9udFdlaWdodDogJ2JvbGQnfSkpOwogICAgbGkuYXBwZW5kKHNwYW4oCiAgICAgICAgYCgke2ZpbGUudHlwZSB8fCAnbi9hJ30pIC0gJHtmaWxlLnNpemV9IGJ5dGVzLCBgICsKICAgICAgICBgbGFzdCBtb2RpZmllZDogJHsKICAgICAgICAgICAgZmlsZS5sYXN0TW9kaWZpZWREYXRlID8gZmlsZS5sYXN0TW9kaWZpZWREYXRlLnRvTG9jYWxlRGF0ZVN0cmluZygpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ24vYSd9IC0gYCkpOwogICAgY29uc3QgcGVyY2VudCA9IHNwYW4oJzAlIGRvbmUnKTsKICAgIGxpLmFwcGVuZENoaWxkKHBlcmNlbnQpOwoKICAgIG91dHB1dEVsZW1lbnQuYXBwZW5kQ2hpbGQobGkpOwoKICAgIGNvbnN0IGZpbGVEYXRhUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7CiAgICAgIGNvbnN0IHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7CiAgICAgIHJlYWRlci5vbmxvYWQgPSAoZSkgPT4gewogICAgICAgIHJlc29sdmUoZS50YXJnZXQucmVzdWx0KTsKICAgICAgfTsKICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGZpbGUpOwogICAgfSk7CiAgICAvLyBXYWl0IGZvciB0aGUgZGF0YSB0byBiZSByZWFkeS4KICAgIGxldCBmaWxlRGF0YSA9IHlpZWxkIHsKICAgICAgcHJvbWlzZTogZmlsZURhdGFQcm9taXNlLAogICAgICByZXNwb25zZTogewogICAgICAgIGFjdGlvbjogJ2NvbnRpbnVlJywKICAgICAgfQogICAgfTsKCiAgICAvLyBVc2UgYSBjaHVua2VkIHNlbmRpbmcgdG8gYXZvaWQgbWVzc2FnZSBzaXplIGxpbWl0cy4gU2VlIGIvNjIxMTU2NjAuCiAgICBsZXQgcG9zaXRpb24gPSAwOwogICAgd2hpbGUgKHBvc2l0aW9uIDwgZmlsZURhdGEuYnl0ZUxlbmd0aCkgewogICAgICBjb25zdCBsZW5ndGggPSBNYXRoLm1pbihmaWxlRGF0YS5ieXRlTGVuZ3RoIC0gcG9zaXRpb24sIE1BWF9QQVlMT0FEX1NJWkUpOwogICAgICBjb25zdCBjaHVuayA9IG5ldyBVaW50OEFycmF5KGZpbGVEYXRhLCBwb3NpdGlvbiwgbGVuZ3RoKTsKICAgICAgcG9zaXRpb24gKz0gbGVuZ3RoOwoKICAgICAgY29uc3QgYmFzZTY0ID0gYnRvYShTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGNodW5rKSk7CiAgICAgIHlpZWxkIHsKICAgICAgICByZXNwb25zZTogewogICAgICAgICAgYWN0aW9uOiAnYXBwZW5kJywKICAgICAgICAgIGZpbGU6IGZpbGUubmFtZSwKICAgICAgICAgIGRhdGE6IGJhc2U2NCwKICAgICAgICB9LAogICAgICB9OwogICAgICBwZXJjZW50LnRleHRDb250ZW50ID0KICAgICAgICAgIGAke01hdGgucm91bmQoKHBvc2l0aW9uIC8gZmlsZURhdGEuYnl0ZUxlbmd0aCkgKiAxMDApfSUgZG9uZWA7CiAgICB9CiAgfQoKICAvLyBBbGwgZG9uZS4KICB5aWVsZCB7CiAgICByZXNwb25zZTogewogICAgICBhY3Rpb246ICdjb21wbGV0ZScsCiAgICB9CiAgfTsKfQoKc2NvcGUuZ29vZ2xlID0gc2NvcGUuZ29vZ2xlIHx8IHt9OwpzY29wZS5nb29nbGUuY29sYWIgPSBzY29wZS5nb29nbGUuY29sYWIgfHwge307CnNjb3BlLmdvb2dsZS5jb2xhYi5fZmlsZXMgPSB7CiAgX3VwbG9hZEZpbGVzLAogIF91cGxvYWRGaWxlc0NvbnRpbnVlLAp9Owp9KShzZWxmKTsK",
"ok": true,
"headers": [
[
"content-type",
"application/javascript"
]
],
"status": 200,
"status_text": ""
}
},
"base_uri": "https://localhost:8080/",
"height": 89
},
"outputId": "656bb1b1-e118-49c3-9bad-0635ed10cc3b"
},
"source": [
"from google.colab import files\n",
"uploaded = files.upload()\n",
"print(\"done\")"
],
"execution_count": 53,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/html": [
"\n",
" <input type=\"file\" id=\"files-8049ba48-b1d4-435e-b742-32ee2e74ab96\" name=\"files[]\" multiple disabled\n",
" style=\"border:none\" />\n",
" <output id=\"result-8049ba48-b1d4-435e-b742-32ee2e74ab96\">\n",
" Upload widget is only available when the cell has been executed in the\n",
" current browser session. Please rerun this cell to enable.\n",
" </output>\n",
" <script src=\"/nbextensions/google.colab/files.js\"></script> "
],
"text/plain": [
"<IPython.core.display.HTML object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "stream",
"text": [
"Saving math_df.pkl to math_df (2).pkl\n",
"done\n"
],
"name": "stdout"
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "EG8Pg1Rr1yxQ",
"colab_type": "code",
"colab": {}
},
"source": [
"old_df_combined = pd.read_pickle(\"math_df.pkl\")"
],
"execution_count": 75,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "1vy9o_o93VRN",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 111
},
"outputId": "933626cb-c074-4fd6-f50a-8df4f142ebca"
},
"source": [
"mape_df"
],
"execution_count": 52,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>10</th>\n",
" <th>11</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>int</th>\n",
" <td>0.818156</td>\n",
" <td>4.770848</td>\n",
" <td>7.712621</td>\n",
" <td>11.668516</td>\n",
" <td>14.694527</td>\n",
" <td>26.053263</td>\n",
" <td>47.400036</td>\n",
" <td>27.766476</td>\n",
" <td>26.772077</td>\n",
" </tr>\n",
" <tr>\n",
" <th>commas</th>\n",
" <td>0.485746</td>\n",
" <td>1.014961</td>\n",
" <td>0.127750</td>\n",
" <td>0.126378</td>\n",
" <td>0.228100</td>\n",
" <td>0.056372</td>\n",
" <td>0.454149</td>\n",
" <td>0.582585</td>\n",
" <td>17.114274</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 3 4 5 ... 9 10 11\n",
"int 0.818156 4.770848 7.712621 ... 47.400036 27.766476 26.772077\n",
"commas 0.485746 1.014961 0.127750 ... 0.454149 0.582585 17.114274\n",
"\n",
"[2 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 52
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "MxP_qlJU2Ksc",
"colab_type": "code",
"colab": {}
},
"source": [
"old_df = {}\n",
"for i in old_df_combined[\"size\"].unique():\n",
" old_df[i] = old_df_combined[old_df_combined[\"size\"]==i]"
],
"execution_count": 76,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "PMVT7vsf2OLI",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": 76,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "sAQ0PNMT1hlk",
"colab_type": "code",
"colab": {}
},
"source": [
"for int_length in old_df:\n",
" mape_df.at[\"old_int\", int_length] = 100*np.mean(np.abs(old_df[int_length][\"ints\"].fillna(0)-old_df[int_length][\"c\"])/old_df[int_length][\"c\"])\n",
" mape_df.at[\"old_commas\", int_length] = 100*np.mean(np.abs(old_df[int_length][\"commas\"].fillna(0)-old_df[int_length][\"c\"])/old_df[int_length][\"c\"])\n",
"\n",
" exact_match_df.at[\"old_int\", int_length] = 100*sum(old_df[int_length][\"ints\"].fillna(0) == old_df[int_length][\"c\"])/len(old_df[int_length])\n",
" exact_match_df.at[\"old_commas\", int_length] = 100*sum(old_df[int_length][\"commas\"].fillna(0) == old_df[int_length][\"c\"])/len(old_df[int_length])"
],
"execution_count": 77,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "IHGyLfO13mB4",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 173
},
"outputId": "1dba0dae-6aa0-4b3d-9dc8-e07f07186f22"
},
"source": [
"#MEAN ERROR\n",
"mape_df"
],
"execution_count": 78,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>10</th>\n",
" <th>11</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>int</th>\n",
" <td>0.757821</td>\n",
" <td>4.103469</td>\n",
" <td>7.548277</td>\n",
" <td>11.696423</td>\n",
" <td>14.751093</td>\n",
" <td>24.693287</td>\n",
" <td>47.711725</td>\n",
" <td>26.289521</td>\n",
" <td>27.070311</td>\n",
" </tr>\n",
" <tr>\n",
" <th>commas</th>\n",
" <td>0.396372</td>\n",
" <td>1.014230</td>\n",
" <td>0.127750</td>\n",
" <td>0.126378</td>\n",
" <td>0.227927</td>\n",
" <td>0.063925</td>\n",
" <td>0.453638</td>\n",
" <td>0.773123</td>\n",
" <td>17.114365</td>\n",
" </tr>\n",
" <tr>\n",
" <th>old_int</th>\n",
" <td>0.818156</td>\n",
" <td>4.770848</td>\n",
" <td>7.712621</td>\n",
" <td>11.668516</td>\n",
" <td>14.694527</td>\n",
" <td>26.053263</td>\n",
" <td>47.400036</td>\n",
" <td>27.766476</td>\n",
" <td>26.772077</td>\n",
" </tr>\n",
" <tr>\n",
" <th>old_commas</th>\n",
" <td>0.485746</td>\n",
" <td>1.014961</td>\n",
" <td>0.127750</td>\n",
" <td>0.126378</td>\n",
" <td>0.228100</td>\n",
" <td>0.056372</td>\n",
" <td>0.454149</td>\n",
" <td>0.582585</td>\n",
" <td>17.114274</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 3 4 5 ... 9 10 11\n",
"int 0.757821 4.103469 7.548277 ... 47.711725 26.289521 27.070311\n",
"commas 0.396372 1.014230 0.127750 ... 0.453638 0.773123 17.114365\n",
"old_int 0.818156 4.770848 7.712621 ... 47.400036 27.766476 26.772077\n",
"old_commas 0.485746 1.014961 0.127750 ... 0.454149 0.582585 17.114274\n",
"\n",
"[4 rows x 9 columns]"
]
},
"metadata": {
"tags": []
},
"execution_count": 78
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "kDDew2Mx2mGr",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 173
},
"outputId": "a33ec602-75c8-4b93-dda0-acb4914c12c3"
},
"source": [
"exact_match_df"
],
"execution_count": 79,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>3</th>\n",
" <th>4</th>\n",
" <th>5</th>\n",
" <th>6</th>\n",
" <th>7</th>\n",
" <th>8</th>\n",
" <th>9</th>\n",
" <th>10</th>\n",
" <th>11</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>int</th>\n",
" <td>87.0</td>\n",
" <td>24.0</td>\n",
" <td>12.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>1.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>commas</th>\n",
" <td>93.0</td>\n",
" <td>93.0</td>\n",
" <td>84.0</td>\n",
" <td>81.0</td>\n",
" <td>74.0</td>\n",
" <td>78.0</td>\n",
" <td>62.0</td>\n",
" <td>61.0</td>\n",
" <td>52.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>old_int</th>\n",
" <td>86.0</td>\n",
" <td>24.0</td>\n",
" <td>12.0</td>\n",
" <td>4.0</td>\n",
" <td>2.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" <td>0.0</td>\n",
" </tr>\n",
" <tr>\n",
" <th>old_commas</th>\n",
" <td>93.0</td>\n",
" <td>92.0</td>\n",
" <td>84.0</td>\n",
" <td>81.0</td>\n",
" <td>72.0</td>\n",
" <td>78.0</td>\n",
" <td>61.0</td>\n",
" <td>60.0</td>\n",
" <td>52.0</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" 3 4 5 6 7 8 9 10 11\n",
"int 87.0 24.0 12.0 4.0 2.0 1.0 0.0 0.0 0.0\n",
"commas 93.0 93.0 84.0 81.0 74.0 78.0 62.0 61.0 52.0\n",
"old_int 86.0 24.0 12.0 4.0 2.0 0.0 0.0 0.0 0.0\n",
"old_commas 93.0 92.0 84.0 81.0 72.0 78.0 61.0 60.0 52.0"
]
},
"metadata": {
"tags": []
},
"execution_count": 79
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "ITRgz0N02Zsy",
"colab_type": "code",
"colab": {}
},
"source": [
"import matplotlib.pyplot as plt"
],
"execution_count": 80,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "vFGLFaXQ2bzc",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 367
},
"outputId": "2ffd9aae-1c9a-455b-d916-3ad242763700"
},
"source": [
"fig, axs = plt.subplots(nrows = 1, ncols =2, figsize=(10,5), facecolor=\"w\")\n",
"mape_df.T.plot(title=\"mean percent error (100 per length)\", ax=axs[0])\n",
"axs[0].set_xlabel(\"mean absolute percent error\")\n",
"axs[0].set_ylabel(\"max digits\")\n",
"exact_match_df.T.plot(title=\"percent exact match (100 per length)\", ax=axs[1])\n",
"axs[1].set_xlabel(\"max digits\")\n",
"axs[1].set_ylabel(\"percent exact match\")\n"
],
"execution_count": 81,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"Text(0, 0.5, 'percent exact match')"
]
},
"metadata": {
"tags": []
},
"execution_count": 81
},
{
"output_type": "display_data",
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAl4AAAFNCAYAAADRi2EuAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjIsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+WH4yJAAAgAElEQVR4nOzdd3gUVd/G8e+29L4hjYRUOiH0KlJEQOlNUKqAYAEB8REVH0VFsYGAPoJIRxDwVTpIR3og9N4T0iEF0tvuef+IrAQSEkiZEM7nurjI7syeuWd2d/LLzJkzKiGEQJIkSZIkSSp1aqUDSJIkSZIkPS1k4SVJkiRJklRGZOElSZIkSZJURmThJUmSJEmSVEZk4SVJkiRJklRGZOElSZIkSZJURmThJVU4H3zwATNmzFA6Ronz8fFh+/btZb7c0NBQVCoVOTk5+U7/4YcfmDhxYhmnkqQn09ChQ/noo48e6TUtW7bk+PHjpZRIGYXtV0rTokWLeOaZZwqc3rt3bzZv3lxqy5eFl1QkkydPZuDAgUrHKNStW7dYsmQJo0aNAiArK4s+ffrg4+ODSqVi9+7deeYXQjBx4kT0ej16vZ6JEydy79B2J06coGHDhlhZWdGwYUNOnDhRlqujiEct8F577TWWLVvGzZs3SzGVVF49TiFR2tq0acO8efPKbHml+UfR+vXrsbW1pX79+gCcOXOGjh074uzsjEqlemD+hIQEevbsibW1Nd7e3ixfvjzP9OXLl+Pt7Y21tTU9evQgISGhVHKXF49T4E2cOLFUP9Oy8KpAhBAYjUalYxTJ/V+CR81e0PyLFi3ixRdfxNLS0vTcM888w6+//oqbm9sD88+dO5c1a9Zw8uRJTp06xfr16/n555+B3KKte/fuDBw4kMTERIYMGUL37t3Jysoqcs7H8SS9jwAWFha88MILLFmyROkoUgGUOKoglYw5c+YwaNAg02OdTsdLL73E/Pnz853/rbfewszMjNjYWJYtW8Ybb7zB2bNnATh79iyjRo1i6dKlxMbGYmVlxZtvvlnq6/Ckff6aNGlCUlISISEhpbMA8RTx9vYW33zzjQgMDBRWVlZi2LBhIiYmRnTq1EnY2NiI5557TiQkJJjmP3jwoGjevLmwt7cXdevWFbt27TJNW7BggahRo4awsbERvr6+Ys6cOaZpu3btEpUrVxbfffedqFSpknBzcxMLFiwoMFfr1q3F+++/Lxo3bixsbW1Ft27dRHx8fJFytG7dWnz44YeiRYsWwsLCQly+fFmcOXNGtG/fXjg6OgoXFxfxxRdfCCGEMBgMYurUqcLPz084OTmJvn37mpZz/fp1AYhFixYJLy8vodfrxZQpU4QQQmzevFnodDqh1WqFtbW1qFu3br7rERkZKXr16iWcnZ2Fj4+PmDlzpmnaJ598Inr37i0GDBggbG1txS+//JJv9v3794tGjRoJOzs70ahRI7F///6Hruv92rZtK5YuXZpvvsqVK+fZdkII0bx5c/Hzzz+bHs+bN080bdpUCCHEli1bhIeHhzAajabpXl5eYvPmzfm2X9Lv4/28vb3Ftm3bhBCP/14KIURaWpoYPHiwcHBwEDVq1BBff/21qFy5shBCiIEDBwqVSiUsLCyEtbW1+PrrrwttTwghfv31V9GmTZt8t4v0+Ly9vcWXX34patasKRwcHMTQoUNFenq6afr69etFUFCQsLe3F82bNxcnT57M89qvvvpKBAYGCjMzM5GdnS327t1r+gx6enqKhQsXCiGEyMjIEBMmTBBeXl7CxcVFjBo1SqSlpQkhHr4/+/nnn4VWqxU6nU5YW1uLLl265Lse58+fN+2TqlWrJlauXCmEEOLKlSvC0dFRHD16VAiRuw9xdnY2fTcetp8VQog1a9aIoKAgYWtrK/z8/MTmzZvFhx9+KNRqtTA3NxfW1tbirbfeeiDP3c/0ggULhKenp3BwcBCzZ88Whw8fFoGBgcLe3j7P665cuSLatm0rnJychF6vF6+88opITEwUQuT/nRFCFLithwwZIt58803x4osvChsbG9GkSRNx5cqVfLdbZmamsLCwEOHh4Q9Mu3z5srj/V3hKSorQ6XTi4sWLpucGDhwoJk6cKIQQ4oMPPhAvv/xynvXS6XQiKSkp3+UDYubMmcLX11fo9Xrx7rvvCoPBYJo+f/58UaNGDeHg4CA6dOggQkND87z2xx9/FAEBAcLHx6fA9yA7O1sIIcTt27fFsGHDhJubm/Dw8BCTJk0SOTk5QgghFi5cKFq2bCkmTJggHBwchI+Pj9i0aZOprWvXrolWrVqZfo+/+eabYsCAAUKI3H02IKytrYW1tbU4cOBAoe0JIcSIESPE5MmT890uxfXUFV5NmzYVMTExIiIiQlSqVEnUr19fHDt2TKSnp4u2bduaNnRERIRwcnISGzduFAaDQWzdulU4OTmJmzdvCiGE2LBhg7hy5YowGo1i9+7dwtLS0rTz2LVrl9BoNOK///2vyMrKEhs3bhSWlpZ5irp7tW7dWnh4eIjTp0+LlJQU0atXL9OHprAcrVu3Fl5eXuLMmTMiOztbJCUlCTc3N/Hdd9+J9PR0kZSUJA4dOiSEEGLGjBmiadOmIjw8XGRkZIiRI0eK/v37CyH+/RKMGDFCpKWliRMnTggzMzNx7tw5IURu4XQ3U34MBoNo0KCB+PTTT0VmZqa4evWq8PX1FX/99Zfp9VqtVqxevVoYDAaRlpb2QPaYmBjh4OAglixZIrKzs8Xy5cuFg4ODiIuLy3dds7KyHsjh7OwsDh8+nG/G/AovOzs70/YRQogjR44IGxsbIYQQ06dPF506dcozf+fOncV3332Xb/sl+T7mt273Fl7FeS8nTpwonn32WZGQkCDCw8NFYGCgqfC6fzlFaU8IIY4ePSocHR3z3S7S4/P29ha1a9cWN27cEPHx8aJFixZi0qRJQgghjh07JipVqiQOHTokcnJyxKJFi4S3t7fIyMgwvTYoKEjcuHFDpKWlidDQUGFjYyOWL18usrKyRFxcnDh+/LgQQohx48aJrl27ivj4eJGUlCS6dOki3n//fSFE4fuzIUOGmDLlJyUlRXh6eooFCxaI7OxscezYMaHX68XZs2eFEELMnTtX1KxZU6SmpooOHTqICRMmmF77sP1scHCwsLOzE1u3bhUGg0FERESI8+fPCyFyv0+//PJLgZnufqZHjRol0tPTxZYtW4S5ubno3r27iI2NNf1+2L17txAit8jZunWryMjIEDdv3hStWrUSY8eOzfM+3fudedi2HjJkiHBychLBwcEiOztbvPLKK6Jfv3755jxz5oywsrLKd1p+hdexY8eEpaVlnue+/fZbU0HcrVs38dVXX+WZbm1tLUJCQvJdBiDatGkj4uPjRVhYmKhatappu65Zs0b4+/uLc+fOiezsbPH555+L5s2b53lt+/btRXx8vKmIv9f9hVePHj3EyJEjRUpKioiNjRWNGzc2FdoLFy4UWq1WzJ07V+Tk5IiffvpJuLu7m/4obtasmZgwYYLIzMwUe/fuFba2tqZ97/3LKUp7Qggxbdo00bNnz3y3S3E9dYXXr7/+anrcq1cv8frrr5sez5o1S3Tv3l0IIcRXX30lBg4cmOf1HTp0EIsWLcq37e7du4sZM2YIIXJ3VBYWFnne6EqVKomDBw/m+9rWrVub/iIRQoizZ88KnU4ncnJyCs3RunVr8d///tc0bfny5aJevXr5LqdGjRpi+/btpsdRUVFCq9WK7Oxs04fz3r+sGjduLH777TchROGF16FDh4SXl1ee57788ksxdOhQ0+tbtWr1wHrfm33JkiWicePGeeZp1qyZ6S/F++fPj1arNe1875df4aVWq/PMf+nSJQEIo9EoPvvsswd2iK+88or45JNP8m2/JN/H/Ny7cy/Oe3lvQSyEEL/88kuRCq+C2hMid7up1eqH5pcenbe3t5g9e7bp8caNG4Wfn58QQojXX39dfPTRR3nmr1atmqlY8Pb2FvPnzzdN+/LLL0WPHj0eWIbRaBRWVlZ5jrocOHDAdJSisP1ZYYXXihUrxDPPPJPnuZEjR+Y5mtC1a1dRp04dERgYaCoc83PvfnbkyJFi3Lhx+c5X1MIrIiLC9JyTk5NYsWKF6XGvXr3E999/n+/rV69enWc/e/93pqBtLUTu9ho+fLjp8caNG0X16tXznXffvn3C1dU132n5FV579ux5YP65c+eK1q1bCyGEaNeuXZ7PkxBCeHh4PLBfvAvIc4T/f//7n2jXrp0QQohOnTqJefPmmaYZDAZhaWlpOuoFiB07duTbrhB5C6KYmBhhZmaWp0Bbvny56Sj6woULhb+/v2laamqqAER0dLQICwsTGo1GpKammqYPGDCg0MKroPbu3W5t27YtMH9xaEvnBGb55erqavrZ0tLygccpKSkAhIWF8fvvv7N+/XrT9OzsbNq2bQvA5s2b+fTTT7l06RJGo5G0tDQCAwNN8+r1erTafzevlZWVqe38eHl5mX729vYmOzubuLi4QnPc/9rw8HD8/f3zXUZYWBg9e/ZErf63a59GoyE2Ntb0+N5+UIVlvr/tqKgoHBwcTM8ZDAZatWqVb878nouKisLb2zvPdG9vbyIjIx/axr0cHR1JTk4uUmYAGxsbkpKSTI+TkpKwsbFBpVI9MO3udFtb2wLbK6n3sTDFeS+joqLyLKuoy33YZyM5ORl7e/si55eK7v7PVFRUFJD7GVi8eDE//PCDaXpWVpZp+v2vLWjfcOvWLdLS0mjYsKHpOSEEBoPB9PhR92f3CgsLIzg4OM++IScnJ0+/pddee41u3boxd+5czM3NTc8/bD8bHh7Oiy++WKQMBSnq74PY2FjGjh3L3r17SU5Oxmg04ujoWGC7D9sPQ9H3s8Xdn0HefVZJ7NPu/fyNHTuWCRMmmKYLIYiMjDTtx4u6bwkLCyM7Oxt3d3fTc0ajMc/r799mACkpKcTFxeHk5GR67u5yw8PDH7rMgtq7Kzk5Oc9ntiTJzvUF8PLyYtCgQdy+fdv0LzU1lffff5/MzEx69+7Nu+++S2xsLLdv3+bFF1/MczXco7r3Q3Ljxg10Oh3Ozs4PzXHXvVe2eHl5ce3atQLXafPmzXnaysjIoHLlyoXmy+/qmfvb9vX1zdN2cnIymzZtemgb9z7n4eFBWFhYnuk3btzIk6+wHHXr1uXSpUsPnedetWvX5uTJk6bHJ0+epHbt2qZpp06dyvO+njp1yjQ9PyX1PhamOO+lu7s7ERER+WZ+1Bx3nT9/nqCgoEd+nVS4+z9THh4eQO5nYNKkSXk+A2lpabz88sum+e/fN1y9evWB9p2dnbG0tOTs2bOmdu7cuVPkwqoo+4bWrVvnyZmSksLs2bOB3F9248aNY/jw4UyePNl0lV1h+9mC1qcomR7Vhx9+iEql4vTp0yQlJfHrr7/m2S/cv7yHZXsUAQEBpmKmKKpVq0ZOTg6XL182PXf/Pu3e/d21a9fIzMykWrVqBbb5sM/fzz//nOd9TU9Pp0WLFqb5i/o+eHl5YW5uTlxcnKmtpKQk00UBD+Pu7k5CQgJpaWn5Zn7cz0Jp7tNk4VWAgQMHsn79erZs2YLBYCAjI4Pdu3cTERFBVlYWmZmZVKpUCa1Wy+bNm9m6dWuxlvfrr79y7tw50tLS+Pjjj+nTpw8ajeahOfLTpUsXoqOjmTFjBpmZmSQnJxMcHAzA66+/zqRJk0zFza1bt1i7dm2R8rm6uhIaGlrg1XZNmjTB1taWr7/+mvT0dAwGA2fOnOHIkSNF3gYvvvgily5dYvny5eTk5LBy5UrOnTtHly5dHqmNv//+O89zmZmZZGRkALlHBDIyMkw7zcGDBzN9+nQiIyOJiopi2rRpDB06FMi9JF2j0TBr1iwyMzP58ccfAWjXrl2Byy+p97EwxXkvX3rpJaZOnUpiYiKRkZGm9brL1dW1wOK9IH///TcvvPDCI71GKpr//e9/REREkJCQwBdffEG/fv2A3KNEc+bMITg4GCEEqampbNy4scAjJAMGDGD79u2sWrWKnJwc4uPjOXHiBGq1mtdee43x48ebhgSJjIxky5YtRcpX2OelS5cuXLp0iaVLl5KdnU12djZHjhzh/PnzAIwdO5ZGjRoxb948OnfuzOuvvw5Q6H52+PDhLFy4kB07dmA0GomMjOTChQtFyvSokpOTsbGxwd7ensjISL799tuHboOCtvWjMjMzo3379nn2aUIIMjIyTFdXZ2RkkJmZCYC1tTW9evXi448/JjU1lf3797N27VrT0cUBAwawfv169u7dS2pqKh9//DG9evV66BGvb7/9lsTERMLDw5k5c6bp8/f6668zdepUU3F0584dfv/990deR8gtnjp06MCECRNISkrCaDRy9erVB/bl+fH29qZRo0ZMnjyZrKwsDh48mOfMQqVKlVCr1eVqnyYLrwJ4eXmxdu1avvzySypVqoSXlxfffvstRqMRW1tbZs2axUsvvYSjoyPLly+nW7duxVreoEGDGDp0KG5ubmRkZDBr1qxCc+TH1taWbdu2sX79etzc3KhatSq7du0Ccndw3bp1o0OHDtja2tKsWTNTUVaYvn37ArmnHBo0aPDAdI1Gw4YNGzhx4gS+vr44OzszYsQI7ty5U+RtoNfr2bBhA9OmTUOv1/PNN9+wYcMGnJ2di9zG4MGD2bRpE+np6abnqlevjqWlJZGRkXTs2BFLS0tTwTJq1Ci6du1KYGAgderUoXPnzqYxwMzMzFizZg1LlizBwcGBBQsWsGbNGszMzApcfkm9j4Upznv58ccf4+npia+vL+3bt6dPnz55Tu988MEHTJkyBQcHB7777rtC28vIyGDTpk0MGTLksdZFerhXXnmFDh064Ofnh7+/v2l8oUaNGvHLL78wevRoHB0dCQgIYNGiRQW2U6VKFTZt2sS0adNwcnKiXr16pqMfX3/9NQEBATRr1gw7Ozvat2/PxYsXi5Rv+PDhnDt3DgcHB3r06PHAdFtbW7Zu3cqKFSvw8PDAzc2NiRMnkpmZydq1a/nrr79MR7+mT5/OsWPHWLZsWaH72SZNmrBw4ULGjx+Pvb09rVu3Nn2vx44dy//93//h6OjI22+/XaT1eJhPPvmEY8eOYW9vT+fOnenVq1ee6fd/Zx62rR/V3eEf7goLC8PS0tJ0FMvS0pLq1aubpv/000+kp6fj4uLCyy+/zOzZs/Mc8ZozZw4DBgzAxcWF5ORkfvrpp4cuv3v37jRs2JB69erRuXNnhg8fDkDPnj2ZOHEi/fv3x87Ojjp16hRr0NElS5aQlZVFrVq1cHR0pE+fPkRHRxfptcuWLePgwYPo9Xo++ugj+vXrZ9qnWVlZMWnSJFq2bImDgwOHDh0qtL0jR45gY2NDkyZNHnt9HkYlinN+TCoRbdq0YeDAgYwYMULpKBXChx9+iIuLC+PGjSvT5T6p7+Ps2bNZsWJFkf66zM8PP/xAeHg433zzTQknk3x8fJg3bx7t27dXOoqkoJYtW/Ljjz+aBlEtKyqVisuXLxMQEFCmyy2ufv36UaNGDT799NPHen3v3r0ZPnx4sfsQFuSp61wvVXxffvml0hHKtejoaK5du0bz5s25fPky06ZNY/To0Y/d3pgxY0ownSRJ99u/f7/SEcq1I0eO4OTkhK+vL1u3bmXt2rV5+s8+qj/++KME0z1IFl6S9JTJyspi1KhRXL9+HQcHB/r3718mo1dLkiSVhpiYGHr16kV8fDyenp7Mnj27zI8OPopSPdXo4+ODra0tGo0GrVZLSEgICQkJ9OvXj9DQUHx8fFi1atVDL8uVJEmSJEmqKEq9c/2uXbs4ceKE6Z5HX331Fc899xyXL1/mueee46uvvirtCJIkSZIkSeVCmV/VuHbtWtPVT0OGDGHNmjVlHUGSJEmSJEkRpXqq0dfXF0dHR1QqFaNGjWLkyJE4ODhw+/ZtIHc8EkdHR9Pje82dO5e5c+cCcOHCBWrUqFFaMSVJKmdCQ0OJi4tTOkaJcHZ2xsfHR+kYkiSVoYftw0q1c/2+ffuoXLkyN2/e5Pnnn3+geFKpVAWOKjty5EhGjhwJ5I5Xc/dUpSRJFV+jRo2UjlBifHx85P5Lkp4yD9uHleqpxru3L3FxcaFnz54cPnwYV1dX06Bo0dHRuLi4lGYESZIkSZKkcqPUCq/U1FTTrStSU1PZunUrderUoVu3bixevBiAxYsX071799KKIEmSJEmSVK6U2qnG2NhYevbsCeTeif6VV16hU6dONG7cmJdeeon58+fj7e3NqlWrSiuCJEmSJElSuVJqhZefn1++96bS6/Xs2LGj2O1nZ2cTERFhuvmxVPYsLCzw9PREp9MpHUWSJEmSnghP7Mj1ERER2Nra4uPjU2AHfan0CCGIj48nIiICX19fpeNIkiRJ0hOhzMfxKikZGRno9XpZdClEpVKh1+vlEUdJkiRJegRPbOEFyKJLYXL7S5IkSdKjeaILL6W1aNGi0HlmzJhBWlpaGaSRJEmSJKm8k4VXMRw4cKDQeWThJUmSJEnSXU9s5/rywMbGhpSUFHbv3s3kyZNxdnbmzJkzNGzYkF9//ZUffviBqKgo2rZti7OzM7t27VI6slTOJGdkcy4qiaZ+eqWjSAoTOdkkfjcBrZ0VWntrtA7WaOytUVuYle5pfa0l1OoGOsvSW4YkSSay8Cohx48f5+zZs3h4eNCyZUv279/P22+/zfTp09m1axfOzs5KR5TKobl7rvHjriscfP853OwtlI4jKciYkkTsom0PPK/SGNFa5P7TWBjQWhrRmhvRWhrQWBjRWhhM09Xax7z1bvBs6P8b2LkXcy0kSSpMhSi8Pl1/lnNRSSXaZi0POz7pWrvI8zdp0gRPT08A6tWrR2hoKM8880yJZpIqnl3Xj2Dutp39V+vQu4G30nEkBantHKn61/+Rk5BITnwChvhE0885CYkY4hPIjk8kPT4Rw+07IB4sstTWVmicHNE6OaLVO6HVO6J1ckKjd8z9We+E1skRjZMjajOz3BeFH4Y1b8IvbaH/cqjcoIzXXJKeLhWi8CoPzM3NTT9rNBpycnIUTCM9CTKyDVzL3I7O4SibL4XIwuspp1Kr0frURutT+LwiO/ufYiyOnLg4cuLi//n/FoZ/fs4MiyT16EmMd+7k24ba3h6tXo/OzQ3n/jOxOvsZLHwBevwEdXqX7MpJkmRSIQqvRzkyVdZsbW1JTk6WpxqlBxy/kYjK6goAJ+IOIUQvOUSHVCQqnQ6dqws6V5dC5zVmZWGIv1uY5f4z3FOspZ86Rdj4T6k08lX0bltR/d8wuHkB2nwAann9lSSVtApReJVnI0eOpFOnTnh4eMjO9VIe2y6fRa27A6hI057lRkIa3nprpWNJFYzazAy1uzs69/z7bxmSk4n55BNuzZ5HarOmVH6uL9o938CtC9BzDpjJz6QklST550wxpKSkANCmTRs2bNhgev7HH39k6NChAIwZM4aLFy/Kokt6wMGogwC09uiI2iKCbRevK5xIehppbG3xmDYNt88/I/3ESa7NuUCKxyi4sAEWdIQ7EUpHlKQKRRZekqSAbIOR8PTTWKr0vBY0EJVKsPXa30rHkp5SKpUKx7598f19FVonR8Knr+dm1kBEXCjMbQvhR5SOKEkVhiy8JEkBpyNvIyyuUMuxIXWc66DDhot3QjAaH3M4AEkqAeZVq+KzahUOffsS/8d2wo43IjvTEhZ1hpMrlI4nSRWCLLwkSQGbLx5FrU3jeb+WaNQaqtk3JMfiAhdi878CTZLKitrSEvfPP6Py9GlkhkZwba0FSWm1YPUo2PYJGI1KR5SkJ5osvCRJAQeiDgHwvG/uWG8v+LVBrU1h7bkQBVNJ0r/sXnwR39V/YubtTeTqWGJuNMW4ZwasHACZyUrHk6Qnliy8JKmMGY2CG2mnsFZ54GKVOxxA56ptANgTsUfBZJKUl1mVKvgsX4bTkCEkHggnNDiIzJDtML8jJIYpHU+Snkiy8JKkMnY2JgFhcY3ajg1NzzlbOmOv9iUi/QQ5BnkqRyo/VGZmuH7wPp6zfyInKZvrOzy4cywmd6T7sINKx5OkJ44svCSpjK2/EIxKncXzfi3zPF+/UjOERRiHQuXl+1L5Y9u2Lb5rVmNZpy5R+8yJOmCFcV5XOLZU6WiS9ESRhZcklbEDkYdAqOjkn7fw6lXjOVQqI39e2K1MMEkqhM7NjSqLF+H81lvcuWjk+g4PMhaPgy2TwGhQOp4kPRFk4VUMS5YsoW7dugQFBTFo0CBCQ0Np164ddevW5bnnnuPGjRsADB06lDfeeINmzZrh5+fH7t27GTZsGDVr1jQNtApgY2PDf/7zH2rXrk379u05fPgwbdq0wc/Pj3Xr1gEQGhpKq1ataNCgAQ0aNODAgQMAREdH8+yzz1KvXj3q1KnD3r17y3x7SIUTQnAj/RS2am8cLBzyTGtVpSEqoyUhNw8olE6SCqfSaKg0ZjRVFi3CqHEgdIcbCUsWIJa9BBnyqlxJKowsvB7T2bNnmTJlCjt37uTkyZPMnDmTMWPGMGTIEE6dOsWAAQN4++23TfMnJiZy8OBBvv/+e7p168b48eM5e/Ysp0+f5sSJEwCkpqbSrl07zp49i62tLR999BHbtm1j9erVfPzxxwC4uLiwbds2jh07xsqVK03LWL58OR07duTEiROcPHmSevXqlf1GkQp18WYCRrNQat3Tv+surVpLZYsgEoynSc+SN1l/2qRl5bBw/3VOht9WOkqRWDdtgu/aNVi1aEnsUQcilxzD8GN7iL+qdDRJKtcqxr0aN78PMadLtk23QHjhqwIn79y5k759+5pufu3k5MTBgwf5888/ARg0aBDvvfeeaf6uXbuiUqkIDAzE1dWVwMBAAGrXrk1oaCj16tXDzMyMTp06ARAYGIi5uTk6nY7AwEBCQ0MByM7OZvTo0Zw4cQKNRsOlS5cAaNy4McOGDSM7O5sePXrIwquc+vPcXlQqAx39nsl3+jMeLVkReoj1F47yUt2mZZxOUpJGrWLKxvO82cafIC+Hwl9QDmidnPCaM4eEhYu4OX0aGSuS8Ih+HqvRi8D3WaXjSVK5JI94lY+e2VgAACAASURBVBFzc3MA1Gq16ee7j3Nyco9u6HQ6VCrVA/PdO8/333+Pq6srJ0+eJCQkhKysLACeffZZ9uzZQ+XKlRk6dChLliwps3WTiu5gVDAIDS9WbZ7v9P6BzwOw6cruMkwllQfmWg2+ztZcjHmyxshSqdXohw/DZ/lysHUnbJM5cR8MQByer3Q0SSqXKsYRr4ccmSot7dq1o2fPnrzzzjvo9XoSEhJo0aIFK1asYNCgQSxbtoxWrVqV+HLv3LmDp6cnarWaxYsXYzDkdmgNCwvD09OT1157jczMTI4dO8bgwYNLfPlS8YSnn8RO54+1mXW+0/2dKmNmqMy524fLOJmktDuZd0jXz+D0nWZAI6XjPDLLoCB8164jetKH3Nq2g7T3puDxxkm0faaDpmL8qpGkkiCPeD2m2rVrM2nSJFq3bk1QUBDvvPMOP/zwAwsXLqRu3bosXbqUmTNnlvhy33zzTRYvXkxQUBAXLlzA2jr3F/ju3bsJCgqifv36rFy5krFjx5b4sqXiuXgzlhxtRL79u+5V1bYRaeorxKbIjspPE1szW9JVESQYrpKe9WReIaixs6PyrB9w++Rj0uKtuDb1L1KnvADpiUpHk6RyQyWEKPd35W3UqBEhIXlvpXL+/Hlq1qypUCLpLvk+FN3Uv1exPPRzPmn0P/rULrj/y4KQ7Xx/djwjqn7K2Ba9yjBh+ZHfd/5J9Sjr0vn/XuLazQxWdVtKoKd9KScrXRkXLxH55jCyIuPQN9RRadrvqNxqKB1LksrEw7738oiXJJWRA5HBYNTRpVqzh87Xt84zCKMZu27IIUGeNtWdqqIxj+VCTJLSUYrNono1fNdvxb5jK+KP5hD2UjeyD/6f0rEkSXGy8JKkMhKefgo7VXUsdGYPnc/WwgI7UYvQ9GM8AQekpRJU37UmKm0aJ6NvKB2lRKitrPCY+QsekyeSmajh+qhJJM9+D+TnWnqKycJLksrAxVsRGLQxee7P+DBB+qYY1Akcj7lUysmk8qS6UzUAzt66qHCSkmXffyi+f/wfOr01ETPXE/1qe9J3/YHIkePVSU8fWXhJUhn449zfAHT0z3/8rvv1qNEOgFVnt5ZaJqn8qepYFYAbKdcUTlLyzKrVxnvzARzbVOP2oUhC3/iIy43qEPlSK27Pmkj29bNKR5SkMiGv8ZWkMnAw6hDCYEXn6kUbJqBdQA3EHhcOxx4ExpRuOKnccLRwxErjyB0Rzp30bOwtdUpHKlFqCwvc5qzFOewCqeuXkLp/PykXYkk6tQ5+Woe5swbrIH9s2nXCstMA1NZ2SkeWpBInCy9JKmVCCMIzTmFPDSx0RfvK6TRq3HT1iM3eSVp2GlY6q1JOKZUXXta+JKfEcik2mcY+TkrHKRVa7xrYj/4S+9EgcnLIPLiJlL/+IPXIKRJ2XSRhxyVUH8/EyscWm6YNsH6xH2YN2qBSy5M00pNPfoolqZRdiL+OQZ1Abaei9e+6q7l7S1DlsPXa/lJKJpVHtSpVR20ey/noJ+OejcWl0mqxaNUN5y8W4731ONX378Hzv6/h0NyP7PhUYpfv4drAt7jSpDbRg9uTNO9zDLFhSseWpMcmC68SZmNjk+/zQ4cO5f/+r+BLqUeMGMG5c+ce2vaaNWsKnUcqf/48txugwPszFqRXrWcQRh3rLu0qhVRSeVXftSYqdQ7Ho5/Om02rHV2wHfAObvM24X/oHP5/LsLt1eex9HIg6XgEkd8t51KbjoS2C+LWhP6kb1mOyMpUOrYkFZk81VhOzJs3r9B51qxZQ5cuXahVq1YZJJJKysGoQ4hsOzpVD3yk1wVVroQ6I4AzicGllEwqj6o55l7ZeCH+IvC8smHKAbNaTTGr1RRHQGRmkL7zd1K3rifl+AXiNp4gbuNJ1GafYV3VCevmzbDpNhBdtQZKx5akAskjXsUwffp06tSpQ506dZgxY0aeaUIIRo8eTfXq1Wnfvj03b958aFtt2rQxjXJrY2PDpEmTCAoKolmzZsTGxnLgwAHWrVvHf/7zH+rVq8fVq0/nX8NPGqMwEpFxBjtqYm3+aB2l1WoVfjYNSRc3Cb0TWjoBpXLHz8EPUBGZdl2O43YflbkFVi8MotL3q/DdfYqqOzdT+Z3+2Nb1ID00kZh5m7nSbQBXm9ciZmRnUn6bifFOvNKxJSmPCnHE6+vDX3Mh4UKJtlnDqQYTm0wscPrRo0dZuHAhwcHBCCFo2rQprVu3Nk1fvXo1Fy9e5Ny5c8TGxlKrVi2GDRtWpGWnpqbSrFkzvvjiC9577z1++eUXPvroI7p160aXLl3o06dPsddPKhtnb13EoEp+5P5dd7Xzbs3V67+y/tIuxjR+tYTTSQ/z/fffM2/ePFQqFYGBgSxcuJDo6Gj69+9PfHw8DRs2ZOnSpZiZPXxA3EdlqbXEQefGLXUkt1IycbG1KNH2KxKthy92Iz/BbiQIo5GsI9tI2fw7qYdPcHv/VRL3zEH1+Wysqlhj+9wzOIz/DpW2Yl0pKj155BGvx7Rv3z569uyJtbU1NjY29OrVi717/73Fy549e3j55ZfRaDR4eHjQrl27IrdtZmZGly5dAGjYsCGhoaElHV8qI6sv5I7f1amI43fdr0vNOhgzndkRtqckY0mFiIyMZNasWYSEhHDmzBkMBgMrVqxg4sSJjB8/nitXruDo6Mj8+fNLZfk+dgFozGO5FJNSKu1XRCq1GvOmHdFPnkeVTSFUO3QQr8/ewvHZqmTfySBm/lai+jTGGHZU6ajSU65CHPF62JGpJ5FOp0OlUgGg0WjIkaM7P7GCo4MxZjnTvtrj3RzY19kas+yaXE8NJtOQibnGvIQTSgXJyckhPT0dnU5HWloa7u7u7Ny5k+XLlwMwZMgQJk+ezBtvvFHiyw5yqcHxuH2cjY7jmarOJd7+00Bt64jNS6OxeWk0LkYj8Z+P49Zv28h6pR+eE/qi6/oJ6OTRRKnsySNej6lVq1asWbOGtLQ0UlNTWb16Na1atTJNf/bZZ1m5ciUGg4Ho6Gh27Sr+lWm2trYkJycXux2pbOQYc4hIP4OtqPnYA2GqVCoCHZtiJIsj0fnf6V4qeZUrV+bdd9+lSpUquLu7Y29vT8OGDXFwcECrzf171dPTk8jIyFJZfl2XGqhUguPRFevWQUpRqdU4fzKLyt99SWayOaGf/0H6Z80h7KDS0aSnkCy8HlODBg0YOnQoTZo0oWnTpowYMYL69eubpvfs2ZOqVatSq1YtBg8eTPPmzYu9zP79+/Ptt99Sv3592bn+CXDi5mmMqgzqPGb/rrteqNoSYdSy/vLOEkomFSYxMZG1a9dy/fp1oqKiSE1N5a+//iry6+fOnUujRo1o1KgRt27deuTl37110KXb8l6dJcmuS098Vv0BNs6Erc4g6dMesHECZCQpHU16ilSIU41Keeedd3jnnXfyPJeSktsnQ6VS8eOPPxa5rd27dz/QBkCfPn1Mnelbtmwpx/F6gmy8lNsvq6N/y2K107pqZT477MfB6AMlEUsqgu3bt+Pr60ulSpUA6NWrF/v37+f27dvk5OSg1WqJiIigcuXK+b5+5MiRjBw5EoBGjYp2m6h7edl6oUbHzYxQjEaBWq16/JWR8rCoUQPf1euIGP0WkQdOkZm0EucLm1B1nQHVOiodT3oKlPoRL4PBQP369U2dxa9fv07Tpk0JCAigX79+ZGVllXYESVLEwehgDBnutAnwLVY7Hg6W2FOHxOwIIlNK59SWlFeVKlU4dOgQaWlpCCHYsWMHtWrVom3btqaBkBcvXkz37t1LZflatZZK5lUwaKOJvJ1eKst4mmmdnamyZCn2PXoQd8aWyF06jEv6wR8jIDVO6XhSBVfqhdfMmTOpWbOm6XFZXRVUXvXs2ZN69erl+bdlyxalY0klLCMng6j089gYa1LJtvgd4pu4tgBgT/jeQuaUSkLTpk3p06cPDRo0IDAwEKPRyMiRI/n666+ZPn06AQEBxMfHM3z48FLLEOAQgNo8hosxsl9naVCbmeE+9Utc/vMfkq/mEHa4NtlH1sGPjeHUKpBjqEmlpFQLr4iICDZu3MiIESOA3EFFd+7caTp1NmTIENasWVOaEcqd1atXc+LEiTz/OnaUh7crmuOxxxGqHOroi9e/664OVQMxZjmy+druEmlPKtynn37KhQsXOHPmDEuXLsXc3Bw/Pz8OHz7MlStX+P333zE3L72rTOu71UStS+ZklDzKWVpUKhX64cPw/Ol/ZMVncn2PP+lZXvDna7CsL9wOVzpikRljr5L4xetk7FuvdBSpEKVaeI0bN45vvvkG9T93lI+Pjy/yVUHF7ZwqSUradHUvQqh53rf4F1UANPfXk5NandPxR8k2ZJdIm1L5VqdS7hAkJ2+W7ODQ0oNs27bFZ8VvqK1sCPv9DnfsX4Ww/fBTMzj8CxiNSkfMX2YK4thybr/bhqsvvEDM0r+JGP8exsSH3ylFUlapFV4bNmzAxcWFhg0f7y/+kSNHEhISQkhIiKmDqyQ9KQ5FBWNI96JVQP6drx+V3sYcN10QOSKDYzePlUibUvkW4BAAwLU7VxRO8nQwr1oVn99XYVm3LlE/b+Gm+nWEZ2PY9C4sfAFulZMrTI1GuLYbVr9O6oSaXH/rv0RviEXr7ILLq53JToZbEwcpnVJ6iFIrvPbv38+6devw8fGhf//+7Ny5k7Fjx5quCgIeelWQJD2pkrOSicm8jJWhBp6OViXWbusqLRBCw9+yn9dTwcXKBTOVNQlZN8g2lNMjLhWM1tGRKgvm49C3D/GLVxAR7Imx0yyIuwhzWsLf34JSR5xvXYLtn8KMQDJ/6M2NH3dwY7sNBp07Ht9+g89fe9BP/A6HFn4k7A0jffM8ZXJKhSq1wmvq1KlEREQQGhrKihUraNeuHcuWLSuzq4IkSSlHYo4AgsAS6t91V+uAyhjSfOTtg54SKpUKdytfMIsmLD5V6ThPDZWZGW6ffYbrhx+SsmsXoVNXk91rHdToArumwNw2EFlGR53TEnJPdf7SDv7XmOztPxB9xJ5rW1xJT3LA5T/v4r9tB/Zdu6L6p0uPy7eL0FiqiZ7yHSJJnnIsj8p8ANWyvCpICTY2Nvk+P3ToUFPBKVVs26/vRxh1POfbpETbbeLrhDG1OlFp14lJjSnRtqXyqbpTNdTmsVyIllc2liWVSoXT4EF4/fwz2VFRXB/yBmn+Y6D/b7nF0LznYMskyEor+YXnZMH5DbBiAHxXDTa9izE9k1sZPbi6xYvbp5NxHDAQ/61b0Q8fjvq+Czw0+kq4vTeOzHgVCR8PLvl8UrGVSeHVpk0bNmzYAFCmVwVJkhIORQdjSPOhuZ9ribZra6HD3yb3KNr+yP0l2rZUPjV0q4VKk8nRqGtKR3kq2bR6Bp+VK1Db2nBjyFBun8uEtw5BgyFw8EeY3Ryu/V38BQmRexRt039gWnVYOQDCDyMaj+S212dc/V1D3JrD2LR6Fv8N63Gb9CFaR8cCm7Pt9xo2QVW4te06WTsXFD+fVKIqxMj1MV9+Seb5kr3yx7xmDdw+/PCh80yfPp0FC3I/1CNGjGDcuHGmaUIIxowZw7Zt2/Dy8sLMzOyhbR05coSxY8eSmpqKubk5O3bsQKfT8cYbbxASEoJWq2X69Om0bduWRYsWsWbNGlJTU7l8+TLvvvsuWVlZpkveN23ahJOTE23atKF+/frs3buX1NRUlixZwtSpUzl9+jT9+vVjypQpAPTo0YPw8HAyMjIYO3YsI0eOxGAwMHz4cEJCQlCpVAwbNozx48cXc6tWfHHpcdzKDMM8uzP+laxLvP22vnVZFGHH7vC99K7Wu8Tbl8qXms7VADh76wLwjLJhnlLmfn74rlxJxPjxRH/4IZlXhuEyYRqqwD6w7m1Y0g3qD4IOn4NlwcVQvu5EwulVcOK33H5kGnOo0RlRtz+p0ebcnDadzMursQwKovLMmVg1qF94m+QesXP7fj7XOnUg+vOvqdK4Cypbl8dYe6k0VIjCSwlHjx5l4cKFBAcHI4SgadOmtG7d2jR99erVXLx4kXPnzhEbG0utWrUYNmxYvm1lZWXRr18/Vq5cSePGjUlKSsLS0pKZM2eiUqk4ffo0Fy5coEOHDly6lHtlzZkzZzh+/DgZGRkEBATw9ddfc/z4ccaPH8+SJUtMRaCZmRkhISHMnDmT7t27c/ToUZycnPD392f8+PHo9XoWLFiAk5MT6enpNG7cmN69exMaGkpkZCRnzpwB4Pbt26W8RSuGw9GHAaijb4hKVfK3eWkZ4My8C9U5FH2QbGM2OvXj3XxbejLcvbLxRrI84qUkjYMDVebOJXbqVyQsWEDW1at4TPsOzRv74e+vYf8suLwVXvwOanV7eGNZqbmnEk8u/+domYAqzaHrTKjVg4zQaG5+/S2pBw6i8/Ki8owZ2Hbs8Mj7E52HJ5XeGkHs979w54vBOEzdDKWwT5IeXYUovAo7MlUa9u3bR8+ePbG2zj2q0atXL/bu/fdqsz179vDyyy+j0Wjw8PCgXbt2BbZ18eJF3N3dady4MQB2dnamZYwZMwaAGjVq4O3tbSq82rZti62tLba2ttjb29O1a1cAAgMDOXXqlKntbt26mZ6vXbs27u7uQO4p3/DwcPR6PbNmzWL16tUAhIeHc/nyZapXr861a9cYM2YMnTt3pkOHDsXfaE+BXTcOIAwWtPUv2l+mj6qBtyOqjBpkGI5w6tYpGrqWbAd+qXyxNbPFWuPMHcMNMrINWOg0Skd6aql0Otw+/i/mVQOImfIFYS+/jOdPP2HWfjLU7glrR8OqQVCza24BZuv274uNRgjbBydXwLm1kJUCDt7QeiIE9QMnP7JjYrj12TfcWbMGjZ0drh9+gGP//qgKOVvyMI6vjSNp/TpubrqOTeeFaFvl/8e/VLbKvHO9VDLu7RunVqtNj9VqtWm4jnvnu3eee+fbvXs327dv5+DBg5w8eZL69euTkZGBo6MjJ0+epE2bNsyZM8d09wHp4YKjg8lJ86OZX+mMPWeh0xCkbwRCzb7IfaWyDKl88bL2R2Uew5WbKUpHkQDHl1+myvx5ZN+8RWjfl0g9fBjcg+C1XdB+MlzeBv9rAseWQtxl2PE5zKwLi7vC+fVQpxe8uhnePgFtP8Bg5sLNGTO42ukFkjZswOnVV/HfugWnwYOLVXQBqNRq3KfPxZCjJvbLqZAUVSLbQCoeWXg9platWrFmzRrS0tJITU1l9erVtGrVyjT92WefZeXKlRgMBqKjo9m1a1eBbVWvXp3o6GiOHDkCQHJyMjk5ObRq1Yply5YBcOnSJW7cuEH16tVLdD3u3LmDo6MjVlZWXLhwgUOHDgEQFxeH0Wikd+/eTJkyhWPH5KCdhYlIjiAxKwZdVjVquNmV2nJa+XuRk15Fjuf1lKjlXA21+S3ORiUoHUX6h3WzZviuWonGyYkbw4aTuGoVaLTwzHh44wC4BsK60fBjI9g3HSpVh97z4d1L0O0H8G6BMBpJ/O03rnboSPycn7F97jn8Nm/G9b3/oLG3L7Gs5tWq4Tz0ZZKua0mZPlTeg7IcqBCnGpXQoEEDhg4dSpMmuUMGjBgxgvr1/z291LNnT3bu3EmtWrWoUqUKzZsXfOsYMzMzVq5cyZgxY0hPT8fS0pLt27fz5ptv8sYbbxAYGIhWq2XRokUlfhVop06dmDNnDjVr1qR69eo0a9YMgMjISF599VWM/9wqY+rUqSW63IrocExu/67ajg3RqEuvL0WLAGdmHa3O5dtbiEuPw9nSudSWJSmvoXtN/rxm5Fj0Jfrhq3Qc6R9m3t74rPiNyHcmEPPxJ2ReuYLre++h0vvDkPVw+ndIi889wnXPaUchBCm7dnHzu2lkXbuGVaNGuPw8B8vAwFLLqh/3Pkl/bSF63XX8n5+HuuVrpbYsqXAqIcp/+duoUSNCQkLyPHf+/Hlq1qypUCLpLvk+/GvsznfZfv0Ab/kt4c22AaW2nByDkXpfLULl+T1TWk6he0DFG4Q4v+/8k6q463Ix4SJ91vfB1ziSda+OKcFkUkkQOTnc/PY7EhYvxrplSyp/Px2NXf5HvNNPn+HmN9+QduQIZr6+uLw7AZt27UrlQpz7pYWEEDZwEI41M3FbsAscvUt9mU+zh33v5alGSSoBQggORx/GkOpPUz99qS5Lq1HTpHIdVAY72c/rKeBn74cKDZGp8srG8kil1eL6wfu4T/mc1MOHCe3Xn6zQ0DzzZEVEEvnufwjt25fMq1dx/fi/+K1bi+1zz5VJ0QVg1agRjr26kHjejPTZw8vvjb+fArLwKmM9e/akXr16ef5t2bJF6VhSMV29fZWUnERUGVUJrFxy/TMK0sLfmazkAPZFHsBgNJT68iTl6DQ6HHQepBFBUoZC9wmUCuXQpw/eC+ZjuH2b6/36k3rgAIakJGK//ZZrL75I8rZt6EeNyu04/8orqHRlPxRMpQ8/QetkR/TaUMTBOWW+fCmX7ONVxu4O2yBVLMExwUBu/y4zben/PdPC35mcPdVJcTjG6bjT1HOpV+rLlJTjaxdAfOpxLscm09DbSek4UgGsGjfG5/dVRLzxBjdeG4naxgZjUhL23btTaezb6P4ZzkcpGhsb3D77kojRY4j/4Ruca3QEvb+imZ5GT/QRryege1qFJrf/v/ZFHMSY5URLn6plsrwabrbYUgtQsT9K3j6ooqtTqTpqs9ucipQ3PS7vzDw98f7tN+w6dsAyqC6+f/6Bx1dTFS+67rJt3x7bds8Sd8qCzPnDQR4xL3NPbOFlYWFBfHy8/OWvECEE8fHxWFhYKB1FcTnGHEJiQ8hJDaCpb9kcjVCrVbTwqYI605t9EbKfV0XX0D33ApZjMecVTiIVhcbGhsrTp1Nl7lwsyuHFR66TP0dlYUnM+huIfbOUjvPUeWJPNXp6ehIREcGtW7eUjvLUsrCwwNPTU+kYijsff54MQyqkB1C/yiPeq60YWgTo2bY3gLPmO0jISMDJQp6CqqiqOebes/FSwmWFk0gVgc7FBZf3PyTm44+5PX8ajjU6gUv5KxArqie28NLpdPj6yjFtJOXd7d9V3b4elmZld0uXFv7O5Gyujqi0nQNRB+ji16XMli2VLQ8bDzRYEJNxXekoUgXh0LcPSWv+5Obx49gsHYFu3G7QyHu/loUn9lSjJJUXB6MOYcx0o0UZ/yHgo7fC1dwfLbbsj5T9vCoytUpNJfMqZKkjiUvJVDqOVAGoVCrcvvgSIXTE/hUJe6crHempIQsvSSqGTEMmx28eJyfFv8z6d92lUqlo4e+CIaUq+yP3YxRyXJ6KzN+hKhrzWC5GJykdRaogzH19cX5rNMnhliQvnwFRJ5SO9FSQhZckFcPJmyfJNmZhSPengXfZ9e+6q4W/nrQ7VUnMTOR8vOx4XZHVd62JSpvG0cgbSkeRKhD98GGYB/gTE2KPYeXrkCOPqJY2WXhJUjEExwSDUBNgE4S9Zdn3j2gRoMeQWhVQyVHsK7h6bjUAOBkrC2yp5Kh0Oty/+IKcdDW3dkTBbnlf3tImCy9JKoZDUcEYMz1p5ltZkeW721vi6+iKlfCWhVcFV9Uxd4y4q3euKJxEqmgsg4JwHDSQxKvWpK35CcKPKB2pQpOFlyQ9ppSsFM7EnyFbgf5d92oRoCc1MYBTcae4k3lHsRxS6XKycMJcZU9cZqgcv1AqcS5jx6J1cyM6RI/xj1GQlaZ0pApLFl6S9JiO3TyGURgwpPrTWMnCy9+ZtKSqGIWRg9EHFcshlT53S1+Muhgib6crHUWqYNTW1rh/+ilZtyF+Xyzs+EzpSBWWLLwk6TEdij6ESmipYl0LZxtzxXI099NjTPfEXGUjh5Wo4Ko7VUVtHsuFmNtKR5EqIJtnn8Wuc2fiztuTufUXuL5X6UgVkiy8JOkxBUcHIzJ8aObrqmgOR2szark7Yp5Tg/2R++VpqAqsoXstVOocjkTIfl5S6XD98AM0NnZEH3dFrHkDMpOVjlThyMJLkh5DQkYClxIvkZnsTxMFTzPe1cJfT/wtP26l3+JS4iWl40ilpO4/t3U5feuiwkmkikqr1+Py/vukxwhuhyTA1v8qHanCkYWXJD2GwzGHAchJ9aeJr17hNNAywJnM5AAA9kbK0wMVlZ+DHwgVYcnyiJdUeux7dMe6RXNuntGTvXcxXNmudKQKRRZekvQYgqOD0WCJm0UAlR0slY5DY18nNEZ7HLU+sp9XBWaptcRG60pidjg5BnmnAql0qFQq3CZPRqi0xJz2RKwZA+myX2FJkYWXJD2Gw9GHEel+NPOtpHQUAGzMtQR5OSDSqnPi5glSslKUjiSVEk9rP1Rm0YQlyMv9pdJjVqUKlcaMJuV6DskXbsNf7ysdqcKQhZckPaLolGhuJN8g7Y6vosNI3K+Fv57oaG9yRA7B0cFKx5FKSS19dVRm8ZyNilM6ilTBOQ0ZgnmtmsSccsNwZAVc2Kh0pApBFl6S9IgORR8CwJAWUC461t/Vwt+ZnDRvzNVWsp/XfQ4cOMDy5ctZsmSJ6d+TqknlWqhUguAIeesgqXSptFrcP/8cQ2o2Ny/5wPqxkBqvdKwnnlbpAJL0pDkccxgz7DDTeeHnbK10HJP6VRww1+rQa2qzPyp3WAmVSqV0LMUNGjSIq1evUq9ePTQaDZDbh2Xw4MEKJ3s8NZ2rAXA+/iLwgrJhpArPsnZtnIYMIWHBAuxcU7He+A68tFjpWE80WXhJ0iMQQhAcHYwxPYDmvvpyVdhY6DQ08nHkxu2q3LY+wtXbVwlwDFA6luJCQkI4d+5cuXqviqOKbRVUaIlIva50FOkpUWnMaJK3biXmjD2+TmtQ1/oD6vRWOtYTS55qlKRHcP3OdW6l3yLltg9NfMrPaca7Wvg7ExFVBYD9UfLqRoA6deoQExOjdIwSo1VrcdR6kWwMJyPboHQc6SmgtrTE7dPJZMXeIe5Ghlio3QAAIABJREFUNdg4AZIrzneqrMkjXpL0CIJjcjut5yh8f8aCtPDXI7Y44GLhzd7IvQypPUTpSIrp2rUrKpWK5ORkatWqRZMmTTA3//fWTuvWrVMwXfF42/kTlx7M1Vsp1PawVzqO9BSwadkS++7did+wATvnLCzWj4WXV0AFOZJclmThJUmPIDg6GEtVJdC4UsPNTuk4DwisbI+tuRYbQx2OxW4lLTsNK52V0rEU8e677yododTUrVSD4wnbOREZKQsvqcy4vD+RlL17iT7vjI/1X6hOLIf6A5SO9cSRpxolqYgMRgOHYw4j0v1p7OOERl3+/tLTatQ09XPi1k0fso3ZphH2n0atW7emdevWVKlShaZNm5oeN2nSBG9vb6XjFUujyrUACImSVzZKZUfr6IjrBx+QcS2WxPg6uWN73YlQOtYTRxZeklREFxIvkJyVTGK8T7kaRuJ+LfydiYp1x0Jjyb7IfUrHUVzfvn1Rq//d1Wk0Gvr27atgouKr6ZR7ZeOlxMsKJ5GeNnZdOmPdqhU3D6SRnWSEtW+BEErHeqLIU42SVER3ByU1pJaPG2MXpEWAHoQWL6u67Ivc99QPK5GTk4OZmZnpsZmZGVlZWQomKj4XKxe0WBOdJq9slMqWSqXCffInXO3ajehrQXiZ7Ub1hTvYuICN6z//u4C1S/7PmT2dXR/uJQsvSSqi4Ohg7DSe5KgdqFOO+9VUc7FFb22GOr0GkTnB/8/efYdFdeZtHP9Oo/cqRUBEERBFEHsBe0zE3jV2ExON0TTfdHdTTEyMxGTXbtRorLHEGI0Kxo5iVxArSpcqdajz/kFk424UC8OZgedzXVzKmTln7kGZ+c1TuZ17Gw9LD6ljScbe3p6dO3cSFhYGwI4dO7Czs5M41bORyWTYG7qTWJhInroUcyOV1JGEekTl4oLDzNdI+3weuV1exdJLBvl3IT8Nsm7CneNQ+JCFVg3M/1OIVRVojg8eM3MEU3tQGv79NfScKLwE4TGUlpdyJu0MysJ2tHKzwkCpu730crmM9o1tiUpwhQZwJOlIvS68Fi9ezOjRo5k+fToArq6urF27ttrzcnJymDx5MpcuXUImk7Fy5Uq8vb0ZPnw48fHxeHh4sGnTJqytrbX9FP5WY8smJBfu4WpaHkHuutsCK9RN1mPGcG/Xr6St+wP5P/+Bsok9SltbFHZ2yA0NobwUCjIqi7GC9Mo/89MgP/0/x+7GQv5BUN/7+wcxsnqw1ex+K5qVG/j2B4V+fuAQhZcgPIbz6edRl6spSm/I8La6/ybXobEduy6k4N3YjSPJRxjjO0bqSJKRy+WcOHGC/PzKjcPNzMy4dav6LrqZM2fSp08ftmzZQklJCYWFhXz22Wd0796dOXPmMG/ePObNm8cXX3yh7afwt1o6NuPI3R2cSrghCi+h1skUCpw++SfxI0aS+Or0B26TW1igtLVFaWeHws4WpZ09Sjs7lHYeKO1ao2hoh9LeDqWNDTKVCsqKK1vMCu7+p+WsqkD781jy2cpjJXmVD3JmDQz9AUz07/++KLwE4TFEpUYhQ05ZgadOj++6r6OXLQBOqgCiU/eiLlNjpDSSOJU0Bg8ezJkzZzAzM6s6NmTIEE6fPv3Qc+7du8ehQ4f44YcfgMpxYQYGBuzYsYODBw8CMG7cOEJCQiQrvIKdfeEinE2NBYIlySDUb0be3jSJjKAkIZGyjHTKMjIoz8ykLD2DssxMyjLSKY6JpSDzCBV/fvD5bworK5T2dijs7FDa2v1ZoNmisGuC0q4DysZ/FnDW1sgUCigphEtbYNdsWN4dRm4E+6a1/MyfjSi8BOExnEw5iY2yEUUyE1o1lKZr6Um42ZjgYmVM0T0vijU7iU6LppNLJ6lj1aorV65w+fJl7t27x88//1x1PDc3F7Va/chzb926hb29PRMmTOD8+fMEBQURHh5OWloaTk5OADRo0IC0tDStPodHaWrTBIAb965LlkEQFFZWGFtZVXu/CrWasoxMyv8s0MoyMiv/zMyg/M/vi86fpywjA01R0f9eQC5HYWOD0s4OlYsL9kP/jdHJObC8BwxdCV49tPDstENrhZdaraZLly4UFxdTVlbGkCFDmDt3Lrdu3WLEiBFkZmYSFBTE2rVrH5hxJAi6prC0kAvpFzAv7k4LVyuMDRRSR6qWTCajQ2Nb9sYWYehpyJGkI/Wu8IqLi2PXrl3k5OTwyy+/VB03Nzdn2bJljzy3rKyMM2fOsGjRItq2bcvMmTOZN2/eA/eRyWQPnS26dOlSli5dCkB6evozPpO/Z25gjpHMlvTieK1cXxBqktzICANXF3B1qfa+FQUFfxZlf7aeZaQ/0JJWdPYs8UeO4PjaG1ip1yJbNxR6fwZtX9aLlfS1VngZGhoSERGBmZkZpaWldOrUieeee44FCxYwa9YsRowYwcsvv8yKFSuYNm2atmIIwjM7nXaaMk0ZaXdd6Ruo+92M93XwsmXz6UQ6WQVwNKn+7dvYv39/+vfvz/Hjx2nfvv0Tnevq6oqrqytt27YFKrsm582bh6OjIykpKTg5OZGSkoKDg8Pfnj916lSmTp0KQOvWrZ/tiTxCA+NG3ChKICO/GDuzujkDTKh/5KamGJiaYvCQhY7LMjNJfmcOqfMXUdCzO06BDVHsmVM5WL/vV6DU7cYcrU3NkslkVWMqSktLKS0tRSaTERERwZAhQ4DKMRLbt2/XVgRBqBEnU0+ilKkoznenrR6M77qvQ+PKJRMsNf7E58aTkJcgcSJptGrViu+//55XXnmFiRMnVn09SoMGDWjYsCFxcXEAHDhwAF9fX8LCwli9ejUAq1evpn///lrP/yhNrb2QG6YTk5IlaQ5BqE1KW1saLl2Cw1tvkhf5B7d+zKLIdRycWQ1rB0DBQ5ay0BFaHeNVXl5OUFAQ169f59VXX6Vx48ZYWVmhVFY+rKurK0lJSdqMIAjPLColCntVU3IwIMhD98d33edoYURje1MyMxqBHI4mHWVEsxFSx6p1Y8eOpVmzZuzdu5cPP/yQdevW4ePjU+15ixYtYvTo0ZSUlODp6cmqVauoqKhg2LBhrFixAnd3dzZt2lQLz+Dhgpx8+T2pgpMJcXRp4iRplppWWlpKYmJitePxBO0xMjLC1dUVlUr3lm2QyeXYTpqESVAQSW+8SfzCSBxGjMMmYQOyZaEwaiM4VP97LgWtFl4KhYJz586Rk5PDwIEDuXLlymOfWxtjJAShOjnqHK5kXcG+LAxfJwss9Gyhyg6N7dh6pgi3lq71tvC6fv06mzdvZseOHYwbN45Ro0bRuXPnas8LCAggOjr6f44fOHBAGzGfSpBT5Z6NF9LjgBBJs9S0xMREzM3N8fDwqNc7L0hFo9GQmZlJYmIijRo1kjrOQxkHBNBo28+kvP8Bd3/8nYI2oTg3OYtyeU8YvBy8+0gd8X/UyiqQVlZWhIaGcvz4cXJycigrKwMqf7FcXP5+oN3UqVOJjo4mOjoae3v72ogpCP/jVNopNGhITnXRi2Uk/ltHL1sKSyrwtmhNVGoUJeX6vVXO07j/ad3KyopLly5x79497t69K3GqmuFp6QkaObfz6t7MRrVaja2trSi6JCKTybC1tdWLFkeFhQUu4Qtp8NGHFJ67wq299hQUuMBPI+Dotzq3l6TWCq/09HRycnIAKCoqYt++ffj4+BAaGsqWLVsA3RgjIQiPEpUShZHCmKI8F70a33VfO09bZDJQqn0pKivizN0zUkeqdVOnTiU7O5t//vOfhIWF4evry9tvvy11rBqhUqgwVziTVXIbjY69udQEUXRJS59+/jKZDOuRI/HYtBG5uSV3fs4jPTUIzd4PYPsrlYu06gitdTWmpKQwbtw4ysvLq8ZFvPDCC/j6+jJixAjef/99WrVqxaRJk7QVQRCeWVRKFI4GvqSjoLWH/hVeViYG+DlbcCfZFJWJiiOJR2jn1E7qWLVq8uTJAHTt2pWbN29KnKbmuZg2IkZ9iZR7apytjKWOIwiSMmrWjEZbt5D6z0/I2LaNAq8AXNQbUGXdgOHrwEz6HjStFV4tWrTg7Nmz/3Pc09OTkydPauthBaHGpBakEp8bT0NNWxrbm+rtdP0Oje344Wg8nTsHcjT5KG/yptSRalVOTg5r1qwhPj6+apgDwLfffithqprjY+vNlbzDnE9Ow9nKQ+o4dUqHDh04duzYI++zcOFCpk6diomJSS2lEqojNzHB+fPPMG3fjpSP53IrzROn3FjMc0Nh5E/QwF/afJI+uiDosJOplR8QEpJdaNPIVuI0T699Y1tKyitwNWrF9ZzrpBakSh2pVvXt25f4+Hj8/f0JCgqq+qor2rr4ARCVcFniJHVPdUUXVBZehYWFtZBGeFKWYWE02roFpas7iQfNSDtahmZpb4jdJWkusWWQIDxEVEoU5iorknPt9HJ8131tPGxQymWU5FfuZ3Yk6QhDmg6ROFXtUavVLFiwQOoYWtPSsRkAMRlxwPPShqljzMzMyM/P5+DBg3z88cfY2dlx6dIlgoKC+PHHH1m0aBHJycmEhoZiZ2dHZGSk1JGF/2LYqBEeGzdw98v5ZP34I4XptrjcexGD/u9C5zckWem+2sIrPDycCRMmYG5uzuTJkzl79izz5s2jV69etZFPECSh0WiISonCydCPZOR6OaPxPlNDJQENrbgcX06DBg3qXeE1duxYli1bxgsvvICh4X+6i21s9Pff9K+czZyRawxJKKh749fum/vLZWKSc2v0mr7OFnzUz++x73/27FkuX76Ms7MzHTt25OjRo7z22mssWLCAyMhI7OzsajSfUHPkBgY0eP89TNu1Jfnd97i135kGWfOxTL8CYYtAVbtjI6vtaly5ciUWFhb8/vvvZGdns3btWubMmVMb2QRBMrdzb5NWmEZFoRcuVsZ6P2i5g5cdl5JyaePYgRMpJyitKJU6Uq0xMDDgrbfeon379lXdjNrcxqe2yWVyrFUNyS1PoLyi7s1s1BVt2rTB1dUVuVxOQEAA8fHxUkcSnpB5jx54bt+GoW8Lko/bkLLidyqW9YW82h1+UW2L1/0pyrt372bs2LH4+fnVyWnLgvBXUSlRANxOciZEj1u77uvQ2JZvD1zDRuZPQenPnLt7juAGwVLHqhVff/01169fr9MtEm5mjUlXHyY+I5/GDuZSx6lxT9IypS1/bS1VKBQPTNQQ9IfK2Rn3NatJ/+57MpcupXB1Ei5JoRi9uh6cW9VKhmpbvIKCgujVqxe7d++md+/e5OXlIZeLMflC3RaVGoWdkSNZORZ63c14Xys3K4xUcrIy3VHKlPVq02wvL686P+OsuUMz5MpCTifdljpKvWNubk5eXp7UMYQnIFOpcJj1Og2XL6NcbkP8dsj+v/5oLv1cK49fbYvXihUrOHfuHJ6enpiYmJCZmcmqVatqI5sgSKJCU8Gp1FO4GbXmFrI6UXgZKhUEe9hw6mYhAT4BrL+yngsZF2hq3ZSm1k1pYtWExlaNMVHVvQLF1NSUgIAAQkNDH2i1qCvLSQC0d23O2qtwKimWYa2aSx2nXpk6dSp9+vTB2dlZDK7XM2YdO+K58xeS35xNalQ0hbNn02DWJRS93wctNjBVW3j17Nnzgb3JbG1tGTZsmE7tVyYINSkuK46c4hxcKhpjZ2ZIIztTqSPViPaNbflyTxwfDn6N/Yk7uJZzjZ+v/UxRWREAMmS4WbhVFmLWTWhqVVmUuZi7IJfpbyv3gAEDGDBggNQxtMrPvnLG6tXsqxInqVvy8/MBCAkJISQkpOr4d999V/X3GTNmMGPGjNqOJtQQpb09DVetJnPJYtIXLaLo/bW4XDmP8atrwUA7H0QfWnip1WoKCwvJyMggOzu7alxXbm4uSUlJWgkjCLrg/vpdtxMrtwnSp20zHqVjYzsgjqxsRz7u8DFQ2bqXlJfE1eyrXM2+yrWca1zNvsr+2/vRUPk7b6w0rizE/mwZu1+YWRpaSvdknsC4ceOkjqB1NkY2qLAgufCW1FEEQe/I5HLspr2CSZu2JM14mfhll3GI7YLNl9uRWbnW+OM9tPBasmQJCxcuJDk5mcDAwKrjFhYWTJ8+vcaDCIKuOJFygoZmHsTEGhDc0VrqODWmuYsl5kZKjl3PIKylM1A5I66hRUMaWjSku3v3qvsWlhZyI+fGA8XYvtv72HJ1S9V9Gpg2eKCrsql1U9wt3VHJVf+5TkkZtzMLuZ1ZgLmRio5edXeAu9TsDDxIVCdSXFaOoVIhdRxB0DsmQUF47t5H8syp3D10kcKhPXBa+G+UfqE1+jgPLbxmzpzJzJkzWbRokWhGFeqN0vJSTqedxt+yOzGg1yvW/zeFXEY7T1uO3cis9r4mKhP87f3xt//P1hoajYa7hXcfKMauZl/laNIxyjWVM7zkKDGVuSAvdaYg357cXDsq1E5oys0I9XYQhZcWeVp6kayO4frdXPyc684HBkGoTQorK1x/2Ej24gXcXbScW2NexvmdSZiOeLvGHuOhhVdERATdunXDxcWFn3/+35H+gwYNqrEQgqArLmVeoqisiPICLyyMlHg3qFtT8zs0tmVfTBoJWYU0tHn88Qs5hSXEZxZyO7OM+IwG3M40Jz7Tm9uZheQUFCI3TEdumIrcMBXM0pAbxlJmdRwTq8rzLVRWNPJ4DmijnSf2CJs3b2bo0KHVHtN3AY7NOJr+MycSruLn3FbqOIKgt2QyGTbT3sCkTQeSpk/lztyV2J08hd0X65GpVNVfoBoPLbz++OMPunXrxi+//PK3oUThJdRFJ1JOIENGfFIDgj1sUMjrxviu++63OB2/kflA4aXRaMgsKOF2ZgHxGZVdg/GZ//nzXtGDC646WxrhbmtKLz9H3G1N8bA1wd3WFDcbE0wNK19WstXZXMu+VtU65mrRoPae6F98/vnn/1Nk/d0xfdfW1Y/vL8GZlFgmIQovQXhWRkHt8dhziLRpg8jadxGrl86j8n72xZcfWnjNnTsXQCwdIdQrUSlReFl5cyYWRgbp/zIS/62Jgxl2ZoZsik4gPrOA25mFVX/mF/9nQUi5DFysjfGwNaVfSyc8bE2rCqyGNiYYqaofQ2RtZE0bpza0car9Vi6A3377jd27d5OUlMRrr71WdTw3Nxelsu5tU9vMtgloZNzIuS51FEGoMxSW1jivi6D0SnSNFF3wGMtJ/N3mspaWlgQFBREQEFAjIQRBFxSVFXE+/Twd7QZyBgiuA+t3/TeZTEaotz2bTydyLiEHNxsT3G1NCPawqWq1crc1wdXaBAOl/i4hAeDs7Ezr1q3ZuXMnQUFBVcfNzc355ptvJEymHcZKY4xlDqSp46WOIgh1i0yGyqfmdvqotvCKjo4mOjqafv36AbBr1y5atGjB4sWLGTp0KG+/XXMDzgRBSseSjlFWUUZZoRfGKgXNnfVjuYQn9cnA5rzWvQlOlkYoFfpdXD1Ky5YtadmyJQMHDsTU1BSForKVrry8nOLiYonTaYejsQc3i2+QX1yGmWHda9UThLqg2lfdxMREzpw5w9dff83XX3/N6dOnuXv3LocOHeKHH36ohYiCoH0ajYblF5fjYubC7URnAt2t9L7F52EMlQoa2pjU6aLrr3r16kVRUVHV90VFRfTo0UPCRNrTxKoJMoNMLidnSB2lTlizZg0tWrSgZcuWjB07lvj4eLp160aLFi3o3r07d+7cAWD8+PFMmzaNdu3a4enpycGDB5k4cSI+Pj6MHz++6npmZma89dZb+Pn50aNHD06ePElISAienp7s3LkTgPj4eDp37kxgYCCBgYEcO3YMgJSUFLp06UJAQADNmzfn8OHDtf7zEGpGtR+J7t69+8A2GyqVirS0NIyNjR84Lgj67FjyMS5lXuLtoPf5MLqA17u7SB1JqCFqtRozM7Oq783MzCgsLJQwkfYEOfmwL0XD8YTLtG0kzWQGrfhtDqRerNlrNvCH5+Y99ObLly/zySefcOzYMezs7MjKymLcuHFVXytXruS1115j+/btAGRnZ3P8+HF27txJWFgYR48eZfny5QQHB3Pu3DkCAgIoKCigW7duzJ8/n4EDB/L++++zb98+YmJiGDduHGFhYTg4OLBv3z6MjIy4du0aI0eOJDo6mvXr19O7d2/ee+89ysvL6+z/4fqg2sJr9OjRtG3blv79+wPwyy+/MGrUKAoKCvD19dV6QEHQNo1Gw+Lzi2lg2gBHeUc0mvN1Yn9GoZKpqSlnzpypWgj69OnTGBsbS5xKO9q5NoczcOHuVaB7tfcXHi4iIoKhQ4diZ1c5E9jGxobjx49XLa80duzYB4ba9OvXD5lMhr+/P46Ojvj7V66B5+fnR3x8PAEBARgYGNCnTx8A/P39MTQ0RKVS4e/vT3x8PAClpaVMnz6dc+fOoVAouHq1chuo4OBgJk6cSGlpKQMGDBBjrPVYtYXXBx98wHPPPcfRo0cBWLx4Ma1bV47sX7dunXbTCUItOJl6knPp53i37bucuZWPSiGjlZuV1LGEGrJw4UKGDh2Ks7MzGo2G1NRUNm7cKHUsrXC3dEOmURKfW8dmNj6iZUpX3O8BksvlD/QGyeVyysoqZwyrVKqqLcj+er+/3uebb77B0dGR8+fPU1FRgZGREQBdunTh0KFD/Prrr4wfP57Zs2fz4osv1trzE2rOQwuv3NxcLCwsyMrKwtPTE09Pz6rbsrKysLERLQJC3bDkwhLsje0Z1GQQIyOiaeFq9VjLJQj6ITg4mCtXrhAXFweAt7c3qhpYBFEXKeVKzOUuZBbfljqK3uvWrRsDBw5k9uzZ2NrakpWVRYcOHdiwYQNjx45l3bp1dO7cucYf9969e7i6uiKXy1m9ejXl5eUA3L59G1dXV6ZMmUJxcTFnzpwRhZeeemjhNWrUKHbt2kVQUNADmwRrNBpkMhk3b96slYCCoE2n005zKvUUbwe/TUW5kguJ95jSxbP6EwW9EhcXR0xMDGq1mjNnzgDU2TctF1NPLpdEk1VQgo2pgdRx9Jafnx/vvfceXbt2RaFQ0KpVKxYtWsSECROYP38+9vb2Wlnn8pVXXmHw4MGsWbOGPn36YGpqCsDBgweZP38+KpUKMzMz1qxZU+OPLdQOmUaj0UgdojqtW7cmOjpa6hhCHTT196nEZcexZ/AeDsfdY+ra06yaEEyot4PU0eq1mvydnzt3LgcPHiQmJoa+ffvy22+/0alTJ7Zs2VL9yTWgtl+/PohcxPY7S/mm3Q56eOvvh4jY2Fh8fHykjlHviX+Hp/Oo3/uHtnjd/1T4MPcHqgqCvrqQfoHjKceZFTQLlcyQr36Pw93WhI6NxUbOdcmWLVs4f/48rVq1YtWqVaSlpTFmzBipY2lNG1c/tt+BqMTLel14CUJd9dDC64033gAqp2JHR0fTsmVLNBoNFy5coHXr1hw/frzWQgqCNiy5sAQrQytGeI9gU3QiV9PyWTwmsM6u31VfGRsbI5fLUSqV5Obm4uDgQEJCgtSxtCbYuXK2+eWMOKCftGEEQfgfD32HiYyMJDIyEicnJ86cOUN0dDSnT5/m7NmzuLiINY4E/RaTGcOhxEOM9R1LRYUBC/bF0cbDht5+dWjtIwGobPLPyclhypQpBAUFERgYSPv27aWOpTWOJo7INSbcyRPjcAVBF1W7nERcXFzVeiQAzZs3JzY2VquhBEHblpxfgrmBOSObjeTfkdfJyC9hxTifByaSCHXDv/71LwBefvll+vTpQ25uLi1atJA4lfbIZDKslW5kFt+pmgwlCILuqLZPpUWLFkyePJmDBw9y8OBBpkyZUqdftIS6Ly4rjoiECEb7jCavUMnyw7foH+BMy4Zi7a66aMWKFVV/9/DwwM/Pj7lz50qYSPvczDzRqFJJuVdU/Z0FQahV1RZeq1atws/Pj/DwcMLDw/H19dXKFFpBqC3LLi7DVGXKGJ8xzN8bhwZ4q7e31LEELTlw4AB9+/YlJSWFy5cv065dO/Ly8qSOpVV+9t7IFMWcuHND6iiCIPyXarsajYyMmDVrFrNmzaqNPIKgVTdzbvJ7/O9M8p/E7XQN284mMS2kMa7WJlJHE7Rk/fr1bNy4EX9/f0xNTVm/fj0dO3aUOpZWtXdtzo/X4VTyZQa18K/+BEEQao2YviXUK0svLsVIacQYnzF88msstqYGvBLSWOpYghZdu3aN8PBwBg8ejLu7O2vXrq3zGwy3cqpcd+lK5jWJk9Q9f91w/a/Gjx//yLXhJk+eTExMzCOvvX379mrvI+g/UXgJ9cbt3Nv8dus3hnsPJ/pmKSdvZTGrZ1PMjerm9jFCpX79+vGPf/yDJUuW8Mcff9CkSROCg4OljqVV5gbmqDQ2pBSJmY26Yvny5fj6+j7yPqLwqh+q7WpUq9VVm3Tel5GRUbVjuyDoi+UXl6OSqxjpPZbRS2Jo4mDGiOCGUscStOzkyZNYWFgAlTP+3njjDfr1q/vrW9kZuJNckkh5hQaFXL9nNn5x8guuZF2p0Ws2s2nGO23eeeR9FixYwMqVK4HKFqvXX3+96jaNRsOMGTPYt28fDRs2xMDg0dszhYSE8NVXX9G6dWvMzMyYOXMmu3btwtjYmB07dnDjxg127tzJH3/8wSeffMLWrVtp3Fi0xtdF1bZ4BQcHc+LEiarvt27dSocOHbQaShBqWmJeIr/c+IUhTYew53wBtzIKeLevD0qFaPSt64qKipg0aRJ9+vQBICYmhsOHD0ucSvsaWXqBQTq3MnKljqKXTp8+zapVq4iKiuLEiRMsW7aMs2fPVt2+bdu2qj1A16xZw7Fjxx772gUFBbRr147z58/TpUsXli1bRocOHQgLC2P+/PmcO3dOFF11WLUtXuvXr2fixImEhISQnJxMZmYmERERtZFNEGrMiksrkMvkDGk8liHfX6aTlx0h3vZSxxJqwfjx45kwYQKffvopAE2bNmX48OFMmjRJ4mTa1dKhGccO1741AAAgAElEQVQyyjlyJwYvB/1eMLa6liltOHLkCAMHDqzapHrQoEEPFOyHDh1i5MiRKBQKnJ2d6dat22Nf28DAgBdeeAGAoKAg9u3bV7PhBZ1W7cd9f39/3nvvPRYvXkxkZCTfffcdrq6utZFNEGpEakEq269vZ1CTQWw4fo97RaW821csllpfZGRkMGzYMOTyypc7pVKJQqGQOJX2dXRrDsDZFLHgta5RqVRVrz8KhYKysjKJEwm1qdrCa9KkSSxcuJALFy6watUqXnjhBb7//vvayCYINWLlpZWggd4uI1h9PJ6hQa74OltIHUuoJaampmRmZla90Z04cQJLS0uJU2mfr10T0Mi5liNmNj6Nzp07s337dgoLCykoKGDbtm107ty56vYuXbqwceNGysvLSUlJITIy8pkf09zcvM6vMSc8Rlejv78/y5cvRyaT0ahRI6Kiopg9e3ZtZBOEZ5ZemM7Wq1sJ8wpj1aF7qBRy3uglFkutTxYsWEBYWBg3btygY8eOpKenP3Laf12hUqgwljXgrjpe6ih6KTAwkPHjx9OmTRugcnB9q1atqm4fOHAgERER+Pr64ubmViP7f44YMYIpU6bw7bffsmXLFjHOq46SaTQajdQhqtO6dWuio6OljiHooS9Pfcn62PV8FryWV1bfYVaPpszs0UTqWEI1avp3vqysjLi4ODQaDd7e3qhUtbeEiJSvX/02vsTN3FjOTIjEUKlf3auxsbH4+PhIHaPeE/8OT+dRv/fVtnhdu3aN//u//yMmJga1Wl11/OZNsT6MoNsyizLZHLeZvo36siQiF0cLQ6Z0aSR1LEECSqUSPz8/qWPUOi+rJsSrjxGTepdWrk5SxxEEgccY4zVhwgSmTZuGUqkkMjKSF198kTFjxtRGNkF4JqtjVlNcXoynKozzCTm82csbE4NqP2sIQpXy8nJatWpVNQPt1q1btG3bFi8vL4YPH05JSYnECR8t8M8V7I/cviRxkvpj4MCBBAQEPPC1d+9eqWMJOqTawquoqIju3buj0Whwd3fn448/5tdff62NbILw1HLUOWy4soFe7r1ZdbAQXycLBgeK2bjCkwkPD3+gm+Wdd95h1qxZXL9+HWtra1asWCFhuup1cqvcp/HC3ZpdfFR4uG3btnHu3LkHvnr37i11LEGHVFt4GRoaUlFRQZMmTfjuu+/Ytm0b+fn5tZFNEJ7a2ti1FJUVYV3Sl6ScIt5/3ge5nq/eLTyd7t27P9ax/5aYmMivv/7K5MmTgcqVyiMiIhgyZAgA48aNY/v27TUbtoa5W7oi0xhwK1cMDREEXVFt4RUeHk5hYSHffvstp0+fZu3ataxevbraCyckJBAaGoqvry9+fn6Eh4cDkJWVRc+ePWnSpAk9e/YkOzv72Z+FIPxFbkku62PX08WlGxuOltC9mQMdvMQWV/WNWq0mKyuLjIwMsrOzycrKIisri/j4eJKSkqo9//XXX+fLL7+sWv8rMzMTKysrlMrK7mpXV9fHuo6U5DI5ZvKGZJbESx1FEIQ/VTvg5f5msmZmZqxaterxL6xU8vXXXxMYGEheXh5BQUH07NmTH374ge7duzNnzhzmzZvHvHnz+OKLL57+GQjCf1kXu4780nzk93pSWFrO//UVM3LqoyVLlrBw4UKSk5MJCgri/gRuCwsLpk+f/shzd+3ahYODA0FBQRw8ePCJH3vp0qUsXboUgPT09Cc+vyY5mzQitvQYBcWlmBqKDeEFQWrVFl7R0dF8+umn3L59+4HVdS9cuPDI85ycnHByqpxFY25ujo+PD0lJSezYsaPqhWzcuHGEhISIwkuoMfkl+fwY8yPBDp3YfVjO6LZueDmYSR1LkMDMmTOZOXMmixYtYsaMGU907tGjR9m5cye7d+9GrVaTm5vLzJkzycnJoaysDKVSSWJiIi4uLn97/tSpU5k6dSpQOa1cSs1smhJXsJ9TCbcJ8fKSNIsgCI9ReI0ePZr58+fj7+9f1eT+pOLj4zl79ixt27YlLS2tqiBr0KABaWlpT3VNQfg7G+I2kFuSS0FaKCYqBTO7izW76rsZM2Zw7Ngx4uPjH/jw+OKLLz70nM8//5zPP/8cgIMHD/LVV1+xbt06hg4dypYtWxgxYgSrV6+mf//+Ws//rIKdfdmRAMcTL4vCqwaYmZn97Tjn8ePH88ILL1SNARSEh6m28LK3tycsLOypHyA/P5/BgwezcOFCLCwe3KZFJpM9dL88XWqqF/RDYWkhay6vwc+qDSeOmzLnOS9szQyljiVIbOzYsdy4cYOAgICqPRplMtkjC6+H+eKLLxgxYgTvv/8+rVq10ouNtju4NYcoiEmPkzqKIAg8RuE1d+5cJk+eTPfu3TE0/M+b2KBBg6q9eGlpKYMHD2b06NFV93d0dCQlJQUnJydSUlJwcHD423N1qale0A+br24muzgbZUYXXKyMGd/BQ+pIgg6Ijo4mJibmqTdFDwkJISQkBABPT09OnjxZg+m0z97EFnmFBXfyb0gd5amlfvYZxbE1uySGoU8zGrz77iPvs2DBAlauXAlUbhn0+uuvV92m0WiYMWMG+/bto2HDhhgYGDzyWqdOnWLmzJkUFBRgaGjIgQMHUKlUTJs2jejoaJRKJQsWLCA0NJQffviB7du3U1BQwLVr13jzzTcpKSlh7dq1GBoasnv3bmxsbAgJCaFVq1YcPnyYgoIC1qxZw+eff87FixcZPnw4n3zyCQADBgwgISEBtVrNzJkzmTp1KuXl5UyaNIno6GhkMhkTJ05k1qxZz/hTFR5HtYXXqlWruHLlCqWlpVVdjTKZrNrCS6PRMGnSJHx8fB7Y2zEsLIzVq1czZ84cvWmqF3SfukzNqkuraGQawIVYO74d2QwjlX5tkSJoR/PmzUlNTa0a4lAfWSndyFbfkTqGXjl9+jSrVq0iKioKjUZD27Zt6dq1a9Xt27ZtIy4ujpiYGNLS0vD19WXixIl/e62SkhKGDx/Oxo0bCQ4OJjc3F2NjY8LDw5HJZFy8eJErV67Qq1cvrl69CsClS5c4e/YsarUaLy8vvvjiC86ePcusWbNYs2ZNVRFoYGBAdHQ04eHh9O/fn9OnT2NjY0Pjxo2ZNWsWtra2rFy5EhsbG4qKiggODmbw4MFVs3svXapcXDcnJ0fLP1HhvmoLr1OnThEX9+RN1EePHmXt2rX4+/sTEBAAwGeffcacOXMYNmwYK1aswN3dnU2bNj15akH4L1uvbSVTnUne3REENLSiX4v6+yYrPCgjIwNfX1/atGnzQKv9zp07JUxVu9zMPMks201GfhF2ZsZSx3li1bVMacORI0cYOHAgpqamQGUvz+HDh6tuP3ToECNHjkShUODs7Ey3bt0eeq24uDicnJyqVgm4P+zmyJEjVRM/mjVrhru7e1XhFRoairm5Oebm5lhaWtKvXz8A/P39H5jcdn8okL+/P35+flUfMDw9PUlISMDW1pZvv/2Wbdu2AZVLPV27dg1vb29u3rzJjBkzeP755+nVq9ez/9CEx1Jt4dWhQwdiYmLw9fV9ogt36tSJh+2/feDAgSe6liA8Skl5CSsvrcTRwIfrmQ1ZOsznqbuVhLrn448/ljqC5HztmnIudyfHbl8lzK+l1HGEx/DXDwlyubzqe7lc/sAkkb8e/+9zysrKOHjwIPv37+f48eOYmJgQEhKCWq3G2tqa8+fPs3fvXhYvXsymTZuqulUF7ap2muKJEycICAjA29ubFi1a4O/vT4sWLWojmyA8lu3Xt3O38C7JtzrxvL8TQe42UkcSdEjXrl3x8PCgtLSUrl27EhwcTGBgoNSxalX7hs0BOJV0WeIk+qNz585s376dwsJCCgoK2LZtG507d666vUuXLmzcuJHy8nJSUlKIjIx86LW8vb1JSUnh1KlTAOTl5VFWVkbnzp1Zt24dAFevXuXOnTt4e3vX6PO4d+8e1tbWmJiYcOXKFU6cOAFUtgRXVFQwePBgPvnkE86cOVOjjys8XLUtXnv27KmNHILwVEorSllxcQWWci/uFnjxTp9mUkcSdMyyZctYunQpWVlZ3Lhxg6SkJF5++eV61fLexsUHNDJis65KHUVvBAYGMn78eNq0aQNUDq5v1apV1e0DBw4kIiICX19f3NzcaN++/UOvZWBgwMaNG5kxYwZFRUUYGxuzf/9+XnnlFaZNm4a/vz9KpZIffvjhgVarmtCnTx8WL16Mj48P3t7etGvXDoCkpCQmTJhARUUFQNXyKYL2yTQP6w/UIa1btyY6OlrqGIIO2nZtGx8e+5CihPFMaPUc7z3/ZF3igm6qyd/5gIAATp48Sdu2bTl79ixQOR7m4sWLNXL96ujK61fgqu4YaVw5NrH6Ld90QWxs7AMblAvSEP8OT+dRv/dPtyKqIOiAsooyll5YinGFO6YVzZkeKhZLFf6XoaHhA1P9y8rK6uUYQFsDd/IqEh469lYQhNohCi9Bb/126zcS8xPJSurC692bYmki9qET/lfXrl357LPPKCoqYt++fQwdOrRqhlh94mHhiUaZQULOPamj1GkDBw4kICDgga+9e/dKHUvQIdWO8RIEXVReUc7SC0tRlrngahTM6LbuUkcSdNS8efNYsWIF/v7+LFmyhL59+zJ58mSpY9W6lg4+nMjScOjWZcZYd5Q6zmPRaDR61zp5f9mGukC0jmqHKLwEvfT77d+Jz42nKHUU8wb4YKAUjbfC3ysqKmLixIlMmTIFgPLycoqKijAxMZE4We3q6NacJVfgTGosY9D9wsvIyIjMzExsbW31rviqCzQaDZmZmRgZGUkdpc4RhZegdyo0Ffz73BJkJY4E2nWhl6+j1JEEHda9e3f279+PmZkZUFmI9erVi2PHjkmcrHb5OzYGjZJr2dekjvJYXF1dSUxMFHv1SsjIyAhXV1epY9Q5ovAS9E7EnQhu5d6gKH0EH7zYXHwaFh5JrVZXFV0AZmZmFBYWSphIGkq5EmOcSVPfkjrKY1GpVDRq1EjqGIJQ40T/jKBXNBoNi878m4oSO/p5Poe/q6XUkYTHkDy6G3dnDZXksU1NTR9YHPL06dMYG+vftjk1wcHQnUKSqKgQY3cEQSqixUvQK38k/sHN3KtUZA3jraFibRl9UH43kdyzyVh3lmZMVXh4OEOHDsXZ2RmNRkNqaiobN26UJIvUvKyacLvkMDFpKTR3cpY6jiDUS6LwEvSGRqPhm1P/oqLEhgktB+FsVT9bLfRN/obv0FTIsBg8ptYfu7y8nMOHD3PlyhXi4uKAyu1bVKr6ufRIqwY+HLgLh29fFIWXIEhEdDUKeuNo0lFu5sVikN+DV0Jrdj8zQXty9x1AaQZGPYbV+mMrFAp++uknVCoVzZs3p3nz5vW26ALo7FG5z+75tCsSJxGE+ku0eAl6QaPRMO/EIipKLZndfhRmhuK/rj4oT40n/0YeNiHeyOTSfM7r2LEj06dPZ/jw4ZiamlYdr28bZQM0snJCVmHCzdwbUkcRhHpLvHsJeuFo0gluF8RgXTKckcFippO+yFu/CCpkWAwdJ1mGc+fOAfDhhx9WHZPJZEREREgVSTIymQwzmSsZxbeljiII9ZYovAS98OnRb6koNefjbhNQKkQPub7I3X8QlbkMo64DJMsQGRkp2WPrIieTRsTlH6S4tBxDlULqOIJQ74h3MEHnHYyPIlF9iYaK5+nRzEXqOMJjKk+6TsGtAiza+UjWzQiQlpbGpEmTeO655wCIiYlhxYoVkuWRmrdNU2SKYk4lie5GQZCCKLwEnffPo+Foysz4stdUqaMITyBv/SLQyDAfOl7SHOPHj6d3794kJycD0LRpUxYuXChpJim1dvYF4PidSxInEYT6SRRegk7bcy2Ku2UX8TXtRwsXe6njCE8gN+IwKgsZRp1fkDRHRkYGw4YNQ/5nq5tSqUShqL9dbF09mgNwKSNO4iSCUD+JwkvQaZ8dW4Sm3IT5vV+WOorwBMruXKEgvhCL9tJv6WRqakpmZmZVjhMnTmBpWX93PLA1sUJebs2dvJtSRxGEekkMrhd01qYLx8nmPG2sR+FubSN1HOEJ5P1U2c1oMXyi1FFYsGABYWFh3Lhxg44dO5Kens6WLVukjiUpK6Ub2aV3pI4hCPWSKLwEnZSrLuXrk9+Dwpgver0idRzhCeVFHEVlKcewfW+poxAYGMgff/xBXFwcGo2mXq9cf5+rqSeZeZfIVRdhYSR2gBCE2iQKL0GnlJRV8O3hI6y58i80Jpfp3mAs9qb1t1tIH5XdukjBHTW2zwVI3s0IoFar+de//sWRI0eQyWR07tyZl19+GSMjI6mjScbPrikX8ss5HB/L883q30KygiAlMcZL0AkajYYNZy7RYfk0frg9HZnxDYY1nsL8HrOkjiY8obyfvv+zm3GK1FEAePHFF7l8+TIzZsxg+vTpXL58mbFjx0odS1LtXCsH2J9MuixxEkGof0SLlyC5w9cTeC/yO7KU+5AZVRDiNIC5XWZia2wrdTThKeQePI6BtQLDNt2kjgLApUuXiImJqfo+NDQUX19fCRNJr72bDxqNnCuZ16SOIgj1jii8BMlcScvm7b1LuFG6HblBAX4WXfii2zt4WLpJHU14SmXXoilMKMb2+dY60c0IlWO8Tpw4Qbt27QCIioqidevWEqeSlrHKEIMKRxILxcxGQahtovASal16npp39vxIVM6PyA0ycTVtzqdd59DaqaXU0YRnlPfTvyu7GUe+JHWUKqdPn6ZDhw64uVUW9Hfu3MHb2xt/f39kMhkXLlyQOKE0bFRu3C0RLV6CUNtE4SXUmqKScv6x/xd+SViKzCgBK6OG/F+7D3jeq5vOtI4Izyb30EkMbJUYBnaSOkqVPXv2SB1BJ3lYeJGWE0XKvRycLK2kjiMI9YYovAStK6/Q8O+jR1h2+TsqjGMwNLLmJf/3mBQwFIW8/q4gXteUXYmiMLEUu/7tdKqQdnd3lzqCTmrh0IyoHPjj9kVGtOgsdRxBqDdE4SVojUajYfulGOYdD6fA4AQKIyOGNHqJdzpMxkhZf6fy11W5G/4NyLAYIfbU1Acd3Jqz7CpEJ8eIwksQapEovAStOHk7iTkHwrkr24/MoILOjgP5LOR1rI2tpY4maINGQ96haAztVBi26iB1GuExtHJqBBUGXMsW47wEoTaJwkuoUTczcnhr7xKuqH9GrizEx6wrX3Z/m0ZWYqZiXVYac4TC5DLsBnWUOorwmBRyBUYaF1KLbkkdRRDqFVF4CTUiu7CYOXvWcjRrLTJVFs4m/nzWdQ7Bzi2kjibUgrwNSwAZFiPFZub6xN7IgwR1FBUVFcjlYj1tQagNovASnklxWTmfR/zC1vglYJiIhYEbc9p9RL8moTo1wFrQIo2G3CNnMLQ3wNA/WOo0whPwsmxMQmkkVzOSaebgKnUcQagXxEcc4aloNBqWnjhCu5Uj2ZryASqDQl7xe58jY38hrKlYHqI+Kb0QSVGKBouubaWOIjyhwAZ+AHx/aqvESQSh/hAtXsIT+y02ln8cXUCeMgq5yoiB7i/xXucpGCoMpY4mSCBv0zIAzEdNkziJ8KRGtQxh2cXmRKav4JujDZnVcZDUkQShzhOFl/DYziUl8fb+cJIr9iFTQgf7Qczr9jo2xmLxxXpLoyH3yDkMHY0w9G0ldRrhCRkolWwfsoTnNo1mxdV/4mhmw6iWIVLHEoQ6TXQ1CtUqKC5l9KavGLN3IMmaPXibdWLngJ0sff5jUXTVc6Vn9lKUBhYh7aWOIjwlezMLNg1YjrLChs9Pv83+6+ekjiQIdZoovIRHOnH7Bl3WjuBC0WocDb1Y0WMdW4cuopFVQ6mjCTogd9MKACxGvyJxEuFZeNo4srz3EkDF7EPTOZsslpgQBG0RhZfwUP+I2MDkAyMpUcQzpvFb7B+1jrau/lLHEnRFRQW5xy9h5GSMQdPmUqcRnlFrVy/md1qEhmIm/DaF29l3pY4kCHWSKLyE/5FRkEufH6ezOeFTTGSOrO79E+90elHMVBQeUHJqF+q7YN5NdzbEFp5Nn6aBvBkwjzJ5JkO2TSarMF/qSIJQ54jCS3jAr3FR9Ng4gMSyQ7QwG8ShsVsJdG4qdSxBB+VtXgWAxSjRzViXjAvszjivdymSxxO26SWKSouljiQIdYoovAQAysrLmLF7Pu8cn0q5ppQ3/b9h3eC5GCkNpI4m6KKKcnJPxGLkbIJB42ZSp6lxCQkJhIaG4uvri5+fH+Hh4QBkZWXRs2dPmjRpQs+ePcnOzpY4qXa81XkovRtM457sAgM3zqaiokLqSIJQZ2it8Jo4cSIODg40b/6fsR/15UVL31zPukPouhEcTF+DlSaI7QO2Mj6ou9SxBB1WcmI76gwZFt27Sh1FK5RKJV9//TUxMTGcOHGC77//npiYGObNm0f37t25du0a3bt3Z968eVJH1Zqv+0wjwGwYSeWHGL31Y6njCEKdobXCa/z48ezZs+eBY/XpRUtfLD/zM4N2DCG7LJ4Q69c4+OJyGts6SB1L0HF5W1YDYF5HuxmdnJwIDAwEwNzcHB8fH5KSktixYwfjxo0DYNy4cWzfvl3KmFq3euB7uKm6calwGzN+/VbqOIJQJ2it8OrSpQs2NjYPHKtvL1q6LK84j5HbXif84kfISh35rO0qFoVNQakQvc9CNcpLyY2Kw8jVDINGXlKn0br4+HjOnj1L27ZtSUtLw8nJCYAGDRqQlpb2t+csXbqU1q1b07p1a9LT02szbo2Sy+VsG/Y1NgQSmb6cTw6ulzqSIOi9Wn2XfdwXLUG7jiVG021Dfy7ei8Cxoh+/j9hAmJ9YJkJ4PCXHtqDOlGPRI0TqKFqXn5/P4MGDWbhwIRYWFg/cJpPJHjrTd+rUqURHRxMdHY29vX1tRNUaA6WSncP/jUmFFxviv2R59F6pIwmCXpOseeNRL1pQdz4x6pKyijI+PvwNL+2fRGFJGQMafMrv4z7F0cJU6miCHsnd+iNQ92czlpaWMnjwYEaPHs2gQZV7GDo6OpKSkgJASkoKDg71o1ve0siEnwcvR1XuyMKL7/FL7EmpIwmC3qrVwutJXrTq0idGXZCQm8ALm0ex9eZKlEWBfB/yI5/06YdcLtbmEp5AWTG5J69h3NAclVsjqdNojUajYdKkSfj4+DB79uyq42FhYaxeXTm+bfXq1fTv31+qiLXO1dKGtc8vQ15hwrvHZ3LiTpzUkQRBL9Vq4VWfX7SkotFo2HxlO/22DSKx4BaNKqZy4MUlhDRxkzqaoIdKDm+kOEuBea8eUkfRqqNHj7J27VoiIiIICAggICCA3bt3M2fOHPbt20eTJk3Yv38/c+bMkTpqrWrewI1vQ/8FVPDS/peIS0+WOpIg6B2lti48cuRIDh48SEZGBq6ursydO5c5c+YwbNgwVqxYgbu7O5s2bdLWwwtAbkkub0Z8xPG0/ZQXejC+6bu8GdpOtHIJTy13a+XgaouR0yROol2dOnVCo9H87W0HDhyo5TS6JcSzOR8VLODj6BmM+mUyu4etx9HMSupYgqA3tFZ4/fTTT397vL6/aNWW6NRoZh54h3ulGRjm9WVxvzcJ9hBdtsIzKC0i9/RNjD1sULmKTdLrsyH+HUkrmMu/r7zPgM1T+X3UaswNjaWOJQh6QawdUMeUVpTy1clwJuydSE5hOc1l/8f+if8URZfwzIoj11GcrcCidy+powg64NV2/Rjg+jr58lj6b5xBWXm51JEEQS+IwqsOuZN7hyHbR7M6djllOUG82vQ7fnpxONamYtsf4dnlbt8IaDAf/pLUUQQd8UmPCbS3fpF0TRRDN88RWwsJwmMQhVcdoNFo2HZtGwO2D+ZGTjzG2eNZP3ABr3Rt/sglOwThsZUUkHfmNsaNbFA5u0idRtAhi194gyaGfblevIeXfvlK6jiCoPNE4aXn7hXfY2bEbD489iFF+c4EKf7Jvqmv0crNWupoQh1SfGANxTkKLJ7rI3UUQcfI5XI2Df0MB3k7TuSs5b19K6SOJAg6TRReeuxU6inCtg0kMiGC0vTneLPF1/zwYi8sTVRSRxPqmNwdm6nsZpwqdRRBBykVCnYO+w7zCl92JH3Lt8d3SB1JEHSWKLz0UGl5KQuiv2Hi3klk5Gkwy5rNxuHvMqmTl+haFGqeOpfcswmYNLZD5dhA6jSCjjI1NGTb0KUYVriy9MpcNl44LHUkQdBJovDSIxqNhog7EQzaOYRVl1dSkh1MR6NP2TNtFC0binV0BO0o3v8DJfeUmD/XV+oogo5zNLNkQ9hyFBVWfBL9JpE3L0odSRB0jii89MSp1FOM2T2GmZEzic/MpzRpPO+1/YAlY9pjaSy6FgXtyd2xFWRgMXSS1FEEPdDEzomlPZcACmZGvsKF1HipIwmCThGFl467nHmZl/a9xMS9E4lNT0CdPJhGxR/x8/gpvNjeQ3QtClqlKcwi93wyJl72KB0dpY4j6Im2bk34rH04FfIixv06lYScTKkjCYLO0NrK9cKzuXXvFt+d/Y7fb/+OodycsrsvQGFHPuztz6g2bijEtj9CLSj+fRUluUpsJr4gdRRBz/TzCSa94DMWXHybwT9P5veRP2JlbCp1LEGQnCi8dExqQSqLzy9m+/XtKGUGGBf04W5iO/r5e/LBCz44mBtJHVGoR3J/2QYyMB8yUeoogh6a2LoXqQWZrL/1OWGbpvH7qOUYqcSCzkL9JgovHZGjzmH5xeX8dOUnNGhwlncnNrYNblYOrBnfnC5NxZY/Qu3S5KeTdyEN06YuKO3spI4j6Kl3u44kNT+DyIylDN78Jr+MWIhcLka5CPWXKLwkVlhayJqYNay+vJrCskL8LLpx8VIbrhVZMr1rY14N9cJIpZA6plAPFe9dTkmeEpt+/aWOIui5b5+fwagt6Vws2MaL2/7Jj4M/kjqSIEhGFF4SKSkvYfPVzSy9sJQsdRZtHLqQGlRoPGkAACAASURBVB/CsRgT2nna8MkAf7wczKSOKdRjubt2VnYzDhondRShDvhx0Mc8/1MW5/O3MPs3OxY896rUkQRBEqLwqmXlFeXsurmLf537F8kFybR2bEOQUX92HFZiaazi66E+DAp0EbMVBUlpclPJvZiBabOGKG1spI4j1AFyuZxtwxbQc/0k9t1dzPDNKawa8AEmKkOpowlCrRId7bVEo9Fw4M4BBu8czPtH38fKyIqXm37B1XOj+fm4gqFBrhyY3ZXBQa6i6BIkp/5tGaX5Siz6DZI6ilCHGKkM+GXYYtxU3Ygp3EHXtcM4nXRD6liCUKtE4VULTqacZMzuMbwe+TrlmnLeD56HReabzN+hwdRQweaX2zNvcAusTcVsH0E35O3eBXIwGzha6ihCHWNlbMqvo8IZ4f5/qGXJjN87kvmHN0sdSxBqjehq1KLLGZcJPxPO8ZTjOJo48lG7j8lKa8HcDTeo0GTwTp9mTOrUCAOlqH8F3aHJSSD3UhamPu4ora2ljiPUUe+FjKKHZzCv7p/Fmpv/4HDicdYO/ARLIxOpowmCVonCSwtu3rvJd2e/Y9/tfVgbWvNW67doZtqbj3dcJSblKqHe9vyjf3Ma2ogXGEH3qH9dRmmBErv+Q6SOItRxbd2a8MforYzb8TFxRbsIXR/LwtCv6NLIT+pogqA1oqmlBqUWpPLRsY8YuGMgR5OOMq3lNDb03cHVa60YviSazIJi/j06kJXjg0XRJeis3N92gxzM+4+UOopQD5gaGrJl2OdMbfoJpWTxysEXeX//KqljCYLWiBavGpCtzmb5xeVsuLIBDRpGNRvFZP/JHL1aTP9Fp8nML2Z8Bw9m92yKuZHY0FrQXZqsW+TF3MPUrxEKS0up4wj1yIz2/Qlt1IpJv81iR9ICTq6NYt3AL7E3s5A6miDUKFF4PYMKTQXrYtfx/bnvKSorIqxxGNNaTqNEbcnr6y9x+FoGLVwtWTkuGH9X8SYm6D71rqWUFiqx6z9M6ihCPdS8gRuHx25k0o7POZu3mZ4bB/Jppy943ru11NEEocaIwusp3S28y/tH3ud4ynE6u3TmzdZv4mLmztI/brIo8jwGCjlzw/wY085dbGgt6I3cPXsquxnDROElSMNAqWTt4A/44XR7Fpz/mHeOTWHfzcks6D1NbDUk1Anif/FTuL8e19m7Z/mw/Yd83/170jIt6Rt+mK/3XaWnjyMH3ujKuA4eougS9IYm/Rq5V/Ix8/dAYSG6dwRpjQ/qwbb+W7CS+XDg7mJC104gISdT6liC8MxE4fUECksLmXt8Lq9Hvo7T/7d35/FRlecCx39nZjIzIZsJSUhISAAJIWQPuwiyiqKAIFIoaAApVqVi762Kty6obeW2tliXXsVaoGKLWjbFFgU0ZVGgiAYQISyJrIWErJPMeua9fyRO2YQASYYkz/fzOZ8558yZc573MHl45j3vnAmK5Z1R7zCk/Wj++718Jr2xBZfuZeG0Xrw6OYd2oVZ/hyvEZbF/sABPjYnQsRP9HYoQAFzfNoa8u99iQMR0Tqt8bls2lqU7N/g7LCGuihRe9fT16a/5weofsKxgGdPTpvPnW5aw+Rsjg1/I44P84zw4+Ho+fvgmBidH+ztUIa5I1cdr0YwQfPud/g5FCB+T0cgfRv2UZ3v9HxoGfrHjJ8xY9b94dN3foQlxRWSM1yXoXp1FXy/ilS9fISIwgj/e/EcC3EmMf20ru49V0q9zW54dk0pSuxB/hyrEFVP/3kPlvhqCMrtiDJYfZxfXnnGp/ejbYTlTVj7C1vIlDPzzDhbePp/kqPb+Dk2IyyI9Xhfx7+p/86O1P+LFHS8yOGEwbw5byvLPrIz9w2ecqnTy0qRs/vKjPlJ0iWbPvnoBHruR0LFy7y5x7WofGsG6KW9wS8wsKilg/AfjeeNfH/k7LCEui/R4fY+Pij7i2c+fxe1188wNz2E/nc0dL39JlcPDjwZ0YvawrgRb5PSJFkApKj9ej2bUCL71Dn9HI8RFGQwGfjPiPobt781jGx7l918/wqffbuZPY57AGiC/dyuufVI5nKPaXc28bfNYeWAl6ZHp5Hb5H/7wUTn5R3fTp1MEz45JIzlGerhEy6GO51NV4CQ4uxvG4CB/hyNEvYxIyqZn3HKmrPgfdlWvYOBbO3n9lvlkt+/k79CEuCi51HiGncU7ueuDu3j/4PvkpswgwfkIP170LccrHPx+YhZLZ/aVoku0OPYP3sDjMBIybrK/QxHisrRtE8I/Jr/MXQmPUaMd5Z41P+C3m5b5OywhLkoKL2oH0L+e/zr3/OMedK/OlIR5vL0mhfe2n2B6/0588t83MSYrDk2Te3KJFkYpKtfloZk0Qkbc7u9ohLgiTw2ewoIhSzATyaKDc7lj6SNUOe3+DkuIC2r1hdcx2zGmfzSdV756hT7RQzCffIRX13hJig7hw4du5Mnbu8vvK4oWSx3ZTuUBN8E5XTEEyWVG0XzdkNiNvMnLSLKM5KBzDTe9fScbC/f4OywhztOqC68PD33I+PfHs690HzmBD/DxP4dyogzm/yCTd+7rS7cYuXu3aNlqPngD3WEk9M4p/g5FiKsWYglk+cT/5d6k53Bzmvvz7mHuJ3/2d1hCnKVVFl5VrirmbJzDnI1zCDcl4Pz2YTZ+mcDUGzryyc9uYmx2vFxWFC2f10vl+o1oJo3g4SP9HY0QDebhG+7grVvfoY3qwLIjv2HEkgc4XVPl77CEAFrhtxp3nNzB4xsf5981J4lwjWLPN33pmRjJs1PT6N5eerhE66G+3ULVQZ3gnukY2rTxdzhCNKis2I5suPsd7n3/V+RXLWfQ0psJM3QmIfh60qJSuDEhg74dkjGbWt1/g8LPWs07zu1183r+67yx6w0CtUiqC+8jwNiFF+5KYVx2HAb5MWvRytR88Ed0p5HQ8Xf7OxQhGoU1wMzbd85l8Y4BLPn6XUpcRey07WZX9Qr+WgTKG4BVxdPO2onk8K70ap/GkOuzaBcc5u/QRQvWKgqvI5VHeGzjY+wq2YXB1otTx2/n7t5d+a+bkwkLlIHzohXy6lR+8hlagJHgoSP8HY0QjSo3Zyi5OUMBqHLayTu0my1Hd/HN6X0csx/gsONzDp/6hLWn4FdfgcETSbgpkcSQJDKjUxjYMYOc9p0xGFrl6BzRwFp04aWUYtXBVfxyy69weTTsx35IRvhAnn0gjbQ4+UQjWi9VuImqQi8hvTMwBAb6OxwhmkyIJZBRKb0YldLLt87r9bLz5GE2FObz1ak9FFYWUOr+lpLKHeyoUiw8COhW2tCB2DbX0y2iK33j0xnUKZ3rAuXbwOLytNjCq8JZwVObn+GTI2vRazphKZvCr0b0Y3xOvFxWFK1ezaray4wh4+/xdyhC+J3BYCArtiNZsR2BMb71xbZKPi3cydZju9hXuo+TjkIO2D/h4Ik1fHgC1DYDJj2atuaOdA7tSnZMCoM7ZZEc2V56x8T3apGF17YT2/jpp49R6SrFWXwLE7rczSO5KYS1abjLil6HA/1IAZ5v96LcLswZN2CK69xg+xei0egeKvO2YjAHEDx4mL+jEeKaFRUcyoT0G5mQfqNvnUfX2Xq0gI3f7mRX8Tccth2k2LWPU+Vb2FIO/7cX0IMJ1hKICexMfJvr6XJdV5IjricmLIioEAuRwWYsJqP/Gib8qkUVXm7dzTObf8eqQ2/jdbUlQX+MX0+6jfT4+l1WVEqhl5ejnyrGc/QAniMH8Jw4jOfkCTwlJXhKK/BU1OCxufE6z3+90aowR1qxxEVh6dwJc7d0LJk3YErKQjPKH5m4NqgDn1JVBMF9MjBYrf4OR4hmxWQ00j8xhf6JKWetP1xezCcH89l+4msOlBdQ7CrkgOMfHHDq5JWBOmjE62qH1xGL7ojFquKJNHckOiiirhizEBVSN9XNRwZbaBtsJsAovWctSYsqvB75+BXWn1qCZuvLnF6PMLlXEgaDhtfpRC8pwVNcjOdUMZ7jRXiOFeI5ebx23ekyPBXVeKpc4D1/v5rRiylQYQo2YWnbhqAukZiiIjG1i8EY2wHNYMK5bzeuQ0U4j5+m6qsjlG89CmwE/oBmUlgiAjC3D8eSmIA5uTuW9N6Y029As8rX+MVl0D3grKydHHWPzqoz5s9Y76h77ox55aigusiJ7oogVC4zCtFgEq6LYmqPYUzlP73Ibq+bgtJDfHliD7tLvuFAeQFHqw9SrX8BQAlQ7g1nvy0O16l2OKrboTtjUa62nHmbzYggM5HBZl9RFnlGYfZdsRYZbCEiyIxRhtJc8/xSeK1Zs4bZs2ej6zozZsxgzpw5DbLfB6w59Mn7F/3MHrS8/6KwtAxPWRVeu/sCWyuMFi+mwNqiyhJjxZQShqltBKboGEyxHTDGdcKUmIyh3fVowVFwkZuqBp+5Z68X/egBXPmbcO75CufBg7iO/Jua/cVUflUMfAG8BZrCHGbAHBOKJaE9lqRkzKk9sGQPxBAe3SDnRFxbvLZy9JNH0E8dQy8+jn76JN7yUpSjum6qQTlrUC4nyukAl6N23uVGuV0oj47ygvJqdRPnPNZNyohS/1nGC0pXKD0ICMIQaCVo0BB/n45mq7FymGhZAgwBpEYmkxqZDIz1rS+xl7CvdB/7yvbVPpbuo6gyj8BwHQCLMZAYa0fCAxJpozpgcMfhtrej1Kaz43A5p6ocONzn9xIYNIgIOrMYM5/VgxYVbCGy7vG6NgFyo3A/afLCS9d1HnzwQdauXUt8fDy9evVi9OjRdO/e/ar3Hf3FcrK3fYEn0IvJqmOxegnqAKbrgjG1DccUFY0xJg5TfCdMcdejhSdAaBy0aQsNOBBSMxgwJXTFlNCVNqPOfs5bdhLnlxtx7dmBs2AfrsPHcJ6sxLavHD7+BlgJgCkILNFtMMe3w3L99Zi7Z2HJGoAxvgtaMx60qbxe0D0opx3lsoPbiXI66+ZdqO8KDbcLPC4IsGJoE4QWGIzWJhhDmxC0NqFolsCLFsKN2wiF11aKfvIw+qljeItPoJ8+hV5ajF5ehl5egV5ZhV5Vg17tQK9xodt1dAco/fJi1kwamtGAZjKjmQLRjEa0gAC0gACwBqAFmNHMFjSLFYPZimYJRLNY0Uwm33bnTeYAAjMyMFgsjXSCWrbGzGGidYgMjCQyLpL+cf1965y6kwPlBygoLWBf2T72lu6loHQzVe7aO+5raHSI6UDPiGS6hnclMaQLbQM6gec6TttcFNucFFc5Kal7LLa5OHjKRnGVE5d+fpFmMmhn9JyZL9iD9t1jqNUkRVoDavLCa9u2bXTp0oXOnWsHok+cOJFVq1Y1SNIKmzKTsBu7o10XD6HtITS+wYuqq2UIb0fgkPEEDhl/1nplr8a1+3Ocu7bh2vc1zm+P4DpeRvnnh1AbC4F1wAsYLQpzWwum0KsoPK7wdbVFkxd1xoRX1c0rlFfVLau6HhhV29Py3aQAbwP98WoKzQgGI2jG7woUDUOAAc1kQDMZ0QKMGAKMaAEmNHMABrMJzWyuLT4sZgxmC5rFgma1olksGCyBYDLhrShHLy+tLaCqbGcUUO76FVCawmjVMFoNGIPMBLQNwRrcBmNYMMbQMIzh4RgjojC2jcIYGYMhIgYtJAItKLy2aPquQJJxgdekxsxhovWyGC2ktk0ltW2qb51SihPVJ3y9YwVlBewt3cvab9f6tgkxh5AcnkxyRDLJnZLJsVx3xl41FBbsLi8VdjeVDjeVdnft/HeTw8O3Djc7y9xU2T3oSp0XW4BRI9QaQGhgAGGBAYQGmgirWw61BrSay5v3974Na4D5qvfT5IXXsWPH6NChg285Pj6erVu3Nsi+tZhUiEm99IbXIC0wCEuvYVh6nf0tM+Xx4DmQjzP/M1x7d+E8VIjzWDGu4iv83bHz/6bq/TJNqy1uMGpoBgOaUUMLMIKhrtgxGmt740zG2nmTEc1oAJOpbt6EZjJBgKnu+bqeG5OprofGXPd8XU+O0YTyuFEOO16nA+Vw1PaOOR14nS6Uq3byutx1l+I8dZOO163jtbnweLx4PQrl8aJ0UB6FVwdUPRLFdwVUoBFjmwAC2oZiDWmDMTQEY1gYxvAIjBGRGCOiMUbFYoyOw9CuA4awtvLpsAWrTw5bsGABCxYsAKC4uLhJ4xMth6ZptA9uT/vg9gxOGOxbX+2uZn/Z/rMuVy7fvxy7x375BzEAbWqni/WB2+umk2culF3+4ZqzKZlDm2fhVV+SuGppJhMB3XoQ0K2Hv0NpUZSuoxx2VE0V3poqVI0NZa9CuVwYItphjEnAEBImBZS4IjNnzmTmzJkA9OzZ08/RiJYmKCCIrOgssqKzfOt0r85R21Gq3dVNEoPXq6iweyi3u/B6r/ATfTMT1kBfhmvywisuLo4jR474lo8ePUpcXNx520niEo1JMxrRgoIhKBgjsf4ORzQj9c1hQjQlo8FIYmiiv8MQ9dDkg5969erF/v37KSwsxOVysXTpUkaPHt3UYQghxBWRHCaEuBpN3uNlMpl45ZVXGDFiBLquM336dFJTm+e4LCFE6yM5TAhxNfwyxmvkyJGMHDnSH4cWQoirJjlMCHGlrp37LAghhBBCtHBSeAkhhBBCNBEpvIQQQgghmogUXkIIIYQQTUQKLyGEEEKIJiKFlxBCCCFEE5HCSwghhBCiiWhKXeCnyK8xkZGRdOzY0d9hfK/i4mKioqL8HUajaw3tbA1thGu/nUVFRZSUlPg7jAZxrecvuPbfDw2hNbQRWkc7m0MbL5bDmkXhda3r2bMn27dv93cYja41tLM1tBFaTztF/bSG90NraCO0jnY29zbKpUYhhBBCiCYihZcQQgghRBMxzp07d66/g2gJevTo4e8QmkRraGdraCO0nnaK+mkN74fW0EZoHe1szm2UMV5CCCGEEE1ELjUKIYQQQjQRKbyukq7rZGdnc/vtt/s7lEZTXl7O+PHj6datGykpKXz++ef+DqlRzJ8/n9TUVNLS0pg0aRIOh8PfITWI6dOnEx0dTVpamm9daWkpw4cPJykpieHDh1NWVubHCIU/SQ5rGSR/NR9SeF2l3//+96SkpPg7jEY1e/ZsbrnlFvbu3Ut+fn6LbO+xY8d46aWX2L59O7t370bXdZYuXervsBrE1KlTWbNmzVnr5s2bx9ChQ9m/fz9Dhw5l3rx5fopO+JvksOZP8lfzyl9SeF2Fo0eP8uGHHzJjxgx/h9JoKioq2LBhA/feey8AZrOZ6667zs9RNQ6Px4Pdbsfj8VBTU0P79u39HVKDGDhwIBEREWetW7VqFbm5uQDk5uaycuVKf4Qm/ExyWMsh+av5kMLrKjz88MP8+te/xmBouaexsLCQqKgopk2bRnZ2NjNmzKC6utrfYTW4uLg4fvazn5GQkEBsbCxhYWHcfPPN/g6r0Zw8eZLY2FgAYmJiOHnypJ8jEv4gOaxlkPzVvPJXy/1ra2SrV68mOjq6WX+ltT48Hg87duzg/vvv58svvyQoKKjZdevWR1lZGatWraKwsJDjx49TXV3NkiVL/B1Wk9A0DU3T/B2GaGKSw1oOyV/NK39J4XWFNm/ezPvvv0/Hjh2ZOHEin3zyCVOmTPF3WA0uPj6e+Ph4+vTpA8D48ePZsWOHn6NqeOvWraNTp05ERUUREBDAuHHj+Oyzz/wdVqNp164dJ06cAODEiRNER0f7OSLR1CSHtRySv5pX/pLC6wo9//zzHD16lKKiIpYuXcqQIUNa5CeMmJgYOnTowL59+wBYv3493bt393NUDS8hIYEtW7ZQU1ODUor169e3uAG4Zxo9ejSLFy8GYPHixYwZM8bPEYmmJjms5ZD81bzyl8nfAYhr38svv8zkyZNxuVx07tyZhQsX+jukBtenTx/Gjx9PTk4OJpOJ7OxsZs6c6e+wGsSkSZPIy8ujpKSE+Ph4nnnmGebMmcOECRN48803SUxM5N133/V3mEI0mpaewyR/Na/8JXeuF0IIIYRoInKpUQghhBCiiUjhJYQQQgjRRKTwEkIIIYRoIlJ4CSGEEEI0ESm8hBBCCCGaiBRe4oKmTp3K3/72t6veT3Bw8CW3efHFF6mpqbnqY/lDXl5ei75RoRCiYQwaNIjt27cDMHLkSMrLyy+6/VNPPcW6deuA5p0jxfmk8BJ+19RJxePxNNi+rrbwOjeW+sbWkG0QQjStv//975f8oe5nn32WYcOGAVJ4tTRSePlZUVER3bp1Y+rUqXTt2pXJkyezbt06+vfvT1JSEtu2bQOgurqa6dOn07t3b7Kzs1m1apXv9QMGDCAnJ4ecnBxfEZCXl8egQYMYP3483bp1Y/LkyVzolm1vvPEGvXr1IjMzkzvvvPOsP+5169bRs2dPunbtyurVqwH4+uuv6d27N1lZWWRkZLB//34Afve735GWlkZaWhovvvjiecfJy8vj9ttv9y3PmjWLRYsW8dJLL3H8+HEGDx7M4MGDAfj444/p168fOTk53HXXXdhstvP2N2jQIGbPnk1WVhZpaWmXPE+LFi1i9OjRDBkyhKFDh2Kz2Zg2bRrp6elkZGSwbNmyix67Y8eOPP300+Tk5JCens7evXspKiritddeY/78+WRlZbFx48azYqxvLOcul5aWcscdd5CRkUHfvn3ZuXMnAHPnzuXuu++mf//+3H333d/3lhJCXEJ98+62bdvo168f2dnZ3HDDDb6738+fP5/p06cDsGvXLtLS0s4rjOx2OxMnTiQlJYWxY8dit9t9z3Xs2JGSkhIAnnvuOZKTk7nxxhuZNGkSL7zwAvCfqw7n5khd15k6dSppaWmkp6czf/78Rj9fooEp4VeFhYXKaDSqnTt3Kl3XVU5Ojpo2bZryer1q5cqVasyYMUoppR5//HH11ltvKaWUKisrU0lJScpms6nq6mplt9uVUkoVFBSoHj16KKWU+vTTT1VoaKg6cuSI0nVd9e3bV23cuPG845eUlPjmf/7zn6uXXnpJKaVUbm6uGjFihNJ1XRUUFKi4uDhlt9vVrFmz1JIlS5RSSjmdTlVTU6O2b9+u0tLSlM1mU1VVVap79+5qx44dSimlgoKCfPHcdtttvmM9+OCDauHChUoppRITE1VxcbFSSqni4mI1YMAAZbPZlFJKzZs3Tz3zzDPnxX3TTTepGTNmKKWU+uc//6lSU1Mvep4WLlyo4uLi1OnTp5VSSj366KNq9uzZvv2VlpZe9NiJiYm+c/Pqq6+qe++9Vyml1NNPP61+85vfXPDftr6xnLs8a9YsNXfuXKWUUuvXr1eZmZm+Y+Xk5KiampoLHk8IUT/1zbsVFRXK7XYrpZRau3atGjdunFJKKV3X1YABA9Ty5ctVjx491KZNm847xm9/+1s1bdo0pZRS+fn5ymg0qn/9619Kqf/kvG3btqnMzExlt9tVZWWl6tKliy+f5Obmqvfee++s7ZVSavv27WrYsGG+45SVlTXGKRKNSH4y6BrQqVMn0tPTAUhNTWXo0KFomkZ6ejpFRUVAbU/M+++/7/s05HA4OHz4MO3bt2fWrFl89dVXGI1GCgoKfPvt3bs38fHxAGRlZVFUVMSNN9541rF3797NE088QXl5OTabjREjRviemzBhAgaDgaSkJDp37szevXvp168fv/zlLzl69Cjjxo0jKSmJTZs2MXbsWIKCggAYN24cGzduJDs7+7LPxZYtW9izZw/9+/cHwOVy0a9fvwtuO2nSJAAGDhxIZWUl5eXl33ueAIYPH05ERARQ25u3dOlS377Cw8NZvXr1RY89btw4AHr06MHy5csv2Zb6xnLu8qZNm3w9cEOGDOH06dNUVlYCtb9RFhgYeMljCyEurj55t6KigtzcXPbv34+mabjdbgAMBgOLFi0iIyOD++67z5czzrRhwwYeeughADIyMsjIyDhvm82bNzNmzBisVitWq5VRo0ZdMu7OnTtz6NAhfvKTn3Dbbbdx8803X+kpEH4ihdc1wGKx+OYNBoNv2WAw+MbyKKVYtmwZycnJZ7127ty5tGvXjvz8fLxeL1ar9YL7NRqNFxwXNHXqVFauXElmZiaLFi0iLy/P95ymaWdtq2kaP/zhD+nTpw8ffvghI0eO5PXXX69XG00mE16v17fscDguuJ1SiuHDh/PXv/71kvu8UHzfd562bt3qKwy/z6WO/d35/L5zeaH91TeWS8V2udsJIS6uPnn3ySefZPDgwaxYsYKioiIGDRrke83+/fsJDg7m+PHjTRp3eHg4+fn5fPTRR7z22mu8++67/OlPf2rSGMTVkTFezcSIESN4+eWXfeO0vvzyS6D2E1lsbCwGg4G33noLXdcva79VVVXExsbidrt5++23z3ruvffew+v1cvDgQQ4dOkRycjKHDh2ic+fOPPTQQ4wZM4adO3cyYMAAVq5cSU1NDdXV1axYsYIBAwacta/ExET27NmD0+mkvLyc9evX+54LCQmhqqoKgL59+7J582YOHDgA1I6TOrMX70zvvPMOUNtDFBYWRlhY2Peep3MNHz6cV1991bdcVlZ2Wce+UOznqm8s5xowYIDv3yIvL4/IyEhCQ0Pr9VohRMOpqKggLi4OqB2beeb6hx56iA0bNnD69OkLfgN84MCB/OUvfwFqryx8N1bzTP379+eDDz7A4XBgs9l8Y2nPdWaeKSkpwev1cuedd/KLX/yCHTt2XG0zRROTwquZePLJJ3G73WRkZJCamsqTTz4JwAMPPMDixYvJzMxk7969l90j8txzz9GnTx/69+9Pt27dznouISGB3r17c+utt/Laa69htVp59913SUtLIysri927d3PPPfeQk5PD1KlT6d27N3369GHGjBnnXWbs0KEDEyZMIC0tjQkTJpz1/MyZM7nlllsYPHgwUVFRLFq0iEmTJpGRkUG/fv3Yu3fvBWO3Wq1kZ2fz4x//mDfffPOi5+lcTzzxBGVlZaSlpZGZmcmnn356Wcf+PFIl1QAAASVJREFUzqhRo1ixYsUFB9fXN5ZzzZ07ly+++IKMjAzmzJnD4sWL6/U6IUTDevTRR3n88cfJzs4+q5f7pz/9KQ8++CBdu3blzTffZM6cOZw6deqs195///3YbDZSUlJ46qmn6NGjx3n779WrF6NHjyYjI4Nbb72V9PR0wsLCztvuzBx57NgxBg0aRFZWFlOmTOH5559v+IaLRqUpdYGvuglxjRs0aBAvvPACPXv29HcoQghxxWw2G8HBwdTU1DBw4EAWLFhATk6Ov8MSjUjGeAkhhBB+MnPmTPbs2YPD4SA3N1eKrlZAeryEEEIIIZqIjPESQgghhGgiUngJIYQQQjQRKbyEEEIIIZqIFF5CCCGEEE1ECi8hhBBCiCYihZcQQgghRBP5f6F9iBJsU/USAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 720x360 with 2 Axes>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "hP-pW2BxuT1q",
"colab_type": "code",
"colab": {}
},
"source": [
"all_dfs = []\n",
"for length in test_scored:\n",
" tmp = test_scored[length].copy()\n",
" tmp[\"size\"] = length\n",
" all_dfs.append(tmp)"
],
"execution_count": 82,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "9wvPr_h3uZnL",
"colab_type": "code",
"colab": {}
},
"source": [
"pd.concat(all_dfs).to_pickle(\"math_df.pkl\")"
],
"execution_count": 83,
"outputs": []
},
{
"cell_type": "code",
"metadata": {
"id": "lE85y3hY2RDo",
"colab_type": "code",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 17
},
"outputId": "2f7a88fc-d956-464c-8298-191e46234322"
},
"source": [
"from google.colab import files\n",
"files.download('math_df.pkl')"
],
"execution_count": 84,
"outputs": [
{
"output_type": "display_data",
"data": {
"application/javascript": [
"\n",
" async function download(id, filename, size) {\n",
" if (!google.colab.kernel.accessAllowed) {\n",
" return;\n",
" }\n",
" const div = document.createElement('div');\n",
" const label = document.createElement('label');\n",
" label.textContent = `Downloading \"${filename}\": `;\n",
" div.appendChild(label);\n",
" const progress = document.createElement('progress');\n",
" progress.max = size;\n",
" div.appendChild(progress);\n",
" document.body.appendChild(div);\n",
"\n",
" const buffers = [];\n",
" let downloaded = 0;\n",
"\n",
" const channel = await google.colab.kernel.comms.open(id);\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
"\n",
" for await (const message of channel.messages) {\n",
" // Send a message to notify the kernel that we're ready.\n",
" channel.send({})\n",
" if (message.buffers) {\n",
" for (const buffer of message.buffers) {\n",
" buffers.push(buffer);\n",
" downloaded += buffer.byteLength;\n",
" progress.value = downloaded;\n",
" }\n",
" }\n",
" }\n",
" const blob = new Blob(buffers, {type: 'application/binary'});\n",
" const a = document.createElement('a');\n",
" a.href = window.URL.createObjectURL(blob);\n",
" a.download = filename;\n",
" div.appendChild(a);\n",
" a.click();\n",
" div.remove();\n",
" }\n",
" "
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
},
{
"output_type": "display_data",
"data": {
"application/javascript": [
"download(\"download_bd001835-e84d-49bf-b44d-c6180abb806f\", \"math_df.pkl\", 51144)"
],
"text/plain": [
"<IPython.core.display.Javascript object>"
]
},
"metadata": {
"tags": []
}
}
]
},
{
"cell_type": "code",
"metadata": {
"id": "A50bkKri4Alf",
"colab_type": "code",
"colab": {}
},
"source": [
""
],
"execution_count": null,
"outputs": []
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment