├── README.md ├── fsdr-1122.ipynb ├── heml0922-spartificial.ipynb ├── psgq-0922.ipynb ├── pvpda1122.ipynb ├── rspd-1222.ipynb ├── sdsi0922.ipynb └── spml0922.ipynb /README.md: -------------------------------------------------------------------------------- 1 | # YouTube Academic Projects 2 | 3 | 4 | YouTube Academic Projects Series is a youtube video series by [Spartificial](https://spartificial.com/) that provides free certified Machine Learning related student projects focusing on Space technology and Sustainable Development. 5 | 6 | Here is the [YouTube Playlist](https://youtube.com/playlist?list=PL7HQvd_RTCc3Vope7dkx4pggrH5f-uvZe) of all the project videos. Watch them for thorough explanation. 7 | 8 | 9 | ![YouTube Academic Projects - Spartificial (3000 × 800 px)](https://user-images.githubusercontent.com/50978045/188312778-3a699a9c-b4d1-4c4c-ab28-1305bcbf18c2.png) 10 | 11 | If you have completed the tasks for any of the project, you can submit your solution notebook through this [form](https://docs.google.com/forms/d/e/1FAIpQLSd0TiEf7SsHMS7dvnkUzUZBiXKq-0Ctv8ejjNjbubR4LHfGtg/viewform) 12 | 13 | 14 | 1. [Hunting for Exoplanet with Machine Learning](https://github.com/Spartificial/yt-acad-projs/blob/main/heml0922-spartificial.ipynb) 15 | 2. [Ship Detection from Satellite Imagery](https://github.com/Spartificial/yt-acad-projs/blob/main/sdsi0922.ipynb) 16 | 3. [Sunspots Prediction using Machine Learning](https://github.com/Spartificial/yt-acad-projs/blob/main/spml0922.ipynb) 17 | 4. [India's PV Power Potential Data Analysis](https://github.com/Spartificial/yt-acad-projs/blob/main/pvpda1122.ipynb) 18 | 5. [Predicting Stars, Galaxies & Quasars with ML Model](https://github.com/Spartificial/yt-acad-projs/blob/main/psgq-0922.ipynb) 19 | 6. [Rooftop Solar Panel Detection using Deep Learning](https://github.com/Spartificial/yt-acad-projs/blob/main/rspd-1222.ipynb) 20 | 7. [Fish Detection using Deep Learning](https://github.com/Spartificial/yt-acad-projs/blob/main/fsdr-1122.ipynb) 21 | -------------------------------------------------------------------------------- /heml0922-spartificial.ipynb: -------------------------------------------------------------------------------- 1 | {"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.7.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"#
Hunt for Exoplanets using Machine Learning\n\n--- \n \n**Project ID: HEML0922**\n\n**Project Name: Hunting for Exoplanet with Machine Learning**\n \n---","metadata":{"id":"-gwW9Ys1QG_o"}},{"cell_type":"markdown","source":"
","metadata":{"id":"c5BkOZJXg5tU"}},{"cell_type":"markdown","source":"#### **Let us start by [understanding exoplanets](https://docs.google.com/presentation/d/1-zjKAaiDt3gs4NkHbWsT4AzgZ-jqL6Oz/edit?usp=sharing&ouid=105423306669124151882&rtpof=true&sd=true)!**\n","metadata":{"id":"2o_ijuDVdvXH"}},{"cell_type":"markdown","source":"### In this notebook we will look into the following:- \n**1)** Explore the Exoplanet Dataset \n**2)** Handling outliers \n**3)** Understand KNN model for classification \n**4)** Implementing KNN without Balancing the data \n**5)** Handling imbalance data and then implementing KNN \n**6)** Task for you ","metadata":{"id":"18PA0Q4ZbVhJ"}},{"cell_type":"markdown","source":"","metadata":{"id":"TMTcDASYbVhL"}},{"cell_type":"markdown","source":"### Explore the Exoplanet Dataset \n","metadata":{"id":"yju-fMzzbVhM"}},{"cell_type":"markdown","source":"We will be dealing with the **[Kepler Space Telescope data](https://www.kaggle.com/datasets/keplersmachines/kepler-labelled-time-series-data)** \n\n \n\n**Steps to add the data in Kaggle notebook:-** \n**1)** Click on top right arrow of the notebook \n**2)** Click on \"Add Data\" \n**3)** Copy the link of \"dataset\" and paste it in search \n**4)** Click on \"+\" sign to add this dataset to the notebook","metadata":{"id":"587PWX5obVhP"}},{"cell_type":"markdown","source":"#### Importing the most needed libraries","metadata":{"id":"TCJOqNksfAIO"}},{"cell_type":"code","source":"#********************************************\nimport pandas as pd\nimport seaborn as sns\n#********************************************\nimport numpy as np \nimport matplotlib.pyplot as plt\n#********************************************\nimport warnings\nwarnings.filterwarnings('ignore')\nplt.style.use('fivethirtyeight')\n#********************************************","metadata":{"id":"kPCSBtFXbVhN","execution":{"iopub.status.busy":"2022-09-03T11:20:33.637772Z","iopub.execute_input":"2022-09-03T11:20:33.638418Z","iopub.status.idle":"2022-09-03T11:20:33.644673Z","shell.execute_reply.started":"2022-09-03T11:20:33.638391Z","shell.execute_reply":"2022-09-03T11:20:33.643445Z"},"trusted":true},"execution_count":98,"outputs":[]},{"cell_type":"markdown","source":"#### Getting into the data","metadata":{"id":"s_xhUBPbbVhQ"}},{"cell_type":"code","source":"# Let us begin with Train data\ntrain_df = pd.read_csv('../input/kepler-labelled-time-series-data/exoTrain.csv')\ntrain_df.head(10)","metadata":{"id":"8sCslEySbVhS","execution":{"iopub.status.busy":"2022-09-03T11:39:13.129230Z","iopub.execute_input":"2022-09-03T11:39:13.129617Z","iopub.status.idle":"2022-09-03T11:39:16.592203Z","shell.execute_reply.started":"2022-09-03T11:39:13.129591Z","shell.execute_reply":"2022-09-03T11:39:16.591047Z"},"trusted":true},"execution_count":163,"outputs":[]},{"cell_type":"code","source":"# Check the shape of train data\ntrain_df.shape","metadata":{"id":"FZ64b6UKbVhT","execution":{"iopub.status.busy":"2022-09-03T11:30:43.030537Z","iopub.execute_input":"2022-09-03T11:30:43.031171Z","iopub.status.idle":"2022-09-03T11:30:43.038014Z","shell.execute_reply.started":"2022-09-03T11:30:43.031135Z","shell.execute_reply":"2022-09-03T11:30:43.037011Z"},"trusted":true},"execution_count":131,"outputs":[]},{"cell_type":"markdown","source":"> *We can understand this data based on the transit method for detecting exoplanets.* \n\n> *There are total of 5087 stars in this data.*\n\n> *For each star, we have 3197 flux values at different time intervals.*\n\n> *These flux values are used to plot the light curves we saw earlier to detect if a star has exoplanet(s) orbiting it.*","metadata":{"id":"svIV1JYibVhU"}},{"cell_type":"markdown","source":"#### Check for Missing Values","metadata":{"id":"u0bA_C5QbVhV"}},{"cell_type":"code","source":"# Display the rows with null values\ntrain_df[train_df.isnull().any(axis = 1)] # axis = 1 ---> column","metadata":{"id":"oF7ID3AzbVhW","execution":{"iopub.status.busy":"2022-09-03T11:43:09.469214Z","iopub.execute_input":"2022-09-03T11:43:09.469565Z","iopub.status.idle":"2022-09-03T11:43:09.504882Z","shell.execute_reply.started":"2022-09-03T11:43:09.469540Z","shell.execute_reply":"2022-09-03T11:43:09.503581Z"},"trusted":true},"execution_count":172,"outputs":[]},{"cell_type":"markdown","source":"> *There are **no missing values**! We can also visualise it through heatmap.*","metadata":{"id":"8s9tsNwEbVhW"}},{"cell_type":"code","source":"sns.heatmap(train_df.isnull(), cmap = 'Set2', cbar = False)","metadata":{"id":"yk-bqlxqbVhX","execution":{"iopub.status.busy":"2022-09-03T11:20:36.880845Z","iopub.execute_input":"2022-09-03T11:20:36.881519Z","iopub.status.idle":"2022-09-03T11:20:54.683607Z","shell.execute_reply.started":"2022-09-03T11:20:36.881455Z","shell.execute_reply":"2022-09-03T11:20:54.682386Z"},"trusted":true},"execution_count":102,"outputs":[]},{"cell_type":"markdown","source":"> *The horizontal dashes in this plot would indicate the presence of missing values in respective column.* \n\n> *As there aren't any of such dashes seen we can conclude that there are no missing values in this data.*","metadata":{"id":"GaDdz4jJbVhY"}},{"cell_type":"markdown","source":"#### Decoding labels in the data","metadata":{"id":"RoYRiT8PbVhZ"}},{"cell_type":"code","source":"# Check how many labels are there\ntrain_df['LABEL'].unique()","metadata":{"id":"Sido6EoHbVhZ","execution":{"iopub.status.busy":"2022-09-03T11:20:54.685026Z","iopub.execute_input":"2022-09-03T11:20:54.685359Z","iopub.status.idle":"2022-09-03T11:20:54.693111Z","shell.execute_reply.started":"2022-09-03T11:20:54.685331Z","shell.execute_reply":"2022-09-03T11:20:54.692039Z"},"trusted":true},"execution_count":103,"outputs":[]},{"cell_type":"code","source":"# Extract the index for the stars labelled as 2\nidx_lab2 = list(train_df[train_df['LABEL'] == 2].index)\nprint(f\"Index list for label 2 star in the data:-\\n{idx_lab2}\\n\")","metadata":{"id":"OKZIPZIlbVha","execution":{"iopub.status.busy":"2022-09-03T11:20:54.694174Z","iopub.execute_input":"2022-09-03T11:20:54.695141Z","iopub.status.idle":"2022-09-03T11:20:54.714045Z","shell.execute_reply.started":"2022-09-03T11:20:54.695114Z","shell.execute_reply":"2022-09-03T11:20:54.712466Z"},"trusted":true},"execution_count":104,"outputs":[]},{"cell_type":"markdown","source":"> *There are total of **two classes**; one is for stars with exoplanets and the other for stars without exoplanets*\n\n> *Very few index for label 2 indicates that this class must belong to stars with exoplanets*\n\n> *We can also visualise this using countplot*","metadata":{"id":"uYP2HfT8bVhb"}},{"cell_type":"code","source":"# Visualise these values using countplot\nplt.figure(figsize = (3, 5)) \nax = sns.countplot('LABEL', data = train_df, palette = 'Set2') \nax.bar_label(ax.containers[0])\nplt.title(\"Visualising count of classes\\n1 ~ Non Exoplanets | 2 ~ Exoplanets\\n\", \n fontsize = 15, color = 'red', weight = 'bold')\nplt.show()","metadata":{"id":"PbQ-5DP1bVhb","execution":{"iopub.status.busy":"2022-09-03T11:20:54.715312Z","iopub.execute_input":"2022-09-03T11:20:54.715583Z","iopub.status.idle":"2022-09-03T11:20:54.845238Z","shell.execute_reply.started":"2022-09-03T11:20:54.715556Z","shell.execute_reply":"2022-09-03T11:20:54.844297Z"},"trusted":true},"execution_count":105,"outputs":[]},{"cell_type":"markdown","source":"> *There is a **huge imbalance** in the data which isn't good for KNN (explained later in this notebook).*\n\n> *We will need to balance it using some resampling technique and we will use RandomOverSampler for this data.*\n\n> *We'll do that after building the model with imbalanced dataset to compare the results!*","metadata":{"id":"Y7W0mLcSbVhc"}},{"cell_type":"markdown","source":"#### Replacing the labels\nFor ease of our model its always better to feed in the data in terms of 0 and 1 \n- Stars with Exoplanets: 2 $\\rightarrow$ 1 \n- Stars without Exoplanets: 1 $\\rightarrow$ 0","metadata":{"id":"ppqriOT7bVhc"}},{"cell_type":"code","source":"# Replacing labels \ntrain_df = train_df.replace({'LABEL' : {1:0, 2:1}})\nprint(\"Replacing labels...\")\n\n# Check the labels now\nprint(\"Done!\\n\")\nuniq_val = train_df.LABEL.unique()\nprint(f\"There are {len(uniq_val)} classes in the data:-\")\nprint(f\"{uniq_val[0]} - Stars with Exoplanets\\n{uniq_val[1]} - Stars without Exoplantes\")","metadata":{"id":"XtqiO4AObVhd","execution":{"iopub.status.busy":"2022-09-03T11:30:55.803531Z","iopub.execute_input":"2022-09-03T11:30:55.803933Z","iopub.status.idle":"2022-09-03T11:30:55.835231Z","shell.execute_reply.started":"2022-09-03T11:30:55.803907Z","shell.execute_reply":"2022-09-03T11:30:55.834160Z"},"trusted":true},"execution_count":132,"outputs":[]},{"cell_type":"markdown","source":"#### Visualising the light curves in this data\nWhen a planet passes between an observer and the star, the flux value decreases and hence we see a dip in light curves with exoplanets\n","metadata":{"id":"JsYssnqibVhd"}},{"cell_type":"markdown","source":"","metadata":{"id":"sKRogUpAbVhe"}},{"cell_type":"code","source":"# Drop label column to plot only the flux values\nplot_df = train_df.drop(['LABEL'], axis = 1)\n\n# X - axis data: Replace FLUX. from each column names\ncol_names = list(plot_df.columns)\ntime = [int(flux_prefix.replace(\"FLUX.\", \"\")) for flux_prefix in col_names]\n\n# Function to plot flux variation of star\ndef flux_plot(df, candidate, exo = True):\n color = 'b' if exo == True else 'm'\n plt.figure(figsize=(15, 5))\n plt.plot(time, df.iloc[candidate-1], linewidth = .5, color = color)\n title1, clr1 = f\"Flux Variation of star {candidate} with Exoplanents\", 'olive'\n title2, clr2 = f\"Flux Variation of star {candidate} without Exoplanets\", 'tab:red'\n plt.title(title1, color = clr1) if exo == True else plt.title(title2, color = clr2)\n plt.xlabel(\"Time\")\n plt.ylabel(\"Flux Variation\")","metadata":{"id":"FAP0AP23bVhe","execution":{"iopub.status.busy":"2022-09-03T11:31:10.514436Z","iopub.execute_input":"2022-09-03T11:31:10.514774Z","iopub.status.idle":"2022-09-03T11:31:10.548619Z","shell.execute_reply.started":"2022-09-03T11:31:10.514749Z","shell.execute_reply":"2022-09-03T11:31:10.546748Z"},"trusted":true},"execution_count":133,"outputs":[]},{"cell_type":"code","source":"# Example of light curves\nexo, n_exo = [4, 14, 34], [99, 199, 2999]\n\nfor candidate in range(len(exo)):\n flux_plot(plot_df, exo[candidate], exo = True)\n flux_plot(plot_df, n_exo[candidate], exo = False)","metadata":{"id":"1cnuHg8ebVhf","execution":{"iopub.status.busy":"2022-09-03T11:31:15.998729Z","iopub.execute_input":"2022-09-03T11:31:15.999664Z","iopub.status.idle":"2022-09-03T11:31:17.051226Z","shell.execute_reply.started":"2022-09-03T11:31:15.999636Z","shell.execute_reply":"2022-09-03T11:31:17.050051Z"},"trusted":true},"execution_count":134,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{"id":"yB_vuGpKbVhf"}},{"cell_type":"markdown","source":"### Extreme outliers \n- We can see random **huge spikes** especially in stars without exoplanets which can be considered as extreme outliers\n\n- KNN can be sensitive to outliers (explained later in this notebook) so we will need to handle it \n\n- We can also visualise these extreme outliers through boxplot","metadata":{"id":"4KL3kpy3bVhf"}},{"cell_type":"code","source":"# Boxplot to visualise outliers\nplt.figure(figsize = (20, 9))\nplt.suptitle(\"Box Plot to visualise outliers\", ha = 'right', color = 'red', weight = 'bold')\nfor i in range(1, 4):\n plt.subplot(1, 4, i)\n sns.boxplot(data=train_df, x='LABEL', y = 'FLUX.' + str(i))\n plt.xlabel(\"\")\n plt.ylabel(\"\")\n plt.title(\"FLUX \" + str(i) + \"\\n\", color = 'b', fontsize = 13)\n","metadata":{"id":"xVTFFfj4bVhg","execution":{"iopub.status.busy":"2022-09-03T11:33:49.038561Z","iopub.execute_input":"2022-09-03T11:33:49.038902Z","iopub.status.idle":"2022-09-03T11:33:49.419792Z","shell.execute_reply.started":"2022-09-03T11:33:49.038877Z","shell.execute_reply":"2022-09-03T11:33:49.418647Z"},"trusted":true},"execution_count":142,"outputs":[]},{"cell_type":"markdown","source":"> *We can see that the flux values more than $0.25 x 10^6$ are extreme outliers.* \n\n> *We can either drop it or replace its value with upper bridge value. For this usecase, we will simply drop it.* \n\n> *However you can try to compute on your own the upper bridge value using the formula given below:-* \n\n> $UB = Q3 + 3 \\times IQR$; **UB** - upper bridge, **Q3** - 75th percentile, **IQR** - Interquartile range","metadata":{"id":"55GjzgeWbVhh"}},{"cell_type":"code","source":"# Get the extreme outliers\nextreme_outliers = train_df[train_df['FLUX.2'] > 0.25e6]\nextreme_outliers","metadata":{"execution":{"iopub.status.busy":"2022-09-03T11:39:46.635387Z","iopub.execute_input":"2022-09-03T11:39:46.636162Z","iopub.status.idle":"2022-09-03T11:39:46.664437Z","shell.execute_reply.started":"2022-09-03T11:39:46.636088Z","shell.execute_reply":"2022-09-03T11:39:46.663628Z"},"trusted":true},"execution_count":167,"outputs":[]},{"cell_type":"code","source":"# Drop the extreme outlier\nprint(\"Droping Extreme Outliers...\")\ntrain_df.drop(extreme_outliers.index, axis = 0, inplace = True) # axis = 0 ----> row\nprint(\"Done!\")","metadata":{"id":"ObjdQ4wsbVhh","execution":{"iopub.status.busy":"2022-09-03T11:40:01.711204Z","iopub.execute_input":"2022-09-03T11:40:01.711589Z","iopub.status.idle":"2022-09-03T11:40:01.782348Z","shell.execute_reply.started":"2022-09-03T11:40:01.711563Z","shell.execute_reply":"2022-09-03T11:40:01.780888Z"},"trusted":true},"execution_count":168,"outputs":[]},{"cell_type":"markdown","source":"> *We have dropped the star at location 3340 which contributed to extreme outliers, let us visualise the box plots again*","metadata":{}},{"cell_type":"code","source":"# Cross check via any random box plot\nsns.boxplot(data=train_df, x='LABEL', y = 'FLUX.' + str(np.random.randint(1000)))","metadata":{"id":"hkWLtVEdbVhh","execution":{"iopub.status.busy":"2022-09-03T11:44:14.069224Z","iopub.execute_input":"2022-09-03T11:44:14.069561Z","iopub.status.idle":"2022-09-03T11:44:14.228490Z","shell.execute_reply.started":"2022-09-03T11:44:14.069538Z","shell.execute_reply":"2022-09-03T11:44:14.227697Z"},"trusted":true},"execution_count":173,"outputs":[]},{"cell_type":"markdown","source":"","metadata":{"id":"cWWnnVFVbVhi"}},{"cell_type":"markdown","source":"### Understanding K - Nearest Neighbors (KNN) Algorithm for Classification Tasks\n\n#### Why choose KNN for this task?\n- In this dataset we saw that there were outliers + it was imbalanced \n- KNN is **sensitive** to both **outliers and imbalnced data** which you will understand in a while\n- Hence, we choose this model to demonstrate how to handle outliers and imbalanced dataset\n- Moreover KNN is one of the simplest ML algorithms based on Supervised Learning technique\n- KNN are widely used for classification (binary and multiclass classification) as compared to regression tasks\n\n#### How does KNN work? \n\n**Steps:-** \n**1)** Select the **number of K neighbors** for the new data point \n**2)** Calculate the **Euclidean distance** from this point to the other points in the data \n**3)** Take the **K nearest neighbors** as per the calculated Euclidean distance \n**4)** Among these neighbors, **count** the number of data points of each category \n**5)** The new data point belongs to the **cateogory with maximum data points available** \n\n*Here is one demonstration to understand how this algorith works:-*\n\n\n\n\n\n\n**Euclidean Distance** *between two points is simply calculated using the distance between two points formula in a cartesian coordinate system:-* \n\n\n\n#### How to select value for K in this algorithm \n- We need to try out some values of K and figure out which one is working best out of them \n- Usually the preferred value of K is 5 \n- A very low value of K (K = 1, K = 2) can lead to effects of outliers in the model\n- A very high value of K can lead to the biasness towards imbalanced dataset\n\n \n\n- If the value of K isn't very low and dataset is balanced than the outliers would not really effect our model\n- Lets take K = 150 in that case you can see the imbalance in the data can lead to a very poor result! \n\n\n#### Advantages of KNN\n**1)** One of the simplest to understand and implement \n**2)** Depending on value of K it can be robust to the noisy training data \n**3)** It can be more effective if training data is large \n\n#### Disadvantages of KNN \n**1)** Sometimes detrming the value of K can become a complex task \n**2)** High computation cost as we are calculating the distances between the data points for all the training data","metadata":{"id":"EVgrEYyvbVhi"}},{"cell_type":"markdown","source":"","metadata":{"id":"zxCHlY6WbVhi"}},{"cell_type":"markdown","source":"### Implementing KNN after handling the extreme outliers but have yet not balanced the data\n*It would be interesting to compare the results with and without imbalance in our data. Let us first start with imbalanced data:-*","metadata":{"id":"ewVyNHhebVhj"}},{"cell_type":"code","source":"# Extract dependent and independent features\nx = train_df.drop(['LABEL'], axis = 1)\ny = train_df.LABEL\n\nprint(f\"Take a look over ~\\n\\nX train array:-\\n{x.values}\\n\\nY train array:-\\n{y.values}\")","metadata":{"id":"cynthuX8bVhj","execution":{"iopub.status.busy":"2022-09-03T11:31:53.032461Z","iopub.execute_input":"2022-09-03T11:31:53.032821Z","iopub.status.idle":"2022-09-03T11:31:53.064829Z","shell.execute_reply.started":"2022-09-03T11:31:53.032796Z","shell.execute_reply":"2022-09-03T11:31:53.063371Z"},"trusted":true},"execution_count":138,"outputs":[]},{"cell_type":"code","source":"# Splitting this dataset into training and testing set\nfrom sklearn.model_selection import train_test_split\n\nX_train, X_test, y_train, y_test = train_test_split(x, y, test_size = 0.3, random_state = 0)","metadata":{"id":"h9xwQvdsbVhk","execution":{"iopub.status.busy":"2022-09-03T11:20:56.695330Z","iopub.execute_input":"2022-09-03T11:20:56.696390Z","iopub.status.idle":"2022-09-03T11:20:56.792324Z","shell.execute_reply.started":"2022-09-03T11:20:56.696363Z","shell.execute_reply":"2022-09-03T11:20:56.791523Z"},"trusted":true},"execution_count":113,"outputs":[]},{"cell_type":"code","source":"# Feature scaling\nfrom sklearn.preprocessing import StandardScaler \n\nsc = StandardScaler()\nX_train_sc = sc.fit_transform(X_train)\nX_test_sc = sc.transform(X_test)\n\n# Checking the minimum, mean and maxmum value after scaling\nprint(\"X_train after scaling ~\\n\")\nprint(f\"Minimum:- {round(np.min(X_train_sc),2)}\\nMean:- {round(np.mean(X_train_sc),2)}\\nMax:- {round(np.max(X_train_sc), 2)}\\n\")\nprint(\"--------------------------------\\n\")\nprint(\"X_test after scaling ~\\n\")\nprint(f\"Minimum:- {round(np.min(X_test_sc),2)}\\nMean:- {round(np.mean(X_test_sc),2)}\\nMax:- {round(np.max(X_test_sc), 2)}\\n\")","metadata":{"id":"VagRDCuebVhk","execution":{"iopub.status.busy":"2022-09-03T11:20:56.793203Z","iopub.execute_input":"2022-09-03T11:20:56.793411Z","iopub.status.idle":"2022-09-03T11:20:57.012448Z","shell.execute_reply.started":"2022-09-03T11:20:56.793390Z","shell.execute_reply":"2022-09-03T11:20:57.011266Z"},"trusted":true},"execution_count":114,"outputs":[]},{"cell_type":"code","source":"# Fiting the KNN Classifier Model on to the training data\nfrom sklearn.neighbors import KNeighborsClassifier as KNC\n\n# Choosing K = 10\nknn_classifier = KNC(n_neighbors=5,metric='minkowski',p=2) \n'''metric is to be by default minkowski for p = 2 to calculate the Eucledian distances'''\n\n# Fit the model\nknn_classifier.fit(X_train_sc, y_train)\n\n# Predict\ny_pred = knn_classifier.predict(X_test_sc)\n\n# Results\nfrom sklearn.metrics import confusion_matrix, accuracy_score, classification_report, roc_curve, auc\n\nprint('\\nValidation accuracy of KNN is', accuracy_score(y_test,y_pred))\nprint(\"\\n-------------------------------------------------------\")\nprint (\"\\nClassification report :\\n\",(classification_report(y_test,y_pred)))\n\n#Confusion matrix\nplt.figure(figsize=(15,11))\nplt.subplots_adjust(wspace = 0.3)\nplt.suptitle(\"KNN Performance before handling the imbalance in the data\", color = 'r', weight = 'bold')\nplt.subplot(221)\nsns.heatmap(confusion_matrix(y_test,y_pred),annot=True,cmap=\"Set2\",fmt = \"d\",linewidths=3, cbar = False,\n xticklabels=['nexo', 'exo'], yticklabels=['nexo','exo'], square = True)\nplt.xlabel(\"True Labels\", fontsize = 15, weight = 'bold', color = 'tab:pink')\nplt.ylabel(\"Predicited Labels\", fontsize = 15, weight = 'bold', color = 'tab:pink')\nplt.title(\"CONFUSION MATRIX\",fontsize=20, color = 'm')\n\n#ROC curve and Area under the curve plotting\npredicting_probabilites = knn_classifier.predict_proba(X_test_sc)[:,1]\nfpr,tpr,thresholds = roc_curve(y_test,predicting_probabilites)\nplt.subplot(222)\nplt.plot(fpr,tpr,label = (\"AUC :\",auc(fpr,tpr)),color = \"g\")\nplt.plot([1,0],[1,0],\"k--\")\nplt.legend()\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title(\"ROC - CURVE & AREA UNDER CURVE\",fontsize=20, color = 'm')\nplt.show()\n\n","metadata":{"id":"8I4vQE0wbVhk","execution":{"iopub.status.busy":"2022-09-03T11:20:57.015249Z","iopub.execute_input":"2022-09-03T11:20:57.015529Z","iopub.status.idle":"2022-09-03T11:20:58.403761Z","shell.execute_reply.started":"2022-09-03T11:20:57.015505Z","shell.execute_reply":"2022-09-03T11:20:58.401413Z"},"trusted":true},"execution_count":115,"outputs":[]},{"cell_type":"markdown","source":"> *Even though the accuracy is amazing, this isn't really a good model. This is due to the huge imbalance in the dataset!* \n\n> *We need to check for other metrics like **precission**, **recall**, **f1 score** in such models* \n\n
\n \n \n> *Beliving this as a very good model based on only the accuracy can really perform bad on an unseen data*","metadata":{"id":"4V3OC_7vbVhl"}},{"cell_type":"markdown","source":"### Handling the imbalance in the data and then applying KNN\n*There are many techniques available out of which we will be trying* ***RandomOverSampler***:- \n RandomOverSampler is over-sampling by duplicating some of the original samples of the minority class","metadata":{"id":"n1oK_CTWbVhm"}},{"cell_type":"markdown","source":"","metadata":{"id":"luXeGVQobVhm"}},{"cell_type":"code","source":"# Handling imbalanced data using RandomOverSampler\nfrom imblearn.over_sampling import RandomOverSampler\nfrom collections import Counter\n\nros = RandomOverSampler()\nx_ros, y_ros = ros.fit_resample(x, y) # Taking the original x, y as arguments\n\nprint(f\"Before sampling:- {Counter(y)}\")\nprint(f\"After sampling:- {Counter(y_ros)}\")","metadata":{"id":"5HFfM7SbbVhm","execution":{"iopub.status.busy":"2022-09-03T11:44:41.308648Z","iopub.execute_input":"2022-09-03T11:44:41.309210Z","iopub.status.idle":"2022-09-03T11:44:42.038079Z","shell.execute_reply.started":"2022-09-03T11:44:41.309182Z","shell.execute_reply":"2022-09-03T11:44:42.037006Z"},"trusted":true},"execution_count":175,"outputs":[]},{"cell_type":"code","source":"# Visualise it\ny_ros.value_counts().plot(kind='bar', title='After aplying RandomOverSampler');\n","metadata":{"id":"V0JzAejgbVhn","execution":{"iopub.status.busy":"2022-09-03T12:39:34.594791Z","iopub.execute_input":"2022-09-03T12:39:34.595283Z","iopub.status.idle":"2022-09-03T12:39:35.143271Z","shell.execute_reply.started":"2022-09-03T12:39:34.595258Z","shell.execute_reply":"2022-09-03T12:39:35.142107Z"},"trusted":true},"execution_count":216,"outputs":[]},{"cell_type":"markdown","source":"#### Repeating the above steps","metadata":{"execution":{"iopub.status.busy":"2022-09-03T13:33:51.118133Z","iopub.execute_input":"2022-09-03T13:33:51.118507Z","iopub.status.idle":"2022-09-03T13:33:51.126437Z","shell.execute_reply.started":"2022-09-03T13:33:51.118461Z","shell.execute_reply":"2022-09-03T13:33:51.125012Z"}}},{"cell_type":"code","source":"# ****************************************************************\n# | Performing split and scaling on the random over sampled data |\n# ****************************************************************\n\nX_train, X_test, y_train, y_test = train_test_split(x_ros, y_ros, test_size = 0.3, random_state = 0)\n\nsc = StandardScaler()\nX_train_sc = sc.fit_transform(X_train)\nX_test_sc = sc.transform(X_test)","metadata":{"id":"kgiRkAU4bVhn","execution":{"iopub.status.busy":"2022-09-03T11:20:59.632609Z","iopub.execute_input":"2022-09-03T11:20:59.633031Z","iopub.status.idle":"2022-09-03T11:21:00.265216Z","shell.execute_reply.started":"2022-09-03T11:20:59.632994Z","shell.execute_reply":"2022-09-03T11:21:00.263695Z"},"trusted":true},"execution_count":119,"outputs":[]},{"cell_type":"markdown","source":"##### Creating a function to try to fetch the optimal value of K","metadata":{}},{"cell_type":"code","source":"# Create function to fetch the optimal value of K\ndef optimal_Kval_KNN(start_k, end_k, x_train, x_test, y_train, y_test, progress = True):\n ''' \n This function takes in the following arguments -\n start_k - start value of k\n end_k - end value of k\n x_train - independent training values for training the KNN\n x_test - independent testing values for prediction\n y_train - dependent training values for training KNN\n y_test - dependent testing values for computing error rate\n progress - if true shows the progress for each k (by default its set to True)\n '''\n # Header\n print(f\"Fetching the optimal value of K in between {start_k} & {end_k} ~\\n\\nIn progress...\")\n \n # Empty list to append error rate\n mean_err = []\n for K in range(start_k, end_k + 1): # Generates K from start to end-1 values\n knn = KNC(n_neighbors = K) # Build KNN for respective K value\n knn.fit(x_train, y_train) # Train the model\n err_rate = np.mean(knn.predict(x_test) != y_test) # Get the error rate\n mean_err.append(err_rate) # Append it\n # If progress is true display the error rate for each K\n if progress == True:print(f'For K = {K}, mean error = {err_rate:.3}')\n \n # Get the optimal value of k and corresponding value of mean error\n k, val = mean_err.index(min(mean_err))+1, min(mean_err)\n \n # Footer\n print('\\nDone! Here is how error rate varies wrt to K values:- \\n')\n \n # Display how error rate changes wrt K values and mark the optimal K value\n plt.figure(figsize = (5,5))\n plt.plot(range(start_k,end_k + 1), mean_err, 'mo--', markersize = 8, markerfacecolor = 'c',\n linewidth = 1) # plots all mean error wrt K values\n plt.plot(k, val, marker = 'o', markersize = 8, markerfacecolor = 'gold', \n markeredgecolor = 'g') # highlits the optimal K\n plt.title(f\"The optimal performance is obtained at K = {k}\", color = 'r', weight = 'bold',\n fontsize = 15)\n plt.ylabel(\"Error Rate\", color = 'olive', fontsize = 13)\n plt.xlabel(\"K values\", color = 'olive', fontsize = 13)\n \n '''returns the optimal value of k'''\n return k","metadata":{"id":"ndmM1A10bVhn","execution":{"iopub.status.busy":"2022-09-03T11:21:00.266658Z","iopub.execute_input":"2022-09-03T11:21:00.266914Z","iopub.status.idle":"2022-09-03T11:21:00.278081Z","shell.execute_reply.started":"2022-09-03T11:21:00.266891Z","shell.execute_reply":"2022-09-03T11:21:00.277245Z"},"trusted":true},"execution_count":120,"outputs":[]},{"cell_type":"code","source":"k = optimal_Kval_KNN(1, 10, X_train_sc, X_test_sc, y_train, y_test)","metadata":{"id":"Ju3OoHr0uMLh","execution":{"iopub.status.busy":"2022-09-03T11:21:00.279335Z","iopub.execute_input":"2022-09-03T11:21:00.279642Z","iopub.status.idle":"2022-09-03T11:21:21.693217Z","shell.execute_reply.started":"2022-09-03T11:21:00.279615Z","shell.execute_reply":"2022-09-03T11:21:21.692435Z"},"trusted":true},"execution_count":121,"outputs":[]},{"cell_type":"markdown","source":"> *Seems like **K = 1** shall do the job! Let's try*","metadata":{"id":"iRPzLecDbVho"}},{"cell_type":"code","source":"# Fiting the KNN Classifier Model on to the training data after\n\n# Choosing K = 1\nknn_classifier = KNC(n_neighbors=1,metric='minkowski',p=2) \n'''metric is to be by default minkowski for p = 2 to calculate the Eucledian distances'''\n\n# Fit the model\nknn_classifier.fit(X_train_sc, y_train)\n\n# Predict\ny_pred = knn_classifier.predict(X_test_sc)\n\n# Results\nfrom sklearn.metrics import confusion_matrix, accuracy_score, classification_report, roc_curve, auc\n\nprint('\\nValidation accuracy of KNN is', accuracy_score(y_test,y_pred))\nprint(\"\\n-------------------------------------------------------\")\nprint (\"\\nClassification report :\\n\",(classification_report(y_test,y_pred)))\n\n#Confusion matrix\nplt.figure(figsize=(15,11))\nplt.subplots_adjust(wspace = 0.3)\nplt.suptitle(\"KNN Performance after handling the imbalance in the data\", color = 'b', weight = 'bold')\nplt.subplot(221)\nsns.heatmap(confusion_matrix(y_test,y_pred),annot=True,cmap=\"Set2\",fmt = \"d\",linewidths=3, cbar = False,\n xticklabels=['nexo', 'exo'], yticklabels=['nexo','exo'], square = True)\nplt.xlabel(\"True Labels\", fontsize = 15, weight = 'bold', color = 'm')\nplt.ylabel(\"Predicited Labels\", fontsize = 15, weight = 'bold', color = 'm')\nplt.title(\"CONFUSION MATRIX\",fontsize=20, color = 'purple')\n\n#ROC curve and Area under the curve plotting\npredicting_probabilites = knn_classifier.predict_proba(X_test_sc)[:,1]\nfpr,tpr,thresholds = roc_curve(y_test,predicting_probabilites)\nplt.subplot(222)\nplt.plot(fpr,tpr,label = (\"AUC :\",auc(fpr,tpr)),color = \"g\")\nplt.plot([1,0],[1,0], 'k--')\nplt.legend(loc = \"best\")\nplt.xlabel('False Positive Rate')\nplt.ylabel('True Positive Rate')\nplt.title(\"ROC - CURVE & AREA UNDER CURVE\",fontsize=20, color = 'm')\nplt.show()","metadata":{"id":"mLjStmN1bVho","execution":{"iopub.status.busy":"2022-09-03T14:12:09.753128Z","iopub.execute_input":"2022-09-03T14:12:09.753498Z","iopub.status.idle":"2022-09-03T14:12:13.719203Z","shell.execute_reply.started":"2022-09-03T14:12:09.753445Z","shell.execute_reply":"2022-09-03T14:12:13.717714Z"},"trusted":true},"execution_count":260,"outputs":[]},{"cell_type":"markdown","source":"> *We can see now all the metrics we talked about earlier is showing good results on the splitted testing set!*","metadata":{"id":"STy7R4g_bVho"}},{"cell_type":"markdown","source":"","metadata":{"id":"OXKBAceNbVhp"}},{"cell_type":"markdown","source":"### Task for you\n\n- Is this model working well for unseen data (test set)? Try it yourself! \n- If **yes**,\n - *Can you name any other models that would work better than KNN?*\n - *Try building a model that would work better than what you get after testing the unseen data*\n - [*Submit*](https://forms.gle/gVW3Spv148dMzamo9) *your notebook by completing these tasks and get certified for solving this problem*\n-If **not**, \n - *What could be the reason we might have overlooked while building our model?*\n - *Can you come up with a better model (not necessary to use KNN) that will work well with the test set?* \n - [*Submit*](https://forms.gle/gVW3Spv148dMzamo9) *your notebook by completing these tasks and get certified for solving this problem*\n","metadata":{"id":"nWsq06aJbVhp"}},{"cell_type":"markdown","source":"---\n\n#
THE END","metadata":{"id":"StZ16ktLhn_I"}}]} -------------------------------------------------------------------------------- /rspd-1222.ipynb: -------------------------------------------------------------------------------- 1 | { 2 | "cells": [ 3 | { 4 | "cell_type": "markdown", 5 | "source": [ 6 | "*This notebook is particularly designed for Youtube Academic Projects Series by Spartificial Innovations Pvt Ltd. However, anyone is allowed to use it, who is interested in understanding applications of Machine Learning through real world projects.* \n", 7 | "*Please contact team@spartificial.com or visit https://spartificial.com/ to know more.* \n", 8 | "\n", 9 | "*Dataset and some parts of the code have been taken from the solar-panel-detection public repo by arathee2 on [github](https://github.com/arathee2/solar-panel-detection/blob/master/code/solar-panel-detection.py).*\n" 10 | ], 11 | "metadata": { 12 | "id": "xgtHfbP6pEZi" 13 | } 14 | }, 15 | { 16 | "cell_type": "markdown", 17 | "source": [ 18 | "#
RoofTop Solar Panel Detection using Deep Learning\n", 19 | "\n", 20 | "---\n", 21 | "\n", 22 | "**Project ID: RSPD-1222** \n", 23 | "\n", 24 | "**Project Name: RoofTop Solar Panel Detection using Deep Learning**\n", 25 | "\n", 26 | "---\n", 27 | "\n", 28 | "
" 29 | ], 30 | "metadata": { 31 | "id": "jN-3VroKqdRA" 32 | } 33 | }, 34 | { 35 | "cell_type": "markdown", 36 | "source": [ 37 | "## Workflow of this notebook\n", 38 | "**1)** [Introducing the Problem](#h1) \n", 39 | "**2)** [Understanding the Dataset](#h2) \n", 40 | "**3)** [Importing necessary libraries and modules for this notebook](#h3) \n", 41 | "**4)** [Exploratory Analysis & Data Scaling](#h4) \n", 42 | "**5)** [Building & Tuning our CNN Model](#h5) \n", 43 | "**6)** [Model Evaluation & Results](#h6) \n", 44 | "**7)** [Task for You](#h7)" 45 | ], 46 | "metadata": { 47 | "id": "Znrsn-1rq16a" 48 | } 49 | }, 50 | { 51 | "cell_type": "markdown", 52 | "source": [ 53 | "#Introduction to the problem \n", 54 | "\n", 55 | "###Why should solar panels be detected?\n", 56 | "\n", 57 | "

Presently, 1% of the electricity produced worldwide comes from solar energy. In fact, predictions for solar energy production indicate a possible 65-fold increase in output by 2050, making solar energy one of the world's greatest sources of energy at that point. Thirty percent of this energy is thought to be produced by solar photovoltaic, or solar PV, power systems mounted on rooftops. Solar PV power has already started to take on a more and bigger part in the generation of electricity in the US in recent years. Solar energy production increased by 75,123 GWh or 39 times between 2008 and 2017, or a 39-fold increase.\n", 58 | "\n", 59 | "

Here's an overview on the global growth -\n", 60 | "\n", 61 | "![Capture218.jpg](data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD/4RD0RXhpZgAATU0AKgAAAAgABAE7AAIAAAAOAAAISodpAAQAAAABAAAIWJydAAEAAAAcAAAQ0OocAAcAAAgMAAAAPgAAAAAc6gAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAEphdXJhLCBSb3NobmkAAAWQAwACAAAAFAAAEKaQBAACAAAAFAAAELqSkQACAAAAAzMyAACSkgACAAAAAzMyAADqHAAHAAAIDAAACJoAAAAAHOoAAAAIAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAyMDIyOjAxOjI2IDEyOjEwOjAwADIwMjI6MDE6MjYgMTI6MTA6MDAAAABKAGEAdQByAGEALAAgAFIAbwBzAGgAbgBpAAAA/+ELIGh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8APD94cGFja2V0IGJlZ2luPSfvu78nIGlkPSdXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQnPz4NCjx4OnhtcG1ldGEgeG1sbnM6eD0iYWRvYmU6bnM6bWV0YS8iPjxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5vcmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+PHJkZjpEZXNjcmlwdGlvbiByZGY6YWJvdXQ9InV1aWQ6ZmFmNWJkZDUtYmEzZC0xMWRhLWFkMzEtZDMzZDc1MTgyZjFiIiB4bWxuczpkYz0iaHR0cDovL3B1cmwub3JnL2RjL2VsZW1lbnRzLzEuMS8iLz48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOnhtcD0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLyI+PHhtcDpDcmVhdGVEYXRlPjIwMjItMDEtMjZUMTI6MTA6MDAuMzIxPC94bXA6Q3JlYXRlRGF0ZT48L3JkZjpEZXNjcmlwdGlvbj48cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0idXVpZDpmYWY1YmRkNS1iYTNkLTExZGEtYWQzMS1kMzNkNzUxODJmMWIiIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyI+PGRjOmNyZWF0b3I+PHJkZjpTZXEgeG1sbnM6cmRmPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5LzAyLzIyLXJkZi1zeW50YXgtbnMjIj48cmRmOmxpPkphdXJhLCBSb3Nobmk8L3JkZjpsaT48L3JkZjpTZXE+DQoJCQk8L2RjOmNyZWF0b3I+PC9yZGY6RGVzY3JpcHRpb24+PC9yZGY6UkRGPjwveDp4bXBtZXRhPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3hwYWNrZXQgZW5kPSd3Jz8+/9sAQwAHBQUGBQQHBgUGCAcHCAoRCwoJCQoVDxAMERgVGhkYFRgXGx4nIRsdJR0XGCIuIiUoKSssKxogLzMvKjInKisq/9sAQwEHCAgKCQoUCwsUKhwYHCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq/8AAEQgB8AMKAwEiAAIRAQMRAf/EAB8AAAEFAQEBAQEBAAAAAAAAAAABAgMEBQYHCAkKC//EALUQAAIBAwMCBAMFBQQEAAABfQECAwAEEQUSITFBBhNRYQcicRQygZGhCCNCscEVUtHwJDNicoIJChYXGBkaJSYnKCkqNDU2Nzg5OkNERUZHSElKU1RVVldYWVpjZGVmZ2hpanN0dXZ3eHl6g4SFhoeIiYqSk5SVlpeYmZqio6Slpqeoqaqys7S1tre4ubrCw8TFxsfIycrS09TV1tfY2drh4uPk5ebn6Onq8fLz9PX29/j5+v/EAB8BAAMBAQEBAQEBAQEAAAAAAAABAgMEBQYHCAkKC//EALURAAIBAgQEAwQHBQQEAAECdwABAgMRBAUhMQYSQVEHYXETIjKBCBRCkaGxwQkjM1LwFWJy0QoWJDThJfEXGBkaJicoKSo1Njc4OTpDREVGR0hJSlNUVVZXWFlaY2RlZmdoaWpzdHV2d3h5eoKDhIWGh4iJipKTlJWWl5iZmqKjpKWmp6ipqrKztLW2t7i5usLDxMXGx8jJytLT1NXW19jZ2uLj5OXm5+jp6vLz9PX29/j5+v/aAAwDAQACEQMRAD8A+kaKK8l8R/tG+EfDHiS+0S/07WpLmxmMMjwwRFCR6Eyg4/AUrq9h2drnrVFcf4f+I9j4msNBvtK0bWpLTW2mVJ/sqlLXy2KkzsrEICQcdc12FU007MQUUUUgCiiigAoqtqGo2ek6fNfandRWlpAu+WaZwqoPUk1j+CvGul+PdAbWNDS4W0Fw8ANwgRmK4+YAE8HPGcH2FC1dkD03OhooqK6uoLGzmu7yZILeBDJLLI21UUDJJPYAUbBuS0V48f2nvAA1f7GBqxg8zZ9uFoPJx/fxu8zH/AM+1d5fePNHstc8OaYvnXTeIw7WNxbhWiKqgfcxLA4IIxgGjewHS0UVg33i+w0/xvpfhaaG5a+1OCSeGRFUxKqDJDHdkH0wDR1sGyub1FFFABRXP+FPGOn+MBqp0yG5i/su/k0+b7QqrukTGSuGOV54JwfauY8e/G/w38O/ESaNrdlqs9w9utwGtIo2TaxYAZaRTn5T2oelvMD0eivNtL+OvhXWfBeq+I9Pt9Tlj0jYbuy8lPtCIzYDgb9pXqchuADXUar420fSPALeL7h5H0sWqXK+WAXdXxtABIG47gMZ60PRNsFq7I6GiqmlagNV0e01BLea2W6hWZYbgASIGGQGAJAPPYmq3h/XP7f0+S6/svUtM2TPD5OpW/kyNtP3wuTlT2PenazsK6aualFFFIYUVjWnivTL7xhqHhq1eR9Q06COa5HlkIgf7oyepxg8cc9c8Vs0dLhs7BRXJT/EbSINU8T2D296ZfDNqt1eEIm2RGQuBH83JwO+Oa3PD2t23iTw5Ya1YpLHbX8CzxJMAHCsMgEAkZ+hNC1V0Nq2/wDX9XNGisvxJ4i0/wAJ+HbzW9ZkaOys0DSMiF2OSAAAO5JA9OecCoJPEyLqWjWkWlapcJq0bSLdw226C1AUMPOfPyE5wOuTQtXZCeiubdFFFABRRRQAUUUdKACiuSg+Iumah4MuPEuh6fqusWcNwbdYbC0LzzEOELJGSDt5zzg4B4rrEbfGrYK7hnDDBH1o6XB6OwtFFFABRWL4m8V6Z4TtLSfVmlH228isrdIk3M8sjYA9ABySSRwD1OAdqgAooooAKKKKACisHxj4vsPBGgjVtVhuZoDPHBttlVm3OcA4ZgMfjWxd3cNjYT3ly2yCCNpZGxnCqMk4HsKV1ZvsHWxNRXK+BfH1p4+sZr3TdH1iwtE2mKfUbZYkuQc8xkM24DbyfcV1VU01uJNPYKKKKQwooooAKKKr399b6Xptzf30nlW1rE00z7S21FBLHA5PAPShuyuxpNuyLFFZ3h7XLTxL4fs9Z00SC1vYxLF5q7W2npkZOK0aNhbhRRRQAUUUUAFFcd4p+JOneF/E9j4fbStY1bUr2Hz1g0u0Exjj3bd7ZYYGc9M4xzjjPY0dLhs7BRWDb+L7C58eXfhJIbkX9pZrePIVXyijHAAO7OefT8a3qN1f+uwdbBRRRQAUUUUAFFFFABRSO6xxs8jBVUZZicAD1rzix+OXhi/1S1hWx1uHTry5+y2utT2BSxnkyQFWTOeSCOVGMHOACaFq7INlc9IorhfFPxb0Hwrrc2mT2WrajLZxrLqEum2fnR2CN0aZsjaCOeM8D6Ve8SfEjQvDmlaZe/6Vqz6vj+zrTS4fPmuxgHKLkZABB5I/PildWuHWx1lFcVpvxX8NX/hXVNduWu9Lj0h/L1C01C3MdxbNnCqyDPLcYwT1x1yA3wr8VdI8Ua4mjvpWtaJfzQfaLaHWLLyDdR92jIYg4/D2zg4fWwdLnb0UUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAV85aZpPxJ1L4mePG+HHiDTdJgTVsXS3kYYyNg7SMxP2z6V9G1l6T4a0nQ9Q1K90u08i41WYT3j+Y7ea4GM4YkDr0GBSt71/J/mv8ge1vP9H/meY+JodTt/ib8JIdfuI7rU0F0t3PEMJJKIV3MBgcE57D6Vx1loWl+KvBvxE8YeJb+6HiGyur22juBeSQm1jVMJCFDAFWyV2kHIJHWvftR8NaTq2t6Zq+oWnm32lM7WcvmOvlFxhuAQDkDuDXi/inwN4nvvE+v3B+F+h6pe3yywWeu2uoi3SNJFKiSSCRzukXdksADkcZ4NS02mur5vxt/w3TctNJxfRW/C/wDmU/CzrH4n+CbSMEVtKu1BY4BJiIA+vI/Oq3iCaKfxB8cHgkSRRY2yFkYEBlXaw47ggg+hFerW3wm8PX/w+0Hw54vsIdVbSLdUWVXeMh9vzbWUq20nt3wMjIq7Z/CnwVp1lqlpYaFHb2+rQJb3sUU0qrKiDCjhvlPqRgk5JJNXWXNdL+8vvuzOGii/8P4Hk3inQovAXwEtNY8MpcpquuQ2MGq6ibtxK8TJkgM5IjGcJxgAEelaPwv0rVvDXxVSxtfDSeFdJu9OZ7nSm8RRXxkcH5bhY928ZxtJAI+lezTeH9JufDo0G6sIbjSxCsH2WYb12KAFHOScYGD1yM9ayvCfw68KeB5J5PC+jx2MtwAJJfMeVyB23OxIHsDiquueUu/+W36/oTyvkiuqtf8Az/T9S74l8KaP4utLW18QWovLa1uVulgY/I7qrAbh/EPmzjoe+RkVwHwHggPwu1O3fbDb/wBqXiHbhQi5A47DAr1isjRfC2jeHdJn0zR7P7NZ3Ekkssfmu+5n+8csSRn2NZ2381b8V/kW9eXyf6P/ADM/4d6JoPh7wPZ6b4T1P+1NKiaQw3X2hJt5Lkt86AKcEkcDtWJ8drW+vPgvr0emq7yKkckiocExLIrP+G0Guv8ADvhzSvCmhw6PoFr9ksICxjh8xn27mLHliT1J71pMoZSrAEEYII61VT3r2HB8rufP/jf4haTJ8L9I0zwBD4T1LSJrR0vtM1O8jhe3VQpUCMzRvv3bjkZOQCOoJfaam+s698Fb+SytbAzJdkW1pGY4o1EeAFUkkDAHevQz8EvhydZ/tM+FbP7Rv8zYGcQ5/wCuO7y8e23HtXS3/hfR9S1jS9VvLIPeaQXNjIJGUQ7htb5QQDwMcg07+9zPun+f+ZKVlyrZJr7zw7TfDmjeO9K8c+KvGt7cf29pN/cxW032x4jpSRDMWxQwA5yckEEj1yTnx58ceJ/hWvjK8nj/ALR0i4juWWdoWux8wCsykH94AM8/NnHevZ9d+E/gfxLr41rWvD1vc3+VLS73QSFTwXVWCv6fMDkcHjirfiD4eeFPFVzbz+INFgvXtbdraAOzBY42GCAoIAPocZHYioircvlb8ItX+d9f1HLVvXe/4tP8Lf8ADHit1f2Pw8n+JPh/SbzVF8NWVrbNDBY3YElpcTEKY0lcPs3Fjk4JAz1Io8A6NdeD/j5otjb6bZaBbarpbzSaZZ6lLduVCEr57sdpbcpIKALjpnkn2fTvhr4P0rwteeHbDQrePS77P2mAlnMvoWdiWJHY5+Xtiq+h/CnwV4a1Cyv9C0KOyu7HzPJnjnl3/OMMGJb5xjoGzjtirh7rV+36P/P7hSXNGy7/AOX52+9nN/A37vjj/sabz/2WuY8e2PjDUP2kFh+H2q2ml6mPDqM892gZDF5zZXBjfnO3t2617NoXhnSPDQvv7FtPs39oXT3lz+8d/Mmf7zfMTjOOgwPaj/hGdI/4Sz/hJfsn/E3+y/Y/tPmP/qd27btzt685xn3o0vHyX/ttvz/Affz/AM7nB+C/hZq1vF4lvviHq8Gr6v4jtxaXRtYwsSxBSox8q5OCP4RjHfrXl+kajP4l8N+GPhHekm/sdelt9SUD/l1tiX59juwP+udfUNc9Z+BPDdh4yuvFVppix61dqUmuvNc7gQAfkLbQflHIAP5miOkk+mn4O6/W/qD+F9/81Z/pb0R0AUKgVRgAYAHavlq4iM/7O0kQkeIyeMGUOhwy5kxkH1FfU1cv/wAK28J/8I//AGJ/ZX/Eu+2/b/J+0y/6/Od+7dnr2zj2qbe/d+X/AKUn+gpJuNl5/wDpLX6nms/hjT/AXx20qDwzd3GmQ6xpN3JqEs928qySKrMJnMjHJB+YknHHbJzyPhrRLbwNq2i654nsJ/3mpBIvGXh/W1uYtReRvuTRSEkofn3sACdvQ9T9F3fhnSL/AMR2eu3dmJNSsYnht5jIw2I4ww2g7Tn3BrnbH4N+ANN8RJrll4ator6OUzRsJJDGjnusRbYMdQAvBxjGBTp+603/AFq3+T/4dBJJp/10S/P+kzzjSvDPhrR/j5481WazliXRLJNShkhlcvDJJEWldQThidzEBsgZ4AriLWyn0vWvAfi3S9Pj0f8AtnVo0+1TazJeahfhn/ePJgLEEIbBAXdnr1r6Rv8A4e+FtU8XQ+J77SUl1iFPLW482QArgjDIG2twxHIPHFZNp8Ffh7YTLNZ+G4YZkuUuklWeXekiElSrb8qMn7owpwMjgUU/dcb9Lfn+q/L7qnaV7df8rfnr8/W/A6j/AMjv8af+wJD/AOkzVlXEFt4k8J/DXwmdKn1q6n0f7SllNqf2OyXCBRLLtUySFeSFUg43dcmvb5PBPh+a+1q8k0/M+uwC31F/Ok/fxhdoGN2F4OMrg1nat8K/Beu6NpmlarocdxaaVH5VmpnlVokxjbvDBiOBwSahRskn5f8At3+a/wCBuVKV3def5RX6P+tD57t9NS8/Zy8aW2qeXP8A8I/rp/s9YJ5GhtmLojeUWOShDvjdn72evNd8+g6b4b+JHwj0/Rbb7Na/Z72Xy/MZ/meFWY5Yk8kk16fbfDrwnZaPq2k2ejQwadrDbry1jd1jc4xlVBwnGPubeg9Kj0r4Z+EtEl0mTTNJML6M0zWB+0zN5Jl/1n3nOc++cdsVrBtS5n5flYzlrDl9fxat/XmeO6f4d0fxp4R8Z+M/F97cjxJpd5dLBdfbHjbS/JyYkRVYAAN0BHJ6c0R203j/AMX/AAvXxTJcE3+g3DXnlytE1yu08MyEEBxgnHUEjvXretfCXwN4h8QjW9Y8O29xqGVZpN7oshByC6KwVz67gcjg5Fbk/hjR7nxFYa7NZg6jp8Tw2swkZRGjDDDaDtP4g1nFW5b9LfhFq/zb19OoSu728/xaf4W0PNvg5YR+HfH3xA8MaZJMuj6dd272drJKXEHmI5YAnnsB68DOTzWP8ZZNT1r4r6B4YbQpfEGlPYSXS6QupiwS7mywJaQ43FAoIUc9T0Jr2HTfDOkaRreqavp9p5N9qzI17L5jt5pQELwSQuAT0Aqt4q8EeHPG1nFbeKNKhv44W3RMzMjxnvtdSGAOBkA4OBnpVS15fJL8rf8ABKVk5W6/1/XqeI2Wma/f/BXXfDt3q+maEkesi3sbe+12KZFh4JsWmjYkEYI2nBPTAHTW+HWi6JY+I9W8G6z4b1PwzdatpZefQ/7UF3Y3EPCmVZAS6SH5hjdwvfpj1WLwD4Wh8Ht4Wj0S1GisCGtCpIJ/vFid2/8A2s7uBzUHhP4beEfA9xPP4X0WKynnXZJMZHlcr12hnZiBnBIGAcDPSjTXzX6W/rf79SdbL+ut/wCtj50s/D2l2P7Kmuaxa2vl395fxwzzeYx3pHdLsGCcDGT0HPeu/uvCOmeM/wBoHVNP17z5bAeHLdpLaK4eJZTuXbuKEEgHnB4yAe1d9/wp/wACiDVYF0ILFrDq96i3UwWUq+9eA/y4bnC49OnFdBb+GNHtfEk2vwWmzU57ZbSSfzXO6JTkLtJ29uuM0PWKT/r3bfnqOWsm4/17yf5aHy+mgQn9nNfGM13fTa3o+oLDply93J/ocSzqoRFztA6nOM5x2AFdT8SbSDxx4t8TRQ6UuoT6BpcUk15rGrNBaaflN5EMEQDMzDnczEbhzgAA+y/8K38Kf8IbJ4V/sr/iSyy+c9r9pl5feHzv3bvvAHrUWr/C3wVr+vx61rHh+2u7+NFj8yRn2uFGBvTO18DjLAngegolrG39Xslf77sq6Um1/SvdL7jw7X9MtfE3wX+GWpa8sl9eyanDYPPLM+5oHkcMhwe4ReevHWk8S6Lcax8S/EHhxfCEviDS/DtjDb6ZZnXRYppsPlA+cN5/eEnGWJPQA54x7tP8NfCV14Lg8J3OkiXRLd/MhtnuJSY2yTkPu3jlj36EjpVPVvg/4D1u1sLfU/D8UyadALe2YTyo6xjgKXVgzgY43E459TTlrJtbNt/f+q1+96omOkUuyS+5/qvy6ok+E9zrF38L9Hk8R3Ed1frGyPcR3SXIlVXYK3mIzKx2gZOTznPNeC/ES3j8Sjxn4p03TdzaLqX2c61q2ruJY2QhfJtbeIKE2sQVLlsgnqxOPqWzsrbTrKGzsLeO2toECRQxIFVFHQADoK5HUfhB4C1bWr3VtR8N2097fqwuJGeQBiwwWChtqt33KA2ec55pVPek5LzCHuxszznxXYjxV40+EVvq1xcEX2nztcyRTNHJKDAjMC6kEBuQcEcE1FocL+ANX+LWkeEXnt7LS9NjvLG2MjSiCVoGYsu4k56c/wCyM5xXsI8FaAL3RLv7CxuNBiaHTpGuJCYEZQpHLfN8oAy2TVi18L6PZa9qes21kFv9VREvJWkZhMqDCjaSVHHoBnvTnrfl6834vT7gholfW3L+G/3nzZ4g8J+HLD4GeHvE1hfTnWdXu7aS9mN87/b5SxLh0LFSUbdzjIIOec19C+P9Istb+Hes2WqQefbmzeXZvZfmRd6nKkHhlBrGHwP+HKzTyp4Xt1eeUSsVmlG1g24bMP8AIM9lwMcYxxXb3dpDe2M1pdJvgnjaKRMkblIwRkc9DU1FzQlFaXba8tF/kEPdmpPpb82fNOm6VZab8I/AOn27y6Zp3i3UlTXbiK4ZftA+ZQhYn5QwGCBgHFbOtaRY+AvGmv8Ahfwa8sOjX3hO8u73TTcPKlvKEYLL8xJBYBR17jtivZG8DeG38Gp4Ul0qKXRI4/LS1lZn2jJOQxJYEEnDZyOxqpoXw08IeGtH1DTNE0WO1tdTjaK7AlkZ5UK7SpdmLAYJ4BGMkjk05+85W63/ABVkvluFH3OXm6W/B3b+ex5Dpmgw+D/2bZPGvh9Lg+JbjSFibUGnkZ4oXlUEIM4QKvQqARjNVvh5pesaD498J3Wl+HF8PWuqQN9ukl8TQ3Z1lDHuEwiLAkgnd8gON3QCvoCw8P6Vpvh2LQbSyj/suKH7OtrLmVTHjG078lhz3zWJ4a+F/g3wfq0up+HdChs7yUFTN5jyFQeoXex2Zz/Djjiqv+8cun/D6fj/AFoTZ+zUev8Aw2vytp+h43o/h3QPGHhjxB418aa9d6Zr1lrbRHVluJA+nIkqBY0QHC5BIGQcbs9qvfEm0s/HHjnUdNs7FNbk0bR452vdX1cwWNmrL5hlWKEBpGZcZbdtyRkAAZ9Q1b4R+BNc8R/27qnhy3n1AusjyF3VZGBzl4wwRvfcDnvmrOu/DTwd4m1y31fXdBtry9tlVEdywUqOgZAQrgejA+lZcr5FHt/la/369PU0TtJv+t729LaHilrZ6t4z/Z38IWp1azuJxeyA6XqV+bf+1kjdwlurBgWIwoAyAODkYFX9K0vw+3gX4geEbnRdV0W7s7E6hNoN3qK3VtauqF43glT5jkhGYMepA5Ga9af4Y+DpPB6+F5dEik0aOQyx20ksjGJyclkctvU5J6EcEjoTU/hr4e+FfCGnXdj4e0aG0gveLkFmlaUYxtZnJYrjPGcDJ45NaT97nt1/PT/Lz+QoWi4vt+V/8nb/ADRynwZtfDvhL4T6DcedbabLrYjeRri52/abhhgBQ7feIX7q+nSun+JWsQaB8Ntb1G6lvIo4rYrvsZBHMCxCrscghTlgN2DjrjisZ/g74ZsbPTbHw9pqWNtbavDqcha6mdleMdVDMclsBTk4AJOCQK7jUtNs9Y0y40/U7dLm0uYzHNDIMq6nqKVX34u3X/Jf8FCpe41fofNvg3SLnwj8bfBwstNtPD9vrVnK8llbapJeTSx+USGuGPyHLLuXYAPxFVrnQI9B1C/8W+IoJdas01M3A8a+GtcV57bLbViaFyVYglQQBwrYycV7jovwj8DeHr6yvdF0CO0urGR5YJ0nlLhmG05YsSwx/C2QMnAGTUd38G/h/feIW1u68M2sl88olc73Ebv6mINsOepyvJyTnNVdc0X2v+d/62+7QVtGn5fk1/W/6nWXN239iy3lgPPb7OZYR/fO3K/nxXzbBoWkXfwLuPidc6tdf8Josjzf2sL11kjmEuwQhc7QNuF24zg8cYFfToGBgdK41/hH4EfxR/wkTeG7X+0vN87zNziMv/e8rdsz3zt689eahrV20v16r+v0Gtkn/wAOeZN4V0nXf2iPDl3rWm/6Vf6BFqt2nmyL/paEANgNxjaBt6ccivXPGfjfS/AtjY3uuJcfZry8Sz82JVKwswJDOWYYUYOSMn2q9L4a0mbxVD4kktM6tBbG1juPMf5YiSSu3O3qTzjNS67oOl+JtGn0nXbOO9sbgYkhkzz6EEcgjsQQRVN6af1r/loCSvr2X5JfnqeU6N4h0u/+P3izWdLv477T7Tw7H5l1YusqgqQxCsMqTj9Rjsa8t+wy2N54K8Z6Rpw0v+1NbRBqFzrMl3qN/uc73kChYlQglWAXdng8E5+mPC/gTwz4Lsbiz8NaRDZQ3JzPy0jS8YAZnJYgZOATgZPqaxLb4KfDy0laW18NQxStOlwJFnlDRuhJUo2/KDJ6LgHAyOBSiuWSt0/zbf5/10UrtPz/AMkl/X9PhYfBGj+N/j14/tPES3E9lFb2Z+zR3LxI7mMYdghG4rg4zkfMeK5Tw7ezSeCfhc9/dPJHa+KHt0knfOxFbCLk9gOAPwFfRdl4Z0jT/EOo65Z2nl6jqaxrdz+Y580IML8pO0YHoBWPL8LfBk/hIeGZtEjk0hZzcLA00hKSE5LK+7ep5PQ9CR0OKUbxSXa33qV/y0Lnaafn+XK1+Z51r+sWmmftEeIr+S5lWOw8HyNM9mymaIhg3y5yA+CCMjuO1cLoenXGh+N/h54g07TYdETXrlQzHWJLy+vkYjfJMcCPawYHCqCCecHge/aL8K/BPh26e40fQILeSSzayk+d3WSFjlldWYhs9yQTjjOKq6b8GfAGkTW8+m+HY7ee2ulu4ZluJjIki9MOXzt/2c7T3FVG0XF9v823+D/rcid5Ra7/AOSX5o4bwj4J0bxT8ZfHl5r8Ml2unarby2sBndI0lCk+YVVgGPAHORjPrWJr+qTeCLHxn8NrH93da1fR/wBhRdAYbxtsirjoFIcfU17xpnhvSdG1TU9R0208m71WVZbyTzHbzWUYBwSQOD2Arz4+Etf8V/HKz8TeIdBg0nSvD8UkVlJ9qSaS/Ys2xyF5QAHdg8g+uTiIL4IPa1n8kr/e0l/WlNtKUlve69dbfg2eg6LoNlofhSz0JESSztLVbYrIoKuoXB3A+vOfrXkMxT4teIrPw14OsYbDwH4dvVmvL2CIRR3UyEkQwquBjJySPXd/d3e2XlpDf2M9pdKzQ3EbRSBXKkqwwcEEEcHqDmuAg+Afw0triOeHw3tkicOjfb7k4IOQf9ZVp3nzS/p/8Dp5ktJU+Veny/4Jy2mTW9n4h+NI1FkjbylkfzR1iNu+0+456e9TaL4j0bwP8D/B2t69pkWpa4tmsOkQrAHuJHfO1I2wSoKlckduOSQD33iT4Z+DvF+rQan4i0KC9vIAAspd0LAHIDBSA446Nnv60vin4a+EvGrWZ8S6T9s+xIY7dVuJYljU4yAqMo7D8qhJqNvRfJXX3u//AA5WnNf1f32/yOQ8J+FIdB8LeI/FfxajsJbnWpFvtStpoRLBapGD5ce05DMue2TnAGSMmHwTbar8R/H9r8RNUs20vQ9Ohkg0GzcYlmVwVad/QEE4HTpjgZbpLX4MeAbLRb/SLXQjHY6i0TXUIvbj96YySnPmZGCSeD9elP8AD/wd8CeFtct9Y0HQvst/b7vKm+2Tvt3KVPDOQeCRyK0TSlfolp91v+B+Indxa6vf8/6+47eiiipAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAK2o3h0/TLi7W2nuzDGXEFsm6SUgfdUdyaw7TxPfxTXtrr+jrbXtvZ/bY4NOuDeGePJBVfkQ7wRjbgj5lwx5xtarc3VnpNzc6fZG/uYoy8dqsgjMxH8IY8AntnjPpXEabJP/AMJPqOt+E9I1SZJtOka7i1dJ7Zri5DboYo2uBuRRmUEKPLXcO9Jb2/rZ/wBde3Uf9f1/Xn0Oi0jxBqE+srpevaXBpt1NbG7tlgvPtG+NWVXDZRNrqXTIG4fNwxxRZ+Lre/8AHF14dtbd3Fpa+dJd5+QuHCmNeOSMjJzweOoOObsYpdY8Wz6j4Yh1jS5bzTpI7+51eznCwyHBgWNZ8E7WMhKxER9c8laPDfhrxBoXj2xinvLG40630h4mlg0uWLeTKDgu07/vC3zljnPPHOQ18UU/P8n/AJL1/AiWkW15fmr/AK+h6JRRRQUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVjeJRe/Yke31mLQ7KItJfX5CeZFGqk/IZFaNecZZgQFBwMnIxtI17XdQ8BfbdHWDVrxp5YbW9uSIYpoldlS4cKOQVAOEA3HkbVOQm0k3/AF/X9dAOyorj9FuPEPiT4feHLm31NLS5vYIZdQvljTzQpj3ExIUZNxfaPmGApbjOKteDtSvLyTWrO7vm1OHTb820GoPGitOPLRmDbAqFkdmQlVA+XBGQSbcbNrsHS5ualqNtpOnS3185SCIAuwUnGSB0Hua57/hZXhn/AJ/JP+/D/wCFT/EH/kQ9S/3U/wDRi14VXFWrSpysjwMyzGthaqhTSs1fX1fme3f8LK8M/wDP5J/34f8Awo/4WV4Z/wCfyT/vw/8AhXiNFYfWpnmf25iey+5/5n0vFIs0KSIcq6hlPsadVfT/APkGWv8A1xT/ANBFWK9FbH2MXdJhRRRTGFNkkSGJpJXVI0UszscBQOpJ7CnVzXxDgmufAWpRwxPMuI2niRCzSwCRTMgUckmMOMDrmk9hrVklt478P3V1BDHdTotzII7e5msZ4radj90Rzsgjfd/DtY7u2avf8JFpf9k32pm5ItNPaVLmRonBjMRIcbcZOMdgc8YzkVzfjXWpofCcer6LqOg3GmSRoYLa8szcC+csDGsTrMoyeMDaxyOKo3aLF44u/DAMmNYvrbViqtjbGi/veP7u+2QH3mHry9W7f10/S7Jut/6t/wAPZI7Qa/pjWum3K3StFqrKtkyqx84shcYGMj5QTzjGOas3t/badFHJdybBJKkKAKWLOxwAAASf6DJPAJrzzwrGJ/GcGgMyMnhNrptgUDZ5pAtuM/8APF5B+B6V0mrh5viT4chkBNvFa3lwoxx5w8pFP1CSSD8TQrOzWz/L+v8Ahh9Wu35iyfEHw9FNco8moeXazPDPcjSbo28TIxV90wj8sBSDlt2Bg5Naup+INM0izhub26+S4IW3SFGmkuCRnEcaAtIcc4UHgE9ATWB4Mubaz8N65c30scNtDrGpPNJKQFVBcSEkk9sVheDo10zUvCZ1NRAlxo88OneaNuwtKsgiAI4fygny9cI3oaSbfL52/K/47Ic/dk12b/B2/wCCztLbxbo13pt5fR3UkcVhzdpPbSwy24xnLxOodRjnJUDHPTmtgMGUMpBBGQR3rIhvdJu/FN/YQ20ct/Baxi8nWJSFRixSJ365wWbaegbPfmn8PpZJPAmnCRmcRB4Y3Y5LRpIyIfxVVpi2djpKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKK8/1q0uNF1bTWt9b1C+8R6hqSmOAXMgha18weaDbbjGqJCcb8Z3bTncwBxNf8S2+j/8ACRanqmvXlt4j024kksdLF46q9umCm22yFlRkyWkKsVy/zLsBVxXM7f10/wA/wY2v6+//AC/I9borz/xbazaZG+pR63qMuv312qaPaw3MkcWcjEX2cN5bqFDF3dSQCxyuFx6B9aXQm5k65Hroa1uPDslo7QufPs7xjHHcIRj/AFiozIVPIIUg8gjkEVvDeh3emWepyag0Au9Uu3u5YbdiYYGZVXYhIBbhASxA3MWOBnFcL8SNZ1Ox8WeTZajd20X2dDshnZFzzzgGuS/4SXXf+g1qP/gW/wDjXJLERi3G3l/X3HiV85p0arpuD91np0vh3xRY/DfRfD2iS2QureGK3v5DeSQbolTDCKQROVJIA3bcgZxg4I3/AAvZ3em6PHYXWkadpMNsBHb2+n3j3CBMdy0UZBz7HPXNeJf8JLrv/Qa1H/wLf/Guz+GGr6lqHia4iv8AULq5jWzZgk07OAd6c4J68mqjilOdrbhQzinXqxpqLVzr/iD/AMiHqX+6n/oxa8Kr3X4g/wDIh6l/up/6MWvCq58V8a9Dy89/3iPp+rCiiiuU8E+kdP8A+QZa/wDXFP8A0EVYqvp//IMtf+uKf+girFe0tj9Mh8KCiiimUFFFFAGVa+FvD9lq76rZaFptvqMhZnvIrONJmLfeJcDJz355q+bO2a9S8a3iN0kZiScoN6oSCVDdQCVBI9h6VNRQBDHZ20N1NdQ20MdxcbRNKsYDybRhdx6nAPGelVNW0n+0ZrG4hm+z3VjcieKTbuGCCrqRkZDIzDrwcHnGK0aKAMN/BPhSXUjqMnhnR3vjL5xumsIjKZM5379ud2ec9c1p6hptjq1jJZarZ299ayY3wXMSyI2DkZVgQeQDVmijpYOtzK/sG1svD8+leHIrbRI5FZUNpbKqxFurBBgbv69c9Ku6fYW+l6bbWFjGIra2iWKJB/CqjAH5CrFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUVm3viLRNN1O307UdY0+0vrnb5FrPdIksuTtG1Cctk8DA60AaVFZ+p6/o+iPAus6tY6e1yxWAXdykRlIxkLuIyeR09RS6tr2j6DFHJrmq2Omxyttje8uUhDn0BYjJoAv1Dd3ltYWct3f3EVtbQqXlmmcIiKOpLHgD3NTA5GR0rM1+PSBpn2zxCYkstPkW8MkzlUjZDlWPrg8gHPOO+KT0BajR4q8PHRTrA13TP7LDbDffbI/IDZxjzM7c54xmoIPHHhO6tbi5tvE+jTQWqhriWPUImWEE4BYhsKCeBnvVDwslxLe614mv7R9Mg1IxtDazLtlEUSECWVf4XYH7vUKqg85AXwHbtc6Q/iW9BN9rxF0xYYMcHPkRewVCOP7zOe9P+v6/H7guaeleLPDmu3TW2h6/pepXCoZGis72OZguQNxCknGSOfeteuU8FR/2n9t8VXJEk2qyFbZv+eVmjERIvseZD7v7Ct/V55LXQ764gbZLFbyOjYBwwUkHmh6K5Mnypt9DmdL8KeI9N1+81Q69pN1LezbppZ9HlM3khsrCri5wqqOBhcZyxBJJNnUfCeo6jeXME2vM2hXlws9xYyW5eXjGYkmL4WJioyuwnBYBhkY81/4WL4p/wCgp/5Lxf8AxNH/AAsXxT/0FP8AyXi/+JrlWKgraPQ8R55hn9mX3L/M9A/4RPxHD4rvtct9e0mSa4PlwfbNHlle0g4xCjLcqAMjLEKCx68BQOzHTnrXhn/CxfFP/QU/8l4v/ia9e8L3txqPhewu7yTzJ5ogzvtAyfoOK0p1oz91dDswuY0sXNxgnffW3+Z5d8Uv+Ry/7dk/ma4yuz+KX/I5f9uyfzNcZXnVf4jPj8f/AL1U9WFd18Jf+Rruv+vJv/Q0rha7r4S/8jXdf9eTf+hpTo/xEVl3+90/U7v4g/8AIh6l/up/6MWvCq91+IP/ACIepf7qf+jFrwqtcV8a9Dvz3/eI+n6sKKKK5TwT6R0//kGWv/XFP/QRViq+n/8AIMtf+uKf+girFe0tj9Mh8KCiiimUFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRVPVl1F9KuF0V7eO+ZcQvcgmNCf4iBycDnHfpkda5RNYvfD2t6rYXmtz61bWWktqE811FCslo4J2qTEiLh1DEArn5CckHhOSW/9aXGlf8Arzt+p29FeeeCNavNS02J28TanqGtzaYJ1sNX05bK3eQqMvGRbI7oGIBKs4AYZzkGtKyn1jSPGWmaVe67LrL39tLNdwywRILTYBh4zGikIWJXDlieMHhs1JOMrP8Ar+rEppq6/r+rnY1wvjC2spIdV8NaHZLc634mjP2okl1t4ygi+0Skn5VVV+VRjcwwB94juq5258CaJc6rd6kTqkF1esr3DWms3duJCqhQSscqrwAB0pdSk7arc5ZtN1q78TeMBZ/2W4hgt7MnVIJJTdQ/Zwxi+V18tSzvl/nySfl+Xmn4e/tLxHql3qHh6LT7GN9CsEt01aKS72wOkjeUAHXgnrJubO0ZU4zXeat4P0bW2VtQguGbyfIkMV7NCZ4/7kuxx5q8nh9w+ZvU5XVPCWjavHEl1bzQiKLyF+xXUtoTF/zzJiZdyf7JyB6UmtGv66/57bb93daXVun/AAP8v6srN8E3dvfeBtGuLK0ayga0jEduZjL5QAxtDnlgMcMeowad4n0zQ9YsYbTxHN5cKzrPFi9e1bzEOVYMjKeCQevBweoFattbQWVpFa2cMcFvCgjiiiUKqKBgKAOAAO1ec/GD/V6R9Zv/AGSlWnypzOTF13hqEqqW3/DHTWVp4ZsLS7to9YknhvE8uZbzW5rn5cEYUyysU4J+7jt6CtGDUdCtrGOzg1CyS3ijESILlflUDAHXPSvnqiuL6030Pn/7en/IvvPoXR5NFsbG00nRrq18m3iWGCCO4DsEUYA5JJwB1OTUmv8A/It6n/16S/8AoBrxz4d/8j9p3/bX/wBFPXsev/8AIt6n/wBekv8A6Aa6YVXVg5M9fCYt4vDSm1a11+B87UUUV5R8KFe++Cv+RK0v/rgP5mvAq998Ff8AIlaX/wBcB/M114X4mfQZF/Hl6fqjzX4pf8jl/wBuyfzNcZXZ/FL/AJHL/t2T+ZrjKwq/xGeZj/8AeqnqwruvhL/yNd1/15N/6GlcLXdfCX/ka7r/AK8m/wDQ0p0f4iKy7/e6fqd38Qf+RD1L/dT/ANGLXhVfQ3iPb/wj915iB1wuVYcH5hXAf6L/AM+UP/fI/wAKzzCrWhVShTclbul+bPfzPDYerWUqtZQdtrSfV66I84or0f8A0X/nyh/75H+FH+i/8+UP/fI/wrz/AKxif+fL++P+Z5f1HBf9BS/8Bl/kelaf/wAgy1/64p/6CKsVHbY+yxYGBsHH4VJX1Mdj7OOyCiiimMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooqhrU2pw6a39h20Vxeu6Rp5zYjiBYAyMMgsFGW2ggtjAIzkAF+iuRt9e8Qx3ur6LJDYarq1lBbzwy2yNbRMszMoDozuV27GY4Y7l6DPBgl8X6jocOuW+srZ6ne6ZFbyRPYxtbRzPOxSOFgzybG3Ac7jw6nFD0DU7WiuU8J6/qOq6jc29xqeha1bxRgtd6M4UW02cGGRDLIScchuOjAgcZ6ugDP1bX9H0CGOXXdWsdMjlbbG95cpCHPXALEZNXfNj8nzvMXytu7fn5cdc59K5/xHe6boN4uqCxkv9cu4vsVnawsTJcDO7YoJ2quTlnOAAAWPArjdZjuNB8JaZ4Q1GK/ezWxkl1G40/TLmeJxzttkMaNsXcec4wiAfxZEOTUW/6/r/hvWkryt/X9f13t6hHcwS2i3UU8b27oJFmVwUZSM7gemMc5p0UsdxCk0EiyxSKGR0bKsCMggjqK8/g0+z8UfA/TluGvUtYtJVngxJb+eUgI2uCAzJnnH3WwPvKeet8Kf8iZov8A2D4P/Ra1rJWlKPa343/yMYybUX3T/C3+ZNrw1dtBu18Nm0GqNGRbNeMwiVj/ABNtBPHXGOSMVz3hrQ9e0zSrzT3tLDTJLiN5G1WDUnvrmW5YAebIslvGrHv1wMBQoGMb2va9aeHdPW81ASGJpBGPKXJyQT6j0Nc7/wALV8P/ANy9/wC/Q/8Aiqyc4RbTZnUxdClLlnJJ7ko0rxTf6pbanqkOjxXWlW0y2SQXMki3M8ihd8hMamNMD7qhz83X5eWeDtG8Q6ReSy61pmlvc3x36hqkWqyzTzOB8oCNboFQdFQMAoJ6kklv/C1fD/8Acvf+/Q/+KqSD4n6DcXEcMaXm6Rwi5iGMk4/vUlWp33Mfr2FeimvvOxr571XUb1dZvQt5cAC4kAAlbj5j719CV85av/yG77/r4k/9CNc+K2R5WetqELeY3+07/wD5/bj/AL+t/jR/ad//AM/tx/39b/GqtFcF2fL88u57L8LJ5bjwrO88ryt9scZdiTjYnrWR8YP9XpH1m/8AZK0/hP8A8ilcf9fr/wDoCVmfGD/V6R9Zv/ZK75f7ufVVXfKPkvzR5jRRRXAfJHTfDr/kftO/7a/+inr2PX/+Rb1P/r0l/wDQDXjnw7/5H7Tv+2v/AKKevY9f/wCRb1P/AK9Jf/QDXfh/4bPrcn/3Kfq/yR87UUUVwHyQV774K/5ErS/+uA/ma8Cr33wV/wAiVpf/AFwH8zXXhfiZ9BkX8eXp+qPOvida3E3jDdFBI6/Z0GVQkd64/wCwXf8Az6z/APfs1674quHi1raoUjy16/jWL9sk9F/KvPryxPtZcsVa/wDM/wD5EeKo4B15upUknfW0U/8A2488+wXf/PrP/wB+zXb/AAqtp4fFNy00MkY+xMAWQj+NKufbJPRfyre8IztLq0oYADyCeP8AeWnh5Yn2seaKS/xP/wCRHg6OBjiIunUk3fS8Uv8A25m54k/5F66+i/8AoQrz2u48bzSW/g2/lhba6hMHGf41rxz+2tQ/5+P/ABxf8K9qeFnWfNFo9zFZJicxmqtKUUkra39eifc6uiuU/trUP+fj/wAcX/Cj+2tQ/wCfj/xxf8Kj+zqvdfj/AJHJ/qnjv54fe/8A5E98tv8Aj0h/3F/lUtQWLFtPt2PJMSk/kKnro2PaSsrBRRRQMKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKytbk1wta2/h5LWNpnbzry7QyR26gZH7pXRnLHAGGAHJJ4AOrXMeN7jxCtjbWnhrTrycXUhS7u7KSATWsQHJjE0iKXboDyF5Yg4AKY0V7LXPEmq2MtpYQ6f/aFrqMljdX5Rmto1Rd3miHeHJOVXYH+VicsQvNWXxlqltoupxTCxk1Sx1SHS/taoyWpeXyyspTcWUKJRlN/JGNwzkR3Da3pvgu103wf4T1TTf3xgkDzWb3EERG551zOUd2JIyzZ3EswOMM19EupPBdtp+l+HdQs7azvFlu9MvrmAy6pEcmQNIkrqxZm3EOwDlSrYViafX7v0u/z+/wAhf8H9bL+v1N/w1q+oXl/q2l6w1pPd6ZKiNc2UbRxSh0DgbGZijgHkbm4KnPzYFnxReazZeH55fDWnHUdSJVIotyALk4Lne6Btoydu4ZxjIzkZPgzSLrTtQ1O4TSjoGkTrCtno5eM+Qy7vMk2RM0ce8svyoTnbuOCxrZ8SXs+neGr+8tGCTQwlkYjOD9DSnoiJTVOLm+l2c5oNvq+l+H75dJ8P38OrNItzNca5Nbs2pSEjfloJX2ttG1cgKvygDAxWXP4LuNet9ZW18PJ4esLuGI/2ZctDsvLlJhL5kiQl0UMFCFuWYE5HyrnnP+FleJv+fyP/AL8J/hR/wsrxN/z+R/8AfhP8K5vrUL3/AK/r8DxlnmGXSX9fM77S7PUtT8eQ67daHNocFppr2ZS4mhaW5Z5FYcRO67ECHG45zIcAc57CvEf+FleJv+fyP/vwn+FexaPcSXeh2NzOd0s1tHI5AxlioJrWFaNTRdP87nZhMfSxcmqaenf7jlvEqeDJvEn2jW9QvLXVIIRAWtdRu7YrGfn2/uXUHOQfy9Ks23ivwja6WNPTV3ltwhQ/aJZ5nYHOcyPlj16k15z8Rv8AkfdQ+kX/AKLWuYrlniJJuNlY8avnNelWlFRWja69Pme2ReKfBsOjJpUWoRrZJALZYsSHEYXbtzjPTjOc1r+H9U0a+shaaBcLLBZRpEFUN8i4woy3J4X9K+fK9N+D3TWP+2H/ALUq6eIlOdn1NcDmtXEV40pRSWu3p6+Rq/Ff/kUYf+vxP/QXrx2vYviv/wAijD/1+J/6C9eO1hif4h52df738kFW9L/5DFn/ANd0/wDQhVSrel/8hiz/AOu6f+hCsFueTD40fR1fOWr/APIbvv8Ar4k/9CNfRtfOWr/8hu+/6+JP/QjXbi9kfT598FP5lOiiiuE+VPYfhP8A8ilcf9fr/wDoCVmfGD/V6R9Zv/ZK0/hP/wAilcf9fr/+gJUPxQ0m61RNM+yKreWZd2Wx12f4V21JxhheabsvP1PsfZVK2VqFOLbaWi1e55JRW1/wieq/88o/+/go/wCET1X/AJ5R/wDfwV4/1zDf8/I/ej5/+y8f/wA+Zf8AgL/yLnw6/wCR+07/ALa/+inr2fV4vP0S+h3bfMt5F3emVIzXlngbw9qFj4zsbi4RBGnmZIcHrGw/rXq2o/8AILuv+uL/APoJr1sJUhVoydOSe+2vQ+jyyhVw+FlGtBp3bs01pZHi/wDwhq/9BNP+/f8A9lR/whq/9BNP+/f/ANlW3RXkewr/APP38EeH9Zwf/QOv/Apf5mJ/whq/9BNP+/f/ANlXrnhi2+x+GLC33iTy4gNwGM8159Xo2g/8gG0/6516GBp1ITbnPm07JfketldWhOrJUqXI7d2/zOS8Y3EEevbZZ4kbyl4eQA9/WsH7Za/8/Vv/AN/l/wAai+Jv/I3/APbun8zXH17H1CE/eb3Pe/1ZoYn99Ko05a9Dtftlr/z9W/8A3+X/ABrovBM8MutTCKaKQ/ZycI4Y/eX0ryiu3+FX/I0XP/Xm3/oaUfUYU/fT2D/Vqhhf38ZtuOvQ7bx+dvgXUT/sp/6MWvDvO/2f1r3D4g/8iHqX+6n/AKMWvCq+gyyhTqUW5rr+iPAzTOMdgayp4efKmr7J63fdPsS+d/s/rR53+z+tRUV6n1Oh/L+LPK/1mzb/AJ+/+Sx/yPpHT/8AkGWv/XFP5CrFV9P/AOQZa/8AXFP/AEEVYr4uW7PtYttJsKKKKQwooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigArzP4k+IdW0nxBbQ6bfS28bWodlQ8E72Gf0FemV5D8Wv8AkaLT/rzX/wBDeufENqnoeTm05QwrcXZ3Rg/8Jr4j/wCgvcfmP8KP+E18R/8AQXuPzH+FYVFedzy7nx/1mv8Azv72ei/D3xJrGqeKhb6hqE1xD5Ltsc8ZGK7nxn/yJeqf9e5rzL4Xf8jmv/Xu/wDSvUvFNu934V1C3ixvkhKrk4FdtOX7lyk+59TlrqVsDJO7buu/Q+fKK3v+EP1P1g/77/8ArUf8IfqfrB/33/8AWrxfruF/5+R+9Hg/2Tj/APnzL7mYNfRHh7/kWNL/AOvOH/0AV4r/AMIfqfrB/wB9/wD1q9t0SJoPD+nwyY3R2satj1CgV6OAr0qspKnJP0Z7WUYPE4acnWg43XVWPG/iN/yPuofSL/0WtcxXofjTw0dQ8XXlz9sji37PkZeRhFHr7Vhf8Icf+gjF/wB8/wD16462KoxqSTfV9GebictxU685xjo2+q7+pzNem/B7/mMf9sP/AGpXMf8ACHH/AKCMX/fP/wBeu6+G2jHSRqWbhJvN8r7oxjG//GtMJiaU6yjF6+j7G+X5fiaOJjUnGyV+q7PszU8d6dFqegRwTytEouFbK467W9frXnn/AAh9h/z+yfmtej+NJY4tDjaWRY189Rl2AHRvWuE+22n/AD9Qf9/V/wAa2xeFq1avNCUkvJL9Uzvx1/baYZT87S/RpFP/AIQ+w/5/ZPzWp7HwnYxahbyLeSErKrAZXnBFS/bbT/n6g/7+r/jU1neWpvoALmEnzF4Ei88/WuVYLEJ/xJfdH/5E44811/sa+6f+Z6tXm15csL6cbE/1jdvevSa8W1HxGseqXSG0J2zOM+b1+Y/7NerisEsWknG9j38RRx9VL6lv11S/M2vtTf3E/Kj7U39xPyrnf+EmX/nzP/f7/wCxo/4SZf8AnzP/AH+/+xrh/sOP/Pv8f+Ccn1PiHz++P+Z6p4RcyaRISAP356D2WqnjSR0Wz2My5L5wcf3aT4fXw1Dw9NKI/LxcsuN27+FfYetZfxOv5rFNM8jb85lzuGem2vSjhf3KoJWOyWExdej9XbtVfn133RlfaJv+er/99Gj7RN/z1f8A76Ncr/wkF56R/wDfP/16P+EgvPSP/vn/AOvWf9lS7L+vkcP+rma/8/F/4E/8jv8Aw1NI3iG2DSMR8/BY/wBw12GsuYtBv3X7y20hGfZTXl/gfWLm68ZWMMuza3mZwv8A0zY16drxx4b1I/8ATpL/AOgGumjhnR/du2p3YfB1sBBwxTv13vp8/RniX/CQXnpH/wB8/wD16P8AhILz0j/75/8Ar1i+a3oKPNb0Fe//AGV/cRP9scO/8+l/4Aja/wCEgvPSP/vn/wCvXsvhSZrjwpp8smNzwgnH1rwDzW9BXvXgw58F6Yf+mA/ma48Vgvq8VLlSv2NKeOyvEvlwULSW/u20PN/ihLInjHCOyj7OnAOPWuO+0Tf89X/76Ndf8Uv+Ry/7dk/ma4yvo8Gl9Xh6H5/mE5LF1En1ZJ9om/56v/30a7j4TyyP4qug7sw+xNwTn+NK4Ou6+Ev/ACNV1/15N/6GlLGpfVp+hWWzk8ZTTfU7v4g/8iHqX+6n/oxa8Kr3X4g/8iHqX+6n/oxa8Krkyj+A/X9Ed/EH+8x/w/qwooor2D50+kdP/wCQZa/9cU/9BFWKr6f/AMgy1/64p/6CKsV8FL4mfq0PhQUUUVJQUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFc5N4ztV8b2nhq2tbieWUyCe6CFYYGWPzAm4jDOQQcDoDk4yAQTdldnR0VyGo+N7mzvtUe30hJ9I0adINQu2u9kqMyI7GOLYQ6qsiE5dSecA4GbGteKr/AEmW9uV0UNo+mhWvb2e4MLlcBmaGPYRIFU8ksvIIGSDRqN6HT1wvjjSdOv8AWYJL4HetuFGGYcbm9PrXdA5AI6GvPPiDq0VhrlvHJG7FrYNlcf3m/wAK5sVh54in7ODafluYVqdWpDlo01N9nt+aMT/hHND9G/77ej/hHND9G/77es//AISO3/54yfpR/wAJHb/88ZP0ryv7GxH88/vX+Rw/U8x/6Aqf3L/5I67wbo+mWXiATWQPm+Uw5Zjxx612GvSCLQbx2cIFjJ3E4x+NcL4F1iK98SiKON1Pksctj2rsPGH/ACJ+p/8AXA16mFwsqNP2U23fvqzuw+Hq8vsq9NU2+kfPru9Tgf7Vj/6CEf8A3/H+NH9qx/8AQQj/AO/4/wAa4eiur+y6Pf8AI6/9V6X/AD+n96O4/tWP/oIR/wDf8f416dpjb9Is2Dbg0CHOc5+UV8819AaB/wAi1pn/AF6Rf+gCj6pDD6x6kyymGA96M3K/c4jxXe20Pia6SWdEYbMgnp8grH/tKz/5+Y/++qq/ECN28cX5VGIxHyB/0zWub8qT/nm3/fNaLL4TXM29TF8O4Gs/azqtOWr1XX5HXf2lZ/8APzH/AN9V2HgO5huPt/kSrJt8vO05x96vIfKk/wCebf8AfNej/CZGUatuUj/U9R/v0ngYUlzpvQayLB4R+2pVG5LpdddOiNT4oIz+FYgilj9rTgDP8LV5L9nm/wCeMn/fJr1X4r/8ijD/ANfif+gvXjte1gcJ7WjzXscdfiSWWz+rqlzdb3tv8mXfs83/ADxk/wC+TVrTYJhq1oTE4Hnpk7T/AHhWRVvSv+QxZ/8AXdP/AEIV2Sy+yb5vw/4JguNJyfL7Df8Avf8AAPo6vnzVfK/ti9zOgP2h+CG4+Y+1fQdfOWr/APIbvv8Ar4k/9CNeZltCNaUlLoaY/NsRlijKgl729/L5oT91/wA/Ef5N/hR+6/5+I/yb/CqlFe19Qpd2eV/rhmPaP3P/ADPZfhbt/wCEVn2uHH2x+QD/AHE9azfi3IiR6TvRmyZsYbH9z2NXvhP/AMilP/1+v/6AlZnxg/1ekfWb/wBkrxadGH1/2b2u/wAj0q+ZYj6h9di+Wbs9PN263POvPh/55Sf9/B/8TR58P/PKT/v4P/iarUV7/wBUofy/mfN/6x5r/wA/vwj/AJHW/D6WJvHWnhY3B/eclwf+WTe1eua//wAi3qf/AF6S/wDoBrxz4df8j9p3/bX/ANFPXsev/wDIt6n/ANekv/oBrwcfThTxMVBdF+bPfwGNxGNwk6mIlzNXXTay7ep87UUUV9QfAhXvvgr/AJErS/8ArgP5mvAq998Ff8iVpf8A1wH8zXi5x/Cj6/ofScPf7xP0/VHmvxS/5HL/ALdk/ma4yu7+Jen3Nz4u8yGPcv2dBncB6+prkf7Ivv8AniP++1/xrfC4qhGhCMppO3dHPjsvxlTEznClJpvdRf8AkUq7r4S/8jXdf9eTf+hpXJf2Rff88R/32v8AjXa/C2wuLXxPcvPHtU2bAHcDzvT0NLGYqhOhKMZpu3dFZfl+Mp4qE50pJJ7uLS/I7rxpAtz4PvonJCsEyR1++teRf2Fbf35v++h/hXsXiz/kV7z6L/6GK8vr5CeOxOGfJSlZfI/TcJk+Bx8HUxNPmadt3t8n5mb/AGFbf35v++h/hR/YVt/fm/76H+FaVFR/a+O/5+fgv8js/wBWMo/58r75f5nsNkNun26jtEo/Sp6htP8Ajyg/65r/ACqat731PBaSdkFFFFAgooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK53W7WeXxp4YnigkeGB7kyyKhKx5hIG49snjmtu+JGn3BBwRE2CPpXzv/ad/wD8/tx/39b/ABrCtVVO2h5ePx6wjinG9/0O58Q6bLLf6+JtO1eXxDcXAbS/s1tI1jMqhfIaXA8htpHzGfLrj5cAR1qeNbh9Vt7zSNR0XWft8GyTSZdPSaW3updqlGkKjyV2yjlJ/lAUN0NeZf2nf/8AP7cf9/W/xo/tO/8A+f24/wC/rf41isUrJW/rv6+Zwf2/G9/Z/j/wNj6KtfOFpD9rKmfYvmlPu7sc49s15Z8Vf+Rmtf8ArzX/ANDeu18AyvN4G095XaRyJMsxyT+8bvXD/FeaWPxPaiOR0H2NThWI/jevYwMHXqpLS6ue1HM44KhHFuN00tL9ziqKj+1XH/PeX/vs0farj/nvL/32a93+z5fzGX+utL/ny/v/AOAdn8M/+RwX/rg/9K9G8ZEr4N1Qg4IgOCK82+GM8snjJRJK7D7O/DMT6V6T4z/5EvVP+vc15Vei6WKjF+X5lVMyjmWGnXjHl0a+5Hgv2ib/AJ6v/wB9Gj7RN/z1f/vo1HRX1fKux+be0n3ZJ9om/wCer/8AfRr6E8PEnwzpZPJ+xxf+gCvnevojw9/yLGl/9ecP/oArw84SUI27n03D8pOpO76I8e+I3/I+6h9Iv/RS1zFdP8Rv+R91D6Rf+ilrmK9XC/wIei/I8HHf71U/xP8AMK9N+D3TWP8Atj/7UrzKvTfg901j/tj/AO1K58y/3WXy/NHXk3+/Q+f5M1fiv/yKMP8A1+J/6C9eO17F8V/+RRh/6/E/9BevHazyr/dvmzbPf98+SCrelf8AIYs/+u6f+hCqlW9K/wCQxZ/9d0/9CFelP4WeNT+NH0dXzlq//Ibvv+viT/0I19G185av/wAhu+/6+JP/AEI18/k/xT+R9ZxF8FP1f6FOiiivoj5A9h+E/wDyKVx/1+v/AOgJWZ8YP9XpH1m/9krT+E//ACKVx/1+v/6AlZnxg/1ekfWb/wBkr5un/wAjP5v8j7Kt/wAiX5L80eY0UUV9IfGnTfDv/kftO/7a/wDop69j1/8A5FvU/wDr0l/9ANeOfDv/AJH7Tv8Atr/6KevaNXAbRb4MMg28gIPf5TXzObS5cRGXZL82fbZBB1MJKC6ya/BHzjRXV/Y7b/n3i/74FH2O2/594v8AvgVP+sVL+Rnb/qLif+f0fuZyle++Cv8AkStL/wCuA/ma8t+x23/PvF/3wK9a8MqqeGbFUUKoiGABjFc2JzSGNioRi1bU6cPw5VymTqzmpX00v6nHeOP+Ri/7Yr/Wucro/HH/ACMX/bFf61zlfNVf4jP0LB/7vD0Cun8Bf8h2f/r2b/0Ja5iun8Bf8h2f/r2b/wBCWnR/iIWO/wB2n6HU+LP+RXvPov8A6GK8vr0vxrOtr4Pv5pASqhMhev31ryD/AISC1/55zf8AfI/xrtq4atWlzU43R5uVVqdOi1N21/RGpRWX/wAJBa/885v++R/jR/wkFr/zzm/75H+NY/UMV/Iz1frVD+Y92tP+PGD/AK5r/KpqgsW3afbsOhiU/pU9d58RLdhRRRQIKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAoqvf3f2DTp7v7PPc+TGXENsm+SQgfdUdyenYfSsTwr4kutX0O+1DXbSLS3tbueKSEyhvJSM/xuDgkDqRx6Z60rq/4/wBfeB0dFct4Q8WXHiW61xri1Fpa2VyiWu8FXeFoUkDuD0J3ZxgEAgHkGjwr4ul8Ta9q8Udukem28cEtjNzuuY5N/wC8Pop2ZX1GD3wGD0OkulDWkyt0MbA/lXj/APYOlf8APq//AH+NevXv/IPuP+uTfyr52rOeCWK1cmrev6NCeVyx+qmo8veKlv67HV/2DpX/AD6v/wB/jR/YOlf8+r/9/jXKUVn/AGND+d/e/wDMX+rM/wDn7H/wVE948JwRWvhezht1KRqH2gnOPnY9a85+LX/I0Wn/AF5r/wChvXd+Af8AkRtO+kn/AKMauE+LX/I0Wn/Xmv8A6G9e1lUPZ4hQ7Kx42eUvY4J0735Wltbby6ehwlFFFfWnwR2Xwu/5HNf+vd/6V6Z4z/5EvVP+vc15n8Lv+RzX/r3f+lemeM/+RL1T/r3NfN4//fY/L8z7LK/+RbU/7e/I8Booor6Q+NCvojw9/wAixpf/AF5w/wDoAr53r6I8Pf8AIsaX/wBecP8A6AK8POPgj6n0/Dv8Wfojx74jf8j7qH0i/wDRa1zFdn4+0u4ufG99LHt2sI8ZP/TNa5z+xbv/AGP++q6cPjcNGjCMqiTSXVdjlxWU5hUxE5woTabbTUXqr+hn16b8Humsf9sf/alcF/Yt3/sf99V6L8KLKWzGq+dt+bycYOem+scdi8PUw8owmm9Nmu6OnLMsx1DFwqVaMoxV9XFpbM0vihby3PhWFIV3N9rQ4yBxtb1ryT+yb3/nj/4+v+Ne0eO/+QBH/wBfC/8AoLV55Xzsc2r4ReyppW87/wCZ9vHhnB5mvrFaUk9tGraeqZzX9k3v/PH/AMfX/GrWmaXeLq1ozQ4AnQn5h/eHvW3U9j/yELf/AK6r/MVX+sGKenLH7n/mV/qTl0feU56ecf8A5E9hrwbU9Dd9WvH85Runc42/7Rr3mvH7/wD5CVz/ANdn/max+u1sJrSe5VDKcLmbccSm+Xaztuc5/YL/APPdf++aP7Bf/nuv/fNbdFH9uY3uvuOr/U/Kf5X/AOBM7j4aWhs/DM0bMGzds2QP9lKg+I9vFOmnedGr7TJjI6fdrR8B/wDIBl/6+W/9BWqXxC+7p/1k/wDZazq4irODrXtJ9VoZ4bA4elilheW8FdWevTzOC/s+0/590/Kj+z7T/n3T8qsUVxfXMT/z8l97Pof7Ky//AJ8Q/wDAY/5Gp4Ns7eLxbZPHCqsN+CB/0zavSdV/5A17/wBe8n/oJrzzwj/yNVn/AMD/APQGr0PVf+QNe/8AXvJ/6Ca6adWpVg3Uk2/PU8TG4ejh8TGFGCitNEkuvkeRUUUV5h9YFeq+G/8AkW7H/rkK8qr1Xw3/AMi3Y/8AXIV14X4meLnH8GPr+hxnjlgPEXJA/cr3+tc5vX+8PzpPir/yOn/bsn8zXFV7EcpjVXtOffyMMPj5U6UY8uyO23r/AHh+ddP4BYHXp8EH/Rm7/wC0teRV3nwi/wCRsuv+vFv/AENKJZTGivaKV7eQsRj5VKUocu533xD/AORB1P8A3U/9GLXgte9fEP8A5EHU/wDdT/0YteC16OA/hv1PLo/CFFFFegbH0tp3/ILtf+uKf+girNVtO/5Bdr/1xT/0EVZr5d7nnBRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKo6drWnavJeppl3HcmxuDa3JjORHKFDFM9CQGGcdDx1BFAF6ismDxRol1oE2uW+owyaZAZA90pJT5GKtg/xcggYzntnIqTRvEGna8s506SbfbsFmhubaS3ljJGRujkVWAI6HGD2o8gemjNKuOh8Izan4e1nStTnutPS81aW5WS1aMs8ZkDrkMrqVbHKsORkEc1d8Zaw2j2dtIt/LZeZIV3RRK5bjp8ymuR/4TaX/oY7z/wEi/8AjdYSqSjPSEn6LTo/0JftNo05Nd0r9/8AM0rDwFqM8/i+01nXtWez1eSJI5/9EDyoIY1ZsJEAD8rRkFcFe2Tuq/4a8L6po3jbVr681e/vrOa0t4oTcraqJCu/PEUSEbcgDoDuOc4GOe/4TaX/AKGO8/8AASL/AON1oaF4skvtdtLY65dXAkfHlPbRqG46ZCAj86Ua0r29nL7gftXvSkvkzu77/kHXP/XJv5Gvm/zG9f0r6Qvv+Qdc/wDXJv5Gvm2vpsphGSnzK+36nzmeYvEYeUPY1HG972bXbsO8xvX9KPMb1/Sm0V7nsaX8q+4+d/tXMP8An/P/AMCl/me6/D4k+A9OJ9JP/RjVynxM0z7b4itpPO2YtQuNuf42966r4e/8iHpv0k/9GNWJ49/5DcH/AF7j/wBCavisVXqYatOdF2d3+Z+j5ZhKOY06dPFrmTim9Xq7b3Tuef8A9gf9PP8A5D/+vR/YH/Tz/wCQ/wD69bFFcv8AbOP/AOfn4L/I9v8A1Uyb/nz/AOTS/wDkjR+HelfY/FYl87f+4cY2Y9PevRPEf/IuX3/XI1xngj/kYx/1yb+ldn4j/wCRcvv+uRpvE1cRB1Kru/67HFPAYbA4iNHDxtHR2u3182zyqiiivL9pPuz632FL+Vfcgr1zSP8AkCWP/XvH/wCgivI69c0j/kCWP/XvH/6CK68NKUm7s8XN6cIQjypLU8+8X/8AI1Xf/AP/AEBaxK2/F/8AyNV3/wAA/wDQFrErkqfG/U9jC/7vD0X5BXafD3/mIf8AbP8A9mri67T4e/8AMQ/7Z/8As1aYf+IjnzL/AHSfy/NF/wAd/wDIAj/6+F/9BavPK774hXEVt4cie4fYv2lRnBPO1vSvNf7X0/8A5+h/3w3+FdFbD1qkuaEW16HLllanDD2lK2rLlT2P/IQt/wDrqv8AMVmf2vp//P0P++G/wqxYarYtqVsq3IJMyADY3PI9qyWDxF/gf3HoSxNHlfvI9srx+/8A+Qlc/wDXZ/5mvYK+edV1e+TWb1VnwBcSAfIv94+1eg8HUxWkGtO589luIhQlJy6m9RXLf2zf/wDPf/xxf8KP7Zv/APnv/wCOL/hS/sbEd1+P+R7P9pUez/D/ADPa/Af/ACAZf+vlv/QVql8QiAun5IHMnX/gNN+FdzLdeFJ3nfewvHGcAcbE9Kx/jJ/q9H+s3/slaQwjk/q8meF9YSxrrRXV/kYe9f7w/Ojev94fnXE0V0f2LD+f8D1f7Sl/KeoeEGB8VWeCD9/v/sNXf+IP+RZ1P/rzl/8AQDXjHw4/5KBpv/bX/wBFPXs/iD/kWdT/AOvOX/0A1m8KsLNQTv1PIxtd16qk1bT9T5wooor6MYV9BeCP+RJ0r/rgP5mvn2voLwR/yJOlf9cB/M152P8A4a9TCtseZfFX/kdP+3ZP5muKrtfir/yOn/bsn8zXFV1Yf+FH0NIfCgrvPhF/yNl1/wBeLf8AoaVwdd58Iv8AkbLr/rxb/wBDSlif4MgqfCzvviH/AMiDqf8Aup/6MWvBa96+If8AyIOp/wC6n/oxa8FrnwH8N+pFH4Qooor0DY+ltO/5Bdr/ANcU/wDQRVmq2nf8gu1/64p/6CKs18u9zzgooopAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAEclxDFNFFLNGkkxIiRmALkDJAHfAGeKqXGvaPaavBpV1qtjBqNwN0NnJcos0o55VCcnoeg7GuW1bRbe2+K3h3VTJcTXVy1ymZZSywxiD7ka9FGRk8ZJPJOBjK1KKKTwH8QbqZFN6t5cvvYfMrxIhgIPqoWMr6HpSTvK3lf8V/mC1dvO34XO+u9e0jT9St9Pv9VsbW9uv+Pe2muESSbnHyqTlueOKv15TrsN9eweNpLK0iubKaNItQuJnCz2zx26lvs6dJNoIYBmiw5YgnOa9Qs5kuLGCaFmeOSNXVm6kEZBPvTW39fL+uor/wBf1/SFuraO8s5rW4DGKaNo3COUO0jBwwIIPuDmuI8I+H9Jc+M9E+wQppf9rrF9jjXZHs+yW3y7Vx8p7joRkHIJrvKihtLe2kmkt4IonuH8yZkQKZHwF3MR1OFAyewA7U1pfzVvxT/Qb2XqeYRR21v8KLyzWFYYm8QTQQFGESWzf2iRG5OCAqsFOMYOAOM5rovDwuoPiJq8GsXFtfak2nWztcWiGGNIw8oVDCWcqcljuLtuzwFxz1I02xFlNZiytxaz7/Og8pdkm8kvuXGDuJOc9cnNRaVomlaFatbaHplnpsDP5jRWdusKlsAbiFAGcAc+1HW/9bW/4P4Dlre3f9b/ANfecf8AFhkXSdP3lgPPboM/w15b5kH96T/vgf416d8Xf+QRp/8A13b/ANBryivo8BhadSgpS8z53HZ/jsFXdCi1yq3TuWfMg/vSf98D/GtzwY8R8ZaaFZyfO4yoHY+9c1W94I/5HbS/+u39DXTWwdKNOTXZnNR4nzKrUjTlJWbSei6nul9/yDrn/rk38jXzbX0neDdYzr0zGw/SvBf+EfH/AD9H/v3/APXryMvxlDDKSrSte3c7s1yrGZg4PCw5uW99Ut7d2jGorZ/4R8f8/R/79/8A16P+EfH/AD9H/v3/APXr1P7YwP8Az8/B/wCR43+q+cf8+X98f8z1v4e/8iHpv0k/9GNWJ49/5DcH/XuP/QmrofBEH2XwbYQ7t+0PzjGf3jGvPfi9/wAjTaf9eS/+hvXzlSjHGVpKMrJtu593lTng+SNSPvRVmvO1mQUVxFFH9if9PPw/4J9H/af9z8f+Aes+CP8AkYx/1yb+ldj4olWHwvqEkhwqwkk4ryn4V/8AI6r/ANe8n9K9P8a/8iTqv/Xu1R9UVCSot3v8tzx8ViHVxCqJWtY8k/tqx/56n/vg0f21Y/8APU/98GuXoru/sjDef3nof2hW8jqP7asf+ep/74Ne1aK4k0DT3XlWtoyPptFfNtfRvh3/AJFfSv8Arzh/9AFc9fBUsMk6d9TgxmJqVopT6HmPjvWls/Gl9AbcvtEfzeZjOY1PTFc7/wAJGv8Az5n/AL+//Y1c+JH/ACP+ofSL/wBFLXLV2U8BhpwUpR1a8zaniq0YJKXQ3f8AhI1/58z/AN/f/sa9C+FupDUBqmITF5fk9X3Zzv8AYeleQV6h8Gums/8AbD/2pUV8Fh6VNzhGzXqRiMTVnTcZS0Nb4tf8ifD/ANfif+gvXjNe0fFhGfwjCEUsfticAZ/hevHPs0//ADxk/wC+DXRgpJUtWc9FPkIqt6V/yGbL/r4j/wDQhUP2af8A54yf98GrWl28w1izJhkAE6ZJU/3hXXKUbPU1adj6Qr5s1f8A5Dl9/wBfEn/oRr6Tr5t1cD+27754/wDj4k6uP7x968jB1adNvnkl6sxwtKpUb5It+iuUqKXA/vx/9/B/jRgf34/+/g/xr0freH/5+L70d31TEf8APt/cz2T4R/8AIoXH/X6//oCVmfGT/V6P9Zv/AGStP4Sf8ijcYIP+mv0IP8CVl/GVgI9HyQOZuv8AwCvOhUg8Vz307/I89U5+35La9jy6ik3p/eX86N6f3l/OvV9tS/mX3nb7Cr/K/uZ1Pw4/5KBpv/bX/wBFPXs/iD/kWdT/AOvOX/0A14v8N2U/EHTQGBP73v8A9Mnr2fxAQPDOqE9Pscucf7hrysZOLqqSelv1OKtTmqii1qfONFJ59v8A3pf++B/jR59v/el/74H+NdX9p4P/AJ+I9n+y8b/z7YtfQXgj/kSdK/64D+Zr588+3/vS/wDfA/xr6C8EEN4I0ornHkDGR7muXE4uhXio0pXZw43B4jDwUqsWlc8z+Kv/ACOn/bsn8zXFV2PxYuZIfG21NuPs0Z5RT3PqK4n7dN/0z/79L/hXMs6oUV7OUXden+Z6+FyPEV6EasZKzV+v+RLXefCL/kbLr/rxb/0Yleffbpv+mf8A36X/AArvvg9cyTeLrpX24+wueEA/5aR+golnVGuvZRi7v0/zFjMjxGHoSqykrJef+R6D8Q8f8IDqW5go2pknPH7xfSvBsw/8/Mf/AHy3+Fe7fEn/AJJ5qn+7H/6MWvnuuGrmVfCS5KdrPXU0yPK6GMw8qlRu6dtPReRezD/z8x/98t/hRmH/AJ+Y/wDvlv8ACqNFY/29iuy+5/5nu/6vYTvL71/kfUenf8gu1/64p/6CKs1W03/kE2n/AFwT/wBBFWa7r31PzWStJoKKKKCQooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAPINV8vQrfVdQvtEvJPFkOpmaHVFs3IeAzjywtzjYE8ohDFuycMNpJ5TxR5Oi23ibVNQ0O+n8UW88l1puqJZuwWEYMQS5AKRqqgq0ZZdx3Da28Bu8PgixOqNcG9vvsT3f25tL3J9mNxnd5n3N/3hv279u7nbSXHgiyudVmuWv79LO5uVu7nS0dPs88y4w7fJvHKqSocKSvIOTkho03/AFt/l/w1/dHu/X/P/P8Aq2vSKdyAkYJGcUtFcz8QJ7y38JSyadLPFP5qANAxVsZ55HNTKXKmzKrU9lTc3rZG5caba3V/aXs8W64sy5gfcRsLLtbgHByPWs688H6HqGsf2ndWjtcF43kVbmVYpnT7jSRBgkjLgYLKSMD0GPHP7X8Uf9BDV/8Av9L/AI0f2v4o/wCghq//AH+l/wAa5frUb3seJ/bcf+fbPYdT8F6Fq+oSXl9ays8wUXEcd3NHDc7ennRIwSXjj51bIAB44rcACqFUAADAA7V4Gmr+KPMXOoavjI/5bS/4177W1KsqiaXQ9HB45YvmfK1a2/8AXkecaqF/ti8+e+H79/uXsij7x6AHge1VML/z01D/AMD5f8a5XxIv/FVar8yf8fkvVx/fNZu3/aT/AL7H+Na/2M5e9eWvr/mbPL8M3d4uC+UP8zvML/z01D/wPl/xrr/BuBY3GGmb94P9dM0h6erdK8U2/wC0n/fY/wAa9S+FIxot9yD/AKQOhB/hFP8Asx4f95d/O/8AmVDB0KT54YiM32Sin+Go74pWcl7pdisRUFZmJ3H/AGa8y/sK5/vxfmf8K9a8f/8AIPtP+up/lXCU/wC1cThv3VNqy8j06XDeAx8PrFdPmfZ22MD+wrn+/F+Z/wAK2/B+kTweL9Old4yqy5OCc9D7VJWp4a/5GSy/66f0NH9tYufuSas9NjSXCWWUYurBO8dVr2PT7r/jzm/65t/KvHK9juv+POb/AK5t/KvHK4MXuj0sl2n8v1CiiiuI989P8Jf8itZ/R/8A0Nq8x+McrJ4sswAP+PJev++9eneEv+RWs/o//obV5d8Zv+Rts/8ArxX/ANGPXfVrVKNBTpuz0PCyujTr5pKFRXXvHBfaH9Fo+0P6LUVFef8A2ljP+fjPuP7LwX/PtHd/CaVn8cKCB/x7SdPwr1PxwSPA2rEdfs7V5R8JP+R6X/r2k/pXq3jn/kRdX/69mr0KNerVoupOV3rqfF5rh6VLNKdOEbL3dPmfOvnSf3v0o86T+9+lMoryvruK/wCfkvvZ919Rwn/PqP8A4Cv8h/nSf3v0r6W8NHPhTSSf+fKH/wBAFfM1fTPhr/kU9I/68Yf/AEAV34OvVqyaqSb9W2fJ8TYejSpU3Tglq9kkeMfEu6lj+IWoomzAEXWNT/yyTuRXK/bpv+mf/fpf8K6T4n/8lF1L6Rf+ikrk646uJrxqSSm7XfVn0OAwmHlhKUpU4tuMei7Isfbpv+mf/fpf8K9S+C87zDWvM28eRjagX/np6V5LXq3wS6a3/wBsP/alaYXEVp1lGU216vscWeYWhTy+pKEEnpsl/MjY+MX/ACJcH/X6n/oD14jXt3xi/wCRLg/6/U/9AevEazx38YOG/wDcPmwq3pH/ACG7H/r4j/8AQhVSrekf8hux/wCviP8A9CFccd0fQVPgl6H1DXzBrX/Iev8A/r5k/wDQjX0/XzBrX/Iev/8Ar5k/9CNetmO0T4jhX+JV9F+pSoooryD7s9t+Df8AyJlz/wBfz/8AoCVlfG3/AFei/Wf/ANkrV+Df/ImXP/X8/wD6AlZXxt/1ei/Wf/2SvYn/ALl935nwFD/koH6y/wDSWeT0UUV459+dX8Mv+SjaZ/21/wDRT17f4j/5FbVf+vKb/wBANeIfDL/ko2mf9tf/AEU9e3+I/wDkVtV/68pv/QDXsYL+BL1f5HwHEP8AyMqXov8A0pnzLRRRXjn34V9GeBP+RE0n/r3H8zXznX0Z4E/5ETSf+vcfzNejl/8AEfofJcU/7tD/ABfozyz4u/8AI8f9usf8zXDV3Pxd/wCR4/7dY/5muGrlxH8aXqe3lX+40v8ACgr0H4Nf8jhd/wDXg/8A6Mjrz6vQfg1/yOF3/wBeD/8AoyOnhv40SM4/3Cr6HofxJ/5J5qn+7H/6MWvnuvoT4k/8k81T/dj/APRi18910Zh/FXp/meVwv/uc/wDE/wAkFFFFeefVH1Hpn/IJtP8Argn/AKCKs1W0z/kE2n/XBP8A0EVZr6qOyPxSp8bCiiimQFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAVn6trdroscb3kV9IJCQv2PT57ojHqIkYr9TitCsXxjqs+jeENRvbLb9rEXl2u7p5zkJHn23stJ3S0GtWV4vHnh+XRLnVVuLtbW1uls5Q+nXCSiYsqiMRGMOzZdRgKeTWppWr22s2zz2cV5GiPsIvLGa1bOM8LKikjnqBiuW1rwzZ2Xhnw9oEGtS6OI9RhMd0kAlkuJl3OclgVDu4LbnBBbsSRWl4Vvr99T1vSr6/bVI9MuI44r6REWRy0Ydo5BGqpuXI5CjhlyMgk1pr/Xb/AD/Im+39d/8AI6WvLPH3iG+03xVJb213JEgiQ7VjVhyPevU68f8AiRp9zc+MJJIY9y+SgzuA7e5rrwcKE6lq9uW3X/gnHja2Ko0ubCw5pX2tzaehj/8ACX6p/wBBGb/vylH/AAl+qf8AQRm/78pWX/ZF9/zxH/fa/wCNH9kX3/PEf99r/jXrfVcq7x+9Hkf2jnn/AD4/8p/8A9K+GutXeq318t3cvMI4lIDIq45PpWz8RZjB4PldZHjPmp8ydetc38KbKe11DUTOm0NEmPmB7n0rpPiNbvc+D5Y4sbjKh5PvXmVIYaGKUYNcmna3merSrY2eFdScP3uvu8ttenu/1c8f/tKT/n8uvzP/AMVR/aUn/P5dfmf/AIqj+xbv/Y/76o/sW7/2P++q9Tlyz+eP3o836zn/AP0Df+U/+AOj1KTzF/0y66juf/iq+h6+eI9FuxIv3Oo/ir6HrzccsMuX6u0972dz0cFVx9Tm+u0+Ta3u8t+/r0PnrxP/AMjZq3/X7N/6Gay69A1on+3r/k/8fMn/AKEao7j6n86ceIYwSj7Pbz/4BT4HnVftPb76/D3+Zxtes/CP/kB3/wD18j/0EVzG4+p/Ou88AnOm3Wf+ew/lWdbOVi4eyULX8/8AgGlPhSWWS+surzW6Wtv82N8f/wDIPtP+up/lXCV3fj//AJB9p/11P8q4SvncR/EZ9zlf+6r5/mFanhr/AJGSy/66f0NZdanhr/kZLL/rp/Q1lD40dmI/gz9H+R6bff8AIOuf+uTfyNfNv2u4/wCe8v8A32a+kb84025/64v/ACNfMn23/p3h/Nv/AIqvfp46hhLqr1Pncsy+vjFJ0raWLX2u4/57y/8AfZo+13H/AD3l/wC+zVX7b/07w/m3/wAVR9t/6d4fzb/4qtf7bwfZ/cev/YON8vvPfvh4zP4C01nYsxEmSTn/AJaNXnXxm/5G2z/68V/9GPXofw4fzPh/pjbQuRJwM4H71vWvPPjN/wAjbZ/9eK/+jHryMwnGpSc47N3ObI6cqeauEt1zL7jz2iiivAP0c7f4Sf8AI9L/ANe0n9K9W8c/8iLq/wD17NXlPwk/5Hpf+vaT+lereOf+RF1f/r2avYwv+7S+Z8BnP/I3p/8Abv5nzlRRRXjn34V9M+Gv+RT0j/rxh/8AQBXzNX0z4a/5FPSP+vGH/wBAFenl3xSPjuKv4NP1f5HiXxP/AOSi6l9Iv/RSVyddZ8T/APkoupfSL/0UlcnXDX/iy9WfR5d/uVH/AAx/JBXq3wS6a3/2w/8AaleU16t8Eumt/wDbD/2pW2D/AI8fn+Rw5/8A8i2p8v8A0pGx8Yv+RLg/6/U/9AevEa9u+MX/ACJcH/X6n/oD14jVY7+Mc/Df+4fNhVvSP+Q3Y/8AXxH/AOhCqlW9I/5Ddj/18R/+hCuOO6PoKnwS9D6hr5g1r/kPX/8A18yf+hGvp+vmDWv+Q9f/APXzJ/6Ea9bMdonxHCv8Sr6L9SlRRRXkH3Z7b8G/+RMuf+v5/wD0BKyvjb/q9F+s/wD7JWr8G/8AkTLn/r+f/wBASsr42/6vRfrP/wCyV7E/9y+78z4Ch/yUD9Zf+ks8nooorxz786v4Zf8AJRtM/wC2v/op69v8R/8AIrar/wBeU3/oBrxD4Zf8lG0z/tr/AOinr2/xH/yK2q/9eU3/AKAa9jBfwJer/I+A4h/5GVL0X/pTPmWiiivHPvwr6M8Cf8iJpP8A17j+Zr5zr6M8Cf8AIiaT/wBe4/ma9HL/AOI/Q+S4p/3aH+L9GeWfF3/keP8At1j/AJmuGrufi7/yPH/brH/M1w1cuI/jS9T28q/3Gl/hQV6D8Gv+Rwu/+vB//RkdefV6D8Gv+Rwu/wDrwf8A9GR08N/GiRnH+4VfQ9D+JP8AyTzVP92P/wBGLXz3X0J8Sf8Aknmqf7sf/oxa+e66Mw/ir0/zPK4X/wBzn/if5IKKKK88+qPqPTP+QTaf9cE/9BFWaraZ/wAgm0/64J/6CKs19VHZH4pU+NhRRRTICiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiivK9U0x9K8ReI/FXirwZpGo6bFeJNHf3EiS3cNvHFGu+OMxsMKwZseYrdcLnG4WrsPoeqUV43eL9vg1/xRqmgi7isNTnU6sLxVvbKG3l2g2ilGAVQpZlLJuJfhsjd7EjiSNXQ5VgCD6ihaxUhPSTX9aDLq5isrOa6uDtigjaRyBnCgZPH0Fcpc/EDwjeRCK7l8+MOrhJbVmAZSGU4I6ggEHsRXQeIJGh8NanKn3ktJWH1CGvC/+Ejv/wC+v6/410UsHiMQr0badzysdjo4WSTla/8Adv8Aqj1K98eeDtTspbPUmW7tZhtkgntDIjj0KkYNN0/xx4L0ixjstK8uxtI87ILazMcaZOThVUAZJJ/GvL/+Ejv/AO+v6/40f8JHf/31/X/Gtv7Jx/8Ad+9/5Hn/ANs0/wDn5/5I/wD5I99sryHULGG7tWLQzIHRiMZB9q8+8bf8jI//AFzT+Vdl4Wlafwppsshyz26sfyry34m3dzD40kWG4ljXyYzhHIHSuT6pKvL2Tdmv0PsMtxCpyVTe69Aorkf7Qvf+fuf/AL+t/jR/aF7/AM/c/wD39b/Gn/Ys/wCf8D3/AO01/L+J678P/wDj8vP+ua/zra8a/wDItSf9dE/nXF/CO5nn1LUhPNJJiFMb3JxyfWus+IV2LLwjLMU8wCVBt3Y7+tZzwsqadBav/M8mddTxqqvRXR59RWN/wkif8+bf9/v/ALGj/hJE/wCfNv8Av9/9jXL/AGXi/wCX8V/mfQfXqHf8GbaffX617NXgCeI0Mij7G3Uf8tv/ALGvf61p4Wrh/wCIrXPFzWvTrcnI9r/oeS61/wAh6/8A+vmT/wBCNUaj1/XLaHxJqUbJKSl1KpwB2Y+9Z/8AwkFr/wA85v8Avkf41zPA4lu6gz2qeKoqCTl0NSu88Af8g26/67D+VeX/APCQWv8Azzm/75H+NekfDS+jvtJvHiVgFnAO4D+6K0p4WvSlzTjZHHmNelPDuMZXehB8U76Sx0uwaMREtMwPmHA+79RXmX/CQ3H9y0/76/8Asq7340/8gXTf+vhv/Qa8erKtjVRnyezi/N7/AJno5PlkcRg41HUkt9F6nSf8JDcf3LT/AL6/+yrb8H61PceMNOidbYB5sHY3PQ/7VcBXQ+Av+R80n/rv/Q1nHMFKSj7KKv5P/M78Tk8YUJy9rLRPr5H0HqH/ACDLr/ri/wDI18t19Sah/wAgy6/64v8AyNfLdZ5jvH5nBwp8NX5fqFFFFeWfan0H8NP+Sd6X9JP/AEa9effGb/kbbP8A68V/9GPXoPw0/wCSd6X9JP8A0a9effGb/kbbP/rxX/0Y9exX/wB0j8j4DLP+R3U9Z/mzz2iiivHPvzt/hJ/yPS/9e0n9K9W8c/8AIi6v/wBezV5T8JP+R6X/AK9pP6V6t45/5EXV/wDr2avYwv8Au0vmfAZz/wAjen/27+Z85UUUV459+FfTPhr/AJFPSP8Arxh/9AFfM1fTPhr/AJFPSP8Arxh/9AFenl3xSPjuKv4NP1f5HiXxP/5KLqX0i/8ARSVyddZ8T/8AkoupfSL/ANFJXJ1w1/4svVn0eXf7lR/wx/JBXq3wS6a3/wBsP/aleU16t8Eumt/9sP8A2pW2D/jx+f5HDn//ACLany/9KRsfGL/kS4P+v1P/AEB68Rr274xf8iXB/wBfqf8AoD14jVY7+Mc/Df8AuHzYVb0j/kN2P/XxH/6EKqVb0j/kN2P/AF8R/wDoQrjjuj6Cp8EvQ+oa+YNa/wCQ9f8A/XzJ/wChGvp+vmDWv+Q9f/8AXzJ/6Ea9bMdonxHCv8Sr6L9SlRRRXkH3Z7b8G/8AkTLj/r+f/wBASsr42/6vRfrP/wCyVq/Bv/kTLn/r+f8A9ASsr42/6vRfrP8A+yV7E/8Acvu/M+Aof8lA/WX/AKSzyeiiivHPvzq/hl/yUbTP+2v/AKKevb/Ef/Irar/15Tf+gGvEPhl/yUbTP+2v/op69v8AEf8AyK2q/wDXlN/6Aa9jBfwJer/I+A4h/wCRlS9F/wClM+ZaKKK8c+/CvozwJ/yImk/9e4/ma+c6+jPAn/IiaT/17j+Zr0cv/iP0PkuKf92h/i/Rnlnxd/5Hj/t1j/ma4au5+Lv/ACPH/brH/M1w1cuI/jS9T28q/wBxpf4UFeg/Br/kcLv/AK8H/wDRkdefV6D8Gv8AkcLv/rwf/wBGR08N/GiRnH+4VfQ9D+JP/JPNU/3Y/wD0YtfPdfQnxJ/5J5qn+7H/AOjFr57rozD+KvT/ADPK4X/3Of8Aif5IKKKK88+qPqPTP+QTaf8AXBP/AEEVZqtpn/IJtP8Argn/AKCKs19VHZH4pU+NhRRRTICiiigAooooAKKKKACiiqGra7pGgwJPruq2WmxSNsSS8uEhVmxnALEZOO1AF+iqOoa3pWk6et/qup2dlZsQFubm4WOM56YZiBz2q3BPFc28c9tKk0Mqh45I2DK6kZBBHBBHegB9FFQ3cs0FlPLbW7XU0cbNHArhTKwHCgngZPGTxQC1JqK5jSdX1uHxNHo3iF9PnlubJrxPsELp9m2uqlH3O2/O/h/kzsb5aZ4f8VahrXjDVtNutJk06ztLaCa1NxxNOHeRS7KD8iny+FPzY5OM4DSv/XYOjfb9f+HOqooopABIAJJwB1Jqjpms6drOkpqemXcc9i+7bOMhSFYqTk9sg89O/SsTxx/a1xa2Vhpuk3uoWVzKf7RNjLAkghUZ8sebIg+c4UkHIXd0JBGX4AsbXxB8Nxp+saLJDZi9uB9luTGUlAuXYDEbsCoPylW4O08FcEi1TB6NHZaVqtjremRajpNyl1ZzZMUyZ2uASCR6jIPPerdcv8N1VPANgqAKqvOAAMADznrqKL31Ji20mzF8W+JbXwl4bn1S8eJdpWKETSCNHlc7UDOeFXJGWPAGT2rzfQrmTWPC/wARNO8PazaeItau3JR7W7jxK8lrEpZPmwsYbcq88BcZJFeu/aYP+e0f/fYrEl8OaNcQ61DcTtJHrUqzXA88KUYRogKFcFceWpBznPNJW1v1X+Ramk00zI8IW1h4f186LJ4T0fQNRuLP7RHLpJWRLmJGVWDP5UbblZ1OCCPmBBPIHb1gaRoltpmoSX95rV1q988QhW5vnhDRx5zsVYkRQCeSduTgZJAAG8rq67kYMPUHNU3df13IVuhR1DWrLS5ES8eZWcZXy7eSTj/gKnFcddW3hy6vLhjq2tR6feT/AGi60tLR/s9xJxksTCZACVBKq4U4OQdzZzviwZxqmn+QZAPJbOzP972rgN99/euPzavSo5ZUrQVRTSv5f8E8DF5w6FaVLlvby8vU9Q1S28OapNcrJq2twadfOJL3TILRxBdNxncTCZFDAAMEdQecjls9ZZeItNv7pLa1ecyMDtD2kqDgZ6soArwPfff3rj82rp/h410fHFl5xmKbZM7icfcaqqZVUp03J1E0vL/gmdHOnVrRhy7tLbv8z1fxGC3hXVVUEk2UwAHf5DXz99juf+feX/vg19Daz/yAb/8A69pP/QTXklcNLM54JcsYp3PpHw9Szf35zceXTQ5T7Hc/8+8v/fBo+x3P/PvL/wB8GurorX/WKr/Ihf6i4b/n9L7keoeEVKeD9LVgVItlyCOnFeSfFaeSPx1KqlceRH1UHtXsXh//AJF2x/64rXjPxZ/5HyX/AK4R/wAq8fHVp+z9pF2bfQ+l4cw8I410ZK6jFrXysjkPtcvqv/fC/wCFH2uX1X/vhf8ACoaK8f6zX/nf3s/QvquH/kX3I9Q+DMzy6pqm/HEKdFA/iPpXWfFEqPA829go86Pk59fauQ+Cv/IU1T/rin/oRrq/iv8A8iFP/wBdo/8A0KvYw1ecKHtb3au9T4HMcPTnnKo2sm4rTzSPFN0P/PdPyb/CjdD/AM90/Jv8KpUUf29iu0fuf+Z9J/q7hP5pfev8jQjaHzU/fp94dm/wr6cr5Vi/1yf7wr6qralj6uMv7RLTt5nzOfZdSwPs/Ztu99/K3kj508Uuo8X6vlh/x+zd/wDbNZW9P7y/nVrxZ/yOWs/9f03/AKGayaP7eqw93kWh7lHh6lOnGXO9Ui5vT+8v51678HiDoWoYIP8ApI6f7orxavY/gv8A8gDUf+vof+ginHN54p+ylFK55+a5NTwmFdWM27WG/Gn/AJAum/8AXw3/AKDXj1ew/Gn/AJAum/8AXw3/AKDXj1eLjf47Pe4e/wCRfH1f5hXQ+Av+R80n/rv/AENc9XQ+Av8AkfNJ/wCu/wDQ1z0v4kfVHqY3/dan+F/kfQeof8gy6/64v/I18t19Sah/yDLr/ri/8jXy3XoZjvH5nyvCnw1fl+oUUUV5Z9qfQfw0/wCSd6X9JP8A0a9effGb/kbbP/rxX/0Y9eg/DT/knel/ST/0a9effGb/AJG2z/68V/8ARj17Ff8A3SPyPgMs/wCR3U9Z/mzz2iiivHPvzt/hJ/yPS/8AXtJ/SvVvHP8AyIur/wDXs1eU/CT/AJHpf+vaT+lereOf+RF1f/r2avYwv+7S+Z8BnP8AyN6f/bv5nzlRRRXjn34V9M+Gv+RT0j/rxh/9AFfM1fTPhr/kU9I/68Yf/QBXp5d8Uj47ir+DT9X+R4l8T/8AkoupfSL/ANFJXJ11nxP/AOSi6l9Iv/RSVydcNf8Aiy9WfR5d/uVH/DH8kFerfBLprf8A2w/9qV5TXq3wS6a3/wBsP/albYP+PH5/kcOf/wDItqfL/wBKRsfGL/kS4P8Ar9T/ANAevEa9u+MX/Ilwf9fqf+gPXiNVjv4xz8N/7h82FW9I/wCQ3Y/9fEf/AKEKqVb0j/kN2P8A18R/+hCuOO6PoKvwS9D6hr5g1r/kPX//AF8yf+hGvp+vmDWv+Q9f/wDXzJ/6Ea9bMdonxHCv8Sr6L9SlRRRXkH3Z7b8G/wDkTLj/AK/n/wDQErK+Nv8Aq9F+s/8A7JWr8G/+RMuP+v5//QErK+Nv+r0X6z/+yV7E/wDcvu/M+Aof8lA/WX/pLPJ6KKK8c+/Or+GX/JRtM/7a/wDop69v8R/8itqv/XlN/wCgGvEPhl/yUbTP+2v/AKKevb/Ef/Irar/15Tf+gGvYwX8CXq/yPgOIf+RlS9F/6Uz5looorxz78K+jPAn/ACImk/8AXuP5mvnOvozwJ/yImk/9e4/ma9HL/wCI/Q+S4p/3aH+L9GeWfF3/AJHj/t1j/ma4au5+Lv8AyPH/AG6x/wAzXDVy4j+NL1Pbyr/caX+FBXoPwa/5HC7/AOvB/wD0ZHXn1eg/Br/kcLv/AK8H/wDRkdPDfxokZx/uFX0PQ/iT/wAk81T/AHY//Ri18919DfEVHk+H+ppGrOxWPCqMk/vFrwD7Bef8+k//AH7NdWPjJ1FZdDxeGa1OGEkpyS957vyRBRU/2C8/59J/+/Zo+wXn/PpP/wB+zXn8kux9P9Zofzr70fTmmf8AIJtP+uCf+girNVtNGNKtAeD5Kf8AoIqzX1Edj8cn8bCiiimQFFFFABVFtZ05deTRTdx/2k9u10LYHLCIMFLn0GWAGevOM4OL1cOukWGl/GWwlsLVIpbzSr+e5kGS8zme25ZjycdAOgGAMAAU4q8rPz/BN/oD+Fv0/M3YvGGhza5/ZMd25ufOaAMbaUQtKoy0azFfLZwAcqGJGDxwa268ktfPi0PTr83ELaJN4j8yLSlH+lRzPdtw03RtsjM5iCKwwVMhCnd63SXw3/rZP9QekrL+tWFc94jvdL0G8h1eSze91qeI2VjbQnM1xk7zGgJwBlQzNwAFyxwK1tU1KDSNNlvrvf5MWN2xdx5IA4+prgtX1jwXrerRanfLrSXsMJt0mtLq6tSIy24r+6kUckAn1wPQVSp1J6xi36JsxniKNJ8tSST82Frol/4Xn8KyNaxardWVreK2mWk8SPGZWRy8AlZAyx/6vqvyuOOcVufDyeefSdUM9ultGur3SwQowYIm/JGRxkMXBxxnOCRycS41rwZdaba2Vwusuto7PBObm6+0Rk5zifzPN5BIxu6cdBWnYeOPDGl6fDZafb3UFtCu2ONLZsAf1Pck8k8mtPY1rt8j+59Xf+tzF4zDO37xfevNHaVBfC7On3H9mmFbzy28g3AJjD4+XcAQcZxnHNSxuJI1dejAEZridX+JH9lavc2J0eWbyHKeYsuA3v8AdqI051NIK5rWxFLDpSqOyF0bTb+68ZQav/wjR8NsIpP7Uk82E/2jIwAUYiZt4UgkPJtYcAD5mxsWmmXcXxE1PU3ixZz6bawRybh8zpJMWGM54DrzjHNc1/wtgf8AQBn/AO/3/wBjR/wtgf8AQBn/AO/3/wBjW31autoP7jl/tTCWa59/Xy8vI9ErmvHPiC68N6JDd2KxtI9wIiJBkYKsf6CpPCnir/hJ0um+wvafZyo+d927OfYelV/iBGkmgwCRFcfaVOGUH+FqxfLRl++i7LdbM7IRljqfLhpWctmcP/wtbW/+eNr/AN8H/Gorf4mapZwiG0s7GCIEsEii2rkkknA9SST7moPslt/z7Q/9+x/hR9ktv+faH/v2P8K0+vZb/wA+pfe/8yf9Wc4/6CV+P+RqeHPiBqEmrafpkVnZW9rNcLGUhi2BQzc4A4HUn616zXkOhW1uviHTysEQIuYyCIwCPmFevVnOth6utCLivN3/AFZpDL8VgFyYmopt7WPn9tch3H/iUWPX/nmKT+3Yf+gRY/8AfsVqm0ttx/0aHr/zzH+FJ9ktv+faH/v2P8KX1jKP+gf+vvMv9V81/wCf8P8AwH/7Uy/7dh/6BFj/AN+xXrXw+uBdeEYZVhjgBkf5IxhRzXnP2S2/59of+/Y/wr03wQiR+GIljVUXzH4UYHWh1cBPTD0uWXfy+8uGS47Av2uIqRlHayVtfuRi/ED/AI/rP/rm3865Gul+JOoQWeo2Sz5BaJiMFR39yK4r+27P1b/vuP8A+LrzatGcptq33r/M+1wE0sNBWf3Pv6GhW54O/wCRotvo/wD6Aa5P+27P1b/vuP8A+LroPA+qW1z4utIoidzB8ZZD/AfRiamFGakm7fev8zXFTToT0ez6Pt6Ho/iJ2j8L6q6EKy2cxBOMA7D68V4J/bGof8/UH5xV7v4q/wCRO1n/AK8J/wD0W1fNFdNbGfVmlyKV+6OTIsvWLpzk5uNn0Og/tjUP+fqD84qP7Y1D/n6g/OKuforD+1l/z5h9x9D/AGFH/n7I+lfCcjS+EdMkkYM7W6kkYwTj24rx/wCLP/I+S/8AXCP+VeteCf8AkR9I/wCvVP5V5L8Wf+R8l/64R/yoxsuagpd7HgZDHkzSceyl+aOKooorxD9CPTfgr/yFNU/64p/6Ea6v4r/8iFP/ANdo/wD0KuU+Cv8AyFNU/wCuKf8AoRrq/iv/AMiFP/12j/8AQq9il/ub9GfAY3/kfR9Y/kjweiiivHPvx0X+uT/eFfVVfKsX+uT/AHhX1VXrZd9r5fqfD8V70f8At79D5p8Wf8jlrP8A1/Tf+hmsmtbxZ/yOWs/9f03/AKGaya8ufxs+ww38CHovyCvY/gv/AMgDUf8Ar6H/AKCK8cr2T4L/APIA1H/r6H/oIrqwX8ZHj8Rf8i+XqvzGfGn/AJAum/8AXw3/AKDXj1ew/Gn/AJAum/8AXw3/AKDXj1GN/jsfD3/Ivj6v8wrofAX/ACPmk/8AXf8Aoa56uh8A/wDI+aT/ANd/6Guel/Ej6o9TG/7rU/wv8j6D1D/kGXX/AFxf+Rr5br6k1D/kGXX/AFxf+Rr5br0Mx3j8z5XhT4avy/UKKKK8s+1PoP4af8k70v6Sf+jXrz74zf8AI22f/Xiv/ox69B+Gn/JO9L+kn/o164v4s6XNfeKLSSJ41C2arhyf77+gr26lOVTCxjFXdkfm+FxdDCZvUq4iajG8tX6s8worV/4R66/56wfm3+FH/CPXX/PWD82/wrzfqmI/kZ9V/rHlH/QRH7zovhJ/yPS/9e0n9K9W8c/8iLq//Xs1ecfC/SZrPxmssjxsv2dxhSc9vavTfF0Kz+EdSickK8BBx1r1MNSnGg4SVm7nx+a5jha2PjiaU1KEbXa12d2fNlFdF/YFn/fn/wC+h/hR/YFn/fn/AO+h/hXF/ZuI7fie1/rvkv8AO/8AwFnO19M+Gv8AkU9I/wCvGH/0AV4R/YFn/fn/AO+h/hXvegoIvDmmxrnC2kSjPsgrswuFq0JNzW54ubZ/gc1hGGFk24u7umvzPDvif/yUXUvpF/6KSuTr0D4haN9r8dX832jZuEfy7M4xGo9a5r/hHR/z9f8AkP8A+vXHVwdeVSUlHRs9/CcTZRQw9OlUrpSikmrPRpWfQxK9W+CXTW/+2H/tSuE/4R0f8/X/AJD/APr16T8I9O/s/wDtf975nmeT/DjGN/v71phsLWp1VKUbI5s04gyvGYOdDD1lKbtZWfRp9uxa+MX/ACJcH/X6n/oD14jXvHxTs/t3hOGLfsxdo2cZ/hevIf8AhHf+nr/yH/8AXq8VhK1WpzQjdfI5cp4iyvLsN7DFVeWV27csnv6Joxat6R/yG7H/AK+I/wD0IVf/AOEd/wCnr/yH/wDXq3pfh/Zq9m/2nO2dDjy/9oe9c6y/Ep35fxX+Z6c+MMjlFxVfV/3Z/wDyJ9D18wa1/wAh6/8A+vmT/wBCNfT9eB6po1m+r3jMjZadyfmP9416GKw1SukodD5jK87wmUSlLFX961rK+xx9FdN/Yll/cb/vo0f2JZf3G/76NcX9mYjy+89z/XvJ+8v/AAH/AIJ6P8G/+RMuP+v5/wD0BKyvjb/q9F+s/wD7JXR/DG1itPC88cIIU3bHk552JVX4mKrJpu5QeZeo/wB2vQ+rSlR9i3Znzk88o0cY80hFyhe6Wz10/U8Oors/LT+4v5UeWn9xfyrm/smf8x2/8REw/wDz4l96/wAiv8Mv+SjaZ/21/wDRT17j4gUv4Z1RFGWazlAHvsNeaeCUQeMbEhVB/edB/wBM2r0/WP8AkB3/AP17Sf8AoJrro4Z0IOm3e55mLz2Oa1Fi6cOXlVrN321/U+bP7Gv/APnh/wCPr/jR/Y1//wA8P/H1/wAa6iio/sql/MzH/iIeO/58w/H/ADOX/sa//wCeH/j6/wCNfQPgiN4fBGlRyDaywAEZ9zXk1ew+Fv8AkVrD/rkK0p4KGHfNFtky4oxOc/ua0IxUddL+nVnnPxK0q3vPFvmzNIG+zoPlYAd/auR/sCz/AL8//fQ/wru/iB/yM/8A2wT+tcvXR9UoT96UdTwq3EebYeo6NKs1GOiWm33GZ/YFn/fn/wC+h/hXafC7TILLxNcyQtIWNmy/OQRjent7Vz1db8Of+Rin/wCvVv8A0NKPqlCHvRjqFDiLNcTUVGtWbjLdaf5HXeMv+RRvvon/AKGteSV634y/5FG++if+hrXklb0vhPPzn+PH0/VhRRRWp4h7jZf8eFv/ANcl/lU1Q2X/AB4W/wD1yX+VTVwn6HH4UFFFFBQUUUUAZmpeI9I0i5W31K+jt5WQOEbOSuSM/oazm8W+E2vEu2v7M3MaNGkxT51RiCyhsZAJVSR3wPSua+IcjJ4ihCnA+zL2/wBpq5XzpP736VqoNq9vx/4B5NbMqVKo4Sk9P7qf486/I9DTVvAEWtvrMY0lNUcYe+W1UTtxjmTbuPAA69K3tN8RaTrFw0Gm30dxIq72VM8DOM9PcV4950n979K634dyM+uXO45/0Y/+hLQ4NLb8f+AFHMqVWooRbu/7qX487/JnT+OfN/4Qy+8iTypP3eH2hsfvF7GvH8an/wBBIf8AgMlexeNf+RPvf+2f/oxa8lqFQp1NZfmysZnWOwFRUsPJJNX1jF67btN9CvjU/wDoJD/wGSjGp/8AQSH/AIDJViin9To9n97/AMzk/wBac2/5+L/wCH/yJ7la5+xw5OT5a5P4V434s1K8h8WajHHYGRFmID+ZjNeyW3/HpD/uL/KvI/FP/I03/wD11NZyo+10vb+vM9yWbSyxe1UFLm01bXn0sYH9r3//AEDD/wB/f/rUf2vf/wDQMP8A39/+tVmio+o/3vwX+RH+ulT/AKB4/wDgUv8AM7r4X3c91BqRuLbyNrR4+bOeGp3xcu57PwnayWz7GN6qk4B42P60/wCGv+p1H/ej/k1J8WbOS98K2scTKpF6rfMT/cf/ABqK1OUKThDV/wBdj08tzGlicTTxmIShFvW70VtN2eN/25qP/Pyf++V/wo/tzUf+fk/98r/hUv8Awj91/wA9If8Avo/4Uf8ACP3X/PSH/vo/4V5HssX2l+J99/a2Rf8AP2n98TR8K6xfzeL9JjkuCyNeRBhtHI3j2r6Hr588L6Jcw+LtJkaSIhLyJiATnhh7V9B16OEjVjF+1v8AM+UzzFYLEVYPByjJJa8tv0PBG8RabuP7yXr/AM8//r0n/CR6b/z0l/79/wD165Bvvn60leT7d9l+P+Z93/Z1P+Z/h/kdh/wkem/89Jf+/f8A9evV/AN1Fe+E4ZrcsUMjgFhjvXzxXvPwp/5EG3/67Sf+hV2YOq51LW6Hz/EGEhRwilFv4l27PyOS+NX/ACGNM/64P/6FXmdepfGO0nudW00wRlwsDA4/3q84/su9/wCfdvzFYYqnN1pNJnoZPjMNTwFOM6kU1fRtd2VK674Xf8lDsP8Adl/9FtXOf2Xe/wDPu35iur+GdhcwePrGSWFlULLknH/PNqzo05qrFuL3R0ZhjsLPCVYxqxbcX1Xb1PYfFX/Inaz/ANeE/wD6LavmivpfxV/yJ2s/9eE//otq+aK6sw+OJ5XCv8Gp6r8gooorzD7A+j/BP/Ij6R/16p/KvJfiz/yPkv8A1wj/AJV614J/5EfSP+vVP5V5X8VbW4m8cytFBI6+RHyqEjpXs4pN4eNvL8j89yecYZrUcnZe9+ZwlFT/AGC8/wCfSf8A79mj7Bef8+k//fs15HJLsfdfWaH86+9Ho3wV/wCQpqn/AFxT/wBCNdX8V/8AkQp/+u0f/oVcx8GreaDVNUM0MkYMKY3qRn5jXY/Ea1S78HSxSlgplQ/Keete1QhKWF5Fu7n59mmLo0M3+sTl7kXFtrXRJdj59orov7AtP783/fQ/wo/sC0/vzf8AfQ/wri/s7E9vxR7H+uuSf8/X/wCAy/yOfi/1yf7wr6qr53j0C0Ei/PN1H8Q/wr6IruwmHqUL+0W54GcZ1gs15PqkublvfRre1t/Q8H8R6JazeKNUkZptz3krHDDGS59qzf7As/78/wD30P8ACuj17/kY9R/6+pP/AEI1n16H1PDvVxPg5cT5xCThGu7LTp/kZn9gWf8Afn/76H+FeofCyyistGvVhLkNcAneQf4R7VwVei/Df/kE3n/Xcf8AoIo+q0afvQjZnRhc+zLG1VRxFVyi+mnT5FX4qWUV9pVgsxcBZmI2ED+H6V5j/YFn/fn/AO+h/hXq/wASP+QbZf8AXY/yrzuksLRqe9ON2LFZ9meCquhh6zjFdNOvyMz+wLP+/P8A99D/AArb8HaNbW/jDTZY2lLLNkbmGOh9qr1r+Ff+RqsP+uv9DT+p4eOqiZU+Js3qzVOddtN2e2z+R61d/wDHlP8A9c2/lXh1e43f/HlP/wBc2/lXh1a0upz53vD5/oFFFFbnzx634M/5FCx+j/8AobVyXxG/5D9v/wBeo/8AQmrrfBn/ACKFj9H/APQ2rkviN/yH7f8A69h/6E1c8fjPqMZ/yLoekTkaKKK6D5c6fwB/yNA/64v/AEru/E//ACK+of8AXE1wngD/AJGgf9cX/pXd+J/+RX1D/ria55/Gj6jL/wDcZ/P8jx2iiiug+XCvatF/5AOn/wDXtH/6CK8Vr2rRf+QDp/8A17R/+gisauyPfyX+JP0PNPG3/I33n0j/APQFrArf8bf8jfefSP8A9AWsCtI/CjycX/vE/V/mFd58NOmp/wDbL/2euDrvPhp/zE/+2X/s9TU+FnTln+9w+f5M0PiJ/wAi3F/18r/6C1eZ16Z8RP8AkW4v+vlf/QWrzOlT+E0zb/efkgqxp/8AyE7X/rsn8xVerOn/APITtf8Arsn8xWh5kPiR7dXiOo/8hS7/AOuz/wDoRr26vEdR/wCQpd/9dn/9CNYUt2fRZ38MPmVqKKK6D5o9M+HX/IuTf9fTf+grVD4l/c036y/+y1f+HX/IuTf9fTf+grVD4l/c036y/wDstc6/iH1FT/kV/JfmjgqKKK6D5c3vBX/I4WX/AG0/9FtXpusf8gO//wCvaT/0E15l4K/5HCy/7af+i2r03WP+QHf/APXtJ/6Ca56nxI+oyr/dJ+r/ACR4pRRRXQfLhXsPhb/kVrD/AK5CvHq9h8Lf8itYf9chWNXY9zJf40vT9ThviB/yM/8A2wT+tcvXUfED/kZ/+2Cf1rl6uHwo8/G/7zP1Cut+HP8AyMM//Xq3/oaVyVdb8Of+Rin/AOvVv/Q0on8LHgP96h6nXeMv+RRvvon/AKGteSV634y/5FG++if+hrXklTS+E7s5/jx9P1YUUUVqeIe42X/Hhb/9cl/lU1Q2X/Hhb/8AXJf5VNXCfocfhQUUUUFBTJZVhTe+cZA4BJyfYU+myRiVQGzwwbj2OaAOB8aaVf6rrUc9hZzyxrAqFvLI53Mcc/UVz3/CL63/ANA2f/vmvYaK0VRpWPKrZXRq1HUk3d+n+R49/wAIvrf/AEDZ/wDvmuj8FaXfaTq082oWc8MbQFQfLJydwPb6V31FDqNqwUcro0aiqRbuvT/IwfExbU/DN1bWMU0sshUKoiYZw4zyR7GvPP8AhF9b/wCgbP8A9816/HGIk2rnG4tz7nP9adSjNxVka4rL6WJmpzb2tp/wx49/wi+t/wDQNn/75o/4RfW/+gbP/wB817DRVe1kcv8AY2H/AJn+H+RThvI44YY3WYPsAx5L9hz2rzvX9B1W91+8uLawneKSTKtsxkfjXpzRhpEc5ymcfjTqiMnF3R34nCQxMFCbenY8e/4RfW/+gbP/AN80f8Ivrf8A0DZ/++a9hoq/ayOD+xsP/M/w/wAjjfA9ldaRFejUbWeEyFCn7snOM56fWrHjOGbWNEgi02CadxOsmBEw+Xa3PI9xXVHmmxRiKJI1zhFCjPtUcz5uY71hILD/AFe7t+J5B/wi+t/9A2f/AL5o/wCEX1v/AKBs/wD3zXsNFX7WRwf2Nh/5n+H+R5Vo/h7VrXW7KefT50iinR3bZnABGa9N+3QliuJtwAJHkv8A4e1WKaIwJmk53MoU/hn/ABqJSctzvwuEhhYuMG9e55EfDWuFj/xLrjr6Un/CM65/0Drj8q9goqvaPscn9lU/55ff/wAA8f8A+EZ1z/oHXH5V3vhUSaV4djg1CGaGVXYkGJjjJ45Aro6ZLGJYyjZAPpSlK6N8PgYUJ88ZN+rOJ8b6de6teWr6faTzLHGQx8sjBz71y/8Awi+t/wDQNn/75r2GimqjSsZVsro1qjqSbu/T/I8e/wCEX1v/AKBs/wD3zWx4V0XUtO8R29zeWM8cKB9zbCcZUgdK9Jopuo2rEU8poU5qabuten+RmapcLdaPfQW6TPK8EkaqIW+8VOB09xXmX/CM65/0Drj8q9eSMIzkZy7bjn6Af0p1RGVjqxODjiGnKTVux4//AMIzrn/QOuPyo/4RnXP+gdcflXsFFV7R9jm/sqn/ADy+/wD4BkaLL9i0Kyt7qOaOVI1RlMLH5vTpXI+LtH1HU9fa4sbKeWIxqA2wjkfWvQ3jEm3dn5W3DFOqVJp3OuvhYV6SpSbsjx7/AIRfW/8AoGz/APfNH/CL63/0DZ/++a9hoq/ayOD+xsP/ADP8P8jhvBGnXukXV2+oWk8KyIoU+WTk59q1vFiyar4deDT4ZppGdSAImGQDz1FdHTYoxFGEXJA9ahybdzvhhIQoOgm7a+up5B/wi+t/9A2f/vmj/hF9b/6Bs/8A3zXsNFX7WRwf2Nh/5n+H+R4+nhjWg6k6bP1/u16x9uhDBcTbiMgeS/T8verFNMYMyyc7lUqPxx/hUyk5bnbhcHTwt+RvXueWav4e1e51q9ng0+do5bh3RtuMgsSDVP8A4RfW/wDoGz/9817DRVe1ZySyehKTk29fT/I8e/4RfW/+gbP/AN812fgq2uNH025TUbeaFml3AGJjxjrwK66kdQ6Mp6MMHFKVRyVjXD5bSw9RVIt3+X+RyPja1uNYsLVNOtppmSQs2ImGBj3Fcb/wi+t/9A2f/vmvYFXYgUdAMUtEajirBiMtpYio6km7/L/I8e/4RfW/+gbP/wB81o+H9B1Wy8QWdzc2E6RRyZZtmcDHtXqFFN1G0ZQyihCSkm9PT/IpXF3HLbzRosxfYRjyX7jjtXlf/CL63/0DZ/8AvmvXljCyO4zl8Z/Cn1MZuOx1YrBU8U05t6djx7/hF9b/AOgbP/3zR/wi+t/9A2f/AL5r2Giq9rI4/wCxsP8AzP8AD/IwfDRbTfDVpbX0U0UqbgymJjglzjkD3Fc/410u/wBW1iGbT7OeaNYAhbyyMHcx7/UV3kkYlUK2cBg3HsQf6U6oUmnc76mEhUoKg27K34Hj3/CL63/0DZ/++aP+EX1v/oGz/wDfNew0VftZHB/Y2H/mf4f5Hnfg/SNR0zXhcX1lPFF5TLu2E8nHpXWa5L9u0G9t7SOaSV4yiqIWGT6citimRxiPdtz8zFjmocm3c76OEhRoulFuzv8AieQ/8Ivrf/QNn/75o/4RfW/+gbP/AN817DRV+1kcH9jYf+Z/h/kePf8ACL63/wBA2f8A75r0/TbhbbSbKCdJklWFEKmFvvBeR09jWlTXjDsjHOUbcPyI/rUym5bnZhcDTwrbg3r3PN/FOianqPiS5urOxnkhfZtbYRnCAHr7isj/AIRfW/8AoGz/APfNew0VSqNKxzVMpoVJubb1d+n+R49/wi+t/wDQNn/75rrfA1jd6R9u/tG1nh83y9n7snON2en1FdpRSlUbVi6GWUaFRVIt3Xp/kcv4xil1jQYotOgmnfzlfAiYfLtPOSPcVw3/AAi+t/8AQNn/AO+a9fijEMKRrnaihRn2p1EZuKsisTl1LEVPaTbv/XkePf8ACL63/wBA2f8A75qaz8N6zFfQSPp04VJFZjt6AGvW6KftZGCyegne7/D/ACK/26HftxNuxnHkv0/KvLb3w3rEuoXEkenTlHlZlO3qCa9Y8sed5nOdu2nVEZOOx24rBwxSSm3p2PHv+EX1v/oGz/8AfNH/AAi+t/8AQNn/AO+a9hoq/ayOH+xsP/M/w/yOW8GxTaPoU0WpQTQP57SYMTH5dq85A9jVXxzZXerrYjTrWebyi+/92RjO3HX6GuxljE0Lxtna6lTj3p1RzPm5jvlhISw/1e7t+J49/wAIvrf/AEDZ/wDvmj/hF9b/AOgbP/3zXsNFX7WRwf2Nh/5n+H+R5p4X0TU9P8SWt1eWM8cMe/c2wnGUYDp7mu61G4W50u9ggSZ5GhdAohb7xXgdPcVo01Iwjuwzl2yfyA/pUSk5O534fCQw9N04t2Z5B/wi+t/9A2f/AL5o/wCEX1v/AKBs/wD3zXsNFX7WRwf2Nh/5n+H+R49/wi+t/wDQNn/75r0jQpPsGgWVvdxzRyogRlMLHB9OBWzTJIxJt3Z+Vgwx7VMpuS1OvC4CnhZOUG9e55/4w0jUNU177RY2U8sXlKu7YRyM+tYP/CL63/0DZ/8AvmvYaKaqNKxhVyqjVm5ybu/T/I8e/wCEX1v/AKBs/wD3zXReCtLv9J1mafULOeGNrcoG8snncpxx9DXf0UOo2rDo5XRo1FUi3den+RheJGbUvDd3bWUU0sr4CqImGSHGeSPY153/AMIvrf8A0DZ/++a9fjjESlVzgsW59zn+tOpRm4qyNcVl9LEzU5t9tP8Ahjx7/hF9b/6Bs/8A3zR/wi+t/wDQNn/75r2Giq9rI5f7Gw/8z/D/ACKllOogggYSLIIwMNGy9AM8kVbprRhpEc5ymcfjTqyPZSsrBRRRQMKRs7TtALY4BOBmlpHLCNvLAL4+UMcAn60nsBw63HiHRNe8PRarrp1G81aZ0vNNSGLyLdBEztJCVRZAqMEXMjNkPzyRitb65ra6bZeLJtWdrG81FLc6UYIhElvJN5KMrBfM8wZVySxB+YbRxi14W0bxTp+syah4g0zRrm+vTtu9Ri1WV3SMElY4ojbgKgz93fyeSSeaIPCetrFa6DO2nnw/aX4vI7hZXNy6LL50cJjKbVw+0F95yq/dGeKXxK/9ar9PmN9f67/191y5PrHiBfiTYadLBb2uizRziP5981yyIp3njEagtgDJJwSccA5I1zXG0x/Fn9qOlkmpm3/skwxeSbcXHkFt+3zPMON4O7HRdveuq1DSZ7vxVo+pRvGIbFLhZFYncfMVQMcY/hOeRXPjwnrSwvoKPY/2A+om9Ny0rm5CGbzzB5Wzbjfld+/hf4cjNSt/6/r+tOwnsbmt2Wr3l4ht9cbRdMhhZ5ZrZImneTPczRuixhck8ZJxyAOeZ07xFrXiWDw3p0Wotp02oWtze3F/awJvlhhdURo1kVlXzPMR8kNgcDrkaPjTRfEOu39nbWdrpt7oSKXu7K61CS2N1Jn5VcrDJuiHUrxuOAflBDTXula/NeaTr1paaZFq9lFNbTWLXsht5IZCpwswh3Agxxt/q8feHowcbddv+H/W3yG9/wCv6/4JBa634ifwpeRWMVtqOs2N5LYvdTt5UWEBIndQOTt25RByxwNq8h2na34gvfhZouqafBBe6vfafBLJLcMI4o2aLc0rBRkgH+FRySB8oyw1NA0W607QbmK/khfUL6WW5uWhz5aySH7qnAJVRhQSMkLkgZxS+G9GuNH8B6Xoly8T3Nnp0VrI8ZJQusYUkEgHGR6UtfZu++n32d/xCL95drv7r6fgVvDuo6vq/wAMNL1KB7ebWbzSYp1e5BWJp2iBy4QcLuPIUdOlYtxrWpeEdblt77W7jX4Y9GuNRu1uIYUa1MW3YVMUa4V8yDDBj8nB4bO7o+latoPw3sNIsTZyavY6ZHbRtK7eQZkjCgkgbtmR6Zx6Vj+HvDGrxadqGm6/pmm7dWicajqUWqSXNxcuy7clWt0ULgkBQQFHAFXW1nPk87fjb+vT5FNpKPP8/wCv6/zfpt5rmk6r4fOta02oprweOW3e3jRbWbymmHlFFB2YR1w5c/dO7rmxpes+Irnx5qNhqdva2lotj51lbLJvc/vWQPI4HBbGdq5AHcno3StB8QTalo7eIzp32fQ0b7PJaSu8l3KUMQkdWRRF8hb5QXyW+9hedZ9Ju18YT6zCYWjbTRaxxuxBMgkZueDheRzyfapnbmVttfydiI35XffT81cw4rnXtE8SaBaanrrapdas0gu7AQxLFbKsZdpISqLIEVwiZkZs7xnkip/FZ1uxtdV1lvEX9kWNhB5lpDBDFIs5C5Pn+YhY5f5QsbKcd8kYr+E9G8Uabq0l7r+m6PcXt8cXupxarK8gUZKxxRG3ULGpOAm8dSSWYklde0bxNqPi6O9Om6RqWl2JSTT7W51SW3CzAczSItu4dgfu84XGcbuQpK6S2/r+vmWtHf8Ar+v0F+2694k1h7C01Gbw+1nplvczeTDFIz3E2/5G8xW+RPL5AwTu+8MVS1vxf4jf4b2WtaJa2sMstust5dSPlYCGVWWNCCXYktjOAAMnJwDr32leIrbXJdZ0GLTXub+yjt7u3u7qRI4ZIyxWRGWMl8eYwIIXIC8jpTr7wlKfhr/wjNhcI8y26RCeYbFdgwLMQoOMkE8etN9Wv63/AK+7zM2ny28v0/P+uwnjG6utPhkv7rxPF4b0i2g3eeqxGSWck4VvNRl2YAwq/OxJ5GObkc2vax4LsJrbytL1W8hga4Mi5+zbsGTapBBcAttDZGcZyMil1dPE0Op/aNCGn31pJB5b2V/M1uInBJ8xZEjctkHBUgDgEEc5oNoGvaL8OYNE8L3VodTijWMXE7GGNAWy5jAWTbgEhAQwHy5zjBWyZp9pf12/r/gGLeeJdX0STXNKt9VbVpbeSxtrfULuGPdBcXUvllHESojbAUk24BwwBPINbmmXWq6R4ivdFvtQuNdzYi+tZJ0hjnJDFHiOxUTGdpUkA/M2TgCs+38JanL4Pm0M6bpmjmGWO7s57fUJb0yXKSiXfMXhjY5dQWbJY5PQ1saLpmryeILnW/EUdlb3DW62lvbWU7TpHGCWZjI0aEszEcbcAKOSSaf/AAb+ltPx/AXTT+tVf8PxKPhLX9Wm/wCEmk8YSWdr/Zt5jZA+YrWH7PHJgyEAtjcSWIHOcADApfCHiHVNc8Sa0L+P7PZLBaz2Fs8e2SOOTzOZO+5toO0/dyB1BzYTwfFeP4mg1sCax1q8jnWOCeSNwqwxJgsu0g7oyeD0x7io/D/gqPQfGGp6tDc3kkN1bwwxLcanc3LAru3bhK7A9VweSPmxjJy9PwX5a/16hLyKGuXHiPQ2g1S61zfPc6rHbW+iwwxtbywvKEABMYmMgizISH2gqeNoqHVNZ1w2fiHxJZ6s9vaaFPIkWmiCJorlIVBl8xipk3Md4BVlAwpw3OZrXR/Fi+MJ9a1PS9Fv5BI0VnK2rTJ9jtieiRfZiA5ABZt2WPGQoAD9S8K65Mus6PYNp/8AYmuTGWeeWVxPbLIAJkSMIVfdgkMXXBc5DY5Uen9a6W/C+5Tavr319Ndvwt1/Is+Idb1618RaFFp8FvBo9zdxRz3Mj7pZy6ufLRMfKAFBLE55AA6msXV/FG/xzrFldeKNZ0Wx00W8WbHTUlgR3XezzTvbyLGMMn3mUAAk+tdfrujzak2j/ZWjRbG/juXDkjKKrDAwDz8w9KzNe0rxRqK6rpdvNp0+larGYhPcuUlsUZAjqsaxlZu7As68sQcgCkrq/q/yX/B8v1lLVX7L82a2tWer3/2SDSdT/s23LFrq6iRHn2gfKIw6MgyepYHgYAycjkbXxHrF/aWmk2mpmSS61mfT4taSGPe8EUbSNIF2+WXypjyF25BO3jFbHi3RdevNFsNI8N/ZTYjEd+s99JayywquBGkiROV3fxEAHAIBBORHLoWszaVpUtvp2k6Xf6Hch7Kyt7x3tpIvLMZjZ/JQplXbGEYAqp56VWl32/4bX+vP5rWy7/8AD6f15EumaprdvBrem4/tzUdLuEjt5JWSAzpIqsplKqFXbubJVeQuQpJxXOR+NdZg+H+mzarf28Oq6jrNxpsl5Fb7lhCTTAmKPBLNti2opDEsVyGOQey8OaVfWcmo6hrJtxf6lOJZIrZi8cKqgREVyqluFyWIHLHgCse18HahZ+HbVIpLR9T0/V7rUrUO7eS/mzTNsYgZXMcxXcAdrc4YDBFtr5f8H/g2+RStb7/yf6lvwfqdzfW+pxjV21ZbeULC19bG1u4yUBKTxeVHt55UhBlSODjJox3OvaJ4j0C11PXW1S61ZpBeWAhiWK2VYy7SQlUWQIrhEzIzZ3jPJFaeh6PqsGq6vrurR2MWpX8UUMdtazPJFGkQfYGkZFLEtIxJ2DAwMHGTmeE9G8Uabqst7r+m6PcXt8cX2pxarK8gQZKxxRG3ULGpOAm8dSSWYkldfkLoU7LXta/svSfFtxrDyWOq30UJ0swRiKKGeTy4ijBfM3gsjEsxByw2jjGouteID8UbbTLuG3tNGlsrl4Y1YPNO0bxDzHOMIPnO1QSepbnAWrZ+Etajh0/Qbk6d/YGm3i3MM6SObiVI38yKIxFAqbW25cOchPujd8u/d6PcT+NtM1hHjFvaWVzbyKSd5aRoipAxjH7s559KcbaX8/utp873/qw/tP8Arq/+B/Vznru312Pxxpulab4t1afP+m36TwWZiitg2Any24bc7fKPm4Cuc5Azu65Z6vdXZeLXm0PSoLcyPPbLE0zSZOd/nRuixhQDxySTyAOZdL0ee18Ta3qt20Tfbmhjt9hJZYY4+FbI4O9pDgZGD9ax/GWi+INd1K1gt7LTL/QY18yeyu9QktjcyhsqJNsMm6MYzsyAx+9kDBnol/X9fqHVv+v6/Qz9K1vXfFqaNZpqUujvLprX91dWlvH5kuX2RbVmVwqsAXIwT90ZHe0fEniKf4eSXml29pcatbyXNtcXEreXDGYGkRptnJOTHkIO7AEgAmrl3p3iManZa9p9ppY1IWr2l3Yy30ghKFgyMkwhySpB4MYyHPIxzb07w7NYeCbjSWmjlvLmO4eaUKVRppizuQOSF3OcdTjFTO/s5W31/N2/C2wRtzK/l91tfxMPVvEN7F4d8LzXutnRLTUIVfUNY8uIeU3khlXdIpjj3sfvMuONowWFaWhX+vav4DeW3lhOpb5YbW9uoiiXCLIVS4KKB95AHAGAcjGARUMnhvVrJfDt9posry+0ewNm9rdzvFC+5UDSJIEYqwMeAdhyrMOM1JY6Hr+i+DdTi0h9NXXL6ea7iRi62lvJK2SAQpZgvJztG5skhd2BrO3NK22v56fh8vmZ0+blinvp+X+fz+Rl3viLUPCN3rkM+rTeIItN0Z9RkN1HEklvICdkbGFEXa4BIBXcNhOSDgaGmy63oviLSrPWdak1ZNWt5NyywRRfZ541Dny/LUfuyCww5YjavzHJqtpHhLUH8Nan4e1nTLC1ttTt5Vur+DVJLu5uJnXaZH328YJxznOBgKFAwBf0rSPENzrdhe+J/wCzkXS7d44BYyvIbiVwFaVg6L5fyrwgL/fOWOBldLdf+H/4b7n3Ke2n9bf8Fmbp/ifxKNa8Vf2vZQxjT9LgvbHTYWEjru8/5XcfedvKXIB2jgAnliuj63e2Go+Ghf8AiUayviWNykZhiRY2WIy74PLUHy8AqQ5c8p82c7t2DQ7uLxlrOrCeOOK+sLa2hKcyRvG0xLEEYx+9XHXocj1wvDvgi6tdftdR1bTdBspLINI02lRbZNRuGVk8+UeWmwhWk+TL8yn5uOWrX+S/X/gf1ezlrt/W3/B/El8YS+INJ07Wdf8A7f8AsENigbTrCCGKSO6IUYSbfGXLPISgWNl424O4mkurzX9d1XV10rV30caNDEFgW3jkWe4aMSkSl1LbAGQYQoeW+bphNV0bxTeeM/7Tk03RtTsbJlbS4LjVZYBA23DSugt3DSZJAOcKOgBJJs6hoviO31TUrnw8NMA1mGMXJu5nBtJlTZ5iBUPnDbj5SY/uDnnjN35dN/6/rtsVdX1/rb8vvepBJf6prnh6DxKPEP8Awj2jtpcV6hgSJiWZC7mYzRsAijaAF2k/Nk9MVtN1XxH4wkhgjv5vDstvpFteTiC3jZnuJwx2MsqsVRQnIGGO77wxRqXhPXRc6Tp9jY6XqPh3SLaFLayu9RktvMmj4EkqrA4cLhdq5AByxBIXbpXOl+JrfWJNa0eDSzeahZR295bXN5IIoJIyxSSNxETJ/rGBBVM4XkVcuXXl76fj+f3LT5Zq9lfey/T+vPW3nPZ32s+J/BelXem3EOnXN4EN5Og3GFcHzDEGUgtuGBvBAByc4wcJ/EmsWFprOnW2otqc1vqVrp1pqc8MYZZJyocOEVUdot2eAOynkEnWv9B13TvAdloXhO4tzcxKkM9zcTm3Yx/8tGRljfa7HodpxknqBVeLwvqM3g0aMmm6XobWM0NxpwtL6S6QyRyCQGQtFG3zMPmPzFtzEnPVfabe1/w0vb5fMrorf1vuKH8S22p6h4ctdaF7ctbwXVtqF9FGssMbSFJhtjjVGZQu5MqBk4bIFP0nU9Wstf17SEvLjxINPtIZ43nEMUonffm3Z40SP7qowyuQHycgiorrSPGM8eqatbf2TZ65cwRWdrEty7w28SsWd/NMOS53NgGPaNq5Dc50vB2l6hoti1hdaRp9hACZBJbanJdy3ErHLvIXhjJY9S2ST7URvbX+u33L8Qfl/W1/x/Ab4H1PWNTs9V/4SJrY3ltqctvstQfLjUKpCqSAWxn7xAJ9B0Gbq9z4h0Key1C81zzri91SO1i0aKGM27xPJt+U7BKXWLMjNv2gq3G2ug8PaRPpL6sbl42+26jJdR+WScIwUAHIHPyn1rndP0fxZF4um1nVdL0W+meRorec6tMv2O1Lfcji+zEBiACx3ZY8ZChQCL+G/ZX+5XX9eZOtper/ADdvw/Qqvrutvpl74tj1Z47Cz1OS3GleRH5L28c5gcs+wyeYSGcEMF+6u0jJN3xRceINEtbzXJNdERjuUjsNJhhjaG5BZVWNyyeaZXJP3HAHy8HB3Nk8Ja2IrnQYW0//AIR+71Frx7hpX+0pG8vnPCIthRsvkb94wrfdJGSk+j+LZPGc+s3Ol6Lqcdu5TSlm1aaEWkZGC3li2Yea3OW3HA+UYG4sLdW2/wCG/rtu9rXqW7/rv/Xcd4ouPEOiWl3rkmuiIpcpHYaRDDG0NyGZVWNyyeaZXJb7jgD5eDg7ui1qz1i/ltYNM1L+y7b5muriFUe44A2LGJEZME53EgnAAHXI5ubR/FsnjKbWbrS9E1JLdymlJNq80ItIyMFvLFswMrc5bJwPlGBuLaXjbTPEGs2dtY6Klm9jKzf2jHNfyWkk0eOI1kSJyFJ+8Rg4GARkml9lf1/Xn/V39ow7DxBrOsQafpFrqzo9zqN1ANZigj8ya2tx/rFVlMe5mwhYKVOGIUZGNDT5vEWqx3mix6yIptL1I213qawxi4khMSyoUQoYhIfMVWJXbgMQoJGJZtF1t7PSLyy03R9P1DR5WSCwivHa1kt2TYY/MEKlOxGI2A2Ad+KN94a8VnRblbCTT1v9Yvzc6qEvZLcLFsVBDDMImYHaiKX2g/eI2kgqbXv/AE9Nfzv8xL+vx0/y+Xyk0zUdb1PTdTtYNdRbbTtTa2k12WOMSNbpGGdlGzyi6yExltoUbW4yMVoeD9au9a8PX81pepqy29zNBYalLtVL5VAw5MYC4D7kLKoB2ZA5plvYeJrPQLKDR7DRdIfT5lEenQ3by29zbhSpjaQwK0RydwKq3KjOQTVjRNJ1bT49b1K4jsE1XVJfOW0glc28bLGEQGQoGYnaCzbB2AB25NO1n6f5ah2/ruZiX2seHvEel2ep68+sSXttPPe2rQRItsI03eZFsRWWPf8AJiQuTuXnIOYNI1bXooPDeualqjXEGvuqTac8MSx2nmxtJH5TKoclcBTvZs5J46VN4T0LxHp887eIdN0me41EH+0tUi1WWWaX5TtVI2t1CxjOFTcAoJPzMSWdpPhjXYRommak9g2laA263nimd57zYhjiEiMgEeA2SQzZIGMCj/gfdd3/AAtYT/z+/p+O4k9x4h0TVNEk1LXPtd3ql75Eukxwxm3jjIZmaJhGJfkABLOxB54G5cPl8VX958RNLsNNKLopkube4lKgm5njjLEKeyoRgkdWyP4TmLQNG8VWviKbVdd0vRbq8uj5Ut9Hq8xa3t92RFDEbYBQOCRuBZhktwMKPhnp9l4h0K80iW/htNNkkd4ZNYvHAyvyhFaQqBu6jgEcHI4qVol/Xb+vX0CWu3l+f9fL1NTxBbavJcXF0fEZ0DSLS18zzrZIWkaT5i7SmaNlCKoXG3BOWyeBWJpus6/4tOkWX9oTeH7htGi1K+e1t4zIZJCVRAsyuFX5XYjBb7oyOc3PFmieIta1628qx0rUdCtlWUWN1qMlt51wGyGkCwSB0XAKrkDOSQcLize6b4iTV7bX9LtNLbUZLP7Je2U97IsWAxdGSYRFjtJYYKDIbqMcn9fg/wBbf1tb/r71+l/086ul3Ov+KdFsZxrK6TFCbiG/ubGJPNlnhlMXyiZHRYzsdjkE/dAOM55s+OL++Tw9azavqdol2l9K97o+mfapbuKGVY4pBH5MoVXDb9wUDpg4IrW1Lwd4hGhaZolmum6hpuZZ9XimvJLL7bNI5cr8kUmIizMSvBbgEkbg246+L4ks7iys9HTZE0M2lG9dYV5GyRJxb7sgDBQxgfN1G3luzf8AX9b/APB0IWi/r+v607FqGW8vfB0b+G9Wj1C5mjAh1C9VfmBbDOyxoo3KM/LtHIAOOa5u78Ran4VuPEFu2pTeIV03Sft2+7jiR4ZiSEiZokRcMBuAI3DBOSCMa1roWt6F4DnsNAnspNbmeWfzrjdHAs00rSOQArEAFztBB6DPeqOl+Er+Twrqnh3U9NsdPt9Qhk86+tdUku7iadxgyuXgjy3fOeMAAAAYGvef9f1/ww1okv6/p/5jvN8T6LqcOnf2zHrF1qdhO9udQhSJILqMKQB5KA+Ud5yDuYbR8xzWdrPiLVvA93dpPrMviHytFuL+eO7ihj+zSRlRH80SJtSQs4w+T8mQeGzqjSvF11cjUr1dGi1DT7GWDT4455JIpp325llJjDIvyD5F3feb5jxVLSvCGsSaHqeka5YafCdWhb7dq0OqSXNzNMVwGKNbxrgdlBCqBgDFHf8Arv8A8P32XoR0Sv8A1t/X3v1m8KazeXPiRLWXxJJqiyWjSzwXunm0w4ZcPaHyk82HlgSWkx+7O455f4vuNf0XT9V18699ljtCP7P02CGN47o4AWOXchkLu5KgRsvBXGTnN200nXtQ8TafqXiKPTLePS4pVgFlPJK1xJIApdtyL5YCg/IN/Lfe+XmhqOj+Krnxo2qy6bo2p2lmw/sqG41WWAW/y4aVkFs4MpyRu3HavC4yxZ3Ta/r+vmKN7a/1/XkRX2pa/qlx4ivNL1ZtNj8PlY4rMQxvHdSrCk7iZmQttIdUGwqRgnJJAFnWLvVrjRbjxIPEY0PSobBLq1SKKJw5KbiZzKhOMlQFQqcZ5yRtNR8OeIUu9aj0NtOW18QbWuZLiZxJZSGNYneNQhEuUVSAxT5gckg4FfVfDniKXX7P7Pp2k6joWlxRDT7O61OW3xMo/wBbIq27hyuAEGcLgtjONsvXT0+/Xm/SxXVP+ulv1uReI5/EB8P2GoWevarpur6ssEFrpcUNqYYrh0BO7zIGfauGdstnCnGOK6fULDXZdK0+xsNX8mUMq32pGNPPKBDlo0KGPezhc5XaAWwM4qOXStQv/E2ianeC2iisbWczQRytJi4kCAFSVG5QolG4hT83Tk4b4ys/EGoaPHaeGXto2llAu2mu3t3MODuWORY3KsTgbsZAzjBwRUvTr/X9dhRvpd9P6/ruc3H4j1hbHUNLttTN5MNbj0qz1eSGPcQyK0rEKojZ4yZF4UDKgEEg50IJvES6jqvhm31kXN3Cltcw6ldwxiWOCVnVxtRBG0i+WxU7QPmXcDg5cPDmqS+E7awg0zSdFuNKuIp9NhtbyS4hJjOdrsYkZQwLKSAx+bPJ4MV1ovi+S31fVLM6Xaa/qKQ2sSJcu0VtbxliSJTDlpD5jkEx7QSuQdpytr3/AK0X63Hv/XW+v4fK/Qp3Wva5pMfibT7HUZtabTIrZlv5reNpLd5WIlVliRUcxxgS7doOGGc5FavgzWJtQ1HUra31v/hI9KhSJ7fVsRHdI24PDuhVY327VOQMjfg1Rh8J6rJ4RfRf7K0nTFt54ruAJqMt4t3KkokYXBeFGO8jl/mOTnBxg7Gh6Rqv/CTXuva3DYWdxcW0dqttYzNMCqMzb3kZELHLkAbflA6nPD6/1/W/z7kvb+v68+3RGZeXHiHQ9R0ifUNdF1d6nqItzpEcMf2cREkkxHYJcogDFmYjhvlAIxUGua42mP4s/tR0sk1M2/8AZJhi8k24uPILb9vmeYcbwd2Oi7e9WND0fxbbeJZtX1zS9EvLy4kMRu11ebNrbbsiOGI22BgYJ+YF25JA2hXDwnrSwvoKPY/2A+om9Ny0rm5CGbzzB5Wzbjfld+/hf4cjNJbL+u39fel5uW7/AK7/ANfc+4viS48Q6JBNrUut7ZPtqQ2WjwwxvBco0gVUYmPzTKwJJKuAp7EKc5+peJtStNP8Q+Jp9e+y2+hXrwHSTDF5TxoVGJGKmTzJA25SrKBuT5TyGvNo/it/GcutXmlaLqIgdo9NMurzRizhPBIjFsw81hnc24nB2ggZzFr3ge+17XLr7bZaFcWt04X+1ZYQL62tiMPbIBH8wb51DmQYEh+U45Ibq/8AW39dv1Jdf67nSazZavqNzbrYaw2kaesbPPPbJG1wz8bVHmo6BMbiTjOQuMDOeW07xJrHiHT9B0+31JrSbUZbtm1S3gQvNbW77VljV1ZAZN0ZztIwxKjkEavjbRtf1xrOy0230+50bDG/tLm/ktWuem2MskMn7vqWXjdwCdu4M+80rXbhdI1a1stKttW0xpIxZC8c28kDgKUEwhDKflRh+7IyuMc5C6f1/X/AD1KdtqGs3ml39jceIIbH+xdQe31DWGjjSQwLEsquAymJXxIgYldvDEAZGKen+I9V1yw0nTtP1dx9uvbmNNaigiLz2sGf3iKVMe5jtXdt2n5mVcEY07XRPE2mWjX9hPpz6rd373moWbsyW8wZBGI1l2F12KqYfZ8xU5UBvlqx+Edbtrga9bHT/wC2m1GS8exMzra7HiWJohKE3Zwivv2csPujOQ/8l9+l/wBfLfuha9O7+7X+tdduxteFNQvLj+1dN1O5+2XOk3ptjdFFRp0MaSIzBQFDbZADgAEqSAM4roKxPDOkXemxX11qrQHUNTujdXC2xLRxnaqKisQCwCIo3EDJycDOK26b6ei++2o+ugUUUUgCiiigAooooAKKKKACiiigAooooAKK56b4g+DLeeSC48XaFFLGxR431KFWRgcEEFuCD2roFZXQOjBlYZBByCKAFooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACioba7trxZGtLiKdY5GicxOG2OpwynHQg8EdqIL21upJ47W5hme2k8udY5AxifAO1gOhwQcHsRQBNRUU9zBaqjXM8cKu6xoZHC7mY4VRnqSeAO9S0AFFRW91b3aO1rPHOqSNGxjcMFdThlOOhBBBHY1LQAUUVFFdW8800MM8cktuwWZEcFoyQGAYdiQQeexFAEtFZur+I9D8P+V/b2s6fpnnZ8r7bdJD5mMZxuIzjI6etXPttqLiGA3MPnXCM8MfmDdIq4yyjuBuXJHqPWgCaiopLmCGaGGaeOOWclYkZwGkIGSFHfABPHYVLQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVFFdW9xLNFBPHLJbuEmRHBMbEBsMB0OCDg9iKloAKKqz6pYWrzJc31tC0CLJKJJlUxoxIVmyeASCAT1INWqACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigDlPHWq3ul29m1hcNC0jsGKgHPA9aZ4E1a+1Vb46hcNP5Zj2bgBjO7PT6CuouLO2uwou7eKcL93zEDY/Oi3srW03fZLaGDdjd5UYXOOmcVfMuW1jg+r1frXtuf3e3yscH4Iu/FKeHVTT9G0eezF7d7Jp9WlikI+0yZJQWzAHrxuNa8ut30ep+LozcBYtNs4pbYFF/dMYnYnOOeVB5z0qVfh/ocZf7PJrNuryNIY7fXr6JAzMWYhFmCjJJOAB1qxqXgrQdXujcX9pLJI9uLabbdzILiIZwkqq4EoG4/fDdT61jNOULJ2f/AADvjpJM5S08Ra7KNQ1KfUpWttK0G01H7JDDFm6leGRnVyUJ2kouApU5744rQtrzXdI1DQZL/XX1WPW1kSWB7aJEt3ELTBoSihgg2FcSFzyvOc56ix0HTNOaRrO1CGW3itnDMzBo4wQi4JPQMfrnnNUtO8F6JpFybnTbWRJliaKAS3UsqWyN1SJHYrEvA+VAowAMYAq5tXk112/H/gehNNNRipb/APDf8H1OP0LW/EVp4X8MeJNW16TVBqxijurH7LCkaiRCQ0ZRA4dSoLZZgfnwq8bV8KeIPGWtHRdZFjq0lnqWyW5iuBYLZwwuud0RSQz5X5fv7sjdlVJG3d8GfD3TvDOlaT9oh8zUbG2CErdSyW8cpXDvFEx2IzfNllVWO5s/eOdK08E6DY6jHeW1pMrRStNDA13M9vC5zlo4C5jRvmblVBGT6mrdlJ+v4dvP13Klrsb1FFFQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAcd8TtYv9E8Lw3OlXLW0zXaoXUA5Uq5xz9BWD8LfE+sa7rV7Fq19Jcxx2+5FYAYO4DPAr0i7sbS/hEV9aw3MYbcEmjDgH1we/JqO00nTtPkaSwsLW2dhtZoYVQkemQK5pUpuspqWnY9enjcPDAyw7p3m/taf8OeceHtT/4Rn+29R2F4rzUNTURjrJcxXEhjUf7TqWH/AAAUzSZT4Ys/EtrLq1xaXL6vBE1xZ2P2q4uJTaQu/lxhWG9iHOSrAckiu9fwpokkEUMunpJHFqB1OMOzNtuS5fzBk9dzE46c9KS98JaLfrdfaLV991cpdySxXEkcgmVAiujqwZDtUL8pHGfU56I6Rt5Jfdb/AIP4HluScpPu2/vv/wAD8ThtO8T+I7e4vrK+uNQVoNX06JP7TitPtAinIDo32fMZBwSCAGG7ntU0es+I10k6/LrsrrF4gawFgLaEQyQG98jDHZv3hTwysB8q5B5J6yz8C+HrF5Ht7F/MlmhnlkkupZGlkiYtG7MzEswJ6nJIAByAALf/AAjWknTTp/2T/RWu/tpj8x/9d5vnbs5z/rOcdO2McVcWk7vv+Hu/5P7/ADM1e2v9fF/mvuODstUks9IuLO01LUbW7utf1MxQaVZJcXNxtuG4UyK0cagsu55AFGR8y9aTSNf8Uan/AGZpkuqXNnNJrd5Y3E88FsbnyUhaRQdgaHzAcDKjbxyDyK7S58FaFcxqptp4WS4muVmtbyaCVZJWLSYkjcOAxOSudvA44FO03wboOjvC2m2AgMNw91GBK5CyvH5bNgtjJXr6kk9STUQ0Vn2X3q3+TKqe9K8e7f33/wA0ctFreuPJH4dOsyi5k1yWw/tZoYfPEKQfaOF2eWZCPkzsxjJxkVoeBYLm28S+MYL2+a/lj1GEfaHRUZx9lixuCgLuxjOAB7DpW9c+FtHu7a6hmtW23VyLuRkmdHEwAAkR1YMjAKBlSP1NP0Tw3pfh1br+ybd4jdyCW4eSeSV5XChdzM7Ek4Ayc5PU801+n46f5CWl/wCurMnwfBBJqvia7mUNqMmpvDcM4+ZYkVfKT2XYQwHTLse5rnJ7Gyn8YeGbDwbqT6bZQxarE0tsokaIrJCHSPzQyqA/GNpUAEKBwR2WqeEdH1e/N7cx3UF0yCOSaxvp7R5VHQOYXUuBzjdnGTjGTVm38P6VaTWEtpZRwNp0LwWgiyqxRvt3KFHHOxeo7e5pLRLyVvwt/X9XpOzb9fxOQ0vxLrEj6PbXN75zf2rqFhPKYkDXCQLKEZgBgN8ik7QATngDiq3h/WfEKaf4L1fVdekvF13Ed3avbwpCgNu8gdCqBw2YxnLFTlsAcY7WLwzpEEsUkVpteG5mu0PmOcSzbvMbr33tx0GeMUReGtIhstLtI7QCDSSDZIZGPlYjaMdT83ysw+bPWmttd9P+CLS77a2/Q4Kw8U6xJ4h8O3FpqmsalpWrXphee70+2trOVWhkkHkIQtyMFV2s25SM/M3WvUq5q1+H3hqzvLS5hspjJYyCSzEl7PItoeRiJWcrGpBwVUBSAARgDHS0dBPV3/rr/wAAKKKKACiiigAooooAKKKKACiiigAooooAKKKKAOX+IWp3mkeFWutOnaCcTIodQOhznrXM/DbxPrGteJJ7fVL57iFbRnCMqjDB0GeB6E16Rc2ltew+VeW8VxHnOyVAwz64NRWulafYymWysLW3kK7S8MKoSPTIHTgV0xqwVJwcde5opJRtY8+ur/UrDUvEp0a5W2uLjxPYW5keMOAjw2yvwf8AZJqe71nXdHvdT0Ia1Neytc2ENtqN3BD5luLhmViVjRUbbsJXK9WGcjiuxk8N6TLNPK9rl7i8jvZT5j/NNGFCN14wEXgcHHI60t54c0nUGvjeWaynUI447gl2+YRklCOflKliQy4IODnIFc/RL0+5Jafg/vM5Xcrr+nrr+R53qE+r+GvEPi6Zdakvrq30ewaC6nhiEqgzzAhwihD1bBCjgjqRky+LPFWr2suo3/h/VdYuk0+6RJUh0+2TT4cSKrRu8wEkrH5gTC52nHC9D2Fv4C8O28d8q2U0rajGkd3LcXk00k6oSU3SO5Y4zgHOcYHQAUy/+HvhrU5blr2xmkS6kMstuL2dYDIesgiDhFfPO8KGzznPNL7Sfb/MUru7XW35WOlooHAooGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFcl49jeS3shGjOd78KM9hTPAMUka3/mIyZMeNwx/erH2v7zksd/1RfVfrHN8vnY0r7xrodhfzWc09zLJbkC4a1sZ7iO3JGcSyRoyRnHJDEYBBPBzWoNUsGa2CXkDm6jMtuEkDeagAJdcdVAI5HHI9RXO+Arq1t/B7Qzyxw3OnzTrqQkcBopt7O7P6bs7wT1VgehritA0mOXxL4cvW+2Q28i6zNYotzLEggNwrwjYGC4KsTgjlduchQBo5WRxJXf8AX9evyPWNN1G11fS7bUdOl861uo1lhk2ldysMg4IBHHrVmvI/C0E+g+GfAOoWN9qM02oosFzBJdyPDJH9kkdUWEnYhBjTBUA8ck5OX+EZfE19D4c8Q3N5Z2x1GRPtT3HiKeUXO5TvhW0aERRyAg4VCCpQglhuzrKNpNLvYmWi/E9ZrL1XxLpGh32nWeq3qW1xqUvk2iMrHzH4GMgYHLKMnAywHUisX4eW8suiSane317eXdxc3MbGe6kdFRbiQIqxltq4AAyBk45Ncr4jS98V614key8P6rqKW9v/AGZpt5ayWqxwTowkeQebMjZEqxg4BH7nFZ3s1f5+n9WQLVf1/Xn8j1ioluUa7e2Cyb0RXJMTBCCSBh8bSeDkA5HGeorzO61TUvGWnaPquml7qF9PL3ej2etyabeQyiQJJIuwgSbSHXbIyrlevNC+LY5RqN/Jfaz/AGfLoOnNCqPGtx5ks0se4c+UsjHaC4wOhBAANVbR/wBd/wDIFqvu/T/M9RorzfwZNf2fxJvNLuTPawvpKXLafPrs2pSQt5uFZzLnynKsQVRmU4HJwCfSKXRP+t7foK+rXb/JP9QooooGFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUVxXxTikm8KwLDG0jfbEOEUk/ceuf+FFvPBrl758UkebbjepGfmHrXdDCKWHdfm26Hl1Me4YyOG5N+t/+B+p6JpOv6XrjXy6VdrcNp909pdKFKmKVfvKQQPXqOD2NWNO1G11bT4r7T5fOtphmN9pXIzjoQD2rzDSo28OQ6p4xskYxwaxfxaxDGmTNai6kIkwOrRElh6qXHcYd4RKa7a+HNIudSu7fTn0iS8hjsrx7Zrp/O2k+ZGyuQqkHaGwd+SDgY89Svy+a/S5601yykuif62/4f7z1as+TXtLjkt0N5GxuLtrKLy8uDOoYsmRkAgI2c9CCOvFedaPcXniO88MWN3rWozWMiaqrT2928D30UE8aQuzxFSTtwdykbuezEHOtdBhWz020iutQh87xtdJI5vZXkCKLnhWZiULL1ZcMc7s5war7SX9bpfqPl91t+f5Sf6Hs1Zeq+JdI0O+06z1W9S2uNSl8m0RlY+Y/AxkDA5ZRk4GWA6kVk+DjLa6x4k0n7VdXFpp99Glt9ruHnkRXt45Cpkcl2G5mI3E4zjoAK5HxGl74r1rxI9l4f1XUUt7f+zNNvLWS1WOCdGEjyDzZkbIlWMHAI/c4pXV19/y/rQmz6/1/W56xRXmmm6gfH+taTNLf6laWk+hPNPaWd5LbbblZgjAmNgwKMHXrz3zVXw/dajBpvgzWzqOpX1/qtrKLtJrp3juNtszqBDny1O5F5VQTzknJyXsm30v+Da/QS128vxSf6nqtRTXKQSQo6yEzPsUpEzgHBPzEAhRgHk4GcDqRXlfhWTxHdW/h/wAQTahZxLqSg3Es3iKef7ZujYsiWrQrFHICM4jKldjDkZzLoUl9a+GvAV//AGnqV1earMj3jT3ssgm/0OZgu0sVAyF4AGSATk81VrXv0Glfbtc9Uorzzw01rF4T0rxbq/iLU0vru0ea6ja/LRTSGNneJIHJRSm1sCNVYeXySNwOVod5e23jrwyUOoWltq0c7eVqPiCS8nuoxDv8x7f5oYvmAIMb9DjAztBb3uXt/X6Et2Vz0vVtXstEsvtWoSOsZcRosULyySMeiqiAsx9gCcAnoDTtL1Sz1nTo77TZfNt5MgMUZGBBKsrKwBVgQQVIBBBBGa5L4gx6hrGoaP4d0W7i0rUZmkv7bVJoTKIHgA+VFyAXYSEHORsD8GoPhT4lt9XsNR0iCzjtptGm8m9P25J3mumLNNJ8v8BfJDHGSWG1duKUdb/1pt+f6Delrf1/X+Z1OreJ9K0a6S1vJZ5Lp08wWtnaS3UwTON5jiVmC5GNxGM8ZzVvS9UstZ06O+0ydZ7eTOGAIIIOCrKcFWBBBUgEEEEAiuf8PvFb+PvFNtdMq31xLBcwqzDdJaiFEUqP7okWUexPvzl61relX9t9j0S01F5bzVpLZV0u5SyF/PHEWdmnDBgilcMyHeTGRhgCCLYbWv8AXa539ULjWrG0kCXTyQlrlLRC8EgDyuAVCnbhhz94ZAOQTkGvKNMvNTvJBo0urXUUMfiwWLi01ia6KRfYmd4RcsFkYb89eVPQgqDV/VgGmvtPvNVu4LO18UWFvDLLdO7xJ9nhIUO5JBZifmznLE5zzR2+X4uP/wAkEk0n6N/df/I9NvtStdNEBvZfLFxOlvF8pO6RjhRwOM+p4q1Xkmvxpaa9JoH9sXq6Tb6npkouLi8eaW2mkaQNEJpCzDIWMgE5XzMggFcSa/qmo+GZNd0nQ765mso5dNXz72/kc2bTylJUNw4kdAUCHJDFPMyMArhR1v62/Bf5id0/lf8AP/gfier0V5e8uo+GrXVbfW7uaK1nW1SLT9N1+S/vlllm8sFZblEaNHyFyWwNrFSpyaxp7/WdNj8badHeXGnyW2iwXEcA1ybUZLOV2k+YySgNG+3blASvAIJzT32/qwbK/wDXT/M9porj9NtX0b4iJY299qFxb3ulvczR3l5JcDzUlQBkDsfLyJGyqYXpxwK7Cn0T/re36CTu2v62T/UKKKKQwooooAKK5P4kI8nhFkiVnYzphVGSetct8MLaeHxPcNNDJGv2Nhl0IGd6Vqqd4c1zrhh1Ki6t9uh3mqeK9J0i9+x3MlzPdbBI1vY2U13JGp6M6woxQHnBbAODjODWjp+oWmq6fDfabcR3NrOu6OWJsqw+tc74Tkgh8QeKLOYquonUftEiMRueFo0ETj/ZwpXPqrDtXN6zrf8Aa9zomn+ELZItM1O6vS7rfPpkd5LGQfknhRn+ZjI+V2l9hOSMg4p3S81f+v6/4HLbfyPTqhnvLa2mt4rieOOS5cxwIzAGRgpYhR3O1SfoDXmkEGtyXui6NqutbYW1e5heLTdWlnkWAWrMIJbgqjlg3OSNwG3kn5qqHTxP4s0K0ubzUpodM8U3NvbvJqM5dYzZPKFZ9+XwxwCxJ25XO0kG4q7t5X/L/P8AP5w3Zf12f+X9dPXKq6lqdppFkbvUJfJgEkce/aW+Z3CKMAE8swH4151BOsOgazquqahr1zPca3caZBFZagUbYbwokUYd1jQnp5nyuAcKwwMYFxc6hBL4h0e9kaNLaTRpvsbazNqZt5HvBnMkyhlYqqZQEgcEHmpWqTXl+j/JmvLaTT6O342PaLy8ttOsZry+mS3trdDJLLIcKigZJJqpo2vafr0Uz6c8+YHCSxXNtLbyISARmORVYAg5Bxg9qyfiDcBfCj2Bjhb+1Zo9O8y43eVD5x2722kHjPABGWKjIzkcr4B1m60nx5qHg3XZI9S19YzdXmsNcxr9piAUQBYRyrBCdyYAXG7Lb8kjq3/Xm/wIen9fd+J3+r6/p+hiIX8kpknJ8qC2t5LiaTGNxWONWcgZGSBgZGetP0jWrDXbR7jTJzIschilR42jkicdVeNwGRsEHDAHBB6EVzvizTl1TxNp8ejeJH0DxNFaym1kNqs6TW5eMyqUcANyqfdYMuQenXCutZ1RF1HTNVksrG4OtWlpfavpKGATQyqNuSxZo5MbIz8xKh1KkcYSf4/52/r/AIAOy+X+V/6+R6dUN3eW9hbm4vZ44IgVUvI2BliFUfUkgAdyQK8x1m+n8P3mtaZp2sXzWFlc6RMz3F7JK9q0tztljMzsXKsiqxVmOA57MBUXxDcatreuadJe3TQWcWjyGCC7kjETteOGYhGGDswfwU9QCKton/XT/MpR7/1/Vz0+DUrW51G6sYZd1zZhDOm0jYHBK84wcgHpVqvNL7RFuPEnjGVdQ1O2Njp9s1v9mv5YirrDIQ7FWBkPA4fcDjkHJrprjxJJp3w1j1+5Uz3J0+KURoADNM6rtQD1Z2AA96jm0b7f8G35ELVpd7/hb/M0dK8S6RreoajY6XepcXOmS+TdxhWBjbkdwMjKsMjIypHUGtSvJNDa78I6/wCGJb7QNT02K6ibS9RvbyS2Zbi4lYyxufKmdsmYyDJAH73r0p1nZ3s+k6LqMuva19pv9dns5yuoSBGtzLOPKCZKrgKAHADjHDDAxfb1t872/VPyT69S+r+/5f0mv609ZoryG61DV7O9n8OafdXE9o3iRrFGvNWmhby/sSTCE3e2SVcyMSCPm42ggcVcli1y10tdLvNXECtr1rbiKx1mW8ntopAC8TzuiSfNkkbssAww3C4Xbzt+Nv8AMbdr36X/AAv/AJHpsVyk000SLKGhYKxeJlUkgH5WIwwweq5AOR1BFS15dd3N3a6rqeipqd/Dp769ZWDTteyNJBC1ojbVlcllLybV3A7syEg55rT12Oy0e2h0Gx1DXdUuby92w2EWs7ZUYQl9j3LMJkjwu84cv2AK/LSTur/10f6lONnbyv8An/kd9RXC/DG9u5x4jsry585dP1U28aDUZL8QjyY2ZBPIqu+GZvvDg5Hau6qmrW+X4khRRRSAKKKKACiiigAooooAKKKKACiiigAooooAKKr3d/a2IU3cwiD52kg80lpqFrf7/skyy7MbsA8Z/wD1UuZXsZ+0hzcl1ft1KuoeGdB1e/hvtV0TTr67gAEVxc2kckkYByNrMCRgnPHerN5plhqL276hY2101tIJYGnhVzE/95cj5T7jmsrwv4rh8R6fdzyQfYpLSeSOSN5Aw2K7KJAcDg7D1AwQw5xk4UPxEvtQgs/7J0KF7m91aXT4Y7u+aFdqQtMJGZYnIJVfu4OCetNauy9S21a/y/P/ACOyTTLCOG1ijsbZI7Ig2qLCoEBClRsGPl+UkcdiRVe38N6HaaxJq1ro2nw6lLnzL2O1RZnz1y4G45+tZGpeItf0HwvrGs65ommomnWj3McVlqkkxmKgnaS0CbenX5vpTj42gfwdZ69bWrP59zBay20j7Ht5HmWF0bg/MjMcjvt9807Nv+uo99Dore2gs4RDaQRwRAlgkSBVySSTgepJJ9zSWtnbWMHk2VvFbRbmfy4UCLuYlmOB3JJJPckmub8T+OI/Devadp7WRuY7gq15OsoX7FG8ixRuVwdwaRsduFY9sV1VJaq4bOxkX3hHw3qcSRal4f0u8jjkeVEuLKOQK7nLsARwWPJPc9auS6Vp0yzCawtZBcQi3mDwqfMiGcRtxyo3NweOT61boo6WHdmbpvhzRNGKHSNH0+wMasqG1tUi2hiCwG0DAJVSfXA9K0qKKBBRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRUVxcw2sYe4cIpOAT60y3v7a7cpbyh2AyQAeBWTr0lP2bkubtfX7iuSTXNbQdDZ21tFJHb28USSO0jrGgUOzHLMQOpJJJPfNUbnwxoF7pMGl3mh6bcafbkGG0ltI2hiIBA2oRgcE9B3rHfxXrF2b+50DQINQ0/T55beYtfmK5leI4kEUXlsrcghdzpuI7DBPRW2o2tyQiShJvJSd7eQ7ZY0bO0sh5XoRz3B9K00av/XkJ3T8/6uOSws45LeRLSBXtYzFAwjAMSHGVU/wg7V4HoPSoV0PSUvnvU0uyW6klE7zi3QO0gUqHLYyWCsQD1wSO9Y1x4+0Oy1xrXUNR0+0sTYw3cOoz3qJFN5jyKFUnAPEecgnOenFdMrK6B0YMrDIIOQRT31/r+rg1y+6/6/q5HFa28E000MEcctwwaZ0QBpCAFBY9yAAOewFJa2dtYweTZW8VtFuZ/LhQIu5iWY4Hckkk9ySa5VPGGsXdpcarpXh6O90aCaSMtHen7ZII3KOUgERVjuVsKZASB0BOK2tU8VeH9Dlii1vXNO0yWZd8cd7dpCzD1AYg0CLdtpWn2c7T2lhawStu3SRQqrHc25skDu3J9TzSxaZYQR2qQWNtGlnxbKkKgQcbfkAHy8Ejjsax7jxtpGneIrzTNZvbLTFgSBop7u7SMTtJv+VQ2ORs7E5zV7VvE+gaDLHHrmuabpskq7o0vLuOEuPUBiMijyDcW28M6FZarNqlnounW+oT7vOu4rRFlk3HLbnAycnk5PNWU0ywjhtYo7G2SOyINqiwqBAQpUbBj5flJHHYkVFda9pFjdQ217qtlbXFwyLDFNcIjSFyQgUE5JYq2MdcHHSobPxT4f1DVJNMsNd026v4iwktILyN5UKnDZQHIwevHFGwElt4e0Wz1abVbTR7CDUbgETXkVqizSA4J3OBk5wOp7VFYeFPDulSCTTNA0uzdZPNDW9nHGQ+0ruyAOcMwz1wxHenWfifQNQ1AWGn63pt1eNGJRbwXcbyFCAQ20HOMEHPTmn+INZh8P8Ah6+1a5UvHZwNL5anmQgcIPcnAHuaL2Q7NuxLqekabrdn9k1nT7XULbcG8m7gWVMjodrAjNLaaVp1gyNY2FrbNHAtuhhhVCsSklYxgcKCThegzXNJ8QrS3+Ht94m1q2GmyaeZorqyknUlJ42K+UHOAxYgbeOQw4q/YeMNOl0q0m1LU9Dtry7QNFBDqqyxybt2zZIVUtuCHkL2bGcZo2uxb/1/XU0dW0DR9fhji13SbHU44m3RpeWyTBD0yAwODRdaBo99pEelXuk2Nxp0QVY7OW2R4UC/dAQjAx244qvc+KtF0vT7K513WdK04XkYeJpb5BHLwCfLdtu8cjkDoRwM0/VfFPh/Qpo4db13TdNllXdGl5eRxM46ZAYjIot0/q4b6ktt4f0az8v7JpNjB5TK8flWyLsZU2KRgcEJ8oPYcdKfPo2l3SzLc6baTLPIJZRJAreY4UKGbI5IAAyecDFXQcjI6UUb7gZkPhvQrfS10230XT4rBX8xbVLVFiDf3ggGM++KktNC0iw0l9LsdLsrbT5AyvaQ26JEwb7wKAYOe/HNX6KAMq08LeH7DTLjTbHQtNtrG6z9otYbONIpsjB3IBhuOORRbeF9As7U21noem28DRmIxRWkaqULbiuAMYLc46Z5rVoo8w8iI2sBu1ujBGbhUMazbBvCEglQeuMgHHsKloooAKKKKACiiigAoqrqOp2ek2v2nUZxBDuC72BIyfpVXTPEukaxctb6ZfR3EqoXKqDwuQM8j3FLmV7XM3VpqXI5K/bqO1fw5ofiDyv7e0bT9T8nPlfbbVJvLzjONwOM4HT0qa+0fTNU03+z9T060vLL5f8ARriBZI/l6fKQRxjiubfxV4hudS1uLR9A0+5tdHufs7yT6q8Msp8lJTtQQMvSQAZccjtW/o+vWGt6dp93aTBf7QtEvIYJGAlMTAHJXPbcAe2TVW0+78dUaN2ZJa6NpljBawWWm2lvFZkm2jhgVFgyCDsAHy5BOceppLjRNKu42S70yznR5xcsstujBpRjEhBH3hgfN14Fc94j+IukaHqGmWUOoaPJNfO5ZrvVEt44o0JDNuw2TuBULgZIIyMGl8P/ABD0nV/Ds2vX9/o+n6YLloIZzqiOOvAkJCrG5GDsy3BHNK99QtbQ6KTSNNmsJ7GbT7WS0uWZp7doFMcpY5YsuMMSeTnqarW3hfw/ZwCGz0LTYIgqqI4rONVAV/MUYA6BzuHo3PWnXXiXQrGxhvb3WtPtrW4jEsM810iRyJlRuVicEZdeRx8w9RVDVvFf9maoLSOy89BNaQvL5u0BriRkAAwc7Qu4+uQKLapfIG7K79TdurW3vrSW1vYIrm3mQpLDMgdJFPBBU8EH0NUrHw5ommRQRabo+n2kdtI0sCW9qkYidl2sygD5SQSCRyQcVHq2uf2Xq2iWX2fzf7Vuntt+/b5W2GSXdjBz/q8Y4657Yp1n4n0DUNQFhp+t6bdXjRiUW8F3G8hQgENtBzjBBz05p6oCfVdG0vXbQWut6baajbq4cQ3cCyoGGQDhgRnk8+9JBomlWujnSbXTLOHTSjIbKO3VYSrZ3DYBtwcnIxzk1Q0jxZYX+i2N9fzW2mvfSSxwwz3CguyMwIUnG44XOAOKt2PiTQ9T1B7HTdZ0+8vEjErW9vdJJIqHGGKg5A+ZeenI9aS1WgX2Y608P6NYaTJpdjpFjbafKGElpDbIkL7hhsoBg5HXjmorfwt4ftbGWytdC02G0mi8mW3js41jkjyTsKgYK5Zjg8ZY+tPi8R6JPqlxpkGsafJf2yl57RLpDLEoxksgOVAyOo71aTULOX7N5V3A/wBqQyW+2UHzlAB3Jz8wwQcj1FG6DbQbDpen28ckdvY20SSxrE6pCqh0UbVUgDkAcAdAKWTTrKW1htpbO3eCBkaGJolKxlCChUYwCpAIx0wMVQuvF3huwiaS+8QaVbRq20tNexoAdzLjJbrujcfVGHY1rRyJLGskTq6OAyspyGB6EGjzC1tCO6tLa9h8m9t4riLcr7JUDruUhlOD3BAIPYimLplgkUUSWVuscMpmiQRKAkhJJcDHDZYnI55PrVmigCjc6JpV7a3dteaZZ3EF64kuopbdGWdgAAzgjDHCryf7o9KS00HSLCxhsrHSrK2tIJPNhght0SON853KoGAc85HNX6KAKk2k6dcxXcVxYWssd9/x9I8KsLj5Qvzgj5vlAHOeABVT/hFPDv8AYv8AY/8AYOl/2Zv8z7F9jj8ndnO7y8bc574rWooAqWGladpSMml2FrZKwUMLeFYwQqhVB2gdFAA9AAKt0UUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGF4n0261GG3Wzj8woxLfMBjp603wvpl3pq3QvIvL8zbt+YHOM56H3rforP2a5+fqcX1On9Y+s3fN+G1jy2z0fVbfS9Pgh0+5X+15rvTr/8AdFTDCbqSRZWzyF8szAHuZV9aravpLx31tJqNhrC2Efiq5nkbTYboSrEbR1V1NuPMCliBleOcdM163RWi0d/Vfe0/0/E7Grpf10a/J/geaavFp158O/Fdh4at/E9xdXGmSgRapDqTlztICx/ah94k9E5PGelJ450PVbLUbO40Cwlu7HV9RsjqcEKktBLHNGy3IUDoUQq/0Q9jXplFVzNNPsM81bwx4k8Tt4lvTeWGm2+tFrNIL7SpZJ0t4gyIQwnj25JeQDacbwfYdf4OvNRvfCNg+uW0tvqUcfk3SSoVLSISjOM9VYruB6EEVt0VK0Vv60B6u4UUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFAGdrlpNeWKx26b2EgYjIHGD61U0LTrqyuZHuY9ismAdwPOfatyivMqZZRqYtYxt8y9Lfl+p0RxE40nSWzPLdZ0rRL3WNQvrzw9r+heKpFkto77Q47o+eu791IZoVELbsKSJsbcYbhQav20+r6J4jF34i0+8urvUNBtLdpdPtHnja7jaTzEJQER5MgIZ9q4zyMGvQ6K9L7PL/XX/P8jC+t/wCt0/0+48k8JFvDd1pN3rvh7VcjwrZ2hmh0yW4aGQPIXgKopYE/KTxgbRuIyuer8H6R4k0zRdLglubGzsYkYvp0tk0k8Sl2ZYxKswRdqlVxsYDacEjFdhRVyld3/rdv9RS1d/62S/Q8k1bSdOuX1K907QNf8N+NrhSBJpEdz5M0ysWjLSootpEY4yZMcMQ20jix4rfXri41jTZoL22a4sVjjGj6MJ21RzFgiW5kR4kQMXXYwRsYIbBwfU6KzcU48pXNaXMeceGNGl/4mlxc6ZOjz+HLC2Uz27KWxFLujww6gkZXryM1juddTRotLktdT08voltEi6donnT38nklTHNcSI8USqxZSjhSM53AHB9foqp++5ef/B/zM4R5FG3T/gf5HnXg7TbuDV7S9l0ydZI/CVlbIZ4Wj/eBpC8RLAYb7uQeRxmsPThrOoa94PlurbVR9ju83VjDoX2Ox0zNtIgRCyF3+Y43rI0ff5coK9hopt3bf9bt/r/Wt6Wit5W/BL9DzLQtCubLwX8OYE0uaCWzvkluYxAVaDdbz72cYyuWbknu3vW942s9V1zUNH0XSRHDH5/2+6urqzeeBVhKlIyFZMs0hUgbhwjHtXX0Ut3r3v8Al/kVKXM7+Vvxf+Z5J4i0fxPY23jSxuol1ZPEGjSXMUumafJEi3UaCIxlDJIdzp5ZHPOw8cV1EmmTt46168+xykPoFvbwzeWcM2+csinueUJA9RXZ0US1hyvz/wAvy0BOzv8A1un+h5loK/8ACN3FtdeINH1CaK78O2NpG0GmzXTIYw/mwOkaMU5dT8wAPT+Gq3iR9VnOq6bbaXqGjW09gkdpZ6Xoscsl7mHAjmuCJII1Ql02HaRgEPggH1aiip+8vfr/AMH/ADJguS1un/A/yMrwsrp4P0ZJY5IpFsIFaOVCjIRGMgqcEEehrVooqpS5pN9yYx5YqK6BRRRUlBRRRQAUUUUAFFFFABRRRQBzfjvSb3WvDLWmmw+dOZkbbvC8DOeSRXOfD3wnrOheIZrrVLQQwtatGGEqNliynGAT2Br0eisnSi585w1MFTqYhYht3X3Hk9xp2kf8JJ4uTxHa+LF+2X4MP9mR6n5M0RtYVz/o48pjuDA5yeMHitTTzqvh/UfDV/4js9QuGGjSWVxLa2rXLxzF42VZFhBwSqnLAbMg88jPolFbLS3lp+Fv1O2Svf8Arqn+h5x4UsNRWXwtNd6bdWrRvqjzpLGcwb5SVDEcDPbnB7ZrIi0vVdPg8J310+t6ba21hc20kmmactzcW8zyKw3RNDKwVlQjcq8EAE4NevUVNrS5hrRWPNvD+gC38TeGrm3tdWktY01Ofz9TtkjdHleIhisaqsW/5yFKq3JyAcitHUdLvrnw/c6klnNLdnWo9QNqoxI0UMyqAobHJij3AHucV3FFPa1un+dweqs/6vf/ADOMlvF8WeKtCk06x1OO30maW7nnvbCa0UFoXiVFEyKXJ8wn5QQAvJGQDi6FoVzZeC/hzAmlzQS2d8ktzGICrQbrefezjGVyzck92969Noo/4H4O407Jrv8A5NfqeQeFtD1bw4VvNRtL7UF1e2urRS1sxk0xvNldEChcrFICMsf4lUk4I27um6JcWml/D2C2sZbdrK2aObEJBt82jAh+Pl+fGc9T716FRSStFx/rr/mS1dp/10/yPL9GtZn0jwh4d/sS9h1XRriN724lsnSGLYjCZ1mIEcnmFiMIzE+YSQMHFFdM17Sre6vodGup5/CUxttJhhjObuF3fOzPVRFJCDj+KI+gx69RTet331+en6aW82P+vlr/AJnA+F/Cx0Xxgiy2jSC28N21p9reMkPIZZWlG/GCSdrEe4Jra+HlrcWPw40G1vIJLeeGxjR4ZUKMhAxgg8jHpXSUUf1+Lf6jvf8AD8Fb9AooooEFFFFABRRRQAUUUUAFFFFABRRRQAUUV5b8S5ZT4rs7fxF4o1rwv4Xa3Xyr7SGMIe8MhXbNOFby1CkEBgFOSc/LS6pd/wCv68x20bPUqK870q/m+H3he/1DVPEVz4q0BjC2jTeYLq+naTgxbgAJdzkbDnoSOABVvw1491m+8TR6H4v8IT+Grm7geexY30d0lwExvUlANjAMpwc8Z6YGa3dl/X/BF0uzuaK5A+PAfAd74li08OsVzLb2lv5+PtRWcwod235d7AEAA8Edaq6h8RLuHxVqOh6T4ffUH0v7O17cm6EMNtHIC0ju7Lj5F2kKMs2TwNtL+v6/Xt1A7mivPtH+I+u6xqVlcQ+A9RXwzfyqltrH2lGkKtwsrWwG9UJ53E8KQxpNW+Jeqw316/hvwXe67o2mSPFf6nHdxQhWT/WCGNuZtvI4x8wI96Nt/wCvXt8wWu39enf5HoVFZcerT3k2ky6XY/atNv4mmkvfOVPIXYGT5DyxbOOOmOawvixrr+Hfhbrd/Bcvaz+QIYp0Yq0TyMEDgjkEbs8c8US93cI2lax2NFfPnhrWtCn8X6Hb+AfiZ4q8RapLeIJ7HVrqRrZrYAmYkSxpyEBK4JbOOOpHeR+NX0iTxLq9yLrVPtGsjTNI022fc0rxxqpVAThcuJGZuwUk9MU/6/Jfr+Yr6/15/wCR6PRXC6H8RrlrrUbLxz4ek8K3ljZHUNsl2l1HLbKcM4kQAZU8FevI9ap6f8UNWl1bTm1rwRf6RoOrTrb2OqT3UbOXf/ViWBfmiDdMknkgd6S1dl/XT8x7K56NRXnWv/FDUrDUdfs/D3hG4106CyG7lS7WCNU8rzHO5l5YZACLuJwSccbpdL+Jt7qXiPR7eTwlfWWia3uWw1S6uI1eRxG0nMAyyqQpwxPPBxzQtdgem56BRXj1l8StV0q713V30DU9T8PjWpYbnUnu1WOwiQpCPKibLOuVZm24UZPOc46zxF461a11uXSPBnhOfxPeWiI96wvY7WG33jKr5j53PjB2gcAg5pX91Pv/AJXDq12/zsdrRXE3nxOsbfwnomtwafdznV71bJLIKfPSTLB02gHLKUYY4GR1A5rNHxK8TS3AsLL4fXN3qlqA+q2sOqQlbFGJ2DzD8skhQb9g6Bhz6MP6/r7j0iivKtd8Y33jXwBph8NyXWiXOua19gtLhZCsqRxSOzSEYBXKwsCvOM45q5rniy71f4WWDwTPYavqd/b6TOLeUpJb3BnEc6qwwQVCyEEdhnpTSb+9L77f5g9H/XS/+TPSaK8E8deK/DsvxU1jT/FPxA8ReF7bTbe2gtoNHuZkEzlWeR2CRuOjoOx4rd0rV9E0D4SeJvFfhjxl4g8RQC3dIrnWrqSTyplUhQgdExlnXJxzxzxU3tBy7ajt7yj3PXqK+efCF54J1vVdJsLb4v8Ajq/1edo82ovblY5ZAMsvMPC8Hq3Tv3r6Gq2rEJ3CiiipKCiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAKKKKACiiigAooooAK4DV9V+IuhaxfRWHhe38XaZcymS1kTUYrJ7aMqAYnV1w3OcMM8da7+ilbUZ5DB4B8S6b4SjvtP07S4dUt9dGtwaBbSFLaNBHs+zq/wB0PjLbsBd56Y5rZ03TvGviTXH8ReI9NtfD72NjNb6VpgvBcsJpAA00siDbj5QABzgtn39Fooaurf1tb8u/ruLqn/W9/wA2ePaFoPjm/wBI8IaDq/huDRdG0e7hN7nUUuZrkQJvSQ7cBVMqr8oLMSecAc9PD4Qv9S8J+M7O+VbC98RXN1sfeH2RlBDExKn+4inHbPrmu6opy95Pzv8Ajb/JAtGn2/S/+ZwvhLUfH91eWtjrvhfT9C06yi8ue5+3C5a8IXavkqmPLGRk788EDGeR5hJ8FrltauNNm+HunXzTXckg8T3WuTiIxs5cF7VHVy4U7cKVBbnOOa+iaKN5cz3BaKy/r+vMy9LjnsZ/7Jh00W+l2VrClrc+eG8w/MCgQ5YbQq8sed3sa5n4o2niC7stDPhvQf7dNpqsV5cWpu47cMsYYqN0nH3yp4B6V3VFDu3fre/43BWSt02/Cx5mo8c+NdY0oeIPB9t4ZsNKvEv2lfUo7yad0B2pHsACZJ+YnseKqr4V8U6P4V8L6tpulW1/rul3Vxe3ulSXKxec9zv8wLLyodS/UkjAPJ4B9Woo6WXr/X4fcHW7/r+rv7zym58HeLfHNjrup+JoLPRb68077Bpml+f9oW2XzA7GaRRhi7IudvAXHGatWtv478a6xpMfirw9a+GdI0q5jvJ0W/S6kv5U5jC7BhEDAMd3P3cd69Mopp2d10/4f8xNXT8/+G/I83l8L69L8MPEFh9kKav4g1Cd50WSPMcUswTcW3bTtgAPBzxgc1taro2oyeNNJvbO0Lafo2mXJgCyqvmXL7ERApPZFbk4HzdetddRU20t/W1l93TzH1v/AFvd/eeN6d4d8f33hjT/AAHq2hWVjpKbG1HWhfLKbqLeJHjWEDcsjE7SxJHDEE5BrM8X/Ci4uvHWrXp8A2niqPVp1lg1GbXJLMWIKKpSSNSC6hgW+XJ2nHWvd6Kbs3f+v606AtFb+v6/rscDo/geXRNR8IafaWNvFpWiW91PK8DsY1upAFARZHaTB8yY5JOOme1c3rOs+KPBV34xv/DlhpOqaRd3El42sS6kqjT51iVHiljALOwaMAKv94Anrj2KuQvfhV4I1HxV/wAJHe+HrabVN4kMrM+1mH8TR7tjH3KnnmlK8nr1vf5u/wDW2w1ZL+v6/PfYxvC/hXVIZfAX2u3ItdG0mWa5mZ15vJURduM7s4aU5xipL7wXqf8AwtiwvrOJP7Ae6Oq3R3KDHdrA0IG3OSHDI2QOChz1FeiUVbfvXX9a3/DT7kSk+Wz/AK/4f9WeQ6LqHxH8NXuti3+GX9pDUNVnvBdHXbaEurHCDbyeEVRya39ZtvEvjPwro1tq3hz+yZJtXhk1G0+3RTiG2ifzNxcYDbiiDaoJ5+td/RUx0S8rfha35Det/O/4hRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQAUUUUAFFFFABRRRQB//2Q==)\n", 62 | "\n", 63 | "Credits : Bloomberg\n", 64 | "\n", 65 | "

