{ "cells": [ { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "['/home/robert/anaconda3/lib/python312.zip', '/home/robert/anaconda3/lib/python3.12', '/home/robert/anaconda3/lib/python3.12/lib-dynload', '', '/home/robert/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages']\n", "Connected. Call `.close()` to terminate connection gracefully.\n", "\n", "Logged in to project, explore it here https://c.app.hopsworks.ai:443/p/1160340\n", "2024-11-20 14:06:19,944 WARNING: using legacy validation callback\n", "Connected. Call `.close()` to terminate connection gracefully.\n", "Connected. Call `.close()` to terminate connection gracefully.\n" ] } ], "source": [ "import datetime\n", "import pandas as pd\n", "from xgboost import XGBRegressor\n", "import hopsworks\n", "import json\n", "from functions import util\n", "import os\n", "\n", "# Set up\n", "\n", "api_key = os.getenv('HOPSWORKS_API_KEY')\n", "project_name = os.getenv('HOPSWORKS_PROJECT')\n", "\n", "project = hopsworks.login(project=project_name, api_key_value=api_key)\n", "fs = project.get_feature_store() \n", "secrets = util.secrets_api(project.name)\n", "location_str = secrets.get_secret(\"SENSOR_LOCATION_JSON\").value\n", "location = json.loads(location_str)\n", "country=location['country']\n", "city=location['city']\n", "street=location['street']\n", "\n", "AQI_API_KEY = secrets.get_secret(\"AQI_API_KEY\").value\n", "location_str = secrets.get_secret(\"SENSOR_LOCATION_JSON\").value\n", "location = json.loads(location_str)\n", "\n", "today = datetime.datetime.now() - datetime.timedelta(0)" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Connected. Call `.close()` to terminate connection gracefully.\n", "Finished: Reading data from Hopsworks, using Hopsworks Feature Query Service (1.13s) \n" ] } ], "source": [ "feature_view = fs.get_feature_view(\n", " name='air_quality_fv',\n", " version=1,\n", ")\n", "\n", "### Retreive model\n", "\n", "mr = project.get_model_registry()\n", "\n", "retrieved_model = mr.get_model(\n", " name=\"air_quality_xgboost_model\",\n", " version=1,\n", ")\n", "\n", "saved_model_dir = retrieved_model.download()\n", "retrieved_xgboost_model = XGBRegressor()\n", "retrieved_xgboost_model.load_model(saved_model_dir + \"/model.json\")\n", "\n", "### Retrieve features \n", "\n", "weather_fg = fs.get_feature_group(\n", " name='weather',\n", " version=1,\n", ")\n", "\n", "today_timestamp = pd.to_datetime(today)\n", "batch_data = weather_fg.filter(weather_fg.date >= today_timestamp ).read().sort_values(by=['date'])" ] }, { "cell_type": "code", "execution_count": 18, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA90AAAJOCAYAAACqS2TfAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMywgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/H5lhTAAAACXBIWXMAAA9hAAAPYQGoP6dpAACzS0lEQVR4nOzdd3xTVRvA8V+6dzooHdAWKFAoUAoFStl77y3KEGTJEARFVDaKiuLLRhBZgiiKyN5Tluwyy55ldhe6c98/0oaGTqALeL6fT2hy7rnnnpukoU/Ouc9RKYqiIIQQQgghhBBCiBxnkN8dEEIIIYQQQggh3lQSdAshhBBCCCGEELlEgm4hhBBCCCGEECKXSNAthBBCCCGEEELkEgm6hRBCCCGEEEKIXCJBtxBCCCGEEEIIkUsk6BZCCCGEEEIIIXKJBN1CCCGEEEIIIUQukaBbCCGEEEIIIYTIJRJ0CyFEBurVq0e9evV0j2/cuIFKpWLJkiX51qfnPd/HzERHR1O4cGFWrFiRu53KI8WKFaN3797ZrtuqVavc7VAylUrFhAkT8uRYuWHPnj2oVCr27NnzwvvOnz8fd3d34uLisr3P8uXLKVOmDMbGxtja2r7wMQuKF/ldTLFkyRJUKhU3btzIlT6lyMv3v8ievHrthRAFgwTdQrymUv7DTrmZmZlRunRphgwZwoMHD3T1Uv6AVqlU/Prrr+m2VbNmTVQqFeXLl9eVPX36lDlz5tCkSRNcXFywtramUqVKzJs3j6SkpGz1sVixYnp9TLkNHDgwy31T91ulUmFsbEyJEiXo2bMn165dy9bxC4qDBw8yYcIEwsPD87UfM2bMwNramm7duunKJkyYgEql4vHjx/nYs5xx/vx5JkyY8Eb9ERsdHc348eMpX748lpaWODg44Ovry0cffURwcHB+dy+N3r17Ex8fz08//ZSt+hcvXqR37954enqycOFCFixYkKv9y+r9LsFpwZTe/3eurq40bdqUmTNnEhUVlSvH/frrr1m7dm2a8oLymZ4fgoODmTBhAqdOncrvrgjxWjHK7w4IIV7NpEmTKF68OLGxsfz777/MmzePTZs2cfbsWSwsLHT1zMzMWLlyJe+9957e/jdu3ODgwYOYmZnplV+7do2hQ4fSsGFDPv74Y2xsbNi6dSsffvghhw8fZunSpdnqn6+vLyNHjtQrK126dLbPb9iwYVStWpWEhAROnDjBggUL2LhxI2fOnMHV1TXb7eQEDw8PYmJiMDY2fqH9Dh48yMSJE+ndu3e+jeQlJCQwY8YMRowYgaGhYb70IacFBQVhYPDsu+Pz588zceJE6tWrR7FixfKtXzExMRgZvfp/rwkJCdSpU4eLFy/Sq1cvhg4dSnR0NOfOnWPlypW0b98+z38HsmJmZkavXr2YPn06Q4cORaVSZVp/z549aDQaZsyYQcmSJfOolwVHjx496NatG6ampvndlddCyv93CQkJ3L9/nz179jB8+HCmT5/OunXr8PHxydHjff3113Tq1Il27drplefEZ/rr+toHBwczceJEihUrhq+vb353R4jXhgTdQrzmmjdvTpUqVQD44IMPcHBwYPr06fzzzz+88847unotWrRg3bp1PH78mEKFCunKV65ciZOTE6VKlSIsLExX7uzszJkzZyhXrpyubMCAAfTp04fFixczduzYbP2RXKRIkTSB/ouoXbs2nTp1AuD999+ndOnSDBs2jKVLlzJmzJh093ny5AmWlpYvfcyMpIywvI42bNjAo0eP6NKlS3535ZUoikJsbCzm5uYF9o/VnHqPrF27lpMnT7JixQq6d++uty02Npb4+PgcOU5O69KlC9999x27d++mQYMGmdZ9+PAhQI5+GfX06VO9LxwLMkNDwzfmS7DY2FhMTEz0vgjLaan/vwMYM2YMu3btolWrVrRp04YLFy5gbm6e4f659X/Dy3iTXnshRNZkerkQb5iUP3KvX7+uV962bVtMTU1ZvXq1XvnKlSvp0qVLmv/8CxUqpBdwp2jfvj0AFy5cyHaf4uPjefLkSbbrZ+b580uZLnr+/Hm6d++OnZ0dtWrV0tX/9ddf8fPzw9zcHHt7e7p168bt27fTtLtgwQI8PT0xNzenWrVq7N+/P02djK7pvnjxIl26dMHR0RFzc3O8vLz44osvdP375JNPAChevLhuemTqKdA52ceMrF27lmLFiuHp6ZntfVLbtWsXtWvXxtLSEltbW9q2bZvue2DPnj1UqVIFMzMzPD09+emnn3SvUWqLFy+mQYMGFC5cGFNTU7y9vZk3b16a9lKm+27dupUqVapgbm6um7qc+pruJUuW0LlzZwDq16+ve56fvy7533//pVq1apiZmVGiRAmWLVumtz1lGuu///7LsGHDcHR0xNbWlgEDBhAfH094eDg9e/bEzs4OOzs7Pv30UxRF0WsjvWu67969S9++fXF1dcXU1JTixYszaNCgTAPnq1evAtrLP55nZmaGjY2NXllm70OAmzdv8uGHH+Ll5YW5uTkODg507tw529Pxjxw5QrNmzVCr1VhYWFC3bl0OHDiQpp6fnx/29vb8888/mbZXrFgxxo8fD4Cjo2Oa523u3LmUK1cOU1NTXF1dGTx4cJrpvPXq1aN8+fIcP36cOnXqYGFhweeff56t88kujUbD//73P8qVK4eZmRlOTk4MGDBA70vKjMyaNYty5cphYWGBnZ0dVapUYeXKlbrt6V3Xm/Kez+q9ChAYGEjdunUxNzenaNGiTJkyhcWLF2d4rfC2bdvw9fXFzMwMb29v1qxZk6bOtWvX6Ny5M/b29lhYWFC9enU2btyoVyfl8p9Vq1bx5ZdfUqRIESwsLIiMjARg9erVeHt7Y2ZmRvny5fn777/p3bt3rsxAadCgAWPHjuXmzZt6l1D17t0bKysrrl69SosWLbC2tubdd98FtMH3yJEjcXNzw9TUFC8vL77//nu932WVSsWTJ09YunSp7vOkd+/eWX6mq1QqhgwZwtq1aylfvjympqaUK1eOLVu26PU7r157jUbDhAkTcHV1xcLCgvr163P+/Pk0OTFCQ0MZNWoUFSpUwMrKChsbG5o3b87p06d1dfbs2UPVqlUB7ZfgKeee8n/i/v376dy5M+7u7piamuLm5saIESOIiYnR63vKa3P37l3atWuHlZUVjo6OjBo1KtuXrwnxupGRbiHeMCl/qDs4OOiVW1hY0LZtW3777TcGDRoEwOnTpzl37hw///wzgYGB2Wr//v37AHqj5ZnZtWsXFhYWJCUl4eHhwYgRI/joo4+yezppZHR+nTt3plSpUnz99de6P5y++uorxo4dS5cuXfjggw949OgRs2bNok6dOpw8eVI3urZo0SIGDBhAjRo1GD58ONeuXaNNmzbY29vj5uaWaX8CAwOpXbs2xsbG9O/fn2LFinH16lXWr1/PV199RYcOHbh06RK//fYbP/74o+55c3R0zLM+gnY6ZOXKlbP9PKe2Y8cOmjdvTokSJZgwYQIxMTHMmjWLmjVrcuLECd0f0idPnqRZs2a4uLgwceJEkpKSmDRpku5cU5s3bx7lypWjTZs2GBkZsX79ej788EM0Gg2DBw/WqxsUFMQ777zDgAED6NevH15eXmnaq1OnDsOGDWPmzJl8/vnnlC1bFkD3E+DKlSt06tSJvn370qtXL3755Rd69+6Nn59fmi+Yhg4dirOzMxMnTuTw4cMsWLAAW1tbDh48iLu7O19//TWbNm1i2rRplC9fnp49e2b4/AUHB1OtWjXCw8Pp378/ZcqU4e7du/z55588ffoUExOTdPfz8PAAYNmyZXz55ZeZTtXO6n0IcPToUQ4ePEi3bt0oWrQoN27cYN68edSrV4/z589nOjq8a9cumjdvjp+fH+PHj8fAwED3xcn+/fupVq2aXv3KlSunG5Cn9r///Y9ly5bx999/M2/ePKysrHTTgydMmMDEiRNp1KgRgwYNIigoiHnz5nH06FEOHDigd4lHSEgIzZs3p1u3brz33ns4OTllelzQBhjp0Wg0acoGDBjAkiVLeP/99xk2bBjXr19n9uzZnDx5Mk1fUlu4cCHDhg2jU6dOfPTRR8TGxhIYGMiRI0fSzFx4Xnbeq3fv3tV9wTRmzBgsLS35+eefM5wBcvnyZbp27crAgQPp1asXixcvpnPnzmzZsoXGjRsD8ODBA2rUqMHTp08ZNmwYDg4OLF26lDZt2vDnn3/qvnRNMXnyZExMTBg1ahRxcXGYmJiwceNGunbtSoUKFZg6dSphYWH07duXIkWKZHrOr6JHjx58/vnnbNu2jX79+unKExMTadq0KbVq1eL777/HwsICRVFo06YNu3fvpm/fvvj6+rJ161Y++eQT7t69y48//ghoE/x98MEHVKtWjf79+wPg6emJpaVlpp/poP1yb82aNXz44YdYW1szc+ZMOnbsyK1bt9L83/W8nH7tx4wZw3fffUfr1q1p2rQpp0+fpmnTpsTGxurVu3btGmvXrqVz584UL16cBw8e8NNPP1G3bl3Onz+Pq6srZcuWZdKkSYwbN47+/ftTu3ZtAGrUqAFov2x5+vQpgwYNwsHBgf/++49Zs2Zx586dNF/4JyUl0bRpU/z9/fn+++/ZsWMHP/zwA56enrq/UYR4oyhCiNfS4sWLFUDZsWOH8ujRI+X27dvKqlWrFAcHB8Xc3Fy5c+eOoiiKsnv3bgVQVq9erWzYsEFRqVTKrVu3FEVRlE8++UQpUaKEoiiKUrduXaVcuXKZHjMuLk7x9vZWihcvriQkJGTZx9atWyvffvutsnbtWmXRokVK7dq1FUD59NNPs9w3pd+//PKL8ujRIyU4OFjZuHGjUqxYMUWlUilHjx5VFEVRxo8frwDKO++8o7f/jRs3FENDQ+Wrr77SKz9z5oxiZGSkK4+Pj1cKFy6s+Pr6KnFxcbp6CxYsUAClbt26urLr168rgLJ48WJdWZ06dRRra2vl5s2besfRaDS6+9OmTVMA5fr167nex/QkJCQoKpVKGTlyZJptKc/fo0ePMtzf19dXKVy4sBISEqIrO336tGJgYKD07NlTV9a6dWvFwsJCuXv3rq7s8uXLipGRkfL8fzdPnz5Nc5ymTZvq3o8pPDw8FEDZsmVLmvoeHh5Kr169dI9Xr16tAMru3bvTrQso+/bt05U9fPhQMTU11XteUn6vmjZtqvcaBgQEKCqVShk4cKCuLDExUSlatGia5x9Qxo8fr3vcs2dPxcDAQPeeTS31MZ739OlTxcvLSwEUDw8PpXfv3sqiRYuUBw8epKmbnfdhes/5oUOHFEBZtmyZrizldy/ledRoNEqpUqXSPCdPnz5VihcvrjRu3DhNu/3791fMzc0zPLcU6b3/Hj58qJiYmChNmjRRkpKSdOWzZ8/WfSakqFu3rgIo8+fPz/JYqY+X2a1ly5a6+vv371cAZcWKFXrtbNmyJU153bp19d4Lbdu2zfIzNeX9lvqzIbvv1aFDhyoqlUo5efKkriwkJESxt7fPsM2//vpLVxYREaG4uLgolSpV0pUNHz5cAZT9+/fryqKiopTixYsrxYoV070eKe+REiVKpHlfVahQQSlatKgSFRWlK9uzZ4/uffwyUp6n9H6HUqjVar1z6dWrlwIon332mV69tWvXKoAyZcoUvfJOnTopKpVKuXLliq7M0tJS7zMmRUaf6Yqi/f03MTHRa+f06dMKoMyaNSvNOeXma3///n3FyMhIadeunV4fJ0yYoAB65xYbG6v3+6Yo2v/zTE1NlUmTJunKjh49mub/wRTpfcZMnTpVUalUep9NKa9N6nYVRVEqVaqk+Pn5pWlDiDeBTC8X4jXXqFEjHB0dcXNzo1u3blhZWfH333+nO6rQpEkT7O3tWbVqFYqisGrVKr3rvrMyZMgQzp8/z+zZs7OVKGrdunV8+umntG3blj59+rB3716aNm3K9OnTuXPnTraO2adPHxwdHXF1daVly5a66X6pr+sD0mREX7NmDRqNhi5duvD48WPdzdnZmVKlSrF7924Ajh07xsOHDxk4cKDeiGPv3r1Rq9WZ9u3Ro0fs27ePPn364O7urrctqwRSedVH0I7qKYqCnZ1dlnWfd+/ePU6dOkXv3r2xt7fXlfv4+NC4cWM2bdoEaEctduzYQbt27fSSe5UsWZLmzZunaTf1dZcRERE8fvyYunXrcu3aNSIiIvTqFi9enKZNm75w35/n7e2tG5kB7ciUl5dXutnw+/btq/ca+vv7oygKffv21ZUZGhpSpUqVTLPpazQa1q5dS+vWrdO8ZyHz94m5uTlHjhzRTWVdsmQJffv2xcXFhaFDh+qW5cru+zD1c56QkEBISAglS5bE1taWEydOZNiPU6dOcfnyZbp3705ISIjuffrkyRMaNmzIvn370owQ29nZERMTw9OnTzNsNyM7duwgPj6e4cOH610f3K9fP2xsbNJMdTY1NeX9999/oWP89ddfbN++Pc3t+VHy1atXo1arady4sd7vqJ+fH1ZWVrrf0fTY2tpy584djh49+kJ9g+y9V7ds2UJAQIBeMit7e3vdFOrnubq66o1U29jY0LNnT06ePKmbwbRp0yaqVaumd4mOlZUV/fv358aNG5w/f16vzV69eum9r4KDgzlz5gw9e/bEyspKV163bl0qVKjwgs/Ci7Gysko3i/nzo6abNm3C0NCQYcOG6ZWPHDkSRVHYvHnzK/elUaNGepfy+Pj4YGNjk62VN3Lytd+5cyeJiYl8+OGHeuVDhw5Nc1xTU1Pd71tSUhIhISFYWVnh5eWV6edDaqnfC0+ePOHx48fUqFEDRVE4efJkmvrP/79du3bt1251EiGyS6aXC/GamzNnDqVLl8bIyAgnJye8vLwyTGRjbGxM586dWblyJdWqVeP27dtZTnNMMW3aNBYuXMjkyZNp0aLFS/VVpVIxYsQItm7dyp49e7KVYG3cuHHUrl0bQ0NDChUqRNmyZdMN+IsXL673+PLlyyiKQqlSpdJtN2VK6M2bNwHS1EtZoiwzKX8cpF5q7UXkRR9TU5679jg7Uo6d3pTusmXLsnXrVp48eUJkZCQxMTHpJtdLr+zAgQOMHz+eQ4cOpQnMIiIi9L5MeP61fVnPB6SgDQ7Tuzb3+bop/Xl+Kr9arc702t5Hjx4RGRn50u8RtVrNd999x3fffcfNmzfZuXMn33//PbNnz0atVjNlypRsvw9jYmKYOnUqixcv5u7du3rvh+e/6Ejt8uXLgDbAykhERITelzopbWfny6fnZfSeMzExoUSJErrtKYoUKZLhFP2M1KlTJ91LZJ5Pgnf58mUiIiIoXLhwuu2kJIJLz+jRo9mxYwfVqlWjZMmSNGnShO7du6d7jf7zsvNevXnzJgEBAWnqZZTgsmTJkmlej5SVJG7cuIGzszM3b97E398/zb4pl2ncvHlT7332/O9mymuT0edAdoO3lxEdHZ3mdTIyMqJo0aJp+ujq6oq1tbVeeepzfFUv8lnzMvtm97XP6PWwt7dP8yVsyioCc+fO5fr163rXVmc1JT7FrVu3GDduHOvWrUtzrs9/xpiZmaW59Ci7z5EQryMJuoV4zVWrVi3dEbSMdO/enfnz5zNhwgQqVqyIt7d3lvssWbKE0aNHM3DgQL788stX6a4uaMnomsrnVahQgUaNGmVZ7/mMtRqNBpVKxebNm9PNEJt6FCa/5FUf7e3tUalUBeaPmatXr9KwYUPKlCnD9OnTcXNzw8TEhE2bNvHjjz+mGTXNLBvxi8goU3B6X0ZkVDe98pf5MuNleHh40KdPH9q3b0+JEiVYsWIFU6ZMyfb+Q4cOZfHixQwfPpyAgADUajUqlYpu3bqley1zipRt06ZNy3CJoOffq2FhYVhYWOTYa5eZ3DyGRqOhcOHCrFixIt3t6eUrSFG2bFmCgoLYsGEDW7Zs4a+//mLu3LmMGzeOiRMnZnrcF3mv5qe8eH2z486dO0RERKQJLlOP3ualV3n98uu1//rrrxk7dix9+vRh8uTJ2NvbY2BgwPDhwzP9fEiRlJRE48aNCQ0NZfTo0ZQpUwZLS0vu3r1L796907QhmdvF20aCbiHeMrVq1cLd3Z09e/bw7bffZln/n3/+4YMPPqBDhw7MmTPnlY+fMiqX2R+rOcHT0xNFUShevHim64KnJKu6fPmy3vJGCQkJXL9+nYoVK2a4b8oo89mzZzPtS0ajfXnRR9CO9nh6eqbJaJ8dKccOCgpKs+3ixYsUKlQIS0tLzMzMMDMz48qVK2nqPV+2fv164uLiWLdund6oTmZTdbPjZUZVc5ujoyM2NjZZvkdehJ2dHZ6enro2s/s+/PPPP+nVqxc//PCDriw2NjZNRvDnpUyTtbGxydYXYKBdXSB1ErsXkfo9l3omR3x8PNevX892H3KCp6cnO3bsoGbNmi8VYFpaWtK1a1e6du1KfHw8HTp04KuvvmLMmDGvvLSch4dHtn7fUpcriqL3e3Lp0iUAXTJEDw+PDH/XU7Zn1aeM+pBRv3LC8uXLAbJ1GYqHhwc7duwgKipKb7Q7vXPM6DMlvz9rsvvap349Us9KCAkJSfMl7J9//kn9+vVZtGiRXnl4eLjerJCMzv3MmTNcunSJpUuX6iWW3L59ezbPSog3m1zTLcRbRqVSMXPmTMaPH0+PHj0yrbtv3z66detGnTp1WLFiRYYjBgkJCVy8eJF79+7pykJDQ9Ms/ZGQkMA333yDiYkJ9evXf/WTyUSHDh0wNDRk4sSJaUYIFEUhJCQEgCpVquDo6Mj8+fP1lm9asmRJlsGIo6MjderU4ZdffuHWrVtpjpEiZV3Y59vLiz6mCAgI4NixY9mqm5qLiwu+vr4sXbpU71hnz55l27ZtuksNDA0NadSoEWvXriU4OFhX78qVK2mukUwZ4Xh+evPixYtfuH+pZfQ85ycDAwPatWvH+vXr033+Mxu9On36NI8fP05TfvPmTc6fP6+bfp3d96GhoWGa482aNSvLJXr8/Pzw9PTk+++/Jzo6Os32R48epSk7ceKELqPxi2rUqBEmJibMnDlTr7+LFi0iIiKCli1bvlS7L6NLly4kJSUxefLkNNsSExMzfa+l/P6mMDExwdvbG0VRSEhIeOW+NW3alEOHDnHq1CldWWhoaIaj8sHBwfz999+6x5GRkSxbtgxfX1+cnZ0BaNGiBf/99x+HDh3S1Xvy5AkLFiygWLFiWc6McnV1pXz58ixbtkzvvbJ3717OnDnzMqeZpV27djF58mSKFy+e4fXsqbVo0YKkpCRmz56tV/7jjz+iUqn0clBYWlqm+xrn92dNdl/7hg0bYmRklGY5xufPHdL/fFi9ejV3797VK8vo3NP7XFcUhRkzZmTvpIR4w8lItxBvobZt29K2bdtM69y8eZM2bdqgUqno1KlTmuU+fHx8dMv73L17l7Jly9KrVy/dep3r1q1jypQpdOrUieLFixMaGsrKlSs5e/YsX3/9te6PvNzi6enJlClTGDNmDDdu3KBdu3ZYW1tz/fp1/v77b/r378+oUaMwNjZmypQpDBgwgAYNGtC1a1euX7/O4sWLs3W99MyZM6lVqxaVK1emf//+FC9enBs3brBx40bdH0R+fn4AfPHFF3Tr1g1jY2Nat26dZ30E7Wu+fPlyLl26lO6o+vTp09MsGWVgYMDnn3/OtGnTaN68OQEBAfTt21e3ZJhardZbV3nChAls27aNmjVrMmjQIN0ftuXLl9f747BJkyaYmJjQunVrBgwYQHR0NAsXLqRw4cJ6X9y8KF9fXwwNDfn222+JiIjA1NRUtxZ4fvr666/Ztm0bdevWpX///pQtW5Z79+6xevVq/v33X92ycM/bvn0748ePp02bNlSvXh0rKyuuXbvGL7/8QlxcnN5zn533YatWrVi+fDlqtRpvb28OHTrEjh07srxe08DAgJ9//pnmzZtTrlw53n//fYoUKcLdu3fZvXs3NjY2rF+/Xlf/+PHjhIaGZvkZkxFHR0fGjBnDxIkTadasGW3atCEoKIi5c+dStWrVbOWCyCl169ZlwIABTJ06lVOnTtGkSROMjY25fPkyq1evZsaMGXTq1CndfZs0aYKzszM1a9bEycmJCxcuMHv2bFq2bJnmeuKX8emnn/Lrr7/SuHFjhg4dqls2yt3dndDQ0HSv3+7bty9Hjx7FycmJX375hQcPHuh92fXZZ5/x22+/0bx5c4YNG4a9vT1Lly7l+vXr/PXXX9maqv3111/Ttm1batasyfvvv09YWJjuc+D5L2169+6taz87a3hv3ryZixcvkpiYyIMHD9i1axfbt2/Hw8ODdevWZWv2QOvWralfvz5ffPEFN27coGLFimzbto1//vmH4cOH6yVA8/PzY8eOHUyfPh1XV1eKFy+Ov79/hp/pKQFpbsvua+/k5MRHH33EDz/8QJs2bWjWrBmnT59m8+bNFCpUSO890qpVKyZNmsT7779PjRo1OHPmDCtWrEjzf4ynpye2trbMnz8fa2trLC0t8ff3p0yZMnh6ejJq1Cju3r2LjY0Nf/31V4G5rEmIfJf7CdKFELkhO0uoKIr+kmGZeX7JsJT9MrqlXhIpZSmt1MuPHDt2TGndurVSpEgRxcTERLGyslJq1aql/PHHH9k6v+z2O6slr/766y+lVq1aiqWlpWJpaamUKVNGGTx4sBIUFKRXb+7cuUrx4sUVU1NTpUqVKsq+ffvSLAGU3pJhiqIoZ8+eVdq3b6/Y2toqZmZmipeXlzJ27Fi9OpMnT1aKFCmiGBgYpFkmJif7mJG4uDilUKFCyuTJk9N9/tK7GRoa6urt2LFDqVmzpmJubq7Y2NgorVu3Vs6fP5/mODt37lQqVaqkmJiYKJ6ensrPP/+sjBw5UjEzM9Ort27dOsXHx0cxMzNTihUrpnz77bfKL7/8ku4SOqmXcErt+SXDFEVRFi5cqJQoUUIxNDTUW/Yqo3aef/4y+r3K6H3Wq1cvxdLSUq/s+d8PRVGUmzdvKj179lQcHR0VU1NTpUSJEsrgwYP1loB73rVr15Rx48Yp1atXVwoXLqwYGRkpjo6OSsuWLZVdu3alqZ/V+zAsLEx5//33lUKFCilWVlZK06ZNlYsXL6Z5Hp9fMizFyZMnlQ4dOigODg6Kqamp4uHhoXTp0kXZuXOnXr3Ro0cr7u7umS6HliKz39/Zs2crZcqUUYyNjRUnJydl0KBBSlhYmF6d7Cx1mN3jKUrG75MFCxYofn5+irm5uWJtba1UqFBB+fTTT5Xg4GC9vqR+L/30009KnTp1dM+Xp6en8sknnygRERG6OhktG5Wd96qiaF+T2rVrK6ampkrRokWVqVOnKjNnzlQA5f79+2na3Lp1q+Lj46OYmpoqZcqUSffz9erVq0qnTp1076Nq1aopGzZs0KuT1efzqlWrlDJlyiimpqZK+fLllXXr1ikdO3ZUypQpo1evY8eOirm5eZrX9Xkpz1PKzcTERHF2dlYaN26szJgxQ4mMjEyzT3q/mymioqKUESNGKK6uroqxsbFSqlQpZdq0aWnesxcvXlTq1KmjmJubp/k/LqPPdEAZPHhwmmM+/3uWV699YmKiMnbsWMXZ2VkxNzdXGjRooFy4cEFxcHDQWwIxNjZWGTlypOLi4qKYm5srNWvWVA4dOpTusf/55x/F29tbtxxkyv+J58+fVxo1aqRYWVkphQoVUvr166dbLi31/5sZvTYpv59CvIlUilLAsnIIIYTIFZMnT2bx4sVcvnw5T5PYtGvXjnPnzumyYIs3V1xcHMWKFeOzzz7jo48+yu/uvJWGDx/OTz/9RHR0dIFKVuXr64ujo6PeNb5OTk707NmTadOm5WPP3hzZfe3Dw8Oxs7NjypQpfPHFF3nYQyHeXnJNtxBCvCVGjBhBdHQ0q1atyrVjxMTE6D2+fPkymzZtol69erl2TFFwLF68GGNj4zTr74rc8fzvW0hICMuXL6dWrVr5FnAnJCSQmJioV7Znzx5Onz6t9zlw7tw5YmJiGD16dB738M2Q3df++XoA//vf/wDkc1mIPCQj3UIIIXKMi4sLvXv31q2nPG/ePOLi4jh58mSG65ELIV6Or68v9erVo2zZsjx48IBFixYRHBzMzp07qVOnTr706caNGzRq1Ij33nsPV1dXLl68yPz581Gr1Zw9ezbbaz6LzGX3tV+yZAlLliyhRYsWWFlZ8e+///Lbb7/RpEkTtm7dmo9nIMTbRRKpCSGEyDHNmjXjt99+4/79+5iamhIQEMDXX38tAbcQuaBFixb8+eefLFiwAJVKReXKlVm0aFG+BdygXdLOz8+Pn3/+mUePHmFpaUnLli355ptvJODOQdl97X18fDAyMuK7774jMjJSl1xtypQp+dRzId5O+TrSPWHCBCZOnKhX5uXlpVsrMTY2lpEjR7Jq1Sri4uJo2rQpc+fOxcnJSVf/1q1bDBo0iN27d2NlZUWvXr2YOnUqRkbyfYIQQgghhBBCiPyV75FpuXLl2LFjh+5x6mB5xIgRbNy4kdWrV6NWqxkyZAgdOnTgwIEDACQlJdGyZUucnZ05ePAg9+7do2fPnhgbG/P111/n+bkIIYQQQgghhBCp5ftI99q1a/XWb00RERGBo6MjK1eu1K2BefHiRcqWLcuhQ4eoXr06mzdvplWrVgQHB+tGv+fPn8/o0aN59OgRJiYmeXk6QgghhBBCCCGEnnwf6b58+TKurq6YmZkREBDA1KlTcXd35/jx4yQkJNCoUSNd3TJlyuDu7q4Lug8dOkSFChX0pps3bdqUQYMGce7cOSpVqpTuMePi4oiLi9M91mg0hIaG4uDggEqlyr2TFUIIIYQQQgjxRlAUhaioKFxdXTEwyHhhsHwNuv39/VmyZAleXl7cu3ePiRMnUrt2bc6ePcv9+/cxMTHB1tZWbx8nJyfu378PwP379/UC7pTtKdsyMnXq1DTXkgshhBBCCCGEEC/q9u3bFC1aNMPt+Rp0N2/eXHffx8cHf39/PDw8+OOPPzA3N8+1444ZM4aPP/5Y9zgiIgJ3d3d2/PAD6ueCfCGEEEIIIYQQ4nkR4eE0GjkSa2vrTOvl+/Ty1GxtbSldujRXrlyhcePGxMfHEx4erjfa/eDBA5ydnQFwdnbmv//+02vjwYMHum0ZMTU1xdTUNE252tYWO0fHHDgTIYQQQgghhBBvg6wuUc544nk+iI6O5urVq7i4uODn54exsTE7d+7UbQ8KCuLWrVsEBAQAEBAQwJkzZ3j48KGuzvbt27GxscHb2zvP+y+EEEIIIYQQQqSWryPdo0aNonXr1nh4eBAcHMz48eMxNDTknXfeQa1W07dvXz7++GPs7e2xsbFh6NChBAQEUL16dQCaNGmCt7c3PXr04LvvvuP+/ft8+eWXDB48ON2RbCGEEEIIIUT+UVQqNAYGIMmLxetEUTDQaFC95MJf+Rp037lzh3feeYeQkBAcHR2pVasWhw8fxjF5ivePP/6IgYEBHTt2JC4ujqZNmzJ37lzd/oaGhmzYsIFBgwYREBCApaUlvXr1YtKkSfl1SkIIIYQQQoh0JBobE2tvj8rQML+7IsQLU5KSMAsNxSgh4YX3zdd1uguKyMhI1Go1Rxctkmu6hRBCCCGEyGGKSsWTwoWxsbPDzsZGlukVrxVFUQiLjCQyLAzLhw91I95hjx5RtW9fIiIisLGxyXD/ApVITQghhBBCCPHm0RgYoDI0xM7GBjO5DFS8huxsbIiKjERjYIBhUtIL7VugEqkJIYQQQggh3kDJI9sywi1eV7r37ku8hyXoFkIIIYQQQry29v37L+Z2doRHROR3V7JkbmfHuo0bAbh56xbmdnacPnMmn3v1eun34Yd0fvfd/O7GC5GgWwghhBBCCFGgHf7vPywdHGjfpUuabdWrVeP6xYuoM7mmNjO//vYbNRs0wN7VFUc3Nxq3bMmmLVtetctZKlqkCNcvXqRc2bJAzn95sHf/ftp17kyREiWwd3WlUvXqjP7yS+4GB2e7jSatWjFqzJgc6U9O+X7qVBamSq79OpCgWwghhBBCCFGgLf31Vwb178+/hw4RfO+e3jYTExOcnZwynLqelJSERqNJd9tnY8cyZMQIOrVvz9F//2X/jh3UqF6dzu++y7wFC3L8PFIzNDTE2ckJI6OcT7P18+LFtGjXDicnJ35btoyThw8z64cfiIyMZMacOTl+vLyQ8jqq1Wps1er87s4LkaBbCCGEEEIIUWBFR0fz599/079PH5o1bsyvK1fqbX9+hHj5ypU4e3iwYdMmKlWvjtrJidt37qRp98jRo8yYPZuvJ01ixNCheJYoQRkvLyaOHcuQQYMY/eWXuv2mfPMN/rVr6+0/a948vHx8dI+PnThBy/btKerpiZO7O41btuTk6dMZnlfq6eU3b92iaevWALgUK4a5nR39PvyQFatWUaRECeLi4vT27fzuu/QZMCDddu/cvcvIzz7jwwED+Gn2bOrUqoWHuzu1atZk3syZfP7ppwCEhIbSs29fSnh7Y+/qSpUaNfj9zz917fT78EP2HzjAnPnzMbezw9zOjpu3bgFw7vx52nbqRKGiRfEoXZo+AwbwOCREt29UVBS9+/XDoUgRipcpw8y5c9OMmoeFh9N34EBcihXD3tWVtp06ceXqVd32jF7H56eXazQapk2fTpmKFbFzcaFarVqs+ecfveP07tcPt5IlsXNxobyfH8tWrMjwdckNEnQLIYQQQgghCqy/1q6ldKlSlC5Vine6dGHpihVkterx05gYfpgxg7kzZnDi0CEcCxVKU+ePv/7CysqKD3r3TrPto8GDSUhIYO369dnuZ3R0NO9168bOzZvZu307JT09ad+lC1FRUVnuW7RIEX5btgyAwKNHuX7xIt9PnUqHtm1JSkpiw+bNuroPHz1iy7Zt9HrvvXTbWvPPP8THx/PxsGHpbk8ZJY6NjaWSry9///47xw8epE/v3vQdOJCjx48D2mnc/lWr0qdXL65fvMj1ixcpWqQI4RERNG/bloo+PhzYtYt//vyTh48e8d777+uOMfrLLzl05Ah/rlzJhjVrOHDoEKcCA/X60f/DDzlx6hSrV65kz9atKEC7Ll1ISLUOdnZex2nTp7Pi99+ZNX06Jw4dYuiHH9JnwAD2HzgAwMSvvuJiUBBrV6/m1JEjzPzhBxzs7bN6SXKULBkmhBBCCCGEKLCWLF/OO8nXcjdp1IgBQ4aw/8AB6tSqleE+CQkJzPj+e3wqVMiwzpUrVyhRrBgmJiZptrm6uGBjbc2VK1ey3c96deroPZ7zv//hXKwY+w8coEWzZpnua2hoiL2dHQCOjo5606e7durE8hUr6NiuHQC//fEHbkWLZnj+V69excbaGhdn50yPWcTVlRFDh+oef9i/Pzt27uSvtWup6ueHWq3GxMQEc3NznJ2cdPXmL1xIRR8fJo0b96xs1ixKlS/P5StXcHZy4tfffmPJwoXUr1sXgAWzZ1PC21tX/8rVq2zYvJldW7YQ4O8PwOIFCyhVvjzrNm7UnWtWr2NcXBzf/fgjG//+m+rVqgFQvFgxDh4+zM+LF1O7Zk3u3LlDRR8f/CpVAsDD3T3T5yU3SNAthBBCCCGEKJAuXb7MsRMn+P3XXwEwMjKiY/v2LFm+PNOg28TEhArly2fZflYj5sbpBOQZefDwIRO/+op9//7Lo0ePSNJoePr0abpT21/E+716UatBA+4GB1PE1ZVfV66kR/fuGV7DrihKtpZmS0pK4rvp0/nr778JvneP+IQE4uLiMLewyHS/wLNn2bt/P4WKFk2z7dr168TExJCQkECVypV15Wq1mtIlS+oeXwwKwsjIiGpVqujKHOztKV2yJEGXLunKsnodr167xtOnT2nVoYNeeXx8PBWTp/7369OHd3r14tTp0zSsX5/WLVvqAv28IkG3EEIIIYQQokBasnw5iYmJlEjO8A3aoNLU1JQfv/sOdQYJtczNzLIMPD09PTl45Ajx8fFpRruD790jMiqKUp6eABgYGKQJ0FNPgwbtNdAhoaF8P3Uq7m5umJqaUq9JE+Kfq/eifH188ClfnpWrVtGwQQPOX7zImnfeybB+yZIliYiM5N79+5mOdk+fOZM58+cz7euvKeftjaWlJZ+MGUN8fHym/XkSHU2LZs34asKENNucnZy4eu1ats8tK1m9jtFPngDw9++/4+riorct5TVt2rgxQYGBbN2+nZ27d9OiXTsGfPAB30yenGP9zMpbfU33nDlz8Pb2pmrVqvndFSGEEEIIIUQqiYmJrPz9d76ZMoUj+/bpbv/t34+LszN//PXXK7XfpWNHoqOj+XnJkjTb/jd7NmZmZnRKHkEt5ODAg4cP9QLvwOfW1z505AiD+/enWZMmeJcti4mJiV5ysawYGxsD2hHo5/Xu0YPlv/3GshUraFCvHm7pjDKnaN+mDSYmJkyfOTPd7SkJ5w4fOUKrFi14p2tXfCpUoHixYlxOlcgMtIHr8/3xrViRCxcv4uHujmeJEno3S0tLihcrhrGxMcdPntTtExERodd2GS8vEhMT+e/YMV1ZSGgol65coYyXV4bn9ryyXl6Ymppy+/btNH1J/Rw5FirEe++8w+IFC5j29df8snRpto+RE97qoHvw4MGcP3+eo0eP5ndXhBBCCCGEEKls2rpVm3n6vfco5+2td2vXujVLkqecv6zq1aoxeOBAPh83jv/Nns2169cJunSJCVOmMPenn5j7v//pEm7VqVWLR48f88OMGVy7fp35CxeybccOvfZKlijByj/+4GJQEP8dO8b7/ftjbm6e7f64u7mhUqnYvHUrjx4/Jjo6Wreta6dO3A0OZvGyZfRMlbk7PW5Fi/LdV18xZ/58Bg4dyv4DB7h56xYHDx9myPDhTJ02DdCO9O/cvZtDR45wMSiIISNG8PDhQ722PNzdOXr8ODdv3eJxSAgajYYBH3xAWFgYPT/4gGMnTnDt+nW279xJ/8GDSUpKwtramvfeeYfPx41j7/79nL9wgYHDhmFgYKAbtS7p6UmrFi0YPHw4Bw4dIvDMGfr074+riwutW7TI9nNmbW3N8CFD+PSLL/j1t9+4dv06J0+fZu6CBfz6228ATPr6a9Zv2sTVa9c4f+ECm7duxat06WwfIye81UG3EEIIIYQQomBaunw5DerWTXcKebs2bThx8iRnzp59pWN8P3UqM77/ntV//YVfjRr4+vvz46xZbPnnH97p2lVXr4yXFzO+/56ffv6ZarVrc+zECYYPGaLX1rxZswgLDyegXj36DhzIhwMGpJttOyNFXF0ZO2YMYydOxKN0aUYkL+0F2mui27VujZWlJW1atsyyrQEffMCGNWsIvnePru+9h6+/Px9+9JEuSAX4bNQofCtWpE2nTjRt3RqnwoVp/Vzbw4cMwdDQkErVq+NWsiS379zB1cWFXVu2kJSUROsOHahSsyaffP45arUaAwNtePntlCn4V61Kh27daNm+PQH+/niVLo2Zqamu7QVz5lCpYkU6dutGvaZNUYC1f/yhG/HPrvFffMFnn3zCtB9/xNffn7adOrFl2zaKJSdMMzExYdykSVStVYvGLVtiYGjI8kWLXugYr0qlZJU94C0QGRmJWq3m6KJF2Dk65nd3hBBCCCGEeKMkGRkRW7gwHm5umL5AcrK8dvPWLRq3bIl/1aosWbgQQ0PD/O6STvO2bSlbpgzTv/02v7vywp48eYKntzffTJlC7x498rs7LyUuPp6bt29j9vAhhomJAIQ9ekTVvn2JiIjAxsYmw31lpFsIIYQQQggh0E6n3rZhA16lS3P6uWu280tYeDj/bNjAvn//ZeAHH+R3d7LlVGAgv//5p266d+/+/QFo9QJTx98kkr1cCCGEEEIIIZIV8/Dgy88+y+9u6FSvU4fw8HCmTJhA6VKl8rs72TZj9mwuXbmCibExlXx92bFpE4UcHPK7W/lCgm4hhBBCCCGEKKCCAgPzuwsvzNfHh4N79uR3NwoMmV4uhBBCCCGEEELkEgm6hRBCCCGEEEKIXCJBtxBCCCGEEEIIkUsk6BZCCCGEEEIIIXKJJFITQgghhBBC5LlbkbcJiQ3NkbYczOxxt3HL/Hi3bzNqzBjOnD2Lna0thQoVYsr48fhUqPBKx/5ywgS8SpemR/fuGdaJjY2lV79+nDt/niKurqxYsiTDTN4ajYa6TZpQzN2d5b/8AsD2nTv5csIEEhITad+mDWPHjHmlPou8JUG3EEIIIYQQIk/diryNz7KqxCXF5Uh7poamBPY8mmHgrdFo6PreewwZNIg/fv0VgGMnTnDtxo1XDrqzY/GyZZTy9OT35cuZv3Ah3//vf3wzeXK6dZcsX46Hu7te34eMGMHOzZsp4urKe336cCowEF8fn1zvt8gZMr1cCCGEEEIIkadCYkNzLOAGiEuKy3TUfPfevajVat7t1k1XVqVyZdq1bg1oA/Ca9etTpUYNhn38MUlJSQBs2baNqjVr4hcQwJRvvtHtu2DRIipUqULD5s25duNGlv3buGUL3bt2BaB7165s3ro13XqhYWGsXrOGvr166coeh4Rgq1ZTtEgRVCoVdWvVYv3GjVkeUxQcEnQLIYQQQggh3mgXL13KdER7wODBzPrxR44dPEhoeDh//PknMTExfDRqFGt+/53D+/axc/duDhw6xN3gYGbNm8eBXbv4+/ffOX7ihK6dSV9/zYZNm9K0f+/ePVxdXQGwsbEhKjo63X5MmDyZMZ98gqGhoa7MsVAhIiIjCbp0iYSEBDZv3UrwvXsv+1SIfCDTy4UQQgghhBBvlS7vvcflK1doUK8eY8eMQaMoVPb1BaBbp05s27EDb29vynp54Va0KACdOnTg0JEjhISG0qBuXWxsbABo1rixrt1xn3/+0n06FRhIWHg4dWrVYt+//+rKVSoVC+fOpf+QIQBU9vUlMSHhpY8j8p4E3UIIIYQQQog3mlepUnoj0H/8+ivbduxg9Zo1L9WeSqVK935GXFxcCA4OxlatJjIyEitLSwBatGtHSEgILZs3x9nJiQOHD+Pl40NcXBxR0dF8NHIkM374gdo1a7J32zYAZs2bR2Ji4kv1W+QPmV4uhBBCCCGEeKM1qFeP0NBQfvv9d11ZTGwsALZqNYYGBgSeOQPAH3/9RUD16pQuWZKLly4RfO8eiYmJrFm7lgB/f/wqVWLX3r1ERUURFRXF1h07sjx+86ZNWZl87JW//07zpk0B2LR2LUf272fc55/Tv29frp0/T1BgIMsWLaJF06bM+OEHAB49fgxor/levmIF73TpknNPjsh1MtIthBBCCCGEeKMZGBjwx4oVjPrsMyZNnUrhwoVxsLPj89GjAZg/ezaDhg0jLi6OAH9/unTsiKGhIf+bNo12nTuTlJRE+7ZtqRkQAMCQgQOpUb8+hR0dqVypku44k77+msq+vrRq0ULv+H169qTnBx9Q3s8PF2dnVi5d+kL9/276dLbv3IlKpWLCl1/i7OT0is+IyEsqRVGU/O5EfouMjEStVnN00SLsHB3zuztCCCGEEEK8UZKMjIgtXBgPNzdMTUzyfMkwIV5VXHw8N2/fxuzhQwyTp/eHPXpE1b59iYiI0F3jnx4Z6RZCCCGEEELkKXcbNwJ7Hs10ma8X4WBmLwG3KLAk6E4lJiwKE3lKhBBCCCGEyFGKqQkUKoQmKQlN8ihhUQsXilq45NgxNJJcTOQiTVISikZDTGgEqrh4QBs/ZsdbHWHOmTOHOXPmkJSUBMCdQzcINZY174QQQgghhMhJRvbWOLu5kxAdh8owKb+7I8QLS0hKJDEmgfsHr5IYqg22nyZk7/IIuaabZ9d07/p+E2o7dX53RwghhBBCiDeKYqrCqLQ5bkXdMDU2ze/uCPHC4hLiuH3nNomXYlDFaUPoiLAIGoxqIdd0vwgzO1ssHe3zuxtCCCGEEEK8UTRGGhIMEjA0NMLQSEIQ8fox1CShMjDAwt4Wg0TtyttxZL1GO8g63UIIIYQQQgghRK6RoFsIIYQQQgiR91S3UBmezJEbqltZHs7czpyPR3+se3zp8iXM7cxZ+MvCbHd54S8LmfLNlJc63efNmjeLxFdI/ubl40W1WtXwr+1Pu87tdOXXrl+jZv2alKtcjqEjhpLe1cSKovDx6I/xC/DDv7Y/R44e0W2b9uM0/AL88AvwY8OmDS/dP/GMzO0QQgghhBBC5C3VLUxtfFCpcmadbkUxJS4yEBT3DOs4FnLk8JHDKIqCSqVizT9rKFe2XI4cPyNJSUkYGhqmu232vNn0e78fRq8w3X7fjn2YmZnplX0x4QvGfzGeJo2a0L13dzZv3UyLZi306mzcvJE7d+9w7OAx7t2/R48+Pdi5eSdnzp5h3cZ1HNp7iLi4OJq3a06TRk0wMTF56T4KGekWQgghhBBC5DGVQUiOBdwAKlUcKoOQTOsYGBhQ1a8qh/87DMCWbVto2ripbvuxE8eoWb8mVWpUYdjHw3QrHK3ftJ4KVSpQq2Etjp04pqt/5eoVWrZvSY16NWjTqQ0PHj4AtCPQYyeOxb+2P4f/O8zkqZOp2aAmfgF+jJs0DoD5C+dz7/496jSqw3t93gNg6a9LqdmgJtVqVeOrb796qedBURSOHjtKk0ZNAHi367ts2rIpTb2gy0HUrlkblUqFq4sr8Qnx3Lh5g6DLQfhX9cfExARra2uKeRTj0JFDL9UX8YwE3UIIIYQQQoi3Qod2HVjzzxouX7lM0aJFMTc3120bMHgAs36cxbGDxwgND+WPP/8gJiaGUZ+NYsu6LezavIvzF8/r6g//ZDhzZ8zl4J6D9HqvF1OnTdVt83D34Mj+I9QMqMnggYM5sOsARw8c5ey5swSeCWRgv4G4OLuwb8c+fv3lVy5cvMC2ndvYt30fh/cd5uSpkxw/eRwA/9r+6Z6LSqWiQbMG1GpYizX/rAEgJDQEB3sHXZ0iRYoQfC84zb7lvcuzbcc24uPjuXL1ChcuXuBu8F28y3izb/8+oqKiePjoIYeOHCI4OO3+4sXI9HIhhBBCCCHEW6FWjVp8MeELHOwdaN+mPRcuXgAgPCIcjaKhsm9lALp16sa2Hdvw9vamrFdZirgWAaBd63bExMQQFRXFoSOH6PJuF0A7jbx48eK643Ro10F3f/fe3UyfOZ34uHgePnrIhaAL+FTw0evX7n27OfLfEWrUqwFA9JNorly9gl8lP47sP0J6dm3ZhauLK3eD79KiXQsqVqiIWp295Y+bNm7K4f8OU7thbTw8PKhSuQpGRkZ4l/WmT68+NG7ZmEKFClGtSjUMjdKfHi+yL19HuqdOnUrVqlWxtramcOHCtGvXjqCgIL069erVQ6VS6d0GDhyoV+fWrVu0bNkSCwsLChcuzCeffPJKSQmEEEIIIYQQbx5DQ0P8fP1YuHghzRo3y9Y+KpUqzX2NRoOriytH9h/hyP4jHDt4jNUrVuvqWZhbABAbG8voL0bz9+9/c/TAUdq3bU98fHyaYyiKQv8+/XXtnTtxjq6dumbaL1cXVwCKuBahQb0GnD5zGgd7B0JCn02zv3v3Li4uLty8dRP/2v741/bXJUcb/8V4juw/wh+//kF4eDjFi2m/NBjYbyCH9x1mw5oNJCYm4lnCM1vPk8hYvgbde/fuZfDgwRw+fJjt27eTkJBAkyZNePLkiV69fv36ce/ePd3tu+++021LSkqiZcuWxMfHc/DgQZYuXcqSJUsYN25cXp+OEEIIIYQQooAb1H8QU8ZPwdLSUldmq7bF0MCQwDOBAPzx1x8EVA+gdMnSXAi6QPC9YBISEvhnwz8AqNVqbG1t2bFrBwAJCQlcDLqY5lixcbEYGBhgZ2tHaFio3vXV1lbWREVHAVCvdj1Wr1lNeEQ4AHfu3tELnp/35MkToqK0+0ZERPDvgX8pU7oMKpUKv8p+bNuxDYAVv6+gRdMWuunuR/YfoVWLViQmJhIWHgbA5q2bcXNzo7BjYQAePX4EwKnAU9x/cB+/Sn4v+AyL5+Xr9PItW7boPV6yZAmFCxfm+PHj1KlTR1duYWGBs7Nzum1s27aN8+fPs2PHDpycnPD19WXy5MmMHj2aCRMmSKY9IYQQQgghhE4ZrzKU8SqTpnz+7PkMGjaIuLg4AvwD6NKxC4aGhnz39Xc0a9MMtVqNdxlvXf0lC5YwbOQwPh/3OYlJiYwYOiJNu7ZqW7p07IKvvy9FXIvgX/XZ9dnv93qfRi0aUaF8BX795VeGDx1Ok5ZNUBQFS0tLli1ahoO9g3ZJr+emmD989JCu72lHwjUaDQP7DcS7rLZvX034ip59ezL8k+HUr1uf5k2bpznXuLg4GjRrgKIoFC1SlIVzny2b1ql7JyIjI7GxsWHhnOwvpyYyplLSW7gtn1y5coVSpUpx5swZypcvD2inl587dw5FUXB2dqZ169aMHTsWCwvtlI1x48axbt06Tp06pWvn+vXrlChRghMnTlCpUqU0x4mLiyMu7lm2xMjISNzc3Di46CD2jva5e5JCCCGEEEK8ZTRGGhIKJ+Dh5oGpiWm+LBkmxKuIi4/j5u2bGD80xiBRO2E89FEoNfrWICIiAhsbmwz3LTCJ1DQaDcOHD6dmzZq6gBuge/fueHh44OrqSmBgIKNHjyYoKIg1a7QZ+u7fv4+Tk5NeWymP79+/n+6xpk6dysSJE3PpTIQQQgghhBCZUtyJiwzMcpmvbDencZCAWxRYBSboHjx4MGfPnuXff//VK+/fv7/ufoUKFXBxcaFhw4ZcvXoVT8+Xu6h/zJgxfPzxx7rHKSPdQgghhBBCiDyiuKMkSaAs3nwFYp3uIUOGsGHDBnbv3k3RokUzrevvr70O4sqVKwA4Ozvz4MEDvTopjzO6DtzU1BQbGxu9mxBCCCGEEEIIkdPyNehWFIUhQ4bw999/s2vXLr217TKScu22i4sLAAEBAZw5c4aHDx/q6mzfvh0bGxu8vb3Ta0IIIYQQQgghhMgT+Tq9fPDgwaxcuZJ//vkHa2tr3TXYarUac3Nzrl69ysqVK2nRogUODg4EBgYyYsQI6tSpg4+PdkH5Jk2a4O3tTY8ePfjuu++4f/8+X375JYMHD8bU1DQ/T08IIYQQQgghxFsuX0e6582bR0REBPXq1cPFxUV3+/333wEwMTFhx44dNGnShDJlyjBy5Eg6duzI+vXrdW0YGhqyYcMGDA0NCQgI4L333qNnz55MmjQpv05LCCGEEEIIUYDcvHWTOo3r6JX16NODff/uy3Q/Lx8vYmNjX/n4Ke2ER4SzeNliXfnylcv5csKXL9Xmw0cPqdWwFtXrVOfS5UsvvH9SUhIfjfwIvwA//AL8qNekHtHR0S/Vl1exbMUyyvuVx9zOXO+5jo2NpWuPrpT3K0/T1k15HPIY0M6WHjpiKOUql6Nm/Zpcu34t3XanTZ9GqfKlKOZVLN3tn439TG/b9RvXadyyMVVqVKFrj67ExMTk2Dnm60h3VquVubm5sXfv3izb8fDwYNOmTVnWE0IIIYQQQhQQMbdQxedQ9nITBzAv+EnZIiIiWLx8Me/3fP+V29q9dzfVq1Xn+6nfZ6t+UlIShoaGuser16zmydMnHDt4DJVKxeUrlzE2Nn7lfr0ov0p+bFizgaatm+qVL162mFKepfh9+e/MXzif7//3Pd9M/obNWzcTHhHOuRPn2Lx1M19M+ILflv6Wpt0G9Rvw7jvvUqNejTTbLly8kCYv2GdjP2Poh0Np07IN8xfOZ+HihQz7cFiOnGOBSKQmhBBCCCGEeIvE3MJ0rw+mB2rkzG2vD8TceunuFPMqxsjPRlI5oDKdu3cmKSlJt23aj9OoVqsajVo0IjIyEoArV6/Qsn1LatSrQZtObXjwUBvATZ46mZoNauIX4Me4SePSHGf85PGcO38O/9r+TJ85HdCOwjdv2xzvSt78+tuvgHYUfs++Pbr9atavyd3gu7rHFy5e4MsJX7L6r9XUblQbgG++/wa/AD+q1qzKxs0bAdj37z5atGtBm05taNGuhV5fHjx8gIuzCyqVCoBSJUvpLs/NqK1WHVrRrnM7vHy8WPjLQr79/luq1qxK205tSUxMBODo8aM0bN6QgLoBdO/dnadPn2b63JfzLkcxj2Jpyjdu2Uj3rt0B6N61O5u3bk5T3qxJM/479l+6g7l+lfxwdXFN95hfjP+CiWP1l5C+dPkSdWppZ0PUq1OP9RvXp7frS5GgWwghhBBCCJGnVPEhqDRxOdeeJu6VRs0fPHxA+9btOXHoBBqNRi/g9SzuyX///keF8hX48+8/ARj+yXDmzpjLwT0H6fVeL6ZOmwrA4IGDObDrAEcPHOXsubMEngnUO87EsRMp512OI/uP8PEw7RLGFy5e4K/f/mLXll1MnjoZgB7de7Dy95UAnDt/Djs7O4q4FtG1U7ZMWcZ9Po4e3Xuwf8d+jh4/yobNGzi45yDr/lrHx6M/1k0VP3nqJAvmLGDr+q16fWnfpj2rVq+iZoOajJ04lqBLQQCZtnX23FkWL1zMv7v+5csJX+Lh4cHRA0cxMzdj997dxMfH8/m4z/nztz85tPcQVSpX4adFPwEwaNggjp88nu3X5N69e7i6aoNmGxsboqKj0pSrVCoc7BwICc3+a796zWoqV6qMu5v+zIhy3uV0gfa6DesIvhec7TazUmDW6RZCCCGEEEKIvJQyymurtqVWzVoAVPSpyM1bN3V1WjZvCYCvjy/Xrl8jKiqKQ0cO0eXdLoB22nbKKky79+5m+szpxMfF8/DRQy4EXcCngk+mfahfrz4WFhZYWFig0WhISEigYf2GfPrFp8TExPDrb7/SvUv3TNs4/N9h2rdpj6mpKS7OLvhW9OX8xfMA1AyoibNT2qWU3d3cOXPsDDt372TH7h3UaVSH3Vt3Z9qWfzV/7GztAG0g3KKpdvS8XNly3L5zm0uXL3H23FmatW4GQHxCPPXq1ANg3sx5mZ5DXnjy5Alzf5rLprVpL02eOmkqH438iHkL5tGsSTOMjHIuVJagWwghhBBCCPFGs7ezJzw8XK8sLDwMB3sHAL1VjwwMDPSml6dsSynXaDS4urhyZP8RvfZiY2MZ/cVoDu45SGHHwgz/ZDjx8fFZ9s3UJO2xjY2Nad2iNWvXrWXD5g18+dnLJVsDMDc3z3CbmZkZLZu3pGXzliiKwtYdWzMNNk2MTfT6amJiotdvRVHwq6y9RvtVubi4EBwcjK3alsjISKwsrfTKK1aoiKIohISF4GDvQN+BfTl77iyVK1XOMMC/fuM6165fw9ffF4BHjx8RUDeAQ3sP4VbUjTW/rwHg9JnTnDp96pXPIYVMLxdCCCGEEEK80aytrbEwt+C/Y/8B2uuor9+4jmcJzxduS61WY2try45dOwBISEjgYtBFYuNiMTAwwM7WjtCwUDZtSTuaamVlle0M4T269+DzCZ9TrUo1LC0tM61bvVp11m1cR0JCAvcf3Od04Gm8y3hnus/J0ye5/+C+7hwuXb6EW1G3l2orhVdpL27cvMHZc2cB7cjy1WtXs7Xv85o3ba6bYr/y95U0b9pcW97kWfmWbVuo6lcVlUrFovmLOLL/SKYj6uXLlefmpZsEBQYRFBiEYyFHDu09BEBIaAiKoqDRaPj+x+/p1aPXS/U7PRJ0CyGEEEIIId54C+YsYMzYMfjX9ufd999l/qz5eiPcL2LJgiX8OOtHqtWqhn8df44eP4qt2pYuHbvg6+9Ltx7d8K/qn2Y/B3sHynuXp2rNqrpEahkpXao0To5OuqRhmanqV5XmTZpTvU51WndozQ/f/ICVlVWm+zx69Ij2XdpTpUYVqtWuRvly5enYruNLtZXCxMSEJQuXMPTjoVSrVY16Terpgu6MrulevnI5nuU8uRt8l3J+5Rg7cSwAfXr2IehyEOX9yvPX2r8YNXwUAC2atcDGxgbvSt5MnjqZKeOnpNuXb77/Bs9ynjx6/AjPcp789PNPmfZ9155d+FT1oWK1ipQuVZq2rdpm65yzQ6VktW7XWyAyMhK1Ws3BRQexd7TP7+4IIYQQQgjxRtEYaUgonICHm4d2OnVy9vKcSqamGJgSVzfwtVg2LLtCQkNo1KIRxw8ex8BAxkrzW1x8HDdv38T4oTEGidrXI/RRKDX61iAiIgIbG5sM95VruoUQQgghhBB5y9yduLqBb9063dm1ZdsWhn48lMnjJ0vA/QaQoFsIIYQQQgiR98zdUd6gQDknNWvSjMtnL+d3N0QOkaA7lcSwaOIxzO9uCCGEEEII8UZRTEEpZIImKQlNYlLWOwhRwGiSklA0GhJCo1AlXxWRGJa9pHhvddA9Z84c5syZo1sSIPHQf8Qam+Vzr4QQQgghhHjD2Ftg7FYZJfoJimHWy2gJUdAoSQkoMXHEHzwBoU8BSEyIzda+kkiNZ4nUHnw/Gxs72/zujhBCCCGEEG+UOFMT7pYuTrGiRTBLtdazEK+L2IR4bty5S5FL1zGN035xFBkWjtOoIZJI7UWY2Zlj5pjxkyWEEEIIIYR4CUZGqAxUGBgaYmAkl3OK14+BxhCVgQpTeyvMEhMBiCd72fclFZ4QQgghhBDijXbj1i2qN26sV9atTx/2/PtvpvsV8/EhNjZ7U4iz0054RAQ/L1umK1+yciWfTZjwyu0PGz0ap9Kl05xjvVatKOvvj2/t2vjWrq0rfxwSQv3WrSnl50eHHj0yPMdOvXphV6wY3fr00StftmoV5QMCKBcQwE+LF+vKt+7ciW/t2pQLCGD81KmvfF5vChnpFkIIIYQQQuS927chNDRn2rK3Bze3nGkrF4VHRPDz8uV80LNnjrbbrUMHer3zDoM/+STNtr+XL6dM6dJ6Zd/87390bd+egX368MnYsfy8bBlD+vdPs++Qfv3o1a0bK1av1pU9evyYydOmcXz3bszNzWncvj3tW7WikIMDA0aM4N/Nmyni6krXPn04GRhIJR+fHD3X15EE3UIIIYQQQoi8dfs2VK0KcdmbnpslU1M4evSlA29nLy+6tm/Pjr17KVm8OGuWL8fQUDsNfuqPP7J240bUNjZsWLUKGxsbLl+9yoejRhEaFoZjoUIsnTsXp8KFGT91Kpu2bycmJoY2zZvz9bhxesf5YvJkzpw/j2/t2rzbuTOOhQpx49YtGrZty41btxj36af0eucduvXpQ//evWlQpw4AVerX558VKyji6ppu/2v4+3Pj1q1sn++GrVs5unMnAD27dWPUuHHpBt31atVKMxvg+s2blCtTRncNs7+fHxu3baNlkybYqtUULVIEgPq1arF240YJupHp5UIIIYQQQoi8FhqacwE3aNt6hVHzBw8f0rF1a84dOoRGo2HXvn26bSWLF+f0v/9SsXx5fv/7bwAGf/IJP8+YwfE9e+j73ntMnjYNgI8GDuTorl0EHjhA4LlznD5zRu84X40dSwVvb07t388nw4YBcO7iRdb/9hsHtmzRTcnu3b07y3//HYCz589jb2dHEVdXvSni2dW1Tx8q163LnIULdWVR0dFYW1sDULRIEe4GB2e7vZIlShB47hz3HzwgOjqa7Xv2cPfePRwLFSIiMpKLly6RkJDAhq1buXvv3gv3900kI91CCCGEEEKIN5oqo3KVdoutWk2dmjUBqOTjozdq3KZ5c1351evXiYqK4sCRI7R9910AkpKS8CxeHICde/fy3cyZxMXF8eDRI84HBVGxQoVM+9aoXj0sLCywsLBAo9GQkJBA4/r1GfHFF8TExLD0t9/o0aULAKf273+h8165cCGuLi6EhYfToksXypUtS71atV6ojefZ29nx3cSJtOrWDQtzc3wrVMDI0BCVSsWSuXN5f8gQAKr4+pKQkPBKx3pTSNAthBBCCCGEeKPZ29kRFh6uVxYaHk4he3sATE1NdeUGBgYkJSXpHqdsSynXaDQUcXFJEwDHxsby8RdfcHzPHgo7OjLkk0+Ii896TXJTk2dLqKUcw9jYmHYtWvDXunX8s3kzEz777IXPGcDVxQUAO1tbOrVpw7GTJ6lXqxZWlpZERUVhbW3Nnbt3cXVxIT4+nmoNGwIw8P33Gfhc8rTUOrVtS6e2bQEYPmYMJUuUAKBuzZoc2rYNgP/Nm0dicpbvt51MLxdCCCGEEEK80aytrbEwN+fIsWOANpv5tRs3dMHii1Cr1djZ2rJt1y4AEhISuBAURGxcHAYGBtjZ2hIaFsb6LVvS9sPKiqjo6Gwdp3f37nw6YQLVq1TB0tLyhfuZmJjI45AQAOLi4tiycyflypQBoGWTJrrkaMtWraJ1s2aYmJhwav9+Tu3fn2nADdpkaqB9Hnfu3Uurpk31ykPDwli8YgXvJY/Qv+1kpFsIIYQQQgjxxlsyZw5DPv2UqOhoTExMWDRrlt4I94tYsWABg0aO5JNx40hMSuKToUPp3b0773TsSFl/f4q6uhJQtWqa/Rzs7fHx9sanZk16dO2KY6FCGR7Dq1QpnBwd6dG1q67Mt3btdKeYDxg+nHVbthAaFkbRcuWYO20aDevWpWnHjiQkJKDRaOjcrh3Nk5cUGzNiBJ169eL72bMpX7Yskz7/PN0+tOzShf9OnODJ06cULVeO9b/9RiUfHz4cNYpzFy9iYmzM/OnTMTMzA+Dr6dPZsnMnKpWKr778Emcnpxd6Xt9UKkVRlPzuRH6LjIxErVYTsWgRNo6O+d0dIYQQQggh3iixRkZcL1yY4m5umJmYFLjs5QVRSGgotVu04OzBgxgYyATl/BYbH8/127cp/vAhZsnT5iMfPULdty8RERG6bO7pkZFuIYQQQgghRN5yc9MGyW/ZOt3ZtWnbNgZ+/DHfjB8vAfcbQIJuIYQQQgghRN5zc3ujAuWc1KJJE26dPZvf3RA5RL42EUIIIYQQQgghcokE3UIIIYQQQgghRC6RoFsIIYQQQgghhMglEnQLIYQQQgghhBC5RIJuIYQQQgghRJ6LuB3JvdMPc+QWcTsy02PVbdmSg0eO6JV1/+ADVq9dm2Pn0/vDD9myY4fu8cVLl6jXqlWm+yxZuZLPJkx45WOnbmftxo1cuXZNt62Yjw+xsbGv1P78X36hXEAAPjVr0u7dd4mM1D7fiqIwcMQISlauTJX69bl6/bpun0nffUfJypUpFxDAf8ePp9tu/+HD8apalXIBAYyZOFFXfuzkSao1bEj5gAD6Dx+ORqMB4NqNG9Rt2ZIKNWrQoUcPYmJiXum88opkLxdCCCGEEELkqYjbkcyuuozEuKQcac/I1JAhR3uidkt/reTObdvy57p11PD3ByA2Npbd//7LzzNnZtl2UlIShoaGOdLPvLB240bMTE0pWaJEjrVZvmxZju7ciYWFBV9OmcKP8+YxfvRoNm7dSnhEBFdOnGDj1q2MnjCBP5cu5cy5c2zduZOgo0c5f/EifYYO5eiuXWna7dy2LT/9+CNJSUk0bt+evQcOULdmTQaMGMHPM2dSyceHT8aO5Z9Nm2jfqhWjxo5lxIcf0q5lS+YsXMj8xYsZ8eGHOXaeuUWC7tTi4uDJk/zuhRBCCCGEEG8WY2NQFNBoQKPh6eOnORZwAyTGJfH08VPURazS3d6pdWsCmjXjh0mTUKlUbN2xg9rVq2NhZsZX06axdtMm4uLjGdqvH/169mTJypVs2LaNRyEhFHFx4frNm/w6fz6exYuTmJiId40aBO7bh5mZ2bODKMqzcwS9nxO+/Za79+5x4dIl7j14wLzvv6dJ/fqg0XDj1i0atmnDjdu3GTdqFL3eeQeAr374IU2/rl6/Tq/Bg3kaE4OpiQm/zJxJWS8v7bEUhSP//ce6zZvZf+gQ1lZW7N+wAYCp06ezdtMm1DY2bFi5kuD79+n/8cfsS97+z6ZNbNqxg5+mT0/3+auV/GUFGg1+Pj5s3rkTNBrWbd5Mjy5dQKOhRaNGDBgxAiUpifWbN9O9Y0cMVSoqlC2LRqMh+O5dXF1c9NptXLcuKApGBgb4eHtz9+5d0GgIvn+fSuXLg0ZDg9q1WbVmDe1btNDOHqhRQ1teqxYDR41ixMCBL/OWeXHJzzFPn0JCgrYsLi5bu0rQnVpUGCS+HlMUhBBCCCGEeG2Ym0PRopCYACq0P3NaYgIkxKe7ydneDndXV44cOUx1Pz9Wr/2bLq1asWXrFh49esjRLZuJj4+ndtt2tGpQH5KSCDx3juPbtmJtZcX8pUv5ddUqxo8ayeZt26hb3R8zQwP942k0+n1ITNCWJcRDUhI3b91k75q/OHX2LMO+HEuTWjUhKYlzFy5wZNNGIqOjqd6iJb06dWTLrl3p9svF3o6df/yOqakp/504yeeTJ/H34sWQlAQaDf4VfWjTpAnd2rWlWYMG2n4oCiXd3Ti9cwdDP/+C3//6k37vvUdiQgI3rl6lmLsby1b9xscDBjD/54UADOzVK8Onedmq3+jWth0kxBMcHEwRx0KQEI8KcLCzI+TBfYKDg/Eu6al7Loo6OxN85zauhRzSbTP6yRM2bd/OqAH9ISEed1dX9uzZQ90aAazdsJ67wcGQEE+FMmVYu24dvbt15e/163TleSIxQfs8hz2ElGntMdmbti9Bd2rVgfS/HBNCCCGEEEK8LAVt5GEBmCb/zGkWZPq3fJfObVi9ZT2VAyqw++BBFsybxtjJ37F+x3b2HD4EQERkJFcf3AAzaNakPtbO2ga7vduO2k3aMX7CSJatWc2wQX3THEtlogLzVH2wAJWRSvvYBFq2aISh2pBKARW4cee2ttwMGjWsjUVhCywKW6BBQ4JpAtsP7Uu3X+XsvRj88ecEnj2PoaEhsXFxunYwST62Mfr9MIA2HZqCFVSqUp6r126AFfTq0Zlf1//J4P7vc/HqFWo2qEbNBtUyfYrnLlhCIkl0fa+ttiDlNU11LCyT+2CWqvz5eqkoikLfDz9mwAc9cPMqAsCi+dMZOuoLnnz9lHq1a2B0zxCs4PvvxjFo+GfMWrKIlk0bYWRsmHfxWxzac6qE9osjgOjs7SpBd2o2dmBrl9+9EEIIIYQQ4s2SZAxPDcHIGIxMwNA4549hmNx2Bjp2bEeNes2pV68OtWpWx8LGFkVlwOTxn9O9Wye9uldu3MbCylLXnm0hR8qX82bTjr2cvRBErTq1QaXS28fewYGwyCe6fUIjn1DIsZD2sYEhphYWYGSCAZCk0TwrNzfX7WNgYEiSyjDDfo2f9A1eXqVZsWwhISGhVKnRUNcOBgba+yqD554LFaaWVtpjGxmTBGBkQrduXajbuDUOjo507tgu0+cOYNv23SxYsoJ9O9br6rq6unL3wWN8jUxQFIWQsDAcnJxxLeLK3QePdPXuBN/Htagbn02YypZtu3B1cWbTP79rz2niVEzNzBg18iPdscpX9GH39vUArF23kaexcWBkglux4mxYq93v1OkznAg8l2W/c0wS2ufZtjAYJs/UMAjL1q4SdKdmaApGlvndCyGEEEIIId4wRmiHBw20QaEqFxZRyqJdZxcX3N2L8sX4rxj3xaegMqBRg3r88L85dGjfBjMzM4KCLuPh4Zbcjkqvvd49u9O732D69emJyiBtYrXaNWvwy9Jf6dK5A4aGhqxY9Se1a9ZI7pcqTXvP+puqXEWm/YqMiqaMVylUBoYsWb5KVz91O9bW1kRFP0nT5vP11La2lC1TmslTf2D/zk2ZPnfnL1xkyIjRbNu4Bhu1ra68VYumLF/5By1bNGPT5q34V62CysCQVi2bMWjoSAb278v5CxcxMDDAtUgRvvlqIt989SxL+a8rf2fP/gNs3/S33vEfPXqMo2MhYmNj+XHWfP73/VRQGRASEoq9vR2KovDN9zPo+36P3HkvpSv5uTO0AKNEbZHh02zvKYQQQgghhBBvvM4d2nLt+k1aNm8CQIvmTWjauAFVazSgfKUABg0bSVJS+gneGjeqT0JCAj26d013e9s2LSjnXYZK1epQsUotEhMTGdCv90v1M6N+Dez3PrPnLcS3am2iotOf29ytSwfGT/pGWycqKtPjdOvckeLF3PH0LA7A/AW/MH/BL2nqjZs4lYjISNp1fhffqrUZNmI0AK1aNsPG2gbPMpUYN2kq30wZD4BPhfI0blgfr/JV6fbeB8z68dt0jz981OfcvXsP/1qN8K1am2W/rgJg2a+rKFOhGhWr1OadLh2p5OsDwI5de/AqX5UyFarhVboU7dtmviRbQaFSFEXJ707kt8jISNRqNRGBi7Cxc8zv7gghhBBCCPFGiU004npUYYp7uGFmZkLErUhml8/hJcPO9kTtnv6SYTnhwoUg+g8ezv5dm3PtGHntsy8mUNKzBB/06ZnfXSnwYmPjuX7zNsWtH2KWPNIdGfYItU9fIiIisLHJ+L0n08uFEEIIIYQQeUrtbsOQsz15GpK97M9ZsXAwy9WA++dfljF56jSWLJyba8fIa81bdyIiMpLxX47O76688SToFkIIIYQQQuQ5tbtNrgbKOemDPj3fuNHgzev/zO8uvDXkmm4hhBBCCCGEECKXSNAthBBCCCGEEELkEgm6hRBCCCGEEEKIXCJBtxBCCCGEEEIIkUskkZoQQgghhBAiz0Xeuk1MSGiOtGXuYI+Nu1umdZzdvbh/K0j3uPcHH9KtcweaNW2UI33IzGdfTKCMV2l69+yeq8eZ99Mi5i34BQMDAwo7OrJ88XycnAqjKAqDhnzMjl17sbVV8/uvv+jW5p701Xcs+3UVpqamLF44m2pV/dK02/uDD9n/7yGsra0A2PTPH7i6uhAbG0v3nv04c/Y8RYu6snrlEgoVcsj0eG8jCbqFEEIIIYQQeSry1m0Wla9KUlxcjrRnaGpK37NHswy880pSUhKGhoZ5ftz3undh0IC+AMyeu4Bvv5/B9GlfsXHTVsIjIrhy4QQbN21l9BcT+HPVUs6cPcfW7TsJOnuU8xcu0qf/UI4e3JVu23NmTEvzBcXPvyyjdClP1vyxnDnzFvLNtP/x/beTMzze20qmlwshhBBCCCHyVExIaI4F3ABJcXGvNGo+ftJUqtZoQPlKAXw+dhIAx46fxLdqbXyr1qZMhWoUL10xw7oAxUr7MObLifhWrc2hw/8x76dFlC5XhdoNmnP12g1dvU2bt+HjV5PylQKYMPkbXbmzu5fu/oTJ3zB/wS8kJSXxXu/+lPMNoELlGqxctTrT87C2ttbdf/o0BpVKBcC6DVvo0b0rAC2aN+Hwf8dQFIX1G7fQvWsnDA0NqVC+HBqNhuDge9l+3tZt2EKPd7Xt9ni3Kxs2bc30eG8rCbqFEEIIIYQQb7yQkFBdEO1btTbrNmzWbftoyECOHtxF4PEDBJ45x+nAM1Txq8Spo/s5dXQ/1apWZsSwDzOsm6KYhzunju6neDEPfpw5j2OHdrFx7e8cPX4CgJiYGD78aBQb1/7Oyf/2sX3nbv49cCjDPp86fYbbd+5y7tQhzpw4SMvmTQAYN/Fr1q3flO4+P86YS7HSPiz9dRVjPh0BQPC9exQp4gqASqXCwd6OkJBQgoPvU8TVVbdv0SKuBN+7n267Iz75gopVajF+0lRdAB18755ufxsbG6KiozM93ttKgm4hhBBCCCHEG8/BwV4XRJ86up82rZrrtu3cvZeqNRrgW7U2R4+f5PyFZ9d+/7RwMXFx8QwbMiDLup07tgPg6LGTNGpQFxsbG2xsbGjRtDEAQZeu4F3GCze3ohgbG9O1UwcOHDqSYZ9LFC/GrVt3GDr8U3bu2otarQZg0vjPadO6Rbr7jPjoQ25cCmTAB72ZNXfByz1Zz5k6eRznTx/m8P7tBJ45x7JfV+VIu28LCbqFEEIIIYQQb63Y2Fg+/vQLNq79ncDjB+jcoS1xcfEAnDh5mrk/LeLn+TOyrAtgYWGuu58ytfv5+xlJXScueeq9nZ0tgcf/pVbN6nz7/Qy96ehZea97F/5csw4AVxcX7t4NBkBRFEJCw3BwsMfV1Zm7wcG6fe7cDcbVxZnPvpiAb9XatGjTGQAXF2dUKhXm5ua8170LR4+deNZu8v6RkZFYWVpmery3lQTdQgghhBBCiLdWbGwcBgYG2NnZEhoaxvpNWwAID4+gV99BrFi6QHetdEZ1n1e1SiV27NpLVFQUUVFRbN66AwCv0iW5cPESwcH3SExMZPWatdQM8AfA0sKCO3fuEhcXx7YduwF4/DgERVHo2rkDX3w2klOnz6R7vBSXL1/V3f9n/SbKeJUCoFWLJixf+Tugvabcv6ofKpWKVi2asvL3P0lKSuLM2XMYGBjg6urCN19N4NTR/Wxap72G/F7ylHONRsP6jVso510mud2mLF+hbXf5it9p1aJppsd7W0n2ciGEEEIIIcRby9ZWzTtdOlLWx5+iRV0J8K8KaIPW23fu8l5v7bRyVxdnNq1bnW7d5xUp4srwoQPxq14fJydHqvhVAsDc3Jw5M6bRvE1nkpKS6NShLbVqBgAwcdxn1G3UiqJFXfEqXRLQjjy/328wiqJgZGTE7P99B2iv6a5S2TfNFPNZcxewa88+jIyMcHVx5qc5PwLQqmUzNmzahmeZStjaqlm1fBEAPhXK07hhfbzKV8XU1JRFP81M93ze7d2fx49D0Gg01K1dk359ewHQr29P3unxAaW8/XB1debP35Zmery3lUp5m9PIJYuMjEStVhMRuAgbO8f87o4QQgghhBBvlNhEI65HFaa4hxtmZiZv/JJh4s0TGxvP9Zu3KW79EDOjRAAiwx6h9ulLREQENjY2Ge4rI91CCCGEEEKIPGXj7kbfs0dfaZmv1Mwd7CXgFgWWBN1CCCGEEEKIPGfj7iaBsngrSCI1IYQQQgghhBAil0jQLYQQQgghhMhlSvK/b306KfGaevbeffH3sEwvF0IIIYQQQuQqYwMNKpJ4FBKJo4MNKt7e5aPE60dB4VFIJCqSMDbQvPD++Rp079u3j2nTpnH8+HHu3bvH33//Tbt27XTbFUVh/PjxLFy4kPDwcGrWrMm8efMoVaqUrk5oaChDhw5l/fr1GBgY0LFjR2bMmIGVlVU+nJEQQgghhBDieYYGCkUtQ7kTDTeiI/O7O0K8MBVJFLUMxdDgNRvpfvLkCRUrVqRPnz506NAhzfbvvvuOmTNnsnTpUooXL87YsWNp2rQp58+fx8zMDIB3332Xe/fusX37dhISEnj//ffp378/K1euzOvTEUIIIYQQQmTAyiSBUkYPSdAYgIx0i9eKgrGB5qUCbihA63SrVCq9kW5FUXB1dWXkyJGMGjUKgIiICJycnFiyZAndunXjwoULeHt7c/ToUapUqQLAli1baNGiBXfu3MHV1TVbx5Z1uoUQQgghhBBCvIjsrtNdYBOpXb9+nfv379OoUSNdmVqtxt/fn0OHDgFw6NAhbG1tdQE3QKNGjTAwMODIkSN53mchhBBCCCGEECK1AptI7f79+wA4OTnplTs5Oem23b9/n8KFC+ttNzIywt7eXlcnPXFxccTFxekeR0YmX1eSFAaJOdF7IYQQQgghhBBvtKSwbFUrsEF3bpo6dSoTJ05Mu0E5BAnGed8hIYQQQgghhBCvFyUhW9UKbNDt7OwMwIMHD3BxcdGVP3jwAF9fX12dhw8f6u2XmJhIaGiobv/0jBkzho8//lj3ODIyEjc3N3ALABu7HDwLIYQQQgghhBBvpMgw4K8sqxXYoLt48eI4Ozuzc+dOXZAdGRnJkSNHGDRoEAABAQGEh4dz/Phx/Pz8ANi1axcajQZ/f/8M2zY1NcXU1DTtBhM7MJFEakIIIYQQQgghsmCSvWr5GnRHR0dz5coV3ePr169z6tQp7O3tcXd3Z/jw4UyZMoVSpUrplgxzdXXVZTgvW7YszZo1o1+/fsyfP5+EhASGDBlCt27dsp25XAghhBBCCCGEyC35GnQfO3aM+vXr6x6nTPnu1asXS5Ys4dNPP+XJkyf079+f8PBwatWqxZYtW3RrdAOsWLGCIUOG0LBhQwwMDOjYsSMzZ87M83MRQgghhBBCCCGeV2DW6c5PunW6IxZhYyPTy4UQQgghhBBCZC4y8hFq9Wu8TrcQQgghhBBCCPG6e6uD7jlz5uDt7U3VqlXzuytCCCGEEEIIId5AMr0cmV4uhBBCCCGEEOLFyPRyIYQQQgghhBAin0nQLYQQQgghhBBC5BIJuoUQQgghhBBCiFwiQbcQQgghhBBCCJFLJOgWQgghhBBCCCFyiQTdQgghhBBCCCFELpGgWwghhBBCCCGEyCVvddA9Z84cvL29qVq1an53RQghhBBCCCHEG0ilKIqS353Ib5GRkajVaiIiFmFj45jf3RFCCCGEEEIIUcBFRj5Cre5LREQENjY2GdZ7q0e6hRBCCCGEEEKI3CRBtxBCCCGEEEIIkUsk6BZCCCGEEEIIIXKJBN1CCCGEEEIIIUQukaBbCCGEEEIIIYTIJRJ0CyGEEEIIIYQQuUSCbiGEEEIIIYQQIpdI0C2EEEIIIYQQQuSStzronjNnDt7e3lStWjW/uyKEEEIIIYQQ4g2kUhRFye9O5LfIyEjUajUREYuwsXHM7+4IIYQQQgghhCjgIiMfoVb3JSIiAhsbmwzrvdUj3UIIIYQQQgghRG6SoFsIIYQQQgghhMglEnQLIYQQQgghhBC5RIJuIYQQQgghhBAilxjldweEEEIIIYQQQggALgfDL9vhxkMoVhj6NIZSrvndq1ciI91CCCGEEEIIIfLf4h1oygwmYtou9v5hSMS0XWjKDIYlO/O7Z69ERrqFEEIIIYQQQuSdhEQIidLeHkdqb+dvoRm/ip+VvnzEDGIxx4wYZjGUPn1nY1CrLJR8PUe8JegWQgghhBBCCPFy4hPSBtAp99MrexwJkU/TbSoKG4YxkzjMAIjFnKHMorPqL9SLtsPUXnl5ZjlGgm4hhBBCCCGEEBCXACEZBMsZBdBRMTl2+FP46gLuFLGYc0rxpe6Nhzl2nLwmQbcQQgghhBBCvGniEpID5HQC5YyC6hwMoNNQqcDOCgrZQCFrcEj+WchGe3/vGXy3BmKmiSEWc91uZsTgqzoFxRrmXt9y2VsddM+ZM4c5c+aQlJSU310RQgghhBBCiPTFxmc96hwSCY9TbY/O5QDaPiWAtgEHa/2fae7bgJ0lGBpm3GaHAKzLDGYWQxnKLL1ruq2VKOjbOPfOJ5epFEVR8rsT+S0yMhK1Wk1ExCJsbBzzuztCCCGEEEKIN1VMXPZGnVOXPYnNvf4YGLxgAG0NtlkE0C9ryU40fWcTpbLhlFIRX9UprJUoDBYNgd4Fb6Q7MvIRanVfIiIisLGxybDeWz3SLYQQQgghhBAv7Wncs+nbWY5EJ/98Gpd7/TE0APtsBM2pf9paagPvgqB3QwxqlUW9aLv2Gu5iDbUj3K9p1vIUEnQLIYQQQggh3m6KkhxAR+lfB/04Kv37KfVi4nOvT4YG2Zu2rbs+2gbUFgUngH5ZJV1f2yzlGZGgWwghhBBCCPHmSAmgX2T69uNI7XXTucXQIHujzqnv27wBAbQAJOgWQgghhBBCFFSKor2e+UUD6LiE3OuTkeGLXf+cEkCrVLnXJ1GgSdAthBBCCCGEyH2Kos2ondFU7YzuxyfmXp+MjZ4LlFNN1U59P3UgbW0uAbR4IRJ0CyGEEEIIIV6MomjXdE4TKKdetip1cJ1clpCLAbTJ8wF0RiPRqdaHtpIAWuQ+CbqFEEIIIYR4mykKRD7N3qhz6p+5GUCbGr/Y9c+FbMDSTAJoUSAV6KB7woQJTJw4Ua/My8uLixcvAhAbG8vIkSNZtWoVcXFxNG3alLlz5+Lk5JQf3RVCCCGEECJ/KQpEPHmx659DoiAxKff6ZGoMjursX//sYC0BtHijFOigG6BcuXLs2LFD99jI6FmXR4wYwcaNG1m9ejVqtZohQ4bQoUMHDhw4kB9dFUIIIYQQIudoNBDxNINp2xkE0KHRuRtAm5mAY+oAOdVU7eeXr0oJoC1MJYAWb7UCH3QbGRnh7OycpjwiIoJFixaxcuVKGjRoAMDixYspW7Yshw8fpnr16nndVSGEEEIIIdKn0UD4k6ynb+sF0FGQpMm9PlmYZm/UOfW10BamudcfId5QBT7ovnz5Mq6urpiZmREQEMDUqVNxd3fn+PHjJCQk0KhRI13dMmXK4O7uzqFDhzINuuPi4oiLi9M9joyMTNkCPMmlMxFCCCGEEG8EjQbCnkBIdKrR55T7Uc/uh0Q9KwuNBo2Se32yTAmgk28OVql+2uiXFbLW1jU3ecGDJCbfhBBacVlXoYAH3f7+/ixZsgQvLy/u3bvHxIkTqV27NmfPnuX+/fuYmJhga2urt4+TkxP379/PtN2pU6emuVZcKybnOi+EEEIIIQq+JA2EPYWQJ/A4WntLua8re6K/Pexp7gbQVqbgYAmFrLQ3B0soZJkcNFumKkv+6WD5EgH0E2SwSYhXlb34sUAH3c2bN9fd9/Hxwd/fHw8PD/744w/Mzc1fut0xY8bw8ccf6x5HRkbi5uZGRGxTFBPrV+qzEEIIIYTIJ0lJqELDUYWGoXocpv0ZEorqcRgGKfdDwp7dQsO09ZXcC6AVaysUe1s0DvYoDnbJN3sUB1sUB/vkcu19xd4OxcEWzMxe/ECxOd51IUQWImOjgJFZ1ivQQffzbG1tKV26NFeuXKFx48bEx8cTHh6uN9r94MGDdK8BT83U1BRT07TXo6w+txVzq5cP5oUQQggh3jbqWw8ps/4g1vdCiXKx52LrGkS4F37ldlWJSZhFPsU0Ihrz8Ce6n2YR0ZhFPMEsPFp7i3iCWfgTzCKeYBr1NFcD6HhLM2LVlsTYWhGX/DNWbUWs2pJYW0vtfVtLYm2Ty9SWaEyMs9FyuPYWivYmhHgtxES/ASPdz4uOjubq1av06NEDPz8/jI2N2blzJx07dgQgKCiIW7duERAQ8FLtmxuZY2dml5NdFkIIIYR4YxVfu4cqE34mUmXDaaUiFVVHqbh8J8cm9uN627q6eqrEJEwiojENj8I0LEp7PyxS+zhcW26S/FN7PwrTyNyd+hxvZU68rTVxqW921sSrrYizsyZObU28Xco2K+JtrdEYZ/9PZ9PkmxDiDZbNGSYFOugeNWoUrVu3xsPDg+DgYMaPH4+hoSHvvPMOarWavn378vHHH2Nvb4+NjQ1Dhw4lICDgpTOXmxqZYmlimcNnIYQQQgjx5rG8EUyVCT+zSNOHj5hBLOaYEcMshtJn7E+UWbEFo6exGIdHYZLLAXSCtSXxdtbE29kQb2tDvK219mdyWYKtDfF2NsTZ2ZBgqw2slWyNQGsZAjIXUgjxvKdGT7NVr0AH3Xfu3OGdd94hJCQER0dHatWqxeHDh3F0dATgxx9/xMDAgI4dOxIXF0fTpk2ZO3duPvdaCCGEEOLNZBCfgM35q9gFXsJj1RaiNFYMYyZxaK9BjsWcocyiM6tRX7zxUseIt7FMDpRTAufkINruufvJQXWC2hrlBUaghRAirxXoT6hVq1Zlut3MzIw5c+YwZ86cPOqREEIIIcRbQlEwv/sAu1NB2J2+hF1gEDbnr2GY8GzJqL3U0QXcKWIx5xS+1GUf8WqrZyPPyUFzQroBdPKItNoaxcgwr89UCCFyVYEOuoUQQgghRN4win6K7ZnL2J5ODrJPB2EaGpHpPhU5hRkxxKaafG1GDBUNArnyfgcufNI7l3sthBAFnwTdQgghhBBvm6QkrK/ewe50kC7Itr5yK8vM39HFixBW0YuwiqWJdbTHb9i3zNIMZSiz9K7ptiaK412a5NHJCCFEwSZBtxBCCCHEG84kJFw3em17OgjbM5cxfpL5UjfxaivCfUonB9lehPuUJkFtpVcncMoQ3v9yNh1VazitVMRXdQprJYrAKUN46uGam6ckhBCvDQm6hRBCCCHeIAbxCdhcuJYcYGsDbcs7DzLdR2NoQKRXccIrPguynxRzBZUq0/3udGhIqF9Z3P/cTqm7D3lUpCHHOzWWgFsIIVKRoFsIIYQQ4nWVkuwsObi2O5022Vl6Ypwcno1gVyxNRLmSJJm/3KrSTz1cuTiy10vtK4QQbwMJuoUQQgghXhOG0U+xPXtZm1E8MDnZWUjmyc6SzEwIL1+SMB8vwlOux3YulEc9FkIIIUG3EEIIIURBlJzszDYwOZv4qaDsJTsrVoSwiqUJ8/Ui3MeLyNIeso61EELkI/kEFkIIIYQoAFKSndkmj2DbBl7KfrIzn+Qgu0JpEmyt86jHQgghskOC7teA5Y1g3P7ajsXdhzwtUpjbHRtrk5sIIYQQ4rX0LNnZJe2SXYGXsLx9P9N9NIYGRHkV012LHeZTWvv3gIFBHvVaCCHEy5Cgu4Bz+2sHFcbOIVJlw2mlIhVVuyixaC2BU4Zwp0PD/O6eEEIIIbKiKJjffahLdGZ7+hLq81ezTnZW2J4w3zK6jOKvkuxMCCFE/nmrg+45c+YwZ84ckpKS8rsr6bK8EUyFsXNYpOnDR8wgFnPMiGEWQ+nzxSzCfErxpKR7fndTCCGEEKlok51d0QXZ2U52Vq5kcjZxSXYmhBBvEpWiZJGN4y0QGRmJWq1m0cFFONo75nd3dMr8sJRCv+zCJSmYOMx05WbEcB9nbFRRRJV0I6qkO1Gl3Ikq5UFUKQ+euDmBoWE+9lwIIYR4S2g0WF29g93pi7plu6yv3Eal0WS6my7ZWXKQLcnOhBDi9fMo9BF9a/QlIiICGxubDOvJp3sBZnH3IaeVinoBN0As5pzCl7rKPmwu38Lm8i3Y/Gx7kqkJUZ5u2kC8tDYQjyrpToxLIVCp8vgshBBCiDeHSWgEtqnWxLY9cxnj6KeZ7hNvY6lNdpYyil2hFAl2Gf9xJoQQ4s0iQXcB9rRIYSqqdmFGDLGY68rNiMFXdYpYOzUmUU8weO6aMMO4eGzPX8X2/FW98gQrC71R8cjS2p/xDrZ5cTpCCCHEa0UVn4D64nXsTgXpMopnO9lZcpAdVtFLkp0JIcRbToLuAux2x8aUWLSWWQxlKLP0rum2Uj1hz29ziHEtjOWte1hfvon1pVvYXL6J9eVbWN66l2Zqm3H0U+xPXcT+1EW98jh7NVGl3Iks5ZEckLsTVdKdRBurvDxdIYQQIv+kJDtLWa7rVBDqC9cwjE/IdLeYwvba0WtfbTbxiHIlSbIwy3QfIYQQbxcJuguwJ8VcCZwyhPe/nE1H1RpOKxXxVZ3CWokicMoQnnpolw2L9nQj2tONe82e7WsQF4/VtTvaYPzyLWwuaX9aBD9McxzT0AhMj5yh0JEzeuUxzoWeC8Y9iPZ0k8ypQgghXnt6yc4Ctct2mT0Oz3SfJFMTwsuX1E0VD/P1kmRnQgghsiRBdwF3p0NDQv3K4v7ndkrdfcijIg053qmxLuDOiMbUhMiyJYgsW0Kv3Cj6KVZXtNeBpwTk1pdvpvuHhvn9x5jff0zh/Sd0ZYpKxRN3Z9114rpgvJgriolxjpyzEEIIkaM0Gqyu3dEG2MlTxW0u38o62ZmHq3YEu6IX4T6lifQqJsnOhBBCvDDJXk7BzV6el0zCInUBeOpg3CTySbb21xgZEl28SHIG9eRrxku587SoZFIXQgiRt3TJzgKTk50FZjPZWYXkZGe+kuxMCCFE1iR7uXgh8XY2hFQrT0i18s8KFQWzh6FYX3oWiNtcvonV1dsYxcTp7W+QmPQsk3oqSWYmRHm6a5c2S86kHlnKXTsdTzKpCyGEeEWq+ARsgm5gdyp5TezAICxvZZ7sTDEwINLLQztF3EcbZEdLsjMhhBC5RIJukTGVilgnB2KdHHhUu/Kzco0Gi7sPk5O3pQrGr99Nm0k9Nh7bc1ewPXdFrzzByiLViLiHbnmzeHt1XpyZEEKI15GiYB78SDt6nbxsl/r81SyTncU62hPm+yybuCQ7E0IIkZck6BYvzsCAp27OPHVz5kEDf12xKiERy5vBuiBcO0U9k0zqJy9ifzKrTOran4nWlnlyakIIIQoOwycxz5KdndZei232KCzTfZJMTYgo55kcYGsDbZldJYQQIj9J0C1yjGJsRHRJd6JLunOveS1duUFsHFbX7qRJ3mYR/ChNGxlmUncp9Fwg7kGUZ1E0ZpJJXQgh3gipk52d1mYTz26ys/CKz0axJdmZEEKIgkb+VxK5TmNmSqS3J5HennrlRlFPsL5yWxuIX7mVeSb1e48xv/cYp33HdWV6mdRTTVV/UsxV/uASQogCziQsEtvkEezsJjtLsLYkzKe0LsgO9ylNvCQ7E0IIUcBJZCLyTaK1JWGVyhBWqYxeuUloRKpM6s+mqhtH6WdSVykKVjfvYXXzHi47DuvKNcZGRBcrortOPKqku2RSF0KIfKSX7Cw5o3i2kp2V9tCNYIdXLE108SKS7EwIIcRrR4JuUeDE26sJ8a9AiH+FZ4WKgtmDkLTB+JVbGMbG6+1vkJCIzeWb2Fy+CZv268p1mdRTrhkvrR0dj3VykGv9hBAipygK5vcea0exk4Ns9bnsJDuz066J7eNFeEUvwst5kmRpnkedFkIIIXKPBN3i9aBSEetciFjnQmkzqd95gPXlm9prxpOzqVvdeIFM6taW2lHxku6SSV0IIV5QSrIz28BLuqniWSY7MzF+luzM14twHy9iXCTZmRBCiDeTBN3i9WZgwFN3F566u/CgYXVdcdpM6jexvpScSV1R9JowjnqC/YkL2J+4oFce56BODsKfy6RuZZEnpyaEEAWORoPV9bu6NbFtAy9hc+lmNpKduRBe0Yswn9LPkp2ZGOdRp4UQQoj8JUG3eCNllEndMEabSd06JRBPTuSWbib1kAgcQwJxPByoVy6Z1IUQbwtdsrPAS9idCsL2zOU0+TWel2BlQbhPae1UcUl2JoQQQkjQLd4uSeamRJTzJKJcJpnUk68bt7l8E9OQiDRtpJtJ3cCAJ27OuuvEI0tpE7hJJnUhxOtCl+ws1ZrYVjfvZbpPSrKz8OQR7DBfL0l2JoQQQjxHogEhyCSTekh4chD+LHFbupnUNRqsbgZjdTMYl+0ZZ1KPTB4df1rUSf4oFULkn5RkZ4FBuqni2U52VvHZCHZ4+ZKS7EwIIYTIggTdQmQi3sGWEAdbQqr7PCvUZVLXXieesqSZ9dXsZ1JPNDcl2tMt1TR1yaQuhMg9hk9jtcnOTicv2XXqEmaPQjPdR5fszCc52VlFSXYmhBBCvAwJuoV4UXqZ1P2elSclaTOpX7mln0n9+h0MEpP0mjCKidP+AXw2/UzqeteMl/aQ6yGFENmXnOzM9vSzbOLZSXb2xN1ZN4otyc6EEEKInPNWB91z5sxhzpw5JCUlZV1ZiKwYGvLUw5WnHq76mdTjE7C8ee9ZFvXka8Ytb93Pdib12EK2z7Kol5RM6kKIZ4zDIrWJzk4HaQPtwEvZT3ZWsfSzZGeyTKIQQgiRK1SK8txf/W+hyMhI1Go1iw4uwtHeMb+7I94SaTKpJ183bn7vcbbbeOrqqLekWWQpd6JLSCZ1Id5UumRnuiA7KHvJzkq5a5fsSg6yo0sUlbwSQgghxCt6FPqIvjX6EhERgY1NxjNT3+qRbiHyU6aZ1JNHw5+tM34L09C0mdQtgh9hEfwIp73HdGWKgQFP3F2IKuX2LJN6KXeeeEgmdSFeK4qC2f3H2inip7TLdqnPXcUwLj7T3WIL2SYH2MkJzyTZmRBCCJGv5C9wIQqYRGtLwiqXJaxyWb3yNJnUk4Nx4+inevVUGg1WN+5ideNu2kzqxYs8u168tHZZM8mkLkTBoEt2FhiUHGhnM9mZt6c2uE4exY5xdZRkZ0IIIUQBkiNBd0JCAsbGkmxFiNyUYSb1+4+1idsu39Qmb7tyG+srt9KMhhkkJGJz6SY2l27qlafNpK5N3hZb2F7+cBcit2g0WN0IxjZ5uS67wCCsL93EICkbyc58vHRrYkuyMyGEEKLge6Gg+48//qBdu3aYmJgAMHv2bKZNm8adO3ews7Nj2LBhjBs3Llc6KoRIh0pFrIsjsS6OPKyTNpO6Tapp6taXb2J1/W62M6nH21jqXS+ecl8yqQvx4lKSnekyimc72VkpbYDtox3JlmRnQgghxOvnhYLud955h3v37lG4cGEWL17MJ598wqeffoq/vz8nT55k6tSpuLq68sEHH+RWf4UQ2ZEqk/r9RvqZ1K1uBGsD8Su3Ms2kbhL5BIfj53E4fl6vXC+TekrytpKSSV2IFKqERG2ys9NB2AZewu5UEFY3gzPdR5fszKc0Yb5ekuxMCCGEeIO8UNCdOtH5/PnzmTRpEp988gkALVq0wN7enrlz50rQLUQBpZgYa6/lLu2hV24YE4fV1dtpkreZ30+bSd3scThmj8NxPHRar/ypa+HkQFwyqYu3iC7Z2bM1sV842ZlPaW2yM/niSgghhHgjvfA13arkazyvXbtGkyZN9LY1adKE0aNH50zPhBB5JsnclIjyJYkoX1Kv3CgyOtWIeHIwfukmpmGRadqwCH6IRfDDDDKpu2uvGS+tDcifuLtIJnXxWjJ8Gov63JXkAPsStqeDMH+YRbIzYyMiypXUJTqTZGdCCCHE2+WF/+rdsmULarUaMzMznj7Vz5ocGxurC8pzwtSpU1mzZg0XL17E3NycGjVq8O233+Ll5aWrU69ePfbu3au334ABA5g/f36O9UOIt1WijRVhlb0Jq+ytV67NpH4Tm0v614wbP4nRq6efSf2QrjzJ2IjoEkWJKun+LJN6KQ+eFiks02lFwZGS7Cx5BNvudDaTnbk5P1uuq2JpIssURyPJzoQQQoi31gsH3b169dLd37VrFwEBAbrHhw8fxtPTM73dXsrevXsZPHgwVatWJTExkc8//5wmTZpw/vx5LC0tdfX69evHpEmTdI8tLGSKnhC56Vkm9YrPChUF83uPk0fGkzOpX76F9dXbaabaGiYkog66gTrohl55ornps0A8OXlbZCl34iSTusgDxuFR2mRnp7TZxG0DL2ESmUWyM0tz7XXYqYJsSXYmhBBCiNReKOjWaDL/dt/JyYmpU6e+UodS27Jli97jJUuWULhwYY4fP06dOnV05RYWFjg7O+fYcYUQL0GlIsbVkRjXtJnULW8/SB4Rf3bNuOWN4HQzqduduYzdmct65ellUo8s5U6CZFIXL0mVvISebhQ7O8nOVCqiSrknB9ilCatYhugSRcDQMI96LYQQQojXUY5eVNmqVaucbC6NiIgIAOzt7fXKV6xYwa+//oqzszOtW7dm7NixmY52x8XFERcXp3scGZn2+lQhRA4xNORJMVeeFHPlfuNnM2P0MqnrkrfdxOL2g+xnUne000vcFlXKgyhPN0lIJdIwu/8Yu+Q1sW0DL2F79kqWyc7iHNS6Eeywil6S7EwIIYQQL+W1yWSk0WgYPnw4NWvWpHz58rry7t274+HhgaurK4GBgYwePZqgoCDWrFmTYVtTp05l4sSJedFtIUQGMsyk/jQ2OZP6s0Dc+srt/7d358FRlXnbx6/OvkA21oRd9iCrRoEREZABEUYQBq0RQeEdBo0oOG4wIk+NCo+ilFtcHkVRRstyRgQFQUUQRRESHASJQljCvoQlCQlZu+/3j0BDJIET5eR00t9PFTXmdCfzS9VVd/rq0+c+Fe+knnVCYVkn1OC7indSz2139ux43mVN5QkNsfV3gm/wbnZ2+nZdljc7S2yt7G5lu4mf6NpeBU0aclkDAAD43VzG/OqU0u/QsWNHbdu2TW63++JPrqK77rpLy5Yt05o1a9S0adNKn7dy5UoNGDBA27dvr/T68orOdDdr1kzzvpunBnENLvnsAH6/Mzupn7t5W9S2TIVkn7T0/SYgQPkt4st2UT/n1mb5LRJkgvh4cI3l8Sgy84B3o7PYTdtUd2vmxTc7a9ro9DXY7XWiW3s2OwMAAFWWdTxLE3pPUE5OjqKiKr/s8ZKe6Z49e7b3I+CX0j333KMlS5bo66+/vmDhlqSrr75aki5YukNDQxUayr2DgZqkwp3UjVHIsWxFZezx7qB+wZ3Ud+1XnV37pc+/8x737qR+zjXjue2aqyCBndR9UXD2ScVs3nb2o+KbMxSSk3fB7zmz2dnZDc/aqbheTPUMDAAA/N4lLd3Dhw+/lD9OxhhNnjxZH330kb766iu1atXqot+zceNGSVJ8fPwlnQWAD3K5VFw/Vkfrx+porwp2Uv/V5m11tu9VYHFJuR9R6U7qEWFlO6m3acZO6g45b7OzH7epTub+C36Pcbl0sk1znehWVq6zu7TXydZN2ewMAAA4xqev6U5OTtZ7772nxYsXq27dujp06JAkKTo6WuHh4dqxY4fee+89DRkyRPXq1dOmTZs0depUXXvtterSpYvD0wNwzLk7qfe98uxxt1uRew6dvk58z9md1HftP+/jyEGnCsuuCd60rdzx4ug652zedvrseBt2Ur8Uwg4dVeyP27wlO2bLdgUWWtzsrEs7nejWXjmXt1Upm50BAAAfUuVruj/99FMtXLhQcXFxGj9+vDp06OB97MSJExo5cqRWrlx5aYar5GzSW2+9pTvuuEN79+7VmDFj9NNPPyk/P1/NmjXTiBEj9Oijj17wM/W/lpubq+joaK7pBvxUQHGJInftV92M3ac/ql52djxi3/k7qVemsEGcTrZtxk7qFgUWFJVtdvbjVsX8uE2xP25V+OFjF/wed3CQchMvO2dH8XYqaNKITx4AAABHWL2mu0ql+7333tPYsWM1ePBg5eTkKC0tTW+88YZuu+02SdLhw4eVkJBgy0ZqdqJ0A6hIhTupZ+y5aDk816kmDc+eEW9X9jH1vFZN/GsndWMUuWt/2ScHTp/FrtpmZ2XXYud2vIzNzgAAgM+wZSO1OXPmaO7cubr33nslSR988IHGjx+vwsJCTZgw4fdNDAA+xh0RppzObZXTuW2548E5eac/nr5bdbedvWa8op3UI/YfUcT+I2r8Var3mCcwQKean7uTetmt0/Kbx9eKndS9m52dPoMds2nbRTc7K40I14kubct2E+/aTie6tFNx/dhqmhgAAMA+VSrdGRkZGjZsmPfr0aNHq0GDBvrTn/6kkpISjRgx4pIPCAC+piS6jo5fkajjV1S2k/rpXdS3lX1cPehU+Z3UA9wX2Em9dbOzRbxNc5/fSd1V6lbdbZllZ7A3lt2yq84ui5uddW13umSz2RkAAKi9qlS6o6KidPjw4XK7iPfr109LlizR0KFDtW/fvks+IADUCBfaSf1AVrld1Otu31P5Tuq/7FL0L7vKHffupO7dwK3sf4saxFb79cxhh48pduNWxWw6vdnZTxY2O4uL9l6Dnd21vbI7s9kZAADwH1Uq3VdddZWWLVumnj17ljvet29fffLJJxo6dOglHQ4AajyXSwVNGqqgSUMduS7p7OFStyL2HipfxjP2KDKzKjup19XJts2V265FuVJeElP3giNFZh5Qsw+/UMT+IzrVpKH2jhyo/JYJ5z0vsKBI0ek7FHP6ntixm7Yp/NDRC/5sT3CQchIv04kupz8m3q09m50BAAC/VqXSPXXqVH333XcVPnbdddfpk08+0TvvvHNJBgOA2swEBSq/VRPlt2qiQ3/s7T1etpP6PkVt23P2uvGMPYrce+i8nxGSc1L10raoXtqWcsfLdlJvXnbNeLtzdlKPDFezD1eo84wU5bqi9KPpqq6ulbps3iJteiJZJ7p39F6DHbtxq6K27rroZmenmjQsO4vdrey2XbkdL/OvTeIAAAAuosq3DKuN2L0cgK8LzC9QnZ37FLXt7C7qdTN2K/zIccs/41Sjego7fFxv6P/pPj2vQoUrTAV6UZM1Xm8qQBf+c1AaEa7szm3KlWw2OwMAAP7Klt3LAQDOcEeGV7yTevbJsjPi2/ec3Ul9226F5FSwk/rhY8pRlO7VCypSmCSpUOGarBf1Z/1b0cr1Prdss7NmZbfs6lJ2y66TbZqx2RkAAEAVVal0B1p8sVXT7tMNADVVSUxdHb+yk45f2ensQWMUejT79Bnxs9eMR/+0Qxvd3byF+4xChWujuumqhj9p91+GlBVtNjsDAAC4JKpUuo0xatGihcaNG6fu3bvbNRMA4PdwuVTUIFZFDWJ1tHc37+EOz7ytrm+uVJinQIUK9x4PU4G6Bm7SvpsGKGPSaAcGBgAAqL2qVLrXr1+vefPm6fnnn1erVq00fvx43XbbbYqN5Zo+APB1e0cN1GVvLtKLmqzJerHcNd11zUltGDXQ6REBAABqnYCqPPnKK6/UK6+8ooMHD+r+++/XRx99pKZNm+rWW2/VF198YdeMtklJSVFiYqKSkpIu/mQAqOHyWyZo0xP36M6A+ToQ2ESrAvrpYGCC7gyYr01P3KNTLc6/bRgAAAB+n9+9e/muXbs0YcIErV69WllZWYqLi7tUs1Ubdi8H4E8idh9Q8/+cvU/3nlEDKdwAAABVZPvu5fv27dP8+fM1f/58nTp1Sg8++OAF/48AAL7hVIsE/fL3cU6PAQAA4BeqVLqLi4v10Ucfad68efrmm290ww036LnnntMNN9xgeWdzAAAAAAD8RZVKd3x8vOrWratx48bp5ZdfVsOGDSVJ+fn55Z7HGW8AAAAAAKp4TXdAwNl911wu13mPG2Pkcrlq3H26uaYbAAAAAFAVtlzTvWrVqt89GAAAAAAA/qJKpfuaa67RM888o48//ljFxcUaMGCAZs6cqfDwcLvmAwAAAACgxqrSfbpnzZql6dOnq06dOmrSpImef/55JScn2zUbAAAAAAA1WpVK9zvvvKOXX35Zn332mRYtWqRPPvlE7777rjwej13zAQAAAABQY1WpdO/Zs0dDhgzxfn399dfL5XLpwIEDl3wwAAAAAABquiqV7tLSUoWFhZU7FhwcrJKSkks6FAAAAAAAtUGVNlIzxuiOO+5QaGio91hhYaEmTZqkyMhI77GFCxdeugkBAAAAAKihqlS6x40bd96xMWPGXLJhAAAAAACoTapUut966y275gAAAAAAoNap0jXdAAAAAADAOko3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA28fnS/fXXX2vYsGFKSEiQy+XSokWLyj1ujNFjjz2m+Ph4hYeH6/rrr1dGRoYzwwIAAAAAcA6fL935+fnq2rWrUlJSKnz86aef1gsvvKBXX31V69atU2RkpAYNGqTCwsJqnhQAAAAAgPKCnB7gYm644QbdcMMNFT5mjNFzzz2nRx99VDfddJMk6Z133lGjRo20aNEi3XrrrdU5KgAAAAAA5fj8me4L2bVrlw4dOqTrr7/eeyw6OlpXX3211q5d6+BkAAAAAADUgDPdF3Lo0CFJUqNGjcodb9SokfexihQVFamoqMj7dW5urj0DAgAAAAD8Wo0+0/1bzZ49W9HR0d5/zZo1c3okAAAAAEAtVKNLd+PGjSVJhw8fLnf88OHD3scqMm3aNOXk5Hj/7d2719Y5AQAAAAD+qUaX7latWqlx48b68ssvvcdyc3O1bt069erVq9LvCw0NVVRUVLl/AAAAAABcaj5/TXdeXp62b9/u/XrXrl3auHGj4uLi1Lx5c02ZMkVPPPGE2rZtq1atWmnGjBlKSEjQ8OHDnRsaAAAAAADVgNKdlpamfv36eb++//77JUnjxo3T/Pnz9dBDDyk/P18TJ05Udna2rrnmGi1fvlxhYWFOjQwAAAAAgCTJZYwxTg/htNzcXEVHR2ved/PUIK6B0+MAAAAAAHxc1vEsTeg9QTk5ORe8ZLlGX9MNAAAAAIAvo3QDAAAAAGATvy7dKSkpSkxMVFJSktOjAAAAAABqIb8u3cnJyUpPT1dqaqrTowAAAAAAaiG/Lt0AAAAAANiJ0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBN/Lp0c59uAAAAAICd/Lp0c59uAAAAAICd/Lp0AwAAAABgJ0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA28evSnZKSosTERCUlJTk9CgAAAACgFvLr0p2cnKz09HSlpqY6PQoAAAAAoBby69INAAAAAICdKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2MSvS3dKSooSExOVlJTk9CgAAAAAgFrIr0t3cnKy0tPTlZqa6vQoAAAAAIBayK9LNwAAAAAAdqJ0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBO/Lt0pKSlKTExUUlKS06MAAAAAAGohvy7dycnJSk9PV2pqqtOjAAAAAABqIb8u3QAAAAAA2InSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATfy6dKekpCgxMVFJSUlOjwIAAAAAqIX8unQnJycrPT1dqampTo8CAAAAAKiF/Lp0AwAAAABgJ0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA28evSnZKSosTERCUlJTk9CgAAAACgFvLr0p2cnKz09HSlpqY6PQoAAAAAoBby69INAAAAAICdKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2ITSDQAAAACATSjdAAAAAADYhNINAAAAAIBNKN0AAAAAANiE0g0AAAAAgE0o3QAAAAAA2MSvS3dKSooSExOVlJTk9CgAAAAAgFrIr0t3cnKy0tPTlZqa6vQoAAAAAIBayK9LNwAAAAAAdqJ0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANqF0AwAAAABgE0o3AAAAAAA2oXQDAAAAAGATSjcAAAAAADahdAMAAAAAYBNKNwAAAAAANglyegBfYIyRJBXkF+hUyCmHpwEAAAAA+LqC/AJJZ/tkZVzmYs/wA/v27VOzZs2cHgMAAAAAUMPs3btXTZs2rfRxSrckj8ejAwcOqG7dunK5XE6PU6Hc3Fw1a9ZMe/fuVVRUlNPjwIeRFVhBTmAVWYEV5ARWkRVYUVNyYozRyZMnlZCQoICAyq/c5uPlkgICAi74zoQviYqK8ungwXeQFVhBTmAVWYEV5ARWkRVYURNyEh0dfdHnsJEaAAAAAAA2oXQDAAAAAGATSncNERoaqpkzZyo0NNTpUeDjyAqsICewiqzACnICq8gKrKhtOWEjNQAAAAAAbMKZbgAAAAAAbELpBgAAAADAJpRuAAAAAABsQukGAAAAAMAmlG4/5fF4nB4BQC3CnpwALiXWFACXktNrCruX+4GdO3dq8eLFKigoUOvWrXXLLbc4PRJ8VGZmppYtW6ajR4+qXbt2ZAUV2r17t9asWaP8/Hx16dJFPXv2lFT2Zl5AAO/l4qy9e/fq+++/V1ZWlnr06OHNCnAu1hRYxZoCK3xxTaF013I//fST+vTpo6uvvlo7duyQJDVs2FALFy5Uo0aNHJ4OvmTz5s0aNGiQunfvrq1btyoqKkqDBg3S7NmznR4NPmTz5s3q16+fEhMTtXnzZjVr1kxt27bVhx9+KIkXyThr8+bNuvHGG9WmTRv98MMP6tSpk26//XZNmjTJ6dHgQ1hTYBVrCqzw1TWFVawWKyws1JQpUzRq1CgtX75cGzZs0Ntvv62CggL17dtXGRkZkpz/uAWct3v3bt18880aN26clixZovXr12v48OH6/vvvlZOT4/R48BH5+fmaOHGibrnlFq1cuVJbt27Vww8/rE2bNunqq69WaWmpAgICuHwF2rlzp/70pz9pzJgxWrp0qdLT09W6dWt99tlnTo8GH8KaAqtYU2CFL68plO5azOVyKS8vT7169ZIkRUVFqXfv3vr0008VFxenESNGqKSkRC6Xi+LtxzwejxYuXKgOHTrooYcekiTFxcVp5MiRSk1N1c6dOx2eEL6iqKhI+fn5GjJkiIKCgtSwYUONHj1a//rXv3TixAn1799fkhQQEMCa4sdKSkq0YMECXXnllZo2bZpCQ0OVkJCgv/71r1q1apUyMzOdHhE+gjUFVrCmwCpfXlMo3bVYaGiojDH6/PPPvcc8Ho8aN26s9957T263WxMmTJBUVtDhv5o0aaJhw4YpNjZWLpfLm5OoqCgVFxc7PR58RFRUlEpLS7Vy5UrvseDgYF111VV6/fXXdejQIT366KOSWFP8XUxMjAYPHqy6det6P8bXuHFjBQQEsKbAizUFVrGmwApfXlMo3bXcpEmTlJ6erjfeeEOSvB+paNmypf72t78pPT1dx44dc3hKOMUYo4CAAA0ZMkQTJ06UdPZal3r16ik2NlalpaXe5y9evNipUeEDXC6XRo0ape+//17Lly8vd/wPf/iDbrjhBqWlpZXLDPyLMUbBwcEaO3as903dMx/ja9y4sRo0aKCgoCDv8899YQT/w5qCi2FNQVX48ppC6a5F9u3bp6VLl+qjjz7S7t27JUlDhgxRp06dtGDBAr377ruS5H2HsE2bNjp27JiKioocmxnOKCwslFT2x8wYozp16ngfO5OPwsJC5eXlye12S5Iee+wxjRw50pst1H6HDh3SmjVrvDvFBgYG6vbbb5fb7dZLL72k1atXe58bFBSkbt26adeuXTp58qSDU8MJZ840nVlTYmNjvV+fWVMKCgqUk5Pj/ZszY8YM3X777Tp48KAzQ6PasabAKtYUWFGT1hRKdy1xZoOABx54QPfee686deqkl156SbGxsXrqqacUFRWl1157TbNmzZIknTx5UmvWrFHDhg0VGRnp8PSoTlu2bNHll1+uL774otLdGz0ejwoKClRQUKDIyEjNmTNHc+bM0bp169SiRYtqnhhO2LRpk3r16qU77rhDo0aNUo8ePfTxxx+rbdu2euONN5SZ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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "\n", "### Predict and upload\n", "\n", "batch_data['predicted_pm25'] = retrieved_xgboost_model.predict(\n", " batch_data[['temperature_2m_mean', 'precipitation_sum', 'wind_speed_10m_max', 'wind_direction_10m_dominant']])\n", "\n", "batch_data['street'] = street\n", "batch_data['city'] = city\n", "batch_data['country'] = country\n", "# Fill in the number of days before the date on which you made the forecast (base_date)\n", "batch_data['days_before_forecast_day'] = range(1, len(batch_data)+1)\n", "batch_data = batch_data.sort_values(by=['date'])\n", "#batch_data['date'] = batch_data['date'].dt.tz_convert(None).astype('datetime64[ns]')\n", "\n", "plt = util.plot_air_quality_forecast(city, street, batch_data, file_path=\"./img/pm25_forecast.png\")\n", "plt.show()\n" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [ "monitor_fg = fs.get_or_create_feature_group(\n", " name='aq_predictions',\n", " description='Air Quality prediction monitoring',\n", " version=1,\n", " primary_key=['city','street','date','days_before_forecast_day'],\n", " event_time=\"date\"\n", ")\n", "\n", "print(f\"Batch data: {batch_data}\")\n", "\n", "monitor_fg.insert(batch_data, write_options={\"wait_for_job\": True})\n", "monitoring_df = monitor_fg.filter(monitor_fg.days_before_forecast_day == 1).read()\n", "\n", "# Hindcast monitoring\n", "\n", "air_quality_fg = fs.get_feature_group(\n", " name='air_quality',\n", " version=1,\n", ")\n", "air_quality_df = air_quality_fg.read()\n", "\n", "outcome_df = air_quality_df[['date', 'pm25']]\n", "preds_df = monitoring_df[['date', 'predicted_pm25']]" ] }, { "cell_type": "code", "execution_count": 19, "metadata": {}, "outputs": [ { "ename": "ValueError", "evalue": "You are trying to merge on datetime64[us, UTC] and object columns for key 'date'. If you wish to proceed you should use pd.concat", "output_type": "error", "traceback": [ "\u001b[0;31m---------------------------------------------------------------------------\u001b[0m", "\u001b[0;31mValueError\u001b[0m Traceback (most recent call last)", "Cell \u001b[0;32mIn[19], line 1\u001b[0m\n\u001b[0;32m----> 1\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m \u001b[43mpd\u001b[49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43mmerge\u001b[49m\u001b[43m(\u001b[49m\u001b[43mpreds_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43moutcome_df\u001b[49m\u001b[43m,\u001b[49m\u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[38;5;124;43mdate\u001b[39;49m\u001b[38;5;124;43m\"\u001b[39;49m\u001b[43m)\u001b[49m\n\u001b[1;32m 2\u001b[0m hindcast_df \u001b[38;5;241m=\u001b[39m hindcast_df\u001b[38;5;241m.\u001b[39msort_values(by\u001b[38;5;241m=\u001b[39m[\u001b[38;5;124m'\u001b[39m\u001b[38;5;124mdate\u001b[39m\u001b[38;5;124m'\u001b[39m])\n\u001b[1;32m 4\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m \u001b[38;5;28mlen\u001b[39m(hindcast_df) \u001b[38;5;241m==\u001b[39m \u001b[38;5;241m0\u001b[39m:\n", "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:169\u001b[0m, in \u001b[0;36mmerge\u001b[0;34m(left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, copy, indicator, validate)\u001b[0m\n\u001b[1;32m 154\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m _cross_merge(\n\u001b[1;32m 155\u001b[0m left_df,\n\u001b[1;32m 156\u001b[0m right_df,\n\u001b[0;32m (...)\u001b[0m\n\u001b[1;32m 166\u001b[0m copy\u001b[38;5;241m=\u001b[39mcopy,\n\u001b[1;32m 167\u001b[0m )\n\u001b[1;32m 168\u001b[0m \u001b[38;5;28;01melse\u001b[39;00m:\n\u001b[0;32m--> 169\u001b[0m op \u001b[38;5;241m=\u001b[39m \u001b[43m_MergeOperation\u001b[49m\u001b[43m(\u001b[49m\n\u001b[1;32m 170\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 171\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_df\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 172\u001b[0m \u001b[43m \u001b[49m\u001b[43mhow\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mhow\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 173\u001b[0m \u001b[43m \u001b[49m\u001b[43mon\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mon\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 174\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 175\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_on\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_on\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 176\u001b[0m \u001b[43m \u001b[49m\u001b[43mleft_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mleft_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 177\u001b[0m \u001b[43m \u001b[49m\u001b[43mright_index\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mright_index\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 178\u001b[0m \u001b[43m \u001b[49m\u001b[43msort\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msort\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 179\u001b[0m \u001b[43m \u001b[49m\u001b[43msuffixes\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43msuffixes\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 180\u001b[0m \u001b[43m \u001b[49m\u001b[43mindicator\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mindicator\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 181\u001b[0m \u001b[43m \u001b[49m\u001b[43mvalidate\u001b[49m\u001b[38;5;241;43m=\u001b[39;49m\u001b[43mvalidate\u001b[49m\u001b[43m,\u001b[49m\n\u001b[1;32m 182\u001b[0m \u001b[43m \u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 183\u001b[0m \u001b[38;5;28;01mreturn\u001b[39;00m op\u001b[38;5;241m.\u001b[39mget_result(copy\u001b[38;5;241m=\u001b[39mcopy)\n", "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:804\u001b[0m, in \u001b[0;36m_MergeOperation.__init__\u001b[0;34m(self, left, right, how, on, left_on, right_on, left_index, right_index, sort, suffixes, indicator, validate)\u001b[0m\n\u001b[1;32m 800\u001b[0m \u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39m_validate_tolerance(\u001b[38;5;28mself\u001b[39m\u001b[38;5;241m.\u001b[39mleft_join_keys)\n\u001b[1;32m 802\u001b[0m \u001b[38;5;66;03m# validate the merge keys dtypes. We may need to coerce\u001b[39;00m\n\u001b[1;32m 803\u001b[0m \u001b[38;5;66;03m# to avoid incompatible dtypes\u001b[39;00m\n\u001b[0;32m--> 804\u001b[0m \u001b[38;5;28;43mself\u001b[39;49m\u001b[38;5;241;43m.\u001b[39;49m\u001b[43m_maybe_coerce_merge_keys\u001b[49m\u001b[43m(\u001b[49m\u001b[43m)\u001b[49m\n\u001b[1;32m 806\u001b[0m \u001b[38;5;66;03m# If argument passed to validate,\u001b[39;00m\n\u001b[1;32m 807\u001b[0m \u001b[38;5;66;03m# check if columns specified as unique\u001b[39;00m\n\u001b[1;32m 808\u001b[0m \u001b[38;5;66;03m# are in fact unique.\u001b[39;00m\n\u001b[1;32m 809\u001b[0m \u001b[38;5;28;01mif\u001b[39;00m validate \u001b[38;5;129;01mis\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m \u001b[38;5;28;01mNone\u001b[39;00m:\n", "File \u001b[0;32m~/Documents/scalable-ml/lab1-new/hbg-weather/.venv/lib/python3.12/site-packages/pandas/core/reshape/merge.py:1483\u001b[0m, in \u001b[0;36m_MergeOperation._maybe_coerce_merge_keys\u001b[0;34m(self)\u001b[0m\n\u001b[1;32m 1481\u001b[0m \u001b[38;5;66;03m# datetimelikes must match exactly\u001b[39;00m\n\u001b[1;32m 1482\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[0;32m-> 1483\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n\u001b[1;32m 1484\u001b[0m \u001b[38;5;28;01melif\u001b[39;00m \u001b[38;5;129;01mnot\u001b[39;00m needs_i8_conversion(lk\u001b[38;5;241m.\u001b[39mdtype) \u001b[38;5;129;01mand\u001b[39;00m needs_i8_conversion(rk\u001b[38;5;241m.\u001b[39mdtype):\n\u001b[1;32m 1485\u001b[0m \u001b[38;5;28;01mraise\u001b[39;00m \u001b[38;5;167;01mValueError\u001b[39;00m(msg)\n", "\u001b[0;31mValueError\u001b[0m: You are trying to merge on datetime64[us, UTC] and object columns for key 'date'. If you wish to proceed you should use pd.concat" ] } ], "source": [ "hindcast_df = pd.merge(preds_df, outcome_df, on=\"date\")\n", "hindcast_df = hindcast_df.sort_values(by=['date'])\n", "\n", "if len(hindcast_df) == 0:\n", " hindcast_df = util.backfill_predictions_for_monitoring(weather_fg, air_quality_df, monitor_fg, retrieved_xgboost_model)\n", "\n", "plt = util.plot_air_quality_forecast(city, street, hindcast_df, file_path=\"./img/pm25_hindcast_1day.png\", hindcast=True)" ] }, { "cell_type": "code", "execution_count": 23, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "2024-11-20 14:23:12,559 WARNING: SettingWithCopyWarning: \n", "A value is trying to be set on a copy of a slice from a DataFrame.\n", "Try using .loc[row_indexer,col_indexer] = value instead\n", "\n", "See the caveats in the documentation: https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#returning-a-view-versus-a-copy\n", "\n" ] } ], "source": [ "import numpy as np\n", "\n", "scale = 5\n", "outcome_df['predicted_pm25'] = outcome_df['pm25'] + scale * np.random.uniform(-1, 1, outcome_df.shape[0])\n", "outcome_df.sort_values(by=['date'])\n", "outcome_df.to_pickle('outcome_df.pkl')" ] } ], "metadata": { "kernelspec": { "display_name": ".venv", "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.12.4" } }, "nbformat": 4, "nbformat_minor": 2 }