diff --git a/Ex12Q1.py b/Ex12Q1.py new file mode 100755 index 0000000..d677ae2 --- /dev/null +++ b/Ex12Q1.py @@ -0,0 +1,23 @@ +import numpy +import pandas +import plotnine +from plotnine import * +from scipy.optimize import minimize +from scipy.stats import norm + +chicken=pandas.read_csv("chickwts.txt", sep=",") +chicken.shape +ggplot(chicken,aes(x="feed",y="weight"))+geom_dotplot(binaxis="y",stackdir="center", stackratio=0.5, dotsize=0.2)+theme_classic() + +#subset data into different data frames +sub1=chicken.loc[chicken.feed.isin(['soybean','sunflower']),:] + +#Make new data frame with 'group' column (your x=0 or x=1) +#var2=pandas.DataFrame({'y':var1.col2name, 'x':}) +sub1frame=pandas.DataFrame({'y':sub1.feed,'x':0}) + +#Designate 'treatment' group as x=1 +#var2.loc[var1.col1name=='name of treatment group', 'x']=1 +sub1frame.loc[sub1.weight=='sunflower','x']=1 + + diff --git a/Ex12Q2.py b/Ex12Q2.py new file mode 100755 index 0000000..c31e30f --- /dev/null +++ b/Ex12Q2.py @@ -0,0 +1,4 @@ +import numpy +import pandas +import re + diff --git a/Exercise12-Q1.html b/Exercise12-Q1.html new file mode 100644 index 0000000..ed21850 --- /dev/null +++ b/Exercise12-Q1.html @@ -0,0 +1,12715 @@ + + + +Exercise12-Q1 + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+

Exercise 12: Question 1

Dataset- chichwts.txt

This dataset describes the attributes of chicks. The first column contains the weights of the chicks in a numeric value and the second column contains a character string which describes the type of feed they received.

+

Import Necessary Packages and Data

+
+
+
+
+
+
In [4]:
+
+
+
#Import packages
+import numpy
+import pandas
+import scipy
+import scipy.integrate as spint
+from scipy.stats import norm
+from scipy.optimize import minimize
+from scipy.stats import chi2
+import plotnine
+from plotnine import *
+
+#Load Data
+chicken=pandas.read_csv("chickwts.txt", sep=",")
+
+ +
+
+
+ +
+
+
+
+
+

Part 1: Generate a Plot to Summarize Data

+
+
+
+
+
+
In [5]:
+
+
+
#Generate plot that shows the weights of chicks vs. feed type(scatter)
+plot1= ggplot(chicken,aes(x="feed",y="weight"))+geom_dotplot(binaxis="y",stackdir="center", stackratio=0.5, dotsize=0.2)+theme_classic()
+
+print plot1
+
+#Generate plot that shows average weight vs. feed type (bar)
+plot2= ggplot(chicken, aes(y="weight",x="feed"))+geom_bar(stat="summary",fun_y=numpy.mean)
+print plot2
+
+ +
+
+
+ +
+
+ + +
+ +
+ + + + +
+ +
+ +
+ +
+ +
+ + +
+
<ggplot: (7535692365)>
+
+
+
+ +
+ +
+ + + + +
+ +
+ +
+ +
+ +
+ + +
+
<ggplot: (7535781365)>
+
+
+
+ +
+
+ +
+
+
+
+
+

Part 2: Null Hypotheses for Difference in Chick Weight (Soybean vs. Sunflower)

Hypotheses

    +
  • Null Hypothesis: There is no difference in chick weight when fed soybean or sunflower seed.
  • +
  • Alternative Hypothesis: There is a significant difference in chick weight between those fed soybean feed and those fed sunflower seed.
  • +
+ +
+
+
+
+
+
In [6]:
+
+
+
#Subset the Data to Only Have the Types of Feed we are Interested in
+chicksub=chicken.loc[chicken.feed.isin(['soybean', 'sunflower']),:]
+
+#Make Dataframe for Modeling
+chickFrame= pandas.DataFrame({'y':chicksub.weight,'x':0})
+chickFrame.loc[chicksub.feed=='sunflower','x']=1
+
+ +
+
+
+ +
+
+
+
+
+

Part 3: Test Null Hypothesis Using Likelihood Ratio Test

    +
  • Step 1: Define Null Model
  • +
  • Step 2: Define Alternative Model
  • +
  • Step 3: Run/Generate Likelihood Ratio Tests
  • +
+ +
+
+
+
+
+
In [12]:
+
+
+
#Define Null
+def nllikeNull(pNull,obsNull):
+    B0Null=pNull[0]
+    sigmaNull=pNull[1]
+    expectedNull=B0Null
+    nllNull=-1*norm(expectedNull,sigmaNull).logpdf(obsNull.y).sum()
+    return nllNull
+
+#Define Alternative
+def nlllikeAlt(pAlt,obsAlt):
+    B0Alt=pAlt[0]
+    B1Alt=pAlt[1]
+    sigmaAlt=pAlt[2]
+    expectedAlt=B0Alt+B1Alt*obsAlt.x
+    nllAlt=-1*norm(expectedAlt,sigmaAlt).logpdf(obsAlt.y).sum()
+    return nllAlt
+
+ +
+
+
+ +
+
+
+
In [8]:
+
+
+
#Null Model
+initialGuessNull=numpy.array([1,1])
+fitNullChickFrame=minimize(nllikeNull,initialGuessNull, method="Nelder-Mead",options={'disp':True},args=chickFrame)
+print("Estimated Parameters: Null Model")
+print(fitNullChickFrame.x)
+print("NLL: Null Model")
+nllNullChickFrame=fitNullChickFrame.fun
+#Print NLL value for Null Model
+print(nllNullChickFrame)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Optimization terminated successfully.
+         Current function value: 145.240592
+         Iterations: 85
+         Function evaluations: 162
+Estimated Parameters: Null Model
+[ 284.49999051   64.53691755]
+NLL: Null Model
+145.240592097
+
+
+
+ +
+
+ +
+
+
+
In [13]:
+
+
+
#Alternative Model
+initialGuessAlt=numpy.array([1,1,1])
+fitAltChickFrame=minimize(nlllikeAlt,initialGuessAlt,method="Nelder-Mead",options={'disp':True},args=chickFrame)
+print("Estimated Parameters: Alternative Model")
+print(fitAltChickFrame.x)
+print("NLL: Alternative Model")
+nllAltChickFrame=fitAltChickFrame.fun
+#Print NLL value for Alternative Model
+print(nllAltChickFrame)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
Optimization terminated successfully.
+         Current function value: 138.469162
+         Iterations: 200
+         Function evaluations: 363
+Estimated Parameters: Alternative Model
+[ 246.42855057   82.48813575   49.73948886]
+NLL: Alternative Model
+138.469161825
+
+
+
+ +
+
+ +
+
+
+
+
+

Part 4: Interpret Results of Likelihood Ratio Test

    +
  • Step 1: Calculate D value
  • +
  • Step 2: Calculate p value
  • +
+
Conclusions:

As our p-value was less than 0.05, we can report that our alternative hypothesis was correct. This means that there is a significant difference between the chicks who were fed soybean feed vs. those who were fed sunflower feed.