Granular data on distributed rooftop solar PV is becoming increasingly important as solar photovoltaic (PV) becomes a significant segment of the energy industry. An imagery-based solar panel recognition algorithm that can be used to create detailed databases of installations and their power capacity would be extremely helpful to solar power suppliers and consumers, urban planners, grid system operators, and energy policy makers. The fact that solar panel installers typically keep installation details to themselves is another factor in solar panel detection. A well-known solar panel detecting technique or algorithm is therefore urgently needed. However, there hasn't been much effort done to identify solar panels in aerial or satellite photographs.\n", 66 | "\n", 67 | "

We first require a labelled data-set of satellite images in order to create an algorithm that can recognise solar panels from aerial or satellite imagery.\n" 68 | ], 69 | "metadata": { 70 | "id": "-VGVSOmgoqtq" 71 | } 72 | }, 73 | { 74 | "cell_type": "markdown", 75 | "source": [ 76 | "# Understanding the Dataset\n", 77 | "\n", 78 | "#####

Here are a few snippets from the dataset - Images containing Solar Panels \n", 79 | "\n", 80 | "
\n", 81 | "\n", 82 | "#####
Here are a few snippets from the dataset - Images NOT containing Solar Panels\n", 83 | "
\n", 84 | "\n", 85 | "\n", 86 | "

When examining the photographs themselves, it is clear that solar panels frequently have rectangular shapes with distinct angles and borders. However, the whole pictures that include solar PV do not necessarily have a same structure. The solar panels are not always at the centre of images, which come in a range of sizes and hues. Additionally, the background scenery in the photographs of the two classes is also not uniform. Both classes contain illustrations of home swimming pools, pavement, grass, and rooftops. A model should also be able to predict the same class independent of the orientation of each image." 87 | ], 88 | "metadata": { 89 | "id": "PKm9aP3Quf2O" 90 | } 91 | }, 92 | { 93 | "cell_type": "markdown", 94 | "source": [ 95 | "#Importing necessary libraries and modules for this notebook" 96 | ], 97 | "metadata": { 98 | "id": "qIy76Rc0BENn" 99 | } 100 | }, 101 | { 102 | "cell_type": "code", 103 | "execution_count": null, 104 | "metadata": { 105 | "id": "rI4GdpfgMmfe" 106 | }, 107 | "outputs": [], 108 | "source": [ 109 | "# IMPORT REQUIRED LIBRARIES AND FUNCTIONS\n", 110 | "\n", 111 | "\n", 112 | "'''Data Handling & Linear Algebra'''\n", 113 | "import numpy as np\n", 114 | "import pandas as pd\n", 115 | "\n", 116 | "'''Visualisation'''\n", 117 | "import matplotlib.pyplot as plt\n", 118 | "import matplotlib as mpl\n", 119 | "from pylab import rcParams\n", 120 | "import seaborn as sns\n", 121 | "\n", 122 | "'''Data Analysis'''\n", 123 | "from sklearn.model_selection import StratifiedKFold\n", 124 | "from sklearn.metrics import roc_auc_score\n", 125 | "from sklearn.metrics import roc_curve\n", 126 | "from sklearn.metrics import confusion_matrix\n", 127 | "\n", 128 | "'''Manipulating Data and Model Building'''\n", 129 | "from keras.layers import Conv2D\n", 130 | "from keras.layers import Dense\n", 131 | "from keras.layers import GlobalMaxPooling2D\n", 132 | "from keras.layers import MaxPooling2D\n", 133 | "from keras.layers import BatchNormalization\n", 134 | "from keras.layers import Add\n", 135 | "from keras.models import Sequential" 136 | ] 137 | }, 138 | { 139 | "cell_type": "markdown", 140 | "source": [ 141 | "###Importing Google Drive for Dataset Access" 142 | ], 143 | "metadata": { 144 | "id": "bvIn56Q0ArnN" 145 | } 146 | }, 147 | { 148 | "cell_type": "markdown", 149 | "source": [ 150 | "- Download this dataset to your system.\n", 151 | "- Upload this 'data' folder directly in your 'Main Drive'." 152 | ], 153 | "metadata": { 154 | "id": "0x3uRuOYnyf7" 155 | } 156 | }, 157 | { 158 | "cell_type": "code", 159 | "source": [ 160 | "from google.colab import drive\n", 161 | "drive.mount('/content/drive')" 162 | ], 163 | "metadata": { 164 | "id": "MCFAQAs9YS93" 165 | }, 166 | "execution_count": null, 167 | "outputs": [] 168 | }, 169 | { 170 | "cell_type": "code", 171 | "execution_count": null, 172 | "metadata": { 173 | "id": "nazMB-iPHyhz" 174 | }, 175 | "outputs": [], 176 | "source": [ 177 | "# define dataset directories - the below links won't work if you haven't placed 'data' folder in your 'Main Drive'\n", 178 | "DIR_TRAIN_IMAGES = \"/content/drive/MyDrive/data/training/\"\n", 179 | "DIR_TRAIN_LABELS = \"/content/drive/MyDrive/data/labels_training.csv\"" 180 | ] 181 | }, 182 | { 183 | "cell_type": "markdown", 184 | "source": [ 185 | "#Exploratory Analysis & Data Scaling\n", 186 | "\n", 187 | "\n" 188 | ], 189 | "metadata": { 190 | "id": "coIj9Hc42GzC" 191 | } 192 | }, 193 | { 194 | "cell_type": "code", 195 | "source": [ 196 | "pd.read_csv(DIR_TRAIN_LABELS).head()" 197 | ], 198 | "metadata": { 199 | "id": "XffklsVltSdU" 200 | }, 201 | "execution_count": null, 202 | "outputs": [] 203 | }, 204 | { 205 | "cell_type": "markdown", 206 | "source": [ 207 | "- id are names of the image before tif\n", 208 | "- label has two values:\n", 209 | " - 0: No solar panels in the image\n", 210 | " - 1: Solar panels present in the image" 211 | ], 212 | "metadata": { 213 | "id": "iE5jH577tWAL" 214 | } 215 | }, 216 | { 217 | "cell_type": "code", 218 | "source": [ 219 | "# LOADING DATA AND PREPROCESSING\n", 220 | "\n", 221 | "def load_data(dir_data, dir_labels):\n", 222 | " '''\n", 223 | " dir_data: Data directory\n", 224 | " dir_labels: Respective csv file containing ids and labels\n", 225 | " returns: Array of all the image arrays and its respective labels\n", 226 | " '''\n", 227 | " labels_pd = pd.read_csv(dir_labels) # Read the csv file with labels and ids as we saw above\n", 228 | " ids = labels_pd.id.values # Extracting ids from the csv file\n", 229 | " data = [] # Initiating the empty list to store each image as numpy array\n", 230 | " for identifier in ids: # Looping into the desired folder\n", 231 | " fname = dir_data + identifier.astype(str) + '.tif' # Generating the file name\n", 232 | " image = mpl.image.imread(fname) # Reading image as numpy array using matplotlib\n", 233 | " data.append(image) # Appending this array into the empty list and repeat the above cycle\n", 234 | " data = np.array(data) # Now, convert the data list into data array\n", 235 | " labels = labels_pd.label.values # Extract labels from the csv file\n", 236 | " return data, labels # Return the array of data and respective labels" 237 | ], 238 | "metadata": { 239 | "id": "9YrdmgifoLoh" 240 | }, 241 | "execution_count": null, 242 | "outputs": [] 243 | }, 244 | { 245 | "cell_type": "code", 246 | "execution_count": null, 247 | "metadata": { 248 | "id": "OszJkbgrH1SV" 249 | }, 250 | "outputs": [], 251 | "source": [ 252 | "# load train data - time consuming code cell\n", 253 | "X, y = load_data(DIR_TRAIN_IMAGES, DIR_TRAIN_LABELS)" 254 | ] 255 | }, 256 | { 257 | "cell_type": "code", 258 | "source": [ 259 | "# display the images with and without solar panels\n", 260 | "plt.figure(figsize = (13,8)) # Adjust the figure size\n", 261 | "for i in range(6): # For first 6 images in the data\n", 262 | " plt.subplot(2, 3, i+1) # Create subplots\n", 263 | " plt.imshow(X[i]) # Show the respective image in respective postion\n", 264 | " if y[i] == 0: # If label is 0\n", 265 | " title = 'No Solar Panels in this image' # Set this as the title\n", 266 | " else: # Else label is 1\n", 267 | " title = 'Solar Panels in this image' # Set this as the title\n", 268 | " plt.title(title, color = 'r', weight = 'bold') # Adding title to each images in the subplot\n", 269 | "plt.tight_layout() # Automatically adjusts the width and height between images in subplot\n", 270 | "plt.show() # Display the subplot" 271 | ], 272 | "metadata": { 273 | "id": "ZBgNCx7hxbJK" 274 | }, 275 | "execution_count": null, 276 | "outputs": [] 277 | }, 278 | { 279 | "cell_type": "code", 280 | "execution_count": null, 281 | "metadata": { 282 | "id": "uUGT3ZPBH5jd" 283 | }, 284 | "outputs": [], 285 | "source": [ 286 | "# print data shape\n", 287 | "print('X shape:\\n', X.shape)" 288 | ] 289 | }, 290 | { 291 | "cell_type": "markdown", 292 | "source": [ 293 | "- 1500 total images in the training data\n", 294 | "- Each image is of shape (101 x 101 x 3)" 295 | ], 296 | "metadata": { 297 | "id": "KRu_Ivtf2UlF" 298 | } 299 | }, 300 | { 301 | "cell_type": "code", 302 | "execution_count": null, 303 | "metadata": { 304 | "id": "A5AYGyrHH7wF" 305 | }, 306 | "outputs": [], 307 | "source": [ 308 | "# check number of samples\n", 309 | "print('Distribution of y', np.bincount(y))" 310 | ] 311 | }, 312 | { 313 | "cell_type": "markdown", 314 | "source": [ 315 | "- Out of 1500 images:\n", 316 | " - 995 images are without any solar panels\n", 317 | " - 505 images are with solar panels" 318 | ], 319 | "metadata": { 320 | "id": "X4H5f-nr2k3b" 321 | } 322 | }, 323 | { 324 | "cell_type": "code", 325 | "execution_count": null, 326 | "metadata": { 327 | "id": "3Pn9Dq3dH829" 328 | }, 329 | "outputs": [], 330 | "source": [ 331 | "# scale pixel values between 0 and 1\n", 332 | "X = X / 255.0" 333 | ] 334 | }, 335 | { 336 | "cell_type": "markdown", 337 | "source": [ 338 | "#Building the CNN Model\n", 339 | "\n", 340 | "

A neural network type with a topology resembling a grid is known as a CNN. The effectiveness of CNNs in computer vision applications including image classification, picture clustering, and object identification is well recognised. Convolutional neural networks (CNNs) at least one of its layers instead of matrix multiplication at their core. They are structured like other neural networks by a series of layers. Neurons are grouped in three dimensions—width, height, and depth—in the layers of CNN. Although there are many various kinds of CNN architectures, they are the best option for picture identification since they handle pixels in relation to their surrounds.\n", 341 | "\n", 342 | "

\n", 343 | "\n", 344 | "The convolutional layer applies a convolution operation, the output is passed to the next layer. The pool layer performs a down sampling operation by combining the outputs of neurons at one layer into a single neuron in the next layer. The flatten reshapes the feature map into a column. The full-connection layer will compute the class scores, each neuron in this layer will be connected to all the neurons in the previous one\n", 345 | "\n", 346 | "*Credits* - [MathWorks](https://www.mathworks.com/videos/introduction-to-deep-learning-what-are-convolutional-neural-networks--1489512765771.html)" 347 | ], 348 | "metadata": { 349 | "id": "a4Hu7o9f2RFk" 350 | } 351 | }, 352 | { 353 | "cell_type": "code", 354 | "execution_count": null, 355 | "metadata": { 356 | "id": "UI5gk1HGH_c-" 357 | }, 358 | "outputs": [], 359 | "source": [ 360 | "# MODEL : CONVOLUTIONAL NEURAL NETWORK\n", 361 | "\n", 362 | "# define CNN\n", 363 | "def build_model():\n", 364 | " '''\n", 365 | " Returns a Keras CNN model\n", 366 | " '''\n", 367 | "\n", 368 | " # define image dimensions\n", 369 | " IMAGE_HEIGHT = 101\n", 370 | " IMAGE_WIDTH = 101\n", 371 | " IMAGE_CHANNELS = 3\n", 372 | "\n", 373 | " # define a straightforward sequential neural network\n", 374 | " model = Sequential()\n", 375 | "\n", 376 | " # layer-1\n", 377 | " #filter is convolutional matrix which is applied across the image = 32 filters\n", 378 | " #kernal size is 3x3 matrix(filter)\n", 379 | " #relu positive kept as it is, negative is taken out\n", 380 | " model.add(Conv2D(filters=32,\n", 381 | " kernel_size=3,\n", 382 | " activation='relu',\n", 383 | " input_shape=(IMAGE_HEIGHT,\n", 384 | " IMAGE_WIDTH,\n", 385 | " IMAGE_CHANNELS)))\n", 386 | "\n", 387 | " #adding normalizing layer to improve the speed of training\n", 388 | " model.add(BatchNormalization())\n", 389 | "\n", 390 | " # As we move forword in the layers pattern gets more complex,\n", 391 | " # to capture the maximum combinations in subsequent layers\n", 392 | " # layer-2\n", 393 | " model.add(Conv2D(filters=64,\n", 394 | " kernel_size=3,\n", 395 | " activation='relu'))\n", 396 | " model.add(BatchNormalization())\n", 397 | "\n", 398 | " # layer-3\n", 399 | " model.add(Conv2D(filters=128,\n", 400 | " kernel_size=3,\n", 401 | " activation='relu'))\n", 402 | " model.add(BatchNormalization())\n", 403 | "\n", 404 | " # Pooling layer is to reduce dimentions of feature map by summerizing presence of features\n", 405 | " # max-pool - sends only imp data to next layer - here 2x2 matrix\n", 406 | " model.add(MaxPooling2D(pool_size=2))\n", 407 | "\n", 408 | " # layer-4\n", 409 | " model.add(Conv2D(filters=64,\n", 410 | " kernel_size=3,\n", 411 | " activation='relu'))\n", 412 | " model.add(BatchNormalization())\n", 413 | "\n", 414 | " # layer-5\n", 415 | " model.add(Conv2D(filters=128,\n", 416 | " kernel_size=3,\n", 417 | " activation='relu'))\n", 418 | " model.add(BatchNormalization())\n", 419 | "\n", 420 | " # max-pool\n", 421 | " model.add(MaxPooling2D(pool_size=2))\n", 422 | "\n", 423 | " # layer-6\n", 424 | " model.add(Conv2D(filters=64,\n", 425 | " kernel_size=3,\n", 426 | " activation='relu'))\n", 427 | " model.add(BatchNormalization())\n", 428 | "\n", 429 | " # layer-7\n", 430 | " model.add(Conv2D(filters=128,\n", 431 | " kernel_size=3,\n", 432 | " activation='relu'))\n", 433 | " model.add(BatchNormalization())\n", 434 | "\n", 435 | " # gobal-max-pool- performs downsampling by computing the maximum of the height and width dimensions of the input\n", 436 | " # using it as a substitute of Flatten before passing it to the final layer\n", 437 | " model.add(GlobalMaxPooling2D())\n", 438 | "\n", 439 | " # output layer\n", 440 | " model.add(Dense(1, activation='sigmoid'))\n", 441 | "\n", 442 | " # compile model\n", 443 | " model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])\n", 444 | "\n", 445 | " return model\n" 446 | ] 447 | }, 448 | { 449 | "cell_type": "markdown", 450 | "source": [ 451 | "##Checking the Performance of our CNN Model" 452 | ], 453 | "metadata": { 454 | "id": "lmBI2xps6EXI" 455 | } 456 | }, 457 | { 458 | "cell_type": "code", 459 | "execution_count": null, 460 | "metadata": { 461 | "id": "LvC8xK7cIPTQ" 462 | }, 463 | "outputs": [], 464 | "source": [ 465 | "# cross-validate CNN model\n", 466 | "def cv_performance_assessment(X, y, num_folds, clf, random_seed=1):\n", 467 | " '''\n", 468 | " Cross validated performance assessment\n", 469 | "\n", 470 | " Input:\n", 471 | " X: training data\n", 472 | " y: training labels\n", 473 | " num_folds: number of folds for cross validation\n", 474 | " clf: classifier to use\n", 475 | "\n", 476 | " Divide the training data into k folds of training and validation data.\n", 477 | " For each fold the classifier will be trained on the training data and\n", 478 | " tested on the validation data. The classifier prediction scores are\n", 479 | " aggregated and output.\n", 480 | " '''\n", 481 | "\n", 482 | " prediction_scores = np.empty(y.shape[0], dtype='object')\n", 483 | "\n", 484 | " # establish the num_folds folds\n", 485 | " kf = StratifiedKFold(n_splits=num_folds, shuffle=True, random_state=random_seed)\n", 486 | "\n", 487 | " for train_index, val_index in kf.split(X, y):\n", 488 | " # extract the training and validation data for this fold\n", 489 | " X_train, X_val = X[train_index], X[val_index]\n", 490 | " y_train = y[train_index]\n", 491 | "\n", 492 | " # give more weight to minority class based on the target class distribution\n", 493 | " class_weight = {0: 505/1500, 1: 995/1500}\n", 494 | "\n", 495 | " # train the classifier\n", 496 | " training = clf.fit(x=X_train,\n", 497 | " y=y_train,\n", 498 | " class_weight=class_weight,\n", 499 | " batch_size=32,\n", 500 | " epochs=10,\n", 501 | " shuffle=True,\n", 502 | " verbose=1)\n", 503 | "\n", 504 | " # test the classifier on the validation data for this fold\n", 505 | " y_val_pred_probs = clf.predict(X_val).reshape((-1, ))\n", 506 | "\n", 507 | " # save the predictions for this fold\n", 508 | " prediction_scores[val_index] = y_val_pred_probs\n", 509 | "\n", 510 | " return prediction_scores" 511 | ] 512 | }, 513 | { 514 | "cell_type": "code", 515 | "execution_count": null, 516 | "metadata": { 517 | "id": "gPpE3xp0IkpW" 518 | }, 519 | "outputs": [], 520 | "source": [ 521 | "# number of subsets of data, where k subsets are used as test set and other k-1 subsets are used for the training purpose\n", 522 | "num_folds = 3\n", 523 | "\n", 524 | "# seed value is the previous value number generated by the random function\n", 525 | "random_seed = 1\n", 526 | "\n", 527 | "# build_model() function returns the predefined sequential model\n", 528 | "cnn = build_model()\n", 529 | "\n", 530 | "# lets look at summary of the model\n", 531 | "cnn.summary()\n", 532 | "\n", 533 | "# generate the probabilities (y_pred_prob)\n", 534 | "cnn_y_hat_prob = cv_performance_assessment(X, y, num_folds, cnn, random_seed=random_seed)" 535 | ] 536 | }, 537 | { 538 | "cell_type": "markdown", 539 | "source": [ 540 | "Looking at the True Positives, False Negatives, False Positives & True Negatives -\n", 541 | "\n" 542 | ], 543 | "metadata": { 544 | "id": "znKpsZ0GJrlG" 545 | } 546 | }, 547 | { 548 | "cell_type": "code", 549 | "execution_count": null, 550 | "metadata": { 551 | "id": "w7aqS0JtMFlP" 552 | }, 553 | "outputs": [], 554 | "source": [ 555 | "df = pd.read_csv(DIR_TRAIN_LABELS) # Create a data frame of labels\n", 556 | "df[\"predicted_class\"] = [1 if pred >= 0.5 else 0 for pred in cnn_y_hat_prob] # Add a column to it for predicted class\n", 557 | "\n", 558 | "# Get the values for FN, FP, TP, TN\n", 559 | "fn = np.array(df[(df['label'] == 1) & (df['predicted_score'] == 0)]['id']) # False Negative\n", 560 | "fp = np.array(df[(df['label'] == 0) & (df['predicted_score'] == 1)]['id']) # False Positive\n", 561 | "tp = np.array(df[(df['label'] == 1) & (df['predicted_score'] == 1)]['id']) # True Positive\n", 562 | "tn = np.array(df[(df['label'] == 0) & (df['predicted_score'] == 0)]['id']) # True Negative" 563 | ] 564 | }, 565 | { 566 | "cell_type": "code", 567 | "execution_count": null, 568 | "metadata": { 569 | "id": "DFcAXCOLewjz" 570 | }, 571 | "outputs": [], 572 | "source": [ 573 | "# Visuals of TP, TN, FP, and FN\n", 574 | "def show_images(image_ids, num_images, title, color):\n", 575 | " '''\n", 576 | " Display a subset of images from the image_ids data\n", 577 | " '''\n", 578 | " rcParams['figure.figsize'] = 20, 4 # Adjusting figure size\n", 579 | " plt.figure() # Generating figure\n", 580 | " n = 1 # index where plot should apear in subplot\n", 581 | " for i in image_ids[0:num_images]: # Run a loop for total number of images to display\n", 582 | " plt.subplot(1, num_images, n) # Generate a subplot\n", 583 | " plt.imshow(X[i, :, :, :]) # Display the image\n", 584 | " plt.title('Image id: ' + str(i)) # Add title\n", 585 | " plt.axis('off') # Turn off the axis\n", 586 | " n+=1 # Incrememting index by 1\n", 587 | " plt.suptitle('\\n'+title, fontsize=15, color = color, weight = 'bold') # Adding main title to subplot\n", 588 | " plt.show() # Display the final output" 589 | ] 590 | }, 591 | { 592 | "cell_type": "code", 593 | "execution_count": null, 594 | "metadata": { 595 | "id": "62gClVAxMMXe" 596 | }, 597 | "outputs": [], 598 | "source": [ 599 | "num_images = 7 # number of images to look at\n", 600 | "show_images(tp, num_images, 'Examples of True Positives - Predicted solar panels if they were present', 'g')\n", 601 | "show_images(fp, num_images, 'Examples of False Positives - Predicted solar panels even if they were not present', 'r')\n", 602 | "show_images(tn, num_images, 'Examples of True Negatives - Predicted no solar panels when they were not present', 'g')\n", 603 | "show_images(fn, num_images, 'Examples of False Negatives - Predicted no solar panels even if they were present', 'r')" 604 | ] 605 | }, 606 | { 607 | "cell_type": "markdown", 608 | "source": [ 609 | "# Model Evaluation & Results" 610 | ], 611 | "metadata": { 612 | "id": "mxpaXfysBxwK" 613 | } 614 | }, 615 | { 616 | "cell_type": "markdown", 617 | "source": [ 618 | "## Understanding ROC Curves -\n", 619 | "\n", 620 | "An ROC curve (receiver operating characteristic curve) is a graph showing the performance of a classification model at all classification thresholds. This curve plots two parameters:\n", 621 | "\n", 622 | "* True Positive Rate\n", 623 | "* False Positive Rate\n", 624 | "\n", 625 | "
True Positive Rate (TPR) is a synonym for recall and is therefore defined as follows:\n", 626 | "\n", 627 | "![Screenshot 2023-01-20 at 5.27.02 PM.png](data:image/png;base64,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)\n", 628 | "\n", 629 | "False Positive Rate (FPR) is defined as follows:\n", 630 | "\n", 631 | "![Screenshot 2023-01-20 at 5.27.08 PM.png](data:image/png;base64,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)\n", 632 | "\n", 633 | "An ROC curve plots TPR vs. FPR at different classification thresholds.\n", 634 | "\n", 635 | "Lowering the classification threshold classifies more items as positive, thus increasing both False Positives and True Positives.
\n", 636 | "\n", 637 | "####AUC: Area Under the ROC Curve -\n", 638 | "AUC stands for \"Area under the ROC Curve.\" That is, AUC measures the entire two-dimensional area underneath the entire ROC curve from 0 to 1.\n", 639 | "AUC provides an aggregate measure of performance across all possible classification thresholds. One way of interpreting AUC is as the **probability that the model ranks a random positive example more highly than a random negative example**. AUC ranges in value from 0 to 1. A model whose predictions are 100% wrong has an AUC of 0.0; one whose predictions are 100% correct has an AUC of 1.0." 640 | ], 641 | "metadata": { 642 | "id": "yjGRyWy8CL6T" 643 | } 644 | }, 645 | { 646 | "cell_type": "code", 647 | "source": [ 648 | "# ROC - AUC\n", 649 | "def plot_roc(y_true, y_pred_cnn):\n", 650 | " '''\n", 651 | " Plots ROC curves for the CNN models.\n", 652 | " '''\n", 653 | " plt.figure(figsize=(8, 8))\n", 654 | "\n", 655 | " # ROC of CNN\n", 656 | " fpr, tpr, _ = roc_curve(y_true, y_pred_cnn, pos_label=1)\n", 657 | " auc = roc_auc_score(y_true, y_pred_cnn)\n", 658 | " legend_string = 'CNN Model - AUC = {:0.3f}'.format(auc)\n", 659 | " plt.plot(fpr, tpr, color='red', label=legend_string)\n", 660 | "\n", 661 | " # ROC of chance\n", 662 | " plt.plot([0, 1], [0, 1], '--', color='gray', label='Chance - AUC = 0.5')\n", 663 | "\n", 664 | " # plot aesthetics\n", 665 | " plt.xlabel('False Positive Rate')\n", 666 | " plt.ylabel('True Positive Rate')\n", 667 | " plt.grid('on')\n", 668 | " plt.axis('square')\n", 669 | " plt.legend()\n", 670 | " plt.tight_layout()\n", 671 | " plt.title('ROC Curve', fontsize=10)\n", 672 | " pass" 673 | ], 674 | "metadata": { 675 | "id": "EqZQyaXUIAc3" 676 | }, 677 | "execution_count": null, 678 | "outputs": [] 679 | }, 680 | { 681 | "cell_type": "code", 682 | "execution_count": null, 683 | "metadata": { 684 | "id": "1lFySboKMYgu" 685 | }, 686 | "outputs": [], 687 | "source": [ 688 | "# plot ROC\n", 689 | "y_pred = [1 if pred >= 0.5 else 0 for pred in cnn_y_hat_prob]\n", 690 | "plot_roc(y, cnn_y_hat_prob)\n", 691 | "plot_roc(y, y_pred)" 692 | ] 693 | }, 694 | { 695 | "cell_type": "markdown", 696 | "source": [ 697 | "**CONFUSION MATRIX** \n", 698 | "" 699 | ], 700 | "metadata": { 701 | "id": "7bYlLxktcI9b" 702 | } 703 | }, 704 | { 705 | "cell_type": "code", 706 | "source": [ 707 | "plt.figure(figsize=(5,5))\n", 708 | "sns.heatmap(confusion_matrix(y, y_pred), annot = True, cbar = False, fmt='.0f')\n", 709 | "plt.show()" 710 | ], 711 | "metadata": { 712 | "id": "-1ZDcT2uVYC0" 713 | }, 714 | "execution_count": null, 715 | "outputs": [] 716 | }, 717 | { 718 | "cell_type": "markdown", 719 | "source": [ 720 | "## Task for you (Your chance to earn a certificate on completion!)\n", 721 | "\n", 722 | "- Use data augmentation to increase the size of the training data and train the model again.\n", 723 | "- If you are familar with transfer learning do try to implement and see if you get even better results.\n", 724 | "- In either of the cases write your conclusion based on what you changed and how you try it.\n", 725 | "\n", 726 | "Submit your solution notebook using [this](https://forms.gle/Yz4mm4Lq29zA1WhF9) form! All the Best!" 727 | ], 728 | "metadata": { 729 | "id": "dfG-qanWGQjd" 730 | } 731 | } 732 | ], 733 | "metadata": { 734 | "colab": { 735 | "provenance": [], 736 | "private_outputs": true 737 | }, 738 | "kernelspec": { 739 | "display_name": "Python 3", 740 | "name": "python3" 741 | }, 742 | "language_info": { 743 | "name": "python" 744 | }, 745 | "accelerator": "GPU", 746 | "gpuClass": "standard" 747 | }, 748 | "nbformat": 4, 749 | "nbformat_minor": 0 750 | } --------------------------------------------------------------------------------