{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Multivariate Linear Regression Demo\n",
"\n",
"_Source: 🤖[Homemade Machine Learning](https://github.com/trekhleb/homemade-machine-learning) repository_\n",
"\n",
"> ☝Before moving on with this demo you might want to take a look at:\n",
"> - 📗[Math behind the Linear Regression](https://github.com/trekhleb/homemade-machine-learning/tree/master/homemade/linear_regression)\n",
"> - ⚙️[Linear Regression Source Code](https://github.com/trekhleb/homemade-machine-learning/blob/master/homemade/linear_regression/linear_regression.py)\n",
"\n",
"**Linear regression** is a linear model, e.g. a model that assumes a linear relationship between the input variables `(x)` and the single output variable `(y)`. More specifically, that output variable `(y)` can be calculated from a linear combination of the input variables `(x)`.\n",
"\n",
"**Multivariate Linear Regression** is a linear regression that has _more than one_ input parameter and one output label.\n",
"\n",
"> **Demo Project:** In this demo we will build a model that will predict `Happiness.Score` for the countries based on `Economy.GDP.per.Capita` and `Freedom` parameters."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {},
"outputs": [],
"source": [
"# To make debugging of linear_regression module easier we enable imported modules autoreloading feature.\n",
"# By doing this you may change the code of linear_regression library and all these changes will be available here.\n",
"%load_ext autoreload\n",
"%autoreload 2\n",
"\n",
"# Add project root folder to module loading paths.\n",
"import sys\n",
"sys.path.append('../..')"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Import Dependencies\n",
"\n",
"- [pandas](https://pandas.pydata.org/) - library that we will use for loading and displaying the data in a table\n",
"- [numpy](http://www.numpy.org/) - library that we will use for linear algebra operations\n",
"- [matplotlib](https://matplotlib.org/) - library that we will use for plotting the data\n",
"- [plotly](https://plot.ly/python/) - library that we will use for plotting interactive 3D scatters\n",
"- [linear_regression](https://github.com/trekhleb/homemade-machine-learning/blob/master/src/linear_regression/linear_regression.py) - custom implementation of linear regression"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
""
],
"text/vnd.plotly.v1+html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Import 3rd party dependencies.\n",
"import numpy as np\n",
"import pandas as pd\n",
"import matplotlib.pyplot as plt\n",
"import plotly\n",
"import plotly.graph_objs as go\n",
"\n",
"# Configure Plotly to be rendered inline in the notebook.\n",
"plotly.offline.init_notebook_mode()\n",
"\n",
"# Import custom linear regression implementation.\n",
"from homemade.linear_regression import LinearRegression"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Load the Data\n",
"\n",
"In this demo we will use [World Happindes Dataset](https://www.kaggle.com/unsdsn/world-happiness#2017.csv) for 2017."
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/html": [
"
"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"# Print histograms for each feature to see how they vary.\n",
"histohrams = data.hist(grid=False, figsize=(10, 10))"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Split the Data Into Training and Test Sets\n",
"\n",
"In this step we will split our dataset into _training_ and _testing_ subsets (in proportion 80/20%).\n",
"\n",
"Training data set will be used for training of our linear model. Testing dataset will be used for validating of the model. All data from testing dataset will be new to model and we may check how accurate are model predictions."
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [],
"source": [
"# Split data set on training and test sets with proportions 80/20.\n",
"# Function sample() returns a random sample of items.\n",
"train_data = data.sample(frac=0.8)\n",
"test_data = data.drop(train_data.index)\n",
"\n",
"# Decide what fields we want to process.\n",
"input_param_name_1 = 'Economy..GDP.per.Capita.'\n",
"input_param_name_2 = 'Freedom'\n",
"output_param_name = 'Happiness.Score'\n",
"\n",
"# Split training set input and output.\n",
"x_train = train_data[[input_param_name_1, input_param_name_2]].values\n",
"y_train = train_data[[output_param_name]].values\n",
"\n",
"# Split test set input and output.\n",
"x_test = test_data[[input_param_name_1, input_param_name_2]].values\n",
"y_test = test_data[[output_param_name]].values"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Let's visualize the training and test datasets to see the shape of the data."
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"application/vnd.plotly.v1+json": {
"data": [
{
"marker": {
"line": {
"color": "rgb(255, 255, 255)",
"width": 1
},
"opacity": 1,
"size": 10
},
"mode": "markers",
"name": "Training Set",
"type": "scatter3d",
"uid": "b2ccc8e3-f5b5-4efb-af5c-e982a479b71b",
"x": [
1.1027104854583702,
1.3208793401718102,
0.7922212481498722,
0.39724862575531,
0.9097844958305359,
1.1893955469131499,
0.401477217674255,
1.06457793712616,
0.479820191860199,
0.368745893239975,
1.00985014438629,
0.381430715322495,
1.07062232494354,
1.12786877155304,
0.6364067792892459,
0.564305365085602,
0.932537317276001,
1.28948748111725,
1.29178786277771,
1.00726580619812,
0.8584281802177429,
0.30544471740722695,
1.1018030643463101,
1.63295245170593,
0.7288706302642819,
1.49438726902008,
1.8707656860351598,
1.3469113111496,
0,
1.05469870567322,
0.951484382152557,
0.5916834473609921,
0.982409417629242,
1.15687310695648,
1.4637807607650801,
1.48238301277161,
1.69227766990662,
0.43108540773391707,
1.3753824234008798,
0.0921023488044739,
1.12112903594971,
0.786441087722778,
1.00082039833069,
0.24454993009567302,
0.36711055040359497,
0.511135876178741,
1.41691517829895,
1.4870972633361799,
1.1531838178634601,
0.7268835306167599,
1.1073532104492199,
0.11904179304838199,
1.2860119342803997,
1.15655755996704,
0.716249227523804,
1.22255623340607,
0.667224824428558,
0.368610262870789,
1.0352252721786501,
0.995538592338562,
1.74194359779358,
1.6263433694839498,
1.12209415435791,
0.6595166921615601,
1.5649795532226598,
1.4844149351120002,
0.925579309463501,
1.2175596952438401,
1.36135590076447,
1.23374843597412,
1.12843120098114,
1.28177809715271,
1.29121541976929,
1.07498753070831,
0.85769921541214,
1.480633020401,
1.1536017656326298,
0.6484572887420649,
0.89465194940567,
0.872001945972443,
0.950612664222717,
1.43092346191406,
1.1614590883255,
1.10970628261566,
1.21768391132355,
0.8089642524719242,
0.9910123944282528,
0.305808693170547,
1.3412059545516999,
0.37584653496742204,
0.339233845472336,
1.40570604801178,
1.0272358655929599,
0.900596737861633,
1.1982743740081798,
1.40167844295502,
1.3559380769729599,
0.560479462146759,
1.07937383651733,
1.48792338371277,
1.3145823478698702,
0.996192753314972,
1.3950666189193701,
0.964434325695038,
1.25278460979462,
1.55167484283447,
1.50394463539124,
1.44163393974304,
1.18529546260834,
1.54625928401947,
1.5357066392898602,
1.1307767629623402,
0.6017650961875921,
0.524713635444641,
0.7885475754737851,
0.0226431842893362,
1.44357192516327,
1.53062355518341,
0.730573117733002,
1.1982102394104,
0.737299203872681,
1.08116579055786,
1.2845562696456898,
0.233442038297653
],
"y": [
0.288555532693863,
0.479131430387497,
0.469987004995346,
0.147062435746193,
0.432452529668808,
0.491247326135635,
0.106179520487785,
0.325905978679657,
0.44030594825744607,
0.5818438529968261,
0.561213254928589,
0.443185955286026,
0.47748741507530196,
0.580200731754303,
0.461603492498398,
0.430388748645782,
0.473507791757584,
0.0957312509417534,
0.520342111587524,
0.289680689573288,
0,
0.38042613863945,
0.465733230113983,
0.49633759260177596,
0.24072904884815197,
0.612924098968506,
0.604130983352661,
0.47120362520217896,
0.270842045545578,
0.479246735572815,
0.260287940502167,
0.24946372210979503,
0.204403176903725,
0.24932260811328896,
0.5397707223892211,
0.626006722450256,
0.549840569496155,
0.42596277594566295,
0.40598860383033797,
0.235961347818375,
0.194989055395126,
0.6582486629486078,
0.4551981985569,
0.348587512969971,
0.514492034912109,
0.390017777681351,
0.505625545978546,
0.567766189575195,
0.412730008363724,
0.23521526157856,
0.437453746795654,
0.33288118243217496,
0.17586351931095098,
0.295400261878967,
0.25471106171608,
0.255772292613983,
0.423026293516159,
0.0303698573261499,
0.45000287890434293,
0.443323463201523,
0.59662789106369,
0.60834527015686,
0.505196332931519,
0.0149958552792668,
0.620070576667786,
0.601607382297516,
0.474307239055634,
0.5793922543525699,
0.518630743026733,
0.550026834011078,
0.15399712324142498,
0.373783111572266,
0.40226498246192893,
0.28851598501205394,
0.585214674472809,
0.6271626353263849,
0.39815583825111406,
0.0960980430245399,
0.12297477573156401,
0.5313106179237371,
0.309410035610199,
0.470222115516663,
0.28923171758651695,
0.580131649971008,
0.457003742456436,
0.4350258708000179,
0.418421149253845,
0.18919676542282102,
0.572575807571411,
0.336384207010269,
0.408842742443085,
0.6140621304512021,
0.39414396882057207,
0.198303267359734,
0.300740599632263,
0.257921665906906,
0.35511153936386103,
0.45276376605033897,
0.55258983373642,
0.562511384487152,
0.234231784939766,
0.381498634815216,
0.256450712680817,
0.520303547382355,
0.376895278692245,
0.490968644618988,
0.5853844881057739,
0.508190035820007,
0.49451920390129106,
0.505740523338318,
0.5731103420257571,
0.41827192902565,
0.633375823497772,
0.47156670689582797,
0.571055591106415,
0.602126955986023,
0.6179508566856379,
0.449750572443008,
0.348079860210419,
0.31232857704162603,
0.447551846504211,
0.47278770804405196,
0.43745428323745705,
0.466914653778076
],
"z": [
4.49700021743774,
5.61100006103516,
4.31500005722046,
3.5910000801086404,
6.002999782562259,
5.62900018692017,
3.7939999103546103,
5.175000190734861,
4.961999893188481,
3.47099995613098,
4.44000005722046,
4.08099985122681,
6.35699987411499,
6.4239997863769505,
4.513999938964839,
4.69500017166138,
5.493000030517581,
5.2270002365112305,
5.97300004959106,
4.80499982833862,
3.79500007629395,
3.4949998855590803,
5.525000095367429,
6.10500001907349,
5.837999820709231,
7.28399991989136,
6.375,
5.80999994277954,
2.69300007820129,
4.8289999961853,
5.27899980545044,
3.59299993515015,
5.18200016021729,
4.69199991226196,
6.89099979400635,
7.52199983596802,
6.57200002670288,
3.65700006484985,
7.212999820709231,
4.2800002098083505,
5.23699998855591,
5.97100019454956,
6.00799989700317,
3.50699996948242,
4.54500007629395,
3.34899997711182,
5.92000007629395,
7.00600004196167,
6.57800006866455,
5.26900005340576,
6.6350002288818395,
3.5329999923706095,
5.32399988174438,
5.5689997673034695,
4.77500009536743,
5.2930002212524405,
4.11999988555908,
3.6029999256133998,
5.71500015258789,
5.26200008392334,
6.86299991607666,
6.6479997634887695,
3.7660000324249303,
4.138999938964839,
7.49399995803833,
7.28399991989136,
5.31099987030029,
6.4539999961853,
6.1680002212524405,
6.4520001411438,
5.25,
5.962999820709231,
6.08400011062622,
5.22499990463257,
5.42999982833862,
7.50400018692017,
5.234000205993651,
4.29199981689453,
4.09600019454956,
6.4539999961853,
4.28599977493286,
6.44199991226196,
4.71400022506714,
7.0789999961853,
5.824999809265139,
4.29099988937378,
5.33599996566772,
3.64400005340576,
5.75799989700317,
3.875,
4.46000003814697,
7.31400012969971,
4.95499992370605,
4.37599992752075,
5.5,
5.837999820709231,
5.62099981307983,
4.55299997329712,
5.230000019073491,
6.9510002136230495,
5.90199995040894,
4.64400005340576,
5.96400022506714,
4.57399988174438,
6.65199995040894,
5.47200012207031,
7.3769998550415,
6.71400022506714,
6.59899997711182,
6.993000030517581,
6.9770002365112305,
5.82200002670288,
4.1680002212524405,
5.04099988937378,
5.07399988174438,
5.151000022888179,
7.468999862670901,
6.343999862670901,
5.1810002326965305,
4.46500015258789,
6.07100009918213,
5.2729997634887695,
5.8189997673034695,
3.97000002861023
]
},
{
"marker": {
"line": {
"color": "rgb(255, 255, 255)",
"width": 1
},
"opacity": 1,
"size": 10
},
"mode": "markers",
"name": "Test Set",
"type": "scatter3d",
"uid": "297d492d-6698-40a5-843b-cf6b403a4442",
"x": [
1.6164631843566901,
1.47920441627502,
1.35268235206604,
1.34327983856201,
1.4336265325546298,
1.38439786434174,
1.32539355754852,
1.4884122610092199,
0.907975316047668,
1.09186446666718,
1.26074862480164,
0.833756566047668,
1.06931757926941,
0.8781145811080929,
1.3151752948761002,
0.783756256103516,
0.885416388511658,
0.5962200760841371,
0.989701807498932,
0.36842092871666,
0.586682975292206,
0.23430564999580397,
0.479309022426605,
0.476180493831635,
0.6030489206314089,
0.35022771358490007,
0.16192533075809498,
0.43801298737525896,
0.521021246910095,
0.777153134346008,
0.09162256866693501
],
"y": [
0.635422587394714,
0.611100912094116,
0.49094617366790794,
0.588767051696777,
0.361466586589813,
0.408781230449677,
0.295817464590073,
0.536746919155121,
0.5475093722343439,
0.233335807919502,
0.32570791244506797,
0.5587329268455511,
0.20871552824974102,
0.408158332109451,
0.498465299606323,
0.394952565431595,
0.5015376806259161,
0.454943388700485,
0.28211015462875394,
0.318697690963745,
0.478356659412384,
0.48079109191894503,
0.37792226672172496,
0.306613743305206,
0.4477061927318571,
0.32436785101890603,
0.36365869641304,
0.16234202682972002,
0.390661299228668,
0.0815394446253777,
0.0599007532000542
],
"z": [
7.537000179290769,
7.31599998474121,
6.60900020599365,
6.52699995040894,
6.42199993133545,
6.40299987792969,
6.09800004959106,
6.08699989318848,
5.955999851226809,
5.872000217437741,
5.849999904632571,
5.82299995422363,
5.39499998092651,
5.2350001335144,
5.19500017166138,
5.07399988174438,
5.01100015640259,
5.0040001869201705,
4.7350001335144,
4.70900011062622,
4.60799980163574,
4.550000190734861,
4.53499984741211,
4.19000005722046,
4.17999982833862,
4.03200006484985,
4.02799987792969,
3.9360001087188703,
3.80800008773804,
3.46199989318848,
2.90499997138977
]
}
],
"layout": {
"margin": {
"b": 0,
"l": 0,
"r": 0,
"t": 0
},
"scene": {
"xaxis": {
"title": "Economy..GDP.per.Capita."
},
"yaxis": {
"title": "Freedom"
},
"zaxis": {
"title": "Happiness.Score"
}
},
"title": "Date Sets"
}
},
"text/html": [
""
],
"text/vnd.plotly.v1+html": [
""
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"# Configure the plot with training dataset.\n",
"plot_training_trace = go.Scatter3d(\n",
" x=x_train[:, 0].flatten(),\n",
" y=x_train[:, 1].flatten(),\n",
" z=y_train.flatten(),\n",
" name='Training Set',\n",
" mode='markers',\n",
" marker={\n",
" 'size': 10,\n",
" 'opacity': 1,\n",
" 'line': {\n",
" 'color': 'rgb(255, 255, 255)',\n",
" 'width': 1\n",
" },\n",
" }\n",
")\n",
"\n",
"# Configure the plot with test dataset.\n",
"plot_test_trace = go.Scatter3d(\n",
" x=x_test[:, 0].flatten(),\n",
" y=x_test[:, 1].flatten(),\n",
" z=y_test.flatten(),\n",
" name='Test Set',\n",
" mode='markers',\n",
" marker={\n",
" 'size': 10,\n",
" 'opacity': 1,\n",
" 'line': {\n",
" 'color': 'rgb(255, 255, 255)',\n",
" 'width': 1\n",
" },\n",
" }\n",
")\n",
"\n",
"# Configure the layout.\n",
"plot_layout = go.Layout(\n",
" title='Date Sets',\n",
" scene={\n",
" 'xaxis': {'title': input_param_name_1},\n",
" 'yaxis': {'title': input_param_name_2},\n",
" 'zaxis': {'title': output_param_name} \n",
" },\n",
" margin={'l': 0, 'r': 0, 'b': 0, 't': 0}\n",
")\n",
"\n",
"plot_data = [plot_training_trace, plot_test_trace]\n",
"\n",
"plot_figure = go.Figure(data=plot_data, layout=plot_layout)\n",
"\n",
"# Render 3D scatter plot.\n",
"plotly.offline.iplot(plot_figure)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Init and Train Linear Regression Model\n",
"\n",
"> ☝🏻This is the place where you might want to play with model configuration.\n",
"\n",
"- `polynomial_degree` - this parameter will allow you to add additional polynomial features of certain degree. More features - more curved the line will be.\n",
"- `num_iterations` - this is the number of iterations that gradient descent algorithm will use to find the minimum of a cost function. Low numbers may prevent gradient descent from reaching the minimum. High numbers will make the algorithm work longer without improving its accuracy.\n",
"- `learning_rate` - this is the size of the gradient descent step. Small learning step will make algorithm work longer and will probably require more iterations to reach the minimum of the cost function. Big learning steps may couse missing the minimum and growth of the cost function value with new iterations.\n",
"- `regularization_param` - parameter that will fight overfitting. The higher the parameter, the simplier is the model will be.\n",
"- `polynomial_degree` - the degree of additional polynomial features (`x1^2 * x2, x1^2 * x2^2, ...`). This will allow you to curve the predictions.\n",
"- `sinusoid_degree` - the degree of sinusoid parameter multipliers of additional features (`sin(x), sin(2*x), ...`). This will allow you to curve the predictions by adding sinusoidal component to the prediction curve."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Initial cost: 224369.59\n",
"Optimized cost: 2761.58\n"
]
},
{
"data": {
"text/html": [
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
Model Parameters
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
5.393174
\n",
"
\n",
"
\n",
"
1
\n",
"
0.765539
\n",
"
\n",
"
\n",
"
2
\n",
"
0.357765
\n",
"
\n",
" \n",
"
\n",
"
"
],
"text/plain": [
" Model Parameters\n",
"0 5.393174\n",
"1 0.765539\n",
"2 0.357765"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# Set up linear regression parameters.\n",
"num_iterations = 500 # Number of gradient descent iterations.\n",
"regularization_param = 0 # Helps to fight model overfitting.\n",
"learning_rate = 0.01 # The size of the gradient descent step.\n",
"polynomial_degree = 0 # The degree of additional polynomial features.\n",
"sinusoid_degree = 0 # The degree of sinusoid parameter multipliers of additional features.\n",
"\n",
"# Init linear regression instance.\n",
"linear_regression = LinearRegression(x_train, y_train, polynomial_degree, sinusoid_degree)\n",
"\n",
"# Train linear regression.\n",
"(theta, cost_history) = linear_regression.train(\n",
" learning_rate,\n",
" regularization_param,\n",
" num_iterations\n",
")\n",
"\n",
"# Print training results.\n",
"print('Initial cost: {:.2f}'.format(cost_history[0]))\n",
"print('Optimized cost: {:.2f}'.format(cost_history[-1]))\n",
"\n",
"# Print model parameters\n",
"theta_table = pd.DataFrame({'Model Parameters': theta.flatten()})\n",
"theta_table.head()"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"### Analyze Gradient Descent Progress\n",
"\n",
"The plot below illustrates how the cost function value changes over each iteration. You should see it decreasing. \n",
"\n",
"In case if cost function value increases it may mean that gradient descent missed the cost function minimum and with each step it goes further away from it. In this case you might want to reduce the learning rate parameter (the size of the gradient step).\n",
"\n",
"From this plot you may also get an understanding of how many iterations you need to get an optimal value of the cost function. In current example you may see that there is no much sense to increase the number of gradient descent iterations over 500 since it will not reduce cost function significantly. "
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAZsAAAEWCAYAAACwtjr+AAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4xLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvDW2N/gAAIABJREFUeJzt3Xt8XVWd/vHPkzS3pknbNGlpS6FFilgQKhQoigyoYGFQ0OHmOFoVRUd0dMa5gHMBdXSYcRRlVBSFARwH9IcXOopC5SKK3MqdgtACxd7v90toku/vj71STkOapu052cnJ8369ziv7rL323mulaZ7stdfZWxGBmZlZKVXk3QAzMyt/DhszMys5h42ZmZWcw8bMzErOYWNmZiXnsDEzs5Jz2FhZkbRA0tvS8mclfS/vNpmZw8b6kKTzJT0gabOkFWn545JUiuNFxJci4sP7uh9JEyWFpCE91LlM0nZJG9PrOUnfkDR2X49fKqlPB/ew/gOS2iVtkrRB0mOSzujLNlr5cNhYn5D0GeDrwJeB/YAxwMeANwHVu9imss8aWBw/jIgGoAl4F1k/H+7PgdML90XEMGAEcA3wI0kju1bqKYj3RrH3Z/lz2FjJSRoOfB74eETcHBEbI/NoRLw3IlpTveskXSXpVkmbgZMl/amkR9Nf1gslXdZl3++T9JKk1ZL+scu6yyT9T8H76ZJ+L2mdpMclnVSw7m5JX5B0bzozuV1Sc1p9T/q6Lv2Vf3xP/Y2I7RExFzgPWAl8puA4Z6QzhHWpLUcUrPsHSYvT8Z+V9NZUXpmGBJ9P6x6WNCGtO1TSbElr0jbnFuzvOknflPSLtN0Dkl6T1nX26fHUp/N206cO4FqgDniNpJMkLUptXgb8d9rvRyTNT+2ZJWlcQXtOTW1cL+lbkn4j6cNp3QfS9/4KSauBy1L5hyQ9I2mtpNskHZjKlequSD8bT0o6PK07XdLTqc+LJf1tT32zPhIRfvlV0hcwA2gDhuym3nXAerKznQqgFjgJeH16fwSwHDgr1Z8CbAJOBGqAr6bjvC2tvwz4n7Q8HlgNnJ72dUp635LW3w08DxxC9gv1buDytG4iED21v/BYXco/DzyQlt8ArACOAyqBmcCC1PbXAguBcQXHfE1a/jvgyVRHwJHAKKA+bfNBYEja/ypgSsH3czVwbFr/A+CmgrYFcHAPffoA8Lu0PAT4FLARGJ7+XdqAf0/trwPeko5/VCr7L+CetH0zsAF4d8G+tgMfLjhWG/DJtL4OOBOYD7wulf0T8PtU/+3Aw2RnXEp1xqZ1S4E3p+WRwFF5/x/wK3xmY32iGVgVEW2dBQVnGFslnVhQ95aIuDciOiJiW0TcHRFPpvdPADcCf5Lqng38PCLuiezs6J+Bjl204S+AWyPi1rSv2cAcsvDp9N8R8VxEbAV+BEwtQt+XkA2rAVwIfCciHoiI9oi4HmgFpgPtZL+gp0iqiogFEfF82u7DwD9FxLOReTwiVgNnAAsi4r8joi0iHgV+DJxTcPyfRsSD6Xv/g73o03RJ64BlwHuAd0XE+rSuA7g0IlrT9+y9wLUR8Uj697gEOF7SRLLv89yI+Elqy5Vpnzt9ryLiv1JftpINs/5bRDyTtvkSMDWd3WwHGoBDAaU6S9N+tqfvY2NErI2IR/awz1YCDhvrC6uB5sJx+Ih4Y0SMSOsKfw4XFm4o6ThJd0laKWk92S+gzuGtcYX1I2Jz2l93DgTOSQG3Lv0CPQEovJ5S+MtvCzBsTzq5C+OBNQVt+EyXNkwgO5uZD3ya7AxphaSbCoagJpCddXXXp+O67O+9ZNeKitWn+yNiREQ0R8T0iPh1wbqVEbGt4P044KXONxGxiezfYzyv/rcKYFGXYy3s8v5A4OsFfVtDdhYzPiLuBL4BfJPs+3W1pMa03Z+RhdtLaaiux2FP6xsOG+sL95H9BX9mL+p2vQ35/wKzgAkRMRz4NtkvHMiGSyZ0VpQ0lGx4qTsLge+nX5ydr/qIuHwv2tQrkiqAdwC/LWjDF7u0YWhE3AgQEf8bESeQ/ZINsiGqzu1es4s+/abL/oZFxF/uTXv3QtfvyxKytgMgqZ7s32Mx2b/V/gXrVPh+F/tbCHy0S//qIuL3ABFxZUQcTTacegjZcCMR8VBEnAmMBn5GdpZqOXPYWMlFxDrgc8C3JJ0tqUFShaSpZNcdetIArImIbZKOBf68YN3NwBmSTpBUTXZ9ZFc/0/8DvEPS29MF99p0kbvrL7zurCQbMjqoF3WRNETS68iG/PYju5YE8F3gY+lsTZLqlU2AaJD0WklvkVQDbAO28sqQ4PeAL0ianLY7QtIo4OfAIcomSVSl1zHp2L2xvLd96qUbgQ9Kmpr68SWy61ULgF8Ar5d0VjrDvYidz8C6823gEkmHQTbRRNI5afmY9H2sAjaTfc86JFVLeq+k4RGxnew60a6GVq0POWysT0TEfwB/A/w92S+55cB3gH8Aft/Dph8HPi9pI/AvFPyVGtmMr4vIzn6WAmt59dBMZ92FZGdWnyULj4Vkfwnv9v9ARGwBvgjcm4Z0pu+i6nmSNpFNcphFNoR0dEQsSfuZA3yEbPhnLdnF7w+kbWuAy8kusC8j+6v8krTuq6nft5P98rwGqIuIjcCpwPlkZxXLeOWCfW9cBlyf+nTu7irvThpi+2ey60ZLyc7Gzk/rVpFdS/oPsu/LFLJrZq097O+nZP25SdIG4CngtLS6kSy815IN3a0mm1YP8D5gQdrmY2RDi5YzZUOnZmZ9Jw0xLgLeGxF35d0eKz2f2ZhZn0hDmCPSENtnya693Z9zs6yPOGzMrK8cTzarbhXZxImz0hRnGwQ8jGZmZiXnMxszMys53+wuaW5ujokTJ+bdDDOzAeXhhx9eFREtu6vnsEkmTpzInDlz8m6GmdmAIuml3dfyMJqZmfUBh42ZmZWcw8bMzErOYWNmZiXnsDEzs5Jz2JiZWck5bMzMrOQcNvvozj8s51t3z8+7GWZm/ZrDZh/d89wqrrqruyf2mplZJ4fNPhpVX83G1jZa29rzboqZWb/lsNlHTcOqAVi7eXvOLTEz678cNvtoVH0WNqs37/LptmZmg57DZh811WePe1+z+eWcW2Jm1n85bPZRUzqzcdiYme2aw2Yf7RhG2+SwMTPbFYfNPhpeV0VlhXxmY2bWA4fNPqqoECOHVrHaYWNmtksOmyIYObSaNZ6NZma2Sw6bImiqr/YwmplZDxw2RTBqWLWH0czMeuCwKQKf2ZiZ9cxhUwRN9TWs27KdtvaOvJtiZtYvOWyKoPOzNmu3+P5oZmbdcdgUge8iYGbWM4dNEfhmnGZmPXPYFEHnYwZ8ZmNm1j2HTRF4GM3MrGclCxtJEyTdJelpSXMlfSqVN0maLWle+joylUvSlZLmS3pC0lEF+5qZ6s+TNLOg/GhJT6ZtrpSkno5RKiOH+macZmY9KeWZTRvwmYiYAkwHLpI0BbgYuCMiJgN3pPcApwGT0+tC4CrIggO4FDgOOBa4tCA8rgI+UrDdjFS+q2OURFVlBcPrqnxmY2a2CyULm4hYGhGPpOWNwDPAeOBM4PpU7XrgrLR8JnBDZO4HRkgaC7wdmB0RayJiLTAbmJHWNUbE/RERwA1d9tXdMUpmlD/YaWa2S31yzUbSROANwAPAmIhYmlYtA8ak5fHAwoLNFqWynsoXdVNOD8fo2q4LJc2RNGflypV73rECTfXVno1mZrYLJQ8bScOAHwOfjogNhevSGUmU8vg9HSMiro6IaRExraWlZZ+O09JQwypfszEz61ZJw0ZSFVnQ/CAifpKKl6chMNLXFal8MTChYPP9U1lP5ft3U97TMUqmeVgNKzf6zMbMrDulnI0m4BrgmYj4asGqWUDnjLKZwC0F5e9Ps9KmA+vTUNhtwKmSRqaJAacCt6V1GyRNT8d6f5d9dXeMkmlpqGH91u20trWX+lBmZgPOkBLu+03A+4AnJT2Wyj4LXA78SNIFwEvAuWndrcDpwHxgC/BBgIhYI+kLwEOp3ucjYk1a/jhwHVAH/DK96OEYJdPSUANk05/Hjagr9eHMzAaUkoVNRPwO0C5Wv7Wb+gFctIt9XQtc2035HODwbspXd3eMUmoeloXNyo2tDhszsy58B4Ei6TyzWbXJ123MzLpy2BRJZ9h4koCZ2as5bIqk887PDhszs1dz2BRJbVUljbVDPIxmZtYNh00RtTTUsNJhY2b2Kg6bIvIHO83MuuewKSLfssbMrHsOmyJqafCZjZlZdxw2RdQ8rIZNrW1sfdm3rDEzK+SwKSJ/sNPMrHsOmyLqDJsVHkozM9uJw6aIWob5zMbMrDsOmyLyLWvMzLrnsCmipvpqJIeNmVlXDpsiqqqsoGlota/ZmJl14bApstGNtazYsC3vZpiZ9SsOmyLbr7GG5RsdNmZmhRw2Rbbf8FqWrfcwmplZIYdNkY1uqGX15la2t3fk3RQzs37DYVNk+w2vJcIf7DQzK+SwKbL9GmsBWO5JAmZmOzhsimx0Y/bBzuXrHTZmZp0cNkXWeWazzGc2ZmY7OGyKrKm+murKCpZv8DUbM7NODpsik8ToxhpfszEzK+CwKYExjbUs8zUbM7MdHDYlsF9jre8iYGZWwGFTAmMaaz0bzcysgMOmBMY01rD55XY2btued1PMzPoFh00J7De884OdnpFmZgYOm5IY47sImJntxGFTAp1h4xlpZmYZh00JjB3uuwiYmRVy2JRAbVUlo+qrWbxua95NMTPrFxw2JTJuRB1LHDZmZkAJw0bStZJWSHqqoOwySYslPZZepxesu0TSfEnPSnp7QfmMVDZf0sUF5ZMkPZDKfyipOpXXpPfz0/qJpepjT8aNqHXYmJklpTyzuQ6Y0U35FRExNb1uBZA0BTgfOCxt8y1JlZIqgW8CpwFTgPekugD/nvZ1MLAWuCCVXwCsTeVXpHp9btyIOhav3UpE5HF4M7N+pWRhExH3AGt6Wf1M4KaIaI2IF4H5wLHpNT8iXoiIl4GbgDMlCXgLcHPa/nrgrIJ9XZ+Wbwbemur3qfEj6tj8cjsbtrb19aHNzPqdPK7ZfELSE2mYbWQqGw8sLKizKJXtqnwUsC4i2rqU77SvtH59qt+nxo2oA/AkATMz+j5srgJeA0wFlgJf6ePj70TShZLmSJqzcuXKou67M2x83cbMrI/DJiKWR0R7RHQA3yUbJgNYDEwoqLp/KttV+WpghKQhXcp32ldaPzzV7649V0fEtIiY1tLSsq/d28m4EdlnbZasd9iYmfVp2EgaW/D2XUDnTLVZwPlpJtkkYDLwIPAQMDnNPKsmm0QwK7Kr7ncBZ6ftZwK3FOxrZlo+G7gzcrhK31xfQ/WQCg+jmZkBQ3ZfZe9IuhE4CWiWtAi4FDhJ0lQggAXARwEiYq6kHwFPA23ARRHRnvbzCeA2oBK4NiLmpkP8A3CTpH8FHgWuSeXXAN+XNJ9sgsL5pepjTyoqxLjhtSxZ57sImJmVLGwi4j3dFF/TTVln/S8CX+ym/Fbg1m7KX+CVYbjC8m3AOXvU2BLxBzvNzDK+g0AJOWzMzDIOmxIaN6KO5Ru2sb29I++mmJnlymFTQuNH1NIRfq6NmZnDpoQ6P2uzaK2H0sxscHPYlNCEkUMBWLhmS84tMTPLl8OmhMaNqKNCDhszM4dNCVUPqWDs8Dr+6LAxs0HOYVNiBzQNddiY2aDnsCmxLGw8QcDMBjeHTYkdMGooqza1svXl9rybYmaWG4dNiU1oSjPS1noozcwGL4dNiR2QwuaPqx02ZjZ4OWxKbEfYeJKAmQ1iDpsSGzm0imE1Qxw2ZjaoOWxKTBITmob6g51mNqg5bPrAAU3+YKeZDW4Omz7Q+cHOHJ5ObWbWLzhs+sABTUNpbetg+YbWvJtiZpYLh00fmNQ8DIAXVm3KuSVmZvnoVdhI+n5vyqx7B7XUA/Diqs05t8TMLB+9PbM5rPCNpErg6OI3pzzt11hLbVUFL6502JjZ4NRj2Ei6RNJG4AhJG9JrI7ACuKVPWlgGKirExFH1PrMxs0Grx7CJiH+LiAbgyxHRmF4NETEqIi7pozaWhYNa6nnBYWNmg1Rvh9F+LqkeQNJfSPqqpANL2K6yc1DzMP64Zgvb2zvyboqZWZ/rbdhcBWyRdCTwGeB54IaStaoMTWqup70jfCcBMxuUehs2bZF9IvFM4BsR8U2goXTNKj+T0oy0FzxJwMwGoSG9rLdR0iXA+4A3S6oAqkrXrPJzULOnP5vZ4NXbM5vzgFbgQxGxDNgf+HLJWlWGRgytpqm+2pMEzGxQ6lXYpID5ATBc0hnAtojwNZs9NKm5nhd9FwEzG4R6eweBc4EHgXOAc4EHJJ1dyoaVo0nN9TzvazZmNgj19prNPwLHRMQKAEktwK+Bm0vVsHI0efQwbn54Eeu2vMyIodV5N8fMrM/09ppNRWfQJKv3YFtLDtkvm8D33HIPpZnZ4NLbwPiVpNskfUDSB4BfALeWrlnl6ZAxnWGzMeeWmJn1rR6H0SQdDIyJiL+T9G7ghLTqPrIJA7YHxg2vZVjNEOY5bMxskNndNZuvAZcARMRPgJ8ASHp9WveOkrauzEji4NHDPIxmZoPO7obRxkTEk10LU9nEkrSozB0yZhjzVvjMxswGl92FzYge1tX1tKGkayWtkPRUQVmTpNmS5qWvI1O5JF0pab6kJyQdVbDNzFR/nqSZBeVHS3oybXOlJPV0jP7ikDENrNr0Mqs3+RHRZjZ47C5s5kj6SNdCSR8GHt7NttcBM7qUXQzcERGTgTvSe4DTgMnpdSHZjT+R1ARcChwHHAtcWhAeVwEfKdhuxm6O0S+8MknAQ2lmNnjsLmw+DXxQ0t2SvpJevwEuAD7V04YRcQ+wpkvxmcD1afl64KyC8hsicz8wQtJY4O3A7IhYExFrgdnAjLSuMSLuTzcIvaHLvro7Rr/QGTYeSjOzwaTHCQIRsRx4o6STgcNT8S8i4s69PN6YiFialpcBY9LyeGBhQb1Fqayn8kXdlPd0jFeRdCHZmRQHHHDAnvZlr4xprKGhdoinP5vZoNKrOwhExF3AXcU8cESEpCjmPvf0GBFxNXA1wLRp00ralk6SeO2YBp5d5rAxs8Gjr+8CsDwNgZG+dt6VYDEwoaDe/qmsp/L9uynv6Rj9xpRxjTyzdCMdHX2Sb2ZmuevrsJkFdM4omwncUlD+/jQrbTqwPg2F3QacKmlkmhhwKnBbWrdB0vQ0C+39XfbV3TH6jSljG9nU2sYf/dROMxskensjzj0m6UbgJKBZ0iKyWWWXAz+SdAHwEtkdpCG79c3pwHxgC/BBgIhYI+kLwEOp3ucjonPSwcfJZrzVAb9ML3o4Rr9x2LjhAMxdsoGJ6aFqZmblrGRhExHv2cWqt3ZTN4CLdrGfa4FruymfwyuTFgrLV3d3jP5k8phhDKkQTy9dz58eMTbv5piZlZzv3JyD2qpKDh49jLlLNuTdFDOzPuGwycmUcY0OGzMbNBw2OTls3HBWbmxlxcZteTfFzKzkHDY5mTK2EYCnfXZjZoOAwyYnU8ZlYeOhNDMbDBw2ORleV8WBo4byxKJ1eTfFzKzkHDY5OnL/ETy+cH3ezTAzKzmHTY6mThjBsg3bWLbekwTMrLw5bHI09YDs2XSPLVybc0vMzErLYZOjKWMbqaoUjy70dRszK28OmxzVVlUyZWwjj/3RYWNm5c1hk7OpE0bw5OL1tPtxA2ZWxhw2OZt6wAi2vNzux0SbWVlz2OTsDRNGAvDISx5KM7Py5bDJ2YGjhtI8rIY5C9bsvrKZ2QDlsMmZJI6dNJIHXnTYmFn5ctj0A8dObGLxuq0sWuvHRJtZeXLY9APHThoFwEMeSjOzMuWw6Qdeu18DjbVDeNBDaWZWphw2/UBlhThmYpOv25hZ2XLY9BPHTGrihZWbWbmxNe+mmJkVncOmn5h+UHbd5r4XVufcEjOz4nPY9BOvHz+c4XVV/Pa5lXk3xcys6Bw2/URlhXjTwaP43fxVRPg+aWZWXhw2/cibJ7ewdP02nl+5Ke+mmJkVlcOmHznh4GYA7nluVc4tMTMrLodNPzKhaSiTmuv57TxftzGz8uKw6WfePLmZ+19YQ2tbe95NMTMrGodNP3Pya0ezdXs79z3vKdBmVj4cNv3M8a8ZxdDqSmY/vTzvppiZFY3Dpp+prarkxMkt/PqZ5XT4UdFmViYcNv3QKVPGsHxDK08uXp93U8zMisJh0w+95dDRVFaIXz/joTQzKw8Om35oZH010w4cye1zHTZmVh4cNv3UaYfvx7PLNzJv+ca8m2Jmts8cNv3U6UeMpUIw6/EleTfFzGyf5RI2khZIelLSY5LmpLImSbMlzUtfR6ZySbpS0nxJT0g6qmA/M1P9eZJmFpQfnfY/P22rvu/lvhndUMvxrxnF/z2+xDfmNLMBL88zm5MjYmpETEvvLwbuiIjJwB3pPcBpwOT0uhC4CrJwAi4FjgOOBS7tDKhU5yMF280ofXeK751HjmPB6i2elWZmA15/GkY7E7g+LV8PnFVQfkNk7gdGSBoLvB2YHRFrImItMBuYkdY1RsT9kZ0S3FCwrwFlxmFjqaoUsx7zUJqZDWx5hU0At0t6WNKFqWxMRCxNy8uAMWl5PLCwYNtFqayn8kXdlL+KpAslzZE0Z+XK/nfzy+FDqzj5taP52WNL2N7ekXdzzMz2Wl5hc0JEHEU2RHaRpBMLV6YzkpJfqIiIqyNiWkRMa2lpKfXh9sp5x0xg1aZW7vzDirybYma213IJm4hYnL6uAH5Kds1leRoCI33t/O26GJhQsPn+qayn8v27KR+Q/uSQFsY01vDDhxbuvrKZWT/V52EjqV5SQ+cycCrwFDAL6JxRNhO4JS3PAt6fZqVNB9an4bbbgFMljUwTA04FbkvrNkianmahvb9gXwPOkMoKzjl6Anc/u4Kl67fm3Rwzs72Sx5nNGOB3kh4HHgR+ERG/Ai4HTpE0D3hbeg9wK/ACMB/4LvBxgIhYA3wBeCi9Pp/KSHW+l7Z5HvhlH/SrZM6dNoGOwGc3ZjZgyZ/hyEybNi3mzJmTdzN2aea1DzJ3yQbuvfhkaoZU5t0cMzMAJD1c8BGWXepPU5+tBxecMIlVm1r5v8eX7r6ymVk/47AZIN48uZnJo4dx7e9e9B0FzGzAcdgMEJL40AmTeHrpBu57wY+MNrOBxWEzgLzrDeNpaajhG3fOz7spZmZ7xGEzgNRWVfLREw/i98+v5qEFa3a/gZlZP+GwGWDee9yBNA+r5uu/npd3U8zMes1hM8DUVVdy4YkH8bv5q7jf127MbIBw2AxA75s+kbHDa/niL56ho8Mz08ys/3PYDEB11ZX83dtfy5OL13PL4wP2tm9mNog4bAaos6aO5/Xjh/Mfv3qWza1teTfHzKxHDpsBqqJCXPqOKSxdv40rZj+Xd3PMzHrksBnApk1s4j3HTuDae1/kKT862sz6MYfNAHfxjNfRVF/DP/z4CV5u89M8zax/ctgMcMOHVvGvZx3O3CUbuOLXHk4zs/7JYVMGZhy+H+cfM4Fv/+Z5f/bGzPolh02Z+OczpjBpVD2fvPFRlq3flndzzMx24rApE/U1Q/j2+45mS2sbF35/Dtu2t+fdJDOzHRw2ZeSQMQ187fw38MSi9Vzykyf93Bsz6zccNmXmlClj+NtTD+Gnjy7m3375BweOmfULQ/JugBXfRScfzMqNrVx9zwvUVVXy16cckneTzGyQc9iUIUlc+o7D2PJyO1+/Yx6VFeKTbzkYSXk3zcwGKYdNmaqoEJf/2RG0R/DV2c+xYuM2PvfOw6mscOCYWd9z2JSxygrxn2cfyeiGWr79m+dZtr6VK847kobaqrybZmaDjCcIlLmKCnHxaYfyuXcexl3PruCd37iXZ5ZuyLtZZjbIOGwGiZlvnMj/fvg4Nre2cdY37+W6e1/0g9fMrM84bAaR4w4axS/+6s1MP2gUl/3f05z7nfuYv2JT3s0ys0HAYTPItDTUcN0Hj+Er5xzJvBWbmPG1e7hs1lzWbH4576aZWRnzBIFBSBJ/dvT+nHhIC1+d/Rw33LeAHz+yiA+8cSIz3ziR5mE1eTfRzMqM/AnzzLRp02LOnDl5NyMXzy3fyFduf5bbn15OdWUF506bwPuOP5BDxjTk3TQz6+ckPRwR03Zbz2GTGcxh02n+ik18954X+Mmji9jeHhw5YQTnHL0/p79+LE311Xk3z8z6IYfNHnLYvGLVplZ+9uhifjRnIc8t30SFYNqBTZwyZQxvfd1oJjXX+24EZgY4bPaYw+bVIoK5SzZw+9xl3P70cv6wbCMAYxprOHbSKI6d1MRRB4xg8ugGqod4ronZYOSw2UMOm91buGYLv3luJQ++uIYHX1zDsg3ZQ9qqKsXk0Q1MGdfIofs1MKm5ngNH1TOhqY6aIZU5t9rMSslhs4ccNnsmIli4ZiuPL1rH00s3MHfJBp5esp5Vm16ZQi3BuOF1TGiqY3RDLWMaaxjdUMvo9LWloZrGuiqG11U5lMwGqN6Gjac+216RxAGjhnLAqKG848hxO8rXbH6ZBas389LqzSxYtYWXVm9m0dqtPLZwHSs2bmPb9o5u91dbVUFjbRY8w+uqaKyroq66krqq9KqupLZzuapix/vqygqGVFYwpFLZcoUYUllBVaUYUpG+pvdVaX2F0quCHctS5zI73vu6lFnxlG3YSJoBfB2oBL4XEZfn3KRBoam+mqb6ao46YOSr1kUEG7a1sXLjNlZsaGXlplY2bN3Ohm1trN+6nfVbtrNh23bWb93Oio3b2PpyO9u2d7B1eztbX25nax8/6rowgFQQRF3DqTCUVLAtXUoLy7rWEwX70M51srJXB9+Oejvtt6djvbqdueoHjegHTQDy/8PmS+96PcdOairpMcoybCRVAt8ETgEWAQ9JmhURT+fbssFN0o4zl4NH7/lneCLilfBJAbS9vYO29mB7Rwfb2zpo64gdZW0dHWzv/NqW1WlrDzoi6Ihsf53LHRFEQEdH4ftXlndVv73g/nJBpHYWtHlH23fqyU5lO9fv3T4669Ftveim7NX18tQfhu/zb0HSDxpSX1P6YeyyDBvgWGB+RLwAIOkm4EzAYTPV1sFHAAAGo0lEQVSAScqG1qp9fcdsoCnX+arjgYUF7xelsp1IulDSHElzVq5c2WeNMzMbbMo1bHolIq6OiGkRMa2lpSXv5piZla1yDZvFwISC9/unMjMzy0G5hs1DwGRJkyRVA+cDs3Juk5nZoFWWEwQiok3SJ4DbyKY+XxsRc3NulpnZoFWWYQMQEbcCt+bdDjMzK99hNDMz60ccNmZmVnK+EWciaSXw0l5u3gysKmJzBgL3eXBwnweHfenzgRGx28+OOGyKQNKc3tz1tJy4z4OD+zw49EWfPYxmZmYl57AxM7OSc9gUx9V5NyAH7vPg4D4PDiXvs6/ZmJlZyfnMxszMSs5hY2ZmJeew2UeSZkh6VtJ8SRfn3Z5ikXStpBWSniooa5I0W9K89HVkKpekK9P34AlJR+XX8r0jaYKkuyQ9LWmupE+l8rLtM4CkWkkPSno89ftzqXySpAdS/36YbmiLpJr0fn5aPzHP9u8tSZWSHpX08/S+rPsLIGmBpCclPSZpTirrs59vh80+KHj89GnAFOA9kqbk26qiuQ6Y0aXsYuCOiJgM3JHeQ9b/yel1IXBVH7WxmNqAz0TEFGA6cFH6tyznPgO0Am+JiCOBqcAMSdOBfweuiIiDgbXABan+BcDaVH5FqjcQfQp4puB9ufe308kRMbXgMzV99/Md6Vnrfu35CzgeuK3g/SXAJXm3q4j9mwg8VfD+WWBsWh4LPJuWvwO8p7t6A/UF3AKcMsj6PBR4BDiO7NPkQ1L5jp9zsjupH5+Wh6R6yrvte9jP/dMv1rcAPwdUzv0t6PcCoLlLWZ/9fPvMZt/06vHTZWRMRCxNy8uAMWm5rL4PaajkDcADDII+pyGlx4AVwGzgeWBdRLSlKoV929HvtH49MKpvW7zPvgb8PdCR3o+ivPvbKYDbJT0s6cJU1mc/32X7iAErrYgISWU3b17SMODHwKcjYoOkHevKtc8R0Q5MlTQC+ClwaM5NKhlJZwArIuJhSSfl3Z4+dkJELJY0Gpgt6Q+FK0v98+0zm30z2B4/vVzSWID0dUUqL4vvg6QqsqD5QUT8JBWXdZ8LRcQ64C6yYaQRkjr/GC3s245+p/XDgdV93NR98SbgnZIWADeRDaV9nfLt7w4RsTh9XUH2R8Wx9OHPt8Nm3wy2x0/PAmam5Zlk1zU6y9+fZrBMB9YXnJoPCMpOYa4BnomIrxasKts+A0hqSWc0SKoju071DFnonJ2qde135/fjbODOSIP6A0FEXBIR+0fERLL/r3dGxHsp0/52klQvqaFzGTgVeIq+/PnO+6LVQH8BpwPPkY1z/2Pe7Sliv24ElgLbycZrLyAbq74DmAf8GmhKdUU2K+954ElgWt7t34v+nkA2pv0E8Fh6nV7OfU79OAJ4NPX7KeBfUvlBwIPAfOD/ATWpvDa9n5/WH5R3H/ah7ycBPx8M/U39ezy95nb+rurLn2/frsbMzErOw2hmZlZyDhszMys5h42ZmZWcw8bMzErOYWNmZiXnsDErEkmb0teJkv68yPv+bJf3vy/m/s1KzWFjVnwTgT0Km4JPr+/KTmETEW/cwzaZ5cphY1Z8lwNvTs8N+et0o8svS3ooPRvkowCSTpL0W0mzgKdT2c/SjRLndt4sUdLlQF3a3w9SWedZlNK+n0rPKjmvYN93S7pZ0h8k/SDdJQFJlyt7bs8Tkv6zz787Nij5RpxmxXcx8LcRcQZACo31EXGMpBrgXkm3p7pHAYdHxIvp/YciYk26dcxDkn4cERdL+kRETO3mWO8mew7NkUBz2uaetO4NwGHAEuBe4E2SngHeBRwaEdF5qxqzUvOZjVnpnUp2n6nHyB5bMIrsoVQADxYEDcBfSXocuJ/sRoiT6dkJwI0R0R4Ry4HfAMcU7HtRRHSQ3X5nItkt8rcB10h6N7Bln3tn1gsOG7PSE/DJyJ6QODUiJkVE55nN5h2Vslvev43sYV1Hkt2zrHYfjttasNxO9nCwNrK7/d4MnAH8ah/2b9ZrDhuz4tsINBS8vw34y/QIAyQdku6829VwskcQb5F0KNnjqTtt79y+i98C56XrQi3AiWQ3jOxWel7P8Ii4FfhrsuE3s5LzNRuz4nsCaE/DYdeRPS9lIvBIuki/Ejirm+1+BXwsXVd5lmwordPVwBOSHonslvidfkr2/JnHye5a/fcRsSyFVXcagFsk1ZKdcf3N3nXRbM/4rs9mZlZyHkYzM7OSc9iYmVnJOWzMzKzkHDZmZlZyDhszMys5h42ZmZWcw8bMzEru/wPNleTIfvYoJAAAAABJRU5ErkJggg==\n",
"text/plain": [
"