+ +
+
+
+
+
+
In [14]:
+
+
+
#Calculate D value
+DchickFrame=2*(nllNullChickFrame-nllAltChickFrame)
+print("D Value")
+print(DchickFrame)
+
+#Calculate p value
+pChickFrame=1-scipy.stats.chi2.cdf(x=DchickFrame,df=1)
+print("p-value")
+print(pChickFrame)
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
D Value
+13.5428605444
+p-value
+0.000233176728695
+
+
+
+ +
+
+ +
+
+
+ + + + + + diff --git a/Exercise12-Q1.ipynb b/Exercise12-Q1.ipynb new file mode 100644 index 0000000..029a08c --- /dev/null +++ b/Exercise12-Q1.ipynb @@ -0,0 +1,288 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Exercise 12: Question 1\n", + "\n", + "### Dataset- chichwts.txt\n", + "This dataset describes the attributes of chicks. The first column contains the weights of the chicks in a numeric value and the second column contains a character string which describes the type of feed they received.\n", + "\n", + "#### Import Necessary Packages and Data" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "#Import packages\n", + "import numpy\n", + "import pandas\n", + "import scipy\n", + "import scipy.integrate as spint\n", + "from scipy.stats import norm\n", + "from scipy.optimize import minimize\n", + "from scipy.stats import chi2\n", + "import plotnine\n", + "from plotnine import *\n", + "\n", + "#Load Data\n", + "chicken=pandas.read_csv(\"chickwts.txt\", sep=\",\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 1: Generate a Plot to Summarize Data" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAhoAAAFzCAYAAAB4qqApAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAAPYQAAD2EBqD+naQAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMS4wLCBo\ndHRwOi8vbWF0cGxvdGxpYi5vcmcvpW3flQAAIABJREFUeJzs3XlcVPX+P/DXmYVhE2URxAVwX8uA\nXMK91NJcct9QUxHFTPOWfStvN73Xe+223DLNNDClEDRNLbPcEkUpl8A9xI3FBUURQWYGmOX8/vDH\nPEC0EObMmcHX8/Hw8YBzZubzPscBXnOW90cQRVEEERERkQQUchdAREREtReDBhEREUmGQYOIiIgk\nw6BBREREkmHQICIiIskwaBAREZFkGDSIiIhIMgwaREREJBkGDSIiIpIMgwYRERFJ5rELGjqdDqmp\nqdDpdHKXQkREVOs9dkHj7NmzCA0NxdmzZ+UuhYiIqNZ77IIGERER2Q6DBhEREUmGQYOIiIgkw6BB\nREREkmHQICIiIskwaBAREZFkGDSIiIhIMgwaREREJBkGDSIiIpIMgwYRERFJhkGDiIiIJMOgQURE\nRJJh0CAiIiLJMGgQERGRZBg0iIiISDIMGkRERCQZBg0iIiKSDIMGERERSYZBg4iIiCTDoEFERESS\nYdAgIiIiyTBoEBERkWQYNIiIiEgyDBpEREQkGQYNIiIikgyDBhEREUmGQYOIiIgkw6BBREREkmHQ\nICIiIskwaBAREZFkGDSIiIhIMgwaREREJBkGDSIiIpIMgwYRERFJhkGDiIiIJMOgQURERJJh0CAi\nIpKBwWCAVquFKIpylyIpBg0iIiIbKSwsxIoVK9CuXTs4OTnB3d0dbm5umDZtGlJSUuQuTxIMGkRE\nRDZw+PBhNG3aFLNnz8bZs2cty/V6Pb7++ms8/fTTmDVrFoxGo4xVWp9K7gKIiIhqu5MnT+LZZ59F\nSUnJA0+VlIWLlStXwmg0YtWqVRAEwdZlSoJHNIiIiCQ2Y8YMlJSUwGQy/enjRFFEdHQ0kpOTbVSZ\n9Bg0iIiIJHTixAkcOnToL0NGGZVKheXLl0tcle0waBAREUkoPj4eKlXVr1QwGo347rvvUFxcLGFV\ntsOgQUREJKGcnJxHvoXVaDTi9u3bElVkWwwaREREEtJoNNW6sFOj0UhQje0xaBAREUnoqaeeqvL1\nGWX8/f3h6ekpUUW2xaBBREQkofDw8Ec6OqFQKDB79mwoFLXjT3Tt2AoiIiI7VbduXcyaNatKwUGh\nUMDV1RURERE2qMw2GDSIiIgktmTJEjz33HN/eq2GUqmEk5MTtm3bBl9fXxtWJy0GDSIiIok5OTnh\nxx9/xBtvvAFXV1cIggC1Wg2VSmW59TU0NBQHDhxA79695S3WygSxtk8bd5/U1FSEhoYiJSUFISEh\ncpdDRESPmaKiIsTHx+PYsWMoKSmBn58fxo4di44dO8pdmiQ414md0+v1uHTpkuXN2KhRI7lLIiKi\nGnB3d0dkZKTcZdgMT53YqXPnzmHu3Lnw9fVFhw4dEBoaisaNGyMsLAzx8fG1bnY/IiKqnRg07NCm\nTZvQoUMHrFixAkVFRRXWHTlyBBMmTMDAgQMrrSMiIrI3DBp2Zs+ePRgzZgyMRuMDj1qUNX3Zu3cv\nRo4cCbPZbOsSiYiIqoxBw46IoojZs2dDFMW/7ItvMpmwc+dO/PTTTzaqjoiI6NExaNiRpKQkpKen\nV3nyHaVSiWXLlklcFRERUfXZ1V0nhYWFiIqKgr+/Pz766CMAQFZWFpYtW4bMzEz4+fkhMjKywi1A\nycnJiI2NRX5+Plq3bo05c+Y4bKOTLVu2QKVSVflCT5PJhF27dkGr1cLNzU3i6oiIiB6dXR3RWLNm\nDZo0aWL53mg0YvHixejcuTMSEhIwduxYLFmyBHfu3AEAXLlyBUuXLkVUVBTi4uIQFBSEDz74QK7y\naywvL++RpxIGYNkfRERE9sZugsbp06dx9epV9O3b17Ls1KlTKC4uxogRI6BWq9GjRw8EBAQgOTkZ\nAJCYmIiQkBAEBwdDo9Fg/PjxyMjIQHZ2tlybUSNubm7VmkrY1dVVgmqIiIhqzi6ChsFgwKpVqxAV\nFVXhD212djaCgoKgVCoty5o1a4asrCwA906rNG3a1LLO1dUVDRo0sKx3NN27d3+k/hiCIKB169ao\nV6+ehFURERFVn10Eje+++w4dO3asEBqAe10x77/2wM3NDXq9HgBQXFz8p+vL5OTkIDU1FampqUhL\nS5NgC6xj5MiRjxwa5syZU62jIERERLYge9C4du0afvnlF4wfP77SOhcXF2i12grLtFotXFxcAADO\nzs7Q6XQV1ut0Osv6MqtWrUJoaChCQ0MRHh5u5S2wHmdnZyxYsKBKj1UqlWjYsCEmTpwocVVERETV\nJ/tdJ2lpacjPz8fMmTMBAKWlpSgtLcWkSZMwa9YsZGZmwmw2Q6G4l4kyMjLQs2dPAEBgYCAuXbpk\neS29Xo/r168jMDCwwhgzZszAkCFDLOPZc9h4/fXXcenSJXzxxRcQBOGBF4eqVCp4enpi9+7dqFOn\njgxVEhERVY3sQaN79+4VZlE9cOAAEhMT8Y9//AN16tSBRqPB5s2bMXToUBw+fBhZWVno1q0bAKB3\n7954/fXXcfz4cbRr1w7x8fEICgpCQEBAhTH8/f3h7+9v0+2qLkEQ8PnnnyMkJAT//e9/ceHCBSgU\nCigUCphMJqjVaowfPx7//Oc/K9yhQ0REZI9kDxoajQYajcbyvZubG5RKJTw9PQEAf//737F8+XKs\nX78evr6+ePvtty3XMTRp0gRz5szB559/bumj8eabb8qyHdYkCAIiIiIwbdo0JCUl4dixYyguLoaf\nnx+GDh0KLy8vuUskIiKqEkGsTuMGB5aamorQ0FCkpKRUOJJCRERE1if7xaBERERUezFoEBERkWQY\nNIiIiEgyDBpEREQkGQYNIiIikgyDBhEREUmGQYOIiIgkw6BBREREkmHQICIiIskwaBAREZFkGDSI\niIhIMgwaREREJBkGDSIiIpIMgwYRERFJhkGDiIiIJMOgQURERJJh0CAiIiLJMGgQERGRZBg0iIiI\nSDIMGkRERCQZBg0iIiKSDIMGERERSYZBg4iIiCSjkruA2uru3bvIz8+Hi4sLfHx8IAgCAECv1yMv\nLw8qlQo+Pj5Qqe79FxgMBty6dQtmsxk+Pj7QaDQAALPZjFu3bqGkpAReXl5wc3MDAIiiiNu3b0Or\n1aJu3bqoW7euZezCwkLcuXMHrq6u8Pb2toyt0+mQl5cHJycn+Pj4QKlU2nKXEBE5lAsXLmDlypXY\nunUr7ty5A3d3dzz//PMYM2YMjh49iri4OFy/fh0ajQadOnXCtGnTcP36dcTExCAjIwMKhQKtW7fG\n9OnTodFosHr1apw4cQJGoxGNGzfGlClT0Lp1a8TGxuLAgQPQ6XTw8fHB2LFj8eyzz2Lz5s3Ytm0b\nCgoKUKdOHQwcOBCjRo3CwYMHkZCQgNzcXDg7OyMsLAwvv/wysrKysHr1amRnZ0OhUKB9+/aIiorC\nkCFDoFarZduPgiiKomyjyyA1NRWhoaFISUlBSEiIVV/bZDJh27ZtWL58OX755RfL8qCgIAwaNAg5\nOTn4/vvvYTQaAQCenp4YNWoUSktLsWnTJhQVFQEAnJ2dMWLECHh4eGDLli24fv06AEChUOCFF15A\nixYtsHv3bqSlpVnG6Nq1K7p06YLU1FQcOHDAsrxFixYYMGAAsrOz8eOPP8JkMgEA6tevj5kzZyIy\nMhKNGze26n4gInJkBoMBs2fPxpdffgmlUmn5vQnc+z1sNpsrPaf88vJfC4KAsj+zVXlueeWfW9Xn\nl39OWe0NGzbEDz/8gNDQ0CrvA2ti0LCSwsJCDB8+HL/88kulN6a9UiqVUKvV2LhxIwYNGiR3OUSy\n0Gq1iI+Px8qVK3HhwgWYzWYEBQVh6tSpqF+/PtauXYvU1FSUlpbCx8cHEydOxFNPPYVNmzZh9+7d\n0Ov1qFOnDoYNG4ZZs2bhiSeekHuTqAbMZjPGjh2LTZs2obb8eVQqlXByckJycjKCg4NtPj6DhhUY\nDAb07dsXycnJDhEwyhMEAUqlErt27UKfPn3kLofIpvbs2YORI0eisLAQgiA80qfN+5erVCoYjUaE\nh4cjJibGcvqTHMvXX3+NyZMny12G1SmVSjRr1gzp6emW0+m2wotBrSA+Ph5JSUkOFzKAe9d6mM1m\nREZG1pr0TlQViYmJGDBgAO7evWv5OXiQqi4vOyUaHx+PUaNGOeTvAwI+/fRTKBS170+jyWTC+fPn\nkZiYaPOxa9/elMFnn33m0G9Ms9mMCxcuYN++fXKXQmQTBoMBY8eOhdlsfmiQqC6z2Yxt27YhNjbW\nqq9L0jt9+jSOHTtm9feEvVCpVPjqq69sPq7j/nW0E5mZmUhNTXX4N6ZKpcKGDRvkLoPIJrZu3Yrc\n3FzJfm4VCgWWLl3Ko4QOJjMzU+4SJGU0GnHhwgWbj8ugUUM3b96UuwSrMJlMyM3NlbsMIptYs2aN\npLd3m81mnDx5EqdPn5ZsDLI+Rz4yXVVytDWo/XtVYs7OznKXYBWCIMDFxUXuMohsIiMjwybXUFy+\nfFnyMch6WrduLXcJklKpVGjXrp3Nx2XQqKEWLVrAw8ND7jJqTBRFdO7cWe4yiGyirFFebRmHrKN5\n8+bo1atXrW1maDQaERkZafNxGTRqyMXFBREREQ7/xtRoNLXyli6iB3nyySclDwGCINT6T8i10d/+\n9rdaeceQUqlEp06d0KlTJ5uPzaBhBbNnz4aTk5PDnt8TBAGzZs1CvXr15C6FyCZmzpxpuR1VCkql\nEs8//zwCAwMlG4OkMWTIELz++utyl2FVKpUK3t7e2LhxoyzjO+ZfRjvTtGlTbNmyBSqVyuGObAiC\ngBdffBHvv/++3KUQ2Uz37t3RsWNHyY5qmEwmzJs3T5LXJul9+OGHeP/99+Hs7AxBECo0uCr/dfnf\n9+U/aJZ/X5V/zMMeX/7r+5tpPWzshz2//BhldYSGhuLIkSOyBV92BrWiI0eO4I033sCBAwegVCqh\nUCggiiKMRiNcXFxQXFxs6cQJ3LuX38nJCWazGSaTqcIEa0qlEiqVCiUlJZbJcMoe5+rqCp1OB5VK\nZelmaDKZ4ObmBq1WW+WxPT09MXfuXCxYsIDnkumxk5GRgS5duiA/P9/qRzcWLlyI9957z6qvSbZX\nWFiIuLg4bNu2DXl5efDw8EDfvn0RHh6OX3/9FQkJCcjJyYGLiwuefvppTJ8+HVeuXMGaNWtw6dIl\nKBQKtGnTBhEREXB2dkZ0dDROnjyJ0tJSBAUFYeLEiWjfvj1Wr16N5ORkaLVa+Pr6YuTIkejfvz82\nbtyIn376Cbdv34anpyf69euH8ePHY9++fdiwYQOuX78ONzc3dOnSBREREbh48SJiY2ORkZEBpVKJ\n9u3bY/r06bLNcVKGQUMCaWlp2LJlC/Ly8uDq6opnnnkGzz//PHJzc7F+/XpcvXoVarUa7du3x4gR\nI2A0GrFhw4YK8yyMHTsWderUwffff49jx46hpKQEfn5+GDVqFAIDA7Fv3z4kJiaiqKgInp6eGDRo\nEIKDg3Hq1Cl8//33uH37Ntzc3NCzZ08899xzuHr1Kr799lvk5OTAyckJTz75JIYNG8Y2yfRYy87O\nRnh4OA4cOGBpIQ6gwnxF5VuNl19e9ulSFEXLY+rWrYslS5YgKipKhq0hsk8MGkT02Dt16hRWr16N\n8+fPw2w2o2nTppgyZQr8/f0RExODY8eOobi4GA0aNMDYsWPRtWtXxMXFITExEYWFhfD29sagQYMw\natSoWnPLO5G1MGgQERGRZHgxKBEREUmGQYOIiIgkw6BBREREkmHQICIiIsmweQIREVXL0aNHsWrV\nKpw8eRIGgwGBgYGYNGkS2rdvj6+++goHDhyAVquFn58fRo4cifHjx8Pd3V3ussnGeNcJERE9ksuX\nL2PkyJE4cuRIhf4j5XuOlP+6rOeIq6srPvzwQ/YZeczwiAYREVXZ5cuX0blzZ9y6dQsAKnRVLQsW\n939d9nlWq9Vi1qxZKCgowFtvvWWjikluvEaDiIiqLDw8HLdu3apR2/a3334bhw4dsmJVZM8YNIiI\nqEpOnTqFpKSkGs8No1Kp8Nlnn1mpKrJ3DBpERFQlMTExVpmA0Wg0YuPGjcjPz7dCVWTvGDSIiKhK\n0tPTrTbTrdFoRHZ2tlVei+wbgwYREVVJ+Qs8reExu+nxscWgQUREVdK8eXOrnDoB7t3+2rhxY6u8\nFtk3Bg0iIqqSadOmWeXUiUqlwtChQ+Hj42OFqsjeMWgQEVGVPP300wgNDYVSqazR6xiNRrz66qtW\nqorsHYMGERFVWXx8PDw8PGoUNt5880306dPHilWRPWPQICKiKmvVqhV+/fVXNG3aFAAqBI6yVuPA\nvWswylMoFFCpVPjnP/+J999/3zbFkl1gC3IiInokbdq0QXp6Onbv3o0vvvgCJ06cgNFoRJMmTTBl\nyhS0adMGa9aswYEDB6DX6+Hj44MxY8Zg6tSp8PPzk7t8sjFOqkZERESS4akToseI0WjE5s2b0bdv\nX3h6esLNzQ1BQUF49913cfnyZbnLI6JaiEGD6DGRnp6OVq1aYcSIEdi3bx/u3LkDnU6HrKwsLFmy\nBEFBQVi8eDGbKBGRVVUraCQlJaGoqOiB64qKipCUlFSjoojIujIyMhAWFmZp+WwymSqsN5lMMJvN\nePfdd/Hee+/JUSIR1VLVChp9+vTBH3/88cB16enpvG2JyM5ERkaioKCgUsB4kH/96184duyYDaoi\nosdBtYLGnx1a1Wq1cHFxqXZBRGRd586dw549e6oUMoB7XRuXL18ucVVE9Lio8u2thw4dwq+//mr5\nPj4+HgcPHqzwmOLiYnz//fdo27at9Sokohr55ptvoFQqqxw0jEYj1q1bhy+++AJOTk4SV0dEtV2V\ng8bOnTuxaNEiAPeasnz22WeVHqNWq9G2bVusWLHCehUSUY1UZyrukpIS5OXlwd/fX4KKiOhxUuVT\nJ++99x7MZjPMZjNEUcShQ4cs35f9KykpwfHjxxEWFiZlzUT0CFQqVYWOjY/yPCKimqrWbxKz2Wzt\nOohIIu3atXvkn1kvLy94eXlJVBERPU6q/ZHFZDLh8OHDuHLlCoqLiyutnzRpUpVfa/ny5fj999+h\n1+tRp04d9O/fH6NHjwYAZGVlYdmyZcjMzISfnx8iIyPRsWNHy3OTk5MRGxuL/Px8tG7dGnPmzIGv\nr291N4uo1pk8eTLefvvtKocNpVKJqKioGs/QSUQEABCrISUlRQwMDBQVCoUoCEKlfwqF4pFeLysr\nSywuLhZFURRzc3PFWbNmiQcOHBANBoMYEREhbtiwQSwtLRWTkpLEMWPGiPn5+aIoiuLly5fFUaNG\niampqWJxcbEYHR0tvv76639ZOwAxJSWlOptO5JCmTZsmKpVKEcCf/hMEQXRychKzs7PlLpmIaolq\n3d4aFRWFunXrYu/evbhx4wby8/Mr/Lt9+/YjvV5AQAA0Go3le0EQcO3aNZw6dQrFxcUYMWIE1Go1\nevTogYCAACQnJwMAEhMTERISguDgYGg0GowfPx4ZGRnVuviNqDb79NNP0bFjxz89SiEIAgRBQEJC\nApo0aWLD6oioNqvWqZMzZ85g48aN6NWrl9UKiY2NxY8//oiSkhL4+vqiT58++PXXXxEUFFThl2Oz\nZs2QlZUF4N5plZYtW1rWubq6okGDBsjKykJAQIDVaiNydO7u7ti/fz9mzJiB9evXQxAEy+2uKpUK\nRqMRjRs3RnR0NJ5//nmZqyWi2qRaQaNVq1YoLCy0aiGTJ0/GpEmTcOHCBRw6dAhubm7Q6/Vwc3Or\n8Dg3Nzfk5uYCuNe340Hr9Xp9hWU5OTnIyckBAKSlpVm1biJH4e7ujnXr1uGDDz5ATEwMjh07Br1e\njwYNGmDcuHHo378/FApOf0RE1lWtoPHJJ59g7ty56NixI9q0aWO1YgRBQMuWLZGSkoKEhAT4+PhA\nq9VWeEz5zqPOzs7Q6XQV1ut0ukqdSVetWmXpAUL0uGvUqBHnMyEim6ly0HjiiScq3Iufk5ODDh06\noGHDhqhXr16FxwqCgBMnTlS7KLPZjJycHISEhGDTpk0wm82WT1oZGRno2bMnACAwMBCXLl2yPE+v\n1+P69esIDAys8HozZszAkCFDANw7ohEeHl7t2oiIiKjqqhw0QkNDq9X0568UFRXh6NGj6NKlC5yd\nnXH27Fn8/PPPGDNmDJ544gloNBps3rwZQ4cOxeHDh5GVlYVu3boBAHr37o3XX38dx48fR7t27RAf\nH4+goKBK12f4+/uzwyEREZEMBFH8kxnSbKCoqAhLlizBpUuXYDab4eXlhb59+2L48OEQBAGZmZlY\nvnw5MjMz4evrixkzZlToo3Hw4MEKfTTmzp37p300UlNTERoaipSUFISEhNhiE4mIiB5bsgcNW2PQ\nICIisp1qXQw6derUh65TKBSoW7cugoODMXz4cLi6ula7OCIiInJs1Qoax44dw7Vr13Dz5k14eXnB\n19cXubm5uH37NurXrw83NzcsXboUCxYswN69e9G8eXNr101EREQOoFo3zX/44Yfw8PDAgQMHcOvW\nLfzxxx+4desW9u/fDw8PD3z++edIS0uDRqPBm2++ae2aiYiIyEFUK2i88cYbWLhwoeXujzI9evTA\nP/7xD8yfPx8tW7bE22+/jcTERKsUSkRERI6nWqdO0tPTK/XOKOPp6YmLFy8CAJo3b16pSycRka3p\n9Xrcvn0bGo0GXl5elr48paWlyMvLg0KhgLe3N1Sqe78STSYT8vLyYDQa4e3tbZmLSRRF5OfnQ6fT\nwdPTs0Jn4sLCQhQWFqJOnTqoW7euZblOp0N+fj6cnZ3h5eUlSZuA6rp27Rqio6OxYcMG5OXlwcXF\nBb169cKkSZOQlpaG2NhYXLlyBSqVCh07dsS0adNQXFyMmJgYnD17FqIoonnz5pg6dSr8/PywZs0a\nHD58GKWlpWjQoAHCw8PRqVMnrF+/Hrt27UJRURHq1auHYcOGYfDgwdixYwc2bdqE27dvw9XVFc8+\n+ywmTpyIEydO4Ouvv8a1a9egVqsREhKCqKgo9OvXj91rHVC17joJDg5GvXr1sH379goXe2q1Wgwc\nOBBFRUVISUnB+vXr8dZbbyEzM9OaNdcI7zohejyIooi9e/di+fLl+OGHH2A2mwHc64w6bNgwFBQU\nYNOmTZYPQx4eHhg1ahScnJzw7bffIi8vDwCgVqsxbNgw+Pv7Y9u2bZYmgYIgoG/fvujQoQOSk5Nx\n5MgRy9hPPfUU+vTpg7Nnz2Lnzp2WsQMCAjB79mxMnToV3t7ettwdFYiiiH/84x/4z3/+AwCW+oB7\nF/SXfS8IAsr+RJRf/rDHKJVKyxw65ZV/fPnnlH/ugx5Xpmw+ntatW+PHH39EixYtarT9ZFvVChoH\nDx7EgAEDoFar0adPH9SvXx83b97E3r17YTQasWPHDnTr1g3vvPMOSktL8dFHH0lRe7UwaBDVfiUl\nJXj55Zexfv16yx8pe6FQKODh4YHt27cjLCzM5uOLooh58+Zh6dKlNh+7plQqFerWrYujR4+iadOm\ncpdDVVTtPhrXr1/H//73P/z+++/IycmBv78/OnXqhHnz5qFBgwbWrtNqGDSIajdRFDFu3Dhs3Ljx\ngZ+O7YFCoYCzszN+/fXXCg0IbWH37t3o37+/Tce0JqVSie7du2Pfvn1yl0JVxIZdRFSrOMofUqVS\niW7dumH//v02Hbfs2gh7OspTHWfOnEG7du3kLoOqgFfVEFGtsmzZMstFnfbMZDIhKSkJaWlpNhsz\nNzcX27dvd/iQoVKpsGbNGrnLoCqq8k/jk08+ifj4eHTo0KHSTK73q+nsrURE1aHVarF9+3a7PWVy\nP6VSiQ0bNmDhwoU2Ge/y5cuoDQexTSaTXd1kQH/ukWZvLbuVS6qZXImIauL27dsOEzKAe9dq3Lx5\n06bj1QaCINSabXkcVDlolD9MtXbtWilqISKqEWdnZ7lLeGS2rDkoKMju7sKpDkEQ0LJlS7nLoCqq\ncSQURRHXrl1z+DcuETk+b29vNGnSRO4yqsxgMKBTp042G8/T0xMjR450iGtY/ozZbMa0adPkLoOq\nqNpBY+fOnejatSucnZ3RpEkTnDx5EgAQGRmJdevWWa1AIqKqUigUmD17tsMcVvf29sbw4cNtOubc\nuXMd+oOhUqnE4MGD2UfDgVTrpzEhIQEDBw5E06ZNsWLFigoXFzVv3pxXAxORbKZNm4a6detCqVTK\nXcpfevPNN+Hk5GTTMbt27Yr//ve/Nh3TWlQqFQICAhATEyN3KfQIqhU0/vWvf+G1115DQkICXn75\n5Qrr2rdvj9OnT1ujNiKiR+bt7Y2ff/4ZLi4udh02Jk+ejDfeeEOWsd98802sXLkS7u7uAFDh4v7y\nR4PK779H/br8a/7VXYoP+rr8a5Wd6unVqxcOHTqE+vXrP/T1yP5U60TdpUuXMHDgwAeuc3NzQ0FB\nQY2KIiKqiS5duuDw4cOYN28edu/eDYVCYfkDajAY4OTkZDl9UPYHzWAwQKlUQqFQwGAwQK1WA4Dl\ncRqNBsXFxVCpVBAEAWazGSaTCa6urtDpdJbloijCaDTCxcUFer3e8pplY/j6+uL//u//MG/ePFnv\n3psxYwYmTpyI9evX47vvvsONGzfg7u6O7t27Y+rUqTh9+jS+/vprZGdnw8nJCU8++SQiIyOh0+kQ\nHR2N9PR0mM1my6RqjRo1wpdffonff/8dxcXFaNiwIcaNG4dnnnkG33zzDX755RcUFhbC29sbQ4YM\nwUsvvYQff/wRW7Zswa1bt+Du7o4+ffpg8uTJSE1NRVxcHK5cuQKNRoPg4GDMmDED7du3l21/UfVV\nqzNoUFAQ5s+fj1deeQUmkwlqtRq///47QkJCsHTpUnzxxRc4e/asFPXWGDuDEj1eLl26hG+//Ra5\nubnQaDQICQnB0KFDUVhYiISEBGRlZUGhUKBly5YYM2YMVCoVNm3ahDNnzsBgMKBx48YYO3Ys/Pz8\n8NNPP+G3336DXq+3XF/Rtm1ZDLXoAAAgAElEQVRbHDp0CDt27EBBQQE8PDzQt29f9OjRA+fPn8em\nTZtw8+ZNuLi4oFOnThg8eLDDX4xJf81sNmPPnj2IiYlBWloazGYzWrRogalTp8Lf3x8xMTE4cuQI\nSkpK4O/vjwkTJiAsLAzffPMNdu/ejbt378LLywtDhw7F1KlTHfooTrWCxjvvvIPo6GisX78evXv3\nhlqtRkpKCtRqNZ5//nlERUXh73//uxT11hiDBhERSenUqVMYPnw4Lly4UOF24vKz05af6fZhs+SW\nfa9QKPDWW29h0aJFDnOhc3nVitULFy7EmTNn0K9fP8tUxwMGDMDNmzcxaNAgvPXWW1YtkoiIyBGc\nOnUKYWFh0Ov1AFDhDp/yAaIsZACocEPF/Q3nzGYzzGYzFi9ejFu3bmHFihUO1zCzWkHDyckJ33//\nPRITE7Fr1y7k5eXBy8sLffv2Rd++fa1dIxERkd0zm80YNmwY9Hp9hSBhLStXrkS/fv1sfkt0TVUr\naAwZMgQ9e/ZEjx49sHjxYru+spuIiMgWdu3ahYsXL0r2+kqlEp988onDBY1qnexxdXXFp59+imee\neQb16tVDv3798M9//hP79u1DcXGxtWskIiKye19++aWkH7xNJhMOHjyI8+fPSzaGFKoVNNavX48r\nV67g3LlzWLp0KRo3bozY2Fg899xzqFevHnr06GHtOomIiOxaenq6JKdM7iflURMp1OgeqxYtWqBF\nixbo1asX9u3bh3Xr1mHfvn349ddfrVUfERERObBqBY2zZ89i//79ln83btxA+/bt0bNnT0RFRaFn\nz57WrpOIiMiutWzZ0iZHNRxtnpdqBY127drBxcUFkydPxsqVK9G9e3d4enpau7ZarbS0FD///DMy\nMzMtzYL69esHQRCwf/9+nDlzBkajEY0aNcKLL74IV1dXnDhxAr/99ht0Oh18fHwwcOBA+Pj4ICsr\nC3v27EFBQQHq1KmD5557Ds2aNZN7E8kGiouLsXHjRsTGxuLy5ctQqVR46qmnMH36dOh0OsTExODs\n2bNVahbUtWtXrFu3Drt27bI0C3rppZcsHRw3b96MvLw8uLm54dlnn8XMmTPRqlUruXcBkd2YPn06\nvv/+e8leX6FQoEuXLmjdurVkY0hCrIYXX3xR9PT0FJ2cnMRu3bqJb7/9trhjxw7x7t271Xk5m0pJ\nSREBiCkpKbKMr9VqxQULFoheXl4iAFGhUIgKhUIEINatW9eyXBAEy3IXFxfRz8/PslypVIoARKVS\nKTZs2FAUBMHyfdlj+vfvLyYnJ8uyjWQbW7duFT09PS3vIwAV3gf3f/2wx5T/V/4xZe+lBz2u7Pkj\nR44Ui4qK5N4VRHbBaDSKQUFBD/35ssa/DRs2yL2Zj6xanUH/f0DByZMnkZSUhKSkJBw4cAC3b99G\nx44d0atXL3z00UfVeVnJydkZtKCgAM899xyOHTtWqSmLtSmVSgiCgHXr1mH06NGSjkW2t3HjRowZ\nMwZAxWY/tqZUKtG5c2fs3bsXzs7OstVBZC+OHTuGbt26obS01KqnUARBwJQpUxATE+NwDbuqdUTj\nfteuXRMTEhLE3r17Wz6J2yu5jmiYzWaxb9++kibdB/1TqVTioUOHbLqtJK0bN26ITk5ODz3aYOt/\nCoVCfOedd+TeLUR2IzU1VQwMDLTKUUWFQiEqlUrxzTffFE0mk9ybVi3VukYjMzMT+/fvtxzNuHTp\nEtRqNYKDgzF//nz06tWrOi9bqx0+fBh79uyRZex///vf+OGHH2QZm6wvJiYGRqNR1iMZ5ZnNZqxY\nsQLvvvsuj2oQAQgODsbFixexY8cOrFq1qsJMt9OmTUPDhg0t10np9Xo0bNjQcp1UXFxchUnVXnrp\nJURERMDf31/uzaq2ap06USgUcHZ2RufOndGzZ0/06tULYWFhcHFxkaJGq5Lr1EnZdMzl+97biiAI\nyMzMREBAgM3HJusLCAjA5cuX5S6jkg0bNvA0HRFVUq0jGklJSejcuTOcnJysXU+ttWfPHllCBnDv\nHP7Bgwcxfvx4WcYn6zGZTHYZMlQqlcM1ESIi26hW0Ojevbu166j1dDqdrONrtVpZxycioseT401s\n76Dk7jMi9/hkHUqlEk2aNJG7jEqMRiOaN28udxlEZIcYNGxk1KhRss1y6+zsjH79+skyNlnfzJkz\noVDY149uvXr1MGTIELnLICI7ZF+/rWqxmTNnSt4740FUKhUmTZqEunXr2nxskkZERARUKpXd3Euv\nUCgwa9Ys3nFCRA/EoGEjzZs3x5w5c2z6x0GpVMLDwwPvvPOOzcYk6fn6+iIuLg4AZA8bSqUSXbp0\nwbvvvitrHURkvxg0bOjjjz/G1KlTAUDy0yhKpRJeXl7Yu3cvAgMDJR2LbG/UqFHYsmUL6tWrBwAV\nTqWUf2+V//phjynv/lMyZUHm/kBT9vxhw4Zh9+7dPJpBRA9V7RbkjkrOFuTAvVtNf/rpJyxbtgy7\ndu2yNF1SKBTo1asXVCoVEhMTK9wK+/TTT8PPzw9JSUm4e/euZXmLFi3Qrl07HD16FDk5OZblvr6+\neOWVVzBz5kz4+vrabuPI5oqLi7Fp0ybExsYiOzsbarUaHTt2RGRkJHQ6Hb788ssKzYLKGv9ER0fj\n6NGjKC4uhr+/P8LDw9G1a1d88803lZoFvfTSS9i+fTs2bdqEvLw8uLu7c1I1IqoyBg0ZXbt2DZcv\nX4ZSqURgYCDq168PAMjPz8elS5dgMBjQsGFDS6MtvV6P9PR06PV6eHl5oVWrVhAEASaTCWlpaSgs\nLESdOnXQtm1bqFTVunOZiIjIqhg0iIiISDK8RoOIiIgkw6BBREREkmHQICIiIskwaBAREZFkGDSI\niIhIMgwaREREJBkGDXJIxcXFiIuLQ1hYGOrWrQt3d3e0bNkS//73v7F+/XoMHjwYXl5ecHV1RaNG\njfC3v/0N586dk7tsIqLHDvtokMM5evQoBg0ahNzcXCgUigdOVnf/cqVSCZPJhDlz5uB///ufbDPp\nEhE9btg+khzK8ePH0atXL5SWlgLAQ2fEvX+5yWQCACxbtgxarRbR0dGyT0hGRPQ44KkTchiiKGLC\nhAkoLS21BIfqvMbq1avx888/W7k6IiJ6EAYNchgHDx7EH3/8Ue2QUUapVGLZsmVWqoqIiP4MgwY5\njNjYWKtMFmcymbBz507cuHHDClUREdGfYdAgh5GZmQmj0WiV1xJFEVevXrXKaxER0cMxaJDDUKvV\ndv16RERUGYMGOYwOHTpY5dQJAGg0GgQGBlrltYiI6OEYNMhhTJ8+3SqnTlQqFSZMmAAPDw8rVEVE\nRH+GQYMcRqtWrfDCCy/UuNmWyWTCq6++aqWqiIjozzBokEP5+uuvERQUVKOwsXLlSjz11FNWrIqI\niB6GQYMcSv369XHo0CEMGDAAACoEjvJfC4Jg6fxZttzX1xcbNmxAZGSkDSsmInq8sQU5ORwfHx9s\n27YNFy9eRExMDM6cOYPS0lI0adIEEydORJs2bbB27Vr89ttv0Ol08PHxwYgRIzB48GDeaUJEZGOc\nVI2IiIgkw1MnREREJBkGDSIiIpIMgwYRERFJhkGDiIiIJCP7XScGgwErV67EiRMncPfuXfj4+GD0\n6NHo1asXACArKwvLli1DZmYm/Pz8EBkZiY4dO1qen5ycjNjYWOTn56N169aYM2cOfH195docIiIi\nKkf2IxomkwleXl5YvHgxEhIS8Morr+CLL77A2bNnYTQasXjxYnTu3BkJCQkYO3YslixZgjt37gAA\nrly5gqVLlyIqKgpxcXEICgrCBx98IPMWERERURnZg4azszMmTJiABg0aQKFQoF27dmjbti3S0tJw\n6tQpFBcXY8SIEVCr1ejRowcCAgKQnJwMAEhMTERISAiCg4Oh0Wgwfvx4ZGRkIDs7W+atIiJyfGaz\nGQUFBdBqtSjfCUEURRQVFaGwsBD3d0jQ6/W4c+cOzGZzheWlpaXIz8+vNF+R0WhEfn4+SkpKpNsQ\nkpXsp07uV1xcjAsXLmDw4MHIzs6u1G66WbNmyMrKAnDvtErLli0t61xdXdGgQQNkZWUhICDA5rUT\nEdUGJ06cwBdffIGvv/4aer0eANC4cWOMHz8epaWliIuLw61btwAAdevWxYQJE+Dp6YkNGzbgwoUL\nAAAnJyeMHDkSrVq1wo4dO3Do0CEAgEKhQL9+/RAWFoajR4/ip59+soSSkJAQvPrqqxgzZgxcXFxk\n2HKSgl0FDbPZjE8//RQtW7ZEcHAwzp07Bzc3twqPcXNzQ25uLoB7oeRB68t+MMrk5OQgJycHAJCW\nlibhFhAROS6z2YwFCxbg/fffh0qlqnD04cqVKw88NV1QUIAVK1ZUWl5aWor4+HgAsEwHUDbGzp07\nsXPnzkrPOX78OKZMmYKFCxdi9+7dFT5IkuOym6AhiiJWrFiB27dvY9GiRRAEAS4uLtBqtRUep9Vq\nLUnX2dkZOp2uwnqdTlcpCa9atQqLFi2SdgOIiBxcWcgAUOkUR01UtQF12ZGNq1evokePHvj999/R\nuHFjq9VB8pD9Gg3g3ptw5cqVyMjIwMKFCy1BISAgAJmZmRXO9WVkZCAwMBAAEBgYiEuXLlnW6fV6\nXL9+3bK+zIwZM5CSkoKUlBTExcXZYIuIiBxLWlqaJWTIzWg0Ii8vD3//+9/lLoWswC6CxqpVq5Ce\nno5FixbB1dXVsvyJJ56ARqPB5s2bYTAYcPDgQWRlZaFbt24AgN69eyM1NRXHjx+3HKYLCgqqdH2G\nv78/QkJCEBISgrZt29p024iIHMGKFSugUtnNQW4YjUbEx8dbrgUhxyX7pGq5ubmIiIiAWq2ucNHn\nyJEjMXr0aGRmZmL58uXIzMyEr68vZsyYUaGPxsGDByv00Zg7d+6f9tHgpGpERJXVq1cPBQUFcpdR\ngSAIWLVqFaZPny53KVQDssdXX19f/PDDDw9dHxQUhI8++uih67t3747u3btLURoR0WPBaDTaXcgA\nAKVSiRs3bshdBtWQXZw6ISIi+SiVSigU9vfnQBRFaDQaucugGrK/dxYREdmUIAh48skn7S5smEwm\nBAcHy10G1ZB9vauIiEgWr776aqVunnISBAHNmjXDs88+K3cpVEMMGkREhHHjxqFBgwYVLsqXkyiK\nePvtt+3uKAs9OtkvBiUisifnzp1DdHQ0Tp8+DYPBgCZNmmDixIlo164d1qxZg99++w1FRUXw9fXF\n8OHD8dJLL8HJyUnusmvMxcUFO3fuRK9evXD37l2YTCZZ65k9ezamTZsmaw1kHbLf3mprvL2ViB7k\n5s2bmDRpEnbs2AGlUmn5Q1v+a0EQLF0uy5Z7e3tj2bJlGDdunGy1W9P58+cxa9Ys7NmzB0qlEoIg\nQBAEGAyGCkcXyo58mEwmmM1mS8tytVpt2Udl3xsMhkrLnZycUFpaaundUTaGr68vFixYgFdffbVC\n63JyXDyiQeRgSkpKsHnzZqxfvx7Xrl2Ds7MzOnXqhOnTp+PKlStYu3YtLly4AIVCgTZt2mD69Olw\ndnZGdHQ0Tp48CYPBgICAAEyaNAkdOnTA6tWrcfDgQWi1Wvj5+WHEiBHo378/vv32W/z888/Iz89H\n3bp18fzzz2P8+PFITEzEt99+i+vXr8PFxQXPPPMMIiMj0bx5c7l3TbXl5uaia9euuHz5MgBU+DRf\n/uvyn8vKlufl5WH8+PG4c+cOoqKibFSxdFq2bIndu3fj4sWLWLduHa5evQq1Wo327dtjwoQJKCkp\nQVxcHC5cuACz2YygoCCEh4dbJlU7duwYSkpK4OfnhzFjxqBNmzbYvn07EhMTUVRUBE9PTwwaNAjd\nu3fH4cOHsXXrVty+fRtubm7o2bMnBg8eDLVaLfduICviEQ0iB7Jp0ybMmDEDt2/fhkKhsFy8V/7r\nh30aL//1w55b/hN7+a/v//5B440YMQJr1qxBnTp1JN0HUnj++eexd+/eGs3vIQgCUlJSeJcE0X14\nlQ2Rg4iNjcWoUaNw+/ZtAKhwh0D5rx/2abz81w97bvlgcf9nkPLfP2i8rVu3onfv3igqKnqErZJf\neno6du3aVeNJxJRKJT777DMrVUVUezBoEDmAixcv2v2FcSaTCSdOnMD8+fPlLuWRREdHW2WOj7K5\nOQoLC61QFVHtwaBB5AC++OILuUuoEpPJhLVr1+LOnTtyl1JlZ86csdqU6KWlpcjMzLTKaxHVFgwa\nRHbOYDAgOjpa9tsNq6qkpATx8fFyl1FlBoPBqq/nKP9PRLbCoEFk527duuVQh+NVKhXOnTsndxlV\n1rRpU6tNjy4IAho1amSV1yKqLRg0iOycPbWFripH+lT/8ssvW+XUiUqlwoABA+Dr62uFqohqDwYN\nIjtXv359uLi4yF1GlZlMJgQFBcldRpWFhYWhffv2NW69bTQaMXv2bCtVRVR7MGgQ2TknJydMmjTJ\naof3paZQKBAeHi53GVUmCALWrVsHjUZT7bAhCAIiIyPxwgsvWLk6IsfHoEHkAGbNmmW1OyOkpFQq\nMWrUKPj5+cldyiPp2LEjkpKSUL9+fQB46ERe9y8va9E9b948rFixgi2ziR6AQYPIATz55JN4//33\n5S7jT6lUKjRp0gRLly6Vu5RqCQ0NRVZWFhISEtCtWzd4enqiTp06aN26Nd5//31s2rQJQ4YMgY+P\nD9zd3dGkSRP87W9/w/nz5/Hxxx/bzaynRPaGLciJHMjSpUsxf/58y0RWZR7WUvxhrcnLK/+Y8u5v\nQf6wx5VNptWpUyd8//338Pf3r9lGElGt4hgnfYkIADB37lxMmDABa9euxTfffIMbN25Ao9Ggc+fO\nmDZtGnJychATE4OMjAwoFAq0bt0akZGR0Gg0FSZVa9KkCaZMmYLWrVsjNjYWSUlJ0Ov18PHxwZgx\nY/Dss89iy5Yt+OGHH1BQUAAPDw8MGDAAo0aNQnJyMuLj45GbmwtnZ2eEhYXhlVdeQbdu3XjqgIgq\n4RENIiIikgyv0SAiIiLJMGgQERGRZBg0iIiISDIMGkRERCQZBg0iIiKSDIMGERERSYZBg4iIiCTD\noEFERESSYdAgIiIiyTBoEBERkWQYNIiIiEgynFSNbEoURRw4cADbt2/HnTt34O7ujj59+mDAgAFI\nT0/Hhg0bLBOFhYSEYPTo0cjPz0dcXBwyMzOhUCjQsmVLhIeHQ61WIz4+HmfOnIHRaESjRo0wYcIE\nNGrUCFu3bsVvv/0GnU4HHx8fDB8+HCEhIdi7dy927tyJgoIC1KlTB/369UO/fv1w6tQpbNq0CTdv\n3oSzszM6d+6MESNG4MaNG1i3bh0uX74MhUKBtm3bYvz48fD09JR7VxIROQROqkY2s23bNsyfPx/p\n6elQqVSWmT4NBgOcnJxQWlpaablKpYLJZIIgCFAqlQAAo9EIQRAgCALMZjNUqnt5uWzqdLVaDYPB\nALVaDeBeuDEajZXGeNjy8mMbjUYolUooFArL2E5OTpg8eTI+/vhjuLu723QfEhE5Gh7RIJtYvXo1\npk+fbvneaDRWWF9aWvrA5WXfi6IIs9lsWV4+HxsMhgrPKfv+/uUPG+OvxjaZTDCZTJblJSUlWL16\nNQ4fPoykpCR4eHhU3mAiIgLAazTIBg4dOoTp06dDFEXUlgNoJpMJp0+fxuTJk+UuhYjIrjFokOQ+\n/vhjy2mP2sRkMmHr1q24cOGC3KUQEdktBg2S1PXr17Fly5ZKpyVqC6VSiZUrV8pdBhGR3WLQIEmd\nOHGiwvUNtY3JZMKRI0fkLoOIyG4xaJCkSkpK5C5BcsXFxXKXQERktxg0SFINGjSQuwRJKRQKNGzY\nUO4yiIjsFoMGSerpp59GYGCg3GVIxmw2Y8KECXKXQURktxg0SFIKhQKvvvqqpRFWbSIIAurXr4+X\nXnpJ7lKIiOwWgwZJLioqCqGhobXqFtey4LR69WpLB1IiIqqMQYMk5+rqip07d6JLly4A4PCBQ6FQ\nQK1WY8OGDRg8eLDc5RAR2TW2ICeb8PLyQlJSErZv347ly5djz549li6hnTp1wgsvvIDz58/ju+++\ns7QOb9asGcaMGYP8/HysW7cOd+/eBQB4e3tXmFTt2rVrAAAXFxeMGzcODRs2xJYtW3DmzBkA94LB\noEGDEBwcjP3792Pfvn2Wup555hn0798fZ86cwdatWy39Plq1aoVRo0bh5s2bWLduHbRaLQDA19cX\nUVFRmD59Oho1amSTfUdE5Mg4qRrJorS0FHfv3oWbmxucnZ0ty41GIwoLC+Hs7AwXFxfLKQqz2YzC\nwkIolUq4u7tblouiCK1WC4PBAA8PjwpHS/R6PfR6PTw8PCwTrwH3brktKiqCu7s7NBpNtccmIqK/\nxiMaJAsnJyd4e3tXWq5SqeDl5VVpuUKhQL169SotFwThoTOouri4wMXFpdJyjUZTIWBUd2wiIvpr\nvEaDiIiIJMOgQURERJJh0CAiIiLJMGgQERGRZBg0iIiISDIMGkRERCQZBg0iIiKSDIMGERERSYZB\ng4iIiCTDoEFERESSYdAgIiIiyTBoEBERkWQYNIiIiEgyDBpEREQkGQYNIiIikgyDBhEREUmGQYOI\niIgkw6BBREREkmHQICIiIskwaBAREZFkVHIX8OOPP2Lv3r3IzMzEM888g/nz51vWZWVlYdmyZcjM\nzISfnx8iIyPRsWNHy/rk5GTExsYiPz8frVu3xpw5c+Dr6yvHZhAREdEDyH5Ew8vLC6NHj0b//v0r\nLDcajVi8eDE6d+6MhIQEjB07FkuWLMGdO3cAAFeuXMHSpUsRFRWFuLg4BAUF4YMPPpBjE4iIiOgh\nZA8aYWFh6Nq1Kzw8PCosP3XqFIqLizFixAio1Wr06NEDAQEBSE5OBgAkJiYiJCQEwcHB0Gg0GD9+\nPDIyMpCdnS3HZhAREdEDyB40HiY7OxtBQUFQKpWWZc2aNUNWVhaAe6dVmjZtalnn6uqKBg0aWNYT\nERGR/GS/RuNh9Ho93NzcKixzc3NDbm4uAKC4uPiB6/V6faXXysnJQU5ODgAgLS1NooqJiIjofnYb\nNFxcXKDVaiss02q1cHFxAQA4OztDp9NVWK/T6Szry1u1ahUWLVokXbFERET0QHZ76iQgIACZmZkw\nm82WZRkZGQgMDAQABAYG4tKlS5Z1er0e169ft6wvb8aMGUhJSUFKSgri4uKkL56IiIgA2EHQMJlM\nKC0thdlshtlsRmlpKYxGI5544gloNBps3rwZBoMBBw8eRFZWFrp16wYA6N27N1JTU3H8+HGUlpYi\nPj4eQUFBCAgIqDSGv78/QkJCEBISgrZt29p6E4mIiB5bgiiKopwFxMfHY/369RWWPfvss3jttdeQ\nmZmJ5cuXIzMzE76+vpgxY0aFPhoHDx6s0Edj7ty5f9lHIzU1FaGhoUhJSUFISIgk20RERET3yB40\nbI1Bg4iIyHZkP3VCREREtReDBhEREUmGQYOIiIgkw6BBREREkmHQICIiIsnYbWdQqZS1KGcrciIi\noupp06YNXF1dq/TYxy5oZGZmAgDCw8PlLYSIiMhBPUqLiMeuj8atW7ewc+dOBAUFPXBeFHuUlpaG\n8PBwxMXFsbPpX+C+qjruq6rjvqo67quqc+R9xSMaf8LHxwcTJkyQu4xqadu2LZuMVRH3VdVxX1Ud\n91XVcV9VXW3fV7wYlIiIiCSjXLhw4UK5i6C/5u7ujt69e6NOnTpyl2L3uK+qjvuq6rivqo77quoe\nh3312F2jQURERLbDUydEREQkGQYNIiIikgyDRi2yYsUKxMfHy10GACAiIgIpKSmy1hAfH48PP/xQ\n1hqsqWyffvvtt/j000/lLqeC2NhYu6vJ0Q0ZMgRXrlyRu4wq+fTTTxEbGyt3GXaroKAACxYswJgx\nY7Bs2bJa97vprzx2t7fWZrNmzZK7BLKB0aNHy13CYyEiIgJRUVEIDQ2VuxRycDt37oSzszPWr18P\nQRDs5gOhrfCIBtk1k8kkdwlERDVy48YNBAQEQBAEuUsBYPvfqzyiIbG8vDx89dVXOHXqFIxGI9q3\nb48FCxbgww8/xOnTp1FSUoKgoCDMnDkTQUFBAO61dl27di1yc3Oh0WjQp08fTJkyBQBw/vx5rF69\nGllZWfD09ER4eDjCwsIA3Dt86enpicmTJ+PUqVP48MMPMXr0aGzcuBFmsxnDhg3D8OHDbbbt2dnZ\niIuLw7Vr19CuXTu8/vrrcHd3R0pKCmJjY5Gbm4vGjRsjIiICbdq0sWyDk5MT7ty5g+PHj+OVV15B\nw4YNsWrVKly+fBlqtRrBwcF4/fXXAQDXrl3Dl19+ifPnz8PNzQ0vvfQSBg4caKnBYDDg448/xpEj\nR+Dj44OoqCh06NABAKDT6bB27VocPXoUJpMJYWFhmDp1KpycnKDT6fDxxx/j3LlzMBqNaNOmDWbN\nmoX69esDAN555x20a9cOaWlpuHDhAgIDA/HGG2/A19dX8v0aHx+Pq1evYv78+bhx4wamT5+OefPm\nYd26ddBqtXjuuecQEREBALh+/TqWLVuGixcvQqlUIiAgAEuWLAEA5OfnIzo6GqdOnYJarUbfvn0x\nduxYKBT3Pn8kJibiu+++Q15eHgIDAzFr1iwEBAQAADIyMrBs2TJcvXoV7du3h7e3t+TbXSYiIgID\nBw5EUlISrl69iuDgYMyZMwfR0dE4dOgQfH198cYbbyAwMPBPt/H69etYvnw5MjIyAABPPfUUoqKi\n4O7ujg8//BA3b97EkiVLoFAoMHjwYEycOBFDhgxBVFQUfvjhB9y6dQt9+vTBhAkTsHTpUpw5cwaB\ngYF488034ePjA+DP35/nz59HdHS05X39zDPPICIiAmq1WvJ9uGXLFmzbtg1arRYeHh6YOHEievTo\ngc2bN2PHjh3Q6XRo164dZs6cCW9vb2zZsgUnT57Ee++9Z3mN7777Dn/88QfeffddAEBRUREWLVqE\nP/74A40bN8acOXMQGFlNYLIAABMKSURBVBgI4M/fa3/2/1D2//3iiy8iKSmp0u8SW+2bK1euWH7m\nAKC0tBQjR45EdHQ0/Pz88Omnn0Kj0SA/Px8nTpyAr68v5s2bh2bNmuF///sfDhw4AEEQsH37drz2\n2muVxnzY78Rbt24hKioK8fHxUKvV+Oabb7B582bEx8fDxcUFGzduxLVr1zB37lwYDAYkJCQgKSkJ\ner0ewcHBmDlzJtzd3S2/J+bOnYuEhARoNBp8/vnnkuy/BxJJMkajUXzttdfEFStWiFqtViwtLRVP\nnToliqIo7t6927IsJiZGfOWVVyzPmzRpkrh3715RFEVRp9OJZ8+eFUVRFPPy8sTx48eLv/32m2g0\nGsWzZ8+K48aNE7Ozs0VRFMVPPvlEXLt2rSiKonjy5Elx6NCh4ldffSWWlpaK6enp4rBhw8SrV6/a\nZNunTZsmzpkzR8zNzRV1Op04f/58MS4uTrx69ao4YsQI8ciRI6LRaBR/+eUXcezYsWJBQYFlG0aN\nGiWeOHFCNJvNYnFxsfjGG2+IGzZsEE0mk1hSUiKeOXNGFEVRLC4uFqdOnSpu375dNBgM4uXLl8Up\nU6aIqampoiiK4rp168ShQ4eKe/fuFY1Go7hnzx5x7Nix4t27d0VRFMX//Oc/4ieffCJqtVrx7t27\n4j/+8f/au/Ogpq63D+DfLBDWyBLACOMOWiTijqNScLe1MChqRW0VcXfGpbZuI1odlw5tRa3oVMUi\notVq3TpWy7hXqyIGnUKtgqClFsIaFklCluf9w9f7E4Gilmg783xm/CPee8+5z3PPPZyck+SupOTk\nZCIiqqqqosuXL5Ner6eamhqKi4uj1atXC/EtW7aMpk6dSg8ePKDa2lrasGEDbdy40eo5TU9Pp337\n9lFcXBwRERUWFlJYWBht3LiRdDodFRQU0Pjx4+nWrVtERBQXF0cJCQlkNBrJaDQK7c9sNtNHH31E\nycnJZDAYqKSkhObNm0enT58mIqLr169TTEwM5ebmkslkolOnTtG0adOotraWjEYjxcTE0MGDB8lo\nNJJarabIyEiKj4+3avzP5mHBggVUUlJCFRUVNHPmTJo1axalp6eTyWSir7/+mmJjY5uMsaCggNRq\nNdXW1lJFRQUtW7aMtm/fXi/fzwoLC6NVq1ZRVVUVaTQaioqKovnz59O9e/fIaDTS2rVr6auvviKi\npttnTk4O/fbbb2QymUij0dCcOXPoyJEjderKz89v9vzl5+dTZGSkUHZpaSk9fPiQzpw5QzExMZSf\nn096vZ4SEhJo8eLFRERUVlZGkZGRVFZWJpQzd+5cunz5MhE9uW8jIyMpIyODjEYjHThwgKZPn04m\nk6lZrkNDfYk1NJabZ+85IiKDwUBhYWFUWFgoxD9+/HjKysoik8lEO3bsoCVLlgj7P9s3E1Gd8prq\nE6dPny70eZ988glNnz5daJcrV66kM2fOEBHRrl27aOXKlVReXk56vZ7i4+Ppiy++IKL/9RNxcXH0\n+PFj0uv1VslfY3jpxIqys7Oh0Wgwbdo0ODg4wMbGRng3PWTIEOH/xo8fjz/++AOVlZUAAKlUioKC\nAlRWVsLe3h6dOnUC8OQdZmBgIPr27QuJRIJOnTqhb9++uHLlSoP1i8ViTJo0CTY2NvDz84O3t7fw\nruF1CA8Ph4eHB+zt7dGvXz/cv38fP//8M3r06IHevXtDIpFg0KBB8Pb2xrVr14Tjevfuja5du0Ik\nEkEmk0EqlaKoqAhlZWWwtbWFv78/AODGjRtwdXXFu+++C6lUCh8fHwwbNgyXLl0SymrXrh0GDhwI\niUSCwYMHw9PTEzdu3IBWq0VaWhpmzJgBBwcHODk5Ydy4ccKxTk5O6N+/P2QyGezt7TFmzBhkZWXV\niW/w4MFo06YNbGxs8Pbbb+P+/fuvIasNmzBhAuzs7NCyZUt06dIFubm5AJ60pbKyMhQVFUEqlQrt\nLycnByUlJZg0aRJsbW3h7u6OiIgIIf5Tp05h9OjRaNeuHSQSCUaMGAGRSIS7d+/i999/h8FgwJgx\nYyCVStG9e/fX/vPJ7733Htzd3SGXy9GjRw94enqiZ8+ekEgkCA4Oxv3795uMsWXLlujevTtsbGwg\nl8sRHh5e7xo3JDIyEk5OTvD09IS/vz/8/Pzg6+sLqVSKAQMGCLlvqn126NABb731FiQSCTw9PTF8\n+HBkZmZaL2n/TyKRAHgy42gwGODm5obWrVvjwoULCA8Ph4+PD2QyGaZMmYJ79+6hoKAArq6u6Nat\nGy5evAjgSfspKytDnz59hHJ79uyJbt26QSqVYsyYMaipqcHdu3eb5To01Je8zty8iKCgIPj7+wv9\n2tN20JSm+sSAgAD8+uuvMBgMKCgowMiRI5GZmQmTyYQ7d+5ApVKBiPDTTz9h2rRpcHFxgUwmw8SJ\nE3HlypU6yyRRUVFwcHCATCZ7ycz8M7x0YkUlJSXw8PCoNxVqNpuRkpKCK1euoKKiQpiqrqyshFwu\nx/Lly3Hw4EHMnDkTSqUSUVFR6N27N4qKinD9+nVERUXVKSs0NLTB+p2cnOrULZPJoNfrmz/QRri4\nuNSru7S0tN7ygpeXF8rKyoTXT5cnnpo3bx7279+PhQsXQi6XIyIiAkOHDoVGo0Fubm6dfFgsFmEg\n0lBZnp6ewh9ei8WCmJgYYRsRwWKxAAAMBgN27doFtVqN6upqAIBOp4PRaBRy6urqWi++N+X5c9Hp\ndACA6Oho7N+/HytWrIBEIsHw4cMxZswYFBUVoaKiAhMmTBCOs1gswpR/UVERkpKSsHfvXmG70WhE\naWkpRCIR3NzchHYLPMnz48ePrR2m4Pm21dC1aCpGrVaLnTt3IisrCzqdDkT0Qg9afL6u58/lae6b\nap+PHj1CYmIicnJyYDAYYDab0a5du5dNxUtTKpVYsGABfvjhB2zevBldunTB1KlT692bDg4OcHZ2\nRmlpKZRKJYYMGYJvv/0WEREROH/+PIKDg+v0L8/eaxKJBO7u7kJ7+afXoaG+xBoay82LeNX+oKk+\nUaVS4ezZs/Dz80OnTp0QGBiIrVu3Ijs7G3K5HJ6entBqtdDr9Vi8eHGdckQiEbRarfD6+f7wdeGB\nhhUpFAoUFxfDZDJBKv1fqi9duoSrV69izZo18PLyQk1NTZ3OqEOHDli+fDnMZjMuX76Mzz77DPv2\n7YOHhweCg4MbXOP7r3B3d6/3bkSj0SAwMFB4/fwHppRKJRYtWgQiQmZmJlatWoUuXbrAw8MDnTt3\nxvr16xutr7i4uN7rfv36wcPDAxKJBMnJyQ2uiR89ehT5+fn4/PPP4ebmhry8PMyfPx/0H/shXRcX\nF+HbSLm5uYiNjYWvry8UCgUUCgV27drV4HEKhQKjR4/G4MGD623LzMxEWVkZLBaLMNgoLi5+4Sc5\nvi5NxZicnAyLxYItW7ZALpfj2rVr2LZtW7PV31T73L59u/DZHgcHB5w4caLObJw1DRgwAAMGDIDB\nYMCePXuwdetWuLu7o6ioSNhHp9OhqqpK+PxNr169kJCQgJycHFy6dAkrVqyoU+az95rZbEZpaSnc\n3d0hFovf6HV4WQ3lJigoCAaDQdinvLy82eprqk9UqVRISEhARkYGVCoV2rRpg+LiYqSlpUGlUgEA\n5HI5bG1tsWnTJnh5edWrQ6PRAKjft74uvHRiRb6+vvDw8EBiYiJqampgMpmQmZkJnU4HGxsbODs7\no7a2FikpKcIxRqMR58+fR3V1NSQSCRwdHSESiSAWixEaGoqbN28iLS0NZrMZRqMRd+/eRX5+/huM\n8uUMGDAAarUaN2/ehNlsxoULF/Do0SMEBQU1esy5c+eg1WohEong6OgI4Mmy0NNZntTUVBiNRpjN\nZjx48ADZ2dnCsXl5ebh48SLMZjPOnz+PwsJC9OrVC66urujVqxd27tyJ6upqEBGKi4uF3/7Q6XSw\ntbWFo6MjqqurcfDgQesmxkouX74s/AFwdHSEWCyGWCyGr68v5HI5Dhw4AL1eD4vFgr/++kuYun/n\nnXdw+PBh5OXlgYig0+mQlpaGmpoadO7cGTKZDEeOHIHJZMKtW7egVqvfZJgNaipGnU4HOzs7ODo6\norS0FMeOHatzvIuLCwoLC1+5/qbap06ng4ODA+zt7fHo0SOcPn361YN9CX/++Sdu3bqF2tpaSKVS\n2NnZQSwWIyQkBCdOnMCjR49QW1uLPXv2wNfXF0qlEsCTZbjQ0FBs2bIFzs7OwpLuU2q1Grdv34bJ\nZML3338Pe3t7YVnpn1yH16mx3LRv3x5ZWVkoLCyEXq/HgQMHmq3OpvpEhUIBNzc3pKamQqVSQSQS\noXPnzjh16pSwFCoWizFixAgkJiYKMyFarbbOkvSbxDMaViSRSBAbG4tdu3ZhxowZsFgsUKlUWLBg\nAdRqNaKjo+Hs7FzvsfUXL17Ezp07YTab4enpicWLF8PW1hYKhQKrVq1CUlISNm/eDABo27Ztnen/\nfztvb28sWbIESUlJKC4uRqtWrRAbG4sWLVo0esytW7fwzTffwGAwwNXVFbNmzULLli0BAGvWrMHu\n3buxd+9emEwm+Pj4YNKkScKxffr0QXp6OrZt2waFQoFly5YJDy9asGABUlJSMH/+fFRXV0OhUGDE\niBHo2bMnwsPD8eWXX+KDDz6Am5sbIiIi8Msvv1g3OVaQk5ODxMREPH78GE5OTggLCxPeBcXGxiIp\nKQmzZs2CXq+Hl5cXIiMjAQB9+/aFwWDApk2boNFoIJPJ4O/vj4CAAEilUixfvhxbt27Fd999h4CA\nAAwcOBBGo/FNhlrP0/uvsRijoqIQHx+PqKgoKJVKhIaG4ujRo8LxT79VkJKSgpEjR9ZpVy/C3t7+\nb9tndHQ0EhIScPz4cbRv3x79+/dHRkZG8yWgEUajESkpKcjPzxf+iM6ZMwetWrVCeXk5Vq1aJXzr\n5Pmp+MGDB+P48eP48MMP65UbGhqKY8eOYd26dfDx8cHy5cuFmdx/ch1ep8Zy4+Pjg0GDBmHhwoVw\ndHTEpEmTcPbs2Wap80X6RJVKhatXrwrfTHz6+um9DACTJ0/GoUOHsHTpUlRUVKBFixYIDg5G3759\nm+U8/wl+qBpjjLEXUlVVhcmTJ2PHjh3CZywYawovnTDGGGsSEeHEiRPo0aMHDzLYS+GlE8YYY3/L\naDRi4sSJcHV1FX6gi7EXxUsnjDHGGLMaXjphjDHGmNXwQIMxxhhjVsMDDcYYY4xZDQ80GGOMMWY1\nPNBgjDHGmNXwQIMx9sri4+PRunVrSCQSREREWL2+iIiIRh8iyBj7d+Lf0WCMvZLs7GwsWrQIS5Ys\nQVhYGP+IE2OsQTzQYIy9krt374KIMH36dLRv3/5Nnw5j7F+Kl04YYy9typQpCAsLAwB06NABIpEI\nSUlJ0Gq1mDNnDpRKJWQyGXr27InU1NR6x588eRJBQUGwt7eHh4cHZs+ejcePH9fZ586dOwgJCYGd\nnR06dOiAPXv2vJbYGGPNi2c0GGMvLTY2Fv7+/liyZAmOHDkCpVKJdu3aYejQodBoNFi3bh28vb2F\nJ5+q1WrhSZOHDx/G+++/j+joaKxevRoFBQVYunQpysvLhcdv6/V6DBs2DI6Ojti7d69QZ1VVFXx9\nfd9Y3IyxV0CMMfYKjh49SgAoLy+PiIh2795NUqmUsrKy6uwXFBREY8eOJSIii8VCbdq0oaioqDr7\nnDp1ikQiEWVmZhIR0fbt20ksFtO9e/eEfbKzs0ksFlNISIj1gmKMNTteOmGMNYvU1FSoVCr4+fnB\nZDIJ/4YOHYobN24AAO7du4eHDx9i3LhxdfYJCQmBWCxGeno6AOD69esICAioM3vRsWNHBAYGvpHY\nGGOvjpdOGGPNoqSkBBkZGbCxsam3TSKRCPsAwKhRoxosIz8/HwBQUFAAT0/Petu9vLyg0+ma65QZ\nY68BDzQYY83Czc0NXbt2RWJi4t/uAwBbt25FUFBQve2tWrUCACiVSqjV6nrbNRoN5HJ5M50xY+x1\n4IEGY6xZDBkyBD/++CNatWolDBie17lzZ/j4+CA3Nxdz585ttKw+ffogOTkZ2dnZwvJJTk4Obt++\njeDgYKucP2PMOkRERG/6JBhj/z3Hjh3DqFGjkJeXh7Zt28JgMKB///6orKzExx9/DD8/P2i1WmRk\nZKC2thYbNmwAABw6dAgTJkxATEwMRo4cCUdHRzx8+BAnT57E+vXr4efnB51Oh44dO8LZ2Rlr164F\nEWHlypWorKyEr68vLly48GaDZ4y9MJ7RYIw1C5lMhnPnzuHTTz/FunXrUFBQAIVCge7du2POnDnC\nfmPHjoWLiwvWrVuHlJQUAEDbtm0xYsQIeHl5AQDs7e2RmpqK2bNnY+LEifD29kZsbCyOHz8OrVb7\nRuJjjL0antFgjDHGmNXw11sZY4wxZjU80GCMMcaY1fBAgzHGGGNWwwMNxhhjjFkNDzQYY4wxZjU8\n0GCMMcaY1fBAgzHGGGNWwwMNxhhjjFkNDzQYY4wxZjU80GCMMcaY1fBAgzHGGGNW83/Q3M0zEFzu\nkwAAAABJRU5ErkJggg==\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + }, + { + "data": { + "image/png": "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\n7Vr98ssvqlWrlgYPHqxHH31UNWvWlCS9+OKLZVosAACoWEoVNCSpZs2aGjt2bFnWAgAALjJ8MygA\nALDG5ysaV111lebNm6cmTZqc8kuuf8SvtwIAAOkcf701PDzc+//8kisAADgbn4PGW2+95f1/fskV\np5OamurvEsqVSZMm+bsEAPC7836PhjFGe/fuVVFRUVnUAwAALiKlDhqff/65rrvuOlWqVEmXX365\nfv75Z0nS4MGDNXfu3DIrEAAAVFylChrz589X586dVadOHU2bNk3GGO+6evXqlZhmAQAAf12lChr/\n/Oc/NXToUM2fP1/9+/cvsa5x48basGFDWdQGAAAquFIFje3bt6tz586nXRceHq4jR46cV1EAAODi\nUKqgUbNmTW3atOm0637++WfFxcWdV1EAAODiUKqg0adPHz377LP68ssvvbcFBARow4YNGjt2rPr1\n61dmBQIAgIqrVL918uyzz2rjxo266aabVL16dUnSrbfeqoMHD+rvf/+7nnjiiTItsqwFBwcrJCTE\n32VUSFWqVPF3CRUGvfIdvfIdvfIdvfKdzV6VKmgEBwfrww8/1LJly7RkyRIdOnRI1apV04033qgb\nb7yxrGsscwUFBSooKPB3GRXSsWPH/F1ChUGvfEevfEevfEevfHcuvTrXP9RLFTS6du2qdu3aqW3b\ntho9erScTmdpdgMAAC5ypXqPRlhYmCZMmKDrr79eVatW1U033aTnn39eX331lfLy8sq6RgAAUEGV\nKmgsWLBAu3fv1pYtWzRx4kTVrl1bs2fPVqdOnVS1alW1bdu2rOsEAAAVUKmmTk664oordMUVV6h9\n+/b66quvNHfuXH311Vf65ptvyqo+AABQgZUqaGzatEnLly/3/nfgwAE1btxY7dq1U0pKitq1a1fW\ndQIAgAqoVEEjISFBoaGhuvfee/Xaa68pKSlJkZGRZV0bAACo4EoVNDp37qxvvvlGM2fO1M8//6xv\nv/1W7du3V5s2bVS5cuWyrhEAAFRQpXoz6Mcff6xDhw5pzZo1uuuuu7R161bde++9qlatmq699lo9\n9thjZV0nAACogEr9ZtCAgAA1bdpUTZs2VY8ePbR8+XJNnz5dy5cvV1paml566aWyrBMAAFRApQoa\nO3bs0PLly7VixQqtWLFC27dvV1BQkJo1a6bhw4erffv2ZV0nAACogEoVNOrWratKlSqpZcuW6t27\nt9q3b6/WrVsrNDS0rOsDAAAVWKmCxooVK9SyZUsFBweXdT0AAOAiUqqgkZSUVNZ1AACAi1CpPnUC\nAADgC4IGAACwhqABAACsIWgAAABrCBoAAMAaggYAALCGoAEAAKwhaAAAAGsIGgAAwBqCBgAAsIag\nAQAArCFoAAAAawgaAADAGoIGAACwhqABAACsIWgAAABrCBoAAMAaggYAALCGoAEAAKwhaAAAAGsI\nGgAAwBqCBgAAsIagAQAArAn0dwEff/yxli5dqh07duj666/X8OHDvesyMjI0efJk7dixQzVq1NDg\nwYPVtGlT7/pVq1Zp9uzZysrKUsOGDZWamqqYmBh/DAMAAJyG369oVKtWTT179tTNN99c4vaioiKN\nHj1aLVu21Pz589WrVy+NGTNG2dnZkqTdu3dr4sSJSklJ0Zw5cxQfH6+xY8f6YwgAAOAM/B40Wrdu\nreuuu04RERElbl+/fr3y8vKUnJysoKAgtW3bVrGxsVq1apUkadmyZWrevLmaNWumkJAQ9enTR+np\n6dq5c6c/hgEAAE7D70HjTHbu3Kn4+Hg5nU7vbXXr1lVGRoakE9MqderU8a4LCwtTzZo1vesBAID/\n+f09GmfidrsVHh5e4rbw8HBlZmZKkvLy8k673u12n7Ivl8sll8vlXXY4HIqOjrZQ9cXv98EPf45e\n+Y5e+Y5e+Y5e+c5mr8pt0AgNDVVOTk6J23JychQaGipJqlSpknJzc0usz83N9a7/vUWLFmnGjBne\n5f79++vhhx+2UPXFLzIy0t8lVBj0ynf0ynf0ynf0ync2e1Vug0ZsbKzee+89FRcXy+E4McOTnp6u\ndu3aSZLi4uK0fft27/Zut1v79+9XXFzcKftKTk5W+/btvcsOh0NZWVmWR3Bxom++o1e+o1e+o1e+\no1e+O5denWso8XvQ8Hg88ng8Ki4uVnFxsQoKCuRwOJSYmKiQkBAtXrxY3bp10+rVq5WRkaE2bdpI\nkjp06KBhw4Zp3bp1SkhI0Lx58xQfH6/Y2NhTHiMqKkpRUVHeZZfLJY/Hc8HGeDGhb76jV76jV76j\nV76jV76z2Su/B42FCxdqwYIF3uVVq1bphhtu0NChQ/XUU09pypQpWrBggWJiYjRy5EhVrVpVknT5\n5ZcrNTVVU6dO9X6PxogRI/w1DAAAcBp+Dxp9+vRRnz59TrsuPj5eL7300hnvm5SUpKSkJFulAQCA\n81RuP94KAAAqPoIGAACwhqABAACsIWgAAABrCBoAAMAaggYAALCGoAEAAKwhaAAAAGsIGgAAwBqC\nBgAAsIagAQAArCFoAAAAawgaAADAGoIGAACwhqABAACsIWgAAABrCBoAAMAaggYAALCGoAEAAKwh\naAAAAGsIGgAAwBqCBgAAsIagAQAArCFoAAAAawgaAADAGoIGAACwhqABAACsIWgAAABrCBoAAMAa\nggYAALCGoAEAAKwhaAAAAGsIGgAAwBqCBgAAsIagAQAArCFoAAAAawgaAADAmkB/F+APwcHBCgkJ\n8XcZFVKVKlX8XUKFQa98R698R698R698Z7NXf8mgUVBQoIKCAn+XUSEdO3bM3yVUGPTKd/TKd/TK\nd/TKd+fSq3P9Q52pEwAAYA1BAwAAWEPQAAAA1hA0AACANQQNAABgDUEDAABYQ9AAAADWEDQAAIA1\nBA0AAGANQQMAAFhD0AAAANYQNAAAgDUEDQAAYA1BAwAAWEPQAAAA1hA0AACANQQNAABgDUEDAABY\nQ9AAAADWEDQAAIA1BA0AAGANQQMAAFhD0AAAANYQNAAAgDUEDQAAYA1BAwAAWEPQAAAA1hA0AACA\nNQQNAABgDUEDAABYQ9AAAADWEDQAAIA1BA0AAGANQQMAAFhD0AAAANYQNAAAgDWB/i7gfB0/flxT\np05VWlqaQkNDdfvtt6tbt27+LgsAAOgiCBrTp09XYWGh3nrrLWVmZmrUqFGqXbu2WrRo4e/SAAD4\ny6vQUyd5eXlatWqV7r77boWFhSk+Pl4333yz/vvf//q7NAAAoAoeNPbs2SNjjOLi4ry31alTRzt3\n7vRjVQAA4KQKPXWSl5ensLCwEreFh4fL7XaXuM3lcsnlcnmXHQ6HoqOjL0iNFxun0+nvEioMeuU7\neuU7euU7euU7m70KMMYYa3u37LffftPw4cO1ePFi722rVq3S3LlzNW3aNO9t06dP14wZM7zL/fv3\n18MPP3xBawUA4K+oQl/RuOyyyyRJO3fuVGxsrCQpPT3d+/8nJScnq3379t5lh8OhrKysC1foeXI6\nnYqIiNDRo0fl8Xj8XU65Rq98R698R698R698V1F7FRkZeU7bV+igUalSJbVp00bvvPOOHn30UR08\neFBLlizRI488UmK7qKgoRUVFeZddLleFelJP8ng8FbJuf6BXvqNXvqNXvqNXvrvYe1Whg4YkPfDA\nA5oyZYr69++v0NBQJScn89FWAADKiQofNCpXrqwnnnjC32UAAIDTqNAfbwUAAOUbQQMAAFhD0AAA\nANYQNAAAgDUEDQAAYA1BAwAAWEPQAAAA1hA0AACANQQNAABgTYX+9da/CpfLpUWLFik5ObnEb7bg\nVPTKd/TKd/TKd/TKd3+VXnFFowJwuVyaMWOGXC6Xv0sp9+iV7+iV7+iV7+iV7/4qvSJoAAAAawga\nAADAGuezzz77rL+LwNmFhobqmmuuUVhYmL9LKffole/ole/ole/ole/+Cr3izaAAAMAapk4AAIA1\nBA0AAGANQeMiMm3aNM2bN8/fZUiSBg0apB9++MGvNcybN0/jxo3zaw1l6WRP//Wvf2nChAn+LqeE\n2bNnl7uaKrquXbtq9+7d/i7DJxMmTNDs2bP9XUa5deTIEf3jH//QXXfdpcmTJ19056azCfR3ASg7\nQ4YM8XcJuAB69uzp7xL+EgYNGqSUlBS1aNHC36Wggvv8889VqVIlLViwQAEBAeXmD8ILhSsaKNc8\nHo+/SwCA83LgwAHFxsYqICDA36VIuvDnVa5oWHbo0CG9+eabWr9+vYqKitS4cWP94x//0Lhx47Rh\nwwbl5+crPj5eDz74oOLj4yVJP/zwg2bNmqXMzEyFhISoY8eOGjBggCRp69atmjlzpjIyMhQZGal+\n/fqpdevWkk5cvoyMjNS9996r9evXa9y4cerZs6feffddFRcX6/bbb9cdd9xxwca+c+dOzZkzR3v3\n7lVCQoKGDRumypUr64cfftDs2bOVmZmp2rVra9CgQWrUqJF3DMHBwcrOzta6dev00EMP6dJLL9X0\n6dO1a9cuBQUFqVmzZho2bJgkae/evXr99de1detWhYeHq3v37urcubO3hsLCQr388stas2aNoqKi\nlJKSoiZNmkiScnNzNWvWLH3//ffyeDxq3bq17rvvPgUHBys3N1cvv/yytmzZoqKiIjVq1EhDhgxR\ndHS0JOnJJ59UQkKCfv31V23btk1xcXF67LHHFBMTY72v8+bN0549ezR8+HAdOHBA999/vx599FHN\nnTtXOTk56tSpkwYNGiRJ2r9/vyZPnqzffvtNTqdTsbGxGjNmjCQpKytLM2bM0Pr16xUUFKQbb7xR\nvXr1ksNx4u+PZcuWadGiRTp06JDi4uI0ZMgQxcbGSpLS09M1efJk7dmzR40bN1b16tWtj/ukQYMG\nqXPnzlqxYoX27NmjZs2aKTU1VTNmzNB3332nmJgYPfbYY4qLi/vTMe7fv19TpkxRenq6JOnqq69W\nSkqKKleurHHjxungwYMaM2aMHA6HunTporvvvltdu3ZVSkqKPvroI7lcLnXs2FF9+/bVxIkTtXHj\nRsXFxWnEiBHer5P+s+Nz69atmjFjhve4vv766zVo0CAFBQVZ7+H777+vf//738rJyVFERITuvvtu\ntW3bVosXL9Znn32m3NxcJSQk6MEHH1T16tX1/vvv6+eff9Yzzzzj3ceiRYv0yy+/aNSoUZKk48eP\n67nnntMvv/yi2rVrKzU1VXFxcZL+/Fj7s+fh5PN92223acWKFaecSy5Ub3bv3u19zUlSQUGBevTo\noRkzZqhGjRqaMGGCQkJClJWVpZ9++kkxMTF69NFHVbduXb3yyiv6+uuvFRAQoE8++URDhw495THP\ndE50uVxKSUnRvHnzFBQUpHfeeUeLFy/WvHnzFBoaqnfffVd79+7VI488osLCQs2fP18rVqyQ2+1W\ns2bN9OCDD6py5cre88Qjjzyi+fPnKyQkRFOnTrXSv9MysKaoqMgMHTrUTJs2zeTk5JiCggKzfv16\nY4wx//3vf723vfHGG+ahhx7y3u+ee+4xS5cuNcYYk5ubazZt2mSMMebQoUOmT58+5ttvvzVFRUVm\n06ZNpnfv3mbnzp3GGGPGjx9vZs2aZYwx5ueffzbdunUzb775pikoKDCbN282t99+u9mzZ88FGfvA\ngQNNamqqyczMNLm5uWb48OFmzpw5Zs+ePSY5OdmsWbPGFBUVmS+//NL06tXLHDlyxDuGO++80/z0\n00+muLjY5OXlmccee8wsXLjQeDwek5+fbzZu3GiMMSYvL8/cd9995pNPPjGFhYVm165dZsCAASYt\nLc0YY8zcuXNNt27dzNKlS01RUZH54osvTK9evcyxY8eMMca8+OKLZvz48SYnJ8ccO3bMPP300+bt\nt982xhhz7Ngxs3LlSpOXl2dyc3PN2LFjzXPPPecd38iRI819991nduzYYQoKCsyYMWPMK6+8Yr2n\na9euNXPnzjVjx441xhizf/9+06VLF/PKK68Yt9tt9u3bZ3r16mXWrVtnjDFm7NixZurUqaawsNAU\nFhZ6jz+Px2P+53/+x7z99tsmPz/fuFwuk5qaaj777DNjjDGrV682AwcONNu3bzdFRUXm008/NYMG\nDTIFBQWmsLDQDBw40CxcuNAUFhaatLQ0k5ycbMaPH291/L/vw9ChQ43L5TJHjhwxDzzwgHnwwQfN\n2rVrTVFRkZk+fboZNWrUWce4b98+k5aWZgoKCsyRI0fMyJEjzauvvnpKv3+vS5cu5plnnjHHjh0z\nBw4cML179zaPPPKI2bJliylRob9hAAAQSklEQVQsLDSjR482kydPNsac/fjctm2b+eWXX0xRUZE5\ncOCAGTJkiFm8eHGJx9q1a1eZ92/Xrl0mOTnZu+9Dhw6ZjIwM88UXX5iBAweaXbt2mby8PDN16lQz\nYsQIY4wxhw8fNsnJyebw4cPe/Tz00ENm5cqVxpgTr9vk5GTz448/msLCQrNgwQJz//33m6KiojJ5\nHk53LrHhTL35/WvOGGPy8/NNly5dzP79+73j79Wrl9m4caMpKioyr7/+unn88ce92//+3GyMKbG/\ns50T77//fu85b/jw4eb+++/3HpdPP/20+eKLL4wxxrzxxhvm6aefNllZWSYvL8+MHz/evPTSS8aY\n/ztPjB071uTk5Ji8vDwr/TsTpk4s2rp1qw4cOKBBgwYpLCxMQUFB3r+mb7zxRu9tvXr10s6dO3X0\n6FFJUmBgoPbt26ejR48qNDRUDRs2lHTiL8ymTZvquuuuk9PpVMOGDXXddddp1apVp318h8Ohfv36\nKSgoSA0aNNBll13m/avhQujatauio6MVGhqq1q1b67ffftPXX3+t5s2b69prr5XT6dQNN9ygyy67\nTN999533ftdee62uuuoqBQQEKCQkRIGBgcrMzNThw4cVHByshIQESdL333+vyMhIde7cWYGBgapd\nu7ZuvvlmrVixwruvOnXqqGPHjnI6nerUqZNiYmL0/fffKzs7W2vWrNHgwYMVFhamypUrq2fPnt77\nVq5cWW3atFFISIhCQ0PVo0cPbdy4scT4OnXqpLi4OAUFBaldu3b67bffLkBXT69Pnz6qVKmSatas\nqcaNG2v79u2SThxLhw8fVmZmpgIDA73H37Zt2+RyudSvXz8FBwerevXq6t69u3f8n376qe644w7V\nqVNHTqdTt9xyiwICArR582Zt2rRJ+fn56tGjhwIDA9WsWTM1b978go7373//u6pXr66IiAg1b95c\nMTExatGihZxOp9q2bavffvvtrGOsWbOmmjVrpqCgIEVERKhr166nPMenk5ycrMqVKysmJkYJCQlq\n0KCB6tevr8DAQCUlJXl7f7bjs169erryyivldDoVExOjv/3tb9qwYYO9pv1/TqdT0okrjvn5+apW\nrZpiY2P11VdfqWvXrqpdu7ZCQkLUv39/bdmyRfv27VNkZKSuvvpqLV++XNKJ4+fw4cNq2bKld78t\nWrTQ1VdfrcDAQPXo0UO5ubnavHlzmTwPpzuXXMje+KJVq1ZKSEjwntdOHgdnc7ZzYpMmTbR+/Xrl\n5+dr3759uu2227RhwwYVFRXp119/VWJioowx+vzzzzVo0CBVrVpVISEh6tu3r1atWlVimqR3794K\nCwtTSEjIOXbm/DB1YpHL5VJ0dPQpl0I9Ho/mzJmjVatW6ciRI95L1UePHlVERISefPJJLVy4UA88\n8IBq1aql3r1769prr1VmZqZWr16t3r17l9hXhw4dTvv4lStXLvHYISEhysvLK/uBnkHVqlVPeexD\nhw6dMr1Qo0YNHT582Lt8cnripNTUVM2bN0+PPvqoIiIi1L17d9100006cOCAtm/fXqIfxcXF3iBy\nun3FxMR4/+EtLi7WwIEDveuMMSouLpYk5efn64033lBaWpqOHz8uSXK73SosLPT2NDIy8pTx+csf\na3G73ZKkAQMGaN68eXrqqafkdDr1t7/9TT169FBmZqaOHDmiPn36eO9XXFzsveSfmZmpWbNm6Z13\n3vGuLyws1KFDhxQQEKBq1ap5j1vpRJ9zcnJsD9Prj8fW6Z6Ls40xOztbM2bM0MaNG+V2u2WMUWho\n6Fkf+4+P9cdaTvb+bMfnnj17NHPmTG3btk35+fnyeDyqU6fOubbinNWqVUtDhw7Vv//9b02cOFGN\nGzfWfffdd8prMywsTFWqVNGhQ4dUq1Yt3XjjjZo/f766d++uZcuWqW3btiXOL79/rTmdTlWvXt17\nvJzv83C6c4kNZ+qNL0p7PjjbOTExMVFffvmlGjRooIYNG6pp06aaMmWKtm7dqoiICMXExCg7O1t5\neXkaMWJEif0EBAQoOzvbu/zH8+GFQtCwKCoqSgcPHlRRUZECA/+v1StWrNC3336r559/XjVq1FBu\nbm6Jk1G9evX05JNPyuPxaOXKlfrf//1fzZ07V9HR0Wrbtu1p5/gqiurVq5/y18iBAwfUtGlT7/If\n3zBVq1YtDRs2TMYYbdiwQc8884waN26s6OhoNWrUSC+++OIZH+/gwYOnLLdu3VrR0dFyOp16++23\nTzsn/v7772vXrl0aN26cqlWrpvT0dD3yyCMyFeyLdKtWrer9NNL27ds1atQo1a9fX1FRUYqKitIb\nb7xx2vtFRUXpjjvuUKdOnU5Zt2HDBh0+fFjFxcXesHHw4MFy9xXKZxvj22+/reLiYk2aNEkRERH6\n7rvvNG3atDJ7/LMdn6+++qr3vT1hYWH66KOPSlyNsykpKUlJSUnKz8/X7NmzNWXKFFWvXl2ZmZne\nbdxut44dO+Z9/80111yjqVOnatu2bVqxYoWeeuqpEvv8/WvN4/Ho0KFDql69uhwOh1+fh3N1ut60\natVK+fn53m2ysrLK7PHOdk5MTEzU1KlT9eOPPyoxMVFxcXE6ePCg1qxZo8TERElSRESEgoODNWHC\nBNWoUeOUxzhw4ICkU8+tFwpTJxbVr19f0dHRmjlzpnJzc1VUVKQNGzbI7XYrKChIVapUUUFBgebM\nmeO9T2FhoZYtW6bjx4/L6XQqPDxcAQEBcjgc6tChg3744QetWbNGHo9HhYWF2rx5s3bt2uXHUZ6b\npKQkpaWl6YcffpDH49FXX32lPXv2qFWrVme8z9KlS5Wdna2AgACFh4dLOjEtdPIqz5IlS1RYWCiP\nx6MdO3Zo69at3vump6dr+fLl8ng8WrZsmfbv369rrrlGkZGRuuaaazRjxgwdP35cxhgdPHjQ+90f\nbrdbwcHBCg8P1/Hjx7Vw4UK7jbFk5cqV3n8AwsPD5XA45HA4VL9+fUVERGjBggXKy8tTcXGx9u7d\n6710f+utt+q9995Tenq6jDFyu91as2aNcnNz1ahRI4WEhGjx4sUqKirSunXrlJaW5s9hntbZxuh2\nu1WpUiWFh4fr0KFD+uCDD0rcv2rVqtq/f3+pH/9sx6fb7VZYWJhCQ0O1Z88effbZZ6Uf7DnYvXu3\n1q1bp4KCAgUGBqpSpUpyOBxq3769PvroI+3Zs0cFBQWaPXu26tevr1q1akk6MQ3XoUMHTZo0SVWq\nVPFO6Z6Ulpamn376SUVFRVq0aJFCQ0O900rn8zxcSGfqTd26dbVx40bt379feXl5WrBgQZk95tnO\niVFRUapWrZqWLFmixMREBQQEqFGjRvr000+9U6EOh0O33HKLZs6c6b0Skp2dXWJK2p+4omGR0+nU\nqFGj9MYbb2jw4MEqLi5WYmKihg4dqrS0NA0YMEBVqlRR3759S9xv+fLlmjFjhjwej2JiYjRixAgF\nBwcrKipKzzzzjGbNmqWJEydKkuLj40tc/i/vLrvsMj3++OOaNWuWDh48qEsvvVSjRo3SJZdccsb7\nrFu3Tm+99Zby8/MVGRmpBx98UDVr1pQkPf/883rzzTf1zjvvqKioSLVr11a/fv28923ZsqXWrl2r\nadOmKSoqSiNHjlSVKlUkSUOHDtWcOXP0yCOP6Pjx44qKitItt9yiFi1aqGvXrnr55Zd19913q1q1\naurevbu++eYbu82xYNu2bZo5c6ZycnJUuXJldenSxftX0KhRozRr1iw9+OCDysvLU40aNZScnCxJ\nuu6665Sfn68JEybowIEDCgkJUUJCgpo0aaLAwEA9+eSTmjJliv71r3+pSZMm6tixowoLC/051FOc\nfP2daYy9e/fW+PHj1bt3b9WqVUsdOnTQ+++/773/yU8VzJkzR7fddluJ48oXoaGhf3p8DhgwQFOn\nTtWHH36ounXrqk2bNvrxxx/LrgFnUFhYqDlz5mjXrl3ef0SHDBmiSy+9VFlZWXrmmWe8nzr546X4\nTp066cMPP9Q999xzyn47dOigDz74QC+88IJq166tJ5980nsl93yehwvpTL2pXbu2brjhBj366KMK\nDw9Xv3799OWXX5bJY/pyTkxMTNS3337r/WTiyeWTr2VJuvfee/Xuu+/qiSee0JEjR3TJJZeobdu2\nuu6668qkzvPBj6oBAHxy7Ngx3XvvvXr99de977EAzoapEwDAWRlj9NFHH6l58+aEDJwTpk4AAH+q\nsLBQffv2VWRkpPcLugBfMXUCAACsYeoEAABYQ9AAAADWEDQAAIA1BA0AAGANQQMAAFhD0ABQauPH\nj1dsbKycTqe6d+9u/fG6d+9+xh8RBFA+8T0aAEpl69atGjZsmB5//HF16dKFL3ECcFoEDQClsnnz\nZhljdP/996tu3br+LgdAOcXUCYBz1r9/f3Xp0kWSVK9ePQUEBGjWrFnKzs7WkCFDVKtWLYWEhKhF\nixZasmTJKff/5JNP1KpVK4WGhio6OlopKSnKyckpsc2vv/6q9u3bq1KlSqpXr55mz559QcYGoGxx\nRQPAORs1apQSEhL0+OOPa/HixapVq5bq1Kmjm266SQcOHNALL7ygyy67zPvLp2lpad5fmnzvvfd0\n1113acCAAXruuee0b98+PfHEE8rKyvL+/HZeXp5uvvlmhYeH65133vE+5rFjx1S/fn2/jRtAKRgA\nKIX333/fSDLp6enGGGPefPNNExgYaDZu3Fhiu1atWpk777zTGGNMcXGxiYuLM7179y6xzaeffmoC\nAgLMhg0bjDHGvPrqq8bhcJgtW7Z4t9m6datxOBymffv29gYFoMwxdQKgTCxZskSJiYlq0KCBioqK\nvP/ddNNN+v777yVJW7ZsUUZGhnr27Flim/bt28vhcGjt2rWSpNWrV6tJkyYlrl5cccUVatq0qV/G\nBqD0mDoBUCZcLpd+/PFHBQUFnbLO6XR6t5Gk22+//bT72LVrlyRp3759iomJOWV9jRo15Ha7y6pk\nABcAQQNAmahWrZquuuoqzZw580+3kaQpU6aoVatWp6y/9NJLJUm1atVSWlraKesPHDigiIiIMqoY\nwIVA0ABQJm688Ub95z//0aWXXuoNDH/UqFEj1a5dW9u3b9dDDz10xn21bNlSb7/9trZu3eqdPtm2\nbZt++ukntW3b1kr9AOwIMMYYfxcBoOL54IMPdPvttys9PV3x8fHKz89XmzZtdPToUT322GNq0KCB\nsrOz9eOPP6qgoEBjxoyRJL377rvq06ePBg4cqNtuu03h4eHKyMjQJ598ohdffFENGjSQ2+3WFVdc\noSpVqmj06NEyxujpp5/W0aNHVb9+fX311Vf+HTwAn3FFA0CZCAkJ0dKlS/Xss8/qhRde0L59+xQV\nFaVmzZppyJAh3u3uvPNOVa1aVS+88ILmzJkjSYqPj9ctt9yiGjVqSJJCQ0O1ZMkSpaSkqG/fvrrs\nsss0atQoffjhh8rOzvbL+ACUDlc0AACANXy8FQAAWEPQAAAA1hA0AACANQQNAABgDUEDAABYQ9AA\nAADWEDQAAIA1BA0AAGANQQMAAFhD0AAAANYQNAAAgDX/D9RuXQcH7udpAAAAAElFTkSuQmCC\n", + "text/plain": [ + "" + ] + }, + "metadata": {}, + "output_type": "display_data" + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n" + ] + } + ], + "source": [ + "#Generate plot that shows the weights of chicks vs. feed type(scatter)\n", + "plot1= ggplot(chicken,aes(x=\"feed\",y=\"weight\"))+geom_dotplot(binaxis=\"y\",stackdir=\"center\", stackratio=0.5, dotsize=0.2)+theme_classic()\n", + "\n", + "print plot1\n", + "\n", + "#Generate plot that shows average weight vs. feed type (bar)\n", + "plot2= ggplot(chicken, aes(y=\"weight\",x=\"feed\"))+geom_bar(stat=\"summary\",fun_y=numpy.mean)\n", + "print plot2" + ] + }, + { + "cell_type": "markdown", + "metadata": { + "collapsed": true + }, + "source": [ + "### Part 2: Null Hypotheses for Difference in Chick Weight (Soybean vs. Sunflower)\n", + "\n", + "#### Hypotheses\n", + "\n", + "* *Null Hypothesis*: There is no difference in chick weight when fed soybean or sunflower seed.\n", + "* *Alternative Hypothesis*: There is a significant difference in chick weight between those fed soybean feed and those fed sunflower seed." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#Subset the Data to Only Have the Types of Feed we are Interested in\n", + "chicksub=chicken.loc[chicken.feed.isin(['soybean', 'sunflower']),:]\n", + "\n", + "#Make Dataframe for Modeling\n", + "chickFrame= pandas.DataFrame({'y':chicksub.weight,'x':0})\n", + "chickFrame.loc[chicksub.feed=='sunflower','x']=1" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 3: Test Null Hypothesis Using Likelihood Ratio Test\n", + "\n", + "* Step 1: Define Null Model\n", + "* Step 2: Define Alternative Model\n", + "* Step 3: Run/Generate Likelihood Ratio Tests" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": { + "collapsed": true + }, + "outputs": [], + "source": [ + "#Define Null\n", + "def nllikeNull(pNull,obsNull):\n", + " B0Null=pNull[0]\n", + " sigmaNull=pNull[1]\n", + " expectedNull=B0Null\n", + " nllNull=-1*norm(expectedNull,sigmaNull).logpdf(obsNull.y).sum()\n", + " return nllNull\n", + "\n", + "#Define Alternative\n", + "def nlllikeAlt(pAlt,obsAlt):\n", + " B0Alt=pAlt[0]\n", + " B1Alt=pAlt[1]\n", + " sigmaAlt=pAlt[2]\n", + " expectedAlt=B0Alt+B1Alt*obsAlt.x\n", + " nllAlt=-1*norm(expectedAlt,sigmaAlt).logpdf(obsAlt.y).sum()\n", + " return nllAlt" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 145.240592\n", + " Iterations: 85\n", + " Function evaluations: 162\n", + "Estimated Parameters: Null Model\n", + "[ 284.49999051 64.53691755]\n", + "NLL: Null Model\n", + "145.240592097\n" + ] + } + ], + "source": [ + "#Null Model\n", + "initialGuessNull=numpy.array([1,1])\n", + "fitNullChickFrame=minimize(nllikeNull,initialGuessNull, method=\"Nelder-Mead\",options={'disp':True},args=chickFrame)\n", + "print(\"Estimated Parameters: Null Model\")\n", + "print(fitNullChickFrame.x)\n", + "print(\"NLL: Null Model\")\n", + "nllNullChickFrame=fitNullChickFrame.fun\n", + "#Print NLL value for Null Model\n", + "print(nllNullChickFrame)" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimization terminated successfully.\n", + " Current function value: 138.469162\n", + " Iterations: 200\n", + " Function evaluations: 363\n", + "Estimated Parameters: Alternative Model\n", + "[ 246.42855057 82.48813575 49.73948886]\n", + "NLL: Alternative Model\n", + "138.469161825\n" + ] + } + ], + "source": [ + "#Alternative Model\n", + "initialGuessAlt=numpy.array([1,1,1])\n", + "fitAltChickFrame=minimize(nlllikeAlt,initialGuessAlt,method=\"Nelder-Mead\",options={'disp':True},args=chickFrame)\n", + "print(\"Estimated Parameters: Alternative Model\")\n", + "print(fitAltChickFrame.x)\n", + "print(\"NLL: Alternative Model\")\n", + "nllAltChickFrame=fitAltChickFrame.fun\n", + "#Print NLL value for Alternative Model\n", + "print(nllAltChickFrame)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "### Part 4: Interpret Results of Likelihood Ratio Test\n", + "\n", + "* Step 1: Calculate D value\n", + "* Step 2: Calculate p value\n", + "\n", + "##### Conclusions:\n", + "As our p-value was less than 0.05, we can report that our alternative hypothesis was correct. This means that there is a significant difference between the chicks who were fed soybean feed vs. those who were fed sunflower feed." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "D Value\n", + "13.5428605444\n", + "p-value\n", + "0.000233176728695\n" + ] + } + ], + "source": [ + "#Calculate D value\n", + "DchickFrame=2*(nllNullChickFrame-nllAltChickFrame)\n", + "print(\"D Value\")\n", + "print(DchickFrame)\n", + "\n", + "#Calculate p value\n", + "pChickFrame=1-scipy.stats.chi2.cdf(x=DchickFrame,df=1)\n", + "print(\"p-value\")\n", + "print(pChickFrame)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/Exercise12-Q2.html b/Exercise12-Q2.html new file mode 100644 index 0000000..f31e894 --- /dev/null +++ b/Exercise12-Q2.html @@ -0,0 +1,11947 @@ + + + +Exercise12-Q2 + + + + + + + + + + + + + + + + + + + +
+
+ +
+
+
+
+

Using Regular Expressions to Match Patterns

Matching patterns using regular expressions is useful when you want to look for strings in a file with a lot of data. In this exercise we will look at 3 scenarios and use regular expressions to match patterns.

+

In order to use regular expressions in Python you first need to add the regular expression package(re). Then, for each scenario, you will need to simulate some data, build the necessary regular expression(s)

+ +
+
+
+
+
+
+
+

Scenario 1: Times

This pattern will match times after noon, but before midnight when reported in 24-hour or "military" format(e.g. 15:30). The following regular expression(s) work because it makes it so the only digits you capture are those that start with a 1 (i.e. 12:xx) or 2 (i.e. 20:xx). The print then combines the 2 filters so that you can see all values after noon/before midnight.

+ +
+
+
+
+
+
In [1]:
+
+
+
#Import packages needed
+import re
+#Simulate Data
+times=['00:30','o1:30','02:30','03:30','04:30','05:30','06:30','07:30','08:30','09:30','10:30','11:30','12:30','13:30','14:30','15:30','16:30','17:30','18:30','19:30','20:30','21:30','22:30','23:30']
+#Build expressions
+regex1=re.compile('[1][2-9]:\d{2}')
+regex2=re.compile('[2][0-9]:\d{2}')
+#Filter
+print(filter(regex1.match,times)+filter(regex2.match,times))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
['12:30', '13:30', '14:30', '15:30', '16:30', '17:30', '18:30', '19:30', '20:30', '21:30', '22:30', '23:30']
+
+
+
+ +
+
+ +
+
+
+
+
+

Scenario 2: Genus Species Names

This pattern will match genus species names that are expressed in the format G. species(e.g. H. sapiens). This code will look for a capital letter(A-Z), followed by a period, then a space and finally 2-25 lowercase letters. As we use the .match function, it will look for instances where the string starts with the specified parameters.

+ +
+
+
+
+
+
In [4]:
+
+
+
#Simulate Data
+names=['M. avium','Bubbles','T. cruzi','J. F. Kennedy','B. megaterium','Kei-ichi Uchiya','mumbo.jumbo','T. rex', 'S. pyogenes','h. sapiens']
+#Build Expression
+regex=re.compile('[A-Z]\.\s[a-z]{2,25}')
+#Filter
+print(filter(regex.match,names))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
['M. avium', 'T. cruzi', 'B. megaterium', 'T. rex', 'S. pyogenes']
+
+
+
+ +
+
+ +
+
+
+
+
+

As you can see, this expression works because it ignored items like 'Bubbles', 'J. F. Kennedy, etc. This is because they did not fit the required format. In the instance of 'Bubbles' it was ignored because it didn't have a period or space following the first letter.In the 'J. F. Kennedy' example it was ignored because it failed the second part of the expression which required a lowercase letter/word following the first period and space.

+ +
+
+
+
+
+
+
+

Scenario 3: Social Security Numbers

This pattern will match social security numbers in the proper format(e.g. 389-05-4771). This code will look for 3 digits followed by a dash, then 2 digits followed by a dash and finally 4 digits.

+ +
+
+
+
+
+
In [5]:
+
+
+
#Simulate Data
+data=['389-05-4771','123-45-6789','McDougal Littell','876-54-3210','111-22-3333','Goofy','888-77-6666','22-333-44']
+#Build Expression
+regex=re.compile('\d{3}\-\d{2}\-\d{4}')
+#Filter
+print(filter(regex.match,data))
+
+ +
+
+
+ +
+
+ + +
+ +
+ + +
+
['389-05-4771', '123-45-6789', '876-54-3210', '111-22-3333', '888-77-6666']
+
+
+
+ +
+
+ +
+
+
+
+
+

This regular expression worked because it ignored data like 'Goofy' and '22-333-44'. Naturally, Goofy was gnored because it didn't start with a digit and 22-333-44 was ignored because it didn't start with 3 digits.

+ +
+
+
+
+
+ + + + + + diff --git a/Exercise12-Q2.ipynb b/Exercise12-Q2.ipynb new file mode 100644 index 0000000..785a18e --- /dev/null +++ b/Exercise12-Q2.ipynb @@ -0,0 +1,146 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Using Regular Expressions to Match Patterns\n", + "\n", + "Matching patterns using regular expressions is useful when you want to look for strings in a file with a lot of data. In this exercise we will look at 3 scenarios and use regular expressions to match patterns. \n", + " \n", + "In order to use regular expressions in Python you first need to add the regular expression package(re). Then, for each scenario, you will need to simulate some data, build the necessary regular expression(s) " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario 1: Times\n", + "\n", + "This pattern will match times after noon, but before midnight when reported in 24-hour or \"military\" format(e.g. 15:30). The following regular expression(s) work because it makes it so the only digits you capture are those that start with a 1 (i.e. 12:xx) or 2 (i.e. 20:xx). The print then combines the 2 filters so that you can see all values after noon/before midnight." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['12:30', '13:30', '14:30', '15:30', '16:30', '17:30', '18:30', '19:30', '20:30', '21:30', '22:30', '23:30']\n" + ] + } + ], + "source": [ + "#Import packages needed\n", + "import re\n", + "#Simulate Data\n", + "times=['00:30','o1:30','02:30','03:30','04:30','05:30','06:30','07:30','08:30','09:30','10:30','11:30','12:30','13:30','14:30','15:30','16:30','17:30','18:30','19:30','20:30','21:30','22:30','23:30']\n", + "#Build expressions\n", + "regex1=re.compile('[1][2-9]:\\d{2}')\n", + "regex2=re.compile('[2][0-9]:\\d{2}')\n", + "#Filter\n", + "print(filter(regex1.match,times)+filter(regex2.match,times))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario 2: Genus Species Names\n", + "\n", + "This pattern will match genus species names that are expressed in the format G. species(e.g. H. sapiens). This code will look for a capital letter(A-Z), followed by a period, then a space and finally 2-25 lowercase letters. As we use the .match function, it will look for instances where the string starts with the specified parameters." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['M. avium', 'T. cruzi', 'B. megaterium', 'T. rex', 'S. pyogenes']\n" + ] + } + ], + "source": [ + "#Simulate Data\n", + "names=['M. avium','Bubbles','T. cruzi','J. F. Kennedy','B. megaterium','Kei-ichi Uchiya','mumbo.jumbo','T. rex', 'S. pyogenes','h. sapiens']\n", + "#Build Expression\n", + "regex=re.compile('[A-Z]\\.\\s[a-z]{2,25}')\n", + "#Filter\n", + "print(filter(regex.match,names))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As you can see, this expression works because it ignored items like 'Bubbles', 'J. F. Kennedy, etc. This is because they did not fit the required format. In the instance of 'Bubbles' it was ignored because it didn't have a period or space following the first letter.In the 'J. F. Kennedy' example it was ignored because it failed the second part of the expression which required a lowercase letter/word following the first period and space." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## Scenario 3: Social Security Numbers\n", + "\n", + "This pattern will match social security numbers in the proper format(e.g. 389-05-4771). This code will look for 3 digits followed by a dash, then 2 digits followed by a dash and finally 4 digits." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "['389-05-4771', '123-45-6789', '876-54-3210', '111-22-3333', '888-77-6666']\n" + ] + } + ], + "source": [ + "#Simulate Data\n", + "data=['389-05-4771','123-45-6789','McDougal Littell','876-54-3210','111-22-3333','Goofy','888-77-6666','22-333-44']\n", + "#Build Expression\n", + "regex=re.compile('\\d{3}\\-\\d{2}\\-\\d{4}')\n", + "#Filter\n", + "print(filter(regex.match,data))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "This regular expression worked because it ignored data like 'Goofy' and '22-333-44'. Naturally, Goofy was gnored because it didn't start with a digit and 22-333-44 was ignored because it didn't start with 3 digits." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 2", + "language": "python", + "name": "python2" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +}