{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Denoising Autoencoder: Removing noise from the MNIST dataset" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Imports" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "# importing functions and classes from our framework\n", "from dataset import Dataset\n", "from nn import MLP\n", "from layers import Dense\n", "# other imports\n", "import matplotlib.pyplot as plt" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Theory" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Autoencoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "Autoencoders are a special architecture of neural networks whose sole purpose is to compress the input vector, or in our case the input image, into a lower dimensional representation, which is being referred to as the latent vector. In that regard, it has a similar function as the principal component analysis (PCA) that tries to create a representation of the input in the latent space by identifying eigenvectors of a covariance matrix. It can be shown that when using the identity function as the activation function of the autoencoder, the autoencoder serves as a PCA method. However, autoencoders are more powerful than PCA, since they also work well on datasets with nonlinearities. The figure below shows what the structure of an autoencoder looks like in general.\n", "

" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAV0AAADnCAYAAAC9roUQAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADh0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uMy4yLjEsIGh0dHA6Ly9tYXRwbG90bGliLm9yZy+j8jraAAAgAElEQVR4nOydd5gcxdHGf3VKCAlJgJBIAolgMhgwmGiiCQZjG0T4yEgimJzBNvh02AaTc9SJYHIONtHkZDImmQwiiQwCZRTq++PtYff2dvZ2dmd3T9K8zzMP4namp6enp7q6qt4qc3cyZMiQIUN90NToDmTIkCHDnIRM6GbIkCFDHZEJ3QwZMmSoIzKhmyFDhgx1RCZ0M2TIkKGOyIRuhgwZMtQRmdDNkCFDhjoiE7oZMmTIUEdkQjdDhgwZ6ohM6GbIkCFDHZEJ3QwZMmSoIzKhmyFDhgx1RCZ0M2TIkKGOyIRuhgwZMtQRmdDNkCFDhjqia6M7gFk/YA9gP2AA0B2YAPwHOA34D1nS3wwZMpQJa7GfAIcA2wB9AAfGAdcCF3izf9TA7mENk2cStmcBOwIzgF4FZ8wEJgOfAYfjfkd9O5ghQ4ZZCdZiqwLnAz9FCmW3glOmIgH8GLC/N/s79e2h0Biha7YIevBFkGbbESYBI3E/tab9ypAhwywJa7EtgZuAucs4fSYwHtjMm/2ZmnasCOovdKXhvgAMIpl5YxJwKO6jatKvDBkyzJKwFlsH+DflCdx8jAfW9GZ/I/1exaMRjrTTgIVJbk+eGzgHs0XT71KGDBlmRViLdQVuI7nABZk0b0q3Rx2jvkLXrA+wM9Cj0haQwy1DhgwZALYC5qrw2iZgiLXY6in2p6yb1hO7IntKpegBHIBZoYE8Q4YMcyaOBuap4voewOEp9aUs1Nema/YysFKVrXwPDMX93yn0KEOGDLMorMX6Ax9T+c45wg9AT2/2ahTCslFvTXdgCm00AQum0E6GDBlmbQxEYWBpoBptORHqLXTTMAs0Uf3KliFDhlkfacmBmSm21SHqLXQnpNDGdMQuyZAhw5yNcUCXFNrpTh1lSr2F7iOIfVYxXCvSs+l0J0OGDLMKzGwBM+uZ96cPkT22WrzrzZ5GO2Wh3kL3DKq0wTwKXQwuMLPfWRbFkCHDHIEgbD8DJpjZZDP7ipF8yifcA0ypoukJwMmpdLJM1Ffour8IvFfp5ZNlWhgOXA8cBnxkZqeY2TIp9TBDhgydEO4+GXgOyay5gPkBZyx/Q/H7laIJJcKpGxrBSDscJbJJhB/AP4dvNoZTUdKKDcIB8IiZPWpme5hZJcyUDBkydEKYWVcz28rMbgFWQE4vR2aFmdzJf/mWu1CagKSYCPzVm72SaytG/YWu4muPIMEgOUz9HiasCZ/NFMHiCOBOYLK7H43yOJwJ7AB8bGYXmtnqZlbNCpghQ4YGwcyGmNlfgDHAn4G7gRWRzDLk/BoIjONclmYqL5JM8E5EFOC/p9nvctCYJObuFwJ7I423lNbrwASDV3rA4C/hZuBClA7yCeB5M9sfmOHut7r7VsAqwFg0oC+a2YFmNm8tHydDhgzVw8zmMrOdzOx+5CyfB9jS3X/u7qPcfQxQmOJ1PmayPDfya+AWJHinl7jND0jmnA/s5c31T7PYuHy6AGYDkPA9lFycnKEIhx7Ao8ic8CAutoiZ7QccD2yNDOij0SCPcPe3ck1bE7AxMALYAvhXOPcR9/owTzJkyNAxzGwl5KvZBfgv+k5vc/cpeef0R7vZdYGFyOVbcOBKd98DwFrsp8jfsz0wjZy9dyZKsnUZcI43+9s1fqxYNFbo/tgL60JuMHugmLkXcP+4+Om2HTmN91HgALQFORU43d2nF5w/PzJL7I1e1mjgCncfW5PnyZAhQ0mY2TzATkgpWgQJw8vc/b2C8wwJ0LOB64DjgA2BfyKBOxnYyN3bhJFai/VFMmU+JHC/Bh6rt/22GDqH0K0AZrYRimL4vbvfbGaDgUuQV3O4u/+3yDUGrIle9FCUSL0VuKtQUGfIkCFdhO9vbfT9/Q54CH1/97p7u/h9M1sYuABYGu1k/2NmqyJ/znnIt/MdsKTPSoLM3WfZA1gV+ATYL/y/AXsCXwB/A+YqcW1vYBjwJLIBnwgs1ehnyo7smN0OYAEUtfQ/4E2UGWzBEucbEsxfAicAPcLfNwrf9nbh/5cG1mj08yU9ZllNN4KZLQncC1wJnODubmYLIUP5ckjrfbKDNpZHNqXdgNfQ6nuLKzYwQ4YMCWEyGW6KhOcvgdvRd/W4lxA6ZrYEMAroCwxz95fD34cirXdHd3+oxt2vKWZ5oQtgZgNRSMl/gIM9bFWC7fdcFMnwR3cvmfvBzHqgCqIjgJ+hoOlWL2KqyJAhQ3uY2eLAXuH4Egnaa939uw6u6wIcDPwJMcTO9GDyy3eeuwhWszRmC6ELYKpKcRsymO/q7lPD3+dD9OMNgH3d/b4y24smzzC0pSlr8mTIMKfBzLqTU1bWQMrK6HIFpJmtgJzbU5Ht9u3wdwOakRN8c3d/twbdrztmG6ELivNDZob5gN+5+/d5v20OXIyM90e4+zdlttkFbY+Gk2CblCHD7I5qzXJBWB8LHISiEkZ5LjS0C9qlroVidT9P/wkag8aQI2oEV1zfTshY/3AwO0S/3YuqVkwAXg2mh3LanOHu97j79sBPgJdRlMQbZnZ0/j0yZJjdYWa9zWyYmT0B3I+003XcfSN3vzqBwF0DeB5FE63q7hfnCdweKDxsGWDD2Ungwmym6UYI25I/oxV4M28f+7ceWpVfBQ50988qaD8KfdkWeJASoS8ZMszKCPN9DTTft6eKUMuQG+UE9G0ehkx2nvd7UTPh7ITZStON4EILKvf+mJn9tOD3x4GfAm8BL5vZnknyNIT2n3T3YcBiwD3I9jTGzE4wsyGpPUyGDA2Cmc1vZoeg3d01wPvACu6+jbvfUYHA3TC0tQiwortfUyBwBwIPA28AO82OAhdmU003H3mhJju4+8NFfl8VuBQ5y/Z18bsrvdfK5OiMLyJt4LbZdfJkmP2QR58fDmxJCvR5M+sLnILKpe/v7oX5E4qGflb2BJ0fs6Wmmw93vwnRhW8oZscNHtY1kYPtOTM7KEy8Su71srsfAiyKJureKOvZWWa2YsUPkSFDjWFmi5rZccC7aIf4BDDE3Xd194eqELhbIzMeSEsuJnBXRXT+09y9ZXYWuDAHaLoR8uiDLe5+ccw5yyDt1FDoyhsp3HcJFHa2JyoX3Qpc7+7jq207Q4ZqECqvbI1stWsjWn0r8EK1gs/MFkD5EtYE9o4jNBTS+au55yyDRtLh6n0ASwLvICebxZzThBLofAX8EeiW0r27ou3VrcC3SBNeO64f2ZEdtTpQFM7JqPzNo8AeQK+U2jbg/0LbpwFzlzh3KDLrbdToMannMcdouhGCsf4elHPhR/ZakfMWR3G9AxGV+IUU+7AgsDvSMKYhAXylu3+Z1j0yZMhHiBoYiubcMsAVwKWewm4u7x6Loux/g9E380yJc2crllkSzHFCF9qEpXwF7OYxjq4Q0bAbShl5KTLwp5aPIbS/PvoQtgHuQ9u7+z3L+ZuhSoT5tRqaXzsimnwr8C93n5bifZqQ/+KvKPvXSe7Fq+sWhHPONiyzJJgjhS78yF67CpiXAvZakXMHosm0MlrBH69Bf/qhbdneKD3lpSi/6Idp3yvD7I1QKWVnJGz7obl0ubt/VIN7LYUS1MyNvo1XS5w727LMkmC2j16Ig4u9tiOK1W3DXity7ucuRtqxwPVmdl5Iwpxmf8a5+4XuvhrwW5QO70Uzu9vMhgbKZIYMRWHChmZ2FYqnXR84CuWa/UvaAtdUMPJI4CmUUHydDgRuxDJbltmQZZYEjdd0lYZxX7Qq90cOp0mIIngKcC813Gp3xF4rcv68yEGwKcrje3cN+9YT2A6NzXIohnG0u79eq3tmmLUQ0pjuiSJkpiKt8yp3/7qG91wJ+SEmoMiEkiaCApbZbp5Xhqcm/Wuxn6EE51ugvNkOfI+yDZ7tzY39fhondFUfrRXYDA3KXEXOGo8E8FG4X1nb7tjvUdKNrbyMVI5mtima4I8Bh9Vykof7LU0u9Ow9NHY3uPvEWt43Q+eDmXVFxIURwC+QMGkFnvEaftBBW/0jsD/wB6QAlLxfXtrVp4CD4hzXqfSvxdZHzu/FUdmvLgWnTEP1FF8Dhnmzv1KrvpRCY4Su2CePI9tltzKumAScjfsfa9ut0uy1Iuf3Rs6DHVEu0JtqOenDPbsBv0KMofWAG5HW8Wyt752hsQj202jhHYPe+w1eh5hvM1sr3O9dFFP7SRnXLIGcwzVnmVmLbY8iMnqWcbqjEuzbeHP9E6LXX+gqaPq/wIIksylPBJpxP70m/Qows42R7Wk/d7+lzGvWRhPyTURz/LSGXcy/7yIoxnI4Gp9WtLUsK21lhs6PYGLaFr3jlciZmF6r0/17AX9BjrlDkJDvUGiEfCd3An9x94tq2scW2xSVZi9H4OZjIrCeN9e3SEEjhO5VwA6Up+EWYgqwPO7vp9uptiiHvVbkmh7IPLEvcrhdVi/NM4TsbIC2m1sBdyEB/HAWejZrwsxWQe9zZ+A59D7viAtvrFEfNkEmtCeBQ939qzKvqxvLzFqsG/A5ikJKCkdkqWW8uX6CsL7RC3JCbUdlAhfEdjkgvQ4VRwjW/gVwtJn9uZwMZO4+1d2PR4nO9wfuC9urmsPdZ7r48bsAS6B4zDOBd8zsT0EjztDJYWZ9zWw/M3sORQR8A6zu7pu7+431Erhm1s/MRqGy6Ae58i+UK3C3QwJ3x1oL3IDfIud7JTBgYRTCVjfUO2RsT1SDvlL0APZBWmVN4e7vAOuiUtHnhhjDcq57Cb3E+4BnzOzQcq9NA+7+jbufi1JX7gAMAl4xs3+a2W+DTThDJ0EI9VrfzC4HPkBRMcehZDPNXkXWuwr78xuUoGYaSr94Z4Jr90NxuJt7/YpHHgNUE77ZE0U61A31NS+YvQYsX2Ur3wM74n5PCj3qECEt3W2oyF4sey3m2p+g7Vl3FDj+v9r0ssN+9CJHAV0KORxGe6hFlaH+CF79iAo+E5kPrnT3LxrUnwHAOcDqKNnTIwmubQjLzFpsAPAhUsaqwXSghzfXxxRXb013gRTaaAIGpNBOWXAVotwy3PeuEHNY7rVvARshIfeImR3fCJKDu0909yvcff3Qny7A42b2iJntFnj5GWoMM+tiZr8ys1uQ03V5FI2wvLuf3giBGzTtXYFXkKa9ckKB2wWxNX8LrFsrgWtmK5rZ3mbWP+/PA1BscrWYCZT9XVeLegvdSm0vP2I6dH0FFqnnNrmAvfZQKfZakWtnBu/taiir2LNm9rPa9LSs/rzh7kchs8PZiHr8kZmdb2arNapfszPMbIiZnYDCvEaihEuLufte7v5Eo0L9zGwx5DA+CsWnH5Mkt0gey2w5YIMas8x+gcI5Pzazx8xsdz6pyHlWDDPRbrQuqLd54QNU3qZiTIQZ+8A310BflD7ufUQWeL/g35+lPZnDNqoZVYbYvCP2Wsz1O6OS8FcAzWkm0KkUZjYI2duHI+dNK3CNu49rZL9mZQSB9FtkPlgVuBqZdF5uaMf4MdplX1Sr7Gzg5KQJcMKO71Y0X1JnmYVvZV7kGB6C2GW7ki8c5+cNDmIxlPehGswEenpz8SQ9aaPeQncU+rgr1nhnwtQmWMJkYx2EXkj0Yobk/X9vtF3KF8g/CuVgNqjwMZKx14pcPwBN9p+R0H5WS4SPcRMkKDZHHvRW4NGMeFEeTBVCRqCF+WU0frfWmvpaLoKfoRVFEFXkZ0iLZRbMWoNp/+1G/4bc9zsOjWl3ZFK4hCU5lt34AKUPqAb/82Zfoco2yka9he4KwLMkD2IGYCb4A/DDZrm4xRvjaLCBLTaYeKH8AzECGfigI4dZUvZaTBvbhDb+CRzjJTKd1RvBdrYrEiDdEfnjCk9YOXlOgCn50Y5orAahUKtLk+6EaolAHT4cOBqRHc6rRFgmYZmFey5KvFCdFylGxb7B94Fvo/ZNWfi+DU3PRDH7M9iL21icoVQoU1CqgQO8ubZpBvLRCHLE88i+mRiTYMbDsMdWYpIMRyFdNyIB/Fy52ljYuvSn+EQYgj6cL4kXymPdfWYl7LUifemHEvtsgYLJyw7RqQfCWP0cjfdQ4BE03vd4wmqwsxPCuKyFBO12qMbeaDrhuASixaXIFLCPV0guKmSZhTFYgHihuiiqDBEnVMcmIe+Y2f+Q/RhEbPiY7diAlXidyiMYxgMDvLl+O5FGCN31UdXPRCuTw5T34dOloI/LGXEBEGVYGo4GrxW4uloabFihFyFeKM9HboUej5L2XIvCw9qs0AnuuXG4/j8kYP/UE0Gj2wEJmsXohBpdrRF2ALuR2wG00kl3AKac0RFL8hgqYEmGHeMQ4Ncoyc0jSNOMvoXCHWP+vzvcMZb5DNui8V4NxeQaiiOeCvTmQK6lP78BeiVsfhJwtDf7+dX0MSkalfBmFyRgyhW8U9DLXMskDEejlW64u78ZbJEbohfzK2pMgw18+MHkJt5qaHv5PbkXH6clj4lznoV42hOQ7epQVMCyU9pSTaai4UgAdTrbZZoI82tTNL82Qzz/VuCxTvx+1kHfyRvAAe4+Nua8bmgBjdNW50EVVgag7+px8uZ2Nb6RDvq/CppfO6M0r63Aw4jym88QfZ3tWZEVuBH5IcoVvBOBUd7sh6XW6TLRyNSOW6OtOcQP1AwkcP8D/A73CbrUmhDVdiRwOirdPC38Nj8SWiNCu1HW/A6zIlUDU92ze9CkHInSyxWbxIsj21ScUP4YOdiijE7717rv1SB46X+DPpDVgWuA1s7gpa8WIapjLxRL+zV6J506qiNopn8DtkeZ725GyaXihOpCwKfEmwC2QRE7W3mNa5mFiIj/Q9/uQHLVUz4IvxsyJ26LBO8URJP+n7VYE6K+74NCYeNCwCKlYCRwSj1zLkRobBJzbVd3Rcb9/kjIRuiBmGBn4P5s8cvbFI8clj8pwgv6GXqBOyBh2ArclTQ8plyUw14LC8bCxH8ECwCfoAk/LyoieE3o+/vAV51YuxpMTkh9ivp8XS0chGY0uVdFKY9p17qjrfQIZMu+FoV6pVaYNG2EeTcEhagdhOyoHyGb6mCUbDxOqH5Y7HsI38/xKIvdZjUkPRjyzYwI/b8fzZt/5zv6TPlDLgzP+T16N5e4+/5t2muxJYADUdmrmWhHDBLSMxDr7mJvrk8mwGJofOUIAA38SkgY9UDhIa9Qhm02vLTdUfHI0Sgz2JSCc3qhlX8EKsNeMxpssEFdjWpTlay9FnN9D9pqyWug/A9d0aTpioLs40LhGp7UPLCUfonGexO0ELUCT1a6YJjRE5lwjgSWRprMdBSrfR7Q6k7FieTNbDly5pLXQ39vcfdJlbaZForMicKFugeyrc6FIgseIm9ueNghJrhfFySc1kG1zFK3V4ewyYgG7cTQoIOSMgJp7+cBJyGfyj9Q5FDRXYe12Fxo5zUfEr5fA895c+OdnJ1D6KaAsL0/lw6KRxb5uEYDN6f5cYVJez4SmL+qlqkT2jsUOTLOQGaMYuaLweS0mmJC+aNaafkl+h59XMPDn0YD/yjycS3kRfIQm9GEtoKR7a13kdtMQlvKm4H93ClLyMQsxpe66Nt1Q5HdT6HjdgAyOxXTVpdDAulW4A9eZULzIOCvRDvP36a5SwnzeDNyi/GtlFiMLUHRy1kJs43QjWBm26IV8RZKTMKCbeSayL7cmpbdKmjgI5EjIDF7LabNkpMw3HMgxeOSC+13hUK5Jiy+gr6tg8b7d+RtI0P/3kBEkcty19ANCdJNKI91NAXtAn7hzpcl+lFvs1PErooTqpGdP84E8HFhGFqBkjHC3R9LoZ8Ry+xbYNe0nKLB7DQMmZ46NDsVKBknAmdXSsDojJjthC6AKW/v6cDGwL7ufm8H5y9GLvTsa1KkwZrZ/sCfkMb7UgrttdtuuZdHXwye6kG0/ejz/90bCa1iH35qnurwce8UnmNBpMWtibbI27v7nWYYcBWy8yWhef6Aksms5c6Puxczmw/5D4aj54zIHqk4KQsiWootehAvVMeUu9MqMKe1IoJC1cIxsMzuAp4BDqxWyOU5WKNQr7Jo0IHRdyllFr2cFTFbCt0IZrYZcrQ9ChzuHRSPDCtsRIONQoNGUyUN1sy2R+aG7T0lyq+ZLYocC4OR1vtMCm1GMZlxtsOpxAuOimIyzWx1VJkg8jZPBX4J3hPtVpLGXgJMBk4EO5GUQgnD3IjYVcWE6rwozWDRBQv4ptpdRIHjeHhazr3AMrsXLXJV1TILQnM4WuDKDiUMO88/oiIFZRW9nFUxWwtdKB5CU87LNNVyi2iw3aiSBpsGe61Im4acS2chTeL4Wjl+8lh8caaLithHpuxbxyPTwEwUuz0N/DG0U7HCa8rDxEnQ93OYMQGZZEqSZgpYisWecVEUlRInVMfWagtcKkQyhbYjltlf3f3CCtuIaNDDqYA0Y2ZrIu32PcosejkrY7YXuhHygsVfR8HiZYWM5NE9hyO6Z8U0WFPqxH8BI939kiTXdtBuf5RAZy1k33sorbYT9CFi8cUJ5Tie/a/R4jYNeAk4Gi4fB3s8hbzxFWLyNLjrWBh6ZrTIBsdZnFAdHPoQJ1Q/aATxw8yWQfPWkHb7RoptbwjcgGLBb0p4raGwrYgG/TAJadB5ZKCdkQ23rKKXszzcfY450Ef8V6SR7UVYdBJcPw+aZE+hWNq/AkskbGMpRHo4Pun9y2h7axSfeQnQt9HjXdC3nsjTvhWKozwdmQ++QSFD0TEN7h4FPhncqzueewPF2T4d3vlktOjeiezhR6BA+592wvHqhrbZX4Xxakq5/W3DmGyc8Lr+KJLkNeBtRC9esIL7bxy+g6uA/o0e77q+20Z3oCEPrY/seeQ5H1JhGysiBsyXwAOISTNXmdcuiMrQnwd0SfnZ+gIXBeH760aPdRn9fScI2/HAdxKIH15cvcB1h/c/Qlr0OihyI1XBVcMxWRV4kRAaWIP29w1Kw6plnt+E4q6vRzH0/0DVpxMrDSh+fRSyf2/V6LFuyPttdAca9uAiGRwdNIlDKhV+KDB9RxSU/hUKKl+5jOv6oi3Z9UCPGjzfhkETuRZYoNHjXaKf3yCSw+TQ19/AjDPSEbrf/Q8x/FLdUdRwLOZCwf9fICZY2jshQ7XM3gWWLOP8QeH8McALyK7cr4r7b4MiVS4A+jR6vBv2nhvdgUYfwE9QdMOTqFZVNW0NQTaqj1DozT6lJlf4yG5GMavz1ODZ5kZpIz9DdrOGC5+wSP0EJSf5PQrv8rbHLbeBT6te6D76XRDq45En/XbkdDwY2ZJXBHo1ekzCuKwXxuJGKtiul9F+VMvsxVLtoyiSbVGkx9co6ma1Ku89ADmR30ZlfRo+3o085hhHWilYCuVLCtorm3kTzr0ABexv6TUoTmiqyXYp2tL93t0/SvseefdKyq5aCm1VpyPh+H/g36OFqJJwsYBpU2Hmse49zjLlLI4LhRuMuPz5TrN8J1pNWXzB838SEnQHekqRLQX3iFhmCyCWWbt4azNbFjmLd0dElVaqZGoGZ9vOyH5/BXIgN7w8VaORCd08BJLERcgLP8zdn0+hzajU9nCkybWjwRaw1zbzCpNMd9CP7sjpcTBy4l3iFaS9rIBdVRgF0IZdZWYXoQVvBkR5Um0czByPBHKFmDoTBn4N30V5Nop6/cMiUYrFtyAwlnih/HnhQlouzGwLNN8eBI5w9287uKSSe8SyzPJo0MPRWKdGgzZlaLsQhZANc/fnqm1zdkEmdAsQhMouaHW+nJRW53KyKZnZAShAPBX2Wkw/VkCCfwpi/LRL+pOQXVUoVMck0Y4CRfRtcnXzQiao6a9DlzOpSNudDrz5EKy4H6Kf7hnuMZoSJZ5i+ted9iy+/HHpRXs6dX6+2XZUV1P60TNQhdt93f2+5M9YVt/bsczCPFydHA36CTQud6ah0YdFbB9UEuhs4BQvkzE5pyATujEIiVrORZ7kEe7+aIpt90XRDsORlnUZyhs6xsx2QLa31NhrRe7fDVUUOBQxkd6irZDNZ1cVS5yTuDJGkT4sQY6P3xvog8gRE4G5oecEmPR56E/CQqZTpsDKn8DbL6Fwq69QqNoIFMlwA1rwnk/hOeZBYxcnlKME/NH49UNlj/6FKoSkrt2GfkUss6uBFvROozzT8yBBe7mnSEQws6XRuHanwqKXcwIyodsBzOy3SAjeARxbTHOpsv2fksuQ/xz6GL5HYTn7uvutFbRZLrvq0/Dvmciu/BgSEIlqVyXo11wo2c0IlKjlKvS8WyKHX4SZwEuweDcYM394lm5l3MJhxhTYYAo8cQTKHLYPMqtc7u5uysu6JymXeCqG8B6iGmKroQVgYRQmNz8yY31BfEL7Tys0Aa2CNNy/IfvscLTo1KSiiqVU9HJOQSZ0y0BwxJyKPO77uftdNbhHTySQ9gZWQCFomwF/cvdRRc6P2FXFBOsQymRXBcGwF/B3ZF/8m1dZ16pIX1dGgnZnFHo0Grgtuk8Y3/eQNgYSuk3AA+A7I41tKbSVj6MFj0cpHjcDm45iXM9C9tLRFBRlDNvgjZBA+hUiTLQCj6QskAwJ+ZMRaeWveWOfXy232OLYF+044nInt9OSzWwDFBFzL2IoTiS3sFScb7jE862Cxvdbqih6OUeh0eETbQ7o4tDTO0FoU7EDRSLUnEWDBMzf0bb4BySoTkVxrE/Rll11F23ZVatSQSwl0sBuA/4HrJ3CM/RBWuYzKITuBIoQUcjFbt5C29CxScCaOscNfH3w2wNTbVzeMQn8afBtwbvmtTsojM8pyDxxTBjPgymIyUZa58EorOxdZFdfOIUxGIIIOM8DP63g+rmB5ZGWehCyA9+KiDXfI6LCi2HszkCCdho5QbsGNfqWUOjfX8JcHFar+1Tdz5F0ZyTdGt2P/KPxmq5yxB6MPPyRXc+BV5F2cAudyBAfNMy/IJtsxXzxoAENJF7LWQjF105C2+QmtP2/Fvgn8pqnagIIfRqKCB7XIy07idPJaJsz9wH08d/nBdvNYDM/hwHBmWEAACAASURBVJDb1t0fNrN/IiozKE/DkMKxNWMBVDmiDxIuH7rzQUx/5kca7BtoBzEk9Kcrsjm+XqT/+bl2H0NaXKJcuyEM8EAUJXIKcIanXJY99HU+5IzbHdgC2VLfR9/PIKTdx9nlPyl8JwnuvTYalzcpUfSyEbAWM0QxPgrtZCJ/wA/Ijn4a8EwjaqNFaGRhykHIyL8G8YXkxqMJdDxwLg1fIXIws7XQxHsHxb62m3ghXKdUgpWJxH8UH3lYbILj7W60ve6FnDOtwFVeg1LtQVidiQL293H3+zs4P786hJELi2tXMSMvdvMMZLduRlr7yUjgnowci0e4+5kpPEsvRDiYiQTpFGA/pHmfibzrxWqE9SZXVWIJFMlyqXdQ4snMlkfvZjpaTFKvQhFMUduFvi2PHKGLoTwK74RzulA6XnoBtAOJm39ft1/wrDfKN7IDCTL21QvWYlugse9LcVPUTDTXPgF292Z/ur49FBpVgn0FlK2rH2LKdIRJ6APdv5MJ3t4osH03pH2Ope0En4v4ST3GE5RWsVzttb4onG0XJKTuRRPtgRpovlsiO+/9SAiOy/stvw7apuTqoD0R9yEWxG4Od/dnQyTFKFSAc2t3/zqk+nvFUwqkD/cYjXYMv3b3b5LEZFuuxNPuyPwSEQcm553TDZkwDkHU2Ytr8D5WReO9EzLbXIbo3muTsJZZmE+LEy+Uu9F2vnZHgv5pFH5WM4JNJbAWG4F2Tj3LvGQSsKM3+79q16viqL/Qlff4v8iOFucUKYaJwFm4H1eTfhVBcLYsRHw40AC0an6O7LDfoxf/FJqsX6apCRSy15D9bme0de5Lrtx8ah9E0NZPQrHFB6B3t1c4PidXeiW2qkRB7Oa5wN/d/QczmxuFbxkqMlizopqhD6egcdvc3T9OGpMdYna3QYJvDUKlYLRTuxTNhf3c/cMU+92PXFny/uE+l6Gx/weag0VZZincdwiiSh+INOrXUbjZYNqy+N6j/S6tbgUgrcV+g95FuQI3wiTgl97sT6bfq3g0QujeiD7ghLGXgLYGq5BiFV9TaZ84obo4clbEhfT8yK4KnuhDqHFdpyAoWtCHuJm7vx/+thrSxnZCQr8V+JenYA8PNNJjwtEVUUrPc/f/lnHt0kiTnQtpt6+Fv8+HdgfvoG14XQpmmtlRSIhsEdl0K4nJDpry3mibPTdyrh7m6ZR4MmB9JGi3QZEs0W5mRogNvhVlZdvFa5Tn18x+h5y0bYpeJmTxFft2vqjQDzJP4e7QWqwHcub1qeARIfId1NHGW1+hq2TbH1F5cuofgEtwP6j8W7ZhVxXbSjURL1THeELuuckx2IpW3ZpVMI1jrwXtcSj6YH+CBGQsDbaDe6xArvTKq4gmuiLaZh+JbMpxpoSuKO/qMcgOeK7nmHeLIrPIXcAxaW/DO4KZ7YFsx79xz9n1ksRkh9CsUSh64GY05lGJp1bgsaSCxVRscg805tPI2e2/zDtnALLvP4ucWLVY2AeiRWgVKih6WQaLb25ytfjaFUgtNu5hlzceuAmZN74HsBbbBZms5kn6nAETgK29uTZEpGKot9D9A3KKJd0G5GMiMIAgDK1t7apiQnU+2tauKnzRVdeuKoRVUTwy4X1KstdMVQeGoQ/5bfQR31RqGx/s1DuG/i9OrvTKu3nnrI621Z8iAseHBW1EsZvjkCPuvbzflkMxtOe6+2mVPHcaMLOtkElhd3e/O+/v/ZCHezOKxGQHc8vJKEvZAe5+e95vCyD7/gjkq4gcirG21rA4bR6u2RCFf7UCTxVxZA1BWu/VQEsN5q2F/p8a+p5K0csi9+mIxTeZ9t/qhNAnJyRGcvcHrMVeQYpApXDgTm/2X1fRRiLUW+i+gRwmFWMKTD0MHrpI29whaEXNr11VKFRrVruqIwSN7iIkvFIpHlnkHpsge1Ysey04ebZGGlQ7Gmz42H4efh+KUl22AnfH2eZCm0chJlIz0jYievF+wLFIWHveNT9H6RWPdvd/VPnoVcNUwulW5CS8quC3TZAm+wQyG3xlZr9C7/Ne4Kg4U0IYz7XIlbJ5CI3nvXnmqHwa9Efh9+vjnKuWxzJz9wuqevDi7S+Onm1BUix6WUE/8ll8+UJ5NVR8oOnHk/txN4eyMYoZrgYzgB7eXB85UW+h+yVyBlSMqTDtUrh2fwmaNuyqzogwiXZC4UlXAX9OarIo4x6rI/tosxdhrxWcuyg5GuwEFG60PBKYraj4Zln140J7yyENZG6UQ+FVVHNrbMF5WyLHzx6F2mMjEUwodwNnufsZBb9FMdk7o53CwkhzfyBB+33IFW1cFJkFBiDTz1XI9FPSBBVMGTdSQS2zMvrXhPIaj0RhfKkVvUwTZjYSLehT0C7iWVbln/yG46jcnhvhB2BBb65NHoxCNHV8Sue6XxeYuaLsQU+7+5udWeACuHAtsBKKhHjZzDZK+R7Po5y0x5rZcUHQx2EsCvt5hpwGMSj87WnkFU+CD5EgiaI5IsbcjzCzXZGZYpvOJHABgmNvPWBvMzu5YOwmoTHpiuq7vR6OJO1/T25se6HxXgmx355GjsRYmNm2SODuVAOBuwwK3dwZWN/dT+qMAjdgASQ/uiHW4G0sySsptT2Tyhz7FaHeQrfqZDFTocso2Sg/MLNxZvaimd1sZqeZ2QFm9iszWzbEIXYauPuX7r4Lci79w8wuNpEe0mr/bSQ8hgLnBA3mR5jZIDM7Hk3YU5AJYZC7R1Eaz6Bwt7fN7I9mtnBH9zSzTYFXUM6EJVASm42Bp02JfDCzw1E0x8bu/p9UHjZlBJv0emjhutTMuobnvw3F3G6N4nmfB14ysxEdLGyYWR8z28fMnkFmge9QBYbF0eJ0CdJ+Pzazs81spSJt7INs9lu4+4NpPa+ZdTOzY4HHEfNw/UocrbVEeAdDzGwTMxuBfDPTUbzwCsDpPMhppCMseyD/Q11Qb/PCeShes5yMUUUxE36YDIN6y447H+1tP9H/14wGWS2CsD0Zcer3d/d/ptz27UhjHU6ugsVaqGRKa5y9LgiSNcL52xNDgzWF2Z2GSBH7FTiiDC2KpyAtbl4U2tapgumLwXLstUXQruRC4ETPSwBkSt4TZYLbu8BJGNGgh6M8GA+Ec++Nm2vBORbZdj8J51+Hwg/3RDHFJbXhhM+4arjHF8gPUJRCXWuEsYpo8MUc4AujORx9u98jX0E3YCpwEstzEjvwIbJDV4MXvdlXq7KNslFvofsTFFxfUfTCTPB7YdKv9BKicJqimZOsLQ2ymFCOwtfKpkGmjWBmGIW0zEPyQ4OqbHdlFFqzONr6X4KiFpIkFy9Kg0We4vOQFviHmPCershe+UtUZ2svd3+iikeqC8xsSTSvVkJzYxMvkvIxPN+hyFn4N+RfiHLVNoU2itKgS9y7C7kohq2QvX0PlFy86nkYdn7Hh/aPDv2r9fyOaPDFhOpgZL6Jc4B/mB/xE5SJcSjaYDqy605nV65lKbZHPoVKMB4Y4c1+Q4XXJ0YjyBFPItpiJZg4HTbvptVuOArbuQdN8geTxHtaWxpkMaHclfjUiO+XCrtKAlNcbQsK1TkcuLbCwPFe5OJzl0ZOq8UQU+5XXkXtNVM+gYOQNjYTMbhO9CLsrfA816OPYnuUiOVctAj80d0nVNqPWiEIvENQ3PNJyMxyEur7Fu7+ccw1uyONfl5yyVRiadBl9KMHem+LoAiJXZFnvRW4stJF2czWRdrtK8BBpULYErbbndJU4p7EC9X34yI1StzvJWTCAs3Dt9mVjVmKd6k89v87YIA31y+pViOE7hqo9HjSlWlyuG6rKP9C2ObujARNPwJFsthHkrybbYoZFk6mwcTTIN+ngmKGpnEZTYLikWGLll965Un0gd7p7tPC7y0oemJzryDXaUHs5hVop7I7eTRYd38xnBuxzN5FYUfT8v5+Osr6tI/XqDxNJTCzFdG4T0ZEgHfyfivGXlscLT7D0Pb3UmRnPI4qYrKtCMssjP166P3+BqWJbAXuL8c0Fto8EYWtJS56aTkafJxiEtHg476DiphnBX3oi77x4chk2A/tJt5BqT/HW4v9GWnvSUs7TQL292a/opo+JkWjEt4k5UpPBl4DfkEMN97MViOXDOQ/5GiwqXtjw2RckHihXFjMsHAyFi1mGDSHY5FWGVs8MgixXdBE7EMu50LRxcbEXvsDsJUnqL1morpejD684Z6XFCYInz2R8PkKabK7I42vKMvMzDZDpo6HUGxs6tUaykUY6z8gofonZOsu1ueIvXY2Ii/8DLgGLTb/zTsvPyZ7mLs/m6AvHbLMLFfiaQTy5F+GFIyiNlkz2xy9u5JFL4PiEidUF0OLQCnlIvUcC0UWm4gG/RD6rn4AVo12byGd42ikeJQreCcBp3qzj0y182WgkakdN0QrexfiKXzTkP3mTmA3yggPs/Y02H+gD+TNFHpdFsIHvRjxQjmfBllsMg+ioHhkEPQbkLP53U2YiOWYVSzHXhvqHeQWyIvdbEGxm6fGLV5hm70XEkpNyBEVS4MNtuIT0Ts6yN1v7qjvacOUxWw0ege/L7FYRTToYeidnYGYYHELf+KYbMuxzK5BCXc6/CCtbYmnZ9F43+FKIjRf6OcGqMryo5RmfzVROhNeqjHlHTzXQHI06OkUp0Gvi4R9WxakBO9IpPE68QrdJMCAw7zZL077GcpBY5OYy4a1HeLnL41WMNCgdEXOm3OoUGBaWxrsW+SqwdZtIsX0ax7iHQz5NMiuwLLkamqNR9rUP+IciB3cN2Kv7ePut8Wcswya7F0okui7yPk/sszQQlAWDTbPzvgq2vp+FsKmftKRIDajK1qoJ7pT9lY+LMgnIFvpYSg7WiHVtjfSmEYgYXU52kkMQErC4e5+dQf3WQAtQmsSErTHnLcKUihO9ApYZpbLq7s/iiMegxSND5HTaXEU4fMR8flFUqfBJ4HlaNDDkfkplgZdVnstNhBFSB2CQsGiXUNXNCanAld4c/WJiSqGd4LyFe6Ow2CHtR02dPipw9xptY0cb79DW99vUCjQ6oRFpzMdaMFZBFFsn0fa7sRwfIzCZT5EQe2XIwrubmg7tgjQ1EH7q6Mt2ogiY3QsMhUcREFJm5i2tkChR1sVeYZ1yOVfuBVp510LzpsLef+/QEJuTHjeRdvfy/uBHwr+EfhM8KngM8C/BT8ZfLEO+roRWryuBhYo0t+fo0iSb9Eisk2R/q4Qxv6wMt/lr5HAuxjoW/DbBsgmvH0Z86E/EuA7hnd0MbLvvhPmw9gwr6O58jYq97RMOe+xQfN8CGL7fYwINSOAeVJrfyRdGMmKjOQXjGQ9RrIcIzvH997wDjTgZS+KnB7vI6fQgcC8je5X6NvSyGv+KeL874WotYY0gS/DRF0GkRCGowxe1yA79mdIS34DaZ0XBOG9HWJCzZt3n/eQLdNQSsMX0DZ3cJl93SUIjZL11JDNeW/Evvo49H9IwTk/Dc82HZmUbs/95t3Azw210SaAZm3BMSX8fif4fAVt9w1C6iOUwDz/t/4o9OuVIMD+QAe10ZDZ6HVk5+3wIw73vyj//kgB+AIRRkB2yBWDkD4YmSduR6y18UGgPo/s5qcizXaLMA/2Dm39FS1iXdGCcTtaQC5BArvhAif0byeUFP/L8JwrNrpfdR+HRneggROgCRWavBZpY1chbaikpliDfvRE292Hw8dzOrB8zLkRS+o1YK2Yc3ohjWxrcsUMbwNeIlfM8AW0rf0S5RMdFwTOXGX2+TCk8RXtZ4nrVkIVer8KH95O4UP8LW2LUk4FNgCfC/wR8IkxwraY8P0AfJFwv0jTvIigaYb3vikiIETvfcMk7z0I66eQM6trGed3RU6wT9BiNwGFOj6FFq78IqPnU0aRUWT6uI8SRS/DfPkDWlBeQVvu+RvwrUXv/Uukoe8I9Kh3PzrL0fAOdIYD2UsPIYHGk8I9V0WOra/DBzgU6F7GdYZsjp8iTaFXgntaeNY1UHTEl+GD/yI895QgGB5HeXhPQBEKGyANrwvS8P6HKMSVPnuk8fybXIa4SODOAGZC09fgd4Rqv+UI3OiYBtPeg/43hGfaKNxz0fDMqexw0OJ2FwqRmxuxq9ZGzq0/EWLHw/2mosVtTPj3xCBc1w2CMYnA74K04a8ISeXLuKYJLSxXoYXmWrTw1EzBQDb3/B1O0WrQc+LR+GrAnQgxNNhWRIOtOjQmL+Ywv/TK5V4BFdNUPPIs9OHu7WVmviqMHkAa7zXoIxmKzAH5jr38fy+InJ1PIcdkodc7MYsvEC9eJFeY9AfgELh8PtjjD8i8khBTHO54GnbcHAmX4UggXo/e5wsV9DNyfuaPx5Jo/OdBW/loLNqFVqEdzHrILLAYZURPFOnDcqH/M6iw6GUIEYvYc31DPy4vtw8dtG1onKNq0A/SAQ16TkQmdGMQ58X2hDz4agPcy2g/yvF6H3CklygXkxe7+TDywn8T/h7VXludIuy1PJZZN7QLiItR7krpKhztWHxmdjKKfJhMLtRnGvgzaNwqxKSp0G8cTHuLXPL22KiVvDC/uNCqfHZV/jOOQUJ9Y4qw1/JYZgNRpYrv8u4XxWQfB4zymNA/U+7io5H9OZWil2FeRrHtO1JFbLu1T96emAY9R6HRqvascKB8s6ejbfhDSFPo2cE1A9GH8ibajh9Ogdc8xf71QULzE1SksPD3+dCiMQYx04q1YWgL+BZ528Bw7eNIcHTroB/zog95O1TO53zk0HsDCdXP0cd9DYpaGIG2ulFp7JeAteDV5YJjLIlZoeCYPBUePTivb01oK78uEhB/RjbZR5B9eioSpg+gKIY/IjvsWihcrKQjCjksPwCWzfvbPMh2fTMx9nJkf38qzKulivy+OjKH3AWUjNCoYv7MjYgtjyJn7MkodK/UNVGuiBuRyeJytEg23GHX2Y+Gd2BWOlDc3/bIBvs1ssn+NO/3rig06ha03RyNQqfqMhGBXwSheQMwMPxtOxRSdA5lhOQgW+fHiOO+KIqjPY0q7X9B6C0SPsxI6F0ePvJ8J9oM+NcVwSlWhdB1h2feC8IqEvqfBaF/NfL2RxrqYMqwjZbxjHuGe/w8COrn0M6iZNhWEGCHITvtkWEe9URhX58jR2u95tAyKJ/EZ0EI705e+CaK/R0ZFpjnUOavvvXo2+xyZOaFClHAwR+H7HY/RQIrKr1Sdf7gCvrVE8XuDkea7TyI5FB2lq/AXrsQ2VfPcPdTa9DV6F4fIAbeZEQ5vR8+nwADfl996598AIseSB3ZVWa2NcpRMRktuiO9zI/MVMJnFNLIeyIn1EFeRbKiSmG5Ek8jkJ32GbSjWoYiNOgM5aPeScxnJ3yONKi30Oq/NBJwr4e/J8qglCKmhPt3QcJsDFoQkuADZG7ohQLta4me5DL3vwo8Af2mlr6kXMw9FY3FO/UQuAEfIUdXH+CtcgVuwFeovwORqeYNtBDVHS677puhDzMR020p9HxvoDmSoQJkQjchzGwlMzsLTb7hSKsd6O7RpHwFbSnfMLOjAp+8Xn0bjFICHoy2zYNQBMbzZra/FVSTiGljC8Tc2w3FLV9gytyfRv/MzPqb2RpmtoOZHYMWpy4oeuGXwEVw52KIKFEl/jc/cjCON7MPzOxhM7vMzP5sZrua2bpmtnA541IOTLXM/o1MNGsDfzezw8q8dks0d3og593yaOf0gpmtlUb/yuxHbzMbZmZPIHv0VBQTvgRyoB4JrA+8b2ZXmtmGwSmXoVw02r4xKxy0jzn8C7BEifMjGuylyLZ7C/ArakTJRELrIKQpHUuBwwvx8p9ENrplSrQTsczWyftbG/ZaGX2Zm7bkjDMpTs64GdmK70Ga1BRke14bfLUEhIiYY+pk+PrA0KeocnTE4vsb7Vl8+eSEI+mAnFDkuSOW2SZ5f4vYa3+PGzsUN/2PMMabFPyWH5N9BglishPOH0OstUsoQYMu0u8otv3tMO8WavS3OiscDe9AZz3yBOfoagQnbWmwH5FykHgQqE8gjbaUQM0Pqj+28IMixzJboci1CwWheQ4KG+tIgOXTkI+kgIZc0Pb55Fho09DW/Fvw16qMXpgOvcqiwdKWxRfRcKOFYnx4/3E03LnC+x0LrF6k7Yi9dmn+mCcRqEHAXVlMMFc5d6omBZHLW5EvsH9dSmDP6UfmSCtAkZjD2ExZFbS9MhJUuyBCQCtwm+fV4ErQVhS7eRiKBLjIy0vxOASZP+YPfXkJ5Xv4DQoB+gh53gvjVJdCH1d3Sieu/rScfuT1ZzGU9DwqMDgd+At8+Sn0P5PkiamR7H7xYfj5ruRSBU5E7zK2xFNM/yIWX1xGuCHh1BeRVls4LmORYL4pPNuOKBH3BWgXMdzdnyqzL2XHZJdoo4ncgrklMiW1Ao8meW8xbefHti9OLrb93Wrane3QaKnfGQ7axxxegexWNQnToX3ij7NIkPgDaY3/Rdrk4hXcfx4UkD8OCdBP0Tb/VSScvkJ5Wm9AW+N9UYHLFZAG+G+qzAiF7JURDforpO3ORPlOHXp8D/5flE0siZY7E6aNg8EvhfFdAvkuNkKhYhENdhOqCIMLbZ4b3sPPEFV6L7STuRLFNo9FZpO3kaB8Kzzr90gzXCjpHCMXk/0xIluUe11dEz3RNrb9QcTELCu3x+x+NLwDDX142dyaaWDMYRAKfyWX4m7vOIFG29jN3eI+WKSNLoUcU/uEa65HYT9fBsH2v/DvieHDOAZYBejTQX+7BIHxLDAg4bP2DWP8HDJljEQa0QG0jdWdBuwO3h/8vQQxuzPAvwNfBWnORwUhdyjBLITIHgciDf+9IIjapZLs4Dl6oIQ5D3c0X8I7WzYI5DdRspsJaEs/Lgjgl1D6yzOQHXzrILRi05uSi8m+nhCTXeScKKXpnTQopSltY9u/QgvVKvX8xjrb0fAO1P2BJZCG0pbgsGon6FdErLiNHLFi7egDQZr3m0j7XJAcu2pXcuyqh9ECMhVpNBH3/U9I01g7XBuxzK4MH2Y+gaJ3GX0tyl4rce76aPcwDu0mtiDPNo5CpD5Hmu5MtDiE5/Z+4A8Hx9q0eO3Wx4O/C750wf2XRqyzp8izV4d+/Qxt179B2+zf0THrbh6k6ceyzArO74KEfj7x4WgUyrcsORbfULRIXIB2MG8iLbkUoaM3Yo+1IVCg8K6TiSE4NHCOL44W2g/Ror0vcyCxouEd+PGAJod5HRb0GmxDyG13PqdMKm/DXooE45+DAP04CNAJyJnzOjlK7VNoqxxRajdBmnOs4CCGZUZbqvBmZfbzR/Zakd8KadBHUKAZB8G3W3iWM8kl4l6pfXu+MvhlKOvY9+DjglY7Bfwe8I3B4zT/JqRhf4kyjXUv+L0Xsv0+RgkaLAlYZuH8iOL7MAUUX/LYayWuz2fx7Y52ZZejReQjctTlZ8LYfYpMGZEyEetYbfD8rguFmJF0YyQDGEl/RnYex17jHWkqKHk42oKAvNfd0Wp4MnA1FZbtDob97ZFAGkKFSWtqASuvBPxXyO43GdmBn0PhRdd5wvLV4Z7LIg3/fI9hmeUlxXmIMopHmtmOaMs4FEVRbI7Ge2NypVf+4wUTLTjQLkIa+3B3f97Mfgn8zN1Pir8fvdG49UGmkU/cKcsxZmaDwj0HhXu2Kx4Zxigq8fRm6P9NaBG5F5kVmgufp6CNspLZBPbaZcBu7n5POc9QcH0P5AwbgWzWU9C4jEVacA9ytfgKHZ7vVzKH0oapKOduSINvIue4rihZjrVYlMT9GLSTico5dUNz+lTgfm+uzmlYDRpZmHJptEVbEk2OLkXOmohexMnACZTR2YL0jEPRNjq19IzlImTuWph4odofaSvFPohvkUa2Hqpndr+pJHxUDTZKC3mZFxToK9GfqJbZMe6lS05b29LdHRaPNLNdkaCejCIRYmnQwXu+Hyp6eRZwitegYnOJvhoytZyBTB4jvQhbLQjOiAa7Lpqf57n7sR20vwYSHB8C+3kHKRPNbB3KrL2Wd8285FKE9iMvPWNI/zgaRUocgsw1cVEXE4mPQvnQKyglXyli0kK2Avd5Xja+QAD6utiCYS22PZqHUQ29Qjg5m/qu3uwPpvsU5aFRJdhXR4Pam/JYcROBO4BdiU9/Nx+ya41AAfqjgSvcfWwqfW5/P0Nb8jihOght+YpN6PeAT7wgtWNocyiyrV4P/MmLp0NcFWkG/4e2lqMJ1WBj+roF0pCHufu/Ejzjemji/1g8Mu+3HqjiwwhEIvg3Mm/80d1bY9r7SWivK2UUvawlgoZ1NtKG9vb44pG/QBr7Ayhk7lv0DNd4XlnzkP6yBWltRYtelujLCmgHcrq7nxVzjpGrBr11OL8VeLBQiw4L/gHIRHVqaHd6kfYGEh8KtzAyfxTO2+jfnxXT3tOAmfVBoXUjQj8uQ0rGB2hRHwes63lVma3FDkekpbnLvM1kYJg3+3Updr0s1F/oKk70BbRCJ4HiLN0PyTVlUSjQCHIxh6OBR9KYEOFDGkx8jtWZxAvVDzymVHfMvRZGRIFlkED6TxnXRNVgRyCSxJUoEcnreefsgrS637n7k+X2J+/6udDHOwLZaJ8L/94Fed2jWOMppt3LveFvJ0VCx1Tx9QjkKGoBLihccBoFM9sGOa/+hXYB3+X99lsUqfF/7v5AmG+boAVvC1Q1YnQ4fRRyDh3ieSXDE/RjMTR2twN/yBu7hZD9dxiy4Y6izFjjEJN9CVIOhrn7Swn60w0pDnFCuQ8500U7oewVxBDH9COKbd85tL8K0lgfB7Z09+nWYrug5yxX4EaYDPzam8srAJAWGiF0/4kEZDFzQkeYDKxhWun2RC/je/SRX52veZTXFeuKHEtxQrUfWl2LJuZOer+YPhj6oE5C9sa/eWVkiaVDO3uG/rUCCyBn15bu/loVfZwHed6PJBcydpa7v1fk3IWQFvYI8tqvjATT18hUMqbSftQKpooep6J5egvEpwAAIABJREFUuZ+73xnyTZyAikk+X+Sa/uQWonlQdMEf3P3TKvrRHwn/11EUyzAUGnYTep/PlKs957VpaE6cjN7bX919SqV9zGu3N1JIin03Q5B5Iy6h/QdJ+xAW/0eQ6dBC+/dwJDvSmy+oiEQDyP49qJ423voKXX2Q7yMbbmLMhBl3wNjfySzRYemVMOEWIF6oLoJiVOMmRyJ2VVKYUvldgoT7MHd/OYU2uyG68mnoOa9D2+hnk3ywYezWQoJlW+SBvwwVGTwMaaznxziI+iFz0Pxo/I9Gpp4Ge21Lw8w2RprkePROfunuRbOsBSfYhShfw/XI1DMUhWi1Ancn9SGY2VIojOogFEv9R6TVVuRILmh7IbSTWg7tpBLvehLcK2LxxX13g5CTOO67G1vE9DY32u3OIOdY7sq2XMTK7EpFZZ0AvevtvNn/XeH1iVFvoTsSeRXnqrSJ6fDDObDY4cG7abnaVcVe7mByYTXFXu6HlWiV1SLY3CLP9snAmWk5+YL2fgkKkRuO6L0RDbYVfcSxEQl5NOjhyOMblV7Jt+cuG/5uqFbX6wVtRMl++qAQpq07g6e8IwTzwfnIZAPKw3B9/mIRxudslM9hb3d/KO+3eRANdjhl0mCDiWjbcM2KyER0BVqoBiNNu+odVd79tkPRJjch+3vVAr2CPnRBCk+cUJ4POZnzv9uJyExmKErjCHpzJUfyXxSXXCkceMCb/ZdVtJEI9Ra6b6Fg9YoxBaYeBM+2SlsegrYV71NcqL5fzIPeSASnyWi0GIyI06QqbHtupNl2BbaPnHBBmEROmK1Q8H0r8JC7zwy/bxp+3wzZFUcDj5XYRTQBv0ca7xloe96DtkUvb0f20lVR7bXEts56ITgGr0Ahetsg4sJoNJf2R3TpnVA88ZUobKxUzbUVkCDdDbHPWoFbom21ma2CxntnZCdvRc7QqeH3JrRb2QyVWPokxWedD72zDYB93f2+tNpOA2EhWpy2QnlNlIAqZ5acl0c5hDWpQokLmAH08Ob6+BnqLXS/ROFOFWMq/HAdXLanPpD3gc87+7YVfgxBOgZpT8cDl6RpughhRP9EYzIsLgwrfHBRNdh+SBNdFhEUWoFrkzhBTBU0Lka0454oiiG/6KUhwbwTIl2MqeT5aomgod6Ctpo75wnG7ijz1sGIBNKEtubPJGi7BxLiI1CkxEuIZNGHXNjfBzHXGnI+7o+KXr5R0QPG9y0/JvvwNDXqtGFmJ6LvZzJyYD/AWtzHFvwdjWU1mAos7M2lY9LTQr2TmFd9vyYR8r9H7JuvZhGBuwbSZtYCVnP3sjKCJWh/EcSmehrYo4O41wlo7MaiXAgLIkfQp+FoF6LWAaJ30Rd5jz9FHwYALvwZhcE9HrzRnQYhdOxBtFhtX+DgmY6eJ7JRfo3CAJPgB3Jj2w2FaQ1Ai9ynyClcFGHsTkGL1sNmtmbCe5eEu9+LbPQTgFfNbNs0208ZPdF76IrC9t5hXtIsY1Q3WVhvoVt16ZFp0HSjtsiPARPN7D0zu9/MRpnZH83s/8zs52Y2IGgKDYOZzW1mpyIN9O/Itpm0dE5H91gWMcGucPcj4oS5mS1nZqchW9kByNu+kLuviGIhb0RhXR+a2ckhpraje2+LYngnoK3gskjj/a+ZrZ9/rrufF9r/d+FvjUIIqXocmVv29bZB+Euh2NzhKIJgceQcfMrMjgh2yVJtDzSzo1AkwihkYljK3VdAJozjUUKiD8zscjNbL26+uvtlKBHSnUE7TQ3uPt7dD0JxsSea2U1mtmCa96gEZtbPzFY1s+3M7Eg0v2YgE9ZiwJE8zZ/QQlYtulFi8Usb9TYvnI5CmLpX0coUYBHcvwlbt8WIN8hHNMi4kK+aORHMbEP0sT0HHFwLe2bQfKK4zsuL/N6LXH7TJcg5dmLtyEGID0dc/zeQyeHmfPtl+CjPQ46fEe7+eEEb2yJnzW3AsflONDPbFCU939vdb0/+1OkgaNx3AX8PC0L0964o1O1YlNPinAJhvCR6r72RGefVvN+6IBtslAcjlgadd01Egx2BNLlYGqyZrRvaLJu9lgSWi8kejhx5/6jVTtJyNPi4b7crbf0z40OfuiFzwNEszwXswBgUDVENnvJmX7vKNspGvYXuYLTyV2r4ngHciPv/lXc760P7+MHo/weTo0EWE8ofdrBNj7tnXxSRsDWwv7vfkbSNMu+zOXAVsJfnscyCtrQG+nC2J0eDvjvJ81hbGuxayEHXiuJuTwn/PiEu3jLYmE9Hwmc/d78777efIe3/eI9hr9USJpbZTYjifH3e31dCQm8CWhSKRh2EMR6BnIbno0VkV5S+cWxo47okTtzQ5jrkaLAPUJwGuyLSzGPZa9XCxHi8FIVT7luJHd5yNPg4oRrR4OMii74uiBrpjsxWLwI7Ru/GWuwgFONeaZzueGB3b/bbKrw+MRpBjngIeU0r2fpPAjbA/bnqu9GGBllsYixEjgZZbGJ8VqgFmNlWiOBwN3CU57Gb0oQVYZlZWxp0L3I06Kq93qZEMYcih46jkKlTynG8mJLYXILMQYd5YFJZDHut1rAcy2xnd78//K0HiondHznORnfUn3DNXohAMR8S4id6OrHWfZDjcQSah5ehHcqY8PviaOxuRWFfqY+dKd77SGQSaheTHb6fYjT4/Fjcb4gXqu1o8GX0aSXgtTb9aLG+yDbes6IHlZ1+QW+uY16WBgjdlVB+0KQr0yTgn7jvlH6n2sPa0iCLCeXeiK32PtJuVkWxh39GsZ21EriHog9hC7RryKdB34mEWCo06HC/JmQDbkaa64tI2GyOtNWo1EvsRDKxl/6K7IYHAze5u5uoz3cj4sVhaToXY/rRjmVmSgQ0GnH69+9okQqa5nC0wEU06K4ovOsapL0ndUaWut8q5GiwL4S+3oacn3cim/q+XoNkTiEEcSO0s5kLET/6UQMafFX9bLFD0K4jKQ14ErCHN/tN6fcqHo1KeLMpskWWO0iTUGKXzalj5qNSsBwNcg/EInobrbiRjfkH4jM4VUKDNDSxfovsrZuhj3E8sjFe4x2kYUwKy5EgHNlu38z7rT85zboHOc06lgZrZmuH894EDnD3sSb22u1o4drD3X8INuMvUlw4DGmyw1HM69vB3v0XxCQ7FLihhN11HnIJWBYlZxt/L++c/ihr2trINJFqBqtgA/1d6MPKyLR0TXiGH4CdvETccEybSWjwvVDVidvQTuftzhRiZi12BvoOk8iU47zZz6xdr4qjkakd10De4F4UT8MGMpiDgtH3p44pADuCmS2KaKBDUOzm03m/GbJZxSULGYQSascJ5TY0SMuxzNZFjsE1UAWJVuD5tLeXQcs/CuU5bgYuLBEVYSj71nBEingECdaiNNiwLT8OpXc8FtkO50ICpBfayv4baZ2Xp/AsTUgYboBiXT81s03QQvUE0rC/inmutcJzbYe08Vbg3lJaZTAxXYi2/0d5SolfCu6xJNpt7IXih6N38ytvm/ksVRq85WKyByIn4otpP1s1sBY7FCkmM4nfSU+AwKRsQIYxaKTQBZCxfQvklVwLCVlHrJNpyElxISmycapF+IhHIM/2ecgemUj7DkJ0EYoL5SVQCZcP0cT/DiUE74MqMIxCuVNT28IW9G01JDQ/R9vWooH7MddGNNgRSOO/nBgabNg2j0ahOvug572LUDASeNndV2l/HU1IA4uSmH/rTlEhGJwvVyCHzm/Cn09FppHfu/udRa7pTy6aoDsStFd4gmrQwSZ7MipFXktnalek/f4e5V6ejopxGtSGBh8E+W5oHC8FWpLu2moJa7E+aCd4FFpwIkWtB3ruk4EbvLk+po9iaHzliAhyBA1EWs844OPOpNnCj7Gbo9AWZnh+uFDK95kPxWXugXjl41AF1yiJCMTnOR2TdJsZ7tkT2aOHoQl7ZTUatHVAgw3ndEXa9NFogT2OXOz4FFS77g2dy8JIOz4QaTHT0OLsKOb4LHdey2s7YplNQCaEzcM97kBhbN/nnVtIg74j9DeWBl3mGGwQ2nkehQ0mDuYPC8ditNVU8xfqXmj38wmi2A9CC+bVyPk1ptL+d9CvgUjpWBl9C493cEldYS1mSLGZH2m+X3lz5RngUoV3gppBnf1AH/cRKDPS4ZRRH6vC+6yGchV8g0KGPkRc//xaZpHXeHVyxQwvROkUo2KGnwJPkitmOAw5RAZD+1pRSEt6ExEkilaWreKZeiDt994wfudQUA0WLSzfkKsGPDP890rwucCvDrXQJscUppwWaqc9Ab4gYnw9S67M+XXI5r5BwX0HoYVmDBKM+wP9Un7+nhQpHpn3exNti4weT/sio2PIFRk9DtG4oyKjhe3thTzyd6LF+nq0kFRcbr6D59sWCfzziKlinR1tj86j6XZSBG/1pXQQu1lF+1HpleFImI5G4VWXIwF8qid4SUFri8oEFTNfDCBX7PJjlDR9GSQYLgO+THK/JDDFae+FFoHPCLke0Db8qrxTZ+j3eZrg+09ROsJyQoKmwfTvYIUJ8NZVaCE5HY3lSHefHDTHXyOt9ufh/qPd/YXqn7A4grNwK2SSmoQWhAXImQDGE28C+MgT7vjM7Ndozu6LBPMINLeiXA9psyLzY7L39Qrqvc1RaLTU76wH0tBGIofX3hRoFFW2bcixcyXSRq5DlNAmlE3pM2DPGj7XT1BZ9q+Bl5FH+rnw/xOQOeAO5KU+BCVsWYkyyrOX2YfIln8TkSmpnZbbZRz4gyW025hjmsO472DB+1BI18/CPZdDYV2fIy1yV1IqS45MYsuEZ/o9snfehLTnb8KYvhzG9Mnw/xekOaZF+rRueNadw/+vhswrX6Mwve0oqIqcwj1/iRaKK4D5a/Fcs8ORabpFkBe7+R5yuKTiyDMlkt4DabVTyeW3/Sr8vjkSxIlqmSXsw/yIWPELpLnfX/B7X+K15MFIYMTZkxOz+EyJ3N8gx6GfBhwO93eFTf5CRcmppwL3Pw5bb00uzGpJJAwudfe3EvYxv8hosWiUBcgVGS02Lm0SM5nZ8mh+/UDK6T0L+h2x105z97PD3+YmV+JpWVQ7b7SnlMEshFL+DbEhD0YU8kzI5CETunnIi93cGWl4sbGbCdrsiogLw5F2W7T0ipntjOy3FdUyK6MfRtuil8d5wtwToY0FiRfKCyF7cpzwKcbiOwNVopiCtNyewFTwV1BoXIWYPA3mnQhT86tBx6W7zGdXFROqi5ErMlrsuT7x5FUiuiCn4PGIfHBG0jbKvM/ixLDXTEmNonLzURXnGz2FyBhTIvvRiMBzgFdRxmh2QyZ0AyxXquU/wKFeJHYzYXtLkqtZ9gGagDd4sdLRZocgR11VtcxK9GUhtJ0tu+hlhffpRntPe74A6037YoZrI2fMVDROu8DUSdD9eSqndgJTp8K7R7gvf37oW1RkNI5h6LQVpIURITUJMbIqikcmuEd/SrDXwnvbCikG6yKHaivwXDVKR15M9r4oF+7lmdZLZtNFMZ+jUKTAVlW2NRfSkh9EtuAzgBVKnG8oWcfrwGI1eDZDgv8LpMH3aPBY90Z2zG3QTuJstC132th077gGfGoyW26x46mPkQ31M6RJv4miPC5EUR9DURTIfKRos++M7ymM/T2I/dezxHmLIHv/e8gmfhAwX5X3XgX5DP4NDGnkHOwMR8M70NCH18f/cfgI+1TRzipo2/4V2spt39GHg/j6o4GngP41eLYhYZI/R0GIVmc6ULhRVGzwdeA0GHdu9QLXHT59F1gfUV1rEjKV8lgsjMwA/wPWrkH73VEY4WPAvB2c24RIOdcgZ+c14f8rGscw348O38gh1CjsclY46p3EvFPAlOD8OhTmsou7/94T1lIzsz5mtq+ZPYsSv3yLPOWbu/uNXoLpE7a6t6CPbBOv0pRR0HaXYK54FgndtbwGW9YU0YQ03CYUTvU9dE0p8U2XmUiYTw736NRw97HI1NIM3GJmZwXHVFrt/4DIKs8Bj5oqjsSdO9PdH3T3nZET8ilEp37bVCxg4YT3nu6qgrEOcuQ9FhyKcx4aLfXreaBt3K4olOZkSmyzSly/Hor7HIecYluQYNVGFN/HUVxqt5Sfb3lkk34E+Emjx7tI/7qhD3jT/2/v3MPkKKs0/jtJCHcRlADLJQFZVDDKikG5ibCJQdGAICxyM2EmgCIEgiKI7DiIYFiXfYIaBWYkgoJhuV8iQVmTKCo3RSIgEZcIkYsEEHIZEkiOf7xf051Jd09XdXV1z8z3Pk8/4qTrq+ruqlOnzjnv+6IxvAtRHdfXft0yK5vywq+fRapor4TXQyiTvAQ1sQ4O31kmo2MZf1dvo+gDOC7jtQ3VWBcB70y43Rikv/ASSjYOSXoeoxvs51AJ7qtZXwet/ho0jTSTJuz3EQvpBE+gyWtS9z8ejdk4ajJc7QlpnSGzuBNloF/07FS0Gmp6meA40kw3jEFi6auQ0tgRCrjcS3KpvhKsXAnPTXUfOSMc1+YVjmlH5GDwMpWnExZ7AyYLaoGZHYSC3N3AmZ6tHfsk1FOY4AnMNsO2G6MyWmEcbyZ9uJKUWWMHdE1ui67JB5McQ3/FgA+6gaF1EtJRLYhv9ylQY+tar9yEgu2vPcWXZmbvRPXexCyzPtb9AKoN/w11pjNlG5XZX5I53t4sq3XmeM1sOrpZrKQ4MrYcfCHSKE6J197QyNhrBaH0uyvdiMqw+HoH5VIWX7nP1jAWXzi+TVFw/BTwBXe/KcO1C+y1YzylFbuZvZuizsZjFC2e+pz4CDfEo9HTx0wCczDNcfQXDOiga3In6EINhDZ3f7SGbUahTvIklJV1kdB6pcyaBS+zr7hMButGEKjpRDOWU5Gebt0/ZhjzGUnlALQ+lYPqk5589ncUsJC1yRFTwF9C332amuYqYAZYJ7qgJ6NMNxUNNuF3ss53k/Q7qXIc+6Hv5GFkNVSz8lkf6+4L3IBkLq+pY51SivWeBIsnr0ECMjxNXoqYc+3uPj/tcbQ8ml3faMSLhJ1SiqIsd1FBlKWOY/koql19MsPPtz8ScPkJMCLhtkNQN38/VDL5GqodzkfjWyvRoPzP0PzoOcg65oOIeVX3aBVFGvRVqDb+JJpgWI7UuABfLwjYvJawlrsa/FnwEb32WSomNBs1rDKhwSL7+d1RJjoVib/cgaYQVoTf/97we12EpCzHosfypPXQDcIaz4ffL5NRN2Qy+jQwJaP1dkBiQn9FdOjPUYOYEKoRLw6/VeqJolZ+DbhMN+i0/gBdXCe6+5NV3ltqvfIwyiJu8oz0QUtYZoe5+z0ZrFeq03qKl3HTLVO/7J2Z7YACXTXvqobUL02OEJ9F3/kqAg0aZZEPANPc/ezi+9kMCY2/g9rMTN9ADbN93Hm83BsaTYMts79a6tzPUfn3WIfFF9ZNrXtc5VhHohLYjcC55fabYs2hqDxXs2xmEAgq6B6f7O6z6z2OVsKACbq92C9no8fIcidrwXqlDQWgK8N7s1YPm4KM/T7mGejuWtGR4E6UQVRrDBmVL+JFnmPNLNCgD0IX3f5o4qMbuLfw+4TA9GHKeK2ZsTGaLR2PsvThZXazGmXoC4EJ7tRUPgh19gIN9s/huDKhwdaKGll8f6X87/k0ypqnoieWig4fCY6nKnutzrW3pGjxtB5Fi6eyZRKTw8flZMQSbRW0TtBVN3RL9Kj/D+AFajyBrIz3Vq9/N/R43I6ynHnobntn1lld2Nc30OPr+DQZSMgOtkMX3Wh0YY1CF98W4fVXKjd2Xs4iS6kHQcimUBt/Cn3fZWnQta3HjmjMazJSKVuNgvAwlJn9tzuput8lNNh2NEfaMCukFMe2CWsH5N6BuTD1sTVi3XWhIPUk8uJL5AxRss/r0Y3sqKxv0uEaqckKKUxJnI9q86ej36bwt3OqfT7rtLeha2UN8KJ3ZG+dlAbNtusx4COIkjkWnUBr0F3wVfRo3kWFO5xVcJkt+fdy1itXeYPEN0JWdxmqjx1c6c4cTrpqHmrboTrgMhRsf49KJo9T9FDLfSSsL9i65olXo0f3zPQkzFgPOYwU7Hr+7k5mQcHkfTcR3TCWonPmx56x6WcWKDmPdgqvo9ATwWL0tFM4jyo99VQ8j0JT7EqUhU/wBplQWg2mn+F9H0TXwBMoNhwN/Ke7f2Ot93XaRmG9L1O8KYGSuYdRee5m72ieK00zjSnfizr6b0d3Livzrp7w98uAM1nbrHEcevSYD0x19xfD3wvWK23oBLwVZcFVbcLr/zi2IWqUrI/u3lA5qBZOhkqZ6uuI/bMzml980/SyFWH6LdvRhfAg+r5vSZNltQrCeXQAa9vbdwNzW/GGV0CYBrkMPTWeiIJuJWPKghdfpaD8D8TaHItMPRvqVWjl7e1vLvRYQgnxGvQUCWpS/mvhydY6rR1dN07lqZel6Clpones2xPJA82yYN8PdZArBdveWI5KAoeYnIPXUakP5IdJKEMpjBtd4w1wYw37Ww8RLXZEme2ZKEt/nmItbhEVxqvc/ZUyaxo66S5C3dsLWzVwhabeUSgobUNxHGtRM4+rETBpEB+DShsboeA7s3cZq1UQzqPjUTOqCzi/XHM4JAqjqByUQefrMHSuT0dTGP9PY5XX1gcORdfC+1FNvwvV7Jej8hIouP7M3cdbp52PrsFaCTU9wOne4Zdneey1IP+ga/Yu4D4q265XworH4Le7quN8ExplWonYTAXrlZ+QkfVKOHG3onymuhNFdtXfkCvBY6jRVbXrXGV/70BqZ5ui7HZBvZ8ha4TvZG/0fR+KWFJd6MRfXW3bgYDw+cegz38EonNX1eptJsK0yHdQUtDuCcwje03B7IQ+78EoA307KjsUWHzlMuXFWZwTJunLSeG1HJlvGkpwhgDGJKYxklNJzmDsAf7DO/y2eo8zCZoRdO9Cjyu1ZLhrYQX4xdDeKbm+NnQ3/xNFBkwiF9yQrVUKqqPowyUhvO9ORGW8OE35IjTNpgBfQRnu9EaNbKVFCQ26LfypG9XGE7vbDhSEfkKBBrsTKWiwecHMDge+jRqO56RvZtoEdK0di6zeCyy+0uun8N9botpypdLFkoRJyVAkuvOB8KfVwG/YgalMYi6WmjL+d+BfvCO/pCHfoKsSwEJqm7lcB2tgzW2w5FDd5X5IH9YroRkwksqPTxtQWbj6Sa/CJDKzMahenJplFmpY3ag2Ndndn0izTiMQTvJxKKiMpU4a9EBGCQ32eESIqJkGmxesaB55ICrLzUm5ToG9drq7X1vlfQUWX6VrbziVs+Qne4/thZvcUnTtv4Z6J0M4ki525WhUqkyDpcDR3tEYe6xyyDvoXoSsWdZPu8RqWHUvbLu3+5LQ7NiGyj9sQzjzZvZRNNTf5p780STcDM5BI1DnIqpkSzRnQiOm8DhXcOytiwY9WBB+1wnoRjWGBDTYvBDO3ctRj+SMNFMZZjYa9WTe9F5LsUZBw6PSU+ZS1r5el6FZ5KEo6H6Jj/A9PsJfKNaf0+KX3uEfrnONmpF30H0CsYtSowdWnQKPXKk72w6IgVQpW81cHcrMPoM6pKlYZkGHoRs12T7n7ouzPL40CFnJIShb2wN1iLu9tXV4WxomBa1CY3cJwW6+UY3dJLBe5pHufn2KNTJnr5WsPYR1+yl7oyeuYW++cXPuYwqjqcvWCVD2vL535FPWyzvoLkE6oamxClbdBjM+rabToqR13HpQD8ss0E/PR/WwM1D22OzB+90ojugsIGMadMSbZZrCCGNNNNgcj22fcCyPIvWyRPPrYQ5+Npp/PbmRvQgzm4wmel5D5bibOYD57C+NhjqXXwls6x0aO200+p1zxHB4/XB42N0fzSvgmnAhEu3YN0XAPQCdmNsAo9392mZdcGa2iZm1mdlvkKhND7KG+fdwXDHgZgh3X+3uc9z9SNR5fwg1Xh83s7PChEGzju0eJJ/5GPAHM5sUphZq3X4JqhFvD9wQRtAahYVo/ngssLW7n8T+1E2vbwb6XXkBsVGOp4zYSyMQWGbfR3TciiyzCttuhuy1P45KCbkV63sdR4EG3YbMGBtGg47oGyU02AIt/RdUoMHmeEy7o7JXn0JRZbYdjqY3tqeB7LV19ttp2yHNjFSN+RLkWl7IO9OdhR4P6sF6iKvdcIQ79w2InpjIy8wkDv1HNMD9nmYEXDN7u5mdjkoHVyPJxl3d/VB3vz0G3ObAhd+4e0F0aTZy/FhkZhcE3Yq8j+khdGP+OXC/mZ0WSiO1bLsKlageRN5rifzT6sDfwqte/DKvgAv5B93v1bn9G8B1lGFzZY0wYnMX6ppOqDY+1mu7Lc3sWqQbcZy7n1yOfdYomNkQMxtnZrMQT30P4BTkmfbNpHW7iMbC3V919yvc/UOIbrwJcJ+Z/dzMjgp6FnkdyxvuPg01rT6NzCPfXeO2a1Cv4sfAr00Kbg2Fd7ijJ8l6ROKXhjVyQ75BV536eSidT4NVKJg1FOFOPR9pvB7ntdn7mEk/dwEaU3uvu89t6IGuvf/tzew8lM1ejL7nUe5+nLvPa3bTJqJvuPsCdz8dPVldgcpBi81sehjTyus4FiIhqh+hwHtuoL33tZ27+zdRw3humGVvNK6hvjjWg6YwckMzGmmnke7OtBy4hgaPMYU79D3ohJtay/xs0H24Den4ftLdv5RHk8/MhpvZYWY2GzVotgEOd/d/c/cZrTCeFJEc7v6au89y93Fo3vdV4Kdmdq+ZnRiYlI0+hjXuPgNpH+wLPGBme9S47Q+QrvXsMBfcMHiHLwNORRMNSdGDhG9ypbA3S/Bmb3R3SSJ4czdwGA3k+CdlmYV5whOBryOLn2m1ZMX1wqRfUTACfJyUNOiI/oNQXx2Pmm8HovnYbnJgCIbG37HAt0hgHmkStrqePthrmRxjp52Hkp4kgjeneEc2noVJ0Expx92QtONW6Isql3WvCH//NnB2raLm6Q4nGcvMZHp5BeqctnmGmrEDuYOfAAAK60lEQVQV9rcxqrO1o9GjmfRBg44YmDCzrRDluB2V6go60S/ksN9L0ZhZTeaRJey1/3L3Sxt6fJ02MRwfVBbUWoqkU4/3Dr+jkcdTCa0gYr4PkmQ7GDXKCiLmL6I765U0eASlhGV2uPehxBRGyM5AIskXAN/2BmXfIcPYA11cRyKhn27gdm9BVauIfBHOj33R+XEImrvupsGqb2Z2KFIvuxU4uy+KeKCWz0FZ71cbmZlbp22AkpMvA+9EfSBDWg/3o37H7XlOK6xzjC3TX1GXdguKdj3/IIeDM7PTkHNFnywzk1h3N6Ien+i91O0zPKYtkH5rG2LbFPRbGyoiHdF/EWbCP4MC8AiK+saJ7aJq3N9bUVL0UWowjzT5o91BDuy1N/fZaW9B8pRrgJe8Iz/vu2ponaCbM0KWcAEaTq/qZRa0Cc5FjLSz0WN9pl9cqA/vjy6ag9EjWTfwi1qaeRERBQSiQxty8ngAlR9u9QYI4pvMI69Azeczqs2yB82HG1A99TO11IUHIgZl0E3CMrOi6eVC4POesVtAGE+biC6S5RQ9uXLhgUcMXARyz2HoRr4bRc+6RzPez8YogTmKYB5ZKSlpFnutlTDogm44Ea9FDbBPVyI9hBPpG8jkbgqy5s7kywozjx9HgXY/iu6zD8R52ohGwMx2RopnE5HCXcGduR5iQe99fAglKE8g2nvZBCU81V2CLLfGZ53ItDr6neBNPShhmS2nCsvMzMYiksMWiMJb8c6dcP87mzSFnwLOQsLg27v7Se5+fwy4EY2Cuz/h7l9BtONvosbb02Z2hZl9MInQTZV9/BbN9f4BCei0l1u3F3vtHjPbpd599ycMmkw3PMbPQdzyM8vVSUNzoOB+erK7/zSD/fZ+xLsKPeI9Vu/aERH1IFwTn0VPXD0o+/1RFqWtkqbzq8gVpWzT2czaUGligrvfX+9++wMGRaYb7qT3oDtrWZZZGIN5BAnyjK434JrZ7mb2HUQJPg74LrCdu38xBtyIVoC7P+PuFwG7IFbXGOAvZvYTMxsbygBp134Y2Av4KdKSOKOcgI67dyP22h1mNi7t/voTBnymW8IyOzfQE3v/+1aIfLE7NQ58V9nXZqhj3IaM+QpjO0+lXTMiIk+EEtwx6MlsM4rncGqHk1BP7kIOD23lRjMDe+0GYEqj2WtNh7sP2BcyVvw7enTp/W+GMtDnUY1rw5T7MNQM+yGaL74O0TWHNvvzx1d8pX2F83oPpAz4Epqx/RSwXsr1hqCM9gWgAxhe5j2j0ZPhac3+/I18DdhMtxrLzORfdRkSiGlz9wdTrL8VxXrYanQnv9obTMWMiMgbJqupAgV9F4p9icdTrLUdGtccCZzgveq4ebLXmoUBWdMNLLOLgbGlATdozZ4C/A74JTAmScA1s2FmdrCZ3Qj8CdEMJwK7ufslMeBGDES4+wp3v8rdP4wIPADzzGy+mX02BOVa11oMfBK4CLjdzL5Vur27L0LU5nHAFWGmfkBhQGW61VhmQbKxC1k4t3mCZpaZ7YhmHCehx59uYJZHW/KIQYowa/4JlP3uhVxhuoDf1ZqdBmrwdGBP1E+ZW/JvA5a9NmCCbgnL7L3Axz2wzMLfvxhencAMr0EMxKQFcSg6qd6HJh+63X1BYz5BRET/RCgZTESltlcosiprYpuZrK1mIOr7WR6cVkrYa9uhvsyA0IceEEG3hGW2IarhLgt/L5jtvYgEahbVsNZodPIcg4TBu4BbPLrkRkRURRgxOxAlKgcBt6Prb573oR9ia5u4ft6DvGpY83+AA4CDfACw1/p90A2EhlvRY/9Ed18VstTzgMmI+fXDao88ZrYp4o23A9sCVyJRm5odUSMiIoows7ch4fN2lAx1o+uwatA0swOQgM59aHzshVA2PBsZBoz3fq4h3a8baVb0MvsdcGwIuPugDPVdyKdsZrmAa8LeZvYDRMv9GCo/jHT382LAjYhID3d/0d2no3LfMcCOwCNmdquZTajUIHP3X4RtngEWmHwHcZE4LkANvDGgmWKTVVa/Qr/NdAPLbA4a/ZqGrH8uRKMtp7r7DRW22xLN57ajplpBdf/5PI47ImKwIjTHjkTX3iiK7idPVHj/nihDXoQEdBab2SHomm1Her5L3f39DT/4DNE6QVdzr1tTFDFfRAW/sd4sM5PVzuXAXETzfanX+4ciPYV2NIpyC/rhfjUQ5wAjIlodZrYrRZ+/R9D1eGPvKYXQTDsH+ALwVVR6+ARwM5qPfx3YvXfJwTptCArsWyAR8yXA08G2valotl3PMDSzdxbyXVoJOMpA16As9rusPfo1Dk0StAO/QgI1BwAnufuctZe3kWjMaxJiwnQB1xa6oxEREc1FMAiYgALwGNQQ73L3h3q97z0o6+0B3o3cMUCBd7q7nwlgnbY5ut7PBN6KgrIhC7Bn0FPxNc10kWimMeVeKOPcgMomcoUgfB0w2aTWNR2VEEYgzYTrUca7VMvacPQjtlP8Ebvd/feN+zARERH1oiRJOgHR99dKksIT6yw0h1+KlWzDJpzEVNSXWUNlV+BlqJd1snf41dl/ir7RLAv28chCulYmy4qn4LldYPhKuaB+Ackktrn7PVqytseViIiI1kaVcuCDyM23dADgWWAjpjKbtzAB9XZqwQqg0zv84swOvEbkH3TN3odkFmv9cgDoAf8z/HF32NpV1/k6MAwV5ttQd3QmVQrzERER/QtmNgIlUgWT1q1R0F0d/ncIk/kO2zKJhDEFBd4TvMNnZXjIfaIZQXceUuVKrFS/AtbMhONPgT+ju+ARSEOhC5jtOTiMRkRE5I8wqzsf6TKASggL2JMj+Bh/wNgw5dIvAyPytGTPV0zCbCfEs05lDbIB2EiJgS9BRfXdBgJDJSIiok+sD3wIWW0NDf9/N3bmHIx63LKHoR7QjfUfYu07zBOnUgchYwjYQbDR87DXiKjoFRExmLASTSktQxrYL/A1VgNPk7ysUIpNgS+TY9DNm5F2CDC8ngWGQs+I4iNGRETEIIALv3L3h9z92VBK3B7N4daLD1hnfhKSeQfdzTJYYyiweQbrRERE9G9sgeZw68UqNNObC/IOuvXUXgrwjNaJiIjo38gqDgzJcK2adpYnatLX7AMFSl9ERMTgxhLqLFcGDEU6wLkg76D7I0TjqwfDkMZCRETEIIZ3+DNIDKeuZYC7vaNvY4OskHfQvZyU42IBrwNXE0TKIyIiBj2moYmGtFiOxNNzQ75B1/054C7EJkmDN5D2QkRERARIi6EevAL8XxYHUiuaIWJ+GpDG0HE5MIMEhpIREREDG97hPYginKZs2QMcm7fcY/5BVzKNByLN3Fo7hsvR8PJZjTqsiIiI/gnv8OsQwWFFgs16gOO8o+hAnBeaKe24E/C/yFZnOOXZcctQDfgCYBpRcDwiIqICrNM+hTS4K8nFOkrgXkYBd16Oh/cmmu8cIffd04GjUeBdjYLwQlQkn4V7kjtYRETEIIV12lDkd3gWsA/qAxl6qp+DLH7mNtNBovlBtwCpCG2EhCxeJSqGRURE1IFg2fMWVMZc2gpWPdBKQTciIiJiEKBfW7BHRERE9DfEoBsRERGRI2LQjYiIiMgRMehGRERE5IgYdCMiIiJyRAy6ERERETkiBt2IiIiIHBGDbkRERESOiEE3IiIiIkfEoBsRERGRI2LQjYiIiMgRMehGRERE5IgYdCMiIiJyRAy6ERERETkiBt2IiIiIHPFPdlnRQOiq/FMAAAAASUVORK5CYII=\n", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "nn = MLP()\n", "nn.addLayer(Dense(6,3))\n", "nn.addLayer(Dense(3,6))\n", "nn.plotGraph(\"\")" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "An autoencoder's structure usually looks like an hourglass tilted sideways. It consists of an encoder and a decoder neural network. The encoder tries to compress the input vector into the latent space and thus simply reduces the dimension of the input as much as possible. In the figure above the encoder consists of the red and the blue layer. The values in the blue nodes are the latent vector. The decoder takes the latent vector, i.e. the blue layer, and tries to recreate the original image. The recreated image is being stored in the green layer. So far we have established that autoencoders try to encode the dataset in a lower dimensional space. How can this be done in practice? In contrast to classifiaction tasks the dataset now doesn't consist of handwritten numbers and the corresponding labels, but the images themselves are being used instead of the labels. During the optimization, we are then minimizing the L2 error between the input handwritten image and its recreation.\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Denoising Autoencoder" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "Autoencoders can be used for different tasks. One of them is filtering out noise from the input images. The only difference between denoising autoencoders and vanilla autoencoders is the fact, that in a training sample the input to the network is being perturbed by some Gaussian noise. However, the output of the network is still trying to approximate the original handwritten image. Thus in a successful training process, we get a neural network which can filter out noise from images of handwritten digits.\n", "

" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Demo" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "

\n", "Here we load a pretrained autoencoder as a Multi-Layer Perceptron and show its architecture. As you can see, we were able to reduce the 28 x 28 handwritten images to a latent vector with 10 components, which means that we have an approximately 80-fold reduction of our input dimension.\n", "

" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "scrolled": true }, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "-------------------- MULTI LAYER PERCEPTRON (MLP) --------------------\n", "\n", "HIDDEN LAYERS = 0 \n", "TOTAL PARAMETERS = 16474 \n", "\n", " *** 1. Layer: *** \n", "-----------------------\n", "DENSE 784 -> 10 [ReLU]\n", "-----------------------\n", "Total parameters: 7850 \n", "---> WEIGHTS: (10, 784)\n", "---> BIASES: (10,)\n", "-----------------------\n", "\n", " *** 2. Layer: *** \n", "--------------------------\n", "DENSE 10 -> 784 [Sigmoid]\n", "--------------------------\n", "Total parameters: 8624 \n", "---> WEIGHTS: (784, 10)\n", "---> BIASES: (784,)\n", "--------------------------\n", "\n", "----------------------------------------------------------------------\n", "\n" ] } ], "source": [ "autoencoder = MLP()\n", "autoencoder.load(\"mnist_denoising_autoencoder\") # autoencoder is saved in '/models/mnist_denoising_autoencoder'\n", "print(autoencoder)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "We now load a mini-batch of size 1 from the shuffled MNIST dataset and take the input image from the test set." ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "dataset = Dataset(name = \"mnist\", train_size = 60000, test_size = 10000, batch_size = 1)\n", "randomBatch = next(dataset.batches(autoencoder = True, noise = 0.1))\n", "inputImage = randomBatch[1][0]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "As you can see, the input image has quite a lot of noise, which we will try to filter out with our autoencoder." ] }, { "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": [ "plt.imshow(inputImage.reshape(28,28))\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Below you can see our recreation of the original handwritten image. Clearly the noise has been filtered out (almost) completely and up to a small error the original input image has been recreated successfully." ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "data": { "image/png": "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\n", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "prediction = autoencoder.predict(inputImage)\n", "plt.imshow(prediction.reshape(28,28))\n", "plt.show()" ] } ], "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.5" } }, "nbformat": 4, "nbformat_minor": 4 }