├── requirements.txt ├── README.md ├── .gitignore └── feature_selection.ipynb /requirements.txt: -------------------------------------------------------------------------------- 1 | sklean 2 | xgboost 3 | minepy 4 | numpy 5 | scipy 6 | matplotlib -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Feature selection 2 | [结合Scikit-learn介绍几种常用的特征选择方法](http://blog.csdn.net/u013829973/article/details/79200879) 3 | 4 | 运行环境: 5 | 6 | Python 3.5 7 | 8 | Jupyter 9 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Byte-compiled / optimized / DLL files 2 | __pycache__/ 3 | *.py[cod] 4 | *$py.class 5 | 6 | # C extensions 7 | *.so 8 | 9 | # Distribution / packaging 10 | .Python 11 | env/ 12 | build/ 13 | develop-eggs/ 14 | dist/ 15 | downloads/ 16 | eggs/ 17 | .eggs/ 18 | lib/ 19 | lib64/ 20 | parts/ 21 | sdist/ 22 | var/ 23 | wheels/ 24 | *.egg-info/ 25 | .installed.cfg 26 | *.egg 27 | 28 | # PyInstaller 29 | # Usually these files are written by a python script from a template 30 | # before PyInstaller builds the exe, so as to inject date/other infos into it. 31 | *.manifest 32 | *.spec 33 | 34 | # Installer logs 35 | pip-log.txt 36 | pip-delete-this-directory.txt 37 | 38 | # Unit test / coverage reports 39 | htmlcov/ 40 | .tox/ 41 | .coverage 42 | .coverage.* 43 | .cache 44 | nosetests.xml 45 | coverage.xml 46 | *.cover 47 | .hypothesis/ 48 | 49 | # Translations 50 | *.mo 51 | *.pot 52 | 53 | # Django stuff: 54 | *.log 55 | local_settings.py 56 | 57 | # Flask stuff: 58 | instance/ 59 | .webassets-cache 60 | 61 | # Scrapy stuff: 62 | .scrapy 63 | 64 | # Sphinx documentation 65 | docs/_build/ 66 | 67 | # PyBuilder 68 | target/ 69 | 70 | # Jupyter Notebook 71 | .ipynb_checkpoints 72 | 73 | # pyenv 74 | .python-version 75 | 76 | # celery beat schedule file 77 | celerybeat-schedule 78 | 79 | # SageMath parsed files 80 | *.sage.py 81 | 82 | # dotenv 83 | .env 84 | 85 | # virtualenv 86 | .venv 87 | venv/ 88 | ENV/ 89 | 90 | # Spyder project settings 91 | .spyderproject 92 | .spyproject 93 | 94 | # Rope project settings 95 | .ropeproject 96 | 97 | # mkdocs documentation 98 | /site 99 | 100 | # mypy 101 | .mypy_cache/ 102 | -------------------------------------------------------------------------------- /feature_selection.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "metadata": {}, 6 | "source": [ 7 | "# 1 去掉取值变化小的特征 (Removing features with low variance)" 8 | ] 9 | }, 10 | { 11 | "cell_type": "code", 12 | "execution_count": 1, 13 | "metadata": { 14 | "collapsed": false 15 | }, 16 | "outputs": [ 17 | { 18 | "data": { 19 | "text/plain": [ 20 | "array([[0, 1],\n", 21 | " [1, 0],\n", 22 | " [0, 0],\n", 23 | " [1, 1],\n", 24 | " [1, 0],\n", 25 | " [1, 1]])" 26 | ] 27 | }, 28 | "execution_count": 1, 29 | "metadata": {}, 30 | "output_type": "execute_result" 31 | } 32 | ], 33 | "source": [ 34 | "from sklearn.feature_selection import VarianceThreshold\n", 35 | "X = [[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]\n", 36 | "sel = VarianceThreshold(threshold=(.8 * (1 - .8)))\n", 37 | "sel.fit_transform(X)" 38 | ] 39 | }, 40 | { 41 | "cell_type": "markdown", 42 | "metadata": {}, 43 | "source": [ 44 | "# 2 单变量特征选择 (Univariate feature selection)\n", 45 | "## 2.1 Pearson相关系数" 46 | ] 47 | }, 48 | { 49 | "cell_type": "code", 50 | "execution_count": 2, 51 | "metadata": { 52 | "collapsed": false 53 | }, 54 | "outputs": [ 55 | { 56 | "name": "stdout", 57 | "output_type": "stream", 58 | "text": [ 59 | "Lower noise (0.71824836862138408, 7.3240173129983507e-49)\n", 60 | "Higher noise (0.057964292079338155, 0.31700993885324752)\n" 61 | ] 62 | } 63 | ], 64 | "source": [ 65 | "import numpy as np\n", 66 | "from scipy.stats import pearsonr\n", 67 | "np.random.seed(0)\n", 68 | "size = 300\n", 69 | "x = np.random.normal(0, 1, size)\n", 70 | "print( \"Lower noise\", pearsonr(x, x + np.random.normal(0, 1, size)))\n", 71 | "print( \"Higher noise\", pearsonr(x, x + np.random.normal(0, 10, size)))" 72 | ] 73 | }, 74 | { 75 | "cell_type": "code", 76 | "execution_count": 3, 77 | "metadata": { 78 | "collapsed": false 79 | }, 80 | "outputs": [ 81 | { 82 | "name": "stdout", 83 | "output_type": "stream", 84 | "text": [ 85 | "-0.00230804707612\n" 86 | ] 87 | } 88 | ], 89 | "source": [ 90 | "x1 = np.random.uniform(-1, 1, 100000) \n", 91 | "print( pearsonr(x1, x1**2)[0]) " 92 | ] 93 | }, 94 | { 95 | "cell_type": "markdown", 96 | "metadata": {}, 97 | "source": [ 98 | "## 2.2 互信息和最大信息系数" 99 | ] 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": 4, 104 | "metadata": { 105 | "collapsed": false 106 | }, 107 | "outputs": [ 108 | { 109 | "name": "stdout", 110 | "output_type": "stream", 111 | "text": [ 112 | "1.0000000000000009\n" 113 | ] 114 | } 115 | ], 116 | "source": [ 117 | "from minepy import MINE \n", 118 | "m = MINE() \n", 119 | "x = np.random.uniform(-1, 1, 10000) \n", 120 | "m.compute_score(x, x**2) \n", 121 | "print( m.mic()) " 122 | ] 123 | }, 124 | { 125 | "cell_type": "markdown", 126 | "metadata": {}, 127 | "source": [ 128 | "## 2.4 基于学习模型的特征排序 (Model based ranking)" 129 | ] 130 | }, 131 | { 132 | "cell_type": "code", 133 | "execution_count": 5, 134 | "metadata": { 135 | "collapsed": false 136 | }, 137 | "outputs": [ 138 | { 139 | "name": "stderr", 140 | "output_type": "stream", 141 | "text": [ 142 | "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\cross_validation.py:41: DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20.\n", 143 | " \"This module will be removed in 0.20.\", DeprecationWarning)\n" 144 | ] 145 | }, 146 | { 147 | "data": { 148 | "text/plain": [ 149 | "[(0.60999999999999999, 'LSTAT'),\n", 150 | " (0.44800000000000001, 'RM'),\n", 151 | " (0.35599999999999998, 'NOX'),\n", 152 | " (0.309, 'INDUS'),\n", 153 | " (0.28899999999999998, 'PTRATIO'),\n", 154 | " (0.23999999999999999, 'TAX'),\n", 155 | " (0.23100000000000001, 'ZN'),\n", 156 | " (0.19900000000000001, 'CRIM'),\n", 157 | " (0.19, 'RAD'),\n", 158 | " (0.11600000000000001, 'B'),\n", 159 | " (0.091999999999999998, 'AGE'),\n", 160 | " (0.048000000000000001, 'DIS'),\n", 161 | " (0.010999999999999999, 'CHAS')]" 162 | ] 163 | }, 164 | "execution_count": 5, 165 | "metadata": {}, 166 | "output_type": "execute_result" 167 | } 168 | ], 169 | "source": [ 170 | "from sklearn.cross_validation import cross_val_score, ShuffleSplit \n", 171 | "from sklearn.datasets import load_boston \n", 172 | "from sklearn.ensemble import RandomForestRegressor \n", 173 | " \n", 174 | "#Load boston housing dataset as an example \n", 175 | "boston = load_boston() \n", 176 | "X = boston[\"data\"] \n", 177 | "Y = boston[\"target\"] \n", 178 | "names = boston[\"feature_names\"] \n", 179 | " \n", 180 | "rf = RandomForestRegressor(n_estimators=20, max_depth=4) \n", 181 | "scores = [] \n", 182 | "for i in range(X.shape[1]): \n", 183 | " score = cross_val_score(rf, X[:, i:i+1], Y, scoring=\"r2\",cv=ShuffleSplit(len(X), 3, .3)) \n", 184 | " scores.append((round(np.mean(score), 3), names[i])) \n", 185 | "#print (sorted(scores, reverse=True) ) \n", 186 | "sorted(scores, reverse=True)" 187 | ] 188 | }, 189 | { 190 | "cell_type": "markdown", 191 | "metadata": {}, 192 | "source": [ 193 | "# 3 线性模型和正则化" 194 | ] 195 | }, 196 | { 197 | "cell_type": "markdown", 198 | "metadata": {}, 199 | "source": [ 200 | "## 3.1 线性模型" 201 | ] 202 | }, 203 | { 204 | "cell_type": "code", 205 | "execution_count": 6, 206 | "metadata": { 207 | "collapsed": false 208 | }, 209 | "outputs": [ 210 | { 211 | "name": "stdout", 212 | "output_type": "stream", 213 | "text": [ 214 | "Linear model: 0.984 * X0 + 1.995 * X1 + -0.041 * X2\n" 215 | ] 216 | } 217 | ], 218 | "source": [ 219 | "from sklearn.linear_model import LinearRegression \n", 220 | "import numpy as np \n", 221 | " \n", 222 | "np.random.seed(0) \n", 223 | "size = 5000 \n", 224 | " \n", 225 | "#A dataset with 3 features \n", 226 | "X = np.random.normal(0, 1, (size, 3)) \n", 227 | "#Y = X0 + 2*X1 + noise \n", 228 | "Y = X[:,0] + 2*X[:,1] + np.random.normal(0, 2, size) \n", 229 | "lr = LinearRegression() \n", 230 | "lr.fit(X, Y) \n", 231 | " \n", 232 | "#A helper method for pretty-printing linear models \n", 233 | "def pretty_print_linear(coefs, names = None, sort = False): \n", 234 | " if names == None: \n", 235 | " names = [\"X%s\" % x for x in range(len(coefs))] \n", 236 | " lst = zip(coefs, names) \n", 237 | " if sort: \n", 238 | " lst = sorted(lst, key = lambda x:-np.abs(x[0])) \n", 239 | " return \" + \".join(\"%s * %s\" % (round(coef, 3), name) \n", 240 | " for coef, name in lst) \n", 241 | " \n", 242 | "print (\"Linear model:\", pretty_print_linear(lr.coef_)) " 243 | ] 244 | }, 245 | { 246 | "cell_type": "code", 247 | "execution_count": 7, 248 | "metadata": { 249 | "collapsed": false 250 | }, 251 | "outputs": [ 252 | { 253 | "name": "stdout", 254 | "output_type": "stream", 255 | "text": [ 256 | "Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2\n" 257 | ] 258 | } 259 | ], 260 | "source": [ 261 | "size = 100 \n", 262 | "np.random.seed(seed=5) \n", 263 | " \n", 264 | "X_seed = np.random.normal(0, 1, size) \n", 265 | "X1 = X_seed + np.random.normal(0, .1, size) \n", 266 | "X2 = X_seed + np.random.normal(0, .1, size) \n", 267 | "X3 = X_seed + np.random.normal(0, .1, size) \n", 268 | " \n", 269 | "Y = X1 + X2 + X3 + np.random.normal(0,1, size) \n", 270 | "X = np.array([X1, X2, X3]).T \n", 271 | " \n", 272 | "lr = LinearRegression() \n", 273 | "lr.fit(X,Y) \n", 274 | "print (\"Linear model:\", pretty_print_linear(lr.coef_))" 275 | ] 276 | }, 277 | { 278 | "cell_type": "markdown", 279 | "metadata": {}, 280 | "source": [ 281 | "## 3.2 正则化\n", 282 | "### 3.2.1 L1正则化/Lasso" 283 | ] 284 | }, 285 | { 286 | "cell_type": "code", 287 | "execution_count": 8, 288 | "metadata": { 289 | "collapsed": false 290 | }, 291 | "outputs": [ 292 | { 293 | "name": "stdout", 294 | "output_type": "stream", 295 | "text": [ 296 | "Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO + -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM + 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX\n" 297 | ] 298 | } 299 | ], 300 | "source": [ 301 | "from sklearn.linear_model import Lasso \n", 302 | "from sklearn.preprocessing import StandardScaler \n", 303 | "from sklearn.datasets import load_boston \n", 304 | " \n", 305 | "boston = load_boston() \n", 306 | "scaler = StandardScaler() \n", 307 | "X = scaler.fit_transform(boston[\"data\"]) \n", 308 | "Y = boston[\"target\"] \n", 309 | "names = boston[\"feature_names\"] \n", 310 | " \n", 311 | "lasso = Lasso(alpha=.3) \n", 312 | "lasso.fit(X, Y) \n", 313 | " \n", 314 | "print(\"Lasso model: \", pretty_print_linear(lasso.coef_, list(names), sort = True)) \n" 315 | ] 316 | }, 317 | { 318 | "cell_type": "markdown", 319 | "metadata": {}, 320 | "source": [ 321 | "### 3.2.2 L2正则化/Ridge regression" 322 | ] 323 | }, 324 | { 325 | "cell_type": "code", 326 | "execution_count": 9, 327 | "metadata": { 328 | "collapsed": false 329 | }, 330 | "outputs": [ 331 | { 332 | "name": "stdout", 333 | "output_type": "stream", 334 | "text": [ 335 | "Random seed 0\n", 336 | "Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2\n", 337 | "Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2\n", 338 | "Random seed 1\n", 339 | "Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2\n", 340 | "Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2\n", 341 | "Random seed 2\n", 342 | "Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2\n", 343 | "Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2\n", 344 | "Random seed 3\n", 345 | "Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2\n", 346 | "Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2\n", 347 | "Random seed 4\n", 348 | "Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2\n", 349 | "Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2\n", 350 | "Random seed 5\n", 351 | "Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2\n", 352 | "Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2\n", 353 | "Random seed 6\n", 354 | "Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2\n", 355 | "Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2\n", 356 | "Random seed 7\n", 357 | "Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2\n", 358 | "Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2\n", 359 | "Random seed 8\n", 360 | "Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2\n", 361 | "Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2\n", 362 | "Random seed 9\n", 363 | "Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2\n", 364 | "Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2\n" 365 | ] 366 | } 367 | ], 368 | "source": [ 369 | "from sklearn.linear_model import Ridge \n", 370 | "from sklearn.metrics import r2_score \n", 371 | "size = 100 \n", 372 | " \n", 373 | "#We run the method 10 times with different random seeds \n", 374 | "for i in range(10): \n", 375 | " print(\"Random seed %s\" % i) \n", 376 | " np.random.seed(seed=i) \n", 377 | " X_seed = np.random.normal(0, 1, size) \n", 378 | " X1 = X_seed + np.random.normal(0, .1, size) \n", 379 | " X2 = X_seed + np.random.normal(0, .1, size) \n", 380 | " X3 = X_seed + np.random.normal(0, .1, size) \n", 381 | " Y = X1 + X2 + X3 + np.random.normal(0, 1, size) \n", 382 | " X = np.array([X1, X2, X3]).T \n", 383 | " \n", 384 | " \n", 385 | " lr = LinearRegression() \n", 386 | " lr.fit(X,Y) \n", 387 | " print (\"Linear model:\", pretty_print_linear(lr.coef_))\n", 388 | " \n", 389 | " ridge = Ridge(alpha=10) \n", 390 | " ridge.fit(X,Y) \n", 391 | " print(\"Ridge model:\", pretty_print_linear(ridge.coef_)) " 392 | ] 393 | }, 394 | { 395 | "cell_type": "markdown", 396 | "metadata": {}, 397 | "source": [ 398 | "### 3.2.3 弹性网络/Elastic Net " 399 | ] 400 | }, 401 | { 402 | "cell_type": "code", 403 | "execution_count": 10, 404 | "metadata": { 405 | "collapsed": false 406 | }, 407 | "outputs": [ 408 | { 409 | "name": "stdout", 410 | "output_type": "stream", 411 | "text": [ 412 | "Lasso(alpha=0.1, copy_X=True, fit_intercept=True, max_iter=1000,\n", 413 | " normalize=False, positive=False, precompute=False, random_state=None,\n", 414 | " selection='cyclic', tol=0.0001, warm_start=False)\n", 415 | "r^2 on test data : 0.385982\n", 416 | "ElasticNet(alpha=0.1, copy_X=True, fit_intercept=True, l1_ratio=0.7,\n", 417 | " max_iter=1000, normalize=False, positive=False, precompute=False,\n", 418 | " random_state=None, selection='cyclic', tol=0.0001, warm_start=False)\n", 419 | "r^2 on test data : 0.240498\n" 420 | ] 421 | }, 422 | { 423 | "data": { 424 | "image/png": "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\nXG55jx8/jqZpzJs3j/fff5/o6Gh8fHy44447+P5714lUDh48yAMPPEDTpk0xGo306NGDtWvX2ren\npaXx4IMPAhAfH28vd2Vt/wcPHuTBBx8kNDQUk8nELbfc4vLLf/fu3QwcOJCAgAD8/Py455572LZt\nm8u+srKymDRpEm3atMHHx4d27drxxhtv2G+stv4I6enpfP755/Yy2pqiAN5++22nz3zLli1u+zBs\n27aNQYMG0aRJE3x9fbn11ltZuHChfXt5fRiWLVtG9+7dMZlMNG3alKSkJE6edK7yj4+Pp2vXruzf\nv5++fftiNptp3bo1c+fOtefZunUrd9xxB0IIRo0aZS/z0qVLATh8+DDDhg2jRYsWGI1GwsLCSEpK\n4sqVKxWeD0djxnzGqlUHMBoNVX6NotSlixfzSUv7gczMPMxmL5o1863rInmUCt3roaysLC5cuOCU\nJoSgSZPyF0fZsWMH3333HUlJSbRu3Zr09HQWLVpE37592bdvHz4+PgDMnDmTOXPmMHbsWHr06EF2\ndjbff/89u3btol+/fjz99NOcPn2ar776io8++qjSX5Fnzpyx7+epp56iQ4cOnDp1ihUrVpCXl4e/\nv3+Fr//oo4/Iycnh6aefRgjBH//4R4YNG8bRo0ftN829e/fSq1cvWrduzbRp0zCbzXzyySckJiay\natUq7r//fnr37s3EiRN56623mD59OrfccgtAhVOI//TTT8TFxeHt7c1TTz1F27ZtOXLkCJ9//jmv\nvfYaYG3m6N27NwEBAbzwwgvo9XpSU1OJj4/n66+/pkePHoC1qaZ3796cOXOGp59+mrCwML755hum\nTZvG2bNnmTdvHjExMSxbtoxJkyYRFhbG1KlTAbjttttYtmwZjzzyCP379+exxx5zOu9la002btzI\n4MGDadmyJZMmTaJ58+bs37+ff/3rX0ycOLHc182aNYsZM2YwYsQIxowZQ0ZGBgsXLqRPnz7s3r3b\nfq6EEFy8eJGBAwcydOhQRowYwYoVK3jhhRfo2rUrAwYMICYmhldeeYUZM2bw1FNPERcXB8Cdd95J\nUVER/fv3p6ioiIkTJ9K8eXNOnTrF559/zuXLl/Hz86vwb8Jm1aoDXLyYT3T0jS8KpCi14dSpbEaN\nWsN33z1BcLCprovjeVLKevMAbgfkzp07pTs7d+6UFW1v6JYsWSKFEG4fRqPRKa8QQqakpNifFxQU\n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\ntnN56dKlSo/3yiuvkJiYSPv27encuTMJCQk8+uijdOnSpVrlVhTFvXPncvnkk71Mn967roviUY0+\nYHjqqViGDOlQ7nYfn8o/gn/+czgFBcUu6S1a+N5Q2W6U0Vg7Y3zLGwUgrc1IgLVD4ejRoxk6dCh/\n+MMfCA0NRafTMXv2bKeaiLpgsVjQNI0vv/zSbQDi61u359FisXaOevbZZ+19QsoqG+xU5ZyUJy4u\njiNHjrBmzRo2bNjA4sWLmT9/PqmpqdWehEpRFFcDBkQxbFhM5RkbmEYfMLRo4UeLFn43tI+OHUM8\nVJryhYSEYDKZOHjwoMu2/fv3o2may6/KqrA1bxw+fNipqePixYtV+jVaVStXriQqKooVK1Y4pc+Y\nMeO69hcVFcX27dspKSkp9+bYtm1bNm3aRG5urlMtw/79+4FrNTBRUVFIKQkPD3dby+BJUVFR7Nmz\np1qvsdXAGAwG+0gGT6iouSowMJCRI0cycuRI8vLyiIuLIzk5WQUMiuIBX375SF0XoUY0+j4MDYWm\nafTv3581a9Y4DYk8d+4cy5cvJy4u7rp+Cffr1w+dTsc777zjlP7WW2/dcJkdubupb9u2jW+//fa6\n9jds2DAyMjJ4++23y80zaNAgiouLXfLMnz8fTdNISEgAYOjQoWiaRkpKitv92IY7esKwYcP48ccf\nWbNmTZVfExISQnx8PKmpqZw9e9Zlu+Nwyeowm81cvnzZJb3s+zWZTERHR7sdNaMoimLT6GsYGpLX\nXnuNr776irvuuotx48ah0+l47733KCws5I033nDKW5WqZ4DQ0FB+//vfM2/ePO6//34SEhL48ccf\nWbduHSEhIS6/Qqu637Luu+8+Vq1aRWJiIvfeey9Hjx4lNTWVTp06OXXWrKrHHnuMpUuXMmXKFLZt\n20ZcXBw5OTls2rSJZ555hsGDBzN48GD69u3LSy+9xLFjx+zDKteuXWufBwGsv+Bfe+01XnzxRY4d\nO0ZiYiJ+fn4cPXqU1atX89RTTzFlypTret9lPffcc6xYsYLhw4czevRoYmNjuXDhAmvXriU1NbXc\nfgJ/+ctfiIuLo0uXLowZM4bIyEjOnTvHt99+y6lTp9i9e7c9b3nnqGx6bGws7777LrNmzSI6OprQ\n0FD69u1Lx44diY+PJzY2liZNmrBjxw5WrFjBxIkTPfIZKIrSOKmAoR7p2LEj//nPf5g2bRpz5szB\n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\nrkJggg==\n", 425 | "text/plain": [ 426 | "" 427 | ] 428 | }, 429 | "metadata": {}, 430 | "output_type": "display_data" 431 | } 432 | ], 433 | "source": [ 434 | "import numpy as np\n", 435 | "import matplotlib.pyplot as plt\n", 436 | "\n", 437 | "from sklearn.metrics import r2_score\n", 438 | "\n", 439 | "# #############################################################################\n", 440 | "# Generate some sparse data to play with\n", 441 | "np.random.seed(42)\n", 442 | "\n", 443 | "n_samples, n_features = 50, 200\n", 444 | "X = np.random.randn(n_samples, n_features)\n", 445 | "coef = 3 * np.random.randn(n_features)\n", 446 | "inds = np.arange(n_features)\n", 447 | "np.random.shuffle(inds)\n", 448 | "coef[inds[10:]] = 0 # sparsify coef\n", 449 | "y = np.dot(X, coef)\n", 450 | "\n", 451 | "# add noise\n", 452 | "y += 0.01 * np.random.normal(size=n_samples)\n", 453 | "\n", 454 | "# Split data in train set and test set\n", 455 | "n_samples = X.shape[0]\n", 456 | "X_train, y_train = X[:n_samples // 2], y[:n_samples // 2]\n", 457 | "X_test, y_test = X[n_samples // 2:], y[n_samples // 2:]\n", 458 | "\n", 459 | "# #############################################################################\n", 460 | "# Lasso\n", 461 | "from sklearn.linear_model import Lasso\n", 462 | "\n", 463 | "alpha = 0.1\n", 464 | "lasso = Lasso(alpha=alpha)\n", 465 | "\n", 466 | "y_pred_lasso = lasso.fit(X_train, y_train).predict(X_test)\n", 467 | "r2_score_lasso = r2_score(y_test, y_pred_lasso)\n", 468 | "print(lasso)\n", 469 | "print(\"r^2 on test data : %f\" % r2_score_lasso)\n", 470 | "\n", 471 | "# #############################################################################\n", 472 | "# ElasticNet\n", 473 | "from sklearn.linear_model import ElasticNet\n", 474 | "\n", 475 | "enet = ElasticNet(alpha=alpha, l1_ratio=0.7)\n", 476 | "\n", 477 | "y_pred_enet = enet.fit(X_train, y_train).predict(X_test)\n", 478 | "r2_score_enet = r2_score(y_test, y_pred_enet)\n", 479 | "print(enet)\n", 480 | "print(\"r^2 on test data : %f\" % r2_score_enet)\n", 481 | "\n", 482 | "plt.plot(enet.coef_, color='lightgreen', linewidth=2,\n", 483 | " label='Elastic net coefficients')\n", 484 | "plt.plot(lasso.coef_, color='gold', linewidth=2,\n", 485 | " label='Lasso coefficients')\n", 486 | "plt.plot(coef, '--', color='navy', label='original coefficients')\n", 487 | "plt.legend(loc='best')\n", 488 | "plt.title(\"Lasso R^2: %f, Elastic Net R^2: %f\"\n", 489 | " % (r2_score_lasso, r2_score_enet))\n", 490 | "plt.show()" 491 | ] 492 | }, 493 | { 494 | "cell_type": "markdown", 495 | "metadata": {}, 496 | "source": [ 497 | "# 4 随机森林\n", 498 | "## 4.1平均不纯度减少 mean decrease impurity" 499 | ] 500 | }, 501 | { 502 | "cell_type": "code", 503 | "execution_count": 11, 504 | "metadata": { 505 | "collapsed": false 506 | }, 507 | "outputs": [ 508 | { 509 | "name": "stdout", 510 | "output_type": "stream", 511 | "text": [ 512 | "Features sorted by their score:\n", 513 | "[(0.41760000000000003, 'RM'), (0.38159999999999999, 'LSTAT'), (0.058500000000000003, 'DIS'), (0.043900000000000002, 'CRIM'), (0.028899999999999999, 'NOX'), (0.0155, 'TAX'), (0.0137, 'B'), (0.0137, 'AGE'), (0.013299999999999999, 'PTRATIO'), (0.0074000000000000003, 'INDUS'), (0.0038, 'RAD'), (0.0011000000000000001, 'ZN'), (0.001, 'CHAS')]\n" 514 | ] 515 | } 516 | ], 517 | "source": [ 518 | "from sklearn.datasets import load_boston \n", 519 | "from sklearn.ensemble import RandomForestRegressor \n", 520 | "import numpy as np \n", 521 | "#Load boston housing dataset as an example \n", 522 | "boston = load_boston() \n", 523 | "X = boston[\"data\"] \n", 524 | "Y = boston[\"target\"] \n", 525 | "names = boston[\"feature_names\"] \n", 526 | "rf = RandomForestRegressor() \n", 527 | "rf.fit(X, Y) \n", 528 | "print (\"Features sorted by their score:\") \n", 529 | "print (sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names),reverse=True)) " 530 | ] 531 | }, 532 | { 533 | "cell_type": "code", 534 | "execution_count": 12, 535 | "metadata": { 536 | "collapsed": false 537 | }, 538 | "outputs": [ 539 | { 540 | "name": "stdout", 541 | "output_type": "stream", 542 | "text": [ 543 | "Scores for X0, X1, X2: [0.27200000000000002, 0.54800000000000004, 0.17899999999999999]\n" 544 | ] 545 | } 546 | ], 547 | "source": [ 548 | "size = 10000 \n", 549 | "np.random.seed(seed=10) \n", 550 | "X_seed = np.random.normal(0, 1, size) \n", 551 | "X0 = X_seed + np.random.normal(0, .1, size) \n", 552 | "X1 = X_seed + np.random.normal(0, .1, size) \n", 553 | "X2 = X_seed + np.random.normal(0, .1, size) \n", 554 | "X = np.array([X0, X1, X2]).T \n", 555 | "Y = X0 + X1 + X2 \n", 556 | " \n", 557 | "rf = RandomForestRegressor(n_estimators=20, max_features=2) \n", 558 | "rf.fit(X, Y)\n", 559 | "print (\"Scores for X0, X1, X2:\", list(map(lambda x:round (x,3), rf.feature_importances_)) ) \n" 560 | ] 561 | }, 562 | { 563 | "cell_type": "markdown", 564 | "metadata": {}, 565 | "source": [ 566 | "## 4.2 平均精确率减少(Mean decrease accuracy)" 567 | ] 568 | }, 569 | { 570 | "cell_type": "code", 571 | "execution_count": 13, 572 | "metadata": { 573 | "collapsed": false 574 | }, 575 | "outputs": [ 576 | { 577 | "name": "stdout", 578 | "output_type": "stream", 579 | "text": [ 580 | "Features sorted by their score:\n", 581 | "[(0.73109999999999997, 'LSTAT'), (0.57089999999999996, 'RM'), (0.087999999999999995, 'DIS'), (0.0385, 'NOX'), (0.036600000000000001, 'CRIM'), (0.023400000000000001, 'PTRATIO'), (0.017100000000000001, 'TAX'), (0.0129, 'AGE'), (0.0047000000000000002, 'B'), (0.0044999999999999997, 'INDUS'), (0.0035000000000000001, 'RAD'), (0.0001, 'ZN'), (-0.0001, 'CHAS')]\n" 582 | ] 583 | } 584 | ], 585 | "source": [ 586 | "from sklearn.cross_validation import ShuffleSplit \n", 587 | "from sklearn.metrics import r2_score \n", 588 | "from collections import defaultdict \n", 589 | " \n", 590 | "X = boston[\"data\"] \n", 591 | "Y = boston[\"target\"] \n", 592 | " \n", 593 | "rf = RandomForestRegressor() \n", 594 | "scores = defaultdict(list) \n", 595 | " \n", 596 | "#crossvalidate the scores on a number of different random splits of the data \n", 597 | "for train_idx, test_idx in ShuffleSplit(len(X), 100, .3): \n", 598 | " X_train, X_test = X[train_idx], X[test_idx] \n", 599 | " Y_train, Y_test = Y[train_idx], Y[test_idx] \n", 600 | " r = rf.fit(X_train, Y_train) \n", 601 | " acc = r2_score(Y_test, rf.predict(X_test)) \n", 602 | " for i in range(X.shape[1]): \n", 603 | " X_t = X_test.copy() \n", 604 | " np.random.shuffle(X_t[:, i]) \n", 605 | " shuff_acc = r2_score(Y_test, rf.predict(X_t)) \n", 606 | " scores[names[i]].append((acc-shuff_acc)/acc) \n", 607 | "print (\"Features sorted by their score:\") \n", 608 | "print (sorted([(round(np.mean(score), 4), feat) for feat, score in scores.items()], reverse=True)) " 609 | ] 610 | }, 611 | { 612 | "cell_type": "markdown", 613 | "metadata": {}, 614 | "source": [ 615 | "# 5 基于xgboost特征重要性" 616 | ] 617 | }, 618 | { 619 | "cell_type": "code", 620 | "execution_count": 14, 621 | "metadata": { 622 | "collapsed": false, 623 | "scrolled": false 624 | }, 625 | "outputs": [ 626 | { 627 | "name": "stdout", 628 | "output_type": "stream", 629 | "text": [ 630 | "num_boost_rounds=200\n", 631 | "\n", 632 | "Training XGBoost ...\n", 633 | "[0]\ttrain-rmse:21.594\n", 634 | "Will train until train-rmse hasn't improved in 30 rounds.\n", 635 | "[1]\ttrain-rmse:19.5392\n", 636 | "[2]\ttrain-rmse:17.6901\n", 637 | "[3]\ttrain-rmse:16.0223\n", 638 | "[4]\ttrain-rmse:14.5219\n", 639 | "[5]\ttrain-rmse:13.1747\n", 640 | "[6]\ttrain-rmse:11.9558\n", 641 | "[7]\ttrain-rmse:10.8646\n", 642 | "[8]\ttrain-rmse:9.8802\n", 643 | "[9]\ttrain-rmse:8.99173\n", 644 | "[10]\ttrain-rmse:8.18644\n", 645 | "[11]\ttrain-rmse:7.46428\n", 646 | "[12]\ttrain-rmse:6.81289\n", 647 | "[13]\ttrain-rmse:6.22336\n", 648 | "[14]\ttrain-rmse:5.69471\n", 649 | "[15]\ttrain-rmse:5.21483\n", 650 | "[16]\ttrain-rmse:4.78178\n", 651 | "[17]\ttrain-rmse:4.39295\n", 652 | "[18]\ttrain-rmse:4.04741\n", 653 | "[19]\ttrain-rmse:3.73251\n", 654 | "[20]\ttrain-rmse:3.44781\n", 655 | "[21]\ttrain-rmse:3.19517\n", 656 | "[22]\ttrain-rmse:2.95854\n", 657 | "[23]\ttrain-rmse:2.75003\n", 658 | "[24]\ttrain-rmse:2.56302\n", 659 | "[25]\ttrain-rmse:2.39463\n", 660 | "[26]\ttrain-rmse:2.24377\n", 661 | "[27]\ttrain-rmse:2.11268\n", 662 | "[28]\ttrain-rmse:1.99532\n", 663 | "[29]\ttrain-rmse:1.89\n", 664 | "[30]\ttrain-rmse:1.79914\n", 665 | "[31]\ttrain-rmse:1.70975\n", 666 | "[32]\ttrain-rmse:1.62599\n", 667 | "[33]\ttrain-rmse:1.55156\n", 668 | "[34]\ttrain-rmse:1.48865\n", 669 | "[35]\ttrain-rmse:1.43152\n", 670 | "[36]\ttrain-rmse:1.37975\n", 671 | "[37]\ttrain-rmse:1.33545\n", 672 | "[38]\ttrain-rmse:1.29175\n", 673 | "[39]\ttrain-rmse:1.24808\n", 674 | "[40]\ttrain-rmse:1.21941\n", 675 | "[41]\ttrain-rmse:1.19062\n", 676 | "[42]\ttrain-rmse:1.15888\n", 677 | "[43]\ttrain-rmse:1.13093\n", 678 | "[44]\ttrain-rmse:1.10734\n", 679 | "[45]\ttrain-rmse:1.0809\n", 680 | "[46]\ttrain-rmse:1.06173\n", 681 | "[47]\ttrain-rmse:1.03877\n", 682 | "[48]\ttrain-rmse:1.01773\n", 683 | "[49]\ttrain-rmse:1.0046\n", 684 | "[50]\ttrain-rmse:0.988095\n", 685 | "[51]\ttrain-rmse:0.969424\n", 686 | "[52]\ttrain-rmse:0.95899\n", 687 | "[53]\ttrain-rmse:0.948933\n", 688 | "[54]\ttrain-rmse:0.936273\n", 689 | "[55]\ttrain-rmse:0.924288\n", 690 | "[56]\ttrain-rmse:0.910215\n", 691 | "[57]\ttrain-rmse:0.896837\n", 692 | "[58]\ttrain-rmse:0.891086\n", 693 | "[59]\ttrain-rmse:0.877581\n", 694 | "[60]\ttrain-rmse:0.870049\n", 695 | "[61]\ttrain-rmse:0.855703\n", 696 | "[62]\ttrain-rmse:0.848058\n", 697 | "[63]\ttrain-rmse:0.838991\n", 698 | "[64]\ttrain-rmse:0.830499\n", 699 | "[65]\ttrain-rmse:0.816549\n", 700 | "[66]\ttrain-rmse:0.806335\n", 701 | "[67]\ttrain-rmse:0.791328\n", 702 | "[68]\ttrain-rmse:0.774775\n", 703 | "[69]\ttrain-rmse:0.764023\n", 704 | "[70]\ttrain-rmse:0.748884\n", 705 | "[71]\ttrain-rmse:0.732728\n", 706 | "[72]\ttrain-rmse:0.723686\n", 707 | "[73]\ttrain-rmse:0.716291\n", 708 | "[74]\ttrain-rmse:0.707829\n", 709 | "[75]\ttrain-rmse:0.689744\n", 710 | "[76]\ttrain-rmse:0.679918\n", 711 | "[77]\ttrain-rmse:0.669124\n", 712 | "[78]\ttrain-rmse:0.656528\n", 713 | "[79]\ttrain-rmse:0.643337\n", 714 | "[80]\ttrain-rmse:0.636228\n", 715 | "[81]\ttrain-rmse:0.626759\n", 716 | "[82]\ttrain-rmse:0.620961\n", 717 | "[83]\ttrain-rmse:0.614755\n", 718 | "[84]\ttrain-rmse:0.605856\n", 719 | "[85]\ttrain-rmse:0.598949\n", 720 | "[86]\ttrain-rmse:0.586677\n", 721 | "[87]\ttrain-rmse:0.581813\n", 722 | "[88]\ttrain-rmse:0.57461\n", 723 | "[89]\ttrain-rmse:0.564203\n", 724 | "[90]\ttrain-rmse:0.560866\n", 725 | "[91]\ttrain-rmse:0.555039\n", 726 | "[92]\ttrain-rmse:0.549116\n", 727 | "[93]\ttrain-rmse:0.542047\n", 728 | "[94]\ttrain-rmse:0.53646\n", 729 | "[95]\ttrain-rmse:0.526279\n", 730 | "[96]\ttrain-rmse:0.520916\n", 731 | "[97]\ttrain-rmse:0.510293\n", 732 | "[98]\ttrain-rmse:0.501888\n", 733 | "[99]\ttrain-rmse:0.496864\n", 734 | "[100]\ttrain-rmse:0.490309\n", 735 | "[101]\ttrain-rmse:0.485604\n", 736 | "[102]\ttrain-rmse:0.47786\n", 737 | "[103]\ttrain-rmse:0.470993\n", 738 | "[104]\ttrain-rmse:0.465839\n", 739 | "[105]\ttrain-rmse:0.463659\n", 740 | "[106]\ttrain-rmse:0.458465\n", 741 | "[107]\ttrain-rmse:0.455829\n", 742 | "[108]\ttrain-rmse:0.453049\n", 743 | "[109]\ttrain-rmse:0.446016\n", 744 | "[110]\ttrain-rmse:0.444123\n", 745 | "[111]\ttrain-rmse:0.436813\n", 746 | "[112]\ttrain-rmse:0.428149\n", 747 | "[113]\ttrain-rmse:0.421389\n", 748 | "[114]\ttrain-rmse:0.416933\n", 749 | "[115]\ttrain-rmse:0.411299\n", 750 | "[116]\ttrain-rmse:0.406012\n", 751 | "[117]\ttrain-rmse:0.402202\n", 752 | "[118]\ttrain-rmse:0.399158\n", 753 | "[119]\ttrain-rmse:0.396875\n", 754 | "[120]\ttrain-rmse:0.3941\n", 755 | "[121]\ttrain-rmse:0.390563\n", 756 | "[122]\ttrain-rmse:0.386464\n", 757 | "[123]\ttrain-rmse:0.377966\n", 758 | "[124]\ttrain-rmse:0.375974\n", 759 | "[125]\ttrain-rmse:0.369645\n", 760 | "[126]\ttrain-rmse:0.367323\n", 761 | "[127]\ttrain-rmse:0.365947\n", 762 | "[128]\ttrain-rmse:0.359\n", 763 | "[129]\ttrain-rmse:0.355307\n", 764 | "[130]\ttrain-rmse:0.353447\n", 765 | "[131]\ttrain-rmse:0.351933\n", 766 | "[132]\ttrain-rmse:0.35057\n", 767 | "[133]\ttrain-rmse:0.349417\n", 768 | "[134]\ttrain-rmse:0.34216\n", 769 | "[135]\ttrain-rmse:0.336834\n", 770 | "[136]\ttrain-rmse:0.334676\n", 771 | "[137]\ttrain-rmse:0.33078\n", 772 | "[138]\ttrain-rmse:0.327335\n", 773 | "[139]\ttrain-rmse:0.325388\n", 774 | "[140]\ttrain-rmse:0.321693\n", 775 | "[141]\ttrain-rmse:0.316646\n", 776 | "[142]\ttrain-rmse:0.311773\n", 777 | "[143]\ttrain-rmse:0.309379\n", 778 | "[144]\ttrain-rmse:0.306595\n", 779 | "[145]\ttrain-rmse:0.302346\n", 780 | "[146]\ttrain-rmse:0.298686\n", 781 | "[147]\ttrain-rmse:0.296889\n", 782 | "[148]\ttrain-rmse:0.294481\n", 783 | "[149]\ttrain-rmse:0.289682\n", 784 | "[150]\ttrain-rmse:0.288961\n", 785 | "[151]\ttrain-rmse:0.284349\n", 786 | "[152]\ttrain-rmse:0.279947\n", 787 | "[153]\ttrain-rmse:0.276529\n", 788 | "[154]\ttrain-rmse:0.273997\n", 789 | "[155]\ttrain-rmse:0.270144\n", 790 | "[156]\ttrain-rmse:0.265613\n", 791 | "[157]\ttrain-rmse:0.2619\n", 792 | "[158]\ttrain-rmse:0.258404\n", 793 | "[159]\ttrain-rmse:0.255197\n", 794 | "[160]\ttrain-rmse:0.250911\n", 795 | "[161]\ttrain-rmse:0.248765\n", 796 | "[162]\ttrain-rmse:0.246756\n", 797 | "[163]\ttrain-rmse:0.243554\n", 798 | "[164]\ttrain-rmse:0.239739\n", 799 | "[165]\ttrain-rmse:0.238151\n", 800 | "[166]\ttrain-rmse:0.234082\n", 801 | "[167]\ttrain-rmse:0.229561\n", 802 | "[168]\ttrain-rmse:0.227256\n", 803 | "[169]\ttrain-rmse:0.223941\n", 804 | "[170]\ttrain-rmse:0.221759\n", 805 | "[171]\ttrain-rmse:0.217771\n", 806 | "[172]\ttrain-rmse:0.213299\n", 807 | "[173]\ttrain-rmse:0.209621\n", 808 | "[174]\ttrain-rmse:0.207642\n", 809 | "[175]\ttrain-rmse:0.20465\n", 810 | "[176]\ttrain-rmse:0.201792\n", 811 | "[177]\ttrain-rmse:0.19798\n", 812 | "[178]\ttrain-rmse:0.196013\n", 813 | "[179]\ttrain-rmse:0.193006\n", 814 | "[180]\ttrain-rmse:0.191501\n", 815 | "[181]\ttrain-rmse:0.189761\n", 816 | "[182]\ttrain-rmse:0.186551\n", 817 | "[183]\ttrain-rmse:0.184728\n", 818 | "[184]\ttrain-rmse:0.182441\n", 819 | "[185]\ttrain-rmse:0.179247\n", 820 | "[186]\ttrain-rmse:0.176444\n", 821 | "[187]\ttrain-rmse:0.173298\n", 822 | "[188]\ttrain-rmse:0.170463\n", 823 | "[189]\ttrain-rmse:0.167352\n", 824 | "[190]\ttrain-rmse:0.164308\n", 825 | "[191]\ttrain-rmse:0.163605\n", 826 | "[192]\ttrain-rmse:0.16111\n", 827 | "[193]\ttrain-rmse:0.158263\n", 828 | "[194]\ttrain-rmse:0.155402\n", 829 | "[195]\ttrain-rmse:0.15375\n", 830 | "[196]\ttrain-rmse:0.151436\n", 831 | "[197]\ttrain-rmse:0.149999\n", 832 | "[198]\ttrain-rmse:0.148258\n", 833 | "[199]\ttrain-rmse:0.145546\n" 834 | ] 835 | }, 836 | { 837 | "data": { 838 | "image/png": "iVBORw0KGgoAAAANSUhEUgAAA+cAAAK9CAYAAABGnB2ZAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAIABJREFUeJzs3XucVXW9//H3ZwDljKl5HEVFhgAJx1R0RjMzKzMRibak\nJHrAC2omgiAVWMcIOmqKnZp08BLJJcNG6pQjWcZ4JcaMYrZo/hrIO4oijpoiY974/v7Ym3Fmzww3\nF7Nmfdbr+XjsB8za37325zvvYZjPrLW+y0IIAgAAAAAA8SmKuwAAAAAAANKO5hwAAAAAgJjRnAMA\nAAAAEDOacwAAAAAAYkZzDgAAAABAzGjOAQAAAACIGc05AAAAAAAxozkHAAAAACBmNOcAAAAAAMSM\n5hwAgBQys75mttHMzoq7FgAAQHMOAEgBMzs734i29/jBDnzfk8xs+o7afwRC3AV8GGY2zszOjrsO\nAACi0D3uAgAA6CRB0jRJzxRsf2wHvucwSRdJ+v4OfI/tEkJ41sz+Q9K7cdfyIVwk6WVJP4+7EAAA\nPiyacwBAmvwxhJDtxPezHbJTs+IQQtOH3U8I4Z0o6ulsZvYfIYS34q4DAIAocVo7AAAtmNkYM1tu\nZk1m9oqZVZvZ/gVjPmNmvzKzZ83s32a22sx+bGY9W4yZp9yRXbU4hf79/Mefz3/82YL9trkO3Mzm\nm9l6M+tvZn8wszckLWjx/FFm9kcz+5eZbTCzB8zs01sxz829Vx8zuzP/9+fNbNM8DjGze83sTTN7\nxszOKNjnpssHjjWzn5pZo5m9bmY/N7OPtlPDRWb2WP5zuMbMZpnZ7gVjHjCzR82s3Mz+ZGYbJP3A\nzJ6W9AlJmz6XG83svvxr9jCz/82/bn2+hj+Y2aEF+/5c/nVfNbPLzOw5M3vLzO4xswHt1HtUfj+v\n5j8Hj5jZxIIxg8zs//JfO2+Z2d/M7MtbygMAAI6cAwDSZHcz27PlhhDCK5v+bmaXSfofSbdJ+pmk\nvSRNlLTEzA4PIbyRH/pVSf8h6QZJr0j6pKSLJfWWNCo/5iZJ+0n6oqTRan0UPWjrr/cOyv1/vVjS\nUknflNSUr/cLkv4gabmkGZI2Shor6T4z+0wIYflWvkfL9yqSdJekJZKm5GuvyjfFVyr3i4HfSLpQ\n0s/N7M8hhGcL9jNL0muSpksapNwvKUolHbdpgJnNkPQ9SbXKfR43jTvCzI4JIbzfoqaS/Dxvk3SL\npJck3Z9/n/WSrlDu8/tS/jX9JWUk/VrS05J6Sfq6pAfM7KAQwtqCer8t6X1JP5S0u6RL8/M8ukW9\nJ0j6naQXJP1E0lpJZZK+JOm6/JhPSKqT9LykqyRtkHSapBozOyWEcEd7n3QAACSacwBAepikewu2\nBUndJMnMSpVrcP87hDCz+UVmv5W0QrnG8er85qkhhLdb7OdmM3tS0pVmtn8I4fkQwjIz+6ekL4YQ\nqj9k7TtJWhhC+G7B9hsl3RtC+FKLen8q6R/KNaxDt+O9ekq6JYRwTX5/1co1pHMknR5C+L/89nsk\nrZR0tnK/0Gjp35KO39Rgm9lqSTPNbHgI4U4zK1GuIf5jCGFYi9pXSaqSNEatryPvJenrIYSbW76J\nmV0p6eV2Pr+PhhA+XjD2F5JWSTpPuV8ytLSzpMEt6v2XpJ/kG/l/mFmRpJ9KWiPpsBDC+g4+d9cq\nt6bBkSGE9/LbbjSzOkkzJdGcAwA6xGntAIC0CJLGKXcke9PjhBbPn6pcA/9rM9tz00PSOkmPq8VR\n35aNuZkV58c9pNz/q4fvoPpvavmBmR0maaCk6oJ6d1XulxCfbWcfW2vOpr+EEF5XrqndsKkxz2//\np6R/KXeUutDsFke+pdwvEd5XboE8Kfd576HcEeiWfqbckfAvFWx/W9L8rS0+hNC8yJ2ZFZnZfyp3\ntsEqSeXtvGRuQb1Llfta2DS3wyV9TNJPOmrMzWwP5b5Gfq38GRotMqmVNNDM9t3aOQAA0ocj5wCA\nNPnbZhaEO0C55vqJdp4LkpoXTzOzPpIul/RlSXsUjNtd0XsvhPB8wbaB+T9v6eA1G81s93xzvS3+\n3fJU/7zXlTtVu9Draj1/Kfc5aPU5DCFsMLMXlWtwpdwp7pL0z4Jx75rZU5L6FuxzTYsj0VtkZibp\nEuV+GdNP+bMj8rU1tvOS5wo+fi3/56a5Dci/9v9t5m0PUK6hv1y5sxYKBUl7S3pxC+UDAFKK5hwA\ngJwi5a7ZHpr/s9CbUu5IrKR7JH1UueuKVyl3bXFv5U7F3pqz0jq63rxbB9vfbmfbpvf5pqRHOnjd\nm1tRS6H3t3H7DlmRvsC2rsy+ae2AmyV9V9KrymV6rdrPJ4q5bdrv/yq3PkB72vvFDwAAkmjOAQDY\n5EnlmrFnQgiba6IOUe6o9ZkhhFs3bTSzL7YztqMm/LX8exWuYP6xra42V68krQ8h3LcNr9vRTLnP\nz5LmDWa7SNpX0u/zmzYtIDdILe47b2Y9lDvSffdWvldHn99TJd0XQrigVWG5FeNf3sp9t7Tpa+Ng\nSR19rp/K//luF8sDAJAQXHMOAEDOb5U7ujq9vSfz1y1LHxxlLfw/9BK1bRY35F+7W8H2Z/P7Kbwu\n/KJ29tGReuWaxm/lm9/Ceku2cj87wgVm1vIAwEXKnRXwh/zH90h6V7mV8Fs6X9Juku7cyvfZoLa/\n4JByn9tWR73N7KvKnd2wPbLKrfp+SeGt3jYJIbws6QFJXzezfQqfjzkPAEACcOQcAJAWmz1FOYTw\nlJl9V7l7aPeTVKPc4mT9JY1QbrXuHyu3QvmTkn5kufufv6Hckdr2msT6/PtWmdliSe+HEBaGEN4w\ns19Lmpi7PFpPShqu3K3btkoIIZjZ+co1vP/PcvdVX6NcA3qccteDn7y1+4vYTpLuNbNfSTpQuWu/\nl4YQ7pSkEEKjmV0l6Xtm9kdJi1qM+6ukW9vfbRv1ki7M3wLvCUnrQgj3K9fcTzOzuZL+rNzZDqP1\nwdkG2yT/uR6Xr3NF/nP9Yr7mg0IIJ+WHjlduMbm/m9nPlDua3ku5W7L11o5bLBAA4ADNOQAgLbZ4\nRDqEMDN/O6/Jyt2DW8otFrapgVQI4T0zG67cva2/rdxtw34r6Xq1vfb7t/lxp+uDe50vzD93sXL/\nD39duWvKF0r6lqTHtrb2EMISMzta0jTlGsOPKHf/7WXK/TJhi1Pe2vfazNjC7UHSBOXm+33lVmW/\nVdKkgtq/b2br8mN/rNx14TdJuqxg5fTN1fQ/yi0uN0W5VeqXKHf/8x9IKpb0X8rdZ7xeuZXir+6g\n3va02h5CqDWz45Q7s+Ibyp058aSk2S3GNJjZEfkxZ0vatNr/w/nPBQAAHbIQtvbsOQAAgI6Z2dmS\n5ip3n++OVsUHAADt4JpzAAAAAABiRnMOAACi1Bm3VgMAwB2acwAAECWulwMAYDtwzTkAAAAAADHj\nyDkAAAAAADFLza3UzGxPSSdKeka5294AAAAAALAj9ZT0MUmLQwivbG5gappz5RrzW+MuAgAAAACQ\nOqMl/XJzA9LUnD8jSQsWLFBZWVnMpSAqkydPVmVlZdxlIEJk6g+Z+kOm/pCpL+TpD5kmV0NDg8aM\nGSPl+9HNSVNz/m9JKisrU3l5edy1ICKvv/46eTpDpv6QqT9k6g+Z+kKe/pCpC1u8tJoF4ZBor7/+\netwlIGJk6g+Z+kOm/pCpL+TpD5mmA805Eu2QQw6JuwREjEz9IVN/yNQfMvWFPP0h03SgOQcAAAAA\nIGY050i0M844I+4SEDEy9YdM/SFTf8jUF/L0h0zTwUIIcdfQKcysXFJ9fX09iykAAAAAAHa4bDar\niooKSaoIIWQ3N5Yj50i0TCYTdwmIGJn6Q6b+kKk/ZOoLefpDpulAc45EmzBhQtwlIGJk6g+Z+kOm\n/pCpL+TpD5mmA6e1AwAAAACwA3BaOwAAAAAACUJzDgAAAABAzGjOkWg1NTVxl4CIkak/ZOoPmfpD\npr6Qpz9kmg4050i06urquEtAxMjUHzL1h0z9IVNfyNMfMk0HFoQDAAAAAGAHYEE4AAAAAAAShOYc\nAAAAAICY0ZwDAAAAABAzmnMk2tixY+MuAREjU3/I1B8y9YdMfSFPf8g0HWjOkWhDhgyJuwREjEz9\nIVN/yNQfMvWFPP0h03RgtXYAAAAAAHYAVmsHAAAAACBBaM4BAAAAAIgZzTkSra6uLu4SEDEy9YdM\n/SFTf8jUF/L0h0zToXvcBXS2hoaGuEtAhC677DJVVlbGXQYiRKb+kKk/ZOoPmfpCnv50dqYlJSUq\nLS3ttPdDTuoWhIu7DgAAAADoynr2LNaqVQ006BHYlgXhUnfkXLpc0rC4iwAAAACALqhB//73GDU2\nNtKcd7IUNuf9JHErNQAAAABA18GCcAAAAAAAxIzmHAk3Je4CEDky9YdM/SFTf8jUF/L0h0zTgOYc\nCcd1MP6QqT9k6g+Z+kOmvpCnP2SaBjTnSLiL4y4AkSNTf8jUHzL1h0x9IU9/yDQNaM4BAAAAAIgZ\nzTkAAAAAADGjOUfCrYy7AESOTP0hU3/I1B8y9YU8/SHTNKA5R8JNjbsARI5M/SFTf8jUHzL1hTz9\nIdM0SExzbmazzewVM3vfzA6Nux50FbPiLgCRI1N/yNQfMvWHTH0hT3/INA0S0Zyb2VBJZ0kaJmkf\nSf/PzMab2dNm9paZ/cXMjoy3SsSD20r4Q6b+kKk/ZOoPmfpCnv7Ek+nSpUuVyWTUu3dvFRUVadGi\nRR2OvfDCC1VUVKTrrruuwzEnnXRSm/0sWbJERUVF6tatm4qKilo96uvrI51PV5eI5lzSAZJeDCEs\nCyG8LGmkpB9Jmi7pcEmPSFpsZiUx1ggAAAAAbmzYsEGHHXaYbrjhBplZh+Nuv/12LVu2TL179+5w\nTGVlpbp169ZmP8ccc4zWrl2rF198UWvXrtXatWt1/vnnq3///qqoqIhsLknQPe4CtsTM5kk6W1Iw\ns42SnpG0TtLsEMIt+TEXSvqSpHMlXRNTqQAAAADgxtChQzV06FBJUgih3TFr1qzRpEmTtHjxYg0b\nNqzdMStWrFBlZaWWL1+uffbZp9Vz3bt3195779388Xvvvac77rhDkyZNimgWyZGEI+cTJX1P0vOS\nekn6lKQKSfdsGhByXyn3SDo6jgIRp5lxF4DIkak/ZOoPmfpDpr6Qpz9dM9MQgs466yxNnTpVZWVl\n7Y556623NHr0aN1www2tmvCO3HHHHXr11Vd1zjnnRFxt19flm/MQwnpJ6yW9nz+lvVv+8VLB0JeU\nux4dqdIUdwGIHJn6Q6b+kKk/ZOoLefrTNTO9+uqrtdNOO2nChAkdjpk8ebI+85nPaPjw4Vu1z7lz\n5+rEE0/UfvvtF1WZidHlT2sHNu/7cReAyJGpP2TqD5n6Q6a+kKc/XS/T+vp6XXfddXr44Yc7HLNo\n0SLdd999WrFixVbtc82aNVq8eLH+7//+L6oyE6XLHzlvR6Ok95U7xb2lXpLWbvnlEyVlCh5HS6op\nGFebf67QeElzCrZl82MbC7ZPV9tTUFbnx64s2F4laUrBtqb82LqC7dWSxrZT2ygxD4l5tMQ8PsA8\ncpjHB5jHB5hHDvP4APP4APPIYR4f8D6PyW0qqK6ubnPNeV1dnV566SXtv//+6tGjh3r06KFnn31W\nkydP1i677CJJuv/++/XUU09p9913V7du3dS9e+7Y8CmnnKIvfOELymazymQyamzMzWPu3LkqKSlR\nfX29Zs5sPY/Vq1crk8lo5crW86iqqtKUKa3n0dTUpEwmo7q61nlUV1dr7Ni2eYwaNUo1Na3zqK2t\nVSbTNo/x48drzpzWeWyax+zZs5XJZJofgwYN0siRI9vsoyPW0YX9XYmZTZI0KYTQP//xXyQtCyFM\nyn9syn3VXRdC+GEH+yiXVC8tkDS6cwoHAAAAgETJSqpQfX29ysvLm7cWFRWppqamuWF97bXX9OKL\nL7Z65ZAhQ3TWWWdp7NixGjhwoNatW9fceG9y8MEHq6qqSsOHD1ffvn1bPTdgwACNHDmyTWOeZNls\ndtOq8xUhhOzmxib1tPYfS5pvZvWS/qrcr3eKJc2PsyjEoVESd9DzhUz9IVN/yNQfMvWFPP2JJ9MN\nGzboiSeeaD5q/tRTT+mRRx7Rf/7nf6pPnz7aY489Wo3v0aOH9tlnHw0cOFCStPfee7e7CFyfPn3a\nNOb33nuvnnnmGZ133nk7aDZdXxJPa1cI4VeSviXpfyQ9LOlQSSfmF4xDqpwbdwGIHJn6Q6b+kKk/\nZOoLefoTT6bLly/X4YcfroqKCpmZvvnNb6q8vFzTp09vd/zm7oW+pTFz587VMccco49//OMfquYk\nS8Rp7VHgtHavspLKtzgKSUKm/pCpP2TqD5n6Qp7+dGam7Z/Wju2zLae1J/LIOfABvmH4Q6b+kKk/\nZOoPmfpCnv6QaRrQnAMAAAAAEDOacwAAAAAAYkZzjoQrvOcjko9M/SFTf8jUHzL1hTz9IdM0oDlH\nwm12TQUkEpn6Q6b+kKk/ZOoLefpDpmlAc46Euz7uAhA5MvWHTP0hU3/I1Bfy9IdM04DmHAAAAACA\nmNGcAwAAAAAQM5pzAAAAAABiRnOOhMvEXQAiR6b+kKk/ZOoPmfpCnv6QaRrQnCPhJsRdACJHpv6Q\nqT9k6g+Z+kKe/pBpGtCcI+GGxF0AIkem/pCpP2TqD5n6Qp7+kGkadI+7gM73tLhPIAAAAAC0pyHu\nAlIrhc35tPwDAAAAAFCoZ89ilZSUxF1G6qSuOV+wYIHKysriLgMRuf/++3XcccfFXQYiRKb+kKk/\nZOoPmfpCnv50dqYlJSUqLS3ttPdDjoUQ4q6hU5hZuaT6+vp6lZeXx10OIjJq1CgtXLgw7jIQITL1\nh0z9IVN/yNQX8vSHTJMrm82qoqJCkipCCJu9vprmHAAAAACAHWBbmnNWawcAAAAAIGY05wAAAAAA\nxIzmHAAAAACAmKVutfaGBu7b58mMGTM0Y8aMuMtAhMjUHzL1J6mZsvpwx8aOHat58+bFXQYiQp7+\nkGk6pK45HzNmTNwlIGK/+93v4i4BESNTf8jUnyRm2rNnsVataqBBb8eQIUPiLgERIk9/yDQdUrda\nu3S5pGFxlwMAADpVg6Qx4q4tAIDOtC2rtafuyLnUTxL/KQMAAAAAug4WhAMAAAAAIGY050i4urgL\nQOTI1B8y9YdMvamrI1NPyNMfMk0HmnMk3DVxF4DIkak/ZOoPmXpzzTVk6gl5+kOm6UBzjoS7Le4C\nEDky9YdM/SFTb267jUw9IU9/yDQdaM6RcMVxF4DIkak/ZOoPmXpTXEymnpCnP2SaDjTnAAAAAADE\njOYcAAAAAICY0Zwj4abEXQAiR6b+kKk/ZOrNlClk6gl5+kOm6UBzjoQrjbsARI5M/SFTf8jUm9JS\nMvWEPP0h03SwEELcNWwVM5st6VRJH5V0eAjh0W18fbmkemmBpNE7oEIAANB1ZSVVqL6+XuXl5XEX\nAwBIiWw2q4qKCkmqCCFkNzc2EUfOzWyopLMlDZO0r6SvmtnGgsc/4q0SAAAkwcaNGzVt2jT1799f\nxcXFOuCAA3TFFVe0GrNhwwZNmDBBffr0UXFxsT7xiU/opz/9aasxb7/9tsaPH6+SkhLtuuuuGjly\npNatW9eZUwEAONI97gK20gGSXgghLJMkM3tP0mOSjpdk+THvxVQbAABIkKuvvlo//elPdcstt+ig\ngw7S8uXLdc455+ijH/2oJkyYIEmaPHmyHnjgAf3yl79U3759VVtbq3Hjxql3794aPny4JOmSSy7R\nXXfdpd/85jfabbfdNH78eJ166qlaunRpnNMDACRUlz9ybmbzJF0nqTR/hPyp/FPvhRBeDiGsyz9e\njbFMxGZl3AUgcmTqD5n6k+xMH3roIZ188skaOnSoSktLdcopp2jIkCH661//2mrM2WefrWOPPVal\npaU6//zzNXjw4OYxb7zxhubOnavKykp97nOf0+GHH6558+bpwQcfbLWfpFi5MtmZojXy9IdM06HL\nN+eSJkr6nqTnJfWSdGR++0AzW2NmT5rZAjPrE1uFiNHUuAtA5MjUHzL1J9mZfvrTn9a9996rxx9/\nXJL0yCOP6MEHH9SwYcNajVm0aJFeeOEFSdL999+vxx9/XCeeeKIkqb6+Xu+9956OP/745tcMGjRI\npaWleuihhzpxNtGYOjXZmaI18vSHTNOhy5/WHkJYb2brJb0fQnhZkszsL5LOkbRKuWvQZ0j6k5kd\nHELYEFetiMOsuAtA5MjUHzL1J9mZfvvb39Ybb7yhAw88UN26ddPGjRt15ZVX6vTTT28eU1VVpQsu\nuED777+/unfvrm7duulnP/uZjjnmGEnS2rVrtdNOO2m33XZrte9evXpp7dq1nTqfKMyalexM0Rp5\n+kOm6ZCEI+dthBAWhxB+E0J4LIRwt3ILxe0h6bQtv3qipEzB42hJNQXjavPPFRovaU7Btmx+bGPB\n9umSZhZsW50fW3hqSpXa3je2KT+2rmB7taSx7dQ2Sumbx0z5mIeXPKKYxwT5mIeXPKKYx/R2akvi\nPLzkEcU87i7Ylqx5LFy4ULNmzdIFF1yghx9+WD//+c/1wx/+UJdffrkymYwaGxt13XXXadmyZbrz\nzjt13nnn6cQTT9RFF12k++67T5LU2Niod955p82ppi+99FLzmOZZNDUpk8morq71PKqrqzV2bNt5\njBo1SjU1redRW1urTKZtHuPHj9ecOa2/rrLZbPM8Wpo+fbpmzmydx+rVq5XJZNTU1NRqe1VVVZv7\nKidhHoV5pHUe06e3/b6bxHl4ySOKedx9d+vvu0mdh5c8OprH7Nmzlclkmh+DBg3SyJEj2+yjI4m4\nlZqZTZI0KYTQfzNj/irp7hDCZR08z63UAABIrQ9upTZixAh95zvf0bhx45qfvfLKK3XrrbfqH//4\nh/79739r9913V01NjU466aTmMV/72te0Zs0a/eEPf9D999+vL37xi3rttddaHT3/2Mc+psmTJ2vS\npEmdOTkAQBfl7lZqW2JmH1FuRfcX464FAAB0bU1NTerWrVurbUVFRdq4caMk6d1339W7777bZsym\nU+AlqaKiQt27d9e9997b/PyqVau0evVqHX300Tt4BgAAjxLZnJvZD83ss2bW18w+Lel2Se8qd54b\nUqXwdEkkH5n6Q6b+JDvTL3/5y7riiiv0hz/8Qc8++6xuv/12VVZW6pRTTpEk7brrrvrc5z6nb33r\nW1qyZImeeeYZzZ8/X7fcckvzmN12203nnXeevvGNb+iBBx5QfX29zj33XB1zzDH65Cc/Gef0tkvh\n6aNINvL0h0zTocsvCNeB/SX9UtKekl5W7mK0T4UQXom1KsSgactDkDBk6g+Z+pPsTGfNmqVp06Zp\n/PjxWrdunfbbbz+NGzdO06ZNax6zcOFCfec739GYMWP06quvqm/fvrrqqqt0wQUXNI+prKxUt27d\nNHLkSL399tsaOnSorr/++jim9KEVXnOOZCNPf8g0HRJxzXkUuOYcAIA0++Ca8/Ly8riLAQCkROqu\nOQcAAAAAIMlozgEAAAAAiBnNORKu8J66SD4y9YdM/SFTbwrvMYxkI09/yDQdaM6RcOfGXQAiR6b+\nkKk/ZOrNueeSqSfk6Q+ZpgPNORJuRtwFIHIz4i4AkZsRdwGI3Iy4C0DEZsyYEXcJiBB5+kOm6UBz\njoRjxV1/yNQfMvWHTL1hBXtfyNMfMk0HmnMAAAAAAGJGcw4AAAAAQMxozpFwc+IuAJEjU3/I1B8y\n9WbOHDL1hDz9IdN0oDlHwmXjLgCRI1N/yNQfMvUmmyVTT8jTHzJNBwshxF1DpzCzckn10gJJo+Mu\nBwAAdKqspArV19ezsBIAoNNks1lVVFRIUkUIYbO/ZeneOSV1JU+L3/gDAJA2DXEXAADAZqWwOZ+W\nfwAAgDTp2bNYJSUlcZcBAEC7UtecL1iwQGVlZXGXAQAAOllJSYlKS0vjLgMAgHalrjkvKyvjWjNH\nMpmMFi1aFHcZiBCZ+kOm/pCpP2TqC3n6Q6bpwGrtSLQJEybEXQIiRqb+kKk/ZOoPmfpCnv6QaTqk\nbrV2VmkFAAAAAHSGbVmtnSPnAAAAAADEjOYcAAAAAICY0Zwj0WpqauIuAREjU3/I1B8y9YdMfSFP\nf8g0HVK3WntDQ0PcJSBCN9xwA7fFcYZM/Ulbpmm4XVd1dbVGjBgRdxmIEJn6Qp7+kGk6pG5BuLjr\nAAD41rNnsVatanDfoAMAgC3blgXhUnfkXLpc0rC4iwAAuNSgf/97jBobG2nOAQDANklhc95PErdS\nAwAAAAB0HSwIBwAAAABAzGjOkXBj4y4AkSNTf8jUm7FjydQbMvWFPP0h03SgOUfCDYm7AESOTP0h\nU2+GDCFTb8jUF/L0h0zTIYWrtS+QNDrucgAALmUlVai+vl7l5axvAgBA2m3Lau0cOQcAAAAAIGY0\n5wAAAAAAxIzmHAlXF3cBiByZ+kOm3tTVkak3ZOoLefpDpulAc46EuybuAhA5MvWHTL255hoy9YZM\nfSFPf8g0HRLTnJvZbDN7xczeN7ND464HXcVtcReAyJGpP2TqzW23kak3ZOoLefpDpumQiObczIZK\nOkvSMEn7SnrMzPYzs1+YWaOZNZnZI/kV2ZEqxXEXgMiRqT/pzLRfv34qKipq87j44oubx3zve9/T\nfvvtp+LiYp1wwgl64oknWu3jwgsv1AEHHKDi4mLtvffeGjFihFatWtXZU2mjuDidmXpGpr6Qpz9k\nmg6JaM4lHSDpxRDCshDCOkm7SXpQ0tuSTpRUJumbkl6Lr0QAAD6wfPlyrV27tvlx9913y8x02mmn\nSZJmzpypWbNmafbs2frrX/+qXXbZRSeeeKLeeeed5n0cccQRmj9/vlauXKna2lqFEHTiiScqLbdB\nBQAgTbrHXcCWmNk8SWdLCma2UdIzkhZKWh1COL/F0GdjKA8AgHbtueeerT7+3e9+pwEDBujYY4+V\nJF177bWaNm2ahg8fLkm65ZZb1KtXL9XU1DQ38Oef/8F/c6Wlpbriiit02GGH6ZlnnlG/fv06aSYA\nAKAzJOHj7p5PAAAgAElEQVTI+URJ35P0vKReko6UlJG03Mx+ZWYvmVnWzM7f3E7g1ZS4C0DkyNQf\nMn333Xd166236rzzzpMkPf3001q7dq2OP/745jG77babjjrqKD300EPt7mPDhg2aO3eu+vfvrz59\n+nRK3R2ZMoVMvSFTX8jTHzJNhy7fnIcQ1ktaL+n9EMLLIYRXJPWXNE7SKklDJN0o6TozOzO+ShGP\n0rgLQOTI1B8yvf322/X666/r7LPPliStXbtWZqZevXq1GterVy+tXbu21bYbb7xRu+66q3bddVct\nXrxYtbW16t493hPfSkvJ1Bsy9YU8/SHTdOjyzXkHiiTVhxCmhRAeCSH8TNLPJF245ZdOVO7Ae8vH\n0ZJqCsbV5p8rNF7SnIJt2fzYxoLt0yXNLNi2Oj92ZcH2KrU9utSUH1t4X8NqSWPbqW2U0jePlfIx\nDy95RDGPu+VjHl7yiGIe2XZqS+I8tjYPafLkya0+njt3rnr37q3f//73rbY/+uijymQyamxsPY/p\n06dr5szcPMaMGaMVK1bo17/+tV599VV9+ctfbnVdelVVVZsjKk1NTcpkMm3ui1tdXa2xY9vOY9So\nUaqpaT2P2tpaZTJt8xg/fnybhYmy2ewW57HJ6tWrlclktHJl6zzimMecOa2/rtI8jxNOOMHFPLzk\n8WHnkc22/b6bxHl4yYPvux/Mw0seHc1j9uzZymQyzY9BgwZp5MiRbfbREUvCojJmNknSpBBC//zH\nz0iqDSFc0GLMhZIuCyG0e65ffiX3emmBpNE7vmgAQAplJVWovr5e5eW5G4isXr1a/fv3V01NTfP1\n5U8//bQGDBigFStW6NBDP7g76Oc//3kdfvjhqqysbHfv7777rvbYYw/NmTNHo0aN2uGzAQAAH042\nm1VFRYUkVYQQ2jti0SypR84flDSoYNsgsSgcAKCLmTt3rnr16qVhw4Y1b+vXr5/22Wcf3Xvvvc3b\n3njjDS1btkyf/vSnO9zXxo0bFULQ22+/vUNrBgAAnS+pzXmlpE+Z2XfMbICZ/Zek8yXNirkudLrC\n01SRfGTqT3ozDSFo/vz5Ouecc1RU1Pq/3EsuuURXXHGFfve73+nvf/+7zjrrLO2///46+eSTJeWO\nrl999dXKZrN67rnn9Oc//1lf/epXVVxc3KrRj0PhKYVIPjL1hTz9IdN0SGRzHkJYLukrks6Q9HdJ\nlyl32vttsRaGGEyNuwBEjkz9SW+m99xzj5577rl2r2+bOnWqLr74Yn3961/XUUcdpbfeekt33XWX\ndtppJ0lSz549tXTpUn3pS1/SwIEDdcYZZ2j33XfXn//8Z5WUlHT2VNrUDl/I1Bfy9IdM0yER15xH\ngWvOvVotVoL2hkz9SVOmba8592j16tWsHOwMmfpCnv6QaXKl4ZpzII9vUv6QqT9k6g0/IPpDpr6Q\npz9kmg405wAAAAAAxIzmHAAAAACAmNGcI+Fmxl0AIkem/pCpNzNnkqk3ZOoLefpDpulAc46Ea4q7\nAESOTP0hU2+amsjUGzL1hTz9IdN0YLV2AAAik47V2gEAwNZhtXYAAAAAABKE5hwAAAAAgJjRnCPh\nGuMuAJEjU3/I1JvGRjL1hkx9IU9/yDQdaM6RcOfGXQAiR6b+kKk3555Lpt6QqS/k6Q+ZpgPNORJu\nRtwFIHIz4i4AkZsRdwGI2IwZM+IuAREjU1/I0x8yTYfucRfQ+Z5WbjVd+EGe/pCpP2nJtCHuAjoF\nK9H7Q6a+kKc/ZJoOKWzOp+UfAABEr2fPYpWUlMRdBgAASJjUNecLFixQWVlZ3GUAAJwqKSlRaWlp\n3GUAAICESV1zXlZWxmkhjsyZM0fnnXde3GUgQmTqD5n6Q6b+kKkv5OkPmaYDC8Ih0bLZtFzHmh5k\n6g+Z+kOm/pCpL+TpD5mmg4UQ4q6hU5hZuaT6+vp6jpwDAAAAAHa4bDariooKSaoIIWz2tywcOQcA\nAAAAIGY05wAAAAAAxIzmHAAAAACAmKVutfaGhoa4S0CEJk+erMrKyrjLQITI1J+ukim3OItOJpPR\nokWL4i4DESJTX8jTHzJNh9Q152PGjIm7BEQsv8ACHCFTf7pCpj17FmvVqgYa9AhMmDAh7hIQMTL1\nhTz9IdN0SN1q7dLlkobFXQ4AoFM1SBoj7tgBAAA607as1p66I+dSP0n8YAYAAAAA6DpYEA4AAAAA\ngJjRnCPhauIuAJEjU3/I1JuaGjL1hkx9IU9/yDQdaM6RcNVxF4DIkak/ZOpNdTWZekOmvpCnP2Sa\nDilcEG6BpNFxlwMA6FRZSRUsCAcAADrVtiwIx5FzAAAAAABiRnMOAAAAAEDMaM4BAAAAAIgZzTkS\nbmzcBSByZOoPmXozdiyZekOmvpCnP2SaDl2iOTez2Wb2ipm9b2aHxl0PkmRI3AUgcmTqD5l6M2QI\nmXpDpr6Qpz9kmg6xN+dmNlTSWZKGSdpX0u5mtsjM1pjZRjPLFIzvbmYzzexRM3szP+7nZrZvHPUj\nbmfEXQAiR6b+dK1MX3jhBZ155pkqKSlRcXGxBg8erGz2g8VTx44dq6KiolaPYcOGtdrHSy+9pDPP\nPFP77ruvPvKRj6iiokK//e1vO3sqsTnjjK6VKT48MvWFPP0h03ToHncBkg6Q9GIIYZnUfMuzFZLm\nSGrvJ51iSYdJ+r6kRyXtIek6SXdI+mRnFAwASKb169fr1FNP1fHHH6/FixerpKREjz/+uPbYY49W\n40466STNnz9fm243uvPOO7d6/swzz9Qbb7yhO++8U3vuuaduvfVWnXbaaaqvr9fgwYM7bT4AAMCP\nWJtzM5sn6WxJwcw2SnomhNBf0h/zz1vha0IIb0g6sWA/EyQtM7P9QwjP7/jKAQBJNG/ePJWWlurm\nm29u3ta3b98243beeWfttddeHe7noYce0k033bTpvqW67LLLVFlZSXMOAAC2W9yntU+U9D1Jz0vq\nJenI7dzPRyUFSf+KqC4kRl3cBSByZOpP18l06dKlOuKII3TaaaepV69eKi8vb9Wob/LAAw+oV69e\nOvDAA3XRRRfp1VdfbfX8Mccco4ULF+q1115TCEG33Xab3n77bX3+85/vpJnEq66u62SKaJCpL+Tp\nD5mmQ6zNeQhhvaT1kt4PIbwcQnhlW/dhZjtLulrSL0MIb0ZdI7q6a+IuAJEjU3+6TqZr1qzRjTfe\nqEGDBqm2tlbjxo3TxIkT9Ytf/KJ5zEknnaRbbrlF9913n6655hotWbJEw4YNaz7FXZIWLlyod955\nR3vuuad23nlnjRs3Trfffrv69+8fx7Q63TXXdJ1MEQ0y9YU8/SHTdLCWP2zEUoDZJEmT8qezFz63\nUdKIEMKiDl7bXbnr0veVdNzmmvP8tez10gJJoyOpHV1Bk3LLEMAPMvWnK2SalVShHj166KijjtLS\npUubn5k0aZKWL1+uBx98sN1XPv300xowYIDuvfdeHXfccZKkiy++WMuXL9dVV12lPffcUzU1Nfrx\nj3+suro6feITn+iMCcWqqalJxcVxZ4ookakv5OkPmSZXNpvddBlcRQghu7mxcZ/Wvt3yjfmvJfWR\nNGTrj5pPlJQpeBwtqaZgXG3+uULjlVurrqVsfmxjwfbpkmYWbFudH7uyYHuVpCkF25ryYwtPY6lW\n+/cNHqX0zWOKfMzDSx5RzON0+ZiHlzyimMf4dmrr7HlMliSVlJSorKxMklRVVaUpU6aorKxMq1ev\nzs2iqUmZTKbV6YP9+vXTrrvuqu9+97uSpKeeekrXX3+95s6dqxtvvFFPPvmkpk2bpiOOOELXX3+9\namtrlcm0ncf48eM1Z07reWSzWWUyGTU2tp7H9OnTNXNm63msXr1amUxGK1e2zmPTPFpqbx6SVF1d\n3e69ckeNGqWamtZ5bG4e1dXVLubhJY8o5rHp30DS5+Eljw87j/Hj237fTeI8vOTB990P5uElj47m\nMXv2bGUymebHoEGDNHLkyDb76Egij5y3aMz7K3fE/NXC17azL46cA0Bq5Y6cDx06VE1NTVqyZEnz\nM5MnT9bf/va3Dq/ne/7559W3b1/dcccdGj58uB577DENHjxYDQ0N+vjHP948bujQofrYxz6mm266\naUdPBgAAJESij5yb2S5mNtjMDstv6p//uE/++e6SfiOpXNIYST3MrFf+0SOmsgEACTB69Gj95S9/\n0VVXXaUnn3xSv/zlL3XzzTdrwoQJkqQNGzZo6tSpWrZsmZ599lnde++9GjFihD7+8Y/rxBNzNwo5\n8MADNWDAAF1wwQX629/+pqeeeko/+tGPdM899+grX/lKnNMDAAAJ1uWac0lHSHpYUr1yK7D/SLlD\nHt/PP99b0nBJ+yt3P/QXJL2Y//Pozi4WcSs8tRbJR6b+dJ1MDzroIN1+++2qrq7WIYccoiuvvFLX\nXnutTj/9dElSt27d9Oijj+rkk0/WoEGD9LWvfU1HHnmk/vSnP6lHj9zvf7t376677rpLe+21lzKZ\njAYPHqwFCxbolltuaW7gvSs8fRDJR6a+kKc/ZJoOsd7nXJJCCNdKurbFx0u0mV8ahBCeldStE0pD\nIpTGXQAiR6b+dK1Mhw0bpmHDhrX7XM+ePfXHP/5xi/sYMGCAfv3rX0ddWmKUlnatTPHhkakv5OkP\nmaZD7NecdxauOQeANMtdc15fX6/y8vK4iwEAACmR6GvOAQAAAABIG5pzAAAAAABiRnOOhCu8/zKS\nj0z9IVNvCu8xi+QjU1/I0x8yTQeacyTc1LgLQOTI1B8y9WbqVDL1hkx9IU9/yDQdaM6RcLPiLgCR\nI1N/yNSbWbPI1Bsy9YU8/SHTdKA5R8JxWwl/yNQfMvWGW/r4Q6a+kKc/ZJoONOcAAAAAAMSM5hwA\nAAAAgJjRnCPhZsZdACJHpv6QqTczZ5KpN2TqC3n6Q6bpQHOOhGuKuwBEjkz9IVNvmprI1Bsy9YU8\n/SHTdLAQQtw1dAozK5dUL10uaVjc5QAAOlWDpDGqr69XeXl53MUAAICUyGazqqiokKSKEEJ2c2O7\nd05JXcm0/AMAkCY9exarpKQk7jIAAADalbrmfMGCBSorK4u7DABAJyspKeFWNAAAoMtKXXNeVlbG\nKY2ONDY2ciTMGTL1h0z9IVN/yNQX8vSHTNOBBeGQaOeee27cJSBiZOoPmfpDpv6QqS/k6Q+ZpgPN\nORJtxowZcZeAiJGpP2TqD5n6Q6a+kKc/ZJoOqVutnZV6AQAAAACdYVtWa+fIOQAAAAAAMaM5BwAA\nAAAgZqlbrb2hoSHuEhChmpoajRgxIu4yECEy9aezMuVWaZ1nzpw5Ou+88+IuAxEiU1/I0x8yTYfU\nXXMedx0AgB2jZ89irVrVQIPeCcaPH6/rr78+7jIQITL1hTz9IdPk2pZrzlPYnF8uaVjc5QAAItUg\naYxY9BMAAHQl29Kcp+60dqmfJH5wAwAAAAB0HSwIBwAAAABAzGjOAQAAAACIGc05Ei4TdwGIHJn6\nQ6beZDJk6g2Z+kKe/pBpOtCcI+EmxF0AIkem/pCpNxMmkKk3ZOoLefpDpulAc46EGxJ3AYgcmfpD\npt4MGUKm3pCpL+TpD5mmA805AAAAAAAxozkHAAAAACBmNOdIuJq4C0DkyNQfMvWmpoZMvSFTX8jT\nHzJNh8Q052Y228xeMbP3zWxw3PWgq6iOuwBEjkz9IVNvqqvJ1Bsy9YU8/SHTdEhEc25mQyWdLWmY\npH0l3WlmG9t5VMVbKTrfwrgLQOTI1J/OzfSFF17QmWeeqZKSEhUXF2vw4MHKZrPtjr3wwgtVVFSk\n6667rsP9nXTSSSoqKtKiRYt2VMmJs3Ah/069IVNfyNMfMk2H7nEXsJUOkPRCCGGZJJnZYZK6tXj+\nEEm1kn4VQ20AgC5i/fr1OvXUU3X88cdr8eLFKikp0eOPP6499tijzdjbb79dy5YtU+/evTvcX2Vl\npbp16yYz25FlAwAAdP3m3MzmKXfUPJjZRknPhBD6F4z5sqQnQwhL46gRANA1zJs3T6Wlpbr55pub\nt/Xt27fNuDVr1mjSpElavHixhg0b1u6+VqxYocrKSi1fvlz77LPPDqsZAABASsZp7RMlfU/S85J6\nSTqy5ZNm1kPSaElzOr80AEBXsnTpUh1xxBE67bTT1KtXL5WXl7dq1CUphKCzzjpLU6dOVVlZWbv7\neeuttzR69GjdcMMN2nvvvTujdAAAkHJdvjkPIayXtF7S+yGEl0MIrxQM+Yqk3SX9vNOLQxcwNu4C\nEDky9afzMl2zZo1uvPFGDRo0SLW1tRo3bpwmTpyoX/ziF81jrr76au20006aMGFCh/uZPHmyPvOZ\nz2j48OGdUXbijB3Lv1NvyNQX8vSHTNOhy5/WvhXOlXRXCGFt3IUgDkPiLgCRI1N/Oi/TjRs36sgj\nj9Tll18uSRo8eLAee+wx3XTTTTrzzDNVX1+v6667Tg8//HCH+1i0aJHuu+8+rVixorPKTpwhQ/h3\n6g2Z+kKe/pBpOnT5I+ebY2alkr4o6Wdb/6qJkjIFj6PV9j68tfnnCo1X2zPos/mxjQXbp0uaWbBt\ndX7syoLtVZKmFGxryo+tK9herfaPRI1S+uZRJx/z8JJHFPOolo95eMkjinnUtlPbjpnHzjvvrHfe\neafVtl69eimbzWrlypWqq6vTyy+/rD59+qhbt27q1q2bnn32WX3jG99Q//791dTUpEsuuURPPfWU\ndt99d/Xo0UM9evSQJI0YMUJf+MIXWs9i1Kg2956tra1VJtN2HuPHj9ecOa3nkc1mlclk1NjYeh7T\np0/XzJmt81i9erUymYxWrmydR1VVlaZMaZ1HU1OTMpmM6upa51FdXd3u0ZdtnUdTU5OLeXjJI4p5\nHH744S7m4SWPDzuP2tq233eTOA8vefB994N5eMmjo3nMnj1bmUym+TFo0CCNHDmyzT46YiGErR4c\nFzObJGlSOwvBzZD0NUl9Qggbt7CPckn10gLlLlEHAPiRlVShoUOHqqmpSUuWLGl+ZvLkyfrb3/6m\nuro6vfbaa3rxxRdbvXLIkCE666yzNHbsWA0cOFDr1q1r80PCwQcfrKqqKg0fPrzdBeYAAADak81m\nVVFRIUkVIYT27+2al9jT2i13X5tzJM3fUmMOAEiH0aNH67zzztNVV12l0047TcuWLdPNN9+sn/0s\nd4LVHnvs0ea2aj169NA+++yjgQMHSpL23nvvdheB69OnD405AADYYZJ8WvsXJfWRNC/uQhCnwlNo\nkXxk6k/nZXrQQQfp9ttvV3V1tQ455BBdeeWVuvbaa3X66ad3+JqtuYc59zlvrfA0QSQfmfpCnv6Q\naTok4rT2KHBau1cZSYviLgKRIlN/OiPT3Gnt9fX1Ki8v38HvhUwmo0WL+HfqCZn6Qp7+kGlybctp\n7Uk+cg5Iui3uAhA5MvWHTL257TYy9YZMfSFPf8g0HWjOkXDFcReAyJGpP2TqTXExmXpDpr6Qpz9k\nmg405wAAAAAAxIzmHAAAAACAmNGcI+GmxF0AIkem/pCpN1OmkKk3ZOoLefpDpulAc46EK427AESO\nTP0hU29KS8nUGzL1hTz9IdN04FZqAAAHuJUaAADoeriVGgAAAAAACUJzDgAAAABAzGjOkXAr4y4A\nkSNTf8jUm5UrydQbMvWFPP0h03SgOUfCTY27AESOTP0hU2+mTiVTb8jUF/L0h0zTgeYcCTcr7gIQ\nOTL1h0y9mTWLTL0hU1/I0x8yTYfucRfQ+Z5WblVf+NEYdwGIHJn6s6MzbdjB+0dL3NLHHzL1hTz9\nIdN0SGFzPi3/AAB40rNnsUpKSuIuAwAAYLukrjlfsGCBysrK4i4DABCxkpISjiwAAIDESl1zXlZW\npvLy8rjLQERmzpypSy+9NO4yECEy9YdM/SFTf8jUF/L0h0zTgQXhkGhNTU1xl4CIkak/ZOoPmfpD\npr6Qpz9kmg4WQoi7hk5hZuWS6uvr6zlyDgAAAADY4bLZrCoqKiSpIoSw2ZXJOXIOAAAAAEDMaM4B\nAAAAAIgZzTkSrbGR+2F7Q6b+kKk/ZOoPmfpCnv6QaTqkbrX2hoaGuEtAhCZPnqzKysq4y0CEyDRe\nO+J2ZOeee64WLVoU6T4RLzL1h0x9IU9/yDQdUrcgXNx1AEBX1rNnsVataoi0Qc9msyzE6QyZ+kOm\nvpCnP2SaXNuyIFwKm/PLJQ2LuxwA6IIaJI0Rd7UAAACIxrY056k7rV3qJ4kfOgEAAAAAXQcLwgEA\nAAAAEDOacyTcnLgLQOTI1Js5c8jUGzL1h0x9IU9/yDQdaM6RcJu9bAOJRKbeZLNk6g2Z+kOmvpCn\nP2SaDilcEG6BpNFxlwMAXVBWUgULwgEAAERkWxaE48g5AAAAAAAxozkHAAAAACBmNOcAAAAAAMSM\n5hwJl4m7AESOTL3JZMjUGzL1h0x9IU9/yDQdukRzbmazzewVM3vfzA6Nux4kyYS4C0DkyNSbCRPI\n1Bsy9YdMfSFPf8g0HWJvzs1sqKSzJA2TtK+k3c1skZmtMbONZtbm10Rm9hUzW2xmjfkxNPSpNSTu\nAhA5Mo3b7NmzVVRU1Opx0EEHtRrT0NCgk08+WR/96Ef1kY98REcddZSef/75dvdXWVmpoqIiLVq0\nqDPKRycYMoR/p96QqS/k6Q+ZpkPszbmkAyS9GEJYFkJYJ2kXSSskXSSpo/u87SJpqaSpmxkDANhO\nBx98sF566SWtXbtWa9euVV1dXfNzTz75pI499lgddNBB+tOf/qS///3vmjZtmnr27NlmP5WVlerW\nrZvMrDPLBwAASJzucb65mc2TdLakYGYbJT0TQugv6Y/559v9aS6EsCD/fF9J/MQHABHr3r279tpr\nr3af++53v6svfelLuuqqq5q39evXr824FStWqLKyUsuXL9c+++yzw2oFAADwIO4j5xMlfU/S85J6\nSToy3nKQPDVxF4DIkWlX8Pjjj6t3794aMGCAxowZo+eee06SFELQ73//ew0cOFBDhw5Vr1699KlP\nfUp33HFHq9e/9dZbGj16tG644Qb9+c9/jmMK2IFqavh36g2Z+kKe/pBpOsTanIcQ1ktaL+n9EMLL\nIYRX4qwHSVQddwGIHJnG7eCDD9b8+fO1ePFi3XTTTXr66ad17LHHasOGDVq3bp3efPNNzZw5U8OG\nDdPdd9+tr3zlKzrllFO0dOnS5n1MnjxZn/nMZzR8+HBVV5OpN2TqD5n6Qp7+kGk6xH3kPAYTlbtV\nU8vH0Wp7tK5W7d/SabykOQXbsvmxjQXbp0uaWbBtdX7syoLtVZKmFGxryo+tK9heLWlsO7WNUvrm\nUSIf8/CSRxTzeEs+5pHEPOZLkj796U/r1FNP1W677aaqqir95Cc/0b/+9S/96le/0saNGyVJpaWl\nmjhxog499FBdeumlOumkk3TGGWeorq5OixYt0n333afKykpVV1eruLi47SxGjWpzFKC2trbdW8WM\nHz9ec+a0nkc2m1Umk1FjY+t5TJ8+XTNnts5j9erVymQyWrmydR5VVVWaMqV1Hk1NTcpkMq2usZdy\nPxSNHds2j7TOo3BhoqTOw0seUczj+9//vot5eMnjw86D77v+5sH33WTMY/bs2cpkMs2PQYMGaeTI\nkW320RELId711MxskqRJ+WvNC5/bKGlECKHdJX7z15w/LemwEMKjW3ifckn10gJJoz984QDgTlZS\nherr61VeXt7qmU9+8pM64YQTNGPGDO2yyy6aMWOG/vu//7v5+W9/+9t68MEHtXTpUk2ePFlVVVWt\nFoF7//33VVRUpM9+9rO67777OmtCAAAAscpms6qoqJCkihBCdnNjPRw5Z7V2ANiB3nzzTT3xxBPa\nb7/91KNHDx155JFatWpVqzH//Oc/1bdvX0nSd77zHT366KN65JFHmh+SdO2112revHmdXj8AAEAS\nxLpae3vMbBflbq+26ZBLfzMbLOnVEMJz+TF7SCqV1Ds/7sD8yu5rQwgvxVA2ALjxk5/8ROeff776\n9u2rNWvWaPr06erRo4dOP/10SdKUKVN0+umn69hjj9Vxxx2nu+66S3feeaeWLFkiSdp777219957\nt9lvnz59mht4AAAAtNYVj5wfIelhSfXKHRX/kXLnWra8GCqTH/O7/Jjq/Jivd2ql6ALauyYXyUam\ncVu3bp3+67/+SwceeKBOP/107bXXXvrLX/6iPffcU5I0YsQI3XTTTbrmmmt06KGHau7cufrtb3+r\no48+ut39jR07lvucO9Pe9XpINjL1hTz9IdN0iP3IeQjhWknXtvh4ibbwS4MQws8l/XwHl4ZEGLLl\nIUgYMo3bD37wgzbXnBc655xzdM4552zV/oYMGcLp7M4ULkyE5CNTX8jTHzJNh9gXhOssLAgHAFvS\n8YJwAAAA2HZpWxAOAAAAAIBEozkHAAAAACBmNOdIuLq4C0DkyNSbujoy9YZM/SFTX8jTHzJNB5pz\nJNw1cReAyJGpN9dcQ6bekKk/ZOoLefpDpunAgnBIuCZJxXEXgUiRaXx2zIJwTU1NKi4mU0/I1B8y\n9YU8/SHT5GJBOKQI36T8IVNv+GHCHzL1h0x9IU9/yDQdaM4BAAAAAIgZzTkAAAAAADGjOUfCTYm7\nAESOTL2ZMoVMvSFTf8jUF/L0h0zTgeYcCVcadwGIHJl6U1pKpt6QqT9k6gt5+kOm6RDZau1m9tEQ\nwr8i2dkO8MFq7ZdLGhZ3OQDQBTVIGhP5au0AAABptS2rtXffnjcws0slPRNCWJj/+FeSTjWztZKG\nhRAe2Z79do5p+QcAoFDPnsUqKSmJuwwAAIDU2a7mXNKFyt8s3MxOkHSCpJMknSbph5KGRFLdDrBg\nwQKVlZXFXQYAdEklJSWcOgcAABCD7W3O95H0XP7vwyX9KoRQa2bPSFoWRWE7SllZGadrOrJy5Uod\neOCBcZeBCJGpP2TqD5n6Q6a+kKc/ZJoO27sg3GuS+uT/PlTSPfm/m6RuH7YoYGtNnTo17hIQMTL1\nh9+VuQMAACAASURBVEz9IVN/yNQX8vSHTNNhe4+c/1bSL83scUl7Srorv/1wSU9EURiwNWbNmhV3\nCYgYmfpDpv6QqT9k6gt5+kOm6bC9zflkSc8od/R8agjhzfz2fSXdEEFdwFbh2lh/yNQfMvWHTP0h\nU1/I0x8yTYftas5DCO9K+t92tld+6IoAAAAAAEiZ7b3mXGZ2ppnVmdkLZtY3v+0SMzs5uvIAAAAA\nAPBve+9zPk7S/0j6iaTL9MEicP+SdImkOyKpbgdoaGiIuwREaP78+TrnnHPiLiOxuuJts2bOnKlL\nL7007jIQITL1h0z9IVNfyNMfMk2H7b3m/GJJXwsh1JjZt1tsX652TnfvSsaMGRN3CYhYVVVV3CUk\nVs+exVq1qqFLNehNTU1xl4CIkak/ZOoPmfpCnv6QaTpYCGHbX2T2lqQDQwjPmtl6SYNDCE+Z2UBJ\nj4YQ/iPqQj8sMyuXVC9dLmlY3OUAXUCDpDGqr69XeXl53MUAAAAA7mSzWVVUVEhSRQghu7mx23vk\n/GlJh0l6tmD7UOV+4u/C+kmiEQEAAAAAdB3b25z/WNL1ZtZTkkn6pJmdIek7ks6PqjgAAAAAANJg\nu1ZrDyHcLOlSSVdIKpb0S0njJE0KIdwWXXnAljTGXQAi1thIpt6QqT9k6g+Z+kKe/pBpOmxzc245\npZJ+E0IYKOkjkvYJIewfQpgTeYXAZp0bdwGI2Lnnkqk3ZOoPmfpDpr6Qpz9kmg7bc+TcJD0hqY8k\nhRCaQgjrIq0K2Goz4i4AEZsxY0bcJSBiZOoPmfpDpr6Qpz9kmg7b3JyHEDZKelzSntGXA2wrFvfz\nhpXj/SFTf8jUHzL1hTz9IdN02K5rziV9W9IPzezgKIsBAAAAACCNtne19luUWwjuETN7R9JbLZ8M\nIfznhy0MAAAAAID/z97dh0dZnvn//5yB1RgfsEgFq6JS/Ia0riBRWy2K+ICUtdN2i4utFBYfK6Sg\nVdjyrQpU/bXY+lTAKjZoKZq6td+m1LqKVds1SmHNVLa2CSsFiwpUg0+YgHXh+v0xQ0wmCZA4yT33\neb9fxzFH4Z47w3n3XVKuzMw1SdHVZ86vlHSZMrtxfU3SVTk3oIewB6E3lZU09Yam/tDUH5r6Qk9/\naJoMXf0otR/v7pbvISXJzBaZ2RYz22Fmx3fHn4E4Skc9APIsnaapNzT1h6b+0NQXevpD02To0uLc\nzAbu7pbvIc1sjKSJksZKOkzSCy3u+6aZ7TSzW/P95yIOFkY9QOw99NBDGjp0qPr06aM+ffro1FNP\n1aOPPtp8/9y5c1VWVqYDDjhAffv21TnnnKNVq1a1eZwVK1borLPO0gEHHKA+ffrojDPO0Hvvvdfp\neRYupKk3NPWHpv7Q1Bd6+kPTZOjqe85fkhR2c3+vLj5uRwZL2hRCWNnyoJmdpMzL61fn+c8DEqN/\n//6aN2+ejj32WIUQdN999+nzn/+8nn/+eZWVlam0tFQLFy7UoEGDtG3bNt16660aPXq0/vKXv+iQ\nQzIf2rBixQp99rOf1be+9S0tXLhQvXr10urVq1VU1NV3zgAAAADJYiHsbo3dwReZDc059A+STpD0\nDUnfCiH8vzzMtuvPulfSJGV+GGCSXgohDDKzAyTVSrpC0nWS/hBC+MZuHmd45vylki7M13hAjKUl\nlau2trbNx3Mccsgh+v73v6/Jkye3+aqtW7eqT58+euKJJzRq1ChJ0imnnKJzzz2Xz+AEAAAAWkin\n0yovL5ek8hDCbt+f0NX3nK/OuT0XQrhH0jWSpnXlMXdjmqTrJb0iqb+kk7LHF0r6VQjhyTz/eUBi\n7dy5Uz/96U/V1NSkU045pc3977//vu6++24dfPDBGjo08zO6119/XStXrlS/fv30mc98RgMGDNAZ\nZ5yhZ555pqfHBwAAAGIr3685XaMPFs95EULYKmmrpB0hhNdDCFvM7AJJwyTNyuefhThKRT2ACy+8\n8IIOPPBA7bvvvpoyZYp+8YtfaMiQIc33//rXv9aBBx6o4uJi3XHHHXr88cfVt2/mExPXrVsnKfPe\n9Msvv1yPPfaYhg8frrPOOkt/+ctfOj1LKkVTb2jqD039oakv9PSHpsnQ1Q3hDsq59TGzIZJulPRi\nfkds82cfKel2SReGEN7vzj8LcVAR9QAuDBkyRKtXr9aqVat0xRVXaOLEiaqvr2++/8wzz9Tq1au1\nYsUKjRkzRueff74aGhokZZ5tl6Svfe1rmjhxooYOHapbb71VpaWlWrx4cadnqaigqTc09Yem/tDU\nF3r6Q9Nk6Ooz529JerPF7Q1Jf5Z0ijLvAe9OwyV9VFLazN43s/cljZQ03cz+bma2+y+fpsyzrS1v\np0iqzjlvudp/Vnaq2n62djp7bkPO8dmS5uUc25A9tz7n+HxJM3KONWXPrck5XiWp7XuBpfFK3nX8\nUj6uI4oef2g+0rt3b61cuVI/+MEPdNNNN2no0KG64447Mlcxfrwee+wxDRo0SCeffLLuuece/f3v\nf9fpp58uSTrssMMkSWVlZZo6dWrz53CWlZVpw4YNSqfTSqVSzYv55quYPVvz5rW+jg0bNmjBggWt\nfjAgSfPnz9eMGa2vo6mpSalUSjU1rXtUVVW1+1758ePHq7q6dY/ly5e3+5PoltexS2evI5VKcR3Z\n66iqqnJxHV565OM6Xn75ZRfX4aVHPq5j4MDWH7YT1+vw0oPvu7568H33g+vw0qOj61i0aJFSqVTz\nrbS0VOPGjWvzGB3p6oZwI3MO7ZT0uqS1IYT/7fQD7vnPmy5peouN4HI/ru0+SXWSvhtCqOvgMdgQ\nDmil4w3hzjrrLB111FEdPvM9ePBgTZw4Uddff70k6YgjjtDFF1+suXPnNp8zfPhwjR07VjfeeGO3\nXQEAAABQyDqzIVxXP0otSHo2dyFuZr3N7PQQwn928XH3/AeH8K4yz9K3/HMbJW3paGEOoGMLFizQ\n5MmTNXDgQG3dulX333+/fve732n58uVqamrSTTfdpFQqpcMOO0wNDQ1asGCBNm7cqPPPP7/5MWbM\nmKE5c+bo+OOP17Bhw3TfffdpzZo1+vnPfx7hlQEAAADx0dWXtT8lqW87x/tk7+tpnX/6H07kvmwc\nnfXGG29o0qRJGjJkiM4++2zV1tZq+fLlOvPMM9WrVy/V19dr3LhxKi0tVSqV0ptvvqmamhqVlZU1\nP8b06dM1a9YsfeMb39CwYcP01FNP6Te/+Y2OOeaYTs+T+5IixB9N/aGpPzT1hZ7+0DQZuvqy9p2S\n+ocQXs85/n8kPRdCOChP8+UNL2v3arykB6MeIqY6fll7lMaPH68HH6SpJzT1h6b+0NQXevpD0/jq\nzMvaO7U4N7P/l/3l5yU9Kum9Fnf3knS8pDUhhDGdmrgHsDgHchXm4hwAAADwojvfc/529j9Nmc8e\n39bivr9L+r2kezr5mAAAAAAAJFqnFuchhMmSZGYvSfp+CKGxO4YCAAAAACBJurRbewhh7p7PAgAA\nAAAAe6Oru7XLzMaZ2b+b2e/NLN3yls8Bgd2bHPUAyLPJk2nqDU39oak/NPWFnv7QNBm6tDg3s2mS\n7pX0N0knSFolaYukQZL+I2/TAXs0OuoBkGejR9PUG5r6Q1N/aOoLPf2haTJ09aPU6iXNDSFUmdlW\nSUNDCOvM7NuS+oYQKvI96IfFbu1ALnZrBwAAALpTZ3Zr7+rL2gdKejb7622SDsz++ieSvtzFxwQA\nAAAAIJG6ujjfLKlv9tcbJH06++tjlPmYNQAAAAAAsJe6ujh/UlIq++t7Jd1mZo9LelDSL/IxGLB3\naqIeAHlWU0NTb2jqD039oakv9PSHpsnQ1cX5ZZJukqQQwkJJF0mqk3S9pCvyMxqwN26OegDk2c03\n09QbmvpDU39o6gs9/aFpMnRpQ7g4+mBDuBskjY16HOTNNkn7RT1ETNVJmlBwG8I1NTWppKQk6jGQ\nRzT1h6b+0NQXevpD0/jqzIZwvbv6h5jZaZIul/RxSeNCCK+a2VclrQ8hFPDrLq7L3gAUF5eoX79+\nUY/RCv/H4w9N/aGpPzT1hZ7+0DQZurQ4N7MvKbMz+/3KfM75vtm7+kj6vyrgp6aXLl2qsrKyqMcA\nCkK/fv00cODAqMcAAAAAEq+rz5xfK+lrIYQlZnZBi+PPZO8rWGVlZQX1El4AAAAAALq6IVyppP9s\n5/jbkg7u+jhA58yYMSPqEZBnNPWHpv7Q1B+a+kJPf2iaDB/mc84Ht3N8hKR1XR8H6Bxeku0PTf2h\nqT809YemvtDTH5omQ5d2azezWZImKPMRao8r8x7zoyTdJumGEML8fA6ZD7t2ay+0nakBAAAAAD71\nxG7t31XmWfcnJJUo8xL39yR9vxAX5gAAAAAAFLJOLc7NbJAyH5UWJN1kZt9T5uXtB0j6cwjh3W6Y\nEQAAAAAA1zr7zPmLkg6T9Fr29z+RNC2E8Oe8TtWN6urqoh4BXdDRR37V19dryJAhEUyE7kJTf2jq\nD039oakv9PSHpsnQqfecm9lOSQNCCK9lf79V0tAQQsFvArfrPedRz4GuKS4u0Zo1dW0W6KlUSsuW\nLYtoKnQHmvpDU39o6g9NfaGnPzSNr8685zyBi/MblNm/DvFRJ2mC2tvMb8OGDexe6QxN/aGpPzT1\nh6a+0NMfmsZXd24IF7K33GMxcowkdmv3gm9S/tDUH5r6Q1N/aOoLPf2haTJ0dnFuku4zs/eyvy+W\ndJeZNbY8KYTwz/kYDgAAAACAJOjs4vzHOb9fmq9BAAAAAABIqqLOnBxCmLw3t+4aFsg1b968qEdA\nntHUH5r6Q1N/aOoLPf2haTJ0anEOFJqmpqaoR0Ce0dQfmvpDU39o6gs9/aFpMnRqt/Y4+2C39qWS\nLox6HHRKWlJ5u7u1AwAAAECh6sxu7TxzDgAAAABAxFicAwAAAAAQMRbniLWGhoaoR0Ce0dQfmvpD\nU39o6gs9/aFpMsRmcW5mi8xsi5ntMLPjo54HheGiiy6KegTkGU39oak/NPWHpr7Q0x+aJkMsFudm\nNkbSREljJQ2QtM7Mbjezl8ysycxqzOzEaKdET3j66aeVSqV0+OGHq6ioSKNGjWp1f2NjoyoqKnTk\nkUeqpKREn/zkJ3X33Xe3OmfdunX653/+Zx166KHq06ePLrjgAr322ms9eRnYjTlz5kQ9AvKMpv7Q\n1B+a+kJPf2iaDLFYnEsaLGlTCGFlCOF1SZWSzlJm2/XjJD0u6TdmdliEM6IHNDY2atiwYbrzzjtl\nZvr4xz/e6v6rrrpKy5cv1wMPPKD6+npdddVVqqio0MMPPywp8zEUo0ePVlFRkX7729/q2Wef1Xvv\nvafPfe5zUVwO2sGO/P7Q1B+a+kNTX+jpD02ToXfUA+yJmd0raZKkYGY7JL0uqa+kVAjhmexpc83s\nc5KukHR9NJOiJ4wZM0ZjxoyRJLX3MYArVqzQpEmTdNppp0mSLrnkEt11111atWqVzjvvPNXU1Oiv\nf/2rVq9erf3331+S9OMf/1gf+chH9OSTT+rMM8/suYsBAAAAgKw4PHM+TZkF9yvKvKT9RGV+qPBe\nznnbJI3o2dFQaE499VQtW7ZMGzdulCQ99dRTevHFF3XuuedKkv7+97/LzLTPPvs0f82+++6roqIi\n1dTURDIzAAAAABT84jyEsFXSVkk7QgivhxBekbRC0nVmdpiZFZnZBEmnSOJl7Qnz+OOPt/r9/Pnz\nVVZWpiOOOEL77LOPxo4dq4ULF+ozn/mMJOnTn/609t9/f82cOVPbtm1TY2OjrrnmGu3cuVObNm2K\n4hKQo7KyMuoRkGc09Yem/tDUF3r6Q9NkKPjFeQcmSDJJr0raLqlC0gOSdkY5FHreX/7yl1a//8EP\nfqCVK1fq4YcfVjqd1i233KIpU6boySeflCT169dPP/vZz/Twww/rgAMO0Ec+8hG98847OuGEE1RU\nFNe/Dr6k0+moR0Ce0dQfmvpDU1/o6Q9NkyGWq5EQwvoQwihJ+0s6MoTwaUn7SFq356+eJimVcztF\nUnXOecuz9+Waqsx+dC2ls+fmfv7gbEnzco5tyJ5bn3N8vqQZOceasufmvty6StLkdmYbL7/Xkdns\nrT27fpK4fft2fetb39KUKVN01113acCAAZoyZYrGjx+v73//+5o9e7bmzZuns88+Wy+++KJef/11\n/eEPf9Cbb76pv/71rxo0aNAHVzF/vmbMaH0dTU1NSqVSbV7+XlVVpcmT217H+PHjVV3d+jqWL1+u\nVKptj6lTp7b5iWg6nVYqlWrzuZa7rqOlDRs2KJVKqb6+dY84XsfLL7/s4jq89MjHdTQ1Nbm4Di89\n8nEduRsTxfU6vPTIx3V8/etfd3EdXnrwfddXD77vfnAdXnp0dB2LFi1SKpVqvpWWlmrcuHFtHqMj\n1t6mWoXGzKZLmh5CGNTB/R9RZmF+TQih3dd8mNlwSbXSUmU2eUd8pCWVq7a2ttU3pqKiIlVXVzf/\npdm6dav69OmjRx99VKNHj24+72tf+5peeuklPfroo+0++pNPPqnRo0errq5Oxx57bLdeCQAAAIDk\nSKfTKi8vl6TyEMJuXwJR8Lu1t8fMRivzsvY1ko6VdLOkP0u6L8Kx0AMaGxu1du3a5p3a161bp9Wr\nV6tv37468sgjNXLkSF1zzTWaP3++jjrqKP32t7/VkiVLdPvttzc/xn333aeysjJ99KMf1bPPPqsr\nr7xS3/jGN1iYAwAAAIhMLBfnkvpI+o6kwyW9IekhSdeGEHZEOhW63XPPPadRo0bJzGRmuvrqqyVJ\nkyZN0uLFi/Xggw9q1qxZmjBhgt544w0dddRR+s53vqPLLrus+THWrFmjWbNm6c0339TRRx+t6667\nTtOnT4/qkgAAAAAgHi9rzwde1h5n7b+sXZJSqZSWLVsWzVjoFjT1h6b+0NQfmvpCT39oGl+deVl7\nLDeEA3apqKiIegTkGU39oak/NPWHpr7Q0x+aJgPPnCMGOn7mHAAAAAAKFc+cAwAAAAAQIyzOAQAA\nAACIGItzxFp1dXXUIyDPaOoPTf2hqT809YWe/tA0GVicI9aqqqqiHgF5RlN/aOoPTf2hqS/09Iem\nycCGcIgBNoQDAAAAED9sCAcAAAAAQIywOAcAAAAAIGIszgEAAAAAiBiLc8Ta5MmTox4BeUZTf2jq\nD039oakv9PSHpsnA4hyxNnr06KhHQJ7R1B+a+kNTf2jqCz39oWkyJHC39hskjY16HHRKnaQJ7NYO\nAAAAIFY6s1t7754ZqZBcl70hToqLS9SvX7+oxwAAAACAbpG4xfnSpUtVVlYW9RjopH79+mngwIFR\njwEAAAAA3SJxi/OysjJeGu1ITU2NRowYEfUYyCOa+kNTf2jqD019oac/NE0GNoRDrN18881Rj4A8\no6k/NPWHpv7Q1Bd6+kPTZEjchnBsKuZLU1OTSkpKoh4DeURTf2jqD039oakv9PSHpvHVmQ3heOYc\nscY3KX9o6g9N/aGpPzT1hZ7+0DQZWJwDAAAAABCxxG0IV1dXF/UI6CR2agcAAADgXeIW5xMmTIh6\nBHRScXGJ1qypa3eBPmPGDH3ve9+LYCp0F5r6Q1N/aOoPTX2hpz80TYbELc6lGySNjXoI7LU6bd8+\nQQ0NDe0uznlG3R+a+kNTf2jqD019oac/NE2GxO3WLi2VdGHU42CvpSWVi132AQAAAMQNu7UDAAAA\nABAjLM4BAAAAAIgYi3PEWn19fdQjIM9o6g9N/aGpPzT1hZ7+0DQZWJwj1mbOnBn1CMgzmvpDU39o\n6g9NfaGnPzRNBhbniLUFCxZEPQLyjKb+0NQfmvpDU1/o6Q9Nk4HFOWKNj5Xwh6b+0NQfmvpDU1/o\n6Q9Nk4HFOQAAAAAAEWNxDgAAAABAxFicI9bmzZsX9QjIM5r6Q1N/aOoPTX2hpz80TYbYLM7NbJGZ\nbTGzHWZ2fNTzoDA0NTVFPQLyjKb+0NQfmvpDU1/o6Q9Nk8FCCFHPsEdmNkbSLyWdLmm9pMskpSQN\nkbRN0rOS/i2E8D+7eYzhkmqlpZIu7PaZkS9pSeWqra1VY2Ojvve976m2tlabNm1SdXW1UqlU85mN\njY36t3/7N/3yl7/Uli1bdMwxx2jatGm6/PLLJUl//etfdcwxx8jMlPu/+5/97Gf60pe+1JMXBgAA\nAMC5dDqt8vJySSoPIaR3d25cnjkfLGljCGFlCOE1SadKmi/pU5LOlvQPkpab2X4Rzohu1tjYqGHD\nhunOO++UmbW5/6qrrtLy5cv1wAMPqL6+XldddZUqKir08MMPS5KOPPJIbd68WZs2bdLmzZu1efNm\nzZ07VwceeKA++9nP9vTlAAAAAECz3lEPsCdmdq+kSZKCme2U9FIIYVDOOf8q6TVJ5ZJqenxI9Igx\nY8ZozJgxktTmmW9JWrFihSZNmqTTTjtNknTJJZforrvu0qpVq3TeeeepqKhIhx56aKuv+cUvfqHx\n48erpKSk+y8AAAAAADoQh2fOp0m6XtIrkvpLOqmdcw6WFCS90YNzoQA0NDQ0//rUU0/VsmXLtHHj\nRknSU089pRdffFHnnntuu19bW1ur559/XhdffHGPzIq907IpfKCpPzT1h6a+0NMfmiZDwS/OQwhb\nJW2VtCOE8HoIYUvL+y3z+ubbJdWEEP4cxYyIzkUXXdT86/nz56usrExHHHGE9tlnH40dO1YLFy7U\nZz7zmXa/trKyUp/4xCf0qU99qqfGxV5o2RQ+0NQfmvpDU1/o6Q9Nk6HgF+d74U5Jn5B0wd6dPk2Z\nveRa3k6RVJ1z3vLsfbmmSqrMOZbOnpv7E63ZknI/9mBD9tz6nOPzJc3IOdaUPTf3lfpVkia3M9t4\neb2OFStWtNr8bZfi4mJVVmau4wc/+IFWrlyp22+/Xaeeeqrmzp2rKVOm6Mknn8xcxezZzR9DsX37\ndlVVVelLX/qSUqmU6utbX8f8+fM1Y0br62hqalIqlVJNTevrqKqq0uTJba9j/Pjxqq5ufR3Lly9v\n9zqmTp3afB27pNNppVKpNj8pbXkdu2zYsMHNdbz99tsursNLj3xcR3vieB1eeuTjOoYNG+biOrz0\nyMd1TJo0ycV1eOnB911fPfi++8F1eOnR0XUsWrRIqVSq+VZaWqpx48a1eYyOxGW39umSprfzXvMF\nkj4n6bQQwoY9PAa7tcfSB7u1Dx8+vPloUVFRq93at2/frj59+qi6urrV5m6XXnqpXn31VT3yyCOt\nHvUnP/lJ832HHHJIj1wJAAAAgGTpzG7tBb8hXEeyC/PPSxq5p4U5/Hv//ff1/vvvq1evXq2O9+rV\nSzt37mxz/uLFi5VKpViYAwAAACgIsVycm9mdkr6szGulG82sf/aut0MI26ObDN2psbFRa9eubd6p\nfd26dVq9erX69u2rI488UiNHjtQ111yj+fPn66ijjtJvf/tbLVmyRLfffnurx1m7dq3+8z//U48+\n+mgUlwEAAAAAbcT1Pedfk3SQpN9K2tji9i8RzoRu9txzz+mEE05QeXm5zExXX321TjjhBM2ePVuS\n9OCDD+qkk07ShAkT9MlPflI333yzvvOd7+iyyy5r9Tj33nuvBg4cqHPOOSeKy8Ae5L6HB/FHU39o\n6g9NfaGnPzRNhlgszkMId7R8v3kIoSiE0Kud25Io50T3GjlypHbu3KkdO3Y036644gotXrxYknTo\noYeqsrJSL7/8shobG/XnP/9Z06dPb/M4N910k9avX9/T42MvpdO7fSsOYoim/tDUH5r6Qk9/aJoM\nsdgQLh/YEC6u2t8QDgAAAAAKXWc2hIvFM+cAAAAAAHjG4hwAAAAAgIixOAcAAAAAIGIszhFrqVQq\n6hGQZzT1h6b+0NQfmvpCT39omgwszhFrFRUVUY+APKOpPzT1h6b+0NQXevpD02Rgt3YUOHZrBwAA\nABBP7NYOAAAAAECMsDgHAAAAACBiLM4Ra9XV1VGPgDyjqT809Yem/tDUF3r6Q9NkYHGOWKuqqop6\nBOQZTf2hqT809YemvtDTH5omQwI3hLtB0tiox8Feq5M0gQ3hAAAAAMROZzaE690zIxWS67I3xEVx\ncYn69esX9RgAAAAA0G0StzhfunSpysrKoh4DndCvXz8NHDgw6jEAAAAAoNskbnFeVlbGy6MBAAAA\nAAWFDeEQa5MnT456BOQZTf2hqT809YemvtDTH5omA4tzxNro0aOjHgF5RlN/aOoPTf2hqS/09Iem\nyZC43drZ9RsAAAAA0BM6s1s7z5wDAAAAABAxFucAAAAAAEQscbu119XVRT0CcnyYj0qrqanRiBEj\n8jwRokRTf2jqD039oakv9PSHpsmQuPecRz0H2iouLtGaNXVdWqCnUiktW7asG6ZCVGjqD039oak/\nNPWFnv7QNL46857zBC7Ob5A0Nupx0KxO0gR1daO+pqYmlZSU5H8sRIam/tDUH5r6Q1Nf6OkPTeOr\nM4vzxL2sXTpGEru1e8E3KX9o6g9N/aGpPzT1hZ7+0DQZ2BAOAAAAAICIsTgHAAAAACBiLM4RazNm\nzIh6BOQZTf2hqT809YemvtDTH5omA4tzxFpXP4INhYum/tDUH5r6Q1Nf6OkPTZMhgbu1L5V0YdTj\noFlaUnmXd2sHAAAAgELVmd3aeeYcAAAAAICIsTgHAAAAACBiLM4Ra/X19VGPgDyjqT809Yem/tDU\nF3r6Q9NkKIjFuZktMrMtZrbDzI6Peh7Ex8yZM6MeAXlGU39o6g9N/aGpL/T0h6bJEPni3MzGSJoo\naaykwyT1MbNlZvaqme00s1QHX/dtM9toZk1m9riZDe7JuZF/Tz/9tFKplA4//HAVFRVp2bJlre4v\nKipSr169VFRU1Hx7+OGHdcstt7T7eJ/97GfbfRwUtgULFkQ9AvKMpv7Q1B+a+kJPf2iaDJEvziUN\nlrQphLAyhPCapP0lPS9piqR2t5I3s3+TVCHpMkknS2qU9JiZ7dMzI6M7NDY2atiwYbrzzjtlMfbx\nBwAAIABJREFUZm3u37x5szZt2qTNmzdr8+bNWrx4sYqKijRu3Lg25952223q1atXu4+DwsZHhfhD\nU39o6g9NfaGnPzRNht5R/uFmdq+kSZKCme2U9FIIYZCkR7P3d7Symi7phhDCw9nzJkr6m6QvSPr3\nbh8c3WLMmDEaM2aMJKm9j/g79NBDW/2+urpao0aN0lFHHdXq+PPPP6/bbrtNzz33nAYMGNB9AwMA\nAABAnkT9zPk0SddLekVSf0kn7ekLzOwYSQMkPbHrWAjhHUkrJZ3SPWOi0Lz22mt65JFHdMkll7Q6\nvm3bNl144YW688472yzmAQAAAKBQRbo4DyFslbRV0o4QwushhC178WUDlHm5+99yjv8tex8S4L77\n7tNBBx2ktWvXtjp+1VVXacSIETrvvPMimgwf1rx586IeAXlGU39o6g9NfaGnPzRNhqifOY/ANEmp\nnNspkqpzzluevS/XVEmVOcfS2XMbco7PlpT7F2lD9tzcj0OYL2lGzrGm7Lk1OcerJE1uZ7bxit91\nzGkz2fjx49scW758uVKpD67j3nvv1YQJE1RdXa3Kysx1LFu2TE8++aQmTpyoVCqlhobW1zF79uw2\n39g2bNigVCrV5uMp5s+frxkzWl9HU1OTUqmUampaX0dVVZUmT27bY/z48aqubt0j9zp2mTp1avN1\n7JJOpxN5HYsXL3ZxHV565OM6qqqqXFyHlx75uI5nnnnGxXV46ZGP69iwYYOL6/DSg++7vnrwffeD\n6/DSo6PrWLRokVKpVPOttLS03f2xOmLtvbe3J5nZdEnTs+81z71vp6QvhBCWtTh2jKS/SBoWQvjv\nFsd/K+kPIYSrOvhzhkuqlZZKujC/F4EPIS2pXLW1tRo+fHjz0aKiIlVXV7f7F+Lpp5/WGWecodWr\nV+u4445rPn7VVVdp/vz5rTaB27Fjh4qKinT66afrySef7NYrAQAAAICW0um0ysvLJak8hJDe3bmR\nbgjXFSGE9Wa2WdJZkv5bkszsIEmfkrQwytnQMyorK1VeXt5qYS5Js2bN0qWXXtrq2HHHHac77riD\nl7kDAAAAKGgFtzg3s/2V+Xi1XU9/DjKzoZLeCCG8nD12u6RrzWytpJck3aDMpnK/7OFxkUeNjY1a\nu3Zt807t69at0+rVq9W3b18deeSRkqR33nlHDz30kG677bY2X3/ooYe2uwnckUce2WZHdwAAAAAo\nJIX4nvMTJf1BUq0yG7/dosxrn+fuOiGEcLMyb26+W5ld2veT9NkQwt97fFrkzXPPPacTTjhB5eXl\nMjNdffXVGj58uGbPnt18zoMPPihJuuCCCySpzftTcvE55/Gzp6aIH5r6Q1N/aOoLPf2haTJEvjgP\nIdzR8v3mIYTfhRCKQgi9cm4X5XzdnBDCx0IIJSGEc0MIa9s+OuJk5MiR2rlzp3bs2NHqtnjx4uZz\nLr30Ur377rs68MADJUkXXXRRRw8nKfOe8/bet47CtaemiB+a+kNTf2jqCz39oWkyRL44Bz6MOXPm\nRD0C8oym/tDUH5r6Q1Nf6OkPTZOBxTlireUO7/CBpv7Q1B+a+kNTX+jpD02TgcU5AAAAAAARY3EO\nAAAAAEDEWJwj1iorK6MeAXlGU39o6g9N/aGpL/T0h6bJwOIcsZZOp6MeAXlGU39o6g9N/aGpL/T0\nh6bJYCGEqGfoEWY2XFKttFTShVGPg2ZpSeWqra1lowsAAAAArqTTaZWXl0tSeQhhtz9l4ZlzAAAA\nAAAixuIcAAAAAICIsTgHAAAAACBiLM4Ra6lUKuoRkGc09Yem/tDUH5r6Qk9/aJoMvaMeoOetV2YT\nMhSGug/11RUVFXmaA4WCpv7Q1B+a+kNTX+jpD02TIYG7taPQFBeXaM2aOg0cODDqUQAAAAAgbzqz\nW3vinjlfunSpysrKoh4DLfTr14+FOQAAAIBES9zivKysjM/TBgAAAAAUFDaEQ6xVV1dHPQLyjKb+\n0NQfmvpDU1/o6Q9Nk4HFOWKtqqoq6hGQZzT1h6b+0NQfmvpCT39omgyJ2xCutraWl7UDAAAAALpd\nZzaE45lzAAAAAAAixuIcAAAAAICIJW639rq6uqhHiBU+5gwAAAAAul/iFucTJkyIeoRYKS4u0Zo1\ndQW7QJ88ebLuvffeqMdAHtHUH5r6Q1N/aOoLPf2haTIkbnEu3SBpbNRDxESdtm+foIaGhoJdnI8e\nPTrqEZBnNPWHpv7Q1B+a+kJPf2iaDInbrV1aKunCqMeJibSkcrHDPQAAAAB0Hru1AwAAAAAQIyzO\nAQAAAACIGItzxFpNTU3UIyDPaOoPTf2hqT809YWe/tA0GVicI9ZuvvnmqEdAntHUH5r6Q1N/aOoL\nPf2haTKwIRx2o/A3hGtqalJJSUnUYyCPaOoPTf2hqT809YWe/tA0vtgQDonBNyl/aOoPTf2hqT80\n9YWe/tA0GVicAwAAAAAQMRbnAAAAAABELDaLczNbZGZbzGyHmR0f9TwoDDNmzIh6BOQZTf2hqT80\n9YemvtDTH5omQywW52Y2RtJESWMlHSapj5ktM7NXzWynmaWinTAZnn76aaVSKR1++OEqKirSsmXL\nWt0/d+5clZWV6YADDlDfvn11zjnnaNWqVc33v/nmm5o2bZqGDBmikpISHXXUUZo+fbreeeedLs80\ncODALn8tChNN/aGpPzT1h6a+0NMfmiZDLBbnkgZL2hRCWBlCeE3S/pKelzRFUjK2my8AjY2NGjZs\nmO68806ZWZv7S0tLtXDhQr3wwgt65plndPTRR2v06NHasmWLJGnjxo3atGmTbr31Vv3pT3/Sj3/8\nYz366KO65JJLujzT17/+9S5/LQoTTf2hqT809YemvtDTH5omQ8F/lJqZ3StpkjKLcJP0UghhUIv7\nd0r6QghhWQcPses8Pkqt0zr+KLWioiJVV1crler4RQtbt25Vnz599MQTT2jUqFHtnvPQQw/pq1/9\nqhobG1VUFJefFQEAAADAnnXmo9R698xIH8o0SX+RdKmkEyXtjHYc7I33339fd999tw4++GANHTq0\nw/PeeustHXTQQSzMAQAAACRawa+IQghbJW2VtCOE8HoIYUvUM6Fjv/71r3XggQequLhYd9xxhx5/\n/HH17du33XMbGhp044036vLLL+/yn1dfX9/lr0Vhoqk/NPWHpv7Q1Bd6+kPTZCj4xTni5cwzz9Tq\n1au1YsUKjRkzRueff74aGhranLd161b90z/9k4477jjNnj27y3/ezJkzP8y4KEA09Yem/tDUH5r6\nQk9/aJoMCVycT5OUyrmdIqk657zl2ftyTZVUmXMsnT03dxE6W9K8nGMbsufm/vRrvqTcj0hoyp5b\nk3O8StLkdmYbr+64jrvuukvz5uVeh3TjjTe2+Snej370I/3whz/UySefrHvuuUe9e/fWD3/4Q6VS\nKdXUZK7j3Xff1bnnnqtt27apb9++6tWrV+urGD9e1dWtr2P58uXtvr/94IMPVmVl6+tIp9NKpVJt\nfigwe/bsNtexYcMGpVKpNtcxf/78Nh9Z0dTU1Oo6dqmqqtLkyW17dOY6pk6dynVkr2Pbtm0ursNL\nj3xcR3FxsYvr8NIjH9cxYsQIF9fhpUc+ruPKK690cR1eevB911cPvu9+cB1eenR0HYsWLVIqlWq+\nlZaWaty4cW0eoyMFvyGcJJnZdEnTW24E1+I+NoTrNh9uQzhJGjx4sCZOnKjrr79eUuYZ83PPPVf7\n7befHnnkEe27777dNTwAAAAARMrbhnBtmNn+yny82q7P8xpkZkMlvRFCeDm6yXxrbGzU2rVrtesH\nOuvWrdPq1avVt29fHXLIIbrpppuUSqV02GGHqaGhQQsWLNDGjRt1/vnnS8oszM855xxt375d999/\nv956663mx/7oRz/KpnAAAAAAEiuWi3Nldm1/SpmPVwuSbske/7Gki6IayrvnnntOo0aNkpnJzHT1\n1VdLkiZNmqQf/vCHqq+v15IlS9TQ0KBDDjlEJ510kmpqalRWViYp81Oj//qv/5KUeUZdkkIIMjOt\nX79eAwcOjObCAAAAACBisXiqMoRwR8uXtIcQfhdCKAoh9Mq5sTDvRiNHjtTOnTu1Y8eOVrfFixdr\n33331c9//nO9/PLL2rZtm1555RX94he/aPVy+JEjR7b52l2P19WFeXvvhUe80dQfmvpDU39o6gs9\n/aFpMsRicQ50pKmpKeoRkGc09Yem/tDUH5r6Qk9/aJoMsdgQLh/YEK4rOt4QDgAAAACwe53ZEI5n\nzgEAAAAAiBiLcwAAAAAAIsbiHLHW0NAQ9QjIM5r6Q1N/aOoPTX2hpz80TQYW54i1iy5ig35vaOoP\nTf2hqT809YWe/tA0GVicI9bmzJkT9QjIM5r6Q1N/aOoPTX2hpz80TQYW54g1dpH3h6b+0NQfmvpD\nU1/o6Q9Nk4HFOQAAAAAAEWNxDgAAAABAxFicI9YqKyujHgF5RlN/aOoPTf2hqS/09IemydA76gF6\n3npJ6aiHiIm6qAfYo3Q6rYsvvjjqMZBHNPWHpv7Q1B+a+kJPf2iaDBZCiHqGHmFmwyXVRj1H3BQX\nl2jNmjoNHDgw6lEAAAAAIFbS6bTKy8slqTyEsNtniRP3zPnSpUtVVlYW9Rix0a9fPxbmAAAAANDN\nErc4Lysr46MIAAAAAAAFhQ3hAAAAAACIGItzxFoqlYp6BOQZTf2hqT809YemvtDTH5omA4tzxFpF\nRUXUIyDPaOoPTf2hqT809YWe/tA0GRK3W3ttbS3vOQcAAAAAdLvO7NbOM+cAAAAAAEQscbu119XV\nRT1Ct+AjzwAAAAAgvhK3OJ8wYULUI3SL4uISrVlTl7gFenV1tb7whS9EPQbyiKb+0NQfmvpDU1/o\n6Q9NkyFxi3PpBkljox4iz+q0ffsENTQ0JG5xXlVVxTcqZ2jqD039oak/NPWFnv7QNBkStyGctFTS\nhVGPk2dpSeViszsAAAAAKBxsCAcAAAAAQIywOAcAAAAAIGIszgEAAAAAiBiLc8Ta5MmTox4BeUZT\nf2jqD039oakv9PSHpsnA4hyxNnr06KhHQJ7R1B+a+kNTf2jqCz39oWkysFu7C+zWDgAAAACFht3a\nAQAAAACIERbnAAAAAABELDaLczNbZGZbzGyHmR0f9TwoDDU1NVGPgDyjqT809Yem/tDUF3r6Q9Nk\niMXi3MzGSJooaaykAZLqzewGM1tnZk1mttbMro12ysLw7rvv6sorr9TRRx+tkpISjRgxQs8991zz\n/XPnzlVZWZkOOOAA9e3bV+ecc45WrVoV4cQfzs033xz1CMgzmvpDU39o6g9NfaGnPzRNhlgsziUN\nlrQphLAyhPC6pGskXS5piqQhkmZKmmlmFRHOWBAuvvhiPfHEE7r//vv1wgsv6JxzztHZZ5+tTZs2\nSZJKS0u1cOFCvfDCC3rmmWd09NFHa/To0dqyZUvEk3fNT3/606hHQJ7R1B+a+kNTf2jqCz39oWky\nFPxu7WZ2r6RJkoIkk/SSpBck/S2EcGmL8x6S1BRCmNjB47jfrf3ZZ5/V6aefrl/96lcaM2ZM870n\nnniixo4dq29/+9ttvnLr1q3q06ePnnjiCY0aNaoHZwYAAAAA37zt1j5N0vWSXpHUX9JJklZIOsvM\njpUkMxsq6TOSHolqyEKwY8cO7dixQ/vuu2+r4/vtt1+771N5//33dffdd+vggw/W0KFDe2pMAAAA\nAECO3lEPsCchhK1mtlXSjuxL2mVm35V0kDLvPd+hzA8ZvhVCSPTrPUpKSnTKKafohhtu0JAhQ9S/\nf3898MADWrFihY499tjm837961/rggsuUFNTkz72sY/p8ccfV9++fSOcHAAAAACSLQ7PnLdnvKSv\nSLpA0gnKvOx9hpl9NdKpCsDSpUsVQtDhhx+u4uJiLViwQF/5yldUVPRB6jPPPFOrV6/WihUrNGbM\nGJ1//vlqaGiIcOqumzFjRtQjIM9o6g9N/aGpPzT1hZ7+0DQZ4ro4v1nSd0MIPwsh/CmEcL+k2yTN\n2vOXTpOUyrmdIqk657zl2ftyTZVUmXMsnT03d4E7W9K8nGMbsufW5xyfLyn3L11T9tzcl6RXSZrc\nZrJvfvObWr16tZ566ik1Njbq5Zdf1re//W098cQTGjRoUPN5++23n2655Rb98Y9/1D333KPevXur\nsrJS6XRaqVSqzUJ99uzZmjev9XVs2LBBqVRK9fWtr2P+/Pltvnk0NTUplUq1eWl9VVWVJk9uex3j\nx49XdXXrHsuXL1cq1bbH73//e1VWtu4Rx+uYOnUq15G9jkcffdTFdXjpkY/rePrpp11ch5ce+biO\nV1991cV1eOmRj+vIfUtcXK/DSw++7/rqwffdD67DS4+OrmPRokVKpVLNt9LSUo0bN67NY3Sk4DeE\nkyQzmy5peghhUPb3DZL+bwhhUYtzZkmaFEIY0sFjuN8Qrra2VsOHD291z5tvvqlBgwbp+9//vi6+\n+OJ2v3rw4MGaOHGirr/++h6YFQAAAACSoTMbwhX8e8478CtJ15rZK5L+JGm4pKsk/SjSqQrA8uXL\nFUJQaWmpXnzxRc2cOVOf+MQn9K//+q9qamrSTTfdpFQqpcMOO0wNDQ1asGCBNm7cqPPPPz/q0QEA\nAAAgseK6OK+QdIOkhZIOlbRR0g+zxxLt7bff1qxZs/Tqq6+qb9++GjdunG688Ub16tVLvXr1Un19\nvZYsWaKGhgYdcsghOumkk1RTU6OysrKoRwcAAACAxIrFy9rzIakva/euvr5eQ4a0+04GxBRN/aGp\nPzT1h6a+0NMfmsaXt885Bzo0c+bMqEdAntHUH5r6Q1N/aOoLPf2haTKwOEesLViwIOoRkGc09Yem\n/tDUH5r6Qk9/aJoMLM4RawMHDox6BOQZTf2hqT809YemvtDTH5omA4tzAAAAAAAixuIcAAAAAICI\nsThHrM2bNy/qEZBnNPWHpv7Q1B+a+kJPf2iaDCzOEWtNTU1Rj4A8o6k/NPWHpv7Q1Bd6+kPTZOBz\nzl1I7uecAwAAAECh4nPOAQAAAACIERbnAAAAAABEjMU5Yq2hoSHqEZBnNPWHpv7Q1B+a+kJPf2ia\nDCzOEWsXXXRR1CMgz2jqD039oak/NPWFnv7QNBl6Rz1Az1uvzAZqntRFPUBk5syZE/UIyDOa+kNT\nf2jqD019oac/NE2GBO7W7lNxcYnWrKnTwIEDox4FAAAAAKDO7daeuGfOly5dqrKysqjHyLt+/fqx\nMAcAAACAmErc4rysrIzPAgcAAAAAFBQ2hEOsVVZWRj0C8oym/tDUH5r6Q1Nf6OkPTZOBxTliLZ32\ntrkfaOoPTf2hqT809YWe/tA0GRK3IVxtbS0vawcAAAAAdLvObAjHM+cAAAAAAESMxTkAAAAAABFL\n3G7tdXV1e30uH08GAAAAAOgJiXvmfMKECSovL9+rW2lpmTZs2BD1yNiNVCoV9QjIM5r6Q1N/aOoP\nTX2hpz80TYbEPXMu3SBp7F6cV6ft2yeooaGBZ88LWEVFRdQjIM9o6g9N/aGpPzT1hZ7+0DQZErdb\nu7RU0oV78RVpSeVid3cAAAAAQFewWzsAAAAAADHC4hwAAAAAgIixOEesVVdXRz0C8oym/tDUH5r6\nQ1Nf6OkPTZOBxTliraqqKuoRkGc09Yem/tDUH5r6Qk9/aJoMbAjXITaEAwAAAAB0HRvCAQAAAAAQ\nIyzOAQAAAACIGItzAAAAAAAiFpvFuZktMrMtZrbDzI6Peh4UhsmTJ0c9AvKMpv7Q1B+a+kNTX+jp\nD02TIRaLczMbI2mSpLGSDpN0upmtNrO3s7dns+d0i+985zs6+eSTddBBB6l///764he/qP/5n/9p\nc97111+vj33sYyopKdE555yjtWvXdtdIyBo9enTUIyDPaOoPTf2hqT809YWe/tA0GWKxW7uZVUi6\nOoRwTPb3/yRph6QXJZmkf5U0Q9KwEEJdB4/R5d3ar732Wn35y1/WiSeeqP/93//VrFmz9MILL6iu\nrk777befJGnevHmaN2+elixZoqOPPlrXXnut/vjHP6qurk777LPPh/xvAAAAAAAQN53Zrb13z4zU\ndWZ2rzLPmgcz2ynppRDCoJzTrjWzKyR9WlK7i/MP45FHHmn1+/vuu0+HHnqoamtrNWLECEnSHXfc\noeuuu07nnXeeJGnJkiXq37+/qqur9S//8i/5HgkAAAAA4EgcXtY+TdL1kl6R1F/SSS3vNLMiM7tA\nUomkFT0x0FtvvSUzU9++fSVJ69ev1+bNm3XWWWc1n3PQQQfpU5/6lFas6JGRAAAAAAAxVvCL8xDC\nVklbJe0IIbweQtgiSWZ2nJltlfSepDslfTGEUN8D8+jKK6/UiBEj9IlPfEKStHnzZpmZ+vfv3+rc\n/v37a/Pmzd09UqLV1NREPQLyjKb+0NQfmvpDU1/o6Q9Nk6HgF+e7US9pqKSTJf1Q0hIzG7LnL5sm\nKZVzO0VSdc557T/j/Y//+I9auXKlfvrTnzYfW7NmjXbu3KktW7a0OnfX+9Jb2rBhg1KplOrrW/8c\nYf78+ZoxY0arY01NTUqlUm3+MlZVVbW7Y+P48eNVXd36OpYvX65UKtXm3KlTp6qysrLVsXQ6rVQq\npYaGhlbHZ8+erXnz5hXkdXz1q191cR1eeuTjOsaNG+fiOrz0yMd1fOUrX3FxHV565OM6KioqXFyH\nlx75uI7rrrvOxXV46cH3XV89+L77wXV46dHRdSxatEipVKr5VlpaqnHjxrV5jI7EZUO46ZKmt/Ne\n85bnPC5pbQjhig7u7/KGcMOHD5ckVVRU6Fe/+pWefvppDRw4sPnM9evX6+Mf/7ief/55HX/8B5/y\ndsYZZ+iEE07Qbbfdthd/HrqiqalJJSUlUY+BPKKpPzT1h6b+0NQXevpD0/jqzIZwcX7mPFeRpH27\n68ErKir0y1/+Uk899VSrhbkkHXPMMRowYICeeOKJ5mPvvPOOVq5cqVNPPbW7RoLENymHaOoPTf2h\nqT809YWe/tA0GQp+t/b2mNn/J+k/JG2QdKAyT4WPlNQtHwA4ZcoUVVVVadmyZdp///31t7/9TZLU\np08fFRcXS5KuvPJK3XjjjRo8eLCOPvpoXXfddTriiCP0+c9/vjtGAgAAAAA4EsvFuaRDJf1Y0mGS\n3pb035JGhxCe7I4/7K677pKZ6Ywzzmh1/N5779XEiRMlSTNnzlRTU5Muv/xyvfXWWzrttNP0H//x\nH3zGOQAAAABgj2LxsvYQwh0t328eQrgkhDAohLBfCGFACKHbFuaStHPnTu3YsaPNbdfCfJc5c+Zo\n48aNampq0mOPPabBgwd310jIyt38AfFHU39o6g9N/aGpL/T0h6bJEIvFOdCR3Pf/I/5o6g9N/aGp\nPzT1hZ7+0DQZYrFbez7kY7d2AAAAAAD2VlJ3awcAAAAAIJZYnAMAAAAAEDEW54i1+vr6qEdAntHU\nH5r6Q1N/aOoLPf2haTKwOEeszZw5M+oRkGc09Yem/tDUH5r6Qk9/aJoMLM4RawsWLIh6BOQZTf2h\nqT809YemvtDTH5omA4tzxBofK+EPTf2hqT809YemvtDTH5omA4tzAAAAAAAixuIcAAAAAICIsThH\nrM2bNy/qEZBnNPWHpv7Q1B+a+kJPf2iaDL2jHqDnrZeU3ovz6rp7EORBU1NT1CMgz2jqD039oak/\nNPWFnv7QNBkshBD1DD3CzIZLqu3M1xQXl2jNmjo2YAAAAAAAdFo6nVZ5ebkklYcQdvssceKeOV+6\ndKnKysr26tx+/fqxMAcAAAAAdLvELc7Lyso0fPjwqMcAAAAAAKAZG8Ih1hoaGqIeAXlGU39o6g9N\n/aGpL/T0h6bJwOIcsXbRRRdFPQLyjKb+0NQfmvpDU1/o6Q9Nk4HFOWJtzpw5UY+APKOpPzT1h6b+\n0NQXevpD02RI3G7ttbW1vOccAAAAANDtOrNbO8+cAwAAAAAQMRbnAAAAAABEjMU5Yq2ysjLqEZBn\nNPWHpv7Q1B+a+kJPf2iaDCzOEWvp9G7ftoEYoqk/NPWHpv7Q1Bd6+kPTZGBDOAAAAAAAugEbwgEA\nAAAAECMszgEAAAAAiBiLcwAAAAAAIsbiHLGWSqWiHgF5RlN/aOoPTf2hqS/09IemycDiHLFWUVER\n9QjIM5r6Q1N/aOoPTX2hpz80TQZ2awcAAAAAoBuwWzsAAAAAADHC4hwAAAAAgIixOEesVVdXRz0C\n8oym/tDUH5r6Q1Nf6OkPTZOBxTlibd68eVGPgDyjqT809Yem/tDUF3r6Q9NkYHGOWPvoRz8a9QjI\nM5r6Q1N/aOoPTX2hpz80TQYW5wAAAAAARIzFOQAAAAAAEWNxDgAAAABAxHpHPUAPKpakurq6qOdA\nHq1atUrpdDrqMZBHNPWHpv7Q1B+a+kJPf2gaXy3Wn8V7OtdCCN07TYEws69Iuj/qOQAAAAAAiXNh\nCOGB3Z2QpMX5IZLOlfSSpO3RTgMAAAAASIBiSUdLeiyEsGV3JyZmcQ4AAAAAQKFiQzgAAAAAACLG\n4hwAAAAAgIixOAcAAAAAIGIszgEAAAAAiFhiFudmNtXM1pvZNjP7vZmdFPVMaMvMZpnZKjN7x8z+\nZma/MLP/08553zazjWbWZGaPm9ngnPv3NbOFZtZgZlvN7CEzO7TnrgTtMbNvmtlOM7s15zg9Y8bM\nPmZmP8k2aTKz1WY2POccusaAmRWZ2Q1mti7baq2ZXdvOefQsUGZ2mpktM7NXs99jU+2c86H7mdlH\nzOx+M3vbzN40sx+Z2f7dfX1JtLumZtbbzOaZ2X+b2bvZc35sZoflPAZNC8je/D1tce5d2XOm5Ryn\nqXOJWJyb2XhJt0iaLekESaslPWZm/SIdDO05TdJ8SZ+SdLakf5C03Mz223WCmf2bpApJl0k6WVKj\nMj33afE4t0v6J0lfknS6pI9J+nlPXADaZ5kfiF2mzN+/lsfpGTNmdrCkZyS9p8xHVJYbiytNAAAJ\nQElEQVRJulrSmy3OoWt8fFPS5ZKmSBoiaaakmWZWsesEeha8/SU9r0zDNh/Dk8d+Dyjz9/2s7Lmn\nS7o7nxeCZrtrWiJpmKS5yvy79ouSSiX9Muc8mhaW3f493cXMvqjMv4NfbedumnoXQnB/k/R7SXe0\n+L1JekXSzKhn47bHdv0k7ZQ0osWxjZKuavH7gyRtk/QvLX7/nqQvtjinNPs4J0d9TUm8STpA0hpJ\nZ0p6StKt9IzvTdJ3Jf1uD+fQNSY3Sb+SdE/OsYckLaFn/G7Z/85TOcc+dD9l/rG/U9IJLc45V9L/\nShoQ9XV7vrXXtJ1zTpS0Q9IRNC38W0dNJR0uaUO2zXpJ01rcR9ME3Nw/c25m/yCpXNITu46FzP9S\nfyPplKjmwl47WJmfLr4hSWZ2jKQBat3zHUkr9UHPEyX1zjlnjTLf7GgejYWSfhVCeLLlQXrG1uck\nPWdm/26Zt5+kzeySXXfSNXaelXSWmR0rSWY2VNJnJD2S/T09YyyP/T4t6c0Qwh9aPPxvlPn/6E91\n1/zYa7v+vfRW9vflommsmJlJWiLp5hBCXTun0DQBekc9QA/oJ6mXpL/lHP+bMj9tQoHKfpO6XVJN\nCOHP2cMDlPkG017PAdlf95f09+w/Pjo6Bz3EzC5Q5uV3J7ZzNz3jaZCkK5R5u9BNyrxM9gdm9l4I\n4Seia9x8V5lnZOrNbIcyb3n7Vgjhp9n76Rlv+eo3QNJrLe8MIewwszdE40iZ2b7K/D1+IITwbvbw\nANE0br6pTLMFHdxP0wRIwuIc8XWnpE8o8wwOYsjMjlDmByxnhxDej3oe5E2RpFUhhOuyv19tZsdJ\n+pqkn0Q3FrpovKSvSLpA0p+V+WHaHWa2MfvDFgAFysx6S/qZMj+AmRLxOOgiMyuXNE2ZPQSQYO5f\n1i6pQZn34PTPOd5f0uaeHwd7w8wWSBor6YwQwqYWd21WZs+A3fXcLGkfMztoN+egZ5RL+qiktJm9\nb2bvSxopabqZ/V2Zn/bSM342Scp9yV2dpIHZX/P3NF5ulvTdEMLPQgh/CiHcL+k2SbOy99Mz3vLV\nb7Ok3F2he0nqKxpHosXC/EhJo1s8ay7RNG5GKPPvpZdb/HvpKEm3mtm67Dk0TQD3i/Pss3W1yuxY\nKKn55dJnKfM+OxSY7ML885JGhRA2tLwvhLBemW8uLXsepMz7aHb1rFVm44uW55Qqs3BY0a3DI9dv\nJP2jMs/EDc3enpO0VNLQEMI60TOOnlHbtwWVSvqrxN/TGCpR5ofYLe1U9t8I9Iy3PPZbIelgM2v5\nzN5Zyiz8V3bX/Ghfi4X5IElnhRDezDmFpvGyRNLx+uDfSkOV2cjxZmU2dJNomghJeVn7rZLuM7Na\nSaskXaXMP0bui3IotGVmd0r6sqSUpEYz2/WT/rdDCNuzv75d0rVmtlbSS5JuUGb3/V9KmY1uzKxS\nmZ82vilpq6QfSHomhLCqxy4GCiE0KvMy2WZm1ihpS4vNTugZP7dJesbMZkn6d2X+kX+JpEtbnEPX\n+PiVMq1ekfQnScOV+f/JH7U4h54FLPsZxoOV+Qe4JA3Kbuz3RgjhZeWhXwih3swek3SPmV0haR9l\nPvq0KoTAM3J5trumyrx66ef6/9u7s1CrqjiO498fWYFUjz5IZJYZSSoNT2njQ/VQ9BIKIRFBUERR\nvvgWQTRIowNFSQnRi1gvBokQYjZRNCoFIWnRQGUYmlM5/HvYWzydzjWDa/sO3w8szj17rXP23ndx\nzr2/vdfauznwfQNwcs//Szuq6oB9OvIcx+f0t772B4CfqmoL+DkdN7q+XPz/VWjm4XxDc+uQ94FL\nu94my8B+OkxzBqe/3NrX7kGaI4p7gXXAtL76U2m+jH6l+fJaDUzqev8sBbCenlup2Z+js9BMO9nU\n9tkXwO0D2tivo6DQ3Hv3KZrb9uwBttDcP3mC/Tk6Cs10oUF/P18azv6juSL4K8BOmiCxApjY9f6P\nxXKsPqUZ7txfd+T5FfbpyCzH8znta7+Vnlup2afjo6TtREmSJEmS1JExP+dckiRJkqSRznAuSZIk\nSVLHDOeSJEmSJHXMcC5JkiRJUscM55IkSZIkdcxwLkmSJElSxwznkiRJkiR1zHAuSZIkSVLHDOeS\nJEmSJHXMcC5J0hiQZGWSw0kOtY9Hfj6n622TJEn/bkLXGyBJkobNWuA2ID3LtnezKX+XZEJVHex6\nOyRJGqk8cy5J0tjxR1Vtr6pfekoNapjkrCRrkuxIsjvJ5iTX99TPSPJ6kp1JdiV5K8nUti5JHkjy\nXZL9ST5Ncl3Pa6e0Z+7nJdmQZC9wS1s3N8nGJHuTfJtkSZKJJ/j3IknSiGc4lyRpfHoWOAWYC1wI\nLAJ2AySZDGwE9gFXARcBKzg64u4+4H5gITATWAesSXJu3zoeBZ4BLgDWtUPs1wKr23XOB+YAy07E\nDkqSNJpkiAPqkiRpFEmyElgA7O9Z/EZVzR+i/efAq1X10IC6R4B5wPlVdWhA/ffAsqpa3LPsA+DD\nqronyRRgG3BvVS3vabMCOFhVd/UsmwtsACZW1Z//ZZ8lSRpLnHMuSdLYsR64k6Nzzvcco+1S4Ll2\nOPqbwGtVtbmtmw28PUQwPx2YDLzXV/UuMKtv2cd9z2cDM5Ms6H3L9nEq8NUxtleSpDHNYe2SJI0d\ne6pqW1VtbcvPQzWsqhdpAvHLNEPMP0pyd1u9b7i2p+/5acDzNCF+dltmAdOBr4dpnZIkjUqGc0mS\nxqmq+qGqXqiqm4EngTvaqk3A5UlOGvCa34EfaeaK95oDfNnbdMAqPwFm9B1AOFK8krskaVwznEuS\nNA4leTrJtUnOTnIxcDVHw/Vy4AxgVZJLkkxLsiDJeW3948Ci9mrs05M8RnMWfEnvKgasdjFwWZJl\nSWa373tTEi8IJ0ka95xzLknS+HQSTQg/E9hFcxX1hQBVtSPJNTQhfANwCPgMeKd97VKa8P4EMIkm\n1N9YVb1D0/9x5ryqNie5EniY5mrwoRnOvmqY902SpFHHq7VLkiRJktQxh7VLkiRJktQxw7kkSZIk\nSR0znEuSJEmS1DHDuSRJkiRJHTOcS5IkSZLUMcO5JEmSJEkdM5xLkiRJktQxw7kkSZIkSR0znEuS\nJEmS1DHDuSRJkiRJHTOcS5IkSZLUMcO5JEmSJEkd+wtN4UhFOVBwcgAAAABJRU5ErkJggg==\n", 839 | "text/plain": [ 840 | "" 841 | ] 842 | }, 843 | "metadata": {}, 844 | "output_type": "display_data" 845 | } 846 | ], 847 | "source": [ 848 | "import xgboost as xgb\n", 849 | "from sklearn.datasets import load_boston \n", 850 | "\n", 851 | "boston = load_boston() \n", 852 | "X = boston[\"data\"] \n", 853 | "Y = boston[\"target\"]\n", 854 | "\n", 855 | "xgb_params = {\n", 856 | " 'eta': 0.1,\n", 857 | " 'max_depth': 6,\n", 858 | " 'colsample_bytree': 1,\n", 859 | " 'colsample_bylevel':1,\n", 860 | " 'objective': 'reg:linear',\n", 861 | " 'eval_metric': 'rmse', \n", 862 | " 'silent': 0,\n", 863 | " 'seed' : 0\n", 864 | "}\n", 865 | "\n", 866 | "dtrain = xgb.DMatrix(X, Y)\n", 867 | "\n", 868 | "num_boost_rounds = 200\n", 869 | "print(\"num_boost_rounds=\"+str(num_boost_rounds))\n", 870 | "\n", 871 | "watchlist = [(dtrain, 'train')]\n", 872 | "# train model\n", 873 | "print( \"\\nTraining XGBoost ...\")\n", 874 | "model= xgb.train(xgb_params,dtrain,num_boost_round=num_boost_rounds,evals=watchlist,early_stopping_rounds=30)\n", 875 | "\n", 876 | "# plot the important features \n", 877 | "fig, ax = plt.subplots(figsize=(12,8))\n", 878 | "xgb.plot_importance(model, height=0.8, ax=ax)\n", 879 | "plt.show()" 880 | ] 881 | }, 882 | { 883 | "cell_type": "markdown", 884 | "metadata": {}, 885 | "source": [ 886 | "# 6 两种顶层特征选择算法\n", 887 | "## 6.1 稳定性选择(Stability selection)" 888 | ] 889 | }, 890 | { 891 | "cell_type": "code", 892 | "execution_count": 15, 893 | "metadata": { 894 | "collapsed": false 895 | }, 896 | "outputs": [ 897 | { 898 | "name": "stderr", 899 | "output_type": "stream", 900 | "text": [ 901 | "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:57: DeprecationWarning: Class RandomizedLasso is deprecated; The class RandomizedLasso is deprecated in 0.19 and will be removed in 0.21.\n", 902 | " warnings.warn(msg, category=DeprecationWarning)\n" 903 | ] 904 | }, 905 | { 906 | "name": "stdout", 907 | "output_type": "stream", 908 | "text": [ 909 | "Features sorted by their score:\n", 910 | "[(1.0, 'RM'), (1.0, 'PTRATIO'), (1.0, 'LSTAT'), (0.64500000000000002, 'CHAS'), (0.57499999999999996, 'B'), (0.40000000000000002, 'TAX'), (0.39500000000000002, 'CRIM'), (0.245, 'NOX'), (0.185, 'DIS'), (0.16500000000000001, 'INDUS'), (0.055, 'ZN'), (0.029999999999999999, 'RAD'), (0.01, 'AGE')]\n" 911 | ] 912 | } 913 | ], 914 | "source": [ 915 | "from sklearn.linear_model import RandomizedLasso \n", 916 | "from sklearn.datasets import load_boston \n", 917 | "boston = load_boston() \n", 918 | " \n", 919 | "#using the Boston housing data. \n", 920 | "#Data gets scaled automatically by sklearn's implementation \n", 921 | "X = boston[\"data\"] \n", 922 | "Y = boston[\"target\"] \n", 923 | "names = boston[\"feature_names\"] \n", 924 | " \n", 925 | "rlasso = RandomizedLasso(alpha=0.025) \n", 926 | "rlasso.fit(X, Y) \n", 927 | " \n", 928 | "print (\"Features sorted by their score:\") \n", 929 | "print (sorted(zip(map(lambda x: round(x, 4), rlasso.scores_),names), reverse=True)) " 930 | ] 931 | }, 932 | { 933 | "cell_type": "markdown", 934 | "metadata": {}, 935 | "source": [ 936 | "## 6.2 递归特征消除 (Recursive feature elimination (RFE) )" 937 | ] 938 | }, 939 | { 940 | "cell_type": "code", 941 | "execution_count": 16, 942 | "metadata": { 943 | "collapsed": false 944 | }, 945 | "outputs": [ 946 | { 947 | "name": "stdout", 948 | "output_type": "stream", 949 | "text": [ 950 | "Features sorted by their rank:\n", 951 | "[(1, 'NOX'), (2, 'RM'), (3, 'CHAS'), (4, 'PTRATIO'), (5, 'DIS'), (6, 'LSTAT'), (7, 'RAD'), (8, 'CRIM'), (9, 'INDUS'), (10, 'ZN'), (11, 'TAX'), (12, 'B'), (13, 'AGE')]\n" 952 | ] 953 | } 954 | ], 955 | "source": [ 956 | "from sklearn.feature_selection import RFE \n", 957 | "from sklearn.linear_model import LinearRegression \n", 958 | " \n", 959 | "boston = load_boston() \n", 960 | "X = boston[\"data\"] \n", 961 | "Y = boston[\"target\"] \n", 962 | "names = boston[\"feature_names\"] \n", 963 | " \n", 964 | "#use linear regression as the model \n", 965 | "lr = LinearRegression() \n", 966 | "#rank all features, i.e continue the elimination until the last one \n", 967 | "rfe = RFE(lr, n_features_to_select=1) \n", 968 | "rfe.fit(X,Y) \n", 969 | " \n", 970 | "print (\"Features sorted by their rank:\") \n", 971 | "print (sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names))) " 972 | ] 973 | }, 974 | { 975 | "cell_type": "markdown", 976 | "metadata": {}, 977 | "source": [ 978 | "# 一个完整的例子" 979 | ] 980 | }, 981 | { 982 | "cell_type": "code", 983 | "execution_count": 17, 984 | "metadata": { 985 | "collapsed": false 986 | }, 987 | "outputs": [ 988 | { 989 | "name": "stderr", 990 | "output_type": "stream", 991 | "text": [ 992 | "D:\\Program Files\\Anaconda3\\lib\\site-packages\\sklearn\\utils\\deprecation.py:57: DeprecationWarning: Class RandomizedLasso is deprecated; The class RandomizedLasso is deprecated in 0.19 and will be removed in 0.21.\n", 993 | " warnings.warn(msg, category=DeprecationWarning)\n" 994 | ] 995 | }, 996 | { 997 | "name": "stdout", 998 | "output_type": "stream", 999 | "text": [ 1000 | "\tCorr.\tLasso\tLr reg\tMIC\tRF\tRFE\tRidge\tStab\tMean\n", 1001 | "x1\t0.3\t0.79\t1.0\t0.39\t0.55\t1.0\t0.77\t0.77\t0.7\n", 1002 | "x2\t0.44\t0.83\t0.56\t0.61\t0.67\t1.0\t0.75\t0.72\t0.7\n", 1003 | "x3\t0.0\t0.0\t0.5\t0.34\t0.13\t1.0\t0.05\t0.0\t0.25\n", 1004 | "x4\t1.0\t1.0\t0.57\t1.0\t0.56\t1.0\t1.0\t1.0\t0.89\n", 1005 | "x5\t0.1\t0.51\t0.27\t0.2\t0.29\t0.78\t0.88\t0.55\t0.45\n", 1006 | "x6\t0.0\t0.0\t0.02\t0.0\t0.01\t0.44\t0.05\t0.0\t0.06\n", 1007 | "x7\t0.01\t0.0\t0.0\t0.07\t0.02\t0.0\t0.01\t0.0\t0.01\n", 1008 | "x8\t0.02\t0.0\t0.03\t0.05\t0.01\t0.56\t0.09\t0.0\t0.1\n", 1009 | "x9\t0.01\t0.0\t0.0\t0.09\t0.01\t0.11\t0.0\t0.0\t0.03\n", 1010 | "x10\t0.0\t0.0\t0.01\t0.04\t0.0\t0.33\t0.01\t0.0\t0.05\n", 1011 | "x11\t0.29\t0.0\t0.6\t0.43\t0.39\t1.0\t0.59\t0.37\t0.46\n", 1012 | "x12\t0.44\t0.0\t0.14\t0.71\t0.35\t0.67\t0.68\t0.46\t0.43\n", 1013 | "x13\t0.0\t0.0\t0.48\t0.23\t0.07\t0.89\t0.02\t0.0\t0.21\n", 1014 | "x14\t0.99\t0.16\t0.0\t1.0\t1.0\t0.22\t0.95\t0.62\t0.62\n" 1015 | ] 1016 | } 1017 | ], 1018 | "source": [ 1019 | "from sklearn.datasets import load_boston \n", 1020 | "from sklearn.linear_model import (LinearRegression, Ridge,Lasso, RandomizedLasso) \n", 1021 | "from sklearn.feature_selection import RFE, f_regression \n", 1022 | "from sklearn.preprocessing import MinMaxScaler \n", 1023 | "from sklearn.ensemble import RandomForestRegressor \n", 1024 | "import numpy as np \n", 1025 | "from minepy import MINE \n", 1026 | " \n", 1027 | "np.random.seed(0) \n", 1028 | " \n", 1029 | "size = 750 \n", 1030 | "X = np.random.uniform(0, 1, (size, 14)) \n", 1031 | " \n", 1032 | "#\"Friedamn #1” regression problem \n", 1033 | "Y = (10 * np.sin(np.pi*X[:,0]*X[:,1]) + 20*(X[:,2] - .5)**2 + \n", 1034 | " 10*X[:,3] + 5*X[:,4] + np.random.normal(0,1)) \n", 1035 | "#Add 3 additional correlated variables (correlated with X1-X3) \n", 1036 | "X[:,10:] = X[:,:4] + np.random.normal(0, .025, (size,4)) \n", 1037 | " \n", 1038 | "names = [\"x%s\" % i for i in range(1,15)] \n", 1039 | " \n", 1040 | "ranks = {} \n", 1041 | " \n", 1042 | "def rank_to_dict(ranks, names, order=1): \n", 1043 | " minmax = MinMaxScaler() \n", 1044 | " ranks = minmax.fit_transform(order*np.array([ranks]).T).T[0] \n", 1045 | " ranks = map(lambda x: round(x, 2), ranks) \n", 1046 | " return dict(zip(names, ranks )) \n", 1047 | " \n", 1048 | "lr = LinearRegression(normalize=True) \n", 1049 | "lr.fit(X, Y) \n", 1050 | "ranks[\"Lr reg\"] = rank_to_dict(np.abs(lr.coef_), names) \n", 1051 | " \n", 1052 | "ridge = Ridge(alpha=7) \n", 1053 | "ridge.fit(X, Y) \n", 1054 | "ranks[\"Ridge\"] = rank_to_dict(np.abs(ridge.coef_), names) \n", 1055 | " \n", 1056 | "lasso = Lasso(alpha=.05) \n", 1057 | "lasso.fit(X, Y) \n", 1058 | "ranks[\"Lasso\"] = rank_to_dict(np.abs(lasso.coef_), names) \n", 1059 | " \n", 1060 | "rlasso = RandomizedLasso(alpha=0.04) \n", 1061 | "rlasso.fit(X, Y) \n", 1062 | "ranks[\"Stab\"] = rank_to_dict(np.abs(rlasso.scores_), names) \n", 1063 | " \n", 1064 | "#stop the search when 5 features are left (they will get equal scores) \n", 1065 | "rfe = RFE(lr, n_features_to_select=5) \n", 1066 | "rfe.fit(X,Y) \n", 1067 | "ranks[\"RFE\"] = rank_to_dict(list(map(float, rfe.ranking_)), names, order=-1) \n", 1068 | " \n", 1069 | "rf = RandomForestRegressor() \n", 1070 | "rf.fit(X,Y) \n", 1071 | "ranks[\"RF\"] = rank_to_dict(rf.feature_importances_, names) \n", 1072 | " \n", 1073 | "f, pval = f_regression(X, Y, center=True) \n", 1074 | "ranks[\"Corr.\"] = rank_to_dict(f, names) \n", 1075 | " \n", 1076 | "mine = MINE() \n", 1077 | "mic_scores = [] \n", 1078 | "for i in range(X.shape[1]): \n", 1079 | " mine.compute_score(X[:,i], Y) \n", 1080 | " m = mine.mic() \n", 1081 | " mic_scores.append(m) \n", 1082 | "ranks[\"MIC\"] = rank_to_dict(mic_scores, names) \n", 1083 | " \n", 1084 | "r = {} \n", 1085 | "for name in names: \n", 1086 | " r[name] = round(np.mean([ranks[method][name] for method in ranks.keys()]), 2) \n", 1087 | "methods = sorted(ranks.keys()) \n", 1088 | "ranks[\"Mean\"] = r \n", 1089 | "methods.append(\"Mean\") \n", 1090 | " \n", 1091 | "# ranks = pd.DataFrame(ranks)\n", 1092 | "print(\"\\t%s\" % \"\\t\".join(methods)) \n", 1093 | "for name in names: \n", 1094 | " print(\"%s\\t%s\" % (name, \"\\t\".join(map(str,[ranks[method][name] for method in methods]))))" 1095 | ] 1096 | }, 1097 | { 1098 | "cell_type": "code", 1099 | "execution_count": null, 1100 | "metadata": { 1101 | "collapsed": true 1102 | }, 1103 | "outputs": [], 1104 | "source": [] 1105 | } 1106 | ], 1107 | "metadata": { 1108 | "anaconda-cloud": {}, 1109 | "kernelspec": { 1110 | "display_name": "Python [default]", 1111 | "language": "python", 1112 | "name": "python3" 1113 | }, 1114 | "language_info": { 1115 | "codemirror_mode": { 1116 | "name": "ipython", 1117 | "version": 3 1118 | }, 1119 | "file_extension": ".py", 1120 | "mimetype": "text/x-python", 1121 | "name": "python", 1122 | "nbconvert_exporter": "python", 1123 | "pygments_lexer": "ipython3", 1124 | "version": "3.5.2" 1125 | } 1126 | }, 1127 | "nbformat": 4, 1128 | "nbformat_minor": 1 1129 | } 1130 | --------------------------------------------------------------------------------