paper-ParallelPython-Short/data/plots.ipynb

516 lines
95 KiB
Plaintext

{
"cells": [
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"import matplotlib.pyplot as plt\n",
"import numpy as np\n",
"import pandas as pd\n",
"plt.rcParams['pdf.fonttype'] = 42\n",
"plt.rcParams['ps.fonttype'] = 42\n",
"\n",
"x = ['1K','10K','100K','1M','10M']\n",
"\n",
"term = pow (10,-6)\n",
"\n",
"labelfontsize = 22\n",
"ticfontsize=22\n",
"ticwidth=2\n",
"ticlength=6\n",
"mylinewidth=3"
]
},
{
"cell_type": "code",
"execution_count": 10,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/html": [
"<div>\n",
"<style scoped>\n",
" .dataframe tbody tr th:only-of-type {\n",
" vertical-align: middle;\n",
" }\n",
"\n",
" .dataframe tbody tr th {\n",
" vertical-align: top;\n",
" }\n",
"\n",
" .dataframe thead th {\n",
" text-align: right;\n",
" }\n",
"</style>\n",
"<table border=\"1\" class=\"dataframe\">\n",
" <thead>\n",
" <tr style=\"text-align: right;\">\n",
" <th></th>\n",
" <th>datasize</th>\n",
" <th>coldruntime</th>\n",
" <th>hotruntime</th>\n",
" </tr>\n",
" </thead>\n",
" <tbody>\n",
" <tr>\n",
" <th>0</th>\n",
" <td>1K</td>\n",
" <td>0.100575</td>\n",
" <td>0.055373</td>\n",
" </tr>\n",
" <tr>\n",
" <th>1</th>\n",
" <td>10K</td>\n",
" <td>0.091807</td>\n",
" <td>0.054508</td>\n",
" </tr>\n",
" <tr>\n",
" <th>2</th>\n",
" <td>100K</td>\n",
" <td>0.130599</td>\n",
" <td>0.077568</td>\n",
" </tr>\n",
" <tr>\n",
" <th>3</th>\n",
" <td>1M</td>\n",
" <td>0.755035</td>\n",
" <td>0.330882</td>\n",
" </tr>\n",
" <tr>\n",
" <th>4</th>\n",
" <td>10M</td>\n",
" <td>4.626190</td>\n",
" <td>3.199181</td>\n",
" </tr>\n",
" </tbody>\n",
"</table>\n",
"</div>"
],
"text/plain": [
" datasize coldruntime hotruntime\n",
"0 1K 0.100575 0.055373\n",
"1 10K 0.091807 0.054508\n",
"2 100K 0.130599 0.077568\n",
"3 1M 0.755035 0.330882\n",
"4 10M 4.626190 3.199181"
]
},
"execution_count": 10,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"# read data and setup plot metadata and settings\n",
"df=pd.read_csv(\"./scalability-write.csv\")\n",
"yseries = [ \"coldruntime\", \"hotruntime\" ]\n",
"colors = { \"coldruntime\": \"blue\",\n",
" \"hotruntime\": \"red\" }\n",
"serieslabels = { \"coldruntime\" : \"Cold cache\",\n",
" \"hotruntime\": \"Hot cache\" }\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-11-4bdcd0e9c241>:21: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
" plt.axes().spines[axis].set_linewidth(ticwidth)\n"
]
},
{
"data": {
"text/plain": [
"<module 'matplotlib.pyplot' from '/Users/lord_pretzel/.pyenv/versions/3.9.0/lib/python3.9/site-packages/matplotlib/pyplot.py'>"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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li5dyuGHH84HH3xA9erFfxvVqVOHq666ipNOOolatWqlwUqHI73MnQtjx8KSJf60du2sV9WtWxyNDBrk390wK8tW+555ZtLtTZR4hvteBhoBd0QpcytQG3ixNEY5Uk+aI51EZNmyZTz//PMAPPbYY2EFKpD8/HyaNm0alLZnzx4eeughjjjiCHJzc6lRowYdOnTgmmuuYePGjXHbtHLlSk4//XQaN25MjRo16NixI3feeScFBQVxtxVo4+OPP06/fv1o0KABOTk55OXlMWTIEKaG/DNWrlzJbbfdRr9+/WjZsiU5OTk0aNCAfv368dxzz0W9zurVq5k4cSIdO3akVq1a5Obm0qFDBy644AIWRNjVTlV55JFHOOSQQ6hZsyb169dn2LBhEcsDbNy4keuuu46DDjqI2rVrU6tWLbp27cq9997Lnj174r9BjogUFtocU48ewQJ1+ukwb14cAvX++9C3r1+gatSAV1/NKIEC7AMZywHUBBYCBcAnwESgEPgAmOCdC4CvgexY261MBxZCStPNlCmqNWuq2vSqHTVrWnq6ue+++xTQgw46KKH6O3bs0L59+yqgNWvW1MGDB+uoUaO0SZMmCmirVq102bJlxepF+t8sXLhQGzZsqIC2bNlSR48ercccc4xmZ2frSSedpK1atVJAly9fHrONmzZt0h49eiigOTk52r9/fx0zZoweddRRWq9ePW3VqlVQ+ZtvvlkBbdeunQ4cOFBHjx6tvXr10qysLAX04osvDnudd955R3NzcxXQZs2a6fDhw3XEiBHapUsXrVKlit54441FZZcvX150f04//XTNycnRo48+WkeOHFn0HnNzc8Peu2+//VabNWumgLZo0UIHDx6sgwYN0gYNGiigAwYM0F27dsV8fxyR+eUX1WOPDf7u1q6t+uyzcTb0wguq1ar5G6lfX/XTT5Nub8D3KvHnZlyFzWtvlidOBQFn399fAs1LY1BFPpItUoEf1Ew4ksFpp52mgJ511lkJ1b/yyisV0Pbt2+tPP/1UlL59+3YdMWKEAtq9e/di9SL9b7p27aqAnnbaaUEP2gULFui+++5bVC8ekRo2bJgC2qNHD12zZk1Q3o4dO/Stt94KSvviiy90wYIFxdpZvHixtmzZUgH97LPPgvJWrlypderUUUBvvvlm3bNnT7H8OXPmFL32iRSgbdq00aVLlxbl7dy5U48//ngF9JxzzglqZ/v27dqmTRsF9Lbbbgu6zsaNG3XgwIEKBAmiIzGmT1dt1Cj4O9etm2rAvyo2HnxQVcTfSPPmqmE+X8mgzEWqqBIch+0Z9Qa2qPdxYDhemCV3OJFKlOOOO04Bveaaa+Kuu337dq1du7YC+u677xbLX79+fVH+J598EpQX7n/z0UcfKaB169bVzZs3F2vvgQceiFuk5s2bp4DWqVNH161bF/ubi8Djjz+ugF5xxRVB6ZdeeqkCOnr06JjaCRSpadOmFcv//PPPiwQskEceeUQBPfnkk8O2u2bNGq1WrZo2bNhQCwsLY3xXjkB27VK9/PLi37err7a8mCksVL3uuuBG2rdXXbkyZbYnQ6TicZwoQlWnA9MTqetwpIq5c+eybds2mjVrxtFHH10sv2HDhgwdOpTnn3+emTNn0qtXr6jtffjhhwAMGTKEumFiyJx22mlccsklcdk4fbp9bU444QT23XffmOvt3LmTd955hy+//JL169eza5f5Lv3srdhcvHhx2Oucc845xEPVqlU5LozPcvv27QFYu3ZtUPpbb9km3aNGjQrbXrNmzdhvv/347rvvWLJkCfuXuJrUEciSJeYcMXeuP61JE/MMHzgwjob27rUoEoEh0I84At580zaSymASEilHyZRFrD5N8AqljL6fUnwP7nXr1sVdd82aNQC0adMmYpm2bdsGlY3GT952pZHaq1evHnXr1uX333+P2Ubfmi7fQz8WZs+ezcknn1xkTzi2bNlS6usANG3alKpViz8WcnNzAYrE0cePP/4IRBapQNavX+9EKkZUTYguuMC22PBx/PHmbh7H7xuLIjF2rDlF+Bg0yDaWKgeesTGLlIjsA7QDflTVDQHpzTGPv4OBFdjOvPOSbKcjifiE6NprbSF5Xp6F4kq3QAEceuihPPvss3z55ZcJt5FI5IiyIl7btm/fzvDhw/n11185++yzmTBhAvn5+dSpU4cqVarw7rvvcuyxx/qGkxO+jo8qMS2s8ePzcBw8eDANGzaMWnafDP/Fnils2QITJlgQWB/Z2XDnnRYsNq5/7ebNFmX2o4/8aaedBv/8J1SrliyTU0o8Pam/AJcBXYANACKSg3n65WHBZjsBR4pIZ1VdnWRbyxUaJlZfJkVCP+WUzBClUAYPHszEiROZP38+8+bNo0uXLjHXbd7conEtD1yUGILvl7+vbCztRQp5tHnz5rh6UQB5XvToRYsWxVT+o48+4tdff+XQQw/lySefLJa/dOnSiNdZtGgRixYtokWLFnHZGA8tW7Zk0aJFTJgwgcGDB6fsOpWFzz+3SETexxSAAw6Af//bIkrExdq1Fm5i/nx/2hVXwB13xLjKNzOIx9J+WC/q24C0MdjuvDOAgZgzRV3goqRZ6KhU5OfnM3r0aAAmTJhQbHgplGXLlhXNyxx66KHUrl2bNWvW8L///a9Y2Y0bNzLNCwvdt2/fEm3p06cPAG+88Uax4TSg2HqmWDj22GMBeO2119iwYUMJpWHTpk2AiUE4Iq2T8l0nnLAlk0GDBgHw0ksvpfQ6FZ3CQgvycOSRwQJ19tk2HxW3QC1eDL16BQvUXXfZUY4ECojduw/4BZgekvYi5n7eJiBtKfBNabw5KupBkr37KiobN27Utm3bKqA9e/bUb7/9tliZbdu26d///netW7euzps3ryj9iiuuUEA7deqka9euLUrfsWOHjho1Ki4X9MLCQj3kkEMU0PHjx+vu3buL8r777jtt3LhxQi7oQ4cOVUCPPPLIIBt9dga6oM+dO1fB1ih9//33RekFBQV60003FV2/T58+Qe2sWLGiyJPx1ltv1b179wblr1q1KqwLeugarUDC3aOtW7cWucHfeOON+scffxSr9+OPP+qzcS/kqTysWaM6YECw011uruq//51gg198odqwob+xqlVVn3kmqTbHCknw7ovnAbsLmBKSthr4LiTtJWBTaYyqqIcTqdhZu3atHnnkkUUf8o4dO+pJJ52kY8aM0d69e2tOTo4C2rhxY10Z4EIbuJi3Vq1aOnToUD355JO1adOmCmheXl5ci3nnz59ftCg1Ly9PR48erccee2ypFvNu3LhRu3XrpoBWr15dBw4cqGPHjtU+ffqEXcw7ZMgQBVv4e9xxx+no0aO1bdu2WrVqVb3qqqvCipSq6ltvvVUkVM2bN9eTTjpJR4wYoV27do26mDcSke7Rt99+q3l5eQpogwYNtG/fvjpu3DgdOnSo5ufnK6BHHHFEzPenMjFtWrCegGqPHqpxfJyCefdd1Vq1/I3VrKkasu6uLClrkdoc2JPC5qEKgSdCyk0FtpXGqIp6OJGKn2nTpum4ceO0TZs2WrNmTc3OztbmzZvr4MGD9fHHH9dt27YVq7N792594IEHtFu3blq7dm3NycnRAw44QK+66irdsGFD2OtE+9/8+OOPeuqpp+q+++5b1NYtt9yie/bsSUikVG2B7IMPPqg9e/bU3NxczcnJ0by8PB06dKg+//zzQWV37dqlt99+u3bq1EmrV6+uDRs21KFDh+pnn32mM2bMiChSPtsvvPBCzc/P15ycHM3NzdWOHTvqhRdeqAsXLiwqVxqRUlXdvHmz3nrrrXrEEUdobm5u0f+pe/fuev311+s333wT1/2p6OzYoXrJJcHiJGLLmELWXcfOc88FR5Fo0EB19uyk2h0vyRApsXZKRkRmAZ2B1qq6QUT+AvwNGK+qzwaU+wiLOtEupoYrET7HiVjvucPhqHh8/715hH/zjT+teXOYMsVC6SXE/ffb1ho+WraEd96BDh1KYWnp8XmZaik2fY1nBu0ZLH7fHBH5LzAJ2Aq8FmBQdaAr8EOiBjkcDkdFRBWefBIOPTRYoIYNs9cJCZSqbcUbKFAdO8KsWWkXqGQRjwv640B34HRsqG8rcLaqBro9nYAJ2YdJs9DhcDjKOZs32wL6QCfInBy45x5bE5XQsra9e+FPf4J//cuf1rMnTJsGDRqU1uSMIebhvqIKInnYlh0/qOq2kLxDMJf0z1T112QZWVFww30OR+Xj009t7dOqVf60Tp1s36eDDkqw0e3bYcwYEyQfgwfDiy9a+JgMoayH+3wXW6Wqc0IFysv7WlVfq6gCJSL7ich0EdkmIutF5EERyZxPhMPhyBgKCuDmm+Goo4IF6vzz4YsvSiFQv/1mO+kGCtT48fDKKxklUMnCxe6LERGphy1aXgmMxHqT9wD7YouaHQ6HA4DVq+HUU4OjEdWvb9GIhg8vRcNr1sCxx8LChf60q6+2/eIzOBxYaYjYkxKRW0WkeOjnOBCRuiJya2nayCD+BNQHhqnqdFV9BrgEGC0indJrmsPhyBReeQUOPjhYoHr3NueIUgnUDz/YnFOgQN1zj4WqqKACBdGH+64GfhSRG715qJgRkTwRmQT8CFxVCvsyieOB/2lAcF3gP9gi50HpMcnhcGQKO3ZY1PKTTrIRObAIRDfdBDNmmFd4wnz+ucVM8o0bVq1qPuuXXVZquzOdaCLVC1gG3IiJ1fsi8hcR6SsijUWkKoCIVPVe9xORv4rIB5g43QAsAXqmyngROUBELhWRKSLyg4gUioiKyMgY6o4TkY9F5HdvjmmOiFwoIpHuSQfgu8AEVd2F3aP49kNwOBwVigULoFs3ePRRf1peHnz4IdxwA2RllaLx6dOhf3/YuNFe16oFb7yRmRGiU0DEOSlV/Qw4XETGAX8G+mNBZosQkV1ATmCSd/4MuF9VX0iqtcWZAFwabyUReRi4ANgJ/A/YAwwAHgIGiMhIVS0MqVYfi7oRym9AxfH3dDgcMaMKjz0GEyfatk0+Ro60/dnq1y/lBaZMgTPPNHdzsA0K33oLDj+8lA2XH0r07lPV51T1cOBw4DZgNrADE6Tq3nk7tmXH/wFdVbVnGQgUwALgLmA0kE8M67NEZAQmUL8AnVV1iKoOB/YDvgeGAxenzGKHw1Eh2LjRhvYuuMAvUDVq2Oa3L76YBIG65x7b+8knUHl55s9eiQQK4vDuU9U5wBzfa8/1ui6wWVV3pMC2WGwK2ocgxo3e/uKdr1bVJQFt/SoiE4CZwDUi8mBIb+o3oF6Y9urjImw4HJWKDz+00bbADZ47d7Z9n0od6EHVPPbuusufduCBNuwXwz5oFY2ENxZR1e2q+nO6BCoRRKQFcCiwG4vWHoSqfgisAZpg0TUC+R6blwpsLwfbrdiJlMNRCdi71+aY+vULFqhLLjHfhlIL1J49NrwXKFBHHmmugpVQoIDYo6CXhwPrBSkwMkL+UC//qyhtvOKVuTAk/WpgG7BPQNoYr2zHMO2oO9zhjop0tFL4RAmIXA7rFYYkpf2aoG8EN66vglZP+/su/VGa53o526Kx1LTxziujlPGtDW8Tkv4PzHHiNRE5VkROAx4EXlDV73A4HBWYUcDXmNOzjw+wjSHeKHXrDYD3gcEBaU8CIzDvrspMZROp2t75jyhlfOGe6gQmqupmzMNxG/Bf4F7gBeCscI2oqoQeAXnuiHK0atUKgBkzZkQt59ve/amnnkq7zZl6nHHGGe4eleLYtk05+2zFNiGvB5g7+a23wt69/VFdW/rrrFrFxg4d6BH4ALn2Ws4pLGRvBtyD0hzJwIVFigNVXQwcF0tZXzBZR/mhdevWrFy5kuXLl9O6det0m+NIM19/bTFcFy3yp7VpA889B91DZ6wT5fvvLQ7fTz/ZaxHbG+pi52Dso7L1pHy9pFpRyvh6W1tTbIvD4chAVE0njjgiWKDGjoV585IoULNnm1OET6CqVTMFdAIVRGXrSa3wzq2ilPEFL1kRpUyJaJjQ9K535XBkNuvXm3Pdm2/602rVgocfhtNPT2KIvDffhFGjLJYSQO3aFvRv4MAkXaDiUNl6UvO8cycRqRGhTLeQsgnhhWcKOkrTXtKZOhVat7bgYq1b2+sKhKry7LPP0rdvX+rXr0/16tVp164dF154IatXrw4qO3nyZESElSvNn6ZNmzaISNGxYsWKmK/7/fffc95555Gfn0+NGjWoX78+nTt35oorrihq38d//vMfzjrrLDp16kS9evWoXr06+fn5YW0MfW8vvvgigwYNolGjRmRnZ9O8eXMGDBjAgw8+GLHe0qVLGTduHI0bNyYnJ4f27dtzxx13UFgYGlzFzzvvvMMJJ5xA48aNyc7OpmnTpowdO5b58+fHfE8yncCvQpMmwQLVtSt89RWccUYSBeqZZ2w7Xp9A7buvBfdzAhWedE+sJXmSbibm8hjWBd0rM9crc3qYvD5e3s9AlVLaEs0dM71MmaJas6YG+dLWrGnpGUCrVq0U0BkzZkQt16dPHwX0qaeeCkovLCzUcePGKaDVqlXTo48+WkePHq1t2rRRQBs0aKBffPFFUfmPP/5YzzjjDK1Vq5YCOmLECD3jjDOKjvXr18dk99NPP63Z2dkKaNu2bXXUqFE6bNgw7dSpU1g7s7KytFatWtqtWzcdMWKEDhkyRFu0aKGANmzYUBctWlTsGrt27dITTjhBAc3KytJevXrp2LFjtX///tqoUaNin68zzjhDAb300ks1NzdX27Ztq6NHj9Z+/fpp1apVFdCLLroo7Pu55JJLFNCqVatqjx49dNSoUdqlSxcFtHr16vrmm2/GdF8ymXBfBd9x+eWqO3cm+YJ33hl8kdatVRcvTvJFMoeAZ17iz9K4K1j4obuwMEiLgDsD8o4AzgPqlcaohN9MbCI1MkCI8gPSGwELvbxLU2RfckUq3DcrnUeSKK1IPfzwwwpo48aNdcGCBUXpe/fu1YsvvlgBbdWqle4MeQL5rrt8+fK4bf7iiy+0atWqmpWVpU8++aQWFhYG5X/33Xf63XffBaW98MIL+scffwSl7dmzR6+77joF9Ljjjit2nUsvvVQB3X///fX7778Pytu7d6++9tprQWk+kQL0xhtv1IKCgqK8Dz/8UKtUqaJVqlTRVatWBdV79NFHFdBOnToVu84rr7yiVatW1Xr16ummTZtKuDOZTbNm4T/KjRol+UIFBaZ6gRfp3Fl17dokXyizKHORAs7G3PYLvaMA+FdAfj8v7czSGBWHPV2xYLa+Y4t3UxYHpoep94hXbgcwDXMp/91LewXISpG9TqRiwCcWsR6hItW2bVsF9PHHHy/W9q5duzQvL08BnRLScyyNSA0bNkwBvfrqq+OuG45mzZpplSpVdMuWLUVpv/76q2ZnZ2uVKlWCxDcaPpHq1q1bMeFUVR00aJAC+vTTTxel7d27V5s2baqALly4MGy7F154oQL6wAMPxPnOMoPCQtVHHon8URZJ4sV271Y99dTgC/Tpo7p5cxIvkpkkQ6RidpwQkV7YgtZtwLXAR8DnIcU+9B72JwBPxdp2KcjFem+h7BetkqpeICKfABdiQ3xZWGijfwGPavEI6HGTcXNQ5ZBjjz2WJk2aRMyfPn06v/76a1DaTz/9xI8//kiVKlU47bTTitXJzs7mlFNO4bbbbmPmzJmckoTtDgoKCnjvvfcAOOecc+Kqu3jxYqZPn87SpUvZtm1b0fzQ3r17KSwsZOnSpXTp0gWADz74gN27d9OrVy86dYpvn83jjz8+bGzL9u3b8/bbb7N27dqitK+//pqff/6ZTp060bFjx7Dt9enTh4cffpjZs2dzcTnzRvvlFzj7bAsmHom8uHbQi8Iff1hI9OnT/WknnWQTYdWrJ+kiFZt4vPuuwlRxkKrOhuIBXVW1UETmERLjLlWo6kz824PEW/c54LmkGlTWaII6OHUqnHcebN/uT6tZ0/YWyKA9aq655hr69u0bMb9v377FRGqNF1CtadOmVI/wEGjbtm1Q2dKyYcMGtm/fTtWqVcnPz4+pzt69e7ngggt48sknfb3ssGzZsqXob5/jRfv28W9flhfhqZubmwvAzoB9Jn788UcAFi5cWGLQ5vXr18dtSzp57TU45xzYELB1qUjwV6lmTbjlliRcbMMGGDwYvvjCn3beefDII6XcYKpyEY9I9QC+8AlUFH4BDkvcpIqBZrILuk+Irr3WdvrMy7NvZQYJVGmJMSJ+2q51//3388QTT9CsWTPuueceevbsSaNGjcjJse3ZevbsyezZs4MErDTvqUqV2B15CwoKAGjevDkDS/A4S0Qw08G2bbbn0xNPBKdPnAgHHQSTJiX5q7ByJRx7bPBCqxtusAtV4K3eU0E8IlUX+CmGcrXjbNeRDk45pUKJko/mXqTotWvXsmvXrqKHfiC+nkLzJEWV3meffahZsybbt29n2bJltGvXrsQ6L71kQfj/8Y9/MGTIkGL5S5cuLZbm6w0tCnzwpYCW3j7nTZs2ZfLkySm9Vlnw2We2LVPgLW3eHJ5+GgYMsNfjxyfxggsWwHHH+cOki8BDD9nGU464iWed1DqKB10NxwHYdhcOR5nTokUL2rZtS2FhIVOmTCmWv2fPHqZ6a8JChxKzs7MBG4qLh6ysrKIex5NPPllCaWPTpk2AXxACee+998IOo/Xv359q1aoxa9Ysvv/++7hsjIfDDz+cffbZh3nz5oUVy/LC3r1w000W1CHwbZx8Mnz7rV+gksonn0Dv3n6Bys6GF15wAlUK4hGpT4GuIhJxKE9Ejgb2x1zBKzUZv5i3AjNx4kQArr/+en74wb/VV0FBAVdddRWrVq2iVatWjBw5Mqier2eViABce+21ZGVlcffdd4ftffzwww9BtviGyR599NGgxbTLli3j/PPPD3uNRo0acf7551NYWMiIESNYvHhxUH5BQQHTpk2L2/ZQqlWrxvXXX09BQQEnnngiXwTOqXjs3r2b119/Peg9ZRJLl5o4TZoE3uglubnw7LO2MWGDBim46LRpcPTRsHmzva5TB95+2yJLOBInVjdAzIuuANvK4hhM4ArxXNCBo4DV2IaCB5XG5bAiHERxmXZEJxmLeceOHauAZmdn6zHHHKNjxowpck2vX79+0GJeH/fff78CWqdOHR0xYoSeffbZevbZZ+uGDRtisvuf//xn0QLZdu3aRV3MO2vWLK1WrVrRmqfRo0fr0UcfrdnZ2dqnTx/t2bNn2Huwc+dOPf744xVskW3v3r117NixOmDAgKiLeUPvkY8bb7yxaA1VKJdddlnRZ7Zz5846fPhwHT16tB555JFFC5/ffvvtmO5NWVFYqPrEE6q1agV7fPfurZrAyoLY+ec/VbOy/Bds1Eh17twUXrB8EPDMS/xZGldhuBz/+qjfvPMm4Ffv70Lgz6UxqCIfTqRio7QipWpC9cwzz2jv3r21bt26mp2dra1bt9YJEyYUW7jqo6CgQG+++WZt37695uTkFH3B4lk39e233+r48eM1Ly9Ps7OztX79+nrwwQfrlVdeqStXrgwq+/XXX+vgwYO1cePGWr16de3QoYPedNNNunPnzqL3Fu4eFBQU6LPPPqv9+/fX+vXra7Vq1bR58+Y6cOBAffjhh4PKlkakVG3B75gxY7Rly5aanZ2tdevW1fbt2+vo0aN16tSpum3btpjvTapZt0512LBgcapWTfW221T37k3RRQsLVW+9NfiibduqLlmSoguWL5IhUmLtxI6IDAIm4Y9x52M+cL2qvh5Xg5UI35BfvPfc4XBE56234KyzIHBFQvv2ttqia9cUXbSw0NwD77/fn3bIITbEF2V9X2XC55GqYbydY24j0QemiOyDOVJkAatVdW0JVSo9TqQcjuSyfTtceaUtPQrkoovgjjtszVNK2L3bXAKff96f1q8fvPqqTX45gDSLlCM60Rwl3D13OErP3Lm2iiLQI79JE3jqKfMATxlbt8KIEeBFGQEsqsSzz7ooEiEkQ6Qq21YdDoejnFNQYNu3d+8eLFAnngjz56dYoNavh/79gwVqwgRzGXQClRLiXnTrxfDrBzQDIv1XVFXPLo1h5Z1wvxycG7rDUTqWL7eFuZ9+6k+rXdumhc48M8XBHFassK3elyzxp910E1x/vYsikUJiHu4TkdrAS5j7OUSPmaeq6oJTheDmpByOxFC1vQIvvthG23z06GGjbDEE+Sgd335rXbSff7bXVarYRNif/pTiC5dvkjHcF09P6nbgWMzlfAqwBIuI7nA4HClj40Y4/3x4+WV/WlYW3Hgj/OUvUDXVQdg++ghOOAF+/91eZ2ebw8RJJ6X4wg6Iryf1M5ANHKyqscTwc4TgelIOR3y895450QXsJMJ++8GUKXD44WVgwKuvwpgxsGuXvc7NtVDqUaLzO/yUteNELvCRE6jYcGGRHI7E2bED/vxnmwIKFKg//QnmzSsjgXrySfPi8wlUkybWq3ICVabE01FeFmd5h8PhiJtvvjHX8oUL/Wn77gv//CcMHVoGBqia++B11/nT8vPhnXfA24vMUXbE05N6CugrIm4pdQyoqoQe6bbJ4chkCgvhrrugW7dggRoyxFzLy0SgCgvhkkuCBerQQ82d0AlUWohnTkqAF4FOwMXAB+omV+LCzUk5HOFZtQrOOANmzvSn1agB995rm9mWiYf3rl1w+unw4ov+tAED4JVXLKK5I27KPOKEiDTAtuHoBOzBduEtDFNUVTXVTqHlDidSDkdxnn/e1sP6nOcADjvMnCMOOKAMDJg61dwEV68OTh892nZGDLNxpiM2ylSkRKQ18BHQnOhrpDyb3DqpUJxIORx+Nm+2vQADw99VqQLXXmvrY6tVKwMjpk6Fc881T41AjjnGAsVWcUF5SkNZi9RLwAjgQ+A+YClR1kmp6spEjaqoOJFyOIwZM2x4L7Dz0qaN9Z569iwjI/74w/aRD+zC+cjLg5XuEVZaylqkNgC/Ax1UdXeiF6zMOJFyVHZ27bJe0t13mxOdjzPPtNBGZTL1o2pbul95JfwUYUWNiDlROEpFWUecqAZ86QTK4XAkwoIFcOqp5mLuo0EDeOKJMgze8NVXcOml8Mkn0cvl5ZWNPY4SiWfA9RugcaoMqWi4xbwOh1FYCPfdZ84QgQJ17LHmWl4mArVunc09HXZYsEDVqWNhjgKpWRNuuaUMjHLEQjwidRfQW0R6pMoYh8NRsVizxsTossv8gRuqV4cHHjC/hGbNUmzA7t3mx77//hZBwjfGWLUqXH65TYr961/QqpUN8bVqBY8/bquJHRlBPHNSecCF3nEv8A7wE+Fd0FHVVUmyscLg5qQclYmXX7Y1Tr/95k875BBzqOvYsQwMmD7dYisFbjoFcPzxcM89ZeTfXrkpa8eJAt+fQEmVVFVdCKUQnEg5KgNbtljQhqef9qeJwFVXwf/9X/HRtaSzZIl13d58Mzh9//2tV3X88Sk2wOGjrB0nVlOyODkcjkrMJ5/YpoQrVvjT8vJsz6ejjkrxxbdsgb/9zSbA9uzxp+fmwg032GZUKVdIR7KJK+KEo3S4npSjorJ7t21Se/vtwZ7bp54KDz0Edeum8OKFhdZt+8tf4Ndf/ekicNZZ5gTR2Pl8pYOy7kk5HA5HMX74wcRo7lx/Wr168OijthVTSpk928YW58wJTu/VyxZeHXpoig1wpBoX88PhcCSEqu2g3rVrsED172+7radUoNassXHFnj2DBap5c3juOfj4YydQFQTXk3I4HHHzyy82kvb22/607Gy47TZzqEtZyLudO80z79ZbLayRj5wc88y4+mqoVStFF3ekg4gi5XnzKdBRVRcHePfFgvPuczgqKK+9BuecAxs2+NMOPNBcyzt3TtFFVW0r98svh+XLg/NGjLA4S61bp+jijnQS7feOhORLHIcbRnQ4KhjbtlnQhhNPDBaoiRPhyy9TKFALFsDRR1toikCBOugg+OADW5DlBKrCErG3o6pVor12RMeFQXJUJD77zJwjli3zpzVvbk51Awak6KKbNsGNN5oHRkHAQE6DBuZqfu65FjnCUaFxwuNwOCKydy9MmgRHHhksUCefbM4RKRGovXvNI2O//cx/3SdQWVlw0UW2WHfCBCdQlYSY/8sicjqwVFVnlVCuO7C/qj5TWuPKM+HWBbjelaM8sWSJOdB9/rk/LTcXHn7YQtulZEv3GTMsSvn8+cHpAwbYIt0DD0zBRR2ZTDw9qcnAOTGUOxt4KiFrHA5H2lG1WKxdugQLVO/eFsX81FNTIFArVsDIkea/HihQbdrAK6/Ae+85gaqkpGK4LxW/rxwORxmwfr05Rpx7rt/Du1o1cy2fMSMF/gl//GG7ILZvD//5jz+9Vi2LFPHdd2ZQSrptjvJAKgZ1WxBlW3mHw5GZvPWWrX0KjCzUoYNt6d61a5IvpgrPP29rm9asCc479VSLr9S8eZIv6iiPRBUpbx4qkPwwaYFtdQAGAF8mwTaHw1EGbN8OV1xhTnSBXHQR3Hkn1KiR5AvOnWvzTp9+Gpx+2GG20VQPt2Wdw0/UALMiUog/8nksW3QItr/Uyar636RYWIFwAWYdmcacOdZxCdxyqUkTeOopOO64JF9s3Tr4619tk8HA70DjxjaeeMYZKQxV4UgHZRFg9hn8wnQGsAz4NELZ3cAa4DVV/SZCGYfDkQEUFNiI2qRJ5vHt48QT4YknoGHDJF5s92548EHbTGrLFn96tWoWQ+m668xt0OEIQzybHhYCk1X1rNSaVHFxPSlHJrB8ubmWB4621a5tQcPPPDPJPgpvv20bEIbujjtkCPz977YRoaPCUtZbdbTBOUQ4HOUWVXjmGdv7b+tWf3qPHrYpYbt2SbzY4sUmTm+9FZx+wAG23inpY4mOikrMA8CqulJVN6bSGIfDkXymToWWLW26Z/x4v0BlZdkI3EcfJVGgfv/dvDAOPDBYoHJzLXr5/PlOoBxxEbcLuohUBw4DmgHVI5WraBEnRCQfuALoDhwI/KCqbnWhI6NQteCvS5bA0qW2DnbatODQd2C+Cq+/DocfnqQLFxbC5Mm2O+66df50EQuZ/re/QaNGSbqYozIRl0iJyGXADUAss5wVSqSATsBg4HOsB+rckBxpQdX2c1q6NPwR6JsQiezsJArUrFm2O27gzodgAf/uvz8Fi6wclYl4HCfOAp70Xn4P/ABE/Dqo6pmlti6DEJEqqlro/T0ZOCzenpRznHDESmEhrF0bWYgC9/tLBBG7Rqn46SfbZPC554LTW7SAu+6C0aNdpIhKTlk7TlyCuaOfpqrPlVS4ouETKIcjWRQU2HM+UHx8w3TLltkmtIlQu7YFEM/Ph3feCd+zyssrheE7d5pn3q232kpgH9WrWwSJq65yu+M6kkY8InUAMCtVAiUiBwDHAd2wOa/9scXBo1T15RLqjgMmAJ2BLKyX9xTwqBMXRzrZuxdWrfKLT+Dx44+2hCgR6tb1C1Ho0aiRvwMzdSqcd16wltSsaWHx4kbVJrkuv9wCwgYyapSFp3CbDzqSTDwi9QewKlWGYCJzabyVRORh4AJgJ/A/YA8WmukhYICIjHRC5Uglu3fbMzvcsNzy5cGLZeNhn33Ci9B++9m+f7GMpJ1yip2vvdbEMi/PBMqXHjPz59vC2w8+CE7v3Nnmnfr2jbNBhyM24hGpWZhXW6pYANwFzAHmAv8E+kSrICIjMIH6BThKVZd46Y2BGcBw4GLg/pB6dYGmMdi0SlW3l1wstUydmoSHjKNU7NxpghNOiFauLO49FyuNGvmFJ1CI2rWD+vWTY/spp5Ti87Jxo3933MBJrH32MY+9c85xmw86Uko8n66bgFkicoaqPp1sQ1T1ycDXEtuE61+889U+gfLa+lVEJgAzgWtE5MGQ3tRwYtvzqp/XRtqYOhXOPht27bLXK1fac2HdOhgzxoZuatSwCDNujrp0bN9uQ3Dh5ohWrw4ONxcPzZqF7xG1a5fB0YD27oV//ANuuMG2cfeRlQUXXGDxlBo0SJt5jspDPN59RwGDgKuAl4E3seG/sENpqvpRqQwTmYn1pMLOSYlIC2A1FjOwnqruCFPmJ6A50KukHYXjtG0yJXj3JW8X3uVA6xjK7QV2eMf2FP+9k5JjDWcqtYB2QD6wn3f2HS1K0e4qYGmYYxl278oP/bChh4NC0t8D/gx8V9YGOco9ZeXdNxN7Mgkw0jsi2hRn24nQxTsvDCdQHl9iItUFG64sh8TqhlUVqOMdZUEyha+k/JLG0sYCt2L3ahVwMzCP4iKUT2yjvOEooLgQLfHOyzHhLt+0Bu4GRoSkLwMmAq+XtUEOB/EJyUdk1s/nNt55ZZQyPkePNlHKxISI1ASO9162AnJFxCfUX6pqkB3hfjkksk6qdWsb4gslK8siVW/fDjt2JD45nzg1vCP1Qz5Vq/qHNWvUCP5782b4/vvAOaHW2HRm/GRl2W7l4YbmWrfOIienDfZROjoZbytz+OMP2yrj7rv948pgbuTXXku7yy7jteoRg8s4HBGJcdomKjGLlKr2LfXVkktt7xxtWaMvIG4yuheNgJdC0nyvzwQmB2Yka7jvllvCuxA//njwZPiePSZWvsMnXrH8HU/ZHTsSX7+TKHv32lqfWCIplES1atC2bXghatXK8isNqrYQ9+qri++Oe9pptpdHs2bpsc3h8HBuOTGiqiuwoc4yJVYX4mrV7CiLifjCQhOqZIleSX8nGhnhhBOKu263bGk9pkrPnDm2O+6skFHwbt1sd9zu3dNjl8MRQnkWKV8vKdrSdl9va2uUMikh2nBfvJTKhTgFVKlivbmaNc0TOZWo2jqkSCJ28snB8Ux9tGoFr72WWtvKJb/+arvjPvVU8d1xb78dTj/d7Y7ryChiFinPuy9mSuvdFwMrvHOrKGVahpR1lDNEICfHjnr1iuffc08SIypUVKZONWFatcpuaKA4ZWfbvk9//WsG+8M7KjOJePfFQll4983zzp1EpEYED79uIWXLjOS5oDuikbSIChWJLVv8C71efhn++1+/Z0mgQJ1wgsXgy89Pj50ORwzEs05qJuFFqgrWm/H1WmYDe1S1X6kMK2GdlFdmLtAVOCN0/yoR6YMJ6y9A87IOjRRNpFwUdEep+e238KuOly6F9etLrt+okQ39ORwppEyjoJfk3SciB2JRHHZigWLLgtswD7s7RGSWqi71bGkEPOKVuT0dsfuSOSflqISoWkiicCK0dGlwFIhEiEXIHI4MIOaeVEyNibTEFqTfoap/i7NuV/zCAtARcx1fAhR9I1W1e0i9R7DgtDuB9/EHmM0FXgVGqmqCkdWSi9tPyhGEqnl9RBKi339PrN3sbIu5lJ8PM2f694sPpFWr4pHMHY4kk4yeVFJFCkBE/ocNr7WPs15fLChsVCL0UMYBF2KRXHxbdfyLNG7V4Yb7HIAJ0c8/hxehpUth27aS2whHjRomROH262je3O9nH2mvjtCFdg5HCshUkfoPcLyq1khqw+UMJ1KViMJCWwwbToiWLQsWiHioVSvyplFNm8buKu7C6DvSRMaJlIjUARYBWaraOGkNVxDccF85pqDAQqFHEqLAcELxkJsbWYgaN3ah7R3lmjJ1nBCRaJFOawPtsQjpjYGpiRrkcKSNvXstUGKkbXT37Ems3QYNwotQfr4FYHRC5HBEJB4X9EJKXicl2PYZPVV1TQllKzRJHe5zwzXJw7eNbjghWrEi8Ui9++4bWYjcvkuOSkqZDveJyAoii9RuYA22ffvDqro5UYMqCkkTqalT4dxzLQ6Qjxo14OGHYdw4+xVepUrwubIRKuKTJsERR4QXopUrEw8G2KRJZCGqWzepb8nhqAhk3JyUIzoJzUlF2qsj+oWChStUxGJJS6ROstNiqbN8uQVJTXT/9lCaNy8uQPvtZ550tWuXXN/hcBSRkSIlIlWwCBCxbM9eqUhIpKpUSXzfckdxRCwUeqgI5efbHh41a6bbQoejwpBRIuWJ02nAdUBbVXUbIoSQ9J5UdrYNXan6zw4/Rx8dLEL5+barodvAz+EoE8pEpESkGXAM5rX3K/Cuqq4NKTMOmAS0w5wnflXVRPfprhAkdU4qnsWYgYIVeE5lWllfLzDtiissfFAoLqKCw5F2Uu6CLiKXArcD2QHJu0XkUlV9XETaYu7mh2PitBW4G7gnUYMcIcQb5lukcu3qV62a26vD4ajAROxJeftHzfRebgUWA3WBNpggDQKewXpYe7C4e7eo6obUmlx+cYt5U4Rz0Xc4MpKUDveJyAvAKEx8rlDVnV56J+A/QB5QHZgPnKyqixI1orLgRMrhcFQmUi1SK7F1Ue1Co4iLyCDgTWAH5iThNqaJAbdVh8PhqIyURqSiRahsBMyLsM3FbO/8kRMoh8PhcKSKaI4TOcBv4TJUdbPXjfslFUZVVErV5fUPFVbCkBIl4+5PdNz9iY67P9FJ5/2JMdZ/RNzwlcPhcDhSRklR0Jt4Xn5x56vqR4mb5XA4HA5HdMeJWKKeR0JVNeZtQBwl44YjouPuT3Tc/YmOuz/RSef9iSYkq3DDeQ6Hw+FIIy4KusPhcDgyltI6TjgcDofDkTKcSDkcDocjY3Ei5XA4HI6MxYmUw+FwODIWJ1JpREQOEJFLRWSKiPwgIoUioiIyMkqdFV6ZvhHyDxKRn70yL4tIdrhymUIi9yCg7jgR+VhEfheRbSIyR0Qu9DbgDFd+ptf2+Aj5LUTke6/MxyJSt5RvLybK8h4E1DtORN4VkU0isl1EFojItSKSE6H8ZM+mSRHy64rIJ16Z70SkRUxvPgWU8nulInJ7Ce1PCSg7M+lvIAmk6XulIvLvEtr+W0DZFTG9GVV1R5oO4D7MzT/0GBmlzgqvTN8weUcAm7z8fwFZ6X6PqbgHXr2HvXI7gDeAV4AtXtp/gSph6sz08seHycsPuLdvAzUr4j3w6l3lldkLvA+8BKzz0maHe+/AZC9/Upi8RsA8L38u0LC8faYC/vcKrIn03QFyge0BZWem871mwmcq4Hvlq1cvQttV8C9tUmBFLO/F9aTSywLgLmA09pD8MNGGRKQ/9sCpj31Az9bwwYEzjbjvgYiMAC7AYkd2VtUhqjoc2A/4HhgOXByrASJyEPAx0Ap7YA9T1e3RayWVMrsHInIYtpHpdqCXqg5U1VFAW+AjoDsQ846RItLSq3cIdg/7afr3lCvN92oO0Aw4OkL+GKAG8GVpDCwD0vG9moNt3zQmQv5AoCXx3rt0K747wv4iiasnBZwA7CTCL93ydMR4D+Z4ZU4Pk9fHy/uZkF99hOlJYQ9lX+/zydA6FfAevOzl3RCmXlugANhFyK9hwvSksIeXb0uft4Aa6b53pbifvu/Vhd753xHKzcJ6oBeTwT2pMv5M+dq+xLs3n0Vo/zmv3AW4nlTlQUROwTahzAb+rKqT0mtRavHmOg4FdmO9niBU9UNsuKYJJkDR2uoPvIf1Pu9R1XNUtTDpRieZRO+BNz85yHs5NUy9H7Hhvmzg+BJs6Iz1nPKAF7He544E3k6m8TnWaxgmIvUCM0TkAKAH8A72sK4wJOl7tRZ4FzhCRNqHtF8X64l9B3wRj21OpMoxIjIBeBYQ4CxVvT/NJpUFXbzzwigPxS9DyhZDRIZhv/5rY72Ky5NnYspJ9B4cANQENqnqsjjqBSEi3bFfz42BJ4CxqronBrvLC09hw1ZjQ9LHB+RXNJLyvcJ/b84MSR+D3dO4750TqfLLn4FHgD3Ayao6Oa3WlB1tvPPKKGVWhZQNZSQ27JUNXKKqNyfJtrIi0XvQJiQv1nqBHIl/7vMuVT2vPPQ+4+RZbNhzvC9BRLKA07Gh4dfTY1ZKScb3CuzebAJO9e6ZjzOxocAp8RrmRKr8Msw736eq/02rJWVLbe/8R5Qy27xznQj5g7Hgyi+p6oPJMqwMSfQeJOPeDQBqAV+o6lXRjCyvqOovwHTgcBHp4CUfgzlUPKequ9NmXOpIxmcDVd0FPI/dq2MAvHt4BDDdu7dx4USq/OLz1rlcRE5OqyXlD99eZyeLSHka5ssEZmO998NF5IF0G5NCJnvn8SHnyThKYrJ3Hh9ynkwCOJEqv0wC7gaygKmVSKh8v+ZqRSnj+1W4NUL+U/hdae8WkYnJMKwMSfQeJOPevYu5Ne8BLhaRijoP+jqwEThNRBpiIxfzVXVues1KGcn4bACgqnMwF/hh3r07DbuX0xIxzIlUOUZVr8SEqiqVR6hWeOdWUcq0DClbDFV9CL9Q/b2cCdUK7xzvPfD9nRdnvSBU9RX8QnVJRRQqb0jvOaAp9qMmh4rpMOFjhXcu1fcqgMB71hSYmugwqROpck4YoRqVZpNSzTzv3ElEakQo0y2kbFjCCNVlSbCvLEj0HvyARQRoICLtItQ7PEy9YoQRqvtKMrocMtk7D8Em/Yu57Vcgkva98piC3bMh3uvJiRrmRKoCECJUz1VkoVLV1cBXmGdesfcpIn2AFtiq+dkxtBcoVPeUB6FK9B54v2Tf9l6eEqZeW2wd0G7gzRjsCBSqSyuaUKnqV8Cn2FDVS6q6Ls0mpYwUfK/WYeutNgKfqGoswhYWJ1IVhDBCVWIgyXLMbd75DhHJ9yWKSCPMLR/g9lhdo8MI1Z+TZWgKSfQe3I6t9r9aRA4PqFcbi/dYBXhEVTfHYkQYobo3gfeSsajqkaraUFXHpduWMiDZ36tx3r3rXSqr0h2uozIfQFfgs4DDF8hxcWB6SJ0VRAgw6+Xf5eXvoYRgkplwJHIPvHqP4A9oOQ0Lfvm7l/YKYQKEEiXArJd/Ef7gl3+uiPfAqxcYYPZdLGLEr17aZ8QZYNbLH471wBS4t7x9pgK+V4fFeI2RZHBYpDR9r2J63gCHEUdYpLTfzMp8AH0DHooRj5A6vi9T3yjtlhuhSuQeBNQdhw3HbMHWd8zFYq9Fiv7t+zKNj2JPmQtVWd6DgHrHYSGhfvMeSAuBa4GcCOUnU0JsSDJEqEr5vaooIpWO71VKREq8Sg6Hw+FwZBxuTsrhcDgcGYsTKYfD4XBkLE6kHA6Hw5GxOJFyOBwOR8biRMrhcDgcGYsTKYfD4XBkLE6kHA6Hw5GxOJFyJA0RWSEiGnAUishWEVktIu+LyG0i0jnddlZWRKSv93+ZmW5bIiEi3b3Pze3ptiVViPG1iKyKEszV4eFEypEK3gGeBp7BApouxVaZXwN8IyKvi0iTZF1MRCZ5D99JyWqzrBCR8Z7tk9NtS7oREQEewMLw3JFmc1KGWgSF67CtLyrk7sbJpGq6DXBUSG5X1ZmBCSJSBRgK3OOdPxSRnqq6MQ32VVa+ADoA29NtSATGYttB3Kyqv6XbmFSiqm+IyFfAVSLyqFbgCOulxfWkHGWCqhaq6mtYj2opsD/w9/RaVblQ1e2q+oOqrkq3LRH4MxbT7V9ptqOs+BdQEzg33YZkNOkOhOiOinMQQ/Bbr9xg/FG4m4TkDQQeBr7B9qLZBazEhg87hGkrWgDNSQHljsAC787BIn7vBtYCLwPdI9iZBZwPzMKGoHZ7db/CBHbfMHVqYUM4X2IBOn3BWycBtSPcr3DH5BjveTPgIUz4d2K9pFXAdOC8kLJ9CRMUtQQ7it3LkHv6b+An796sx7ZdPzKBz0437zozIuRP8tmB7R77lHfdvcB9AeUaYkOFvg0et2ARvy8Aqoa0eZLX5gthrvdfL++XMHkXeHkPhKSPAT4ANmHBnTcA87HPc7sw7TTw7tsqSggIXJkPN9znSAdvYV/kBkA/4PmAvMewzdUWAh95aQcCpwMjReRYVf0koPzTwCHAwZiwfR2QF/j3LdhDeiE27LULOAAYAZwoImNV9aUQO/8JnIE97D7BHjoNgXbARGxTt/W+wiLSApuP6+ilz8aEoxtwIzBcRPqqfyjrZaA70AtY5l3DR+DfYRGRpliE6iaYkE/33ldzr93WwOMltePZ0TBC3khMeAtCrn05Jvpgoj0b+78NBgaLyPmq+kQM1/Zxond+v4Ry+2E7w+7EInVXBTZ7NuVjItES25xvGtZT6YcJxXARGaKqu7y2ZgCFQH8REfWUwxua7uuVaSwiB6nq/AAbBoTa6s2H3oiJ0yzsB1A97H9wAfAx9j8uQlU3eUN+R2Bba8wp4b1XTtKtku6oOAcx9qS8su95Zf8Wkn4iUC8kTYA/eeW/A4veH5A/iZK3kTgOaBwmfSj2a3YjAfsoYb/WFfuVG67eIUCjEBtneXUeBGoE5NUAniVMDwkYHy49xvt9g1f3sTD3JAc4KiStL3FsL4Ft3aHYHkT7BKQP8tLXAEeE1OmFv9e5fxzv5VOvzf4R8n3/Y8V6Udlhynzh5b8IVA9Ibwks8vJuC6kzx0s/JCDNt5XEt975soC8KtgPrL1A3YB7vR3YGu49Y8LaJsL7ute7xlXJ+A5WxMPNSTnSxQbvvE9goqq+qiG7wqrxD0wEOmA9lbhQ1emq+muY9GlYj8jXq/PRyDt/FaHe1xo82X0ctvX6Z8ClqrojoOwObNhwHXCKiNSP1/4INPbO09V74gVcc5eqfhSmTkyIyFjgZqxHOEiDHVwmeedzVPXzkOt+6tWrhv2wiJVDvPP3JZTbCFyiqrtD7O2N9Vi3Auer6s4Am1YDl3ovLxSR6gFVfb2hgQFpvp7SJKxnFJjXBagPzFHV3720XOyHyDJVXRxqsKouUdXlEd7PdwHtOsLgRMqRLnyfvWJbUYtICxH5k4jcKyL/FJHJnou2z219/0QuKCINPZfvu0XkyYB2DwzT7g/YA2+wiPxVRFqV0Pzx3vk/GmZ7bVX9A/vVXhV7mCaDL7zzHSJyoojUSkajInIU1lvZBQxT1WUBeQ2Bw7G5nncjNPGhd+4R4/VqYcNyYCIUjfdVdWuY9D7eeZqqbgrNVNXpwM9AHeDQgKz/eecBAWkDsPf+NvA5cJSIVAspVzTUp6rrsVGEg0Xk7yLSvoT3EIjP1sZRS1Vi3JyUI1345kCCHigichPwV6J/NnPjvZiI/Alzf68ZpVhRu6q6VUTOwjywbgFuEZE12NzLm8C/A3+tA229810ichfR2Tde+yPwLHAMtpPqK0CBiCzA5vL+raqz4m1QRA4AXgWygVGqOjukSBvvnAvstaVNEYn1fdb1zrtCe0hhWBkhvbl3jtRjAfgRaBpQFmzubxfQW0SysWHbI4FZqrpDRN73XnfH5pV8IvU/gjkdm9ubCEwUkfVYr/odYEpAryuULd65XhS7KzVOpBxljrdo0ze8MT8gfQQ2z7IV+7J/APzsGzoTkeewtTRRn4xhrtcNeBSbR7gSm1D/CdiuqioitwJ/CW1XVV/2HlLDgKOw+ZaR3jFJRHp7Q0lgnoBgvYgVJZgU6UEbF16P7RQRuQ0Y4tnXC7gYuFhE/qWqZ8fanog0wpxa6gOXq+p/whTzvc/fMTGLxoYS8n1s9s45IpJdglDtiJIHNr8TM54QzcKGertjPfwa+EXof9iw30AR+RwTrB3Y0HNgOx+LSBvs/9AX6On9PRT7rByjqvPCmOD7YVSh14WVBidSjnQwGHsQ7gFmBqSP8s5/VdUnw9TLT/B6IzABekBV746nXW9+7GnvQETaAU9gD7U7sF4MgE+sXlLVhxO0MyFUdQGwwLOvCjb0+Bxwloi8oKqRhuWK8MLzvI71CB9S1XsiFPW9zz2qOr60toOt3xKRPzAvwn2wYbl4WeOd20Yp48tbE5L+P+z/ORD/DxXfcN7nwDYv7wOsJ/6e+j0Ei1DV7ZjTxotQ5H15LzAa8y7sGcYm35ysW8wbATcn5ShTPKeBe72Xz4Q4HzTwzqsJQUQ6EHly2ffLO9KPrmjt7gscHc3mQLz5mVu8lwcHZL3tnUcRHyXZHhdqi6bfAF7zkg6OVh6KhG0K5go9Db+TQbj212C934Yi0re09gbwlXeO2ynGwzcPNjScY4qIHIsN9W3D3PYDCZyXGoD1EucAqOoebPj0cGB4SPmoqOrPmIckRP4/+N7vVxHyKz1OpBxlgohUEZETsEWu+ZhjwpUhxX7wzud68wO+uo2wnkykB7nvl3GHCPm+dk8XkdoB7dbB5pzqhbG3i4iMjhAAdKh3Dhy2exV7+PURkcdEpEFoJRFpIiKh0QVKsj0iInK6iHQNk74PfqeFWIYW/44tbJ0DjA3n+BHC9d55iogcE+b6WSLSX0S6x3BtHzO8c0zOFqGo6sfYZ6sO8LCI5ATY0xy4z3v5UMhcIl693zEh6oa56AeuC3sf++z5vBWDREpEWonIOSISbq403GclEN/7nREhv9IjIZ6rDkfCiMgKbH3RO9hiSoDq2AR6V/xi8Crwp5BeFCLSFvtFWRfr9XyOzQ/08V4vwtZRnamqkwPqNcEWStbEv2iyAHhdVV/3fll/g62XWY9Nlgs2z7Qbm4c5C7hJVSd5bZ6IOSNs92xajTkTdMGGjbZia3qKFmB6i3nfAg7y8r/x6lXHPAc7AutUtUlAnRxsDqsJJnILsWHQT1X1qYg32+q+is2XrcEWLm/Gho96Y0NnHwMDvN4AXs9nBvChqvb10lpia8HAFgMXc7f3eFVVXw249kTgTmyOajH2v9nmvY8u2P96gqo+Fu09BLTXBbvPRbaF5E/CFssW/Y/ClMn33l8LbMjwY/yLeWth4jI43FCdiLwGnOC9vERVHwzI64z9L8HmjhoGCrmIHIItMN6N/R+WYx2AjkAn7P95ktfDDbxmA+x78gvQOoYfB5WTdC3QckfFOygeXqcQe1ivxn6N3gocWEIbbbAIFKuxqALLsF/6dYHJXrvjw9Trhz2gNnvXDVrci617+gfm4bXLa/8JbAhoUpjyTbCo7W9jD53tXtvzgbuBVhHsrw5ciA0/bcIeXD9jvZS7gJ5h6hwMvIG5XxcQ4+JeTIzuw1zRf/He1xpseOosICekfF9CFvNiERE0hmNSBLufxEIy7fD+14uxocZzgAZxfn5me/+71mHyiv2PIrTREBPPRd7nZyv2Y+dCoFqUepcEvNcOIXmCibdiSwxC69bB4g6+CizBxHoLtubrH0DHCNe8yGvz2nR/dzP5cD0ph8OREYjIGOwHys2qekO67Uk1IjIXaI9Fo3COExFwc1IOhyNTeAHrFV6cxKgcGYmIDMGGwO90AhUd15NyOBwZg4gcgQ373amq16TbnlTgrRP8ChuaPEDNdd0RASdSDofD4chY3HCfw+FwODIWJ1IOh8PhyFicSDkcDocjY3Ei5XA4HI6MxYmUw+FwODIWJ1IOh8PhyFj+H9p1NptDknicAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(6,3))\n",
"\n",
"for s in yseries:\n",
" plt.plot(x, df[s],color=colors[s],label=serieslabels[s],linewidth=mylinewidth,marker=\"o\")\n",
"\n",
"#plt.xticks(x)\n",
"plt.yscale(\"log\")\n",
"\n",
"# axes\n",
"plt.xlabel('Dataset size (rows)', fontsize=labelfontsize)\n",
"plt.xticks(fontsize = ticfontsize)\n",
"plt.tick_params(width=ticwidth,length=ticlength,which='both')\n",
"\n",
"plt.ylabel('Runtime (sec)', fontsize=labelfontsize)\n",
"plt.yticks(fontsize = ticfontsize)\n",
"\n",
"# grid and axis lines\n",
"plt.grid(visible=True, linewidth=2, color=\"black\",which=\"major\", axis=\"y\")\n",
"\n",
"for axis in ['top','bottom','left','right']:\n",
" plt.axes().spines[axis].set_linewidth(ticwidth)\n",
"\n",
"plt.tight_layout()\n",
"\n",
"# legend\n",
"plt.legend(fontsize=labelfontsize,handlelength=1.5,frameon=False)\n",
"# save\n",
"plt.savefig('../graphics/scalability-read.pdf')\n",
"plt"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "FileNotFoundError",
"evalue": "[Errno 2] No such file or directory: './scalability-read.csv'",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m",
"\u001b[0;31mFileNotFoundError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m<ipython-input-12-c3e1efa44641>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[1;32m 1\u001b[0m \u001b[0;31m# read data and setup plot metadata and settings\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 2\u001b[0;31m \u001b[0mdf\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./scalability-read.csv\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 3\u001b[0m \u001b[0myseries\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m \u001b[0;34m\"coldruntime\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"hotruntime\"\u001b[0m \u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 4\u001b[0m colors = { \"coldruntime\": \"blue\",\n\u001b[1;32m 5\u001b[0m \"hotruntime\": \"red\" }\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36mread_csv\u001b[0;34m(filepath_or_buffer, sep, delimiter, header, names, index_col, usecols, squeeze, prefix, mangle_dupe_cols, dtype, engine, converters, true_values, false_values, skipinitialspace, skiprows, skipfooter, nrows, na_values, keep_default_na, na_filter, verbose, skip_blank_lines, parse_dates, infer_datetime_format, keep_date_col, date_parser, dayfirst, cache_dates, iterator, chunksize, compression, thousands, decimal, lineterminator, quotechar, quoting, doublequote, escapechar, comment, encoding, dialect, error_bad_lines, warn_bad_lines, delim_whitespace, low_memory, memory_map, float_precision)\u001b[0m\n\u001b[1;32m 686\u001b[0m )\n\u001b[1;32m 687\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 688\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0m_read\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfilepath_or_buffer\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 689\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 690\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_read\u001b[0;34m(filepath_or_buffer, kwds)\u001b[0m\n\u001b[1;32m 452\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 453\u001b[0m \u001b[0;31m# Create the parser.\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 454\u001b[0;31m \u001b[0mparser\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mTextFileReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfp_or_buf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 455\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 456\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mchunksize\u001b[0m \u001b[0;32mor\u001b[0m \u001b[0miterator\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, f, engine, **kwds)\u001b[0m\n\u001b[1;32m 946\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"has_index_names\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 947\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m--> 948\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mengine\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 949\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 950\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0mclose\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m_make_engine\u001b[0;34m(self, engine)\u001b[0m\n\u001b[1;32m 1178\u001b[0m \u001b[0;32mdef\u001b[0m \u001b[0m_make_engine\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mengine\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"c\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1179\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"c\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 1180\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mCParserWrapper\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mf\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0moptions\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 1181\u001b[0m \u001b[0;32melse\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 1182\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mengine\u001b[0m \u001b[0;34m==\u001b[0m \u001b[0;34m\"python\"\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/io/parsers.py\u001b[0m in \u001b[0;36m__init__\u001b[0;34m(self, src, **kwds)\u001b[0m\n\u001b[1;32m 2008\u001b[0m \u001b[0mkwds\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"usecols\"\u001b[0m\u001b[0;34m]\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0musecols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2009\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2010\u001b[0;31m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mparsers\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mTextReader\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0msrc\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m**\u001b[0m\u001b[0mkwds\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2011\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_reader\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0munnamed_cols\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2012\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader.__cinit__\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/parsers.pyx\u001b[0m in \u001b[0;36mpandas._libs.parsers.TextReader._setup_parser_source\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mFileNotFoundError\u001b[0m: [Errno 2] No such file or directory: './scalability-read.csv'"
]
}
],
"source": [
"# read data and setup plot metadata and settings\n",
"df=pd.read_csv(\"./scalability-read.csv\")\n",
"yseries = [ \"coldruntime\", \"hotruntime\" ]\n",
"colors = { \"coldruntime\": \"blue\",\n",
" \"hotruntime\": \"red\" }\n",
"serieslabels = { \"coldruntime\" : \"Cold cache\",\n",
" \"hotruntime\": \"Hot cache\" }\n",
"df"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": false
},
"outputs": [
{
"name": "stderr",
"output_type": "stream",
"text": [
"<ipython-input-13-4bdcd0e9c241>:21: MatplotlibDeprecationWarning: Adding an axes using the same arguments as a previous axes currently reuses the earlier instance. In a future version, a new instance will always be created and returned. Meanwhile, this warning can be suppressed, and the future behavior ensured, by passing a unique label to each axes instance.\n",
" plt.axes().spines[axis].set_linewidth(ticwidth)\n"
]
},
{
"data": {
"text/plain": [
"<module 'matplotlib.pyplot' from '/Users/lord_pretzel/.pyenv/versions/3.9.0/lib/python3.9/site-packages/matplotlib/pyplot.py'>"
]
},
"execution_count": 13,
"metadata": {},
"output_type": "execute_result"
},
{
"data": {
"image/png": "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li5dyuGHH84HH3xA9erFfxvVqVOHq666ipNOOolatWqlwUqHI73MnQtjx8KSJf60du2sV9WtWxyNDBrk390wK8tW+555ZtLtTZR4hvteBhoBd0QpcytQG3ixNEY5Uk+aI51EZNmyZTz//PMAPPbYY2EFKpD8/HyaNm0alLZnzx4eeughjjjiCHJzc6lRowYdOnTgmmuuYePGjXHbtHLlSk4//XQaN25MjRo16NixI3feeScFBQVxtxVo4+OPP06/fv1o0KABOTk55OXlMWTIEKaG/DNWrlzJbbfdRr9+/WjZsiU5OTk0aNCAfv368dxzz0W9zurVq5k4cSIdO3akVq1a5Obm0qFDBy644AIWRNjVTlV55JFHOOSQQ6hZsyb169dn2LBhEcsDbNy4keuuu46DDjqI2rVrU6tWLbp27cq9997Lnj174r9BjogUFtocU48ewQJ1+ukwb14cAvX++9C3r1+gatSAV1/NKIEC7AMZywHUBBYCBcAnwESgEPgAmOCdC4CvgexY261MBxZCStPNlCmqNWuq2vSqHTVrWnq6ue+++xTQgw46KKH6O3bs0L59+yqgNWvW1MGDB+uoUaO0SZMmCmirVq102bJlxepF+t8sXLhQGzZsqIC2bNlSR48ercccc4xmZ2frSSedpK1atVJAly9fHrONmzZt0h49eiigOTk52r9/fx0zZoweddRRWq9ePW3VqlVQ+ZtvvlkBbdeunQ4cOFBHjx6tvXr10qysLAX04osvDnudd955R3NzcxXQZs2a6fDhw3XEiBHapUsXrVKlit54441FZZcvX150f04//XTNycnRo48+WkeOHFn0HnNzc8Peu2+//VabNWumgLZo0UIHDx6sgwYN0gYNGiigAwYM0F27dsV8fxyR+eUX1WOPDf7u1q6t+uyzcTb0wguq1ar5G6lfX/XTT5Nub8D3KvHnZlyFzWtvlidOBQFn399fAs1LY1BFPpItUoEf1Ew4ksFpp52mgJ511lkJ1b/yyisV0Pbt2+tPP/1UlL59+3YdMWKEAtq9e/di9SL9b7p27aqAnnbaaUEP2gULFui+++5bVC8ekRo2bJgC2qNHD12zZk1Q3o4dO/Stt94KSvviiy90wYIFxdpZvHixtmzZUgH97LPPgvJWrlypderUUUBvvvlm3bNnT7H8OXPmFL32iRSgbdq00aVLlxbl7dy5U48//ngF9JxzzglqZ/v27dqmTRsF9Lbbbgu6zsaNG3XgwIEKBAmiIzGmT1dt1Cj4O9etm2rAvyo2HnxQVcTfSPPmqmE+X8mgzEWqqBIch+0Z9Qa2qPdxYDhemCV3OJFKlOOOO04Bveaaa+Kuu337dq1du7YC+u677xbLX79+fVH+J598EpQX7n/z0UcfKaB169bVzZs3F2vvgQceiFuk5s2bp4DWqVNH161bF/ubi8Djjz+ugF5xxRVB6ZdeeqkCOnr06JjaCRSpadOmFcv//PPPiwQskEceeUQBPfnkk8O2u2bNGq1WrZo2bNhQCwsLY3xXjkB27VK9/PLi37err7a8mCksVL3uuuBG2rdXXbkyZbYnQ6TicZwoQlWnA9MTqetwpIq5c+eybds2mjVrxtFHH10sv2HDhgwdOpTnn3+emTNn0qtXr6jtffjhhwAMGTKEumFiyJx22mlccsklcdk4fbp9bU444QT23XffmOvt3LmTd955hy+//JL169eza5f5Lv3srdhcvHhx2Oucc845xEPVqlU5LozPcvv27QFYu3ZtUPpbb9km3aNGjQrbXrNmzdhvv/347rvvWLJkCfuXuJrUEciSJeYcMXeuP61JE/MMHzgwjob27rUoEoEh0I84At580zaSymASEilHyZRFrD5N8AqljL6fUnwP7nXr1sVdd82aNQC0adMmYpm2bdsGlY3GT952pZHaq1evHnXr1uX333+P2Ubfmi7fQz8WZs+ezcknn1xkTzi2bNlS6usANG3alKpViz8WcnNzAYrE0cePP/4IRBapQNavX+9EKkZUTYguuMC22PBx/PHmbh7H7xuLIjF2rDlF+Bg0yDaWKgeesTGLlIjsA7QDflTVDQHpzTGPv4OBFdjOvPOSbKcjifiE6NprbSF5Xp6F4kq3QAEceuihPPvss3z55ZcJt5FI5IiyIl7btm/fzvDhw/n11185++yzmTBhAvn5+dSpU4cqVarw7rvvcuyxx/qGkxO+jo8qMS2s8ePzcBw8eDANGzaMWnafDP/Fnils2QITJlgQWB/Z2XDnnRYsNq5/7ebNFmX2o4/8aaedBv/8J1SrliyTU0o8Pam/AJcBXYANACKSg3n65WHBZjsBR4pIZ1VdnWRbyxUaJlZfJkVCP+WUzBClUAYPHszEiROZP38+8+bNo0uXLjHXbd7conEtD1yUGILvl7+vbCztRQp5tHnz5rh6UQB5XvToRYsWxVT+o48+4tdff+XQQw/lySefLJa/dOnSiNdZtGgRixYtokWLFnHZGA8tW7Zk0aJFTJgwgcGDB6fsOpWFzz+3SETexxSAAw6Af//bIkrExdq1Fm5i/nx/2hVXwB13xLjKNzOIx9J+WC/q24C0MdjuvDOAgZgzRV3goqRZ6KhU5OfnM3r0aAAmTJhQbHgplGXLlhXNyxx66KHUrl2bNWvW8L///a9Y2Y0bNzLNCwvdt2/fEm3p06cPAG+88Uax4TSg2HqmWDj22GMBeO2119iwYUMJpWHTpk2AiUE4Iq2T8l0nnLAlk0GDBgHw0ksvpfQ6FZ3CQgvycOSRwQJ19tk2HxW3QC1eDL16BQvUXXfZUY4ECojduw/4BZgekvYi5n7eJiBtKfBNabw5KupBkr37KiobN27Utm3bKqA9e/bUb7/9tliZbdu26d///netW7euzps3ryj9iiuuUEA7deqka9euLUrfsWOHjho1Ki4X9MLCQj3kkEMU0PHjx+vu3buL8r777jtt3LhxQi7oQ4cOVUCPPPLIIBt9dga6oM+dO1fB1ih9//33RekFBQV60003FV2/T58+Qe2sWLGiyJPx1ltv1b179wblr1q1KqwLeugarUDC3aOtW7cWucHfeOON+scffxSr9+OPP+qzcS/kqTysWaM6YECw011uruq//51gg198odqwob+xqlVVn3kmqTbHCknw7ovnAbsLmBKSthr4LiTtJWBTaYyqqIcTqdhZu3atHnnkkUUf8o4dO+pJJ52kY8aM0d69e2tOTo4C2rhxY10Z4EIbuJi3Vq1aOnToUD355JO1adOmCmheXl5ci3nnz59ftCg1Ly9PR48erccee2ypFvNu3LhRu3XrpoBWr15dBw4cqGPHjtU+ffqEXcw7ZMgQBVv4e9xxx+no0aO1bdu2WrVqVb3qqqvCipSq6ltvvVUkVM2bN9eTTjpJR4wYoV27do26mDcSke7Rt99+q3l5eQpogwYNtG/fvjpu3DgdOnSo5ufnK6BHHHFEzPenMjFtWrCegGqPHqpxfJyCefdd1Vq1/I3VrKkasu6uLClrkdoc2JPC5qEKgSdCyk0FtpXGqIp6OJGKn2nTpum4ceO0TZs2WrNmTc3OztbmzZvr4MGD9fHHH9dt27YVq7N792594IEHtFu3blq7dm3NycnRAw44QK+66irdsGFD2OtE+9/8+OOPeuqpp+q+++5b1NYtt9yie/bsSUikVG2B7IMPPqg9e/bU3NxczcnJ0by8PB06dKg+//zzQWV37dqlt99+u3bq1EmrV6+uDRs21KFDh+pnn32mM2bMiChSPtsvvPBCzc/P15ycHM3NzdWOHTvqhRdeqAsXLiwqVxqRUlXdvHmz3nrrrXrEEUdobm5u0f+pe/fuev311+s333wT1/2p6OzYoXrJJcHiJGLLmELWXcfOc88FR5Fo0EB19uyk2h0vyRApsXZKRkRmAZ2B1qq6QUT+AvwNGK+qzwaU+wiLOtEupoYrET7HiVjvucPhqHh8/715hH/zjT+teXOYMsVC6SXE/ffb1ho+WraEd96BDh1KYWnp8XmZaik2fY1nBu0ZLH7fHBH5LzAJ2Aq8FmBQdaAr8EOiBjkcDkdFRBWefBIOPTRYoIYNs9cJCZSqbcUbKFAdO8KsWWkXqGQRjwv640B34HRsqG8rcLaqBro9nYAJ2YdJs9DhcDjKOZs32wL6QCfInBy45x5bE5XQsra9e+FPf4J//cuf1rMnTJsGDRqU1uSMIebhvqIKInnYlh0/qOq2kLxDMJf0z1T112QZWVFww30OR+Xj009t7dOqVf60Tp1s36eDDkqw0e3bYcwYEyQfgwfDiy9a+JgMoayH+3wXW6Wqc0IFysv7WlVfq6gCJSL7ich0EdkmIutF5EERyZxPhMPhyBgKCuDmm+Goo4IF6vzz4YsvSiFQv/1mO+kGCtT48fDKKxklUMnCxe6LERGphy1aXgmMxHqT9wD7YouaHQ6HA4DVq+HUU4OjEdWvb9GIhg8vRcNr1sCxx8LChf60q6+2/eIzOBxYaYjYkxKRW0WkeOjnOBCRuiJya2nayCD+BNQHhqnqdFV9BrgEGC0indJrmsPhyBReeQUOPjhYoHr3NueIUgnUDz/YnFOgQN1zj4WqqKACBdGH+64GfhSRG715qJgRkTwRmQT8CFxVCvsyieOB/2lAcF3gP9gi50HpMcnhcGQKO3ZY1PKTTrIRObAIRDfdBDNmmFd4wnz+ucVM8o0bVq1qPuuXXVZquzOdaCLVC1gG3IiJ1fsi8hcR6SsijUWkKoCIVPVe9xORv4rIB5g43QAsAXqmyngROUBELhWRKSLyg4gUioiKyMgY6o4TkY9F5HdvjmmOiFwoIpHuSQfgu8AEVd2F3aP49kNwOBwVigULoFs3ePRRf1peHnz4IdxwA2RllaLx6dOhf3/YuNFe16oFb7yRmRGiU0DEOSlV/Qw4XETGAX8G+mNBZosQkV1ATmCSd/4MuF9VX0iqtcWZAFwabyUReRi4ANgJ/A/YAwwAHgIGiMhIVS0MqVYfi7oRym9AxfH3dDgcMaMKjz0GEyfatk0+Ro60/dnq1y/lBaZMgTPPNHdzsA0K33oLDj+8lA2XH0r07lPV51T1cOBw4DZgNrADE6Tq3nk7tmXH/wFdVbVnGQgUwALgLmA0kE8M67NEZAQmUL8AnVV1iKoOB/YDvgeGAxenzGKHw1Eh2LjRhvYuuMAvUDVq2Oa3L76YBIG65x7b+8knUHl55s9eiQQK4vDuU9U5wBzfa8/1ui6wWVV3pMC2WGwK2ocgxo3e/uKdr1bVJQFt/SoiE4CZwDUi8mBIb+o3oF6Y9urjImw4HJWKDz+00bbADZ47d7Z9n0od6EHVPPbuusufduCBNuwXwz5oFY2ENxZR1e2q+nO6BCoRRKQFcCiwG4vWHoSqfgisAZpg0TUC+R6blwpsLwfbrdiJlMNRCdi71+aY+vULFqhLLjHfhlIL1J49NrwXKFBHHmmugpVQoIDYo6CXhwPrBSkwMkL+UC//qyhtvOKVuTAk/WpgG7BPQNoYr2zHMO2oO9zhjop0tFL4RAmIXA7rFYYkpf2aoG8EN66vglZP+/su/VGa53o526Kx1LTxziujlPGtDW8Tkv4PzHHiNRE5VkROAx4EXlDV73A4HBWYUcDXmNOzjw+wjSHeKHXrDYD3gcEBaU8CIzDvrspMZROp2t75jyhlfOGe6gQmqupmzMNxG/Bf4F7gBeCscI2oqoQeAXnuiHK0atUKgBkzZkQt59ve/amnnkq7zZl6nHHGGe4eleLYtk05+2zFNiGvB5g7+a23wt69/VFdW/rrrFrFxg4d6BH4ALn2Ws4pLGRvBtyD0hzJwIVFigNVXQwcF0tZXzBZR/mhdevWrFy5kuXLl9O6det0m+NIM19/bTFcFy3yp7VpA889B91DZ6wT5fvvLQ7fTz/ZaxHbG+pi52Dso7L1pHy9pFpRyvh6W1tTbIvD4chAVE0njjgiWKDGjoV585IoULNnm1OET6CqVTMFdAIVRGXrSa3wzq2ilPEFL1kRpUyJaJjQ9K535XBkNuvXm3Pdm2/602rVgocfhtNPT2KIvDffhFGjLJYSQO3aFvRv4MAkXaDiUNl6UvO8cycRqRGhTLeQsgnhhWcKOkrTXtKZOhVat7bgYq1b2+sKhKry7LPP0rdvX+rXr0/16tVp164dF154IatXrw4qO3nyZESElSvNn6ZNmzaISNGxYsWKmK/7/fffc95555Gfn0+NGjWoX78+nTt35oorrihq38d//vMfzjrrLDp16kS9evWoXr06+fn5YW0MfW8vvvgigwYNolGjRmRnZ9O8eXMGDBjAgw8+GLHe0qVLGTduHI0bNyYnJ4f27dtzxx13UFgYGlzFzzvvvMMJJ5xA48aNyc7OpmnTpowdO5b58+fHfE8yncCvQpMmwQLVtSt89RWccUYSBeqZZ2w7Xp9A7buvBfdzAhWedE+sJXmSbibm8hjWBd0rM9crc3qYvD5e3s9AlVLaEs0dM71MmaJas6YG+dLWrGnpGUCrVq0U0BkzZkQt16dPHwX0qaeeCkovLCzUcePGKaDVqlXTo48+WkePHq1t2rRRQBs0aKBffPFFUfmPP/5YzzjjDK1Vq5YCOmLECD3jjDOKjvXr18dk99NPP63Z2dkKaNu2bXXUqFE6bNgw7dSpU1g7s7KytFatWtqtWzcdMWKEDhkyRFu0aKGANmzYUBctWlTsGrt27dITTjhBAc3KytJevXrp2LFjtX///tqoUaNin68zzjhDAb300ks1NzdX27Ztq6NHj9Z+/fpp1apVFdCLLroo7Pu55JJLFNCqVatqjx49dNSoUdqlSxcFtHr16vrmm2/GdF8ymXBfBd9x+eWqO3cm+YJ33hl8kdatVRcvTvJFMoeAZ17iz9K4K1j4obuwMEiLgDsD8o4AzgPqlcaohN9MbCI1MkCI8gPSGwELvbxLU2RfckUq3DcrnUeSKK1IPfzwwwpo48aNdcGCBUXpe/fu1YsvvlgBbdWqle4MeQL5rrt8+fK4bf7iiy+0atWqmpWVpU8++aQWFhYG5X/33Xf63XffBaW98MIL+scffwSl7dmzR6+77joF9Ljjjit2nUsvvVQB3X///fX7778Pytu7d6++9tprQWk+kQL0xhtv1IKCgqK8Dz/8UKtUqaJVqlTRVatWBdV79NFHFdBOnToVu84rr7yiVatW1Xr16ummTZtKuDOZTbNm4T/KjRol+UIFBaZ6gRfp3Fl17dokXyizKHORAs7G3PYLvaMA+FdAfj8v7czSGBWHPV2xYLa+Y4t3UxYHpoep94hXbgcwDXMp/91LewXISpG9TqRiwCcWsR6hItW2bVsF9PHHHy/W9q5duzQvL08BnRLScyyNSA0bNkwBvfrqq+OuG45mzZpplSpVdMuWLUVpv/76q2ZnZ2uVKlWCxDcaPpHq1q1bMeFUVR00aJAC+vTTTxel7d27V5s2baqALly4MGy7F154oQL6wAMPxPnOMoPCQtVHHon8URZJ4sV271Y99dTgC/Tpo7p5cxIvkpkkQ6RidpwQkV7YgtZtwLXAR8DnIcU+9B72JwBPxdp2KcjFem+h7BetkqpeICKfABdiQ3xZWGijfwGPavEI6HGTcXNQ5ZBjjz2WJk2aRMyfPn06v/76a1DaTz/9xI8//kiVKlU47bTTitXJzs7mlFNO4bbbbmPmzJmckoTtDgoKCnjvvfcAOOecc+Kqu3jxYqZPn87SpUvZtm1b0fzQ3r17KSwsZOnSpXTp0gWADz74gN27d9OrVy86dYpvn83jjz8+bGzL9u3b8/bbb7N27dqitK+//pqff/6ZTp060bFjx7Dt9enTh4cffpjZs2dzcTnzRvvlFzj7bAsmHom8uHbQi8Iff1hI9OnT/WknnWQTYdWrJ+kiFZt4vPuuwlRxkKrOhuIBXVW1UETmERLjLlWo6kz824PEW/c54LmkGlTWaII6OHUqnHcebN/uT6tZ0/YWyKA9aq655hr69u0bMb9v377FRGqNF1CtadOmVI/wEGjbtm1Q2dKyYcMGtm/fTtWqVcnPz4+pzt69e7ngggt48sknfb3ssGzZsqXob5/jRfv28W9flhfhqZubmwvAzoB9Jn788UcAFi5cWGLQ5vXr18dtSzp57TU45xzYELB1qUjwV6lmTbjlliRcbMMGGDwYvvjCn3beefDII6XcYKpyEY9I9QC+8AlUFH4BDkvcpIqBZrILuk+Irr3WdvrMy7NvZQYJVGmJMSJ+2q51//3388QTT9CsWTPuueceevbsSaNGjcjJse3ZevbsyezZs4MErDTvqUqV2B15CwoKAGjevDkDS/A4S0Qw08G2bbbn0xNPBKdPnAgHHQSTJiX5q7ByJRx7bPBCqxtusAtV4K3eU0E8IlUX+CmGcrXjbNeRDk45pUKJko/mXqTotWvXsmvXrqKHfiC+nkLzJEWV3meffahZsybbt29n2bJltGvXrsQ6L71kQfj/8Y9/MGTIkGL5S5cuLZbm6w0tCnzwpYCW3j7nTZs2ZfLkySm9Vlnw2We2LVPgLW3eHJ5+GgYMsNfjxyfxggsWwHHH+cOki8BDD9nGU464iWed1DqKB10NxwHYdhcOR5nTokUL2rZtS2FhIVOmTCmWv2fPHqZ6a8JChxKzs7MBG4qLh6ysrKIex5NPPllCaWPTpk2AXxACee+998IOo/Xv359q1aoxa9Ysvv/++7hsjIfDDz+cffbZh3nz5oUVy/LC3r1w000W1CHwbZx8Mnz7rV+gksonn0Dv3n6Bys6GF15wAlUK4hGpT4GuIhJxKE9Ejgb2x1zBKzUZv5i3AjNx4kQArr/+en74wb/VV0FBAVdddRWrVq2iVatWjBw5Mqier2eViABce+21ZGVlcffdd4ftffzwww9BtviGyR599NGgxbTLli3j/PPPD3uNRo0acf7551NYWMiIESNYvHhxUH5BQQHTpk2L2/ZQqlWrxvXXX09BQQEnnngiXwTOqXjs3r2b119/Peg9ZRJLl5o4TZoE3uglubnw7LO2MWGDBim46LRpcPTRsHmzva5TB95+2yJLOBInVjdAzIuuANvK4hhM4ArxXNCBo4DV2IaCB5XG5bAiHERxmXZEJxmLeceOHauAZmdn6zHHHKNjxowpck2vX79+0GJeH/fff78CWqdOHR0xYoSeffbZevbZZ+uGDRtisvuf//xn0QLZdu3aRV3MO2vWLK1WrVrRmqfRo0fr0UcfrdnZ2dqnTx/t2bNn2Huwc+dOPf744xVskW3v3r117NixOmDAgKiLeUPvkY8bb7yxaA1VKJdddlnRZ7Zz5846fPhwHT16tB555JFFC5/ffvvtmO5NWVFYqPrEE6q1agV7fPfurZrAyoLY+ec/VbOy/Bds1Eh17twUXrB8EPDMS/xZGldhuBz/+qjfvPMm4Ffv70Lgz6UxqCIfTqRio7QipWpC9cwzz2jv3r21bt26mp2dra1bt9YJEyYUW7jqo6CgQG+++WZt37695uTkFH3B4lk39e233+r48eM1Ly9Ps7OztX79+nrwwQfrlVdeqStXrgwq+/XXX+vgwYO1cePGWr16de3QoYPedNNNunPnzqL3Fu4eFBQU6LPPPqv9+/fX+vXra7Vq1bR58+Y6cOBAffjhh4PKlkakVG3B75gxY7Rly5aanZ2tdevW1fbt2+vo0aN16tSpum3btpjvTapZt0512LBgcapWTfW221T37k3RRQsLVW+9NfiibduqLlmSoguWL5IhUmLtxI6IDAIm4Y9x52M+cL2qvh5Xg5UI35BfvPfc4XBE56234KyzIHBFQvv2ttqia9cUXbSw0NwD77/fn3bIITbEF2V9X2XC55GqYbydY24j0QemiOyDOVJkAatVdW0JVSo9TqQcjuSyfTtceaUtPQrkoovgjjtszVNK2L3bXAKff96f1q8fvPqqTX45gDSLlCM60Rwl3D13OErP3Lm2iiLQI79JE3jqKfMATxlbt8KIEeBFGQEsqsSzz7ooEiEkQ6Qq21YdDoejnFNQYNu3d+8eLFAnngjz56dYoNavh/79gwVqwgRzGXQClRLiXnTrxfDrBzQDIv1XVFXPLo1h5Z1wvxycG7rDUTqWL7eFuZ9+6k+rXdumhc48M8XBHFassK3elyzxp910E1x/vYsikUJiHu4TkdrAS5j7OUSPmaeq6oJTheDmpByOxFC1vQIvvthG23z06GGjbDEE+Sgd335rXbSff7bXVarYRNif/pTiC5dvkjHcF09P6nbgWMzlfAqwBIuI7nA4HClj40Y4/3x4+WV/WlYW3Hgj/OUvUDXVQdg++ghOOAF+/91eZ2ebw8RJJ6X4wg6Iryf1M5ANHKyqscTwc4TgelIOR3y895450QXsJMJ++8GUKXD44WVgwKuvwpgxsGuXvc7NtVDqUaLzO/yUteNELvCRE6jYcGGRHI7E2bED/vxnmwIKFKg//QnmzSsjgXrySfPi8wlUkybWq3ICVabE01FeFmd5h8PhiJtvvjHX8oUL/Wn77gv//CcMHVoGBqia++B11/nT8vPhnXfA24vMUXbE05N6CugrIm4pdQyoqoQe6bbJ4chkCgvhrrugW7dggRoyxFzLy0SgCgvhkkuCBerQQ82d0AlUWohnTkqAF4FOwMXAB+omV+LCzUk5HOFZtQrOOANmzvSn1agB995rm9mWiYf3rl1w+unw4ov+tAED4JVXLKK5I27KPOKEiDTAtuHoBOzBduEtDFNUVTXVTqHlDidSDkdxnn/e1sP6nOcADjvMnCMOOKAMDJg61dwEV68OTh892nZGDLNxpiM2ylSkRKQ18BHQnOhrpDyb3DqpUJxIORx+Nm+2vQADw99VqQLXXmvrY6tVKwMjpk6Fc881T41AjjnGAsVWcUF5SkNZi9RLwAjgQ+A+YClR1kmp6spEjaqoOJFyOIwZM2x4L7Dz0qaN9Z569iwjI/74w/aRD+zC+cjLg5XuEVZaylqkNgC/Ax1UdXeiF6zMOJFyVHZ27bJe0t13mxOdjzPPtNBGZTL1o2pbul95JfwUYUWNiDlROEpFWUecqAZ86QTK4XAkwoIFcOqp5mLuo0EDeOKJMgze8NVXcOml8Mkn0cvl5ZWNPY4SiWfA9RugcaoMqWi4xbwOh1FYCPfdZ84QgQJ17LHmWl4mArVunc09HXZYsEDVqWNhjgKpWRNuuaUMjHLEQjwidRfQW0R6pMoYh8NRsVizxsTossv8gRuqV4cHHjC/hGbNUmzA7t3mx77//hZBwjfGWLUqXH65TYr961/QqpUN8bVqBY8/bquJHRlBPHNSecCF3nEv8A7wE+Fd0FHVVUmyscLg5qQclYmXX7Y1Tr/95k875BBzqOvYsQwMmD7dYisFbjoFcPzxcM89ZeTfXrkpa8eJAt+fQEmVVFVdCKUQnEg5KgNbtljQhqef9qeJwFVXwf/9X/HRtaSzZIl13d58Mzh9//2tV3X88Sk2wOGjrB0nVlOyODkcjkrMJ5/YpoQrVvjT8vJsz6ejjkrxxbdsgb/9zSbA9uzxp+fmwg032GZUKVdIR7KJK+KEo3S4npSjorJ7t21Se/vtwZ7bp54KDz0Edeum8OKFhdZt+8tf4Ndf/ekicNZZ5gTR2Pl8pYOy7kk5HA5HMX74wcRo7lx/Wr168OijthVTSpk928YW58wJTu/VyxZeHXpoig1wpBoX88PhcCSEqu2g3rVrsED172+7radUoNassXHFnj2DBap5c3juOfj4YydQFQTXk3I4HHHzyy82kvb22/607Gy47TZzqEtZyLudO80z79ZbLayRj5wc88y4+mqoVStFF3ekg4gi5XnzKdBRVRcHePfFgvPuczgqKK+9BuecAxs2+NMOPNBcyzt3TtFFVW0r98svh+XLg/NGjLA4S61bp+jijnQS7feOhORLHIcbRnQ4KhjbtlnQhhNPDBaoiRPhyy9TKFALFsDRR1toikCBOugg+OADW5DlBKrCErG3o6pVor12RMeFQXJUJD77zJwjli3zpzVvbk51Awak6KKbNsGNN5oHRkHAQE6DBuZqfu65FjnCUaFxwuNwOCKydy9MmgRHHhksUCefbM4RKRGovXvNI2O//cx/3SdQWVlw0UW2WHfCBCdQlYSY/8sicjqwVFVnlVCuO7C/qj5TWuPKM+HWBbjelaM8sWSJOdB9/rk/LTcXHn7YQtulZEv3GTMsSvn8+cHpAwbYIt0DD0zBRR2ZTDw9qcnAOTGUOxt4KiFrHA5H2lG1WKxdugQLVO/eFsX81FNTIFArVsDIkea/HihQbdrAK6/Ae+85gaqkpGK4LxW/rxwORxmwfr05Rpx7rt/Du1o1cy2fMSMF/gl//GG7ILZvD//5jz+9Vi2LFPHdd2ZQSrptjvJAKgZ1WxBlW3mHw5GZvPWWrX0KjCzUoYNt6d61a5IvpgrPP29rm9asCc479VSLr9S8eZIv6iiPRBUpbx4qkPwwaYFtdQAGAF8mwTaHw1EGbN8OV1xhTnSBXHQR3Hkn1KiR5AvOnWvzTp9+Gpx+2GG20VQPt2Wdw0/UALMiUog/8nksW3QItr/Uyar636RYWIFwAWYdmcacOdZxCdxyqUkTeOopOO64JF9s3Tr4619tk8HA70DjxjaeeMYZKQxV4UgHZRFg9hn8wnQGsAz4NELZ3cAa4DVV/SZCGYfDkQEUFNiI2qRJ5vHt48QT4YknoGHDJF5s92548EHbTGrLFn96tWoWQ+m668xt0OEIQzybHhYCk1X1rNSaVHFxPSlHJrB8ubmWB4621a5tQcPPPDPJPgpvv20bEIbujjtkCPz977YRoaPCUtZbdbTBOUQ4HOUWVXjmGdv7b+tWf3qPHrYpYbt2SbzY4sUmTm+9FZx+wAG23inpY4mOikrMA8CqulJVN6bSGIfDkXymToWWLW26Z/x4v0BlZdkI3EcfJVGgfv/dvDAOPDBYoHJzLXr5/PlOoBxxEbcLuohUBw4DmgHVI5WraBEnRCQfuALoDhwI/KCqbnWhI6NQteCvS5bA0qW2DnbatODQd2C+Cq+/DocfnqQLFxbC5Mm2O+66df50EQuZ/re/QaNGSbqYozIRl0iJyGXADUAss5wVSqSATsBg4HOsB+rckBxpQdX2c1q6NPwR6JsQiezsJArUrFm2O27gzodgAf/uvz8Fi6wclYl4HCfOAp70Xn4P/ABE/Dqo6pmlti6DEJEqqlro/T0ZOCzenpRznHDESmEhrF0bWYgC9/tLBBG7Rqn46SfbZPC554LTW7SAu+6C0aNdpIhKTlk7TlyCuaOfpqrPlVS4ouETKIcjWRQU2HM+UHx8w3TLltkmtIlQu7YFEM/Ph3feCd+zyssrheE7d5pn3q232kpgH9WrWwSJq65yu+M6kkY8InUAMCtVAiUiBwDHAd2wOa/9scXBo1T15RLqjgMmAJ2BLKyX9xTwqBMXRzrZuxdWrfKLT+Dx44+2hCgR6tb1C1Ho0aiRvwMzdSqcd16wltSsaWHx4kbVJrkuv9wCwgYyapSFp3CbDzqSTDwi9QewKlWGYCJzabyVRORh4AJgJ/A/YA8WmukhYICIjHRC5Uglu3fbMzvcsNzy5cGLZeNhn33Ci9B++9m+f7GMpJ1yip2vvdbEMi/PBMqXHjPz59vC2w8+CE7v3Nnmnfr2jbNBhyM24hGpWZhXW6pYANwFzAHmAv8E+kSrICIjMIH6BThKVZd46Y2BGcBw4GLg/pB6dYGmMdi0SlW3l1wstUydmoSHjKNU7NxpghNOiFauLO49FyuNGvmFJ1CI2rWD+vWTY/spp5Ti87Jxo3933MBJrH32MY+9c85xmw86Uko8n66bgFkicoaqPp1sQ1T1ycDXEtuE61+889U+gfLa+lVEJgAzgWtE5MGQ3tRwYtvzqp/XRtqYOhXOPht27bLXK1fac2HdOhgzxoZuatSwCDNujrp0bN9uQ3Dh5ohWrw4ONxcPzZqF7xG1a5fB0YD27oV//ANuuMG2cfeRlQUXXGDxlBo0SJt5jspDPN59RwGDgKuAl4E3seG/sENpqvpRqQwTmYn1pMLOSYlIC2A1FjOwnqruCFPmJ6A50KukHYXjtG0yJXj3JW8X3uVA6xjK7QV2eMf2FP+9k5JjDWcqtYB2QD6wn3f2HS1K0e4qYGmYYxl278oP/bChh4NC0t8D/gx8V9YGOco9ZeXdNxN7Mgkw0jsi2hRn24nQxTsvDCdQHl9iItUFG64sh8TqhlUVqOMdZUEyha+k/JLG0sYCt2L3ahVwMzCP4iKUT2yjvOEooLgQLfHOyzHhLt+0Bu4GRoSkLwMmAq+XtUEOB/EJyUdk1s/nNt55ZZQyPkePNlHKxISI1ASO9162AnJFxCfUX6pqkB3hfjkksk6qdWsb4gslK8siVW/fDjt2JD45nzg1vCP1Qz5Vq/qHNWvUCP5782b4/vvAOaHW2HRm/GRl2W7l4YbmWrfOIienDfZROjoZbytz+OMP2yrj7rv948pgbuTXXku7yy7jteoRg8s4HBGJcdomKjGLlKr2LfXVkktt7xxtWaMvIG4yuheNgJdC0nyvzwQmB2Yka7jvllvCuxA//njwZPiePSZWvsMnXrH8HU/ZHTsSX7+TKHv32lqfWCIplES1atC2bXghatXK8isNqrYQ9+qri++Oe9pptpdHs2bpsc3h8HBuOTGiqiuwoc4yJVYX4mrV7CiLifjCQhOqZIleSX8nGhnhhBOKu263bGk9pkrPnDm2O+6skFHwbt1sd9zu3dNjl8MRQnkWKV8vKdrSdl9va2uUMikh2nBfvJTKhTgFVKlivbmaNc0TOZWo2jqkSCJ28snB8Ux9tGoFr72WWtvKJb/+arvjPvVU8d1xb78dTj/d7Y7ryChiFinPuy9mSuvdFwMrvHOrKGVahpR1lDNEICfHjnr1iuffc08SIypUVKZONWFatcpuaKA4ZWfbvk9//WsG+8M7KjOJePfFQll4983zzp1EpEYED79uIWXLjOS5oDuikbSIChWJLVv8C71efhn++1+/Z0mgQJ1wgsXgy89Pj50ORwzEs05qJuFFqgrWm/H1WmYDe1S1X6kMK2GdlFdmLtAVOCN0/yoR6YMJ6y9A87IOjRRNpFwUdEep+e238KuOly6F9etLrt+okQ39ORwppEyjoJfk3SciB2JRHHZigWLLgtswD7s7RGSWqi71bGkEPOKVuT0dsfuSOSflqISoWkiicCK0dGlwFIhEiEXIHI4MIOaeVEyNibTEFqTfoap/i7NuV/zCAtARcx1fAhR9I1W1e0i9R7DgtDuB9/EHmM0FXgVGqmqCkdWSi9tPyhGEqnl9RBKi339PrN3sbIu5lJ8PM2f694sPpFWr4pHMHY4kk4yeVFJFCkBE/ocNr7WPs15fLChsVCL0UMYBF2KRXHxbdfyLNG7V4Yb7HIAJ0c8/hxehpUth27aS2whHjRomROH262je3O9nH2mvjtCFdg5HCshUkfoPcLyq1khqw+UMJ1KViMJCWwwbToiWLQsWiHioVSvyplFNm8buKu7C6DvSRMaJlIjUARYBWaraOGkNVxDccF85pqDAQqFHEqLAcELxkJsbWYgaN3ah7R3lmjJ1nBCRaJFOawPtsQjpjYGpiRrkcKSNvXstUGKkbXT37Ems3QYNwotQfr4FYHRC5HBEJB4X9EJKXicl2PYZPVV1TQllKzRJHe5zwzXJw7eNbjghWrEi8Ui9++4bWYjcvkuOSkqZDveJyAoii9RuYA22ffvDqro5UYMqCkkTqalT4dxzLQ6Qjxo14OGHYdw4+xVepUrwubIRKuKTJsERR4QXopUrEw8G2KRJZCGqWzepb8nhqAhk3JyUIzoJzUlF2qsj+oWChStUxGJJS6ROstNiqbN8uQVJTXT/9lCaNy8uQPvtZ550tWuXXN/hcBSRkSIlIlWwCBCxbM9eqUhIpKpUSXzfckdxRCwUeqgI5efbHh41a6bbQoejwpBRIuWJ02nAdUBbVXUbIoSQ9J5UdrYNXan6zw4/Rx8dLEL5+barodvAz+EoE8pEpESkGXAM5rX3K/Cuqq4NKTMOmAS0w5wnflXVRPfprhAkdU4qnsWYgYIVeE5lWllfLzDtiissfFAoLqKCw5F2Uu6CLiKXArcD2QHJu0XkUlV9XETaYu7mh2PitBW4G7gnUYMcIcQb5lukcu3qV62a26vD4ajAROxJeftHzfRebgUWA3WBNpggDQKewXpYe7C4e7eo6obUmlx+cYt5U4Rz0Xc4MpKUDveJyAvAKEx8rlDVnV56J+A/QB5QHZgPnKyqixI1orLgRMrhcFQmUi1SK7F1Ue1Co4iLyCDgTWAH5iThNqaJAbdVh8PhqIyURqSiRahsBMyLsM3FbO/8kRMoh8PhcKSKaI4TOcBv4TJUdbPXjfslFUZVVErV5fUPFVbCkBIl4+5PdNz9iY67P9FJ5/2JMdZ/RNzwlcPhcDhSRklR0Jt4Xn5x56vqR4mb5XA4HA5HdMeJWKKeR0JVNeZtQBwl44YjouPuT3Tc/YmOuz/RSef9iSYkq3DDeQ6Hw+FIIy4KusPhcDgyltI6TjgcDofDkTKcSDkcDocjY3Ei5XA4HI6MxYmUw+FwODIWJ1JpREQOEJFLRWSKiPwgIoUioiIyMkqdFV6ZvhHyDxKRn70yL4tIdrhymUIi9yCg7jgR+VhEfheRbSIyR0Qu9DbgDFd+ptf2+Aj5LUTke6/MxyJSt5RvLybK8h4E1DtORN4VkU0isl1EFojItSKSE6H8ZM+mSRHy64rIJ16Z70SkRUxvPgWU8nulInJ7Ce1PCSg7M+lvIAmk6XulIvLvEtr+W0DZFTG9GVV1R5oO4D7MzT/0GBmlzgqvTN8weUcAm7z8fwFZ6X6PqbgHXr2HvXI7gDeAV4AtXtp/gSph6sz08seHycsPuLdvAzUr4j3w6l3lldkLvA+8BKzz0maHe+/AZC9/Upi8RsA8L38u0LC8faYC/vcKrIn03QFyge0BZWem871mwmcq4Hvlq1cvQttV8C9tUmBFLO/F9aTSywLgLmA09pD8MNGGRKQ/9sCpj31Az9bwwYEzjbjvgYiMAC7AYkd2VtUhqjoc2A/4HhgOXByrASJyEPAx0Ap7YA9T1e3RayWVMrsHInIYtpHpdqCXqg5U1VFAW+AjoDsQ846RItLSq3cIdg/7afr3lCvN92oO0Aw4OkL+GKAG8GVpDCwD0vG9moNt3zQmQv5AoCXx3rt0K747wv4iiasnBZwA7CTCL93ydMR4D+Z4ZU4Pk9fHy/uZkF99hOlJYQ9lX+/zydA6FfAevOzl3RCmXlugANhFyK9hwvSksIeXb0uft4Aa6b53pbifvu/Vhd753xHKzcJ6oBeTwT2pMv5M+dq+xLs3n0Vo/zmv3AW4nlTlQUROwTahzAb+rKqT0mtRavHmOg4FdmO9niBU9UNsuKYJJkDR2uoPvIf1Pu9R1XNUtTDpRieZRO+BNz85yHs5NUy9H7Hhvmzg+BJs6Iz1nPKAF7He544E3k6m8TnWaxgmIvUCM0TkAKAH8A72sK4wJOl7tRZ4FzhCRNqHtF8X64l9B3wRj21OpMoxIjIBeBYQ4CxVvT/NJpUFXbzzwigPxS9DyhZDRIZhv/5rY72Ky5NnYspJ9B4cANQENqnqsjjqBSEi3bFfz42BJ4CxqronBrvLC09hw1ZjQ9LHB+RXNJLyvcJ/b84MSR+D3dO4750TqfLLn4FHgD3Ayao6Oa3WlB1tvPPKKGVWhZQNZSQ27JUNXKKqNyfJtrIi0XvQJiQv1nqBHIl/7vMuVT2vPPQ+4+RZbNhzvC9BRLKA07Gh4dfTY1ZKScb3CuzebAJO9e6ZjzOxocAp8RrmRKr8Msw736eq/02rJWVLbe/8R5Qy27xznQj5g7Hgyi+p6oPJMqwMSfQeJOPeDQBqAV+o6lXRjCyvqOovwHTgcBHp4CUfgzlUPKequ9NmXOpIxmcDVd0FPI/dq2MAvHt4BDDdu7dx4USq/OLz1rlcRE5OqyXlD99eZyeLSHka5ssEZmO998NF5IF0G5NCJnvn8SHnyThKYrJ3Hh9ynkwCOJEqv0wC7gaygKmVSKh8v+ZqRSnj+1W4NUL+U/hdae8WkYnJMKwMSfQeJOPevYu5Ne8BLhaRijoP+jqwEThNRBpiIxfzVXVues1KGcn4bACgqnMwF/hh3r07DbuX0xIxzIlUOUZVr8SEqiqVR6hWeOdWUcq0DClbDFV9CL9Q/b2cCdUK7xzvPfD9nRdnvSBU9RX8QnVJRRQqb0jvOaAp9qMmh4rpMOFjhXcu1fcqgMB71hSYmugwqROpck4YoRqVZpNSzTzv3ElEakQo0y2kbFjCCNVlSbCvLEj0HvyARQRoICLtItQ7PEy9YoQRqvtKMrocMtk7D8Em/Yu57Vcgkva98piC3bMh3uvJiRrmRKoCECJUz1VkoVLV1cBXmGdesfcpIn2AFtiq+dkxtBcoVPeUB6FK9B54v2Tf9l6eEqZeW2wd0G7gzRjsCBSqSyuaUKnqV8Cn2FDVS6q6Ls0mpYwUfK/WYeutNgKfqGoswhYWJ1IVhDBCVWIgyXLMbd75DhHJ9yWKSCPMLR/g9lhdo8MI1Z+TZWgKSfQe3I6t9r9aRA4PqFcbi/dYBXhEVTfHYkQYobo3gfeSsajqkaraUFXHpduWMiDZ36tx3r3rXSqr0h2uozIfQFfgs4DDF8hxcWB6SJ0VRAgw6+Xf5eXvoYRgkplwJHIPvHqP4A9oOQ0Lfvm7l/YKYQKEEiXArJd/Ef7gl3+uiPfAqxcYYPZdLGLEr17aZ8QZYNbLH471wBS4t7x9pgK+V4fFeI2RZHBYpDR9r2J63gCHEUdYpLTfzMp8AH0DHooRj5A6vi9T3yjtlhuhSuQeBNQdhw3HbMHWd8zFYq9Fiv7t+zKNj2JPmQtVWd6DgHrHYSGhfvMeSAuBa4GcCOUnU0JsSDJEqEr5vaooIpWO71VKREq8Sg6Hw+FwZBxuTsrhcDgcGYsTKYfD4XBkLE6kHA6Hw5GxOJFyOBwOR8biRMrhcDgcGYsTKYfD4XBkLE6kHA6Hw5GxOJFyJA0RWSEiGnAUishWEVktIu+LyG0i0jnddlZWRKSv93+ZmW5bIiEi3b3Pze3ptiVViPG1iKyKEszV4eFEypEK3gGeBp7BApouxVaZXwN8IyKvi0iTZF1MRCZ5D99JyWqzrBCR8Z7tk9NtS7oREQEewMLw3JFmc1KGWgSF67CtLyrk7sbJpGq6DXBUSG5X1ZmBCSJSBRgK3OOdPxSRnqq6MQ32VVa+ADoA29NtSATGYttB3Kyqv6XbmFSiqm+IyFfAVSLyqFbgCOulxfWkHGWCqhaq6mtYj2opsD/w9/RaVblQ1e2q+oOqrkq3LRH4MxbT7V9ptqOs+BdQEzg33YZkNOkOhOiOinMQQ/Bbr9xg/FG4m4TkDQQeBr7B9qLZBazEhg87hGkrWgDNSQHljsAC787BIn7vBtYCLwPdI9iZBZwPzMKGoHZ7db/CBHbfMHVqYUM4X2IBOn3BWycBtSPcr3DH5BjveTPgIUz4d2K9pFXAdOC8kLJ9CRMUtQQ7it3LkHv6b+An796sx7ZdPzKBz0437zozIuRP8tmB7R77lHfdvcB9AeUaYkOFvg0et2ARvy8Aqoa0eZLX5gthrvdfL++XMHkXeHkPhKSPAT4ANmHBnTcA87HPc7sw7TTw7tsqSggIXJkPN9znSAdvYV/kBkA/4PmAvMewzdUWAh95aQcCpwMjReRYVf0koPzTwCHAwZiwfR2QF/j3LdhDeiE27LULOAAYAZwoImNV9aUQO/8JnIE97D7BHjoNgXbARGxTt/W+wiLSApuP6+ilz8aEoxtwIzBcRPqqfyjrZaA70AtY5l3DR+DfYRGRpliE6iaYkE/33ldzr93WwOMltePZ0TBC3khMeAtCrn05Jvpgoj0b+78NBgaLyPmq+kQM1/Zxond+v4Ry+2E7w+7EInVXBTZ7NuVjItES25xvGtZT6YcJxXARGaKqu7y2ZgCFQH8REfWUwxua7uuVaSwiB6nq/AAbBoTa6s2H3oiJ0yzsB1A97H9wAfAx9j8uQlU3eUN+R2Bba8wp4b1XTtKtku6oOAcx9qS8su95Zf8Wkn4iUC8kTYA/eeW/A4veH5A/iZK3kTgOaBwmfSj2a3YjAfsoYb/WFfuVG67eIUCjEBtneXUeBGoE5NUAniVMDwkYHy49xvt9g1f3sTD3JAc4KiStL3FsL4Ft3aHYHkT7BKQP8tLXAEeE1OmFv9e5fxzv5VOvzf4R8n3/Y8V6Udlhynzh5b8IVA9Ibwks8vJuC6kzx0s/JCDNt5XEt975soC8KtgPrL1A3YB7vR3YGu49Y8LaJsL7ute7xlXJ+A5WxMPNSTnSxQbvvE9goqq+qiG7wqrxD0wEOmA9lbhQ1emq+muY9GlYj8jXq/PRyDt/FaHe1xo82X0ctvX6Z8ClqrojoOwObNhwHXCKiNSP1/4INPbO09V74gVcc5eqfhSmTkyIyFjgZqxHOEiDHVwmeedzVPXzkOt+6tWrhv2wiJVDvPP3JZTbCFyiqrtD7O2N9Vi3Auer6s4Am1YDl3ovLxSR6gFVfb2hgQFpvp7SJKxnFJjXBagPzFHV3720XOyHyDJVXRxqsKouUdXlEd7PdwHtOsLgRMqRLnyfvWJbUYtICxH5k4jcKyL/FJHJnou2z219/0QuKCINPZfvu0XkyYB2DwzT7g/YA2+wiPxVRFqV0Pzx3vk/GmZ7bVX9A/vVXhV7mCaDL7zzHSJyoojUSkajInIU1lvZBQxT1WUBeQ2Bw7G5nncjNPGhd+4R4/VqYcNyYCIUjfdVdWuY9D7eeZqqbgrNVNXpwM9AHeDQgKz/eecBAWkDsPf+NvA5cJSIVAspVzTUp6rrsVGEg0Xk7yLSvoT3EIjP1sZRS1Vi3JyUI1345kCCHigichPwV6J/NnPjvZiI/Alzf68ZpVhRu6q6VUTOwjywbgFuEZE12NzLm8C/A3+tA229810ichfR2Tde+yPwLHAMtpPqK0CBiCzA5vL+raqz4m1QRA4AXgWygVGqOjukSBvvnAvstaVNEYn1fdb1zrtCe0hhWBkhvbl3jtRjAfgRaBpQFmzubxfQW0SysWHbI4FZqrpDRN73XnfH5pV8IvU/gjkdm9ubCEwUkfVYr/odYEpAryuULd65XhS7KzVOpBxljrdo0ze8MT8gfQQ2z7IV+7J/APzsGzoTkeewtTRRn4xhrtcNeBSbR7gSm1D/CdiuqioitwJ/CW1XVV/2HlLDgKOw+ZaR3jFJRHp7Q0lgnoBgvYgVJZgU6UEbF16P7RQRuQ0Y4tnXC7gYuFhE/qWqZ8fanog0wpxa6gOXq+p/whTzvc/fMTGLxoYS8n1s9s45IpJdglDtiJIHNr8TM54QzcKGertjPfwa+EXof9iw30AR+RwTrB3Y0HNgOx+LSBvs/9AX6On9PRT7rByjqvPCmOD7YVSh14WVBidSjnQwGHsQ7gFmBqSP8s5/VdUnw9TLT/B6IzABekBV746nXW9+7GnvQETaAU9gD7U7sF4MgE+sXlLVhxO0MyFUdQGwwLOvCjb0+Bxwloi8oKqRhuWK8MLzvI71CB9S1XsiFPW9zz2qOr60toOt3xKRPzAvwn2wYbl4WeOd20Yp48tbE5L+P+z/ORD/DxXfcN7nwDYv7wOsJ/6e+j0Ei1DV7ZjTxotQ5H15LzAa8y7sGcYm35ysW8wbATcn5ShTPKeBe72Xz4Q4HzTwzqsJQUQ6EHly2ffLO9KPrmjt7gscHc3mQLz5mVu8lwcHZL3tnUcRHyXZHhdqi6bfAF7zkg6OVh6KhG0K5go9Db+TQbj212C934Yi0re09gbwlXeO2ynGwzcPNjScY4qIHIsN9W3D3PYDCZyXGoD1EucAqOoebPj0cGB4SPmoqOrPmIckRP4/+N7vVxHyKz1OpBxlgohUEZETsEWu+ZhjwpUhxX7wzud68wO+uo2wnkykB7nvl3GHCPm+dk8XkdoB7dbB5pzqhbG3i4iMjhAAdKh3Dhy2exV7+PURkcdEpEFoJRFpIiKh0QVKsj0iInK6iHQNk74PfqeFWIYW/44tbJ0DjA3n+BHC9d55iogcE+b6WSLSX0S6x3BtHzO8c0zOFqGo6sfYZ6sO8LCI5ATY0xy4z3v5UMhcIl693zEh6oa56AeuC3sf++z5vBWDREpEWonIOSISbq403GclEN/7nREhv9IjIZ6rDkfCiMgKbH3RO9hiSoDq2AR6V/xi8Crwp5BeFCLSFvtFWRfr9XyOzQ/08V4vwtZRnamqkwPqNcEWStbEv2iyAHhdVV/3fll/g62XWY9Nlgs2z7Qbm4c5C7hJVSd5bZ6IOSNs92xajTkTdMGGjbZia3qKFmB6i3nfAg7y8r/x6lXHPAc7AutUtUlAnRxsDqsJJnILsWHQT1X1qYg32+q+is2XrcEWLm/Gho96Y0NnHwMDvN4AXs9nBvChqvb10lpia8HAFgMXc7f3eFVVXw249kTgTmyOajH2v9nmvY8u2P96gqo+Fu09BLTXBbvPRbaF5E/CFssW/Y/ClMn33l8LbMjwY/yLeWth4jI43FCdiLwGnOC9vERVHwzI64z9L8HmjhoGCrmIHIItMN6N/R+WYx2AjkAn7P95ktfDDbxmA+x78gvQOoYfB5WTdC3QckfFOygeXqcQe1ivxn6N3gocWEIbbbAIFKuxqALLsF/6dYHJXrvjw9Trhz2gNnvXDVrci617+gfm4bXLa/8JbAhoUpjyTbCo7W9jD53tXtvzgbuBVhHsrw5ciA0/bcIeXD9jvZS7gJ5h6hwMvIG5XxcQ4+JeTIzuw1zRf/He1xpseOosICekfF9CFvNiERE0hmNSBLufxEIy7fD+14uxocZzgAZxfn5me/+71mHyiv2PIrTREBPPRd7nZyv2Y+dCoFqUepcEvNcOIXmCibdiSwxC69bB4g6+CizBxHoLtubrH0DHCNe8yGvz2nR/dzP5cD0ph8OREYjIGOwHys2qekO67Uk1IjIXaI9Fo3COExFwc1IOhyNTeAHrFV6cxKgcGYmIDMGGwO90AhUd15NyOBwZg4gcgQ373amq16TbnlTgrRP8ChuaPEDNdd0RASdSDofD4chY3HCfw+FwODIWJ1IOh8PhyFicSDkcDocjY3Ei5XA4HI6MxYmUw+FwODIWJ1IOh8PhyFj+H9p1NptDknicAAAAAElFTkSuQmCC\n",
"text/plain": [
"<Figure size 432x216 with 1 Axes>"
]
},
"metadata": {
"needs_background": "light"
},
"output_type": "display_data"
}
],
"source": [
"fig = plt.figure(figsize=(6,3))\n",
"\n",
"for s in yseries:\n",
" plt.plot(x, df[s],color=colors[s],label=serieslabels[s],linewidth=mylinewidth,marker=\"o\")\n",
"\n",
"#plt.xticks(x)\n",
"plt.yscale(\"log\")\n",
"\n",
"# axes\n",
"plt.xlabel('Dataset size (rows)', fontsize=labelfontsize)\n",
"plt.xticks(fontsize = ticfontsize)\n",
"plt.tick_params(width=ticwidth,length=ticlength,which='both')\n",
"\n",
"plt.ylabel('Runtime (sec)', fontsize=labelfontsize)\n",
"plt.yticks(fontsize = ticfontsize)\n",
"\n",
"# grid and axis lines\n",
"plt.grid(visible=True, linewidth=2, color=\"black\",which=\"major\", axis=\"y\")\n",
"\n",
"for axis in ['top','bottom','left','right']:\n",
" plt.axes().spines[axis].set_linewidth(ticwidth)\n",
"\n",
"plt.tight_layout()\n",
"\n",
"# legend\n",
"plt.legend(fontsize=labelfontsize,handlelength=1.5,frameon=False)\n",
"# save\n",
"plt.savefig('../graphics/scalability-read.pdf')\n",
"plt\n"
]
},
{
"cell_type": "code",
"execution_count": 14,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": [
"def gantt(infile,outfile):\n",
" import matplotlib.pyplot as plt\n",
" import numpy as np\n",
" import pandas as pd\n",
"\n",
" dfp = pd.read_csv(infile)\n",
" fig = plt.figure(figsize=(6,3))\n",
" x = dfp[\"cellid\"]\n",
"\n",
" plt.bar(x, dfp[\"start\"],color=\"white\")\n",
" plt.bar(x, dfp[\"end\"], bottom=dfp[\"start\"],color=\"blue\",zorder=3)\n",
"\n",
" # axes\n",
" plt.xlabel('Cell Position', fontsize=labelfontsize)\n",
" plt.xticks(fontsize = ticfontsize,ticks=[1,2,3,4,5,6,7,8,9,10,11])\n",
" plt.tick_params(width=ticwidth,length=ticlength,which='both')\n",
"\n",
" plt.ylabel('Runtime (sec)', fontsize=labelfontsize)\n",
" plt.yticks(fontsize = ticfontsize)\n",
"\n",
" # grid and axis lines\n",
" plt.grid(visible=True, linewidth=2, color=\"black\",which=\"major\", axis=\"y\")\n",
"\n",
" for axis in ['top','bottom','left','right']:\n",
" plt.axes().spines[axis].set_linewidth(ticwidth)\n",
"\n",
" plt.tight_layout()\n",
"\n",
" # legend\n",
" plt.legend(fontsize=labelfontsize,handlelength=1.5,frameon=False)\n",
" # save\n",
" plt.savefig(outfile)\n",
" plt"
]
},
{
"cell_type": "code",
"execution_count": 15,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "KeyError",
"evalue": "'cellid'",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2894\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2895\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m<ipython-input-15-321c7c9e2c3d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgantt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./gantt_parallel.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"../graphics/gantt_parallel.pdf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-14-8019dd655d18>\u001b[0m in \u001b[0;36mgantt\u001b[0;34m(infile, outfile)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cellid\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdfp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"start\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"white\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2904\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2905\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2906\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2907\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2908\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2895\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2897\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2899\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'"
]
},
{
"data": {
"text/plain": [
"<Figure size 432x216 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "KeyError",
"evalue": "'cellid'",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2894\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2895\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m<ipython-input-15-321c7c9e2c3d>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgantt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./gantt_parallel.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"../graphics/gantt_parallel.pdf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-14-8019dd655d18>\u001b[0m in \u001b[0;36mgantt\u001b[0;34m(infile, outfile)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cellid\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdfp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"start\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"white\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2904\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2905\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2906\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2907\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2908\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2895\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2897\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2899\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'"
]
}
],
"source": [
"plt = gantt(\"./gantt_parallel.csv\", \"../graphics/gantt_parallel.pdf\")\n",
"plt"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [
{
"ename": "KeyError",
"evalue": "'cellid'",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2894\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2895\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m<ipython-input-8-0b176ee21aac>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgantt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./gantt_serial.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"../graphics/gantt_serial.pdf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-6-8019dd655d18>\u001b[0m in \u001b[0;36mgantt\u001b[0;34m(infile, outfile)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cellid\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdfp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"start\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"white\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2904\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2905\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2906\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2907\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2908\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2895\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2897\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2899\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'"
]
},
{
"data": {
"text/plain": [
"<Figure size 432x216 with 0 Axes>"
]
},
"metadata": {},
"output_type": "display_data"
},
{
"ename": "KeyError",
"evalue": "'cellid'",
"output_type": "error",
"traceback": [
"\u001b[0;31m\u001b[0m",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2894\u001b[0m \u001b[0;32mtry\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2895\u001b[0;31m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/index.pyx\u001b[0m in \u001b[0;36mpandas._libs.index.IndexEngine.get_loc\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;32mpandas/_libs/hashtable_class_helper.pxi\u001b[0m in \u001b[0;36mpandas._libs.hashtable.PyObjectHashTable.get_item\u001b[0;34m()\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'",
"\nThe above exception was the direct cause of the following exception:\n",
"\u001b[0;31mKeyError\u001b[0mTraceback (most recent call last)",
"\u001b[0;32m<ipython-input-8-0b176ee21aac>\u001b[0m in \u001b[0;36m<module>\u001b[0;34m\u001b[0m\n\u001b[0;32m----> 1\u001b[0;31m \u001b[0mplt\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mgantt\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;34m\"./gantt_serial.csv\"\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0;34m\"../graphics/gantt_serial.pdf\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m<ipython-input-6-8019dd655d18>\u001b[0m in \u001b[0;36mgantt\u001b[0;34m(infile, outfile)\u001b[0m\n\u001b[1;32m 6\u001b[0m \u001b[0mdfp\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mpd\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mread_csv\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0minfile\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 7\u001b[0m \u001b[0mfig\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mfigure\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mfigsize\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0;36m6\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0;36m3\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m----> 8\u001b[0;31m \u001b[0mx\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mdf\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"cellid\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 9\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 10\u001b[0m \u001b[0mplt\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mbar\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mx\u001b[0m\u001b[0;34m,\u001b[0m \u001b[0mdfp\u001b[0m\u001b[0;34m[\u001b[0m\u001b[0;34m\"start\"\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m,\u001b[0m\u001b[0mcolor\u001b[0m\u001b[0;34m=\u001b[0m\u001b[0;34m\"white\"\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/frame.py\u001b[0m in \u001b[0;36m__getitem__\u001b[0;34m(self, key)\u001b[0m\n\u001b[1;32m 2904\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mnlevels\u001b[0m \u001b[0;34m>\u001b[0m \u001b[0;36m1\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2905\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_getitem_multilevel\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2906\u001b[0;31m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mcolumns\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2907\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mis_integer\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2908\u001b[0m \u001b[0mindexer\u001b[0m \u001b[0;34m=\u001b[0m \u001b[0;34m[\u001b[0m\u001b[0mindexer\u001b[0m\u001b[0;34m]\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;32m~/.pyenv/versions/3.9.0/lib/python3.9/site-packages/pandas/core/indexes/base.py\u001b[0m in \u001b[0;36mget_loc\u001b[0;34m(self, key, method, tolerance)\u001b[0m\n\u001b[1;32m 2895\u001b[0m \u001b[0;32mreturn\u001b[0m \u001b[0mself\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0m_engine\u001b[0m\u001b[0;34m.\u001b[0m\u001b[0mget_loc\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mcasted_key\u001b[0m\u001b[0;34m)\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2896\u001b[0m \u001b[0;32mexcept\u001b[0m \u001b[0mKeyError\u001b[0m \u001b[0;32mas\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0;32m-> 2897\u001b[0;31m \u001b[0;32mraise\u001b[0m \u001b[0mKeyError\u001b[0m\u001b[0;34m(\u001b[0m\u001b[0mkey\u001b[0m\u001b[0;34m)\u001b[0m \u001b[0;32mfrom\u001b[0m \u001b[0merr\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n\u001b[0m\u001b[1;32m 2898\u001b[0m \u001b[0;34m\u001b[0m\u001b[0m\n\u001b[1;32m 2899\u001b[0m \u001b[0;32mif\u001b[0m \u001b[0mtolerance\u001b[0m \u001b[0;32mis\u001b[0m \u001b[0;32mnot\u001b[0m \u001b[0;32mNone\u001b[0m\u001b[0;34m:\u001b[0m\u001b[0;34m\u001b[0m\u001b[0;34m\u001b[0m\u001b[0m\n",
"\u001b[0;31mKeyError\u001b[0m: 'cellid'"
]
}
],
"source": [
"plt = gantt(\"./gantt_serial.csv\", \"../graphics/gantt_serial.pdf\")\n",
"plt"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false
},
"outputs": [],
"source": []
}
],
"metadata": {
"kernelspec": {
"argv": [
"python",
"-m",
"ipykernel_launcher",
"-f",
"{connection_file}"
],
"display_name": "Python 3",
"env": null,
"interrupt_mode": "signal",
"language": "python",
"metadata": null,
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.9.0"
},
"name": "plots.ipynb"
},
"nbformat": 4,
"nbformat_minor": 4
}