Skip to content

Instantly share code, notes, and snippets.

@karlnapf
Created February 15, 2017 18:09
Show Gist options
  • Save karlnapf/d6c687d746eae06ea3eaf2675ff42995 to your computer and use it in GitHub Desktop.
Save karlnapf/d6c687d746eae06ea3eaf2675ff42995 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import numpy as np\n",
"import scipy as sp\n",
"import matplotlib.pyplot as plt\n",
"from mpl_toolkits.mplot3d import Axes3D\n",
"\n",
"%matplotlib inline"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"from sklearn.base import BaseEstimator, TransformerMixin\n",
"from sklearn.utils.extmath import safe_sparse_dot\n",
"from sklearn.utils.random import check_random_state\n",
"\n",
"import numpy as np\n",
"\n",
"\n",
"class RBFARDSampler(BaseEstimator, TransformerMixin):\n",
" \"\"\"Approximates feature map of an RBF kernel by Monte Carlo approximation\n",
" of its Fourier transform.\n",
" \n",
" This variant is like RBFSampler, but includes a seperate length scale for each\n",
" input dimension\n",
"\n",
" Parameters\n",
" ----------\n",
" gammas : array\n",
" Parameters of RBF kernel: exp(-gamma_d \\sum_d (x_d-y_d)^2)\n",
"\n",
" n_components : int\n",
" Number of Monte Carlo samples per original feature.\n",
" Equals the dimensionality of the computed feature space.\n",
"\n",
" random_state : {int, RandomState}, optional\n",
" If int, random_state is the seed used by the random number generator;\n",
" if RandomState instance, random_state is the random number generator.\n",
"\n",
" Notes\n",
" -----\n",
" See \"Random Features for Large-Scale Kernel Machines\" by A. Rahimi and\n",
" Benjamin Recht.\n",
" \"\"\"\n",
"\n",
" def __init__(self, gammas, n_components=100, random_state=None):\n",
" self.gammas = gammas\n",
" self.n_components = n_components\n",
" self.random_state = random_state\n",
"\n",
" def fit(self, X, y=None):\n",
" \"\"\"Fit the model with X.\n",
"\n",
" Samples random projection according to n_features.\n",
"\n",
" Parameters\n",
" ----------\n",
" X : {array-like, sparse matrix}, shape (n_samples, n_features)\n",
" Training data, where n_samples in the number of samples\n",
" and n_features is the number of features.\n",
"\n",
" Returns\n",
" -------\n",
" self : object\n",
" Returns the transformer.\n",
" \"\"\"\n",
"\n",
" X = np.atleast_2d(X)\n",
" random_state = check_random_state(self.random_state)\n",
" n_features = X.shape[1]\n",
"\n",
" # sample from multivariate Gaussian rather than isotropic\n",
" self.random_weights_ = (random_state.normal(\n",
" size=(n_features, self.n_components)).T\n",
" * self.gammas\n",
" ).T\n",
" \n",
" self.random_offset_ = random_state.uniform(0, 2 * np.pi,\n",
" size=self.n_components)\n",
" return self\n",
"\n",
" def transform(self, X, y=None):\n",
" \"\"\"Apply the approximate feature map to X.\n",
"\n",
" Parameters\n",
" ----------\n",
" X : {array-like, sparse matrix}, shape (n_samples, n_features)\n",
" New data, where n_samples in the number of samples\n",
" and n_features is the number of features.\n",
"\n",
" Returns\n",
" -------\n",
" X_new : array-like, shape (n_samples, n_components)\n",
" \"\"\"\n",
" X = np.atleast_2d(X)\n",
" projection = safe_sparse_dot(X, self.random_weights_)\n",
" projection += self.random_offset_\n",
" np.cos(projection, projection)\n",
" projection *= np.sqrt(2.) / np.sqrt(self.n_components)\n",
" return projection"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def qmult(b):\n",
" \"\"\"\n",
" QMULT Pre-multiply by random orthogonal matrix.\n",
" QMULT(A) is Q*A where Q is a random real orthogonal matrix from\n",
" the Haar distribution, of dimension the number of rows in A.\n",
" Special case: if A is a scalar then QMULT(A) is the same as\n",
" QMULT(EYE(A)).\n",
" Called by RANDSVD.\n",
" Reference:\n",
" G.W. Stewart, The efficient generation of random\n",
" orthogonal matrices with an application to condition estimators,\n",
" SIAM J. Numer. Anal., 17 (1980), 403-409.\n",
" \"\"\"\n",
" try:\n",
" n, m = b.shape\n",
" a = b.copy()\n",
"\n",
" except AttributeError:\n",
" n = b\n",
" a = np.eye(n)\n",
"\n",
" d = np.zeros(n)\n",
"\n",
" for k in range(n - 2, -1, -1):\n",
" # Generate random Householder transformation.\n",
" x = np.random.randn(n - k)\n",
" s = np.linalg.norm(x)\n",
" # Modification to make sign(0) == 1\n",
" sgn = np.sign(x[0]) + float(x[0] == 0)\n",
" s = sgn * s\n",
" d[k] = -sgn\n",
" x[0] = x[0] + s\n",
" beta = s * x[0]\n",
"\n",
" # Apply the transformation to a\n",
" y = np.dot(x, a[k:n, :])\n",
" a[k:n, :] = a[k:n, :] - np.outer(x, (y / beta))\n",
"\n",
" # Tidy up signs.\n",
" for i in range(n - 1):\n",
" a[i, :] = d[i] * a[i, :]\n",
"\n",
" # Now randomly change the sign (Gaussian dist)\n",
" a[n - 1, :] = a[n - 1, :] * np.sign(np.random.randn())\n",
"\n",
" return a\n",
"\n",
"def sample_gaussian(N, mu=np.zeros(2), Sigma=np.eye(2), is_cholesky=False):\n",
" D = len(mu)\n",
" assert len(mu.shape) == 1\n",
" assert len(Sigma.shape) == 2\n",
" assert D == Sigma.shape[0]\n",
" assert D == Sigma.shape[1]\n",
" \n",
" if is_cholesky is False:\n",
" L = np.linalg.cholesky(Sigma)\n",
" else:\n",
" L = Sigma\n",
" \n",
" return L.dot(np.random.randn(D, N)).T + mu"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def sample_hard_gaussian(N,D):\n",
"\n",
" # place a gamma on the Eigenvalues of a Gaussian covariance\n",
" EVs = np.random.gamma(shape=1, size=D)\n",
"\n",
" # random orthogonal matrix to rotate\n",
" Q = qmult(np.eye(D))\n",
" Sigma = Q.T.dot(np.diag(EVs)).dot(Q)\n",
"\n",
" # Cholesky of random covariance\n",
" L = np.linalg.cholesky(Sigma)\n",
"\n",
" return sample_gaussian(N, mu=np.zeros(D), Sigma=L, is_cholesky=True)"
]
},
{
"cell_type": "code",
"execution_count": 19,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"[ 0.18324497]\n"
]
}
],
"source": [
"np.random.seed(0)\n",
"\n",
"N = 1000\n",
"D = 1\n",
"m = 10\n",
"sigma_noise = .2\n",
"\n",
"X = sample_hard_gaussian(N,D)* np.sqrt(N)\n",
"\n",
"# random features for train and test data\n",
"kernel_gammas = np.random.gamma(shape=1, size=D)\n",
"print kernel_gammas\n",
"Phi = RBFARDSampler(gammas=kernel_gammas, n_components=m).fit(X).transform(X)\n",
"\n",
"# sample from GP defined by the random feature space, and map to original input space\n",
"# via low rank representation of kernel matrix, Phi\n",
"V = np.random.randn(m, 1)\n",
"y = Phi.dot(V).T[0] + np.random.randn(N) * sigma_noise"
]
},
{
"cell_type": "code",
"execution_count": 20,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAhkAAAFkCAYAAACNTikJAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJztvXuUHddd5/v9qR9HstRSaLXaUtR225IccHxp2ZK6FVnK\nAzyQFbAMIzFwewjJ4DuDzOPCEpfHnSxmAuFesgJDQmDISEMIhCFpFnPdJLZ5GAJ53DhtPS3JSmxy\nZdmSWpFOtx7ILVvuVrf2/WOfnVO1T1WdOufUrlN1zvez1lnSqdpVtU/V7tq//XuKUgqEEEIIIUmz\nqNkdIIQQQkhrQiGDEEIIIU6gkEEIIYQQJ1DIIIQQQogTKGQQQgghxAkUMgghhBDiBAoZhBBCCHEC\nhQxCCCGEOIFCBiGEEEKcQCGDEEIIIU5wKmSIyH8UkYMi8qqIFEXkr0TkLTGO+zci8oKI3BCR4yLy\nHpf9JIQQQkjyuNZkvB3AHwDYCuBfAegC8PcisiTsABHZBuCzAP4IwP0APgfgcyLyVsd9JYQQQkiC\nSJoF0kSkD8AUgHcopb4a0uYvANymlHrEs20CwHNKqZ9Jp6eEEEIIaZS0fTLeBEABuBLRZhuAL1jb\nni5tJ4QQQkhO6EzrQiIiAH4PwFeVUt+IaLoaQNHaVixtDzrvSgDvBvAKgDca7ykhhBDSNiwGcBeA\np5VSl5M+eWpCBoBPAHgrgO11HCvQGpAg3g3gM/V2ihBCCCH4cWh/yERJRcgQkf8K4AcAvF0pdaFK\n84sAbre29aNSu2F4BQD+/M//HPfee28j3SQZYe/evfjYxz7W7G6QBOEzbS34PFuHF154Ae9973uB\n0lyaNM6FjJKA8UMA3qmUOhvjkAkADwH4fc+27yttD+INALj33nuxadOmRrpKMsKKFSv4LFsMPtPW\ngs+zJXHibuBUyBCRTwAYBfAIgNdExGgoriml3ii1+TSA80qpD5T2fRzAl0XkFwH8den4zQD+g8u+\nEkIIISRZXEeXPAZgOYAvAfiW5/OjnjZ3wOPUqZSagBYsfgrAMQC7APxQFWdRQgghhGQMp5oMpVRV\nIUYp9b0B2x4H8LiTThFCCCEkFVi7hGSO0dHRZneBJAyfaWvB50niQiGDZA6+wFoPPtPWgs+TxIVC\nBiGEEEKcQCGDEEIIIU6gkEEIIYQQJ1DIIIQQQogTKGQQQgghxAkUMgghhBDiBAoZhBBCCHEChQxC\nCCGEOIFCBiGEEEKcQCGDEEIIIU6gkEEIIYQQJ1DIIIQQQogTKGQQQkiLUiwCO3YA69frf6emmt0j\n0m5QyCCEkBZl927gmWeA06f1v7t2NbtHpN2gkEEIIS3KhQvR3wlxDYUMQghpUdasif5OiGs6m90B\nQgghbhgf1yaSCxe0gDE+3uwekXaDQgYhhLQo/f3AV7/a7F6QdobmEkIIIYQ4gUIGIYQQQpxAIYMQ\nQgghTqCQQQghhBAnUMgghBBCiBMoZBBCCCHECRQyCCGEEOIEChmEEEIIcQKFDEJaCFbdJIRkCQoZ\nhLQQrLpJCMkSFDIIaSHyWnWTGhhCWhMKGYS0EHmtukkNDCGtCYUMQlqIffuAnh6gs1P/u39/s3sU\nj7xqYAgh0TgVMkTk7SLyhIicF5FbIvJIlfbvLLXzfhZEpN9lP1sVqqDbj8ceA2ZmgPl5/e+ePc3u\nUTzyqoEhhETjutT7UgDHAHwKwOMxj1EA3gJg5tsblOL0WAdGBQ1oNfSuXSz73OrkVSMwPq7H54UL\nWsAYH292jwghSeBUyFBK/R2AvwMAEZEaDp1WSr3qplftQ14nHFI/a9ZogdL7PQ/091MATpNiUS9C\nvEJdP/XFxAFZ9MkQAMdE5Fsi8vci8mCzO5RXqIJuP8bHge3bgXXr9L/UCJAg6GhL0sK1uaRWLgDY\nA+AwgAKA/wDgSyIyopQ61tSe5RCqoNuDsFVpsVj5/LlaJQC1nCQ9MiVkKKW+CeCbnk3Pish6AHsB\nvL85vcovVEG3B2G+N/b2O+8EtmyhsNHOGIH0/Hn/dmo5iSsyJWSEcBDA9mqN9u7dixUrVvi2jY6O\nYnR01FW/CMkE5875v09O6n/t1ensbFk1TuGzPfEKngBQKJQFT9L6jI2NYWxszLft2rVrTq8pSimn\nF/j2hURuAfhhpdQTNR739wBeVUr9SMj+TQCOHDlyBJs2bUqgp4RkH6+J5MwZYGGhvK+jAxgY0MKG\nd7th3TrgpZfS6yvJDuvX+x2DORbI0aNHsXnzZgDYrJQ6mvT5nWoyRGQpgA3QzpwAsE5ENgK4opQ6\nJyIfBvBmpdT7S+1/AcDLAL4OYDG0T8b3APg+l/0kJA94BYvpaZ0HI4iFBS14hEHVePuS1+gjkl9c\nm0u2APgidO4LBeB3S9s/DeBRAKsB3OFp311q82YArwM4AeAhpdRXHPeTkMxjq7proVAA1q6lA3C7\nQ2dwkjau82R8GRFhskqpn7S+/w6A33HZJ0LySlQEQEcHIAIoFWwiGRoCnnxSCyrbtjHapF2hMzhJ\nmyzmySCEBGCrtnt6tE196VItWMzP63+XLtWaCy8izI1ACEkfChmE5AQ70dapU9ppb37e325+XptG\nvFy6xNwIhJD0oZBBSA6oJbHW3BzQ1+fftmYNM8C2KyyUSJpJHvJkENLWFIvAPfeUo0nsYncbNwIH\nD5bbK6U/27dXOvjR6a/9YFI20kwoZLQBLIaUb3bvrgxX9Zo6nnxSTxyzs+Vtly8H5z/IktMfx2U6\nMCkbaSY0l7QBdPjLN0G+E15TR3+/XpmG7c8qHJfpEDYW6JND0oBCRhtAh798ExRVYps68lh9leMy\nHczYsCOOpqfpp0HcQyGjRfE6e01P+/flYZWbNZrpPBcUVWKbFVKqDpAodERNB5Mb4+zZ8jjq6dEm\nOGqRiGvok9Gi2Nkhe3qAVavo8FcvYZVO0yBOAiW7fzt3Al1dWjvQ16eFkMuXm+v7YPtg7N8P7NlD\nR9S08I6j9ev9fj7UIhFXUMhoUeyXxqpVLITUCPb9PHBAazSa6axoJu3JSb1K9XL8eNkR1FurIm0B\nycvOncChQ+V+/MRPALfdln4/CGuYkPSguaRFoSo6Wez7Nz+vNQcPP9yc/gBl7cWZM5XmEm+kiU2z\nVq0nTvi/Hzvmd/zcsEGboZjXwT159OEh+YSajBaFhZCSxdxPu0CZPXGmSb3CQlYETlswmpnRk54I\ncP263tZMzUsrwxomJC0oZLQofIkki7mfixf7tQRzc3rF3QxfB1vlHcWyZbpvzRQ47aRhQbz2WuU2\n+gvUj9cPZuVKLcBdusS8JCQ9KGQQEpNiUTtTeoUMpfRE73rFHZS4anxcm2tOnNDCTlSESX9/831y\ngpKGmcqxUWRF85JHbIdgw+nT2jzldQanwEFcQJ8MQmKye3dZjQ/oCdKLyxV3UOKq/n6gu1tP2nmY\nqPv7dcl5L/ffryOfwgjKCULiEzUmGcJK0oBCBiExsV/Y3d3+7y4ncvvahw9rM42J1vD2ye7XokXa\nOTQLTpS2YNbVpfN+GCfE4WFgZCQ6JwiJT9wxSZMUcQXNJYRE4DVT2EnNNm4s56Jw7etg+1/Mzgb7\nYyws6I+XW7d0mOvkpDavVPOLcMmlS5Xf6T/kDq8DuNcnY3ranycjC5ou0ppQyCAkgmpJzdJaZZvJ\n4vDh6PBUW1Ng442GaUaBsqD8DCyUlixx7ufUFKPPSDpQyCAkgqwkNTOr/fXroyNKliyprNgaRjOy\nmAaFVntDgxmy2jhRz9UWQCYmKNARt9Ang5AIspbUzL7+0qV+H4aJCe3X0BmyfOjqKvtlNKNAmRGW\nXnpJ/9vfz0JpSRPkv2OeOSvfkrShkEFIBFnLjOjtz/AwcN99/rwH992nfS6WLAk+/vr18sSSFQEq\nK/1oFez7NztbfuYU6Eja0FxCSAS2U6JJee1V9yuVnk+Btz87dvjV4t68BzduhJ/DTCzNyAoblu+D\n/gHJMT5emY/k3Dk9Xs6f97elQEdcQyGDkBoIsncDzfEpsFehMzPl3AcdHeHHmYmlGVEdYf4CXp8B\nW+Cgz0Bt9PcDW7b4HZavXvUX0SsUdBsKdMQ1NJcQUgNB6uZmqaCjVqFh+0ZGmjexFIvaP8CLqWZL\nn4Fksc18vb3+/WvXln1iCHEJhQxCaiDIfyAtn4JiEdi6VddPWbxY1/kwTp921szBQf2xUSrdicVb\nUfWeeyrDb001W/oMJIvtYDsw4N9PMwlJCwoZhNSAvULctw+4eVOrnwsF7YyZhKYgqNz57t3aqXN2\nVn+OHQOOHy+HItoOqkHCRNpVY72aiajQ2mee0ffPzkjKyTAZsubATNoH+mQQUgO2H8OOHf4Mmt3d\nyWgKgnwXglb1s7O63Z49wOOPl50qd+2Kdv5Mi1o0EXNz+mPo6AB+67eS71M7wqyqtcEEcclBTQYh\nDeBKvR903qhV/blz2hzh9Wf4+tcr23V1ASdPVmpJXNGIJmJhQadBJyRt6BuUHBQyCGkAV/4YQecd\nH9c+GIVCZfrwq1crzRFBlVmvXwcefDC9F6hXTR9VbTWMLGhjiDuCzIJZgL5ByUEhI4dk9Q+zFal2\nr13ZuoPO29+vozHeeEP7VvT06MyePT3AihXxz21P3C5foF4HRG+11agQWy9hScVIMjT7XZJVjQET\nxCUHfTJySDNqTrQr1e51krbuWuzAjz5a1lzMzOhIEy89Pbr6qr0d0JEp16+Xv/f1JdP/anjv1R13\n6KqwUSxapB1aiTua/S7JqsaACeKSg0JGDsnqH2Yrkua9jvvCD8o3cetW+f89PVprMDLiFzI6O3UI\n7OuvA889V94eZFZxzZUr1dts3qzTpBN3NPtdElSVNwvQUTY5aC7JIVTlpYd9b1eudKdejnrh2/km\nogSDVav0S9LOjWBMFPYEf/ly/X2uBfMbBge1oFONtPrVjphn0ew04wytbX2oycghVOWlh32vb94M\nrxfSaJibvarr6yvXSZmejl/CfXpaCz+m74cPl3NrPPNMpQPm9LQWXlyH6nk1NXFIy4zTDtimuLk5\n4NCh8v5mpRmnxqD1cSpkiMjbAfwygM0A1gD4YaXUE1WOeReA3wVwH4CzAP5vpdSnXfYzb/APMz3s\ne21n0fTWC2nUnm0LNHNz8SblpUt1tInxs5iZ8dcEGRz0161YsQIYGvILL0n9hijOnautfTPMOK2K\nbYqzMWnGCUka1+aSpQCOAfhZAFVfGSJyF4CnAPwjgI0APg7gkyLyfe66SEh8rl4N39eoPdtOBR3H\nXFAo6EnD1j54+2L32dRbWbOmsqZFkjZ5O3Ihyg+jUKjcRnNJclR7rjS5Elc41WQopf4OwN8BgIgd\n2R/ITwM4rZT6ldL3fxaRHQD2AvgHN70kJD69veFmi6Rf1Lb5JIgtW7SAEeVAZ/d5YUG3PX26Mt9G\nkr/BXj0HCRIGu6ZJ0n1pd6LGUlKp8AkJImuOn28D8AVr29MAtjWhL4RUYDtTGlw4rY2PB0/MPT2V\njnJBDnRGk3DxYvg1jElCRF/r5s3knFkb1YqcOcM8MEkxPh6eDE2EKbOJO7Lm+LkaQNHaVgSwXEQK\nSqmA9Q4h6TE+rleF3pDRpUuTt2cbR70gVq3SJhUvQX46O3bEd7RUSmsTDh5Mzi/DXj13dgZrLMKY\nnNQf5oGpjhkvk5PaLNXbqwVi48jb36/HTZAW7vjx9PtL2oesCRlBGIVupE/H3r17scJKezg6OorR\n0VFX/SJtSH+/zra5bZvOnLlkiU4YlXRBpahIjDVr4l2vXk1CUn4Z+/bpFObmPpny9LVy4IAWmFik\nKhx7vMzMaE2QV0CLY34jrc3Y2BjGxsZ8265du+b2okqpVD4AbgF4pEqbLwP4qLXt3wG4GnHMJgDq\nyJEjipBmsX27UlofoD/btzd2vnXr/OcrFPRHRKnubqWWLq1+PbtPcT+N9r2e6xcKSvX0RLfp6FCq\ns1O3O3kymT62CvZ4MZ9168ptikX9TLq7/W2Gh5vXb9J8jhw5oqAX8ZuUg7k/az4ZEwAesrZ9f2k7\nIU0jrMaD2X7ggL+9WX3X609gOz12d2tTg1I6tNXWCBjtg7efc3M662eQy/UDD1T6exQKjfuWeK9v\nZyWtxqlT0UXUFhaA+Xm9St9GLy0fYU6y3u3GpHbunN9/56mn0ukjaU9c58lYCmADyiaPdSKyEcAV\npdQ5EfkwgDcrpd5f2r8PwM+JyEcAfApa4PgRAD/gsp+EVCMs5XeYWWN+vlzwqR5/AjtnxuRkdDIu\nk4nUJN4y/ezp0TkQ7Doht92mc2fYSd0aNUfUmnDLS5TfgA2rs/ox4yXIJ8MmTp6dJM1/SZsSSb5w\n7ZOxBcAXoVUxCjrJFgB8GsCj0I6ed5jGSqlXROQHAXwUwM8DmATwvyml7IgTQpwR9FIMS/ldzX+h\nXv8GeyLYsUPb2L309JSzjXozkXoxibZsDhzQk1LSL3z79xYKWsh5+eXo5FpK6d+4cqXfb8D8xjNn\ntCbDwOqsfpIWHJIsnNbsImykubjOk/FlRITJKqV+MuSYzS77RUgUQS9F22nu/Hk9KS5f7j926VK/\nKSOpXA/j48DOneVIgKEhreY2k8T69bWdr1FNSxj2fdqyRZ9/6dLoeiUmu+nIiFbhX7igBQ4R4NIl\n4Lu/W5tT3nij7GxLaqOWyT7JwmnNLsJGmkvWfDIIaTr2S/DAAa0pGB4u+zGYOiCnTvnbvuUtbgo+\n9fcDTzyhJ+21a7WPhpcgYcYURDP09OgwUi+N+o7YhBW88mohorh0CXj8cf17TpzQIbWnTwPHjgEb\nN+rn8OqrrM5ajSAfolom+ySLMLKgY3tDIYMQC7sw1/y8nuy6u/UE7+WNN/zfn39e/zsxoVeJSZoi\nzEr09OmyFsKwb1+l0+TCgj9x16lTwKZN/jZejUYS2KnRa/39a9aUf6edU4Mr4PgEjZVaJvskq6Oy\n0mp7QyGDEIsw3wGjwvdiR2iYSfvhh5MvCR+1En3ssWDfC5O46/HH9URz7Fi8cyfNxo3+73bEizey\nJawvrMoan6CxMj6uzVGFgv7MzYWPS1tYND4z9YznRgXPViYsaq2VoJBBiEVYYa41ayonx7m5SrME\noH0nvCvJ9et1NdTly4G77qrvhRK1Eg2bmE0bs7KdmwtuZ8rDu+KP/9ivabEFuXvv1f8ODwOvvBJ8\nDlZljUexqJ+nlzVr9OTe1aU1RLOzutR7XA1WlBaN1E873FcKGQRAe0jUcbEnc+8qu2glvb95M9jf\nwJ7Mr1/XIaMmE2M9L5QotbPdZxG9ajVtqmkqTHl4V4RpWgzf+Ia+J2fP+lO2e2FV1njs3u2/1z09\n4ePA/h72HrDbHT7c3u+IpGgHp1gKGQRAe0jU1TAv2MlJYNky7YNRKOhIDhPul+REF5RAy7zYvdtG\nRoCtW8sJqCYmyuYPc8z+/ZWagq6usmo6SHCyTT0uX3DVzn3zZvVzvPyyvg+c3KKx73Vvb3ms2BoO\nEyVl7mnYe8AeP7Oz7fmOSJq2cIp1kUY0zQ+YVjwR7LTE3nTE7UJUGmyTattOydzIx5wzKCV5tb4E\nHRP1DE1K6XXr9L/FolIjI/72IyPJ3s+LF/W1Bgd1SnD7d4jofdu367Tiaac9b1XssWGna+/pqbzf\n5p6GjaFisfKYdnxHJE3Q32XauE4rnocCaSQF7PwGLSlRVyFqtW32BaXo7uiIH6JpqEWFHdYXe1vU\nMwxK1qRU9PdGqZb988EHy33aulVH8BjMfQ7qk1HV04EwGDtb7Cuv+M0nvb16zHrHihlTfX3+7cbZ\ntr9fh097n2c7viOSJk4StbxDcwkBwDAzIPqlafYNDfm3Dw8D3/qWvmd2DoogOjv1Mffeq80fJsul\nfS17m70/SM0a9gzD7Oy26ee555L1xwkTljo7K8fYk0/6+75lS7jQMzsLbNhAs0kYdjTHq6/691+5\nEq6mjxI8+Y4g9UBNBgHQHhJ1NbwrwL4+/YK9fFlP+Ddv6km6r08LCZcv+1Mzf/WreoKuVrdj61b9\nrzfzojfLpTnnzp3Bx3d0aMfRf/kX7TMi4vcZCXqGYZkebc1H0llA7RThhq1bq2tVqgkQxlG13ccs\nUD1deG9vpSbD1nYYgcEWPL3f+Y4g9UAhg5ASYS9Rr/Bw+rQWCF56qbKd98V9/rw/mVRnp55cx8cr\nK4heulR5vkuX/N87O3U67ZmZymJn3d3RpoMgc0yxqAWnQsFd0qv5+cptS5cGr4BtQcgOCw4ySbWi\nJ349VEsXPjDgr3szMBA+1sNMbixy5p5Wvcc0lxBShbg+E1419ZYt/n1m9d7fH8+j3N62datOrBWn\nf9XOdf48cM892gfCFjCA5JJefeMbldtee01PgnYEjV0W3itQLFsGLAp4U9EnQFNtfNZi5ghry+gz\n97TqPaaQQUgV6gkzi3qxx3npB7UJ89Oo1h9zLm/dlaicFY04gBrBYXAwWIAByi9Q70s1rC2gc4zY\nIa5ex9l2p9r4rCXjZn9/uXbMhQtlgbAd8jk0m1a9xzSXEFKFMPt1lHrTVkebyTdKFWqfb98+ncTK\nvOxt80OhoDUm1SZb05f164N9JGwayQVSLaLEcOFCpfmju1ur8qeno4WgQkHXYWkFVXIShI3PeolT\nhZhapORp1XtMIYOQKtTqUBlEnLZ2mwcfLE+2p09XJs9au7Y2Rzz7JRZGI+aSuKuvNWvKZesN3d16\ntX3ypC7tHsaWLRQwvCTtkBm0op6YqF+QaVVfg6RJWljMCjSXEOKhlvTqtag3g8rH2+e3HTpv3Iju\na60rHa8JxhZYvDRiLonTJ2PqsFOvm+/ve1/wcQydTIcg80sjRc5a1dcgaVq1kByFDEJKFIvaITLu\nCzGOr4YRWs6f928PKrF+5Yq/jT3Zb9zYWJ6CKMdUL43knzCCTFDROMOqVbovdmIz8z2oUuzAQOu9\nfLNKXEfRuAJ5q/oakHjQXEJICbuwFKCjHtavD1bzBqk3varhvj4dYXH9evg1vS9cO5/BmjXAm99c\nNisoVe5DsVh57Vom3/FxndAqyPfBFnZqwQhGnZ3hWVCnp4EvfanSmdMkOgvSpAwO1t+ndiEps0Rc\n80tcc2Gr+hqQmLjIVZ7mB6xdQhLCrttQT82MqJojQHjNiKBjw2qUhLWtlWKxsq4FoOuJ1IvdL5Hg\n+2DXMunoKNdtWLq0sv3wcHPqOuSJJMZELdh/L4VC8DNyUZ/D1MVpZs2PVsF17RKaSwgpEVQu3UuQ\nH4WXYrEy34NNlMnDqKnvvFP7LUxOVp7PaD6SUEH39+soDW/1VkCbJurF7keYf4et5RApr7oPHKjs\n06FDtOXb2OYK26fHtVkibmVWF74G9PPIDxQyCClh26Jtv4UgPwovu3dH53vo6dE1OswL1y7XboSX\nYlGbMc6cqTyfebEnVSLaCBre371vX3znV5t6+6FU+Tr33afrbaxb529TTchrN3bu9E+0dpZY12aJ\n8fFKB+K0/C3o55Ef6JNBSAnbFj01pYWAAwf8OSrCXmjnzvm/d3drzYVd58Rg27SHhoJX/oWCDlf1\nhrUlGe5m/247jXotNULGx4GHHwZOnKgUkESArq7KqBJAazbs67iurZJ3Tpzwf5+fr6yB45JmVmal\nn0d+oJBBSAhhhc/CXmhXr/q/Fwr+8uU2cU0LW7ZUTqoui1U1skrs79fCVZBG58EH9bnCcnUEpcN+\n+GFtKqm3P+1G2sJXs3I7tGpOiVaE5hJCqhA3pK+3N/q7TZzVl6m6mqaZoFFTjC0EeEu7R50rKB12\nd3f1du3Kxo3R3xslTohqs3I7tGpOiVaEmgxCqhBXaxBU7TIqrHB8XDt5RvlxLCxoh77JyfTMBI2u\nEm1Vtre0u/fcK1dqE8qlS+HXsU1QgA59nZrixPLkk25X87VktCUkDAoZhCSEPTnv26dXga+9pvef\nPq3V/8aEEmTTjiItM0GjppgoIaXWcwfl7Dh4kBMe4NZkBtC5kiQDzSWExKCa6jgoOdZjj5UFDIPt\nrDc+Hp0d00tSJdhd0miSMHMOc6/t+2fghOeepCKYaknV3yzy0Me8QiGD8A8sBtXi8oP2h02E3nsN\n6Iyey5ZV70OYY2i92M/95MnGx4F9Hx5+uPZzes8R9pvb3S8jjb9Z44s0OFjO21LPtfKQ0yIPfcwt\nLjJ8pfkBM342TNqZAvOInd1w3bro/XfeGZxNc9myeBk8gz72NRvFvqbd33rGQRJZU6PO0d3NDI9K\npfs3W+1a1bJvVvvbyQJ56KMrmPGTOIe21+pUUx3b369e9dcFEQFGRrSzoxeTYMrO1hinD41iP+fX\nX/d/j9Mnm2p9PHy4+krYPkdPTzkLartrMAz2s3v2WWD5cuCuu5LXbFR7PwRpAYpFPd4XLwZeftnf\nPovPMCnTEKmEQgbhH5iHMDV0UMrvoP0mzNUOX737buCJJyodGU2CqaiiZIWCmxLn9nO2U31PTtau\njjf3IYyw1NNB5zD38tQp4I47yllQqc4Ofnau7k+194MtdJw7p6sZHzqkn7cxebkax0kQN0yd1IEL\n9UiaH9Bc0jAuChjllWqq4bhqartdoRBsPjGfgQG9v7OzsqiYK9Wt97lH9a1WdfzFi+GF0er9PXGL\ncbUL5tl1diZ3j6tdK+z9ELcoXjuZIPKEa3MJQ1iJ81C4PFFNNRzXtGTCOA8f1qs584m6blhpdBea\nJTt/h1kJh2FK3vf16SnDTpXuPd/UVLSTaj2/x869MTsLvPvdwHPP1X6uViAsG60hyTFT7f1gj/Ww\nZ9/OGtJ2JhVziYj8rIi8LCI3RORZERmOaPt+EbklIgulf2+JyOth7QlJklp9L8JenObFvHZt+LW8\noau2gFEouFXd2nZ021xjh9XOzuq2Bw9qNbjthe893/XrldcbGant99hmq/37K9scO8ZoKDsCZHAw\nfXV/tbFu/JFogmhPnGsyROTHAPwugJ8CcBDAXgBPi8hblFKXQg67BuAtAEyx7YSD9wgJZt8+XWPj\nxg1gyZLKya1aNkxbQ7BypX8F3tMDrFql901O+jOEegmqV5Iktgamt1cXaDP93r8f2LNHfz9/PlwL\nE1Z63ub4EqtvAAAgAElEQVTAgdr6Z2eb3Lw5uF27F0zLkhbS1jYVCnoc15MrhbQOaWgy9gLYr5T6\nM6XUiwAeA/A6gEcjjlFKqWml1FTpM51CPwnBY49ps8H8vP53zx7//mo1E2wNgUilE6M5dmDAf2xP\nj243PKxTZ7vMgWBHuZjf9bWv6e+PPKL/nZioLHnvJaz0fKPYQks1U1O7kEZ+jHqvYTtPnj3LuiLE\nsZAhIl0ANgP4R7NNKaUAfAHAtohDl4nIKyJyVkQ+JyJvddlP4ubllcckX42G89rtL16sbGPuy+Sk\nTsJVKOjPd30X8PnPAy++qM0SRlDZsCH5eydS+b1Y1FEBdjiid/IYGdFCkG36GB/XvyGIpUtr71+Y\n0GL3O6ptK5JG0qhq1wj6u04i0ytpUVx4k5oPgDUAbgHYam3/CICJkGPeBuC9AIYAvB3AEwD+BcDa\nkPaMLkkAF8l98pjkq9HEQ/bxHR21RZmE7Uv63tnRGh0dlX01/Y0bdRSWUOy++2rvn4loKBQq+2ki\ncQYHsxMNVW1cJEVQlE3S16yWmCrobyQomiorz4ZE4zq6RFSUG3iDiMgaAOcBbFNKHfBs/20AO5RS\nD8Y4RyeAFwB8Vin1wYD9mwAcecc73oEVK1b49o2OjmJ0dLTBX9EerF/vt6euW6fV+lk7p2tOnvT7\nZExMAPfdV95ve/Nv3+63iU9NlVd009PRERtBdHQER5kkfe/CohKi8P7WoOqyU1P63tm/uVAA3nij\nvn5OTWlNTtB99Pq3NHvlXG1cuLqOl6SuWe23BP1dA/5tSfeJJMPY2BjGxsZ8265du4avfOUrALBZ\nKXU08Yu6kFzMB0AXgJsAHrG2/ymAv6rhPH8J4DMh+6jJaJCLF5NJKW2TJ02GWYnaK2e7z7WkH66W\nYjvos2hRuIYjyRWr0RRE9SUoX0fUfQo7n0j9fb54sfJaQZ+RkcbvSSOklZbam7PCvi9JXbNYVGp4\nWJ+/UND31vv84mgyXN8Hkhy5TiuulLoJ4AiAh8w2EZHS96/FOYeILALwvwBoI/eudNm9279S7OlJ\nJtwsT1n0jB3adjC0fSxqyY5aj69AZ2fl954e/XyStMMbR88wPwqg0v9hzRpg587w+xTmv6JU/X3e\nvTva6dNw/Hh95w+iHl+itLLmeh2PbYfcpK7Z3w90d5dzuxw86H9+QX/XZps9ntrJX4YEk0Yyro8C\n+LSIHEE5hPU2aG0GROTPAEwqpT5Q+v6fADwL4BSANwH4FQCDAD6ZQl/bEntyWLUqGdVzlsLrqhE2\nQdovyWohrGFtX3kFuHWrej9u3vR/37pVH+8VApOMphga0nkvgvD2d9kyYG4uvK25T0EqcyA8VLca\nzYgcscNn44TI1jIuksLlNaMcoFWAhd38rXvNhWndB5JtnAsZSqm/FJE+AB8CcDuAYwDercphqQMA\n5j2HfAeA/w5gNYCr0JqQbUqHvxIH2PHt7bj6sO8BEKzRqUVw8r6MOzv1JB3nGNvXYNcud8/nqaf0\n+av5Z9y8GS5gmFouvb06kmR2VocAe6lXWAh6LoAWerxJv4aG6jt/EPVEGDVDoHZ5zah3QpQQlqeF\nBUmHVNKKK6U+AeATIfu+1/r+iwB+MY1+EU0zVmFZY3xcFz/zqubr1egYp0iTZrlWVq3yO3m6fD5m\nUli+vHYnVUBP9jMz5eJcYQSFnsbB/PbJSZ2VdMUK4No1/a+IFmwGBpK9J3GF7iDn11YJ24wac3GE\nsFa+N6RGXDh6pPkBHT9JQiTlqBrmBFcoVDpTBhWTaoaD7MmT2rk0KIwVUOr++/3fu7t1PwcHqztl\nGsfVRojrmJsEcQsGNsOxOa1Q2Sji/O48OX23O7l2/CQkTyTlqBqmXt+yRSfn8jrIGZOKiHa2W7as\nsox8Gtx3H/Dqq9rM0dXl39fVpfvmpbtb3x87a6mXRYvKjqsTE431L65jbhJUy+oadu00/EfSSMYV\nhNcZ9ubN4IRsXppxb0g2oZBBSIm4k0s1bPV6oVB+GYcVk7r7bv3ivn5dmx3SnEBs7AiBQgG4ZFUZ\nun69MhvosmX+NkuWaBPU0JA2ATVC2CQ1NdW8TLJpRZR4adbk7RVuDh7UQmbU30kz7g3JJhQyiI+k\nU4HnMbV4owTVcHj8cT0pm/uwfLn/mGKxsohYWhOIeUamkqddRXVuThdJs7lwwS+Y2ZPNa68lt+IO\nm6SuX9fJutIeX8WiXtGblPDDw+n4MjVr8q5VuMlT+DpxjAsbTJof0CcjUZK2pWbdNpuWjdu+D8uW\nVfdjSCvBVLWkXGEf8yzD/CWSTMpk/CQ6O+P1yTXDw/7rDg+nc924/iJJU8vfcRb8Rkh8XPtkpBJd\nQvJD0urYrNtm68mJUA/2746TZvvYMb06d+2ZX8szKRS0qcdEDJiiatUiU86fb+y3GI1JtXToaY2v\nEyeiv7uiWSGitUQ4pfU3RfIBzSXER9Lq2KzbZtMSguzfvWRJ9WPm5tLxzYh6JrafxcaNflu8nS0W\nCM4iOjubzG8ZH9emiTBcj6+TJ7Wpq57Q5DxTi79S1hcWhnY05TYDChnER9K21KzbZtMSguz7MDFR\n/h6V2htw/5I2fRsc1EJFd3fZz2DDBn9bEw1jJtsgrUJnZ9lXwf5t9fwW72Swa5dOILZ9e/hvcUlQ\nAThAR+BwktJkfWFhaFakTrtBIYP4SCLCwp4Uxscbj9hIGtPHyUnt7DgwUM5cmeSqxlxn2zb9/fOf\n1w6DmzfrZF0rV2rtgJegmiEuMc/8lVeAU6e0cHH77cCLL2phwsvly/rfsMkW0A6fpu6FneW0nt8S\nNBmMj+uKtV56epIbX2Gr3Bs3gtubaJu0yeJqPOsLC0NeNC65x4WjR5of0PEzc2Td2VOpyj7aVWh7\nepJxWKt2HZPYqqdHJ7bavl0nxmqW41w1J1DzLKs5YAYlIqv3twRVOL14UakHHignM1u2TN83V/fB\n/O6g52c+g4PJXT8M26lyZCT7f2tZJQ/vqTSg4yfJHfaK4MCBdBwYa8Huo70qn5lJxmHNvk7QSnhu\nTn+GhsrXa5ajXNhqrrNTF2szq9IlS2pLQ752bf2/yU7zPT2tTTtev4iNG3VCsaQIW+VOTOhrLSxU\nHnPlSnLXD8N2qkzCHNWusJxCOtBcQhLHVonPz+sX4513ZkelG0dt3+gLu1jUE6IX49Pg4nr1YKvb\n+/qC223d6jd3TUxUmiuiaMTk41W/m7L3rjN/hvkV3HefFnCC6O1Ntg9BVPudWfF/yKIZxyap5Hsk\nGgoZJHHMpNBp6cmSijBIgvHxylVg0r4QduRFR0fwCtgwPZ3+y9j2d1Cq7ARqfFWWLdMVWBcvBkZG\ndB+jJltAH5OUXd47GYRlDl25sv7zBxHlVxA2LqJSrCeFfe2hoWz6P9CpkhhoLiGJYqovnjsXvmrP\ngkq3v1/XEvFGRwwP6yiBpNSn9u+0hZjBQa1iN4JIUiaaWrD7ePmynszDKskeOlTu48qVwWXYAe0I\nOTenNR5JrhDDSr/XW+U1jKh8FPv2acfX118v92lwMJ0JPkjFn8UVOJ0qiYGaDJIoZgVz9mz4qn3l\nymyoUu3V6pNPJqs+rZYbY2CgcmWe9svY7qN5NoODwQXJgHIfq03sRiBJkjAt2aFDwAMPpDOmHntM\nC4QLC/ozOJieuj3K3JYl8hLGStxDTQZJlLBJ0psp8ubNbGQEdJ090V517t8P7NnjX4Xu2uVfmaf9\nMrb76H02YZg+2kXTgkhaaArL/KmUzpAKuB9TzVylZzWbptF8RY110p5QyCCJEqbO7u4uq87Xr/fv\na5Yq1X4xJq16DhJi7O9B6m/X/Yrqo/1sgrh5U2sK7GdtnDK9JCE0Bd2P8XGdyyOMJMdUsQjs3FlO\nHd7V5d+/Zk16zyyrZghb+NmzJxvCD8kALuJi0/yAeTIyhSngNDioVEdHcBx6VuLTg3JYuM5JEad4\nVDPvT9xiadu3K/XFL5afcUeHUp/7nM7bUCjoz/Cwm1wjcXJWJHnPgu5JT0/5GT7/fGVfXD2zrPzt\n2ATlMiH5wHWeDPpkkNjECUvzZo+0ow/MqisrGQGDcmW48oL3llOv5nXfzNWq99lEpTu/cAF45JGy\n383CAvDe9+pV/u23a83V1JT+fY36R4TlXXnqKa096ezU0Sz335/smDLP7MCByn2rVpV9d4yPRlSf\nk6LZfzth7wD6YJAwaC4hsanVHmyr082Lp1mVJG2CTDuuJgfvvat2vbD7lgbeZxNV8TTIJHb9ur/9\nzAxw5kzjfgP2/TB5Vz7wAeDVV+s/bxTVqst6n0nYM3RBs/92wt4BTGxFwqAmg8Sm1hV23FVXsxL3\njI/rlbAXV5ND2L0Kul6zV6uGffvKmoKlS4HbbqvvPI0KbmERJS41PEHVZQGt3RkZic6b0dPTupNs\n2DuAia1IGNRkkNjUusKOu+pK02PedtCbmEjHC96+d4WCztMRdL1mr1YNXjPA/Hz952lUcAuLKDHJ\ny9JwsAS0oBP0XIJW8Urp/rpwBE3TMdimmVo2klNcOHqk+QEdP1PDOHUmXbgrTaexZjnOubp3Lhkc\njOcE6v0sW6aP8xZ8S+q3FovhDpZxHGprIcgp+PnntTOrcWwdGQm/jstx1kznzzyOYxINC6SRzOBd\nYReLyWUeTHN11CynyqxoJ2qhnoJfb31rsKNkEvT3a4dLrxnjwoVK/4kktGFB2omHH9ZJvwwHDwKr\nV5cTZC1aBHzxi8A73uF2nDXTMTiP45g0F/pkkLpIsjZBmj4I9IKPT1TBr8HB4NolcRJ0NYL9vM6f\nD3bQPHeuMT+fIB+D48cr2xkBAwBu3QLe+U59PbuWSlL5Qnbs0L856XMT4gpqMkhVgmzASa6m0lwd\n0Qs+PrffrqNDgrhyRdcmsXE94ZnnZ2qqmI/NuXM6tT2QjGajWAz+vUE884x2Dt2+PdlxZkcoRfn1\nEJIVKGSQbxPmUBbkmJlXBzCqe+PjXaUDulZJV5d2AvVqDkwNk66ucjZQ1xlK168PL84GVPa9mhBc\nzZly9+7a+nnpktaCJIn9G9au5Vgm2YfmEvJtbBPIhg16wgjSWkSZOMJCUpsVqkri431GtnlAKb2a\nv3XLv727u7zv4MF0ynrbQq2IXtmHJRCrJgRXM//VqqlzIXTT1EfyCIUMAkBPLocP+7eZDJhBL7eo\nuPiwF3bY9mJRq5cXL9afrVvdCiAUdsLZubP8jOKaB2zScEQ0Qq4RKpTSZpPubn+7QgEYHtYalqjn\nbff5a18D7rqr3D7uhF4ouPMrMr/5zjt1Lo7JSY5fkn0oZBAAWgAIK+tdq2NmmL9G2Pbdu7XXvrGv\nu14NJ+m02mqYImBxWbSoMklWGitsI+SuXevf3tvrH6tnz2rB4+DB6Odt91kp7Y/yzDN635kzemIf\nHIxOt26Ktm3blrwAYH7zHXeUs6ly/JKsQ58MAiA6I2Wtfgxh/hph24Ou7XI1nNVKllmgVu3FrVvA\na6+Vv6ed7dIeUwMDlWM1zvMeH9cagiBB+9YtrTUAgKEhfY2wdOtXrybrcBoExy/JE9RkEACVK7lG\n1L5hmo+w7UErX5erYdq2w7HNDV6Mg2cUq1alm1LaHlP79lWawuI87/5+HalRjQsXKtOtP/BA+fp2\n2K8LAYDjl+QKFxm+0vyAGT8ToZmZ/J5/XqmlS3X2QhGlHnjA7fWZtTCc4eHojJ49PTrbZRol1ush\nKBtm0PMOyhBq2kX9vp6eynvkzTqaRsl3jl+SJC1R6l1EflZEXhaRGyLyrIgMV2n/b0TkhVL74yLy\nnjT62c40s8DRY4+VVe5K6UJcLq/PYk7BFIv+KI0HHqjUbPT2anOAXVjOpcNjLdiag8OHtX8EoOvU\nmOcd5JdjxsXZs9pZtFDQv3+R5y05M1PpIG2uuXOnP7R32bJk74dxkL7zTt2Hvr5065YQUg/OhQwR\n+TEAvwvggwAeAHAcwNMi0hfSfhuAzwL4IwD3A/gcgM+JyFtd95U0B9qYs8Hu3dpB0jjg3nZbpZPj\nmTN6krN9N0zOhjQmvKjoINt0MDsb7PAZNeb6+/V9eOMNffzAgL+tnYPDXNN2mvX6qiRB2g7ShCRB\nGpqMvQD2K6X+TCn1IoDHALwO4NGQ9r8A4G+VUh9VSv2zUuqDAI4C+LkU+kos0gj3pI05GwRpAVas\nqGwXlGWzL3DJ4AZbC7F6dTn0ef/+so+GLSB5f18tY+7q1cpt3d3Vo62USlYISNtBmpAkcCpkiEgX\ngM0A/tFsU0opAF8AsC3ksG2l/V6ejmhPHJJGuKfr2iXMixGPIC3AtWvxjrVX9y6xJ1aTI+PgQWDz\nZr1tYqLSkdP7+2oZc0E1XAqFSnPbxo2V7Q4fTm68pe0gTUgSuNZk9AHoAFC0thcBrA45ZnWN7YlD\notTKSU3ern0kmBcjHuPjlat/k3ciKjcEAFy+7K5fNlET6+xs+RlHCRK1jDnbXAIECx5PPlnpqzI7\nm9x4Gx8v+4oUCto/o9k+MIRUo1khrALtzeqqPUmIKLVyXiZv+nzEIyiM0+SdOHsWuP/+8DDWNFfU\ndrbPIC5cCBckvMLxpk3aQbOrC1i+HPjyl/W+u+7S3++6S/ufLFvmP3+Q4NHfD5w6FW2maQSvr8gb\nbwAHDtDpk2Qf18m4LgFYAHC7tb0fldoKw8Ua2wMA9u7dixWWAXl0dBSjo6OxO0sqiapampfJO6/F\n3JpB2PPu79c5IYLMIoVCuitqIzxMTWktRZCDZdQztquZGmZmgHe9q3LbmTNag9DdXb2qqhHUvOfn\neCNZYWxsDGNjY75t1+LaROtElGNjqog8C+CAUuoXSt8FwFkAv6+U+p2A9n8BYIlS6oc8254BcFwp\n9TMB7TcBOHLkyBFs2rTJ1c8gAezY4X+ZBr2IvSutapUuXTE1VTlxcgVYO2GVT3t6dBKuZtzboD51\nd2utyx//sQ6Ptp97tQquQRQKWpvj1YaEjWWON5Injh49is3amWmzUupo4hdwkXzD+wHwowBuAHgf\ngO8CsB/AZQCrSvv/DMBvedpvAzAH4BcBfCeAXwfwBoC3hpyfybiahJ0UaGQkOhFRUKIkkh/s59fd\nrVRHR3Ofqd0nO3FWUN+ijon6eH9b2mP5+ef17+ns1P+ePOn2eqR9yH0yLqXUXwL4PwB8CMBzAIYA\nvFspNV1qMgCPU6dSagLAKICfAnAMwC4AP6SU+obrvpLasG3ely7591czpwSZV9KIBGG0SX3YjpT3\n3w8sLPjbpG0yC3JWNdy44f9u+ub9HQ88oM1AcfD+trRNhQ8+qE038/P6322MtSM5IRXHT6XUJ5RS\ndymlliiltimlDnv2fa9S6lGr/eNKqe8qtR9SSj2dRj9JY0Q5iRaLwPR0dHsgHWfSvDisNgtbCDt5\nUv+7bZv2f5ia0k6Hhw5VHpu2/0F/f3i9lSVL/N9N3/r7gccf19+vXdPCUpCPhR0p4v1t9u+cnnYr\ntNoCk/2dkKzCKqwkkHr8J6KcRHfv9qdcDqvWmcYK0T7ngQN6cqDtXON1jDx9OlhjEUTaFVgNvb3+\nsQXoaJCJCWDPnvDx6P2Nzz7rP76jI/p471ifntbXn5nR59qwIVkflZMntQbDS5p5SQhpBAoZJBD7\nJRynZHVUSXh7Yg+r1plGJIh9jfn5skYj6bLcecR+VnEFjFOnmiOkDQzoCBAv994L3Hdf/PFo/0aR\n6OO9k7ydYt0rcDQypoyg/7WvVe5jxArJCyz1TgJJWqMQN42z6+yf3mt0WiJ2VkNw06aeCSztEu9e\n9u2rzN/x3HPRpgv7N3Z0+L/Pz2tfj61bg8/hNbnZKda9HD5cvxnFXCNIazE4WNu5CGkWFDJIIEnX\nE4krPKRRIdVcY+tW/3auDjXj45X+CEuXBlclNTTr3hWL2inSnoi92im7/Y4dwOSk/o2Dg3o8/tM/\nVQoac3PhRchsgbRQ0GM7KONnvb4/YUJvRwczfZL8QHMJCSTKv6IeokwpNi7yaXjPuXKlXvkWi3pS\n6O3VKne+uDUmc6X3+d+8qSdcw8iIzpKZ1Piol0ceqfTH8GJP1EGJuDo6gA98INjsEnQOoNLktmVL\nOUGYuW/nz/u1HLVqyuxrAHq8TkzQd4jkBwoZJJBahIIkKRaBe+4pTxyN2rUNto+Jl6Eh+mLY2M9/\n/Xr//kuXtLap2Rw/Hr3f1rDYE73Xf8LWQoSdA4jOjGrum52sLug8UQJ10DUoXJC8QSGDZAo7CgVI\nxlci6hz0xaiOvaqentar9qxOegMD2hRia1iCtAOG3l7tMHrsmNbcdHWFh7fGEcLjaAOjHKybJegT\nkiT0ySCZIkw13ShR56AvRnVsP42ZGeDOO5uXzMz4VoSFcl64ELzy9/oG2ZqL/n4tWAwMaD+Pc+dq\nL0LmzTGya5d2Sl2zRvdn167Ke5WX+j+E1AuFDFITrrNlBnn9v/JKuSJmvdcMcmYsFNxFsLQa/f06\ngsSLt6x62hgNgB0+alhYCO6XScTV16ePFdFRRosW6eRi3iRtGzbUPtYeecR/jm3bohO/Je1gTUjW\noJBBasJFtkyv4DI3p50KzUpzYUE70JlqmPVeM2iSXLvWXQRLKxI2ATZj9R3nmmFtdu7UTqyzs1oT\nMj8P3LpV2W5mpvaxZvuIXL8e3aeoqCumvyetAIUMUhMu1LteweXQIa2yfumlSqGg0Wty1dgYZkK0\na4U04z7a17zttso2K1dWbisWde6KuNQy1k6erMyZYefvsPsdFbLN9PekFaCQQWrCxUQdJriEnbve\na+7bp7UjnZ363/376ztPu2ImxLNn3SdMq4btW/H665Vt7Ake0BN3LSm5q401r7bh/vsr92/cWP+9\nor8GaQUYXUJiUyxqc4ZZyW7cmMwEE5ZK3HjnT04CV640ns/iscfKkSszM7ouBb33aycLUQ/ePgwO\nBufKsKsCA8F5MMKIU4slKO+Gl6efrt8cl0aKfUJcQyGDxGb3bn/lza6uZPwZ4uQcSAKuDFuTq1eD\nt9uTcrGoBdYoenpqK24WNYY6Ohr7+0g6IR4hzYBCBomNq0k6SJhwkfWTK8PWJKgKK6A1DCL609UV\nXhJ+eFiPt6tX9blqGW9ReTeAxqr7ZkFjREij0CeDxCZNx0kXTm9pFF8j6TMwEL1fKW3msyM9AC2A\ndHcDt99eXwRTVN6NhQU6bBJCIYPEJk3HSRdaE5MjISo5Eskf3ol+ZKS2Y5XSgoDXDAjEH2/e6JBT\np1jdlxAbChkkNsZxcn6+7DiZJF5P/elp/76ktCYMC2w9vBN9V1d0254eLYzYYbg29Yw3VvclpBIK\nGSQ2rh0nvQLAzEx5QkjStEHnz9Ym7HmKaC3HqVNaGNmyJfwchUJj482rWRke1nVQGkmoxaRcJM9Q\nyCCxce2TYU8Qq1YFJylqBCbkai3sCbivL7jd3XeX65CYUOygPBqA1obs2lX/pO7VrHR36+yijWjO\nqH0jeYbRJSQ2rkPq0oj+YFhga2FXMV26VGsi5ub8Sbe8Y8kOxbaZmwuvjFortuD8zDNao/LUU/EF\nZ2rfSJ6hkEFi4zqkzggA587pcMLJycZCAINgWGBrYU+4r71W/r/JebFypTZZ3HWXTupmZwctFPzp\nwG0NR62Tujf82vYtArSAU01wiToHtW8kT1DIIFVxkbMiCCMA7NihU1ebkMJGVpKktYnKU3Hjht5/\n86Y2WYQxNKTNGmZ82+1rndTtLKAilanMqwku9jnsJGGE5AUKGaQqtkra9aRP9TCJi9f8NTXlz4Ux\nP19OyBVGT0+l6WJqqjGT2rlz/u/d3ZWF006fBpYvByYmgPvuqzxHmH8SIXmDjp+kKmlP+q6dM+mt\n3zp4nSzvvTe4TVRBtN7eSifPqMqocbDTnHd2aj8MO2x2ZgbYti34HPaYn57mOCX5hEJGSuR5Yks7\nIsN1Zk7bW3/Dhnw+F+Ln8uXaj7lyJfnIjd5e//e+Ph3Z8sYblYm6btwIPsf4OLBsWfn7zAywc2fj\nfSMkbShkpESew9DSTsfd6EoyimIROHzYv21mJp/PhfipVfjdvl2bLLwcOtS4oGmnOb/9dq3JWLxY\nm3C8LFkSfI7+fu0b4uX48cb6RUgzoE9GSuTZz6CVIjJ27660j3vJ03Mhfrz+GStXal+MS5e0JuHr\nX/dHnoyM6DFtCxlzc437HNlh0nNzwSGzHR3AihXJR1ARkiWoyUgJJoGqHRcmJluIsJ0C+Vzyi7c2\nzeXLOqnWxIQ2VTz7rL/uzqc+VU7KZdOooGlr4oLMOIWCLqA2ORmuQRsaiv5OSB6gJiMlmASqdlxE\ntfT1+UMe778fuO02PpdWIWzMmLo7gL/uTpBWqx5B0xvm3dennU0vX9bnWrmyMszWFm68go0519SU\nFoh6e7UJhmOT5BEKGSnRSiaHtJicjP5eD3akQWcnn0srEWaWtLcfPgysXl15/PBwfZO5LdwYTp/W\nDpxdXX4fCzus1c5I6s2RMTTEMUryC4UMklmuXIn+Xg+26rqeiASSXcJS09vbZ2crx9P27cmlD/dy\n/brWSHiFDDsBmFewybP/FiE29MkgmcUOBbS/1wN9Y1qbsEio8fHKPBW9vY1HTRm/ofPno9v19mot\nSaGgPyL6ekERVMyRQVoJp0KGiHyHiHxGRK6JyFUR+aSILK1yzJdE5JbnsyAin3DZT5JN7FBA+3s9\npB2OS9IlLPy5v7+yvPvAQOOh0sa0YUwfhYKOXPHmuDDXMiaS2VmdtnzXLi2kmPDWxYuBrVuB/fu1\n5sMwM8PQapJfXJtLPgvgdgAPAegG8KcA9gN4b8QxCsB/B/CfABjf/9fDm5NWxYWzLH1j2gvjRDk5\nqU1j3d1aizA0lMx4sk0Za9cCTzyhE2edOKF9gLq79fUvXvS3PXRIt/OGtx48CDz6aLRjKCF5wpmQ\nISLfBeDdADYrpZ4rbfvfAfy1iPySUupixOGvK6UC6heSdqJRgSCtwm4kmxSLwD33lKNKvHR3JzMW\ngsVG3XMAABSDSURBVHxA7FLyc3P+mire7XZiOAA4dqxSyKBZj+QVl+aSbQCuGgGjxBegNRVbqxz7\n4yIyLSLPi8hviUhIXjxCwslzllXSOLt3BwsYQHKagSDzWy3nDqqrYmf6NP4bhOQRl+aS1QB87kpK\nqQURuVLaF8ZnAJwB8C0AQwB+G8BbAPyIo36SFoVe+u1N1PNesyYZTVeQti2q/Hw1RkYqNRlJaV0I\naQY1azJE5MOWY6b9WRCRt0SdAlqbEYhS6pNKqX9QSn1dKTUG4H0A/rWI3F1rX0l7w0iS9ibseYto\n50pXmi6vdmN4uNIJVEQLDoust293t86nYZd+37gxmX4R0gzq0WT8FwB/UqXNaQAXAfjkbxHpAPAd\nAIo1XO8AtGCyAcDLYY327t2LFStW+LaNjo5idHS0hkuRrNDoKtOkjDZhixs3UuXcboyP6wq7tslE\nKV1i3Q6JTkrTZWs31q/3+2Tcfbce096EW4Aer888owWT7duZhZYkz9jYGMbGxnzbrl275vSaooKM\ngkmcWDt+fh3AFo/j5/cD+BsAA1UcP73n2Q7gKwA2KqVOBuzfBODIkSNHsGnTpsT6T5rLjh3+l3Ct\niZIaPZ60BlNTwMMPBxco6+nxCyCuxog9Fo3gG1aor1AAzp7VwhAdl4lrjh49is2bNwM6SONo0ud3\n5viplHoRwNMA/khEhkvCwh8AGDMChoi8WUReEJEtpe/rROTXRGSTiAyKyCMAPg3gy0ECBmlNgsqx\n17rKtNsfOJBckTWSH/r7dVjo9u2V+5JIxhUHYz7xChdRlYBnZ4E779SRMXRcJnnHdcbPfwvgReio\nkqegNRJ7PPu7oJ06byt9nwPwr6CFkxcA/A6A/wngEcf9JBkiqBy7174eVZ01LAPj/Dxf1O1A2NjY\nt0+XVvdi8lZ8/vP6323b3Aiixnxi10rp7i7n7bCZna0089BxmeQRp8m4lFL/gojEW0qpMwA6PN8n\nAbzLZZ9I9gl6mc7NASdP6mqahw+XhRC7OqtdXCrOuUnrEFWFdWHB33Z2Vrd98MHyhJ5Utd8g7Do5\nN29qp9CgcvNB0HGZ5BEWSCOZoljUtRpsDh3yTwZevIKDLUSI+HMR8EXd2sStwurlxo3ocySFLUwo\nFZ7Hw9DTA6xaRQdQkl9YII1kiqgESvZkYPAKDrYQ4RUwli3ji7rVCQtbjhIul1ip/lwJokFmEZtF\ni3R0ifETOXWqsdoqhDQbajJIpohaRS5Z4hdACgVd9MorOHjrnbz8sl/IuHmTL+pWJ6zejXd7X58e\nF5cv6zb79wN79rgPGR0aCo5y8XLrlvbTeOklN30gJG0oZJBMYWdL9KqLvZOBmSguXNCThwnv8+Yo\nWLw42ouftB5h9W68200OFsOqVemENz/1lB6rk5PAlSs6uuXKFTp4ktaGQgbJFEErUa/2wUwG3twD\ntrOemUTsFDBDQ+77T7JFUFI32zl0wwZtlnCt5QoSgKamKhOG0W+ItBIUMkimiFt5NaouiR1hEmRW\nIe1BULSJPXZmZvRE73WwTMOsZgQgk3l0xQrg2jWt6dixg8m3SGtAx0+SS6LqktiTyNq1dJxrV4KE\n0SBNwcyMu6RXxaIufLZ4sf5s3ao1GEYAOnNGX39yUv975oze/vDDyfaDkGZAIYPkkqAS2wYWRiOG\noLEwPq59fcJI2idi927t8GkyfR48GKxRsTlxItl+ENIMaC4huSFu0bSwCAPSfoT5+Jw6Vd4+Pe3W\nJyJImDD9qbckPCF5gUIGyQ1h2Rxt7EiCKEdS0trEiTaZmnIrlAYJE+Y6u3b5M9h66erS6dE5bkme\nobmE5IYoZ08bU8NicJBFptqZqDo3BiNwuEp6NT6uE2wVCvozMlIWGr76VV1xdft2PVZ7esr/Xr/O\ncUvyDzUZJDfYK8IotXZYDRPmIGgv4mq/XNLfDzz5pO7LuXPACy8AmzfrSJLeXmBgwK+pKBa1oOGF\n45bkFQoZJJME+V/U4msR9lKmE2h7UYv2yyW20Gt8QEw0iTeE9ubNSvPJ9LTWwtBkQvIGhQySScJW\noHFXoStX+rUe3d1aZU0n0PaiFu2XS6oJNzMz5TDaQiF4fzO0MIQ0Cn0ySCaptgKtZmu3i1Hdfz9z\nZbQjUaHOaZKEcEOTCckj1GSQTFJtBVrN1n7pkr+9/Z20B3EzyLrGmPomJ7Wjp53y3svQkNa82VEn\nNPWRPEIhg2SSav4X1TQdWVGTEwL4hR1v3R1DoaAz05qxrhSwc2c5IdfGjTT1kXxCIYNkkmor0GpC\nBBNykawyPl5ZFK27G5iYKJvzduzwl4Xv6qKpj+QTChkkl1QTIrKiJifExmQc9QoatmPnuXP+YyYn\n0+0jIUlBIYPkEgoRJM/09+uQVa82w2vyu3rV3/7KlXT6RUjSMLqEtARxMjsSkiWiCvmZ8u9h3wnJ\nCxQySEtgok1MGuYNGyhotCt5ETijwmsHBvxt7e+E5AWaS0hLYEeXMHlR+5KFVOJhsJIwaTcoZJCW\nIKjSJZMXtSdZSSUeRD2VhAnJMzSXkJZgfFxXrvTC3BjtSZSvQ7OxBZ5z5/Jh2iGkXihkkMxj29hP\nnqz8vmuXdo4zpbKbmUKaNJespBIPwhZ4rl71+xKxpDtpNWguIZnHVjE/+GA59M/+Dui0zF/9alk4\nqWb/Jq1Flk0N4+PAww+XM3nOzfn3Z8m0Q0gSUMggmcd+8b7+evR30z7LDoCkPenv19k97VLuhiyZ\ndghJAgoZJPPYTp0LC9XbA9l2ACTtiz0O7bolhLQS9MkgmWd8HBgerizfblizJtgGn2UHQNK+2ONw\nyxbgpZe0lo3mPNJqUJNBMo9RMYeVx752LdjfgrkGSBbhuCTtBIUMkguiTB1hibey7ABI2hd7XNJB\nmbQyNJeQXGCrmG3TCf0tSF5hSnzSylDIILnAzn2wZYt/vxFCvDk1RkaArVuZ6KhdyUsNk7CU+IS0\nAs7MJSLyAQA/COB+ALNKqVh1BEXkQwD+PYA3AXgGwE8rpU656ifJB7aKeWoq2K5th60aGMLafuQl\nhJkp8Ukr41KT0QXgLwH8t7gHiMivAvg5AHsAjAB4DcDTItLtpIcktxihw/bKj3o588XdXmQxhDlI\nu8KU+KSVcSZkKKV+Qyn1cQDP13DYLwD4TaXUk0qpkwDeB+DNAH7YRR9J6xH1cuaLu73IYgiz7X+x\na5cWkE+dym4qdEIaITPRJSJyN4DVAP7RbFNKvSoiBwBsg9aKEBJZLtsbHrhypXYQvXSJoYLtSBZD\nRcO0K4yEIq1KZoQMaAFDASha24ulfYQAiLa182VNDFkcC7b/RRa0K4S4pCYhQ0Q+DOBXI5ooAPcq\npb7ZUK+sy5bOG8nevXuxYsUK37bR0VGMjo4m2BWSBbJoayckDlnUrpD2YWxsDGNjY75t165dc3pN\nUWFpFIMai6wEsLJKs9NKqXnPMe8H8LFq0SUlc8lLAO5XSp3wbP8SgOeUUntDjtsE4MiRI0ewadOm\neD+E5JodO8qaDEDbsLO2YiWEkDxw9OhRbN68GQA2K6WOJn3+mjQZSqnLAC4n3YnSuV8WkYsAHgJw\nAgBEZDmArQD+0MU1ST4JWw1G+WoQQghJH5d5Mu4A0AtgEECHiGws7TqllHqt1OZFAL+qlPp8ad/v\nAfg1ETkF4BUAvwlgEsDnQUgJr629WCwLHNPTOpERkO28CIQQ0i64dPz8EHQIqsGoYb4HwFdK/78H\nwLcdKZRSvy0itwHYD52M6/8F8B6l1JzDfpIc43UCtaGvBiGENBdnQoZS6icB/GSVNh0B234dwK+7\n6RVpNaIECXruE0JIc2HtEpJrwgSJnh567hNCSLOhkEFyjSmc1mnp5FatotMnIYQ0GwoZJNcYJ9Ct\nW/3baSohhJDmk6WMn4TUDZMcEUJI9qCQQVqCLKaQJoSQdofmEpJbgspmE0IIyQ4UMkhuCSqbTQgh\nJDtQyCC5hYXSCCEk21DIILnFjiBhRAkhhGQLChkkt5gcGevW6X8ZUULyDH2MSCvC6BKSWxhRQloJ\nbx0eFvgjrQI1GYQQkgHoY0RaEQoZhBCSAehjRFoRmksIISQDMGstaUUoZBBCSAagjxFpRWguIYQQ\nQogTKGQQQgghxAkUMgghhBDiBAoZhBBCCHEChQxCCCGEOIFCBiGEEEKcQCGDEEIIIU6gkEEIIYQQ\nJ1DIIIQQQogTKGQQQgghxAkUMgghhBDiBAoZhBBCCHEChQxCCCGEOIFCBiGEEEKcQCGDEEIIIU6g\nkEEIIYQQJ1DIIIQQQogTWkbIePRRYP16YMcOYGqq2b0hjTA2NtbsLpCE4TNtLfg8SVycCRki8gER\neUZEXhORKzGP+RMRuWV9/ibOscePA6dPA888A+za1VjfSXPhC6z14DNtLfg8SVw6HZ67C8BfApgA\n8GgNx/0tgH8HQErfZ2u98IULtR5BCCGEkKRxJmQopX4DAETk/TUeOquUmm7k2mvWNHI0IYQQQpLA\npSajXt4lIkUAVwH8E4BfU0pVNbds3AjMzGgBY3zceR8JIYQQUoWsCRl/C+BxAC8DWA/gwwD+RkS2\nKaVUyDGLAeCXf/kF3Huv3jA5qT8kn1y7dg1Hjx5tdjdIgvCZthZ8nq3DCy+8YP672MX5JXzuDmgs\n8mEAvxrRRAG4Vyn1Tc8x7wfwMaVUb82dE7kbwEsAHlJKfTGkzb8F8Jlaz00IIYSQb/PjSqnPJn3S\nWjUZ/wXAn1Rpc7rOvlSglHpZRC4B2AAgUMgA8DSAHwfwCoA3kro2IYQQ0gYsBnAX9FyaODUJGUqp\nywAuu+hIECIyAGAlgNB4kVKfEpe+CCGEkDbha65O7DJPxh0ishHAIIAOEdlY+iz1tHlRRH6o9P+l\nIvLbIrJVRAZF5CEAnwPwTTiSsAghhBDiDpeOnx8C8D7Pd+Ml9D0AvlL6/z0AVpT+vwBgqHTMmwB8\nC1q4+M9KqZsO+0kIIYQQB9Tk+EkIIYQQEpeWqV1CCCGEkGxBIYMQQgghTsiVkBGn6FrJ4fSvS20u\nlpxJF1lt3iUiR0TkDRH5Zh2pz4kDROQVqzjegoj8itVmSES+IiI3ROSMiPxys/pLqiMiPysiL5ee\n17MiMtzsPpHqiMgHA4pVfsOzvyAifygil0RkRkT+HxHpb2afiR8RebuIPCEi50vP75GANh8SkW+J\nyOsi8g8issHa/x0i8hkRuSYiV0Xkk97gjTjkSshAuejafwvaWRIm/gbaofVtAN4PXWztQ542dwF4\nCsA/AtgI4OMAPiki3+eu2yQmCsCvAbgdwGoAawD8gdkpIj3QzsAvA9gE4JcB/LqI/Pv0u0qqISI/\nBuB3AXwQwAMAjgN4WkT6mtoxEpeTKP8trgaww7Pv9wD8IIDdAN4B4M3Q2ZpJdlgK4BiAn4V+t/oQ\nkV8F8HMA9gAYAfAa9N9nt6fZZwHcC+Ah6Of9DgD7a+qFUip3H2jh4UrA9vcAuAmgz7NtD3QdlM7S\n948AOGEdNwbgb5r9u9r9Ay08/HzE/p8GcMk8y9K2DwP4RrP7zk/g83oWwMc93wXAJIBfaXbf+Kn6\n7D4I4GjIvuXQ1bH/tWfbdwK4BWCk2X3nJ/CZ3QLwiLXtWwD2Ws/1BoAfLX2/t3TcA5427wYwD2B1\n3GvnTZNRjbcBeF4pdcmz7WnoMNn7PG2+YB33NIBt7rtHYvB/llSwR0Xkl0Skw7PvbQC+opSa92x7\nGsB3isgKkMwgIl0ANkNrDAEASr+lvgD+reWFe0qq9pdE5M9F5I7S9s3Q2mLvs/1nAGfBZ5sLSiU7\nVsP/DF8FcADlZ/g2AFeVUs95Dv0CtFZka9xrtZqQsRpA0dpW9OyLarNcRAoO+0aq83EA/yuAdwHY\nB+AD0JonQ5znS7JBH4AOBD8vPqvs8yy0qfndAB4DcDeAr5Ts8asBzJUmJS98tvlhNbSwEPX3uRrA\nlHenUmoBwBXU8JybXoW1nqJrdRKVEERitCF1UMvzVUr9nmf7SRG5CWCfiPxHFZ6Qjc8uXwj4rDKP\nUsqbZfmkiBwEcAbAjyK8RhSfbf6J8wxres5NFzKQbNG1iwBs7/XbPfvMv7dbbfoBvKqUmot5HRKf\nRp7vAegxeheA/w/hzw6olMhJc7kEncU36HnxWeUMpdQ1EfkmdLHKLwDoFpHlljaDzzY/XIQWFm6H\n/5n1A3jO08YXMVQyX38HanjOTRcyVLJF1yYAfEBE+jx+Gd8P4BqAFzxt3mMd9/2l7SRhGny+D0A7\nHhmV3QSA/0tEOkpqO0A/u39WSl1rrKckSZRSN0XkCLRX+hMAICJS+v77zewbqR0RWQZgPYBPAzgC\n7fz3EIC/Ku1/C4A7wfdoLlC6wvlF6Gd4AgBEZDm0r8UflppNAHiTiDzg8ct4CFo4ORD3Wk0XMmqh\n5HjUC0/RtdKuU0qp1wD8PYBvAPgfpfCcNQB+E8B/9ajb9wH4ORH5CIBPQd+0HwHwA+n9EmIjIm+D\nHuBfBDAD4EEAHwXwPzwCxGcB/GcAnyo9v+8G8PMAfiH9HpMYfBTAp0vCxkEAewHcBuBPm9kpUh0R\n+R0AT0KbSNYC+A1oweIvlFKvisgfA/ioiFyF/nv9fQDPKKUONqvPxE/Jf2YDyibldaU584pS6hx0\nGPKvicgpAK9Az5WTAD4PAEqpF0XkaQB/JCI/DaAbOqXAmFLqIuLS7NCaGsNw/gRaBWt/3uFpcwd0\nHozr0CqdjwBYZJ3nndDS+A1oNfxPNPu3tfsHWmsxAe1U9Bp0jP6vAOiy2n03gC8DeB3am/2Xmt13\nfiKf68+UXmA3Ss93S7P7xE+s5zZWmnBulP7OPgvgbs/+QmnCuQQtZPxPAP3N7jc/vmf4TmhNsD1f\nfsrT5tehQ1lfh47U22Cd400A/hzaGnAVwB8BuK2WfrBAGiGEEEKc0GohrIQQQgjJCBQyCCGEEOIE\nChmEEEIIcQKFDEIIIYQ4gUIGIYQQQpxAIYMQQgghTqCQQQghhBAnUMgghBBCiBMoZBBCCCHECRQy\nCCGEEOIEChmEEEIIccL/D2CzXOr33S2vAAAAAElFTkSuQmCC\n",
"text/plain": [
"<matplotlib.figure.Figure at 0x7f86361f6650>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"plt.plot(X,y,'.');"
]
},
{
"cell_type": "code",
"execution_count": null,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 2",
"language": "python",
"name": "python2"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 2
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython2",
"version": "2.7.12"
}
},
"nbformat": 4,
"nbformat_minor": 1
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment