Skip to content

Instantly share code, notes, and snippets.

@pilipolio
Last active December 17, 2015 07:19
Show Gist options
  • Save pilipolio/5572371 to your computer and use it in GitHub Desktop.
Save pilipolio/5572371 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "LinearRegression"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## polynomial fitting and regularisation \n",
"\n",
"\n",
"$$ y = f(x) + \\epsilon \\sim \\mathcal{N}(0, \\sigma^2)$$\n",
"\n",
"Oracle solution : $f(x) = w_0 + w_1 \\ \\mathbf{x}_1 + w_2 \\ \\mathbf{x}_2 + w_3 \\ \\mathbf{x}_3$\n",
"\n",
"$n$ values $x_i \\in \\mathbb{R} \\ $ drawn from $X \\sim \\mathcal{U}(0,1) $\n",
"\n",
"$ \\mathbf{X} \\in \\mathcal{M}_{n,d+1}$ \n",
"\n",
"$ \\mathbf{w} \\in \\mathcal{M}_{d+1,1}$ \n",
"\n",
"and $\\mathbf{y} \\in \\mathcal{M}_{n,1}$\n",
"\n",
"$$ X W = y \\Rightarrow W = (X^T X)^{-1} X^T y$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"from numpy.polynomial.polynomial import Polynomial\n",
"\n",
"n = 25\n",
"d = 3\n",
"x_n = np.sort(np.random.uniform(low=-1, high=1, size=n))\n",
"\n",
"w_oracle = [0, .25, -.25, -.1]\n",
"print 'Oracle coefficients = {} and ||w||_2 = {}'.format(w_oracle, np.linalg.norm(w_oracle))"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"Oracle coefficients = [0, 0.25, -0.25, -0.1] and ||w||_2 = 0.367423461417\n"
]
}
],
"prompt_number": 86
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"OLS solution :\n",
"\n",
"$$ \\hat{\\mathbf{w}}_{ols} = (\\mathbf{X}^T \\mathbf{X})^{-1} \\mathbf{X}^T \\mathbf{y}$$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"y_n = f_oracle(x_n) + np.random.normal(scale=.1, size=n)\n",
"X_n_d = np.vstack((np.repeat(1, n), x_n, np.power(x_n,2), np.power(x_n,3))).T\n",
"w_ols = np.dot(np.dot(np.linalg.inv(np.dot(X_n_d.T, X_n_d)), X_n_d.T), y_n)\n",
"\n",
"print 'OLS coefficients = {} and ||w||_2 = {}'.format(w_ols, np.linalg.norm(w_ols))\n",
"\n",
"def plot_polynomial_fit(oracle_P, ols_fit_P, fit_label, fit_alpha=.75, fig=None, ax=None):\n",
" if type(oracle_P) is not Polynomial:\n",
" oracle_P = Polynomial(oracle_P, domain=[-1, 1])\n",
" if type(ols_fit_P) is not Polynomial:\n",
" ols_fit_P = Polynomial(ols_fit_P, domain=[-1, 1])\n",
" if fig is None:\n",
" f, ax = plt.subplots(1,1, figsize=(8, 6))\n",
" ax.plot(*oracle_P.linspace(), color=\"b\", ls=\"-\", lw=3, alpha=.7, label=\"$y=f(x)$\")\n",
" ax.plot(x_n, y_n, \"ko\", alpha=.7,label=\"$(y_i)_{i=1,\\ldots,n}$\")\n",
" ax.plot(*ols_fit_P.linspace(), color=\"g\", ls=\"-\", lw=2, alpha=fit_alpha, label=fit_label)\n",
" plt.legend(loc=\"lower right\", prop={'size':20})\n",
" return fig, ax\n",
"\n",
"fig, ax = plot_polynomial_fit(w_oracle, w_ols, \"$y=\\hat{f}_{OLS}(x)$\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"OLS coefficients = [ 0.02948636 0.35176512 -0.23526627 -0.22440267] and ||w||_2 = 0.479911373115\n"
]
},
{
"output_type": "display_data",
"png": "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\n"
}
],
"prompt_number": 114
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Forward stepwise algorithm :\n",
"\n",
"- At step $i$, estimator $\\mu$ and residuals $\\mathbf{y} - \\mu$\n",
"\n",
"- Choose $\\hat{j} = \\underset{j}{\\text{arg max}} \\ | \\hat{c_j}|$ where $\\hat{c} = c(\\hat{\\mu}) = \\mathbf{X}^T_j (\\mathbf{y} - \\mu)$\n",
"\n",
"- $\\hat{\\mu} \\rightarrow \\hat{\\mu} + \\gamma \\ \\text{sign} (\\hat{c_j}) \\mathbf{x}_\\hat{j}$"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"##################\n",
"### Initialisation\n",
"##################\n",
"i = 0\n",
"# no intercept in x and mu because w_0 = 0\n",
"X_n_d = np.vstack((x_n, np.power(x_n,2), np.power(x_n,3))).T\n",
"m = d + 2\n",
"w_m_d = np.zeros((m, d))\n",
"mu_d = np.dot(X_n_d, w_m_d[i,:])\n",
"mu_d"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 117,
"text": [
"array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.,\n",
" 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])"
]
}
],
"prompt_number": 117
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"### Step i\n",
"w_stepwise = [0] + list(w_m_d[i,:])\n",
"\n",
"### Step i -> i+1\n",
"print np.linalg.norm(y_n - np.dot(X_n_d, w_m_d[i,:]))\n",
"hat_c_d = np.dot(X_n_d.T, y_n - np.dot(X_n_d, w_m_d[i,:])) / [np.dot(x, x) for x in X_n_d.T]\n",
"hat_j = np.argmax(np.abs(hat_c_d))\n",
"print 'At step {}, hat_c_d = {} and hat_j = {}'.format(i, hat_c_d, hat_j)\n",
"w_m_d[i+1,:] = w_m_d[i,:]\n",
"w_m_d[i+1, hat_j] = hat_c_d[hat_j]\n",
"print 'w_d ({})= w_d ({}) + hat_c_d[{}] ({})'.format(w_m_d[i+1,:], w_m_d[i,:], hat_j, w_m_d[i+1,:] - w_m_d[i,:])\n",
"\n",
"## plot\n",
"fig, ax = plot_polynomial_fit(w_oracle, [0] + list(w_m_d[i+1,:]), fit_alpha=.75, fit_label=\"$y=\\hat{f}_{Stepwise}(x)$\")\n",
"for i in range(i):\n",
" fig, ax = plot_polynomial_fit(w_oracle, [0] + list(w_m_d[i,:]), fit_alpha=.5, fit_label=\"$y=\\hat{f}_{Stepwise}(x)$\", fig=fig, ax=ax)\n",
"i += 1"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"0.787433162752\n",
"At step 1, hat_c_d = [ 4.13118024e-02 -1.75624094e-01 2.45151632e-17] and hat_j = 1\n",
"w_d ([ 0. -0.17562409 0.30022163])= w_d ([ 0. 0. 0.30022163]) + hat_c_d[1] ([ 0. -0.17562409 0. ])\n"
]
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFtCAYAAADBM4kgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xlc1NX6wPHPDAyLogJKqCDuuG+pWKmJmllmat0SvZZp\nllZaebOU7N7CuhqmVpZmttwyu7/CbqWVabmEu2KpuYsbgpCmoKjIwGy/P04sI4swCzMjz/v1mhfM\nme98z2kZnjnbczQWi8WCEEIIITyC1tUNEEIIIUTFSeAWQgghPIgEbiGEEMKDSOAWQgghPIgEbiGE\nEMKDSOAWQgghPIjdgXv16tW0bt2ali1bMnv27BKvr1ixgk6dOtGlSxe6du3K+vXr7a1SCCGEqLY0\n9uzjNplMtGrVirVr1xIWFkb37t354osvaNOmTeE1OTk51KxZE4B9+/Zx3333cezYMftbLoQQQlRD\ndvW4k5KSaNGiBU2aNEGn0zFixAhWrFhhdU1B0Aa4cuUK9erVs6dKIYQQolqzK3Cnp6fTqFGjwufh\n4eGkp6eXuG758uW0adOGu+++m3feeceeKoUQQohqzdueN2s0mgpdN2zYMIYNG8amTZt4+OGHOXLk\niM33EkIIIW4UtsxW2xW4w8LCSEtLK3yelpZGeHh4mdf37t0bo9FIZmYmdevWLfG6pE33THFxccTF\nxbm6GcJG8t/Ps8l/P89la4fVrqHybt26cfToUVJSUsjPzychIYEhQ4ZYXXP8+PHCgLxr1y6AUoO2\nEEIIIa7Prh63t7c3CxYsYODAgZhMJsaNG0ebNm1YvHgxABMmTODrr7/ms88+Q6fTERAQwJdffumQ\nhgshhBDVkV3bwRxJo9HIULmHSkxMJDo62tXNEDaS/36eTf77eS5b454EbiGEEMIFbI17kvJUCCGE\n8CASuIUQQggPIoFbCCGE8CASuIUQQggPIoFbCCGE8CASuIUQQggPIoFbCCGE8CASuIUQQggPIoFb\nCCGE8CASuIUQQggPYtchI0IIUd0kJSWRkJCAXq/Hz8+PmJgYoqKiXN0sUY1IrnIhhKigpKQk4uPj\nMRgMhWU6nY7Y2FgJ3qLSJFe5EEI4WUJCglXQBjAYDCQkJLioRaI6ksAthBAVpNfrK1UuhDNI4BZC\niAry8/OrVLkQziCBWwghKigmJgadTmdVptPpiImJcVGLRHUki9OEEKISZFW5cBRb454EbiGEEMIF\nZFW5EEIIUQ1I4BZCCCE8iGROE0JUCZkbFsIxZI5bCOF0knFMiJJkjlsI4bYk45gQjiOBWwjhdJJx\nTAjHkcAthHA6yTgmhONI4BZCOJ1kHBPCcWRxmhCiSsiqciGsSeY0IYQQwoPIqnIhhBCiGpDALYQQ\nQngQCdxCCCGEB5HALYQQQngQuwP36tWrad26NS1btmT27NklXv/vf/9Lp06d6NixIz179mTv3r32\nVimEEEJUW3atKjeZTLRq1Yq1a9cSFhZG9+7d+eKLL2jTpk3hNdu2baNt27bUqVOH1atXExcXx/bt\n20s2RFaVCyGEqEZcsqo8KSmJFi1a0KRJE3Q6HSNGjGDFihVW19x6663UqVMHgB49enD69Gl7qhRC\nCCGqNbsCd3p6Oo0aNSp8Hh4eTnp6epnXf/zxxwwaNMieKoUQQohqza7zuDUaTYWv/eWXX/jPf/7D\nli1byrwmLi6u8Pfo6Giio6PtaJ0QQgjhPhITE0lMTLT7PnYF7rCwMNLS0gqfp6WlER4eXuK6vXv3\n8vjjj7N69WqCgoLKvF/xwC2EEELcSK7tkM6YMcOm+9g1VN6tWzeOHj1KSkoK+fn5JCQkMGTIEKtr\nUlNTuf/++/n8889p0aKFPdUJIYQQ1Z5dPW5vb28WLFjAwIEDMZlMjBs3jjZt2rB48WIAJkyYwKuv\nvsqFCxd48sknAXUiUFJSkv0tF0IIIaohOWRECCGEcAE5ZEQIIYSoBiRwCyGEEB5EArcQQgjhQSRw\nCyGEEB7ErlXlQgjhLElJSSQkJKDX6/Hz8yMmJoaoqChXN0sIl5NV5UIIt5OUlER8fDwGg6GwTKfT\nERsbK8Fb3DBkVbkQ4oaRkJBgFbQBDAYDCQkJLmqREO5DArcQwu3o9fpKlQtRncgctxDC7fj5+VWq\nXAhH8JR1FdLjFkK4nZiYGHQ6nVWZTqcjJibGRS0SN7qCdRXJycmkpqaSnJxMfHy8W6bolsVpQgi3\n5Cm9H3FjmDJlCsnJySXKIyMjmTdvnlPqtDXuyVC5EMItRUVFSaAWVcaT1lXIULkQQohqz5PWVUjg\nFkIIUe150roKmeMWQgghqPp1FbbGPQncQgghhAtI5jQhhBCiGpDALYQQQngQCdxCCCGEB5HALYQQ\nQngQCdxCCCGEB5HALYQQQngQSXkqhBDCLpJXvmrJPm4hhBA2KzhVy2AwFJbpdDpiY2MleF+H7OMW\nQghR5RISEqyCNoDBYCAhIcFFLbrxyVC5EEKIEio6/O1Jp2q5ky2pW2x+r/S4hRBCWCkY/k5OTiY1\nNZXk5GTi4+NJSkoqca0nnarlLrakbuGVxFdsfr8EbiGEEFYqM/ztSadquYMtqVuI2xCHyWKy+R4S\nuIUQQlipzPB3VFQUsbGxREZGEhERQWRkpCxMK8PWtK3EbYjDaDYyvO1wm+8jc9xCCCGsVHb4Oyoq\nSgL1dWxN28oria8UBu0nuj3BUzxl072kxy2EEMKKDH871qZTmwqD9oNtH+SJbk+g0Whsvp/s4xZC\nCFGCJFVxjJ+P/8wbW97AZDHxYNsHebLbk4VB29a4J4FbCCGEcILvjnzHW9vfAuDhjg8ztvNYq562\nyxKwrF69mtatW9OyZUtmz55d4vXDhw9z66234ufnx7x58+ytTgghhHB7X+7/sjBoT+g6gUe7PGrX\n8Hhxdi1OM5lMTJo0ibVr1xIWFkb37t0ZMmQIbdq0Kbymbt26vPvuuyxfvtzuxgohhBDuzGKx8Mme\nT1i6dykAk3tMZmjroQ6tw64ed1JSEi1atKBJkybodDpGjBjBihUrrK4JCQmhW7duJRY6CCGEEDcS\nk9nE3K1zWbp3KVqNltiesQ4P2mBn4E5PT6dRo0aFz8PDw0lPT7e7UUIIIYQn0Rv1/OuXf/HjsR/x\n8fLhtb6vMbDFQKfUZddQuaPG6wvExcUV/h4dHU10dLRD7y+EEEI4WrY+m+nrp3Pw3EFq+9ZmZr+Z\ntL+pfYnrEhMTSUxMtLs+uwJ3WFgYaWlphc/T0tIIDw+3+X7FA7cQQgjhDI7c6pZxOYMX171IanYq\noTVDmX3HbBoHNi712ms7pDNmzLCpTruGyrt168bRo0dJSUkhPz+fhIQEhgwZUuq1stVLCCGEq1Xm\nAJXr2f/nfp5a+RSp2ak0C2rGgkELygzajmRXj9vb25sFCxYwcOBATCYT48aNo02bNixevBiACRMm\ncObMGbp3786lS5fQarXMnz+fgwcPEhAQ4JB/ACGEEKKiyjtApTK97rUn1vLGljcwmA1EhUXx8u0v\nU9OnpqObWypJwCKEEKLamDhxIqmpqSXKIyIiWLhw4XXfb7aYWbJnCZ/t/QyA+1rfx8TuE/HSelW6\nLbbGPTlkRAghRLVhz/nheqOe2Ztnk3gqEa1Gy8TuE7m/zf2ObuJ1ySEjQgghqg1bD1DJuJzBxB8n\nkngqkRq6GszqN8slQRtkqFwIIUQ1U9lV5UnpSby28TWu5F8hok4Er/V9jYg6EXa3Qw4ZEUIIIRzI\nbDHzxb4v+Hj3x1iw0LNRT17s9aLDFqHJHLcQQgjhIJfyLhG/OZ5tp7cBMLbzWB7q+BBajetnmCVw\nCyGEEMXs/3M/r218jT9z/iTAJ4DpvaZza6NbXd2sQhK4hRBCCNTQ+LIDy/ho10eYLCbahrTl5dtf\nJjQg1NVNsyKBWwghRLWXlZvFG1veYEf6DgCGtx3OYzc/hs7L/U62lMAthBCiWtuSuoU5W+eQnZdN\nLZ9axPaK5bZGt7m6WWWSwC2EEKJayjXksnDnQlYeXQlA1wZdie0VS70a9VzcsvJJ4BZCCFHt7Du7\nj9lbZpN+OR0fLx/G3zye+9rc5xarxq9HArcQQohqI9eQy0e7PuLbw99iwUKL4BZM7zWdpkFNXd20\nCpPALYQQNrBYQK+H3Fy4elX9zM0Fg0E9jEb102wueo9Gox46nXr4+Kifvr5QsybUqKF+6txvPdQN\nYdcfu5izdQ5nrpzBS+PFqA6jeKjjQ265AK08EriFEKIYkwnOn4dz5yArS/2emal+z86GS5eKHiaT\nc9rg6wu1a0NgYNEjOBhCQqwfFTgXQ6CSqXzw2weFc9ktg1sytedUWgS3cHHLbCMpT4UQ1Y7ZrALz\n6dOQlgYZGXDmjHr8+afzArKjBQdDWBg0bKh+hodDkyZQr57q2XuCyuYNrwyzxcxPx35i8W+Lyc7L\nRqfVMbrTaEa0H4G31vX9VslVLoQQpbh8GU6eLHqkpKhgnZ9v/719fdXwtr9/0c+CYXBvb/VTe81a\nJ7O5aDg9P1899Ho13J6To37a+8WhZk1o3BiaNoXmzSEyEho1KtkWV0tKSiI+Ph6DwVBYptPpiI2N\ntTt4n7xwkre2v8W+P/cB0KV+FybfMtkhh4M4iuQqF0JUe7m5cOwYHD0Kycnq559/Vv4+wcFw001Q\nt27RIzhYDVnXrg116kCtWmqO2tEK5s6zs+HixaJHZqYaJSj+MBpLv0dODhw8qB4F/PygRQto1Qra\ntYM2bSAgwPHtr4yEhASroA1gMBhISEiwOXBfyrvEZ79/xvLDyzFZTAT5BfFU96fo37Q/Gk8ZhrgO\nCdxCCI91/jwcOlQUpFJSrBeDlScwUA0tN2qkhpkbNID69SE0VPWkXUWjUT13f3/VnrKYTCp4p6er\nof70dEhNVaMKV66UvF6vh/371ePrr1U9TZqoIN6pE3TooHrqVUmv11eqvDxGs5HvjnzHp3s+5XL+\nZbQaLcNaDWPczeMI8HHxNxQHk8AthPAYWVmwbx/s3aseZ85c/z06XdGwccGjcWPVY/ZkXl4qsNev\nD127FpVbLKp3fuoUHD+uRh2OHlVlxVksRdMHP/yg7teqFXTpoh4tWzp/aN2vjNV1ZZWXxmKxsCN9\nB+//+j6nsk8Balh8YveJNA9u7pB2uhuZ4xZCuK38fNVD3LVLPdLSyr9eq4WICDWn27Kl+hkRoeab\nq7vMTDV9cOgQHDiggnp5c+lBQdC9O9xyi+qRO2NawN457n1n9/Hhrg8L57HDaoXxZLcnua3RbR4x\nLC6L04QQN4SzZyEpCX79VQXt8haR+fpC69ZqvrZtW9VjrFGj6trqyXJz4fBhNXKxe7cK5GXx9YVu\n3aBXLxXMHTmVYMuq8uNZx/lo90dsP70dgDq+dRjVYRTDWg/zqD3ZEriFEB7JbFZDuTt2qIB96lTZ\n1+p0KlB37KgekZHSm3aU7Gz4/Xc1svHrr+p5afz8ICoKbr9dDdFX5b//Y1nHWLp3KRtPbQTA39uf\n4e2G82DbB6npU8UT9A4ggVsI4THMZjVcu3UrbNtWcv61uEaN4Oab1aNdO9cuHKsuzGY4ckR9mdqx\nQ+13L03t2tCnD/TvD82aOW/v+JHzR1i6dylb0rYAoNPqGNJqCKM6jCLIP8g5lVYBCdxCCLdmNquV\n3xs3qoBdVo9Op4POnVWvrmtXlSFMuFZqKmzeDJs2lR3EGzeGAQOgXz/HLPyzWCzs+mMXCQcS2Jmx\nEwAfLx+GRA4hpn2M25/gVRESuIUQbsdiUfuqN25Uf/TL6lnXrq0CdcFCKEnl6Vy2ZiuzWNRUxsaN\nkJiotqNdy8cHeveGu+9WUxmV7YUbTAZ+SfmFrw5+xbGsY4AaEh/aaijD2w336B72tSRwCyHcxvnz\n6g/7+vVlrwQPCoLbblOPdu3UdiThfI7KVmY2q61569fDli2Ql1fymqZN4d571XD69ValZ+VmsTJ5\nJd8nf8+5q+obQbB/MPe3vp97W91Lbd/aFW6bp5DALYRwqfx89Qd83Tq1Urm0j3Pt2mplcu/eahW4\nu6XgrA6mTJlCcnJyifLIyEjmzZtn0z1zc2HDBli9uvTV6YGBqgc+aJD6vYDFYmHv2b2sOLKCjac2\nYrKo/WlNApswvO1w7mh2h0etEq8sSXkqhHCJEyfg559VDzsnp+Tr/v5w661qFXKnTrIK3NUcma2s\ngL8/3HUXDByopkZWr1aBvKAXfvEifPEF/O9/0Lcv9Lsnk31X17D62OrCpClajZbeEb0Z2mooXRp0\nQauRb3VlkY+QEKLSrtfD0mjUArO+fVXQljlr9+GIbGVl0WhU4puWLWHsWPWF7ocf1Fy4WZPPGd/t\nzD+wildTdlI70MRNIdAwOJjBLQczOHIwITVlJWJFSOAWQlRYair8+CP88os6xepaDRoUrSyuW7fq\n2yeuLyYmptQ57piYGIfWExAAQ4YZadBtF0s2rmfNkc1kX1VDMhq88DrdG+2Bu2jfJoqenb0J8bxt\n2C4jc9xCiHKZTGov7w8/qMVI1/LxgZ49VcBu395zzoGuzpx5Bna+KZ/df+xmc+pmNqVuIjuvaN9f\nPU1LODGAS3vuwMdkvTo8KgpGjVL7wasLWZwmhHCoy5fVUOfKlaVv+wkPV/Oa/fu7/nhI4VrZ+mx2\nZuxkc+pmktKTyDXmFr7WuE5j+jXtR98mfWlUpxGgplf+9z+1mPHaP/u33aYCeIT7HJvtNBK4hRAO\nkZ4OK1aobT7XbvHx8lJ7rQcNUsdASu+6ejKZTRw6f4id6TtJykjiyPkjWCj6+90yuCU9G/WkV0Qv\nmgU1K/PAj7Q0+PJLtce/+J9/rRbuuAP+/vcbe8rFZYF79erVTJ48GZPJxGOPPca0adNKXPPMM8+w\natUqatSowaeffkqXLl1KNkQCtxAuY7GoFKTLl6t84dd+FOvUUb3ru+++sf+QitKZzCaOZh1lz5k9\n/H72d/ae3ctVQ9EiB51WR4fQDvRs1JOejXoSGhBaqfunpKhV51u3Wpf7+sKwYXD//Tfm4TEuCdwm\nk4lWrVqxdu1awsLC6N69O1988QVt2rQpvObHH39kwYIF/Pjjj+zYsYNnn32W7du3O+wfQAhhO7MZ\ntm+Hr79WRz5eq3lzlUCjd2/nHOso3NOlvEscOneIA+cOcPDcQQ6dP2QVqAHCa4cT1TCKqLAoOtXv\nhJ+3/avSjx+Hzz5TB50UV7s2PPww3HnnjbX33yX7uJOSkmjRogVNmjQBYMSIEaxYscIqcH/33Xc8\n8sgjAPTo0YOLFy9y9uxZQkMr941MCFGS2WJGb9STa8gl15hb+DPflF/4MJgMGMwGzBYzJrMJk8VE\nvtHEgf1q0Vlm1l83CwKNxQsNWiJbarn1Fi0tmulA6832P3R4a73x8fJBp9Xh6+2Lr5cvPl4++Hr7\n4u/tj6+3L95a2ajiaS7qL3Is6xjJmcmFP9Mvp5e4LqxWGJ3rd6Zz/c50Cu3klK1bzZvDjBmwZw98\n8onKEQBw6RIsXAirVsH48SrTXnVm16csPT2dRo0aFT4PDw9nx44d173m9OnTEriFKIXZYuai/iLn\nr57n/NXzZF7N5KL+YtEj7yJX8q9wOe8yV/KvkGPIwWwxV/z+ZsjKgvPnwGAAvIC//v5qtCoNab16\nkOELX/8B/FG59ntrvfHz9qOGrgb+3v7qp079rKmrSU1dTfW7j/q9+M8An4DCh6+Xb5nzoqLyLBYL\nmbmZpF9K51T2KVIuphQ+LugvlLjex8uHVnVb0S6kHW1D2tI2pC11a1TdHEnnzvDWWyon+mefFS2O\nPHECYmPVCNCjj6r/V6sjuwJ3RT9Y1w4FlPW+uLi4wt+jo6OJjo62tWlCuCWLxUJ2XjZp2WmkX07n\nzJUzVo/zV88Xpn2sKH9vf/x1/oU//bz98PXyReelw8fLBx+tDxazN0ePeHNgnxZLrhd1LVo0qM+h\njw+0aw8dOljw9TNjtpiteucFPXaD2YDBZLDqzeeZ8tAb9YUPo9nIlfwrXMm/Yte/J2+td2EQr+VT\nyyqoX1tWy7cWNXXWgf9GTpNZGrPFzKW8S5zLOcfZnLOcvXJW/cw5S/qldNIvp6M3lp4Zzd/bnxbB\nLWgZ3JKWdVvSMrgljQMbu3z0RKuF6Gi1yvybb9Qq9ILFkps2wc6davHakCGek+c+MTGRxMREu+9j\n13+ZsLAw0oqdIJCWlkZ4eHi515w+fZqwsLBS71c8cAvhyQp6OCcvnOTEhROcvHiStEtppGanXjeo\n1fGtQ0jNEOr616Wuf10C/QKtHrV9a1sFLC9t2X+1rl5V+6+XL1fbuxoUey0oCIYOVYvOajog+YXF\nYsFgNhQO3V81XOWq4Sq5RvV7Tn6O+mnIKfy9YNQgx5BTGPCv5F8h35RfOMpgCx8vn8IgXqKX/9fz\n4iMBBV98/Lz9rL78+Hn74evtW2XpNy0WC0azkVxjLjn5OYX/rnIMOVzOu0x2XjbZ+myy87K5qL9I\nVm4W56+eJys367pf+Or41iGsdhiNajeiSWATmgY2pUlgE0Jqhrh1elEfHxgxQm07/OQTFbQB9Hr4\nz39UMqCJE6FVK9e2syKu7ZDOmDHDpvvYtTjNaDTSqlUr1q1bR8OGDYmKiip3cdr27duZPHmyLE4T\nNxSLxcIfV/4gOTOZ5MxkjmQe4VjWMS7lXSr1+pq6mjSq04iwWmE0CGhA/YD6NKilfobUCHFIbzE3\nVwXsb79VAbu4kBD4299UwhR3XXCWb8q3CuTFpwesyvJLll3Jv1LpUYvr8dZ6F45i6LRqJEPnpeb9\nvTReeGm9Cn9q0BSOKmrQYMGC2WLGYrEUjmYYzcbCEQyDWY1i6I168ox5Nre9lk8t6tWoR2hAKKE1\n/3oEhBJWK4yw2mEE+NwYm+3374f331fHixbQaNQX0EceccyX0Krisu1gq1atKtwONm7cOF588UUW\nL14MwIQJEwCYNGkSq1evpmbNmnzyySfcfPPNDvsHEKKq5RnzOHz+MPv/3M/+c/s5eO5gqUG6lk8t\nmgU1o2lgU5oFNSOiTgQRdSII9At02vytXq8SpnzzjVrQU1z9+vDAA6rnciMf9GGxWMgz5anefL7q\nyRf09At6/jmGHKtRgavGq4UjBXqjnlxjLnnGPPJMeeQZ86z2KDtbwTqBgtGCgpGCAJ8AAv0CqeNb\nhzp+dajjW4cg/yDq+tcl2D8YX2/fKmujqxmNKtfAF19Y5xqoW1f1vrt3d13bKkMSsAjhJPmmfA6e\nO8iuP3ax+8xuDp8/jNFstLom0C+Q1vVaExkcSat6rWgZ3JJ6NepV2QIrgwF++gmWLYML16w1ql8f\nYmLUfOGNHLCdpWAKIM+YZ9VLNpgMGM1GTBYTJrMJo9moetZYsFgshcFegwatRotGo35qNVp0WtVb\nL+i1+3j5yMp8G5w9C4sXq/nu4vr2hccfh1q1XNOuipLALYSDWCwW0i6lseP0Dnak72Dfn/vIN+UX\nvq7VaGkW1Iz2Ie1pf1N72t3UjtCaoS5ZBW0yqeM0/+//4M8/rV8LDVUBu29fCdjixmWxqNSpixer\n40MLBAbCk0+qxW3uSgK3EHYwmAzsObOHrWlb2ZG+gz+uWO+Dah7UnC71u3Bzg5vpGNqRmj6unUiz\nWFSGsyVLVNrI4urWVYt57rhDAraoPi5dgg8/VF9ki+vXT+39dse5bwncQlSS3qhnZ/pONqVuYtvp\nbVarvev41iEqLIoeYT24ucHNBPkHlXOnqnXokFpde+iQdXnt2jB8uEpL6q6LzoRwtqQkeO89yMws\nKgsJgX/8Q+XXdycSuIWoAKPZyG8Zv7H2xFo2p2222tvaNLApvSJ6cWv4rbSq18rttsicPq162Ndu\nyqhRA+67T23t8vd3TdtuRM48+lI4V04OfPCBOiinuGHDVOpUd/liK4FbiDJYLBYOnz/Mz8d/5peU\nX6zOB25drzW3R9xOr4hehUcOupvsbLV6dvVqNaddwNtbndI1fLg6BEQ4TlJSEvHx8RgMhsIynU5H\nbGysBG8Psnmz6n0X3xLZtClMmwZlpBOpUhK4hbhGtj6bNSfW8OPRHzl58WRheeM6jbmj2R30b9qf\nBrUalHMH18rPh++/VyvFr1qf70CfPvDQQ2rFuHC8KVOmkFzKqSuRkZHMmzfPBS0StsrKgvnzrQ8u\n8fVVC9f69XPt0bQuOWRECHdjsVjYe3YvK46sYHPqZgxm1WMK9AvkzmZ3ckezO2gR3MKt82AXrJL9\n5JOSK8U7dIBx49RhDMJ59PrS04OWVS7cV3AwxMWp/Ab/+Y/aOpmXB2+/Dbt3w1NPed6RoRK4xQ1B\nb9Sz7sQ6lh9ZzrGsY4DaP9sjrAf3tLyHW8Jv8Yj81SdOQFxcEps3J2A269Fq/WjYMIYOHaIYO1Yl\nlnDj7xw3DD+/0o+oLKtcuDeNBgYPVqeKvfGGWi8CsGEDHD2qDi5p2tS1bawMGSoXHi3zaiZfH/qa\nH5J/4HK+msgK8gticORg7ml5D6EBnnEK3cWLsHQpLFuWxLFj8Zj/GinQ6SAiQsfcubHcdpvMrVYV\nmeO+cen1auHamjVFZT4+qufdv3/VtkXmuEW1kpadRsKBBH4+/nPhcHibem24r/V9RDeJ9ojeNajU\njStXqgQqV6/CgQNTyMlJRqNRCVTCwtTJRzK3WvVkVfmNbeNGWLBA5fUvcOedMGFC1a06l8AtqoXk\nzGSW7l3KltQtWLCgQUPvxr2JaRdD25C2rm5epezdq7I9paYWle3bNxE/v1QaNYLio7IREREsXLiw\n6hspxA3s9Gl4/XXrz2Dz5vDii+qLs7PJ4jRxQzuaeZQlvy9hS9oWAHRaHQObD2R4u+Fuu42rLOfP\nw0cfqQVoxYWHQ2Cgn1XaxgIytypsJSMHZQsPh7lzYeFCNd8NcPw4PPec2jLWsaNr21cW6XELt3Y8\n6zif7PmkMGD7evkytNVQhrcbTt0adV3cusopONHoyy/VPFsBf38YORLuvRd27ZK5VeE4MldfMRYL\nrFqlUqYa/zo/yMtL7eAYPNh5C0JlqFzcUM5cOcPHuz5m7cm1QFHAHtF+hFulHy1NaT0cf/8oFi0q\nmVe8Xz9misZnAAAgAElEQVR1hnBwcPnvlz+ywhayH71yDh+GWbOsT9i74w6159sZ894SuMUNIVuf\nzed7P2fFkRUYzAZ0Wh1DWw1lZIeRBPsHX/8GLnZtD8dggIwMHbVrxxIUVBR8GzdWfwzatXNVS0V1\nMHHiRFKLT+D+RdZMlC0zUwXv4t93WrWCf/5TnTjmSDLHLTyawWTg28Pf8tnvn5FjyEGDhgHNBvBo\nl0epH+A56cESEhIKg/a5c6qHbTQauHIlgaCgKPz94e9/V8NvcnKXcDbZj155deuqBWuLFsFaNeDH\nkSNq3vvll6FJE5c2D5DALdxAUnoSC3cuJDVb9Qy6N+zO+K7jaRHcwsUtqzy9Xk9uLqSkWOdHNpv1\n9O6t5szqetbUvPBgMTExpc5xx8TEuLBV7s/HB555RiVl+fhjMJvVF/Fp02DqVOja1bXtk6Fy4TIZ\nlzNYuHMhW9O2AhBeO5xJ3SfRI7yHi1tmm/x8GDp0Crt3J1P8f2U/P7j99kiWLpU5RVH1ZM2EfX79\nFebMKTovQKuFxx9Xo2b2kjlu4TEMJgNf7v+Sz/d9Tr4pnxq6GozuOJr729zvMYlTrrV3r9pScuBA\nEsePq8xnWi00aKAyn02fLqt4hfBUKSnw6quq111gyBA1gqa14/RfCdzCI+w7u4952+ZxKvsUAHc2\nu5MJ3SZ4xMKz0ly+rA4uKJgLA7hwIYm8vATattVTr570cIS4EVy4ADNnqvnuAr16wT/+YfuKcwnc\nwq1dyb/C+7++z8qjKwE1LP7cLc/RpUGXSt3HnYb9tmyB99/HKmFKzZowZoxKnWjPN3EhhPvJz4c3\n37ROntS+Pbz0EgQEVP5+EriF29pxegdzt83l/NXzeGu9GdVhFH/v8Hd8vCr3NdVdkklkZalUpVu3\nWpf37Anjx1vvyRZC3FjMZpX58Pvvi8oiItTRoSEhlbuXBG7hdnLyc3hv53v8eOxHANqGtGXqbVNp\nHNjYpvu5OpmExQLr16sP7ZUrReV166o92T08c02dEKKSLBZYvlxNkxWoW1fNg0dEVPw+so9buJVf\nM37ljS1vcO7qOXy8fHi086M82O5BtBrbx4/1xfOEVqDckc6fVycJ/fabdfnAgTB2rBoiF0JUDxoN\n3HefGl17+22VJjUzU53rHRcHkZHOrV8Ct3Aog8nAB799wP8O/Q9QR21O6znN5l52ca5IJmGxqIVn\nH31UtB0EoH59ePpp9z2EQAjhfH36qGxqM2eq40EvX1bz3f/8J3Tq5Lx6ZahcOEzKxRRmbprJsaxj\neGm8GNN5DCPbj8RL6+WQ+1f1HPe5c/Duu7B7d1GZRqMOA3n4YetjN4UQ1dfRo6qnfemSeq7TwQsv\nwK23lv8+meMWLmOxWPg++XsW7lxIvimfsFphvNT7JdqEtHF4XVWxqrysXnbDhjB5MrRx/D+WEMLD\npaaqlKiZmeq5Vquyr/XvX/Z7JHALl8jJz+GNrW+w8dRGAAY2H8gzPZ6hhq6Gi1tmm6ws1cv+9dei\nMo0Ghg2DUaPA19d1bRNCuLc//4R//QsyMtRzjQaeegruuqv06yVwiyp3POs4cRviOH3pNDV0NZhy\n6xT6Ne3n6mbZxGKBDRvUNq/iK8ally2EqIyLF1XP++TJorIJE0pPkSqBW1SpVUdX8faOt8k35dM8\nqDlx0XGE1w53dbNscukSvPeedVIFUCkNR4+WXrYQonIuX4ZXXlFz3wUefVStRC9OAreoEvmmfOZv\nn1+4N3tQi0E80+MZfL09M7rt3KmGxi9cKCqrXx+efVZlRBJCCFvk5KgFa4cPF5U99BAUP5hNArdw\nuvNXz/NK4iscPHcQHy8fJveYzN0t73Z1s2ySm6sWn/38s3X5wIHq4AB/f9e0Swhx48jNhddeg337\nispGjYIRI9TvEriFUx06d4h//fIvMnMzCa0Zymt9X6Nl3ZaubpZNDh+GefPgzJmisqAgtQK0WzfX\ntUsIcePJy1P7vItvK334YRg+3Pa4Z3Maq6ysLAYMGEBkZCR33nknF4uftFDMo48+SmhoKB06dLC1\nKuFiq4+t5tnVz5KZm0mn0E68P/h9jwzaRiP8978wbZp10O7ZU2VFk6AthHA0X1+VkKVLsfOUli6F\n//3P9nva3OOeOnUq9erVY+rUqcyePZsLFy4QHx9f4rpNmzYREBDA6NGj2Vd8vODahkiP2+2YLWY+\n/O1DvjzwJQDDWg1jYtREvLWel3AvPV2d6lM81XnNmvDEEyr7kUbjurYJIW58+fkql/nvvxeV/fBD\nFQ+Vt27dmg0bNhAaGsqZM2eIjo7mcPFZ+GJSUlK49957JXB7kDxjHrM2z2LjqY14abyYfMtkBkeW\nsp/BzVksah77ww/VkFWBDh3UObqVPc1HCCFslZengvfeveq5rYHb5q7T2bNnCQ0NBSA0NJSzZ8/a\neqtCcXFxhb9HR0cTHR1t9z1F5V3IvcA/f/knB88dJMAngBnRM7i5wc2ublalXbqkVoxv315U5u2t\n5peGDZPzsoUQVWvbtkQ0mkQuXlTJWmxVbuAeMGAAZ4pPBv5l5syZVs81Gg0aB4w1Fg/cwjVOXTxF\n7LpYzlw5Q/2A+rze/3WaBDZxdbMqbc8eeOstlQmtQKNG8Pzz0KyZ69olhKi+Cjqker3aKjZ79gyb\n7lNu4F6zZk2ZrxUMkdevX58//viDm266yaYGCPex/8/9TF83ncv5l2ldrzWz+s0iyD/I1c2qFKNR\nLfz45hvr8nvuUQkQfHxc0y4hhCjg56cStMyebdv7bR4sHDJkCEuWLAFgyZIlDBs2zNZbCTew/fR2\nnv/5eS7nX6Zno568NfAtjwvaGRnqRJ7iQbtOHZV+8IknJGgLIdyHPbkibF6clpWVxfDhw0lNTaVJ\nkyYsW7aMwMBAMjIyePzxx1m5ciUAI0eOZMOGDWRmZnLTTTfx6quvMnbs2JINkcVpLvPz8Z95Y8sb\nmCwmBrUYxHO3PuewozirgsUCv/wCixaBXl9U3rWryoAW5FnfP4QQ1YQkYBE2WXZgGYt+XQTAqA6j\nGNdlnEPWK1SVq1dVwE5MLCrz9oYxY9S52bIATQjhrmyNe563IVc4hMVi4T+7/8Pn+z4HYGL3iTzQ\n9gEXt6pyjh6FOXPgjz+KysLCYOpUWYAmhLhxSeCuhiwWC4t+XcRXB7/CS+PFtJ7TGNB8gKubVWEW\nC3z3HXz6qVqMVmDAAHj8cckzLoS4sUngrmbMFjPv7HiHFUdW4K315uXbX6Z3496ublaFXboEb7+t\nTvUqUKMGTJwIt9/uunYJIURVkcBdjZgtZuZuncuqY6vw8fLh1ehX6RHew9XNqrADB9TQeGZmUVnL\nlmoleYMGrmuXEEJUJQnc1YTJbCJ+czxrT67Fz9uPmf1mekw2NLNZJeT/73/V7wXuuw9Gj1aL0YQQ\norqQP3nVgNliZvaW2aw9uRZ/b3/i74inY2hHVzerQi5eVIeDFD8Sr3ZtmDwZund3XbuEEMJVJHDf\n4MwWM3O2zGHNiTX4e/vzxoA3aH9Te1c3q0L271dD48XTlrZtq4bG69VzXbuEEMKVJHDfwMwWM29t\ne4vVx1fj5+3H6/1f94igXdbQ+IMPwqhR4OU5uWGEEMLhJHDfoCwWC+/seIcfjv6Aj5cPs/rNolP9\nTq5ulpWkpCQSEhLQ6/X4+fkRExND69ZRvPkm/PZb0XW1a8Nzz6lMaEIIUd1J5rQbkMVi4f1f32fZ\nwWX4ePkws99MujXs5upmWUlKSiI+Ph6DwVBYptfr8PGJRauNKixr21YlVKlb1xWtFEII55HMaaLQ\nf/f9l2UHl+Gt9ebV6FfdLmgDJCQkWAXtM2cgLc1AjRoJtGunAvcDD8BDD8nQuBBCFCeB+waz4vAK\nPt79MRo0vNT7Jbfdp63/6zQQkwlOnixagGY266lVC/7xD1k1LoQQpZHAfQNZd2Id83fMB+C5W58j\nukm0axtUDj8/P65ehWPHrE/0qlfPj7ffBjneXQghSidnJ90gtqVt4/XNr2PBwoSuExgcOdjVTSpX\ns2YxHD6sswraDRvqeOedGAnaQghRDlmcdgM4eO4gz/30HHmmPEa2H8n4ruNd3aQy5efDBx/ATz/B\nhQtJZGQkoNXq6dbNj+eeiyEqKur6NxFCiBuAnMddTaVlp/H0qqfJzstmUItBPH/b8257nvbZs/D6\n63D8eFFZRAS8+CKEh9t379K2lsmXACGEO5PAXQ1dyL3ApFWTyLicQY+wHvy737/x1rrnsoXffoO5\nc+HKlaKyPn3UqV72HsNZ2tYynU5HbGysBG8hhNuS7WB28rQem96oZ/r66WRczqBV3Va80ucVtwza\nZjMkJMAXX6hztEEdCjJuHNxzDzhicODarWUABoOBhIQEt/5vKIQQtnC/v/QuUFqPLT4+3m17bCaz\niRkbZnD4/GEaBDTg9f6v46+zs9vqBFeuwLx58OuvRWV160JsLLRu7bh69MVXuFWgXAghPJkEbjyv\nx7YgaQHbT2+ntm9tZt8xmyD/IFc3qYQTJ9R89pkzRWUdO6oDQgIDHVuXn59fpcqFEMJerhylle1g\neFaP7dtD37L8yHJ0Wh0z+82kUZ1Grm5SCb/8otKUFg/af/sbvPqq44M2QExMDDqdzqpMp9MRExPj\n+MqEENVewShtcnIyqampJCcnEx8fT1JSUpXULz1uPKfHlpSexIKdCwCY2nOq2530ZTTCf/4D339f\nVObvr87Ovu0259UbFRVFbGysR61REEJ4LleP0krgRvXYSluV7E49tpSLKby64VXMFjMPd3yYO5rd\n4eomWblwAWbPhgMHisrCw+Gll+zf6lURUVFREqiFEFXC1aO0Erhx/x7bRf1Fpq+bTo4hhz6N+zCm\n8xhXN8nKkSNqPjszs6jstttUT9verV5CCOFuXD1KK/u43ZzBZOD5Nc+z9+xeWtVtxdt3vY2ft/sM\n4a9eDYsXq2FyUNu7Ro9Wc9pumgdGCCHs4qjcEZKAxUlcvb/77e1vs+LICkJqhPDePe9Rr0a9Kqu7\nPAaDSl26enVRWa1aatV4ly6ua5cQQlQFR8QGCdxO4OqMXD8e/ZE5W+fg4+XD/Lvm07qeAzc/2yEr\nSw2NHz5cVNa0qZrPDg11XbuEEMKT2Br3ZDtYOcpbOehsB88d5O3tbwPwj1v+4TZB+/BhdVZ28aDd\npw/MmSNBWwghqoIsTiuHM1YOVmR4JSs3i1cSX8FgNnBf6/u4q8VdNtfnSD//DIsWFc1na7UwdiwM\nHSrz2UIIUVUkcJfD0SsHK5Ja1WAyEJcYx/mr5+kY2pGnuj9lU11l1W/LnIzRCB99BCtXFpXVrg3T\npqlsaEIIIaqODJWXw9EZuSoy9P7ezvfY9+c+QmqEENcnzmEHh9ia6efiRfjnP62DdtOm8OabErSF\nEMIVpMddDkfv777e0Pv6k+sL05nOiJ7h0BzktmT6OX4cZs6Ec+eKynr3hmeeATdLKifcRHBwMBcu\nXHB1M4RwqaCgILKyspx2f7sCd1ZWFjExMZw6dYomTZqwbNkyAq9JRp2Wlsbo0aP5888/0Wg0jB8/\nnmeeecauRlclR2bkKm/oPTU7lblb5wIwsftE2oS0cUidBSo7X79xI8yfD/n56rlGA488AvffL/PZ\nomwXLlxwu90hQlQ1jZP/SNo1VB4fH8+AAQNITk6mf//+xMfHl7hGp9Px1ltvceDAAbZv387ChQs5\ndOiQPdV6rLKG3oc9MIy4xDhyjbn0a9KPIa2GOLzuis7Xm82wZIlaJV4QtGvWhFdekaQqQgjhDuwK\n3N999x2PPPIIAI888gjLly8vcU39+vXp3LkzAAEBAbRp04aMjAx7qvVYBUPvkZGRREREEBkZybRp\n09hi2sLJiyeJqBPBlNumOOXbWkXm63Ny4LXX4H//K7omPFydqd21q8ObJIQQwgZ2JWAJCgoqnM+y\nWCzXnd9KSUmhT58+HDhwgICAAOuGuGEClqqwMnklc7fNxc/bj0X3LKJJYBOn1VXeqvL0dPj3v+H0\n6aLru3eHKVNUj1uIiqiun2Mhiqvo58DWz8t157gHDBjAmeIHK/9l5syZJRpQXk/xypUrPPDAA8yf\nP79E0C4QFxdX+Ht0dDTR0dHXa55HO3HhBO8kvQOoJCvODNpQ9nz9rl3wxhuqx13gwQfhoYfUXm0h\nhBD2S0xMJDEx0e772NXjbt26NYmJidSvX58//viDvn37crh4Sq2/GAwGBg8ezN13383kyZNLb0g1\n+6auN+p54ocnOJV9ikEtBvFCzxeqvA0WC6xYAZ98oua2AXx84Nln4fbbq7w54gZQ3T7HQpTG2T1u\nu/pTQ4YMYcmSJQAsWbKEYcOGlbjGYrEwbtw42rZtW2bQro4WJi3kVPYpGtdpzNM9nq7y+vPz1arx\njz8uCtr16qkztSVoCyGE+7Krx52VlcXw4cNJTU212g6WkZHB448/zsqVK9m8eTO33347HTt2LBxK\nf/3117nrLus0ntXpm3piSiIzNszAx8uH9wa9R/Pg5lVa/4ULMGuWdb7x1q1h+nQIctzWcVENVafP\nsRBlcXaPW04Hq2Jnrpzh8e8f50r+FZ7t8SzDWpccpXCm48fVIrTz54vK7rgDnnoKrll0LkSlVZfP\nsRDlcfniNOE4RrORf2/8N1fyr9CzUU+GthpapfVv3gxvvw15eeq5VguPPgpDhlTf/dmuPm9dCHdh\nMpnw8vKq9PuMRiPe3hJKqpKsGa5CS39fyoFzBwipEcLUnlOdnl2ngNkM//d/av66IGjXrAkvv1y9\nT/ayNX+7EDeab775hqVLl9r03lmzZrF161YHt0iURwJ3FTnw5wE+3/c5GjS81PslavvWrpJ68/JU\nFrQvvigqa9hQkqqAa89bF6IqHTt2jMGDBzNt2jSefPJJq+HZDRs2sHHjRsaMGWPTvadPn87MmTOr\nbUZMV5DAXQVyDbm8vvl1zBYzI9qPoFP9TlVS7/nz6ujNzZuLyjp3VkE7LKxKmuDWnHHeuhDuJj8/\nn4EDB/LAAw9w5swZPv74Yy5dugTApUuXmDp1aqnpqivK29ubRYsWMXr0aIxGo6OaLcohgbsKLPp1\nEemX02ke1JyxncdWSZ3JyfDcc2oxWoHBgyEuDsrIf1PtOPq8dSHc0U8//cTJkyfp06cPkyZNYtWq\nVdSpUwdQw9yjRo2y+//5iIgI2rdvz6effuqAFovrkcDtZNvStvF98vfotDqm956Ozsv5S7c3boTY\nWLXtC8DLS60anzBB/S4UR5+3LoQ7SkxMJCQkhKZNm9K9e3f69+8PQE5ODh9++CEPP/ywQ+p5+umn\nmT17tkPuJconSwGd6KL+InO2zgHg8Zsfp1lQM6fWZzaruewvvywqCwiAF1+Ejh2dWrVHcvR560K4\no6SkJLp3716ifOXKlTRt2pQgByVv6Ny5M5mZmezevZsuXbo45J6idBK4ncRisTBv2zwu6C/QpX4X\n/tb2b06tLy8P3noLtmwpKgsPVyvHGzRwatUezZHnrQtRICUlhTfffJMTJ04watQoRo4cWfjawoUL\nWb58OWvWrHFqG8aMGcPZs2fZsmULrVu35u6776Zp06a89957AKxZs4bbbrut1Pf+9ttvLF26FC8v\nL1JSUvjoo49YvHgxFy9eJD09nRkzZtCsmXVHRKvV0qtXL3766ScJ3E4mgdtJ1pxYw+bUzdTU1WRa\nz2loNc6blcjMVElVjh0rKuvSRS1Mk5O9hLu7917X1f39986575w5c5g/fz4LFy4kPj7eKnB/9tln\nNG9eMlviuHHj2LVrV6XqmT9/PreXkaP4008/5eTJkzRv3pxZs2aVSEm9Z88exo8fX+J9J06c4JNP\nPmHBggWA+gJwyy23sGTJEsxmM7179+bmm2/mH//4R4n3RkZG8vvvv1fqn0FUngRuJ8i8msm7Se8C\nMClqEqEBoU6r69gxFbQzM4vK7r0Xxo2T+WwhXGHLli307t0bb29vVq9eTatWrQpfy8nJYffu3Tz6\n6KMl3vfxxx87vC27d+8G1DD2tVJSUggMDCxRPm/ePN54443C5zk5OQQHB3PLLbdw+vRppkyZUubW\nsaCgIDYX38YinEICt4NZLBbe3P4mV/KvcEv4LQxsPtBpdW3ZoobHC5KqeHmpBWh33+20KoUQ19Gi\nRQu6d+9Oeno6a9as4euvvy58bevWrRiNxjJ7yY62Z88e6tSpQ5MmTUq8lp2dXWrgfuGFF6hZbKhu\n27ZtjB2rdsOEh4dbBfVr1a1bl+zsbPsbLsolgdvB1pxYw9a0rQT4BDDl1ilOyY5mscBXX0HxREcB\nAWoleaeq2SIuhMM4a7jaVUJD1QjbsmXLqFWrFoMGDSp8bdOmTYSEhNCmTZsqacuePXtK7W2DypNt\nLjgasJjiQf7IkSNkZGTQt2/fCtVnNpslV30VkMDtQMWHyCd2n0i9GvUcXkd+PixYAL/8UlTWsKFa\nhCZJVYRwHz/99BN9+/a12nK4ceNGevfuXer148ePLxzarqg333yzzPsB/P7779x///2lvhYYGEhW\nVla591+/fj0+Pj5Wi9hOnDhRYmFagaysrFJ78cKxJHA7SFUMkV+8qI7jLJ5ZsGNH1dOuVcvh1Qkh\n7JCamsrQoUUHCeXl5RXmxy/NBx984ND6s7KySEtLo1MZw3BNmzYls/jiGCA3N5dXXnmF0aNH0759\ne9asWUOnTp0KE7SYzWbmzJnDokWLyqyzrKAuHEcCt4OsPbHWqUPkqanw6qtw9mxR2cCB8MQTIAfz\nCOF+GjdubBUYY2Nj0ev19OnTp0rqL+i9lxW4e/XqxcGDB63KfvzxR+bOnUvXrl3x9vbm2LFjVj3o\nmTNnlpvT/ODBgwwYMMD+xotyyXncDnBRf5Exy8eQnZfN1NumcndLx64O27VLnex19ap6rtGoVePV\n+ThO4Z48+XPsaEeOHOGxxx6jc+fO1KhRg61bt3LgwIHrDk87ypw5c3j99dc5f/48Wm3J7ahr165l\n8uTJ7N+/v7AsMzOTF154gXr16qHVann55Zd56qmn8PPzw8fHh6FDhxZmXruW0WgkODiYzZs307Ga\nZ3xy9nncErgdYObGmaw9uZabG9zM3AFzHdrbXrkSPvwQTCb13M8PXngBJGeIcEee/Dl2JovFQoMG\nDbjrrruqLJ/3yJEjMRqNfPXVV6W+npeXR1hYGHv37qVhw4Z217d161bGjx9v9UWgunJ24JZc5Xba\ncXoHa0+uxdfL16FD5CYTfPABvP9+UdAOCYE33pCgLYS7GzlypNUQ9fLly7lw4QIvvviiU+udPXs2\nd955JwA7d+7kgQceKPNaX19fJk2axPz58x1S91tvvcWUKVMcci9RPgncdsg15PL2jrcBGNN5DA1r\n2f+tFdSQ+L//bb1NJjJSHcfZtKlDqhBCONG6deuIjo4GICMjg+eff55PP/3UKhmLM3z++ef4+vqy\nd+9efHx8yg3cAFOnTmXVqlVcKDiRyEZHjhwhNTXV5jO9ReXIULkd3tv5Hl8d/IoWwS14/5738dLa\nn6rszz/VIrRTp4rKeveGyZPBx8fu2wvhVJ74OXaGb775hp07d2I0Gjlz5gzPPPNMqQd9ONqSJUvY\nunUr2dnZxMXF0bp16+u+Z+fOncyePZuvvvrKphFDvV7PkCFDWLRoUampXKsjmeN2U4fPH2bijxMB\nWHTPIiLrRtp9zyNHVE/74sWispgY+PvfoZS1JUK4HU/7HAtlzZo1HDp0iGeeeabS73355ZcZMmQI\n3bp1c0LLPJMEbjdkNBt5cuWTHMs6xvC2w3my+5N233PzZpW+ND9fPff2hqefhn797L61EFXGkz7H\nQjiLswO37AC2wbeHvuVY1jHqB9RnbJexdt2rtPSltWrB9OnQvr2dDRVCCHHDkcBdSedyzvHJnk8A\neLbHs/h5+9l8L4NBpS9dv76oLCwMXnlFztAWQghROgnclbRw50Jyjbn0jujNLeG32Hyfy5dV+tLi\nWx47doQXX1QHhgghhBClkcBdCUnpSWw4tQF/b38mRU2y+T7p6WrleEZGUdmdd8KTT0r6UiGEEOWT\nMFFBecY85u9QiQpGdxrNTTVvsuk++/ernvbly0VlY8bA/fdL+lIhhBDXJ4G7gr7Y/wUZlzNoGtiU\nB9qWn9SgLOvXw7vvgtGonvv4wJQpUOzEPCGEEKJcErgr4PSl0/zfvv8DYPItk/HWVu5fm8UC//0v\nJCQUlQUFwT//qTKiCSGEEBUlgfs6LBYL7ya9i8Fs4K7md9ExtHKn3uTnw/z5sHFjUVnjxmrleEiI\ngxsrhBDihieB+zq2nd5GUnoSAT4BjO86vlLvzc5WmdAOHy4q69oVpk6FGjUc3FAhhBDVggTucuSb\n8lm4cyEAYzqNIcg/qMLvPX0aZsyAM2eKygYNgvHjwcv+lOZCCCGqKQnc5fjqwFeFC9KGth5a4fft\n3Quvvw5XrqjnGg2MGwdDhsjKcSGEEPax+eiKrKwsBgwYQGRkJHfeeScXi5+M8Re9Xk+PHj3o3Lkz\nbdu2dfpZtI50Luccn+/7HIBJUZMqvCBt7Vp4+eWioO3rCy+9BEOHStAWQghhP5sDd3x8PAMGDCA5\nOZn+/fsTHx9f4ho/Pz9++eUX9uzZw969e/nll1/YvHmzXQ2uKot/W4zeqOf2xrdzc4Obr3u92azy\njc+fDyaTKgsOhvh46NHDyY0VQrg9U8EfBgcwFuwpFdWSzYH7u+++45FHHgHgkUceYfny5aVeV+Ov\nVVj5+fmYTCaCg4NtrbLK7D27l3Un1+Hj5cOT3a5/8ld+PsydC8uWFZU1bQrz5kGLFk5sqBDCI3zz\nzTcsLX6SkJ1mzZrF1q1bHXY/4VlsDtxnz54lNDQUgNDQUM6ePVvqdWazmc6dOxMaGkrfvn1p27at\nrVVWCbPFzLtJ7wLw9/Z/p35A/XKvz85WQ+GbNhWVdesGs2dDvXrObKkQwhNs2LCBjRs3MmbMGIfd\ncwn3EZ4AACAASURBVPr06cycOZNDhw457J7Cc5Q7cTtgwADOFF8W/ZeZM2daPddoNGjKmMDVarXs\n2bOH7OxsBg4cSGJiItHR0aVeGxcXV/h7dHR0mdc506qjqziWdYzQmqHEtI8p99rSVo7fcw88/ris\nHBdCwKVLl5g6dSobNmxw6H29vb1ZtGgRf/vb39i2bRvecsiBR0hMTCQxMdHu+2gsNp5637p1axIT\nE6lfvz5//PEHffv25XDxDculeO211/D39+f5558v2RAbDxR3pKuGqzz87cNk5Wbx8u0v07dp3zKv\nLW3l+GOPwb33yiI0UX25w+fYncTGxtKwYUOeeeYZp9x/7Nix9OzZk8cee8wp9xe2qejnwNbPi81D\n5UOGDGHJkiUALFmyhGHDhpW45vz584WrzXNzc1mzZg1dunSxtUqn+2LfF2TlZtE2pC3RTaLLvG7d\nOpX57NqV47LdSwhRICcnhw8//JCHH37YaXU8/fTTzJ4922n3F+7J5sAdGxvLmjVriIyMZP369cTG\nxgKQkZHBPffcU/h7v3796Ny5Mz169ODee++lf//+jmm5g529cpZlB9XqsondJ5Y69G+xwOefw9tv\nFx0UEhQkK8eFECWtXLmSpk2bEhRU8cRNldW5c2cyMzPZvXu30+oQ7sfmiZHg4GDWrl1borxhw4as\nXLkSgI4dO7Jr1y7bW1eOpKQkEhIS0Ov1+Pn5ERMTQ1RUlM33+3DXh+Sb8unXpB9tQ0ouoMvPh3fe\ngeJTVU2aqD3bknNcCNs4+nPsTvWtWbOG20o5+i8lJYU333yTEydOMGrUKEaOHFn42sKFC1m+fDlr\n1qypUB1arZZevXrx008/ufVopnAsm3vcrpSUlER8fDzJycmkpqaSnJxMfHw8SUlJNt3v4LmDhdu/\nSstHfukS/Otf1kG7a1e1clyCthC2cfTn2N3q27NnDx06dChRPmfOHN58800GDBhQIv/FZ599Rkgl\n/6hERkby+++/29VW4Vk8MnAnJCRgMBisygwGAwnFz82sIIvFwns73wPgwbYPEhoQavV6ejq88AIc\nPFhUdvfdKpDLQSFC2M6Rn2N3rC8lJYXAwECrsi1bttC7d2+8vb1ZvXo1rVq1KnwtJyeH3bt306dP\nn0rVExQUxMmTJx3SZuEZPHIPgV6vr1R5eTac2sCBcwcI8gtiZPuRVq/t3w+zZsHly+q5RgOPPirp\nS4VwBEd+jt2xvuzs7BKBu0WLFnTv3p309HTWrFnD119/Xfja1q1bMRqN3H777ZWqp27dumRnZzuk\nzcIzeGTg9vPzq1R5WQwmAx/u+hCAsZ3HUtOnZuFriYlqTrvgC7qvL0yZArfealOThRDXcNTn2F3r\n02g0mM1mq7KCpFXLli2jVq1aDBo0qPC1TZs2ERISQps2bSpVj9lsli141YxHDpXHxMSg0+msynQ6\nHTEx5SdMudb3yd+TcTmDiDoRDGqpPkAWC3z5pUpXWhC0g4LUnm0J2kI4jqM+x+5aX2BgIFlZWaW+\n9tNPP9G3b1+r9mzcuJHevXtbXbd7927atWtXbj1ZWVklevYVfW9FXb58mQceeIC0tDSH3E/YxyN7\n3FFRUcTGxtq1OjQnP4fPfv8MgPE3j8dL64XBAAsWwPr1Rdc1bqxWjt90k6P/KYSo3hzxOXbn+po2\nbUpmZmapr6WmpjJ0aNFRwXl5eYWL54pr164dq1atKreerKwsmjVrVqK8Iu+tiI8//pjTp0/zzTff\n8Oabb9p9P2E/jwzcoD6E9nzgEg4kkJ2XTfub2nNbo9u4fFnNZ+/fX3RNly4wbRrUrFn2fYQQtrP3\nc+zO9fXq1YuDxVe1FtO4cWOroB4bG4tery+xMM3Hx4eIiIhy6zl48CADBgwoUV6R91bEuHHjAJgx\nY4bd9xKOYXPKU0erylSJmVczeejbh9Ab9bx797vUNbVnxgy1grzAwIHwxBMgKYCFqDhJeVpk7dq1\nTJ48mf3FewN/OXLkCI899hidO3emRo0abN26lQMHDhQOrZvNZhYuXMjevXuZMGEC3bp1K7UOo9FI\ncHAwmzdvpmPHjtd974ULF5gzZ065/428vb155ZVXSuQ/12q1pKSkOOTLQHmysrL45JNP2Lx5My++\n+CJ79+7l8uXLpKenM3fuXKfW7SjOTnlaLcPSkt+XoDfq6RXRC6/M9jz/b7VXu8CYMXD//bJyXAhh\nu969e3PmzBkyMjJo2LCh1WutWrVi019HClosFho0aMCQIUMKX1+xYgUjRozgt99+49SpU2UG7qSk\nJCIiIgqD9vXeGxQUxKxZsxz5j+lw3377Lc8++ywfffQRJ06c4LHHHuPSpUuEhYV5TOB2No9cnGaP\ntOw0fjz6I1qNlo6Gx3nppaKg7eMDsbHwt79J0BZC2MfX15dJkyYxf/58q/KRI0fSqVOnwufLly/n\nwoULvPjii4Vld9xxB76+vqxbt47BgweXWcdbb73FlClTrMoq+l539eCDD3L+/HlycnIYMWIEAL/9\n9pvbHwldlapdj/uj3R9hMpsIzx3MZ+8WDfnUqaOSqhTLhyCEEHaZOnUqt9xyC7GxsYU5y9etW/f/\n7d1pWBRntgfwf7O4JSiiQBRQFIKoQKNBjRoixnSiDqIBo/gkEY1LFK8+Origc42TZCCtmGQccU1w\nATRAlOto1CgZRRO3VsElAUWCjMoWoBUEQWj63A/92Ip0Y9M0vcD5fbKq3qo6ZT3Vh7fqXZTDnObn\n52Pp0qXYtWtXvcFYrKyssGXLFrz33nuoq6uDTCZr8Or65s2buHPnToN5vhvbVyqVYv369Y2+njU3\nN8ff//53g00V2rlzZxw8eLDevBY//PADpk2bhvLycnTu3NkgcRkVMhL6CCXjzwwatdOP3P/xLr0z\nqZj8/Yn8/YnmzSMqLGzx0zPW6hnRT4rRkEgkFBQURHK5nIiI9u/fT+Hh4bR06VL68MMPSSKRqNxv\n5MiRdPHiRYqOjqba2tp626qqqkgkElF2dnaT99WWQCCg3NzceutSU1Pp8uXLyuUrV67Q6tWr65XZ\ns2cPJSQk1Fv3t7/9ja5du6b2OCEhIRQXF0dERHK5nLp3704FBQUUFRWlk2tpaZo+B9o+L23qVflW\nSQxu3wbaZQehnaw7AEAoBNavB+ztX7AzY4xpYciQIfjkk0+wceNGAEBgYCC+/PJLREVFIS4uDkOG\nDFG5n5eXFy5duoQBAwY0qP1GRkYiMjISLi4uTd63qfbu3YvQ0FAIBAKEh4dj06ZNym3bt29HRESE\ncjk7O7tBFzSJRIILFy7UW/fTTz/h1q1bjR7nSUt5gUCAN954A4cPH27Qz72tajOtyo9fT8fM7/8K\nWdXLGJyzFxZyK4hEQGgotxxnTFe4VXnbExsbi+nTpxvNcYwBtyrXgYwMwv/ExOCxOeAknQILuRWm\nTwcmT+ZGaIwxpi2ZTIaKigqjOU5b0eoT9y+/AKu3XYDU/ndY1HWBU0UQli0H+I0LY4w1T1JSEiZN\nmmQ0x2krWu2rciLghx+A2Dg5rvX+BI/aZ6N/RSi+XfI+3N11dhrG2DP4VTlj/KpcKzIZsGkT8PPP\ngNTqNB61z0YXS1vs+XQiejkYOjrGGGNMe60ucVdUKGbyunYNINThbredeOll4MvAj9DLoZ2hw2OM\nMcaapVUl7oIC4PPPgXv3FMvFnVPQ4ZU7GNKvJwI9xxk2OMYYY0wHWk3izswE/vHMmONyyGDpEwvH\nrsCMQSGwMGs1l8oYY6wNaxUDsJw+jXpjjltaAn6zUmBpU4Be1r3wdt+3DRsgY4wxpiMmnbiJgIQE\nICoKqK1VrOvSBfj8HzKk18UBAKZ7TYeZwKQvkzHGGFMy2ffHtbVAdDRw4sTTdU5OwKefAmkPj6Og\nogC9uvTC6D6jDRckY4wxpmMmmbgfPgQiI4Fn56cXCoGVK4H2HWWIO8O1bcYYY62TySXuvDxFy/H8\n/Kfr3nkHmD9fMeb44axjKKwo5No2Y4yxVsmkEvdvvwEREYq+2oBinPGQECAwUPHv2rpaxF+PB8C1\nbcYYY62TySTu//xH8U1bJlMst28P/PWvwIgRT8sc/+M4CisK0btLb65tM8YYa5WMPnHL5cCePUBS\n0tN1XbsCq1cDr776dF292raQa9uMMcZaJ6NO3I8fA998A5w583Sds7Oi5bitbf2yP+f8rKxt+zn7\n6TNMxhhjTG+MNnHfv68YCS0r6+k6Hx9g2TKgU6f6ZeUkx57rewAAH3p9yLVtxlibFx0dDTMzM4SG\nhho6FKZjRpnhcnOBsLD6SXvCBOB//7dh0gaAk7dPIu9hHhysHDDamb9tM8bats2bNyM9PR2XLl3C\ntm3bDB0O0zGjS9wXLwLLlwPFxYplMzNg3jxg7lzA3Lxh+Wdr29M8psHcTEUhxhhrI+Lj41FSUoKY\nmBjs2LED+fn5SEhIMHRYTIcEpOWs91KpFFOnTsV///tfODs7IykpCdbW1irL1tXVwcfHB46Ojjh0\n6JDqQAQCHDhA2LFD0SANUNSuly8HXntNfRy/3vkVq0+uhm0nW+wJ3ANLc0ttLocxpgMCgQBa/qQw\nHamqqkLHjh1fuI61HE2fA22fF61r3GKxGCKRCFlZWRgzZgzEYrHashs2bMCAAQMgEAgaPeZ33z1N\n2nZ2wLp1jSdtIkL8NUVL8mke0zhpM8baPFUJuq0n7bq6Oq32kz3pf2xktE7cBw8eREhICAAgJCQE\nBw4cUFnu3r17OHLkCGbPnq3xXxbu7sBXXwG9ezde7mL+RdwsvQmbjjYY/+r4JsXPGGOs9UtOTkZc\nXJxW+0ZGRuLs2bM6jqj5tE7cRUVFsLe3BwDY29ujqKhIZbklS5YgKioKZmaanWrUKMXoaGreuis9\nW9t+f8D7aG/RXvPgGWOsDcnOzoa/vz9WrFiB+fPnt5nPGadOncLp06cxY8YMrfZftWoVIiIikJmZ\nqdvAmqnR7mAikQiFhYUN1kdERNRbFggEKl+D//jjj7Czs8OgQYOQmpr6wmDat/87KioUE4j4+fnB\nz89PbdlrRddw/c/r6Ny+MwL6Bbzw2Iwx1hbV1NTg3XffxerVq3Hy5El8//33EIvF6NKli6FDa1Hl\n5eVYvnw5Tp06pfUxLCwssGXLFgQFBeHcuXOwsGheD+rU1FSNcuGLaN04zd3dHampqXjllVdQUFCA\n0aNH48aNG/XKrFq1CnFxcbCwsEB1dTXKy8sRFBSE2NjYhoE08SP98pTluJh/ETO9Z2K6cLo2l8AY\n0zFunGZ8Dh06hIkTJ+KPP/5ASUkJysvLMWbMGEOH1eLCw8PRs2dPLFq0qNnHmjlzJkaOHInZs2dr\nVL6lG6dpnbiXL1+Obt26YcWKFRCLxXjw4EGjDdROnTqF9evXN9qqXNNQbpXewtwf56KjRUckTk6E\nVXsrbS6BMaZjnLiNT1hYGOLj49V+zmyNKisr0atXL2RnZ6Nr167NPl5aWhqmTp2KW7duaVTeaFuV\nh4eHIyUlBW5ubjhx4gTCw8MBAPn5+fjLX/6iNkhd+P637wEAE9wmcNJmjLFGSCQSDBkyxNBh6NXh\nw4fRp08fnSRtAPD29kZpaSnS09N1crzm0rrGrWua/uWR/zAfH/3fRzATmGFv4F7YvmT7wn0YY/rB\nNW6F3NxcfP3118jJycEHH3yAadOmKbdt2rQJBw4cQEpKSovGMGPGDBQVFeHYsWNwd3dH79690adP\nH2zevLlFz2sM5syZg44dO+Jf//pXg22XL19GXFwczM3NkZubi++++w7btm3DgwcPkJeXh88++wx9\n+/ZtsF9AQABGjBihrKQ2pqVr3EY7Vrk6Sb8nQU5yvNP3HU7ajDGjFBUVhQ0bNmDTpk0Qi8X1Ends\nbCxcXFwa7DNr1iykpaU16TwbNmzAm2++qXLbrl27cPv2bbi4uCAyMhKTJk1q2kWYsCtXrmDu3LkN\n1ufk5GDnzp2Ijo4GoPjj5vXXX8fu3bshl8vh6+uLwYMHY8mSJQ32dXNzw9WrV1s8dk2YVOK+X3Uf\nR7OPAgCCPYINHA1jTBdG7zbM/AInQ062yHHPnDkDX19fWFhY4KeffkK/fv2U2yorK5Geno6PP/64\nwX4xMTE6j+XJq11vb2+dH9uY5ebmqhzJ86uvvsK6deuUy5WVlbCxscHrr7+Oe/fuISwsTG3Xsa5d\nu+LXX39tqZCbxKQSd3JmMmrqajDSaSR6W79gdBbGGDMAV1dXDBkyBHl5eUhJScH+/fuV286ePQuZ\nTKa2lqxrV65cQZcuXeDs7KyX8xmLsrIylYl72bJleOmll5TL586dw8yZMwEAjo6O9ZL687p164ay\nsjLdB6sFk0ncj2of4cBNxehsXNtmrPVoqZqvoTwZmCopKQlWVlYYP/7pqI6//PILbG1t0b9/f73E\ncuXKlTZX2wYU347lT8bPfsazf8DcvHkT+fn5GD1aszc+crncaNpvmEzi/jHrR1TUVMDTzhMedh6G\nDocxxhp17NgxjB49GpaWT+dQOH36NHx9fVWWnzt3bpNbLX/99ddqjwcAV69eRWBgoNrt+fn52Lhx\nI2xtbWFubg4LCwtcvXoV27ZtQ3Z2NoqLizFixIgmxdQc6enp+PDDD/H777836zjW1taQSqWNljlx\n4gTatWtX7/pycnJUNkwDFBNrqZtIS99MInHX1tViX8Y+AIrJRBhjzNjduXMHEydOVC4/fvwYEolE\n7XgX27dv1+n5pVIp7t69C6FQqHJ7WVkZPvroIyQkJMDWVtHQd9++fSgrK4NAIMDatWsxfPhwvSbu\ngQMH4ujRo80+Tp8+fVBaWlpvXVVVFdasWYPp06fDw8MDKSkpEAqF6NChAwBFjToqKgpbtmxReUyp\nVKo2qeubSSTuE7dPoPhRMfpY98Ewx2GGDocxxl6od+/e9ZJHeHg4qqurMWrUKL2c/0ntXV3i3rNn\nD3r16qVM2k/KVlRUAAB+/vlnrFmzpuUDfUa7du3Qq1evZh/njTfeQEZGRr11R44cwfr16/Haa6/B\nwsIC2dnZ9WrQERERjY5pnpGRAZFI1OzYdMHoEzcRISkjCYBiMhEzgdZjxjDGmN7885//xOzZs7Fw\n4UJ06tQJly5dgrW1tdpEqmtpaWmNns/a2hpJSUlwdXXF2LFj4e3tDVdXV9y8eRMLFixAXV0dYmNj\n8eabb8LX1xdyuRzffPMNLCwslK+ilyxZgsrKSmzZsgXnzp3Dxx9/DKlUirS0NEyYMAGjRo3Ctm3b\ncP78eSxatAg+Pj44duwYDh06hOjoaKxYsQJWVlZYtWoVoqOjcf36dXzyySfw8fFRxnn48GHcvn0b\nL7/8MgQCAUJCQtTG8sTYsWOxePHietfr5+eHGTNm4PLly0hPT8f58+cRGhqKefPmoV27dpg4cSKG\nDVNdMZTJZDh79myjjdf0ioyEulAu5l0kv11+FJgYSDWyGj1HxRhrCiP6STEqcrmc7O3tKSQkRG/n\nDA4OpsmTJzca07p162jQoEFkbm5OTk5OdPnyZSIi2rVrF82bN69e+dmzZ9PatWuJiKiiooJWrlxJ\nRERxcXH08OFDGjlyJO3bt4+IiG7cuEGenp60f/9+un//PgUFBSm3zZ8/n7Zu3UpERL/++istXryY\nkpOT6c8//6SQkBBlOSKi8vJyEgqFRERUXFxM48ePbzSWJ6qrq6lbt26Ul5enxf9cQ2fOnKGBAwdq\nXF7T50Db58VonjJ1F7Ds+DLy2+VHcVfj9BwRY6ypOHErBAcHk5eXl3I5OTmZ2rVrRzdu3GjR84rF\nYhKJRERE5OLiQgkJCSrLPX78uN7ygwcPKCgoiN5//30iIpoxYwYlJSUpt2dmZlLHjh0pNjaW4uPj\n6dtvv6WysjLlvtXV1WRnZ0d1dXVERHT8+HHq2bMnlZWVUUlJCdnZ2VF1dTUREbm7u1NWVpZy34SE\nBHr48CGVlZWRo6OjshwRUVVVFTk7O5NQKKSlS5dSUVFRo7E8a82aNbR8+XKt/h+fN3nyZNqxY4fG\n5dt04s6R5pDfLj96N+5dKqtueGMYY8aFE7eCra0tLVq0iIiI8vLyqG/fvrR3794WP6+Hhwf5+/vT\n1atXqX///iSTyVSWi4iIaLBu+/btNGvWLCJSJP3i4mKSy+VUUlJCCQkJ5OPjo/a8p06dIn9/f+Vy\nWFgYzZgxg4iIdu/eTdOmTSMioj///JN69OihLJecnExSqZSIiDZv3kwLFy6kyspKqq2tJSLFW4Gq\nqio6cOAAvfXWW7Ry5UpKTExsNJYnKisrydPTU3l8bd24cYOGDh1Kcrlc431aOnEb9QfjHzJ+AACM\ncx2Hzu07a7yfRCJBWFgYFixYgLCwMEgkkpYKkTHGGti6dSs6deqEZcuWYcWKFUhISKg37GlLWbp0\nKXr27InIyEgkJyfD3NxcZbn4+HgUFBQol6uqqpCUlITVq1ejpKQElpaW6N69O+Lj41FVVYV+/fop\nW18DirZHz470lpqaCi8vLwBAcXExDh06hM8++wwAUFJSomxwlpGRgZ49eyqPUVRUpJwIZM+ePZg+\nfTp27twJQDH62ZNuahMnTsT8+fPh6OgINze3RmN5olOnToiJicGcOXO07n9dXV2NhQsXYu/evTqb\nJEsXjHaSEWmVFMH7giGTyxD3XhwcOjtodJwn3S1qa2uV6ywtLREeHo6hQ4fqPG7G2FM8yYjxy8nJ\nwe7du5WNvaqqqlBaWorQ0FC4ubmhrq4OwcHB8Pf3h5OTE9566y0AisZ2AoEA3bt3x6NHjxAQEKAc\nbGbMmDEYMWIEBgwYgAsXLmDWrFnw9PQEABQWFmLx4sUYN24cBAIBzpw5g+HDh6O6uhpTpkyBjY0N\nACA0NBReXl7o168fRo8ejcrKSmzatAkODg549OgRKisrlQ3OGovleSkpKcjMzNRqXu5PP/0UAQEB\n9RrLacJo5+PWtecvICYtBvHX4/FGrzfwxegvND5OWFgYsrKyGqx3c3PDV199pZNYGWOqceJue2pq\nauDk5ITCwkKjqpUaktHOx92SqmXVOJh1EAAwZcCUpu1bXd2k9YwxxrR34cIFeHh4cNLWI6NM3Mey\nj6H8cTn6d+/f5OFNn/32ocl6xhhj2vntt9/w+eefo6SkpMXnF2dPGV3ilpMc+zMVs+m8P+D9Jv8V\nN3Xq1HpjAwOKb9xTp07VWYyMMcagHDr06tWrRjOqWFtgdCOnXcy7iLvld2HbyRa+vdUPnq/O0KFD\nER4ejsTERFRXV6NDhw6YOnUqN0xjjDHWKhhd4n5S257kPgkWZtqFN3ToUE7UjDHGWiWjelV+p+wO\nLuZfRHvz9vB38zd0OIwxxpjRMarEnZyZDAAQ9RU1acAVxhhjrK0wqlflx/44BgAI7K9+4ndTI5FI\n+Hs7Y4wxnTGqGne1rBqDewxGn659DB2KTjwZxS0rKwt37txBVlYWxGIxD8HKGGNMa0aVuAFgcv/J\nhg5BZxITE+sNvQoAtbW1SExMNFBEjDHGTJ1RJW4HKwcMc1Q9kbkp4lHcGGOM6ZpRJe7A/oEwExhV\nSM3Co7gxxhjTNaPKku+6vGvoEHSKR3FjjDGma0Y7O1hrwa3KWVtiY2OD+/fvGzoMxgyqa9eukEql\nLyzX6qb1ZIwxxlqzVjWtJ2OMMcZU48TNGGOMmRBO3IwxxpgJ4cTNGGOMmRCtE7dUKoVIJIKbmxve\neecdPHjwQGU5Z2dneHl5YdCgQdyaupVKTU01dAisGfj+mTa+f22P1olbLBZDJBIhKysLY8aMgVgs\nVllOIBAgNTUV6enpPEZ3K8U/HKaN759p4/vX9miduA8ePIiQkBAAQEhICA4cOKC2LHfzYowxxnRD\n68RdVFQEe3t7AIC9vT2KiopUlhMIBHj77bfh4+ODb7/9VtvTMcYYYwwvGIBFJBKhsLCwwfqIiAiE\nhITUGyHJxsZG5UgxBQUF6NGjB4qLiyESibBx40b4+vo2DEQg0PYaGGOMMZOkzRtpi8Y2pqSkqN1m\nb2+PwsJCvPLKKygoKICdnZ3Kcj169AAA2Nra4r333oNEIlGZuPl1OmOMMfZiWr8qDwgIwO7duwEA\nu3fvxqRJkxqUefToER4+fAgAqKysxPHjx+Hp6antKRljjLE2T+uxyqVSKaZMmYI7d+7A2dkZSUlJ\nsLa2Rn5+PubMmYPDhw8jJycHgYGBAACZTIYPPvgAK1eu1OkFMMYYY20KGUhSUhINGDCAzMzM6PLl\ny2rLHT16lPr160eurq4kFov1GCFTp7S0lN5++2169dVXSSQS0f3791WW6927N3l6epK3tzcNGTJE\nz1Gy52nyLC1cuJBcXV3Jy8uL0tLS9BwhU+dF9+7kyZPUuXNn8vb2Jm9vb/riiy8MECVTZebMmWRn\nZ0ceHh5qyzT1uTNY4s7MzKSbN2+Sn5+f2sQtk8nIxcWFbt++TTU1NSQUCikjI0PPkbLnLVu2jNau\nXUtERGKxmFasWKGynLOzM5WWluozNKaGJs/S4cOHady4cUREdP78eRo2bJghQmXP0eTenTx5kiZM\nmGCgCFljTp8+TWlpaWoTtzbPncGGPHV3d4ebm1ujZSQSCVxdXeHs7AxLS0sEBwfj3//+t54iZOpw\nH37To8mz9Ox9HTZsGB48eKC2myfTH01/B/lZM06+vr7o2rWr2u3aPHdGPVZ5Xl4enJyclMuOjo7I\ny8szYEQM4D78pkiTZ0lVmXv37uktRqaaJvdOIBDg7NmzEAqFGD9+PDIyMvQdJtOSNs9do93Bmktd\nP/DIyEhMmDDhhftz327DaawP/7MEAoHa+3TmzJl6ffjd3d1VdgVkLU/TZ+n5Whs/g4anyT0YPHgw\n7t69i06dOuHo0aOYNGkSsrKy9BAd04WmPnctmrgb6weuCQcHB9y9e1e5fPfuXTg6OjY3LKYBffbh\nZy1Pk2fp+TL37t2Dg4OD3mJkqmly76ysrJT/HjduHEJDQyGVSmFjY6O3OJl2tHnujOJVubpvi2+V\nNgAAASVJREFUMz4+Prh16xZyc3NRU1ODxMREBAQE6Dk69jzuw296NHmWAgICEBsbCwA4f/48rK2t\nlZ9EmOFocu+KioqUv6MSiQRExEnbRGj13Omm3VzTJScnk6OjI3Xo0IHs7e1p7NixRESUl5dH48eP\nV5Y7cuQIubm5kYuLC0VGRhoqXPaM0tJSGjNmTIPuYM/euz/++IOEQiEJhUIaOHAg3zsjoOpZ2rp1\nK23dulVZZsGCBeTi4kJeXl6NdtNk+vWiexcdHU0DBw4koVBIw4cPp3PnzhkyXPaM4OBg6tGjB1la\nWpKjoyPFxMQ0+7nTegAWxhhjjOmfUbwqZ4wxxphmOHEzxhhjJoQTN2OMMWZCOHEzxhhjJoQTN2OM\nMWZCOHEzxhhjJuT/AWr4hTzQWEQiAAAAAElFTkSuQmCC\n"
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAe4AAAFtCAYAAADBM4kgAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzs3Xlc1NX+P/DXIIO4ixsqqJiGuIIJWBqJGZmmaOYN/Vmi\nuZWW1yIVu7fE7hfDXMrSzMpcK7H0al0TwxTNrSnXcsONQBBSUFBkZJnz++PEDCMDwuzDvJ6PBw+d\nM5/5fI7RhzfnfN7nfRRCCAEiIiJyCC627gARERFVHQM3ERGRA2HgJiIiciAM3ERERA6EgZuIiMiB\nMHATERE5EJMDd0JCAvz8/PDggw9iwYIF5d7ftm0b/P390bNnT/Tq1Qu7d+829ZJEREROS2HKOu6S\nkhJ06tQJu3btgpeXF4KCgvD111+jc+fO2mPy8/NRr149AMDvv/+OZ555BhcuXDC950RERE7IpBG3\nSqVCx44d4ePjA6VSiVGjRmHbtm16x5QGbQC4ffs2mjVrZsoliYiInJpJgTs9PR1t2rTRvvb29kZ6\nenq547Zu3YrOnTtj0KBB+PDDD025JBERkVNzNeXDCoWiSscNHz4cw4cPx88//4wXXngB586dM/pc\nRERENYUxT6tNCtxeXl5IS0vTvk5LS4O3t3eFx4eEhKC4uBjZ2dlo2rRpufdZNt0xxcTEICYmxtbd\nICPx++fY+P1zXMYOWE2aKg8MDMT58+eRkpKCwsJCxMfHIzw8XO+YixcvagPy0aNHAcBg0CYiIqL7\nM2nE7erqimXLlmHgwIEoKSnBhAkT0LlzZ6xcuRIAMGXKFGzevBnr1q2DUqlE/fr1sXHjRrN0nIiI\nyBmZtBzMnBQKBafKHVRSUhJCQ0Nt3Q0yEr9/jo3fP8dlbNxj4CYiIrIBY+MeS54SERE5EAZuIiIi\nB8LATURE5EAYuImIiBwIAzcREZEDYeAmIiJyIAzcREREDoSBm4iIyIEwcBMRETkQBm4iIiIHYtIm\nI0REzkalUiE+Ph5qtRru7u6IiIhAcHCwrbtFToS1yomIqkilUiEuLg5FRUXaNqVSiejoaAZvqjbW\nKicisrD4+Hi9oA0ARUVFiI+Pt1GPyBkxcBMRVZFara5WO5ElMHATEVWRu7t7tdqJLIGBm4ioiiIi\nIqBUKvXalEolIiIibNQjckZMTiMiqgZmlZO5GBv3GLiJiIhsgFnlREREToCBm4iIyIGwchoRWQWf\nDROZB59xE5HFseIYUXl8xk1EdosVx4jMh4GbiCyOFceIzIeBm4gsjhXHiMyHgZuILI4Vx4jMh8lp\nRGQVzCon0sfKaURERA6EWeVEREROgIGbiIjIgTBwExERORAGbiIiIgdicuBOSEiAn58fHnzwQSxY\nsKDc+19++SX8/f3Ro0cP9O3bFydPnjT1kkRERE7LpKzykpISdOrUCbt27YKXlxeCgoLw9ddfo3Pn\nztpjDh06hC5duqBRo0ZISEhATEwMDh8+XL4jzConIiInYpOscpVKhY4dO8LHxwdKpRKjRo3Ctm3b\n9I555JFH0KhRIwBA7969ceXKFVMuSURE5NRMCtzp6elo06aN9rW3tzfS09MrPH7VqlUYPHiwKZck\nIiJyaibtx61QKKp87J49e/DFF1/gwIEDFR4TExOj/XtoaChCQ0NN6B0REZH9SEpKQlJSksnnMSlw\ne3l5IS0tTfs6LS0N3t7e5Y47efIkJk2ahISEBHh4eFR4vrKBm4iIqCa5d0A6b948o85j0lR5YGAg\nzp8/j5SUFBQWFiI+Ph7h4eF6x6SmpmLEiBHYsGEDOnbsaMrliIiInJ5JI25XV1csW7YMAwcORElJ\nCSZMmIDOnTtj5cqVAIApU6bgnXfewY0bN/Dyyy8DkDsCqVQq03tORETkhLjJCBERkQ1wkxEiIiIn\nwMBNRETkQBi4iYiIHAgDNxERkQMxKauciMhSVCoV4uPjoVar4e7ujoiICAQHB9u6W0Q2x6xyIrI7\nKpUKcXFxKCoq0rYplUpER0czeFONwaxyIqox4uPj9YI2ABQVFSE+Pt5GPSKyHwzcRGR31Gp1tdqJ\nnAmfcROR3XF3d69WO5E5OEpeBUfcRGR3IiIioFQq9dqUSiUiIiJs1COq6UrzKpKTk5Gamork5GTE\nxcXZZYluJqcRkV1ylNEP1QxRUVFITk4u1+7r64vFixdb5JrGxj1OlRORXQoODmagJqtxpLwKTpUT\nEZHTc6S8CgZuIiJyeo6UV8Fn3ERERLB+XoWxcY+Bm4iIyAZYOY2IiMgJMHATERE5EAZuIiIiB8LA\nTURE5EAYuImIiBwIAzcREZEDYclTIiIyCevKWxfXcRMRkdFKd9UqKirStimVSkRHRzN43wfXcRMR\nkdXFx8frBW0AKCoqQnx8vI16VPNxqpyIiMqp6vS3I+2qVVNwxE1ERHpKp7+Tk5ORmpqK5ORkxMXF\nQaVSlTvWkXbVqikYuImISE91pr8daVetmoJT5UREpKc609/BwcGIjo5mVrkVMXATEZGe6k5/BwcH\nM1BbEafKiYhID6e/7RvXcRMRUTksqmJ5xsY9Bm4iIiIbsFkBloSEBPj5+eHBBx/EggULyr1/9uxZ\nPPLII3B3d8fixYtNvRwREZFTMyk5raSkBK+88gp27doFLy8vBAUFITw8HJ07d9Ye07RpU3z00UfY\nunWryZ0lIiJydiaNuFUqFTp27AgfHx8olUqMGjUK27Zt0zumefPmCAwMLJfoQERERNVnUuBOT09H\nmzZttK+9vb2Rnp5ucqeIiIjIMJOmyhUKhbn6AQCIiYnR/j00NBShoaFmPT8REZGtJCUlISkpyeTz\nmBS4vby8kJaWpn2dlpYGb29vo89XNnATERFZgq2Wut07IJ03b55R5zFpqjwwMBDnz59HSkoKCgsL\nER8fj/DwcIPHcqkXERHZWnU2ULFXJo24XV1dsWzZMgwcOBAlJSWYMGECOnfujJUrVwIApkyZgszM\nTAQFBSEvLw8uLi5YunQpTp8+jfr165vlH0BERFRVlW2g4igFZliAhYiInMa0adOQmpparr1t27ZY\nvny5VftiswIsREREjqIm7B/OwE1ERE6jJmygwqlyIiJyKvaygQo3GSEiInIgfMZNRETkBBi4iYiI\nHAgDNxERkQNh4CYiInIgDNxEREQOhIGbiIjIgTBwExERORAGbiIiIgdi0u5gRETOSghArQYKCoA7\nd+SfBQVAUZH8Ki6Wf2o0us8oFPJLqZRfbm7yz9q1gXr1gLp15Z/3VOQk0sPATURURkkJcP06cO0a\nkJMj/56dLf+emwvk5em+Skos04fatYGGDYHGjXVfTZoAzZvrfznQvhhkRix5SkROR6ORgfnKFSAt\nDcjIADIz5ddff1kuIJtbkyaAlxfQurX809sb8PEBmjWTI3tHYC91w22BtcqJiAy4dQu4fFn3lZIi\ng3Vhoennrl1bTm/XqaP7s3Qa3NVV/ulyTyaRRqObTi8slF9qtZxuz8+Xf5r6i0O9ekC7dkD79kCH\nDoCvL9CmTfm+2JpKpUJcXByKioq0bUqlEtHR0U4RvI2Ne5wqJ6Iao6AAuHABOH8eSE6Wf/71V/XP\n06QJ0KIF0LSp7qtJEzll3bAh0KgR0KCBfEZtbqXPznNzgZs3dV/Z2XKWoOxXcbHhc+TnA6dPy69S\n7u5Ax45Ap05A165A585A/frm7391xMfH6wVtACgqKkJ8fLxTBG5jMXATkcO6fh04c0YXpFJS9JPB\nKtO4sZxabtNGTjO3agW0bAl4esqRtK0oFHLkXqeO7E9FSkpk8E5Pl1P96elAaqqcVbh9u/zxajXw\nxx/ya/NmeR0fHxnE/f2B7t3lSN2a1Gp1tdpJYuAmIoeRkwP8/jtw8qT8ysy8/2eUSt20celXu3Zy\nxOzIatWSgb1lS6BXL127EHJ0/uefwMWLctbh/HnZVpYQuscH//ufPF+nTkDPnvLrwQctP7XuXkF2\nXUXtJPEZNxHZrcJCOUI8elR+paVVfryLC9C2rXym++CD8s+2beXzZmeXnS0fH5w5A5w6JYN6Zc/S\nPTyAoCDg4YfliNwSjwX4jJvJaURUA2RlASoV8NtvMmhXlkRWuzbg5yef13bpIkeMdetar6+OrKAA\nOHtWzlwcOyYDeUVq1wYCA4FHH5XB3JyPEphVzsBNRA5Go5FTub/8IgP2n39WfKxSKQN1jx7yy9eX\no2lzyc0FTpyQMxu//SZfG+LuDgQHA489Jqfo+d/feAzcROQwNBo5XXvwIHDoUPnnr2W1aQM89JD8\n6trVtoljzkKjAc6dk79M/fKLXO9uSMOGQL9+wIABwAMPOM7acXvBwE1Edk2jkZnf+/bJgF3RiE6p\nBAIC5KiuVy9ZIYxsKzUV2L8f+PnnioN4u3ZAWBjw+OOOn/hnLQzcRGR3hJDrqvftkz/0KxpZN2wo\nA3VpIhSTii3L2OfKQshHGfv2AUlJcjnavdzcgJAQYNAg+SiDo/CKMXATkd24fl3+YN+9u+JMcA8P\noE8f+dW1q1yORJZnrkxujUYuzdu9GzhwALh7t/wx7dsDQ4fK6XRLZKU7OgZuIrKpwkL5A/ynn2Sm\nsqHbuWFDmZkcEiKzwO2tBKcziIqKQnJycrl2X19fLF682KhzFhQAe/cCCQmGs9MbN5Yj8MGD5d9J\nYslTIrKJS5eAH3+UI+z8/PLv16kDPPKIzEL292cWsq1ZolpZnTrAU08BAwfKRyMJCTKQl47Cb94E\nvv4a+PZboH9/4Nln5cYoZBzeQkRUbfcbYSkUMsGsf38ZtPnM2n5YslqZQiEL3zz4IDB+vPyF7n//\n0z0LLyqSbbt2AX37AiNHymx0qh5OlRNRlaWmAj/8AOzZI3exulerVrrM4qZNrd8/uj9rVysrLpZL\n/rZtk0vM7hUYCIweLRPZnA2fcRORRZSUyLW8//ufTEa6l5ubHD2FhQHdujGL2BHYqlrZqVPAN98A\nR46Ufy84GBgzxrlG4AzcRGRWt27Jac3t2w0v+/H2ls81Bwyw/faQ5FguXpTPuw8cKJ/E2KePDOBt\n29qmb9bEwE1EZpGeLqc1d+8uv8SnVi251nrwYLkNJEfXZIq0NGDjRrnGv+yPfxcX4IkngP/3/2r2\nIxebBe6EhATMmDEDJSUlmDhxImbPnl3umOnTp2PHjh2oW7cu1qxZg549e5bvCAM3kc0IIacxt26V\n9cLvvRUbNZKj60GDavYPUrKNlBSZdX7woH577drA8OHAiBE1c/MYmwTukpISdOrUCbt27YKXlxeC\ngoLw9ddfo3PnztpjfvjhByxbtgw//PADfvnlF/zzn//E4cOHzfYPICLjaTTA4cPA5s1yy8d7degg\nC2iEhLCABlnexYvAunVyo5OyGjYEXngBePLJmrX23ybruFUqFTp27AgfHx8AwKhRo7Bt2za9wP3d\nd98hMjISANC7d2/cvHkTWVlZ8PT0NOXSRGSC4mKZGb5li+Ha08HBcqTDZDOypg4dgHnzgOPHgdWr\nZY0AAMjLA5YvB3bsACZPlpX2nJlJgTs9PR1t2rTRvvb29sYvv/xy32OuXLliMHDHJMWY0h0iuo+S\nElkg48wZuRYbAPB3IQwXF5nR26kTUNIQ2JwNbN5rs66Sk2s8HGj6p9xqtHTpYbIaSPhQJq717Fkz\np8+rwqTArajir+L3TgVU9LmkNUnav/sE+MAnwMfYrhFRGcXFcs/rs2eBewtkKZWyYEanTiyUQvZD\noQB8fOS2rmfOyJ3lSkrke6mpQEaGTJDs1MlxZoVSjqcg5XiKyecxKXB7eXkhrcwOAmlpafD29q70\nmCtXrsDLy8vg+coGbiIy3Z07cv311q3AnVtA2RU2Hh7AsGEy6axePZt1kej+BsgliatXywz0Uvmp\nwI3TwLRpMoDbvVD9l4q1xv3GYVJyWnFxMTp16oSffvoJrVu3RnBwcKXJaYcPH8aMGTOYnEZkYQUF\nMmD/979yPXZZzZvLWtFhYUw4I8fzxx/AJ5/I7UVLKRTyF9DISMf6JdRmy8F27NihXQ42YcIEzJkz\nBytXrgQATJkyBQDwyiuvICEhAfXq1cPq1avx0EMPme0fQEQ6arUsmLJli0zoKatlS1kbesAAbvRB\njq24WNYa+Ppr/VoDTZvK0XdQkO36Vh0swELkxIqKgJ07gU2bgBs39N9r2RKIiABCQxmwqWbJygJW\nrgR+/VW/vX9/YNIkoEED2/Srqhi4iZxQSYncTvOrr4C//tJ/z9NTBuz+/RmwqeYSQpZOXblSbh9a\nqnFj4OWXZQlVe8XATeREhJAVztaulWUjy2raFBg1SpaMZMAmZ5GXB3z2mfxFtqzHH5drv+3x2TcD\nN5GTOHNGZteeOaPf3rAh8Nxzsiwpk87IWalUwMcfA9nZurbmzYHXXpPLx+wJAzdRDXflihxh37so\no25d4Jln5NKuOnVs07eayFZbX5Lp8vOBTz+VG+WUNXy4LJ1qL7/YMnAT1VC5uTJ7NiFBV4ACkNPg\ngwfLUXajRrbrX02kUqkQFxeHoqIibZtSqUR0dDSDtwPZv1+OvssuiWzfHpg9G6ignIhVMXAT1TCF\nhcD338tM8dKSj6X69QOef15mjJP5RUVFIdnAriu+vr5YvHixDXpExsrJAZYu1d+4pHZtmbj2+OO2\nrbpmk01GiMj8SrNkV68unynevTswYYLcjIEsR31vXdj7tJP9atIEiImR9Q2++EIunbx7F/jgA+DY\nMWDqVMerec7ATWRHLl0CYmJU2L8/HhqNGi4u7mjdOgLduwdj/HhZWMJR6jI7MvcKirZX1E72TaEA\nhgyRu4q9955uR7y9e2UN/+hoOYXuKGrQzqZEjuvmTeCjj4DISBUSE+OQn5+MgoJUFBYmQ6OJwwsv\nqBAczKBtLREREVAqlXptSqUSERERNuoRmUP79sD778tyv6UyMoA33gB++sl2/aouPuMmsqHiYjmF\n99VX8jn2qVNRyM9PhkIhC6h4eQG1avHZqi0wq7xm27cPWLaszPa2AJ58EpgyxXpZ50xOI3IwJ0/K\nak+pqbq233+fBnf3VLRpo7/FZtu2bbF8+XLrd5KoBrtyBXj3Xf17sEMHYM4c+YuzpTE5jchBXL8O\nfP65TEAry9sbaNzYXa9sYyk+WyVjceagYt7ewKJFwPLl8nk3AFy8CLz+ulwy1qOHbftXEY64iayk\ndEejjRvlLl6l6tQBRo8Ghg4Fjh7l+mEyH65HrxohgB07ZMnU4mLZVquWXMExZIjlcks4VU5kJwyN\ncOrUCcaKFeXrij/+uNxDuEmTyj/PH7JkDK5Hr56zZ4H58/V32HviCbnm2xLPvRm4iezAvSOcoiIg\nI0OJhg2j4eGhC77t2skfBl272qqn5AymTZuG1LIPcP/GnImKZWfL4F32951OnYB//1vuOGZOxsY9\nLgcjMqP4+Hht0L52Dfj9dyArqwgZGfEA5LT4hAmy+AODNlka16NXX9OmMmHtiSd0befOyefeKSk2\n65YeBm4iM1Kr1SgokDt3Xb6se16m0agREgKsWCE3OuB2m2QNXI9uHDc3YPp0YNIkwOXvKHntmkxY\nO3LEtn0DOFVOZDaFhcCwYVE4diwZZf9XdncHHnvMF+vX85kiWR9zJkzz22/AwoW6/QJcXGRAHzLE\n9HPzGTeRDZ08KZeUnDqlwsWLcdBoiuDiArRqBbRtq8SbbzKLl8hRpaQA77wjR92lwsPlYy8XE+at\nGbiJbODWLblxwa5durYbN1S4ezceXbqo0awZRzhENcGNG0BsrHzeXerRR4HXXjM+45yBm5yCPU37\nHTgAfPIJ9Aqm1KsHjBsnSyea8ps4EdmfwkJgyRL94kndugH/+hdQv371z8fATTWevRSTyMmRpUoP\nHtRv79sXmDxZf002EdUsGo2sfPj997q2tm3l1qHNm1fvXFwORjVe2aVWpYqKihAfH2+V6wshdxCa\nNk0/aDdtKtd4RkczaBPVdKXJaS++qGtLTQVmztSveW5JXJRCDkNdtk5oFdrN6fp1uZPQvUtBBg4E\nxo+XU+RE5BwUCuCZZ+Qv6h98IJd9ZmfLX95jYgBfX8ten4GbHIYtikkIIRPPPv9ctxwEAFq2BF59\n1X43ISAiy+vXT1ZTi42V24PeuiWfd//734C/v+Wuy6lychjWLiZx7Rowdy7w4Ye6oK1QyGUgH33E\noE1EMkDHxgING8rXajUwbx5w6JDlrsnkNHIo1sgqr2iU3bo1MGMG0LmzWS9HRDVAairw9ttyyhyQ\nz8KnTwcGDKj4M8wqJzKDnBw5mv7tN12bQiHLlI4ZA9Subbu+EZF9++sv4K23gIwM+VqhAKZOBZ56\nyvDxDNxEJhAC2LtXLvO6fVvXzlE2EVXHzZty5H35sq5tyhTDJVIZuImMlJcHfPyxflEFQD7LHjuW\no2wiqp5bt2R+zPnzurYXX5SZ6GUxcBMZ4ddf5dT4jRu6tpYtgX/+U1ZEIiIyRn6+XBp29qyu7fnn\ngbK5tAzcRNVQUCCTz378Ub994EC5cUCdOrbpFxHVHAUFwH/+A/z+u65tzBhg1Cj5dwZuoio6exZY\nvBjIzNS1eXjIDNDAQNv1i4hqnrt35XKxY8d0bS+8ADz3nA1Knubk5CAsLAy+vr548skncbPsTgtl\nvPjii/D09ET37t2NvRSRWRQXA19+CcyerR+0+/aVVdEYtInI3GrXlgVZevbUta1fD3z7rfHnNDpw\nx8XFISwsDMnJyRgwYADi4uIMHjd+/HgkJCQY3UEic0hPlwF740a5SQAgy5RGRcn20uIJRETm5uZW\nvpra2rXGn8/oqXI/Pz/s3bsXnp6eyMzMRGhoKM6WfQpfRkpKCoYOHYrfy07039sRTpWTBQghn2N/\n9pmcsirVvbvcR7e6u/kQERnr7l3gnXeAkyfl6//9z7i4Z3St8qysLHh6egIAPD09kZWVZeyptGJi\nYrR/Dw0NRWhoqMnnJOeVlyczxg8f1rW5usrnS8OHc79sIrKuQ4eSoFAk4eZNWazFWJUG7rCwMGSW\nfRj4t9jYWL3XCoUCCoXC+F78rWzgJjLF8ePA++/LSmil2rQB3ngDeOAB2/WLiJxX6YBUrZZLxRYs\nmGfUeSoN3ImJiRW+VzpF3rJlS1y9ehUtWrQwqgNE5lRcLBM/tmzRb3/6aVkAwc3NNv0iIirl7i4L\ntCxYYNznjZ4sDA8Px9q/n66vXbsWw4cPN/ZURGaRkSE3sy8btBs1kuUHX3qJQZuI7IcptSKMDtzR\n0dFITEyEr68vdu/ejejoaABARkYGnn76ae1xo0ePRp8+fZCcnIw2bdpg9erVxveWyAAhgN27ZbWz\nCxd07b16yWfcQUG26xsRkbmxAAs5tDt3gBUrgKQkXZurKzBuHDB0KBPQiMh+GRv3jM4qJ7K18+eB\nhQuBq1d1bV5ewKxZTEAjopqLgZscjhDAd98Ba9bIZLRSYWHApEmsM05ENRsDNzmUvDzggw/krl6l\n6tYFpk0DHnvMdv0iIrIWBm5yGKdOyanx7Gxd24MPykzyVq1s1y8iImti4Ca7p9HIgvxffqmrMw7I\nTenHjpXJaEREzoI/8siu3bwJLFmivyVew4bAjBlc5kVEzomBm+zWH3/IqfGyZUu7dJFT482a2a5f\nRES2xMBNdqeiqfF//AMYMwaoVct2fSMisjUGbrIZlUqF+Ph4qNVquLu7IyIiAn5+wViyBDhyRHdc\nw4bA66/LSmhERM6OldPIJlQqFeLi4lBUVKRtU6uVcHOLhotLsLatSxdZUKVpU1v0kojIclg5jRxK\nfHy8XtDOzATS0opQt248unaVgXvkSOD55zk1TkRUFgM32YRarQYAlJQAly/rEtA0GjUaNABee41Z\n40REhjBwk024u7vjzh25m9ffMRwA0KyZOz74AOD27kREhnHvJLKJBx6IwNmzSr2g3bq1Eh9+GMGg\nTURUCSankVUVFgKffgrs3AncuKFCRkY8XFzUCAx0x+uvRyA4OPj+JyEiqgGMjXsM3GQ1WVnAu+8C\nFy/q2tq2BebMAby9TTu3oaVl/CWAiOwZAzfZtSNHgEWLgNu3dW39+sldvUzdhtPQ0jKlUono6GgG\nbyKyW1wOZiKO2CxDowHi44Gvv5b7aANyU5AJE4CnnwYUCtOvce/SMgAoKipCfHw8v4dEVOMwcMPw\niC0uLo4jNhPdvg0sXgz89puurWlTIDoa8PMz33XUZTPcqtBOROTIGLjBEZslXLokn2dnZuraevSQ\nG4Q0bmzea7m7u1ernYjIVLacpeVyMHDEZm579sgypWWD9rPPAu+8Y/6gDQARERFQKpV6bUqlEhER\nEea/GBE5vdJZ2uTkZKSmpiI5ORlxcXFQqVRWuT5H3OCIzVyKi4EvvgC+/17XVqeO3Du7Tx/LXTc4\nOBjR0dHMUSAiq7D1LC0DN+SIzVBWMkdsVXfjBrBgAXDqlK7N2xv4179MX+pVFcHBwQzURGQVtp6l\nZeAGR2ymOndOPs/Ozta19ekjR9qmLvUiIrI3tp6l5TpuMklCArBypZwmB+TyrrFj5TNtcyz1IiKy\nN+aqHcECLBbC9d2GFRXJ0qUJCbq2Bg1k1njPnrbrFxGRNZgjNjBwWwArchmWkyOnxs+e1bW1by+f\nZ3t62q5fRESOxNi4x+Vglagsc9BZnT0r98ouG7T79QMWLmTQJiKyBianVcISmYOOPPX+44/AihW6\n59kuLsD48cCwYXyeTURkLQzclTB35qCtS6sa+0tDcTHw+efA9u26toYNgdmzZTU0IiKyHk6VV8Lc\nFblsOfVubKWfmzeBf/9bP2i3bw8sWcKgTURkCxxxV8Lc67ttuWjfmEo/Fy8CsbHAtWu6tpAQYPp0\ngEXlyJAmTZrgxo0btu4GkU15eHggJyfHYuc3KXDn5OQgIiICf/75J3x8fLBp0yY0vqcYdVpaGsaO\nHYu//voLCoUCkydPxvTp003qtDWZsyKXLRftV/eXhn37gKVLgcJC+VqhACIjgREj+DybKnbjxg27\nWx1CZG0KC/+QNGmqPC4uDmFhYUhOTsaAAQMQFxdX7hilUon3338fp06dwuHDh7F8+XKcOXPGlMs6\nLFtuhlFrnwh7AAAgAElEQVTVXxo0GmDtWpklXhq069UD5s5lURUiIntgUuD+7rvvEBkZCQCIjIzE\n1q1byx3TsmVLBAQEAADq16+Pzp07IyMjw5TLOqzSqXdfX1+0bdsWvr6+VktMq8ovDfn5wH/+A3z7\nre4Yb2+5p3avXhbvIhERVYFJBVg8PDy0z7OEEPd9vpWSkoJ+/frh1KlTqF+/vn5H7LAAS01TWVZ5\nejrwf/8HXLmiOz4oCIiKkiNuoqrgfUxU9fvA2Pvlvs+4w8LCkFl2Y+W/xcbGlutAZfP6t2/fxsiR\nI7F06dJyQbtUTEyM9u+hoaEIDQ29X/eoGip6Xn/0KPDee3LEXeof/wCef16u1SYiItMlJSUhKSnJ\n5POYNOL28/NDUlISWrZsiatXr6J///44W7ak1t+KioowZMgQDBo0CDNmzDDcEf6mbnVCANu2AatX\ny2fbAODmBvzzn8Bjj9m2b+SYeB8TWX7EbdJ4Kjw8HGvXrgUArF27FsOHDy93jBACEyZMQJcuXSoM\n2mR9hYUya3zVKl3QbtZM7qnNoE1EZL9MGnHn5OTgueeeQ2pqqt5ysIyMDEyaNAnbt2/H/v378dhj\nj6FHjx7aqfR3330XTz31lH5H+Ju61dy4Acyfr19v3M8PePNNwMPDdv0ix8f7mMjyI27uDuZkLl6U\nSWjXr+vanngCmDoVuCfpnKjaeB8T2UFyGtUc+/cDH3wA3L0rX7u4AC++CISHO+/6bEfe9IXInEpK\nSlCrVq1qf664uBiurgwl1sQRtxPQaICNG4Gvv9a11asHzJzp3Ouzud+6+fE+dkxbtmxBXl4exo0b\nV+3PvvPOO3jiiSfQp08f83fMQdl1chrZv7t3ZRW0skG7dWsWVQG43zo5jwsXLmDIkCGYPXs2Xn75\nZb1gsXfvXuzbt8+ooA0Ab775JmJjY522IqYtMHDXYNevy6039+/XtQUEyKDt5WW7ftkLW276QmQt\nhYWFGDhwIEaOHInMzEysWrUKeXl5AIC8vDzMmjXLYLnqqnJ1dcWKFSswduxYFBcXm6vbVAkG7hoq\nORl4/XWZjFZqyBAgJgaooP6N07Hlpi9E1rJz505cvnwZ/fr1wyuvvIIdO3agUaNGAID58+djzJgx\nJv8/37ZtW3Tr1g1r1qwxQ4/pfviMuwbat08moZXOAteqBUyZAgwaZNt+2Rs+4zY/3sf2JyoqChs2\nbEBWVpZee35+Ptq2bYsLFy7AwwzrQI8ePYqIiAicP3/e5HM5OmaVU5VpNPJZ9saNurb69YE5c4Ae\nPWzXL3tl7v3WieyRSqVCUFBQufbt27ejffv2ZgnaABAQEIDs7GwcO3YMPXv2NMs5yTAG7hri7l3g\n/feBAwd0bd7ewNtvA61a2a5f9s6c+60TlUpJScGSJUtw6dIljBkzBqNHj9a+t3z5cmzduhWJiYkW\n7cO4ceOQlZWFAwcOwM/PD4MGDUL79u3x8ccfAwASExMrzAQ/cuQI1q9fj1q1aiElJQWff/45Vq5c\niZs3byI9PR3z5s3DAw88oPcZFxcXPProo9i5cycDt4UxcNcA2dmyqMqFC7q2nj1lYhp39iJ7N3So\n7a79/feWOe/ChQuxdOlSLF++HHFxcXqBe926dejQoUO5z0yYMAFHjx6t1nWWLl2KxyqoUbxmzRpc\nvnwZHTp0wPz588uVpD5+/DgmT55c7nOXLl3C6tWrsWzZMgDyF4CHH34Ya9euhUajQUhICB566CG8\n9tpr5T7r6+uLEydOVOvfQNXHwO3gLlyQQTs7W9c2dCgwYYJ8tk1E1nXgwAGEhITA1dUVCQkJ6NSp\nk/a9/Px8HDt2DC+++GK5z61atcrsfTl27BgAOY19r5SUFDRu3Lhc++LFi/Hee+9pX+fn56NJkyZ4\n+OGHceXKFURFRVW4dMzDwwP7yy5jIYtg4HZgBw7I6fHSSmhMQiOyvY4dOyIoKAjp6elITEzE5s2b\nte8dPHgQxcXFFY6Sze348eNo1KgRfHx8yr2Xm5trMHDPnDkT9cpM1R06dAjjx48HAHh7e+sF9Xs1\nbdoUubm5pnecKsXA7YCEAL75Bli/XtdWvz4QHQ34+9uuX0TGsNR0ta14enoCADZt2oQGDRpg8ODB\n2vd+/vlnNG/eHJ07d7ZKX44fP25wtA3IjGZN6daAZZQN8ufOnUNGRgb69+9fpetpNBquKrACBm4H\nU1gILFsG7Nmja2vdWiahsagKkf3YuXMn+vfvD2WZ3Xv27duHkJAQg8dPnjxZO7VdVUuWLKnwfABw\n4sQJjBgxwuB7jRs3Rk5OTqXn3717N9zc3PSS2C5dulQuMa1UTk6OwVE8mRcDtwO5eVNux1m2smCP\nHnKk3aCB7fpFROWlpqZi2LBh2td3797V1g4w5NNPPzXr9XNycpCWlgb/Cqbh2rdvj+yyyTEACgoK\nMHfuXIwdOxbdunVDYmIi/P39tQVaNBoNFi5ciBUrVlR4zYqCOpkPA7eDSE0F3nkHKFtDYeBA4KWX\nAG7MQ2R/2rVrpxcYo6OjoVar0a9fP6tcv3T0XlHgfvTRR3H69Gm9th9++AGLFi1Cr1694OrqigsX\nLuiNoGNjYyutaX769GmEhYWZ3nmqFCunOYCjR4EFC4A7d+RrhUJmjTvzdpxkn3gf65w7dw4TJ05E\nQEAA6tati4MHD+LUqVP3nZ42l4ULF+Ldd9/F9evX4eJSvrr1rl27MGPGDPzxxx/atuzsbMycORPN\nmjWDi4sL3n77bUydOhXu7u5wc3PDsGHDMGDAAIPXKy4uRpMmTbB//370cPKKT5aunMbAbee2bwc+\n+wwoKZGv3d3ldpysGUL2iPexYUIItGrVCk899ZTV6nmPHj0axcXF+Oabbwy+f/fuXXh5eeHkyZNo\n3bq1ydc7ePAgJk+erPeLgLPitp5OqqQE+PRT4JNPdEG7eXPgvfcYtIns3ejRo/WmqLdu3YobN25g\nzpw5Fr3uggUL8OSTTwIAfv31V4wcObLCY2vXro1XXnkFS5cuNcu133//fURFRZnlXFQ5Bm47dOeO\nLKpSdpmMr6/cjrN9e9v1i4iq5qeffkJoaCgAICMjA2+88QbWrFmjV4zFEjZs2IDatWvj5MmTcHNz\nqzRwA8CsWbOwY8cO3Lhxw6Trnjt3DqmpqUbv6U3Vw6lyO/PXXzIJ7c8/dW0hIcCMGYCbm+36RVQV\nvI+lLVu24Ndff0VxcTEyMzMxffp0gxt9mNvatWtx8OBB5ObmIiYmBn5+fvf9zK+//ooFCxbgm2++\ngcKIpBm1Wo3w8HCsWLHCYClXZ8Rn3E7k3Dk50r55U9cWEQH8v/8HGMgtIbI7vI8dU2JiIs6cOYPp\n06dX+7Nvv/02wsPDERgYaIGeOSYGbiexf78sX1pYKF+7ugKvvgo8/rht+0VUHc5+HxMB3I+7xjNU\nvrRBA+DNN4Fu3WzXLyIisk8M3DZUVCTLl+7erWvz8gLmzuUe2kREZBgDt43cuiXLl5Zd8tijBzBn\njtwwhIiIyBAGbhtIT5eZ4xkZurYnnwRefpnlS4mIqHIME1b2xx9ypH3rlq5t3DhgxAiWLyUiovtj\n4Lai3buBjz4Ciovlazc3ICoKKLNjHhERUaUYuK1ACODLL4H4eF2bhwfw73/LimhERERVxcBtYYWF\nwNKlwL59urZ27WTmePPmtusXERE5JgZuC8rNlZXQzp7VtfXqBcyaBdSta7t+ERGR42LgtpArV4B5\n84DMTF3b4MHA5MlArVq26xcRETk2Bm4LOHkSePdd4PZt+VqhACZMAMLDmTlORESmMXrripycHISF\nhcHX1xdPPvkkbpbdGeNvarUavXv3RkBAALp06WLxvWjtwa5dwNtv64J27drAv/4FDBvGoE1ERKYz\nOnDHxcUhLCwMycnJGDBgAOLi4sod4+7ujj179uD48eM4efIk9uzZg/3795vUYXul0ch640uXAiUl\nsq1JEyAuDujd27Z9IyLbKyn9wWAGxaVrSskpGR24v/vuO0RGRgIAIiMjsXXrVoPH1f07C6uwsBAl\nJSVo0qSJsZe0W4WFwKJFwKZNurb27YHFi4GOHW3XLyKyD1u2bMH6sjsJmWj+/Pk4ePCg2c5HjsXo\nwJ2VlQVPT08AgKenJ7Kysgwep9FoEBAQAE9PT/Tv3x9dunQx9pJ2KTdXToX//LOuLTAQWLAAaNbM\ndv0iIvuwd+9e7Nu3D+PGjTPbOd98803ExsbizJkzZjsnOY5Kk9PCwsKQWTYt+m+xsbF6rxUKBRQV\nPMB1cXHB8ePHkZubi4EDByIpKQmhoaEGj42JidH+PTQ0tMLj7IWhzPGnnwYmTWLmOBEBeXl5mDVr\nFvbu3WvW87q6umLFihV49tlncejQIbhykwOHkJSUhKSkJJPPoxBG7nrv5+eHpKQktGzZElevXkX/\n/v1xtuyCZQP+85//oE6dOnjjjTfKd8TIDcVtxVDm+MSJwNChTEIj5+Vo97GlRUdHo3Xr1pg+fbpF\nzj9+/Hj07dsXEydOtMj5yThVvQ+MvV+MnioPDw/H2rVrAQBr167F8OHDyx1z/fp1bbZ5QUEBEhMT\n0bNnT2MvaTd++klWPrs3c5zLvYioVH5+Pj777DO88MILFrvGq6++igULFljs/GSfjA7c0dHRSExM\nhK+vL3bv3o3o6GgAQEZGBp5++mnt3x9//HEEBASgd+/eGDp0KAYMGGCentuAEMCGDcAHH+g2CvHw\nYOY4EZW3fft2tG/fHh4eHha7RkBAALKzs3Hs2DGLXYPsj9FT5eZW3SkDlUqF+Ph4qNVquLu7IyIi\nAsHBwRbrX2Eh8OGHQNlHVT4+cs02a44TSfZ+H1vzepMmTUKdOnXw4Ycf6rWnpKRgyZIluHTpEsaM\nGYPRo0dr31u+fDm2bt2KxMTEKl8nPDwcffr00Q6eyPbsdqrcllQqFeLi4pCcnIzU1FQkJycjLi4O\nKpXKItfLywPeeks/aPfqJTPHGbSJjGPt+9ja1zt+/Di6d+9ern3hwoVYsmQJwsLCytW/WLduHZpX\n84eKr68vTpw4YVJfybE4ZOCOj49HUVGRXltRURHiy+6baSbp6cDMmcDp07q2QYNkIOdGIUTGs+Z9\nbIvrpaSkoHHjxnptBw4cQEhICFxdXZGQkIBOnTpp38vPz8exY8fQr1+/al3Hw8MDly9fNkufyTE4\n5BoCtVpdrXZj/fEHMH8+cOuWfK1QAC++yPKlROZgrfvYVtfLzc0tF7g7duyIoKAgpKenIzExEZs3\nb9a+d/DgQRQXF+Oxxx6r1nWaNm2K3Nxcs/SZHINDBm53d/dqtRsjKUk+0y79Bb12bSAqCnjkEbNd\ngsipWeM+tuX1FAoFNBqNXltp0apNmzahQYMGGDx4sPa9n3/+Gc2bN0fnzp2rdR2NRsMleE7GIafK\nIyIioFQq9dqUSiUiIiJMPrcQwMaNslxpadD28JBrthm0iczHkvexPVyvcePGyMnJMfjezp070b9/\nf73+7Nu3DyEhIXrHHTt2DF27dq30Ojk5OeVG9lX9bFXdunULI0eORFpamlnOR6ZxyBF3cHAwoqOj\nzZ4dWlQELFsG7N6ta2vXTmaOt2hhYqeJSI+l7mN7uV779u2RnZ1t8L3U1FQMGzZM+/ru3bva5Lmy\nunbtih07dlR6nZycHDzwwAPl2qvy2apYtWoVrly5gi1btmDJkiUmn49M55CBG5A3oTlvuFu35PPs\nP/7QtfXsCcyeDdSrZ7bLEFEZ5r6P7el6jz76KE6XzWoto127dnpBPTo6Gmq1ulximpubG9q2bVvp\ndU6fPo2wsLBy7VX5bFVMmDABADBv3jyTz0Xm4bDruM3p6lVZczw9Xdc2cCDw0ksASwATVR1Lnurs\n2rULM2bMwB9lRwN/O3fuHCZOnIiAgADUrVsXBw8exKlTp7RT6xqNBsuXL8fJkycxZcoUBAYGGrxG\ncXExmjRpgv3796NHjx73/eyNGzewcOHCSr9Hrq6umDt3brn65y4uLkhJSTHLLwOVycnJwerVq7F/\n/37MmTMHJ0+exK1bt5Ceno5FixZZ9NrmYul13E4fls6cAf7v/+Ra7VLjxgEjRjBznIiMFxISgszM\nTGRkZKB169Z673Xq1Ak//72loBACrVq1Qnh4uPb9bdu2YdSoUThy5Aj+/PPPCgO3SqVC27ZttUH7\nfp/18PDA/PnzzfnPNLv//ve/+Oc//4nPP/8cly5dwsSJE5GXlwcvLy+HCdyW5tQj7n37ZPnS0iQ0\nNzfg9deBvn2t2g2iGoMjbn0xMTEoKCjQqyc+evRonD59Wls05b///S9GjRqFkydPatd137p1C0II\ndO3aFRcuXEDt2rUNnv8f//gHBg8ejPHjx2vbqvrZ6rLWiDsvLw937txBcHAwUlNTAQB79uxBdHQ0\nfvnlF4te21w44rYAIYBNm2Td8VKNGsmiKmXqIRARmWTWrFl4+OGHER0dra1Z/tNPP2nLnGZkZOCN\nN97AmjVr9IqxNGjQACtWrMAzzzyDkpISFBcXl5u6PnfuHFJTU8vt813ZZ3NycrBo0aJKg0WtWrUQ\nExNjs61CGzZsiO+++05vX4tvvvkGo0ePRl5eHho2bGiTftkVYSes1ZWiIiHef1+IIUN0Xy+9JERm\nplUuT1Sj2dGPFLuhUqnEs88+KzQajRBCiM2bN4vo6GjxxhtviOeff16oVCqDn+vbt6/49ddfxbJl\ny0RRUZHeewUFBSIsLExcuHCh2p81lkKhECkpKXptSUlJ4siRI9rXx48fF2+99ZbeMV9++aXYuHGj\nXtu//vUvcfLkyQrPExkZKdavXy+EEEKj0YhmzZqJq1evioULF5rl32JpVb0PjL1fHHIdt7Fu35ZL\nu376Sdfm7w8sWgT8XReBiMisgoKCMGXKFHz00UcAgBEjRuDdd9/FwoULsX79egQFBRn8XI8ePfDb\nb7+hS5cu5Ua/8+fPx/z589GhQ4dqf7a6vvrqK0ydOhUKhQLR0dFYvny59r1PP/0UsbGx2tcXLlwo\ntwRNpVKVm+JOSEjA+fPnKz1Paaa8QqHAo48+iu3bt5db5+6snOYZ99WrwDvvAFeu6NrCwoCpU5k5\nTmQufMbtfNatW4exY8fazXnsAZ9xm4GhzPGxY4GRI5k5TkRkrOLiYty+fdtuzuMsanzg/vln4P33\ndZnjSiXw2msAZ1yIiEyzadMmDB8+3G7O4yxq7FS5EMA33wDr1+vaGjaUmeN+fma7DBGVwalyIk6V\nG6W4GFi+HNi1S9fm7Q3MnQu0bGm7fhEREZmqxgXu27flTl4nT+raevQA5swB6te3Xb+IiIjMoUYF\nbkOZ4088AUybxsxxIiKqGWpMOGPmOBEROYMaEbjvrTnOzHEiIqqpHDpwCwHExwNffqlra9QI+Pe/\nmTlOREQ1k8MG7qIiYNkyYPduXVubNrKkKTPHiYiopnLIwH3rFjB/PlB2f3p/f5k5Xq+e7fpFRERk\naQ4XuNPTZeZ4Roau7ckngZdfZuY4ERHVfA4V6v74A4iNlWu1AZktHhkJjBjBzHEiInIODhO4f/pJ\nPtMuLpava9cGXn8d6NPHtv0iIiKyJrsP3BqNzBrftEnX5uEha44/+KDt+kVERGQLdh24796VO3sd\nOKBr8/GRmePNm9usW0RERDZjt4H7xg1ZCS05WdcWGAjMnAnUrWu7fhEROYJly5bBxcUFU6dOtXVX\nyMzsclvPlBSZOX7tmu79oUOBCROAWrVs0z8iuj9u62kfPv74Yxw5cgRCCPTu3RtTpkyxdZeciqW3\n9XQxplOW9OuvwKxZuqDt4gK89BIweTKDNhHR/WzYsAHXr1/HqlWr8MUXXyAjIwMbN260dbfIjIwe\ncefk5CAiIgJ//vknfHx8sGnTJjRu3NjgsSUlJQgMDIS3tze+//57wx1RKLB1q8AXX8iENEBOic+a\nBfTqZUwPicjaOOK2vYKCAtSpU+e+bWQ5djvijouLQ1hYGJKTkzFgwADExcVVeOzSpUvRpUsXKO6z\n2Przz3VBu0UL4L33GLSJiKrDUIB29qBdUlJi1OeKS9cf2xmjA/d3332HyMhIAEBkZCS2bt1q8Lgr\nV67ghx9+wMSJE6v8m4WfH7B4MdCunbG9IyIiArZs2YL169cb9dn58+fj4MGDZu6R6YwO3FlZWfD0\n9AQAeHp6Iisry+Bxr732GhYuXAgXl6pdql8/WR2tgll3IiKqpgsXLmDIkCGYPXs2Xn75Zad5nLF3\n717s27cP48aNM+rzb775JmJjY3HmzBnzdsxElS4HCwsLQ2ZmZrn22NhYvdcKhcLgNPj//vc/tGjR\nAj179kRSUtJ9O1O7dgxu35YbiISGhiI0NPS+nyEioooVFhZi4MCBeOutt7Bnzx58/fXXiIuLQ6NG\njWzdNYvKy8vDrFmzsHfvXqPP4erqihUrVuDZZ5/FoUOH4GrihhhJSUlVioX3Y3Rymp+fH5KSktCy\nZUtcvXoV/fv3x9mzZ/WOefPNN7F+/Xq4urpCrVYjLy8Pzz77LNatW1e+I0xqIXJ4vI/tz/fff49h\nw4bh4sWLuH79OvLy8jBgwABbd8vioqOj0bp1a0yfPt3kc40fPx59+/bFxIkTq3S8pZPTjA7cs2bN\nQtOmTTF79mzExcXh5s2blSao7d27F4sWLao0q5w3PJFj431sf6KiorBhw4YKH2fWRPn5+Wjbti0u\nXLgADw8Pk8939OhRRERE4Pz581U63m6zyqOjo5GYmAhfX1/s3r0b0dHRAICMjAw8/fTTFXaSiIis\nR6VSISgoyNbdsKrt27ejffv2ZgnaABAQEIDs7GwcO3bMLOczlV1WTiMix8T7WEpJScGSJUtw6dIl\njBkzBqNHj9a+t3z5cmzduhWJiYkW7cO4ceOQlZWFnTt3ws/PD+3atUP79u3x8ccfW/S69mDSpEmo\nU6cOPvzww3LvHTlyBOvXr0etWrWQkpKCzz//HCtXrsTNmzeRnp6OefPm4YEHHij3ufDwcPTp00c7\nSK2MpUfcdlurnIjIUS1cuBBLly7F8uXLERcXpxe4161bhw4dOpT7zIQJE3D06NFqXWfp0qV47LHH\nDL63Zs0aXL58GR06dMD8+fMxfPjw6v0jHNjx48cxefLkcu2XLl3C6tWrsWzZMgDyl5uHH34Ya9eu\nhUajQUhICB566CG89tpr5T7r6+uLEydOWLzvVcHATUQ2FZMUY5vrhlrmugcOHEBISAhcXV2RkJCA\nTp06ad/Lz8/HsWPH8OKLL5b73KpVq8zel9Kp3YCAALOf256lpKQYrOS5ePFivPfee9rX+fn5aNKk\nCR5++GFcuXIFUVFRFS4d8/DwwP79+y3V5Wph4CYiMqOOHTsiKCgI6enpSExMxObNm7XvHTx4EMXF\nxRWOks3t+PHjaNSoEXx8fKxyPXuRm5trMHDPnDkT9erV074+dOgQxo8fDwDw9vbWC+r3atq0KXJz\nc83fWSMwcBORTVlq5GsrpYWpNm3ahAYNGmDw4MHa937++Wc0b94cnTt3tkpfjh8/7nSjbUA+O9aU\n1s8uo+wvMOfOnUNGRgb69+9fpXNqNBq7yd9g4CYisoCdO3eif//+UCqV2rZ9+/YhJCTE4PGTJ0+u\ndtbykiVLKjwfAJw4cQIjRoyo8P2MjAx89NFHaN68OWrVqgVXV1ecOHECK1euxIULF3Dt2jX06dOn\nWn0yxbFjx/D888/j1KlTJp2ncePGyMnJqfSY3bt3w83NTe/fd+nSJYOJaYDcWKuijbSsjYGbiMgC\nUlNTMWzYMO3ru3fvQqVSVVjv4tNPPzXr9XNycpCWlgZ/f3+D7+fm5uKFF17Axo0b0bx5cwDAt99+\ni9zcXCgUCixYsACPPPKIVQN3165dsWPHDpPP0759e2RnZ+u1FRQUYO7cuRg7diy6deuGxMRE+Pv7\nw93dHYAcUS9cuBArVqwweM6cnJwKg7q1MXATEVlAu3bt9IJHdHQ01Go1+vXrZ5Xrl47eKwrcX375\nJdq2basN2qXH3r59GwCwa9cuzJ071/IdLcPNzQ1t27Y1+TyPPvooTp8+rdf2ww8/YNGiRejVqxdc\nXV1x4cIFvRF0bGxspTXNT58+jbCwMJP7Zg4M3EREFvDBBx9g4sSJePXVV1G3bl389ttvaNy4cYWB\n1NyOHj1a6fUaN26MTZs2oWPHjnjqqacQEBCAjh074ty5c5g2bRpKSkqwbt06PPbYYwgJCYFGo8H7\n778PV1dX7VT0a6+9hvz8fKxYsQKHDh3Ciy++iJycHBw9ehRDhw5Fv379sHLlShw+fBjTp09HYGAg\ndu7cie+//x7Lli3D7Nmz0aBBA7z55ptYtmwZfv/9d0yZMgWBgYHafm7fvh2XL19G/fr1oVAoEBkZ\nWWFfSj311FOYMWOG3r83NDQU48aNw5EjR3Ds2DEcPnwYU6dOxUsvvQQ3NzcMGzYMvXv3Nvjfqri4\nGAcPHqw0ec2qhJ2wo64QkZF4Hxum0WiEp6eniIyMtNo1R40aJUaOHFlpn9577z3Rs2dPUatWLdGm\nTRtx5MgRIYQQa9asES+99JLe8RMnThQLFiwQQghx+/ZtMWfOHCGEEOvXrxe3bt0Sffv2Fd9++60Q\nQoizZ8+K7t27i82bN4sbN26IZ599Vvveyy+/LD755BMhhBD79+8XM2bMEFu2bBF//fWXiIyM1B4n\nhBB5eXnC399fCCHEtWvXxODBgyvtSym1Wi2aNm0q0tPTjfgvV96BAwdE165dq3x8Ve8DY+8Xu7nL\neMMTOT7ex9KoUaNEjx49tK+3bNki3NzcxNmzZy163bi4OBEWFiaEEKJDhw5i48aNBo+7e/eu3uub\nN2+KZ599VvzjH/8QQggxbtw4sWnTJu37Z86cEXXq1BHr1q0TGzZsEJ999pnIzc3VflatVosWLVqI\nkpISIYQQP/74o2jdurXIzc0V169fFy1atBBqtVoIIYSfn59ITk7Wfnbjxo3i1q1bIjc3V3h7e2uP\nE0yoLhQAAAkWSURBVEKIgoIC4ePjI/z9/cUbb7whsrKyKu1LWXPnzhWzZs0y6r/jvUaOHCm++OKL\nKh/PwE1EDoP3sdS8eXMxffp0IYQQ6enp4oEHHhBfffWVxa/brVs3MWTIEHHixAnRuXNnUVxcbPC4\n2NjYcm2ffvqpmDBhghBCBv1r164JjUYjrl+/LjZu3CgCAwMrvO7evXvFkCFDtK+joqLEuHHjhBBC\nrF27VowePVoIIcRff/0lWrVqpT1uy5YtIicnRwghxMcffyxeffVVkZ+fL4qKioQQclagoKBAbN26\nVTz++ONizpw5Ij4+vtK+lMrPzxfdu3fXnt9YZ8+eFcHBwUKj0VT5M5YO3EZvMmLPVCoVoqKiMG3a\nNERFRUGlUtm6S0TkRD755BPUrVsXM2fOxOzZs7Fx40a9sqeW8sYbb6B169aYP38+tmzZglq1ahk8\nbsOGDbh69ar2dUFBATZt2oS33noL169fh1KpRLNmzbBhwwYUFBSgU6dO2uxrABBC6FV6S0pKQo8e\nPQAA165dw/fff4958+YBAK5fv65NODt9+jRat26tPUdWVpZ2I5Avv/wSY8eOxerVqwHI6mely9SG\nDRuGl19+Gd7e3vD19a20L6Xq1q2LVatWYdKkSUavv1ar1Xj11Vfx1Vdf2dUmWTVuk5HS5RZFRUXa\nNqVSiejoaAQHB5t8fiKqGDcZsX+XLl3C2rVrtcleBQUFyM7OxtSpU+Hr64uSkhKMGjUKQ4YMQZs2\nbfD4448DkMl2CoUCzZo1w507dxAeHq4tNjNgwAD06dMHXbp0wS+//IIJEyage/fuAIDMzEzMmDED\ngwYNgkKhwIEDB/DII49ArVbjueeeQ5MmTQAAU6dORY8ePdCpUyf0798f+fn5WL58Oby8vHDnzh3k\n5+drE84q68u9EhMTcebMGaP25X777bcRHh6ulyxXFXa7H7e5meuGj4qKQnJycrl2X19fLF682OTz\nE1HFGLidT2FhIdq0aYPMzEy7GpXakt3ux22v1Gp1tdqJiMh4v/zyC7p168agbUU1LnCXffZRlXYi\nIjLOH3/8gXfeeQfXr1+3+P7ipFPjpsr5jJvIdjhVTsRn3EZRqVSIj4+HWq2Gu7s7IiIiGLSJrICB\nm4iBm4gcCO9jIianERERURkM3ERERA6Eu4NZGJ+3ExGROfEZtwUxw52cTU28j4mqi8+4HVh8fLxe\n0AaAoqIixMfH26hHRETk6Bi4LYhV3IiIyNwYuC2IVdyIiMjcGLgtKCIiAkqlUq9NqVQiIiLCRj0i\nIiJHx+Q0C2NWOTmTJk2a4MaNG7buBpFNeXh4ICcn577HsXIaERGRA2FWORERkRNg4CYiInIgDNxE\nREQOhIGbiIjIgRgduHNychAWFgZfX188+eSTuHnzpsHjfHx80KNHD/Ts2ZPZ1DVUUlKSrbtAJuD3\nz7Hx++d8jA7ccXFxCAsLQ3JyMgYMGIC4uDiDxykUCiQlJeHYsWNQqVRGd5TsF39wODZ+/xwbv3/O\nx+jA/d133yEyMhIAEBkZia1bt1Z4LJd5ERERmYfRgTsrKwuenp4AAE9PT2RlZRk8TqFQ4IknnkBg\nYCA+++wzYy9HREREuE8BlrCwMGRmZpZrj42NRWRkpF6FpCZNmhisFHP16lW0atUK165dQ1hYGD76\n6COEhISU74hCYey/gYiIyCEZMyPtWtmbiYmJFb7n6emJzMxMtGzZElevXkWLFi0MHteqVSsAQPPm\nzfHMM89ApVIZDNycTiciIro/o6fKw8PDsXbtWgDA2rVrMXz48HLH3LlzB7du3QIA5Ofn48cff0T3\n7t2NvSQREZHTM7pWeU5ODp577jmkpqbCx8cHmzZtQuPGjZGRkYFJkyZh+/btuHTpEkaMGAEAKC4u\nxpgxYzBnzhyz/gOIiIicirCRTZs2iS5duggXFxdx5MiRCo/bsWOH6NSpk+jYsaOIi4uzYg+pItnZ\n2eKJJ54QDz74oAgLCxM3btwweFy7du1E9+7dRUBAgAgKCrJyL+leVbmXXn31VdGxY0fRo0cPcfTo\nUSv3kCpyv+/dnj17RMOGDUVAQIAICAgQ//nPf2zQSzJk/PjxokWLFqJbt24VHlPd+85mgfvMmTPi\n3LlzIjQ0tMLAXVxcLDp06CAuX74sCgsLhb+/vzh9+rSVe0r3mjlzpliwYIEQQoi4uDgxe/Zsg8f5\n+PiI7Oxsa3aNKlCVe2n79u1i0KBBQgghDh8+LHr37m2LrtI9qvK927Nnjxg6dKiNekiV2bdvnzh6\n9GiFgduY+85mJU/9/Pzg6+tb6TEqlQodO3aEj48PlEolRo0ahW3btlmph1QRruF3PFW5l8p+X3v3\n7o2bN29WuMyTrKeqPwd5r9mnkJAQeHh4VPi+MfedXdcqT09PR5s2bbSvvb29kZ6ebsMeEcA1/I6o\nKveSoWOuXLlitT6SYVX53ikUChw8eBD+/v4YPHgwTp8+be1ukpGMue8qXQ5mqorWgc+fPx9Dhw69\n7+e5ttt2KlvDX5ZCoajw+3TgwAG9Nfx+fn4GlwKS5VX1Xrp31MZ70Paq8j146KGHkJaWhrp162LH\njh0YPnw4kpOTrdA7Mofq3ncWDdyVrQOvCi8vL6SlpWlfp6Wlwdvb29RuURVYcw0/WV5V7qV7j7ly\n5Qq8vLys1kcyrCrfuwYNGmj/PmjQIEydOhU5OTlo0qSJ1fpJxjHmvrOLqfKKns0EBgbi/PnzSElJ\nQWFhIeLj4xEeHm7l3tG9uIbf8VTlXgoPD8e6desAAIcPH0bjxo21j0TIdqryvcvKytL+HFWpVBBC\nMGg7CKPuO/PkzVXfli1bhLe3t3B3dxeenp7iqaeeEkIIkZ6eLgYPHqw97ocffhC+vr6iQ4cOYv78\n+bbqLpWRnZ0tBgwYUG45WNnv3cWLF4W/v7/w9/cXXbt25ffODhi6lz755BPxySefaI+ZNm2a6NCh\ng+jRo0elyzTJuu73vVu2bJno2rWr8Pf3F4888og4dOiQLbtLZYwaNUq0atVKKJVK4e3tLVatWmXy\nfWd0ARYiIiKyPruYKiciIqKq+f/t1QEJAAAAgKD/r9sR6AnFDQAj4gaAEXEDwIi4AWBE3AAwEtDc\nMxXh7LO+AAAAAElFTkSuQmCC\n"
}
],
"prompt_number": 121
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Ridge solution :\n",
"\n",
"$$ \\hat{\\mathbf{w}}_{ols} = (\\mathbf{X}^T \\mathbf{X} + \\underbrace{\\lambda \\mathbf{I}} _ {penalty})^{-1} \\mathbf{X}^T \\mathbf{y}$$\n"
]
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def ridge_regression(X_n_d, y_n, lbda):\n",
" d = 4\n",
" return np.linalg.solve(np.dot(X_n_d.T, X_n_d) + np.diag(np.repeat(lbda, d)), np.dot(X_n_d.T, y_n))\n",
"\n",
"#plt.plot(*f_oracle.linspace(), color=\"b\", ls=\"-\", lw =3, alpha=.7,label=\"$y=f(x)$\")\n",
"plt.plot(x_n, y_n, \"ko\", alpha=.7,label=\"$(y_i)_{i=1,\\ldots,n}$\")\n",
"\n",
"for l, alpha in zip(np.logspace(-1, 3, 10), np.linspace(.5, 0, 10)):\n",
" w_l = ridge_regression(X_n_d, y_n, l)\n",
" ridge_P = Polynomial(coef=w_l, domain=[-1, 1])#'\n",
" plt.plot(*ridge_P.linspace(), color=\"purple\", ls=\"-\", lw=2, alpha=alpha)\n",
"\n",
"plt.plot(*ols_fit_P.linspace(), color=\"purple\", ls=\"-\", lw=2, alpha=.75, label=\"$y=\\hat{f}_{\\lambda=0}(x)$\")\n",
"plt.legend(loc=\"lower right\", prop={'size':20})\n",
"plt.figsize(8, 6)"
],
"language": "python",
"metadata": {},
"outputs": [
{
"ename": "ValueError",
"evalue": "operands could not be broadcast together with shapes (3,3) (4,4) ",
"output_type": "pyerr",
"traceback": [
"\u001b[1;31m---------------------------------------------------------------------------\u001b[0m\n\u001b[1;31mValueError\u001b[0m Traceback (most recent call last)",
"\u001b[1;32m<ipython-input-25-e416320e3b6a>\u001b[0m in \u001b[0;36m<module>\u001b[1;34m()\u001b[0m\n\u001b[0;32m 7\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 8\u001b[0m \u001b[1;32mfor\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha\u001b[0m \u001b[1;32min\u001b[0m \u001b[0mzip\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlogspace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m3\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlinspace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;36m.5\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m0\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m10\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 9\u001b[1;33m \u001b[0mw_l\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mridge_regression\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_n_d\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_n\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0ml\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 10\u001b[0m \u001b[0mridge_P\u001b[0m \u001b[1;33m=\u001b[0m \u001b[0mPolynomial\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mcoef\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0mw_l\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mdomain\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;33m[\u001b[0m\u001b[1;33m-\u001b[0m\u001b[1;36m1\u001b[0m\u001b[1;33m,\u001b[0m \u001b[1;36m1\u001b[0m\u001b[1;33m]\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;31m#'\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 11\u001b[0m \u001b[0mplt\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mplot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m*\u001b[0m\u001b[0mridge_P\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlinspace\u001b[0m\u001b[1;33m(\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mcolor\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"purple\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mls\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;34m\"-\"\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlw\u001b[0m\u001b[1;33m=\u001b[0m\u001b[1;36m2\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0malpha\u001b[0m\u001b[1;33m=\u001b[0m\u001b[0malpha\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;32m<ipython-input-25-e416320e3b6a>\u001b[0m in \u001b[0;36mridge_regression\u001b[1;34m(X_n_d, y_n, lbda)\u001b[0m\n\u001b[0;32m 1\u001b[0m \u001b[1;32mdef\u001b[0m \u001b[0mridge_regression\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_n_d\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_n\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mlbda\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m:\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 2\u001b[0m \u001b[0md\u001b[0m \u001b[1;33m=\u001b[0m \u001b[1;36m4\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[1;32m----> 3\u001b[1;33m \u001b[1;32mreturn\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mlinalg\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0msolve\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_n_d\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mX_n_d\u001b[0m\u001b[1;33m)\u001b[0m \u001b[1;33m+\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdiag\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mrepeat\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mlbda\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0md\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0mnp\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mdot\u001b[0m\u001b[1;33m(\u001b[0m\u001b[0mX_n_d\u001b[0m\u001b[1;33m.\u001b[0m\u001b[0mT\u001b[0m\u001b[1;33m,\u001b[0m \u001b[0my_n\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m)\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0m\u001b[0;32m 4\u001b[0m \u001b[1;33m\u001b[0m\u001b[0m\n\u001b[0;32m 5\u001b[0m \u001b[1;31m#plt.plot(*f_oracle.linspace(), color=\"b\", ls=\"-\", lw =3, alpha=.7,label=\"$y=f(x)$\")\u001b[0m\u001b[1;33m\u001b[0m\u001b[1;33m\u001b[0m\u001b[0m\n",
"\u001b[1;31mValueError\u001b[0m: operands could not be broadcast together with shapes (3,3) (4,4) "
]
},
{
"output_type": "display_data",
"png": "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\ntGjRhO97+d5V9OTqvr4+rVixovS6urpafX19AVYEqfw5/JFIRJ/+9KfV0tKin/3sZ7NZIm5Tzndp\nvDGXLl2atRoxvnKOXSQS0euvv66mpiZt3bpVZ8+ene0y4ZGX792k08H8mmge+LPPPlvWuuU0swXH\n7xx+STp16pSWLVumv/71r0qlUqqvr9eDDz44I/VicuV+l24/a+M7GLxyjsHHP/5x9fb2av78+frd\n736nHTt2yHGcWagO02Gq37sZDe7J5oGXo6qqSr29vaXXvb29qq6u9lsWyuB3Dr8kLVu2TJJ07733\n6nOf+5xs2ya4A1LOd+n2MZcuXVJVVdWs1YjxlXPsPvKRj5R+3rJli77xjW9oaGhIixcvnrU64Y2X\n711FXCqf6N5MS0uLLly4oIsXL2pkZES5XE6tra2zXB1u19raqq6uLklSV1eXduzYMWbMv/71L/3z\nn/+UJF29elVHjx6dtKsSM6uc71Jra2tpcaTTp09r4cKFpVsiCE45x25wcLD0/6ht23Jdl9A2hKfv\n3fT0zU3dr3/9a7e6utqNRqNuLBZzP/OZz7iu67p9fX3u1q1bS+OOHDnixuNxd9WqVe6zzz4bVLm4\nxfvvv+9u3LjRraurc1OplHvlyhXXdUcfu/fee89tampym5qa3NWrV3PsKsB436UXX3zRffHFF0tj\ndu3a5a5atcpds2bNhLM9MPvudOz27dvnrl692m1qanLXr1/vvvHGG0GWi1vs3LnTXbZsmWtZlltd\nXe2+9NJLvr93nldOAwAAs68iLpUDAIDyENwAABiE4AYAwCAENwAABiG4AQAwCMENAIBB/h8hxy2Y\nLiAf5wAAAABJRU5ErkJggg==\n"
}
],
"prompt_number": 25
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"w2_grid, w3_grid = np.meshgrid(np.linspace(-.5, .5, num=100), np.linspace(-.5, .5, num=100))\n",
"\n",
"# fixed w_0 and w_1 to be the OLS ones\n",
"w_0 = w_ols[0]\n",
"w_1 = w_ols[1]\n",
"\n",
"error_grid = np.reshape(\n",
" [np.linalg.norm(np.dot(X_n_d, [w_0, w_1, w2, w3]) - y_n) \n",
" for w2,w3 in zip(w2_grid.ravel(), w3_grid.ravel())], (100, 100))\n",
"penalization_grid = np.reshape(\n",
" [np.linalg.norm([w_0, w_1, w2, w3])\n",
" for w2,w3 in zip(w2_grid.ravel(), w3_grid.ravel())], (100, 100))\n",
"\n",
"f, (ax1, ax2, ax3) = plt.subplots(1,3)\n",
"f.set_size_inches(12, 6)\n",
"\n",
"ax1.contourf(w2_grid, w3_grid, error_grid)\n",
"ax1.vlines(0, -.5, .5, alpha=.5)\n",
"ax1.hlines(0, -.5, .5, alpha=.5)\n",
"\n",
"ax1.scatter(w_ols[2], w_ols[3], marker=\"x\", color=\"k\", alpha=.75, s=80, linewidth=3)\n",
"ax1.text(w_ols[2], w_ols[3], s=\"$ \\ \\hat{w}_{ols}$\", size=18, weight='bold')\n",
"ax1.scatter(w_oracle[2], w_oracle[3], marker=\"x\", color=\"k\", alpha=.75, s=80, linewidth=3);\n",
"ax1.text(w_oracle[2], w_oracle[3], s=\"$w_{oracle} \\ $\", size=18, weight='bold', va='bottom', ha='right');\n",
"ax1.set_xlim(-.5, .5);ax1.set_ylim(-.5, .5)\n",
"\n",
"ax2.contourf(w2_grid, w3_grid, penalization_grid)\n",
"ax2.vlines(0, -.5, .5, alpha=.5)\n",
"ax2.hlines(0, -.5, .5, alpha=.5);\n",
"ax2.scatter(w_oracle[2], w_oracle[3], marker=\"x\", color=\"k\", alpha=.75, s=80, linewidth=3);\n",
"ax2.text(w_oracle[2], w_oracle[3], s=\"$w_{oracle} \\ $\", size=18, weight='bold', va='bottom', ha='right');\n",
"ax2.set_xlim(-.5, .5);ax2.set_ylim(-.5, .5)\n",
"\n",
"ax3.contourf(w2_grid, w3_grid, error_grid + penalization_grid)\n",
"ax3.vlines(0, -.5, .5, alpha=.5)\n",
"ax3.hlines(0, -.5, .5, alpha=.5);\n",
"ax3.scatter(w_oracle[2], w_oracle[3], marker=\"x\", color=\"k\", alpha=.75, s=80, linewidth=3);\n",
"ax3.text(w_oracle[2], w_oracle[3], s=\"$w_{oracle} \\ $\", size=18, weight='bold', va='bottom', ha='right');\n",
"\n",
"w_2_path, w_3_path = zip(*[ridge_regression(X_n_d, y_n, lbda)[2:] for lbda in np.logspace(-2, 3, 100)])\n",
"ax3.plot(w_2_path, w_3_path, 'k', lw=2, ls='--', label='Regularisation path')\n",
"ax3.scatter([0, w_ols[2]], [0, w_ols[3]], marker=\"o\", color=\"k\", alpha=.75, s=25)\n",
"ax3.text(w_ols[2], w_ols[3], s=\"$\\lambda=0$\", size=14, weight='bold')\n",
"ax3.text(0, 0, s=\"$\\lambda=+\\infty$\", size=14, weight='bold')\n",
"\n",
"ax3.set_xlim(-.5, .5);ax3.set_ylim(-.5, .5);\n",
"plt.legend();"
],
"language": "python",
"metadata": {},
"outputs": []
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment