Skip to content

Instantly share code, notes, and snippets.

@asford
Created April 8, 2013 00:04
Show Gist options
  • Save asford/5333207 to your computer and use it in GitHub Desktop.
Save asford/5333207 to your computer and use it in GitHub Desktop.
GPFS and SATA read buffer profiling for numpy pull request #2942.
Display the source blob
Display the rendered blob
Raw
{
"metadata": {
"name": "2942_perf_test"
},
"nbformat": 3,
"nbformat_minor": 0,
"worksheets": [
{
"cells": [
{
"cell_type": "code",
"collapsed": false,
"input": [
"import numpy\n",
"from hurry.filesize import size\n",
"from os import path"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 2
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def setup_file(target_dir):\n",
" tmp = path.join(target_dir, 'test.npz')\n",
" print \"Generating: \" + tmp\n",
" L = (1 << 28) + 1e5\n",
" a = numpy.random.randint(100, size=L)\\\n",
"\n",
" print \"Size: %s\" % size(a.size * a.itemsize)\n",
" print \"Saving\"\n",
" numpy.savez(tmp, a=a)\n",
" \n",
" return tmp"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 3
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"def test_read(target_file):\n",
" import numpy.random\n",
" import timeit\n",
"\n",
" tmp = \"test.npz\"\n",
"\n",
" times = {}\n",
"\n",
" for i in xrange(16, 29):\n",
" print \"Test: %i\" % i \n",
" def setup():\n",
" numpy.lib.format._read_array_max_buffer_size = 2 ** i\n",
" def run():\n",
" a = numpy.load(tmp)[\"a\"]\n",
"\n",
" times[i] = timeit.repeat(\n",
" stmt=run,\n",
" setup=setup,\n",
" repeat=1,\n",
" number=3)\n",
"\n",
" return times"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": 4
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"gpfs_file = setup_file(\"/work/fordas/workspace/\")\n",
"gpfs_times = test_read(gpfs_file)"
],
"language": "python",
"metadata": {},
"outputs": []
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"local_file = setup_file(\"/scratch/USERS/fordas/\")\n",
"local_times = test_read(local_file)"
],
"language": "python",
"metadata": {},
"outputs": [],
"prompt_number": "*"
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i, t in gpfs_times.items():\n",
" print i, t"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"16 [64.30621218681335]\n",
"17 [56.81705093383789]\n",
"18 [57.01973605155945]\n",
"19 [57.829936027526855]\n",
"20 [56.48090195655823]\n",
"21 [56.43113899230957]\n",
"22 [56.43984889984131]\n",
"23 [56.48336386680603]\n",
"24 [57.21548819541931]\n",
"25 [59.88624095916748]\n",
"26 [65.78676080703735]\n",
"27 [70.29408693313599]\n",
"28 [71.62285780906677]\n"
]
}
],
"prompt_number": 8
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"for i, t in local_times.items():\n",
" print i, t"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "stream",
"stream": "stdout",
"text": [
"16 [57.13569498062134]\n",
"17 [56.87626791000366]\n",
"18 [56.513845920562744]\n",
"19 [56.751492977142334]\n",
"20 [56.44809579849243]\n",
"21 [56.65828800201416]\n",
"22 [56.16835880279541]\n",
"23 [56.047404050827026]\n",
"24 [57.24323010444641]\n",
"25 [59.49712085723877]\n",
"26 [65.53651595115662]\n",
"27 [69.80008888244629]\n",
"28 [72.30360698699951]\n"
]
}
],
"prompt_number": 9
},
{
"cell_type": "code",
"collapsed": false,
"input": [
"plot([i for i, t in local_times.items()], [t for i, t in local_times.items()])\n",
"plot([i for i, t in gpfs_times.items()], [t for i, t in gpfs_times.items()])\n",
"ylim(0, 100)\n",
"xlabel(\"log2(read buffer size)\")\n",
"ylabel(\"Seconds per 3x2gb read.\")"
],
"language": "python",
"metadata": {},
"outputs": [
{
"output_type": "pyout",
"prompt_number": 16,
"text": [
"<matplotlib.text.Text at 0x2aaaac7b8950>"
]
},
{
"output_type": "display_data",
"png": "iVBORw0KGgoAAAANSUhEUgAAAYYAAAEMCAYAAADAqxFbAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XtcVHX+P/DXGQZExYBQUQcUTUnuF8ULKxdvaJi5pYaa\nueZlbcvsolbbtom5bfbdX2u6XXbNMsvINNe1glBTMfGCWibeyEuAzgiI3FSuc/n8/kAmjoLjDMMM\n4OvZYx5z5szt/RH6vPicy+dIQggBIiKiGxT2LoCIiFoWBgMREckwGIiISIbBQEREMgwGIiKSYTAQ\nEZFMswXDrFmz4Onpid69exvXFRcXY/To0QgODkZcXBxKS0uNzy1YsAD+/v4IDw/H0aNHm6ssIiIy\nodmC4YknnkBqaqps3ZIlSzBq1ChkZmZixIgRWLJkCQBg8+bNOHv2LE6dOoX3338fM2fObK6yiIjI\nhGYLhqioKLi7u8vWpaSkYNq0aQCAqVOnIjk5GQCQnJxsXD9kyBBcvXoVGo2muUojIqLbsOk+BrVa\nDZVKBQBQqVRQq9UAAI1GY1wPAF5eXsbniIjItpT2LsAckiTZuwQiolbJnNmPbDpiqD8S0Gg08PLy\numX9zc/dTAjRZm9Lliyxew1sH9t3N7avLbdNCPOnw7NpMMTHxyMpKQkAkJSUhPj4eOP6DRs2AAAO\nHDiATp06yTYtERGR7TTbpqTJkydj3759uHLlCry9vbFw4UIsXboUCQkJSEpKQrdu3bBx40YAwMSJ\nE7F79274+/vD2dkZa9euba6yiIjIhGYLhk2bNjW4fseOHQ2uf/fdd5urlFYjNjbW3iU0K7avdWvL\n7WvLbbOEJCzZAGUnkiRZtL2MiOhuZm7fySkxiIhIhsFAREQyDAYiIpJhMBARkQyDgYiIZBgMREQk\nw2AgIiIZBgMREckwGIiISIbBQEREMgwGIiKSYTAQEZEMg4GIiGQYDEREJMNgICIiGQYDERHJMBiI\niEiGwUBERDIMBiIikmEwEBGRDIOBiIhkGAxERCTDYCAiIhkGAxERyTAYiIhIhsFAREQyDAYiIpJh\nMBARkQyDgYiIZBgMREQkw2AgIiIZBgMREckwGIiISIbBQEREMgwGIiKSsUswvPjii+jXrx/69++P\nhx9+GFevXkV2djaGDh2KwMBATJkyBVqt1h6lERHd9WweDEePHsVXX32FkydPIisrC05OTli7di0W\nLFiA5557DidOnICbmxveffddW5dGRESwQzB0794dSqUS5eXl0Ol0qKioQN++fbFnzx5MmjQJADB1\n6lQkJyfbujQiIgKgtPUXduvWDS+++CJ69uyJ9u3bY+zYsQgPD4erqyscHBwAACqVCmq1usH3JyYm\nGpdjY2MRGxtrg6qJiFqPtLQ0pKWlWfx+SQghrFeOaefPn0dcXBwOHjwINzc3TJgwAVOmTMFf/vIX\nXLx4EQBw7tw5PPjgg8jKypIXK0mwcblERK2euX2nzUcMhw4dQkREBLp06QIAeOihh/DDDz+grKwM\ner0eDg4O0Gg08PLysnVpREQEO+xj6Nu3L44cOYLy8nIIIbBr1y70798fMTEx2LRpEwAgKSkJ8fHx\nti6NiIhgh01JQO1+gvXr18PBwQFhYWH45JNPkJeXh2nTpuHatWsICAjA+vXr4ejoKC+Wm5KIiMxm\nbt9pl2CwFIOBiMh85vadPPOZiIhkLAqG//znP9aug4iIWgiOGIiISIb7GIiI2jirncewdOnSRj9U\nkiS89tprFpZIREQtWaObknr16gUfHx9oNBps27YN7u7ucHNzw44dO5Cbm2vLGomIyIZMbkoaOnQo\n9u7dC6WydnCh0+kQGRmJQ4cO2aTA+rgpiYjIfFY/XLWoqEh2bQStVouSkhLLqiMiohbP5FxJCxcu\nRHh4OMaNGwchBFJTU7Fo0SJb1EZERHZwR0clXbx4EQcOHIBCocCQIUPsNsEdNyUREZmvWabEKCws\nxJkzZ6DT6SBJEgAgOjra8iotxGAgIjKPXg8olVaednvVqlVISkrCuXPnEBsbix07diA6OtouwUBE\nRI3T64GsLODIEeDHH2tvx46Z/zkmRwz9+/dHZmYmBg0ahJ9//hkXLlzA7NmzsWPHDktrtxhHDERE\ntepCoC4AjhwBfj4m0M2nGP0GqqHqr4F7Tw0cPTRYPnapdUcMLi4ucHJygsFggE6nQ8+ePXHp0qUm\nNYiIiO6cXg8cP1WDXYfzcPCkBpnZGmQXadChmxr3eGng0FmDqoc0MDxwCSWO7aG5RwV0UgEuKqic\nVGZ/n8lgcHd3R1lZGR588EE8/PDD8PDwgLe3t0WNIyIiOSEErlZfheaaBpqrGlws0+DnX9U4eaG2\n879cpUGFgwbCuRjtDZ7o4qZCr5EqxKhUuK+LF1SdwqC6RwVVJxVU96jQwbHDLd+xDMvMqsmsuZK2\nb9+O8vJyPPDAA3B2djbri6yBm5KIqDW7Vn0NW7K2YGf2Tqivqo1BoNcLdNB5wVCqQnm+Cp2ECr07\neyGwpwqD/VUYPkAF3x6ecFA4WPS9zXJU0pYtW3DhwgU8++yzuHDhAjQaDYYOHWpRgU3BYCCi1kar\n12LHrzuwPnM9Us6moH/7aLhoHkL+L72QfUyFru1VGBRyDwYOkDBgABAeDri5WbcGqwfD/PnzAQA7\nd+7E6dOnUVZWhtjYWBw9erRplVqAwUBErYEQAkcuHcH64+ux4cQGdFb0gfvFx3H6q0fh69UZEyYA\ngwY1Twg0xGqzq9bZs2cPjh8/jrCwMACAq6srO2ciogZkl2Tj8+OfY33melyv0EF15XEYtu6Ds0tf\nPJQArN8L+PjYu0rTTAaDEAI6nc74uLCwUDZ3EhHR3ay4shibTm7CZ5mf4WT+L/ApT0Dxd5+gq3Yw\nxidISPgW6NfP3lWax2QwLFiwAGPGjEF+fj5eeOEFbNmyBYmJiTYojYioZarWVSP5bDI+O/YZvj+/\nC17VY1GS9hK6FI7B+MlOSPgMCAiwd5WWu+0+BoPBgJ07d6Jr167GE9pGjx6NkJAQmxVYH/cxEJG9\nGIQB6RfSsT5zPTae2Az36hBUHZoOp3MTMfURVyQkAKGhwI1Zg1oUq+98HjhwII4cOdLkwqyBwUBE\ntna68DTWH1+PdT99Dm25CxTHH4c4Pg3TxnljyhQgIqJlhkF9Vt/5PHz4cHz22WeYNGkS2rdv36Ti\niIhag/zr+dhwYgM+PrIeucWX0P7cNGh/3Iopw4Mx5VkJv/sdoDB5NZvWy+SIwcfHxzijqvFNkoRf\nf/21WQtrCEcMRNRcymvK8b+s/+Gjw+txUHMQLuoJqDo0HY8OGo5pUxwQEwM4WHZ+md01ywluLQWD\ngYis7cilI/i/Pavw7dmv0b7wd6g+PB0T/B7C4wkdMXIk4Oho7wqbjsFARGSCEAK7c3bj1W1v4pj6\nFxgOPIsHekzHzMmeGDMGaNfO3hVal9X3MRARtRUGYcDWrK14bfty5OZfBfa9hJfHTsOC/zrB1dXe\n1bUcDAYiavO0ei2Sjich8fu3UHK5IxT7/ozESb/HvO8U6NjR3tW1PCY3JQkh8OWXXyI9PR1A7SU9\nH330UZsUdzNJkjBr6ywsH7kcXTp2sUsNRNR6VGgrsOanj/D33f8PNfn94JjxMhJnjMQTT0iwwwTR\ndmP1TUnz5s1DWVkZHnvsMQgh8MUXX+D777/H6tWrm1SopVzbuSLg/QAkxiZi3oB5Fk9DS0RtV0ll\nCd499B7+mf4vKDS/Q8ejm/DWk4Mw7R9tY2dyczM5YvDz88Pp06dNrrOFutQ7cfkEnk55Gteqr+G9\n+Pcw1Nv2U4ATUcuTdy0P/zywAv8+9BGcssfDI+slLFvgh0mTWu+hptZg7ojB5CkavXv3RmFhofFx\nYWEhevXqZVl1VhLYNRBpf0jDoshFmLRpEmZtnYXL5ZftWhMR2c/54vP449dPot87Afh4XTX6bD+K\ntRM+QdZePyQk3N2hYIlGNyU98cQTAACFQgFfX1+MGDECALB7925ERkbaprrbkCQJ04Km4UHfB7F0\nz9LazUsxiXhy4JPcvER0lziWfwx/37scKVk74PjznxBU9gtef6kLRo1q+dNUtGSNbkpKS0trdPgh\nSRJiYmKavbiGvrex4dCJyycwP2U+yqrL8F78e4j0tn94EVHzSL+Qjjf2vIn92UchZTyPgZiHJS/f\ng6goe1fWMrWKE9xKSkowe/ZsnDt3DjqdDhs2bICXlxcSEhJQUFCAbt26YePGjXC76dJGphonhMCG\nExuwaMcixN0Xh7dGvYWuHbs2d3OIyAaEEEg5m4K/7XkTZ/LyoEt7EdGuf8BrrzgjIsLe1bVsVt/H\n4OPjA4VCAQ8PD3h4eEChUMDHxwdRUVE4duyYRUX+8Y9/RHx8PDIzM3H8+HH06dMHS5YswahRo5CZ\nmYkRI0ZgyZIlZn+uJEmYGjQVp58+DY/2Hgh4PwD/yvgXdAad6TcTUYukM+jwxfEvEPR+KGZ/8QpO\nrp2PUad/QfrKefhmC0OhWQgT5s2bJ7777jvj49TUVDF37lyRnp4uwsPDTb39FleuXBHdu3e/ZX2f\nPn3EhQsXhBBC5OTkiPvuu++W19xBuTInCk6I2E9iRcgHISI9N93sWonIfiq1leLfh/8tev2zj/B6\nbZhwCUsWf5hpEFlZ9q6s9TG37zS5KSksLAxHjx5tcF1gYCBOnDhhVhAdPHgQf/rTn9C/f39kZmYi\nPDwc77//Pjp37ozKykooFArodDq4uLigqqpK9l5L5koSQuDLk19i0fZFGNVnFN4a9RY8XTzN+gwi\nsg2dQYeTl08i9VwqVhxYiQ5l4bjyv5cxPXoYXnyxdVwvuSWy+gluHTt2xJo1azBlyhQIIbBp0yZ0\nvHEOuaMFZ4oYDAYcO3YMq1atQlRUFJ588kksW7bsjt9f/7KisbGxiI2Nve3rJUnClMApGNdvHF7/\n4XUEfhCIv0b/FU9FPAWlgjOCENmLEAIXr17EIc0hZGgycPBiBn7KOwo3hRc6lQxDxZZUPPZQMBZu\nB3r0sHe1rUtaWhrS0tIsfr/JEUNBQQFeffVV7N+/HwAQGRmJZcuWwd3dHWfOnEFQUJBZX3jx4kWE\nhYXhypUrAIDU1FSsWLEC58+fx65du9CzZ0/k5uZi5MiROHfunLxYK8yueqrwFOanzEdRZRHei38P\nw3oOa9LnEdGduVp9FYc1h5GhyUB69iFkqDNQozPAvXwwdLmDUZQ5CD1EBML93TBwIDBnDtCFM99Y\nRas4KiksLAzr1q1DcHAwXnrpJVRVVcFgMEClUuHll1/Gm2++iby8PKxatUperJWm3RZCYOPJjVi0\nYxFG9B6B/xv1f9y8RGRFWr0WJy6fwL7cDHyflYEjeYdwuToXHa+FQps9GIaLgxHoPggRvr0QEiwh\nOBgIDARcXOxdedtktWAoLy/HihUrkJeXh4kTJxpPcANqN+fU36RjrmPHjmH27NmoqKiAj48PPv/8\ncwghmny4qrmuVV/Dsh+WYe3Pa/Fq1Kt4etDT3LxEZCYhBHJKc7H9ZAZ2nDqEHwsyoNb9DIfrvaDL\nGYTO1YMR7DEYw/oFIjzUEcHBgLc3T0CzJasFw6OPPgpnZ2dERERg7dq1iI6OxooVKyBJUoM7pG2h\nuS7Uc7rwNOZ/Nx+F5YV4L/49RPVqnWfJVOmqUFJZgpKqEpRWlaKk8sZ91U33N16jVCjhdY8XVJ1U\n8LrHS7bcuUPnWy7pSgQA+aWl2JJxGN9nZeDnwkNQiwzotAo45A+Gt2IQQrsMxoj+AzEk1BX+/gAv\nFW9/VguG/v37IysrCwCg1WrxzDPPoKCgAElJSYiMjLRbMBw6JODoCDg51c6S2NiyUmneXyRCCGw6\ntQkLty9ErE8s/jH6H+jm0q35GtMAgzDgavVVWefdWAd/y7rKEggIuDu7w83ZDe7t3WXLbs5ucHeW\nr6vR10BzVQPNNQ3UV9VQX1Ubl8trytGjU4/asLjnRnB0+m1Z1UmF7p26c4TVhhiEAdeqr6Gksgy5\n+WXIyS/DhYIyaIrKoC6+gpMlP+KSlIEaZzU6lIWjl3IwBngOxmj/QRg50Bs9ekgcBbRQVgsGf39/\nnDp1SrZu+fLl2Lp1KwoLC2/ZMWwLkiRhwAABrRbQaoGaGjS6rNf/FhY3h8ftgkXhfB2/ei/DBY+P\n0fvaY3BycILkoIOk1ELhoKtddtABDjpICh2g0EEotLX3kvxmgA4GaGGADnroYBC193qhg86gg1av\nhc6gM95q9DXo6NTR2Inf3MG7Obujk6Mb7nF0h4vSDS5Kd7g4uKODwg0dJHcoDM7Q6STodL/9WzR0\nq3seqL2EoZPTb7e6xwaHSpTqNSjSqlGs1eBytRqXKzXIr1Ajr1yNS9c1KCwvRJeOXRoccdQPkPaO\n1v2T0WCobUPdra5NNy87OgIdOvx2a8vTLdd16mXVZSirKmvw/sr1UuSXlOHy1TIUlZehtLIM17Rl\nqNCXoRpl0Dlch6TtAFHlCgetK5yEKzo4uMJF6Yp729+L0G6hGBs0GA8OCkAHZ/5B0JpYLRhmzJiB\nmTNnyvYtAMC6deswd+5c1NTUNK1SC5jTuLrO43bhUb+zvPm5nOtZOFC6BULvAINOCYNOCb1WWW/Z\nEXqtEvoaJXRaJXQ1tTd9jSO01cpbbjVVStRUOaKmsnZZqVDCyVEJZycl2ikd4eykhAOcaj+nkY5d\nr68dCdWFWP3lhm6mnheitq11t+pq+eOG1tU91ukAx3Y6OLrnQ3mvGgo3NSRXDUQnNYSLGvqOGmjb\nq1HT7hKUho5w1npBqe8EISQIgwQIybgsbl6uf39j2VBvGUKCJEmQIEEh1S7X3ddfFgLQ6wCdvvYe\nAByUgFIp4OBQO+OmUim/d7jxnNKh9rXG5XrP3fze2psApNqbBACSgIAAbtyM/4nf7lH3jLj1OVOv\nMQgDrtdcR1lVGUqrylBecx3ODh3hDFc4Gmo7dlHlCn25K6qvuqKytHbZtZ0r3Du4onMnV3Rzc0WP\ne13h3dUVPt1c0cfrHqi6O8DTs22H6N2oVRyVZKnm2sdga3UdcnV17a2qqvb+5lHOzR27uZvHmpPB\nUBtWjQVH3a2qSqCw4gouXVej2nAdCgcBhYOAUimgUNQuO9xYZ1y+sV6hEHBQCkiKG8s3XgPpRmd7\nmw5VQECC/B9LpwOqa4CaaqCmRjLWWvdz+K3+G8/dWF/3nvrP3fye6mpAr7sRYnoJBgEY9PIwUyh+\nCy6FJEGhqP2ddqhbr6hbf/M9blkvQYGyQheU5Lmio9IV3T06oUc3B3TrBnTvjgbv3dxazu8P2ZbV\ng+HVV19FYmIilMraoWNZWRmee+45rF27tmmVWqCtBAPdXYSovRkMteHflPu6ZSGAzp0BT8/azX9E\nt2P1M5/1ej0GDRqEtWvXoqCgAM888wzmz5/fpCKJ7iaSVHtTKGpHfUQt3R1tSvr+++8xfvx4uLu7\nY8+ePejXr58tarsFRwxEROaz+qakPXv24E9/+hOmT5+O48ePo7S0FGvWrIFKpWpyseZiMBARmc/q\nm5IWL16Mr776Cv7+/gCA//73vxgxYgR++eUXy6skIqIWy+SIQa/Xw+GmK2lfuXIFnTt3btbCGsIR\nAxGR+aw2YigvL8fHH38MlUqFRx55BOvWrcPBgwcRFBSEJ5980irFEhFRy9PoiCEhIQF6vR41NTVw\ncnLC9evXMWHCBKSkpKBPnz5YuXKlrWvliIGIyAJW2/ns6+uLM2fOQKvVwtPTE5cuXYKzszO0Wi0C\nAgJw5swZqxV9pxgMRETmM7fvVDT2RP2rtA0ZMgTOzs7Gx+05XSIRUZvVaDB07doVFRUVAICUlBTj\n+qKiIuNZ0ERE1PaYPVfS1atXUVJSgl69ejVXTY3ipiQiIvNxEj0iIpKx2j4GIiK6OzEYiIhI5rbB\noNfrERkZaataiIioBbhtMDg4OKBDhw4oKSmxVT1ERGRnJo87VSgUuP/++xEbG2s8t0GSJHz88cfN\nXhwREdmeyWB45ZVXANSGARERtX0mdz7HxsbC1dUVRUVFiImJgb+/P3r06GGL2oiIyA5Mnsfwxhtv\nICMjA1lZWThz5gwKCgrw0EMPISMjw1Y1GvE8BiIi81n9PIYvvvgC//vf/4z7Fzw9PVFdXW15hURE\n1KKZDAYhBBSK315WXl7OYCAiasNMBsOjjz6KGTNmoLi4GKtWrUJMTAxmzpxpg9KIiMge7miupK+/\n/hrbt28HAIwZMwbjx49v9sIawn0MRETms9qlPesLDw9HTU2NcZmIiNouk5uSVq9ejZEjR2L//v3Y\nv38/Ro0ahdWrV9uiNiIisgOTm5J8fX1x9OhR41FJ5eXlCA0NxdmzZ21SYH3clEREZD6rH6567733\nyi7l2b59e3Tp0sWy6oiIqMUzOWKYPXs2zp07h8mTJ0MIgc2bN8PX1xe/+93vIEkSZsyYYataOWIg\nIrKA1Xc+e3t7w9vbG0VFRQBqp8iQJAk5OTkWF0lERC0XL+1JRNTGtZpLexoMBkRERGD48OEAgOLi\nYowePRrBwcGIi4tDaWmpvUojIrqr2S0Y3n33XfTr1884nfeSJUswatQoZGZmYsSIEViyZIm9SiMi\nuqvZJRguXbqEb775BnPnzjUOb1JSUjBt2jQAwNSpU5GcnGyP0oiI7nomg+Hpp59GeXk5qqqqEBsb\nC29vb3z00UdN+tKFCxdi+fLlssn51Go1VCoVAEClUkGtVjfpO4iIyDImj0rat28fOnbsiI0bNyIg\nIACpqakYMmQIZs+ebdEXpqamwtXVFQMGDEBaWprZ709MTDQux8bGIjY21qI6iIjaqrS0NIv61zom\ng6FujqTU1FQkJCTA2dnZ4i8DgP379yM5ORm9e/dGVVUVSktLMWHCBHh5eUGtVqNnz57QaDTw8vJq\n8P31g4GIiG518x/NS5cuNev9JjcljRs3DoGBgTh69CiGDx+OwsJCODk5mV1onddffx0XL15EdnY2\nNmzYgCFDhmDr1q2Ij49HUlISACApKQnx8fEWfwcREVnujs5jKCwshIeHBxQKBSorK1FRUQEPD48m\nf3laWhpef/117Nq1C8XFxUhISEBBQQG6deuGjRs3ws3NTV4sz2MgIjKbuX1no8FQf+hx84dKkoTX\nXnutCWVahsFARGQ+q53g1qtXL/j4+ECj0WDbtm1wd3eHm5sbduzYgdzcXKsUS0RELY/JTUlDhw7F\n3r17oVTW7qfW6XSIjIzEoUOHbFJgfRwxEBGZz+pTYhQVFUGr1Rofa7ValJSUWFYdERG1eCYPV124\ncCHCw8Mxbtw4CCGQmpqKRYsW2aI2IiKygzs6KunixYs4ePAgJEnCkCFDGj3HoLlxUxIRkfmsdlRS\nfbm5ubhw4QIMBoNx0rvo6GjLq7QQg4GIyHxWv1DPwoULsWPHDoSGhsLBwcG43h7BQEREzc/kiKFv\n377IysoyHpVkTxwxEBGZz+pHJXl7e0Ov1zepKCIiaj1MDgO6d++OiIgIjBs3zjiBnr3OfCYiouZn\nMhji4uIQFxdn3OkshDAuExFR23NHRyVVVVXhxIkTkCQJgYGBaNeunS1quwX3MRARmc/qRyVt27YN\njz/+OLy9vQHUntOwfv16xMXFWV4lERG1WCZHDIGBgdi4cSP8/f0BAKdPn8bkyZNx4sQJmxRYH0cM\nRETms/pRSQaDwRgKAODn58fOmYioDTO5KSkkJATTp0/HlClTIITA5s2bERwcbIvaiIjIDkxuSqqs\nrMSKFSuwb98+AEBUVBSee+65Jl/72RLclEREZD6rz5VUVFSETp06Ga/zrNVqce3aNdx7771Nq9QC\nDAYiIvNZfR/DmDFjZB+o0+kwZswYy6ojIqIWz2Qw6HQ62XkL7du3l124h4iI2haTwaBUKnHgwAHj\n4wMHDkChMPk2IiJqpUwelbRy5Uo8/PDD6NatGwCgsLAQmzdvbvbCiIjIPu5oSoyamhpkZmYCAIKD\ng407om2NO5+JiMxn9Z3PRUVFWLx4Mf7xj39g4MCB+PXXX/HBBx80qUgiImq5TAbDY489hmHDhuH0\n6dMAai/c89577zV7YUREZB8mg+HSpUuYPHmy8bKeSqVSdolPIiJqW0wGg7OzMwoKCoyP9+/fb5ez\nnomIyDZMHpX0zjvvYNSoUcjJyUF4eDguX76MLVu22KI2IiKyAx6VRETUxlntqKSMjAzk5+cDAJyc\nnHD06FH89a9/xdNPP21cT0REbU+jwTBv3jx07NgRALBz50689tprmDNnDjw9PTFnzhybFUhERLZ1\n230MnTp1AgBs3rwZTz31FCZOnIiJEyfCz8/PJsUREZHtNTpiKC8vR3V1NQBg9+7diImJMT6nVJrc\nZ01ERK1Uoz38lClTMHjwYHh4eMDR0RHDhg0DAGRnZ8PFxcVmBRIRkW3d9qik3bt348qVKxgzZgzu\nueceAMC5c+dw/fp1hIaG2qzIOjwqiYjIfFa/gltLwmAgIjKf1SfRs7b8/HzExsYiKCgIvr6+SExM\nBAAUFxdj9OjRCA4ORlxcHEpLS21dGhERwQ4jhitXriAvLw9BQUGoqKhAeHg41qxZgy+//BJeXl54\n6aWXsHz5cuTl5WHlypXyYjliICIyW4sfMXTu3BlBQUEAgA4dOiAwMBB5eXlISUnBtGnTAABTp05F\ncnKyrUsjIiLcwVxJzSknJwcHDx7E6tWroVaroVKpAAAqlQpqtbrB99RtegKA2NhYxMbG2qBSIqLW\nIy0tDWlpaRa/3247nysqKhATE4M///nPeOSRR9CuXTtUVlZCoVBAp9PBxcUFVVVV8mK5KYmIyGwt\nflMSAOj1eiQkJGDq1Kl45JFHAABeXl7GUYJGo4GXl5c9SiMiuuvZJRjmzp2L3r1744UXXjCui4+P\nR1JSEgAgKSkJ8fHx9iiNiOiuZ/NNSfv27UNUVBSCg4MhSRIAYNmyZYiMjERCQgIKCgrQrVs3bNy4\nEW5ubvJiuSmJiMhsPMGNiIhkWsU+BiIiarkYDEREJMNgICIiGQYDERHJMBiIiEiGwUBERDIMBiIi\nkmEwEBFHIEmUAAANl0lEQVSRDIOBiIhkGAxERCTDYCAiIhkGAxERyTAYiIhIhsFAREQyDAYiIpJh\nMBARkQyDgYiIZBgMREQkw2AgIiIZBgMREckwGIiISIbBQEREMgwGIiKSYTAQEZEMg4GIiGQYDERE\nJMNgICIiGQYDERHJMBiIiEiGwUBERDIMBiIikmEwEBGRDIOBiIhkGAxERCTDYCAiIpkWFQypqakI\nDAyEn58f3nrrLXuXY3NpaWn2LqFZsX2tW1tuX1tumyVaTDBUV1dj7ty5SElJQWZmJpKSknD06FF7\nl2VTbf2Xk+1r3dpy+9py2yzRYoIhIyMD/fr1Q8+ePeHo6IhHHnkEycnJ9i6LiOiu02KCQa1WQ6VS\nGR97eXlBrVbbsSIioruTJIQQ9i4CAL744gukpKTgs88+AwB89NFHOHz4MP79738bXyNJkr3KIyJq\n1czp6pXNWIdZvLy8oNFojI/VajW8vb1lr2khGUZE1Ka1mE1JEREROHPmDHJzc1FTU4P//ve/eOCB\nB+xdFhHRXafFjBicnZ3x4YcfYty4cdDr9ZgxYwbCw8PtXRYR0V2nxYwYAOCBBx7AiRMncPr0aZw9\nexaenp7o3bu37DUrV65EUFAQgoKCkJiYaJ9CrWDWrFm3tG/nzp0ICgpCYGAggoODW+0hdPn5+YiN\njUVQUBB8fX2NP6fi4mKMHj0awcHBiIuLQ2lpqX0LtVBj7Xv55ZcREBCAgIAAxMXFIT8/376FWqix\n9tVZuXIlFAoFLly4YJ8Cm+h27Wvt/UtjbTO7bxEt1A8//CB++ukn4ePjY1z37bffihEjRoiamhoh\nhBBFRUX2Kq/JGmpfcHCwSE1NFUIIkZKSIkJDQ+1VXpMUFhaKzMxMIYQQ5eXl4v777xd79+4V8+fP\nF8uXLxdCCPHmm2+KBQsW2LNMizXWvrS0NKHX64UQQrz66qti9uzZ9izTYo21Twgh1Gq1GDt2rPDx\n8RG5ubn2LNNijbWvLfQvjbUtJCTErL6lRY0Y6ouKioK7u7ts3YcffohFixbB0dERAHDvvffaozSr\naKh9ffv2RVlZGQCgtLQU/fr1s0dpTda5c2cEBQUBADp06IDAwEDk5eUhJSUF06ZNAwBMnTq11Z6n\n0lD78vPzERMTA4Wi9n+pQYMGIS8vz55lWqyx9gHAwoULsXz5cnuW12SN/X6uWbOm1fcvjbXN7L6l\n2SOsCbKzs2V/Uffv318sXrxYhISEiCFDhoh9+/bZsbqmu7l9ubm5wtvbW3h7ewuVSiUuXrxox+qs\nIzs7W6hUKlFUVCScnJyMf1FrtVrRrl07O1fXdHXtKy4ulq2Pj48XH330kZ2qsp767UtOTjaO8lrz\niKG++r+fbbF/qfvZmdu3tKpg8PX1FXPmzBFCCJGeni569OghDAaDvcprspvbN3LkSPH5558LIYT4\n9NNPxahRo+xVmlWUl5eLgQMHis2bNwshRJsLhvLychEREWFsX50333xT/P73v7dTVdZT/+dXUVEh\nBg8eLEpLS4UQtcGQk5Nj5wqb5ubfz7bUv9zcNnP7llYVDCNHjhTffvut8bGnp6fIy8uzR2lWcXP7\n2rVrJ6qqqoQQQlRUVAhnZ2d7ldZkOp1OPPjgg+Ltt982ruvTp4/xr8ycnBxx33332au8JmuofUII\nkZSUJIYOHSoqKyvtVJl13Ny+U6dOia5duwofHx/h4+MjlEql8Pb2FmfPnrVzpZZp6OfXVvqXhtpm\nbt/SYvcxNGTcuHHYvXs3AOD48eMwGAzo2rWrnauynvvuu8/Yvp07d6Jv3752rshyc+fORe/evfHC\nCy8Y18XHxyMpKQkAkJSUhPj4eHuV12QNtW/Hjh3429/+hq1bt8LZ2dmO1TXdze3z8/NDQUEBsrOz\nkZ2dDS8vL6Snp7fa39GGfn5tpX9pqG1m9y3NGl1NMGnSJNG9e3fh6OgovLy8xIoVK0RNTY2YPn26\n8Pf3F/7+/mLbtm32LtNiDbVv3759IiQkRPj5+YnQ0FCRkZFh7zItkp6eLiRJEiEhISI0NFSEhoaK\nb775RhQVFYlRo0aJoKAgMXr0aFFSUmLvUi3SUPu+/vpr0a9fP+Ht7W1cN3fuXHuXapHG2ldfa97H\n0NjvZ1voXxr72Znbt7SYuZKIiKhlaFWbkoiIqPkxGIiISIbBQEREMgwGIiKSYTCQ3fj4+Fj0Pq1W\ni/j4eAQEBMDX1xdPPfUU9Hq98fl169bhnXfesVKVv8nJycHw4cNvWf/JJ59g6dKlZn3Wr7/+isGD\nB2PAgAHIy8vD6tWrERwcjD/+8Y/WKhd5eXmYO3eu2e8rKCjA2LFjrVYHtT4MBrKbplyR75VXXsHJ\nkydx6tQpZGVl4YsvvjA+t2LFCsyZM+eW9xgMBou/73YsacemTZswa9Ys/Pjjj+jevTveeecdHDly\nBKtXr76j999JW7p3744PP/zQ7No8PT3h4eGBAwcOmP1eahsYDGR3BoMBzzzzDPz8/ODn54dPP/0U\nAKDX6zFr1iz4+fkhPj4e48aNw549e+Do6Ihhw4YBAJRKJcLDw42TvGVkZMDb2xsuLi4AgJkzZ2Le\nvHkYPHgwli9fjv3792PQoEEIDg7G2LFjUVRUBKB2yuyIiAj4+/tj5syZxo73wIEDCAwMxMCBA/H+\n++832oazZ89i+PDh8PX1xZIlSwDcOsKoG1l88803eOedd/D3v/8d48aNw9y5c3H+/HkMHjwY//nP\nf3D9+nUkJCQgODgYoaGhSElJAQAkJibiD3/4A4YOHYpnn31W9v27du1CWFgYwsLCEBISgpKSEtn3\nz5kzx/h8165dsWzZMgDA0qVLERAQgMDAQLzxxhvGz3vooYeMl9mlu5BNzrogakDddCCff/65iIqK\nEgaDQRQUFIjOnTsLtVot1q9fL6ZPny6EECI/P1+4urqKPXv2yD6jpKRE+Pj4iKysLCGEEMuXLxdL\nly41Pj9z5kwxa9YsIYQQNTU1IjAwUOTn5wshhNi4caNxUri6OYCEEGLBggXiq6++EkIIERAQIE6d\nOiWEEGLx4sUiNjb2lnasXbtW9O3bV1RUVAidTiciIyPFgQMHRHZ2tuz1n3zyiUhMTBRCCJGYmCjW\nrVt3y7+FEEI8//zzYvXq1UIIIcrKykRgYKDQ6XRiyZIlYvTo0Q3O3xMfHy8OHTokhBCiurpaaLXa\nW75fiNqpSPz9/cWFCxfE1q1bxeOPPy6EEEKv14vx48eLn376SQghxPnz54W/v/8t30N3hxZzBTe6\ne6Wnp+PRRx+FJEno2rUroqOjceDAAezfvx8JCQkAajdvjBgxQvY+vV6Pxx57DM8++yzuv/9+AMCF\nCxcQEhIie92kSZMAAMeOHUNOTo5x+7ler4efnx8AIDk5Gf/85z+h0+lQUlICT09PFBYWol27dsbX\nTJ8+HYcPH76lfkmSMGHCBLRv3x4AkJCQgPT0dEyePPm27RaNnFu6fft2bNu2zThCuXbtGi5fvgxJ\nkvDwww83uOkqOjoazzzzDKZMmYLf//73De6/qaqqwuTJk/Gvf/0L3t7eeOutt7Bnzx6EhYUBAMrL\ny5GdnY2wsDD06NEDOTk5t62f2i4GA9mdJEmNdpL119/8uvnz5+O+++7Dc889d9vP79Chg/Gz+vXr\nh59++kn2/PXr1/GXv/wFR44cgYeHB959910UFRXd0gE3VuPNzwkhIEkSFAqFbKd4ZWXlbeusb8OG\nDcZ59Rtqy81eeukljB8/Ht999x1GjhyJ5OTkW+ZrevLJJzFp0iRZwC5cuBALFixosD1N2QdErRv3\nMZDdRUVFYcuWLRBC4PLly9i7dy8iIyMRGRmJTZs2AQAuX76MXbt2GTurpUuXIj8/HytXrpR9Vq9e\nvRq9QE5wcDAuX76M/fv3AwB0Oh2ysrJQXV0NR0dHuLq6orq6Gp999hkkSULnzp1RXV2NrKwsADBO\nAHgzIQS++eYbVFZWQqfT4auvvkJUVBS6dOmCnJwclJeXQ6/XY8uWLXfU2Y4ZMwYffPCB8XFmZqbJ\n9+Tm5sLf3x8LFy5EXFwcTp06Jfuu9957D9evX8eLL74o+55PP/0U5eXlAGqPRiosLARQe0RTr169\nTH4vtU0MBrKbuo4rISEBAQEB8Pf3R0xMDN5++2306NEDU6dOhYODA/z8/DBjxgwMGDAAzs7OUKvV\nWLp0KX755ReEh4cjLCzMeDRPdHQ0fvzxxwa/p127dtiyZQuef/55hISEIDQ0FLt374aHhwcmTpyI\n+++/H9HR0cZNKwCwZs0aTJw4EQMGDEB1dXWDHbskSYiIiMADDzwAf39/jBw5EoMGDYKzszOef/55\nBAUFISoq6pbrl9f/rPrLy5YtQ0VFBfz8/BAUFITFixc3+Lr6Vq1ahaCgIISHh6O4uBjjxo2T/dX/\n9ttv48SJE8Yd0KtXr8b48eMxefJkDBw4EKGhoRg/frzxKl+HDx9GTEyMiZ8gtVWcRI9atMrKSrRv\n3x6FhYUYOnQofv75Z+MRR40JDQ1Fenq6yddR4x577DHMnz8fQ4cOtXcpZAccMVCLFh0djdDQUAwb\nNgyvv/76HXX2L7zwAtasWWOD6tqmy5cvo7i4mKFwF+OIgYiIZDhiICIiGQYDERHJMBiIiEiGwUBE\nRDIMBiIikmEwEBGRzP8HQaRhB7m8fyQAAAAASUVORK5CYII=\n"
}
],
"prompt_number": 16
}
],
"metadata": {}
}
]
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment