{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Anomaly Detection Using Gaussian Distribution\n", "\n", "_Source: 🤖[Homemade Machine Learning](https://github.com/trekhleb/homemade-machine-learning) repository_\n", "\n", "> ☝Before moving on with this demo you might want to take a look at:\n", "> - 📗[Math behind the Anomaly Detection](https://github.com/trekhleb/homemade-machine-learning/tree/master/homemade/anomaly_detection)\n", "> - ⚙️[Gaussian Anomaly Detection Source Code](https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/anomaly_detection/gaussian_anomaly_detection.py)\n", "\n", "**Anomaly detection** (also **outlier detection**) is the identification of rare items, events or observations which raise suspicions by differing significantly from the majority of the data.\n", "\n", "The **normal** (or **Gaussian**) distribution is a very common continuous probability distribution. Normal distributions are important in statistics and are often used in the natural and social sciences to represent real-valued random variables whose distributions are not known. A random variable with a Gaussian distribution is said to be normally distributed and is called a normal deviate.\n", "\n", "> **Demo Project:** In this demo we will build a model that will find anomalies in server operational parameters such as `Latency` and `Throughput`." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# To make debugging of logistic_regression module easier we enable imported modules autoreloading feature.\n", "# By doing this you may change the code of logistic_regression library and all these changes will be available here.\n", "%load_ext autoreload\n", "%autoreload 2\n", "\n", "# Add project root folder to module loading paths.\n", "import sys\n", "sys.path.append('../..')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Import Dependencies\n", "\n", "- [pandas](https://pandas.pydata.org/) - library that we will use for loading and displaying the data in a table\n", "- [numpy](http://www.numpy.org/) - library that we will use for linear algebra operations\n", "- [matplotlib](https://matplotlib.org/) - library that we will use for plotting the data\n", "- [anomaly_detection](https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/anomaly_detection/gaussian_anomaly_detection.py) - custom implementation of anomaly detection using Gaussian distribution." ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [], "source": [ "# Import 3rd party dependencies.\n", "import numpy as np\n", "import pandas as pd\n", "import matplotlib.pyplot as plt\n", "\n", "# Import custom Gaussian anomaly detection implementation.\n", "from homemade.anomaly_detection import GaussianAnomalyDetection" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Load the Data\n", "\n", "In this demo we will use the dataset with server operational parameters such as `Latency` and `Throughput` and will try to find anomalies in them." ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "text/html": [ "
\n", "\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
Latency (ms)Throughput (mb/s)Anomaly
013.04681514.7411520
113.40852013.7632700
214.19591515.8531810
314.91470116.1742600
413.57670014.0428490
513.92240313.4064690
612.82213214.2231880
715.67636615.8916910
816.16287516.2029980
912.66645114.8990841
\n", "
" ], "text/plain": [ " Latency (ms) Throughput (mb/s) Anomaly\n", "0 13.046815 14.741152 0\n", "1 13.408520 13.763270 0\n", "2 14.195915 15.853181 0\n", "3 14.914701 16.174260 0\n", "4 13.576700 14.042849 0\n", "5 13.922403 13.406469 0\n", "6 12.822132 14.223188 0\n", "7 15.676366 15.891691 0\n", "8 16.162875 16.202998 0\n", "9 12.666451 14.899084 1" ] }, "execution_count": 3, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Load the data.\n", "pd_data = pd.read_csv('../../data/server-operational-params.csv')\n", "\n", "# Print the data table.\n", "pd_data.head(10)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Print histograms for each feature to see how they vary.\n", "histohrams = pd_data[['Latency (ms)', 'Throughput (mb/s)']].hist(grid=False, figsize=(10,4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the Data\n", "\n", "Let's plot `Throughput(Latency)` dependency and see if the distribution is similar to Gaussian one." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Extract first two column from the dataset.\n", "data = pd_data[['Latency (ms)', 'Throughput (mb/s)']].values\n", "\n", "# Plot the data.\n", "plt.scatter(data[:, 0], data[:, 1], alpha=0.6)\n", "plt.xlabel('Latency (ms)')\n", "plt.ylabel('Throughput (mb/s)')\n", "plt.title('Server Operational Params')\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Find Anomalies Using Gaussian Distribution\n", "\n", "Let's try to use our custom anomaly detection implementation using Gaussian distribution." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "mu\n", "[14.11222578 14.99771051]\n", "\n", "\n", "sigma^2\n", "[1.83263141 1.70974533]\n" ] } ], "source": [ "# Init Gaussian anomaly instance.\n", "gaussian_anomaly = GaussianAnomalyDetection(data)\n", "\n", "# Let's see Gaussian estimation parameters.\n", "print('mu')\n", "print(gaussian_anomaly.mu_param)\n", "\n", "print('\\n')\n", "\n", "print('sigma^2')\n", "print(gaussian_anomaly.sigma_squared)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Visualize the Fit\n", "\n", "Let's draw a contour plots that will represent our Gaussian distribution for the dataset." ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Create a 3D grid to build a contour plots.\n", "\n", "# Create ranges along X and Y axes.\n", "latency_from = 0\n", "latency_to = 35\n", "\n", "throughput_from = 0\n", "throughput_to = 35\n", "\n", "step = 0.5\n", "\n", "latency_range = np.arange(latency_from, latency_to, step)\n", "throughput_range = np.arange(throughput_from, throughput_to, step)\n", "\n", "# Create X and Y grids.\n", "(latency_grid, throughput_grid) = np.meshgrid(latency_range, throughput_range)\n", "\n", "# Flatten latency and throughput grids.\n", "flat_latency_grid = latency_grid.flatten().reshape((latency_grid.size, 1))\n", "flat_throughput_grid = throughput_grid.flatten().reshape((throughput_grid.size, 1))\n", "\n", "# Joing latency and throughput flatten grids together to form all combinations of latency and throughput.\n", "combinations = np.hstack((flat_latency_grid, flat_throughput_grid))\n", "\n", "# Now let's calculate the probabilities for every combination of latency and throughput.\n", "flat_probabilities = gaussian_anomaly.multivariate_gaussian(combinations)\n", "\n", "# Resghape probabilities back to matrix in order to build contours.\n", "probabilities = flat_probabilities.reshape(latency_grid.shape)\n", "\n", "# Let's build plot our original dataset.\n", "plt.scatter(data[:, 0], data[:, 1], alpha=0.6)\n", "plt.xlabel('Latency (ms)')\n", "plt.ylabel('Throughput (mb/s)')\n", "plt.title('Server Operational Params')\n", "\n", "# On top of our original dataset let's plot probability contours.\n", "plt.contour(latency_grid, throughput_grid, probabilities, levels=10)\n", "\n", "# Display the plot.\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Select best threshold\n", "\n", "Now, in order to decide which examples should be counted as an anomaly we need to decide which probability threshold to choose. We could do it intuitively but since we have all data examples labeled in our dataset let's use that data to calculate the best threshold." ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Best epsilon:\n", "8.986095083415364e-05\n", "\n", "\n", "Best F1 score:\n", "0.8\n" ] } ], "source": [ "# Extract the information about which example is anomaly and which is not.\n", "num_examples = data.shape[0]\n", "labels = pd_data['Anomaly'].values.reshape((num_examples, 1))\n", "\n", "# Returns the density of the multivariate normal at each data point (row) of X dataset.\n", "probabilities = gaussian_anomaly.multivariate_gaussian(data)\n", "\n", "# Let's go through many possible thresholds and pick the one with the highest F1 score.\n", "(epsilon, f1, precision_history, recall_history, f1_history) = gaussian_anomaly.select_threshold(\n", " labels, probabilities\n", ")\n", "\n", "print('Best epsilon:')\n", "print(epsilon)\n", "\n", "print('\\n')\n", "\n", "print('Best F1 score:')\n", "print(f1)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot Precision/Recall Progress\n", "\n", "Let's now plot precision, reacall and F1 score changes for every iteration." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA3sAAAFNCAYAAAC5cXZ6AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzs3XecXHW9//HXZ2a2pBeyCSE9JIEE6WsQqUrAAEosV0y4CigaGwpYQbmAlGtXUKMSEVGvELnwuxo1EIqhSUuQBEhCOpBCkk0Pads+vz/Omc1k2ZZkzpwp7+fjMQ9mzvnO7GeX7HfP53y/38/X3B0REREREREpLom4AxAREREREZHsU7InIiIiIiJShJTsiYiIiIiIFCEleyIiIiIiIkVIyZ6IiIiIiEgRUrInIiIiIiJShJTsSZvMbL6ZnXkQ73/AzC7JYkgiIgfFzM40s1UZr18zs3FxxiQiIhIFJXsFKrw42WVmb5nZOjO7y8y6ZvvruPtR7v7YQbz/XHf/fRZDAiD8fmvD73+TmT1sZkdm++uISLSa9WVro+rLDpT6GhHpiGZ9WfpxWHhuqpktMrNGM7u0nc9RnyNZpWSvsH3A3bsCJwDVwLXNG1igWP8//yD8/gcC64G7WmpkZqlsflEzS2bz80SkqS87DjgeuCbmeJpTXyMiHfEBd++a8VgTHp8HfAH4dwc/R32OZE2xJgElxd1XAw8A7wAws8fM7BYz+xewExhuZj3M7Ldm9qaZrTazmzN/qc3sM2a20My2m9kCMzshPN40vcnMxprZHDPbFo4m/iQ8Xmlm/2NmG81si5nNNrN+GbF8OnyeMLNrzex1M1tvZn8wsx7huaFm5mZ2iZm9YWYbzOzbHfz+dwJ3Z3z/N5jZfWFM24BLzazCzG41szXh41Yzq8j4/r8R/mzWmNmnw1hGhOfuMrNfmdkMM9sBvCf8vB+Fsa4zs1+bWaewfR8z+3v4s9hkZk+mE24z+2b4898e3uU768D+r4sUH3dfC8wkSPoAaOt3LTw/wczmhv3SMjMbHx7/ZEafttzMPpuF+NTXiMh+c/cp7v4osHs/36c+Rw6akr0iYGaDgPOAFzMOfwKYDHQDXie4K1QPjCC4c34OkE7CPgrcAFwMdAcuADa28KVuA25z9+7A4cC94fFLgB7AIOAQ4HPArhbef2n4eA8wHOgK/KJZm1OBI4CzgOvMbHQ73z4WTPn6T/b9/icA9wE9gT8B3wbeRXAReSwwlnAkNLw4/AowjuDnc2YLX+Yi4BaCn+dTwPeAUeHnjQAGANeFbb8KrAKqgH7AtwA3syOAy4F3uns34H3Aa+19fyKlwswGAucCSzMOt/q7ZmZjgT8AXyf4XT+dvb9T64H3E/RpnwR+auFNrIOIT32NiOSM+hzJCnfXowAfBL9EbwFbCJK5XwKdwnOPATdmtO0H7EmfD49NAmaFz2cCV7TxdcaFz58AvgP0adbmU8DTwDEtvP8x4NPh80eBL2ScOwKoA1LAUMCBgRnnnwcmthLXXQR3yLYAa4HpwOHhuRuAJ5q1Xwacl/H6fcBr4fM7ge9mnBsRxjIi42v9IeO8ATvSXy88djKwInx+I/DX9Pubfe56gk63LO5/Q3rokQ+PjL5se/h79yjQMzzX3u/a7cBPO/h1/pLu5wgueFY1i2FcK+9TX6OHHnq0+2Df67ItwF9aaPMUcGk7n6M+R4+sPjSyV9g+6O493X2Iu3/B3TNH01ZmPB8ClAFvhkPvWwgukvqG5wcRdBbtuYzgbs+rFkzVfH94/I8ECeO0cJrAD8ysrIX3H0aQmKa9TpDo9cs4tjbj+U6C0b/W/Cj8/g919wvcPfN7WNmsbUtf+7CMc5ntm7+3+bEqoDPwQsbP88HwOMAPCUYmHgqnj10N4O5LgSsJOuv1ZjbNwsXbIiXugx7cDT4TOBLoEx5v73et1b7LzM41s2fDqUZbCGY/9GmpbQeorxGRjkhfl/V09w8exOeoz5GsUbJXvDzj+UqCkb0+GZ1Qd3c/KuP84e1+oPsSd59EkCR+H7jPzLq4e527f8fdxwDvJpg6dXELH7GGIPFMG0wwtXTd/n5zHeDNXrf0tdMLp98kWASdNqidz9tAME31qIyfZw8PFlPj7tvd/avuPpxgSuxX0nPX3f1udz81jMUJfo4iArj74wR3mn8UHmrzd41W+q5wvcr94ef0c/eewAyCu9ZZD7vZa/U1IhIl9TmyX5TslQB3fxN4CPixmXW3oFDK4WZ2RtjkDuBrZnaiBUaY2ZDmn2NmHzezKndvJJheANBoZu8xs6MtKPiyjWBqZmMLodwDXGVmw8J56P8N/Nnd67P8LbfkHuBaM6sysz4E88//Jzx3L/BJMxttZp2B/2rrg8Lv/zcEa4D6ApjZADN7X/j8/eHP0ICtQAPBz+kIM3tveCG6m6BDbennJFLKbgXONrNj2/tdA35L8Lt7VtivDbCgRHk5UAHUAPVmdi7BOuVcUF8jIvsws3IzqyS44VRmQWG7bF2Dq8+RNinZKx0XE1wALQA2Eyzu7Q/g7v9LsDj3boJ1M38BerfwGeOB+Wb2FkGxlonh1NFDw8/bBiwEHieY2tncneHxJ4AVBB3Cl7Lz7bXrZmAO8BLwMkH545sB3P0B4GfALILpCc+G79nTxud9M93WgopYjxCsQQQYGb5+C3gG+KW7zyK4+PwewZ2ztQQjpPlWYl4kVu5eQ1B0JV0QoNXfNXd/nrD4CsGFx+PAEHffDnyZ4EJnM0EBguk5+hbU14hIcw8RJEDvBqaGz0/P0merz5E2mXvz0WCR0mZBBdBXgIocjTqKSAlSXyMiuaQ+pzRpZE8EMLMPWbC3TC+CeeZ/U0coItmmvkZEckl9jijZEwl8lqBs8DKCOeifjzccESlS6mtEJJfU55Q4TeMUEREREREpQhrZExERERERKUJK9kRERERERIpQKu4A9lefPn186NChcYchIln0wgsvbHD3qrjjOBjqm0SKk/onEclHHe2bCi7ZGzp0KHPmzIk7DBHJIjN7Pe4YDpb6JpHipP5JRPJRR/smTeMUEREREREpQkr2REREREREipCSPRERERERkSKkZE9ERERERKQIKdkTEREREREpQkr2REREREREipCSPRERERERkSIUWbJnZnea2Xoze6WV82ZmPzOzpWb2kpmdEFUsIlJ6DqYPMrNLzGxJ+Lgkd1GLSKkzs/Fmtijsm65u4fxgM5tlZi+Gfdd5ccQpIoUhypG9u4DxbZw/FxgZPiYDv4owFhEpPXdxAH2QmfUGrgdOAsYC15tZr0gjFREBzCwJTCHon8YAk8xsTLNm1wL3uvvxwETgl7mNUkQKSSqqD3b3J8xsaBtNJgB/cHcHnjWznmbW393fzMbXf2X1Vl5evbXFc53Lk5x3dH/KkprFKlKsDrQPAs4EHnb3TQBm9jBB0nhPtBFLsVte8xbPrdgUdxgCjBvdj6puFXGH0ZKxwFJ3Xw5gZtMI+qoFGW0c6B4+7wGsydYX/9fSDbyxaWeL56q6VjBuTL9sfSkRyZHIkr0OGACszHi9Kjz2tmTPzCYT3Hln8ODBHfrwWa+u58cPL271/CFdKjh1ZJ/9CFdEikxrfVBrx9/mQPomKV03/2Mh/3x1fdxhCDDq893yNdlrqf85qVmbG4CHzOxLQBdgXEsfdCD9093Pv8E/Xmr9nvvsb4/L15+biLQizmSvw9x9KjAVoLq62jvynktPGcpHqwe97fjCN7fxybtms6e+IbtBikjJOZC+SUrXnvoGjh7Qg99cXB13KCWvV5eyuEM4GJOAu9z9x2Z2MvBHM3uHuzdmNjqQ/umWD76D/zq/+axR+PtLa7j5HwvZXadrJ5FCE2eytxrIzMYGhseyoltlGd0q396Zr9++GwDXZZlIqWutD1pNMJUz8/hjOYtKilp5KsGhPSrjDkPyV0eujS4jXI/s7s+YWSXQBzjoYeOenctbPN67S3C8URdPIgUnzkVr04GLw4p47wK2Zmu9XlsSZoA6LBFptQ+aCZxjZr3CwiznhMdEDoo7WNxBSL6bDYw0s2FmVk5QgGV6szZvAGcBmNlooBKoiTKoZCL4l1vfqGsnkUIT2ciemd1DcHe8j5mtIqhuVwbg7r8GZgDnAUuBncAno4pl37iC/6q7EiluB9oHufsmM7uJ4KIL4MZ0sRaRg+G+92+QSEvcvd7MLie4wZQE7nT3+WZ2IzDH3acDXwV+Y2ZXEVzOXBoWmopMOtlrVLInUnCirMY5qZ3zDnwxqq/fGgvvq0bcL4pIzA6mD3L3O4E7o4hLRKQt7j6D4GZU5rHrMp4vAE7JZUxJ08ieSKEqub0HEuF3rFxPRERyyfGmG44ihSQ9stegZE+k4JRcspf+Q6v+SkREcskdLdqTgqRkT6RwlVyyF/ZXKtAiIiI5pb86Uqiakj1dO4kUnJJL9lSgRURE4qKBPSlEKtAiUrhKMNlTgRYREYmBqnFKgdLWCyKFq+SSvURTshdzICIiUlJcc0qkQKWrcWpkT6TwlFyyl76pqjV7IiKSa6rGKYUoldTInkihKrlkTyN7IiISB22qLoUqfe2kAi0ihafkkj1TNU4REYmBo2RPClMq3KS4oUHXTiKFpmSTPeV6IiIiIu0Lcz2N7IkUoFTcAeRaUzVOLZQXEZEccnet2ZOClB7Z+/6Dr/KbJ5Y3HR98SGd+/NFjm66tRCT/lNzI3t5N1eONQ0RESoumcUqhGnJIZ84/uj/9e1RSUZagoizBhrf28P/+vZqdtQ1xhycibSi5kT0VaBERkTjo744UqsqyJFP+84R9jt3x5HJu/sdCVegUyXMlN7KnrRdEREREDk4qnCrVoGRPJK+VXrLXtGZPREQkd4JpnJrHKcUhmQwrdCrZE8lrJZjsBf91jeyJiEgu6e+OFBGN7IkUhpJL9tJr9hrVOYmISI5pXE+KRTJM9uobG2OORETaUnLJXvoPrVI9ERHJJVXjlGKikT2RwlByyV7TyJ76JhERySHN4pRisndkT/+wRfJZySV7Fn7HWrMnIiK5poE9KRbpjdY1sieS30ov2Qv/q1xPRERyyXFV45SiERbjpL5BF1Qi+azkkr2mTdW1ak9ERHLIXSN7UjySGtkTKQgll+ylb6qqbxIRkVzSjBIpJilV4xQpCCWX7O0t0KK/uiIikluaxSnFIqlqnCIFoeSSvTTleiIikkvBnx1le9I2MxtvZovMbKmZXd3C+Z+a2dzwsdjMtsQRZ3pkb8NbtdRs30PN9j3sqm2IIxQRaUMq7gByrWnNnrI9ERHJIf3dkfaYWRKYApwNrAJmm9l0d1+QbuPuV2W0/xJwfM4DBSrKkgB87n9eaDrWrTLF7G+PozI8JyLxK8FkL/iv/uaKiEiuaRqntGMssNTdlwOY2TRgArCglfaTgOtzFNs+jhvUk59+7Fje2hOM5j2/YhN/m7eGHXvqleyJ5JGSS/ZMm6qLiEhMlOtJOwYAKzNerwJOaqmhmQ0BhgH/zEFcb5NMGB86fuDe12b8bd4abbIukmdKbs1e08ietl4QKXodWPsyxMweNbOXzOwxMxuYca4hY13M9NxGLsVIM0okyyYC97l7iwvlzGyymc0xszk1NTWRB7O3Oqf+oYvkk5JL9tIje3UNjeypb2h61DeodLBIMclY+3IuMAaYZGZjmjX7EfAHdz8GuBH4bsa5Xe5+XPi4ICdBS9HTNE5px2pgUMbrgeGxlkwE7mntg9x9qrtXu3t1VVVVFkNsWSoZJnu6nhLJKyU3jROgLGlMmbWMKbOWNR3rVJbkka+ewYCenWKMTESyqCNrX8YAXwmfzwL+ktMIpaQ4jmkip7RtNjDSzIYRJHkTgYuaNzKzI4FewDO5Da91SY3sieSlkkz2fj7peJbV7Gh6vWLDDu57YRXrtu1WsidSPDqy9mUe8GHgNuBDQDczO8TdNwKVZjYHqAe+5+5vSwTNbDIwGWDw4MHZ/w6kqLhrZE/a5u71ZnY5MBNIAne6+3wzuxGY4+7pKeUTgWmeRyVey5LBZDHtuyeSX0oy2Rv/jv77vH5ySQ33vbBKZbFFSs/XgF+Y2aXAEwR30tPrX4a4+2ozGw7808xedvdlmW9296nAVIDq6mp1ICJy0Nx9BjCj2bHrmr2+IZcxdUR6ZK9O0zhF8kpJJnvNJVShU6QYtbv2xd3XEIzsYWZdgY+4+5bw3Orwv8vN7DGCvaz2SfZE9oejkT0pXukCLRrZE8kvJVegpSXpP77qoESKStPaFzMrJ5j2tE9VTTPrY2bpfvAa4M7weC8zq0i3AU6h9X2uRDrEXWv2pHilwmmcdQ26lhLJJ0r2yBzZUwclUizcvR5Ir31ZCNybXvtiZunqmmcCi8xsMdAPuCU8PhqYY2bzCAq3fM/dlezJQdFfGClmGtkTyU+axsneZE+5nkhxaW/ti7vfB9zXwvueBo6OPEApPRrYkyK1d589rdkTySdK9ti70bpG9kREJDKuXE+KV3qfvbd217NjT/0+5zqXJ5v2ORaR3FKyx96N1jXzQEREoqI/MVLMKlJJACb/8YW3nZt8+nC+dd7oXIckIijZAzSyJyIiuaHRDSlWo/t357sfPprtu+v2OX7HkytYsWFHK+8Skagp2SNzzZ6SPRERiUZQjVOkOCUTxqSxg992/O8vvUm99t4TiU2k1TjNbLyZLTKzpWZ2dQvnB5vZLDN70cxeMrPzooynNemNQLWmWEREoqJ99qQUpRJGvdbJiMQmsmTPzJLAFOBcYAwwyczGNGt2LUE59OMJ9sD6ZVTxtMU0jVNEREQk61LJBLX1upsuEpcoR/bGAkvdfbm71wLTgAnN2jjQPXzeA1gTYTyt0j57IiISNVc1TilBZUmN7InEKco1ewOAlRmvVwEnNWtzA/CQmX0J6AKMizCeViVUjVNERCLmuAq0SMlJJRLUN9S331BEIhHpmr0OmATc5e4DgfOAP5rZ22Iys8lmNsfM5tTU1GQ9CFXjFBGRqOlPjJSisqRR16B//CJxiTLZWw0Myng9MDyW6TLgXgB3fwaoBPo0/yB3n+ru1e5eXVVVlfVAtc+eiIjkgsb1pNSUJRPUqwKeSGyiTPZmAyPNbJiZlRMUYJnerM0bwFkAZjaaINnL/tBdO9Ije9p6QUREouKOsj0pOalkQiN7IjGKLNlz93rgcmAmsJCg6uZ8M7vRzC4Im30V+IyZzQPuAS71GDIuFWgRERERyb6yhFGnffZEYhPppuruPgOY0ezYdRnPFwCnRBlDRzQle+qLREQkQqahPSkxqaRRr5E9kdjEXaAlLyTCn4JG9kREJCrurk3VpeSktGZPJFZK9tg7sqdcT0REoqIle1KKgmmcusASiYuSPfYmew3K9kRERESypiyZoF5r9kRio2QP7bMnIiLRc0fTOKXkqBqnSLyU7KF99kREJHqOq0CLlJyypFGnNXsisVGyh/bZExGR6OlPjJSiVCKBOzTojrpILJTskbn1gjoiERGJjqZxSqlJJYN/9NprTyQeke6zVyjSyd7vnn6NB15ZC0DXihQ//Oix9O5SHmdoIiJSJBwle9I+MxsP3AYkgTvc/XsttLkQuIHgn9U8d78op0Huh/JkMK5QrxvqIrHQyB7QrTLFh08YwKHdKwHYtrueR19dz6trt8UcmYiIFAtN45T2mFkSmAKcC4wBJpnZmGZtRgLXAKe4+1HAlTkPdD+kR/ZUkVMkHhrZAxIJ4ycXHtf0+vkVm7jw9mfQemIREckuDe1Jm8YCS919OYCZTQMmAAsy2nwGmOLumwHcfX3Oo9wPqXBkr1bJnkgsNLLXgrBf0r57IiKSRa5pnNKeAcDKjNerwmOZRgGjzOxfZvZsOO0zb5WHI3sf/uXT/GvphpijESk9SvZa0FSwRcmeiIhkibvG9SQrUsBI4ExgEvAbM+vZvJGZTTazOWY2p6amJsch7nX6qCo+Vj2IVZt3MXflltjiEClVSvZaoOqcIiIiEoPVwKCM1wPDY5lWAdPdvc7dVwCLCZK/fbj7VHevdvfqqqqqyAJuT/8enfjeR44GoLZeUzlFck3JXguS4cZ72hNGRESyRdU4pQNmAyPNbJiZlQMTgenN2vyFYFQPM+tDMK1zeS6D3F9mFmyurnV7IjmnZK8Fe6dxxhyIiIgUDXfHNJFT2uDu9cDlwExgIXCvu883sxvN7IKw2Uxgo5ktAGYBX3f3jfFE3HFlyYSSPZEYKNlrQSL8qWjNnkhhM7PxZrbIzJaa2dUtnB9iZo+a2Utm9piZDcw4d4mZLQkfl+Q2cilG+osiHeHuM9x9lLsf7u63hMeuc/fp4XN396+4+xh3P9rdp8UbcccEyZ5+C0RyTcleC5KmaZwiha4j+1UBPwL+4O7HADcC3w3f2xu4HjiJoBT69WbWK1exS/HSNE4pVWXJhLZfEImBkr0WJBKqxilSBJr2q3L3WiC9X1WmMcA/w+ezMs6/D3jY3TeFe1k9DOR1eXPJf6rGKaWsPGnUqUCLSM4p2WuBtl4QKQod2a9qHvDh8PmHgG5mdkgH35s3pc2lMLj+pkgJK0tpzZ5IHJTstWDvNM6YAxGRqH0NOMPMXgTOIChx3tDRN+dLaXMpHKZ5nFKiUgnjoQXr2F3X4S5WRLJAyV4LVKBFpCi0u1+Vu69x9w+7+/HAt8NjWzryXpH9pb8oUso6lSfZWdvAIwvXxR2KSElRstcCbaouUhTa3a/KzPqYWbofvAa4M3w+EzjHzHqFhVnOCY+JHDhXgRYpXT+fdAIAO/bUxxyJSGlRsteCpk3VNbInUrA6uF/VmcAiM1sM9APSZc43ATcRJIyzgRvDYyIicgC6VqQAqFWRFpGcSsUdQD7SyJ5IcXD3GcCMZseuy3h+H3BfK++9k70jfSIHzUGbqkvJKk8F4wt7lOyJ5JRG9loQDuyhXE9ERLLF3TWNU0pWRZjsaa89kdzSyF4LmqZxKtsTESlq7p6zkQb9RZFSVpYMkr26ev0miOSSkr0WaFN1EZHS8Jk/zOGRhetz9vVSSQ3tSWlKJoxkwqht0NYLIrmkZK8FSW2qLiJSEl7buJMj+nVjwvGHRf61EmZ84Njov45IvipPJlSgRSTHlOy1IF2g5dGF69m4o3afc+8c0ptxY/rFEZaIiGSZuzPi0G584cwRcYciUvSSCWPWohq+fX7ckYiUDiV7LahIJTjy0G7MXbmFuSu3NB2va2jk4T7rlOyJiBSJoEKmiORCXUNj0+wpEckNJXstSCSMB688/W3Hr/rzXF54fXMMEYmIiIgUtnOOOpRXVm+NOwyRkqKtF/ZDMmGq0CkiUkwcTCMNIjmhNXsiuadkbz+kEkZ9ozopEZFioWmcIrlTnkpoU3WRHFOytx80siciUlxcVZdFcqYilWBPvbZeEMklJXv7QcmeiEjx0SxOkdyoSGkap0iuKdnbD8mEUa9kT0SkaGgap0julKcS1DY0akRdJIdUjXM/pDSyJyJSVHTNKZI75ckE7nDWTx7f5ybLUYf14GeTjo8tLpFipmRvPySU7ImIFB1V4xTJjfHvOJSlNW/tM0tq0drtPPDKm4CSPZEoKNnbDxrZExEpLo5rGqdIjozs143bJu6b1N32yBJ++shiGhqdZEK/jSLZpjV7+yGZSFDf6JprLiJSJNSdi8Sroiy4FFXhFpFoKNnbD6nwjpMG90REiogGEySPmNl4M1tkZkvN7OoWzl9qZjVmNjd8fDqOOLOlIhVcimpLBpFoaBrnfkhPL9BUAxGR4uAOpmxP8oSZJYEpwNnAKmC2mU139wXNmv7Z3S/PeYARqEglAbTZukhEIh3Za+/uVNjmQjNbYGbzzezuKOM5WJnJnoiIiEiWjQWWuvtyd68FpgETYo4pUuXpkb06JXsiUYgs2cu4O3UuMAaYZGZjmrUZCVwDnOLuRwFXRhVPNqSncdY3qkMSESkG7q5N1SWfDABWZrxeFR5r7iNm9pKZ3Wdmg3ITWjTS0zi/+8BCHlmwLuZoRIpPlCN7Hbk79RlgirtvBnD39RHGc9ASppE9EZFio1xPCszfgKHufgzwMPD7lhqZ2WQzm2Nmc2pqanIa4P4Y3b8bQw/pzKML1/Prx5fFHY5I0Yky2evI3alRwCgz+5eZPWtm4yOM56Clkkr2RESKiYNG9iSfrAYyR+oGhseauPtGd98TvrwDOLGlD3L3qe5e7e7VVVVVkQSbDSP6duOxr7+HU0Ycwm4VaRHJurircaaAkcCZwCTgN2bWs3mjfLk7pTV7IiLFRVsvSJ6ZDYw0s2FmVg5MBKZnNjCz/hkvLwAW5jC+yFSWJbVuTyQCUSZ77d6dIhjtm+7ude6+AlhMkPztI1/uTu1ds6erAxGRYqFqnJIv3L0euByYSZDE3evu883sRjO7IGz25bCo3Tzgy8Cl8USbXZVlSY3siUQgyq0Xmu5OESR5E4GLmrX5C8GI3u/MrA/BtM7lEcZ0ULRmT0SkuDgq0CL5xd1nADOaHbsu4/k1BMXtikpFKsFujeyJZF1kI3sdvDs1E9hoZguAWcDX3X1jVDEdLK3ZExEpLprGKZIfgmmcGtkTybZIN1XvwN0pB74SPvJeMhHkxprGKSJSPDSyJxK/yrIk23bXM/q/Hmyz3aWnDOWb44/MUVQihS/SZK/YJDWNU0SkqAS9ubI9kbhNfOcgHG9ztP1v89Yw940tuQtKpAgo2dsPqsYpUljC7VxuA5LAHe7+vWbnBxPsUdUzbHO1u88ws6EE088XhU2fdffP5SpuyR1N4xTJD0P7dOGac0e32Wbhm9t4a099jiISKQ5K9vZDSsmeSMEwsyQwBTiboPLvbDOb7u4LMppdS7Ce+FdmNoZg2vnQ8Nwydz8ulzFLHFSgRaRQVKSSbHirNu4wRApK3PvsFZRkMr31gqpFiRSAscBSd1/u7rXANGBCszYOdA+f9wDW5DA+yRPK9UQKQ2VZQkVcRPaTkr39kF6z16h5PyKFYACwMuP1qvBYphuAj5vZKoJRvS9lnBtmZi+a2eNmdlqkkUps1J2LFI5OZUl2KdkT2S/tJntm1s/MfmtmD4Svx5jZZdGHln+aNlVv0NWBSK5E3AdNAu5y94HAecAfzSwBvAkMdvebcqPIAAAgAElEQVTjCaoF321m3Zu/2cwmm9kcM5tTU1OTpZAklxxV45Ts07VTNCrLkqzfvofxtz7B+Fuf4FN3zaa+QbOtRNrSkZG9uwj2wzssfL0YuDKqgPKZCrSIxOIuDqwPWg0Myng9MDyW6TLgXgB3fwaoBPq4+570np/u/gKwDBjV/Au4+1R3r3b36qqqqg5/Q5JfTBM5JfvuQtdOWTfhuMMYN7ovg3t3JmHGP19dz6YdWsMn0paOJHt93P1eoBGaNksvyTH0dLKnffZEcupA+6DZwEgzG2Zm5cBEYHqzNm8AZwGY2WiCZK/GzKrCAi+Y2XBgJLA8G9+M5BfXPE6Jhq6dIlA9tDe3f6KaqRdXc9mpwwA0rVOkHR2pxrnDzA4h3I7IzN4FbI00qjyVTvZue3QJDpwxSnfyRXLggPogd683s8sJ7q4ngTvdfb6Z3QjMcffpwFeB35jZVeHnX+rubmanAzeaWR3Bxdrn3H1TJN+dxErTOCUiunaKWKfyJKBkT6Q9HUn2vkJwN/xwM/sXUAX8R6RR5anhfbryzqG9mLdyK/e/sErJnkhuHHAf5O4zCAqvZB67LuP5AuCUFt53P3D/QcQsBUS5nkRA104R61QWJnu1SvZE2tJusufu/zazM4AjCP4mLnL3usgjy0M9Opfxv597N+N+8ri2XxDJEfVBEiV3MA3tSZap34peemTvjU076dO1gn7dKylPqci8SHPtJntmdnGzQyeYGe7+h4hiynuphFGnipwiOaE+SKKkNXsSBfVb0eteWQbAFdPmAnDOmH5Mvbg6zpBE8lJHpnG+M+N5JUExg38DJdthlSUTKvUrkjvqgyQySvUkIuq3Ija6fzdu/8SJbN9dz51PrWDN1l1xhySSlzoyjTNzk2HMrCcwLbKICkAqaarIKZIj6oMkaprFKdmmfit6Zsb7jjoUgFmL1rPwzW0xRySSnw5kcvMOYFi2AykkZYkEdRrZE4lLyfdBkkW6bye5oX4rQp3Lkuzco0ItIi3pyJq9v7H3z2ECGEO4CXGpSiWN2noleyK5oD5IouRoU3XJPvVbudW5PMnO2vq4wxDJSx1Zs/ejjOf1wOvuviqieApCKplgh0r9iuSK+iCJlKZxSgTUb+VQ54qU9tsTaUVH1uw9notACklZwlSgRSRH1AdJlFSNU6Kgfiu3OpclqWtwausbtf2CSDOtJntmtp2WVzMY4O7ePbKo8lwyYTSoQItIpNQHSS4E0zhFskP9VjzSe+7tqm1QsifSTKvJnrt3y2UghaQsmWD99j24uzbjFYmI+iDJFXXjki3qt+LRpSK4nN1ZV08PymKORiS/dPj2h5n1NbPB6UeUQeW7TuVJNu2o5bdPrYg7FJGSoT5IoqBZnBIl9Vu50Tkc2dupegoib9NusmdmF5jZEmAF8DjwGvBAxHHltavOHgXAm1t3xxyJSPFTHyRRcjRDQ7JP/VZudSkPRvYu+PlTfOiX/9JaXJEMHRnZuwl4F7DY3YcBZwHPRhpVnhvQsxO9Opdprz2R3FAfJJFx15o9iYT6rRw6aXhvvnDm4RxxaDdefGML9aqrINKkI8lenbtvBBJmlnD3WUB1xHHlvbKkNlYXyRH1QSJSaA643zKz8Wa2yMyWmtnVbbT7iJm5mZV8f9itsoxvjD+S9x11KID2QhbJ0JF99raYWVfgSeBPZrYe2BFtWPkvSPZ050gkB9QHSWQcNLQnUTigfsvMksAU4GxgFTDbzKa7+4Jm7boBVwDPZT3yApauxKmb8SJ7tTqyZ2ZTzOxUYAKwE7gSeBBYBnwgN+Hlr/KURvZEoqQ+SHLCwZTtSZZkod8aCyx19+XuXgtMCz+ruZuA7wMqHpChLBlc1tbq+kykSVsje4uBHwL9gXuBe9z99zmJqgCkEqZkTyRa6oNEpNAcbL81AFiZ8XoVcFJmAzM7ARjk7v8ws6+39kFmNhmYDDB4cGkUAi1PJ3uaxinSpNWRPXe/zd1PBs4ANgJ3mtmrZnadmY3KWYR5qiyZoLZe0zhFoqI+SHIhqMYZdxRSLKLut8wsAfwE+GoHYpnq7tXuXl1VVXWwX7og7J3GqeszkbR2C7S4++vu/n13Px6YBHwIWBh5ZHmuTNM4RXJCfZBESdU4JQoH0W+tBgZlvB4YHkvrBrwDeMzMXiOo+DldRVoC6Wmcuj4T2asj++ylzOwDZvYngj1iFgEfjjyyPFeeNJbVvBV3GCJFT32QRE0je5JtB9FvzQZGmtkwMysHJgLT0yfdfau793H3oe4+lGA7hwvcfU72v4vCkx7Z27Kzjp219TFHI5IfWl2zZ2ZnE9yNOg94nmCR8GR3VxU8YNuuelZt3hV3GCJFS32Q5IIme0k2HWy/5e71ZnY5MBNIAne6+3wzuxGY4+7T2/6E0tapLAnAhbc/A8BtE49jwnED4gxJJHZtFWi5Brgb+Kq7b85RPAXjPUf2ZdG67TQ0OsmEbguLREB9kETO3VWNU7LpoPstd58BzGh27LpW2p55IF+jWI0d1pv//tDR7Kyt579nLGTpes3AEmk12XP39+YykELTo1MZEFR86lSejDkakeKjPkhywdE0Tske9VvxKk8luOikoPLobY8uYftuTeUUaXfNnrQsPS9c5X1FRERE8ku3ihQbd9TGHYZI7JTsHaB0srenoSHmSERE5ECpGqdIcerRuZy/zVvD7Y8vizsUkVgp2TtAFUnt5SIiUhQ0j1Ok6Nw44SgAFq3dHnMkIvFSsneANI1TREREJD+9c2hvRvfvzjat25MSp2TvACnZExEpbO7BzAyN64kUp26VKZ5bvpE99VpyI6Wrra0XpA0VYbL3H79+mlTG1gu9u5Tz18tPpWuFfrQicTOz8cBtBPtV3eHu32t2fjDwe6Bn2ObqsOw5ZnYNcBnQAHzZ3WfmMnaJXpjraRanSJHq172S51ds4o/PvM6nTxsedzgisVBGcoDGDuvNZ88Yzq7avXeLVmzYwZNLNrB2625G9O0aY3QiYmZJYApwNrAKmG1m0919QUaza4F73f1XZjaGYG+roeHzicBRwGHAI2Y2yt11e1hEpEDc/MF38Ld5a1i/fU/coYjERsneAepWWcY1547e59jM+Wt5cskGTRcQyQ9jgaXuvhzAzKYBE4DMZM+B7uHzHsCa8PkEYJq77wFWmNnS8POeyUXgkhvp8lraVF2kOPXoVEa/7hVs3VkXdygisVGyl0XpqZ17tI5PJB8MAFZmvF4FnNSszQ3AQ2b2JaALMC7jvc82e++AaMKUuDSt2VOuJ1K0uleW8dji9Xz697MB+MTJQzljVFXMUYnkTqQFWsxsvJktMrOlZnZ1G+0+YmZuZtVRxhO1ilQSgD11SvZECsQk4C53HwicB/zRzDrcL5rZZDObY2ZzampqIgtSREQOzITjDqNP1wre3LqbJ5Zs4L4XVsUdkkhORTay18H1MphZN+AK4LmoYsmVirL0yJ6mcYrkgdXAoIzXA8NjmS4DxgO4+zNmVgn06eB7cfepwFSA6upqbbpZYPZO4xSRYnX5e0dy+XtHAjDhF0+xdZemdEppiXJkr2m9jLvXAun1Ms3dBHwf2B1hLDmhaZwieWU2MNLMhplZOUHBlenN2rwBnAVgZqOBSqAmbDfRzCrMbBgwEng+Z5FLTqgap0hp6d6pjCcW17By0864QxHJmSiTvZbWy+yz5sXMTgAGufs/IowjZ9LTOKc+sZw7nlweczQipc3d64HLgZnAQoKqm/PN7EYzuyBs9lXgM2Y2D7gHuNQD84F7CYq5PAh8UZU4i4+TXrOnbE+kFAzq3RmAb/3fyzFHIpI7sRVoCdfF/AS4tANtJwOTAQYPHhxtYAdhQM9OnDikF0vWbWfR2u3a00UkZuGeeTOaHbsu4/kC4JRW3nsLcEukAYqISM5854KjmL1iEzXaikFKSJQje+2teekGvAN4zMxeA94FTG+pSIu7T3X3anevrqrK3wpKncqT3P/5d/Pxdw1hd50GAURE8plrlaVISSlLJjhuUE9N45SSEmWy1+Z6GXff6u593H2ouw8lKHN+gbvPiTCmnKgsS1Lf6NQ3aO2eiEi+0yxOkdJRUZZgR20Dr2/cEXcoIjkRWbLXwfUyRakyrMq5W4VaRERERPLG6SODGWKrNu+KORKR3Ih0zV5762WaHT8zylhyKV2oZXddA10rtG+9iEg+aqrGqc0XRErGkEO6ADB35RbeffghKtAkRU+ZSATSI3uPLarhkK7lrbYb3qdLU6cjIiK5tbcaZ8yBiEjOVHWrAOCHMxdxwuBenHz4ITFHJBItJXsR6NM16Ei+9r/z2mw39JDOPPb19+QiJBEREZGS17tLObd+7Diu/PNcVm7aqWRPip6SvQi898i+zPjyaeypb70i5x1PreCpJRtyGJWIiGTaO41TRErJ2WP6AfDKmq1cuE/heJHio2QvAmbGmMO6t9lmUK917KrV9gwiInFJ77ygaZwipaVzeVBb4YXXN8cciUj0otx6QdrQqSxJbUOjtmcQEYmJa6M9kZJkZpwxqko33aUkKNmLSadybc8gIpIPVI1T8omZjTezRWa21MyubuH858zsZTOba2ZPmdmYOOIsdEMP6czyDTvYXaeET4qbpnHGpFNZMIXgymkvUp5K0Lk8xXUfGEP3yrKYIxMRKXyL123n5/9cSkNj6zfU6hpUjVPyi5klgSnA2cAqYLaZTXf3BRnN7nb3X4ftLwB+AozPebAFrm/3SgBeWrWVscN6xxyNSHSU7MXkhCG9GNO/O69v3MmuugZWbd7FhOMO47Rws08RETlwjyxcx9/mreHwqi4k2sjmRvfvzvGDe+YwMpE2jQWWuvtyADObBkwAmpI9d9+W0b4Le5efyn5475F9+eHMRby2YQej+nWlZ+fWt8oSKWRK9mJy1GE9mHHFaQDMX7OV83/2FDs1d1xEJCvSy/FmXHEaFalkvMGIdNwAYGXG61XASc0bmdkXga8A5cB7cxNacekb7rf3jftf4hv3w20Tj2PCcQNijkok+7RmLw90Lg9y7p219TFHIiIiIvnO3ae4++HAN4FrW2pjZpPNbI6ZzampqcltgAXgkK4VTP3Eidw04ShSCWPR2u1xhyQSCY3s5YEuYQlgjeyJiGSXiq9IgVkN+2z8NjA81pppwK9aOuHuU4GpANXV1Zrq2YJzjjoUgCmzljHj5TdZuXlX07kJxx7GuHA/PpFCpmQvD3QKk70/PvM6Ty7ewNEDe/DF94yIOSoRkcKV3lZBxVekwMwGRprZMIIkbyJwUWYDMxvp7kvCl+cDS5CD8v5j+vPPV9czf/VWANZs3cWG7XuU7ElRULKXB7pWpDhnTD9e37iT51/bxKxF65XsiYgcBG2hJ4XI3evN7HJgJpAE7nT3+WZ2IzDH3acDl5vZOKAO2AxcEl/ExeHa94/h2vfv3cHi8//zAvNWbuEfL70JQMLglJF9VDFdCpKSvTxgZky9uBqA2x5Zwk8fWUx9QyOppJZUiogcDA3sSaFx9xnAjGbHrst4fkXOgyoxw6u68MAra/ni3f9uOnbFWSO56uxRMUYlcmCU7OWZrpXB/5Idexro0VnJnojIgUgP7JnmcYrIfrpq3Cg+eNyApn7k43c8x6qM9XwihUTJXp7pWhGs39u+p44enTVdQETkQGgap4gcqFQywch+3ZpeH9azE+u3744xIpEDp6GjPNO1IkjwduxRZU4RkYOlcT0ROVj9ulewZotG9qQwKdnLM13Ckb239tTFHImISOFyVI1TRLKjf49OLKvZwc8eVeFTKTxK9vJMt3DN3lsa2RMROWCaxiki2XLZqcMAmPP65pgjEdl/SvbyTJeKINl79c1trNy0M+ZoREQKkwq0iEi2DOrdmXGj+/HE4hpeCffiEykUSvbyTO8u5QB894FXOe0Hs5TwiYiIiMTsY+8cBMDs1zbFHInI/lGyl2f6dqvk/s+/my+/N9hUfeOO2pgjEhEpQO5aryciWXPmEVUAfOdvC3QjXgqKkr08dOKQXpw0/BAA9tRp7Z6IyP7Skj0RyaayZIKrxgWbqv/fi6txLQyWAqFkL09VpIL/NXvqG2OORESkMGlgT0Sy6RMnDwHgJw8v5rHFNTFHI9IxSvbyVGVZsAWDkj2RA2dm481skZktNbOrWzj/UzObGz4Wm9mWjHMNGeem5zZyOVjuKs4iItnVu0s5d3/mJADuee4Nfv/0a+ysrY85KpG2peIOQFq2d2RP0zhFDoSZJYEpwNnAKmC2mU139wXpNu5+VUb7LwHHZ3zELnc/LlfxSna5JnKKSAROHn4Iw6u68NCCdTy0YB3dO6X40PED4w5LpFUa2ctTFalgZG/Bmm08u3wj23drk3WR/TQWWOruy929FpgGTGij/STgnpxEJjmhcT0RyTYz46ErT2fudWcDcPPfF2r9nuQ1JXt5qnunFAmDXz62jIlTn+WWfyyMOySRQjMAWJnxelV47G3MbAgwDPhnxuFKM5tjZs+a2QejC1OiEEzjjDsKESlGqWSCnp3LGdm3Kxt31DJ/zTY2vLUn7rBEWqRkL0/17FzOg1eezt2fOYkRfbuyZuvuuEMSKWYTgfvcPXPe9BB3rwYuAm41s8Obv8nMJocJ4ZyaGi3Wzye6zy4iUfv2+aMBeP/Pn6L65keYv0Ybrkv+UbKXx0b168a7D+/DgJ6deHb5Rrbs1J57IvthNTAo4/XA8FhLJtJsCqe7rw7/uxx4jH3X86XbTHX3anevrqqqykbMkiXuYJrIKSIROnVEH6ZcdALXhknfN+57icZG3WqS/KJkrwAc1rOS2vpGvnTPi3GHIlJIZgMjzWyYmZUTJHRvq6ppZkcCvYBnMo71MrOK8Hkf4BRgQfP3Sp5TriciEUolE5x/TH8uffdQKssSzF+zjVc0uid5RsleAbj63NH0617B6s274g5FpGC4ez1wOTATWAjc6+7zzexGM7sgo+lEYJrvu8J+NDDHzOYBs4DvZVbxlPynapwikiupZIK/XX4qAF+5d17M0YjsS1svFIAenco4Z8yh/PHZ11mybjsj+3WLOySRguDuM4AZzY5d1+z1DS2872ng6EiDk2i5BvZEJHdG9O3K8D5dWLr+LR5btJ4zj+gbd0gigEb2CsZRh3UH4CcPL445EhGRwqBqnCKSK2bG9RccBcCVf57LRlXnlDyhZK9ATBw7mBOH9GL9dnUeIiLt0SROEcm1M0ZV8alThrFlZx2X/O75uMMRAZTsFZQBPTsxd+UWTrzpYU686WGu/+srcYckIpKX3F3VOEUk5646eyTHD+7JK6u3cer3/8k9z78Rd0hS4pTsFZBPnTqMSWMHce7Rh9KjcxmzFmlfLxGR1mgap4jkWrfKMn780WO5sHogtfWNTJ+7Zp/zdQ2NnHvbk1qWIzmjZK+AHDeoJzd/8Ghu/uDRvPeIvryxaSf3v7Aq7rBERPKOq0CLiMRkeFVXfvAfx3LW6L68unYbmcWe39pdz8I3t/GzR5fw17mtbf0qkj1K9grU2GG9Abjm/15m34rxIiKiXlEKlZmNN7NFZrbUzK5u4fxXzGyBmb1kZo+a2ZA44pT2HXlodzbvrGPFhh1Nx+oaGpuef/2+l3QNJ5FTslegzjnqUL513pHU1jdSo4pPIiJvY5rHKQXGzJLAFOBcYAwwyczGNGv2IlDt7scA9wE/yG2U0lFjwkrqZ//0CRobg6SuNkz2ylMJausbuWLa3Njik9KgZK+ADejZGYBHF66PORIRkfyiaZxSoMYCS919ubvXAtOACZkN3H2Wu+8MXz4LDMxxjNJB1UN6cfaYfjQ0Oj98aBEAdQ1B0vfN8UdSWZZg+rw1TJ+3pq2PETkoSvYK2Nlj+gFw179eY+uuupijERHJH66JnFKYBgArM16vCo+15jLggUgjkgNmZvz4wmMB+NfSDQDU1gcje4d2r+TBK04H4N7ZK9/23nkrt/D+nz/J+FufYPytT3D+z57k+RWbchS5FJNIkz3NO49WeSrB8KouLFq3nd8//Vrc4YiI5A13NLQnRc3MPg5UAz9s5fxkM5tjZnNqalS9Oy7dK8v47BnDWbBmGx+/4zn+EhZlKUsaQ/t04eKTh/DU0g38/NEl+7xv9mubeGX1Ngb07MTg3p2Zv2YbF97+DEOv/gfH3/gQG7SERzoosmRP885z4+9fOpWypDHj5TfjDkVEJK8o15MCtBoYlPF6YHhsH2Y2Dvg2cIG7t3jV7+5T3b3a3aurqqoiCVY65gPHHMaJQ3rxypqt/PrxZQCUpYJL8ItPHgrAjx9ezMhvz+CYG2ayfttu9oQjgFP+8wSmXlzN7z81livOGsmnThnG5p113PWv1+L4VqQARTmyp3nnOdC5PMWgXp1ZvG67KjqJiIgUttnASDMbZmblwERgemYDMzseuJ0g0dOi/QLwjgE9+PNnT+ajJw4kfalWkQwuwUf07crDV53OF848nHGj+7Ftdz0/emhR03TP8rDdGaOquOrsUfzX+0dTWZbgF7OW8qV7XmSaNm2XdkSZ7GneeY5cespQGh3+/cbmuEMREckL7q5qnFJw3L0euByYCSwE7nX3+WZ2o5ldEDb7IdAV+F8zm2tm01v5OMkz5x3dv+l5emQPYGS/bnxj/JH86uMnArB9dz176hspTyZIJPbtx8yMX0w6gRF9u/LUkhqu/n8vs6u2ITffgBSkVNwBwD7zzs9o5fxkYDLA4MGDcxhZYageEuy59+SSDQzu3YU+Xct1kSMiJU/doBQid58BzGh27LqM5+NyHpRkxfGDe/HN8Ucyc/5ahvfp0mKb6iG92Lqrjtr6RspTLY/JjBvTj3Fj+jFr0Xo++bvZ/PyfS/jG+COjDF0KWJQje5p3niNjDutO7y7l3PrIEt55yyN878FX4w5JRCRWmtQuIvno82cezl++eAqHdK1o8XyPTmU8vWwjO2vrqWgl2Us7c1QVA3p24pePLWPzjtoowpUiEOXIXtO8c4IkbyJwUWaDjHnn4zXv/ODc/okTeXXtdn731Ar+8dKbNDTsvdQ5fnAvzj+mfxvvFhEpLtpnT0QK0dEDe/Doq+v517INrY7spZkZV44bydfve4kTbn6YRTed2+57pPRE9i9C885z651De/OJdw3hIycOZPOOWu55/g3uef4Nfv/Ma3zr/15m7dbdTY+GRt3zFpHip+nsIlJoPn3acCrLEqzctIuencvbbf/R6kF84NjDcIcps5aqWJ+8TaRr9jTvPPe++J4RfPE9I5pe//7p17h++nze9d1Hm45dWD2QH/zHsXGEJyKSE9pUXUQKUdeKFDO+fBprt+5mWFXL6/qa+9nE4/j365u57dElPLmkhncNP4Tzju7POwb0iDhaKQR5UaBFovMfJw6kc3mS+nA0b9rzb/DC66raKSLFTdM4RaRQDa/qyvCqrh1ub2b84bKxfOKO53h59Vb+/cYWps1eyayvnUmPTmURRiqFQBN7i1yXihQfrR7EpLGDmTR2MKeNrGJZzQ6eXrYh7tBERCLjqBqniJSOw6u68vQ1Z7HklvOYNHYQm3bUcvX9L8UdluQBJXsl5qThwTYN/3nHc+yp174sIiIiIsXkhguO4tQRfXjglbU8vWwD23fXUd/QGHdYEhMleyXmtJFVfOXsUbjDjx9aHHc4IiKRCGoUaGhPREpPRSrJjz4a1Ga46DfPcfQND3HubU+qQF+JUrJXgj57xnBSCWPqE8t58JW1cYcjIhIB1zROESlZh/aoZNrkd3Ht+aO5+OQhLFn/FmNveYQ6jfCVHCV7JagileT/vnAKAJ/7nxe4d87KmCMSEck+5XoiUsreNfwQPn3acK7/wFGcNrIPG3fUctT1M/ntUyvYXbd3Kc/uugbuf2GVEsEipWSvRB09sAe/vaQagG/c9xIjvz1DSZ+IFA1tNSUiEkgmjKmfqOb8Y/pTW9/ITX9fwJH/9WDTvnx/f+lNvvq/8xj57Qf4wYOvsrO2Pu6QJYuU7JWws0b340+fPonL3zOCXp3L+cZ9L7F43Xa27a6LOzQRkYPirmqcIiJpncqTTLnoBBbffC7fHH8kAD+cuYjvPvDqPhux//KxZXzs9meZ9ep6bdBeJJTslbhTRvTha+87gq+97wgAzvnpExxzw0Pc+shi/ZKLSEEzTeQUEdlHeSrB5888nCW3nMvIvl2Z+sRy7nhyBQAvXDuOS989lJdXb+WTd83m3Nue5JEF63Q9WOCU7AkAF1YPYspFJ3D9B8YAcOsjS/jZo0tjjkpE5MA4ujgREWlNWTLBnz5zEv17VLJo3XYAOpenuOGCo3juW2cxaexgXl27nU//YQ6n/3AWtz++jBUbdrB5R62SvwKjZE+anH9Mfz55yjAeuup0AH76yGKt45OCZmbjzWyRmS01s6tbOP9TM5sbPhab2ZaMc5eY2ZLwcUluI5eDpWmcIiJt69utko+9c1DT68qyIC3o172S7374aOZedzaXnDyEdVv38N0HXuU9P3qM4296mDN/9Bh/nv2GtnIoEEr25G1G9evG3Z85CQiKt1wx7UX21DfoTo4UFDNLAlOAc4ExwCQzG5PZxt2vcvfj3P044OfA/wvf2xu4HjgJGAtcb2a9chm/HBxH1ThFRNoz4bgBDOvThVNH9MGa3SHr2bmc70x4By9/5xzu//y7ueEDY/jkKUNZtXkX37z/ZS68/RkeXbiORiV9eS0VdwCSn959eB8euup0LvrNs/x17hr+OncNZx3Zl99e+s64QxPpqLHAUndfDmBm04AJwIJW2k8iSPAA3gc87O6bwvc+DIwH7ok0YhERkRwa1qcLs752ZpttKlJJThzSixOHBPc8v/6+I7jp7wu45/mVXPb7OQB0KU/yu0+OZeyw3lGHLPtJyZ60alS/bjz1zffyp+fe4JllG3lk4TrWbt3NoT0qm9r86bnXeWt3PZ8+bTjJhO6jS14ZAGTOQ15FMOakRaMAABmQSURBVFL3NmY2BBgG/P/27jw6rurK9/h3l0pVUmmeZVseJFueMB7AYAPGGBsTQghkgIRAXsgD4qSzSCfQgUc6/fICndUhHTrpJI904CVkAMIYBkMMZjBDMGA8xHjExvMsy5NsyZrrvD/qSpTVxhOqUb/PWrVc99xTVfselbZ16p7ad94xHjsgBjFKjESWcSoniYj0tlDAz48/N5bvXDSc55fvZPehVh5btJUv3Ps2IyvzmDCokG9OG8bA4lCiQxU02ZPjyMrM4IYp1VwwvIyXV9cx+cev8OANk5hSWwrA959aAcBDC7bw4s1TycrMSGS4IqfqauAJ51zncXtGMbNZwCyAQYMGxSIuOUUq0CIiElsV+Vl89bxqAKaNKOexRVt5d+M+Hn53K48t2saNU6qprcjjsxMG6IRAAuk7e3JChpXn8k8zhwPwnUeXsmJ7A/ub2rr3b9l3mJH/+wVeXLkrUSGK9LQdGBi1XeW1Hc3VHLlE84Qe65y7zzk30Tk3says7GOGKyIikprOri7m7qvG8cZtF/LsTVOozM/i3jc28N3H3+PMH73ENx9azH+8uIZDupZz3OnMnpywb82opSI/i9v+sozLfvUmZXlBAG6+aDj+DOOnc9cw64HF/J9Pj+bS0/vh9xkluUHaOsL84a2NNLVGTpqYwZRhpQwsDpHlz6AglJnIw5L0tRCoNbNqIhO1q4FrenYys5FAEfB2VPNc4N+iirJcDHwvtuFKr1I1ThGRhDi9qoA3bruQ1o5O/rxgC39dvpO/rd3DnOW7uP/Njfy/r0xkUk2JzvbFiSZ7clKumlhF/8Js3t20j1++8gEAeVl+rp9Szfm1pVz+f+dzx7OruOPZSA2Mb8+oZVJ1Mf825/0jnuc/X4481u8z7rxiDNdM0hI46V3OuQ4zu4nIxC0DuN85t9LM7gQWOedme12vBh5xUeVmnXP7zOxfiUwYAe7sKtYiqcGhyZ6ISKJk+IxQwM+N59dw4/k1APxw9kr+8NYmrvntAiBS1GVYeS4zRlVQnhfk8vH9CQU0NeltGlE5KWbGlNpSzh1awo4Dzby1bg9jqwoAGFtVyIo7PsGcZTtpD4f5/lMreOrv26mtyAVg7nemMqIyj7qDLbyyejcAf3p7E//81HJ+8MwKqktzeOjGSZTnZ33Uy4ucFOfcHGBOj7Yf9Nj+4Uc89n7g/pgFJyIi0of88PLT+OyEASzbdoDNew+z/3A7L63axc9eWgvA7U8u54sTB3LrJSMozQ0mONr0ocmenBKfz7j7qnH/rT036OcL3gU6dxxo5p5X1/P88sj3+Aq95ZoV+VndZ/I+OaaSB97ZzPb9zTy6aCtX3DOf33z5TMYNLIzTkYhIOnLOYbrSnohIUhk3sPCIv/E6Ok+nsbWDdzbs5cF3tvDooq3MW7ObR2dNpro0R1WVe4EKtEjMXDtpMIWhTP66fCdZmb7uyV60opwA/zijlp9cOZZfX3sGOxtauOKe+dzx7Eq27jtMQ3M7nbpYp4icJC3jlFRlZpeY2RozW2dmtx9l/1QzW2JmHWZ2ZSJiFOkt/gwfhaEAl4zpx4M3TuIXV4+n/lAr0//jdT7/X2+xdd/hRIeY8nRmT2Kmf2E2r996Iet2H6I8L4ug/9iXZbj09H68fus0bnnsPX4/fxO/n78JgPwsP3+8/mwmDCo65uNFRLo4h87rScoxswzgHmAmket7LjSz2c65VVHdtgBfBb4b/whFYuuK8QMY1S+fxxZu5Q9vbeL8f3+VP11/NlOHq+L1qdJkT2KqIDuTMwcXn3D/wSU5PP71c3hn415W7zzUfTH3z/76Lf7H5MEMLglRkZ/FZWP76dS+iIikm7OBdc65DQBm9ghwBdA92XPObfL2hRMRoEisDa/I418uG830UeXc9sQybvzTIr49o5YbplTres6nQJM9STo+n3Hu0FLOHVrKDVOq2dvYyjcfWsID72zu7vNPj7/HN6bWMKW2jNMHFJAd+PCX3zmniaBIHxdZxqk8IClnALA1ansbMClBsYgk1LlDS3nwhklc+9sF/HTuGn796jqmDi/jE6dVUlOWQ27QT01ZbqLDTHqa7EnSK8kN8sisyTS2duCAhxds4a4X3ueX89bxy3nrADitfz7XnTuEaSPKmPmzNyjJDXDGoCI+NbYf46sKKcoJJPYgRCSuIgVaRPouM5sFzAIYNEiXN5LUNKQ0h/m3T+eV1XU8tGALr7y/m+dX7Ore/6svTeDT4/onMMLkp8mepAQzIy8rUuDl6xcM5Wvn17B610HW7DrEuxv38cr7u7ntiWXd/Rua29lxoJknFm8DoKY0h/FeBagRlXkMKg4RCmSQE/STmaE6RSIikhS2AwOjtqu8tpPmnLsPuA9g4sSJqnQmKW3GqApmjKqgsbWD5dsa2NPYyp3PreJbD/+dZ9/bwf/65EiG6izfUWmyJynJ5zNO61/Aaf0L+NwZVbR2dHLPq+u7L/T+8i1TKc/PYu6KXWzc08TbG/by1+U7efLvR/6fGfD7GNM/nwuGlzNmQD5VRSGyMn0MKg5pCZhICnOgCi2SihYCtWZWTWSSdzVwTWJDEkkeuUE/5wwtAeDCkeX86LlVPL54Gy+uqmNyTTH3f/UsXZi9B42GpIWgP4ObL6plcHGIjnCYoWW5mBlXTfzwA9Jw2LFq50F2HGhm+4FmOjoda+oOsWTLfn7+8tojnq+mNIdxAwspzQ0wtqqQqcPLCPp9+mKwSKpQNU5JQc65DjO7CZgLZAD3O+dWmtmdwCLn3GwzOwt4CigCPm1mdzjnTktg2CIJkRv0c9fnx/KNC4by4Dub+d38jZzz43lcenolZXlZXDC8jDMHq5K7JnuSNsyMz59Z9ZH7fT5jzIACxgwoOKLdOce2/c1s3nuYvU2trK9v4rU1u/nbB/XsbWrDua7nh5GV+QwozCI/O5OLR1cycUgRRaEAGT79WSkiIh+fc24OMKdH2w+i7i8ksrxTRIh8r+9fLhvN9JHl/GTuGh5+N1Lj6FfzPuD686q59RMj+vSH9ZrsSZ9nZgwsDjGwONTddsvM4QA0t3Xy9oY9fFDXyK6DLayvb2LLvsPsbGjhySWRJaGBDB/+DCMvy8+w8lwKQwEGFGYzul8+k2tKqCzISshxifRlDlXlFRHpS84dVsozw0oBaGrt4MfPr+Z3b27kgbc3U5IbYFxVIbUVke/1Bf0+po0o57T++Wn/f4UmeyLHkB3IYPrICqaPrDiivbmtk5dX17H7UCu7D7UQDjv2NraxYU8TOw8c5KVVdbR1hDGDs4cUM7p/PtNHlnPWkOI+/emSSLzoouoiIn1XTtDPjz5zOheNqmDO8p20tId59f3dvLgqUskz7ODuF9dSU5bDp8f2Z3hFHhMGFVKeF8SfZoX7NNkTOQXZgYxjlvpt7wyztu4QL66s4+XVdTzy7lZ+P38T5XlBZowqZ1xVIRX5WVSX5hAKZJAdyOiuNioiH59T7UERkT5v2ohypo0o/2/texpbeWHFLp5cso1feMX9ulSX5jC2qoDzhpYydmABIyvz4xVuTGiyJxIDmRm+7mqhN88cTnNbJ6+vreeJxdt4btnO7vXk0aaNKGPm6ApO61/AkJIQhSFdG1Dk40jzlTkiInKKSnODfHnyYL48eTCHWtpZsuUAG+ob2d/Uxpq6Q7y1fi/PLN0BwKDiEF+YWEVxTpCA30f/wiwmVZekTL0GTfZE4iA7kMElYyq5ZEwl4bBj+4Fmdja0sHlvE22dYTbWN/H8il28tqYegMwM47xhpdR63wEsDGUyfmAhIyvzUya5iCSSw2FayCkiIseRl5XJBcPLuGB4WXdbOOxYX9/IvPd385cl27j7xSOrtvsMBhRlU5ITZERFHjNHVzB1eBkBf/ItAdVkTyTOfL4PC8KcXV3c3f79T41i454m1tc3MX/dHt7ZsJc3P9hDR/jD9Wi5QT8Di0MUZmdSkhsg4PcR9PvICfipLsthQGE2xTkBcoN+8rIyKc5RpVDpm7SMU0RETpXPZ9RW5FFbkcesqTU0NLfT2hGmpb2ThZv2s3FPI9v2N7OnsZXnV+zk0UVbycr0MXN0JZOqi6kpy2HCwCKyA4mv06DJnkiSMDNqynKpKctl5uhIQRjnHG2dYeoaWlmyZT+LN+9nZ0MLexpbWbXjIK0dYdo6wxz0klBPPoP87EzK84KU52UxpDTEsLJcgpkZZPiMUCCDyvwsAt41BMtygxSGMtO+MpX0DXobi4jIx2VmR3y1ZnBJzhH72zrCzF+3h9nv7eCNtfU8+15k+WdWpo/pI8sZ3S+fwSU5DCnJYXhlLkF/fCeAmuyJJDEzI+jPYFBJiEElIT4zYcBR+4XDjh0NzdQdbGF/UzuNrR00NLezt7GVA83t7GxoYffBFp5ZuoNDLR3HfM1QIMNLSiHK8oIUhQIU5wQYWpZLUU4muUE/oYBfZw0lqenEnoiIxEPA7+PCkeVcOLKczrBj677DrK9v5OmlO1i27QBzlu/q7puV6WNyTQmTa0oY07+AcQMLYl6gT5M9kTTg8xlVRSGqikLH7BcOO/YfbqOtM0xn2NHQ3M6+pjZa28M0t3dSd7CFHQda2LinkbV1h5i/bg8HP2Jy6DMoywtSmZ9FWV6Q0twgZXlBQgE//QuzqMjPYnJNSSwON6W1dYR5fW19osNIe7sPteoMtYiIxFWGzxhSmsOQ0hxmjIqs0mo43M6ugy2s293Iwk37eGNt/RE1GmrL8xhUHGL6yHLGDChgdP/erf6pyZ5IH+LzGSW5we7tqqLjP6Yz7Nh9qIUtew+z/3A7h9s6aGztoP5QK3UHW9h1sJXtB1pYuvUAe5vaur8rNapfPs9/+/wYHUnqamrt4Gt/WpToMPqESVHfiRUREUmEglAmBaFMRlTm8amx/QDY2dDMB3WNPL9iF3UHW1i8ZT8vrNzFZycM4OdfHN+rr6/JnogcU4bP6FeQTb+C7OP2dc5xuK2Tbfub0QrPo8vL8vPct6YkOow+YVDJsc90i4iIJELX31VTvQqgHZ1hNu87TEYMVqRosicivcbMyAn6GVGZl+hQkpY/w8eYAQWJDkNERESShD/Dx9Cy3Jg8d/JdDEJEREREREQ+tphO9szsEjNbY2brzOz2o+wPmtmj3v4FZjYklvGIiIiIiIj0FTGb7JlZBnAP8ElgNPAlMxvdo9sNwH7n3DDg58BPYhWPiIiIiIhIXxLLM3tnA+uccxucc23AI8AVPfpcAfzRu/8EMMNUK1tERERERORji+VkbwCwNWp7m9d21D7OuQ6gAdCFuURERERERD6mlCjQYmazzGyRmS2qr9fFiEVERERERI4nlpO97cDAqO0qr+2ofczMDxQAe3s+kXPuPufcROfcxLKyshiFKyLp5nhForw+XzCzVWa20sz+HNXeaWZLvdvs+EUtIiIi0jtieZ29hUCtmVUTmdRdDVzTo89s4DrgbeBKYJ5zzsUwJhHpI6KKRM0ksox8oZnNds6tiupTC3wPOM85t9/MyqOeotk5Nz6uQYuIiIj0opid2fO+g3cTMBdYDTzmnFtpZnea2eVet98BJWa2DrgFOOon7yIip+BEikR9DbjHObcfwDm3O84xioiIiMRMLM/s4ZybA8zp0faDqPstwFWxjEFE+qyjFYma1KPPcAAzmw9kAD90zr3g7csys0VAB3CXc+7pGMcrIiIi0qtiOtmLhcWLF+8xs80n2L0U2BPLeGJAMcdHqsWcavHCycU8OJaBHIMfqAWmEfle8Rtmdrpz7gAw2Dm33cxqgHlmttw5tz76wWY2C5jlbTaa2ZqTeO1U+5mmWrygmOMl3WNOVH7qNfrbKSkp5thLtXghBrkp5SZ7zrkTrtBiZouccxNjGU9vU8zxkWoxp1q8kBQxn0iRqG3AAudcO7DRzNYSmfwtdM5tB3DObTCz14AJwBGTPefcfcB9pxJcEozPSUm1eEExx4tiTn762yn5KObYS7V4ITYxp8SlF0RETkF3kSgzCxApEtWzqubTRM7qYWalRJZ1bjCzIjMLRrWfB6xCREREJIWk3Jk9EZET4ZzrMLOuIlEZwP1dRaKARc652d6+i81sFdAJ3Oqc22tm5wL3mlmYyIdid0VX8RQRERFJBek+2Tul5VUJppjjI9ViTrV4IQliPoEiUY5IJeBbevR5Czg9xuElfHxOUqrFC4o5XhRzeknFsVHM8ZFqMadavBCDmE2XtRMREREREUk/+s6eiIiIiIhIGkrbyZ6ZXWJma8xsnZklxcXazWygmb1qZqvMbKWZfdtrLzazl8zsA+/fIq/dzOyX3jEsM7MzEhh7hpn93cye87arzWyBF9ujXgEMzCzoba/z9g9JULyFZvaEmb1vZqvN7JxkH2czu9l7X6wws4fNLCvZxtnM7jez3Wa2IqrtpMfVzK7z+n9gZtfFI/ZkkYy5CVI3Pyk3xSVm5aY+IhnzU6rmJi8W5afYx6z8dDzOubS7ESnGsB6oAQLAe8DoJIirH3CGdz8PWAuMBv4duN1rvx34iXf/UuB5wIDJRErEJyr2W4A/A895248BV3v3fwP8g3f/m8BvvPtXA48mKN4/Ajd69wNAYTKPM5ELgG8EsqPG96vJNs7AVOAMYEVU20mNK1AMbPD+LfLuFyXqvR3nn3NS5iYvtpTMT8pNMY9XuSkB75MEvTeTMj+lam7yYlF+im28yk8n8vqJeDPFYVDPAeZGbX8P+F6i4zpKnM8AM4E1QD+vrR+wxrt/L/ClqP7d/eIcZxXwCjAdeM57A+4B/D3Hm0h1w3O8+36vn8U53gLvl996tCftOHsJa6v3S+z3xvkTyTjOwJAeCeukxhX4EnBvVPsR/dL5liq5yYst6fOTclNcYlZuiuN4J/KWKvkpFXKT97rKT7GPWfnpBF47XZdxdv3wu2zz2pKGd+p4ArAAqHDO7fR27QIqvPvJchz/CdwGhL3tEuCAc67jKHF1x+ztb/D6x1M1UA/83ls+8VszyyGJx9lFLuB9N7AF2Elk3BaT3OPc5WTHNeHjnUApcewplJ+Um2JMuSn5fj9jKOmPP4VyEyg/xZzy04mNd7pO9pKameUCfwG+45w7GL3PRabrLiGBHYWZXQbsds4tTnQsJ8FP5HT5fznnJgBNRE6Rd0vCcS4CriCSbPsDOcAlCQ3qFCTbuMrJS5X8pNwUH8pNkixSJTeB8lO8KD+dmHSd7G0HBkZtV3ltCWdmmUSS1UPOuSe95joz6+ft7wfs9tqT4TjOAy43s03AI0SWI/wCKDSzrus0RsfVHbO3vwDYG8+AiXzasc05t8DbfoJIAkvmcb4I2Oicq3fOtQNPEhn7ZB7nLic7rskw3omS1MeeYvlJuSk+lJv6jqQ9/hTLTaD8FC/KTycgXSd7C4FarxpPgMiXMGcnOCbMzIDfAaudcz+L2jUbuM67fx2R9ehd7V/xKvNMBhqiTvnGhXPue865KufcECLjOM85dy3wKnDlR8TcdSxXev3j+imQc24XsNXMRnhNM4BVJPE4E1mCMNnMQt77pCvmpB3nKCc7rnOBi82syPtU7mKvrS9IytwEqZeflJviRrmp70jK/JRquQmUn+JI+elEnMgX+1LxRqSazVoilaW+n+h4vJimEDlNuwxY6t0uJbJe+BXgA+BloNjrb8A93jEsByYmOP5pfFhRqgZ4F1gHPA4EvfYsb3udt78mQbGOBxZ5Y/00kcpFST3OwB3A+8AK4AEgmGzjDDxMZF18O5FPAW84lXEFrvdiXwf8z0S+rxPwc0663OTFlbL5Sbkp5jErN/WRWzLmp1TOTV48yk+xjVn56Tg38x4sIiIiIiIiaSRdl3GKiIiIiIj0aZrsiYiIiIiIpCFN9kRERERERNKQJnsiIiIiIiJpSJM9ERERERGRNKTJnvQaM2v0/h1iZtf08nP/c4/tt3rz+UUkfSk3iUiyUn6SWNNkT2JhCHBSCcvM/MfpckTCcs6de5IxiYgMQblJRJLTEJSfJAY02ZNYuAs438yWmtnNZpZhZj81s4VmtszMvg5gZtPM7G9mNhtY5bU9bWaLzWylmc3y2u4Csr3ne8hr6/okzLznXmFmy83si1HP/ZqZPWFm75vZQ2ZmCRgLEUkeyk0ikqyUnyQmjveJgMipuB34rnPuMgAv8TQ4584ysyAw38xe9PqeAYxxzm30tq93zu0zs2xgoZn9xTl3u5nd5Jwbf5TX+hwwHhgHlHqPecPbNwE4DdgBzAfOA97s/cMVkRSh3CQiyUr5SWJCZ/YkHi4GvmJmS4EFQAlQ6+17NypZAfyjmb0HvAMMjOr3UaYADzvnOp1zdcDrwFlRz73NORcGlhJZIiEi0kW5SUSSlfKT9Aqd2ZN4MOBbzrm5RzSaTQOaemxfBJzjnDtsZq8BWR/jdVuj7nei97uIHEm5SUSSlfKT9Aqd2ZNYOATkRW3PBf7BzDIBzGy4meUc5XEFwH4vWY0EJkfta+96fA9/A77orW0vA6YC7/bKUYhIulFuEpFkpfwkMaHZusTCMqDTW1LwB+AXRJYBLPG+6FsPfOYoj3sB+IaZrQbWEFmO0OU+YJmZLXHOXRvV/hRwDvAe4IDbnHO7vIQnIhJNuUlEkpXyk8SEOecSHYOIiIiIiIj0Mi3jFBERERERSUOa7ImIiIiIiKQhTfZERERERETSkCZ7IiIiIiIiaUiTPRERERERkTSkyZ6IiIiIiEga0mRPREREREQkDWmyJyIiIiIikob+P6eHBF4UjXZtAAAAAElFTkSuQmCC\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Make the plot a little bit bigger than default one.\n", "plt.figure(figsize=(15, 5))\n", "\n", "# Plot precission history.\n", "plt.subplot(1, 3, 1)\n", "plt.xlabel('Iteration')\n", "plt.ylabel('Value')\n", "plt.title('Precission Progress')\n", "plt.plot(precision_history)\n", "\n", "# Plot recall history.\n", "plt.subplot(1, 3, 2)\n", "plt.xlabel('Iteration')\n", "plt.ylabel('Value')\n", "plt.title('Recall Progress')\n", "plt.plot(recall_history)\n", "\n", "# Plot F1 history.\n", "plt.subplot(1, 3, 3)\n", "plt.xlabel('Iteration')\n", "plt.ylabel('Value')\n", "plt.title('F1 Progress')\n", "plt.plot(f1_history)\n", "\n", "# Display all plots.\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Fing Outliers\n", "\n", "Since now we have calculated best `epsilon` we may find outliers." ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "[]" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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bNy4kba2Nm644YaM+/VNBEmTJ0/m97//fdbnj8ViA280BCwRGGPGjueeg899Ds45x/187rlDOtxf/vIXwuEwl1xyCeAmqrnrrru49957+eEPf8hVV13Vs+0HP/hBVq5cyXXXXddzR/LHP/7xXsfbsmULxx57LADxeJxrr72WE044geOOO47//M//BNwdx6eddhqLFi1izpw5tLe384EPfIDjjz+eY489lt/85jeH9Dv1x24oM8aMDc89BzfdBFVVMGUK7N3rXn/jG3Diwc2Iu379et7+9rf3WlZZWcn06dPTflv/1re+xd13383atWszHvsnP/kJVVVVPP/883R1dXHqqafyvve9D4A1a9awbt06Zs6cybJly5g8eTKPPPII4MYuGmpWIjDGjA0/+5lLAtXV4HnuZ1WVWz4CPfbYYyxdupR58+Zx0kknsW/fPjZt2gTAiSeeyMyZboykuXPnsmLFCr761a/y1FNPUVVVlemwB8USgTFmbNi8GSorey+rrHTLD9KcOXNYvXp1r2UtLS1s3bqV6urqXvMXRyKRQR1bVfnBD37A2rVrWbt2LZs3b+4pESQHpgOYNWsWa9asYe7cudx444184xvfOOjfJx1LBMaYsWHmTGhp6b2spcUtP0jvec976OjoYOnSpYCr17/mmmu4+OKLOeKII1i7di2JRIJt27bxXEp7RCgUIhqNZjz2+9//fpYsWdKz3caNG2lvb3/Tdjt27KC0tJRPfOITXHvttaxZs+agf590rI3AGDM2XHSRaxMAVxJoaYHmZrjmmoM+pIjwwAMP8NnPfpZbb72VRCLBOeecw+23305RUREzZ85kzpw5HH300cyfP79nv8svv5zjjjuO+fPnc//99/d77MWLF7Nlyxbmz5+PqjJhwgQefPDBN2330ksvce211+J5HqFQiCVLlhz075P297RhqI0xI9Vgh6Hmuedcm8Dmza4kcNFFB91QPNrYMNTGGAPuol8gF/6hZG0ExhhT4CwRGGNGtNFQfZ1vh/oeWSIwxoxY4XCYffv2WTLIQFXZt28f4XD4oI9hbQTGmBFr6tSp1NfXs2fPnnyHMqKFw2GmTp160PtbIjDGjFihUKjnDluTO1Y1ZIwxBc4SgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhQ4SwTGGFPgLBEYY0yBs0RgjDEFzhKBMcYUOEsExhhT4HKWCERkmoj8VUReFpH1IvJFf3mtiKwQkU3+z5pcxWCMMWZguSwRxIBrVHUOcDLwORGZA1wH/FlVjwL+7L82xhiTJzlLBKraoKpr/OetwCvAFOBc4Gf+Zj8DzstVDMYYYwY2LG0EIjIDeBvwLFCnqg3+qp1AXZp9LheRVSKyysYiN8aY3Ml5IhCRcmAZ8CVVbUldp27aoX6nHlLVH6vqAlVdMGHChFyHaYwxBSuniUBEQrgkcL+q/sFfvEtEJvnrJwG7cxmDMcaYzHLZa0iAnwCvqOqdKauWAxf5zy8CHspVDMYYYwaWy6kqTwU+CbwkImv9ZdcD3wJ+KyKfBt4APprDGIwxxgwgZ4lAVZ8GJM3q9+TqvMYYYwbH7iw2xpgCZ4nAGGMKnCUCY4wpcJYIjDGmwFkiMMaYApex15CIhIEPAqcBk4FOYB3wiKquz314xhhjci1tIhCRW3BJYCVujKDdQBiYBXzLTxLXqOqLwxCnMcaYHMlUInhOVb+eZt2dIjIRmJ6DmIwxxgyjtIlAVR/pu0xEPKBcVVtUdTc2TpAxxox6AzYWi8gvRaRSRMpw7QMvi8i1uQ/NGGPMcMim19Acf/jo84BHgZm4MYSMMcaMAdkkgpA/nPR5wHJVjZJmDgFjTGHasPxxnj37Y7ww9x08e/bH2LD88XyHZAYhm0Hn/hPYArwAPCkihwMtGfcwpoCs3drEsjXb2dbYwbTaUi6YP4V502vyHdaw2bD8cbquv5FgeSWRwyYRbGqk6/ob2QDMXrQw3+GZLKQtEYjIKSIiqvp9VZ2iquf4M4ptBc4cvhCNGbnWbm3izhUbaWzvpq4qTGN7N3eu2MjarU35Dm3Y7F9yD9HySmKVVSAescoqouWV7F9yT75DM1nKVDX0KWC1iPxaRC4WkcPATS+pqrHhCc+YkW3Zmu1UhENUloTwRKgsCVERDrFszfZ8hzZswvVbiVVU9FoWq6ggXL81TxGZwcrUffRKABF5K3A2cJ+IVAF/Bf4b+JuqxoclSmNGqG2NHdRVhXstKw8H2dbYkaeIhl9k6nSCTY2uROALtrYSmWq3GY0WAzYWq+o/VfUuVT0LeDfwNPAR3N3GxhS0abWltEV6F5DbIjGm1ZbmKaLhV33lYkJtLQRbmkETBFuaCbW1UH3l4nyHZrKU1aBzIjJfRL4ALAZ2qurnVXVBbkMzZuS7YP4UWiNRWjqjJFRp6YzSGolywfwp+Q5t2MxetJDi228jVlNLeGcDsZpaim+/zRqKR5EBew2JyE24EsAf/EU/FZHfqeptOY3MmBEu2VuoNRJlZ0uE8uIgx0yu4rLTZmbda2is9DiavWgh2IV/1MqmRPBx4ARV/bo/9tDJ2A1lpsCl9haadVglR02soLw4OKgLufU4MiNFNolgB27U0aRioHC6RBjTj6HoLWQ9jsxIkWkY6h/g7iBuBtaLyAr/9XuB54YnPGNy62CrZoait5D1ODIjRaY2glX+z9XAAynLV+YsGmOG0EAX+WTVTEU41Ktq5ur3zhowGUSiMR55sYHueIJwyGP2xHImVpYQDnl87cF1WSWWabWlNLZ3U1kS6lmW7HE0VtoOzOgg7mbhkW3BggW6atWqgTc0xpd6kS8PB2mLxGiNRHtd5L/24Lo3XYhbOqPUlhVx63nHpj32b5/fyq0Pv0xXLEHQExSIJZS68iLGV4aZUl2a9px9Y7x5+XqaOqJ0xRIUBz1qSkP8n5Om8/CLDRljNyYbIrI6mx6e2QxD/UER+YeINIpIi4i0ioiNNWRGtGzq37c1dlAe7l0ozqZq5p6nN1MeDjGxIoyIEI0r8biys7WbsqLggHX+a7c28bUH13HLH9dT39RJJBYHlEg0zramTv79fzbwxr4OovGEtR2YYZHNoHPfA84HXtLRUHwwhuzq3zNVzST99vmt3PP0ZhqaI3gCdRXFvNHYybiyEAokFIqDAUSU9q44r+5uo6w4yLjy4p5zrt/R3FNdFA557GyOMKWmlJZIjFDQQxWm15awtbGToqDQ3NGNBzy1aS9FQSGWUKKxOCIee1ojXPGuI61kYIZUNolgG7DOkoAZTbK5yF8wfwp3rtgIQHcszsZdbbREopw0s5a1W5vYuKuVf3v0n3gC0VgcRNiyrwMR2NvWTTDg4YkQ8CAWh1BA8Dxh8952AF5uaGF3S4RYQtm+v5O5U6r4x9b9NHdG2dbUSWc0TnVJkFAwwIZdrVSGiwgFhcY2pTkSA5SWTkX8eENB5f+9upfntzRx+LhSjplc1XPjmrUnmEMxYBuBiJwA3Ao8AXQll6vqnbkN7QBrIzCDlU0bwdqtTfzoiddYtaWJlq4YtaUhjp1SRXEwQGskyua9bcQS0N4VI57Av+ArcU2QSEA8oZQWB0gkIJZIMKmqmN2t3T1VOqpKLHEgpqDnvt17/pVdBESECeVF7G2PMrW6hPbuGPvauoj7+yngiSt5iP88GBDGlxcT9FwJIZ5QSoqCjC8voq4yTMATa08YpTYsf5z9S+4hXL+VyNTpVF+5+JDu0B6yNgLgm0AH7l6CipSHMSPWvOk1XP3eWdSWFbGrOUJtWdGbksCdKzYS8DyqSkOMKysChNZIjI27WnmloYXt+yMI6i7enrvwd8fjdMcUT5QE0NEVJ6FKScijobmLRMJ9sYollLi6C3nAcxfwaEJRIK7ukVCXWPa1RwkHPfa1dbOn1SUBTw7M/pRQepIHQHdM2dXSRSQWJxJLEFOlKxanNRLjtT3txBNq7QmjUM+8Dk2Nved1GIZJfrKpGpqsqum7UBgzQs2bXpP2W3FqY3JHd5ySUID27hgvbW9mfHkx5eEgje3d7G3rJhTwiMUTdMeVhP9NXTyPoCYAoSuWIBp3F3xFiCfct/cDZW1xiSSeugQ8EWKqdMcS1FUUsbUp0pMAEn0K6snXyUPEE+oGu/Nfe+K5qqbSIna1RAgFshpGzIwg+5fcQzA5rwP0/Oxcck/Oh+/I5tPyJxF5X06jMGaYpfYYKisOEo0rnd1xEgn1L/xQW1aE4toPOqMJ4v43eg9IJBQRIZHyLb877i7QAb9LafJaHk8o/dXAJlR7qnvau92I7kLfJNI/BTqj8Z7qJc9zpZBgQGjujBbU6KdjRT7ndcimRHAl8C8i0gVE8T+nqlqZ08iMGSL93ZyVbEzujsXp7I6xp7WLWFwpDgndsQTReIJ506qpb2xnw27X+Ju8QMfp/e0+VVwh0OcynrzPIFWy3l8Bz4OO7jgBf1nAExLqkkemhCC47UN+20XQg87uOMGAV1Cjn44V+ZzXIZv5CCpU1VPVElWt9F9bEjCjQurAbqGA8OTGPVxy3/Ns2tXCxl0t/GPbfkSE6pIQ4kE0DqpKTUmAZ7c0smFXO54IVeEAxUGPgAx8zngWF3BSjlNXWYKIW5BMGok+x5Deu/RsqyQTQoKA5/6dv7zwKGsoHoXyOa9DprGGZqjqlgzrBZiiqvW5CMyYwUg3JMOPnniNN/Z10N4do6M7TkVxkLLiIA3NXbR1xQgGhHhCKQp6jCsrprG9m/r9nb2OHQBaIvEBq2uypdDTK0iAyVVhumMJOrozT/jX9/zJQkZClZDncfIRtXaPwSg2e9FCNuDaBJK9hsqv/8qwzOuQqWroOyLiAQ/hxhvag+s59Bbc5PXvAb4OWCIwedV3zKDXdrdx5f1rqAwH2bKvg6pwkG6/H2dLJEZNaZA4gidQURxk5vgy1mzdT0d37E1VOOB6++SKAs9vaTroJBP0oKasuKe3kiWB0S1f8zpkmrP4IyIyBzcfwaXAJFw30leAPwHfVNXIsERpTAapPYD2tkZ4fW87ItDQ3ElAxN2cpUpRyPX5b+6MMam6BFVlT2uEhpYIHV1D941/sLI5b7IKqG91USwB+9q7qSjyeLG+OSfxmbEvY2Oxqr4M3DBMsRhzUFKHk9i8r4NQwHN36LZ3M768iL1t3a7fvv+tORpPMHNcKTubI3RGXbfQkS4c9ECgOOjR3OnmSE4mB1Rp6YoTsC6j5iBl02vImBEtdTiJ9q4YJaGA34tGaO6Moaok/P76oaBHVTjExl1t7GyJUBz06I5nrpvPt4DA+PJi2rtjqPYuGSS7jyYSSmnRgX9nG8baDIZ9hTB5lxyN8+J7n+NrD64b9FSNyQnk39jbTntXjPqmDna1RAClOxYnnnD99UWEeDxBU0c3u1pdrWZ/bQIjTTgUoCsWZ3ZdOd3xRK91CfUbiwPChAo30J1NgWkGK2eJQETuFZHdIrIuZdnNIrJdRNb6j3NydX4zOgzFRWve9Bo+eNwkNu9rR3AlAZcEEq4/Pu6uXxGlO65UlYaYXF1CKOARiSbe1C1zJPDEjU1UEvKIJpRgwKO6tIh5U6sJhwIUB4WQ5xq8PRHeelglx0x2/c9tCkwzWNnMR/DnbJb14z7grH6W36Wq8/zHn7I4jhnDhuqi9dL2FuZPr+Gc46Zw6lvGE/C8nv784aBHMBDo6ZsfjSuC4KG97gAeLkFPBrwfobokRGlRgHjCJbYvLzyKSDTBtHGlHDu5goB4BAJCWVGA8uIg1aWhnpvIDnaeBVO4Mt1HEAZKgfEiUsOB+1kqgQFvW1TVJ0VkxhDEaMawoZi3d+3WJh5d10B7VwwRobasiNqyIna3RIjGFS/kIQKRqLvkt3fFaIm0DenvkS1P6BmqIp1QQIglEhQHAxQFPN4ysYw/vbSTHc2dROMJ3lJXSXVpEZv3ddDc0U1NnwH1shmC25hUmUoEn8HdP/BWYI3/fDXuvoK7D+GcV4nIi37VUdrWKxG5XERWiciqPXv2HMLpzEg2rbbUDZ6WYjAXrbVbm7j5j+t7jpFQpWF/Jw37O3t6A4lAIuGqUIQDA7cNp+SYQql3DKcrFFSHQ4AQDgWIxOI0NHcRCgjjy4p5uaGFrfvckBfRWIJYQjlifFmv/ZNtJi2dURKqtHRGaY1EbdgJk1Y28xF8XlV/cFAHdyWCh5Ojl4pIHbAX979wKzBJVS8d6Dg2H8HYlc28Acntlq3Zzrrt+2nvjlNeHOSYyVXsaY3wSkMrndE4zZ1RovEDdf5xv4dNMCB+9ZBHU0c0L79nkgckcD2B+ktIRQEBEYKeUFEcJBR0k990xxIcN7VS4CbFAAAX9UlEQVSKtkiMbU0dtHXFqAyHOKquvGf+hL7DbFuvIZPtfATZdB9tFpFP9V2oqksHG5Sq7ko+F5H/Ah4e7DHM6JXu4nT1e2f1Wn7ZaTPflATuXLGRWFzZ0RzBE6G5I0pJKMDLDS0ISnVZMW2RKHFxQ0aASwJFQY+AB+XhEAGRvCeCpP6SgCduwLmuWIKK4hBNHe4+iOIiV8WzeW878w+vYcu+dt5x5PheVT/g2luS71umIbiN6SubRHBCyvMwbmiJNcCgE4GITFLVBv/lh4B1mbY3Y0ffYSCSvYOS32IzXbSSDcobdrVSFAhQFPSIxhPsbu2iMhxid2uE7pYuIrEDpQHPv/kqrko0DsdMrmTTruFvFxD8mc38Xp+JDNsGPfftPxTwqCotIhJN0ByJU1IUIhgQ2rpiPVVg1hhshtKAiUBVP5/6WkSqgV8PtJ+I/Ao4A9fYXI8bl+gMEZmHqxragmuHMAUgtXcQ0PMz9VtsOskG5eTNYkDPhXFaTQn1TR0EPO1V/++JUFNWRCzh6sifeW0f0Ximy3BuuNFEB95OgOrSIG2ROKiyu6WLcEhojST8cZKUooBHayTaU0VkjcFmqBzMncXtwMyBNlLVC/tZ/JODOJ8ZAw6ld1CyF0xZcZCuaIKioBCLK+XFQXa1dDGhophgwGNvaxdxv1SgKPvaulGgOCh44rk7jP0pJEeS5J3CydnQKsJBWrvclJhV4RCeuMHyTprpRhcFuHPFRoBe7SqXnTbgv6Ux/RowEYjIHznQ0SEAHA38NpdBmbHnULo0XjB/Cneu2MjE8mJe29tGLJEgkVCm1ZTwckMLbz+8hgkVLsn8+ZVd7G3rIqH0VCF1dsVRSfSaB3gk0ZQnitLeHae0yKMzmkCB02dNeFNj70DtKsYMRjYlgu+mPI8Bb9gcBGawkhdzGPy32NQG5c5orKfX0BETyqkIB3smZAHX6ybouXr28eXFbGvqIKaAKuHiAF5CiUSHv4ook5AnJEhOkamouIlpTnvLeKJx5dbz3jxluDUGm6GUTRvBEyJyGHAi7svLazmPyow52fQOGmj//rZNNkKDSzBdsQRlxQHKikJ0Rt1gcp7n7iPo7I7jeSNvQImAJxR5HiLujmNP3AByRcEAh1UV5Ts8UwCyqRpaDNwE/AVXnfkDEfmGqt6b6+DM2JKLb7F9E0xNWRHjy4o53L/J6pEXd9AaieHPBEligPtm+pPs+58LnkBlSZCiQIB97d14At3xAw3DVu9vhkM2VUPXAm9T1X0AIjIOeAawRGBGhNQEkywhtHRGKQ8HSSgEBYpCAWIJRVXxPCWWSN9ekHqzV/KGtKGcsyDZtRWgMhxCRNzQGKUhd5+DKkdPqrBpJ82wySYR7ANaU163+suMGbRc3/Hat4RQHBSKgyFKi0KEAkI0rnTH41SFg+xrj7K/w/UsQt23/t5dUN2QEJmSQHL0z9ThrAOeO57gjqkpw0qUhDxqy4rwRNjfGWVSVZjSoiC7WiO0dCaoKg3x5YVH8dETpg/Ze2LMQLJJBK8Cz4rIQ7jP87nAiyJyNYCq3pnD+MwYMtBNZUMltYTwtQfX8druNna3ddHeFaOsOMi0mhKOnFjO+h3NhEMee9q6KQp4dEXjPfMTB3AX8FSeQCjgEY0leqqKtGeasAOCnseRE8p4fU8b3XEl4AmVJUGOmlhBY3s3bV0xgp5w6pHjuOJdR7JszXaKgh7TjrShIEx+ZJMIXqN3A/FD/s+KoQ/HjGWHclNZX9mWLJK9lWbXVfTqrZQcgG1SVQnReIKXG1rYsT9l8Du/NJBKBLpjiV5VSm4Ya6UoIMTVDRldGQ7y+p524gqTq0qoKQ1Rv7+ToCfMP7ymJ4Zk1Y9d+E2+ZdNr6JbhCMSMfUMx5DQMrmTRt6ooEo2xfX+ES+97nrLiACVF7pt6OOhR49fR99xv0CcRpLsxOZGAcRUhumOKojS1d1MUDFBb5ur/97R1M7W6hD1tXYQCnvX7NyNONr2GZgH/AsxI3V5V3527sMxYNFTj5CdLFtF4gjVvNNHWFaMo4PGjJ17jR59880CLyW/dv31+K//26D8JhwJUlYaIRBPs2N/JuLIiGtvduP51lWG27OsgFk+AZHcXsgItnTHOmD0BgNVvNFFREkJS6ow6onGm1ZRy36UnDup3NWY4ZDNV5e+AfwA34noQJR/GDMpQjZO/rbGD7licF+ub6YolKCkKkFDl2c2NGae4vOfpzYRDAUqLgnjiUVoUpCIcYl97Nx84bjJvPayS46fV8M63jOfwcWXUlhVREvTc0ND9EP8R9huAf/TJBUSiCapKQsRSMkgoILR0Rm0sIDNiZZMIYqq6RFWfU9XVyUfOIzNjTrKaprasiF3NEWr7zKyVrWm1pWzc1UZR0CMU8Pxv3kLlAFNc7m3tIhzq/ZEPh9wYRalJqqasiFl1FRw9qZK3Tqrg9FkTqCoJpk0I8bj2TCo/rbaUusow3bEE0XgCRemMxgkGPJsYxoxYaROBiNSKSC3wRxH5rIhMSi7zlxszaPOm13Drecdy36Uncut5xx5UPfkF86fQEnGlClXtuegeVVeesb1hfEXxm4aXiEQTjK8oTpukjp1STXEwwEkzx1FbVkzfG5NDAUGEnlFRL5g/hYAnHDmhjKKA0Nrp5j/48sKjrE3AjFiZ2ghW46o/kx/91OogBY7IVVDGZDJveg0nzazllYZWNytZIkHIEzbtauPoSek7sy1+50y+8fDLNHdGUVVEBE/cRTp53P4u1smG6blTKlm5sYtEXPFwN5qFAh7FIY/x5UU9x0g2TocCHqdYl1AzCqRNBKpq97abEeuKdx3JzcvX097tpmwU3KT0O1sirN3a1O+Fd1ZdBZOrS9jhz2dcFBQmV5cwqy598ujb62jm+DKKAx6dsUTPfQkTy4s5cmJ5r33swm9Gk2x6DZ3fz+Jm4CVV3T30IRkzsHnTazisKkxTR5TueILy4iBHT6okFPDS3pewbM12jppYwYxxZWze205bV4yuaCJtb6PUc/UdwmJ6nzmWrf7fjGbZ3FD2aeAU4K/+6zNw1UYz/cHnfp6j2IzJKBJNcPKR4/DkQMV9QjVtO8G2xg5CAeGl7S0UBT1KigJEY4me3kbZfIs/1FFUjRmJskkEQeDo5MTzIlKHm6/4JOBJwBKByYvB3pcwrbaUJzfu6elt5BzobdT3Yp7u7mWr+jFjTTbdR6clk4Bvt7+sEYjmJixjBjbY+xIG09soWQXU2N7d6+7lTPcpGDNaZZMIVorIwyJykYhchBtraKWIlAH7cxueMekN9r6EZG+jgAid0TjFIY+5UyopDgbeVIpIHRfJE6GyJETFAPcpGDNaZVM19DngAuBU//VSYJmqKnBmrgIzJhuDraa54l1H9nQHzTRl5lCNi2TMaJDNoHMK/N5/GDOqZdvYO1TjIhkzGmTTfbSVA+MwFgEhoF1VK3MZmDG5kk0pIjl8NZCx5GDMWDBgG4GqVqhqpX/hL8FVE/0w55EZk0dDNS6SMaNBNm0EPfxqogdF5OvAdbkJyZiRwbqJmkIx2DuLPWABEMlZRMYYY4ZVNiWC/5XyPAZswc1bbIwxZgzIptfQJcMRiDHGmPwYsLFYRKaKyAMistt/LBORqcMRnDHGmNzL5s7inwLLgcn+44/+MmOMMWNANolggqr+VFVj/uM+YEKO4zLGGDNMskkE+0TkEyIS8B+fAPblOjBjjDHDI5tEcCnwUWAn0AB8GLAGZGOMGSMy9hoSkQBwvqouGqZ4jDHGDLOMJQJVjQMXDlMsxhjTY8Pyx3n27I/xwtx38OzZH2PD8sfzHdKYlc0NZX8TkbuB3wDtyYWquiZnURljCtqG5Y/Tdf2NBMsriRw2iWBTI13X38gGYPaihfkOb8zJJhHM839+I2WZAu8e+nCMMQb2L7mHYHklscoqgJ6fnUvuAUsEQy6bO4tt8hljzLAK128lctikXstiFRWE67fmKaKxLZtB54pxQ0/PSN1eVb+Rbh9/v3uBDwK7VfVYf1ktroppBm7Moo+qqk0Ca4zpJTJ1OsGmxp6SAECwtZXI1Ol5jGrsyqb76EO4QeZiuDaC5GMg9wFn9Vl2HfBnVT0K+DM2lLUxph/VVy4m1NZCsKUZNEGwpZlQWwvVVy7Od2hjUjZtBFNVte8FfUCq+qSIzOiz+FzgDP/5z4CVwFcHe2xjzNg2e9FCNuDaBML1W4lMnU759V+xhuIcySYRPCMic1X1pSE4X52qNvjPdwJ16TYUkcuBywGmT7fioDGFZvaihdYwPEzSJgIRWQck/G0uEZHXgS5AcJOVHXcoJ1ZVFRHNsP7HwI8BFixYkHY7Y4wxhyZTiWAKB7qODpVdIjJJVRtEZBKwe4iPb4wxZpAyJYLNqvrGEJ9vOXAR8C3/50NDfHxjsrZh+ePsT6mDrr5ysdVBm4KUKRFMFJGr061U1TszHVhEfoVrGB4vIvXA13EJ4Lci8mngDdxgdsYMO7tz1ZgDMiWCAFCOaxMYNFVNN0bRew7meMYMJbtz1ZgDMiWChoFuGjNmtLI7V405INMNZQdVEjBmNIhMnU6wtbXXMrtz1RSqTInAqnDMmGV3rhpzQNqqIVVtHM5AjBlOdueqMQdkc2exMWOS3blqjJPNoHPGGGPGMEsExhhT4CwRGGNMgbNEYIwxBc4SgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhQ4SwTGGFPgLBEYY0yBs0RgjDEFzhKBMcYUOEsExhhT4CwRGGNMgbNEYIwxBc4SgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhQ4SwTGGFPgLBEYY0yBs0RgjDEFzhKBMcYUOEsExhhT4CwRGGNMgbNEYIwxBc4SgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhQ4SwTGGFPggvk4qYhsAVqBOBBT1QX5iMMYY0yeEoHvTFXdm8fzG2OMwaqGjDGm4OUrESjwmIisFpHL+9tARC4XkVUismrPnj3DHJ4xxhSOfCWCd6rqfOBs4HMicnrfDVT1x6q6QFUXTJgwYfgjNMaYApGXRKCq2/2fu4EHgBPzEYcxxpg8JAIRKRORiuRz4H3AuuGOwxhjjJOPXkN1wAMikjz/L1X1v/MQhzHGGPKQCFT1deD44T6vMcYcrA3LH2f/knsI128lMnU61VcuZvaihfkOa8hY91FjjMlgw/LH6br+RoJNjUQOm0SwqZGu629kw/LH8x3akLFEYIwxGexfcg/R8kpilVUgHrHKKqLllexfck++QxsylgiMMSaDcP1WYhUVvZbFKioI12/NU0RDzxKBMcZkEJk6nWBra69lwdZWIlOn5ymioWeJwBhjMqi+cjGhthaCLc2gCYItzYTaWqi+cnG+Qxsy+Rx0zhhjRrzZixayAehM6TVUfv1XxlSvIUsExhgzgNmLFsIYuvD3ZVVDxhhT4CwRGGNMgbNEYIwxBc4SgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhQ4UdV8xzAgEdkDvJGDQ48H9ubguEPF4jt0Iz1Gi+/QWHyZHa6qA076PioSQa6IyCpVXZDvONKx+A7dSI/R4js0Ft/QsKohY4wpcJYIjDGmwBV6IvhxvgMYgMV36EZ6jBbfobH4hkBBtxEYY4yxEoExxhQ8SwTGGFPgCiIRiMgWEXlJRNaKyKp+1ouIfF9EXhWRF0Vk/jDGNtuPK/loEZEv9dnmDBFpTtnmphzHdK+I7BaRdSnLakVkhYhs8n/WpNn3In+bTSJy0TDG9x0R+af/93tARKrT7Jvxs5DjGG8Wke0pf8dz0ux7lohs8D+P1w1jfL9JiW2LiKxNs2/O30MRmSYifxWRl0VkvYh80V8+Ij6HGeIbUZ/DrKnqmH8AW4DxGdafAzwKCHAy8Gye4gwAO3E3gaQuPwN4eBjjOB2YD6xLWfbvwHX+8+uAb/ezXy3wuv+zxn9eM0zxvQ8I+s+/3V982XwWchzjzcC/ZPEZeA04AigCXgDmDEd8fdbfAdyUr/cQmATM959XABuBOSPlc5ghvhH1Ocz2URAlgiycCyxV5+9AtYhMykMc7wFeU9Vc3EWdNVV9Emjss/hc4Gf+858B5/Wz6/uBFaraqKpNwArgrOGIT1UfU9WY//LvwNShPu9gpHkPs3Ei8Kqqvq6q3cCvce/9kMoUn4gI8FHgV0N93mypaoOqrvGftwKvAFMYIZ/DdPGNtM9htgolESjwmIisFpHL+1k/BdiW8rreXzbcPkb6f75TROQFEXlURI4ZzqB8dara4D/fCdT1s81IeR8vxZXw+jPQZyHXrvKrDe5NU60xEt7D04BdqropzfphfQ9FZAbwNuBZRuDnsE98qUby57CXQpm8/p2qul1EJgIrROSf/jeiEUNEioBFwL/2s3oNrrqoza9XfhA4ajjjS6WqKiIjst+xiNwAxID702ySz8/CEuBW3EXgVlz1y6XDdO7BuJDMpYFhew9FpBxYBnxJVVtcYcUZCZ/DvvGlLB/Jn8M3KYgSgapu93/uBh7AFb9TbQempbye6i8bTmcDa1R1V98Vqtqiqm3+8z8BIREZP8zx7UpWl/k/d/ezTV7fRxG5GPgg8HH1K2L7yuKzkDOquktV46qaAP4rzbnz/R4GgfOB36TbZrjeQxEJ4S6y96vqH/zFI+ZzmCa+Ef857M+YTwQiUiYiFcnnuMacdX02Ww58SpyTgeaU4udwSfstTEQO8+ttEZETcX+3fcMYG7j3KNn74iLgoX62+R/gfSJS41d7vM9flnMichbwFWCRqnak2Sabz0IuY0xtd/pQmnM/DxwlIjP9UuLHcO/9cFkI/FNV6/tbOVzvof95/wnwiqrembJqRHwO08U3Gj6H/cp3a3WuH7jeFy/4j/XADf7yK4Ar/OcC/F9cb42XgAXDHGMZ7sJelbIsNb6r/NhfwDVAvSPH8fwKaACiuPrVTwPjgD8Dm4DHgVp/2wXAPSn7Xgq86j8uGcb4XsXVC6/1Hz/yt50M/CnTZ2EYY/y5//l6EXdBm9Q3Rv/1ObheKK/lKsb+4vOX35f83KVsO+zvIfBOXBXaiyl/03NGyucwQ3wj6nOY7cOGmDDGmAI35quGjDHGZGaJwBhjCpwlAmOMKXCWCIwxpsBZIjDGmAJnicCMeiLSNohtzxCRd+QyngHO/yUR+dQQHOfXIpK3u8vN2GKJwBSaM4C8JAL/rt1LgV8OweGW4G5cMuaQWSIwY5KI/C8ReVZE/iEij4tInT842BXAl/1x4E8TkQkiskxEnvcfp/r73+wPDLdSRF4XkS+kHPtT/sBxL4jIz0WkQkQ2+0MOICKVqa9TvBs3jEjM326liNwlIqtE5BUROUFE/iBuDP3b/G3KROQR/1zrROR/+8d6CljoJxdjDol9iMxY9TRwsqqqiCwGvqKq14jIj4A2Vf0ugIj8ErhLVZ8Wkem4oQiO9o/xVuBM3HjzG0RkCTALuBF3d/deEalV1VYRWQl8ADcg4MeAP6hqtE9MpwKr+yzrVtUF4iY2eQh4O2546NdE5C5cCWaHqn7Aj7cKQFUTIvIqcHw/xzRmUCwRmLFqKvAbf3yfImBzmu0WAnNSRrWs9EeUBHhEVbuALhHZjRvy+N3A71R1L4CqJsf0vwdXVfMgcAlwWT/nmoQbtz5Vchyhl4D16o9xJSKv4wZOewm4Q0S+jZuc6KmUfXfjhi6wRGAOiVUNmbHqB8DdqjoX+AwQTrOdhys5zPMfU9Qf6RXoStkuToYvTqr6N2CGiJwBBFS1v0HEOvuJI3mORJ/zJXAzXW3EzST2EnCb9J6mNOwf05hDYonAjFVVHBh6OHXO2lZcVU/SY8Dnky9EZN4Ax/0L8BERGedvX5uybimuIfinafZ9BXjLgJGnEJHJQIeq/gL4Di4pJM0i36NWmjHBEoEZC0pFpD7lcTVufuDfichqYG/Ktn8EPpRsLAa+ACzwG39fxjUmp6Wq64FvAk+IyAtA6hDJ9+PmyE03qcujuLmCB2Mu8Jy4ieS/DiQbkeuATlXdOcjjGfMmNvqoMUNERD4MnKuqn8ywzQO4hut000Bme64vAy2q+pNDOY4xYI3FxgwJEfkBbpa5cwbY9Dpco/EhJQJgP25+A2MOmZUIjDGmwFkbgTHGFDhLBMYYU+AsERhjTIGzRGCMMQXOEoExxhS4/w/VL6PaBFPhtAAAAABJRU5ErkJggg==\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "# Find indices of data examples with probabilities less than the best epsilon.\n", "outliers_indices = np.where(probabilities < epsilon)[0]\n", "\n", "# Plot original data.\n", "plt.scatter(data[:, 0], data[:, 1], alpha=0.6, label='Dataset')\n", "plt.xlabel('Latency (ms)')\n", "plt.ylabel('Throughput (mb/s)')\n", "plt.title('Server Operational Params')\n", "\n", "# Plot the outliers.\n", "plt.scatter(data[outliers_indices, 0], data[outliers_indices, 1], alpha=0.6, c='red', label='Outliers')\n", "\n", "# Display plots.\n", "plt.legend()\n", "plt.plot()" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "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.7.0" } }, "nbformat": 4, "nbformat_minor": 2 }