An open API service indexing awesome lists of open source software.

https://github.com/pbenner/pyleapfrog

Leapfrog regularization for estimating sparse models in PyTorch
https://github.com/pbenner/pyleapfrog

Last synced: 9 months ago
JSON representation

Leapfrog regularization for estimating sparse models in PyTorch

Awesome Lists containing this project

README

          

{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Overview"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"This package implements an L1-based regularization method for PyTorch models. It uses an L1 penalty to compute sparse solutions, where only a subset of weights have non-zero values. For instance, linear models with an L1-penalty are known as the LASSO [2]. Although L1-based regularization methods are popular for feature selection, they often suffer from the difficulty selecting an appropriate regularization strength. A regularization path is often used to select appropriate values for the regularization strength. It consists of multiple parameter estimates for varying regularization strengths. For the LASSO, there exists an efficient algorithm (LARS) [3] that computes all regularization strengths at which individual parameters change from zero to non-zero (or vice versa). Estensions of LARS have been developed for the family of generalized linear models, but they are computationally more expensive and not applicable for large models and data sets. As a result, a pre-defined range of regularization strengths is often used for more complex models.\n",
"\n",
"Leapfrog regularization [1] allows to specify the number of non-zero parameters that should be estmated (i.e. the number of features to select). It uses L1 regularization, but estimates the regularization strength during optimization. The name is motived by the fact that it allows to compute only specifc parts of the regularization path (i.e. to leapfrog over particular solutions). "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# References\n",
"[1] Benner, P. (2021). *Computing leapfrog regularization paths with applications to large-scale k-mer logistic regression*. Journal of Computational Biology, 28(6), 560-569.\n",
"\n",
"[2] Tibshirani, R. (1996). *Regression shrinkage and selection via the lasso*. Journal of the Royal Statistical Society: Series B (Methodological) 58, 267–288.\n",
"\n",
"[3] Efron, B., Hastie, T., Johnstone, I., Tibshirani, R., et al. (2004). *Least angle regression*. The Annals of statistics 32, 407–499."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Installation"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"```shell\n",
"$ git clone https://github.com/pbenner/pyleapfrog\n",
"$ cd pyleapfrog\n",
"$ pip install .\n",
"```"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Examples"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we import some libraries and generate a training set for binary classification with *n* observations and *p* features."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"import leapfrog as lf\n",
"import numpy as np\n",
"import matplotlib.pyplot as plt\n",
"import torch\n",
"\n",
"from sklearn import linear_model\n",
"from sklearn.svm import l1_min_c\n",
"from sklearn.datasets import make_classification\n",
"from torch.utils.data import DataLoader, TensorDataset"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [],
"source": [
"# Number of samples\n",
"n = 10000\n",
"# Number of features\n",
"p = 100\n",
"# Generate features X and labels y\n",
"X, y = make_classification(n_samples=n, n_features=p, random_state=np.random.RandomState(0))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Logistic Regression\n",
"We first demonstrate leapfrog regularization on logistic regression, which has the advantage that the corresponding optimization problem for estimating the parameters is convex and therefore has a unique solution (given a fixed regularization strength). Yet, as opposed to linear regression, there is no analytical solution for computing regularization strengths at which parameters change from zero to non-zero."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Standard Logistic Regression with L1 penalty"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Use scikit-learn to estimate the parameters of the logistic regression model. The regularization strengths are defined a priori in the vector *cs*. The following code loops over *cs* and estimates the parameters for every regularization strength. We plot the estimated coefficients (weights) of the logistic regression as a function of the regularization strength."
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAacAAAFGCAYAAADO91C/AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABH3ElEQVR4nO3dd5gV5dn48e99yvZlF9ildwuIsWMXuwZbNFbUaKJJeE1iEk1V00zy5qfJm6JGo8FOoqLGEgt2UUAEBbsCikivu8D2PW3u3x8zC4fdc9izjTm7e3+u61xz5pmZZ+454tz7PPPMjKgqxhhjTDYJ+B2AMcYY05wlJ2OMMVnHkpMxxpisY8nJGGNM1rHkZIwxJutYcjLGGJN1LDmZHklEjhWR1Z1Y3zdEZE5n1ddZROQ1EflWB7b/WESO7byIttVbKyJjOrveziQiKiK7+x2HSc2Sk+kyInKUiMwVkSoR2Swib4jIwd6yrDzZt4eIjPJOdLXeZ7mIXON3XJlQ1b1V9bWO1JEqQapqkaou61Bwqfe1XEQavN95g4jcKyJF7YnRZDdLTqZLiEgf4Bng70A/YCjwWyDiZ1yZEJFQOzctVdUi4FzgVyJyUieG1ak6cIzZ4Azvdz4QOBj4pc/xmC5gycl0lT0BVPUhVU2oaoOqvqiqH4jIXsAdwOHeX8BbAUTkNBF5V0SqRWSViFzfVFlS6+TrIrJSRCpE5BdJy/NF5D4R2SIin+CetEhafo2IfC4iNSLyiYh8NWnZN7xW3d9EZDNwvYj0F5GnvFjeAnbL9MBVdQHwMbB/0j4uF5FFXnwviMjIpGUni8gSr4X5DxF5vemvfBG5XkT+neJ3aJFcRGQ3EXlVRCq93+cBESlNWr5cRH4uIh8AdSIS8spO9JZvTWr91Xn7GSUifUXkGRHZ5MX/jIgM87b5AzARuNXb7lavfFuXmYiUiMg0b/sVIvJLEQkk/fZzROTPXt1fiMgpGf7Oa4DngC+1J0bPiSLymbfNbSIimezbdD1LTqarfAokROR+ETlFRPo2LVDVRcAVwJte90+pt6gOuBQoBU4DviMiZzWr9yhgLHAC8Gsv0QH8BjeB7AZ8Gfh6s+0+xz1BleC24P4tIoOTlh8KLAMGAH8AbgMagcHA5d4nIyJyGPAlYKk3fxZwHXA2UA7MBh7ylpUB/wGuBfoDS4AjMt1X810DNwBDgL2A4cD1zda5EPe3LVXVePICVS31/nsUATd7ca7BPU/cC4wERgANwK3eNr/w1rvS2/bKFHH9Hfd3HwMcg/vf+LKk5YfiHncZ8Cfg7kyShIgMB04F3u1AjKfj/iGzH3A+7r8dkw1U1T726ZIP7gnyPmA1EAeeAgZ6y74BzGll+5uAv3nfRwEKDEta/hYw2fu+DJiUtGwKsHondb8HnJkUy8qkZUEgBoxLKvt/6eJNim0r7klRgT8D4i1/Dvhm0voBoB73RHopbpJuWibAKuBb3vz1wL9T7Cvkzb/WtG6KuM4C3k2aXw5c3myd5cCJzcou8MrL09S7P7Alab5FDF6Mu3u/ZQQYn7Tsf4DXkn77pUnLCrxtB6XZ93Kg1vutVwD/API7EONRSfOPANf4/f+NfdyPtZxMl1HVRar6DVUdhtuSGIKbcFISkUNFZKbXNVOF27oqa7ba+qTv9UDTxfAhuCf1Jiua1X2piLzndV1t9eJJrjt523IgtLP60ijz4vkJcCwQ9spHAjcn7XszbhIa2jxudc+S7RplKCIDRGS6iKwRkWrg37T8/Val2DS5jgNwWxxfVdVNXlmBiPzT65KrBmYBpSISzCCsMiCHHX+/FbjH3mTbf1NVrfe+7myQw1nqtvJGqup3VbWhAzGm+/dkfGbJyewSqroYtxX1paaiFKs9iNu6Gq6qJbjXpTK9BrAOtxuryYimL971nTuBK4H+6nYjftSs7uR4NuG29FLWtzPqXl/7C26X4He94lXA/3gn1KZPvqrO9eIelhSrJM/jdnUWJM0P2snub/COY19V7QN8jZa/X9rXEIhIOfAEbvfXu0mLfozblXqoV+/RTZu0VidQgdsKHZlUNgK3u7AzdSRGk4UsOZkuISLjROTHSRelh+Ne75jnrbIBGCYiOUmbFQObVbVRRA4BLmrDLh8BrvUujA8Dvp+0rBD35NTUEriM7UmyBVVNAI/jDowoEJHxtLyG1ZobgZ+JSB5ukr1WRPb29l8iIud56z0L7CMiZ3mDHL7HjgnoPeBoERkhIiW416bSKcbr8hKRocBPMw3W2/djwAOq+nCKehu8evvhXt9LtgH3elIL3m/5CPAHESn2/lD4EW6rrjO1O0aTnSw5ma5Sg3uhe76I1OEmpY9w/8IFeBV3RNt6Eanwyr4L/E5EaoBf457UMvVb3O6iL4AXgX81LVDVT4C/AG/inqT2Ad5opb4rcbt41uO2+O5tQyzgJp0twLdV9Qngj8B0r8vpI+AUL7YK4DzcgQCVwHhgAd6Qe1V9CXgY+ABYiDs8P53f4g6vrvL2/3gb4h2GO2DkqqQRe7UiMgK3KzYftxU0D3i+2bY3A+d6I95uSVH393FbgMuAObgt5HvaEFsmOhqjyTJNF2yNMVnAG2K9GrhYVWf6HY8xfrGWkzE+E5Evi0ipiOTiDjkXtnd/GtMrWXIyxn+H496HVQGcgTsarcHfkIzxl3XrGWOMyTrWcjLGGJN1LDkZY4zJOt35ycRtVlZWpqNGjfI7DGOMMcDChQsrVLU81bJelZxGjRrFggUL/A7DGGMMICJpHwtm3XrGGGOyjiUnY4wxWceSkzHGmKxjyckYY0zWseRkjDEm61hyMsYYk3UsORljjMk6veo+J2OM6e0WzZ7J7OnTqKmsoLh/GRMnX8peE4/b5XW0xtfkJCL3AKcDG1W1xZtJReRY4L+4L5ADeFxVf+ctm4T7ArEgcJeq3rgrYjbGGL90NCksmj2TF6feSjwaAaCmYhMvTr0VION6OqOOTPjdcroPuBWYtpN1Zqvq6ckFIhIEbgNOwn0x29si8pT3xlNjjMk6XZ1YVJVEPE4s0kissZFYpJF4JOLORyLEIxFevW/qtu2bxKMRXrrrH6z8+APi0aj7iUVJeFN3PkY8GiERi1FfXQXN3mYRj0aYPX1az0lOqjpLREa1Y9NDgKWqugxARKYDZwKWnIwxnaqzusFSJZZoYyOj9z+IaEM90cYGog0N7rS+2XxDAx+//nLKxPLcbX/j5bv/QawxgqrTrmOMNTaw/IN3CYXDhHJyt01z8gsoKCklFM4hlON+3n/puZR11FRWtGvf6fjdcsrE4SLyPrAW+ImqfgwMBVYlrbMaODTVxiIyBZgCMGLEiC4O1RiTTbqqteI4ypgDJxCpqyNSn/SpqyNSX0+kvtad1tURqa/li/cWkojFdqg7Ho3w8l23tRpDMBQinF9APBJJuVzVYZ/jTyaUk0c4N5dwXh6hHHcazvXKcnMJ5+bx2A2/oW7L5hZ1FJeVM+W2ezP6TZa9u4Caik0t6+hfltH2mcr25PQOMFJVa0XkVOBJYA/c11g3l/Ktiao6FZgKMGHCBHuzojG9RCbXRmKRRhpra2moqaaxtpbGuhoaa2poqK2hsbaG91+ckbK18vw//trq/nPyC8gtKCS3sLBFYkp28hU/ICevgJz8fHLy8skpKHCn+e4nGAoDMPV7l6VOCmXlHHvptzP6TY65+LIdfhOAUE4uEydfmtH2ABMnX9rhOjKR1clJVauTvs8QkX+ISBluS2l40qrDcFtWxpgeoq2tnkQ8TkNNNfVVW6mvruLV++9MnVhuv4lZD9xLY20t8Vg0bX2hnNwW2yc77htT3OTjJaBt3wsKySnIJxAIblt3Z4lln+NO3tnPsE1nJIWm368jrcnOqCMTWZ2cRGQQsEFVVUQOwb0vqxLYCuwhIqOBNcBk4CLfAjXG7KArutNeuONmln/wLn3KB9BQXUV9VRX11Vupr66moWorjXW1GdXtJBKM2v8g8oqKySsqJr/Ym3rzed58OCd3p0nlwFO+kvHxZEtiaaqno4mkM+pojd9DyR8CjgXKRGQ18BsgDKCqdwDnAt8RkTjQAExWVQXiInIl8ALuUPJ7vGtRxhifZdKdlojHqdu6mdrNlds+NUnf1yz5BHV2vLifiMf5ZNarIEJ+cR8K+pRQ0KeE8pGjKejTh4I+pRSUlJDvlT9z85/SXl/58hU/zOhYOqsLK5sSS3chqr3nMsyECRPUXjZoTNdK19oI5eTQb+hwajdXphyOHAyHKerXn6K+/VmzOP3fmlc/9N8duszSaZ4k3RhyOXnKlW1uxXV1F1ZvJSILVXVCqmVZ3a1njNn1WjsZqyoNNdVUbVhP1cb1VG3csH26aUPKxAQQj0YpLCll4Ojd3CTUr4zifv297/3JKypGxB3rtLPutEwSE1hrpbuzlpMxZptUrY1AMMTwvfcllBN2E9CG9cQijTtsV1BSSsmAgZQMGMSyd94m2lDfou62DFfurFaPyW7WcjLGpJSIx9iydg0Vq1dSuXolC55+nHh0xxFsTiLOig/epWzESEoGDGTEl/bzEpGbjErKBxLOy9u2frrE4sfFf9N9WXIypgdJ1yXnJBJs3bCOylUrqVi1wk1Gq1awZd0anEQCAAkEWgxC2Ebg6/93a0YxWHea6QzWrWdMD5GqxSKBAEV9+1FfXbX9RlARSgcMov/wEZQNH0n/Ye6075Bh3HPVlLTXejLtkjMmU9atZ0wPFYtG2LBsKes+W8LcRx5ocdOoOg711dUcMOkMyoaPpGz4SPoNHUY4Ny9lfbvq7n9jWmPJyZgskckouaqNG1j32WLWfrqYdZ8tYdOKZdu65dJJxGMc87XLM4rBrvWYbGHJyZgskPrG1b9TsXolOXn5rFu6hHWfLaG+aisA4dw8Bu2+JxPOOJvBe4xjyB5j+fd1V3fKAzntWo/JBpacjMkCs6dPS/EcuChvPfkoAH2HDGP0/hMYvMdYBu8xlrLhIwkEd7zfx7rkTE9iyckYHyXiMVZ88F7aG1cBvnv3Q+QXFbdal3XJmZ7EkpMxu5g6DqsXfcTiN2bx6fw3aKytAZEWj/MBd5RcJompiXXJmZ7CkpMxu4CqsmHZUha/8TpL3pxN7eZKwrl57DbhUMYdeQyNtdW8fNft1iVnjMeSkzGdIN1Iu8o1q1j8xiyWzH2dLevWEgiGGH3AQRzztcvZ7aBDd3iyQiAQtC45Yzx2E64xHZT6eXRBCvv2p6ZiI4gwYu99GHvEMex56JHkFRX5GK0x2cNuwjWmC6UaaeckEtRt3cyxl36bsYcfRVG//j5FZ0z3ZMnJmA5KN9LOSSQ46LQzd3E0xvQMlpyMaSd1HN5/+XlAgBQj7dp486sxZjtLTsa0w9YN63nxn7ew6uMP6D98JFXr1xGPbX/VhI20M6ZjLDkZ0wbqOLz7wrPMfug+AoEgJ035PvscfzKL57xmI+2M6USWnIzJ0Jb1a3nxjltYvegjRu9/ECd++0r6lJUDdvOrMZ3NkpMxrXCcBO8+9zRzpv+LYCjEl79zFXsfcwIi4ndoxvRYlpyM2YnNa1fzwu03s/bTRYw58GBO/Pb3KO5nAx2M6WqWnIxJwXESLHzmSeY+8gChnBxOufLH7HXUsdZaMmYX8TU5icg9wOnARlX9UorlFwM/92Zrge+o6vvesuVADZAA4unuMjamrSpXr+SF229m3dIl7H7wYZzwze9S1Lef32EZ06v43XK6D7gVmJZm+RfAMaq6RUROAaYChyYtP05VK7o2RNPTbXsuXkUFuQUFRBvqyS0q5rQf/JSxRxxtrSVjfOBrclLVWSIyaifL5ybNzgOGdXlQpldp/ly8SH0dEghw5HkXMe7IY3yOzpjeK+B3AG3wTeC5pHkFXhSRhSIyxaeYTDeX6rl46ji89dRjPkVkjAH/u/UyIiLH4Sano5KKj1TVtSIyAHhJRBar6qwU204BpgCMGDFil8Rrugd1nLTPxauptN5iY/yU9S0nEdkXuAs4U1Urm8pVda033Qg8ARySantVnaqqE1R1Qnl5+a4I2XQDkfp6nvzz/6Zdbs/FM8ZfWZ2cRGQE8Dhwiap+mlReKCLFTd+Bk4GP/InSdDdbN6znoV/9hC/eXcD4Y04glJO7w3J7Lp4x/vN7KPlDwLFAmYisBn4DhAFU9Q7g10B/4B/eiKmmIeMDgSe8shDwoKo+v8sPwHQ7Kz/6gKf/dgOocs51v2PkPvszap/97bl4xmQZexOu6TXee+FZXr3vn/QdPJSv/uzXlA4a7HdIxvRq9iZc06sl4nFm3vdP3n/pOcYceDCnfv+n5BYU+B2WMWYnLDmZHq2+uoqn/3YDqz/5iIPPPJejJl9CIBD0OyxjTCssOZkeq2Llcp78v99Tu2Uzp175Y7uOZEw3YsnJ9EhL357HjFv/Qk5+PhdcfyODdx/rd0jGmDaw5GR6FFXlrScfZc7D/2LQmN058ye/pKhff7/DMsa0kSUn02PEIo28cMctLJk7i3FHHsPJV/yAcLN7mIwx3YMlJ9OtbX+i+CYCoRBOPM7Ei77BwV85x54mbkw3ZsnJdFvNnyjuxOMEQ2GK+/W3xGRMN5fVjy8yZmdSPVE8EY8xe3q614MZY7oLS06m27InihvTc1lyMt3SsnffTrvMnihuTPdnycl0O8veeZun/vwHissGEMrJ2WGZPVHcmJ7BkpPpVj5fOJ///vkPlI0YxaV/vIWTp3yf4rJyEKG4rJyTp1xpT4Iwpgew0Xqm21i6YD5P//UGykeO5txf/p68wiL2mnicJSNjeiBLTqZbWPr2PJ7+240MGDWac37hJiZjTM9lyclkvc/emsszN/2RgaN355xf/I7cgkK/QzLGdDFLTiarfTZ/Ls/c/EcGjtmdc66zxGRMb2HJyWStT+e/wbM3/4mBu+3BOdf+zl4QaEwvYqP1TFb6dN4cnrnpjwzabU9LTMb0QtZyMllnyZtzePaWPzF4j3Gcc+315ORbYjKmt7HkZLLK4rmzmPH3PzNkz3GcfY0lJmN6K0tOJmssfuN1Zvz9LwwZuxdnX3s9OXn5fodkjPGJJSeTFRbNeY3nbv0rQ8eN56vX/MYSkzG9nCUn45vkFwUC9BsyjLOvuZ5wXp7PkRlj/ObraD0RuUdENorIR2mWi4jcIiJLReQDETkwadkkEVniLbtm10VtOkPTiwKTX3tRXbGRpW+/6WNUxphs4fdQ8vuASTtZfgqwh/eZAtwOICJB4DZv+XjgQhEZ36WRmk6V6kWB8WjUXhRojAF8Tk6qOgvYvJNVzgSmqWseUCoig4FDgKWqukxVo8B0b13TTdiLAo0xO+N3y6k1Q4FVSfOrvbJ05S2IyBQRWSAiCzZtSn1CNLtWdcUmJJD6n569KNAYA9mfnCRFme6kvGWh6lRVnaCqE8rLyzs1ONN2kfp6nvjjbwkEgwTD4R2W2YsCjTFNsn203mpgeNL8MGAtkJOm3GQxJ5HgmZv/SOXqlZx9zfU0VFe5o/UqKyjuX8bEyZfau5mMMUD2J6engCtFZDpwKFClqutEZBOwh4iMBtYAk4GLfIzTtEJVefXef7L8vYWcNOVKRu3nDry0ZGSMScXX5CQiDwHHAmUishr4DRAGUNU7gBnAqcBSoB64zFsWF5ErgReAIHCPqn68yw/AZOydGf/l/ZdmcPBXzmHfE3Y2QNMYY3xOTqp6YSvLFfhemmUzcJOXyXKfvf0mr/3rbvY49AgmXvh1v8MxxnQD2T4gwnRz6z//jBm3/JlBu+3BKd/7UdpResYYk8zOFKbLVFds5Mk//Y6CkhLO+umvCOfaY4mMMZmx5GS6RKS+nidu/C2xSISzr7mewtK+fodkjOlGLDmZTpeIx3n6bzewee1qvvKj6+g/bITfIRljuhlLTqZTuUPG72DFB+9ywje/y8h99/c7JGNMN2TJyXSqhc88wQcvP88hZ57Lvid82e9wjDHdlCUn02k+mz+X1x+4lz0PO4qj7DFExpgOsORkOsW6pUuYcetfGLzbnkz63tU2ZNwY0yF2BjEdVr1pI0/+6fcUlJRy1s9+RTgn1++QjDHdnCUn0yGR+joev/F6ErEYZ19zPQUlpX6HZIzpAbL9wa8mSy2aPdN9orj30sBDzjqX/sOGt7KVMcZkxlpOps0WzZ7Ji1Nv3eFttu/MeJpFs2f6GJUxpiex5GTabPb0acSjkR3K4tEIs6dP8ykiY0xPY8nJtFlyi2mH8sqKXRyJMaansuRk2iRSX592mHhx/7JdHI0xpqey5GQypqq8+M9bUMchGA7vsCyUk8tEu/HWGNNJbLSeydj7L87g03lzmHjRNyju198drVdZQXH/MiZOvtReuW6M6TSWnExGNixbymvT7mT0/gdx8BlnI4GAJSNjTJexbj3Tqkh9Hc/c9EfyS0qZZG+zNcbsAhmdZUTkSBEp9L5/TUT+KiIjuzY0kw1UlRfvuIWqTRs4/Qc/o6BPid8hGWN6gUz/BL4dqBeR/YCfASsAu6mlF3jvxWf5dP4bHDX5UoaOG+93OMaYXiLT5BRXVQXOBG5W1ZuB4q4Ly2SDDcuW8vq0uxh9wAQOPuNsv8MxxvQimQ6IqBGRa4GvAUeLSBAIt7KN6cYi9XU8fdON5JeUcopdZzLG7GKZnnEuACLAN1V1PTAU+L+O7lxEJonIEhFZKiLXpFj+UxF5z/t8JCIJEennLVsuIh96yxZ0NBaznarywh03U71pI6f/8OfkF/fxOyRjTC+TacvpalX9edOMqq4Ukb07smOv9XUbcBKwGnhbRJ5S1U+S9vN/eElQRM7w4ticVM1xqmrPzOlk773wDJ/Nn8vRF1/G0LF7+R2OMaYXyrTldFKKslM6uO9DgKWqukxVo8B03Gta6VwIPNTBfZpWrP/8M17/192MOfBgJpz+Vb/DMcb0UjtNTiLyHRH5EBgrIh8kfb4APuzgvocCq5LmV3tlqeIoACYBjyUVK/CiiCwUkSkdjMUAjXW1PHPTjRSU9GXSd+1V68YY/7TWrfcg8BxwA5B8TaimWfdae0iKMk2z7hnAG832eaSqrhWRAcBLIrJYVWe12ImbuKYAjBgxooMh91xN9zPVVFZwwfU32nUmY4yvdvqnsapWqepyVb0Qt2UTw00gRSLS0TP9aiD51anDgLVp1p1Msy49VV3rTTcCT+B2E7agqlNVdYKqTigvL+9gyD3Xu88/w2dvzWXihV9nyJ52nckY469MnxBxJbABeAl41vs808F9vw3sISKjRSQHNwE9lWLfJcAxwH+TygpFpLjpO3Ay8FEH4+m1tl1nOugQDrLrTMaYLJDpaL2rgLGqWtlZO1bVuJf0XgCCwD2q+rGIXOEtv8Nb9avAi6pal7T5QOAJEQH3GB5U1ec7K7bepOk6U2Ff7zqTpOptNcaYXSvT5LQKqOrsnavqDGBGs7I7ms3fB9zXrGwZsF9nx9PbqCov3H6zd53pj+QX2UM/jDHZIdPktAx4TUSexb0ZFwBV/WuXRGW6zKLZM7e9hym3oJBIXS3HXPJNhuw5zu/QjDFmm0yT00rvk+N9TDe0aPZMXpx6K/Go+/dFpK4WCQQoKCn1NzBjjGkmo+Skqr8Fd/BBs2s/phuZPX3atsTURB2HOdOnMd5eHGiMySKZjtY7XEQ+ARZ58/uJyD+6NDLT6WoqUz/pKV25Mcb4JdNHANwEfBmoBFDV94Gjuygm00WK+5e1qdwYY/yS8fNpVHVVs6JEJ8diuthhZ13QoiyUk8vEyZf6EI0xxqSX8VByETkCUO+G2R/gdfGZ7mPNko9BhMKSUuqqtlLcv4yJky9lL7veZIzJMpkmpyuAm3EfzLoaeBH4XlcFZTrf5wvn88nsmRx2zoUcef7FfodjjDE7lelovQrAzmjdVENtDS9NvZXykaM57Ozz/Q7HGGNatdPkJCI/U9U/icjfSfHEcFX9QZdFZjrNzPum0lBTzdnX/pZgKOx3OMYY06rWWk5N15XsNejd1NK357Fo9kwOP/dCBowa43c4xhiTkZ0mJ1V92pvev2vCMZ2poaaal+50u/MO/ap15xljuo9Mb8J9SURKk+b7isgLXRaV6RSv3vtPGmtrmPTdq607zxjTrWR6n1O5qm5tmlHVLcCALonIdIrP3n6TxW+8zqFfvcC684wx3U6mySmR/OZbERlJ+leqG5811FTz8p23UT5qjHXnGWO6pUzvc/oFMEdEXvfmjwamdE1IpqPc7rxazv3F7wmGMv1PbIwx2SPT+5yeF5EDgcMAAa727n0yWeazt+ay+I3XOeL8iykfOdrvcIwxpl122q0nIuO86YHACGAtsAYY4ZWZLFJfXcXLd/2DAaN345Azz/M7HGOMabfWWk4/wu2++0uKZQoc3+kRmXbb1p33y/+17jxjTLfW2hnsJW/6TVVd1tXBmPb7bP5clsydxZHnf43yEaP8DscYYzqktdF613rT/3R1IKb96qurePlutzvv4DPP9TscY4zpsNZaTptFZCYwRkSear5QVb/SNWGZtnj1njusO88Y06O0diY7FTgQ+BeprzsZn306bw5L3pzNkRdcYt15xpgeo7XkdLeqXiIid6rq662sa3YxtzvvdgaO2Z1DrDvPGNODtHbN6SDvaRAXe8/T65f86ejORWSSiCwRkaUick2K5ceKSJWIvOd9fp3ptr3BK3ffTrS+jknfuYpAMOh3OMYY02laazndATwPjAEW4t6A20S98nYRkSBwG3AS7tt13xaRp1T1k2arzlbV09u5bY+15M05fDpvDkdNvpQy684zxvQwrb0y4xbgFhG5XVW/08n7PgRY2jREXUSmA2cCmSSYjmzbbS2aPZPZ06dRU7EJEaFP+UAO/so5fodljDGdLqMHv6rqd0TkKBG5DEBEykSko8/GGQqsSppf7ZU1d7iIvC8iz4nI3m3cFhGZIiILRGTBpk2bOhiyfxbNnsmLU2+lpsI9BlWlbusWlsyd5XNkxhjT+TJ9n9NvgJ+z/b6nHODfHdy3pChr/qTzd4CRqrof8HfgyTZs6xaqTlXVCao6oby8vL2x+m729GnEo5EdyhKxKLOnT/MpImOM6TqZvjLjq8BXgDoAVV0LFHdw36uB4Unzw3Cf3beNqlaraq33fQYQFpGyTLbtaWoqUz9nN125McZ0Z5kmp6iqKl7rREQKO2HfbwN7iMhoEckBJgM73OgrIoNERLzvh3jxVmaybU9T3L+sTeXGGNOdZZqcHhGRfwKlIvJt4GXgzo7sWFXjwJXAC8Ai4BFV/VhErhCRK7zVzgU+EpH3gVuAyepKuW1H4sl2B57S8mEcoZxcJk6+1IdojDGma4nbIMpgRZGTgJNxr/e8oKovtbJJ1pkwYYIuWLDA7zDa5Yk//Y7l779LQZ8+1G7ZTHH/MiZOvpS9Jh7nd2jGGNMuIrJQVSekWtaWB7F9AOR639/vcFQmY1+8u4BlC9/i6Isvs6HjxpheIdPReucDbwHnAecD80XEnpezC8RjMWbeP5W+Q4Zx4Kn2nF1jTO+QacvpF8DBqroRQETKca872as0utjCZ59ky7q1nHPtbwmGwn6HY4wxu0SmAyICTYnJU9mGbU071WyuYP7jD7P7wYcxav+D/A7HGGN2mUxbTs+LyAvAQ978BcCMrgnJNJn173tRx+HYS7/ldyjGGLNL7TQ5icjuwEBV/amInA0chTta703ggV0QX6+16pMPWfzG6xx2zoWUDBjkdzjGGLNLtdY1dxNQA6Cqj6vqj1T1atxW001dG1rv5SQSvHrvP+lTPoBDzrTRecaY3qe15DRKVT9oXqiqC4BRXRKR4f2XZlCxcjnHXvItwrl5fodjjDG7XGvJaWdnxvzODMS46qureOORfzNin/3Z/ZDD/Q7HGGN80Vpyett7XNEOROSbuC8fNJ1szkP3E2ts5Phv/A/eYwWNMabXaW203lXAEyJyMduT0QTcV2Z8tQvj6pXWL/2UD2e+xEGnnUX/YcNb38AYY3qo1t6EuwE4QkSOA77kFT+rqq92eWS9jDoOr9x7B4UlpRx+zoV+h2OMMb7K6D4nVZ0JzOziWHq1j19/hfVLP+WU7/2I3IICv8Mxxhhf2VMeskBjXS2zHryPIXvuZU8ZN8YYLDllhTcffZCGmmqOv8wGQRhjDFhy8l3FyuW8+8Iz7HfiJAaO2d3vcIwxJitYcvKRqvLqvf8kt6CQIy+4xO9wjDEma1hy8tGn8+aw6pMPOfKCS8gv7uN3OMYYkzUsOfkk1tjIa/+6m/JRY9j3xC/7HY4xxmQVS04+mf/kI9RWVnDCZVcQCAT9DscYY7KKJScfbFm/lgVPP85eE49j6LjxfodjjDFZx5KTD167/04CoTBHX3yZ36EYY0xWyvRNuKaDFs2eyezp06ip2ATA2COPoahvP5+jMsaY7ORry0lEJonIEhFZKiLXpFh+sYh84H3mish+ScuWi8iHIvKeiCzYtZG3zaLZM3lx6q3bEhPA52/PY9FseyKUMcak4ltyEpEgcBtwCjAeuFBEml+A+QI4RlX3BX4PTG22/DhV3V9VJ3R5wB0we/o04tHIDmXxaITZ06f5FJExxmQ3P1tOhwBLVXWZqkaB6cCZySuo6lxV3eLNzgOG7eIYO0VNZUWbyo0xprfzMzkNBVYlza/2ytL5JvBc0rwCL4rIQhGZ0gXxdZri/mVtKjfGmN7Oz+SU6gmnmnJF931S3wR+nlR8pKoeiNst+D0ROTrNtlNEZIGILNi0aVOqVbrcEee2fD9TKCeXiZMv9SEaY4zJfn4mp9VA8utehwFrm68kIvsCdwFnqmplU7mqrvWmG4EncLsJW1DVqao6QVUnlJeXd2L4mYs2NABQUFIKIhSXlXPylCvt9RjGGJOGn0PJ3wb2EJHRwBpgMnBR8goiMgJ4HLhEVT9NKi8EAqpa430/GfjdLou8DeLRKG899RjDx+/D+b+5we9wjDGmW/AtOalqXESuBF4AgsA9qvqxiFzhLb8D+DXQH/iH956juDcybyDwhFcWAh5U1ed9OIxWffjqC9Rt2cypV/7E71CMMabb8PUmXFWdAcxoVnZH0vdvAd9Ksd0yYL/m5dkmHovx1n//w9BxezN87338DscYY7oNe3xRF/po5kvUbq7k8HMutDfcGmNMG1hy6iKJeIy3nnyUwXuOY8Q+Wd/IM8aYrGLJqYt8/Por1FRu4ghrNRljTJtZcuoCiXic+U88yqDd92Tkfgf6HY4xxnQ7lpy6wCezX6V60wa71mSMMe1kyamTOYkE8594hIFjdmf0AVn9PFpjjMlalpw62aI5r1G1YT2HWavJGGPazZJTJ3JbTQ9TPmoMux2U8mlKxhhjMmDJqRMtmTuLLevWcvg5k63VZIwxHWDJqZM4ToI3H3+YshGj2H3CYX6HY4wx3Zolp07y6Ztz2LJ2NYedPRkJ2M9qjDEdYWfRTqCOw7zHH6b/sBHseegRfodjjDHdniWnTvDp/LlUrl7JYWdfYK0mY4zpBHYm7SC31TSdfkOGsefhR/kdjjHG9AiWnDpo6YJ5VKxczmFnX0AgEPQ7HGOM6RF8fZ9Td6eqvPnYdPoOHsLYI472OxxjjNklHlu/mRuWrWNNJMbQ3DDXjhnMOYP6deo+rOXUAZ8vfItNy5dx6FcvIBC0VpMxpms9tn4zE+Z+zOCZ7zFh7sc8tn7zLq/jsfWbuWrRClZHYiiwOhLjqkUr2hXLzljLqZ1UlXmPPUTJwEHsddSxfodjjMlyHW1tNCWFGO4N/k1JAci4nnR1OChfGdCXuKPE1P3EVYk5SlzZYf7nSds3iSFct2h5p7aeLDm10xfvLmDDsqWcfMUPrNVkTA/WGV1YO0ssZw3sS2PCocFRGhyHhoRD47ap0pBwaHAcfpImKVy9aAXzquqIOA4RR4k6uu17o+PWEXEcoo6yqiGCSss6vr9oFd9ftCrDo0n99Jsq7dyn4lhyagf3WtND9CkfyPiJx/sdjjEmja5orfxw0Qo2x+JM7FdMXdyhNuFQm0hQG3eoSySoS3hl8cS2ZS9s2ko8RWL53icr+N6ilRlGI+TWvkFh1aMEEpU4wf7UlZxHpPAIHl61gYDjEFBF1CHgOASdBEHHIaiOO3USaN8Baes4ZPmibXUE1HE/TtP37dPX9tyfY+Y9yOUzXqGsyqGiJMA9p57AG4dMzvh3zYQlp3ZY8f47rF/6KSdNuZJgyH5CY7JR+taKMqmslC3xBFtjcbbGE2yJJdiy7bs73RpL8GLFVhLNkkoc4VdL1+5036JKSJWgJgglEsTDueTWpU4K+638lNx4jJxEnJDjrh90Etu+N01n7BnihDfv4aLXYvSvhso+G3jw2H8y87Aokz+uhUAQgkEkGESCISQYJBAMEgwFCQRDBENB7pRPOG7evSnruHTolwiFgoSDQcLBkDsNBckJBckJhggGhEAowKA7/5cLXnyPvLh7rAOqHK569CUGV1fCKZ33EAI7s7aRqjL3sYcoLitn72NO8DscY3qstrR6EqpURuNsiMbY6E2vW7wyZTeY21JJ34UVVCVHHcKJBIlQOG1SOXHRAsKJODmJOOF4nHDCSzBeQhFAAQ2FeXh8QdqkcE7RKHJzCsnNCZMbCpOTIwRDEAopwTAkJIETcIhN+znffi62LSmUV8P/zIgR0PsY9fWriCaixJwYUSdKLBEh5sSIOTHqmsoTUY5/7lWmPJfYoY4rZsTIid7FIxNGQCyGk4hDLI4mEhBPQDwOiQQaTxBy4OrXtm/fJC8Op816t33/odMQVe3UCrPZhAkTdMGCBR2qY8UH7/GfP/ySE7/1XfY76dROiswYk6x5qwcgiHL2wL4My8tlQzTGhkicjdEYG6MxNkXjOCnqSdeFte/qpRRGGimMNFAQi5Abj5Ebi5IXjxJy3JoUmL5vSbOkAg8eG2bmYZdxbcE4wrkQDDuEwxAKOyQCMeISJypRIhoh4kSoj9fz+SPTmJKUWAAiIbj3xACr9hmARhqhMYJGouTGlJw45MYgJw453vS82Q5FkZbH2BiC93cTQnEIJSDHEcIJISchhBNuWSihhBJQWJvosiHaDrD34kVt2kZEFqpqyreyWsupDdxrTQ9S1K8/ex97kt/hGJO1Mm31qCqbonFWNkZZ0RBhZWOUlY1RHllX2aI7LYHw6IatCJCPkp+IkxOLkhdtZI/Gegoa6imtr6WksY6CaCPP7hlO21o5OtGPvOJ88gaUkJMP4VyHcG6CYDhOPBClgQbqEnUc//C9OySVppZG+dY7mTE8QF5UyY9CfgR3GlXyolAQgbwolERhSCzAl1e7rY5kuXG44nkHnl/fod86Nw4jVpUSC4SIB0JEAyEagmGqAiGiwTCRHHcaC4Q4tXZeyjoUuGOfs4gHAsQliONNE4EACQkSDwRJSIBEIMjP3p1K3/qWjZqK4s5Ne74mJxGZBNwMBIG7VPXGZsvFW34qUA98Q1XfyWTbzvTju//A86MOpVL60f/ok5m0fD6hcLj9dehmJi2fz1+++YtuWUc2xWJ1ZF8dj63fzNxnb6dh1KGo9KOhYR1zn32S94/+OkPzcljZEGVFY5SVDVFWNUZocHY80RWiJBS+9sWTPDfqqG1xnLJ8Dv8efSbfnvXfbX/9OxIgkZePFBSQU1hIQf8+5Bb3JVzg0Pjs/1I89ES+c8Op2+o4/cMZnPr6XSwZPwhnUzWB2noKG6GoAYoaoahRt82XN8KJa5XHLz6aRw47l0rpT3+t5Px5/+Gif80CEimPPxYIEg2GiATDNAZzaAzmEnTW8ez5h3Hf0RdSESijzKngG7Me4tRH5vH3/c5xk8i2Tw7RYJjGYNgrzyESDHPPa39g1ukHtKjj6Gff41fHXUsIIaTuJ6xCCCGoJE1hYsU7zD71wBZ1TJzxDnkDjyeoEEAIAgF1T64BIKjiToF5h+xObFB//nXU9joumfMQ4fWVHNOmf2k751u3nogEgU+Bk4DVwNvAhar6SdI6pwLfx01OhwI3q+qhmWybSnu69X589x94dPQJRCVvW1mONnLeF69k/D9sT6ojm2KxOvyroy6RoCIapzIapyIWpyJpWjfrvrR1PDDmNPIEitUhPxYlt6GO/LpqSqu3MqBmCyUNdYSdBLXD4ZHRk1LU8Rx7jtuTQLiRBqmjuqGSuk3raNy0gfjmSmRLNUV1CfrUKZsPmMT0fc9vUcdF7z/C1//5XMrjjwUDXlLJpS6Uz7yzxnLP4Ze1qOPyN+/lvc/H0RDKpSGUS304j/pQLo2hXBwJEFIlVyFXhVwVzih5nDuO/FaLeq544y6+2HQ+YYUwQliVPI2TJxHypZG8QITcQIS8QJSPd9/IA2NPa1HHxUue5eANCUS8Qd4SQBCEAIgg6qabgASYXdbAA2NPTVHHDE7eMIwAAUQD7pQAAQ0SIECgqQ4NcP/4FTwx6PAWdZy17g1uufjHGf07a7Kzbj0/k9PhwPWq+mVv/loAVb0haZ1/Aq+p6kPe/BLgWGBUa9um0p7ktPcrL1MZKGtRHtIou8WXZ1TH56FRxCWnR9SRTbFYHd2vjjEZ1aEsC41OH0fsi51tuj2OnPR1jI5+4a4qTZtI880BWBlOfyzD45kOAYdVoRFtrKflPUOrQsPbHkuzalYFdxJHYiUtf4GWVgVHpqyjr1PBohNObHX7HcLL0mtOQ9lxyMxq3NZRa+sMzXBbAERkCjAFYMSIEW0OslJSjw6KE055ATbduj2ljmyKxerofnVk9qew7DwO2cnNnrLjumnjC8i2VZNra17zzuoIObGUATS/F1VbOR5p+mVFkn6flr/UTo9HMvtld1pHhg2VdHVsSXOubC8/k1Oqf2HNf51062SyrVuoOhWYCm7LqS0BAvTXzVRKy5ZTf63k3FfnZFTH1JP69Zg6simW7lDH5JdeJx4Mtrgrv7k7T0xfxzkz38gojq6u49yX3/G6i4KgbvePqGz7DkFQ4bYz0tdx1ou1qAYRDRJMeB8nRKDZGf3v51amreOC+SsoZgslVNJXN1Pk1FHoRMhzYuSog3t6CHDS8b9KW8dv5nxAhDwi5BDTEFGCxIAYSkTiRCVOhBiVR6c/lhPmLXFntl3XEYKOe61GHAdxHEjEIRHn7tP7p/9NHngM1Fs/aargvh8uEEADwn1f/27aOr7yn2fd9cTtykMC7r85b14D7vTB00rZLOUt6uinlZw68y0kgNsVKEpAINA0JUFQlCAJbj+qL5tTxNFPe86z9VYDw5PmhwHN72xLt05OBtt2iknL56fsP5+0fD4/vPGWjOpYmaYfvzvWkU2xdIc6jn/6VQIFBZScfTb9LvkaOSNHpqxj1U7quOqGmzOKo6vr+OGfWh9zpI7y+b3/L20dQ0tOpKqikXhk+2ACBSJBh4ZAglqUWg0wafmHPDq65XWNScs/RNYcRC1QC6wB6nOEmvwA1QUB6vOURDhCrlRx3qrF3DNiQos6Lli9mEOZSo7ECIuzw9BqVUEpwNFiYlLMujVhnhp2bIs6jlnzNodJoZvYNEhcA8QQ4gIxSRALxomSICZxYiSYuGY+M4a1/E0mrp1P/ei90vyYEEQIqBBQ0tZxzJq3CRcPBicB6oCTQDUBjoM6CdA46iRQJ86xa97imRR1HLtmPrlrloMqouruXHXbvHrP24uJcMqQuTy628kt/9ssexPa2K23M35ecwrhDmo4Afff2NvARar6cdI6pwFXsn1AxC2qekgm26bS3vucsmEEVDbVkU2xZHsdDR9/zJZp06ia8RzE4xQddxz9vv51Cg45GGnWmsr2Y8nUA498wjs1T7So48Dir3Lx+eNRVRprY1RVNFBd0UB1RaM3baB6UyO1WxqJBGD1ge/z/Kh9kur4kGHv7Me6YIQGDRDH7ZoLBYSwBChUKEoIhd6w76Fh4YMJi3h42J7b6rhg9afst2APnhucT32u0BhWglJPvlZRnNhMv9gGyqPrGRRZzYDEZmJ8m0fHreX1oQdvq+OYNW9z3uIhHJfzgxbHrgpKHkoBcQpIBAqIBQqZGvsyn+/hMHvI9t9k4tr5jFoKE0MJ4hr2PkHiGiThJbwE4n4UPguuY/3u4RZ1DFoao4g8Ejg4OCRwSKBomq6+9bulqOPzVF2UaSgp4xjzmfCz312XeT1k6YAI2DYa7ybcEYr3qOofROQKAFW9wxtKfiswCXco+WWquiDdtq3trzNuwjWmPWIbN7LloYfYOv1hElu2kLvXXvS79FL6nHYqgZyWF5e7uwce+YQ1r6+nIKHUB4Whxwzi4vPHZ7RtIu5w+5UzUXFbDE0ccR8LVFCcQ0NtLGVHvoYcYoEEEUlQFMllWDjA+Lwg+QFocOCTxgSrYw5VYSE/AblpLqQ5Ag05wljHoai4kndDy6iVRoo0jwPiY6ivLeb+vYLkOnXkazWFTjV94lsoiW2mNFZJv1gNpfFqShI1FGkda4M/Z054BQnZvsOgBjgqNjJlkmtxXAp/1p9RF2iZRAqdHKaEn8eRMI7k4EgYlTBxDREnl7jkkMBNfk81DqIhEG1RR56GOSwYxNEACQI4GsBBcAjgKNvmFfhAKtJeWLn+t9e3eizJsjY57WqWnIzfnMZGqp5+mi3TphH5bCnBsjL6XjiZvpMnUzd3Lhv/dhPxdesIDR7MgKuvouSMM/wO2Rd3/GQWidp4i/JgUYgr/nw0iYRDQ3WM+uoI9VVR6qoi1FdHd/i+amU1OSluRYoG2V4ecNBAgri4LY443isixL0JdVA0lDLBrYmlP28qEAkLjWEh4n2OqI5QVLQlRZLrwz/GFxGQGCEihLWBHBrJ1QbynFoKnFqKEjUUJWrYv6KIeTkFLRLcYdF6hvM0uUQJE/c+CYKSIEiCYEC9a0fKrNhNzM1pmSSPiI7khNzWkyTA/znpkmSYn/6uba10S04eS04mW6gqdXPnsnnaNOpenwVNr11JbD+bSl4eg3//u16ZoD6dv56X/7UIjW8/P0lIOPGSvdjz0EEZ1fGPK18mkQi0aH0FxOGoc8cSqY8TqYsRqY/TWB8jUhcnUh+jsd6dOnGlOl/o09DyHFmTJxQ3KogD4qDioCgJlIRALCA44rY2BKEkEmhzkkvmjgJzyC+soKLwC+olQoHmUlY3mkhdX5YMLiAehHhA3GlQiAeERBDiAUgE3Om3F1VRUFjNu+EvtifJ2Gga64q4bX8hQIygxAlqjJDGCBIjRIywRglrhDAxzlxWlSZJNnDSDTu9m6cFS04eS04mG0WWLeOLc89D6+tbLAsNGcIer77iQ1T++3T+et787+fUbo5Q1C+Xw8/cLePE1LT9S/d+zI59UMpJl+3daj2qSjzm8MvrZzO4yiGc1AKLBWFdSYBzjhhJLJJwP43x7d+3lSWIRdzyLWF2nuTScnBEcQSCTgBJ0Z+mKHU5igDiDZ4QhYC6T4YINKt+aFjanSSb9phfuKlFkqQxyOW3ndeGerL3PidjDJA7Zgza0JByWXztWtRx3CHFvcyehw5qUzJKtT3QrgQnIoRzgoyPxvikJIfSBofiBqUmX9iaH2B8NMohp4/OOJZrfj2T/CgtktzWYrjw2/uRiDrE4wniUYdEzHGn3nw85pa988aalN2UsaAwsn8+ibiDE3dIxB0SCSURV5zEDo1xavKENY3KmtiOXaZ1OUJhNPNWXEPdAArrBlDolTXgJsnOZMnJmCwQGjyY+NrUd0MsO/0M+n/rW5ScfhrSAwdPdKWOJrjDz9uHxn99TDzutlj6NCj9YnEOv2SfNtVz+Wl7cc9Tiymp121JrqpAuPz0cYzcu39GdXw8dxUJadlNmSsOk3+T/j1KqorjKImYw6//9zXyYoEWSXJzscOl35qAk1CchKIJJZFwts87ipNwk94LDy5OmyQ7U+/7c8yYLDTg6quQvLwdyiQvj9KLLkTCYdZddx1LvzyJzdOm4aTo/jNdY89DB3HcJXtT1C8XgKJ+uRx3Sevdgqnqufwr4xiSn4MAQ/JzuPwr49pUz4mXfIlAs8swAVVOvORLO91ORAgGA+Tkhbh8/1rWlwjV+e7Iu+p8YX2JcPkBNQwaXcKQ3UsZNrYvw8f3Y9Q+ZYzZv5zdDxrAHgcPZOxhgxl/5BByxcFploeakmRnsmtOxmSJqqefTjlaT1WpmzWLijvvpGHBQoKlpfS95Gv0u/higqWlfodtdqGOXocD+PQ/T/Lma3Fq46UUhbZy+LEh9jz3rDbF0N5rec3ZgAiPJSfT3dW/8w6VU++k9rXXCBQUUHrBBfT7xtcJDxzod2imF+mMJAmWnLax5GR6isYln1J5111Uz5gBgQClZ51Jv8svp/Gjj+xeKdNtWHLyWHIyPU101So233svW//zGBqNQiAAzva+/958r5TJfjtLTjYgwphuLGf4cAb9+tfs/uorBIqKdkhMANrYyMa/3eRPcMZ0gCUnY3qAUFkZTl1dymXxtWupfu45nDT3UhmTjew+J2N6iLT3SgUCrLn6RwQKCig+6UT6nHYahYcfjoRTvzTOmGxgycmYHmLA1Vex7le/Rhsbt5VJXh6Dfns94YGDqH72GapfeJGq/z5FsG9f+pwyiT6nn07+/vv3yidQmOxmAyKM6UHS3SvVxIlGqZs9m+pnn6Xm1ZloYyPhIUPoc9pp9Dn9dPLG7tlqHcZ0Fhut57HkZMx2ido6al99hapnnqHujbmQSBAcOJBEZSXEtz97zUb8ma5iycljycmY1OKbN1P9/PNsvOFGNNbyXT2hwYPZY+arPkRmejIbSm6M2alQv370u+giNN7yBX8A8XXrWPvzn1P1zLPEt2zZxdGZ3sgGRBhjtkk34k/y86mdNZuq/z4FgQD5++5L4dETKZp4NHl7j7cBFabT2b8oY8w26Z6OPvh3v2WPObMZ9fB0yr7zHTSRoOLvt7L8vPP4bOLRrP35NVTPmEGiqgpwB2Z8dvwJLNprPJ8dfwJVTz/tx+GYbsyuORljdpDpaL14ZSV1c+ZQO2s2dXPmuIkpECA8fDixNWtsUIVplQ2I8FhyMqZraCJBwwcfUDd7NhV33gUpBlUEy8rY47WZSMiuJhiXJSePJSdjut6ivcZDmvNKoLCQ/P33p2DCQRRMmEDevvsSyM3dxRGabLGz5GR/whhjOlW6QRXB0lKKT5lEw4KFbLr5FgAkHCZvn30oOOggCiYcRP4BBxDs0wfIvHvR9Ey+tJxEpB/wMDAKWA6cr6pbmq0zHJgGDAIcYKqq3uwtux74NrDJW/06VZ3R2n6t5WRM16t6+umUj1FKvuaU2LqV+nfepX7hAhoWLKTh44/da1Qi5I4dS7BfPxrefnuHe67sulXPk3XdeiLyJ2Czqt4oItcAfVX1583WGQwMVtV3RKQYWAicpaqfeMmpVlX/3Jb9WnIyZtdoa6vHaWig4f0P3GS1cCF1b85L2TUY7NuXUY8+SnjoEEQkRU2mO8nG5LQEOFZV13lJ6DVVHdvKNv8FblXVlyw5GdOz7ey6FUCguJi8sWPJHTeOvHFjyR07jtw9difQbBi8dQ1mt2y85jRQVdcBeAlqwM5WFpFRwAHA/KTiK0XkUmAB8OPm3YLGmO4r7XWrsjLKr7ySxiWLiSxeQtXjj7Olvt5dGAiQM3o0eePGkTtuLImtVWz597/RSARw32u17le/BrAE1Q10WctJRF7GvV7U3C+A+1W1NGndLaraN009RcDrwB9U9XGvbCBQASjwe9zuv8vTbD8FmAIwYsSIg1asWNHuYzLG7BqZXLcCUMchtmoVjYuXEFmy2J0uXkws1XutPMG+fRlx373kDB9OoKAgo1is9dU1um23noiEgWeAF1T1r2nqGgU8o6pfam2/1q1nTPfRkaSQqKri00MPa3W9YHkZOcNHkDN8OOGRI9zvI4YTHjGCYGkp1c88k1GSNO2Tjcnp/4DKpAER/VT1Z83WEeB+3IETVzVbNripW1BErgYOVdXJre3XkpMxvcdnx5+Qtmtw0HXXEl25iuiqlcRWriK6ciXxDRt2WC9QVITT2LjDky6ahAYNZPeZM9s0KMNaYC1lY3LqDzwCjABWAuep6mYRGQLcpaqnishRwGzgQ9yh5OANGReRfwH743brLQf+pylZ7YwlJ2N6j0y7Bps4jY3EVq8munIVsVUria5YyZYHH0xbv4TDhMrLCQ0cSGjAAO9TTnjAgB3KAoWFndYC62kJLuuSk18sORnTu3T0ZJ6u9RXo04e+F5xPbMMG4hs3Ed+4kfjGjTi1tS3WlYICd1BGItFiWbBvKUP+/GeCpaWESksJlpYiBQUpW2RtTbbpZFOCs+TkseRkjGmLNre+6uqIbdy4Q8KKb9zA5vunZbxPCYcJeokq+VP93HMpk1+ovJxRjzxMoKiIQEEBEgx22vHsrJ7OSHCWnDyWnIwxbdUZJ+J0LbBQeTlD//ZXElu37vCJJ89v8aaVlRntSwoKCBQWECwodBNW4fZpzSuvoE1D75ME+/ZlyB9vRHLzCOTnIXl5BPLzCeTlIfn5BHJzkXB42+/RWYNELDl5LDkZY/zQGSf0z44/nvjalpfWg31LKb/6apy6epzaWpy6Ou9TS6Lpe607ja1a1f6DCIUI5OXh1NeD47RcPGQIe7z6SpuqzMabcI0xptdoSkAdaYENuPrqlAlu4HXXtSHBpRnBWF7O8Fv/jtPQiEYacRoacRob0Eb3uzY2bCvbMu1fKeuOr2t1TFqbWHIyxphdoOSMMzo08KBzEtxVqRPcz35K/n77ZVRHzcuvpO6iHDw44zgyYcnJGGO6iWxOcAOuvqrdcaViyckYY3qRbEhwmbDkZIwxpk06muAyEejS2o0xxph2sORkjDEm61hyMsYYk3UsORljjMk6lpyMMcZkHUtOxhhjso4lJ2OMMVmnVz34VUQ2ASt82n0ZUOHTvjuTHUf26SnHYseRfbr6WEaqanmqBb0qOflJRBake/pud2LHkX16yrHYcWQfP4/FuvWMMcZkHUtOxhhjso4lp11nqt8BdBI7juzTU47FjiP7+HYsds3JGGNM1rGWkzHGmKxjyamLicg9IrJRRD7yO5aOEJHhIjJTRBaJyMci8kO/Y2oPEckTkbdE5H3vOH7rd0wdISJBEXlXRJ7xO5aOEJHlIvKhiLwnIgv8jqe9RKRURP4jIou9/1cO9zumthKRsd5/h6ZPtYhctcvjsG69riUiRwO1wDRV/ZLf8bSXiAwGBqvqOyJSDCwEzlLVT3wOrU1ERIBCVa0VkTAwB/ihqs7zObR2EZEfAROAPqp6ut/xtJeILAcmqGq3vj9IRO4HZqvqXSKSAxSo6lafw2o3EQkCa4BDVXWX3iNqLacupqqzgM1+x9FRqrpOVd/xvtcAi4Ch/kbVduqq9WbD3qdb/oUmIsOA04C7/I7FgIj0AY4G7gZQ1Wh3TkyeE4DPd3ViAktOph1EZBRwADDf51DaxesKew/YCLykqt3yOICbgJ8Bjs9xdAYFXhSRhSIyxe9g2mkMsAm41+tqvUtECv0OqoMmAw/5sWNLTqZNRKQIeAy4SlWr/Y6nPVQ1oar7A8OAQ0Sk23W3isjpwEZVXeh3LJ3kSFU9EDgF+J7XHd7dhIADgdtV9QCgDrjG35Daz+uW/ArwqB/7t+RkMuZdo3kMeEBVH/c7no7yulxeAyb5G0m7HAl8xbtWMx04XkT+7W9I7aeqa73pRuAJ4BB/I2qX1cDqpJb4f3CTVXd1CvCOqm7wY+eWnExGvIEEdwOLVPWvfsfTXiJSLiKl3vd84ERgsa9BtYOqXquqw1R1FG7Xy6uq+jWfw2oXESn0BtngdYOdDHS70a2quh5YJSJjvaITgG41YKiZC/GpSw/cZqjpQiLyEHAsUCYiq4HfqOrd/kbVLkcClwAfetdrAK5T1Rn+hdQug4H7vVFIAeARVe3Ww7B7gIHAE+7fP4SAB1X1eX9DarfvAw94XWLLgMt8jqddRKQAOAn4H99isKHkxhhjso116xljjMk6lpyMMcZkHUtOxhhjso4lJ2OMMVnHkpMxxpisY8nJGGNM1rHkZIwxJutYcjImi4hIbetrpd02X0Re924wRkT2EZEVIvKdpHVyRGSWiNgN+CarWXIypue4HHhcVRMAqvoh7qONLm1aQVWjwCvABb5EaEyGLDkZk6VE5Eci8pH3uSqp/Ffem1ZfEpGHROQn3qKLgf82q2YjsHezsie9dY3JWta0NyYLichBuM9lOxQQYL6IvA4EgXNw36cVAt4BFnrPchujqsubVXUjkCsiI5NeGPcRcHDXH4Ux7WfJyZhdSEReBgalWPQLVU1u9RwFPKGqdd52jwMTcXs7/quqDV750976ZcDWZvuaBBQCz+K2nlaA+z4rEYmKSLH3VmNjso4lJ2N2IVU9McNVpY3lDUDetpVE8oA/4b4s7jLgS0DyE+RzgcYMYzFml7NrTsZkp1nAWSJS4L3j6KvAbGAOcIaI5HlvJT4NQFW3AEEvKQH8EpjmdfN9iJucABCR/sAmVY3tsqMxpo2s5WRMFlLVd0TkPuAtr+guVX0XQESeAt7H7aZbAFR567wIHCUiq3DfxXOkV/4hcF1S9cexYyvKmKxj73MyppsRkSJVrfVeCDcLmOIlswOAH6nqJa1s/zhwraou2RXxGtMe1nIypvuZKiLjca8x3a+q7wCo6rsiMlNEgk33OjXnjep70hKTyXbWcjLGGJN1bECEMcaYrGPJyRhjTNax5GSMMSbrWHIyxhiTdSw5GWOMyTqWnIwxxmQdS07GGGOyjiUnY4wxWef/AxxVh61RhpjBAAAAAElFTkSuQmCC",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Example adapted from:\n",
"# https://scikit-learn.org/stable/auto_examples/linear_model/plot_logistic_path.html\n",
"\n",
"# Use standard logistic regression model from scikit-learn\n",
"clf = linear_model.LogisticRegression(\n",
" penalty=\"l1\",\n",
" solver=\"liblinear\",\n",
" tol=1e-8,\n",
" max_iter=int(1e3),\n",
" warm_start=True)\n",
"\n",
"# Define regularization strengths\n",
"cs = l1_min_c(X, y, loss=\"log\") * np.logspace(0, 2.8, 20)\n",
"\n",
"# Loop over regularization strengths and fit model\n",
"coefs_reg_ = []\n",
"for c in cs:\n",
" clf.set_params(C=c)\n",
" clf.fit(X, y)\n",
" coefs_reg_.append(clf.coef_.ravel().copy())\n",
"\n",
"# Plot regularization path, i.e. coefficients as a function of\n",
"# regularization strength\n",
"plt.rcParams['figure.figsize'] = [6.4, 4.8]\n",
"plt.plot(-np.log(1/(n*cs)), np.array(coefs_reg_), marker=\"o\")\n",
"plt.xlabel(r\"$-\\log(\\lambda)$\")\n",
"plt.ylabel(\"Coefficients\")\n",
"plt.title(\"Standard Regularization Path\")\n",
"plt.axis(\"tight\")\n",
"plt.savefig(\"README_files/README_0.png\")\n"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"

\n",
" \n",
"

"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Logistic Regression with Leapfrog Regularization"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The advantage of Leapfrog regularization is that we do not need to find a reasonable range of regularization strengths. Instead, we simply specify the number of non-zero parameters we want to estimate. The following code demonstrates how to use *PyTorch* and *PyLeapfrog* to compute a leapfrog regularization path by selecting *q=[0,1,2,60]* features."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"First, we define an equivalent logistic regression model:"
]
},
{
"cell_type": "code",
"execution_count": 23,
"metadata": {},
"outputs": [],
"source": [
"# Definition of a simple logistic regression model, where\n",
"# the weights are subject to leapfrog regularization\n",
"class LogisticModel(torch.nn.Module):\n",
" def __init__(self, p, q, weight_decay=None):\n",
" super(LogisticModel, self).__init__()\n",
" # The Leapfrog linear layer is identical to the Torch\n",
" # linear layer, except that the weights are subject to\n",
" # leapfrog regularization\n",
" self.linear = lf.Linear(p, 1, q, weight_decay=weight_decay)\n",
"\n",
" def forward(self, x):\n",
" x = self.linear(x)\n",
" x = torch.sigmoid(x)\n",
" return x"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"... and we train the model ..."
]
},
{
"cell_type": "code",
"execution_count": 24,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training process has finished for target q=0.\n",
"Training process has finished for target q=1.\n",
"Training process has finished for target q=2.\n",
"Training process has finished for target q=60.\n"
]
}
],
"source": [
"# Specify a list of the number of features we want to estimate\n",
"q = [0,1,2,60]\n",
"\n",
"# Define a simple logistic regression model\n",
"model = LogisticModel(X.shape[1], q)\n",
"\n",
"# Logistic regression models are trained using the binary cross-entropy\n",
"loss_function = torch.nn.BCELoss()\n",
"# We use a standard optimizer such as Adam...\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=0.05)\n",
"# and augment it with a Leapfrog optimizer that performs the\n",
"# regularization steps\n",
"optimizer = lf.Optimizer(optimizer, tolerance=1e-8)\n",
"# A maximum of max_epochs is used for training\n",
"max_epochs = 500\n",
"# Define the training set and data loader for training, with\n",
"# a batch size equal to the full training set (i.e. do not use\n",
"# stochastic gradient descent, because the data set and model\n",
"# are fairly small)\n",
"trainloader = DataLoader(\n",
" TensorDataset(torch.Tensor(X), torch.Tensor(y)),\n",
" batch_size=int(X.shape[0]),\n",
" shuffle=False,\n",
" num_workers=1)\n",
"\n",
"# Record the regularization strength lambda\n",
"l_ = []\n",
"# Record the loss\n",
"loss_ = []\n",
"# Record the coefficients of the logistic regression\n",
"coefs_ = []\n",
"while True:\n",
" # Do a maximum of max_epochs iterations over the training set\n",
" for _epoch in range(0, max_epochs):\n",
" # Loop over the training set\n",
" for i, data in enumerate(trainloader, 0):\n",
" # Get X (inputs) and y (targets)\n",
" inputs, targets = data\n",
" # Reset gradient\n",
" optimizer.zero_grad()\n",
" # Evaluate model\n",
" outputs = torch.flatten(model(inputs))\n",
" # Compute loss\n",
" loss = loss_function(outputs, targets)\n",
" # Backpropagate gradient\n",
" loss.backward()\n",
" # Perform one gradient descent step\n",
" optimizer.step()\n",
" # Record loss\n",
" loss_.append(loss.item())\n",
"\n",
" # print(f'Loss: {loss.item()}')\n",
"\n",
" # Check if optimizer converged (only possible of no\n",
" # stochastic gradient descent is used), or if the\n",
" # maximum number of epochs is reached\n",
" if optimizer.converged(loss.item()) or _epoch == max_epochs-1:\n",
" # Record lambda (weight decay)\n",
" weight_decay = optimizer.get_weight_decay()\n",
" # Each layer and output node has its own weight decay parameter. We\n",
" # have only one layer and output node.\n",
" l_.append(weight_decay[0][0].item())\n",
" # Record coefficients (weights) from the linear layer\n",
" coefs_.append(list(model.parameters())[0][0].detach().numpy().copy())\n",
" break\n",
"\n",
" print(f'Training process has finished for target q={optimizer.get_q()[0]}.')\n",
" # Select the next q (number of features) for optimization\n",
" if optimizer.next_target():\n",
" # There are no more targets, exit loop\n",
" break\n"
]
},
{
"cell_type": "code",
"execution_count": 26,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA4wAAAFRCAYAAAA/9SN6AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy8/fFQqAAAACXBIWXMAAAsTAAALEwEAmpwYAABrJklEQVR4nO3dd5xcZdn/8c81dWt6T0iDUJUiodfQDAgEO4pgQXks+AgKKj/swiOPIFhQEVEpj4KC0jQ0kSqChCqdEAKE9LbZOvX6/XHOJpPNbrLJljOz+32/XvOac+5zzpzrnmzmzDV3OebuiIiIiIiIiHQUizoAERERERERKU9KGEVERERERKRTShhFRERERESkU0oYRUREREREpFNKGEVERERERKRTShhFRERERESkU0oYZVAzs4PM7FUzazKzk6KOp6+Y2UIzO6oHxzeZ2fRejmly+Lrx3nzd3mRmU83MzSwRdSwiIrKxnl5HBuu1TWRrKWGUstHTpGYbfQ+43N3r3P2WvjyRmR1uZsXwQtJoZi+b2Sf78py9JXx/FvTkNTr++7r7m+HrFnoe4SbncjNrDt/rt83s0u5cvCP6GxQRGTTM7BNm9h8zazGzpWb2SzMb1s1je/U6UmnXNpGoKGGUwW4K8HxnGyzQ2/9HFrt7HTAEOBv4tZnt1Mvn6DUV3rK2R/heHwl8FPhMxPGIiAxqZvYV4H+Bc4GhwP4E1+F7zCwVZWwi0jUljFL2zCxmZl83s9fMbJWZ/cnMRpRsvzH8lbLBzB40s91Ktl1tZleY2T1hq94DZjYl3PYaMB24PWyJSpvZ/WZ2oZn9E2gBppvZgWb2ePj6j5vZgSWvPy08Z6OZ/d3Mfm5m/7elOnlgLrAa2L2b9TzNzN4It32z9FfNsJ4XlOx7uJkt6uL93NfM/mVma81siZldXnqhDlvnvmBmrwKvlpTtYGYTwveq/dFiZh7us72Z/SOMb6WZ/b79V2Mzuw6YXPJef9U6dPcMX/s2M1ttZvPN7DMlMX0nfD+uDd/r581s5pbe5/C9fgl4CHjH1sZY8jKnmNmb4THnd+e8IiKygZkNAb4LfNHd73T3nLsvBD5EkDR+LPysv8nM/hh+1j9pZnuEx3fnOnK/mV1gZo+E+9xuZiPDz/p14TV8aklMFXttE+lPShilEvw3cBJwGDABWAP8vGT7HcAMYAzwJPD7DsefAnwfGAU83b7d3bcH3gROCLuPZML9TwXOAOqBRuBvwE+BkcClwN/MbGS47x+Af4fbvhMeu0VhcnhiGNP8LdXTzHYFfhHWZTzBL7MTu3OuThQIWjdHAQcQtMB9vsM+JwH7AbuWFrr74vC9qgtb724GbmivFvCDMPZdgO0I3hPc/VQ2fq9/2Elc1wOLwuM/APyPmR1Zsv3E8FzDgNuAy7tT2fC9OwR4qgcxHgzsRPBefcvMdunOuUVEZL0DgSrgL6WF7t5EcB0/OiyaA9wIjCC4xt5iZsluXkcATia4Fk8Etgf+BfwufL0XgW93PKASr20i/UkJo1SC/wLOd/dFYVL3HeAD7b/euftv3b2xZNseZja05Pi/ufuD4fbzgQPMbLvNnO9qd3/e3fPAMcCr7n6du+fd/XrgJeAEM5sM7AN8y92z7v4wwYf95kwws7VAK8EF6cvu/lQ36vkB4HZ3f9jds8C3AN/SG9cZd3/C3R8N67MQ+BVBklrqB+6+2t1bu3odM/sasDPwqfB157v7Pe6ecfcVBMl1x9ft6rW2I0jKvubube7+NHAVGyfgD7v73HBcyHXAHlt42SfNbA1we/hav+tBjN9191Z3fwZ4phvnFhGRjY0CVobX1o6WhNsBnnD3m9w9R/AZXUXQdbW7fufur7l7A0Ei+pq7/z08743AXps7uAKubSL9rpLHJ8ngMQW42cyKJWUFYKyZLQUuBD4IjAba9xkFNITLb7Uf5O5NZraa4Je+t+hcafkE4I0O298g+OVyArDa3Vs6HLu5ZHSxu08yszRwEXAE8OMt1bNjvO7eYmarNnOeLpnZjgQXvJlADcHnwBMdduvqvWl/jWOBLwH7tSeVZjaGoCX2EILW2RhBK2l3tL+XjSVlb4QxtltastwCVJlZoosvHwDvcvf5pQU9iLHjueu6cYyIiGywEhjVxef2+HA7bHytK1owvGLCVpxnWclyayfrXX5+V8i1TaTfqYVRKsFbwLHuPqzkUeXubxNMZjIHOIqgm+bU8BgrOX59AmdmdQTdUhZv5nylLXeLCRK5UpOBtwl+ER1hZjWdnWtzwhbErwHvtA2389hcPZcAk0rqUU3QDbZdM0Hy127cZk7/S4JW0hnuPgT4f2z8fsFmWi8tmKTnGuBD7l6aWP4gPG738HU/1uF1N9ciupjgvawvKWt/n3tTT2IUEZFt9y8gA7yvtNDMaoFjgXvDotJrdozg2td+ze6zz+gKv7aJ9CkljFJukmZWVfJIAFcAF9qGyWpGm9mccP96ggvQKoKE6X86ec3jzOxgCyZ2+T7wWIeLwebMBXY0s4+aWcLMPkwwru+v7v4GMA/4jpmlzOwA4ITuVjTsWvojgu6lbKGeNxF0gz0wrMd32fiC9XRYzxFmNg44azOnrgfWAU1mtjPwue7GHE5acCvwjbALbsfXbQLWmtlEglnwSi0jmGRoE+G/xyPAD8J/992B09l0PGpPbXOMIiKy7cIuot8FfmZms80sGU5AcyPBGL/rwl33NrP3hdf/swiu8Y+G2/rkM3oAXNtE+pQSRik3cwm6jLQ/vgP8hGBs4N1m1khw4dgv3P9agu4dbwMvsOGiUuoPBIPcVwN7E0wc0y3uvgo4HvgKQVL6VeB4d2/vOnMKwcQxq4ALgD8SXNy667fAZDM7gc3U092fB75IMDB+CcFkPMtLznUdwdi6hcDdYRxdOYegZbYR+PUW9u3oXQSTv1xaOqNcuO274fYGgomC/tLh2B8A37BgdtZzOnntjxC0EC8mGN/5bXe/Zyti646exigiItsonBTm/wGXEPxw+RhB75ojSyaeuxX4MEG3z1OB94XjGaHvPqMr/dom0qfMXT2wZOAys6uBRe7+jX463x+Bl9x9k1nYevk8dcBagm6lr/fluURERPqDmX0H2MHdPxZ1LCKygVoYRXrAzPYJ79EUM7PZBOMpb+mjc51gZjXheI9LgP8QtCiKiIiIiPQJJYwiPTMOuJ9gfMNPgc+V3Cajt80h6NKymOC+kye7ugiIiIiISB9Sl1QRERERERHplFoYRUREREREpFNKGEVERERERKRTiagD6E+jRo3yqVOnRh2GiIj0sSeeeGKlu4+OOo5KoeujiMjgsbXXyEGVME6dOpV58+ZFHYaIiPQxM3sj6hgqia6PIiKDx9ZeI9UlVURERERERDqlhFFEREREREQ6pYRRREREREREOqWEUURERERERDqlhFFEREREREQ6pYRRREREREREOqWEUURERERERDo1qO7DKCIi5evFh+7joRuupXHVSupHjuKQk09jl0NmRR1WZMxsNvATIA5c5e4Xddh+LnBKuJoAdgFGu/tqM1sINAIFIO/uM/stcBERGVAibWE0s9+a2XIze66L7YebWYOZPR0+vlWybbaZvWxm883s6/0XtYiI9LYXH7qPu6+8nMaVK8CdxpUruPvKy3nxofuiDi0SZhYHfg4cC+wKfMTMdi3dx90vdvc93X1P4DzgAXdfXbLLrHC7kkUREdlmUXdJvRqYvYV9Hmq/ILr796B7F1IRESlv+WyWpjWrWbXoTe6/7jfks5kO2zM8dMO1EUUXuX2B+e6+wN2zwA3AnM3s/xHg+n6JrAt/evwtnnpzTZQhiIhIH4i0S6q7P2hmU7fh0PUXUgAza7+QvtCL4YmIyGa4O7m2Vtqam8g0N9PW3BQsNzWRaQnXm5rINIfrTeH2cP98LrvFczSuWtkPNSlLE4G3StYXAft1tqOZ1RD8+HpmSbEDd5uZA79y9yv7KtB237rtOT5+wFT2mjy8r08lIiL9qBLGMB5gZs8Ai4Fz3P15tuJCKiIiXSsWC2RaWsg0N5MJE7y25iYyLRuSvdKEsHQ909JMsVDo+sXNSNfUUFVbR7q2jqraOkYO326j9eC5ln9cfSWt6xo2eYn6kaP6sPZlzTop8y72PQH4Z4fuqAe5+2IzGwPcY2YvufuDG53A7AzgDIDJkyf3QsBG0bsKUUREKlW5J4xPAlPcvcnMjgNuAWawFRfS3r4gioiUm0I+t6GFrz3Ja2kmEyZ/6xO85k3XMy3Nm33tWDy+Prmrqq2jqq6eoWPHh8t1pGtqg+11YQJYUxuU19aRrq7BYt0b+eDFIndfeflG3VITqTSHnHxaj96bCrYI2K5kfRLBD6edOZkO3VHdfXH4vNzMbibomfNgh32uBK4EmDlzZo8zvZiB8kURkYGnrBNGd19XsjzXzH5hZqPYigtpb18QRUR6m7uTz2bWd+dsK+nC2bGFr7RLZ/t6PpPZ7OsnUmmqaoPELl1bR/2IkYzebgrpujrSNXUbkr/aOqpqaknXbUgQE+k0Zp39Rte72mdD1Syp6z0OzDCzacDbBEnhRzvuZGZDgcOAj5WU1QIxd28Ml48BvtfXAcfMKOoqKyIy4JR1wmhm44Bl7u5mti/BJD2rgLV040IqItJfvFgk29ZaMk5v0xa9jbt0NtFW0g20WMhv9vVT1TWka2vXJ3LDxk3YaD1dt3GyV9rlM5FM9tO70DO7HDJrMCeIG3H3vJmdCdxFcFuN37r782b22XD7FeGu7wXudvfSpuKxwM1hop8A/uDud/Z50Ia6pIqIDECRJoxmdj1wODDKzBYB3waSsP5i+AHgc2aWB1qBk93dgU4vpBFUQUQGkGKh0GkL3kbJXXsrYMvG65mWFtyLXb62WWx9gtfehbN+5OgNyV6H7pzBfrXry2PxeD++E1IO3H0uMLdD2RUd1q8mmHG8tGwBsEcfh7eJWD+0RIuISP+LepbUj2xh++XA5V1s2+RCKiLlrT9uzJ7PZjfTohc+NzUHk7qs7wIarGdbWzf72vFEYqNkrmbIUIaPnxiO5Qsmbyntzlnaypeqru6Xrp0iUTG1MIqIDEhl3SVVRAaO9huzt09q0n5jdmCjpHHDrRo6n6Rl/cQuLR1n9QwmednSrRqS6aoN3Tdr6xgyZixjajuZvCUc81dVkiAmUv0znk+kEsXMNOmNiMgApIRRRPrFQzdc2+mN2e/61U958o7bNkzysqVbNcCG5K62jqq6WkYO3y5o4SsZv7fR+L7w1g3p2lriicoYzydSaWJqYRQRGZCUMIpIr3N31q1YzrIFr7J0wXyWvfYqjStXdLpvIZcjXVvH0DHjNtyOIRzLt+n9+upI1VQTi2k8n0j50SypIiIDkRJGEemxptWrwsTwlfUJYmtjcFecWDzB6ClTSVZVkWtr2+TY+lGj+cD53+/vkEWkl8UMurglsoiIVDAljCKyVVrWNbDstVdZuuBVlr72KssWzKd5zWoALBZj1KTJbD9zP8ZOn8G46Tswaso0EsnkJmMYYdDfmF1kQDGDYtcTBYuISIVSwigiXWpramLZgvksXfAqyxYEyeG6FcuDjWaMGD+RKe/Yg7Hbz2Ds9BmMmTqNZLqq09fSjdlFBraYGa4WRhGRAUcJo4gAkG1tYfnrC0paDl9l7dIl67cPGzue8TvsxJ7vPp5x289gzNTtSdfUbNU5dGN2kYErZhrDKCIyEClhFBmEctkMKxYuYOlr84OJaV57ldWLF9E+J379yNGMnb4D7zj86LD1cAeq6+ojjlpEyp1mSRURGXiUMIoMcIV8jpVvvsHS115ZnyCufOsNPBxsVDN0GOO2n8FOBxzCuB1mMHbaDtQOGx5x1CJSaWIxNOeNiMgApIRRZAApFgqsWvRmMObwtfksfe1VVr75OoV8HoCqunrGbT+D6e/al7Hb78C47WdQN3ykbkYvIj1mmFoYRUQGICWMIhXKi0VWL3l7/Yyly16bz/KFC9bPQpqqrmHs9B3Y69gTGbf9jozbfgeGjB6r5FBE+kTM1MAoIjIQKWEUqQDuTsOypRtNSLP89dfItrYCkEinGTtte3Y/ajbjpu/A2O13ZPi48VgsFnHkIjJYaNIbEZGBSQmjSIRefOi+TW4zsfPBh9O4auWGlsMF81n22qu0NTcBEE8kGD11OrsccgTjtg/udThi4nbE4vGIayMig5pp0hsRkYFICaNIRDreyL5x5Qru+Pll3PObX5ALWw5j8TijtpvKjP0PYtz0GYzdfgajtptMPJGMMnQRkU3ETH1SRUQGIiWMIhF56IZr1yeL7dyLUHSO+NRnGTd9BqOmTCWZSkcUoYhI9xlqYRQRGYiUMIpEpHHlik7Lc9kMe737+H6ORkSkZ2JmKF8UERl4NCOGSAQK+RzxROe/19SPHNXP0YiI9JxpDKOIyICkhFGkn7k79/72Cgr5/CZJYyKV5pCTT4soMhGRbWeaJVVEZEBSl1SRfvbM3XP5z713sd97P8TIidttMkvqLofMijpEEZGtFjPQrDciIgOPEkaRfvTW889y3zVXMv1d+3DQhz6GxWJKEEVkQAi6pEYdhYiI9DZ1SRXpJw3Ll3H7ZRcxbOx4jvviOVhM//1EZOAIJr1RxigiMtDoG6tIP8i1tXHrxd+nWCgw59xvkq6pjTokEZFepTGMIiIDkxJGkT7m7tz5i8tY+dabHP+lrzJiwsSoQxIR6XW6D6OIyMCkhFGkjz1285945bF/csgpn2DqnntHHY6ISJ8IJr0REZGBRgmjSB+aP+8x/vnH69jlkFnMPP69UYcjItJngi6pamEUERloIk0Yzey3ZrbczJ7rYvspZvZs+HjEzPYo2bbQzP5jZk+b2bz+i1qke1a+9QZzf3YJY6fP4OgzzsRMP7+LSPeZ2Wwze9nM5pvZ1zvZfm54DXzazJ4zs4KZjejOsX0hZqB8UURk4Im6hfFqYPZmtr8OHObuuwPfB67ssH2Wu+/p7jP7KD6RbdLa1MitF19AMp1mzjnnk0ylow5JRCqImcWBnwPHArsCHzGzXUv3cfeLw2vgnsB5wAPuvro7x/ZRzGphFBEZgCJNGN39QWD1ZrY/4u5rwtVHgUn9EphIDxQLBf72kx/SuGoFJ37lfOpHjoo6JBGpPPsC8919gbtngRuAOZvZ/yPA9dt4bK8IJr3p67OIiEh/i7qFcWucDtxRsu7A3Wb2hJmdEVFMIpt48Pe/441nn+LIT3+eiTvtEnU4IlKZJgJvlawvCss2YWY1BL11/ry1x/ammFlwZRYRkQElEXUA3WFmswgSxoNLig9y98VmNga4x8xeClssOx57BnAGwOTJk/slXhm8nn/gXp742y3sNfsE3jnrmKjDEZHK1dmg567SsROAf7p7e4+dbh3b29dHM91WQ0RkICr7FkYz2x24Cpjj7qvay919cfi8HLiZoAvOJtz9Snef6e4zR48e3R8hyyC1ZP7L3PPry9lut9057NTTow5HRCrbImC7kvVJwOIu9j2ZDd1Ru31sb18fY2ZqYBQRGYDKOmE0s8nAX4BT3f2VkvJaM6tvXwaOATqdaVWkPzStXsWtl1xI3fARnHD214knKqLxXkTK1+PADDObZmYpgqTwto47mdlQ4DDg1q09trephVFEZGCK9FutmV0PHA6MMrNFwLeBJIC7XwF8CxgJ/CK8JUE+nBF1LHBzWJYA/uDud/Z7BUSAfDbLbT/6H7ItLbz/gkuorh8SdUgiUuHcPW9mZwJ3AXHgt+7+vJl9Ntx+Rbjre4G73b15S8f2dcxmRkumQCZfIJ2I9/XpRESkn0SaMLr7R7aw/dPApzspXwDssekRIv3L3fn7Vb9gyfyXOeHL5zF68tSoQxKRAcLd5wJzO5Rd0WH9aoJbVG3x2L6WjBkvL2vkXd+7h6pknPqqBLFYMJzSCBLK4BkMo/3WtNlCkUTMMILbclQl4/zsI3sxdVRtf4YvIiJdUL85kR546o7beP6Bv7P/+z/CjvsdFHU4IiKR+ezh27PdiBpasnkAWnNF3D0Y1+jgOO4Ej3AZgrGPRXfMoDlT4OH5K3l+8ToljCIiZUIJo8g2euPZp7n/ut+wwz77c+AHNttYLiIy4O0zdQT7TB3Ro9dYsKKJI370ALlCsZeiEhGRnirrSW9EytXapUv4648vYsSESRz7hS9jMf1XEhHpqWQ8+CzN5pUwioiUC33LFdlK2dYWbrn4+2DGSed+k1R1TdQhiYgMCOlEmDCqhVFEpGwoYRTZCl4scsfPL2X14kUcf9bXGDZufNQhiYgMGGphFBEpP0oYRbbCv/58PfMff5TDTz2dKe/cM+pwREQGlFTYwqgxjCIi5UMJo0g3vfLYP/nXTdez22FHsdexJ0YdjojIgNPewqiEUUSkfChhFOmGFW+8zp0/v4zxM3biqM98AWu/gZiIiPSaZDz4bFWXVBGR8qGEUWQLWtY1cMvFF5CuqeHEr5xPIpmMOiQRkQHJzEjFY2QLHnUoIiISUsIoshmFfJ6//vh/aV67mhPPOZ+64T27x5iIiGxeKhFTC6OISBlRwiiyGQ9c9xveev5Zjv7MmYzfYaeowxERGfCScdMYRhGRMqKEUaQL//nH3Tx15+3s/Z6T2O2wI6MOR0RkUFALo4hIeVHCKNKJt19+kb9f9Qum7L4Xh57yyajDEREZNJLxmFoYRUTKiBJGkQ4aV63kth9dyJDRozn+S18jFo9HHZKIyKCRSsTIKGEUESkbShhFSuSyGW695EJymQwnnftNqurqog5JRGRQScVj5NQlVUSkbChhFAm5O/f86mcsW/Aqx33xHEZOmhx1SCIig04qESOrFkYRkbKhhFEkNO+vN/Piw/dz0Ic+xg4z94s6HBGRQUljGEVEyosSRhHg9aef4KHfX82O+x/Mfu/7cNThiIgMWqm4ZkkVESknShhl0Fu9+G3+9pMfMmq7ycz+3FmYWdQhiYgMWslEjGzBow5DRERCShhlUMu0NHPrxd8nFo8z59xvkqyqijokEZFBTS2MIiLlRQmjDFrFYoG5P7uEtcuWcMKXz2PomLFRhyQiMuilEqYxjCIiZUQJowxaj/zp9yx48nFmffwMttv1nVGHIyIiqIVRRKTcKGGUQemlRx7ksZv/xDuPfDd7HHNc1OGIiEhIs6SKiJQXJYwy6Cx7/TXu+uVPmLDTrhz5qc9qkhsRkTKSTKiFUUSknChhlEGlpWEtt15yAVX19Zz45fOIJ5JRhyQiIiVS8RhZtTCKiJSNSBNGM/utmS03s+e62G5m9lMzm29mz5rZu0q2zTazl8NtX++/qKVSFfI5brv0B7Q2NHDSOd+gdtjwqEMSEZEOUmphFBEpK1G3MF4NzN7M9mOBGeHjDOCXAGYWB34ebt8V+IiZ7dqnkUrFu+/qK3n7pec55nNfYuz0HaIOR0REOpHSGEYRkbISacLo7g8CqzezyxzgWg88Cgwzs/HAvsB8d1/g7lnghnBfkU49c89cnrnnDvaZ8wF2OeiwqMMREdmi7vSkMbPDzexpM3vezB4oKV9oZv8Jt83rv6h7LhmPUXQoFD3qUEREBEhEHcAWTATeKllfFJZ1Vr5fP8YlFWTRC8/xj9/9iml7zeTgk0+NOhwRkS0q6UlzNME17nEzu83dXyjZZxjwC2C2u79pZmM6vMwsd1/ZXzH3llQi+C07my9SnYpHHI2IiETdJXVLOpu+0jdTvukLmJ1hZvPMbN6KFSt6NTgpf+tWLOe2y37A0LHjec9/n0sspi8fIlIRutOT5qPAX9z9TQB3X97PMfaJZDy4xGviGxGR8lDuCeMiYLuS9UnA4s2Ub8Ldr3T3me4+c/To0X0WqJSfXKaNWy65gEIux0nnfoN0TW3UIYmIdFdXPWxK7QgMN7P7zewJMzutZJsDd4flZ3R2gnL9QTVd0sIoIiLRK/eE8TbgtHC21P2BBndfAjwOzDCzaWaWAk4O9xUBwN2565c/YcUbr/OeL53LiAmTog5JRGRrdKcnTQLYG3gP8G7gm2a2Y7jtIHd/F8HkcF8ws0M3ebEy/UE1GQ++mmjiGxGR8hDpGEYzux44HBhlZouAbwNJAHe/ApgLHAfMB1qAT4bb8mZ2JnAXEAd+6+7P93sFpGz9+5YbeflfD3HIRz/B9L32iTocEZGt1Z2eNIuAle7eDDSb2YPAHsAr7r4Ygm6qZnYzQRfXB/s+7J5LqYVRRKSsRJowuvtHtrDdgS90sW0uQUIpspHXnvg3D//xOnY+6DD2OfH9UYcjIrIt1vekAd4m6Enz0Q773ApcbmYJIEUw+dtlZlYLxNy9MVw+Bvhe/4XeM2phFBEpL+U+S6rIVlm16C3m/uxixkydzjH/9UXMOuvVJSJS3rrqSWNmnw23X+HuL5rZncCzQBG4yt2fM7PpwM3h518C+IO73xlNTbZeewtjRi2MIiJlQQmjDBhtTU3cesn3SaTSzDnnGyTTVVGHJCKyzTrrSRMO1yhdvxi4uEPZAoKuqRUppRZGEZGyUu6T3oh0S7FY4G8//SENy5dzwpfPY8io8pnAQUREuk9jGEVEyosSRhkQHvrDNSx85kmOPP2zTNp5t6jDERGRbbRhDGOnt1cWEZF+poRRKt4LD93HvNv/wh7HvIfdj5wddTgiItID61sYC4WIIxEREVDCKBVu6WuvcvevfsqkXd/BrI9/JupwRESkh5LxYLKybF4tjCIi5UAJo1Ss5rVruPWSC6gdNpwTzj6PeEJzOImIVLp0Ig5AJq8WRhGRcqCEUSpSPpfj1h9dSFtzE3PO+QY1Q4ZGHZKIiPSCtCa9EREpK0oYpeK4O/f+5pcseeUlZn/ubMZMnR51SCIi0kvSSd2HUUSknChhlIrz9F1/5bn77mb/932YnQ44OOpwRESkF23okqqEUUSkHChhlIry5nPPcN81v2b63vty4AdPiTocERHpZe1dUjWGUUSkPChhlIrRsHwpt192ESMmTOK4M8/BYvrzFREZaNYnjDm1MIqIlAN945aKkG1r5ZaLL8C9yJxzv0G6pibqkEREpA+YGalETF1SRUTKhBJGKXteLHLnzy9j1VtvcvyXvsbwcROiDklERPpQOhFTl1QRkTKhhFHK3qN/+SOv/vsRDv3YJ5m6x7uiDkdERPpYOhFXC6OISJlQwihl7dXH/8UjN/6eXQ89gr3fc1LU4YiISD9IJ2IawygiUiaUMErZWvnmQu64/FLGbT+Doz9zJmYWdUgiItIP0kl1SRURKRdKGKUstTau45aLv0+qupoTzzmfRCoVdUgiItJP1CVVRKR8KGGUslMsFPjrj/+XptWrOPHL/4/6EaOiDklERPpRWrOkioiUDSWMUnYeuO43vPncMxz16S8wYcedow5HRET6WTCGUV1SRUTKgRJGKSvP3XcPT95xG+869kTeMevoqMMREZEIpJPqkioiUi6UMErZWPzKS/z9qp8z+R17cNipp0cdjoiIRERdUkVEyke3EkYzO8jMasPlj5nZpWY2pW9Dk8GkafUqbrv0f6gbOYrjz/oasXg86pBERCQiQcKoLqkiIuWguy2MvwRazGwP4KvAG8C1fRaVDCr5bJZbf3Qh2dZWTjrnG1TXD4k6JBERiVA6Edd9GEVEykR3E8a8uzswB/iJu/8EqO+7sGSwcHfuufJnLJ3/Csee+WVGTZ4adUgiIhKx4D6MShhFRMpBdxPGRjM7D/gY8DcziwPJnp7czGab2ctmNt/Mvt7J9nPN7Onw8ZyZFcxsRLhtoZn9J9w2r6exSDSenHsrLzx0Hwd+8BRm7HNA1OGIiEgZUJdUEZHy0d2E8cNABjjd3ZcCE4GLe3LiMOn8OXAssCvwETPbtXQfd7/Y3fd09z2B84AH3H11yS6zwu0zexKLRGPhM0/ywHW/Zca+B7L/+z4cdTgiIlIm0gnNkioiUi4S3dzvbHf/WvuKu79pZrv18Nz7AvPdfQGAmd1A0OX1hS72/whwfQ/PKWVizdLF/PUn/8vI7SYz+wtnYzFN2CsiIoF0IkY2X8TdMbOowxERGdS6+y29sxviHdvDc08E3ipZXxSWbcLMaoDZwJ9Lih2428yeMLMzehiL9KNMSwu3/PD7mMU46dxvkKqqjjokEZGys6VhG+E+h4dDM543swe25thylk4GX0/UyigiEr3NtjCa2eeAzwPTzezZkk31wCM9PHdnPxl6F/ueAPyzQ3fUg9x9sZmNAe4xs5fc/cFNThIkk2cATJ48uYchS095scjcyy9hzZK3+cD532fomHFRhyQiUnZKhm0cTfCD6uNmdpu7v1CyzzDgF8DssOfPmO4eW+7SieDWSpl8kaqkbrMkIhKlLbUw/oEgWbstfG5/7O3up/Tw3IuA7UrWJwGLu9j3ZDp0R3X3xeHzcuBmgi6um3D3K919prvPHD16dA9Dlp565Mbfs+CJf3P4aZ9h8jv2iDocEZFytX7YhrtngfZhG6U+CvzF3d+E9dfD7h5b1tKJ9hZGTXwjIhK1zSaM7t7g7gvd/SMECV6OoBWwzsx62lz3ODDDzKaZWYogKbyt405mNhQ4DLi1pKzWzOrbl4FjgOd6GI/0sZf/9TCP/uWPvGPWMew1+/iowxERKWfdGbaxIzDczO4Ph2ecthXHlrX1CaPuxSgiErluTXpjZmcC3wGWAe2f3g7svq0ndvd8+Lp3AXHgt+7+vJl9Ntx+Rbjre4G73b255PCxwM3hQPgE8Ad3v3NbY5G+t3zhAu785WWM33Fnjjz9c5rEQERk87ozbCMB7A0cCVQD/zKzR7t5bFkP2UgnN3RJFRGRaHV3ltSzgJ3cfVVvntzd5wJzO5Rd0WH9auDqDmULAPVnrBAt6xq49ZILqKqtY85XzieR7PEtPEVEBrruDNtYBKwMf1BtNrMHCa6N3Rry4e5XAlcCzJw5s6s5BCKhLqkiIuWju7OkvgU09GUgMjAV8nluv+wHtKxdy5xzvkHtsOFRhyQiUgm6M2zjVuAQM0uEs4nvB7zYzWPL2oaEUS2MIiJR624L4wLgfjP7G5BpL3T3S/skKhkw7rvm1yx64TmOPfMrjNt+RtThiIhUhO4M23D3F83sTuBZguEiV7n7c7B+KMlGx0ZSkW20fpZUjWEUEYlcdxPGN8NHKnyIbNGzf7+TZ+7+GzNPeB+7HjIr6nBERCpKN4dtXAxc3J1jK8mG+zCqS6qISNS6lTC6+3chmJG0w+QzIp1a9NLz3PvbK5i6594c8tGPRx2OiIhUEHVJFREpH90aw2hmB5jZCwRjIzCzPczsF30amVSsdSuXc/ulP2DomDG854vnEovppssiItJ97V1S23JqYRQRiVp3J735MfBuYBWAuz8DHNpHMUkFy2XauPWSC8lnM8w555tU1dVFHZKIiFSY6pQSRhGRctHdhBF3f6tDkT7FZSPuzt2/+hnLFy7guC+ey8hJ2235IBGRAc7Mas0sFi7vaGYnmpnuL7QZ1eF9GFuz+qohIhK1bt9Ww8wOBNzMUmZ2DmH3VJF2j9/2Z1765wMc/OFT2X7vfaMOR0SkXDwIVJnZROBe4JN0uL+wbGx9wqhZUkVEItfdhPGzwBeAiQQ3BN4zXBcBYMFTj/PQ9dew0wGHsO9JH4w6HBGRcmLu3gK8D/iZu78X2DXimMpaVThLaqu6pIqIRK67s6SuBE7p41ikQq1evIi//eRiRk+Zxrs/+yXMLOqQRETKiZnZAQTX0dPDsu7e1mpQMjOqk3Fas/moQxERGfQ2e8Eys6+6+w/N7GeAd9zu7v/dZ5FJRWhrbuKWH36feDLJSed+g2RVVdQhiYiUm7OA84Cb3f15M5sO3BdtSOWvOhVXC6OISBnY0i+c7eMU5/V1IFJ5isUCc396MQ3Ll/LBb1zIkFFjog5JRKTsuPsDwAMA4eQ3K/WD65YFLYwawygiErXNJozufnv4fE3/hCOV5OEbruP1p5/gqE9/nkm7viPqcEREypKZ/YFgLoAC8AQw1MwudfeLo42svFWn4rqthohIGejWpDdmdo+ZDStZH25md/VZVFL2XvznAzx+603scfSx7HH0cVGHIyJSznZ193XAScBcYDJwaqQRVYDqpLqkioiUg+7Okjra3de2r7j7GkD9DwepZQvmc/cvf8LEnXdj1ifOiDocEZFylwzvu3gScKu75+hkXgDZWHUyTosmvRERiVx3E8aCmU1uXzGzKehiNyg1r13DLZdcQPXQoZz45fOIJ3TvaRGRLfgVsBCoBR4Mr6HrIo2oAlSl4roPo4hIGejutN7nAw+b2QPh+qGAmpYGmUI+x22X/oC2xkZO/t4PqRk6LOqQRETKnrv/FPhpSdEbZjYrqngqRU0yzrKGtqjDEBEZ9Lp7H8Y7zexdwP6AAWeH92aUQcLdufe3V7D45Rd4z5e+ythp20cdkohIRTCzocC3CX5shWDG1O8BDZEFVQF0Ww0RkfKw2S6pZrZz+PwugkH6i4G3gclhmQwSz9w9l//cexf7nvRBdj7w0C0fICIi7X4LNAIfCh/rgN9FGlEFqErGackqYRQRidqWWhi/TND19EedbHPgiF6PSMrOW88/y33XXMn0d+3DwR/WxH4iIltpe3d/f8n6d83s6aiCqRTVSd1WQ0SkHGwpYbwnfD7d3Rf0dTBSfhqWL+P2yy5i2NjxHPfFc7BYd+dJEhGRUKuZHezuDwOY2UFAa8Qxlb2asEuqu2NmUYcjIjJobSlhPA+4EbgJUBfUQSbX1satF3+fYqHAnHO/SbqmNuqQREQq0WeBa8OxjABrgI9HGE9FqE7FKRSdXMFJJZQwiohEZUsJ42ozuw+Ybma3ddzo7if2TVgSNXfnzl9cxsq33uS9X/82IyZMjDokEZGK5O7PAHuY2ZBwfZ2ZnQU8G2lgZa4qGQegNVcglVDvFhGRqGwpYTyOoGXxOjofxygD1GN/+SOvPPZPDv3Yp5i2595RhyMiUvHcvfTei18GfhxRKBWhuj1hzBYYWq17/oqIRGVLCeNv3P1UM/u1uz+whX1lgJj/+KP880//xy4HH87M498bdTgiIgOR+lhuQU1qQwujiIhEZ0t9PPY2synAKWY23MxGlD56enIzm21mL5vZfDP7eifbDzezBjN7Onx8q7vHyrZZ+dYbzL38R4ydPoOj/+uLmmhARKRveNQBlLuqkhZGERGJzpZaGK8A7gSmA0+w8S+iHpZvEzOLAz8HjgYWAY+b2W3u/kKHXR9y9+O38VjZCq1Njdx68QUk02nmnHM+yVQ66pBERCqWmTXSeWJoQHU/h1NxqtXCKCJSFjabMLr7T4Gfmtkv3f1zvXzufYH57bfrMLMbgDlAd5K+nhwrnSgWCvztJz9k3coVfOjbP6B+5KioQxIRqWjuXh91DJWsfQyj7sUoIhKtbk075u6fM7ODzeyTAGY2ysym9fDcE4G3StYXhWUdHWBmz5jZHWa221YeK9304O9/xxvPPsVRn/48E3faJepwRERkkGsfw9iiLqkiIpHqVsJoZt8GvkZwX0aAFPB/PTx3Z4PjOnbdeRKY4u57AD8DbtmKY4Mdzc4ws3lmNm/FihXbGuuA9vwD9/LE325hr9kn8M4jjok6HBERocfj/Bea2X/C8nn9G3nvaB/D2JLNRxyJiMjgtqUxjO3eC+xFkMDh7ovNrKddbRYB25WsTwIWl+5QOgW5u881s1+Y2ajuHFty3JXAlQAzZ87UJAMdLJn/Mvf8+nK22213Djv19KjDERERejbOv8Qsd1/Zl3H2pdq0Jr0RESkH3b0TbtbdnbAVz8xqe+HcjwMzzGyamaWAk4HbSncws3EWTtNpZvuG8a7qzrGyZU2rV3HrJRdSO2wEx5/1NeKJ7v5+ICIifWz9WH13zwLtY/UHjdp0cE1qyqiFUUQkSt1NGP9kZr8ChpnZZ4C/A7/uyYndPQ+cCdwFvAj8yd2fN7PPmtlnw90+ADxnZs8APwVO9kCnx/YknsEmn81y24/+h2xLCyd99ZvUDBkadUgiIrJBT8b5Q/AD791m9oSZndGXgfaV2pQSRhGRctCtJiV3v8TMjgbWATsB33L3e3p6cnefC8ztUHZFyfLlwOXdPVa6x935+1W/YMn8lznhy+cxevLUqEMSEZGNbc04/yYzO45gnP+McNtB4fCRMcA9ZvaSuz+40QmCRPIMgMmTJ/dq8L0hHjNqUnGalTCKiESquy2MAM8CDwD3A8/0STTSL5664zaef+Dv7P/+j7DjfgdFHY6IiGyqW+P83b0pXJ4LJMNx/rj74vB5OXAzQRdXOhx/pbvPdPeZo0eP7pta9FBtOqEWRhGRiHV3ltQPAf8GPgh8CHjMzD7Ql4FJ33jj2ae5/7rfsMM++3PgBz4SdTgiItK5bR7nb2a17RPThXMOHAM816/R95K6dIKmjCa9ERGJUndnOTkf2Cf8pRIzG00wjvGmvgpMet/apUv4648vYsSESRz7hS9jsa1pYBYRkf7i7nkzax+rHwd+2z7OP9x+BcE4/8+ZWR5oJRznb2ZjgZvDXDIB/MHd74ykIj1Ul06oS6qISMS6mzDG2pPF0Cq2rjurRCzb2sItF38fgJPO/Sap6pqIIxIRkc3Z1nH+7r4A2KPPA+wHtek4TW1KGEVEotTdhPFOM7sLuD5c/zCacKZieLHIHT+/lNWLF/H+877HsHHjow5JRERki+rSCRavbYs6DBGRQW2zCaOZ7QCMdfdzzex9wMEEM7f9C/h9P8QnveCRm65n/uOPMuvjn2HK7ntGHY6IiEi31GnSGxGRyG2pW+mPgUYAd/+Lu3/Z3c8maF38cd+GJr3hlcf+yaN/vp7dDjuKvY49MepwREREuq1WYxhFRCK3pYRxqrs/27HQ3ecBU/skIuk1K954nTt/fhnjd9iJoz79ecIJEERERCqCWhhFRKK3pYSxajPbqnszEOldLesauOXiC0jX1HDiOeeTSKWiDklERGSr1KUTZPJFcoVi1KGIiAxaW0oYHzezz3QsNLPTgSf6JiTpqUI+z19//L80r13NieecT93wEVGHJCIistVq08FUC+qWKiISnS3NknoWwb2cTmFDgjgTSAHv7cO4pAceuO43vPX8s8z+/NmM32GnqMMRERHZJnVhwtiUyTOsRj1lRESisNmE0d2XAQea2SzgHWHx39z9H30emWyT//zjbp6683b2fs9J7HbYkVGHIyIiss3qqjYkjCIiEo1u3YfR3e8D7uvjWKSH3n75Rf5+1S+YsvteHHrKJ6MOR0REpEfUJVVEJHpbGsMoFaJx1Upu+9GFDBk1mvd86avE4vGoQxIREemRunRwLWvKFCKORERk8FLCOADkshluveRCcpkMJ331m1TX1UcdkoiISI/VpZMANLWphVFEJCpKGCucu3PPr37GsgWvctwXz2HkpMlRhyQiItIrNoxhzEUciYjI4KWEscLN++vNvPjw/Rz0oY+xw8z9og5HRESk1wytDloYG1qVMIqIREUJYwV7/ekneOj3V7Pj/gez3/s+HHU4IiIivao2FSceM9a2KGEUEYmKEsYKtXrx2/ztJz9k1HaTmf25szCzqEMSERHpVWbGsOqkWhhFRCKkhLECZVqaufXi72PxOHPO/SbJqqqoQxIREekTQ6uTrFXCKCISGSWMFaZYLDD3Z5ewdtkSTjz76wwdMzbqkERERPrM0Jok65QwiohERgljhfnnH/+PBU8+zqyPn8F2u+0edTgiIiJ9aqi6pIqIREoJYwV56ZEH+fctN/LOI9/NHsccF3U4IiIifW5YdVKT3oiIREgJY4VY9vpr3PXLnzBhp1058lOf1SQ3IiIyKKiFUUQkWkoYK0BLw1puvfgCqurrOfHL5xFPJKMOSUREpF8MrU6yri1HsehRhyIiMihFmjCa2Wwze9nM5pvZ1zvZfoqZPRs+HjGzPUq2LTSz/5jZ02Y2r38j7z+FfI7bLv0BresaOOmcb1A7bHjUIYmIiPSboTUp3KGxLR91KCIig1IiqhObWRz4OXA0sAh43Mxuc/cXSnZ7HTjM3deY2bHAlcB+JdtnufvKfgs6AvddfSVvv/Q8x/33uYydvkPU4YiIiPSrodVBr5q1rVmG1qiHjYhIf4uyhXFfYL67L3D3LHADMKd0B3d/xN3XhKuPApP6OcZIPXPPXJ655w72mfMBdjnosKjDERER6XfDwoRR4xhFRKIRZcI4EXirZH1RWNaV04E7StYduNvMnjCzM7o6yMzOMLN5ZjZvxYoVPQq4Py164Tn+8btfMW3PvTn45FOjDkdERCQS7a2KmilVRCQakXVJBTqb5rPTEe1mNosgYTy4pPggd19sZmOAe8zsJXd/cJMXdL+SoCsrM2fOrIgR8+tWLOe2y37A0LHjOe6/zyUWi0cdkoiISCTUwigiEq0oWxgXAduVrE8CFnfcycx2B64C5rj7qvZyd18cPi8Hbibo4lrxcpk2brnkAgq5HCed+w2qauuiDklERCLQjYnhDjezhnDyt6fN7FvdPbaStLcwrmnJRhyJiMjgFGXC+Dgww8ymmVkKOBm4rXQHM5sM/AU41d1fKSmvNbP69mXgGOC5fou8j7g7d/3yJ6x443Xe86VzGTFhUA3ZFBGRUMnEcMcCuwIfMbNdO9n1IXffM3x8byuPrQgjalKYwcomJYwiIlGIrEuqu+fN7EzgLiAO/Nbdnzezz4bbrwC+BYwEfhHeqD7v7jOBscDNYVkC+IO73xlBNXrVv2+5kZf/9RCHfPQTTN9rn6jDERGR6KyfGA7AzNonhnths0f1/Niyk4jHGF6TYmVTJupQREQGpSjHMOLuc4G5HcquKFn+NPDpTo5bAOzRsbySvfbEv3n4j9ex80GHsc+J7486HBERiVZnE8Pt18l+B5jZMwRDOs5x9+e34tiKMaouxSoljCIikYg0YZTAqkVvMfdnFzNm6nSO+a8vEraciojI4NWdieGeBKa4e5OZHQfcAszo5rGEM4yfATB58uQeBdvXRtWl1SVVRCQiUY5hFKCtqYlbL/k+iVSaOeecTzJdFXVIIiISvS1ODOfu69y9KVyeCyTNbFR3jg2PudLdZ7r7zNGjR/d2/L1qZF1aXVJFRCKihDFCxWKBv/30hzQsX84JXz6PIaPGRB2SiIiUh+5MDDfOwi4pZrYvwTV9VXeOrTRBl1S1MIqIREFdUiP00B+uYeEzT3L0GWcyaefdog5HRETKRDcnhvsA8DkzywOtwMnu7kCnx0ZSkV4yqi5NUyZPW65AVVL3JhYR6U9KGCPywkP3Me/2v7DHMe9h9yNnRx2OiIiUmW5MDHc5cHl3j61ko+vSAKxozLDdiJqIoxERGVzUJTUCS197lbt/9VMm7foOZn38M1GHIyIiUtZG1qUANI5RRCQCShj7WdOa1dx6yQXUDhvOCWefRzyhRl4REZHNGRW2MGoco4hI/1PC2I/yuRy3Xfo/tDU3Meecb1AzZGjUIYmIiJS9UfVhl1S1MIqI9DsljP3E3bn3N79kySsvMftzZzNm6vSoQxIREakIY+rTmMHShraoQxERGXSUMPaTp+78K8/ddzf7v+/D7HTAwVGHIyIiUjGS8Rij69IsXtsadSgiIoOOEsZ+8OZzz3D/tb9m+t77cuAHT4k6HBERkYozflg1S9TCKCLS75Qw9rGG5Uu5/bKLGDFhEsedeQ4W01suIiKytSYOq2Jxg1oYRUT6m7KXPpRta+WWiy/Avcicc79Bukb3jhIREdkW44dWs2RtG+4edSgiIoOKEsY+4sUid1x+KaveepPjv/Q1ho+bEHVIIiIiFWv80CpacwUaWnNRhyIiMqgoYewjj/7lj8x//F8c+rFPMnWPd0UdjoiISEWbMKwagLc18Y2ISL9SwtgHXn38Xzxy4+/Z9ZBZ7P2ek6IOR0REpOK1J4xL1mriGxGR/pSIOoCBZuWbC7nj8ksZt/0Mjj7ji5hZ1CGJiFSEPy9dzQ8WLOHtTI6J6STnTR/P+8eNiDosKRMThlYBaOIbEZF+poSxF7U2ruOWi79PqqqKE885n0QqFXVIIiIV4c9LV3PWi2+QI/iRbVEmx1kvvgGgpFEAGF2fpjoZZ+HKlqhDEREZVJQw9pJiocBff/y/NK1exYe+fRH1I0ZFHZKISFnJF52GfIGGfIG1uTxr84XgkcvzvVcXrU8W2+Uw/t+LC5UwCgBmxtRRtSxc1Rx1KCIig4oSxl7ywHW/4c3nnuHdn/0SE3bcOepwRET6hLvTWCiyJpcPkr9cgTX5Ag35PGtzQQIYlOVpyAXJYftyY6G4mVc2jvz3w3z61j8yZvVKlo8YxVVzPsy9+xzUb3WT8jdtVA0vLmmMOgwRkUFFCWMveO6+e3jyjtt417En8o5ZR0cdjojIZrk7LcXihoQuFyZ8+QJr15fl17cGrt8ebttc2hd3J+0FUoUCqUKeVD5HKpdlUi5DOpuhKtNGTbaNdD5HOp8lnctRlc+yspjmzD9dS1UuC8C41Ss55/9+TVU2A0fs1T9vjJS9qSNrufv5ZeQLRRJxzdsnItIflDD20OJXXuLvV/2cye/Yg8NOPT3qcERkEMkWiyUJ3YZung1h4re2Q6vf2nx+fSKY28y9z82dVLFAupAnmc+RzmVJ57KMy2aYlsusT/TS+WyY+IX75HMkigWKFiOXSJJPJikmU5BMYakU8VSKZG2a1IghVKXS1MZj1Mdi1AETvv719cliu6pclk/eeiN88yt9+0ZKxZg6qpZ80Vm0ppWpo2qjDkdEZFBQwtgDjatXctuPLqRu5CiOP+trxOLxqEMSkQpTcGfd+gQvSPoaSsb2tSeAa7J5VmdzrMoG2xuLRTKbSfoAkmELXzqfoyqXoSqXZXQux6T1id6GxK8qnyOVy5Es5MBiFJJJivEECTOSbsFz0Ui5k8oTJJT5Asl8gVQ+TzKXI5XNkshmiWcy0NYGba3EMm3EMm3Es20kshmSueCRymWJsYUKAMObGnrpnZaBYHqYJL6+qlkJo4hIP1HCuI3y2Sy3XXIh2dZWPnD+96muHxJ1SCISEXenqVAMW/I2dO1cn/Tl8izPZFnZlmV1uN5YcJrdaWPzt95JFAqk8lmqchta80bmskwIE77qbIba5mZq21pItWVIZvOkcgUS+QLxopMoOMligUShSLJQIJXLk8znSeWzJHM5krksyVyWVDa7PpkLEroMqUJuq96HvMVoSyTIJJK0JeJkkgmyyTiZZIxsbYzM8BTZRJpM0simIJNsfzgf+ucihnRyt4SV9ep2KBtMC5PEBSuambVTxMGIiAwSShi3gbtzz5U/Y+lrr3LiV/4foyZPjTokEekFrYXiJuP3VmdzLGvNsLQ1w4pMhjXZICFsLBRpKTotGG0Y3tU9V91JZ7PUN61jaFMzdc1NTGhpoballZrWFmragnF96bYsqXyWdDZLKp8nlQuSw1TYLTQVdvtM5cP9wkeyWNiqOmbjsSCZSwSJXCZptCZjrE0bmfr2BC5OJllNJllFJuW0JT18LtKWLtKWKpBJQVtyQ9LXloJC3IAikNliHPFigngxuf65udr4rzucqvyGfdoScP3hzmFbVUMZyEbWpRlVl+KlJeuiDkVEZNCINGE0s9nAT4A4cJW7X9Rhu4XbjwNagE+4+5PdOba3feU3F3Ln1P1YZSMY6auZXd3GBz54CjP2PbAvTysD3CZ/Vwsf40ennx91WH2mP+qbKzpr8/mwG2eOxS0Z3m5uYVlrhpWZLKuzORryBZoKRZqLTqsTtPLlcyRbs1S1tlHT1kZVaxtVbRmq21qpymSoamujtrWVUW2tVGeCR1W2japcG1XZtpLxfEH3znQ+H3QFzeeJ+5a7XpbKJIy2pJFJGJmkrU/IGmuD1rhMymlLeZisxWgraa1bn8SljLb29ZLtxZgBjnmBRDFGohgnXkyQ8ASJYjwsi5H04DlVjAVdUYsxkm4MLxqpIqSyMVJtkHYjVQie08VwvWhUFTwsM9IeI11g/XKVG3EMM8AdM+OjM1u5fMZePLr9B1hlIxnpq9j/tZtYkHiqV/8+pPLtMn4ILy5Vwigi0l8iSxjNLA78HDgaWAQ8bma3ufsLJbsdC8wIH/sBvwT26+axveYrv7mQG6cdSdaqAFhlo7hx2pHw+r0c0BcnlEGhy7+r31w4IJPGralv0Z212Rxvt7TxZmMzi1taWdrUzOo162hc10ymqYVccwvF5nXEW5tJtTWTyrSQzgTJW/DIBI98lqpcjh1yOXbL50jn8lTl86TzBdL5PFW5Aql8ka3p+FhkQxK2UStbrdGY7JC8pcKkrkNrXCYJhUSMQjJGIRGjmIjhyTiWMBIWJ+VGkiBJSxIjhZH0GCnbUJ4iRr0ZwwmWkwRjDVMYSYuRJEbCCPY3SBAj6ZCwGDEDTzgYuDmY42xYxhy3IlgRpwhWCNc7lhfXrwdlvlGZW5GcFclakUY2Lid8PYBpS9/DPeM+WvL3MZp7dvgkRy2p7oW/PhlIdhk/hKsfWaiZUkVE+kmULYz7AvPdfQGAmd0AzAFKk745wLXu7sCjZjbMzMYDU7txbK+5c+p+67/EtMtaFX+cdjSP3/2nvjilDAILph1N3lIblQ3kv6vN1XfeXe317dAS552U1YYPDBgKPrTjAV2shYd0sMW2P9tkQXrC6fRNf33c9p3+fTw27j39E5dUjF3G15PNF1mwspkdx9ZHHY6IyIAXZcI4EXirZH0RQSvilvaZ2M1jATCzM4AzACZPnrxNga6yEZ2W50l2Y44/kc7lSXZZPhD/rjZX32JXSZl1UtYD1slr9Woa2FmC23Hzlkq9s/0G4l/Exrr6+1hlI/s5Eil3u4wPJpl7cck6JYwiIv0gyoSxs+9pHb8VdbVPd44NCt2vBK4EmDlz5jZ96xrpq1llozopX8UH//HotrykCL86ekSXf1cfu+0ftNXVRBBV37lyM/X90ANvE/MEcYsT8xgxN2LEoWgYhnkMdyP4rx8DN9ygvblqQ5fKYlBmvr5rJBTACuFy0BXSKeLhPh4eH5biQMHaX2lDeXg0Reuf5M0cYsSIYcSCd2H98sZlhMvhu2OUlPv6cjMnBhgelntYFizHKQZlFIlRxNwxKwTLFDEvrl+OeYEY+XC5SIwc5oWgvJjHrAheCN4xL1KgiDsUKFLEKbhToBC81+EZv3b0V7v4+1jdL++3VI7tR9dRlYzx7KIG5uw5MepwREQGvCgTxkXAdiXrk4DF3dwn1Y1je83shY9tNPYKIOVtzF74GP990aV9dVoZ4N7oMKYPNvxdHfr3B0iMHs3wj32M4R/+EPFhw6ILtJe8uZn6fvHC7o/ZzOfyNK1uZOXStSx/ey0rljewpqGVdU05WrNFsnmjUDAoBolU3IOZsWJFI+5GrBg+CnGsEF/f6hgLH8AmbV0xy5KItZK0VpKxZtLWTBVNJGOtJGJtJCxDMpYhaTnMsiQsT8zyxGJ5YuH4PwMKFidPkqwlyZMkb0nyJCgQJ2/Bc8HiFIgRpGodHmYU3TY8Y2FiW/IctlAWw4d7mOx6aQIcJL+d/8xmBO8Y4N24RFiH5463o3XCBDdWkuyGy74h+T307X/zt0lHbPL3MevtecBRW45DBo1kPMbuk4bxxBtrog5FRGRQiDJhfByYYWbTgLeBk4GPdtjnNuDMcIzifkCDuy8xsxXdOLbX/Oj082GQzWYpfa+rv6tLPvX/aN7xUFb/7mpWXHYZK6+4gmHvex8jPn4aqW3sVl0Oeuv/USKZYNjY4QwbO5wd9tj6OHKZHE2rm2has451q9exZnkza1e30Lw2S2tjlpZMkUwessUYBeIUiePEwYZgDGufD4Z4EeJ5J1mARHHL53Uc4nmI54jFssTiGeKxtjAJbaXKmqmimTprpJZGalhHHeuotXWkrYWktZCOtRAnS1d38CiVL8bIF+MUPE6eOHlPkCMRLFuCvCXIkCQbT5OxJDlLkbUUWZJkY2myliYXS5GzNDmLkydB0YL3oxgzihZkhrGwNROcmG/o9Gse5pBuYWJq7W9E0EKM4eF4RscY+5pznN3LQxM2/H0csvgxRr22dfeCHEi6Oxu4me0DPAp82N1vCssWAo1AAci7+8x+Cbqf7D1lOFc9tIC2XIGqZMdfKUREpDeZb+V07716crPjgB8TXAx/6+4XmtlnAdz9ivC2GpcDswluq/FJd5/X1bFbOt/MmTN93rx5fVEVkT7R9vLLrP7d1TT87W+Qz1N/1FGM+OQnqN5rL6w7WYP0umxbjsbVjTStbqR5bRPNDS00r21h3do2mtflaGsukGsrUshBIWfkLU7BEhQtSLg8Fvy7tSdUsSLE3EkUIN6Nj+OiOfmEk08UKcYLFBN5iOexeDZIRGMZErFW0tZCFU1U00gt66j1ddR6A/XeQD0N1HgrKc+R9BxJ8sS3oatt0Y28x8h70Cqatzh5YuRjsaA1NRajEItTiMUoxGIUE0Gy6fFYmHymKBRTFApJHmqYRbNtmhzWepJzv7v1P86Z2ROVnCSFs4G/Qsls4MBHOs4GHu53D9BGcC0sTRhnuvvK7pyv0q6Pf39hGZ++dh5/+q8D2Hda5/MMiIhI57b2GhnpfRjdfS4wt0PZFSXLDnyhu8eKDDRVO+3EhIt+wOizz2bNH/7AmhtuoPGee6jaY3dGfvKT1B91FJaI9L/xoJOqSjJywghGTtj6L6nuvnHCuaaZlnUttK5ro7WpjebGLC2NeTKtRfIZKOQNL8Rwj4MncItTtBheNGL5GJZPEM+kgzGKHiSf8WLQtbZI8CtbC7Cqk1hyMcJ7PAaPbBLyCaeQKFCMF/BEHmI5LJ4lbm1UWTPVNFFTmngWGqgrNFObb6U630Z1IUO6kCWdy1HlWYKOtwXiViBhRWLxYpeto/HiRO6MbU/BNjTXxj3G/izc6vd5gOjOTOIAXwT+DOzTv+FF611ThgPw+MLVShhFRPqYvmmKVIDk2DGMOfssRv3XGay9+WZWX3Mtb591NsmJExlx2qkMff8HiNfVRh2mbIGZka5OkZ44klETt372T3cn05KlcU0jTaubaF7TRMu61iDhbGyjrSVLW3OBbGuBTJuTzxnFQhyKcdwTQGJ9y3SyCPGMU5Vrv/9iGKNDzOPEPI5R1WUsjeEjE9848cykjEzayCRj4X0nY2SSRlvSyCagmMiToI0qa6LW11Hn6xhaaOC/nn+E7QrHsLz2TVosQ42nGdM8mdHxx7f6fRogtjgbuJlNBN4LHMGmCaMDd5uZA78KJ4AbMEbUpth1/BAeeGUFX5i1Q9ThiIgMaEoYRSpIrKaGEaecwvCTT6bpvvtY9burWfaDi1jxs8sZ9qEPMeLUj5EcPz7qMKWPmBlVtWmqatOMnrTpjKJb4kWnrSVL0+p1NK5qormhmZaGFlob22htypBpzpFpzZNtLZDNOPksFPJxvBjHPYnZpre+SBcgXXC8bcOMs+1TWVs4qU0nNQHqw8dEisC97AvEqG0eT/tPH83AI/HT2HmrazogdGc28B8DX3P3Qidd1A9y98VmNga4x8xecvcHNzpBL9x2KkqH7zSaXz24gHVtOYZUdX5bFhER6TkljCIVyOJx6o86ivqjjqL12WdZffXVrL7mGlZfey1DZs8OxjnutlvUYUqZsZhRXZemum40oyeP3urji4Uibc1ZGlc30ry6MRi/GSacbU0Z2ppzZFvzZNuK5LJOIQv5XIxiMU4w92znX+pjBBPfdJYhtRQGbXfD7swkPhO4IUwWRwHHmVne3W9x98UA7r7czG4m6OK6UcLYG7editLhO43hF/e/xiPzVzL7HfqhTESkryhhFKlw1bvvzsRLL2X0ordZc911rL3pJtb99a/U7LsvIz7xCeoOPwyLxbb8QiJbEIvHqBlSRc2QKpi69QlnoVCktTFDc3uX2oZmmhtaaW1s45nH8qQKmx6Tiw/ayZ22OJO4u09rXzazq4G/uvstZlYLxNy9MVw+Bvhev0XeT/aaPIz6dIL7XlqhhFFEpA8pYRQZIFKTJjL2vK8z6swvsPZPN7L6uutY9PnPk5o2jREf/zhDT5pDrKrrMWkifS0ej1E3rJq6YdWMnTZmo20v/HMuxVgVsZJ2rqJBMt/Wz1GWB3fPm9mZwF1smA38+dKZxDdz+Fjg5rDlMQH8wd3v7OuY+1syHuPwncdw9wtLuaDwDpJx/TAmItIX9OkqMsDE6+sZefqn2OGeu5lwySXEampY+p3vMH/WEaz46U/Jr+zWLPsi/Wq3g6qwYn6jMivm2e2gwfsjh7vPdfcd3X379ltHufsVnSWL7v6J9ltquPsCd98jfOzWndtOVaqT9pzAmpYcD76yIupQREQGLCWMIgOUJZMMPf49TL3pRqZcdy3Ve+3Fyl9ewfwjjmTxN75BZv78qEMUWW/WaUew20EJoIngjkpN7HZQglmnHRF1aFLGDt1xNMNrktz81NtRhyIiMmCpS6rIAGdm1OyzDzX77EPm9ddZfc01NNxyKw03/ZnaQw9h5Cc+Qc0BB9DJLIsi/WrWaUcw67Soo5BKkozHOGGPCfzx8bdY05xleG0q6pBERAYctTCKDCLpadMY/53vsMN9/2D0l/6bthde5M1Pnc7r730fa2+5Bc9mow5RRGSrnLLfFDL5In/495tRhyIiMiApYRQZhBLDhzPqc59jh3v/zvgLL4RCgSVfP4/5Rx7Fyl9dSWHt2qhDFBHplp3G1XPIjFFc88hCsvli1OGIiAw4ShhFBrFYOs2w97+Pabfdyna//jXpHXdkxWWX8eqsI1j6/QvIvqlf7EWk/H36kOksb8xw0xOLog5FRGTAUcIoIpgZdYcczOTfXMW0W29lyOzZrPnTn3jt3bNZ9MUv0vLkk+FEJCIi5efQGaOYOWU4l/39FVqy+S0fICIi3aaEUUQ2UrXTjkz4wf+ww71/Z+QZZ9D878d546OnsPDkk1l3xx14Xl/GRKS8mBnnHbczKxozXHH/a1GHIyIyoChhFJFOJceMYczZZzHjvn8w9lvfpLB2LW+f/WVee/dsVl9zDYWm5qhDFBFZb+8pI5iz5wR+cf9rvLB4XdThiIgMGEoYRWSzYjU1jPjoR9l+7lwm/fxyEuPHsewHFzH/8MNZ9sOLyS1ZEnWIIiIAfOeE3RhWk+ScG58hky9EHY6IyICghFFEusXiceqPPJKp//d/TL3xT9Qdegirr7mG+Ucfw9vnnEvr889HHaKIDHLDa1P84H2788KSdXzj5uc09lpEpBcoYRSRrVb9zncy8dJL2eHuuxjxsY/RdN99LHz/B3jjtI/T+I/78KKmtheRaBy961j++4gduPGJRVz54IKowxERqXhKGEVkmyUnTmTs17/GDvffx5ivfpXsW2+x6POfZ8F7jmfNDX+k2NoadYgiMgidddSOvGf38fzgjpf43T9fjzocEZGKpoRRRHosXl/PyE99kh3uvosJP7qEWG0tS7/zHebPOoIVP/0p+ZUrow5RRAaRWMz48Yf35N27jeW7t7/A/975EsWiuqeKiGwLG0z9+2fOnOnz5s2LOgyRAc/daX3iCVb97mqa/vEPLJlkyIknkJoyhTXX30B+yRIS48cz5uyzGHrCCVGHKwOQmT3h7jOjjqNSDNTrY65Q5Fu3Psf1/36LI3cew0Xv353R9emowxIRidTWXiMTfRmMiAxOZkbNzJnUzJxJ5vXXWX3ttay98SYouYdjfvFilnzzWwBKGkWkTyTjMf7nve9kp7H1/M/cl3j3jx/kOyfuxgm7j8fMog5PRKQiqIVRRPrFq4cfTn7psk03xGJU7bILiXHjSI4dGzyPH0di7FiS44LnWFotArJ11MK4dQbD9fHVZY185cZneHZRA3tuN4yvH7sz+08fGXVYIiL9Ti2MIlKW8suWd76hWCQ+cgS5t96iZd48ig0Nm+wSHz48SCTHjSMxbizJseFze9nYscSqq/u4BiJSyWaMrecvnzuQPz+5iMvueZWTr3yUPbYbxicOnMJx7xxPOhGPOkQRkbKkhFFE+kVi/HjyixdvWj5hApOvvHL9erGlhdzSZeSXLS15Xkp+yVJyS5bQ+tRTFNau3eR14kOHkihJKINWynEkx41d33oZq63tyyqKSJlLxGN8eJ/JzNlzIjf8+02u/dcbnP3HZ/j2rc9z9K7jeM/u4zhw+1FUJZU8ioi0iyRhNLMRwB+BqcBC4EPuvqbDPtsB1wLjgCJwpbv/JNz2HeAzwIpw9//n7nP7I3YR2TZjzj6LJd/8Ft7Wtr7MqqoYc/ZZG+0Xq6khPX0a6enTunytYlsb+WXLyC1Z2iGxXEZ+6VLa/vMchdWrNzkuVl8ftlKGieT6hHL8+sQyXlfXa3UWkfJUlYzziYOmcdoBU/nnayu55anF3P3CUv785CJSiRh7Tx7OgduP5F1ThrPbhCEMq0lFHbKISGSiamH8OnCvu19kZl8P17/WYZ888BV3f9LM6oEnzOwed38h3H6Zu1/SjzGLSA+0T2yz/LIf93iW1FhVFakpU0hNmdLlPsVMhvzy5eSXBolkbukS8kuXkVu2lPzSZbS99CKFFZve7iNWW7thPOX4cRt1f21PMGNDhmjCDJEBIBYzDpkxmkNmjCaTfwePvLaKf766kkdeW8WP7nll/X4Th1Wz64QhTB9dy5QRtUwZWcPkETVMGFZNPKbPAhEZ2KJKGOcAh4fL1wD30yFhdPclwJJwudHMXgQmAi8gIhVp6Akn9NuMqLF0mtR225Habrsu9/FsltzyFRu6vZYklLmlS8k89DD5FSugw+RgVlMTTtBTOp5yfEliOZb4sGFKKkUqSDoRZ9ZOY5i10xgA1jRneW5xA88vXsfzi9fxwuIG7n95ObnChs+DRMwYWZdidH2aUXVpRtelGVWfZlh1kvqqJPVVifCRZEj4XJOOU5WIk4ybPiNEpCJElTCODRNC3H2JmY3Z3M5mNhXYC3ispPhMMzsNmEfQErmms2NFRLpiqRSpSRNJTZrY5T6ey5FfuTJMKDd0e80tC56bH32U/PLlUCxu/Nrp9PpEsr37a2lCmRw/nvjw4frCKFKmhtem1rc+tisUnSUNrby5qoU3Vrfw1uoWVjRmWNmUYUVThpeWNLKyKUO+uOUZ6M0gnYhRlYyTTsRIJ8LnZLCciBmJuBEzIxEz4rFY+Bw82pfb9zEDo/05uL3RpmVhOUDJtliH/Qj3KT0+HtsQSyy28XM8ZgypSjK6PsWoujQj69LUpuL6fBMZIPosYTSzvxOMP+zo/K18nTrgz8BZ7r4uLP4l8H3Aw+cfAZ/q4vgzgDMAJk+evDWnFhHBkkmS48eTHD++y308nye/atWGhHLZ0o3GV7Y8Po/c8uUb3Yey/bU3up1I6XjKsPtrfORILBbr62qKSDfEY8ak4TVMGl7DgV3s4+40Zws0tuVobMvT2JZjXVueprY8jW15mjN5MvkCmXwxeOSC5bZcSVm+QL7gZHJF8kWn6E6+4BSKTr5YpFB0Cu4UCk6+GJR7eO7gOVx2Ni1nQzkl68WSfXpDVTK2PnkcXRckksF6av3z8JoUw2qSDK9JaaIhkTLWZwmjux/V1TYzW2Zm48PWxfFAp/Ptm1mSIFn8vbv/peS1l5Xs82vgr5uJ40rgSgjuM7XVFRER2QJLJEiOHUty7Fiq9+h8Hy8WKaxaRW7phu6v7QllbukSWp9+mnXLlkEut/GBySTJMWM2TSxLZoJNjBqJxfVlS6QcmBl16QR16QTjh0YdzbbrmHAW3CkWWZ+oFjxIXotFyBWKNLTmWNmUYWVTlpVNGVaVLC9a08ozixpY3Zyl0EXrazoRY1hNkmHVKYbWJBlWnQzWa1IMDZfr0kEX37r0huX6qgS16QTJuH5YE+krUXVJvQ34OHBR+Hxrxx0s6MfwG+BFd7+0w7bx7V1agfcCz/VtuCIiPWOxGInRo0mMHk31O9/Z6T5eLFJYs6ak++vG4ypbn3+O/L334pnMxgfG4yTGjClJKDt0fx03jsTo0VhCd1ISke5p79Iarm3xC2PXo8U3KBadNS1ZVjVnWdmYoaE1x5qWHGtbszS05FgbLq9tyfHm6haeXRSst+WKW3ztqmSMunQyTCiDR206QU0qTnUyTnUqfCSDR1XJcnUq6BpcnYxTk0qE22PrtyeUjMogF9W3h4uAP5nZ6cCbwAcBzGwCcJW7HwccBJwK/MfMng6Pa799xg/NbE+CH74WAv/Vr9GLiPQBi8VIjBxJYuRI2G23Tvdxdwpr125IKJct23CfymXLyLz0Ek3337/R7UsAaE9YSyfqaW+lbG+9HDMGSyb7oaYiMhjFYsbIsJvqjmPru31cW65AQ2vQxbcpE3Tvbcp0XM/TmGnv+pujKZNn0ZoW2nIFWnMFWrMF2nJFsoUtJ5+bxG2QSsRIxmOkw+dUIkYqvvFyKhEL9zNSiXhYZhvtl4zHwvGgQVLevhwzCx/B+2RmxK19v2Asaan9p49k8siara6LyLaIJGF091XAkZ2ULwaOC5cfBjodLe3up/ZpgCIiZcrMSAwfTmL4cKp22aXTfdyd4rp1G0/UU3Kfysz8+TQ9/DDe0tLxxYmPGrkhkRzb4X6V48eTGDOGWEr3pBOR/lOVjFOVjDN2SM9fK18oBglkrkBbdsNykFBuWC59zuaL5ArB+NJsoUgufC4tzxWKtGTzrG0tksv7+u2l+2XzxW5NiNQdh+44mkNnjOLUA6aQTmhIgvQt9U8SERlgzIz40KHEhw6FnXbqdB93p9jU1OV9KrMLF9L8r0cpNjVtcmx85MjNTtSTGDuWWFXVVsfdcPvtvXKfzoHCzGYDPwHiBL1vLupiv32AR4EPu/tNW3OsyGCTiMeoj8eor4qmN4W7UwwnGSoUN0w4VHDHi8Hy+nVvX9/4Nc7+49M8+MoKHnxlBUsa2vjm8btGUhcZPJQwiogMQmZGvL6eeH096Rkzutyv0NS0odtre0K5ZCm5ZUvJLVpEyxNPUGxo2OS4+PDhJRP1tI+nbG+5DCYIitVs6E7VcPvtLPnmt9Z3pc0vXsySb34LYFAmjWYWB34OHA0sAh43s9vc/YVO9vtf4K6tPVZE+l/Q1RTiGNs6MWw6sWFM5W8efp0Dtx/JkbuM7aUIy19DS45E3KhN914a8/baVopFZ7sRG65LhaITj/X81jBPvLGG3ScN3WhiJg9/MEh0KCvXW9EoYRQRkS7F6+qI19WR3n77LvcptrSsvy/lhu6vYYK5dCmtTz9NYe3aTY6LDR26PqFsmffEJuMuva2N5Zf9eFAmjMC+wHx3XwBgZjcAc4COSd8XCWYT32cbjhWRCjR1ZC0Pvbpy/frp18zj8J1Gs8PoOuLxYMxk0Z3qZJyiQ77oGJTcr5Pw3poxXl/ZxPDaFLWpYIKgRMy4+4Vl7DJ+CJNH1NCUybOuLceQquT6+20+vnA1o+pSjK5PU5tOsLShjddXNrPf9JHkS8aINrblKbozuj5NazYYh5qMx6hLJ6hOxSm6c9fzy9hlXD1vrm5hhzF1jKpL8++FqykUnGmja3lxyTqeWLiGo3cby+4Th7JoTStXPfw6AGfO2oHqVJxsvsiTb65hXVuefaYMp6E1R00q6Mb8YPg+1aTijBtSxYjaFNNG1dKcyXPdo29wwh4TGFqd5NJ7XgHgrKNm8H+PvkE6Eeftta3sO3UEY4akWdWUZefx9fzrtVW8c+JQXly6jt0nDePRBauYOrKWEbUpUokYr69oZocxdYwbWsW8hat5eWkjixvamDismvfuNZGbn3qbncL6LlzZzKTh1Sxc1cLhO43m/pdXMH1ULcl4jJ3H11OdjJMvOq+taOL5t9cxuj7NxGHVfH7W9hy+02ZvYd/rzHvrhjsVYObMmT5v3ryowxARGXSKbW1hS+Wm96nML11K2wtd5DJm7PLi1uc5ZvaEu8/sYdiRMbMPALPd/dPh+qnAfu5+Zsk+E4E/AEcQzCr+V3e/qTvHhuWl9yne+4033uiHmolIT61syvDqsiZmTh3OzU++zeMLV3P/KytoastTcCdXKBIz6/IWJrJBzNiky29fGFKVoCmT7/JcqXhsowmZJg6rJpMvsrJp41nRdx0/hC8dNYN379bZre67b2uvkWphFBGRPherqiI1ZQqpKVM63f7qEUeSX7x4k/LE+PF9HVq56qxfUsevGj8GvubuhQ7dmLpzrO5TLFKhRtWlGVWXBuBD+2zHh/bp/KYmbbkCLdkCRvABUOzQSJTJF3F3hlQnyeWLNGcKVKVi5AtOW65Avuik4jGqU3GGVCXJF4usbMqu7045uj5NNh9M+jO6Pk1Daw4zyOSKpBMxWnMFalIJVjVnSK2fHdaoTsXJFYoUHaqTwTJAbTpBJlcgHjOS8RhrW3Mkw+Uh1UlWNWVoyxUpuDNlRA1m0JYrsq4tR1UiTiqxYQbafNFpyuTXz2DbXvdELEZTJk9Da44pI2rIF339fUTHDqmioTVHPGakEzHMIJ0I4lvRmKG+KkGh6AypStKWL6yf2bY1V6A2FceBZDxGvhBMbpTJF4nHjJpkHLMNXVwLRac5W6AuncA9KGv/DG9voe3YVbXo9Er32G2lhFFERCI35uyzNhrDCGBVVYw5+6zogorWIja+td0koGNGPRO4IfyiMQo4zszy3TxWRAa49tllu2tk3Zb2iG92sqCuzjW6Pt3tGOpKxiV2HKM4Zsimk6m131+zo0S863hGJFKMqA1m+07FjFQitv5c7eWlkvEYE4ZVb1RWk9oQWyqx8X06E/FYp+dPxG3989Dq9mNsk2M7ah/3GiUljCIiErn2cYqaJXW9x4EZZjYNeBs4Gfho6Q7uPq192cyuJuiSeouZJbZ0rIiISHcpYRQRkbIw9IQTBnOCuBF3z5vZmQSzn8aB37r782b22XD7FVt7bH/ELSIiA48SRhERkTLk7nOBuR3KOk0U3f0TWzpWRERkW2zaUVZEREREREQEJYwiIiIiIiLSBSWMIiIiIiIi0ikljCIiIiIiItIpJYwiIiIiIiLSKSWMIiIiIiIi0ikljCIiIiIiItIpc/eoY+g3ZrYCeCPiMEYBKyOOoS8MxHoNxDqB6lVpVK9tM8XdR/fh6w8ovXh9HEh/rwOlLgOlHqC6lCvVpfxsqR5bdY0cVAljOTCzee4+M+o4ettArNdArBOoXpVG9ZJKMpD+XQdKXQZKPUB1KVeqS/np7XqoS6qIiIiIiIh0SgmjiIiIiIiIdEoJY/+7MuoA+shArNdArBOoXpVG9ZJKMpD+XQdKXQZKPUB1KVeqS/np1XpoDKOIiIiIiIh0Si2MIiIiIiIi0ikljP3EzH5rZsvN7LmoY+ktZradmd1nZi+a2fNm9qWoY+oNZlZlZv82s2fCen036ph6k5nFzewpM/tr1LH0FjNbaGb/MbOnzWxe1PH0FjMbZmY3mdlL4f+zA6KOqafMbKfw36n9sc7Mzoo6LukZM5ttZi+b2Xwz+3rU8WxJV9cvMxthZveY2avh8/CSY84L6/eymb07uug31fFzvYLrsclnXgXX5ezwb+s5M7s+/G5REXXp7DvrtsRuZnuH1+b5ZvZTM7MyqcvF4d/Ys2Z2s5kNK9lWUXUp2XaOmbmZjSop6726uLse/fAADgXeBTwXdSy9WKfxwLvC5XrgFWDXqOPqhXoZUBcuJ4HHgP2jjqsX6/dl4A/AX6OOpRfrtBAYFXUcfVCva4BPh8spYFjUMfVy/eLAUoL7QUUejx49+nd8DZge/p0+U+7Xgq6uX8APga+H5V8H/jdc3jWsVxqYFtY3HnU9Suqz0ed6Bddjk8+8SqwLMBF4HagO1/8EfKJS6tLZd9ZtiR34N3BA+L3qDuDYMqnLMUAiXP7fSq5LWL4dcBfBvXRH9UVd1MLYT9z9QWB11HH0Jndf4u5PhsuNwIsEH5IVzQNN4WoyfAyIwb5mNgl4D3BV1LHI5pnZEIKLw28A3D3r7msjDar3HQm85u69ccN4ic6+wHx3X+DuWeAGYE7EMW3WZq5fcwiSFsLnk8LlOcAN7p5x99eB+QT1jlwXn+uVWI+uPvMqri6hBFBtZgmgBlhMhdSli++sWxW7mY0Hhrj7vzzIUq4tOabfdFYXd7/b3fPh6qPApHC54uoSugz4Kht/V+3VuihhlF5hZlOBvQha4ype2L3naWA5cI+7D4h6AT8m+FApRhxHb3PgbjN7wszOiDqYXjIdWAH8LuxqdpWZ1UYdVC87Gbg+6iCkxyYCb5WsL6KCfjzscP0a6+5LIEgqgTHhbuVcxx+z6ed6Jdajq8+8iquLu78NXAK8CSwBGtz9biqwLiW2NvaJ4XLH8nLzKYJWNqjAupjZicDb7v5Mh029WhcljNJjZlYH/Bk4y93XRR1Pb3D3grvvSfCr075m9o6IQ+oxMzseWO7uT0QdSx84yN3fBRwLfMHMDo06oF6QIOh68kt33wtoJugGNCCYWQo4Ebgx6likxzob/1IRvTK24vpVlnXchs/1sqxHaGs/88q2LuH4vjkEXQEnALVm9rHNHdJJWVnUpRu6ir3s62Rm5wN54PftRZ3sVrZ1MbMa4HzgW51t7qRsm+uihFF6xMySBBfb37v7X6KOp7eF3WHuB2ZHG0mvOAg40cwWEnQZO8LM/i/akHqHuy8On5cDN1Ne3ZK21SJgUUnr9k0EX6YGimOBJ919WdSBSI8tIhhD024SQfe7stbF9WtZ2GWL8Hl5WF6udezqc73S6gFdf+ZVYl2OAl539xXungP+AhxIZdal3dbGvogNXT1Ly8uCmX0cOB44JeyaCZVXl+0JfpR4JvwMmAQ8aWbj6OW6KGGUbRbOqvQb4EV3vzTqeHqLmY1unzHLzKoJPvhfijSoXuDu57n7JHefStAV8B/uvrlfPCuCmdWaWX37MsFg9oqfjdjdlwJvmdlOYdGRwAsRhtTbPoK6ow4UjwMzzGxa2HJ8MnBbxDFt1mauX7cBHw+XPw7cWlJ+spmlzWwaMINg4ohIbeZzvaLqAZv9zKu4uhB0Rd3fzGrCv7UjCcbJVmJd2m1V7GG31UYz2z98D04rOSZSZjYb+Bpworu3lGyqqLq4+3/cfYy7Tw0/AxYRTOa1lN6uy9bMzqNHj2Y2up6gH3su/Ac9PeqYeqFOBxM0Yz8LPB0+jos6rl6o1+7AU2G9ngO+FXVMfVDHwxkgs6QSjHt5Jnw8D5wfdUy9WLc9gXnh3+ItwPCoY+qletUAq4ChUceiR6/9mx5HMNPoa5Xwf7Cr6xcwErgXeDV8HlFyzPlh/V4mghkSu1Gn9Z/rlVqPzj7zKrgu3yX4sfk54DqC2Soroi6dfWfdltiBmWH9XwMuB6xM6jKfYHxf+//9Kyq1Lh22L6RkxvjerIuFB4qIiIiIiIhsRF1SRUREREREpFNKGEVERERERKRTShhFRERERESkU0oYRUREREREpFNKGEVERERERKRTShhFREREpCKYWVP4PNXMPtrLr/3/Oqw/0puvL1KplDCKiIiISKWZCmxVwmhm8S3sslHC6O4HbmVMIgOSEkaRCtb+S+s2HlttZg+0X0DN7J1m9oaZfa5kn5SZPWhmid6IV0REpJdcBBxiZk+b2dlmFjezi83scTN71sz+C8DMDjez+8zsD8B/wrJbzOwJM3vezM4Iyy4CqsPX+31Y1t6aaeFrP2dm/zGzD5e89v1mdpOZvWRmvzczi+C9EOlT5u5RxyAi28jMmty9bhuP/QKQcPeflJQdAFzq7geUlH0bmO/uv+9xwCIiIj3Qft0zs8OBc9z9+LD8DGCMu19gZmngn8AHgSnA34B3uPvr4b4j3H21mVUDjwOHufuqjtfUknO9H/gsMBsYFR6zH7ATcCuwG7A4POe57v5w378TIv1HLYwiA4SZfTn89fM5MzurpPyb4S+f95jZ9WZ2TrjpFIILXanlBBe+UreE+4qIiJSrY4DTzOxp4DFgJDAj3Pbv9mQx9N9m9gzwKLBdyX5dORi43t0L7r4MeADYp+S1F7l7EXiaoKusyICibmYiA4CZ7Q18kuAXTwMeM7MHgDjwfmAvgv/vTwJPmFkKmO7uCzu81EVA2symuPsbYdlzbLgwioiIlCMDvujud21UGLRENndYPwo4wN1bzOx+oKobr92VTMlyAX23lgFILYwiZczM/l7Salj6mNNh14OBm9292d2bgL8Ah4Tlt7p7q7s3AreH+48C1nY412yglqDrzvpWRncvAFkzq++LOoqIiGyDRqD0unQX8DkzSwKY2Y5mVtvJcUOBNWGyuDOwf8m2XPvxHTwIfDgcJzkaOBT4d6/UQqQC6FcQkTLm7kd1c9eufv3sqryVkl9UzawK+CFwIkFL5TuAuSX7p4G2bsYiIiLS154F8mHX0quBnxB0B30ynHhmBXBSJ8fdCXzWzJ4FXiboltruSuBZM3vS3UuHYtwMHAA8AzjwVXdfGiacIgOeJr0RqWAlA/LfRXDB3J+wSypwKsGPQr8CDgyXnwB+7e6XmNlbwAx3bzOzC4C1YfkHgBPd/bTwHCOBh919l/6un4iIiIhESy2MIgOAuz9pZlezoYvMVe7+FICZ3Ubwq+gbwDygIdznbuDgMHE8GjgoLP8PG9+LahYbtzaKiIiIyCChFkaRAc7M6ty9ycxqCMZhnBEmmHsBX3b3U7dw/F+A89z95f6IV0RERETKh1oYRQa+K81sV4Ixi9e4+5MA7v5UeDPjeDixzSbC2VRvUbIoIiIiMjiphVFEREREREQ6pdtqiIiIiIiISKeUMIqIiIiIiEinlDCKiIiIiIhIp5QwioiIiIiISKeUMIqIiIiIiEinlDCKiIiIiIhIp5QwioiIiIiISKeUMIqIiIiIiEin/j8XM5sxjjdfpgAAAABJRU5ErkJggg==",
"text/plain": [
""
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"plt.rcParams['figure.figsize'] = [15, 5]\n",
"fig, (ax1, ax2) = plt.subplots(1, 2)\n",
"ax1.plot(-np.log(l_), np.array(coefs_), marker=\"o\")\n",
"ax1.set_xlabel(r\"$-\\log(\\lambda)$\")\n",
"ax1.set_ylabel(\"Coefficients\")\n",
"ax1.set_title(\"Leapfrog Regularization Path\")\n",
"ax1.axis(\"tight\")\n",
"ax2.plot(np.array(loss_), marker=\"\")\n",
"ax2.set_xlabel(\"Iteration\")\n",
"ax2.set_ylabel(\"Loss\")\n",
"ax2.set_title(\"Optimization\")\n",
"ax2.axis(\"tight\")\n",
"plt.savefig(\"README_files/README_1.png\")"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"

\n",
" \n",
"

"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The regularization path is similar to the standard regularization path, except that it is estimated only at specific positions (*q=[0,1,2,60]*), as shown by the dots. It allows to leapfrog over solutions that are not of interest, i.e. all solutions with 3-59 selected features."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Two-layer neural network with Leapfrog Regularization\n",
"Leapfrog regularization can also be used with more complex models. We demonstrate leapfrog regularization on a two-layer neural network. However, as opposed to logistic regression, the optimization problem for a fixed regularization strength is not convex. As a result, we will get different solutions when we vary the initial conditions or the order in which we estimate parameters (i.e. the order of *q*). Furthermore, the loss can increase during training, because the leapfrog algorithm increases the regularization strength."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Define a simple two-layer neural network for generating the labels y.\n",
"# The first layer has two output neurons, each with two non-zero weights.\n",
"# Our goal is to estimate the sparse weight structure of this layer\n",
"def sigmoid(x):\n",
" return 1/(1 + np.exp(-x))\n",
"def activation(x):\n",
" return torch.nn.LeakyReLU()(torch.tensor(x)).numpy()\n",
"def generate_data():\n",
" rng = np.random.RandomState(0)\n",
" # Generate data X from a standard normal distribution\n",
" X = rng.multivariate_normal(np.zeros(p), np.identity(p), n)\n",
" # Push the generated data through a neural network\n",
" t1 = activation( 1.1*X[:,5] - 0.8*X[:,6])\n",
" t2 = activation( 1.4*X[:,7] - 1.3*X[:,8])\n",
" t3 = sigmoid ( 1.2*t1 + 1.3*t2 - 1.2)\n",
" # Convert output to binary labels\n",
" y = t3 > 0.5\n",
" return X, y"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {},
"outputs": [],
"source": [
"# Number of samples\n",
"n = 10000\n",
"# Number of features\n",
"p = 10\n",
"# Generate features X and labels y\n",
"X, y = generate_data()"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {},
"outputs": [],
"source": [
"class TwoLayerModel(torch.nn.Module):\n",
" def __init__(self, p, q, k, weight_decay=None):\n",
" super(TwoLayerModel, self).__init__()\n",
" # First layer is subject to leapfrog regularization\n",
" self.linear1 = lf.Linear(p, k, q, weight_decay=weight_decay)\n",
" # Second layer is dense\n",
" self.linear2 = torch.nn.Linear(k, 1)\n",
"\n",
" def forward(self, x):\n",
" x = self.linear1(x)\n",
" x = torch.sigmoid(x)\n",
" x = self.linear2(x)\n",
" x = torch.sigmoid(x)\n",
" return x"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Training process has finished for target q=10.\n",
"Training process has finished for target q=5.\n",
"Training process has finished for target q=4.\n",
"Training process has finished for target q=3.\n",
"Training process has finished for target q=2.\n",
"Training process has finished for target q=1.\n",
"Training process has finished for target q=0.\n"
]
}
],
"source": [
"# Specify a list of the number of features we want to estimate. We typically obtain\n",
"# better solutions if models with more parameters are estimated first.\n",
"q = [10,5,4,3,2,1,0]\n",
"\n",
"# Define a two-layer neural network for binary regression\n",
"model = TwoLayerModel(X.shape[1], q, 2)\n",
"\n",
"# Binary regression models are trained using the binary cross-entropy\n",
"loss_function = torch.nn.BCELoss()\n",
"# We use a standard optimizer such as Adam...\n",
"optimizer = torch.optim.Adam(model.parameters(), lr=0.005)\n",
"# and augment it with a Leapfrog optimizer that performs the\n",
"# regularization steps\n",
"optimizer = lf.Optimizer(optimizer, tolerance=1e-8)\n",
"# A maximum of max_epochs is used for training\n",
"max_epochs = 10000\n",
"# Define the training set and data loader for training, with\n",
"# a batch size equal to the full training set (i.e. do not use\n",
"# stochastic gradient descent, because the data set and model\n",
"# are fairly small)\n",
"trainloader = DataLoader(\n",
" TensorDataset(torch.Tensor(X), torch.Tensor(y)),\n",
" batch_size=int(X.shape[0]),\n",
" shuffle=False,\n",
" num_workers=1)\n",
"\n",
"# Record the regularization strength lambda\n",
"l_ = []\n",
"# Record the loss\n",
"loss_ = []\n",
"# Record the coefficients (weights) of the model's first layer\n",
"coefs1_ = [] # First layer output neuron 1\n",
"coefs2_ = [] # First layer output neuron 2\n",
"while True:\n",
" # Do a maximum of max_epochs iterations over the training set\n",
" for _epoch in range(0, max_epochs):\n",
" # Loop over the training set\n",
" for i, data in enumerate(trainloader, 0):\n",
" # Get X (inputs) and y (targets)\n",
" inputs, targets = data\n",
" # Reset gradient\n",
" optimizer.zero_grad()\n",
" # Evaluate model\n",
" outputs = torch.flatten(model(inputs))\n",
" # Compute loss\n",
" loss = loss_function(outputs, targets)\n",
" # Backpropagate gradient\n",
" loss.backward()\n",
" # Perform one gradient descent step\n",
" optimizer.step()\n",
" # Record loss\n",
" loss_.append(loss.item())\n",
"\n",
" #print(f'Loss: {loss.item()}')\n",
"\n",
" # Check if optimizer converged (only possible of no\n",
" # stochastic gradient descent is used), or if the\n",
" # maximum number of epochs is reached\n",
" if optimizer.converged(loss.item()) or _epoch == max_epochs-1:\n",
" # Record lambda (weight decay)\n",
" weight_decay = optimizer.get_weight_decay()\n",
" # Each layer and output node has its own weight decay parameter. We\n",
" # have only one layer and output node.\n",
" l_.append(weight_decay[0][0].item())\n",
" # Record coefficients (weights) from the linear layer\n",
" coefs1_.append(list(model.parameters())[0][0].detach().numpy().copy())\n",
" coefs2_.append(list(model.parameters())[0][1].detach().numpy().copy())\n",
" break\n",
"\n",
" print(f'Training process has finished for target q={optimizer.get_q()[0]}.')\n",
" # Select the next q (number of features) for optimization\n",
" if optimizer.next_target():\n",
" # There are no more targets, exit loop\n",
" break"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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