Skip to content

Instantly share code, notes, and snippets.

@lawih
Last active November 9, 2015 04:39
Show Gist options
  • Save lawih/3c043627cecebd292312 to your computer and use it in GitHub Desktop.
Save lawih/3c043627cecebd292312 to your computer and use it in GitHub Desktop.
Display the source blob
Display the rendered blob
Raw
{
"cells": [
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# Quicksort vs. Insertion sort"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se desea encontrar el mayor $N$ (tamaño de lista) en el cual sea mejor utilizar el algoritmo **`Insertion Sort`** que el algoritmo **`Quicksort`**."
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Insertion sort"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"La función `insertion_sort()` recibe como parámetro una lista `L` que será ordenanda por dicha función mediante el método de inserción."
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def insertion_sort( L ):\n",
" i = 1\n",
" while i < len(L):\n",
" element = L[i]\n",
" j = i - 1 \n",
" while (j > -1) and (L[j] > element):\n",
" L[j + 1] = L[j]\n",
" j -= 1\n",
" L[j + 1] = element\n",
" i += 1"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Quicksort"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Para implementar el algoritmo `quicksort` se utilizó el código encontrado [aquí](http://interactivepython.org/runestone/static/pythonds/SortSearch/TheQuickSort.html)."
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def quicksort( alist ):\n",
" quicksort_helper( alist, 0, len(alist) - 1 )"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def quicksort_helper( alist, first, last ):\n",
" if first < last:\n",
" splitpoint = quicksort_partition( alist, first, last)\n",
" \n",
" quicksort_helper( alist, first, splitpoint - 1 )\n",
" quicksort_helper( alist, splitpoint + 1, last )"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"def quicksort_partition( alist, first, last):\n",
" pivotvalue = alist[first]\n",
"\n",
" leftmark = first + 1\n",
" rightmark = last\n",
"\n",
" done = False\n",
" while not done:\n",
"\n",
" while leftmark <= rightmark and alist[leftmark] <= pivotvalue:\n",
" leftmark = leftmark + 1\n",
"\n",
" while alist[rightmark] >= pivotvalue and rightmark >= leftmark:\n",
" rightmark = rightmark -1\n",
"\n",
" if rightmark < leftmark:\n",
" done = True\n",
" else:\n",
" temp = alist[leftmark]\n",
" alist[leftmark] = alist[rightmark]\n",
" alist[rightmark] = temp\n",
"\n",
" temp = alist[first]\n",
" alist[first] = alist[rightmark]\n",
" alist[rightmark] = temp\n",
"\n",
" return rightmark"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Cálculo de Tiempo de Ejecución"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Para generar arreglos de números aleatorios:"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {
"collapsed": true
},
"outputs": [],
"source": [
"import random as rnd\n",
"def get_random_numbers( n ):\n",
" return rnd.sample( xrange(n + 1), n )"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Para calcular el tiempo de ejecución al ordenar dichos arreglos:"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import time \n",
"\n",
"def calculate(): \n",
" sizes = xrange( 1, 50, 1 )\n",
" insertion_time = []\n",
" quicksort_time = []\n",
" \n",
" for i in sizes:\n",
" avg_insertion = 0\n",
" avg_quicksort = 0\n",
" \n",
" for _ in xrange(10):\n",
" A = get_random_numbers( i )\n",
" B = list(A)\n",
" \n",
" t0 = time.clock()\n",
" insertion_sort(A)\n",
" a = (time.clock() - t0) * 1000 #Milliseconds\n",
" \n",
" t0 = time.clock()\n",
" quicksort(B)\n",
" b = (time.clock() - t0) * 1000 #Milliseconds\n",
"\n",
" avg_insertion += a \n",
" avg_quicksort += b\n",
" \n",
" avg_insertion /= 10\n",
" avg_quicksort /= 10\n",
" \n",
" insertion_time.append( avg_insertion )\n",
" quicksort_time.append( avg_quicksort )\n",
" \n",
" return sizes, insertion_time, quicksort_time "
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Encontrar intersección"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se encuentra el último punto en el que **`Insertion Sort`** fue más rápido que **`Quicksort`**."
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def find_intersection( sizes, insertion_time, quicksort_time ): \n",
" best = (0, 0)\n",
" for i in xrange( len(sizes) ):\n",
" if( insertion_time[i] <= quicksort_time[i] ):\n",
" best = ( sizes[i], quicksort_time[i] )\n",
" return best"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"## Gráfico de las Funciones"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def plot_functions( sizes, insertion_time, quicksort_time ):\n",
" plot( sizes, insertion_time, '-m', label = 'Insertion sort' )\n",
" plot( sizes, quicksort_time, '-b', label = 'Quicksort' )\n",
" legend( loc = 'upper left' )\n",
" pylab.xlabel( \"Array size\" )\n",
" pylab.ylabel( \"Miliseconds\" )\n",
" \n",
" point = find_intersection( sizes, insertion_time, quicksort_time )\n",
" plot(point[0], point[1], 'ok')\n",
" \n",
" print \"\\nEl tamaño donde es mejor utilizar Insertion Sort es: \" + str(point[0]) + \".\""
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Se utilizan tamaños de $1$ a $50$, incrementando de a $1$."
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"scrolled": false
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Populating the interactive namespace from numpy and matplotlib\n",
"\n",
"El tamaño donde es mejor utilizar Insertion Sort es: 26.\n"
]
},
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAAYoAAAEPCAYAAABcA4N7AAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3Xd4VNX28PHvTkhIp4YSCL0KJICIgKLxqvywdwUFu+IV\nsDds4KvCtSCKYEXFcq8i9koRjSJFREB6CRISEkJLCOllZr1/nCEESMJMMpPJZNbneeZh5pQ9Oyd6\nVs4uaxsRQSmllKpMgLcroJRSqm7TQKGUUqpKGiiUUkpVSQOFUkqpKmmgUEopVSUNFEoppark0UBh\njBlujNlsjNlmjHm4gv3XGWP+NsasNcYsMcbEOXuuUkqp2mE8NY/CGBMIbAHOAdKAP4GRIrKp3DGD\ngY0ikm2MGQ5MEpFBzpyrlFKqdnjyiWIgkCQiySJSAnwCXFL+ABFZJiLZjo9/AG2dPVcppVTt8GSg\naAOklvu8y7GtMrcAP1TzXKWUUh7SwINlO92mZYw5C7gZOM3Vc5VSSnmWJwNFGhBb7nMs1pPBURwd\n2G8Dw0Uky8VzNaAopVQ1iIhx9lhPNj2tBLoaYzoYY4KBa4Bvyh9gjGkHfAGMEpEkV849TET0JcLE\niRO9Xoe68tJroddCr0XVL1d57IlCREqNMeOA+UAg8I6IbDLGjHHsfxN4EmgCvG6MASgRkYGVneup\nuiqllKqcJ5ueEJEfgR+P2fZmufe3Arc6e65SSqnapzOz64mEhARvV6HO0GtxhF6LI/RaVJ/HJtzV\nBmOM+HL9lVLKG4wxiAud2R5tevIWR3+H8hP6x4JSnlUvAwXozcNf6B8FSnme9lEopZSqkgYKpZRS\nVdJAoZRSqkoaKPzY4sWL6dGjh7eroZSq4zRQeEGHDh1YtGhRrX9vQEAA//zzT9nnoUOHsnnz5lqv\nhysmTZrE6NGjvV0NpfyaBgovMMbU6mid0tLSsve+NBqsfL2VUt6jgcLLZs+ezemnn86DDz5I06ZN\n6dSpE/PmzTtqf+fOnYmKiqJTp07873//K9v37rvvctJJJ9G0aVOGDx9OSkpK2b6AgABee+01unXr\nRrdu3TjzzDMBiI+PJzIykrlz55KYmEhs7JEkvZs2bSIhIYEmTZrQu3dvvv3227J9N954I2PHjuXC\nCy8kKiqKQYMGHfV0Ul5hYSGjRo2iefPmNGnShIEDB7J3714A0tPTufjii2nWrBldu3Zl1qxZZedN\nmjSJK6+8ktGjR9OoUSPefPNNpkyZwpw5c4iMjKRfv341vNpKqWrxdhbDGmZAlIpUtr2u6NChgyxa\ntEhERN577z0JCgqSWbNmid1ul9dff11iYmJERCQ3N1eioqJk69atIiKSkZEhGzZsEBGRr776Srp0\n6SKbN28Wm80mzzzzjAwZMqTsO4wxMmzYMMnKypLCwsKybdu3by875pdffpG2bduKiEhxcbF07txZ\npkyZIiUlJfLzzz9LZGSkbNmyRUREbrjhBmnWrJn8+eefUlpaKtddd52MGDGiwp/vjTfekIsuukgK\nCgrEbrfLqlWr5NChQyIiMnToUBk7dqwUFRXJmjVrJDo6Wn7++WcREZk4caIEBQXJ119/LSIiBQUF\nMmnSJBk9enSl17Ku/66Vqosc/984fa+ttxPuTiTRJNa4jARJqHEZAO3bt+eWW24B4Prrr+fOO+9k\n7969hIeHExAQwLp162jbti0tW7akZcuWALzxxhtMmDCB7t27AzBhwgQmT55Mampq2VPChAkTaNy4\nsVN1WL58OXl5eTzyyCMAnHXWWVx44YV8/PHHTJw4EYDLL7+cAQMGAHDddddx3333VVhWcHAwBw4c\nYNu2bfTp06fsSSA1NZWlS5fy448/EhwcTHx8PLfeeisffPABZ511FgBDhgzh4osvBiAkJKTaaZGV\nUu7jt4HCXTd5d2jVqlXZ+7CwMAByc3Np0aIFc+bM4cUXX+SWW27htNNOY+rUqXTv3p2dO3dy9913\nc//99x9VVlpaWlmgKN+sdCLp6enHHd++fXvS09MBq1/lcJACCA0NJTc3t8KyRo8eTWpqKiNGjODg\nwYOMGjWKZ599lvT0dJo2bUp4eHjZse3atWPlypVln9u2bVtRkUopL9I+ijpu2LBhLFiwgIyMDHr0\n6MFtt90GWDfYt956i6ysrLJXXl4egwYNKjvXlQ7zmJgYUlNTj/rrfefOnbRp4/pS5Q0aNODJJ59k\nw4YNLF26lO+++44PPviANm3akJmZeVSASUlJOSo4HFvngAD9T1Qpb9P/C+uwvXv38vXXX5OXl0dQ\nUBDh4eEEBgYCcMcddzB58mQ2btwIQHZ2NnPnzq2yvJYtW7J9+/YK95166qmEhYXx/PPPU1JSQmJi\nIt999x0jRowAXBstlZiYyLp167DZbERGRhIUFERgYCBt27ZlyJAhTJgwgaKiItauXcu7777LqFGj\nqqxzcnKyNj8p5UUaKLysoqGyhz/b7XamTZtGmzZtaNasGYsXL+b1118H4NJLL+Xhhx9mxIgRNGrU\niD59+jB//vzjyihv0qRJ3HDDDTRp0oTPPvvsqO8ODg7m22+/5ccffyQ6Oppx48bx4Ycf0q1btxPW\n81gZGRlcddVVNGrUiJNOOomEhISyuRAff/wxycnJxMTEcPnll/P//t//41//+lel33HVVVcB0KxZ\ns7L+EaVU1UoyS0h9OdVt5dXL9Sgcuda9UCNV2/R3rdTxUp5LIW9jHj3f71nhflfXo9AnCqWUqkfs\npXbSZqbR9i73DQzRQKGUUvXI/q/207BdQyJPjnRbmRoolFKqHkl7JY22d7t3mLkGCqWUqidyVuVQ\nuLOQ5pc1d2u5GiiUUqqe2PXKLtqMbUNAA/fe2jVQKKVUPVC8p5gD3xyg9W2t3V62BgqllKoH0t9M\nJ/rqaIKaBrm9bL/N9aSUUvWFvdhO+uvpxC2M80j5+kShlFI+bu+newnrFUZE7wiPlK+Bwgf17t2b\n33777YTHHbv0qVKq/hERjwyJLU8DhZfMnj2bPn36EB4eTuvWrRk7diyHDh1y6tz169dzxhlneLiG\nzpk9ezZDhw71djWU8luHlh2iJKuEZhc089h3aKDwgqlTp/LII48wdepUDh06xPLly0lOTmbYsGE+\ntU60L9VVqfpq1yu7aDu+LSbA+WUFXObKcnh17YUPLoWanZ0tERERMnfu3KO25+bmSnR0tLz//vty\nww03yOOPP162r/ySpSIi7du3l59++klEREpLS+XZZ5+Vzp07S2RkpJx88smya9cuETl66dPFixdL\nbGys/PrrryIics8990iLFi0kKipK+vTpI+vXrxcRkYMHD8ro0aMlOjpa2rdvL88884zY7XYRsZZt\nHTJkiNx7773SrFkzueKKKyQkJEQCAwMlIiJCmjRp4qGrVrm6/LtWytMKUgpkcZPFUpJd4tJ56FKo\nznFhTZ9KVSdp6dKlSyksLOTyyy8/ant4eDjnn38+CxYsICio6uFt5dNxv/TSS3zyySf8+OOPdO3a\nlbVr1xIaGnrU8fPmzeP222/niy++YMCAAcyfP5/Fixezbds2oqKi2LJlC40aNQJg/Pjx5OTksGPH\nDvbv38+wYcNo3bo1N998MwArVqzg2muvZe/evRQXFzNnzhxmzZrF4sWLXb8YSqkaSX89nZajW9Ig\nyrO3cr9tehKp+as69u/fT/PmzStcua1169bs27fPpfJmzZrFs88+S9euXQGIi4ujadOmZfvnzJnD\nHXfcwbx588rWcwgODiYnJ4dNmzZht9vp3r07rVq1wmazMWfOHKZMmUJ4eDjt27fn/vvv58MPPywr\nLyYmhrFjxxIQEFC2prVSqvaV5paye9Zu2oxzfRVKV/ltoPCW5s2bs3//fux2+3H70tPTad7ctRwt\nu3btonPnzpXunz59Otdccw0nnXRS2bazzjqLcePGMXbsWFq2bMmYMWPIyclh//79lJSU0L59+7Jj\n27VrR1paWtlnV9bhVkp5zu63d9P4zMaEdQ3z+HdpoKhlgwcPpmHDhnz++edHbc/NzWXevHmcddZZ\nhIeHk5+fX7YvIyOj0vJiY2NJSkqqdP/cuXP58ssvmT59+lHbx48fz8qVK9m4cSNbt27lhRdeIDo6\nmqCgIJKTk8uOO9Ga1q6sy62Ucg97kZ3Uqam0m9CuVr5PA0Uta9SoERMnTmT8+PHMnz+fkpISkpOT\nufrqq4mOjua6666jb9++/PDDD2RlZZGRkcHLL79caXm33norTzzxBElJSYgIa9euJTMzs2x/TEwM\nixYt4pVXXuGNN94AYOXKlfzxxx+UlJQQFhZGSEgIgYGBBAQEcPXVV/PYY4+Rm5vLzp07mTZtWpVr\nWrdq1Ypdu3ZRUlLivouklKrSno/2EN4rnMj+7ltzokqu9HzXtRc+OOrpsHfeeUd69+4tISEhYoyR\nhIQE2b17t4iIFBYWyjXXXCNRUVESHx8v06ZNk9jY2LJzO3ToIIsWLRIREZvNJs8884x07NhRIiMj\nZeDAgZKWliYiIgEBAWWjnnbs2CHt27eXd955RxYtWiRxcXESEREhzZs3l1GjRkleXp6IiGRlZcmo\nUaMkOjpaYmNj5emnny4b9TR79mwZOnToUT9HcXGxXHDBBdK0aVOJjo727EWrgC/8rpVyJ3upXZZ3\nXS6Zv2RWuwxcHPWka2bXAbNnz+bJJ59kyZIl2gfgIl/7XStVU3vn7iV1air9l/WvdtOvq2tma6Co\nIz766COCgoK45pprvF0Vn+KLv2ulqktE+GvAX3R4sgPNL6n+4kQaKNCbhz/R37XyJ5kLMkm6N4lT\n1p1So5nYrgYK7cxWSikfkTIlhXaPtPNsuo4KaKBQSikfkL08m4IdBbQY0aLWv1sDhVJK+YCUKSm0\ne7AdAUG1f9uut7medCKYUqq+yF2fy6E/DnHSJyed+GAPqJeBQjs3lVL1SepzqbS9uy2BoYFe+X5t\nelJKqTqsYEcBB344QJs7PZ/8rzL18olCKaV8na3Qxv4v95M6NZWYMTE0aOS927VHnyiMMcONMZuN\nMduMMQ9XsL+HMWaZMabQGHP/MfuSjTFrjTGrjTErPFlPpZSqDYdWHiJ/Wz5iq7x5PG9jHkn3JrE8\ndjm739lNu4fa0eGpDrVWx4p4LEQZYwKBGcA5QBrwpzHmGxHZVO6wA8B44NIKihAgQUQyK9inlFI+\nJf2tdHY8uYPA0ECKM4oJ7RpKWM8wwnqGEd4zHFuBjd2zdlO4vZBWN7Wi//L+hHYOPXHBtcCTzzID\ngSQRSQYwxnwCXAKUBQoR2QfsM8ZcUEkZOnRJKVXn7P1sL3s+2EPP//WkQcSJb6MH5h1gx5M76Pd7\nP8K6hGHLs5G/JZ/8Tfnkbcpj76d7EZsQ+0AszS5o5pUhsFXxZKBoA6SW+7wLONWF8wX4yRhjA94U\nkbfdWTmllKqutOlp2AvtrB22lj4/9CGoceXLF+f+ncvm6zfT+8vehHWxFhkKDA8ksn9k7aUJryFP\nBoqajlE9TUR2G2OigYXGmM0ictzCzJMmTSp7n5CQQEJCQg2/VimlKpeflE/+lnwGpwxm+0Pb+ftf\nfxM3P47g6ODjji1KK2LdRevoOqMrjU5r5IXaWhITE0lMTKz2+R5LCmiMGQRMEpHhjs8TALuIPFfB\nsROBXBGZWklZFe6vLCmgUkp5yj+P/4M9306Xl7ogIux4fAf7v9xP/E/xNIxpWHZcaU4pq4eupuXI\nlrR7uHZWonNWXUoKuBLoaozpYIwJBq4Bvqnk2KMqbIwJM8ZEOt6HA8OAdR6sq1JKnZDYhD0f7KHV\nja0A64bb6dlOtBzdktVnrKYguQAAe6mdjVdvJOrUKGIf8v01ZjzW9CQipcaYccB8IBB4R0Q2GWPG\nOPa/aYxpBfwJRAF2Y8zdwElAC+ALRxqOBsB/RWSBp+qqlFLOyPo5i6DoICLiIo7a3n5CewIjAllz\nxhriF8az6+VdiAhdZ3atF+mE6uV6FEop5Qkbr9tI1OAo2o5rW+H+3e/uJumeJEI6htBvcT8aRNXN\nOc26cJFSSnlAycESlndYzqDtgwhqVvkop6zELMK6h9GwdcNKj/E2VwNF3Qx3SilVx+z7dB9Nz21a\nZZAAaJLQpJZqVHvq1qwOpZSqozLeyyjrxPY3GiiUUuoE8jbnUZhcSJP/q39PC87QQKGUUieQMTuD\nlqNbEtDAP2+Z/vlTK6WUk8Qm7Plwj982O4EGCqWUqlLmgkwatm1I+Enh3q6K12igUEqpKmTMzqDV\nTf77NAEaKJRSqlIlmSVkzs+kxYgW3q6KV2mgUEqpSuz9ZC/NzmtWZRpxf6CBQimlKpHxnjY7gQYK\npZQ6TsH2AtZeuBYpFZqc7Z9zJ8rTQKGUUg62fBs7ntzBX6f+ReMzGtP/j/6YQN/P/lpTmutJKeX3\nRIT9X+9n+73biRwYyYA1AwhpG+LtatUZGiiUUn6tYHsB28ZvozC5kO6zumtTUwU0UCil/JbYhL/P\n/ZvWt7Wm91e9CQjW1viKaKBQSvmtAz8cICg6iPYT2nu7KnWahk+llN9Km5lGm7FtvF2NOk8DhVLK\nL+Vvyyd3VS7RV0d7uyp1ngYKpZRfSn8tnda3tCYwJNDbVanztI9CKeV3bHk2Mj7IYMCqAd6uik/Q\nJwqllN/Z8789NBraiJD2OlfCGRoolFJ+RURIm6Gd2K7QQKGU8ivZS7KxF9p1Yp0LThgojDGnG2Mi\nHO9HG2NeMsbooGOllE86/DRhAjSHk7OceaJ4HcgzxsQD9wHbgQ88WiullPKAot1FZM3PotUNmjrc\nFc4EilIREeBSYKaIzAQiPVstpZRyv91v76bFiBY0aKQDPl3hzNXKMcY8CowChhpjAgH/Xu5JKeVz\n7CV20t9MJ25+nLer4nOceaK4BigCbhaRDKAN8KJHa6WUUm62/6v9hHYJJaJ3hLer4nOM1arkm4wx\n4sv1V0rVntUJq2kztg0trmrh7ap4nTEGEXG6N7/SpidjTC5Q2V1YRCTK1coppZQ35K7LpWBbAc0v\nbe7tqvikSgOFiBweEvsMkA585Nh1HRDj+aoppVTNiF3ImJ3Bjsd20P6J9gQE6dSx6jhh05MxZq2I\nxJ1omzdo05NSqjKHVhxi27htmEBDl1e7EDVAG0EOc1vTUzl5xphRwMeOzyOA3OpUTimlDhO7kL85\nn6DoIIKaBbltAlzxnmL+mfAPmfMy6fSfTrQc1VIn19WQM4HiWuAV4GXH5yWObUopVW37v9nP5us3\nY4INtkM2gloE0bB1Q4JbBRPcOpjmlzan2fnNnC7PXmInbUYaKZNTaHVjKwZuHkiDKJ0v4Q466kkp\n5RVb/72V0C6hxN4fi73ITvGeYooziineXUzRriJSp6USdUoUXV7pQnCL4CrLykrMYtu4bTRs05Au\nr3QhvEd4Lf0UvsnVpidn+ihaALcBHTjyBCIicnN1K+kuGiiU8l3Luyyn9xe9iYireF6DrcBG8lPJ\nZLyXQefnO9Py+pYYc/S9rSitiO0PbCd7aTZdpnWh+WXNjzvGE2bPhhdegPvug1GjoGFDj3+lW3ki\nUCwDfgP+AuyOzSIin1e7lm6igUIp31TwTwGrhqxiyO4hJ7yx56zKYcutWwhqFkS3N7sR2ikUe4md\nXa/sIuU/KcSMiaH9o+0JDK+dlepEoE8fuP56+PlnWL/eChi33w4RPjKXzxOBYo2I9K1xzTxAA4VS\nvin9zXSyf8+m54c9nTreXmpn17RdpDyXQsztMez/aj8N2zWk66tdCesa5uHaHu3XX+Hf/4YNG8AY\nWL0a/vMfK2jceSeMHw/N6/h0DVcDhTODir8zxlxQgzoppdRRMhdk0mSY8+tBBDQIoN2D7ei/vD/F\nu4vp+GxH4n6Mq/UgATBzJowdawUJgH79YM4cWLoUdu+Gbt1gwYJar5ZHOfNEkQuEAcVAiWNznZiZ\nrU8USvkesQlLopdwyoZTaNjatxr309KsZqfkZIiq5A74/fdw//2wbh0E1dH0qW6fR3F4hrZSSrlD\nzsocGrZt6HNBAuCtt2DkyMqDBMD558O0afD221ZTVE3t2QMrV8LBg5CVdfS/hw5BWBg0aQKNGx/5\nt3FjiImBU06p+feDk8NjjTGXAGdg5X76VUS+dc/X14w+USjle5KfTqb0YCldpnbxdlVcUlwM7dvD\nokVw0klVH7tmDQwfDlu2QKNG1f/Offvg1FOhSxer3+PYgBAZCQUFxweQrCxo3doKbBVx+xOFMeY/\nwCnAfwED3GWMGSIiE5z9EqWUOixrYRbtHm3n7Wq47IsvoGfPEwcJgL594bzzrE7uKVOq933FxXDl\nlTBiBEyeXL0y3MWZPop1QF8RsTk+BwJrRKRPLdSvSvpEoZRvKc0pZVnMMobsGUJgWO0MZ3WXoUPh\nnnvgiiucOz4tDeLirFFR7VyMiyLWcNt9+6wAFeDmXIaeGPUkQONynxtTefpxpZSq1MHEg0QOjPS5\nIPH331YH9iWXOH9OmzbW6KhHH3X9+159Ff74Az780P1BojqcSYQyBVhljPkFq+npTOARj9ZKKVUv\nZS3Moumwpt6uhstmzoQxY6CBi6mjHnrIGi67ciUMGODcOQsWWM1Vy5ZZfRB1wQljlYh8DAwGvgQ+\nBwaJyCfOFG6MGW6M2WyM2WaMebiC/T2MMcuMMYXGmPtdOVcp5XsyF2TS5Fzn50/UBVlZMHcu3Hab\n6+dGRMBTT1nDZZ1pJd+yxUoJ8umn0KGD69/nKScMFMaYy4B8EflaRL4BCo0xlzpxXiAwAxgOnASM\nNMYcOw3zADCeY9bgdvJcpZQPKUwppPRAKRF9fWvE/ezZ1pDXli2rd/7NN0NmJnzzTdXHZWXBRRdZ\nTxNDh1bvuzzFmdavSSJy8PAHx/tJTpw3EEgSkWQRKQE+AY5q4RORfSKykiMT+Zw+VynlW7IWZtHk\nnCY+tTaE3Q6vvWb1NVRXYKCVQPChh6Dk2DudQ14eXHMNXHAB3HJL9b/LU5wJFBX9Vp3piWoDpJb7\nvMuxzRk1OVcpVQdlLvS9ZqcFC6zmo8GDa1bO8OFWU9Kbb0JhodVRPXMm3HSTNdM7OhqaNbMCSl3k\nTNfMX8aYl4CZWEFjLFYm2ROpycgop8+dNGlS2fuEhAQSEhJq8LVKKU8Qu5D1UxadX+js7aq4ZOZM\nGDfuSF6nmnjhBSvgPPQQ9OhhdW4PHmwlEezdG4KrXnKjRhITE0lMTKz2+c7Mo4gAngDOdmxaCDwj\nInknOG8QVrPVcMfnCYBdRJ6r4NiJQK6ITHXlXJ1HoZRvyPkrh02jNjFw00BvV8Vpq1ZZTwLJyVaa\nDHfYvduaVR0S4p7yqssTuZ5ygYeNMeEnCg7HWAl0NcZ0ANKBa4CRlRx7bIVdOVcpVcf5WrNTcbHV\nLPTii+4LEmCl1fBFzox6GmKM2QhsdnyON8a8dqLzRKQUGAfMBzYCc0RkkzFmjDFmjKOsVsaYVOBe\n4HFjTIoxJqKyc6v5MyqlvCxrQZZLacW97bnnrAlzo0d7uyZ1gzNNTyuAK4GvRaSfY9sGEelVC/Wr\nkjY9KVX32fJsLG21lMHpg2kQ6eKMNS/YsAESEqymp9hYb9fGMzyRwgMRSTlmU6lLtVJK+a2Dvx0k\non+ETwQJm82a9/DMM/U3SFSHM4EixRhzGoAxJtgY8wCgzUBKKadkLcxyuX/i0CErfXZte/llq0+i\nOrOw6zNnAsW/sYbEtgHSgH6Oz0opVSV7kZ0DPxxwKb+T3W6l6L7hBg9WrALbtlmzomfNqhuJ+OoS\nZ0Y97QOurYW6KKXqkcLUQjZcsYHw3uFEnux8drtZs6wmoJUrYeFCOPdcD1bSwW6HW2+Fxx6Dzr41\n1aNWODPq6QVjTJQxJsgYs8gYs98Yo2MBlFKVylqUxaqBq4i+Kppec3thAp3rN92zx7pZv/UWTJ9u\nTXYrKvJwZbFmTBcXw113ef67fJEzo57+FpF4R3LAC4H7gMUiElcbFayKjnpSqm4REVKeSyHtlTR6\n/rcnTf7lWt/EdddB27bW8FSAiy+2Zi9P8OB6mjt3wsknw2+/Obd6XX3g9gl35Y65EPhMRLKNMXp3\nVkodpTS7lM03bqZodxH9/+xPSFvXph8vWABLl8L69Ue2vfIKnHIKXHuttV61u23bZs2VuPde/wkS\n1eFMl823xpjNwMnAImNMC6DQs9VSSvmS3PW5/HXKXwTHBNPv134uB4mCArjzTiu3Unj4ke0dO8Ld\nd1s3cncqKICJE62nlSuvhEd0KbYqnbDpCcAY0ww4KCI2Y0w4ECkiGR6v3YnrpU1PSnnZgR8PsPmG\nzXR+sTOtrm9VrTIefxy2brUW7DlWYaGVYXX6dGs0VE39+KOViK9fP5g2zWrq8jeuNj1VGiiMMWeL\nyCJjzBUcyeZ6uGARkS9qVtWa00ChlHelvZbGzqd30uvzXjQa0qhaZWzcCGeeaa1LHRNT8THz5lkd\n2+vXVz+hXmqq9WSyZg3MmGEl/PNX7uyjOANYBFxExWm/vR4olFLeITZh+wPbyZyXSb8l/QjtFFqt\ncux2ay3qp56qPEiAdVOPj4fnn4cnn3S+/NRUWLzYes2daz1JfPSR97O3+hqnmp7qKn2iUKr2leaW\nsum6TdhybfT6rBdBTYKqXdY771hDYZcutVaCq0pKCvTvDytWQKdOx+8vLobNm2HJEvj9d+tVUGAt\nK3r66XDppVafh3Jv09P9FWwWrOYnEZGXqldF99FAoZTrMhdkknR3Eq1vbU3s/a4lNCpKK2LdReuI\n6BdBt9e7ERBc/SnMe/daC/YsWAB9+zp3zn/+Yz0d3H+/1adx+LVli/X00L49DBlyJDh07eqeRYfq\nG3cGiklU3OR0OFA8Va0aupEGCqWcV7y3mKT7ksj+PZuOT3ckeVIybe9uS9u7nOvNzVmdw/pL1hNz\nZwztHm6HqeEd+PrroUULa80HZxUXW3Mr8vOhWzfo3t36t1s36ymjYcMaVclvuC1Q+AINFEqdmIiQ\nMTuDfx7+h5bXt6TjUx0JDA+kcGchq89cTbtH2tHmjqqXpN/zyR6SxifR9fWutLiyRY3rtGgR3HKL\nldK7/HDxW1tZAAAd10lEQVRYVTvc1pltjHlYRJ4zxrxawW4REZ3srlQdl781n61jtlKaU0rcvDgi\n+x/JuRTSPoS+i/qyJmENAcEBtL75+OXXxCbseHwHez/ZS/xP8UTER9S4ToWF8O9/WyOPNEj4hqpG\nPW10/PtXBfv0z3il6rjd7+xm+8Pbaf94e9qMa0NAg+P7E0I7hxK/KJ41Z63BBBtajToyD6I0u5SN\n127Enm+n/5/9CW4e7JZ6TZlizYu48EK3FKdqgTY9KVUP7Zqxi9QXUon/KZ6wride9DlvYx5/n/M3\nXaZ1ocU1Lcjfks+6S9bR9NymdH6pMwFB7sm7vXmz1dG8Zo211KjyDnd2Zn/LkVFOxxIRubh6VXQf\nDRRKHS91aippM9OI/zme0A7Oz2/IXZvL38P+pvWtrdn91m46Tu5IzK1VTG5wkQicdRZccYU1n0F5\njzsn3A0CdgEfA38cLt/xr96dlaqDdk7eScbsDPr+2peQWNdmlUXERRD3Qxxb/72V3l/2ptFpzs+0\nzs62JrFVNero/fchL8/K6aR8S1VPFA2Ac4GRQB/ge+BjEdlQe9Wrmj5RKGUREZKfSmbfnH3E/xxP\nw9a1N060uNhK033woJWz6aabIPiY7oz9+6FXLyvPUv/+tVY1VQlXnygqbXgUkVIR+VFErsd6ukgC\nfjXGjHNDPZVSbiIi7Hh0B/s/30/fxL61GiTAmgTXvr2VIuPzz6FHD5g9G0pLjxzz4IPWWhMaJHxT\nlZ3ZxpgQ4AJgBNAB+AZ4V0TSaqV2J6BPFMrfiVg5lw7+fJC4hXFuG5nkrMMJ/VatgljHJO/ffoMn\nnoCMDJg0CVq2hBtvtI6NqPnoWuUG7uzM/hDoBfwAzBGRde6povtooFD+Lm1mGulvp9P3l741yrlU\nHTabNYJp9GhrXkR5ItakuieesHIzffEFXHJJrVZPVcGdgcIO5FVynohIVDXq51YaKJQ/y1mTw9pz\n19JvaT+nhsC626uvWs1NiYkQUEkjtog1JLZnz1qtmjoBTeGhlB8ozS3lr5P/osPEDrS8tqVL59ps\n1l/7gwZBVDX/3Du8zvSSJVa+JeVbNFAo5Qc23bAJE2jo8W4Pp8/ZuxdmzYI337SCxaBB1hOBq7n9\nRKyV5s44Ax591MWKqzrBbaOelFJ1U8YHGeSsyKHrq11ZvNhaY+Gcc2DCBGvU0c6d1s0crH+XLYNR\no6y//Ldvhy+/hKQk6/XWW65//0cfWR3VDz7o3p9L1V36RKGUD8nfks/q01cTvyieg00jGDgQXn7Z\nGk20cqX1+vNPa2jqgAGwZw8cOmRNcrvxRmja9EhZW7ZYazb88ou1LoQz9u618jR9/71VvvJN2vSk\nVD1lK7SxevBqWo9pTbMb23DGGVY6jIcfPv7Y9HQraISGwtlnV97Z/N57MHWqNTIpzIn+8BEjrGGw\nL7xQs59FeZcGCqXqqW3jt1GcUUzPOSdx662G3FyYM6dmK7iJWBPhoqLgjTcqP85ms4LDrFmwdq1z\nQUXVXe7M9aSUqiP2fbWPA98d4OTVJ/PGG4Y//7T6Hmq6zKcxVoDo18/q37jiiuOP+ecfq9kKYOFC\nDRL+SDuzlarj8jbmsXXMVnp+3JPl64J46in46iv3zXKOioKPP7YmzSUnH9kuYnV2n3qqNVnul1+s\njnPlf/SJQqk6rHhPMesuWEfnqZ3JaduIawZaWVg7d3bv9wwcaI1iuvZa+PVX2LcPbr3V6gxPTLQS\n+in/pX0UStVRtnwba85aQ9PzmtL6kY6ceSZcdhk88ohnvs9uh/PPtzrAlyyxnjAefxyCajcziKoF\n2pmtVD0gdmHD1RsIDA2k+/s9uPlmQ14efPppzfslqrJnjzWU9pFH4JRTPPc9yrs0UKh6b/9++N//\nrFXSPHnT9KbtD2/n0LJDxC2I596HAvjzT6sjWbOvKnfQUU+qXtu+3UofsX8/xMTAlVd6u0bul/52\nOvu/3E+/pf15+PEAli6Fn37SIKG8R0c9KZ/xxx/WTOL77oPPPrM6XwsLvV0r98pcmMmOJ3bQ+7s+\nPDUtiJ9+ggULoHFjb9dM+TMNFMonfP01XHghvP023HEH/Otf0LcvTJvm7Zq5T96GPDZdt4lec3sx\n9ZMwvv7aam4qn3ZDKW/QPgpV582YAZMnwzffHJ1faPt2a4z/unXQurX36ucOJQdLWHXKKto/2Z7Z\naa2YPdsaptrStQziSjlFO7NVvWG3W3mMvv0Wfvyx4sleDz9sJap7773ar5+7iF1Yf9l6QtqF8F2n\nrsycaQWJNm28XTNVX2lntqoXbDa4/npISYGlSytvfnnsMejRw0qA56vZTFOeS6F4bwnzBvfi9Vet\nCW4aJFRdon0Uqs4RgTFjrDH9J2qjj4qCp5+Ge+45sgaDL8n8KZPk6enM6BDHRx8HkJgI7dp5u1ZK\nHU0DhapTROCBB2DDBiufUUjIic+58UbIz7cyqfqSwpRCll27jUdbDCAzvwFLlmiQUHWT9lGoOuWZ\nZ6zZx4mJro32WbzYWsVt06a6m930+++/Z/r06RQVFdEwqCH9tl3Cxzm3MfK2ICZPrnzNCKXcTTuz\nlc+aMcNare3336FVK9fPv/pqa/W1J55wf91q6vvvv+fuu+9m+/btZdsC6Mxd97zMtGkXerFmyh/V\nqTWzjTHDjTGbjTHbjDEVrMMFxpjpjv1/G2P6lduebIxZa4xZbYxZ4cl6Ku/78EN47jlrBnJ1ggTA\n88/DK69AWpp76+YO06dPPypIANjZzqZNM7xUI6Wc57FAYYwJBGYAw4GTgJHGmJ7HHHM+0EVEugK3\nA6+X2y1Agoj0E5GBnqqn8ryDB2HmTPjyS2vOQ17e0fu//hoeesiagdyhQ/W/p0MHK6Hd//2fNTEv\nJ6cmtXYfEdi3r6jCfYX1bWq5qpc8OTx2IJAkIskAxphPgEuATeWOuRh4H0BE/jDGNDbGtBSRPY79\n9TTlm//Yvx+GDbOGexoDSUmwYwc0aQJdukD79jB/PvzwA/TseeLyTmTSJBg0yAoUDz0EV10Ft91m\nDZ2tzQSCdjssXw5z58JnnwoH9lacqzvEmd56pbzMk4GiDZBa7vMu4FQnjmkD7MF6ovjJGGMD3hSR\ntz1YV+UBGRlwzjlw0UXWzOrDN2q73WoeSkqyXvfdZy3FWV5pdinJk5Ip2l1EQEjAUa/A0ECCWgTR\n6sZWBIYGHnVeQIC1psL558Pu3dZEvGuusYbR3n473HSTtd6CJ2RmWk1n8+fDvHnQKMzOvyIzmZyT\nQv6wK3l+/T/8k/JP2fGdO3dm/PjxnqmMUm7kyUDhbC9zZX/nnS4i6caYaGChMWaziCw+9qBJkyaV\nvU9ISCAhIcHVeioPSE2Fs8+G0aOtxW/K/zUfEACxsdbrrLOOP/fg4oNsvn4zTYY1ofmlzbEX2q1X\ngb3sfea8TFJfTKXrq11pdn6zCuvQujU8+qi1tsLPP8OLL1rNXN98Aw0b1vxntNlgxQorMMyfbw3p\nHToUzuhWwCU9Umi2bj9tRrUhZmxvgpv3p+33bXn11VcpLCwkJCSE8ePHc8EFF9S8IkqdQGJiIomJ\nidU+32Ojnowxg4BJIjLc8XkCYBeR58od8waQKCKfOD5vBs4s1/R0+LiJQK6ITD1mu456qoN27LCC\nxJ13WnMinGUvsZM8KZmMdzPo9lY3ml/UvMrjD8w7wLZx24iIi6DLy10IaVd1M05pKYwcCSUlVpNQ\nTVZuW74cbr4ZGjSA4cNh2LlCz+wD7Hk5heL0Ytre15bWN7cmMCzwxIUpVctcHfWEiHjkhfW0sh3o\nAAQDa4CexxxzPvCD4/0gYLnjfRgQ6XgfDiwBhlXwHaLqli1bRGJjRWbMcO28vM15snLASvn7/L+l\nKKPI6fNKC0plx6QdsrjpYtn53E6xFduOO8ZWbJO8bXlyYOEBydtXIuefLzJypEhpqWt1FBHJzxd5\n4AGRVq1EPv1UxFZok/RZ6bK8+3L58+Q/Zc+cPWIrOb4OStUljnun0/dzj86jMMacB7wMBALviMgU\nY8wYxx3+Tccxh0dG5QE3icgqY0wn4AtHMQ2A/4rIlArKF0/WXzlPBNavt/66fvpp669t584Tdr+1\nmx2P76DDUx2I+XcMphq9zvlJ+Wwbt42i1CJaXd+Kwp2FFCQVULC9gKJdRTSMaUhQ8yDshXa6fNGH\nK8aE0KkTvPWW8xPdli61+jj69YNXXrJT/Gkaqc+nEhEfQexDsTROaFytuitV23TCnfKYPXtgyhT4\n809riOuxr+BgmDULrr3WufJEhG1jt3Fo2SF6/q8n4T3Da1Q/EWH/l/s5+NtBQjuHEtollNDOoYR0\nCCEgOAARIfWFVNJmpNHp8zguuzucU06xJvlVdX/Pz7f6WT75xJoUmBCZSdJdSTRs35DOz3UmIl6X\nnlO+RQOFcrtDh6yO4Jkzrc7pK66wluUMD7fSZYSHW6/gYNfKTXk+hT3/3UO/xf1oEFV7iYz3/HcP\nSfcl0fad3lz2ZCPOOw+effboYw4ehL/+srLSzpoFAwfCc/cXcPCZ7eT+nUuXaV1odlEzfYJQPknT\njCu3KSqC11+3niKGD7dunDWZEFfe3rl7SXs1jX7LajdIALS8riXBrYLZOHI9/53cjSunRVNSYi0S\ntHKl9crIsJqYTj4Zpk+10WNlCsnnphF7Xyw9/9eTwBDtpFb+Q58o1HHsdvjoI3jySSt30uTJ1r/u\nkr00m/WXrCduYRyRfSPdV7CLcv/OZd2F62hwSzueW9+GmBhrYt7J/YV2AQXk/51D7upc9s7ZS9Tg\nKDq/0JmQWJ0gp3yfNj2pGnvxRfjgA6upaehQ95adn5TPmqFr6P5ud5qdV/H8h9pUmFLI2uFriRoU\nRWB4IDmrcshbm0dQdBAR/SKI7B9J47Mb02hQI29XVSm30UChaiQpyUqBsWIFdOrk3rJLDpSwavAq\nYh+IJeb2GPcWXgMlWSWkTE4huHUwEf0jiOgbQVDjGkyyUKqO00Chqk3Emih3wQVw//3uLdtWaGPt\nuWuJGhJF5+c6u7dwpZRL6lSaceVb3nnHyrh6993uLVfswpabthDcOphOU9z8mKKU8jh9olAApKdD\n375WUru4OPeVW7ynmE2jNyGlQp/v+xyXxE8pVfv0iUJVy7hxMGaMe4NE5k+ZrOy/kqhTo4hbEKdB\nQikfpfMoFJ9/bq01/fHH7inPXmoneWIyGbMz6PlBT5qc3cQ9BSulvEIDhZ/LyoK77oJPP3VP6u3C\nlEI2XruRwIhABqwaQHBLF6drK6XqHO2j8HO33GIt5DPDDUs37/tyH1vv2Ers/bHEPhCLCdD0FkrV\nRZrCQzlt0SKr83r9+pqVU5hSSNI9SeSty6P31711cppS9Yx2ZvuppCTraeL11yGymlk07MV2Up5P\nYWX/lUT0jWDAugEaJJSqh/SJwg8tWmSlAp80yVpb+liluaVk/5ZNaNdQQjuFYgKPf0I9+OtBtt65\nlZB2IZz8x8mEdvbQQtRKKa/TQOFHRKz8Tc88Y62tUNF61bY8G+suWIct10ZpZinFe4oJ6xFGeO9w\nwnuHE9YzjH1z93Ew8SBdXu5C88uaa6ptpeo5DRR+orgYxo+HJUusldoqyuNkK7Cx7uJ1hHYKpfs7\n3TEBhtKcUvI35pO3IY+89Xlk/ZRFRL8ITtl4Cg0i9D8fpfyBjnrycXY7fPstrFkD8fHWGgrt2h29\nYtu+fXDlldCokZU+PCrq+HJshTbWX7qeoGZB9PygZ4XNTUqp+kGTAvqJoiLrpv/CC9Zqc2efDevW\nwerV1tNDv37Wq3t3a/W2kSOtJqeK1oe2F9vZcMUGAkIC6PlxTwIa6BgHpeozDRT13MGD8MYbMH26\n9QTx0EOQkHD0E8Tu3VbAWL0a1q6Fyy6DESMqLs9eYmfjiI2ITeg1txcBQRoklKrvNFDUU4cOwdNP\nWxleL7wQHnig5nmZ7KV2No/eTOmhUnp/0ZuAhhoklPIHOuGuHlq8GG64wXpyWLPG6oOoKbEJW27e\nQsmBEnp/o0FCKVU5DRR1WFERTJwI778Pb70FF13knnLFLmwZs4XClELifogjMESzuiqlKqeBoo5a\nvx5GjYIOHeDvv6FFC/eUKyJsG7eN/M35xM2LIzBMg4RSqmra3lDH2O0wdao1Ge6uu+DLL90bJJLu\nTSJnVQ5xP8TpPAillFP0TlGHpKRYfRGlpbBiBXTs6L6yRYR/Hv6H7MXZxC+Kp0GU/uqVUs7RJ4o6\nQAQ+/BAGDIDhwyEx0b1BAiD5yWQy52cSvzCeoMZB7i1cKVWv6Z+VXnbgANxxh7XC3IIF1rrV7pb8\nTDL7vthH38S+BDXVIKGUco0GCi+aN89K9T1ihPVEERJSvXIO/nqQA98fQGyC2ARs1sgmsQmlB0rJ\nXZdL38S+BEfranNKKdfphDsvOHQIJkyA776D2bMrzuLqjLwNefzzyD/krc+j1c2tCAgNwASashcB\nYBoYml3UjIat3LDOqVKqXtAJd3VUTo6VvG/uXPj5Z7j8cmvYa+PGrpdVlFbEjok7OPDtAdpNaEev\nz3rphDmllMdooPCgQ4fgm2/gs8+s4DB0KFx1Fbz7LjRp4np5pdmlpDyfQvob6cTcHsPALQO1Y1op\n5XEaKDwgPx8mT4YZM44Eh9mzq/f0ANaKc+mvpZM6NZVmFzRjwJoBhMRWs0NDKaVcpIHCjUSsCXL3\n3QeDB8OGDdCmTfXLs+XZSHstjdSpqTROaEzfn/sS3ivcfRVWSiknaKBwk61brRXkdu2C996rfgc1\nOALE62mkvphK4zMaE/9TPBG9I9xXWaWUcoEGihrKy7MWBnrrLWsk0113QVA1ug3ELuSuzeXAtwdI\nm5lG46GNiV8YT0QfDRBKKe/SQFFNWVnw5pvw6qtW+u+1ayEmxrUyivcVk7Ugi8z5mWQuyKRBZAOa\n/F8T4hfEExGnAUIpVTdooHDRP//Ayy9by5BeeCF8/73zs6lLDpSQvTSb7MXZZP2cRUFSAY0TGtP0\n/5rSYVIHQjuFerbySilVDRoonLRsmZXVNTERbr3VWp/6RB3VBckFZC/OJvt361WUWkTUoCgand6I\nLi91IWpwlC49qpSq83RmdhUKC+HTT2HmTNi3D+65B26+GSKqaBUSEbIWZpH6Qiq5f+fS+MzGNBra\niEanNyI8LpyABhoYlFLepWtmu0FyMrzxhjUxrn9/uPNOuOACCKxijR97iZ19c/eR8nwKUiq0e7Ad\nLUa2ICBYA4NSqm7RFB7VVFoKP/1kPT0sWwbXXw9LlkDXric4L7eUjHcySH0plZCOIXSa3Imm5zXF\nGKd/B0opVaf5baAQgS1brOCwcCH8+it06wZjxsCcORAWVvm5tkIbmfMy2ffZPjK/z6TJOU3oNbcX\nUQOjau8HUEqpWuJXTU+HZ05/+60VIIyBc8+Fc86Bs8+ueslRW4EjOMzdx4EfDhDZP5Loq6KJvjya\n4Jaavlsp5Tu0j6IS+/ZZo5VSUuC226zg0LWrFSyOJSIU7iwkd1UuuatzyVmdQ/bv2USe7AgOl2lw\nUEr5Lg0UFVi4EG68EUaNgqefhuBj7vGFuwo5tOwQh/44ZAWHNbkEhAYQ0S+CyH6RRPSPoNFpjQhu\nocFBKeX76lSgMMYMB14GAoFZIvJcBcdMB84D8oEbRWS1C+dWGSiKiuCxx+CTT6zsreecA/ZiO7mr\nc8lelm0Fh6WHsBfZiRocRdSgKCL7RxLRL0KDglKq3qozgcIYEwhsAc4B0oA/gZEisqncMecD40Tk\nfGPMqcArIjLImXMd51caKDZvhmuvhdhYYdq/cwhclUXWz1nk/JFDSOcQGg1uRNSQKKIGRxHaOdTn\nRyklJiaSkJDg7WrUCXotjtBrcYReiyNcDRSeHOQ/EEgSkWQRKQE+AS455piLgfcBROQPoLExppWT\n51Zq1n+KOG2AjQtKdnH/L79z4JEtlOwroe3dbRm8azCnrDmFbq93o9XoVoR1CfP5IAHW/wTKotfi\nCL0WR+i1qD5PDo9tA6SW+7wLONWJY9oAMU6cW6nQHdl8dFE+J18RRuOEUwlurs1ISilVXZ4MFM62\nabn9z/nr3qxinKtSSimXeLKPYhAwSUSGOz5PAOzlO6WNMW8AiSLyiePzZuBMoOOJznVs990hW0op\n5UV1JYXHSqCrMaYDkA5cA4w85phvgHHAJ47AclBE9hhjDjhxrks/qFJKqerxWKAQkVJjzDhgPtYQ\n13dEZJMxZoxj/5si8oMx5nxjTBKQB9xU1bmeqqtSSqnK+fSEO6WUUp7nszmwjTHDjTGbjTHbjDEP\ne7s+tckY864xZo8xZl25bU2NMQuNMVuNMQuMMY29WcfaYIyJNcb8YozZYIxZb4y5y7HdH69FiDHm\nD2PMGse1mOTY7nfX4jBjTKAxZrUx5lvHZ7+8FsaYZGPMWse1WOHY5tK18MlA4ZiQNwMYDpwEjDTG\n9PRurWrVe1g/e3mPAAtFpBuwyPG5visB7hWRXsAgYKzjvwO/uxYiUgicJSJ9gb7AcMckVr+7FuXc\nDWzkyAhMf70WAiSISD8RGejY5tK18MlAQQ0n5Pk6EVkMZB2zuWzyouPfS2u1Ul4gIhkissbxPhfY\nhDUPx++uBYCI5DveBgNBWDcIv7wWxpi2wPnALI4MwffLa+Fw7MAfl66FrwaKyibq+bOWIrLH8X4P\n0NKblaltjhFy/YA/8NNrYYwJMMaswfqZF4jICvz0WgDTgAcBe7lt/notBPjJGLPSGHObY5tL18JX\nFy7SHvgqiIj40xwTY0wE8Dlwt4jklE/J4k/XQkTsQF9jTCPgS2NM72P2+8W1MMZcCOwVkdXGmISK\njvGXa+FwmojsNsZEAwsd89XKOHMtfPWJIg2ILfc5Fuupwp/tceTJwhjTGtjr5frUCmNMEFaQ+FBE\nvnJs9strcZiIZAO/AP+Hf16LIcDFxpgdwMfAv4wxH+Kf1wIR2e34dx/wJVbTvUvXwlcDRdlkPmNM\nMNaEvG+8XCdv+wa4wfH+BuCrKo6tF4z16PAOsFFEXi63yx+vRfPDI1eMMaHAuVh9Nn53LUTkURGJ\nFZGOwAjgZxEZjR9eC2NMmDEm0vE+HBgGrMPFa+Gz8yiMMedxZL2Kd0RkiperVGuMMR9jpTppjtW+\n+CTwNfAp0A5IBq4WkYPeqmNtMMacDvwGrOVIc+QEYAX+dy36YHVKBmL9AThHRJ4xxjTFz65FecaY\nM4H7ReRif7wWxpiOWE8RYHU1/FdEprh6LXw2UCillKodvtr0pJRSqpZooFBKKVUlDRRKKaWqpIFC\nKaVUlTRQKKWUqpIGCqWUUlXSQKH8mjHmUmOM3RjT3cv1eMoYc7Y366BUZXQehfJrxpg5QCvgFxGZ\nVMH+BiJSWtlnpfyBPlEov+VIJngacCtWqofD2xOMMYuNMV8DG4wxZ5b7vN5xzFeObJzrD2fkNMbc\nbIyZVq6c24wxLx3znYHGmNnGmHWOxWTudmyfbYy5whhzsmOBmdWOY+yO/Z2NMT86vvM3bz8BKf/i\nq9ljlXKHS4AfRWSbMeaAMaa/iKxy7OsH9BKRnY4MpGWfHftvEpEsR16lFcaYz4A5wKPGmAdExAbc\nCNx+zHf2BWJEpA+AMSbKsV2wEnn+5fgujDHPAz849r8FjBGRJMeCRK8B2lSlaoUGCuXPRmLlCwPr\nJj8SOBwoVpQLChV9vtsYc3ixl1igq4isMMb8DFzkSOUcJCIbjvnO7UAnY8x04HtgQbl9ZfnRjTHX\nAP2Bcx1PPoOBueVSqAe7/uMqVT0aKJRfciRFOwvo7cjFH4j1V/2DjkPyjjklr9y5CVh/zQ8SkUJj\nzC9AiGP3LOAxrMyt7x77vSJy0BgTh7WU7R3A1cAtx9StNzARGOpYKyAAOCgi/ar/EytVfdpHofzV\nlcAHItJBRDqKSDtghzFmqBPnRgFZjiDRA2u9bgAcq8q1Ba7FWgvhKMaYZkADEfkCeAJHM9Ph0x2p\nwj8GRovIAUeZhxx1u9JRhnEEG6VqhQYK5a9GcCT98mGfYzU/CUevonjs53lAA2PMRmAKsOyYcj4F\nfncsIHSsNsAvxpjVwIdYadHLuxgr9fMsR4f24aaw64BbHEudrnccp1St0OGxSrmZMeZb4CUR+cXb\ndVHKHfSJQik3McY0NsZsAfI1SKj6RJ8olFJKVUmfKJRSSlVJA4VSSqkqaaBQSilVJQ0USimlqqSB\nQimlVJU0UCillKrS/wc8evE+nf54bAAAAABJRU5ErkJggg==\n",
"text/plain": [
"<matplotlib.figure.Figure at 0xa537fd0>"
]
},
"metadata": {},
"output_type": "display_data"
}
],
"source": [
"%pylab inline\n",
"s, i, q = calculate()\n",
"plot_functions( s, i, q )"
]
}
],
"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.10"
}
},
"nbformat": 4,
"nbformat_minor": 0
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment