{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Using Multi-layer Perceptron and Convolutional Neural Networks for Satellite image classification - 2022. \n", "\n", "Antonio Fonseca" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Packages to be installed:\n", "\n", "```\n", "conda install -c conda-forge umap-learn\n", "pip install phate\n", "conda install -c conda-forge imageio\n", "```" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stderr", "output_type": "stream", "text": [ "/Users/antonio/opt/anaconda3/envs/geo_comp/lib/python3.10/site-packages/tqdm/auto.py:22: TqdmWarning: IProgress not found. Please update jupyter and ipywidgets. See https://ipywidgets.readthedocs.io/en/stable/user_install.html\n", " from .autonotebook import tqdm as notebook_tqdm\n" ] }, { "name": "stdout", "output_type": "stream", "text": [ "cpu\n" ] } ], "source": [ "import numpy as np\n", "import codecs\n", "import copy\n", "import json\n", "import scipy.io\n", "from scipy.spatial.distance import cdist, pdist, squareform\n", "from scipy.linalg import eigh\n", "import matplotlib.pyplot as plt\n", "from sklearn.cluster import KMeans\n", "import random\n", "from sklearn import manifold\n", "# import phate\n", "# import umap\n", "import pandas as pd \n", "# import scprep\n", "from torch.nn import functional as F\n", "\n", "\n", "import pandas as pd\n", "from sklearn.metrics import r2_score\n", "from sklearn.preprocessing import MinMaxScaler\n", "# import seaborn as sns\n", "\n", "import torch\n", "from torch.utils.data import Dataset, DataLoader\n", "from torch.utils.data.sampler import SubsetRandomSampler,RandomSampler\n", "from torchvision import datasets, transforms\n", "from torch.nn.functional import softmax\n", "from torch import optim, nn\n", "import torchvision\n", "import torchvision.transforms as transforms\n", "import torchvision.datasets as datasets\n", "import time\n", "\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "print(device)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Now that we have an autoencoder working on MNIST, let's use this model to visualize some geodata. For the next section we will use the SAT-6 (https://csc.lsu.edu/~saikat/deepsat/)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "SAT-6 consists of a total of 405,000 image patches each of size 28x28 and covering 6 landcover classes - barren land, trees, grassland, roads, buildings and water bodies. 324,000 images (comprising of four-fifths of the total dataset) were chosen as the training dataset and 81,000 (one fifths) were chosen as the testing dataset. Similar to SAT-4, the training and test sets were selected from disjoint NAIP tiles. Once generated, the images in the dataset were randomized in the same way as that for SAT-4. The specifications for the various landcover classes of SAT-4 and SAT-6 were adopted from those used in the National Land Cover Data (NLCD) algorithm. \n", "\n", "The datasets are encoded as MATLAB .mat files that can be read using the standard load command in MATLAB. Each sample image is 28x28 pixels and consists of 4 bands - red, green, blue and near infrared . The training and test labels are 1x4 and 1x6 vectors for SAT-4 and SAT-6 respectively having a single 1 indexing a particular class from 0 through 4 or 6 and 0 values at all other indices.\n", "\n", "The MAT file for the SAT-6 dataset contains the following variables:\n", "\n", "- train_x\t28x28x4x324000 uint8 (containing 324000 training samples of 28x28 images each with 4 channels)\n", "- train_y\t324000x6 uint8 (containing 6x1 vectors having labels for the 324000 training samples)\n", "- test_x\t28x28x4x81000 uint8 (containing 81000 test samples of 28x28 images each with 4 channels)\n", "- test_y\t81000x6 uint8 (containing 6x1 vectors having labels for the 81000 test samples)\n", "\n", "Labels:\n", "- Building = 0\n", "- Barren_land = 1\n", "- Tree=2\n", "- Grassland=3\n", "- Road = 4\n", "- Water = 5\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "cpu\n" ] } ], "source": [ "import numpy as np\n", "import scipy.io\n", "import matplotlib.pyplot as plt\n", "import torch\n", "from torch import optim, nn\n", "\n", "device = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\n", "print(device)" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "# Using the satelite images dataset\n", "###############################################################################\n", "#load the data\n", "data = scipy.io.loadmat(\"./SAT-4_and_SAT-6_datasets/sat-6-full.mat\")\n", "train_images = data['train_x']\n", "train_labels = data['train_y']\n", "\n", "test_images = data['test_x']\n", "test_labels = data['test_y']" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data shape : (28, 28, 4, 324000) (6, 324000)\n", "Testing data shape : (28, 28, 4, 81000) (6, 81000)\n" ] } ], "source": [ "####################################################################\n", "#Checkout the data\n", "print('Training data shape : ', train_images.shape, train_labels.shape)\n", "print('Testing data shape : ', test_images.shape, test_labels.shape)" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Training data shape : (324000, 28, 28, 4) (324000, 6)\n" ] } ], "source": [ "#Change the dimension to fit into the model\n", "x_train = train_images.transpose(3,0,1,2)\n", "t_train = train_labels.transpose()\n", "\n", "# x_test = test_images.transpose(3,0,1,2)\n", "# t_test = test_labels.transpose()\n", "print('Training data shape : ', x_train.shape, t_train.shape)\n", "# print('Testing data shape : ', x_test.shape, t_test.shape)" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "count, t_train[count,:]: 0, [0 0 1 0 0 0]\n", "count, t_train[count,:]: 1, [0 1 0 0 0 0]\n", "count, t_train[count,:]: 2, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 3, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 4, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 5, [1 0 0 0 0 0]\n", "count, t_train[count,:]: 6, [1 0 0 0 0 0]\n", "count, t_train[count,:]: 7, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 8, [0 1 0 0 0 0]\n", "count, t_train[count,:]: 9, [0 0 1 0 0 0]\n", "count, t_train[count,:]: 10, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 11, [0 1 0 0 0 0]\n", "count, t_train[count,:]: 12, [0 1 0 0 0 0]\n", "count, t_train[count,:]: 13, [0 0 0 0 1 0]\n", "count, t_train[count,:]: 14, [0 0 0 0 0 1]\n", "count, t_train[count,:]: 15, [0 0 1 0 0 0]\n" ] }, { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAk0AAAJPCAYAAABhMuBTAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAD6JUlEQVR4nOz9eZAl2XXeCX7X3d/+Yo/IyMjIyLX2BUABIFaSIBuCCHIoA0YSW2RzaJANp6meEdXkGGeaoHo4zR5jmzhjJo5ZmzSyxjQxgCQaFxMhEVxAEgIBkgDBYhWWWrOycl8jI2Nf3u7ud/7IqHzvO8cz42XGkpmV52dWVnnfc79+/fq51z3e/fw7znsPwzAMwzAM4/YE97oBhmEYhmEYDwL20GQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qf20GQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qf20LSDOOcKzrnfcM5dcM6tO+e+45z74XvdLuPBwjn3s865F51zLefc5+51e4wHE+fc15xzTefcxuZ/J+91m4wHD4sjxh6adpYIwCUAHwEwBOCXAfyuc+7IvWyU8cBxFcCvAvjsvW6I8cDzs9776uZ/j9/rxhgPLBZHm0T3ugFvJ7z3NQC/0vPRHzrnzgF4D4Dz96JNxoOH9/4LAOCcey+Ag/e4OYZhGMYm9kvTLuKcmwTwGIDX7nVbDMN4KPkXzrkF59w3nHM/cK8bYzywWBxtYg9Nu4RzLgfgNwF83nv/xr1uj2EYDx2/COAYgGkAnwHwB8654/e2ScYDiMVRD/bQtAs45wIA/w5AG8DP3uPmGIbxEOK9f957v+69b3nvPw/gGwB+5F63y3iwsDhiTNO0wzjnHIDfADAJ4Ee895173CTDMAwA8ADcvW6E8cDzUMeR/dK08/wbAE8C+Hve+8a9bozx4OGci5xzRQAhgNA5V3TO2R84Rt8454adcz/0Vuw4534SwPcD+NN73TbjwcHiSOO89/e6DW8bnHOHceMtuRaAuOerf+K9/8170ijjgcM59ysA/gfx8f/ovf+VvW+N8SDinJsA8McAngCQAHgDwC977798TxtmPFBYHGnsockwDMMwDKMPbHnOMAzDMAyjD+yhyTAMwzAMow/sockwDMMwDKMPtvXQ5Jz7uHPupHPutHPu0zvVKOPhwuLI2C4WQ8ZOYHFkbMVdC8GdcyGANwF8DMBlAC8A+Anv/es71zzj7Y7FkbFdLIaMncDiyOiH7Xi/vA/Aae/9WQBwzv02gE8AuGWAlcplPzQ0eLOcpvx9s76h9oljsZGw1PKevy+XK6qOIAzFPomohIuh2B4AfMr7pGlM5Shf5GMGuo4kYZ9L2Y4wzIlmaf+wVLS1Wa9TOW5xnYncIbNeuQ2XA6d/kHQ9jgqdOEacJHdrdnbHcTRYrfh9Y8PdtjjZ/qym+C2KW/UJcMO3dHvIKtRR5B8xmX/TuNsWtzxoRr2piJMt2wlA/sEVBE6U5R4ZcdRz7a7NL2N1rXY3nXzHMRSEeR9GpW47QtH2ktwDSBu8jZxGgg5/XzjG4xkAEHMfNC63+XvZjnxGnxVFOzpyIuVy9lzE2ziIcsTH9RkR4OXcoobQ1mMqEIEWBjK2RX9kxHLSc+B2cw1xu7Fnc1GxWPEDlZGb5cKAuF4ZLUnb3A+h6KdA9lNe19EUfd9pcTlOODg7Md+vbrSDr7mHLDNB1sJUIMeEjCt5L9GxKPsoEe1ALPpLTywolPmzUIybdosP0m6IwQsgdd37c9JuII3bmXG0nYemaQCXesqXAbz/djsMDQ3ipz71qZvlppgvTrzwDbXPwhI/FLhQBEfM/pHPPvc+VcfAYJXKnc4aleV9aqgypOpoN5ep3BLlseknqVwo8TEBYK12ldvRWKfyyMg0lWPoAKuJQH/zO69Q+fqZRT6mmEABoCMC14MDKPB8YQqRvoPkffc4Z2evqu/vgDuOo31jw/j1f/5PbpbDQNzw5cQLqCf0JOZtUjFxuVD3mxMP0/LhOhHHCNRNAwjzvI38mwDij4BMP3lZbyifcLg/ory+eSdiDq2LSSQS5+/lMQC0m7xPqcr9USpw2aGg6igUuyf4M//dv1Lf98kdx1AYlTB88EPddlR4Kqy+U59v/TW+e7VX+fviFa7j+L/crw+8yH/Uvfp/vURlN8B1VA7psZd7jPu1OcdzYHCiSeVSdRCS1bUalUMv9tnH16oV6weeVp2PG4rL6xLur1QGHYBigc93pMCx6kpcaSHSt6xazzz5xvO/o76/A+44jgYqI/j7P/LPbpaP/AD/8ezyeg5vned+GEz5Bl8RDzjpIX3cN1o8R189w/ssrPG9ZW7+uqqjfpljoBNznUnAdRagf5BAma9XZ5ljIoq4znKo761yWqglHIvxcovKY8WyquL4e7ht5QN8Ha6e53aef0X/QNPKXbv574U3v67bucl2NE19/DkPOOd+xjn3onPuxXrdDLINxR3H0dpGLWMX4yHmjmMoTdsZuxgPOXccR82WzUUPG9v5pekygJme8kEA6icH7/1ncCMzMqYOTPl8qRuXScB/RichPx0DwOAYPyFuLPEhJg9ysuVOU//qUR7hbWoN/vUqlT8hhvpJtljmv/jGD/Hj/8LVy3yMNf4lCgByRX5GHR6ZoHLc4Ym8k+hfOxpr/IS8cvlbVE7q/FdlPtJ/HcQQf82JvwBL4qf5tHZR1bHvkcdv/vviwoL6/g644zh65PAB3/tTsnN8PknGX8Xyx5kgEr8sia7O/Cla/lol/kJUK2uh/su6HfOQk8eVv3j5rOUIuVRc43JOjOowp9vhIJeseSy2eYggzfhVPRZLBMWUD5yIzC9Rxi+Agev+IusyloH75I5jKJcf9EGr+xdsLuA+rJZ4bALA8Me5E5a+wr9Yh23u58rv6fEbH+V+rryL/yIeS3n8jj8+quqoi7i7Uj5L5VqDv1+PuZ0AEIhf7GVsN0VM+ba+Njkx7kqTfL3TlK93/Zoel+Eqb5N/jMtjh3mfdkY7gkJ3n/C76us74Y7jaPrgjD/4TPenktFp7oO5Nv9KAgDnxa9ELuB+bF/icx5q6tt0UOU6pofFclyT7xPLiV6Oag6LeXOF47ezyN+nOX398iJucoNcR3OBy4H4RRMAJmb4HtVui5WPHLdj+Jj+xTqO+VfNcI7bNTHCzxaNA/q6LHW657ecMd/dbM+tv9qSFwA86pw76pzLA/hxAF/cRn3Gw4nFkbFdLIaMncDiyNiSu/6lyXsfO+d+FjcS94UAPuu9f23HWmY8FFgcGdvFYsjYCSyOjH7YVuZ07/0f40YyP8O4ayyOjO1iMWTsBBZHxlZs66HpTkniNpbnukvEueoAfX/4sWfUPj7hNf8Lr65QeWxinMpHDh1RdYRCOFIeZj1SJEQgWa/pQ+gz2jWhZ8jxSmcu0iufUcTrrq0ar0vnC3yuI2NaVzE6dYTKtev8VsTiItd5fUm84gOgKaRj8v0c3+A38I726Jfe4pHH33nz36+9eVJ9v5s45xBE3UXnSFgORBnr0W35dpyQmxQKQksErQFotzgGgpCvcQBev/da0qJeWwtEnEgJU9LKqkS+ps0nHIk39KAsGYBUfpbwufmQtTfyXAEgkO/ci3MLE9Yi5KTYCkAQZZ3fHuAd0k53PPqnhb7jg1o3Uf9d/mx9lXURJdFni2cyRMIrfL7vPcNj/u/81giVBzPeWDrxNdarfOvKPiq/nMxS2Q9laImGuB3pEs9NHRmneX3tBoa4Pyaf4LamF7iOlWNCKAdgWMy1oXi/vnWOZ6fCYX0uB57t9tlrf3wbMcouUCwHePJd3X5YXuE4OvOf9euvG0JTe+AjfI65a+ItNq89B9pN8cbwBMda7TwfNzehX3wYqvNn8TyX2wUe33k5rwCojvBxGoscz6F4pXJIaukAvPtHOU5O/iXH0dVl1kGNv0e3I1/ndpx9mc9lWb6EtqH7Ixnqzqu3c6+0NCqGYRiGYRh9YA9NhmEYhmEYfWAPTYZhGIZhGH1gD02GYRiGYRh9sKdC8DAqYGjiyM1yK2FBY5CRPHh0nIWR4x/+OJXLg8NULpRZiAYAcXOJylKgu7HOYumsPEsVkYogivg4Ez250ACg1dKix3aHBW35PIvkKgOceiWOtRFYLIzRDjz2Dip3znBahuXlFVXHQFGk/+iwoHV0/CiV9x3lMgCsrXUF6ElGeoTdxDmgkOuK9pSmOdOYUrpbinQ8wqTNBzr1iMxxF4gcSTInUpyRjk/GlhNtlTnBOi7DmFKkgAnEKO5IY+Nmhog7ZJFnZVDmsrp9ahYAyIk0MvJFB+FJhyDQoljXm9InQ7C+W/jAwVe6YzhZ4U5s/adhtU/jkhAZxzzGK8/w9539enqtf5fH/Lue4PE8sCYE+Ws6DqvneO6ZnuQ6Z3+Q3/QotXUmhsPvFaJfYaB4/q84Zgr7dDtmQhbsDk2zKfDlWTb4XZnV4ttOmfssFcatKIvcmit6fm98rTtG2ht7F0MA0Ek8rq122zx/kdtfa+i+r4kchfN/y+Ni/CCP+Uf2a+Hzq69xv1z5K97mSp3LrTjjVi/mFvmyDJoybZSuI+f5npUf5Gvsh0U+xsmMc/lDrqPpuI60zP1zTWdbQwq+h82f4TFQT/l7V9AvDPhmt61prOfut7BfmgzDMAzDMPrAHpoMwzAMwzD6wB6aDMMwDMMw+mBPNU0+TdFpdnU6V89xstnq0LTaZ+Ig62muz3Fi3NmLL1N5+tjTqo5YaokKbCaWz4vEhGmG4Z5Ya88JM8vlRU5qm2Y8jw6OsAmdNLNsC+1BVsLe8gDXsbHOyXLHZ7i/Fq7oBMYr589TeXh4mMre83qwTG4LAG3X7VOPPTYo9EDas8wtfUSjjKhOY6ENEtdYJotNszQ8Ze6HVEh0vEikWqhqg8yoI3QvwrzSe66jmNcmi0mosgsTbaFHCgKti8rnRbJhdQlF/2SY0iFhDVOaSl0Ubx7r7oDrTeIrNRW7SBA4FArdQCkKDcPRp3TC7QuzPG901vmEpt7J/TET8FgFgFRIg86c5uO+8ktCJ9bWScwrf5c1IIOHuLz/b1eoPHeZNZ0AcO4U64/C/cKct87teLwxpup44se5P8JhrmPuFBsudk7o69sRppmhSLwKGf6h1qJU9nXrCHJ7F0MA0GikeOWV7rw9t8gxEbe0pmnfNA+MVREDb7Z4HF05r/Vkb5zk46xfZn1wWmLNkyvoOdqJYAxEQu0oYG3RoJ6KMP0MX7/VOW5XS5oEL+vJ2W9wH808xm2tjPE+uWt6PpOjxAt96eCo0JIe1P2xerL3s1tr4+yXJsMwDMMwjD6whybDMAzDMIw+sIcmwzAMwzCMPthTTVOnVcfV0y/eLK8tsD7p0Xf9HbXPhTdeovLLX/93VJ5++jkqJ6n2AgkD1g7VNmrie352LFd5vR8A0oQFLKkQgeRLMlGhTIMLOKF5kRoQ53g9v1hkrQIAXJ+fp/L511/nOgucwHhthZPvAkDcXqFyzvHa9tAgJwr2ifacype62gIX7K2OwAUO+XKPjkEcvp2RJ1UuUYs8kvBCTxNJryNo3RNCkQRY7JNlO5QriDpk5uBY+kXpv2sKOdYJJInwuhH6hbit1+/bwisGiYhNx3UWM4RigWi7E30Yi/j2zQxRU+8xsxJl7xJhPsDIke44z/8ga0LwDR3z+0S/r+Z4n9d/k4Oqk5Gg9sl3jlI59xjPK80FHq+PTehr9+P/B9Z0VIRe4/d/idt5ckKIywBEY3ythps8Xz3xA8NU/t7/Ul+70ZiP+63/KLQ4f8JtHxzViWf3P8lxlp/hdq29LJI+L2t9z1Pf043d5/N7Oxe1ax6Xv93tXzfA+pywrPU3K5f5HPLHxXgVHktnTmhdVLrCOrXCMG9TmRDJxQd1v7VX+V7ZFG3NX+Br8+wHh1QdT36IY/7EtzjWTizwvJIh0cPyOLc96Yj7b4P7Y3ZZj4n1tTUqB0WRPFxo55JLGR56vQnIMzStN+u+5TeGYRiGYRjGTeyhyTAMwzAMow/sockwDMMwDKMP9lTTlKQx6htd/5Mjz/5d+n55YV7ugle/+R+oPDjOfiHVwhSV05Y+pUKF9UaNptAvCP1G3NFrpmGO11kDoW+pDAxQudnQdZRGWCskc6Sd+fZXqZwGWhdVGTpA5XqNNRFvfpX7K460ucbk4ceovO/wDJUn9rG/TNzRC9HpHuebYzxcz/pzGnM/ylxsABClUn8kRU1CSxRpDUcqvItSkVsuEcKpFNpTJhA6kFyedR4BuF87MhcXAGleE4jD5FKuI/Faz5DGUk8n2inGROL131dRTvap9Lri7fNF3R/5YvdiOdmIXSTn85iKD94sz33nPH2/kaElyq1z+/LhMH8vjKjGh7W47nBd6CtLIljfycfYeFVrNM/8qvD66nAM/e0ka6nCJueIA4AxoZs5wlJITA9yu07/tr429e/yNm9eYG+r4Y/wvJEcU1Vg7QWhAzvF5+aExu/oY3pwV8e6dWR5yu0mLkwRDnY1OfUaj4Eo0TquqhhbjzzCfeAjHr/BhvbZurLG29TF3NRqcSwG13W/RSK/ZnpV5MEU57JwXc8BL/8B3xdPLnG8NsS9NNnQ+jrfEHrhg9yucIAnknpD52RtCmFrKPojmeX+yMot2qv91L51XeyXJsMwDMMwjD6whybDMAzDMIw+sIcmwzAMwzCMPrCHJsMwDMMwjD7YUyF4oVTFkXd8781yu86CrrW5S2qf/ceepHKxwILrgREWhrea2lAuSVicVttgIfj4Pk4UHIZaJJZ0WHjnxTa5gjDkKmhDstdf+AZ/EPG5nH7jTSrPXdT9kYMQFub5/HNjLPIuF7T4dn7+OpVLGyzAP3T4x7jOqhYzLi/3GLqpb3cZ5xCE3ef9WAiyw7z+W8CJ5MexMkHlfcIM4bPQbyIR5o5JRwgahSEqAAQibhLPAsVUHDft6OsXibZKrb+XiTidFpOHIgFvKBJQpzLRZka2XfkiQ5gX4nIhzsxlJA2NerIt76EOHMUoxmPDXYHtt/+K+6zxfXr8liES5T7Oc01S5+v9+lk9F12f4zpaG3zx8gd4rK1f0VP0v3Fs5CfN/wopt31AJAYHgJIQEs/8M65jYJHHx9f/Vs+Jax1OBt6s8rzqT/D2uTEdQ6UPs1h8/bf5OIOjIpZLejzMfqvb753a3hmkAoCPHNoj3RjOFfkch+tayH/8Sb5XHDzGL/zUSiyWTr2OgdUlrmNB3CriJW7HkBzPACqP8ICrr4sXDBzHyNqKfqkoHRKC8wrXWRAvT2QZ2JYPDVN58jDfF4eOcB3Lc1pM3riwSmXfFMcZ5XNxGU8+vldvf5u5yH5pMgzDMAzD6AN7aDIMwzAMw+gDe2gyDMMwDMPogz3VNKVxjPpSVz/jhUHkoUffqfbJR0JPI7KgpiKxXrMmjCsBJDGvZ66vrHAd4DXlUoYG4MqFk1S+eO4NKpcH2EBu9vULqo62kEkEJV67LQwf5O9zx1UdLuD+iEWSVC8NFuMMXY3Q2iwtsnna2deep/LYPk4yCgCFngTFe2lKCADwQNqT/DiMpMmiXjdvC7OzjtAOFUMuZyXKFbIoiLCCEyaSuZyuw0t9kRRKiWPIHMEAEES8USg3yvH5Vwe1ligRZp8qP2UitCRhhtmnSPTsApGgNxI6qQzX0V452p6qURqAf7V7TvmQ9Uflv9A6vqlPc/ubT+yn8tL1ESqv/Xs2ewSAxhnWDz7+A4ep/Og+Top6+bQ2/H0l4KS+pRyXj3yEtaJDcxl6pDXW2mz8W47DeaH7bGTMI+tN/myjyXX6nEjo/BWtickL8Ujc4joPTvM+Bz+ckWj1+Z65YI9/BshXgJkPdtvUmOUGXPmivpcMHRC6n8s8thbFQDj7jYzbNHsco7wq6hQJeo++X4+uNWFWWZ3j6/X0CNd5/Ef1HNBY4Vir/Y3Q/h7gcu2qHlcTIlH9u7+X21Hcz+WLL2id2LUzItYi1j2FgTAEjvV1STvdOSAr2frNfW/9lWEYhmEYhvEW9tBkGIZhGIbRB/bQZBiGYRiG0Qd7qmmK8nlMHOjqdtJUeOdI0Q+0HqlSZZ8TJ8QYsRSeAHBCvzI2/QyVl65cpvKFuVdUHUFumMuOywuX2G8kdsK3CUB+iJMLB8LbaV3kIczndMLejTonAQ0i1iJEOS6Hsfa0mDnMmTPL4HYVy9zHI/sPqTp6s8RK76Hdx8P3+Bs5oYtoZ+QSFt2EQl4k2xVhkyZ6UTsRSW5DoeGRoynDpkn5e0lDEOe58VGG51QYcmMjoZ2S2qq4rYd5GksvGNEq4UEVyKzAABKx8J+I8RwKfxnZf/K4Sle1iywnMb7Qkzw87/n8poe0fuMDR3mbNyeERucgaxRrw/raPfLr7JH2c5/iky4Jj62TGb42VaHhO/l19m1648/5uANSfAdAfnJWXLu1dIHK0pMMAFzI55+ILKeJSLbrMvzC0ga3JC/0eHGb56LaWd2nab7bZ+ke6ysj7zDZ6R7/bIvPZ99Tuu9X8xxHrVe4n1ZneWxev6oT1K6LeaEgEiwPpKwTWvmu7vu1eZGUW1yvtvBVu/a81iNdW+ZJrrXM7ZCJ7cfep6/Puz7A+qJQeHO99C+5P66eyohFmYBXdHu6yG0fOKjvi0Pl7jbrq7f+Pcl+aTIMwzAMw+gDe2gyDMMwDMPoA3toMgzDMAzD6IMtNU3Ouc8C+FEA1733z2x+NgrgdwAcAXAewH/pvdemJIIwDDE40vX8WV/jtfgk1euu+TyvRXY6rHtq1LhcrgyqOpYWOC/N+hr7mgh7Efh4WNWBPH9WHODjVMd47X35GmsXAGBlg9uRCM1HeZC9njqxXstOhe6rMsQ6Cif6J2jr/FcTk5NUHp9gHyYpX5m7dF7VsbZ48ea/m/V19b1kJ+MI3sEn3ef9thAkdTpaTFSUOauEP1InFUMhQ2AThRliqR5S8TdIIjVPADykxxJ/nxMymSRDW+VjbmtHOBx5oYuS/kkA4MS4ihtiEEi9ktdaBGkPFQhvqyCV2gOtiejVZ22lRtnRGIKn3IDRAT7/s3roofCqyIt2nvv5sausNxyf1xrNKaFJdH8mtGUz7I+0WuTtAWDpBLdjY4GDplTl2B6f0nq0cIHrfXNF5NFrCK3VkK7jaI7H2dwl7o/2T/F8NvS9PFcBwNr/Wcwd+/g4ue/jcvqivkeM/6NuP0e/s7UwbifjKPEOq+1uXKcbQqN1Ve4BTBzj8XvgaR4nV17nc1gSqQYBoLnA/TD2mOi3ES7PndHXb3WVY68otJIrZdbUtnUVWFzkGAgLXJ48yrE6tKbngJN/ydreS5f4QFfn+H5d72TMZ0K3NzjDbR8SOsBmpOfyqGeedLcxaurnl6bPAfi4+OzTAL7ivX8UwFc2y4ZxOz4HiyNje3wOFkPG9vkcLI6Mu2TLhybv/V8CWBIffwLA5zf//XkAn9zZZhlvNyyOjO1iMWTsBBZHxna4W03TpPd+FgA2/79v55pkPERYHBnbxWLI2Aksjoy+2HUhuHPuZ5xzLzrnXqzV9Pq8YfRDbxytrFscGXdObwylqc5fZRj90BtHjQ2bix427tbccs45N+W9n3XOTQHQqudNvPefAfAZADg4c9ADXZHXtcuv0rYDY5y8EgBKJU5gOT/Pyrrzp16mcpgbU3UMDHB2w/wg/xGxfOlbVL42e1bVse/gs1TOCWPK2TMnqFycnlF1hA0WtAXimTUQjlzFnBbNocQCt9pVPu6+qWkqD4ywQB0AJsa5j/KDfC5zF7hPO3WtRJyY7hpk5l7VyYn75K7i6NEj077R7AohOx0hDk2zRMviMyEmTISYPBdoA7VQJuAVYkGvcvHq4ZUT7QikaaDjGAjCDFPJRCTF7IjjyKyliX5AkKaw8jCx7MOM/uhNmnxjE67TFblS53UdLP++K3fLu4qhXH7IB0G3H70w+qt5LRQ9+++46qJnAXa5zePEBbqOq6IL3vxdTsh7vMLi3PigFpOfPcrXc/glDrwP/SR/33hJzwEnDnFy4bHqESqv/801/n5Ra6JXxHjYEDlQ3+F5XjlY57kcAF4b5oeOxf18Ls0rfF1eXtIK/cf/bXdO7Cyqr/vlruJo3/RBH/dcwto8j5s0r4XrxTkWSy+KiSNpcgxMPqrbUHxUvDFygWOtOs5jqZHhtNua5L4fTVi4PyJMJssZ2ZBXxC1qRU4bQtQ9PKrn5tF9/BLC3El+OSABvxyRq+qXm4IOHycvHgMmD3Dbz17Qhsytle6/fcY95OaxbvnN7fkigE9t/vtTAH7/LusxHm4sjoztYjFk7AQWR0ZfbPnQ5Jz7LQDfBPC4c+6yc+6nAfwagI85504B+Nhm2TBuicWRsV0shoydwOLI2A5bLs9573/iFl99dIfbYryNsTgytovFkLETWBwZ22FPE/bGcQeLi3M3y02RoXZgQmt4FudXqHzm9ZNUPvfKi7yD0+v3+SKbOQ6OcrkwMkHloMi6IAA4d4b1V4cfez+VR6a4zutvsE4KAIKQ1647YH2SD8Z5e+h116TOb8oee9cHqDx9lHVhtcvcXwDQafEa8WCFj9tusQnn6Kjuj6gnSSb2OEmm95z8Vf5cGhT1D6ixaGPSERqmiHUEQZShJxPXQyacTmO+vi7DDFPJAkKh44mFmV+GuaVSBgldlGpXJyPBpTD39ELjlArdlNRvAUAoXFCDiKeTfIFP1rf0den0XMc9zNeLFCkavjsOWjGPxWK+InfBmuj5xQ7HTJLwuEqgdSReJEUNEp4D3wy4zumq1sQcWGBt0HnH2pQ//V/4OlTfq9tx6F1cnjnAbf/2OF//5I90HR1heCpNB1/90gqVz7ykqkBzhWNi+AK3vZBjoZRfyNDnfaBH4/LXWbq53aPTSnH9fPf4qx2+nnFVz41DYhKIr/I2i6+LsXlAJ24fOMZzUSfP/bKwxP2wLnWfAHItNhudfIaPO/kEl+fP6PHb3uDrVRSOt1WhwR16JGOUT3GsLf8Jx9roYT63pXMZSZtzXEdtlvc5eZHHc7up6xibuL158VtYGhXDMAzDMIw+sIcmwzAMwzCMPrCHJsMwDMMwjD7YU01Tp93E7MWuxibxrD/qpAW5C868ytqg2dNnqBzkj1I5jHRSSB9xct2NuvAX6TVoANBiWQEAIPVcx/lzrBUajXgNed/BQ6qOoSn2h1pbZn3StXNvULkyquvwRaFXGOI+bNVXqOwyrnAgdBPNVfa+ElIUFIu6koHxrg4qivY0jBC4AKVid63cifXsNONPgbTDH0rFkuynDHskBEKj5ETiXERCF6SrQCp0H05Kh3JCA5HlOSVS2/qE9Qqh0EmFea2NkxKHuCW8n4QGzCPDL0oknI6EpqvTFvqFjITccaerPfDp3qmaHBxczznlGhwR4z+g9Q37x7lPlv6QY6o5Kq74jB4Xyesi2fIQ19FY5eNe/KbWaJYj1mDmItb9BFWeV7LyaV//T3zcuSsiaWyT29EqZBhkC8+xdJLnkZUazzPrV1krCQClvPAXKrIGZviAMI8c1YPbXev5rLO3+sq4nWDpUtefa+Yoj5PRstbGlYe5fPEy99N8yuc8UddjL78s4maSz3vuL7hfRx/RGs2SSHIbi1nx9Gk+xuI5PaPtf4y3ed/7uFz0XD5zTY/x85f5s3hS3IDl9JUxjxTFOAoKPM7aNTFHSn88ALmefZSvX2/dt/zGMAzDMAzDuIk9NBmGYRiGYfSBPTQZhmEYhmH0wZ6KUcKoiOr44zfL81dP0/ff+srvqH1cOkzl8tgRKs9e4RxJUYYuIgj42TAR6/WRcIhpZUgrOgmvK0fCtqRRv0jlx5/+uKpj6smnqby+zPmcWutcTjNyz3mxZj/7nT+j8ug+1jtMHdYeS4US90ck8opNzDxB5eGRUVVHp9XTAX4vHXaAIAQq5H/CWrg00X8LJBGvaaeOL2CQ56EQZoiavEwuJzZJhUdJRro2hOKSJu3b64BkjrgbHwptldAfhcIHJpfhW5UX9eZkCrxBbmh7VfdHKnNmpbxNfYOPkZVHD+E98vtyDmHU1c+E4xxDcUuPvXnH+pT8ERZbDAiPrY1E58gaGONtij/NOeCu/ftZKs+c1rnWPvLfsQfNyivc9hOXWX/ZGtQakIsvsy9T7fIKlSsf5Rh77w/qOIz+iLVUr53mXHMr72ZtjlvU1791mutdF3kUJ69KDae+LkGvQG8PdXEAkCTAymo3bo9usAbt8Hv0LdbN8Hi8ep0HX15odkYyzrkuxu/qKTF/iXyTkyMZGr0i1zsv5FeLz7O2qLWivbrmL3Id64N8/iMf4u39dZ3g+NKf82ftCR436QbPC7GcRAFEFe5DIZdGJOR0+Zzuj3S4ZzyHpmkyDMMwDMPYFvbQZBiGYRiG0Qf20GQYhmEYhtEH9tBkGIZhGIbRB3sqBE890OrRp7U2WAA2Nf0OtU+rxYKsy6dPULngWfCWq06pOjY2WPSYJlxnRyQ4TYKMbhG6sHayRuWBgIV5i7OvqSoiYeQ2+SgLw8dm2Mzy/Es66W8rYae6kTEWkj7+3AepXBlkcSYANDssOHdg4WFOCHZXFxdUHYViVwTq9zTV6g3hc75HuC28HSFyfAIAvOdzitsi+a4QNUeRFs/KOvT30iBSbxMIA0zR9eiIBL2xbgYiIfQOcuJFhiaXm00teozyHPNOmMH5FouLo2KWIN3dtuxTmVw1K05u36e7RVSOMPqesZvlffs5Ce7oCS16PR6wQHX8Ce6jK2Je+faBjBj6Cgu7068sUjm/ytflsWpD1fHkF/mza2P8/cjPsRB8uaUNMuefv0zlRo4NMcfneHyUrmiD1LMz3Efzb/A8mxOmuJ2rekD4Fl//5hpv05jh7cOKfrsiWuz5LNjjl1JyHoX93X448BS3rzWs++2Nv+U2nnxBJKgdFS92ZCTLXq0L89HTXMdgmWOvsaCT/r5S53qXGiJp+TqfS7Wi2/HUR7mtkx/mba6/ye08d1a/2NAOeVy15sWLSlUxN+W0+3RnXiQLX2OxeDjBxw0P63NZf6Ebv0kzY+LdxH5pMgzDMAzD6AN7aDIMwzAMw+gDe2gyDMMwDMPogz3VNLWbLVw+eepm2ce8zjh8cEbugnYyR+V9Bw9S2eV4vf7s65z0FgAKA5xsst0QRocitWqQYbLXill/Fea4XBlkIc3xZ75H1SG1P5de+2sqlwq8DjtxQGsRrp1kfdH0u49ReWh8mMpRQRuBddZZjxUKXUm+zOvf7abWVQQ9CQ33NkXmjWSKuVJPcsU2r+e7UOsIpAGkEwaRSSoz9uo6AqFZksaUbWmslyFqcjF/JvNC5kS25CjN0CMp3QZfv04iEnHGGToP0bZAJvnN8bm5LK2I4+MGahuOvTTDMI722MNAqk4E+PB/023fk1Pc1ud/S2tn1v6cG/h0xPtcv8D7XPqG1m+UxPVNhSFks8Hff7nF+iQAOHuNNSBPs5QI70s4afmFWMdy8Sp/FkzxGKqtcztOfFlrvJaW+XzjJpfbX+E4DGL9N3pV5Gjff5jn1XE3zHVe13E4O9c9Tqezt5qmNAbaPeaUzTU+fvu6Duq1F1iTUxa3vQFhZtkoZei4Kty346e5PCAMNPMZCXub11hz6C8KLaRIcjvc1HVUlnjeXL/M27z+h3yu14ra3NJFIuF6k9sVr3Ps5SIRNACqw9z2gUGhrxT7+ItSbwk0wp7PMnRkb2G/NBmGYRiGYfSBPTQZhmEYhmH0gT00GYZhGIZh9MHe+jQlHrX17rrh0Ogwb1DQa+/HnnkPldtizXp1lhPl4hn2PgKApYvneR+hpUoDYewTZyQ3HGU/pFaTfU1ai6wTata4DACDk+whVWzwcddEAt99h9i3CQDGp1jTtf/Q41Sev36ByiOj46qOpMXruUGeNUydttAwZehZXK8+Za9FTR7wPdqgKC+uX6jbmwhJRuA41pxLb1sGgDgV/kjiOHllwaTraHfEcYQdSGFA6O3aGbqokM83EFZHoUjqnDitrQlCkeBTiKtSiITGTk8VMjGwyIsNL3QBgTxZAGlPIuzbyAh2HL8UoPPb3QylJ9aG6ftLL1xV+7zkeFzMieS75Wc5pib+QmRABZA+JmJG+IXNi+Sk+R/SWqKLz/P8FH4v1/noeY6x+l+tqDo6I6yNbAtvuta48BuCTj7cWeR25IbE90tijEmPMgBJypqupXkuRy/x9vPzuj/q693r0mxkZMneRVIH1HvkMqfXuR/jr+r2DnnW+Yw9zv2ytsoxcO1VXUe6wvtUhK9Q/jnWFg1omyYMLgsN03n+PpjmOt7zvayVA4DCBI+B08JD7PQ1vk825CQJIEj5ODkRJ3GT56/CsL4/D1ZZ+7cqNJvJAtfRWtG/FwX5bjt8lsneW9vd8hvDMAzDMAzjJvbQZBiGYRiG0Qf20GQYhmEYhtEHe6xpirGx2F3jXL7C+Y/KA0NyFwwM8Vrk8uWzVK6IfSbGtbfRvn3vo/LFs1zHpcvsBTVW1d1SEr41+w+8m/cZ5fXeXIY+q7HCx8mFvJb7yLs5b5zL0FbNXeLceylYO1Uss94lbmstQm2VtVNDI7yPF+vOzYb2aapU9fr2XuEcEOR6fKIcP/vLHHCbn1IpyAuPIbl11pq20PCIwyIWeRLjrLxqCevJmsJDqdPguCnkdB0+Zo1DqtrF+4QZyfhikW8xlacr9FsIdTsCz3V44XXlQpEjyutxlVI/7504bmPN45tf7l6LXJ7NjuqBHjfwfK2uiT4KL4icjRlh6L8jtGMxx8PQu1l88uwHdC7NyyKf1+X/wPko/9fcCpUPPK49afa/n8v1UxwjqyfFmJc+ZgDSSGjlGrxNJL4vZ+SNG9rPc+C+Y9ynE+Mi1rXUDBuv9vS7ND7bZaK8x8jB7vWIjvE5N8Yz5oDTXEwvsY5reIKvb/GndB2nf5vn/dYi9+3MgNCTaYktlheEvo7lsnjXx1iT9+5ntT52tsa+S6tnWcPUyXPshSP6XuI2+N5aHOUYaF8R2sERPZ/te463KYg6F1/hclDU4zvudPvsdlFkvzQZhmEYhmH0gT00GYZhGIZh9IE9NBmGYRiGYfSBPTQZhmEYhmH0wZ4KwRGECKvDN4vFfSzavnTqdbVLJAS7k488Q+XQs8Dr3Le/qeoY3X+EyoeffILK6ytXqJyssPEbAAwefJLbMTXG7RQGkM2myKIJoJDj7k5EMlaXsHD23Gtf1e0YOEBl6eMYlVhUuJ5xLmGOxZeDIyymr9dZNTg4zMaeANCrAZbJcHcbD8D3CJlTIfL2GSaJ0jgxEQansVR1dzKEzxGLLXN5kfQ0EImD2xlGeyKew0AIshORPDrDWLTXhA0AErFPlJeJUnU7OuL80lRuw/3RaWsxcVDkdrhUJsIWYlRVAyexlgmtd5M0ilEb74pWKzUee/mMFzkGEzbQG1+doPLC6iqVWxkvckhDUOS4vH6SRa6X/kz3WvHYMJXrp1jU2hrgFz0mBjLO5RMsOC/XOB5W/pzblXxTGyy6JidBdeLFgFRe8Vi/6LN/mtuxbz8fd/VNrnP5kv47PzfcI+DNSAq9m/g20L7cjfv2Co+TmaKeR2KRLLxwnO8LB4/x9dqIdR3n61zHmnih5KW/5n3asTaWjYTh5cwY34+PDPMGwZoen6/8Iff3Yp6F4dVRvn6rV3TSX+zntsVFPk5OGA0feFzHwPCYMPcUwncvXu66WtF92rjerUO9GNOD/dJkGIZhGIbRB/bQZBiGYRiG0QdbPjQ552acc191zp1wzr3mnPu5zc9HnXNfds6d2vy/XsMxjE0sjoztYjFk7AQWR8Z26EfTFAP4Be/9t51zAwC+5Zz7MoB/DOAr3vtfc859GsCnAfzibSvqxJi7cv1meXycNQLlgTG5CxavXaPy2gKXK0Mc15Xx/aqOsMxrs8Uh1iKMH3+MyuunXlF1RCGvqzZW2aiyWOX1/aEhvX4fCd1Mrsjd31jjOrOMDSemD/MHYu3VCRPCif3Tqo5WS2ggRILeKOJzkTobAIh6dVH9aZp2LI4AwPcmkBXNS6DX770QOqXCmNBJ0VOg65B/Y6QJ6wqkH6b3ut9SofsJI9Yv5HJcp9KFbH5KdYj+98I0NUh1HCWh0NMJ3UAq9HaB139fhaJP8yWuox2L6UXppoCwR5TXRxjtWAwFww7lT3b76ak3hP5qVOs3xr7N5zPzd7lPvvZ73M++lHFCQhpWFFmOJ9ZZk/jJSa2LKq+xbuQLAZtbfrfJ7TjzbT3NT5wTRpRFvjalZe6PTkbC184G68Cc0PxVYz6XmV/UepbOS1zx6l9yu5bEMBzar6/L9318+Oa/r5/LMJPU7FgchUWHkUe659CM+HqeuK6vX7ouDE6/yif5+n/m7dt1HUfNltBG7uc5GwNCg7aaYSwqtI9Hh9jMstPha/HaCscZACws871ktS2SSYukzkPjGXqkxzgu5s9x21sl1vldOamv8YVXRPJw8HETYXicZpi1Vird2Fq9TRht+UuT937We//tzX+vAzgBYBrAJwB8fnOzzwP45FZ1GQ8vFkfGdrEYMnYCiyNjO9yRpsk5dwTAcwCeBzDpvZ8FbgQhgH073jrjbYnFkbFdLIaMncDiyLhT+n5ocs5VAfwegJ/33mdksrnlfj/jnHvROfei/MnfePjYiThaXtV2DsbDw07EUFJvbb2D8bZmJ+Kok5GX03h705dPk3MuhxvB9Zve+y9sfjznnJvy3s8656YAXM/a13v/GQCfAYBiccAPjI7e/C4Reo0k0QuJC1c5AeDE/lEqL88viu+1pikW2ot2neucv8wapkpGdsNimdf4J6dZK1Qo8rprKDUyN1pCpcSzwKEgPHymD7EnFaB9e9ZW5qlcLgnxQV57tFQq7McRBbxNq87tioo6CXKv14jr89l7p+LoqUcP+6THAyeQfZ1hjxQLHxMvJUtC05MhR0IScbwGQo/SScQxOlqLEAhjLXk9E2EQkmp7HCRKF8XDWP5xkqqTBRLPFftE+PIkHBOR0w1py+M0pfeTSNaZlfRX+mNtwU7FUHX/pN+/3p1Lxn5YXKu/ERoRAN/zDzhh6eRzk1Re+gJnYj33HGtEAGBwkPvg+Gmerz7yPVznE0cyEjZ/iX2YnhoSWqpRbvvaoL7+C+Lv1/Aab/OOj4rky4/qOr7zS7xNsyw8xoRnD/6/OvkwJln7eRXsK+fX+LpIbyEAcGd6jtPKGLgZ7FQcVUb2+ZXlbt8MixzG0/sz5t8j/MC+KvRGl1/li7NR1OdUaInr9U6+FpVI6IS+nVGHiMUV4RO4/DKP+dVBXcfiKmuaCkfFHFnndlQPaV1bfoQvavUix81jz3Gd63PaM+78RTEXjQltVV7Mq/N63okr3T7NmDJv0s/bcw7AbwA44b3/9Z6vvgjgU5v//hSA39+qLuPhxeLI2C4WQ8ZOYHFkbId+fmn6MICfAvCKc+67m5/9cwC/BuB3nXM/DeAigB/blRYabxcsjoztYjFk7AQWR8Zds+VDk/f+68jOgAAAH93Z5hhvVyyOjO1iMWTsBBZHxnbY09xz3gOtnnxc+QH28ajXm3IXIOY10JVFXkNt1nl9P27qxchiiTVMsdCAlMMB3j6v9UjTM8eoPDLOa/HtDuug0lhrQAKh6ciHrHmIRX6gLN+aKOI6hsbZc8oLfU/S0oLXuMn9nKtyO8qjfG75vPacWl3p9ZTa69xzHmmP6CgVmrUk1u2R23ipL2sLfV1GHrSww2vpTuSN846vTZJk1CFGXCLCNRZeRlmSH+kxlTRYA+BFnHXaGfo6aUslNEvesRbDR7pPndBftUXMOzm9pHp8x767jU/3LvdcWAMGX+we78w6x/jkeS2emfkk640WhthX7qVXL1DZTw+rOiZ+gPvkHzzDY+/oJ7kd51paaPwXNc5xh0XWMH3wv+Drf/26vnazJ/mzqyUOxNbfCq+cl4dVHaiKeVXE7obQ3sX1i6qKsTb385Vl1obWakIjc0afS6fRHcu1jb2LIQCIcsDYVPeY09/DY3PqJX2LjQ9zP139DzxHJ4e57/et6TpGPsT9dnRG3MNCHr8xtE63NsdzYE3cW2aFturCVb73AkA74pdyBkRTB0rcjlJZa/TSF8TcEwufwBzH0WqodWLtlMdEUwyRRMignDRMA1Bs9zxrSNO9HiyNimEYhmEYRh/YQ5NhGIZhGEYf2EOTYRiGYRhGH9hDk2EYhmEYRh/ssRDcI+lRZK0ssMixUNCGchCi1tYqi+byjsXkq0sZyWXHWVwok/rWl9nDbHB0RtVRHmShXeC4HQWRqLGZ4Y4ok6K2W8JEUgjUs1TAXrhuSYPFfIHPteO18C7ucB1Sf9tusODv4pkTqo7ZK93P6vVV9f3u4uB7EsjKPLA+I2FvIHR90pu+1RZ9kmbUIcTQ0hAyFOpq77UDvjR0deI4jZbYJ0OQmIrYCiORjLjJZRfodsi4idtC+O14H5dh1ImCMDMUx0lFf8RZiYN7RLx7KQRvtBO8dq4rjq2c5usw+bR++eHyl1h8e/FNPp/oUZ7PnpjnuQkADv0ZJxg/+A95Dqie53km9yXd79feZJPNR3+aBfbhpBDOvqLnIv8tfnmg+iRv05ng8vVvc6J0AGhDvOwS8nHbIinqbEe/lLI+x/MVRvlc8lPc59GsHpeF9e585TKSi+8mLnYozHfPYXyBX1xqDesXgk4+z9f8Skckx27w2PQr2hBybE68VDQkxu9B/r4wo2/1tatCCF7g8bda4xhpxjphL8TLLp0rfD3jKXHc83ouivaxefJzHxXzyHU+lzf/TL8c4Qvcz2Eo5yIeR/mS7o/RyW4/L8+aENwwDMMwDGNb2EOTYRiGYRhGH9hDk2EYhmEYRh/sqabJBYAr9TyniTXvVkaSvLjJ6+DFkHVPwg8S7bZeQ17duMIfXGSNTmmE14M7y5zAFwBcyCaaz77/B6mcq7IWwbX1yazPcTv27WfDzEadjcJ8hi4qFmv2pSLrJtZWWZ9VzA+qOpwwYVxbXaHy4iInzVy4yqZ9ALB4dbbbpow+302892j3JOwNnUgummbogIRGxwsDTKULyjglqSVyQjvlckKLEOvr12kLrZAYgiJ/L+KW/rsmDXlM9Oq7AJ1sOB9lOWSK48RtUeaGhDndp8VQGA/mWXsh92i3tGYp7jFj3UtbQu89JRyuPsFamkcP6Gs38d3nuY4ZbnH9MGsBy21twrfwPMfMV39XaBJXzlB55YJIegvgB/6fbKpZLLLGaeUsX8uRNa1Fmc2zMWXjEp/v6AHWpqQZWlEvzBCdNFEVupKVdoau5jj32dMha5iOvIu3v/odoYECMFrr1huFe2y02wbaF7vX9LLj6zt3TZsoXsrzZ+0mTzaVC3yOpUO6jnCI5/0TUivEeezR2qdjcUMkjG+fZq1QaZLbVVzTMZAe4GteEtrHVsR1bNQ5dgGg1GLjzdwp1v1dXecYSUu6HSHLlNFZErpOoUcdH9dz4jv2d+ev2dytf0+yX5oMwzAMwzD6wB6aDMMwDMMw+sAemgzDMAzDMPpgb32aUo9ko8eXpcNrk7miTpKZExqmdofXNwtyn0SvaYcpr/fGMeuT0lVe2x07/pSqY2j/YSovLF6l8mSBv09rOjlpIvRInbbMIig0AhnL8zIJbH2jIb7nOtZrOsliKHQDLuKkocUB4T8zpMOk3OruE5x7UTd0F0m9R73V7cui8AeKXMaat7A6cQWZOZeLMqHvjQ95fT4IuNJUHNdn/Enihe+SFz5NOenVleX1lPKY8EKbIP3A5DgDACeMqwJhoRQKzySXlZRZ+IgFIlm0TGCcK2qhmOvRbLmsgN8lgsCjVOn2fWmKr+XrE1oDsvI6a4PcGzzGLwh/rPMrGZrEgHWLhZdZCzk0wtf22CHtj/Q9Td7m5Tf5OH/zr1gjMj+pfW3WRRLfkQ9w29dnRNLnRa0lip303RJ9JsV1Oa1a82e5jjPCs2hVDAeRWx0AUB7qxr8/sbcJe0OXYjDf7d9oUPRjXWtbm2eEL9Maj6Pqce636YxYHBO37lLIx50TY77a0GNrQ8xxy1d4fK6JY7Sb+j6Qv8b1RgPcjqK4d+QjfT8qlrmO1PEYCUSi9Me1jSIWH+XjXPoT1n12SuIYGffns/Pd+2IrvnUc2S9NhmEYhmEYfWAPTYZhGIZhGH1gD02GYRiGYRh9sKeapsCFqOS7WpikxM9sxaJuTnOdfUqKZdYe1FusTypGOn9d3GBPkorwuDh45AkqH3r2vaqO+tIslRt1Xg++dvEildcX31B1HHuWvZ0g88gJjUijyWu7AJAr8qJ+GPJ6dyTqXF/Va8gvf/M/UHlonPVYzSav/xYnJlUdS8vnb/67N5/gnuA9gh5foTjg9fs01HEUxhwX0mMpjYV/UsaSdgpZh/B+Ujn9dCWp0AqFIgec/DPGZQijAmmyJOpI2iK/XVHrGWStYShy0Qm/FSfzjAFob3A7YtHvYYXPNcr4Gy3q8U/ZQ0kThkcC/IO/350H3vEca2tO/nu9zx8/JXK6fZXnnlYitSc619p+MbY+8vf4+/ErrD/6o9Pap+nK/8QaxLU66zOaFS77lh4PXnR250U+/zrbRaHp+VwBQNqhSc+xUCSF9NDzRJyItuf53BZf5z4ce78eU4uT3ePG+b3VNLXiFGevd9tYfj/HQHhCx8A+oZcZeT+Pi6ExqQXTuefWqjwXrSc8Pg/kRC66IT32Ls+zmdNqzG1NxCSYH9UDtFDltoXCi6sIzitXlro3AEuXObZOrfP5R3JuGtLXuBXKiVN41wlN02pd98facvde2W5pPeJb2C9NhmEYhmEYfWAPTYZhGIZhGH1gD02GYRiGYRh9YA9NhmEYhmEYfbC3QvAAKJS6h2w02CyutaHFpq3OHJXHhjkz38R+TgBYXxTJeQEceOrdVC4UWMA7PDxE5WJBi8DmG2wyd+QxrnP58nkq56rTqg44Fs0lCQvvGg0Wfq+uzasqpkcmqLw2xyL3c69+k8rV6XeqOpoiaezKiVepXCmweK++saLqGBvvOoyFZxfU97uJ9w5x0n3ejxMhQM1IdJwTCXudEA42asKELtSmdEHK+6Q5KZYW4sOOrsMLgWIqzCvbUuOd00O0IEwC45ZMTsnHjXLShBCAMNWUSZwRcGymyKhDCoFFYmAv4ht5/ZJGkOEhuhekEbA22u23+RU+P7+gBbxDq3zCc2K6akU8n0WOXzgBgPV38HFebbEQ2p3hPlr8QS2+ba1xUu7813mbWMRho677PZpks0onTDQ3XuO5KJHurwCGD3LcTfwif+//jI978Y/1uTjxMkH5CAdEaUGMlyf1uSQ9Lwf5jMTSu4nPAZ2e5M4bf8znEw7rcdMZYUH80hviHIdYDF/6iBZPH5ji6zEgTCaffVTMEfv19bvK0z5Oihdb0ktcx6GY2wUAT/89vh6JePllnzBKHhzX5/KdNzkWz58XsbfBbY/b+hqvnuLjNEUCdsyLOfKA7o/SaPc6BEtmbmkYhmEYhrEt7KHJMAzDMAyjD+yhyTAMwzAMow+czzDg27WDOTcP4AKAcQB7K4S5O6yd/XHYez+x9WY7g8XRrnGv27lncWQxtKvcy7baXHR7rJ39ccs42tOHppsHde5F77223b7PsHbe3zwo523tvH95UM75QWkn8GC1dad4UM7Z2rl9bHnOMAzDMAyjD+yhyTAMwzAMow/u1UPTZ+7Rce8Ua+f9zYNy3tbO+5cH5ZwflHYCD1Zbd4oH5ZytndvknmiaDMMwDMMwHjRsec4wDMMwDKMP9vShyTn3cefcSefcaefcp/fy2FvhnPusc+66c+7Vns9GnXNfds6d2vz/yL1s42abZpxzX3XOnXDOveac+7n7ta27hcXRttv40McQcP/G0YMQQ5tteujj6H6NIcDiaLfYs4cmdyO51b8G8MMAngLwE865p/bq+H3wOQAfF599GsBXvPePAvjKZvleEwP4Be/9kwA+AOCfbvbj/djWHcfiaEd4qGMIuO/j6HO4/2MIeMjj6D6PIcDiaHfw3u/JfwA+COBPe8q/BOCX9ur4fbbxCIBXe8onAUxt/nsKwMk+6vgagCaAjc3/ttxnm23+fQAfu5u2Poj/PURxNArgPwKo4YZ53n9lMfTwxNGDFkMPYxzd7zG0g3Fk97Se//ZyeW4awKWe8uXNz+5nJr33swCw+f99fe73s9776uZ/j+9W45xzRwA8B+B53H1bHzQeljj61wDaACYB/CSAf+Oce3qnG/aQxhDw4MXRfRtDwEMbRw9aDAF2T9s2e/nQ5DI+s1f37hLnXBXA7wH4ee/92r1uzx7yto8j51wFwD8A8Mve+w3v/dcBfBHAT+3wcR7WGALe5nG0VzG0eayHNY7e1jG01zwocbSXD02XAcz0lA8CuLqHx78b5pxzUwCw+f/rfe73L5xzC865bzjnfmCnG+Wcy+FGcP2m9/4L22zrg8bDEEePAUi892/2fPYSgB37leAhjyHgwYuj+y6GNtvyMMfRgxZDgN3Tts1ePjS9AOBR59xR51wewI/jxl8+9zNfBPCpzX9/CjfWWrfiFwEcw42faT8D4A+cc8d3qkHOOQfgNwCc8N7/+jbb+iDyMMRRFcCq+GwVwMBONMZiCMCDF0f3VQwBFkd48GIIsHva9tlLARWAHwHwJoAzAP77ey3oEm37LQCzADq48RfETwMYww3V/qnN/4/eRb1/AuCf7WA7vxc3fgJ+GcB3N//7kZ1o64Py39s9jnBjTb8uPvsFAH9gMfT2j6MHIYYsju7vGNqpOLpFvQ/1Pc0cwXcZ59yXAHzJe/8/3+u2GA8Gm3qUZQBPe+9PbX72bwFc9d7fH6/dGvc1FkPGbvGw39PMEXwHcc4NO+d+yDlXdM5FzrmfBPD9AP70XrfNeHDw3tcAfAHA/8M5V3HOfRjAJwD8u3vbMuNBwWLI2AnsnqaJ7nUD3mbkAPwqgCcAJADeAPBJ7/3Je9oq40Hk/wTgs7ghflwE8H/03r92b5tkPGBYDBnbxe5pAlueMwzDMAzD6ANbnjMMwzAMw+gDe2gyDMMwDMPoA3toMgzDMAzD6INtPTQ55z7unDvpnDvtnLPXWI27wuLI2C4WQ8ZOYHFkbMVdC8GdcyFumHp9DDeMs14A8BPe+9d3rnnG2x2LI2O7WAwZO4HFkdEP27EceB+A0977swDgnPtt3PABuWWAlSsDfmh07GbZhfzAFgQZP3wl4qEuEGXPORN9rKsI82IbcdxGM+EdWhl1hNy2OOV9nGh6PheqOgLR24H4oS+N5bnqfJDidJG0eZ98gb+PcrqOVBwmbqe3/R6xriMsdNu+PD+PjfX1rOSV/XDHcTQ6OuZnDvakfBJHdk7/IeBlx4lN5PXL/FMiFWV13K3rkE1zYicnrrn8/u3MhQsXsLCwcDcnfMcxlC+WfKnSzShSQJ6+Hx0rqn2iHA9gL6YN+Qeoy5hd2w0u53IceLmiOEbGH7XNBn/W3OByKvYpZswBxQE+rpyb1ESTgRcRfleReofxnbl1z4eXLl3B0tLSns1FYVT0uVw3jgIx7aepnDSAVE6wjrcJ+7gW8l4h65T3vKyOi1u3/8HEiUkx6/YsJ84g4gMFMvY6uoow5TqKlVCUeftWovt0dYlv/OpeKsZEkHGPCHqmgHajjrjdyoyj7Tw0TQO41FO+DOD9t9thaHQM//uf/+VuI4e4ByvlktrHb3AHRQXeJ034vNoL+rjDMzkqt4a4w06cWOE6z+u+GhzkSXVpo8btqvIMemhqWNVRHOXjVhxHQ2uxzTtUuN0A0BAPjeuXuT9mjnHbxybFUxSAphhg8xeaVK63RFAu6QfA0WPda/Uv/2//d/X9HXDHcTRzcAZf+qMv3ywH8uE7rwdEEvPAdGJQhaKb0ozJPOFuQhjI4/I+aapnGSceQHNF3iZf5Gsehrrv3R3enu7n567euexDH/rQ3VZzxzFUqgzggx//hzfLj4SH6Pt/9JNPqH3G949TuSMeVuKYx2J+TF//89/lfQ7MVKk89fgYlVsdfZd58xWeJ974Bt8wmk0uPzGjY+iRj/DcUx4RQZJufdNVD4nqLxG5h65E/dHguK2B+iNCj+3e+/YP//AndEP7547jKJcbwOEj/9ub5eIQz52tdl3ts17jaxoEXK5ymCH0Oo42FjgGmjW+/wwd4nnER7qOpbN83Nhz20s5/sOhUM2YzyK+Z1fH+ZGiMMUTa3hNx0C1zts89b5BKj/ybj7u+fqGquNL/26ZyvVlnqxjMd+XA/3LyODR7jZvfP1r6vu32I6mKWsqVhHtnPsZ59yLzrkX67X1bRzOeJtyx3G0uLS4B80yHiDuOIbazUbGLsZDzh3HURI3M3Yx3s5s55emywB61khwEMBVuZH3/jO4kRkZ00eP+PJYNwbThA/fWcr4KbPGz3WdIj+VevATd7Gi414+Qc+9wYHur/IxDj+jf+EZGOC2Rlf5l6fFKzy2koyfVAer/OTeXOV9Fq/yXwvFQ/ovxLTO9Q6NcbnZ4n1mT+o61pt8/ksb/BdHQ+RGjzLWPEfyPf3h9HW7A+44jt75znf53l+T0o7oa/GDHQCE4tcn+UtSIv6gD3UIAOLXqKR9+5+e5TGzjhuLtoah+Kk+6zfxPv6C7yVzmfC2e2TU0Zf2Uf4qcIcHuXvuOIaGJ/b5YrnbwHyFfzlea+g/8KodHkstEWhn/5T76Nj/hucIAECB6zj9BR5bY/+XASpn/aq4bx+Xh/4hB2tOzKsDo3oOyAm5AZKtflnSY1xf37u4/nLZJMfHcUrCkLFU1SNR8Nuaiu48jqqVCT9W6R7/8NMcEyst/Uvh5dfFr0SD4lfwa9wnhR8R68AA/Fm+xkHM17ie4zrq39Z1dITEJJRSF7EiMVDWc9G+aY69uoi91TPil/VhHYuVCd7n6lW+iPNyZaSm70derPzEHT63dpuvg5eyHwBrr3Xb0bnNs/B2fml6AcCjzrmjzrk8gB8H8MVt1Gc8nFgcGdvFYsjYCSyOjC2561+avPexc+5ncSNxXwjgs5bXyLhTLI6M7WIxZOwEFkdGP2wrYa/3/o8B/PEOtcV4SLE4MraLxZCxE1gcGVuxrYemOz5Y6DA23F0DXZrndcdGTa//Doi3OgZHeQ11vca6gfoVvXa7JN402Cjymun4IV6lHBrWgpbY82cDAR+n/DSXm1f0muliRazfg/cJxFvOB6t6/XfinbzR6izXcWWZz3Wtpd8SmD/H27gy1zH4KPfP+rzWEVw43d2nnWHRsNv0vkQTFYWeTGqcACSijaFY80/Fq7JxRh1SXiQ1S0mHN/AZb6yGQubixQiMlbZKx1EUbl8spGoV2hKpYUoyNABS5hKK1+elqOV+eokvTYFajxZ8KWadxOvXliH51rc5iM6/zG9GbVzjcfSJQ0J8BODA8VEqn8mxIL02z2KKEfF2HQDsP8DiukT0rHyV3EPPI1u9HSffhPMZSg4ZI1IDI9+My35lXWgL27fXRWVJ6+g19z0OskIROPJ4t1G5cW7AxlWtvykEQtMktK1t8Yag+xvWuQFAvS3eCK/zcSIv3tCDfovPCTuEYpHvLcUpeb/SjAttXJTnCe4VcQGLq9rKo/LEMJWHp4W2qsMi2+JShmi1wmMiXmZNYpoK3a7XzxoFsk+4tTjO0qgYhmEYhmH0gT00GYZhGIZh9IE9NBmGYRiGYfSBPTQZhmEYhmH0wZ4KweO2x/zFrsBqRaRISZpaNBcVWDhWFgLG4rTYYVQ/B85/h8WWiUxNdJBFdasLWgTWEtqz2AlF73UuJimbbQFAY4H3KUyKFBoVFqfVr2QYU1a4jo05FuvtO87lWqqF8YUhrnd1nc8/vsLtGFjRYXL4Q90+LGR4+O02SY8ZX6AEyXr7VMRNKq6nTIGCjHOSxnpOiMVlziifoUqVQleZG1AKw6XpJqAFtRkpCmVDtkTmapLmcFlC8EAKvYVAPZQq3ox23qsUL2nisLHW7ewLngOifWZe7ZM0uOOXWmJsBRw0L7yoRa+fOMopIibezXPetUsrVB48UFZ15ESneRFTUrSdJeIORKAFYsykQhivEu0BkBdU5qLTLxdk1SBTsfDcJMeUzO0m693reAojh7HJbiqRP/sii5aX4ox+a4nODsULQWJeSTmzDgBg6jBPDGvCgLgp7mHtc3oOz4tmOPGiEhoce81xHUenLovcp2N8gaohj4GnnhGJ5AC864P82fUmt/3Nr7Gou3lRC8EH8vySxrows2yK+SuX1ynbJsa77Vi7nhFom9gvTYZhGIZhGH1gD02GYRiGYRh9YA9NhmEYhmEYfbCnmqY09mjOd9caR4/zM1uhVZC7IJ7ghdc1kbC2JLQX5bxei3RCr9Ep8D6dnDDMXNSappExXkcdnGT9QvOsSH54RJ9LlX3t0BHrpjXRjlmZARbAa1/eoPLwMe7D6utcpyvr/giEedpQletYFyKhYEhrzcpR9/y21NTsNI5NH1NpKpkhI1Bmliphr9DjZOiiAmGAqRIFi24KpU4KgBMGkE5orfKBNIvLqEM37fYb9KFpknqUpCO0Jhn94cSfXD7huPEiMKTZ4T3Fe6DTM74G2VSy2dYxPyiSjZZH+Hwfe5qNKIfyPFYBIF5hfeXkAWHOe4H1G52GbkeuzHOLE/3cafK0ngv0NF8dEfOCSLpdF3rTOMky+xPzhPwTXCUt14GodH9O6qC4Umn+CnCS3r7ySu8gvgh0Huleo6U1MUcEGQ0WAyeS8hpxzj5LXpMIHWqdr3G7yfcraYAKALEwtwxbHIthgWM1XtYavYU1LleEUefxfdzO449pjd7RcTGuILLlvp/bsfgtPcHPCj1WR4jhZOLrMCNOwkJ3m9vNVfZLk2EYhmEYRh/YQ5NhGIZhGEYf2EOTYRiGYRhGH+yppinMAdWZnnVUkb20UNHriOM50cRRXv9cWGQNwJuv6QXgjTo/G04eZU1AILREYVmvQxfHxBppysfJHREJAee00U9zjetIRBLB+obw8DmsF14PFtmP4vCjvEbcEck6T76iz6WzwTqJ6lE+bnVQ+FZd1WFy8s3uPs2m+npXcR5wPXoJYQWS6W3khcdOICRngfBLkp5MwA1Pll6igtgmEd8n+m+SXFlqp7bS/fSjA5L+OHe+j/RYkjKYVEtrANGHSk8im5VRxb1SOYWRw/BI9yS9iPm4o1vbbPKY9yJh87L4vqwlIAgi7siD+4ao3Cjx961l1nMAQL7MFycf8hxQneK5x6UZPk1CK9dp8XFlMuq0laFHUkl/txIUZejztkgUnAqfuUAK6cAeU3stm2ttAKe/3r0eSUnovJIMQZJoYxjz9YyExrSgc+2iHgntV1NUui40mzk9gEfEIB95huOmI+6b9Zru3LZI5n5YaOXe93dYsBXJ+zmAy+e5z6SO8/xl3v50MyPZ7gGOk3iZt4lafIzxvNYcP/Vs93wvvam+von90mQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qd7qmkCHNCzfhvWhE/EoF7/zReFp1JD+oeInFFOC2yGhnmNdHiS1zOF1RNaq7odfoXXe1t53mlxTvhkZIhAJod4m8EZPpfmMJfnT2o/ikFhmDMnNDKLp3gtd8Pr9d/hEd6n0BJr6kV+li4O6jraGz2fball2Fk8gKRHLxTIFGAZnkJemMh44bEk93FF/feEE5qlnNAORWWhmwqzNBxbiC6UtU0/JktbaUu2FnrIdoWROP+sa5xupccS3EeipkIuwLED3VxT13IsHGnUtJZoRYyTuMgmNRdned5ondPH/Z538ryQChOe+nUea1fr2uvpmTGhExkUOSzzXE6y0p8JXWNHzKNpR/gy+QyfJhl28voH4oJLDRSgYiIVH6hRmGGwk95Dn6a4lWLpQjd2CkWZT1XnScsLuWtuna/FsQ/zBsWCvk3Pv8FxUhnh79eFt150Tk+KR6c49iKRt/SNbwvvo3V9X4xE/sX9Rd7n6CGhBZ7U59ISGqUrl7nOay9w26UeFQCS6xwpMuVqQYyzffu15jg40hUhuvytf0+yX5oMwzAMwzD6wB6aDMMwDMMw+sAemgzDMAzDMPrAHpoMwzAMwzD6YE+F4D4AfLUryFpbEYKvV7WKr3qAm9hYZnPH5XXeJyxrwVtumJ8N23U+bqHAIrHCgQzBYoMFfYEw/jp4lI9bGteiuXhJmEZe43MLAz7G2AEtvoyEuVtTCDaDUZFYeECrQEs5ITQUSWSXV4XgOdTKu8lHu+eXzxBN7ybOcTJcaUTpMowYI2EiicJWiXN1DEiBvBZ633mCWi+Uq6qcZpkKiqMKwa0Tfwu5PoT6sqVBtHUdMlHsVv2RSV9GnDtPVHCYeKQ7HufOcdA013W7Wo1VKrfXxIssK2y0Wzisj3v59UUqzzzCWbyLA7z93O/OqToOvYsNMfNlHvMdMX6TDHV03OJ51Iug8pBBlhFDWyTk9fL7jHYoP1Rx2ERuEes5MeiJs70WgqceqPUkd66O8py+dlHfYtMhcb1Em8/8rRA1Z7xBkZNJ1UXC3gaHIlxG8vfLkXi56S+5jqYQqOdi3Y58ka9xU8xFlxdFcniZnBjAuWt8nGvfrPFxp7i/Bura7XNZCNBdnfunDL73Fp7V7Zhd6N4rOxnn+hb2S5NhGIZhGEYf2EOTYRiGYRhGH9hDk2EYhmEYRh/sqabJOYcw7B4yjVlvMzKt9Td5xyZzdc9r8fkqr4cOj+pTylWFAaRYQxXNQC7SopjmOV4TLohkhxPv5OfPeEBrqzpzYh06ZCPOoXFeR129qHVRSYnPJQY3fpmXg9Hm7gIAzM7zuUw9w+1yIrHwweOcEBQARse7Oqe8NELcdRwlIRVL8/Cxbk8okufmRT+qxLkZmqa70SxJpOYiFRKNuC3MW9t6TIQitCKhSVNt76udQp8k65BGhRn7bOltmSWL6aNlu0GrneDs+a5x5KrwkGxc0PtEwnw3bMqxyNdu9bo2Njy7sEDlZ99/gMpDB4apXHxCX//582yqOVploYgXvRpL914AiRcmm6LtbaEdchnas1wUbrHNXWj6xD4yZoIMbVVvgte9Ttgb+BSFdvceNfiUSHKbYZTcmuMBXJ4ShpjgSbs1l5H4e0wk9R3nOhrLwjg5IwF15xSXnXAJrgr97Oig1pO1EqGFE8nu59t8/85taFPJijCCjmb4/BfOs0BrdklVoXR7QvKFFngsrr45qOrwYfdaJfVbB5L90mQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qd7q2lKgHC1u246KRLnTuzT+0hbjnbAa6Z5oSsYy/BHgkhyuyjWWVdmec00v193S7PN+qPyGOt8whZ/3/iObkdhjNddW3NiLXeYjys9qAAgWOLPqoO8T1noDALptwIAR7mO+gpvUxVJGAen9fpu0rp33ijwDq4nAaNKnFvR7Q1D6TskdT+yuEfiCNF5cYP7Ps3QEoXCD0kmp5S+TVnCoTvWY2Vtr0x2br/PXutNbkeaOtR7vNbCkDuxOJXx92Qk4kx8HU7y2KuUdMfPx7zXxTdZTPXO/cNUPvhubWxz8Y9WqHzk6DiVCyNCs9nO8Og5w+d76nneZ77O5Sce11qUR97PfVQS/eNkQPQRAHeT9Dnu3Lu5yIUepZFu/04/wve0jcs6ji4uct8HJY6JVNzTkJH8PUr5esSrfI+r5Pl+FJQyNLYiKfVgkdsxXqlQuXBY64DiRb53LIi5uCw0tsVZra+LL7HeaGNJeDGe54vaTnU8O3HPSjvcZwUhfC1n6KdX1rrH9VIU1YP90mQYhmEYhtEH9tBkGIZhGIbRB1s+NDnnPuucu+6ce7Xns1Hn3Jedc6c2/z+yu800HnQsjoztYjFk7AQWR8Z26EfT9DkA/wrAv+357NMAvuK9/zXn3Kc3y7+4VUU+AHxPbqXSgPC0WNQ6oI0VXu+sCf1Nc12sq5f1KY1Ocnl/SegXHuH13lbGcmaryseJcryuOrnCa6b7PqwX1xs1Pu7Li7ym3Pk6t33kqD6XIZYvIJ/y2nVOeMmsOV3HwhVe723MSm0Vr0u/+YrukOZaV4tRr916/beHz2GH4igIgUrPeUpfokw9ktTX9NPi3WALCyVpj5Rm/FmjMn4J75pU5qvL8NiRXk9b9kemLmqrlu04n8MOxZBzHi7XnVvywpMmKGdoyaSXV4XHfCj62WkZCa5f4fF65qVlKj/6XhZ2Dk7o8dtxrINaFDnvDgxzbrrGmj6XS3/Bc8/EUT7/p9/J88hIQc/NuSKXvfAYQyD2yYhDqXuSuTUDkdssyfAtS5K+5p9ePocdiqM0dVirdy/0hQt8zksL+pyDkLdpz3F5cILPJ3dM1zEidIvNitD0VISnWFtfv5Ua15EbZj3W1GN8Xxic0tqqek3osc6KczvK+xz+fp03rjnDbT/zO1xurbO3mW9q/7MwJzRMYvAVjnBcLb2pY2ZlrVtv0txG7jnv/V8CkHZSnwDw+c1/fx7AJ7eqx3i4sTgytovFkLETWBwZ2+FuNU2T3vtZANj8f8Z7b4axJRZHxnaxGDJ2Aosjoy92XQjunPsZ59yLzrkXa+vrW+9gGBn0xtGCSEVhGP3QG0OtemPrHQwjg944iuOMPFXG25q7fWiac85NAcDm/6/fakPv/We89+/13r+3MjBwq82Mh5O7iqPx8fFbbWY8fNxVDBXK2v/IeKi5qziKosKtNjPeptytueUXAXwKwK9t/v/3+9nJBUCuJ8YajgVfzdUmJB0hePNFfs7LiQSBSVEbX537DovCck4I3p4VRmEdLTQbED1VLvE+g8I8MY31YFqb5bZ5kYjxiSdYnDY5LZSWAFbWeB8p6o5F4tE4I/lwZ5HbEYZ83HKRxXxpQV+XJO3tIy3O7JO7iyPnEAS9/bBXJopbVby1s57WTovEwSXue9/SfesTkVxXitzFn0Iu7CNT7hadlv31feFWeVcxlMKj02NoGQiRcn4wI0Gt0NLWV/nXqkaT54RmW/9NWhWJcq+IOW99ZZXK41Ojqo7ylJwDFqk8eZD/OB1gXTgA4Ht+guenUIz5KC/iMNHnkooksOqlBvFWQ5TTfZqI5NrS3DISAvQ0Q/Qd9ATzNiLyruIojlMszXXjYOnPRYLa/RkGxQ0+p0TcslYX+SwKTou4ZxNhiite/khDvmEFXvdbRVyP0VG+T+arXF5Y1fejtUW+V77zh8T9OMd/nKwsaZPUVMReg9+NQGdM/NiyIjaANvhNRfzWlznOOhkJjNOe8Xo7k9R+LAd+C8A3ATzunLvsnPtp3AisjznnTgH42GbZMG6JxZGxXSyGjJ3A4sjYDlv+0uS9/4lbfPXRHW6L8TbG4sjYLhZDxk5gcWRsB3MENwzDMAzD6IM9Tdjbaae4eqW7Blpf4jXVjYw3WirCVLI0zN8XIl53TWK9qh2Ncr0jx7nOhjDMvPKmqgJhSyREFGZZ6Qivoa429RryfJP1CwMVXjit7Oe12ySvdVHVIV68rYzz+a5e5eOub+jF2bpI4lsSBnr5Ap+ryzCUK/Q07V4kYr3jhLN3foQ+ttmB7KDiMFL34TL+rpESB6kdUbvsdULlBwAHIOrpmDTHMd6RmcIB1Jd5XCyfEcaLLZ5nkpSTegMASmzuVzs4TOXLs2tUHpnk7wFg6t0cAK/+Je9z6Al+o2t0RGtRnHA37XT4XORLYS5Lt7hFnAVezCslHcvtJmu8OjJhtUj4mmVk6Xs+83se7B5AV8fjhJaouKH1SEEgzISdMBsW/o9BltZc9GV+jMtCKobGGa31RZnjUyp554UOqFrQdRQKHCgLL/H3uSp//1KiHV9rotoLa3yf9DFf0zDQjy2BCMbCFB83WeLrUC7qOInHutchuL4Nc0vDMAzDMAzDHpoMwzAMwzD6wh6aDMMwDMMw+mBPNU0BgEqPniY/zWu5bjXD00KsYYd5fs7zwlChtqG1KBsLvE19jtf4C6NCN5XopILjT4gEgGJd9ewZbmdLGiYBcGLxdnI/e1aU1Fqt1hHERT5O+7rQH4UsAph8PCPh5wXhW+W5PPwoH6NxXj9bb/Quh993j95ZeqSttA4qDe4OteXODiuTD0d53bkyQa/0FEmkZ0mGJ0lO2KU4UacUqmX5ltwLLdtOkaYe9fVunJdGeZzkQq3faDY5o0GxIq7NqPDKyUgsmovEXDPFF2t2nfUch1cyPOMG+eLl13i+mr3E5aHxDE2T9JASPj6p0D3WZDJeAKtsD4WK6I+BquiPug4iYVsFL44bd7jsZTJq4J4Govce7bTbRiEHRfkx3d6BZTF+xX2vIZL8JsWMzM8dcf1WOY7CPNcxMq6v3/g4a/BG93GcFAM+xsaCHhNrc/zZWonbelwk+Z3Ypz3/gtO8zaHHeZyNxtyuN7+l74upmDfb14XvWMDj6MCRDG3VUncOmL1NTN13tzvDMAzDMIz7EXtoMgzDMAzD6AN7aDIMwzAMw+iDPdU0pd6j1uv5I8wkymPa06IT8tpi5zyvzRaO8imMlPVz4GBBrIvneV01V+B95tsZOZJkLqYOH9fneX047/S6azgs2iY0TQtiuXfjJa1n6AzKc+F2rIhcdDirzyUVep19k/z98iUuN5b0unyh3LMm7O+FpuB2x8zSI22lWdp5DVNmjUIctNVRk4wtEqFRipuizpRjJMjI+RWmHM9CvtBnDi+VwK6vve4HOnWP2Ze7A27sSe6AoUNa81CaYm1FkOexloTST0bXUSzwmPcl1j6uXOTtV0e1vnL4HZyPbur7eA5YfJM1IfGTg6oO2bbaBsfMqRf43K6vZ/gjDfH1PizyaBcf5TkwaGVoVmVONBFCapRmyhV7ttpjmybnHIq5buwUhBbOrenE0CvzQmMW8sQvrag6QYZH1ggfJxX57DpXxfguZHgbDbEB1OolPnDzOt/TsvKpdoTudmgf15FbrVB5IENfuSruxxt1bmtb6NzCCX0uzatC09Rgn6bSIPfHQKpzsq4Nd7fx+lHkJvZLk2EYhmEYRh/YQ5NhGIZhGEYf2EOTYRiGYRhGH9hDk2EYhmEYRh/sqRAcoYMb7D6nFYWhXqWal3ugtcYisPmQy6sXuTxyQJ9S2GbRo0wLHK2L46YiWyWAuRf4OMOHWQA3OsbHiDOUZF4IqnN1YVQpBH+1ljbILIrEwUHEArjKAB+jndNmYp15Fpg3hJC4JA0VKxlh0ptIOXwQBMB3qBDtR0sud8lygBSkYhtZ7ggzPynyvtEO8TJAIIwJxS5hK+PFBmHeFoby7yeRODjj3OXpqk3u57DwQNLzIkroWeRaGtfjxrd5m0bC84S8Vp2Ml0GCPG9z5RwLUs+f4zqnBxZUHTOPD1F59CAnXr32LZ43Vme1KeHADM9P8yf5Yg0e5XlmqKnPZVAIcodGuI5AzgtZyXbvMEZc1p/5vV26xzEXBkCl3O3L6gj3ictnvMiR8GeRSGIbiWS8Q2FGHSK2ag0Re57jyDd0xyxcqFI5Jx4HysO8z8QhVQVmr7DQPZ0ViXHfy7H32nd1HJ2e57GWChPN4e/hcxvIaRF3TSSqD8WzRSTMXF86pQOplnTrbWfNu5vYL02GYRiGYRh9YA9NhmEYhmEYfWAPTYZhGIZhGH2wp5qm0DlUit1Drp7iddeNWb3P8DFe762KhJd+ktc/V+f1emfqeR21EPG6a3VAHPMR3S2tQ1xHssHtyIukt0le66IaQyK54QJri+INPkYrzDDILPA687DQMI2OcLtaTp/LyTe5bcsrfJwDj/D2ZZlVE0BuqGta5u5JwszddbHzWfX72xaVpilJtYajIwz+kqbYJif0SUFGklPheSqT7QY5oZtK9d9GHbFmH4p9oujOjStln7n7WNQU5BwG93X7pSm0ZPUlra8MhLYkrQrj3Uus7wgjPQfEi7xPqcTl0Xfx3FS/sqbqWLnO5pXDB4e5TqHHunp1VdXx1BTPC498gHVRubIwC1zVuqg0kpolLqdCXJc1plSMyKI0u9RD6p7iQ0dxIId8fE2PgfEJnm87oh/DRTEWJ/RJt6/x9egIQ+Y44TEfJLrvozxPJCMjHPPjkxyLzVjfj/JtvjccfVIkHN/H+1x+VcdRI8fbTD8h5iuhBd44o01jfcTjxAu33o54bghK2ji60O4ex7lbB5r90mQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qd7qmnyqUe81l3THH6c1w2jjl4zHR4W66rCpyjN8ferI9pfZfEar7vmO+y3Ej3Oa7npnG5HZZg/88LLyIk15HoskjICaIim+ZLw2xEeVH5Rr0MHIZ+vE0YnrQafSzvUa7cDh7htowdF4lGhLYsGtefUSI+XyINo05SpWer9PsNzSX4WC51AW3ilpHHGurjULAntkG/eXp8EAE7kzUyFniEQlzwoZJyLiLVEtDVUF/VuLvL9m9A3KgUYeUdXl9eY5cS4+bpu6/CzXC4t8vS5PM5zRHxBj5tihcdaaZiT6YZzPEksh2OqjpUFdpobO8i+Tfue5OPO/sGiqiN5kpP+Fkf5fBPhIZdm/H0tpY4uEHoWMUcmcdaYUh/d0fc3ttnjLL29x46B1lLPB2I8D4/pe0mhxNcnzIvkycKaK16UzoJAscJC3CQQvkwB7+ObOhYHKtzWd39UaKkG+fq9/jUdA08f5LYfe4fY5w2Oo854RhydXaJy6xnus7UFnvDaujsQCe1uQcieikI3hVg/+sStHr3VbWLKfmkyDMMwDMPoA3toMgzDMAzD6AN7aDIMwzAMw+iDPdU0ddoes1e7a4X5RfYG2T+s112bA/yZzLGDotBzQPurHDnAa6IjB/lZMRZaquvreh06avNnUZPrmDnM7TzwuH4eLS+wXmF1kbdZFzqT9Qzfqkj4vJSFR09tUeSVCzLOJcd15Ff5OnSEjsa3M/L59Rio3BObph708vPWGgepg1A54Nq6jo7QeSCQmjThwZS1Li7iNyiKbUT4JtrqB6GoNxTr96n0y8mqoyA0KyIvmPR2CjPyX91PGqU7JQwchns840YfZZ3f0EGtRytWeGy1l/li+Q3u6Hw1Q9NWqVBxvc6eS2vXeCzmj2uN5vyJFSpPHR2h8tgkz3dXCzp/3fw8C0MODvP5yzEdZd0pZL5CsY/0aUKGX5gXHnpOJJdTeiWXoYvaZc+225J6oNEVdyVVbv9aW9+Posu8TVoUc7TQxzYzJtic8ACrrYq5qC00tZHu+0RoVa/XhUZvgctVaL++536Ut0lqHHsbCcd33MrI6TjG7Uiuch35dR53+wb0uFqq8yTYibitleN8HXJr+r4Y96TiCzLuvTe/u/VXhmEYhmEYxlvYQ5NhGIZhGEYf2EOTYRiGYRhGH9hDk2EYhmEYRh/sqRA8ygP7ZroirsFBmSRUi7NWL7Hoq1RkwdfQEJ/CRjvDIHOQt8mlLApbFYly204L3pAKIXheCIlzLF6bP6nFe9cvCJHjPpGcU5ojSuExAF8W2xRlnbxPc4FN+wCgHLEYtVrm862OsYgwLxNzAmhsdI+TkZd21+kViGpzOy0MTYQoVSas7bTESYQZfS+F3tJEUhwjyGe0Q4SWFGnLfULtkYpE5LwMOlsk7A309Ytb/JnPC3NLIQwPAv33lZMfSQPRuxDo7xW5vMP+w93ObYhMsK6QkeR4TST9HOCLFxR4nlk7m5E8XCQCDfN8gcvixYBmRtLui6tc74HLnKz0yDumqDz64Sokl15Y4ToOsslmVBJvF+hmqDhMRBxmGWJqxPwFOe62Nki9p4mhQyCsdttYF/NIeVGbC0Mkem7X+d6R48uHMBJutgBai3x9vHhjJBC39uKQvtUPF/j+c/Z57ut6g+t8x3Na1N4QxpPz5zk2rwvBdVrTc0B+SQi/P8R1TBXFPf47+npvnGGBeWtVmFFfFQL0AU6uDQDtle75+eTWsWu/NBmGYRiGYfSBPTQZhmEYhmH0wZYPTc65GefcV51zJ5xzrznnfm7z81Hn3Jedc6c2/z+yVV3Gw4vFkbFdLIaMncDiyNgO/WiaYgC/4L3/tnNuAMC3nHNfBvCPAXzFe/9rzrlPA/g0gF+8XUUeDu2exHppwodfXcrQTeR5XbU0yuuwXjz3tTJ0QPUBXkfNi3VVkfMXBw5pk82O1D2JdfRGnteul1d0O5Icn0ulIE0IhVHnEb3uOsh5GlEQxmfrQnfRmlNVYOgxYVzoeH187QKvKUehDpNSz7p7n+aWOxhHHmmPBiWOpV5J970ybxTaErVHR6+9ByIZZyikBlLj4TIMMkNRRyqMRpVeKcqoQ5pZxiKOpNYqI+lvKi6p1KPEQr8VRrpPQy/H665rS3YshqJOiLG54ZvlhQGhvSjrrKAtEVex1MGJsivr+awgkieXRCLwonCRbIZsDggAr57hfabe4H2mn+Ikv/v2aS3KiS/PU3n9RyapPFIVAdLM0sXxuTihfcyJuMuaJzpC06f1kVsI54C7CbsdiyMXAEGPRNQJY+T1jN8lpDzwwD6eb4dzPMAXVjO0kSxBw0CHtXEDU9yRlYpux/KrXG6CJ5/9x1gLNziuO/rkCdbMnniTL2izxv1RmcowsB5mvdH1PxO6vgMci+1ITJIAEmFmCWH+WV/n/glirTeszvR8f2UbCXu997Pe+29v/nsdwAkA0wA+AeDzm5t9HsAnt6rLeHixODK2i8WQsRNYHBnb4Y40Tc65IwCeA/A8gEnv/SxwIwgB7Nvx1hlvSyyOjO1iMWTsBBZHxp3S90OTc64K4PcA/Lz3fm2r7Xv2+xnn3IvOuRfrGxt300bjbcROxNHCvM6lZTw87EQM1Wq13Wug8UCwE3GUxBmWAsbbmr58mpxzOdwIrt/03n9h8+M559yU937WOTcF4HrWvt77zwD4DAAcOHrEVwe6hwzyvHabg84sGndEEsEWl+PrvDaZxBlrkdf5s5EjvCZaEBqnJNDrrmsr/HyZn+A14w1x9kFOG5tI65P6EteRCGXN+LTYAUBbeDldmxMiAOExdfRpXcfEDPehPN1rZ7jO1QU9MUzv69ahfZKy2ak4ete73u3rPf4f0tvFBxkaANFGL/RGgdCaICNBrfRlkj5FUn8kE+feqIM/C4Uvkxfyk7St6wjE+SlfJnFcecys40KUY6HfyeW21mbshVvOTsXQI48f9o+9t6vZyC3z3HNqXusmVi/wNm3Vr9whxVHdhrJI+hunrLVYWGd9R+OCHr/5DutIzl3mdj07x/f/wSmtZw6OcFvnT61SeXhEaEAyMvYWhIYp8cL7S0yBcZKRbDeVfchlJxP0Zgmj7sL+a6fiKFcY8s2lbpsSMShKg/o+EJSETxP4Gtfmue+jjPvRmPDWC/ZzvB49yF58axta1zb/LY610gRf42ceZdFmXNf359evcx2xSBz8+Hv5XAcH9MX6zuuiP5b5fONVEWcZTy0dofvyQhzX7nB/xVWtaQrD7nFvlwS6n7fnHIDfAHDCe//rPV99EcCnNv/9KQC/v1VdxsOLxZGxXSyGjJ3A4sjYDv380vRhAD8F4BXn3Hc3P/vnAH4NwO86534awEUAP7YrLTTeLlgcGdvFYsjYCSyOjLtmy4cm7/3Xcetf3j+6s80x3q5YHBnbxWLI2AksjoztsKe553KBw1S5u7aakzlloLUz+SFe7y0XeW22Mc3bL53Ra8jDM2JNOOE6V4S3Uz1Dw9Oo82dulr8fEofwA9rXZl14BUH4NFXyXM77DB1BwOc3eFSsbQvtQWdJr2V3Vvn8ozLXmRfr8u2q1ncsLfas42fpyHYVjyTonncqvY0y2hMK3Y+wNkIictHJ7QHASV8mESahLEudFIBExEksZALSxynQl0/lrwu3yF+XalkMYqHHicRxXUHo7ToZPk0hx4nKRae4hznCBI2mxxtvdOO+LDWKbzblLrgmNU0B71MYFOWyPm5daCPrc+zDVJsXY97rPnPCN+2lc0LTdIk9pp47oDVN009wMF86vULlmXfxi2OljGsrx52aB4T+KMjKG6e8zoQuSuyTpZ/0XsfmnuE90O52RK4q/PxaevDl1oUu9zB3QlrmF6bGirqOtTwHV7rEnn4vXeVjHBrQF3DgMZ5cHhnhieX4D/A+p76qqsC1Be77o1Mci1PT3K7Lyxn+d0vcZ6OPc3lsPx/jytf1/bn3fgAAofClCsX8VdvIuD+f6rZNzsvU3lt/ZRiGYRiGYbyFPTQZhmEYhmH0gT00GYZhGIZh9IE9NBmGYRiGYfTBngrBASBNu89pa0J8W1/UzemIpJAHjwvhszSdLGjlbFkkQJRGhuUC17lwRRtfdYQ5VkMcZlkI4lyo6xCngs48t92XpDGaqgKdOa5kpcXK4nKe+zAc1c/F1y6zyDUViUYrYp9cRV+XXKUr0HTae2138R6Iu212onlSKA0AQfv2Qu9YXM8so9/IyzrkcYVotZkhehTH8eJlgEQkbc4aoDIRaiyOG0hBelbCXiHAVcJwca5JPiMJsjCQC6QSXBkRZr0wcG/E4c1WitfPd0XYReEHvbGmg7q+yJ+lAbe9eZ2/HzquBbylQVZPh6Ew2h3kAMnwlMTAAB+3XGR386uLV6n8REu7bI4c4OPMfp0F6ctzLCYvzuhzCVKR+FxONaIsRd0AkMRiDlQhIuMu4wWNe/m3f+Dgel5oSuWLHu0Mkbp4Vym9ImLg/WxuWSzpfmvMixdGRMLtaJAnwZFHdDOGxAs/wXkOtuvinra0oceEa/Nkk47zcdeucnmjrl/UmjrG2+w/wrG5NsCxt7GuJ+dYJD7PdYS4XprKrokJEEDaky3dp1lz1Q3slybDMAzDMIw+sIcmwzAMwzCMPrCHJsMwDMMwjD7YU01TuwFcOtFdKyweZG1NUYpEAMQjvK56aV3ooK7x2nspp09p4ywfZ/WCEL0IXUlxRps5tkQC00qB10ST/bxWW7ug6ygIjUNOaF5GpvgYYVuvqy4Ic7C1YXbhai3wccvDeh3aC1M+P8DbVIaEMdiA7tPGSs8a8R57W3rPuqVANEAaRAJa9+Nk4twc94nU/AA68W0gBBiRTJzbhyGgTLYbbGH2BwBBR7ZdHFdoiTLrkMfdQp+FDHPLNBRxJM0u1R5Z7LUx6ltH9YiT7phdb/GcUHi8KndBVWhAOsucODcvtEb7HtXzWVGMrfWy6DNhfBgN6PFbDfk4rTYHzbmL3KfrV7QGZOoYmyPOfIATvEIkYsWMduoMAm6rTNgbi1hPtZwFTlx/mQRaRp3zWX/n35sYAgDnUoS5bv9KU8Sko9tbFtdvdJrPsrXG368v6fk32cf7HDzK5asrrAu6dkmP35zQ9q6c4vJri3xv9Ssc7wAwGHKcLC/zOKqJJM1xTcdzJIZJa47NPRdFEuBGpPs0yvFxfczBFq8JQ9EWnxsAhL6nbbcJKfulyTAMwzAMow/sockwDMMwDKMP7KHJMAzDMAyjD/ZU0+RdilauuwaaX+N117CkFxInJnh9d22JF43jUf5+cFif0volXt+se16HTWJeZ73+qs7WNzbMdYwM8xr/So3XXTsyMyuAWMgEXJ4X/ZcXeXE3jDJEAGVeu50RnkoNoau4clqbFnlhJjIxLdedefu0pNuRrnb72Sd77LUTAK5nPT6RCWtT3Z6t9EZKrxRl+KsIDYBM2BsIj6WQ7VY2jyt9mW6vx3JZCXuFRimQSX9lwt58hj+ObKsYNk72V0afSg81qa0Kwz2OizugFEV4x/j4zfL1iHUUrbKOeT/F2qGOmAOKZY6ZiUMZWT+FgMMvCZ1jwscdKOsgGh3ifm2s8j4nvsN6jTdFMl4A2H+M6514gtuxfJ31K83mgKpD6kedSEgegOeZDMkqnIgReQeI2zIO751+KRPvkPYkgE+afM4Z8hukIZ/DsoiBVPj3tTJ0bWhyLH73u7xPVOXyYEHHc1Th6yXjV+ocr+d1Eut2g2PcXxX3I6FJLlUzfLZyQn+0n+Oq9U0+15xIaAwAuYg1iI11bpcDl/MZwRj2eIZlJZfufmcYhmEYhmFsiT00GYZhGIZh9IE9NBmGYRiGYfTBnmqa8gWHmWPdQxaFvqNV1fqb+UUuN0XuteEhLle9Xov0QyIPj/BwKI7x+ub6utaz+LRE5doGH6d2nesc2pehaRJrxmvnuV1Lk/wMmy5pf5W0xvukMbe9KNaDR4b1GnJO6J6CmLdZFZ5U9e/oOgrt7vkl2pJqd/GA62lzqLyNMnYRy/Gh0CdB1tHO8DYSmg2Ve05ou+QxASAUOdwC4REmc8CFGRIOqc9KhN5Iaa0ycs/pPhMxofyk9JiQvjxJLM5NjG+nctHdOyrlCO97buRmuRYP0/drie6zi9V5Kl9Y5oR1+RJrLQYGtG5ibV1eK9YfhYn0gtJalOvrXO/cLB93eZmvw3e/NavqOPwY+zJNHhqi8sUXV6lcyGdomp7kOTGE1AXy9kmGcVkq/MASkc/QZ2jpJDpf3d7hvUOn050Lg7zUy2q/r46IrXqd53Spg2rXdb8VqtwvM4+JfqxxeTkjl6a/JO4V7xN6rCVuV2tBzwGtmsgdKOaVPLiOeE2fS6smdGtXeJu60CNN5vUEP/3fcB3n/4C3uf6q8GKs6GeNsN0zrm7zc5L90mQYhmEYhtEH9tBkGIZhGIbRB/bQZBiGYRiG0Qf20GQYhmEYhtEHe2tu6QHfY6q3KszPVi5o0WPiWSiZD3mfVsynsLSiBV4NIYzMCVO2oMPCyvyGFnBGQ7yPb7Cybmqcy6UDOsHl2e9w28IpYWznRFLBin6mdUJ8m58UYlsh6K2WtXhvYILrzQsxeVsIFa84rSLcuNIV2qV7nrGXE/AG6e0F2gCQCBGyNBqVhpBhlqmkMIR0wngvKgqBdqBFrHGTP4uEID0qSKFwhhBWmlmKOnxOGmjqOpQRpTTEFMMoaeo6ohL3eyzNDYXwN8z4E+1eicNDF2CoOHizfPigULBKt08AB+ZY+OxeZ2H4WpkDL0m1uWVzhQOvJowNVxe5kzY21lUdtRUej601kXzUc/C+dnZJ1RH91kUqf+KTx6hcfIYD4NxfLKs6Jh5jcXiYCuNOEQ9plmGg+Egmb/Xi7/qknZE4OsOHdq/w8EjRc9/q8P2pkJHoevj9fE6jwtA2V+c6gmk9cA6IcB0Z531qK9yxKyO6juK3+H5bfoorvfI6i6k738lQk4sMxZFQggfX+YJuZFysqhC1Tz/L5aWXePv5ZT02136Ljxtf47a7jkjou64n+KDH0Na5W9/T7JcmwzAMwzCMPrCHJsMwDMMwjD6whybDMAzDMIw+cH4PncGcc/MALgAYB7CwZwe+e6yd/XHYez+xVwezONo17nU79yyOLIZ2lXvZVpuLbo+1sz9uGUd7+tB086DOvei9f++eH/gOsXbe3zwo523tvH95UM75QWkn8GC1dad4UM7Z2rl9bHnOMAzDMAyjD+yhyTAMwzAMow/u1UPTZ+7Rce8Ua+f9zYNy3tbO+5cH5ZwflHYCD1Zbd4oH5ZytndvknmiaDMMwDMMwHjRsec4wDMMwDKMP9vShyTn3cefcSefcaefcp/fy2FvhnPusc+66c+7Vns9GnXNfds6d2vz/yL1s42abZpxzX3XOnXDOveac+7n7ta27hcXRttv40McQcP/G0YMQQ5tteujj6H6NIcDiaLfYs4cm51wI4F8D+GEATwH4CefcU3t1/D74HICPi88+DeAr3vtHAXxls3yviQH8gvf+SQAfAPBPN/vxfmzrjmNxtCM81DEE3Pdx9Dnc/zEEPORxdJ/HEGBxtDt47/fkPwAfBPCnPeVfAvBLe3X8Ptt4BMCrPeWTAKY2/z0F4GQfdfwsgBdxI63q5/agzb8P4GN309YH8b+HIY4AFAD8Bm6Y5q0D+A6AH7YYenjiaIfmoq8BaALY2PxvV6/nwxZH93sM7UQc7fX97EGIo71cnpsGcKmnfHnzs/uZSe/9LABs/n9fH/tcBfCrAD67mw0DAOfcEQDPAXged9fWB5GHIY4i3DjHjwAYAvDLAH5383rvKA9pDAEPXhzd7bX5We99dfO/x3ercQ9pHD1oMQTc+bXZs/sZ8GDEUbSHx3IZn73tXt3z3n8BAJxz7wVwcLeO45yrAvg9AD/vvV9zLqt735a87ePIe18D8Cs9H/2hc+4cgPcAOL9Tx3mIYwh4COJor3iI4+htH0N7dT/bPMYDEUd7+UvTZQAzPeWDuPEUez8z55ybAoDN/1+/x+0BADjncrgRXL/5VlDjPm3rLvDQxZFzbhLAYwBe26kGPeQxBDx4cXS31+ZfOOcWnHPfcM79wE436iGPowcthoD79No8SHG0lw9NLwB41Dl31DmXB/DjAL64h8e/G74I4FOb//4Ubqy13lPcjcfv3wBwwnv/6z1f3Xdt3SUeqjjanEx+E8Dnvfdv7ERjLIYAPHhxdDfX5hcBHMONJaPPAPgD59zxnWqQxdEDF0PAfXhtHrg42ksBFYAfAfAmgDMA/vt7LegSbfstALMAOrjxF8RPAxjDDdX+qc3/j95Bfb+KXRDOAfhe3PgJ+GUA393870e209YH7b+HJY5w44+a3wbwxwByFkMPRxzt9FzUU++fAPhnFkdv/xja6TjarfvZgxhH5gi+SzjnfhXAQe/9P77XbTEePDb/+vosbrz98iPe+8a9bZHxoOOc+xKAL3nv/+d73RbjwcLuZ13MEXyHcc5FzrkigBBA6JwrOuf2UnBvvD34NwCeBPD37IHJuFOcc8POuR96a/5xzv0kgO8H8Kf3um3Gg4PdzzT2S9MO45z7FQD/g/j4f/Te/8ret8Z4EHHOHcaNt+RauGH89hb/xHv/m/ekUcYDhXNuAjeWdZ8AkAB4A8Ave++/fE8bZjxQ2P1MYw9NhmEYhmEYfWDLc4ZhGIZhGH1gD02GYRiGYRh9YA9NhmEYhmEYfbCthybn3Medcyedc6edc/dHBmLjgcPiyNguFkPGTmBxZGzFXQvBnXMhbph6fQw3jLNeAPAT3vvXd655xtsdiyNju1gMGTuBxZHRD9vxW3gfgNPe+7MA4Jz7bQCfAHDLAKtUSn54ZKj7gcjH5zKf3/hDr3L4iQ8y6pAPhk78wBbuwCKlyi2Y0Q6ZgFBu4sW5pImuJBHlUNTiHJ9Mkqa6HeJ8dVpErjMI9BauZ6/FpRVsbNTvNrviHcdRPp/zxWKxWy6VxBYZ5yz7KZAXnb9PU933cbsjduE6oijPx8gI6DTlOuJOi8q5UlXUoapAY2OVyp2WaBduH2cAEOW5rT6NqZy0OdLCSA+SfKnM+3Tq/H15iMppwscAgCAIb/67tlFHq9m6mzi687loqOyHJ4dvllvLom053WtO9MH6iuizphyL+riB+DB0IZW9GGthkHH1eBfk8uLrHNfRbug6Wk0eI3HC19uJMRTkxUEBhKKtXsxXkWiHC3WHhCJ0O2LMtOrcLp8xpqJ897p0mnUknbuKIeCu7mllPzoy2POJOOesINjqdwp5S8v8YUN+Ju4dXs+Bd4q8T2alJ/biOGHAcSLvR5motm5xT4vlXVDvE6j5vZ/+6W6ztLKKWi37nradh6ZpAJd6ypcBvP92OwyPDOGf/rc/dbOchnyiYSejjWGbirGTQVmgsufNb+wT840pCopUHixyNwTu9h0KAF5sk5fBknHTlRNPknKdiZgNa+s6ONbExDQoLn6uxP2xuqF9EaOSaLsYHGnAxy0VM26YQbfPfu3/9Rvq+zvgjuOoWCzive99z83yzDNP0/cR9Dk7cGCUBvhBKxYPl41WU9WxdOEa15lwHaNjh6kcOh2MzSbXsTR3mspTz34fHyPjpvnG1/+IypfOzvE+4BhIoR9WRg5zWzsbC1Reu7pC5aExHjMAcOSZ91B56coLVD783A9RuSGOAQDF0sDNf3/5D76qvu+TO5+LJofx3/x//uub5bO/M0/f+wPyQRSIRvkh8a/+aJnKyyfEPJPX80glx9dmMOIHS1/kOaBSzbhBDHJx+hDPI9UpruPyKzoOT5/ktq6srVDZef5+8CCfOwBUKjkqxyt8vpMH+PuoymUAGJjnfa7m+XzPvrhG5TSvr8vI4W5sXnrxrmMIuIs4Gh0ZxM//t5+6WQ7FDT5w+pzl33SBfBoR021H3L8AIHHcD0HAx2m2+JqnXs8B6qnec9yE4t4aFPSDc9zgP5SqVQ7OYkHGjR4TSUvM157PrRDxH5LryzzuACBJeJ9yhffx4v7caNdUHQ7dvz7+3//m/6e+f4vt/MaS9RSmZnjn3M845150zr1Yq9UzdjEecu44jtryFx/jYefO56JVm4sMxV3c08ys/2FjO780XQYw01M+COCq3Mh7/xncyLCNgzNTPsh1n/hS8TNbU6+9IUj5t+dItNgl/OTaTHQdUchP4fIPQCeWDXwu61mSn7pzjn+JkD/DxoHu2naLz1cuVwSRaFjG1ZkoiLaJnyED8RdFIdJ/HdRa/FlH/DSfq3Kdbaf/Sonr3bamGUuAd8Adx1GlUvQba5dvfjf7Ov/ScuAx/uUJANKYJ7c45r80ohzHSNLUf4mMTU1T+cTX/yOVy9Hfo/La0llVx9F3fA+VO21eagsDfiB0hQFI1jcWqez9Qd7A8S9gPuJjAMDhZ7+XysPD+6j8rT/iXw8d+BcRABganqLy+MEfo3KhUqFyZZDLAHDiu39189/t9l3fgO44hvZPH/Arf9P97pUXeXwXuTtufCaWhpIVnpvKw/wg5lM9gPOe46zzrtv/qtu+pn9prBzj8dsSS6mNS1zHQqznxLUN/iVC/KGOnPiFJL6u50RX5HpHxJw3Kn7xmsv49X35HB94bZrrjMQy6dCYjqEjT3d/zbj+mp7v7oA7jqOZmSnfK19wkMtT+iBxR/xKlON+82I+lcucABA4jr2WmIKHJ3lOaDf1Hwmx+LUlFnG0vDhL5erwcEYd4hetmH9ZaiZ83DDUv5z6WKx8CJlDsci/GnWK+pe3Tofvx6G4LzYaPLfk8voXwDhDDpPFdn5pegHAo865o865PIAfB/DFbdRnPJxYHBnbxWLI2Aksjowtuetfmrz3sXPuZ3EjAWQI4LPe+9d2rGXGQ4HFkbFdLIaMncDiyOiHbWUr9t7/MW4khTSMu8biyNguFkPGTmBxZGzFth6a7gbXs6QZhbz+2+zo9U75iRPrjj7lLYIoY/1XaPnyQtDvm9yOYsa6axSIdVTP28QQby9kaJXXhBC+WuHuL+TF5Ugz3rwIWV8UifMNhE4sTvUKbFu8SebEcTfqvP4bNrVOYGq0p0/32Fe+WBnEY+/74ZvloRF+syuX8fbc8sIVrqMwTOXy4AiVaxtLqo7qGGuaxmYep/Ls6a9TublxXdVx/P3v5Tr3j1G5VBGagLbWIsw8xi/0LF7jP4ZzQkdw/D0fUHVM72fRTkfoLI4/9yEqz77xXVXHxLFHqdyq8dtxreYKHyPR2reoR4Pn9jB5eG3V44U/6Y6VRp6P3Qn0AO4IQeXko7zP8hWOw+o+PRdVlvmz6cNC93WE9WgrJ/Wbb3NLPAecX+QB2HyT296O9JugUSQsJYT1wRCHOqY/qOeA+ptCf1Tm4yYd7q/426oKzDeEJqbG5+LFG9atju6P+ee7fRhrKeKu4tMUnR5dT17MpVk2G/mC0DCJN6CVw0uo+74ttESthjhxoQXuZMwj8u7a+/YYAFQHeE6Mm1pLJM+l0+ZYy+c4nuvNdVWHfMNOamQX5llWlo/0fXF0jOfR+gb3R15oe9OMm1bbZ7ypmoGlUTEMwzAMw+gDe2gyDMMwDMPoA3toMgzDMAzD6AN7aDIMwzAMw+iDPRWCe+/R6jFSTEXalKwcOzLVUBwKMWkizB2zcoYJI6vVOtdRgEh/AJ0yQKQIQygMM6XEtdnU7fDC+CyfZ5FgKAwWQ6/FqEFOGHGKS5iIfGhhXgsRXUeY44mcUNfn+PtSoAVyU2O9fbS3z95B4FAs9bTRs/C747UaNFfivi0UWLS7ushC8cFRFkECQG2Zhd1jM09SubXMqTgOP/FfqDpEpgLkRDtSKdiMdd9OP8Fi8vPfYbPL0HGdLsN8VApspfnd2H5WAteW+BgAMHf1DJVl6oIkEUZ/GYavR9/5sZv/fv3131Pf7xpFD/9oN24Gz3DMFMp67DXPcT/O8+kjlkksQy1YDYtsojn3skg9cpnH2vSzuo7BwzxeT/5nnpzCQ2xmWhkWyekABN/hMbPvR1iQHpwVOd9e1dcuuc7bJEe4zxY5AwqaG6oK5MRLKfU1bmsSi9RTa7odweGePszK1beLeO/RbnX7Pwr4+mZZjMcirVEg5s9E3MMCl3GbFkLvkpjfZI7LKCN/qJy3A5kCxvNxi8WMOBLunTIvnAs4vouhzBMKROKFJ/lSQjm/tWHoxjoLzOOOSC+W5+PKdC8AUF/spri6XRTZL02GYRiGYRh9YA9NhmEYhmEYfWAPTYZhGIZhGH2wx+aWHmHQXc9NU16r9Bl5X8NQiprE+q9IRpnh5Ygo5vXdptBBtTyv5zeWtQ4oJ0wkqyJZZSCSKo4M64aksUj6K/RZri2M3VxGh3S4P2RO0FbM+oYkYwG4WJTr3azhGhzgdemBUNfhGz3b7KEp4Y3DecS+q4XwLRZL5AJtgFcoceLb5VXWMFVy3AfrK1rDU1tc5n2GWfdz4Knvp3Lc1rqYqFgRZREDIp6r+zgpLgDMnr9M5foal6ujj1G5NCKcCgGsz3MyznyZ+ycVWoTx6eOqjk6NtTNeJNZcW+Q+HJ48rOq4/Mo3bv67LQ36dpGwCAw/0e3rq+PCpO+iHnuNKf6sdUFoU4T2JGzrOSB4kj/rzPI+gxM8J06NamPD/Dy3o1zleG9fExrEhh4PQ2OsI3ni+1jzcbXF+8yd1nW0chzfy6e5Xe0az0UZ+diR2y/0k2IqaZ7lnXJDem4ePNSdV8NX9lhf6UJUCt1k1nK6TVOtB41jYbYstKwOUiek+74jrk8g6wikXljHcyLui51YJHvPszYyynhcKApNZl26i4rrWSnrxN+B0OG2m6y3S0Q26dhnJJAXGq58ge+167UVKjd1FYh7z/829zT7pckwDMMwDKMP7KHJMAzDMAyjD+yhyTAMwzAMow/22KfJod2TxNGJRe4wy09GrD2GIpFmIjwdCnn9HBg3hP5IaHTCgNdQKzleDwWAstAsRTmhLRLrsshYMw2ETqTRFu1Qe+h11Y7QOcUpr20vN7nOjSWdqHFgiLUnBZbZYKTAfhy5jETKYU/yVemltdukSRu1Hl+lsQMT9L1LtAZA6osGBzjBoxdaoiy7l2bMGp6jR95F5UtnTlL55Hd/V9UxPP2PqTx3ibOYTk4/TeWwrc9lZfk8lWvCAGfj2stUbvwVJ7wEgMPPsO5pfOYA17E6R+WlubOqjuPPfIzK106/RGU3NErlMNA+L7WFrjdKGmdkud4lCnA43pNku9PkQbAR6wAYKHCMNIWOIicSfY8f1OdbWmDt3Ljwvhl6hqfk0yt67L3+BT7uipjPNlZ4+0B62wEYLAlNzAvCt+sCt6vR0El/U6GBqa9xO2QC5qHDem4u7ePzXZ0T85vQCJVj7fMzUei2I9rjycg5h7Angaz0JepkJBgORfJYOYenCV/zKNLn7CET9HLf5iK+hyWJ7pe88C+stXl+CzzHaiB9yAB0xLyapMJ7UCSyl35wABALDVMYiqTHQigWFfS46rTFvVX0u9Q61zeuQVLpuSe44Na/J9kvTYZhGIZhGH1gD02GYRiGYRh9YA9NhmEYhmEYfbDHPk1A2rO2mhN51FykmyNtmrzwdpLrrKHTz4EDbEGDQkHmB+KD+IyMQaE4biJ9HESuG2SsiYrlbrXe3Ym4zkiLnNAUPk3LwsNirs3r4fmm1jNUB3gNOSdy0cm8eonKrAcEvevhWWmNdpEwjDA00l1/rq/zWnyruaL2qRb3UVlKH8I8x16uwHocABgY436avcz+SN/54/+Vj1HWecPOv/4ilevLrD8an2BN09oK57MDgMEy58U7cvxxKl+7ep7KtcaSquO15/+Syu8b/lEqe+H3NbRf+0Uh5jjyqfSf4fxOGzXe/sY2PToCt6a+3y3S1KPW7I6dXEP4vHita3QVkUdrhMvVqshvOKq1KMUzHGeP/ijrMzYaXMeZF7UGZL3A16bW4Xm0JfQuMrcXAKyIvIDf+lu+Nk2ZF3RZzwHxFM9x6Sy3q3iIv3dNPVGsn5O6KO4PnwhvrJYWizYXu15BPiNX467iQD89yPyp+bzW37Sldm8LGVa7s64+i+S9Uhw3FArZOCOPqZwDJ8aFrnGNj5tm6KLCHLfDRSJ/nfCPascZuVDzPNbCnGh7W3gPJhnax5D3yeV47DUb4p4nhbwAWu3uuPEZ/lpvYb80GYZhGIZh9IE9NBmGYRiGYfSBPTQZhmEYhmH0gT00GYZhGIZh9MGeCsEdgGKPYCvKC7FhmiHAFs91HlJYx4ItKeoGAAQsCpMGXDKpovO6W7zjbbwSvEkheEY7Em57Xgje0pCF4a0Mh8wrQujtRMbeoufvyyUtAq0UZXJHIXIXAnUvFewAev0u99jbEt57Yaom4sZxEkkACEMW/pUqLD5cXOEEvrWrbO4IAOdf/WsqD429h8ornM8XVWghcHXfE1weYlF3q82CRddhESSgTQX3P/5OKg/s4+S6q3PayC0qcx8Vq+NUHhLJiOuxFqM68XLE1ZOvUHnpxe9Q+Yl3fVDVkaI31vYukpot4PTJbtz4VT72yHE9F+XEfNW8xnPA8Sd4LB58loXwADAywuPzwDu4zlMvcZ0jR/XYK43xPme/zdehHXM7krJ+o8SJqaXmeMwXDnE70w09JzaWhCFsRZgyisTo7YwXRtwy71Od4nhPO1zH5IwW8JaOds8v0Pr9XcV7jyTpabO4dwSB7jcnFdiiX7wwec7wfEYqXJ99IoxFxfWMclqQnooXN5ptNjBNRZLfJNHiaGka6cW5NRo8b+RD3Y5QdEBTCL/jhM81l9fzaqPGL0x06vxykBPJtHMZ/ZHL9cyJZm5pGIZhGIaxPeyhyTAMwzAMow/sockwDMMwDKMP9lTTFAQOpWJ3/TIRWhq11gsA0lhRuF122lxHlGHEGCfChC/hhLU+Euu/XmsAEpEoNxJaqkTosUKv2xEJXVRQ5DXk1RrrTBYzjMAqRb5keWFs1xHrw6VhrWmS3mCpSDTqCsJA1On+SNOetkujzz2gNzHm0BAn7G3G2kQxaXA/LS3xNhvrfC3WV3WizXz1SSqvLS1S+dgH2SAy2Tiv6hgYEJqMyn4qthu8Fl/I6evn8hwn+2aGqbwitHIrl0+pOqqjrGEq5Dkomm02SBwc0mafsZA4DEywgejy+iU+xgDrtwDg2DvedfPfb1z6bfX9rhF6YLR7zjKBbX5R93utzv0etlh7EayLZLOn9Bxw+jz38xuzwtyyJhJL57WOZP8HuR3xKm9zyrGwpxTo8RuNijlRmEKmb/IxXFG3Y0AkT1+r8XE2GuK4i7o/cgHXG65wf5RGhRalkpEJ/VrP/LN3OZ8B3NDD1updU9aBCo+BjhwkAAKRTFdpmIQRpXM6FnMi2W6zwbHYTrgcZphs5ot8jVeXWPs4UGFNntQaAUAi7nOxuGclQpMZFrSwrdUU4ygS91JhoNlu6+TRUY7jtyV0uaUyz7uhdM0GEITdtmdqo9/a7pbfGIZhGIZhGDexhybDMAzDMIw+sIcmwzAMwzCMPtjbhL0OoOV14SmEnF7vTGJeF6+LhI0dUUU51GvIBbHG30l4vTNo8fplq6DXzYMOd1WrzWu5cok0yli7TSLeZ6Mm1mFb3PbhSD/TVsQVSxP2rGgJDYSThiwA2iIJZlwXWgNx3KiQsf7beyH3OGFvmrRQWz53s5x3x+j7U9/+I7XPxPEPULkuErS21oQu5OW/UnVURx6hcqnC2riNuTeoHIR67X3l2mkqD48OUTmKRMLSDL+QQpn3WV3ihLyXXvozKodtHQOjkx+icqfO+iwfsraqHWpdTL7IWrIjT7BvVbvBcTU8pjVNxXL55r+D23ij7DwevQKY60L2VckQx0hVSLzE7W3UeHDOT+mBcSXHcbZxmX1sRo7yWBvM6Sk6neV6KwNcPjrF+2Rp/BZjoX08z9cq/8gGlaOOvjZzbwgdnAj3tMlxF2Sdi/BVyjWE7lNMTZdP6zhc79FUNnV+410lTVM0epLB5iLWAmb5NNVrvE0q5uO80CsFGYnsm0JPJxPy+jaXM3LtIicSB3sxxlfWOYG2i7QuqpTnfVobHATlkvRU0udSHSxTORW6ZKlhyhe0T1Mi+tCLTSKhDS0VMzSLq93zlYmXe7FfmgzDMAzDMPrAHpoMwzAMwzD6YMuHJufcZ51z151zr/Z8Nuqc+7Jz7tTm//Xv7obRg8WRsV0shoydwOLI2A79aJo+B+BfAfi3PZ99GsBXvPe/5pz79Gb5F7esKQXSds9zmvBWaNe09qLlee09FWXEt18PBoCi0OS0hIYpFR5LhQxfjER4aRTFmqlYHkac6jXRtljjX6uLXE3Cp6qc15oIYaGERp770G1wQ4KCXod2TT5u3OFtEvAaskt0O9o9WoQ+bZo+hx2KoyDMoTI01W1fxGviIwffKXeBKw9zucHr9VdPfoXKhdxBVcfg5GGxDQso8iEfY+SAriNIWU/XXBO6gSKLPMJY59HbWJ6l8ne/8gUqP/N9/xWVl069oOooRByLQ/sepXJ9jT1b2nXt0RK3WUtVGmGN09j0ISonqRacLC2c6NaXob0RfA47FENJ02HxRLevN5aFP1asY744wYN+9DiXJ57mwTk6o3VRA3keLC9dEj42SzwWq8e0hqd+WsyJUxz/rQUev7NL2nOsITyW6kJ/FrHFFpDhGdcQOe58juuMcnJi0D5Nvin0lY7ns/wAH6M8osfDwcPd8z8139fiyeewQ3EUhiGqg93nq0jocmVeU0CnNeu0xZzQ5H4slHW+vbLwUFoTPnOBzGuakce01ZbjkdueK3FflyqspQSAzhon3KxWhUYzFNcv41wa66zxaguPpcHhYW5HieMdANot7rNiwttIP6mkpcfEYHng5r/DDG+zt9gywrz3fwlgSXz8CQCf3/z35wF8cqt6jIcbiyNju1gMGTuBxZGxHe5W0zTpvZ8FgM3/79tie8PIwuLI2C4WQ8ZOYHFk9MWuC8Gdcz/jnHvROfdirbbH74Mabxt640imDDCMfuiNobi95VKgYWTC9zSLo4eNu31omnPOTQHA5v+v32pD7/1nvPfv9d6/t1LRa5HGQ81dxVGxVLjVZsbDx13FUJTXXi/GQ81d3tMsjh427tbc8osAPgXg1zb///v97OQcJ8qLhXNZM9bN8cKsMhfyPgUh2IoyTPikGC0SIlgpT/QZbo1BkQWanYTFazIZby0j6W+9w0dyJSF6FA3JhfqZNpHC+FSI6R1/n7S0ENEFvE1UFKI4kbwz8RnP1v4W/74z7iqOolwB+w4cv1m+eu41+j4ItOjRtVgoOX70GSq/+e2/pXLWZHjgCAubW+tzvI9Iplwq6nhOxIsLSYMfAJMOd2azqX9VO/XSX1N55Aify+Gnn6VyPmXjSgAoi9hzHe4fmeCzVmOhNABcf/XPqVzM84pGe50NEhOZrBhAWOj59TlDNNsHdzcXJUB+vRsnjRr3c+WIjvlHD/Iv5ZOHeBx1Njhmvvtn+nzXY37JJJ4QCciHuQ86B/Tgqh7kuSU5y+1gCT8QSwdJAIFIOO5zPAfEDX/bMgAkYn7Ki3l2cIDHYSvSdaxf4rYNTnOdT/0o/6E9PcCGsgBwqCdUn/+q+rpf7iqOAIewR7zeFvOMz3iJBuDrVxTCZif6tdHgew0AdDpS+M19n4p5ptPWLyVEEcdiLi8SCYuJfWN9QdeREy+uSDF5XhitNvW5OHFPz4vHEp8Iw2boeSKNOX6F7hvDgyxQb7X0vJrrSRR8O6PdfiwHfgvANwE87py77Jz7adwIrI85504B+Nhm2TBuicWRsV0shoydwOLI2A5b/tLkvf+JW3z10R1ui/E2xuLI2C4WQ8ZOYHFkbAdzBDcMwzAMw+iDPU3Ym3qgN3dos81ru2GkDafyInlsLuI11FRomnIZTouuwWvrbbFPWyTwLeR1HWnCa6CtFrejLZKzdgJdRxjyGnJR6AhKCetIooxkjx1hShc4bpcTa7mpXsqGyLEI5/g4+TK3y2UYdfre83N3L2q6G+JOE/NXu6aIxSqbsElTNgBIEtZCrM+zQeSR9/wglZtzV1QdkTASLQjTtbjFyVc7LTauBIAwz/qFKBqg8nqdtUOLC1qPVJ/naz44yXXMX3qVyj4jcXCpyvu88Pv/C5Xf8aP/Ne+Qap3YUx/8R7yJMGttd/jNosOPsfYKABrLF2/+O58/qb7fLVyQolDp9uNkm2N4+mmtA/JCj/Ta3/Bgm59jvUYhI1n2k/87rndflY/bPsNjcaSYYSwbi6S2L3O5IgwjhzLm1bVF/mz0I/x9U+ik1pr67+shkZDYC9PgpTmpC9Q6zzDiWB4VY2oyx3UMrWnj4fkeEVfc3Nvs4YFzKPTo/zoijpKMuTMQ94GG0NcUB0S/ZcyvScJjulDh8dxuc525SPf9yOg4lVtin1TcSxtLUi0HVPcdpXJH1BGW+bjOaz2SF9mEZXLdQGhwm42MNxaFlrcoTJ1bDe6vVPusotUzXKUmitpz668MwzAMwzCMt7CHJsMwDMMwjD6whybDMAzDMIw+2FNNExyAHp+mXMTrm/lcRnJZ0USpx4FcMw70mraQIqBRE9oLkYwycVoTkya8yOk9i4VcKNZlM/w5nGh7QSQslqffbOiFVSHPQk5UWhHWMOG6dmF3wtNDevK4hM8/CbQwyvV6sri9fvb2cD0eX+UBTl4Z5LQ/zvXL7DGydJn1M1fPXqXy/kOcwBYAQtHXkfBXabXZtynvuF0AkHq+gBurfNzRGfZYevkvv6TqWGtzAvbS3DyVlwb4eh57nP2lAMALd7LSFGu+XJGv6fj0tKqjXOA4uXzma1Tef+wdfMwOJ/cEgFKP4e3tvFF2mlwO2DfZHaORkEkUB/T4bV7l9m2wjARuWGiJfIaW7ArX225xH1bKwitnTetZ3jzBupGLG6ylS/M8XpsVrSNJOhyH698SvlxSG5nPmEe88AYSZVfiTo0bWldTrnCfFllmg+Xz3PblVT0XFXpuCnGyt/pK7z065IUn5vScvsXK6XKoyIFUF271+YL2jPPivpcKnVtezOnVgVFVR2ODNZfSc0neW/JDOrNMXuqPhLdTQ/i7RRneg6nwkHJCxya9rrL0WY0GH8cVeD6LxD0hqx2FYncsbsunyTAMwzAMw7CHJsMwDMMwjL6whybDMAzDMIw+2FNNU+CAfK9WQqwbJhmeQjmxdiuXrL3QMAXSqAhALuD13VB4XGx0uB2tms6PU4j4OPmC9Ifi7SOV0Q6oRPxZ5IWWSOR4K8uccADiuljLFs+9ri0uaaqTJKfCpCIndDahtELxWt8Ronux3DaSz90NUa6IsQOPd48vNFdtbY+DUFyg+Utnqbwwy3nSysP7VR3Nl79C5Zkn2HeoNMjr6M31JVXHaIW1QW5ygtt17RSVV9d0jqTyIGsg0g32ckrbnGcpLOsY2FhmjdfE9Dv5+6WLVJZ5qgDtXTY4dZDKuSLrdTbWtOdUridxrvSF2U1aHeDCbDdQams8bop/oM83H/B4TCsiP1uL54SrGd5WrYQ/e8fTPBYHj7N26EpH/1279gYfd+Yo13n9JLezMawn1tI+4eszK7yflriO4lEdQ/khblu8we3KRdyncUu3I4hZRxOIW9JGjvsnXNPaqqkf7c6j4V/s7VwUBCGqPR5JLZF7Dhk5SDsJa5YS4V0UCdFTWNAa20j4vS0uXhB1sC6olZHzLQq5XvkwkMR8LklL34/SHF/TkaExKq/XVqgcZOhfo2ogthH5U0UevVyB5zcAcDmhaxX337jDc1WWZCnp0Tb728xF9kuTYRiGYRhGH9hDk2EYhmEYRh/YQ5NhGIZhGEYf2EOTYRiGYRhGH+x9wt5WV+TlAhYw5iPdnFSIkNsiA20uFUlUS1p4V4j4OHWRsHdNCPNWO9qULr/MbRsb4zqHhbFbUWv3EIhzCVMud2JpQqfNPislYcwpEkSGJSGcjLSxXSpF6rFIiNgR7cpIPFrKdbfZW+nljeMlPW8EFETft2sbkMxdYDPLxWu8zcAAC2OjCou6AeDKideoHKQslj72PT9M5ZEDM6qO9TkWbIYlPs7AKJuwPfWhd6s6Lp48R+X9R9gQc+IAC7Jdxt9G0jCvOn2MyqlKrqpfBsiLpJixiG+XZzH1ynWd8LNc6o61NEM4vVt4AI2ec3Sj3PZ6rEXLzUExtkKOu0AMtaCqJ4FWh/vs5Nd4p3MiCXBxRo+ufT/M89XsV1nkemFDJC9d1/Pq2KN8nKVhrrO5xPtMTuhrEzoWcV+/yHGWiiGUK2lxfSJejlldEaabZ/n7pn4vAhv/ubtNI8MMdDfx3pPAXSZZj3LamLK1xmakEOaNgYirpKX7Pm7y/FUtDVM5FPe4JMm4D4h7qYtkkmp5bxVurgCSDtdbW2fBeSAMMtOMt70Scf6p6EMX8ZjZqOv7c03M+S2R1LdYEYmwx6dUHfRSmdPz3VvYL02GYRiGYRh9YA9NhmEYhmEYfWAPTYZhGIZhGH2wtwl74ZH2GBFGQifR1suuCJ3QMAW8Ll4UZpZRhizCt0QSRfF9NeLvO0W5tguUYmFk1+S12pZYh67k9fOoC4WWSBhzFkQdzY7uEKl7kkaVTmQndoHWeOXFZU9FhwRirTtSPcbmYC5D77KbJHGMleVuktpEJLisLc+qfYbGWF909B28Br56ghPnzhzXCXsPH+M6BqqsVxif4myjnfqKqmPwMBtiQphGdjp8PctDbH4JAMtvvCy2EbEmEra6VMdi3BHb5Pm4SZv7J8tgryPGREeY4bUW2IjQZchNfK/5X4aJ6m5RHg7wnk/2GGtu8Pkvf1ePvYZIoD04LhKaxlwu79d91hjnCerKn3LS1GvzYj6rZXTa81xHTWTxzg9w8tKhip4DBpusE1lpi74vsZHhldP62ngnTBlLvM3wYf6+eUXX0eiIefU8bzMxzv0xPJJhGOq72/g9Vlg68C8PsdDCxR19zoU8319SEWodMTajjKS/QcjXNBA6oEQklC/IbPAAVpZ1Au1eymUWpcVNbW5ZrUgTTT5uscRjIG7p6xMnwki1wuaVG3Wu8/Qrf63qePPFr1J57CAnCx+e4aTllYkjqo7aWrc/kkSbU7+F/dJkGIZhGIbRB/bQZBiGYRiG0Qf20GQYhmEYhtEHe6xpcvBxzyGFyCEN9PpvriAS5Uovl4Sf+zLXf4XGo5rjffYJUU850u2IhfZEJmaUK8bOaR1BKjUgEIvZoUjUmOp1aGUGIxI3hiEbmUSxfi6uC98PJ66DTGYYZpyLv/WS766TxB2sLVy/WU6FjqBda8hdMDLN6+SPv/tjVJ4vsU5ocmqfqqNSYi3C7LlXqLw4z/1aLOh+U1mpRT+2hWZtfY0T6wLA2JEjVC4Msa6gIDymaj36r7dwQo8ik0UHEbe9VNB+M3WRKLhYHKHy1XOsPRgeP67qGBjoJviUvke7iYuB3PXuOK9v8PhuB1qPlIiL5Ra5vTPfx+V9h/Q8cvY13ubqMNeZH+DY3biyoupo1nifQp7nopzQt2zEerCuiuS6Kkv3EO/TXtUaryBlzZqQm6J2QvRpO2M8iPmp8G5Rp5h3VztaE9Na6p6/TO6623gPJD06xFD4+9QbOml3lOPYSsTYy+fYqy1j+kUidEBOdH4gfg9JU61HKkiftTbfO1Lpm5jqvq/X+Hr5lOtogY8byCABEAmNV7vBXk9Ji2Nv6fJlVcfqOmswC0KXOyS0vy/99Z+oOpL1ro9cY2NFff8W9kuTYRiGYRhGH9hDk2EYhmEYRh/YQ5NhGIZhGEYf7KmmycEh17NA6wNeZwyczkvjEuFHIXJihUIHlc/pdddIrN12hKanlBf5gjLsYlp1cZyI16VDcdg41u0IS/yZ9K2JxbJz4HSiJan7cGJtOxF55DoZ4iOpX4lFDjyZI8+FGXnHevIG7q1LE5AmMTaWujqdVPg0HX3n96t9pI9JTviHLEW8Jh4351QdzZB1UWnCOaSSllivz2sdkPfyoot25VnPMDGtfZqwxvF74BH2JLn8BmuJFi6/qKp49gM/RuXUc505cc3jts73lIiAbXe4D6eOct4839HjG+2Vng0yjNp2iWbd4dS3e8bBPF+XiSd0VAdjfK2Gj/A2A0IGd+FL+ri5x3mf936Cz/nsn3KfnkgyPLaEbtHLfGfCTypLW1ceEn5vwqeqVRdzRMaf125c6OI6wrtuWWgyR3Sfju3jig++i8dQ/gKf2/wJ7dOU9vZ7hi52N/FIEbvuNQuELrU0MiJ3QUuMpUiKSIVut9PW4yYSmkNp9uSEj1O9JvLdASgWB3mfIvd9KHSMaUNrRb3K0SjaIX6XKWfkr1sTfnap0NeVR8eoHIZab+hEFw5MHeXvK6z9HSxPqjrKRx6/+e/c355T37+F/dJkGIZhGIbRB/bQZBiGYRiG0Qf20GQYhmEYhtEH9tBkGIZhGIbRB3trbuk9kHSFYqmQEOcKGc9wIgNvKhVfIkFjM0OWLBMDN6S4coDrGPG6W5IcC+sWl1kAlwZSoK1FralIxhpJM0sh7mvGuo56k/sjEm0N8iwSDZTtJpDmhYA1En1Y5zqaGaL2JOzWu9c+l7lcEZMHHul+IASMSUeLlstDLPxbPH+CykPD01RevXZG1TF1+DkqRyIZciBF904bucnwXV7gRMGVwjCV18HfA0BU5OPMnf4u79Nj/AkA5eqTqo5imZMLB577rNNh0efgoBZwros3GZbm2Ijz0DMfoLLv6BcbclE3jsIow8x1l0jaKZYvds95cj+PiUOHynIXFCp8PdNzPAdceoXH4vUNPTKqTRbkRt/hOpeE0W4H2pSwMsNBNCJMBzs58dJKhsB++RLHbk0Iv9OcME/McFgMNoSpqtgkGuQPco/rdhSX+HyvfkOYrIqXYaJAz0XV/d06pEfnbuPhEfe8wBSKF4RqzVW5CwJxz0pS0U8h96tMzgsAwkMTgbg+gZh7yqVRVUdHvMgROr63JLEwqmyzkSUAlPI8ZhP1YguPo4YwrgS0ED7JsdllIF6OOfjs+1Udr77yDSpXBof5GAPcziCvnxPWe8wtkzTjpZW39r3lN4ZhGIZhGMZNtnxocs7NOOe+6pw74Zx7zTn3c5ufjzrnvuycO7X5f/1upWFsYnFkbBeLIWMnsDgytkM/vzTFAH7Be/8kgA8A+KfOuacAfBrAV7z3jwL4ymbZMG6FxZGxXSyGjJ3A4si4a7bUNHnvZwHMbv573Tl3AsA0gE8A+IHNzT4P4GsAfvF2dbkAiMrd9dxQ+JTF7QxjSmGyF4r1e7lE2ijotchQGD6mQm9UEJqnqKTNsyASHlaH+XmzLRJJyiSDm5VQyQujTinHiqAX6FOx1po4YW4pExg7ratI23ygltDmpEIH5TOSPQY9CV+dNGzMYCfjKIwiDI11TR83ROJYaWQJaI1SscRJbS++/J+ofPx7/74+sNAnVEUdEIk2c6HW6Kyus+6nUOA/ZuuNFSpPHHoEigmOgYsnX6LyoSc+QuWmdE0FUCizRmljntsVhBy/K/Ozqg4n+jkUCVmba8tU9h1tsJfmu+3wMhm3YCdjCEGKtNLVaJQOcX+UJ/Uc4IVJ7uo1HlsLwyKx6EGt4br4LaEfFKfcEQap0gAXANwKb7Mmki8j4UpX21q/0YyEhqkq5tkc15kb07qacIHrGJ7gxo6Oc3z4aa2LW7jMsbm4wG0vCMPj6pD+O793GEqfyCx2NI4A+J57Um2V54hcURvcJkp3K+5P/vbaVyBDByTuC7HQI0WRmKsAeGGIuSGT3ooE5Vl9Gyvtrrg/t9du9zUAbdicCu3jyjU2miyUtd4wL9xXV6+8RuWh0fdQuV7jcwWAarFbb3CbQLojTZNz7giA5wA8D2ByM/jeCkKdFt4wMrA4MraLxZCxE1gcGXdK3w9NzrkqgN8D8PPe+7Wttu/Z72eccy86517c2NDqe+PhYifiqFHXdv7Gw8NOxFAc6zcsjYeLnYijWs3mooeNvh6anHM53Aiu3/Tef2Hz4znn3NTm91MArmft673/jPf+vd7791ar+mc14+Fhp+KoVNY/eRsPBzsVQ1GUsQRvPDTsVBxVKjYXPWxsqWlyzjkAvwHghPf+13u++iKATwH4tc3//34/BwyS7vpts83PbM2M5LKp8LDoiGy6LeEhVMjwtCjnuN58nssDOdYIZOV8XBPPlzmR5LYmdT8ZviaVktCACMlSIOqMMq5OmvA2gUiSKT0/mtAaL2lRkXakzoI3aGd4X+X87fUnkh2NI+fhejQX+SJrTVo17QVy9dTXqfzch3+KysFjH6Ty+MiUqiNfZl1AY4U9lBaFnqFSPabbcZLX2huiG0enDlM56Wg9UpLyL7b7px+j8pLQANQWLuo6rr9M5ZzwRtl/5Gn+vqw1EY06tyMQ2rjl6/NUro5xglAAcM3u+fn09tq4nYwhFwK5ngSy44/wOJkc0r9E1To8DpqTPI88If3OprhPAWAu5gu+3uY6Ooe5n+OOnhOvP8/9vnZeeD/lxJivam3d2IxIPryP29Vc5O9XL+jJyMspT3SZz/Gcuf6Knovqoj+ShLdpQySSHtE6z5G4G3d61tXsaBy5AFFPYu4wzw/jSYaJXdKRc6fw+JN6pUTPtY0azzXlKsdNKHWdGUMrL9o6UuB4bbX4V7Qs76KWSJYu9UlRIPyRlM8ikIoE8bGIiUjcsIbLw6qOyaN8/qtz7MPXPMYJfAs5PSbyPfrp26V97sfc8sMAfgrAK865725+9s9xI7B+1zn30wAuAvix7N0NA4DFkbF9LIaMncDiyLhr+nl77uu49YPXR3e2OcbbFYsjY7tYDBk7gcWRsR3MEdwwDMMwDKMP9jT3nPMOYU+utI7QCCQZC6+dSH7G5eoIl3MZvkROeBcFQvcj15Abdb2GHAvtUFvk6pJ+Kvm89miR4lMnzh8Btz32GVoiodlqC58MF3A5jLUGoJPj85O6qCDldhQytGY+363X33YFeBfwHkGPD0kSs4apNKj1N0ee/D4qV8q8fp8/yvnZchneKNVhoTep8fA59sQ7qXzuDdYNAcBL/5lzJLWELuTwcyepPLhfa6uOPvpuKreF7un6q9+kcpAhP3vqo/+AygOD/JJGKs4/S2+UF/FcqHKcFIXOoraufZoGK90ceF4m1NpNPNCb1m3hNdY4/O0FPW7iDl/vJOZxMzQqPNISrbDxl/liPDXJ/frYx1j3dek17ff2519lHUlH6EjaIu9YKdHTfCHk464v8Pl3znDbB8taW5cTfmGNYb5+Iq0iwkqG15Noe/mgyKUpfekyUoKd/mY37lobW3vG7STOAWGPdqvZEJqslm5wJMSsxYIYewnfO8JA62/KFc4lFwghbtzm6xVEuh1eaFcjkV9VtlPqzQCg1eb7YKXC8at9nPS9RB4nFf5RMu9hmNdz87s//k+ovDzLus5KkdvlpCAPQKXHU2vHfJoMwzAMwzAeVuyhyTAMwzAMow/sockwDMMwDKMP7KHJMAzDMAyjD/ZUCO4d4HuE3UnMorCkoEWP0vx5KGTxaSQEcBmaZURCTJ4kXF5dEwZzHS0mTAMhzgt5n7TNIrlgQDsOF0Xbpe/kRpuPEWecTCQEnJF47k2lKDvIEHFLw7xAiAbFZYhlZmUAUdBth8tyTttFXBAgX+km/xyucCLQqKj7frXNCXuXF1ko2F7mpL/jkwdVHY1l8dJB9P9v701jJMvO88z33Htjj9wzqyprr67e2WSzyZZNUhRFiaJFUR5TGGAwkhfQsDwyBpJHBDSAKNvCeGwNRvNHPwZjeEBABDUwLUEaERJHkkfuaZHmIpHsJnvvZnUt3bXmvkZkbHc58yOzK+J7z6mqqMrMqMzO7wEKlSci7rnnnvPdc2/Eee/7kUCRvoLkK247RqZHRHn5BpnUjUtTydKIW8d6bVV+piCP/+hpmZwy8uirp6el8ebk0QlRvnzxFVFusWIdQIEErMjJ6aRF5/fSzFWnjtH3nLz5t/EY3+0WFgZJ1hWgLs7JtrZX3fQYVRJDn/2wjIeh0zJh88UX3POmQw93TD5Bprk1Kfq9dtEd/5qVn0nJYHDqYdrHWY8xJYnD4zV50o98RBpoRp5EuXNvyHa05mT/FCZk/1RGXEFztSk/M/JxebyzL8hjW3rZfZjA9jzYkvouALuItUDS42AZsxGlL6RpDs/A2/AcfueEvZaO29KcXCj4HmyQY26tLEdkVhtygnIAqWO+Sg9L0LXW4z2NZpPMWQvyom/pwaTa2qxTR3VYxk2V5tFOk+bZgmu0G/Zcn9motxf9pUlRFEVRFKUP9KZJURRFURSlD/SmSVEURVEUpQ8Ga24JwPSspecKci234Ek8PkFri8MlSmZISW6bLVfAkaZyrd2S4dZGzOZarn4jSWXjSqHcT470HJ2WJ8kiLZOGZMRZyJO5mPVoqyyvZct2kFcc8olrSNak42ttSKNHS3Xk+AUA7Z7dejw4d5UsS7BR7yaDzWh8R3InnG2KQ2OinNakZqNFRqOxdde0A+pLNmFrLcuk6Pm8qwF46if+a1F+7s/+oyhPUsLeqTOHnToay5dFuUj6hrmGNMg8fVJqnABgce51UW43pS5qaGRKlPNF16y1E8v+iMg0NqLzbOiINBAFgPmZrgNiHHucC3eJfMHgxNlue5vzZIAbufrKqbNSkxOt0jn/LVkeT90To/yYjFVWTr36sjznf/gNN/l0YVq2rTAm2z6dl/PZiWkShgJY3JB1zMzIdi1eIX1ayz0fGkUaL0rAXlokbdWIO5/lTsn9Vo2ci66Txqtt3e/5AbrHMlh1JZDZDK121+AxpjnCZ5JIMh8kmTy3cpHsg8yT9Tema4Mhd+WIktD7zi2OTjawpUsrHJ9KAJXKKLWDEsoHsk5O8AsAAV1LLc3nhoRQQ1U5lwNA29ZFmQ1Ci0NSbwiP8WyuJ8kxH4do7y3fURRFURRFUW6iN02KoiiKoih9oDdNiqIoiqIofTBQTRMAmB7foGJR6n6sxxvB0ppwh9bN05iSz4aeVW3SWjQT8pKI5TprIJeUN6sgjVK7JesoDsv9liL3fjQH8kNK5I7amdxH4vGtIWsgBJFsR7Ml17+bHs+pJJP7NeQTwomUg4rbDuELMmAhQRCEKJW7Gpzy6KR4P4td/Q04kWQm+y0fSs+hTiITUQJANaIkmeRT1KF18lpNapwAoF1fEeUy+d+0lq6LctO1E0EpJ/V17dVlUZ4+/pQojx0969RhjDy+w6cfFeX5G2+LcuAxWMmXyE+lI0UPly/8UJTnrstjA4DScPcA447b57uFAVDqidvRY3IcRo6627CWaGlJblOgmJk44jl/G/L8fOFFWWdznXyIhl09yzjNgc1JOQ5JTW5zTVpuAQBmzsuTtlkkHWdZ7qM27wpasrqMiVxZfiZoyPLshusVlK2SBmiNPPUouXg47PZpY7nb9syTWHpXMQa2R0galOS5mcWuhiejOCnk5XwcdzhJsauPtZaueySUKlXl3MSecgAQ0PXFkseUJS1VFLnjVyBPPNZOpZxwOXGPpVSR8RuTf1SYI1+ytqvzM7Sf+rrMFj00In3oMuNJZF/s9hH7XPWivzQpiqIoiqL0gd40KYqiKIqi9IHeNCmKoiiKovTBYHPPAehNR2XIKcKnmyiQWYSNyHOJ/JHi2JMzhpOpQa7V5obk+mbBeHLgkW1DbMhLgtadO4lrOlWqcttofZe8gbLEHZ40onXnDfJcIj1SR9oRAQByZNsSF+Q2EeUgMtbNGWWF/mqwOoIkbmFx5sLN8hRpi+YufM/ZpjJ8SJTri4uiXKX8beWK/DwAdGitvbUq9Untjhyba+efd+oYOv6kKD/0/k+I8sxrfybKT3z4f3bqyIXkM0beNZXDsu1Th6XmCwCuvCnbVqf8T6WqFFOtUW4+ADAFGa/Li3OivHTtkihfvijz/wHA05/5xzf/DvLnnPd3C5tatDe645Wvyjmg1XF9Wub+s5w38pY8hh6R28y6Ei7U3mSfOcq9Nk16vJrHZ42kco012fZGIuOjeMQ9Pzeo7fmIPOOsnL+CU247woJ8LZ8nn6ZpyovZ8mgNZ6SeJ0nkZ6ZOkv+Qa8GGue922xHMD3YuslmGuNPjEUQ6IePRzpSrUl+TsoaHdLwmdGPRGHlt6PWqAoAoT+Nn3H4xdG3l63FKGluTeTynSPfEafO4PzhnHgDETfJ7I8NGPlaPhR7CUPbz6MRpUW62V2U7OVEogMj2d03TX5oURVEURVH6QG+aFEVRFEVR+kBvmhRFURRFUfpAb5oURVEURVH6YMBCcIsk6IqtIjKiLLAwGoA1UoQckCmhTShxYc41g2PTrnxVfibp0D5CV7xHHl6IyUwrJuFoy5Owt9aQCrYOJQUNOElgwa0DZFaZkag9zGTZeJL+plwtCfxi6lPrdgeyHlNNe5vkhrtBmsRYW+yal+UK0nTS45+GqcOPiHI+kMLvpEnmfpF8HwBW18hUjfYzc/ElUT7hSZRbGJbJJttGxsShH/0nonx4dNSpw1Ki4HY4K8ovf+MPRfnxD3/aqSNXkQl5E3rooEUmnLWaaygX19m4jmItoGSrHuPBUqnbz77kprtF0gaWz3fPFWPlebN8yW1rh8S0o7ILES3ReZO4c9HwuOyzo6PymIuj8vNvzrrtWLsoA68ey/2Uj8iYahfcfjU5fsBGjpUls8QCZwIH0F4kA8wmmSUuksHiIVfBmx2S513jstxmfUbGXWPRfSilY7tPtth08L8D2J45Nowogbpnbuy05dM5QUSGmCTI5oS1AGDoYZ18UfYb65jLZdclt7a+IMqWRNsBmVm2PeazKSXGBR1vQpPxyKj7UMr6unzIJJeneaMj45sTpQNktgwgKFDSY36OwXPJasU9Jqme6+bNum/5jqIoiqIoinITvWlSFEVRFEXpA71pUhRFURRF6QNjb7N2t+M7M2YBwGUAkwAW7/DxvYC2sz9OWWun7vyxnUHjaNe43+0cWBxpDO0q97OtOhfdHm1nf9wyjgZ603Rzp8Y8b619euA7vku0nXub/XLc2s69y3455v3STmB/tXWn2C/HrO3cPro8pyiKoiiK0gd606QoiqIoitIH9+um6Qv3ab93i7Zzb7NfjlvbuXfZL8e8X9oJ7K+27hT75Zi1ndvkvmiaFEVRFEVR9hu6PKcoiqIoitIHA71pMsZ8yhhzzhhzwRjz+UHu+04YY75ojJk3xrza89q4MeYZY8z5rf/HblfHIDDGnDDGfM0Y84Yx5jVjzK/u1bbuFhpH227jgY8hYO/G0X6Ioa02Hfg42qsxBGgc7RYDu2kyxoQA/h2AnwHwOIBfMMY8Pqj998GXAHyKXvs8gGettQ8BeHarfL9JAPyatfYxAB8C8Mtb/bgX27rjaBztCAc6hoA9H0dfwt6PIeCAx9EejyFA42h3sNYO5B+ADwP4y57ybwD4jUHtv882ngbwak/5HIDprb+nAZzro45fAfA8gDaALw2gzX8K4JP30tb9+O+gxNHWZx8C0ALwHzSGDlYc7dBc9PWt+Klv/dvV8TxocbTXY2gn4ghAAcDvYtPAswbgBQA/c5DjaJDLc8cAXO0pX9t6bS9z2Fo7AwBb/x/qY5sbAH4LwBd3s2EAYIw5DeApAN/FvbV1P3JQ4gjY/Bb73K61Cgc2hoD9F0f3Oja/Yq2tbv17ZLcad0DjaL/FEHD3YxNh8xh/HMAIgN8E8Idb473j7Ic4GuRNk/G89q57dM9a+xVr7Z8AWNrN/RhjqgD+GMDnrLXru7mvPcaBiCNjzM8DWMXmz9K7tY+DGkPAAYmjQXCA4+hdH0PW2g1r7b+21r5trc2stX8G4C0AH9zpfe2XOBrkTdM1ACd6ysex+avMXmbOGDMNAFv/z9/n9gAAjDE5bAbXl621X9l6eU+2dRd418eRMWYYwL8B8Gu71aADHkPA/oujex2b/9UYs2iM+bYx5uM73agDHkf7LYaAbY6NMeYwgIcBvLaTjdpPcTTIm6bnADxkjDljjMkD+HkAXx3g/u+FrwL47Nbfn8XmWut9xRhjsLnG/Ia19nd63tpzbd0lDkIc/VsAv2utvXqHz90TGkMA9l8c3cvY/DqAB7C5ZPQFAP+PMebsTjVI42jfxRCwjbHZurH5MoDfs9b+cKcatO/iaJACKgCfBvAmgIsA/uX9FnRR234fwAyAGJvfIH4RwAQ2l0fOb/0/fhf1/RZ2QQgO4KPY/An4ZQAvbv379Hbaut/+vZvjCMD7sfktLr9V/tfYYSG4xtDejqOdnot66v1/AfxzjaN3fwztdBxh8weWPwDwFwByO9zOfRVH6gi+SxhjfgvAcWvtP77fbVH2D8aYzwH4X7D5pAoAVAGE2PwW9oH71S5l/2OM+U8A/pO19n+/321R9g9bvwR9EZtP4n3aWtu8vy26v6gj+A5jjImMMUVsXuhCY0zRGBPd73Yp+4YvADiLzV+c3g/g/wTw5wB++v41SdlvGGNGjTE//c78Y4z5BwA+BuAv73fblH3HvwfwGID/6qDfMAF607Qb/CsATWwacf3Drb//1X1tkbJvsNY2rLWz7/zDpr9Oy1q7cL/bpuwrctiUCCwAWATwzwH8nLX23H1tlbKvMMacAvDPsPkFbtYYU9/69w/ub8vuH7o8pyiKoiiK0gf6S5OiKIqiKEof6E2ToiiKoihKH+hNk6IoiqIoSh9s66bJGPMpY8w5Y8wFY8zeyECs7Ds0jpTtojGk7AQaR8qduGchuDEmxKap1yexaZz1HIBfsNa+vnPNU97taBwp20VjSNkJNI6UftiOf9DfAnDBWnsJAIwxfwDgMwBuGWDDQ1V7aGLiNlXe+QaOMyRu+m71lAP3xzNj5GuW9mMCWUcSx04d+XxZlNutjdvv13MzyvvJMvmZMAypCreONEtu+5l8vijKSeoeSy5XkO2wKdWZgV5w6ujt97n5Jayt1XzJK/vhruOoWq3aiYnxm+UwlLvmMgAEAceA/EyrJfsggOxnADCBHJ+M+slmss6+vo5Q31I4w4RuPPNw8HAFAdfp1sGxx/0R0LH6sJncMe83ivhg3DqSuNvvS4vLqNXq9xJHdx1DYZS3Yc+5Ymm4A8/MmMkQQRTJfs2VZDluuxGQxDx4VCeNd+CJZUMLBKE85UHDAt9IhjlZb3OD9tOWxdHjnjikdsQtueOYGpI2qWEAckWav9t0Lpfk59PY0x+mW2+9VkO71RzYXFSuVO3oaHcuatZXxPthlPO0l8YvlxdlPr+z1J2Lkk6L6qTzl64lziTh2SbKybbmi7Lzk8S9lhjaT5bKk2RjfVXuw3NilYZGZB0UN1kqy522axXF8ybX4c5n7rkZ9YzD+noNzaY/jrZz03QMQG9urGsA/vbtNjg0MYHf+c2eXzyd2d93mZGDwBNxGMqBLlYqTg1BKIMyhRz8XFG+vzA/59Rx8uSTonzhze/J/ZbkfpPEDfR8Ud6sNJpy8IeHZfAkCc3SAOobS6Lc6cjZ7djJR0R5cWXGqePoiQdEeaO5Jspp0hFl6zlpo6gbOv/D5/6N8/5dcNdxNDExjs//i1+/WR4ekifE2GiBN0GhJF9LyG/0zXMyqXYZcvIDgJDGuJ3Ivm816cbME84ZTZhZLOvI0UWzNEJXDQBturDEcrhQKtE5E8ob/s22yo3STPZhoTwkynyhBoC4LSfuUkHWOT4l6wz5JgrAwlz95t+/9T/9b877fXLXMRTmizjyYPcjrVX5fmncPfc6K7IPJqbk2Ew/Ie9erl12A2DpqhxvQ9ehqTFZZ2nEvejmjPzM2MPy/XpdxvaYcS+Y1Wn5mdeep3Pmgix+5t/SnRmAhOLq2hsyHmY3aqK89pp7sZt+WO43vCT7eOwJ2c61OfcWMMw1bv79l1/5I+f9u+Cu42h0dBz/7L//H2+WX/rW/y3eHzt0zNkmoJukkanTosw3Cesrcs4HgOWZ86IchrKfhqvy/E0tTRJwb/onj0yL8snH3yfKS7PXnTqKo2Oi3FiT15K/+c8yFd94VX4eAN778Z8V5WZdxlGj3hDl65dedurgL8WNZl2Uq9VhUU75GxCAqelu7uU/+P0/dN6/ua9bvnNnfHdhzixhjPklY8zzxpjn12t1zybKAeeu46he1zhSBHcdQ5nnW7Ny4LnrOGps6Fx00NjOL03XAJzoKR8HcIM/ZK39AjZTQ+DsyRO21ereReZzd959jn4ybNMvK4WifN+3nGFy8ttJfV3euSd1eWfPyzAAMD93kfYrvyENj8g72czzKwPf3cb8C05Ad7+B+wtPqSy/ZZ4684Tcr5E7PlKQvyoBQEwXjFxeHktAdXT4pwwA6yvdbxRp6t613wV3HUenTp2ysN1xpuEF/zINACmFRdah5QmaLkd8sZmTx5l26KfpjMfT83M2zcuGfik1BRmLuZz8lgUASVtu0+ElHvrWFYXuLw0Wso5oSG6Tf6/81TM45P5aFb9ASxHn5S+0ZoR+4Y3ceLa9S9b8G3v/3HUMFapDNhrqtidYlf3Rqrm/8OUn6VdCK2Pk6nfl8Zlxt9+jKi3R07JYQmFnW+4vTflTtFxRoji8TMuG75XjAADLb8jXHv9x2fbZB2jp+bzbjtHH5Gs1CpGr35HzxsQhdx6ZGqZl4uPyWCZGZXlk3J1YK51uO76ev+cYAu4hjibGRu35F/+/m+8V6RfauO2ev9mG/DWmti7LD3/g78oNwqpTR23pmigb+lmbb+ZCniQB8Kr9+sqyKPNKR7Eir3EAUCzJ82T+kjScN21a551w59W3XpOrNu/9yb8vynFL/kK5On/ZqWNtmVaHEo41ebCnH3iPU4cpdK+DQejGu7+mu+M5AA8ZY84YY/IAfh7AV++wjaIwGkfKdtEYUnYCjSPljtzzL03W2sQY8yvYTAAZAviitfa1HWuZciDQOFK2i8aQshNoHCn9sJ3lOVhr/wLAX+xQW5QDisaRsl00hpSdQONIuRPbumm6W4wx4qmrgB7HTDzamYQeHTSRXJtNSTzUIOX95jbytTThdXHSFfieFiO7gLFJ+aRBc0M+fWX5sRgAcVseyzAp+llbBI99Aj8WWqstiPIalccmDzt1ZJmsd3TsiCjPrck1Y9+j06F4kHlbOoJ7wML2WAIYejrSeB6vdWAhED3FFnr0N6y5CWg/AT3pmWbu+GX0bLsh3UBib69XAgBL2qmQHyonAVfmiSOQPcJUgTQupL0Zy9ynp55vShHLhRnZrvJpacsRddzpJuvRKLKFwW6SJQEa891jbpMmZMQTQ0en5fm52pL9Wq/Lc74qDx8AEFg6VyjOWqSTO/Sgp0/oSan4LTl2h0/Kj3euumNXW6F59ftSmzL5qNzHskcriguyz1Ky6aiRBcGVq66uZoae9MMNOVePLchtDh9y61hIu+2ou5eQXSUIQ5R7HplPSSjUarhP4Y4ckgNUW5Kyqbm3nhdltjEAgEpFnnsxzTWN+qIo55xrHjA+MSnbUZda35e+/YwoH5mmwAIwWTgjysceflSUbSxj4sXnvu7UMTX1EVHOGrIdmZXHZjya1XaDnn4eGhXlHN03XDr/olPHw098uLsPdxc30TQqiqIoiqIofaA3TYqiKIqiKH2gN02KoiiKoih9oDdNiqIoiqIofTBQITgg8+7EnhxvTIfSkXC+nJTejzuucHJxWQrtyhVpQDY+OS7KWeDJF0QGgaurUmhXoJxv+chN59KhXA3rq9KQK6C8PKWqayaWQSodO2RUGUVSFLq65KaEMWRsmLZlneyWPDIiBYMA0Kx1DdkCT26zXcUYoNAV9hnqt8y4wteQDEtjSqUTsrGoufOpYXgTeljAWNf003B+OidloWznhkcJzjkKAzonmhsknCx4DF9jeqBidFSUa0WZIzKOXYPE638iz4GFEXmOHKZjyfvyyqSDfohgCwtkcbdf8iQuzVXcVDwdSl+T5wcQyFhxwzHYA2xTxlVKsdpO5Lyxet1VvY6clHW0yzKWf/iWrCNadsfuxBkZE4fOyjlh9ocydlciMikEcPQpOZ6L12U7zDQZU665Y11gV9kx2s+KfL8Qu+flE+/r9uFLt/Yk3BWCMEJ5uJsa5PjZD4r3Wx2331779h+LclQeFeV1ul7x3AUAnUCOaXVY1tFsSKPKjicWN+rSVBN06YybZMyZ86RSashUOVFejs+RM1Io/iNV1zSW08a8+YIUoJ996hOyGXyyAiiV5HnED4h1yCDTpm5/XHr1Ozf/bjc9T3Fsob80KYqiKIqi9IHeNCmKoiiKovSB3jQpiqIoiqL0wcA1TbYnaXRApnvWTSgNS0aTLVqbzBfkWmYx767fHzl0SpQzMvpK23L9ng00AaBek2vEuYJMothsSVO2OHDX70Ny5eJkrZwgsdVwM2jHZGxoqA9Z0RUYd5G/RUkUW61ZUebEwtznABD0aHOyAZoSvoPoSWovPFqiMJN9T7lWUSDdwEbbNUmtjkhDOWtIr5CRiarn9LIkYgoo5C1prVKPyWIIqbcxhuNIVporuLqKFtUxnco6zpD2wJeU+ZvLUhMxMsSxKfeRJO45kfSMnU/ytJuEPc0Jy/L4K0fc86Y6Ice/RccTDNH4t9zvpJY0LqMjMu5On7b0vtspqwsyJuav0XhTO37yY67G7/3vl/NXQnqVi1VpFvjCOTeGam9TcvD3yLn3xFWKh2H3WObKMq4uPifruNGQuprrK+758J4z3T7spIMNImszdOJuf9eX5Vw6dMw1hGw1pF4mR9e9XE6Olym6+tihyph8gbqlSNen/JA7FyVW6nomDx0V5dKo1P7mPCdoQtqfQl4m+gbp/M48LhPMA8Cll14Q5cWZ66J85EFp2PzUJz/r1PHCs38kymsz0qC53SKNkschc+TQoZt/h9HuJOxVFEVRFEU5MOhNk6IoiqIoSh/oTZOiKIqiKEofDFTTZLG5BvwOHfJpShI3SaqzvktaDEuJCn3eT0MVub67XJNrpovX5ZrpqTMPOXUU83J9t0Wal0pFrjuXKq6OoLEuNUokT0IhT5oZzz1tTLqZAiVarVHiwiRxtQispQrI28l2KIlsx9WzBD0pDe2AxSgGQNTTN6Gh5KOhq50xJGJKSTuUpeQx41nTtqSVSskzhrcpGrdfOqR1SymhJchfJAjdODKkgbCZbHtQoP7weE4Z0gpOTso1/zCS/itrHr+o+rjc79EH5LFRbmkksRtHohkDDCObGbTrXV3D6Kjso0MPutscJq3jyoY8t9bq8nxdWnC9YAptOX9Nnpbje/gR8mlyZY24+qLcb5MS4z4+ITvyEXc6w1BRjn80LueAN69xzLjn1I0Firvzcv5qFqQuLuc5HyzJJTs013TWZDsrI66mqXG126eZL8P1LpImMWpLMzfLpx9/WrzPcy0AfPjn/qkoX3rpm6I8e/1tUS56ku2ubMjzM6STLY5l7JVLrj9SqybryGibl7/zV6L8tz72d5w6iiU55mlH1tFoyn2U8u581mxIbeQDTzwpyiYn2/7mD5516mDPqY2mPHFC0v4Wyq5OzBZ79Fgeb6ybb93yHUVRFEVRFOUmetOkKIqiKIrSB3rTpCiKoiiK0geD1TRZi3bPmmdA2pMwctfNOx3p08Eap1x4Z6+nNnmjlKtSn3SK8vZkmdstOVozjgLKeUdaqnTd1W9Y8mHqtFl/JY+lk3i0RNRnzYY8trglt4k9viVhJNueL8rjTciTJ/LZMAX3937b2G4/BHzv7/GNsoFca08S0v1Q7BXyrk9TYKTuIyb/I9shLyjHNQvIMiniMJy3j/LIOR5UACz7iIXyM45tlXW1NcWC3M/KC1J7kH9THusCJ8kD8JGfkHE0VZaxViCt20bo1tHuiefMPf13jTC0GOrRx4wNkY7vnLvN+mOyPHtDai3qN8gzre2OXYn0d8eGSQdG5/fSqnv+putyPE+ekOfv5WWpm/r6X7k6z9MfkGO39Lzc7+svy/3OX3XH7oOPyDnxfT8i27FOlnmLL7rnw9i41NItUPzXvi7rDK2rEbrxVnebuD3AIMKmRjfpdOeKjdqKeH9i/Ii7EeUb7PV5AoAoksfssfyDoXMpyzhO5EYNj+efpXlyaWlelE88+Lis0dMO9j+KIWO+WJTnyOrqklPH5LT0UQzJY2r12iVRvn7BPTmDgtRW5akONrLKPDrcfI/einPcin3d8h1FURRFURTlJnrTpCiKoiiK0gd606QoiqIoitIHetOkKIqiKIrSB4NN2GuAIOzuMsukoDH0tCYEi8Xl+xkoKaTHhI2NrqKcrCRicXXTFc2ldSlwK5Wl8Ix1Y4FH9FooSUOtiEwHWTicz7nHkpHQPSUBYBRJEShYaAwgI5O52roU85UoCbIrMoR05hy0uaUFgp5kqUEgxybwPFBAKX6RhmRuOUvCysepHwEkDVlHEMrx4iTNmau/Bfv7pWxUSSLvgud7TUgVZ5zAN7T0vkeQTgH7ciIfuCg35DbWun06QXr0oZwUX7JAv2NcYfRKo1tvOsC8z0EAVMrdHYZ52dak6TZmeV0KdrMKi0ulyD+Ba5DXjuR+5udlHSvURfNzrjltrixfO1aQdc5Rwt6RCXfsFtbk3Ht+gZJ4r8t59eQjbhweJuF/vi2PP27SgxGLrnlxpy4/E78q21qi/K8Tx9y5Jr7c7bTQY6C5mwRBKB4sqi9dE++niftASZiX14HhsUlRXl2Wgux2x70ehaEUWJeq46IchbKv22R6vFkHPfxC8/6Js/LJh3Zj1a2D5q+xo9OibMnscm150amjOikTBbfoYaaF65fpfTeB/NGjD4jySib7sNOhZNqeB2wKPQ97qRBcURRFURRlm+hNk6IoiqIoSh/oTZOiKIqiKEofDNbcMsvQ6XRN9EIy8coyVwPARl+JlWu1aSzXVHOeRKthxKaDktXVZVE2gbsubsAmmnJNNIw4YaIraClSskLWPbXbdGzWXXcNSY/lJuQlzZPHIJON0fJ5qYnp0Dp0Ie/2aalHbGBuk9xwN7CBhS1017VTI9vHxwcAaSr7rZTKNetOSfZjuuEeU5iX2yQbFBOJHHOPDAiW2hrReHEiXZN3tTWsYwOZVxrSeNnM1Wdxf4D0RhuprJP1WwBgYhbyUZnO3dBj+DrSY7A3yCiyoUE60nVfTKbk3pcuewxSX6Rzeoj0lpBujmHozgEpSVzaZJg6TsNSTN1zb31dvvZKW7b9+HtkDK2V3WNZeEW2rbYmY/m9D8ttHv1xd3Tql6Wu5oeXZcxcfEMe7PKMq2ky5EFYs1JbV8rLOjPP1/z4WPdve3HACXvTRBg2Tp18RLyfdFxNU64yLMpzb50XZUOanVxRmjFvfkgGSos0S6G5/RwPuNrHXE7G4tK1t0XZWnf8FhelhuvxioyJPOl4E49TZ31dJtstDR8S5aAo9cOFknte1ddWRTluU7+T7jafd299rpx7/ubfnVbDef9me275jqIoiqIoinITvWlSFEVRFEXpA71pUhRFURRF6YOBapqCIECp1F2fzWiN1Jdsl32GDHnOhORlFCfuemdkyF+H1oPLZblmzAlrN5sh2xaTx1TckPs1ngSn7abUzYyPSm+NoWHyR/L46ywuy4SHTVp7zRfl2nUYepQi1LSUEjdGpM9KEndcGs2uNi3zeF7sKtbAxt31d2PlWnzQ8eiAKtKLyq7KGOiE8phzvjOjI/shyJFPD6tyPKImYymx8x2UPFHs9j3r2iw4vuWxBNbn0yRfY/2cIc2XR+YH6nYglbGXUdxkBU87Kj2fGeBXuDAPjJzpHmO7IY+/1vR4CtXk+Rs1SEsXSe1FxekgoDgu+6DakWN59r2yzvqS69O0LiWY2KjIjpudkf2+OutUAbSk5mNySMZQpyPrvPhHriYmOiO3KR6W+03I6yl/yO3ToES6t0SWRyqjolwpuP2RLnXrNb5ryC4SBCEq5a6+k33yOpnrKZS2ZD8ce/iDojxz7kVR9ky/jmYpIS1kviS1Ra0NmZAbAKoj8rrXoWvnMF07RqdPO3UY0gZdvSiT6Z6kpL+FnGwXAFQPSZ+mjWXZ1smjMqHvWjDn1NHakPN7RscSksHjRt31viqIa+et40h/aVIURVEURekDvWlSFEVRFEXpgzveNBljvmiMmTfGvNrz2rgx5hljzPmt/8d2t5nKfkfjSNkuGkPKTqBxpGyHfjRNXwLwfwD4v3pe+zyAZ621v22M+fxW+dfvXJURSdpCyPV73ypiPic/wzlkWPM0NCR9IQCgTTmR0oz8kCiXl/X4IyWkLYkpUVaedEBB4N6PBpQXb219RZQ5Jx7nmQOAUlnqnliLkpEvk8+zKOMkX5w7jvrUZq4WQbzUn4zgS9ipOLKAkHuxlCh0tSTIZN+n5AeTo7xY5mFXGxcsUL2kFXLyD3q0RClpiSLq+9TSwUQefyTaxloZexnneLPusWQZ+f9YqRVhP5wsdDUtAefNK9B+SOtmY6kDBIC45zXr6S/iS9ihGDLWIGh3+yA+T/n8yrwFEFOnJKSdKxmpxZg+5VZiKD/fqadlTFWOyjgMOu65NzoqXzvzU7JfU/JPqpXd+SwgXVSHfLhW5mUdo6fdsTvypAz4VfItmzwkt2nl3Thcv0p+OGVZB9vuzc+6vlUr17v9EbuSJx9fwo5d0yB+emg35Jx+/pXnnI/nyNfuo//tb4qyieQcf+H7zzh1VMi7KCrI6x57uQU59zpQJ3FceVTeJz7w1CdE+fJLf+XUMXXkpChvbEjPpQZph4YOHXbqGJmUvkyLb10R5fUZ6QW1tiL7GHA1XnxJajblPcDRU086dSwuXOrZfhu556y13wBApxg+A+D3tv7+PQA/d6d6lIONxpGyXTSGlJ1A40jZDveqaTpsrZ0BgK3/D93h84riQ+NI2S4aQ8pOoHGk9MWuC8GNMb9kjHneGPP8uucxP0Xph944qmscKfdAbwzF7f7WcRSF6Y2jdttdtlTe3dzrTdOcMWYaALb+n7/VB621X7DWPm2tfXq4Wr3Vx5SDyT3FUVXjSOlyTzGUK7gaLeVAc09xVCh49JPKu5p7Nbf8KoDPAvjtrf//tJ+NrM2E8DMXsbGfqyiOSWzJQudcJAVbLG4DAEMKXS7nSDicGc+9JIlpk0x+U2VDzDDzGPlROQxlO1r0rSXnSbLY6dB+2LySji3uuN+EAtqmTckNK+VRUeZEtJuv9R7NPRvK3VMcwVigR1AdUILaNHSPOU9Gg3Eqx5gluwE8SW7JJJXHzySUXJQF9gBCEhOn9JGAhN8+60uTsOJcjk9AQn8DTxJrEounPIZGxoT1JGUOyPEy4wc76DwqWrcd1Vb3WILs1uLL23BPMZR1AjSudGNijc7f5qKbsDOkhOJsAjsUSfH06SPu8eYoMfDEcTl2s8uyjus1t08Wm/K1/HOyzsNH5LgU+MEPAHFLblOZknWWyWRy+IznYRB6yKRICZnDvGzH0pzbjuVluU0Uy89YEpc3V9xzO+0VOfPTGP1zT3FkjEHU87DS2yT8Dj2/S4xMHRPl1asvifLYkTOifPZ9P+nU8dbrfy3KpSIZ3NLp3EndfqsOS+H3+z70d0X52nnZrkbTreNwWSYfbpPg2uRku9567UWnjrdfeVm+UJBfiq9ceF2U80X3AYsibVMqyXKlIufzXNVdfT1a7G6Tz7sC/nfox3Lg9wH8DYBHjDHXjDG/iM3A+qQx5jyAT26VFeWWaBwp20VjSNkJNI6U7XDHX5qstb9wi7c+cYvXFcVB40jZLhpDyk6gcaRsB3UEVxRFURRF6YOBJ+wtlrrGXWlyZxM+NqLM5aTxl3WM/tz9GjKqCkI21aT3PcZWSVu2NU8GZJy0lvUuAGBJWxAnvMZPRoekNQKAPAlY85QwMY5lOxLPGj9rugr5Ir0v22E899ZhFPS8f886gm3QbWNIpoh5T3stHRPrk1ZC+f5xNpkEME9JmE0iYzPMkSjUoyVJEqmFs5Q82oDOicA9Rdl4Egm1i4woM49ppGtYSu2ghL2h51gC0gKWAnlepSTYalpXF9PsicU7WlvuIEGYYmi8+xTmovTkQ7Lh9vv4kByboY9RH70i32/z/AYgkacaXnlblhuX5DatzJ0DOEF1a01qTTqHKA6vucdSlTlQMRbJbTrU9jevOlWgeINieVGO4NtzcrybdXdybvF8NUN6PEpiPvqoqzXMv9Gtd8aTJHs3CaMIwz2J16dPP0yfcPt+Ye6yKM/PviXKDx97VJTfXplx6jCkSWzUV0V5dFgmgw8jt9+Wl2Ti27fPfV+U01jqk65ees2po0PiqTMPPyHKq/PSmLJYmXTqCMmYkzW3GRlcR3QPsLkNJZmnBMY8aRYizzXemVj96C9NiqIoiqIofaA3TYqiKIqiKH2gN02KoiiKoih9MFBNk4VMynmYkv01N2pgGo1VUQ5JN5HEUgdVqboeDs2GXHuPaP0zJm0KAne9MyL9RoUMFjfIpdpmrp6hWJZrt4njfyTXh9utJhhL/k9BxN5BckgLHq+nlDxp2Cuo05I6CifBL4BOj94q83hS7SYGQO+SdEYeQh3j6pFCWntPSV8zRoqaNdYWAchRcuRGQPoL2m3gqSNjLyLSThnyNgo8OqCU3JtYKWJB42dcLUlK6/dBjvyhijLercdDydWJyTpzkG1v8XkGYLHHmyzxCRJ3CZsCyUr3mKKOnBNCT79v0AAn3yEtIPk42ZLr03QqlNuUSTs1t7YuynHR7fdqgbzY2INsmZLewjVgrBRl2/JlebxToYyh9ozbjsv0Ur1JLuuR9LpqeZIgJ+vkL0Rf46MceVJ5PPQqJ3uSwF9x3t5VrM3QSbvHPTEiNTuhR++5QlqifE7G/caK9NUMsjtrffM0B7aa8nrEmh8AKJWGRPntcz8Q5QJph4zndmF9Rh7LbCgH+erFF0X5R37q7zt1BAW5zaWXvyvK00cfFOWVRVfjxd50Eet0SdM1P3vBqaNc7vpW3e6apr80KYqiKIqi9IHeNCmKoiiKovSB3jQpiqIoiqL0wUA1TQZA0HOf1iHNTuDJb8V2C2xbk8vJF/I5d+E8jclPxcl5J2l78rWF5G3UJt1PSv47xpM1jPPmdUgDYElXE3jW71nTxNnJOpS9PZd3PS0Y3g9rVcLQbUcSd/czOCXKOxjYnjblqP3Gsxwd0WeaTdLjFMnHw+P3skJ+SFEog5O1Q9bjsQQjtwloP8W8jD32XAIA26L1+4i8zIalhqXuplGDIQ+WPPmWhJRHLs3cY8mH5E1G8UtpxBCxYAVAPuse30D9vsIAdqjbT/VrspNM4M4BSUeeSwlJDktF0oWNuH0WUQzNz8r9rN+Q+pWjT3j0lYdlnMXfl5/5wENyv0ePOlXg/JycJ5rkK/e11+WxNJfc/ihU5X4qk6SvnJCxG6y62pzwMOUSXZLvj9D89YEPSl0oALyx3O0P84PB/g4QBCHK5a42qEL53Jorbi7U4w9KL6Pn/vzLonzpNZnzrVB054CABZTkxZbEcrwC35xIuROrlXH6BPsbutq4uCXj6PwbL4hyqSTHKzZuHRFJP2cvvynKlYrMb4fMveKwF12Hjj8fyP22m65+Op/r6WePt9076C9NiqIoiqIofaA3TYqiKIqiKH2gN02KoiiKoih9oDdNiqIoiqIofTBQIThgSMDGiWFd0eNQdUSU222pvpxfuC7K42OHnDpYNkbejkj7SLab8UZ0v7m4IA238pE0vwSA4WEpaHOS/EZkOOgRzrL/H7eU32cjS99neDeWxMk+z8Fc2BX4sSHjbmMMILTpISd+do0JLZmitmL6DAmwQ88xZyS+5KS2oLixqXt6BUa2IxdKwWGREjCngduQdpPihlSeedJaRnU3njtkgmrY/I4NMY0rBA7YNJHNHanPberWUcp3zRwDjwnnbtFpprjyxkbPvmXboinP1Ehhng+lCLbSksd7yHPujXZk3C0V5WfGjkix9FDdPbdMhebNp+X4Lo3LOTJZ9BjcLsm2vnaVHgTIy/dHhtxjOfKgfK05Ksf/xvep7dK3EwBQrEqhd4GeW6kelXUsz7jHMtXzEEc04N8BkjjG4lx37j/1mOy3Tt41lUw6cownTzwgyq2aVMMfPv2kU0dMPqLXLj0vyoWCvP50HCNl9yEhNlu2JIbm6wIAhJRwvELJdxOaZzcWZ506SiNTovzQ+z4qyudelWaXbrJx9zoY0PzGF7F85I5Ls9HN2s3XZlH3Ld9RFEVRFEVRbqI3TYqiKIqiKH2gN02KoiiKoih9MFhzS2MQ9egc4qZcew9D1xCy3ZYmkgElcAzItCpOXFMqNmdsdqSRHZs7ckJfAEg7co0zT6aahw+fEuXGhkyYCLj6ohytq0Y5WTYebVVKyRsDMt0MjNxHq+k6GwbUz4bunR3jNA+8zUAxAKKe/rds9OYxFk3pGNtk6FklY8qWa6JnDa/xy7HINmQ5LbganeBBab5q2JTudTleWc2ztj5OSU4jqU0ILK/nu+dEYCnmqakZJwX2yI1YC8cRkVoyb/XU0Yy7bc/s4GIqy4DmRrdBuRFKyD3kamfCNseZPF8LR+Q2y5k7jwQbUo/RDti9V/bBzA2PuWVOfuboCVnH4ndKovyDdXf82/UNUT7zsIyZB98n++Paisd4mMxdK035mVyJyp45I6Bt4jEZJJVM9umR97vmiIuz3ToCjxHvbmKCAFGh29/X3/6heH9q4rCzzRLpcEMyLC6UR0V5ePyEU0dpSjqWzlx/XZRbZF7L5r4AkMQtekXGWhTJmEgS9wROyH06Ii3R0ARpjD0ar6WFS6I8f/E1WSfPXzl3buZkwhEZC8eJ1Czmcm4cZWl3/maj6V70lyZFURRFUZQ+0JsmRVEURVGUPtCbJkVRFEVRlD4YsE8TJ+yV+o3IcwuXkicD++uMjsokg2HkrlW223I/rE3h1UufpwUnTWQfiDQl7VXgrt3myUCHfZjiWO63WpIeVQBQLk3QK3IdulaXCSKTdNWpI4pYr8KaJllOPTqxuGc93PrEKruIhYUNetafSaOVebyNgjbpj8iHI6hQslHOxgrAkCdJQnUY0oJVK25Av4+2qS3Jtn7tr+U29VG3Hafz5IUyLNfrM/KHstaji6IEvK0Oe05R4mArdTIAwNVmdF5x/u3IoxMY69kmGmDqZxMAYY+/T541b6ue5MFl0j2RJGS6LGOsPu3qgGpN0lfOymOur8p92JB1JwDmpF7ywtel/1sYyW3ivDv+UVmOf4GS7aYNuc36W24zVhY4QbPUSbXr5OFzyOPD9zBpC1M5b37gAdkfDx115/cf5LvauSg/2LkoyuVxaLqrZ62vLIj351obvAmunn9FvkCapirpgJLENbiKMvmZR5/+MVG+8uarorxwRSbBBYBSWcZNLie1kR3yFAtzHo0ezYl8Ea+OS01XeWjSqYO9nhrjq6K8vjQv36+7/RGwp1SHkw3T9TpxPeOyXr3wba5p+kuToiiKoihKH+hNk6IoiqIoSh/oTZOiKIqiKEofDNanCUAQdNcaWeOTpp6cMqyvIb+kwEgdgfFIEUISV0SUFy5JZJ0+jwbOT8f+FMWS1HxUqu7aO/tixJRHL6B2ZtbVVmWcVy2Ta68h+UfxOjUANDakxqtKOfEqFamZqa2ugem18PB0+a5ijBFjGiXk1eXxarGp7KcO+X2Np7KOxHNqcOqlgLxAQMvkyZQbA28ekTq16xfkWLy0LDUQk5G79h5Djk9uQ7ZjgzRdmc+3irSCWcq5mUjD5MsLl1ACLJBfFGmcwpzbjrjnXBukGiUMDUbHuxqN8ih5pC16fFwy+Vq9Kcdm4Zqsozrh1rGxJvtkuCSDqvyIfH/mhjsXdWZlvdEkzYlFOba5NdfXpliQY1G/JOs8l8iYWqy5cWhjGSPVM3IEI5qbg1n3nGpck/udJF1YjYLixSvubPPMn3T7aH15wPpKC8Rxd/+lSanhaZIeBwAS0t+UKOFebw40AFic9eiRSnKbPM15x88+IsoPPPmjTh2vfuvPZbtIU8vzm/FcXDuxjIvJ0WlRjkmD3Gq5Gs1icUyWK1L3NHvlvChXq0NOHfWa1Dm1yROxEMhYLealXx4AdDq3zjfXi/7SpCiKoiiK0gd606QoiqIoitIHetOkKIqiKIrSB3rTpCiKoiiK0gcDFYJbWGEgFZBoOfMoik1Morm8FHSFlLwyjFyxaaslBdgs+GIBNgvDASAM2TDQbWsvmcdQME1ZTCk/w9sUCq65ZZzIYzGkTjYkYi8WPIlnSVvKAsA6mYdZePqjR0jtE9/vKhYwWXfcLSUpNpFHxB3LRmaGEk02yfC06jlmMgHNOMElpKj1zIgrwj+TyPF4ZlUKvzdIcDsq80ADACybFdLDAG3I8bSpK0hGQINGg+iYvxXdQTYkRjU5OimachsWZwLAes+5mA7QJNWUgPxjPSL0OTn+R4+4ppLHflrOE9/7Axlnk0+QALvqiqdzCzKGJp+U+12PpZh85qL7MEgTMmbCNUq+TPNb1brteOJj8mGYIw/J/bz2ktym8IbbjjbpcdNQ1jkMMkOccse3QpN+5ag0EX5rngw0r7tC4uZstz+y+NaJVneDKF/A1IkHb5YvvvTX4v3FG5d4E5SL8hrWpgcqJqfPiPKZR55y6qitSoH56uqi/AAZRj7x6CecOi4W/4soN5JVUWYDYF/C5SiU47Uwf0N+YFGafZqO+7BXsyaF7ysrMqHxkRNS1H76yU87dXRW50T57Tfksa0szYhynrONAyiVuvHL9wS96C9NiqIoiqIofXDHmyZjzAljzNeMMW8YY14zxvzq1uvjxphnjDHnt/4fu1NdysFF40jZLhpDyk6gcaRsh35+aUoA/Jq19jEAHwLwy8aYxwF8HsCz1tqHADy7VVaUW6FxpGwXjSFlJ9A4Uu6ZO2qarLUzAGa2/q4ZY94AcAzAZwB8fOtjvwfg6wB+/XZ1GWMQ9OhN8gUyJXTM8oA0k2vpCX0mJF1J6DHyY1NCNqo0tH4ZRm5iwrgt1/hzebmWm6NtrMcM0NJnePU94oSIXj9B1j1JXUmJdAXNwO3TTiLXlTuUVNJSAsnAuH0qjM76EDXteBz1jJkNSCvjLps7GqawKfs6pGNICh4Nzxq7W8qYCIbkdxBTdnUxa5TYef6oLI9+XI5ndcwdP5Oj5MNkKmlSaieL2ACkkGOao6TMAcmggtj9fpWSLor1dRE13cTusTR7tGTZHeQoOxlDacNi9QfdfuQkxyOnfMaU8twaqcrEuY2L8vPRafcEXmvJPlj8BsVhVZbjnMdkk0xy86RhO3RcxsPR97p1tGL52uvfkOXFmtxH05USocTawYT0SQUZM4UJjzki6e3Wbsg+GyrJ83b8mKvPevip7jY33nbbyexkHGVpikaPseKR41KP1K4t8ibIKNAPT54U5YAm/tqKa5AZFKQuau6q1E6defxpUb566XmnjibN+zEZVUak4008iewDuv7mQzK4pRiZu0YnCYBOU7ZjeFhqeTfW5PHPXX7OqePUIx8S5erSUVFenHtblNPUvcanPfNT5pkz3+GuNE3GmNMAngLwXQCHt4LvnSA8dJtNFeUmGkfKdtEYUnYCjSPlbun7pskYUwXwxwA+Z61dv9Pne7b7JWPM88aY59fWa/fSRuVdxE7E0brG0YFmJ2Ioc55kVQ4aOxFHjY2NO2+gvKvo66bJGJPDZnB92Vr7la2X54wx01vvTwNwf0MEYK39grX2aWvt0yPDbs4Y5eCwU3E0rHF0YNmpGApCjw2DcmDYqTgqV1xLF+XdzR01TWZTvPK7AN6w1v5Oz1tfBfBZAL+99f+f9rPDXtlDfUPe3Ge+hL2sWSJfiIAS+vqsXthnKMukriCjbog4ESuA0sioKKcJ7YiSk7ZaMhErAGQpJTAF+0PJOpsbribG8VjqyG86MwsXRHlkWq7tAkBG/WGp02LyOok83lf5Hr8sTqrsY2fjyCLsES5lpBXLeYKgkacxbktvkICek4l9niTU+QnppGIjhR/Nb8lEyACQBvJXsiOkr8ufkvFdtJQ4F0BImojMymPjlmeZ2x+GEnxmBf6EHPMg83hfhbJetn5KilLf0FpxNU2zy91xiPmcInY2hkKkpqtRSkhHMjfvHm9wSf461SG9RqMlOyD3lqvhWa5TUl8Sjz32gCwPy9ylAIDX5+TckkVynggpUW5p3dVnjDwgx79IHlvrC3KbXNvVs3zsJ2Qd8bA8tsvfl3UOe3SChQdlH17+njwfVhcpxs64MbJ0pRurSefO+sqdjKMgDFEZ6Wpw4rbcv8cOCG32DSS9bGNNehsVq6NOHUeOnZWfCWXfp+Q1mCxI7yMAGB2dEuU6z5tc9MyrUUQTB+mD202p+ws8nn9lmidAc2KdfJzGN5adOgwJWZONVVHOcRJzR1EMVPLdwQpuo9Ptx9zyRwH8IwCvGGNe3HrtX2AzsP7QGPOLAK4A+G/6qEs5uGgcKdtFY0jZCTSOlHumn6fnvgXgVrddrs2oonjQOFK2i8aQshNoHCnbQR3BFUVRFEVR+mCgueeyLEO71dV9uBomd53R0hcC9gzKaJ3Vpu66a7EihcP5oiy321KLEnlyl/W2GwAS8joyJOjIYlef5eSvY60J6UZyhbJTR6OxIsq19SVRvvyW9ON4oPRRp47qxLgox5b7WN5L59g/CkDa45dlb+NpsXt0+y4j/Y3xNCeNyIOE4qSVI/+rxI2BjiVdh2UdgazzUuo+WRNS3xrymBqK6HuMx7woy8jbh8QHJqRzJHN1BNaSN1dHahNsQZZZWwgAefJEM9SnMeQ5E0buE2vVUdPzvvP2rhEEBsOVHi1Fh3LPPebq+EZGZZ+0hzlm5PFfveGaG+Vkiix88O9JDdPHPiLbceG/uGN3bUS2bblJHktkhVNounPikYdlLE88Icf3xqo81mzN7Y+36RwZXpTtaDVl2x877VSBieMUy6E8/te+KefRy1/z6F4P9fht+U7+XcTAIujVNpI/X7NeB1OvS41OZVgKKvMjE6I8RL5FALCxLHOp5SiPK+tlw5L78Exz9poot9uyrYautcWi9CkDgJDy6NWWZe65iLREifVoRen6wnKi0dFR2sKNgRrlqyvkZZ3liuzDnGeyOfrQw933i9903n8H/aVJURRFURSlD/SmSVEURVEUpQ/0pklRFEVRFKUP9KZJURRFURSlDwYqBIe1SHsF1JZEjp6HQG3G5pZS4BWQANuXKHd1lYR3Veniaknga63bLRm3lQ0iHf2hezAs/GahHQJZybInUWNEpoSVshS4PfW3f06UfeLa1BF6k+iTTDh9iRrbPUkWOQHlbrMpvuz2f8APEHgc5QyNqYkpQS8JsMseg9M4kAJESwLrgMSXWegRYKeyL01KwnBDDwt4DOUCFlOS+DU0UnCd+tyvU3rIgEzpItpvELpC4DCkhL0kSM9IKB7kPILkatcANBe4+9gtykMG7/94dy5ZfZsMb7Mib4LmBTmeuRG5TfWw/Hxc85iKDklxeLoh+/CHl+T89uLL7jzS3pD1lgo0VpGMsfqqK8C/NitjeXhNCnrXfyiPbfwx15j0UF6O18Kc3O8w+R7Ot93+eOvbsm2LbRnbNTrW2pp7To0Md/vIM/3vKmkaY22lK34eJRF3lHPj6PC0NL0dIaH38cd+RJSXZ684dcxcekOU19al4eP6q9+W7Qhdk9x2p0GfkXNPmnJiezcWH3ziI6LcbKyK8vXz35Pvb7gPR/C1tViSgvNCmdruaUfOyvjM0XVyrS7bVS26D1m11rrGwza99TVNf2lSFEVRFEXpA71pUhRFURRF6QO9aVIURVEURemDgWqajAlQyHfXeJOEdQSuaVVKBphBJPUZhvQrvpXIAplnkd8WDGlROh1XAxB3SNfDDlyW9UruumtGwqc8t4uSd5bLrqkk668MZDkj4y/jMROL25TcMJZryiHpV9hvEQByQ911+XCAWhRg0/DU9tzv58icM/YY3IUZaSVIanC0TUmdXSkC2IvVUMdYSpSapm4MGHotKFDnOllv3XMipvOkRDq/4TEZRxkHPID1ZdlHlpJYB6SBSKxHcEhx06L+SMkwMkzdeC4UuroKM0BBSrtpcPHVbtzmN6TG4ci0qwMLxuTxNq7K9+frlEg5dXVAcSL76NxFee5cuiLHNiu6SbuPPCQ/01qXcbe+LPfRdD0JUZuRbS2OyP2cJZPN1qx7Tq3Oy5gYH5ftqn5AXl7WVtw+Xbwi296uybZPTsltwhNuIvTCD7rjYuLBipoCE6FU6JoFN3t0MQDQ3Fh0tjlxVuqAaivyMyPDUvNUr7uJv0+eeVSUz9dWRTmj+S7Iu5qmPOl2ciUpQut0ZPwWK24gJam8Vk6deEiUr176gfy8da+taMoxjSmB70hRHn+56GQXR9KmuKD7hPFRqTWL2+652er0GG/fRqervzQpiqIoiqL0gd40KYqiKIqi9IHeNCmKoiiKovTBQDVN1lp0erRBEWlncnlXG5Nlcq09zeQaeIG26bTctcqI9UWkCTHkBdVuul4SEa2R8so5J0wsFFz9RmNDJklNybMnpXZ5LHoQ0X4SWiJmH6ckdX1NWPhVJh+MmJIN8z4BIO70jstgdQQGFiG6B24S6bsVlNy+Nw0ZF/Wq7LgiJVttwfWm4uS6SGRHpuSxxHo7AAjJu4k9sRxRnkePZOjwko4crzXyB8rcUwKWNUoBJc0kHzLvRGGl9iDl05cCuJm54zJX745dnA3uO1yhYHH2TDcGSgvyHBj9gKvhunJF9klM/jIN0nitX3I1PMNlObe0Kantyty6KD/6kBuHG0OybYuXqONHZWzn864uKm7Jti3zPErJl9tNNwLmz8t6i+NSFzayJMvrS+68akhf+eSHKKYm5bh8+5uu1iQ/0lPvYOWVsGmMeG3hZrm2sSref++H/o6zzfQD7xHlb/3ZfxDlq5elB9PQ5CmnjtjIxO2dthzz8aljopwvu7qoG2tyP4VIapbK5GU0ceSoU4dpy4Tx81ekPittrory2UfksQPAwtVLovzEj31KlKOcbMdzz/xHp46jJ6XGa/zYA6Jcm5MCxDT2xFGhux/f3P0O+kuToiiKoihKH+hNk6IoiqIoSh/oTZOiKIqiKEofDNinydXc9NLpuJ40Bc7dQxKPQl56NrAeBwDyRamlaDTlWnyjURflUsn1owhIF8V6oygiTUDb1RFwYiTO3RVQvrPEk/+G165LJTYUolx9vhx4ln2apG6C8/mx9gognZPHk2pXMQbI5XuKsp9M6PZbvEE53lqyr/PHpc9Hc93VggX0HSMLOI+cXHs31pNniTRN7BFmKLCclIcAAj5tQ/YHotyBmautsQHlaqJ8hImR51UUutqqkDzBwoA1XTIuIrgeLcl6Tztuk+9px0kMsuXuvHDyETq/J9yOP/812Qd18jpCLI8/8hzP6LDU31VPyf0ur8jy+avu2LVJ+LZG529uXsZU6plzO0tym8q4LG+kcg5MNtxLRdiRbX3ghOyzqQdJZ3PM1bRF12UM5YdkWxfIc+rUWfdY6nPd4w08ufp2k2ZjA6+98Dc3y2FRarBOnX3M2SYojIqyNbIPUjq/E8817fVXnqM6KO8l+butLs44dYA0xafOSr3RlUsvi3J9zc2FeubHflaUb1x8XZRPP/iE3MCjWx49ekKWD0nt1NW3XhPl5QXX+6oysSrK4dKCKC8uz4nyQ4980Klj5tpbN/9OPV6N76C/NCmKoiiKovSB3jQpiqIoiqL0gd40KYqiKIqi9IHeNCmKoiiKovTBgM0tgaQn6+lQVRpudVqu4JjF0uvrq6LcJsFWvuhmWk3IhDAk0XZGSXBDj7DZUgI/vtvstGQ7Mo/hoyVVL8v7AhIBR6GbmJANQdOMtonkkNrE7VNLAtVyWQqYO7SNN5FyrzjR58K5q1jAdPsyo2NG5o5fUpLC/OQGGYk+KEWqSdsV8WYk9M0FUvQZBNK8tNVxv5PYlF7jWItkO2zmPlDA3R2QEaeNSZCeyQcdACBHD1CEOSk4Ttk0NXBjEXlqOydLzZMgve3pj9XuZ3yi990i6VgsXuvu8PWcbPtbX3cFq2vzUtifUIMnp2V8PHpiyKkjTuQ2i5TANFcmk9UxaXYJAOkazSN1EtwXKXY9Q5eMypiJ23IuHgnk+VF+wO2P4bqM1Q/+rCwfmpRz8evPuMcyfFy2Y+pxeU5dfVa2Y2PWFehmPSJox7R1lzHGINdjDGs7cmyunXuDN8G1y+dF+ZH3/ZQoVyemRTluyyTAABDRqVYdlglpNyiBb5sT2gIoVEZEudGSnxmmxMGVkVGnjiYlG24sSxNJFqSPjp106liYvSbK3/2LL4vyh/7efyfKl478DZgbb74qyqd++klRHhmXfXrj6kWnjrA3qfFtHm7SX5oURVEURVH6QG+aFEVRFEVR+kBvmhRFURRFUfrA2AHqUYwxCwAuA5gE4DpU7T20nf1xylo7NaidaRztGve7nQOLI42hXeV+tlXnotuj7eyPW8bRQG+abu7UmOettU8PfMd3ibZzb7NfjlvbuXfZL8e8X9oJ7K+27hT75Zi1ndtHl+cURVEURVH6QG+aFEVRFEVR+uB+3TR94T7t927Rdu5t9stxazv3LvvlmPdLO4H91dadYr8cs7Zzm9wXTZOiKIqiKMp+Q5fnFEVRFEVR+mCgN03GmE8ZY84ZYy4YYz4/yH3fCWPMF40x88aYV3teGzfGPGOMOb/1/9j9bONWm04YY75mjHnDGPOaMeZX92pbdwuNo2238cDHELB342g/xNBWmw58HO3VGAI0jnaLgd00GWNCAP8OwM8AeBzALxhjHh/U/vvgSwA+Ra99HsCz1tqHADy7Vb7fJAB+zVr7GIAPAfjlrX7ci23dcTSOdoQDHUPAno+jL2HvxxBwwONoj8cQoHG0O1hrB/IPwIcB/GVP+TcA/Mag9t9nG08DeLWnfA7A9Nbf0wDO3e82etr8pwA+uR/aukPHq3G08+09UDG0dXx7Oo72WwxttetAxdFej6GtNmkc7fC/QS7PHQPQmwL52tZre5nD1toZANj6/9B9bo/AGHMawFMAvos93tYdRONoBzmgMQTsvzja02NzQONov8UQsMfHZj/E0SBvmoznNX107x4xxlQB/DGAz1lr1+93ewaIxtEOcYBjCNA42jEOcBxpDO0g+yWOBnnTdA3AiZ7ycQA3Brj/e2HOGDMNAFv/z9/n9gAAjDE5bAbXl621X9l6eU+2dRfQONoBDngMAfsvjvbk2BzwONpvMQTs0bHZT3E0yJum5wA8ZIw5Y4zJA/h5AF8d4P7vha8C+OzW35/F5lrrfcUYYwD8LoA3rLW/0/PWnmvrLqFxtE00hgDsvzjac2OjcbTvYgjYg2Oz7+JowAKvTwN4E8BFAP/yfgu6qG2/D2AGQIzNbxC/CGACm6r981v/j++Bdn4Umz8Bvwzgxa1/n96LbdU42ptxpDG0t+NoP8SQxtHejiGNo937p47giqIoiqIofaCO4IqiKIqiKH2gN02KoiiKoih9oDdNiqIoiqIofaA3TYqiKIqiKH2gN02KoiiKoih9oDdNiqIoiqIofaA3TYqiKIqiKH2gN02KoiiKoih98P8DvikWSmCTawoAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#Check what is in each channel\n", "fig,ax = plt.subplots(4,4, figsize=(10,10))\n", "ax = ax.ravel()\n", "list_idx = np.linspace(0,100,num=16,dtype=np.int64)\n", "for count, idx in enumerate(list_idx):\n", "# print(idx)\n", " print('count, t_train[count,:]: {}, {}'.format(count, t_train[count,:]))\n", "# print(x_train[idx,:,:,0:3])\n", " ax[count].imshow(x_train[count,:,:,0:3])\n", " ax[count].set_title(str(np.argmax(t_train[count,:])))" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "x_train.shape: (324000, 28, 28, 4)\n", "data.dtype: uint8\n", "target.dtype: int64\n", "dataset_size: 50000\n", "split: 10000\n" ] } ], "source": [ "# split in training and testing\n", "from torch.utils.data import Dataset, DataLoader\n", "from torch.utils.data.sampler import SubsetRandomSampler\n", "import torchvision.transforms as transforms\n", "from scipy.ndimage import zoom\n", "\n", "\n", "class MyDataset(Dataset):\n", " def __init__(self, data, target):\n", " print('data.dtype: {}'.format(data.dtype))\n", " print('target.dtype: {}'.format(target.dtype))\n", " self.data = torch.from_numpy(data).float()\n", " self.target = torch.from_numpy(target).float()\n", " \n", " \n", " def __getitem__(self, index):\n", " x = self.data[index]\n", " y = self.target[index]\n", " return x, y\n", " \n", " def __len__(self):\n", " return len(self.data)\n", "\n", "print('x_train.shape: {}'.format(x_train.shape))\n", "n_samples = 50000\n", "dataset = MyDataset(x_train[:n_samples,:,:,:], np.argmax(t_train[:n_samples],axis=1))\n", "del x_train, t_train\n", "dataset_size = len(dataset)\n", "print('dataset_size: {}'.format(dataset_size))\n", "test_split=0.2\n", "\n", "batch_size=1024 \n", "\n", "# -- split dataset\n", "indices = list(range(dataset_size))\n", "split = int(np.floor(test_split*dataset_size))\n", "print('split: {}'.format(split))\n", "# np.random.shuffle(indices) # Randomizing the indices is not a good idea if you want to model the sequence\n", "train_indices, val_indices = indices[split:], indices[:split]\n", "\n", "# -- create dataloaders\n", "# #Original\n", "train_sampler = SubsetRandomSampler(train_indices)\n", "valid_sampler = SubsetRandomSampler(val_indices)\n", "\n", "dataloaders = {\n", " 'train': torch.utils.data.DataLoader(dataset, batch_size=batch_size, sampler=train_sampler),\n", " 'test': torch.utils.data.DataLoader(dataset, batch_size=batch_size, sampler=valid_sampler),\n", " 'all': torch.utils.data.DataLoader(dataset, batch_size=5000, shuffle=False),\n", " }" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "class FFnet(nn.Module):\n", " '''\n", " Linear activation in the middle (instead of an activation function)\n", " '''\n", " def __init__(self):\n", " super(FFnet, self).__init__()\n", " self.enc_lin1 = nn.Linear(3136, 1000)\n", " self.enc_lin2 = nn.Linear(1000, 500)\n", " self.enc_lin3 = nn.Linear(500, 250)\n", " self.enc_lin4 = nn.Linear(250, 6)\n", " \n", " self.relu = nn.ReLU()\n", " self.tanh = nn.Tanh()\n", "\n", " def encode(self, x):\n", " x = self.enc_lin1(x)\n", " x = self.relu(x)\n", " x = self.enc_lin2(x)\n", " x = self.relu(x)\n", " x = self.enc_lin3(x)\n", " x = self.relu(x)\n", " output = self.enc_lin4(x)\n", " return output\n", "\n", " def forward(self, x):\n", " z = self.encode(x)\n", " return z" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "## Second routine for training and evaluation (using the )\n", "# Training and Evaluation routines\n", "import time\n", "def train(model,loss_fn, optimizer, train_loader, test_loader, num_epochs=None, verbose=False):\n", " \"\"\"\n", " This is a standard training loop, which leaves some parts to be filled in.\n", " INPUT:\n", " :param model: an untrained pytorch model\n", " :param loss_fn: e.g. Cross Entropy loss or Mean Squared Error.\n", " :param optimizer: the model optimizer, initialized with a learning rate.\n", " :param training_set: The training data, in a dataloader for easy iteration.\n", " :param test_loader: The testing data, in a dataloader for easy iteration.\n", " \"\"\"\n", " print('optimizer: {}'.format(optimizer))\n", " if num_epochs is None:\n", " num_epochs = 100 \n", " print('n. of epochs: {}'.format(num_epochs))\n", " for epoch in range(num_epochs+1):\n", " start = time.time()\n", " # loop through each data point in the training set\n", " for data, targets in train_loader:\n", " \n", " # run the model on the data\n", " model_input = data.view(data.size(0),-1).to(device)# TODO: Turn the 28 by 28 image tensors into a 784 dimensional tensor.\n", " if verbose: print('model_input.shape: {}'.format(model_input.shape))\n", " \n", " # Clear gradients w.r.t. parameters\n", " optimizer.zero_grad()\n", " \n", " out = model(model_input) # The second output is the latent representation\n", " if verbose:\n", " print('targets.shape: {}'.format(targets.shape))\n", " print('targets: {}'.format(targets))\n", " print('out.shape: {}'.format(out.shape))\n", " print('out: {}'.format(out))\n", "\n", " # Calculate the loss\n", " targets = targets.type(torch.LongTensor) # add an extra dimension to keep CrossEntropy happy.\n", " if verbose: print('targets.shape: {}'.format(targets.shape))\n", " loss = loss_fn(out,targets)\n", " if verbose: print('loss: {}'.format(loss))\n", " \n", " # Find the gradients of our loss via backpropogation\n", " loss.backward()\n", "\n", " # Adjust accordingly with the optimizer\n", " optimizer.step()\n", "\n", " # Give status reports every 100 epochs\n", " if epoch % 10==0:\n", " print(f\" EPOCH {epoch}. Progress: {epoch/num_epochs*100}%. \")\n", " loss_train, acc_train = evaluate(model,train_loader,verbose)\n", " loss_test, acc_test = evaluate(model,test_loader,verbose)\n", " print(\" Train loss: {:.4f}. Train Acc: {:.4f}, Test loss: {:.4f}. Test Acc: {:.4f}. Time/epoch: {:.4f}\".format(loss_train, acc_train, loss_test, acc_test, (time.time() - start))) #TODO: implement the evaluate function to provide performance statistics during training.\n", "\n", "def evaluate(model, evaluation_set, verbose=False):\n", " \"\"\"\n", " Evaluates the given model on the given dataset.\n", " Returns the percentage of correct classifications out of total classifications.\n", " \"\"\"\n", " with torch.no_grad(): # this disables backpropogation, which makes the model run much more quickly.\n", " correct = 0\n", " total = 0\n", " loss_all=0\n", " \n", " for data, targets in evaluation_set:\n", "\n", " # run the model on the data\n", " model_input = data.view(data.size(0),-1).to(device)# TODO: Turn the 28 by 28 image tensors into a 784 dimensional tensor.\n", " if verbose:\n", " print('model_input.shape: {}'.format(model_input.shape))\n", " print('targets.shape: {}'.format(targets.shape))\n", " out = model(model_input)\n", " targets = targets.type(torch.LongTensor)\n", " loss = loss_fn(out,targets)\n", " \n", " if verbose: print('out[:5]: {}'.format(out[:5]))\n", " loss_all+=loss.item()\n", " \n", " # the class with the highest energy is what we choose as prediction\n", " _, predicted = torch.max(out.data, 1)\n", " total += targets.size(0)\n", " correct += (predicted == targets).sum().item()\n", " acc = 100 * correct / total \n", " loss = loss_all/total\n", " return loss, acc\n" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Autoencoder - with linear activation in middle layer and non-linearity (tanh) everywhere else\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.01\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0009. Train Acc: 74.3500, Test loss: 0.0010. Test Acc: 74.3200. Time/epoch: 24.0663\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0002. Train Acc: 90.5100, Test loss: 0.0002. Test Acc: 90.1700. Time/epoch: 21.5834\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0007. Train Acc: 71.4850, Test loss: 0.0007. Test Acc: 72.3100. Time/epoch: 31.5746\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0002. Train Acc: 92.1275, Test loss: 0.0002. Test Acc: 91.4800. Time/epoch: 31.7279\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0002. Train Acc: 92.4675, Test loss: 0.0002. Test Acc: 92.1500. Time/epoch: 34.2578\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0002. Train Acc: 92.1400, Test loss: 0.0002. Test Acc: 91.5600. Time/epoch: 27.1172\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0002. Train Acc: 93.0550, Test loss: 0.0002. Test Acc: 92.5800. Time/epoch: 27.6910\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0002. Train Acc: 90.7450, Test loss: 0.0002. Test Acc: 90.1900. Time/epoch: 19.6197\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0002. Train Acc: 94.0375, Test loss: 0.0002. Test Acc: 93.3700. Time/epoch: 15.0691\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0002. Train Acc: 89.7775, Test loss: 0.0002. Test Acc: 89.7000. Time/epoch: 14.5441\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0002. Train Acc: 93.4900, Test loss: 0.0002. Test Acc: 92.8800. Time/epoch: 14.6357\n", "Deleting previous model\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.005\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0006. Train Acc: 69.3350, Test loss: 0.0006. Test Acc: 69.8200. Time/epoch: 14.9185\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0004. Train Acc: 82.0250, Test loss: 0.0004. Test Acc: 81.9600. Time/epoch: 17.5713\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0002. Train Acc: 90.4775, Test loss: 0.0003. Test Acc: 90.0500. Time/epoch: 15.3081\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0003. Train Acc: 86.3750, Test loss: 0.0003. Test Acc: 86.3700. Time/epoch: 14.9161\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0004. Train Acc: 83.8150, Test loss: 0.0004. Test Acc: 84.0500. Time/epoch: 15.6279\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0002. Train Acc: 92.5800, Test loss: 0.0002. Test Acc: 92.1200. Time/epoch: 14.3379\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0002. Train Acc: 92.0525, Test loss: 0.0002. Test Acc: 91.6400. Time/epoch: 14.5943\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0002. Train Acc: 91.4350, Test loss: 0.0002. Test Acc: 90.9600. Time/epoch: 14.1033\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0004. Train Acc: 86.1225, Test loss: 0.0004. Test Acc: 85.3700. Time/epoch: 14.5240\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0002. Train Acc: 93.7375, Test loss: 0.0002. Test Acc: 93.1100. Time/epoch: 14.4524\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0001. Train Acc: 94.7475, Test loss: 0.0002. Test Acc: 94.0500. Time/epoch: 14.3222\n", "Deleting previous model\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.001\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0006. Train Acc: 70.6150, Test loss: 0.0006. Test Acc: 71.1900. Time/epoch: 15.7802\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0002. Train Acc: 90.8450, Test loss: 0.0002. Test Acc: 90.7700. Time/epoch: 13.9836\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0002. Train Acc: 92.1425, Test loss: 0.0002. Test Acc: 91.5800. Time/epoch: 14.6497\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0002. Train Acc: 93.2475, Test loss: 0.0002. Test Acc: 92.5600. Time/epoch: 14.4071\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0003. Train Acc: 87.3000, Test loss: 0.0003. Test Acc: 87.2900. Time/epoch: 14.0998\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0001. Train Acc: 94.7875, Test loss: 0.0002. Test Acc: 94.2900. Time/epoch: 14.3237\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0001. Train Acc: 93.9550, Test loss: 0.0002. Test Acc: 93.4400. Time/epoch: 14.2208\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0001. Train Acc: 94.7900, Test loss: 0.0001. Test Acc: 94.1900. Time/epoch: 14.2017\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0003. Train Acc: 90.2175, Test loss: 0.0003. Test Acc: 90.1400. Time/epoch: 14.0847\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0001. Train Acc: 94.3650, Test loss: 0.0002. Test Acc: 93.3800. Time/epoch: 14.1263\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0003. Train Acc: 89.7800, Test loss: 0.0003. Test Acc: 89.0400. Time/epoch: 14.9697\n" ] } ], "source": [ "lr_range = [0.01,0.005,0.001]\n", "\n", "for lr in lr_range:\n", " if 'model' in globals():\n", " print('Deleting previous model')\n", " del model, loss_fn, optimizer\n", " model = FFnet().to(device)\n", " optimizer = torch.optim.Adam(model.parameters(), lr = lr)\n", "\n", " loss_fn = nn.CrossEntropyLoss().to(device)\n", " train(model,loss_fn, optimizer, dataloaders['train'], dataloaders['test'],verbose=False)" ] }, { "cell_type": "code", "execution_count": 35, "metadata": {}, "outputs": [], "source": [ "class CNNet(nn.Module):\n", " def __init__(self):\n", " super().__init__()\n", " self.conv1 = nn.Conv2d(4, 6, 5)\n", " self.pool = nn.MaxPool2d(2, 2)\n", " self.conv2 = nn.Conv2d(6, 16, 5)\n", " self.fc1 = nn.Linear(16 * 4 * 4, 120)\n", " self.fc2 = nn.Linear(120, 84)\n", " self.fc3 = nn.Linear(84, 6)\n", "\n", " def forward(self, x):\n", " x = self.pool(F.relu(self.conv1(x)))\n", " x = self.pool(F.relu(self.conv2(x)))\n", " x = torch.flatten(x, 1) # flatten all dimensions except batch\n", " x = F.relu(self.fc1(x))\n", " x = F.relu(self.fc2(x))\n", " x = self.fc3(x)\n", " return x\n", "\n", "\n", "model = CNNet()" ] }, { "cell_type": "code", "execution_count": 38, "metadata": {}, "outputs": [], "source": [ "# Training and Evaluation routines\n", "import time\n", "def train(model,loss_fn, optimizer, train_loader, test_loader, num_epochs=None, verbose=False):\n", " \"\"\"\n", " This is a standard training loop, which leaves some parts to be filled in.\n", " INPUT:\n", " :param model: an untrained pytorch model\n", " :param loss_fn: e.g. Cross Entropy loss of Mean Squared Error.\n", " :param optimizer: the model optimizer, initialized with a learning rate.\n", " :param training_set: The training data, in a dataloader for easy iteration.\n", " :param test_loader: The testing data, in a dataloader for easy iteration.\n", " \"\"\"\n", " print('optimizer: {}'.format(optimizer))\n", " if num_epochs is None:\n", " num_epochs = 100\n", " print('n. of epochs: {}'.format(num_epochs))\n", " for epoch in range(num_epochs+1):\n", " start = time.time()\n", " # loop through each data point in the training set\n", " for data, targets in train_loader:\n", " \n", " # run the model on the data\n", " model_input = data.permute(0, 3, 2, 1).to(device)\n", " if verbose: print('model_input.shape: {}'.format(model_input.shape))\n", " \n", " # Clear gradients w.r.t. parameters\n", " optimizer.zero_grad()\n", " \n", " out = model(model_input) # The second output is the latent representation\n", " if verbose:\n", " print('targets.shape: {}'.format(targets.shape))\n", " print('targets: {}'.format(targets))\n", " print('out.shape: {}'.format(out.shape))\n", " print('out: {}'.format(out))\n", "\n", " # Calculate the loss\n", " targets = targets.type(torch.LongTensor) # add an extra dimension to keep CrossEntropy happy.\n", " if verbose: print('targets.shape: {}'.format(targets.shape))\n", " loss = loss_fn(out,targets)\n", " if verbose: print('loss: {}'.format(loss))\n", " \n", " # Find the gradients of our loss via backpropogation\n", " loss.backward()\n", "\n", " # Adjust accordingly with the optimizer\n", " optimizer.step()\n", "\n", " # Give status reports every 100 epochs\n", " if epoch % 10==0:\n", " print(f\" EPOCH {epoch}. Progress: {epoch/num_epochs*100}%. \")\n", " loss_train, acc_train = evaluate(model,train_loader,verbose)\n", " loss_test, acc_test = evaluate(model,test_loader,verbose)\n", " print(\" Train loss: {:.4f}. Train Acc: {:.4f}, Test loss: {:.4f}. Test Acc: {:.4f}. Time/epoch: {:.4f}\".format(loss_train, acc_train, loss_test, acc_test, (time.time() - start))) #TODO: implement the evaluate function to provide performance statistics during training.\n", "\n", "def evaluate(model, evaluation_set, verbose=False):\n", " \"\"\"\n", " Evaluates the given model on the given dataset.\n", " Returns the percentage of correct classifications out of total classifications.\n", " \"\"\"\n", " with torch.no_grad(): # this disables backpropogation, which makes the model run much more quickly.\n", " correct = 0\n", " total = 0\n", " loss_all=0\n", " \n", " for data, targets in evaluation_set:\n", "\n", " # run the model on the data\n", " model_input = data.permute(0, 3, 2, 1).to(device)\n", " if verbose:\n", " print('model_input.shape: {}'.format(model_input.shape))\n", " print('targets.shape: {}'.format(targets.shape))\n", " out = model(model_input)\n", " targets = targets.type(torch.LongTensor)\n", " loss = loss_fn(out,targets)\n", " \n", " if verbose: print('out[:5]: {}'.format(out[:5]))\n", " loss_all+=loss.item()\n", " \n", " # the class with the highest energy is what we choose as prediction\n", " _, predicted = torch.max(out.data, 1)\n", " total += targets.size(0)\n", " correct += (predicted == targets).sum().item()\n", " acc = 100 * correct / total \n", " loss = loss_all/total\n", " return loss, acc\n" ] }, { "cell_type": "code", "execution_count": 39, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Autoencoder - with linear activation in middle layer and non-linearity (tanh) everywhere else\n", "Deleting previous model\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.01\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.6766\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.8254\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.5843\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.4217\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.4936\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.3445\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.3718\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.3719\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.6060\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.8346\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0015. Train Acc: 36.8250, Test loss: 0.0015. Test Acc: 37.5400. Time/epoch: 9.3048\n", "Deleting previous model\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.005\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0006. Train Acc: 77.1475, Test loss: 0.0006. Test Acc: 77.3100. Time/epoch: 9.1976\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0003. Train Acc: 90.6200, Test loss: 0.0003. Test Acc: 90.0200. Time/epoch: 9.4351\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0002. Train Acc: 93.8775, Test loss: 0.0002. Test Acc: 92.8900. Time/epoch: 9.1924\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0002. Train Acc: 93.8075, Test loss: 0.0002. Test Acc: 92.9200. Time/epoch: 9.2729\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0001. Train Acc: 95.7125, Test loss: 0.0002. Test Acc: 94.4300. Time/epoch: 9.4951\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0001. Train Acc: 96.7625, Test loss: 0.0002. Test Acc: 94.3100. Time/epoch: 9.5598\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0002. Train Acc: 92.7925, Test loss: 0.0002. Test Acc: 91.6700. Time/epoch: 9.7035\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0001. Train Acc: 95.0525, Test loss: 0.0002. Test Acc: 92.7000. Time/epoch: 9.5682\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0003. Train Acc: 90.9500, Test loss: 0.0004. Test Acc: 89.5500. Time/epoch: 9.7392\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0001. Train Acc: 96.1700, Test loss: 0.0002. Test Acc: 93.1400. Time/epoch: 9.6254\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0000. Train Acc: 98.5050, Test loss: 0.0002. Test Acc: 94.2700. Time/epoch: 9.7619\n", "Deleting previous model\n", "optimizer: Adam (\n", "Parameter Group 0\n", " amsgrad: False\n", " betas: (0.9, 0.999)\n", " eps: 1e-08\n", " lr: 0.001\n", " maximize: False\n", " weight_decay: 0\n", ")\n", "n. of epochs: 100\n", " EPOCH 0. Progress: 0.0%. \n", " Train loss: 0.0003. Train Acc: 88.8525, Test loss: 0.0003. Test Acc: 88.6600. Time/epoch: 9.9031\n", " EPOCH 10. Progress: 10.0%. \n", " Train loss: 0.0001. Train Acc: 95.2300, Test loss: 0.0001. Test Acc: 95.0900. Time/epoch: 9.9000\n", " EPOCH 20. Progress: 20.0%. \n", " Train loss: 0.0001. Train Acc: 94.5075, Test loss: 0.0001. Test Acc: 94.4700. Time/epoch: 10.7499\n", " EPOCH 30. Progress: 30.0%. \n", " Train loss: 0.0001. Train Acc: 95.5375, Test loss: 0.0001. Test Acc: 95.2300. Time/epoch: 9.8978\n", " EPOCH 40. Progress: 40.0%. \n", " Train loss: 0.0001. Train Acc: 94.6200, Test loss: 0.0001. Test Acc: 94.1000. Time/epoch: 10.0642\n", " EPOCH 50. Progress: 50.0%. \n", " Train loss: 0.0001. Train Acc: 94.4925, Test loss: 0.0001. Test Acc: 94.3600. Time/epoch: 10.3240\n", " EPOCH 60. Progress: 60.0%. \n", " Train loss: 0.0001. Train Acc: 96.1050, Test loss: 0.0001. Test Acc: 95.7600. Time/epoch: 10.2794\n", " EPOCH 70. Progress: 70.0%. \n", " Train loss: 0.0001. Train Acc: 96.4900, Test loss: 0.0001. Test Acc: 96.0200. Time/epoch: 10.4305\n", " EPOCH 80. Progress: 80.0%. \n", " Train loss: 0.0001. Train Acc: 96.5425, Test loss: 0.0001. Test Acc: 96.0300. Time/epoch: 9.8782\n", " EPOCH 90. Progress: 90.0%. \n", " Train loss: 0.0001. Train Acc: 97.4400, Test loss: 0.0001. Test Acc: 96.9900. Time/epoch: 9.8171\n", " EPOCH 100. Progress: 100.0%. \n", " Train loss: 0.0001. Train Acc: 97.9350, Test loss: 0.0001. Test Acc: 97.2100. Time/epoch: 11.4006\n" ] } ], "source": [ "lr_range = [0.01,0.005,0.001]\n", "\n", "for lr in lr_range:\n", " if 'model' in globals():\n", " print('Deleting previous model')\n", " del model, loss_fn, optimizer\n", " model = CNNet().to(device)\n", " optimizer = torch.optim.Adam(model.parameters(), lr = lr) # This is absurdly high.\n", "\n", " loss_fn = nn.CrossEntropyLoss().to(device)\n", " train(model,loss_fn, optimizer, dataloaders['train'], dataloaders['test'],verbose=False)" ] }, { "cell_type": "code", "execution_count": 106, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "(28, 28, 4)\n", "torch.Size([1, 4, 28, 28])\n" ] }, { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "#Change the dimension to fit into the model\n", "x_train = train_images.transpose(3,0,1,2)\n", "t_train = train_labels.transpose()\n", "\n", "model.eval()\n", "# with torch.no_grad():\n", "\n", "# Retrieve output from the image\n", "idx_to_plot = 0\n", "image = x_train[idx_to_plot,:,:,:]\n", "image_orig = image.copy()\n", "print(image.shape)\n", "image = torch.FloatTensor(image).permute(2, 1, 0).to(device)\n", "\n", "# Make input tensor require gradient\n", " # X.requires_grad_()\n", "image = image[None,:].requires_grad_()\n", "print(image.shape)\n", "output = model(image)\n", "\n", "# Catch the output\n", "output_idx = output.argmax()\n", "output_max = output[0, output_idx]\n", "\n", "# Do backpropagation to get the derivative of the output based on the image\n", "output_max.backward()\n", "\n", "# Retireve the saliency map and also pick the maximum value from channels on each pixel.\n", "# In this case, we look at dim=1. Recall the shape (batch_size, channel, width, height)\n", "saliency, _ = torch.max(image.grad.data.abs(), dim=1) \n", "saliency = saliency.reshape(28, 28)\n", "\n", "# # Reshape the image\n", "# image = image.reshape(-1, 28, 28)\n", "\n", "# Visualize the image and the saliency map\n", "fig, ax = plt.subplots(1, 2)\n", "# x_train[count,:,:,0:3]\n", "# print(image.shape)\n", "# image = image.permute(3, 2, 1,0).squeeze()\n", "# print(image.shape)\n", "ax[0].imshow(image_orig[:,:,0:3])\n", "ax[0].axis('off')\n", "ax[1].imshow(saliency.cpu(), cmap='hot')\n", "ax[1].axis('off')\n", "ax[0].set_title('Label: {}'.format(t_train[idx_to_plot].argmax()))\n", "plt.tight_layout()\n", "fig.suptitle('The Image and Its Saliency Map')\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.10.6" } }, "nbformat": 4, "nbformat_minor": 4 }