You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@systemml.apache.org by du...@apache.org on 2016/09/01 17:17:47 UTC

incubator-systemml git commit: Updating one of the PySpark Jupyter notebook demos to the new MLContext.

Repository: incubator-systemml
Updated Branches:
  refs/heads/master 10e701de3 -> 7610a21db


Updating one of the PySpark Jupyter notebook demos to the new MLContext.


Project: http://git-wip-us.apache.org/repos/asf/incubator-systemml/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-systemml/commit/7610a21d
Tree: http://git-wip-us.apache.org/repos/asf/incubator-systemml/tree/7610a21d
Diff: http://git-wip-us.apache.org/repos/asf/incubator-systemml/diff/7610a21d

Branch: refs/heads/master
Commit: 7610a21db748e7a4a1a7b80150d9c003922cc38e
Parents: 10e701d
Author: Mike Dusenberry <mw...@us.ibm.com>
Authored: Thu Sep 1 10:17:07 2016 -0700
Committer: Mike Dusenberry <mw...@us.ibm.com>
Committed: Thu Sep 1 10:17:07 2016 -0700

----------------------------------------------------------------------
 .../SystemML-PySpark-Recommendation-Demo.ipynb  | 59 ++++++++------------
 1 file changed, 24 insertions(+), 35 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-systemml/blob/7610a21d/samples/jupyter-notebooks/SystemML-PySpark-Recommendation-Demo.ipynb
----------------------------------------------------------------------
diff --git a/samples/jupyter-notebooks/SystemML-PySpark-Recommendation-Demo.ipynb b/samples/jupyter-notebooks/SystemML-PySpark-Recommendation-Demo.ipynb
index f3450cf..b78a192 100644
--- a/samples/jupyter-notebooks/SystemML-PySpark-Recommendation-Demo.ipynb
+++ b/samples/jupyter-notebooks/SystemML-PySpark-Recommendation-Demo.ipynb
@@ -19,11 +19,9 @@
     "%autoreload 2\n",
     "%matplotlib inline\n",
     "\n",
-    "# Add SystemML PySpark API file.\n",
-    "sc.addPyFile(\"https://raw.githubusercontent.com/apache/incubator-systemml/branch-0.10/src/main/java/org/apache/sysml/api/python/SystemML.py\")\n",
-    "\n",
     "import numpy as np\n",
     "import matplotlib.pyplot as plt\n",
+    "from SystemML import MLContext, dml  # pip install SystemML\n",
     "plt.rcParams['figure.figsize'] = (10, 6)"
    ]
   },
@@ -49,15 +47,16 @@
       "                                 Dload  Upload   Total   Spent    Left  Speed\n",
       "\r",
       "  0     0    0     0    0     0      0      0 --:--:-- --:--:-- --:--:--     0\r",
-      "  2 11.2M    2  281k    0     0   709k      0  0:00:16 --:--:--  0:00:16  708k\r",
-      " 16 11.2M   16 1845k    0     0  1219k      0  0:00:09  0:00:01  0:00:08 1218k\r",
-      " 25 11.2M   25 2931k    0     0  1224k      0  0:00:09  0:00:02  0:00:07 1224k\r",
-      " 38 11.2M   38 4398k    0     0  1294k      0  0:00:08  0:00:03  0:00:05 1294k\r",
-      " 51 11.2M   51 5889k    0     0  1339k      0  0:00:08  0:00:04  0:00:04 1339k\r",
-      " 62 11.2M   62 7153k    0     0  1323k      0  0:00:08  0:00:05  0:00:03 1372k\r",
-      " 77 11.2M   77 8906k    0     0  1390k      0  0:00:08  0:00:06  0:00:02 1443k\r",
-      " 92 11.2M   92 10.3M    0     0  1433k      0  0:00:08  0:00:07  0:00:01 1532k\r",
-      "100 11.2M  100 11.2M    0     0  1443k      0  0:00:07  0:00:07 --:--:-- 1554k\n"
+      "  2 11.2M    2  334k    0     0   384k      0  0:00:29 --:--:--  0:00:29  384k\r",
+      " 10 11.2M   10 1157k    0     0   617k      0  0:00:18  0:00:01  0:00:17  617k\r",
+      " 18 11.2M   18 2127k    0     0   739k      0  0:00:15  0:00:02  0:00:13  739k\r",
+      " 28 11.2M   28 3248k    0     0   838k      0  0:00:13  0:00:03  0:00:10  838k\r",
+      " 39 11.2M   39 4544k    0     0   933k      0  0:00:12  0:00:04  0:00:08  933k\r",
+      " 51 11.2M   51 5957k    0     0  1014k      0  0:00:11  0:00:05  0:00:06 1123k\r",
+      " 65 11.2M   65 7517k    0     0  1093k      0  0:00:10  0:00:06  0:00:04 1272k\r",
+      " 79 11.2M   79 9183k    0     0  1166k      0  0:00:09  0:00:07  0:00:02 1412k\r",
+      " 94 11.2M   94 10.6M    0     0  1224k      0  0:00:09  0:00:08  0:00:01 1522k\r",
+      "100 11.2M  100 11.2M    0     0  1242k      0  0:00:09  0:00:09 --:--:-- 1585k\n"
      ]
     }
    ],
@@ -118,7 +117,6 @@
    "outputs": [],
    "source": [
     "# Create SystemML MLContext\n",
-    "from SystemML import MLContext\n",
     "ml = MLContext(sc)"
    ]
   },
@@ -133,26 +131,23 @@
     "# Define PNMF kernel in SystemML's DSL using the R-like syntax for PNMF\n",
     "pnmf = \"\"\"\n",
     "# data & args\n",
-    "X = read($X)\n",
     "X = X+1 # change product IDs to be 1-based, rather than 0-based\n",
     "V = table(X[,1], X[,2])\n",
     "size = ifdef($size, -1)\n",
     "if(size > -1) {\n",
     "    V = V[1:size,1:size]\n",
     "}\n",
-    "max_iteration = as.integer($maxiter)\n",
-    "rank = as.integer($rank)\n",
     "\n",
     "n = nrow(V)\n",
     "m = ncol(V)\n",
     "range = 0.01\n",
     "W = Rand(rows=n, cols=rank, min=0, max=range, pdf=\"uniform\")\n",
     "H = Rand(rows=rank, cols=m, min=0, max=range, pdf=\"uniform\")\n",
-    "losses = matrix(0, rows=max_iteration, cols=1)\n",
+    "losses = matrix(0, rows=max_iter, cols=1)\n",
     "\n",
     "# run PNMF\n",
     "i=1\n",
-    "while(i <= max_iteration) {\n",
+    "while(i <= max_iter) {\n",
     "  # update params\n",
     "  H = (H * (t(W) %*% (V/(W%*%H))))/t(colSums(W)) \n",
     "  W = (W * ((V/(W%*%H)) %*% t(H)))/t(rowSums(H))\n",
@@ -161,11 +156,6 @@
     "  losses[i,] = -1 * (sum(V*log(W%*%H)) - as.scalar(colSums(W)%*%rowSums(H)))\n",
     "  i = i + 1;\n",
     "}\n",
-    "\n",
-    "# write outputs\n",
-    "write(losses, $lossout)\n",
-    "write(W, $Wout)\n",
-    "write(H, $Hout)\n",
     "\"\"\""
    ]
   },
@@ -178,8 +168,8 @@
    "outputs": [],
    "source": [
     "# Run the PNMF script on SystemML with Spark\n",
-    "ml.reset()\n",
-    "outputs = ml.executeScript(pnmf, {\"X\": X_train, \"maxiter\": 100, \"rank\": 10}, [\"W\", \"H\", \"losses\"])"
+    "script = dml(pnmf).input(X=X_train, max_iter=100, rank=10).output(\"W\", \"H\", \"losses\")\n",
+    "W, H, losses = ml.execute(script).get(\"W\", \"H\", \"losses\")"
    ]
   },
   {
@@ -192,7 +182,7 @@
     {
      "data": {
       "text/plain": [
-       "<matplotlib.text.Text at 0x10aad8e50>"
+       "<matplotlib.text.Text at 0x107bded68>"
       ]
      },
      "execution_count": 7,
@@ -201,9 +191,9 @@
     },
     {
      "data": {
-      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAngAAAGJCAYAAAAZsU4bAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XvUXmV95//3N3nIAUgCgWBqwrEkbRAUooKHWh6litQK\n6YxisK1WM9afoWLrjFOxnR+ZaWepdGzROrBaTTkJpoJ1lMpEccmjRTlEUYIGJf4USQIkQBIIBEIO\n398fe99m5+Z5njyH+859er/W2uve+9qna2eTrA/Xta+9IzORJElS95jQ6gpIkiSpsQx4kiRJXcaA\nJ0mS1GUMeJIkSV3GgCdJktRlDHiSJEldxoAnSWMUEcdHxJON3laSxsuAJ6lpIuKBiNgeEU9GxMMR\ncWVEHFyuG4iIZyJiTmX7syLiF3X7PxsRM+uO+4OI2BMRx5TLV0XEjvI828rft9btc3Rl3bZy/6cq\nZa8e7fVl5i8yc3qjtx2tiLg2Iv7fZhxbUmcy4ElqpgTeVAabhcDLgL+qrHsK+G+D7FOd/wVwQa0g\nIk4Gpg6y3cczc3pmTit/b9jnoJnrKuumlfucUin7Tn3lI8J/IyV1JP/xktRsAZCZDwP/Fzi5su5T\nwAURcfww+18LvLOy/E7g6gbVK/YpKFrCPh0R/zcitgG/FRFvLlsMnyhbFP+qsv2vR8SeyvK/R8Sy\niPhO2Sp4c0QcNtpty/XviohfRsSmiLg4ItZFxG+P+iIjfisiVkXEloi4IyJOr6xbEhG/KM//s4g4\nvyyfFxHfioit5fk/N9rzSmotA56kAyIijgZ+F7i7UrwB+AzwP4bZ9Q5gWkT8Rtmi9jbgc9SFswa6\nALikbOW7A9gGvD0zZwBvBi6KiN+tbF//vccLgD8CjgIOBT442m0j4hTgk8D5wBxgFvCC0V5IRBwB\n/Bvwt8ARwKeBmyNiRkRMAz4BnFW2sL4aWF3u+j+Bf
 8vMw4C5wP8e7bkltZYBT1Kz/Z+I2Ax8G7gV\n+Gjd+o8BvxcRC4Y5Rq0V7/XAfcBDg2zzoYjYXLZUbRpHfb+UmXcBZOZzmTmQmfeVy/cC/wKcOcz+\nyzPz55n5LHADcOoYtn1LWY87M3MnRbf2WALtm4EfZeYXMnNPZn4O+DnwpnL9HuCUiJicmRsz8ydl\n+U7guIh4YflncPsYzi2phQx4kprtvMycmZnHZ+b7M3NHdWVmPkbRsvTXwxzjc8DbgT8Grhlim78t\nz3N4Zh41jvquqy5ExCsj4tayq3IrsAQ4cpj9H6nMb6domRvtti+s1iMztwNbRlD3ei8EfllX9ktg\nTmZuo2hB/FPgkYj4SkTMK7f5IDAJ+F5E3BMR7xjDuSW1kAFPUrONpOXpfwGvBV462MrMfJBisMU5\nwL82rmqDqu9G/TxF69qcsstyOc3rHq55mKJrFICIOAQ4fAzHeQg4rq7sGIqucTLza5n5emA28P8B\n/1iWb8zM92TmCykC4D9FxLFjOL+kFjHgSWq5zHyCIuT912E2ezfwusx85sDU6lcOBbZk5s6IeAWw\nuG79aMLeSLe9AVgUEadHxEEUzyjWB896B0XE5Mp0EMXzdydFxFsjYmJEvB34deCrETE7In4vIqYC\nu4Cngd0A5fYvLI/7BEVX7u5RXKekFjPgSWqm4UJJ/bpPUQSN+tefFDPFe+TuHmxdA+s2WNn7gI9F\nxBPAhymewRtqn/3VaUTbls/6/TlwI0Vr26PA48COofYBPkLRzVubvlZ2f59b1vsx4AMUr615ApgI\nfIiile9R4JXAheWxzgBWlSOJbwSWZub6/VybpDYSmeP9N3KYg0csB34P2JiZLy7LXk4xIusgigd5\nl2bm98p1F1P8X/ou4AOZ+fWyfCFwFTAFuDkz/6wsn0TxPM5LKf7xelvZlSNJXaMc8boVOCYzN7S6\nPpLaX7Nb8K4Ezq4ruxT4q8w8
 DbiEYvg+EXESxSsBFlA8Z3N5RNS6M64AlmTmfGB+RNSOuQTYnJnz\ngMvKY0tSxyvfvzc1Ig4F/g74vuFO0kg1NeBl5m08f+TXw8CMcv4wyod9KboRVmTmrsx8AFgLnB4R\ns4Fpmbmq3O4aYFE5fx57X3h6I3BWwy9Cklrj9ym6Tx+kGBhxwfCbS9JefS0454eB70TEJygeOH5V\nWT4HqL5raUNZtguoPvuxviyv7bMOIDN3l29dn5mZm5tYf0lqusx8N8UjK5I0aq0YZLEceH9mHkPx\nEPE/N/DYzX51gSRJUttrRQveGeV7l8jMGyPis2X5BuDoynZzy7Khyqv7PBQRE4HpQ7XeRUTzRpNI\nkiQ1WGaOueHqQLTg1X/Qe21EnAkQEWdRPGsH8BVgcURMKj88fiJwV2Y+AjxRvg8qgHcAX67sU/sI\n+VuBbw5Xkcx06tDpkksuaXkdnLx3vTh5/zp38t519jReTW3Bi4jrgX7giIh4kGLU7J9QjJCdBDxb\nLpOZayLiC8Aa9r4+pXaFF7Lva1JWluXLgWsjYi3FO6LqX0AqSZLUc5oa8DLz7UOsOmOI7T/K8z9E\nTmZ+HzhlkPIdFK9WkSRJUskvWagj9Pf3t7oKGiPvXWfz/nUu711va+qXLNpJRGSvXKskSepsEUG2\n+SALSZIkHUAGPEmSpC5jwJMkSeoyBjxJkqQuY8CTJEnqMgY8SZKkLmPAkyRJ6jIGPEmSpC5jwJMk\nSeoyBjxJkqQuY8CTJEnqMgY8SZKkLmPAkyRJ6jIGPEmSpC5jwJMkSeoyBjxJkqQuY8CTJEnqMgY8\nSZKkLmPAkyRJ6jIGPEmSpC7TUwFv585W10CSJKn5eirg/fSnra6BJElS8/VUwLvnnlbXQJIkqfkM\neJIkSV3GgCdJktRleirgrV7d6hpIkiQ1X08FvGefhU2bWl0LSZKk5uqpgPeSl9hNK0mSup8BT5Ik\nqcsY8CR
 JkrpMTwW8F7/YgCdJkrpfUwNeRCyPiI0RsbpStiIi7i6nX0TE3ZV1F0fE2oi4LyLeUClf\nGBGrI+L+iLisUj6pPN7aiLg9Io4Zrj4vehGsXQvPPdfoK5UkSWofzW7BuxI4u1qQmYszc2FmLgS+\nCPwrQEQsAM4HFgDnAJdHRJS7XQEsycz5wPyIqB1zCbA5M+cBlwGXDleZqVPh+OPhvvsac3GSJEnt\nqKkBLzNvA7YMs8n5wPXl/HnAiszclZkPAGuB0yNiNjAtM1eV210DLKrsc3U5fyNw1v7q5HN4kiSp\n27XsGbyIeA3wSGb+vCyaA6yrbLKhLJsDrK+Ury/L9tknM3cDWyNi5nDnNeBJkqRu18pBFhcAn2/w\nMWN/GzjQQpIkdbu+Vpw0IiYC/wFYWCneABxdWZ5blg1VXt3nofKY0zNz81DnXbZsGU8+Cd/9Ltx6\naz+vfW3/uK9FkiRpvAYGBhgYGGjY8SIzG3awQU8QcRxwU2aeUil7I/AXmfnaStlJwHXAGRRdr7cA\n8zIzI+IO4CJgFfBV4FOZuTIilgInZ+bSiFgMLMrMxUPUIzOTTJg1C+69F37t15pyyZIkSeMSEWTm\nfnsmh9Ls16RcD3yXYuTrgxHxrnLV26jrns3MNcAXgDXAzcDS3Js+LwSWA/cDazNzZVm+HDgyItYC\nfwZ8eP918jk8SZLU3Zregtcuai14AB/8ILzgBfAXf9HiSkmSJA2irVvw2pUDLSRJUjfryYBnF60k\nSepmPdlFu2MHHHYYbNkCU6a0uGKSJEl17KIdg8mT4cQTYc2aVtdEkiSp8Xoy4IHdtJIkqXv1bMBz\noIUkSepWPRvwbMGTJEndqqcD3urV0CNjTCRJUg/p2YA3ezb09cFDD7W6JpIkSY3VswEP4LjjYN26\nVtdCkiSpsXo64L3gBfDII62uhSRJUmP1dMCbPRs2bmx1LSRJkhqrpwPeC15gwJMkSd2n
 5wOeXbSS\nJKnb9HTAs4tWkiR1o54OeHbRSpKkbtTzAc8uWkmS1G16OuDZRStJkrpRTwe8adNg1y54+ulW10SS\nJKlxejrgRfgcniRJ6j49HfDAblpJktR9ej7gOdBCkiR1m54PeLbgSZKkbtPzAc9n8CRJUrcx4NlF\nK0mSukzPBzy7aCVJUrfp+YBnF60kSeo2Bjy7aCVJUpfp+YBnF60kSeo2PR/wDj0U9uyBp55qdU0k\nSZIao+cDnp8rkyRJ3abnAx7YTStJkrqLAQ9b8CRJUndpasCLiOURsTEiVteVvz8i7ouIeyPiY5Xy\niyNibbnuDZXyhRGxOiLuj4jLKuWTImJFuc/tEXHMWOrpSFpJktRNmt2CdyVwdrUgIvqBNwOnZOYp\nwP8qyxcA5wMLgHOAyyMiyt2uAJZk5nxgfkTUjrkE2JyZ84DLgEvHUkm7aCVJUjdpasDLzNuALXXF\n7wM+lpm7ym0eK8vPA1Zk5q7MfABYC5weEbOBaZm5qtzuGmBRZZ+ry/kbgbPGUk9b8CRJUjdpxTN4\n84Hfjog7IuLWiHhpWT4HWFfZbkNZNgdYXylfX5bts09m7ga2RsTM0VbIZ/AkSVI36WvROQ/PzFdE\nxMuBG4ATGnTs2P8mz2cXrSRJ6iatCHjrgH8FyMxVEbE7Io6gaLGrDpKYW5ZtAI4epJzKuociYiIw\nPTM3D3XiZcuW/Wq+v7+f/v5+wC5aSZLUWgMDAwwMDDTseJGZDTvYoCeIOA64qRxQQUT8CTAnMy+J\niPnALZl5bEScBFwHnEHR9XoLMC8zMyLuAC4CVgFfBT6VmSsjYilwcmYujYjFwKLMXDxEPXKoa922\nrWjFe/rpBl64JEnSGEUEmTmmnklocgteRFwP9ANHRMSDwCXAPwNXRsS9wA7gHQCZuSYivgCsAXYC\nSyuJ7ELgKmAKcHNmrizLlwPXRsRa4HFg0HC3P4ceWvw+9dTeeUm
 SpE7V9Ba8djFcCx7ACSfA178O\nJ554ACslSZI0iPG24Pkli5IDLSRJUrcw4JV8VYokSeoWBrySI2klSVK3MOCV7KKVJEndwoBXsotW\nkiR1CwNeyS5aSZLULQx4JbtoJUlStzDgleyilSRJ3cKAV6p10fbIe58lSVIXM+CVDj0UJkwoPlcm\nSZLUyQx4FQ60kCRJ3cCAV+FzeJIkqRsY8CocSStJkrqBAa/CLlpJktQNDHgVdtFKkqRuYMCrsItW\nkiR1AwNehV20kiSpGxjwKuyilSRJ3cCAV2EXrSRJ6gYGvAo/VyZJkrqBAa/ikEOgrw+2bWt1TSRJ\nksbOgFfH5/AkSVKnM+DVcSStJEnqdAa8Og60kCRJnc6AV8cWPEmS1OkMeHV8Bk+SJHU6A14du2gl\nSVKnM+DVsYtWkiR1OgNenaOOgk2bWl0LSZKksTPg1Zk1Cx57rNW1kCRJGjsDXp1Zs+DRR1tdC0mS\npLEz4NWZMQO2b4cdO1pdE0mSpLEx4NWJgCOPtJtWkiR1rqYGvIhYHhEbI2J1peySiFgfEXeX0xsr\n6y6OiLURcV9EvKFSvjAiVkfE/RFxWaV8UkSsKPe5PSKOaUS97aaVJEmdrNkteFcCZw9S/neZubCc\nVgJExALgfGABcA5weUREuf0VwJLMnA/Mj4jaMZcAmzNzHnAZcGkjKu1AC0mS1MmaGvAy8zZgyyCr\nYpCy84AVmbkrMx8A1gKnR8RsYFpmriq3uwZYVNnn6nL+RuCsRtTbFjxJktTJWvUM3p9GxA8j4rMR\nMaMsmwOsq2yzoSybA6yvlK8vy/bZJzN3A1sjYuZ4K3fkkQY8SZLUuVoR8C4HTsjMU4FHgE808NiD\ntQyOmi14kiSpk/Ud6BNmZjU6fQa4qZzfABxdWTe3LBuqvLrPQxExEZiemZuHOveyZct+Nd/f309/\nf/+g282aBffeu/9rkSRJaoSBgQEGBgYadr
 zIzIYdbNATRBwH3JSZp5TLszPzkXL+z4GXZ+bbI+Ik\n4DrgDIqu11uAeZmZEXEHcBGwCvgq8KnMXBkRS4GTM3NpRCwGFmXm4iHqkSO91htugH/5F7jxxrFf\ntyRJ0lhFBJk55p7JprbgRcT1QD9wREQ8CFwCvDYiTgX2AA8A7wXIzDUR8QVgDbATWFpJZBcCVwFT\ngJtrI2+B5cC1EbEWeBwYNNyNls/gSZKkTtb0Frx2MZoWvB/9CM4/H9asaXKlJEmSBjHeFjy/ZDEI\nB1lIkqROZgveIHbtgilTiu/RTpzY5IpJkiTVsQWvCfr6YMYM2DLYK5olSZLanAFvCA60kCRJncqA\nNwSfw5MkSZ3KgDcEA54kSepUBrwhzJoFjz3W6lpIkiSNngFvCD6DJ0mSOpUBbwh20UqSpE5lwBuC\nAU+SJHUqA94QDHiSJKlTGfCG4CALSZLUqQx4Q3CQhSRJ6lR+i3YIzzwDhx0Gzz4LMeYvwUmSJI2e\n36JtkqlT4aCDYNu2VtdEkiRpdAx4w/A5PEmS1IkMeMNwJK0kSepEBrxhONBCkiR1IgPeMGzBkyRJ\nnciANwwDniRJ6kQGvGE4yEKSJHUiA94wfAZPkiR1IgPeMOyilSRJnciANwwDniRJ6kQGvGEY8CRJ\nUicy4A3DQRaSJKkTGfCGMX06PPss7NjR6ppIkiSNnAFvGBGOpJUkSZ3HgLcfPocnSZI6zYgCXkT8\nekRMLuf7I+KiiDisuVVrDz6HJ0mSOs1IW/C+COyOiBOBfwKOBq5vWq3aiC14kiSp04w04O3JzF3A\n7wP/kJkfAn6tedVqHz6DJ0mSOs1IA97OiLgAeCfwb2XZQc2pUnuxBU+SJHWakQa8dwGvBP5nZv4i\nIo4Hrt3fThGxPCI2RsTqQdb954jYExEzK2UXR8TaiLgvIt5QKV8YEasj4v6IuKxSPikiVpT73B4R\nx4zwekbMgCdJkjrNi
 AJeZq7JzIsy8/MRcTgwLTM/PoJdrwTOri+MiLnA64FfVsoWAOcDC4BzgMsj\nIsrVVwBLMnM+MD8iasdcAmzOzHnAZcClI7me0XCQhSRJ6jQjHUU7EBHTy9a2u4HPRMTf7W+/zLwN\n2DLIqr8HPlRXdh6wIjN3ZeYDwFrg9IiYTREoV5XbXQMsquxzdTl/I3DWSK5nNHwGT5IkdZqRdtHO\nyMwngf8AXJOZZwC/M5YTRsS5wLrMvLdu1RxgXWV5Q1k2B1hfKV9flu2zT2buBrZWu3wbwS5aSZLU\nafpGul1E/BpFF+pfjvVkETEV+AhF92wzxHArly1b9qv5/v5++vv793tAA54kSWq2gYEBBgYGGna8\nyMz9bxTxVuC/Ad/JzPdFxAnA32bmfxzBvscCN2XmiyPiZOAbwHaKMDaXoqXudODdAJn5sXK/lcAl\nFM/p3ZqZC8ryxcCZZT1WApdk5p0RMRF4ODOPGqIeOZJrrbd7N0yeXHyPduLEUe8uSZI0ahFBZg7b\ncDWckQ6yuCEzX5yZ7yuXfz6ScFerYzmRmT/KzNmZeUJmHk/R3XpaZm4CvgK8rRwZezxwInBXZj4C\nPBERp5eDLt4BfLk89lcoXt0C8FbgmyOs04hNnAiHHQabNzf6yJIkSc0x0kEWcyPiSxGxqZy+WI6E\n3d9+1wPfpRj5+mBEvKtuk2Rv+FsDfAFYA9wMLK00uV0ILAfuB9Zm5sqyfDlwZESsBf4M+PBIrme0\nHGghSZI6yUi7aG+h+DRZ7d13fwj8QWY261m6hhtrFy3Aa14Df/M3cOaZDa6UJEnSIA5IFy0wKzOv\nLF9hsiszrwJmjfWkncaBFpIkqZOMNOA9HhF/GBETy+kPgcebWbF2YsCTJEmdZKQB790Ur0h5BHgY\neAvwx02qU9vxaxaSJKmTjHQU7S8z89zMnJWZR2XmImCko2g7noMsJElSJxlpC95gPtiwWrQ5u2gl\n
 SVInGU/AG/PIjk5jwJMkSZ1kPAFvbO8c6UA+gydJkjrJsN+ijYhtDB7kApjalBq1IZ/BkyRJnWRE\nLzruBuN50fGzz8KMGcVv9EzHtCRJapUD9aLjnjZlCkyaBE8+2eqaSJIk7Z8Bb4QcaCFJkjqFAW+E\nHGghSZI6hQFvhGbNgk2bWl0LSZKk/TPgjdALXwgPPdTqWkiSJO2fAW+E5s6F9etbXQtJkqT9M+CN\nkAFPkiR1CgPeCBnwJElSpzDgjZABT5IkdQoD3gjVAl6PfPhDkiR1MAPeCE2fDhMm+DULSZLU/gx4\no2A3rSRJ6gQGvFGYM8eAJ0mS2p8BbxRswZMkSZ3AgDcKBjxJktQJDHijYMCTJEmdwIA3CgY8SZLU\nCQx4o2DAkyRJncCANwoGPEmS1AkMeKMwcyY8+yw89VSrayJJkjQ0A94oRBSteBs2tLomkiRJQzPg\njZLdtJIkqd0Z8EbJgCdJktpdUwNeRCyPiI0RsbpS9j8i4p6I+GFEfCMi5lbWXRwRayPivoh4Q6V8\nYUSsjoj7I+KySvmkiFhR7nN7RBzTzOsBA54kSWp/zW7BuxI4u67s0sx8SWaeCnwZuAQgIk4CzgcW\nAOcAl0dElPtcASzJzPnA/IioHXMJsDkz5wGXAZc29WoovkfrM3iSJKmdNTXgZeZtwJa6suoY1EOA\nx8v5c4EVmbkrMx8A1gKnR8RsYFpmriq3uwZYVM6fB1xdzt8InNXwi6hjC54kSWp3fa04aUT8DfAO\nYDtwRlk8B7i9stmGsmwXUI1U68vy2j7rADJzd0RsjYiZmbm5WXU34EmSpHbXkkEWmflXmXkMRRfu\nZfvbfhRi/5uMjwFPkiS1u5a04FVcD9xczm8Ajq6sm1uWDVVe3eehiJgITB+u9W7ZsmW/mu/v76e/\nv3/UFT7qKNi6tXjh8ZQpo95dkiTpeQYGBhgYGGjY8SIzG3awQU8QcRxwU2aeU
 i6fmJk/K+ffD5ye\nmX9UDrK4jqLLdg5wCzAvMzMi7gAuAlYBXwU+lZkrI2IpcHJmLo2IxcCizFw8RD2yUdd63HHwzW/C\nCSc05HCSJEn7iAgyc8w9k01twYuI64F+4IiIeJBixOybIuI3KJ6t+znwPoDMXBMRXwDWADuBpZVE\ndiFwFTAFuDkzV5bly4FrI2ItxWCNQcNdo9W6aQ14kiSpHTW9Ba9dNLIFb/FiOPdcePvbG3I4SZKk\nfYy3Bc8vWYyBAy0kSVI7M+CNgQFPkiS1MwPeGBjwJElSOzPgjYEBT5IktTMD3hgY8CRJUjtzFO0Y\n7NoFU6fC9u1w0EENOaQkSdKvOIq2Bfr6ii9aPPJIq2siSZL0fAa8MbKbVpIktSsD3hgZ8CRJUrsy\n4I2RAU+SJLUrA94YGfAkSVK7MuCNkQFPkiS1KwPeGBnwJElSuzLgjZEBT5IktStfdDxGO3bAtGnw\nzDMwcWLDDitJkuSLjltl8mQ4/HDYtKnVNZEkSdqXAW8c7KaVJEntyIA3DgY8SZLUjgx44zBnjgFP\nkiS1HwPeONiCJ0mS2pEBbxzmzoUNG1pdC0mSpH0Z8MbBFjxJktSODHjjMHcurFvX6lpIkiTtyxcd\nj8POnTBjBjz6KBxySEMPLUmSepgvOm6hgw6Ck06Ce+5pdU0kSZL2MuCN02mnwQ9+0OpaSJIk7WXA\nG6eFCw14kiSpvRjwxum00+Duu1tdC0mSpL0cZDFO27fDkUfC1q0waVLDDy9JknqQgyxa7OCD4fjj\nYc2aVtdEkiSpYMBrALtpJUlSOzHgNYAjaSVJUjsx4DWAI2klSVI7aWrAi4jlEbExIlZXyi6NiPsi\n4ocR8cWImF5Zd3FErC3Xv6FSvjAiVkfE/RFxWaV8UkSsKPe5PSKOaeb1DOXUU4uXHe/e3YqzS5Ik\n7avZLXhXAmfXlX0deFFmngqsBS4GiIiTgPOBBcA5wOUR
 URs9cgWwJDPnA/MjonbMJcDmzJwHXAZc\n2syLGcrhhxcjaX/2s1acXZIkaV9NDXiZeRuwpa7sG5m5p1y8A5hbzp8LrMjMXZn5AEX4Oz0iZgPT\nMnNVud01wKJy/jzg6nL+RuCsplzICNhNK0mS2kWrn8F7N3BzOT8HWFdZt6EsmwOsr5SvL8v22Scz\ndwNbI2JmMys8FEfSSpKkdtGygBcRfwnszMzPN/KwDTzWqDiSVpIktYu+Vpw0Iv4Y+F3gdZXiDcDR\nleW5ZdlQ5dV9HoqIicD0zNw81HmXLVv2q/n+/n76+/vHegnPs3Bh0YKXCdGymClJkjrRwMAAAwMD\nDTte0z9VFhHHATdl5inl8huBTwC/nZmPV7Y7CbgOOIOi6/UWYF5mZkTcAVwErAK+CnwqM1dGxFLg\n5MxcGhGLgUWZuXiIejTlU2VVs2fDXXfBMS0ZyytJkrrFeD9V1tQWvIi4HugHjoiIB4FLgI8Ak4Bb\nykGyd2Tm0sxcExFfANYAO4GllUR2IXAVMAW4OTNXluXLgWsjYi3wODBouDtQagMtDHiSJKmVmt6C\n1y4ORAveX/4l9PXBf//vTT2NJEnqcuNtwWv1KNqu4kALSZLUDgx4DeS78CRJUjsw4DXQ8cfDtm3w\n6KOtrokkSeplBrwGiii+S2srniRJaiUDXoPZTStJklrNgNdgfrJMkiS1mgGvwRxJK0mSWs334DXY\nrl0wYwY8/DBMn97000mSpC7ke/DaTF8fnHwy3HNPq2siSZJ6lQGvCRYuhFWrWl0LSZLUqwx4TbBo\nEXzuc9Ajvd+SJKnNGPCa4PWvh61b4Xvfa3VNJElSLzLgNcGECfCe98A//mOrayJJknqRo2ib5JFH\nYMECeOCBYlStJEnSSDmKtk3Nng2/8ztw3XWtrokkSeo1Brwmeu97i27aHmkklSRJbcKA10Svex08\n/TTceWerayJJknqJAa+JJkyAP/k
 TB1tIkqQDy0EWTbZpE8yfXwy2OOywA356SZLUgRxk0eaOOgre\n+Ea49tpW10SSJPUKA94BUOum7ZHGUkmS1GIGvAPgta+F556D73631TWRJEm9wIB3AEQ42EKSJB04\nDrI4QB57DObNg29/G045pWXVkCRJHcBBFh3iyCPh8suLARc/+1mrayNJkrpZX6sr0EsuuACefBJe\n/3r493+HuXNbXSNJktSNDHgH2HvfC088UYS8b38bZs1qdY0kSVK38Rm8FvnIR+BrX4NvfhNmzGh1\nbSRJUjsZ7zN4BrwWyYQ//VO4915YuRIOPrjVNZIkSe3CQRYdKgL+4R/g2GPh7LPhwQdbXSNJktQt\nDHgtNGGfvr8ZAAAO5ElEQVQCXHUVvOlN8LKXwYoVra6RJEnqBnbRtonvfx/+4A/g9NPh05+G6dNb\nXSNJktQqdtF2iZe+tAh5hxwCp54K3/lOq2skSZI6VVMDXkQsj4iNEbG6UvaWiPhRROyOiIV1218c\nEWsj4r6IeEOlfGFErI6I+yPiskr5pIhYUe5ze0Qc08zrabZDDoErroBPfhLe8pbi82YbNrS6VpIk\nqdM0uwXvSuDsurJ7gd8HvlUtjIgFwPnAAuAc4PKIqDVNXgEsycz5wPyIqB1zCbA5M+cBlwGXNuUq\nDrA3vxnWrIHDD4cXvxg+/GHYsqXVtZIkSZ2iqQEvM28DttSV/TQz1wL1/crnASsyc1dmPgCsBU6P\niNnAtMxcVW53DbCoss/V5fyNwFmNv4rWOPxw+PjH4Z574PHHYf58uPRSeOaZVtdMkiS1u3Z6Bm8O\nsK6yvKEsmwOsr5SvL8v22SczdwNbI2Jm86t64MydC5/5TPFpszvvhOOPhw99CO67r9U1kyRJ7aqd\nAl4jjHm0Sbv7zd+EL36x+LxZXx+cdRa86lXw2c8W37eVJEmqaadv0W4Ajq4szy3Lhiqv7vNQREwE\npmfm5qFOsG
 zZsl/N9/f309/f34h6H1Dz58NHPwp//dfFp86WLy9a9H77t+HMM4vp1FNh4sRW11SS\nJI3UwMAAAwMDDTte09+DFxHHATdl5il15bcC/yUzv18unwRcB5xB0fV6CzAvMzMi7gAuAlYBXwU+\nlZkrI2IpcHJmLo2IxcCizFw8RD3a+j144/Hoo8U3bb/1rWLasAFe/eoi9L3qVcUrWPwUmiRJnaOt\nv0UbEdcD/cARwEbgEopBF/8AHAlsBX6YmeeU219MMTJ2J/CBzPx6Wf5S4CpgCnBzZn6gLJ8MXAuc\nBjwOLC4HaAxWl64NePU2bSq6cr/9bbjjDvjRj2DBAnjlK+EVr4AzzoATTyw+lyZJktpPWwe8dtJL\nAa/eM8/AD35QhL3bb4e77iqe23vZy+DlL987zZlj6JMkqR0Y8EaolwPeYDZuhO99D1atKqbvfQ92\n7YJTTtl3OukkmDGj1bWVJKm3GPBGyIC3fxs3wr33wurVxe+998JPflKM2j3mGDj22L2/s2bBzJnF\n+/oOP7yYP+yw4lk/WwElSRofA94IGfDGJrP4isaDD8Ivf7n397HHYPPmYl3td8sW2LEDpk4tPrtW\nnQ49dOjlkaw79FCYPNnwKEnqDQa8ETLgHRi7d8P27fD003un7dvhqaf2Lg81P9S62u+ePTBtWhH2\npk2D6dOLacaMvb8zZhQtiTNn7m1hrP1OmwZTphgSJUntz4A3Qga8zvfcc7BtWxH4tm0rpieeKAaM\nPPHE3mnr1r0ti9VWxm3biucMawGxFhbrWxtrLYa19bWpFiprgXL69KLMdw5KkhrNgDdCBjwB7Ny5\nNxzWwuJQrY21IPnUU8X05JP7hsonnyzKp07dNzTWpoMP3jtNnVr8DtYVfeihRVg87LC94bGvnV5B\nLkk64Ax4I2TAUzPs2VOEwWporIXCZ54pAuP27cV8LUAO1hVdbX188skiEFZbCmuthdOnF6G
 wGhpr\n85MnF9OUKXvnq9tUp0mTWv0nJ0kajgFvhAx46hR79uwNfbXAWGsx3LZtb2isTU8/XQTIHTuK6dln\n984/88zzg+ZTTxXdyvXPMB5ySBEOa1MtNB50ULF9X9++v7VpwoS98319+27X11fsP2lSMVXnByur\nzR90UDH5vKSkXmXAGyEDnlTILMJf7dnF2m8tAD777L7Trl3FtHv3vvO7dxdhtDZfm2rb1KadO4vp\nuef2nerLasu13127iqBYC321VslqS2Wt27t+5HV1ME5tmjz5+YGyFkZrIXXChOfPV6ehtjGISmo0\nA94IGfCkzpK5NyA+99zeVsnqVP/MZK27vPr8ZK0VdMeOfUNlbT5zb1itBdbafHUabpuIwVszDzpo\n728tWE6duneqda9Xw2i1O/6ww4rp8MP3/k6e3Oo7I+lAMOCNkAFPUjNk7hv86lsyay2Yu3bt221e\n7T5/+um9XfDVEeJPPFGMAq+NDN+ypQiR9UGw+tqg6jObBx/8/BbKiROLQFqbYN/lwcqqy4NtX5uq\nXff1QXewabBW0tGef7B1Ujcw4I2QAU9Sp6t2r9eezaz/rU7bt+/b4lgLn5nFVDtmdaovqy4Ptn11\nqu+urwXdWsitn6rhuFa/0Zy/fl3V/kJr/VQLl+Mtr66rnrP+/KNZV1uunx9q2/o/h/3ND1c2lJGc\nr6Ya3quPOEyatO+gsClT9j7zW/+c74QJw19H/Z9d9f7UP2ZR/z8g9c8W9/UN/9/KeP4shtr29a8f\nbFsD3ogY8CSp+w0WPIcqr5/27GlcefWc9ecfzbracv38/gLuUPvVzw9XNpSRnK9aVh/ka49f1B69\nqA4Me+65wf9HYbjrGOrPsnp/hntmuH5+166h/xsZ75/FUG655fll4w14vm1LktQ1hmvNknrJhP1v\nIkmSpE5iwJMkSeoyBjxJkqQuY8CTJEnqMgY8SZKkLmPAkyRJ6jIGPE
 mSpC5jwJMkSeoyBjxJkqQu\nY8CTJEnqMgY8SZKkLmPAkyRJ6jIGPEmSpC5jwJMkSeoyBjxJkqQuY8CTJEnqMgY8SZKkLmPAkyRJ\n6jIGPEmSpC7T1IAXEcsjYmNErK6UHR4RX4+In0bE1yJiRmXdxRGxNiLui4g3VMoXRsTqiLg/Ii6r\nlE+KiBXlPrdHxDHNvB5JkqRO0OwWvCuBs+vKPgx8IzN/A/gmcDFARJwEnA8sAM4BLo+IKPe5AliS\nmfOB+RFRO+YSYHNmzgMuAy5t5sWodQYGBlpdBY2R966zef86l/eutzU14GXmbcCWuuLzgKvL+auB\nReX8ucCKzNyVmQ8Aa4HTI2I2MC0zV5XbXVPZp3qsG4GzGn4Ragv+Q9W5vHedzfvXubx3va0Vz+Ad\nlZkbATLzEeCosnwOsK6y3YaybA6wvlK+vizbZ5/M3A1sjYiZzau6JElS+2uHQRbZwGPF/jeRJEnq\nbpHZyHw1yAkijgVuyswXl8v3Af2ZubHsfr01MxdExIeBzMyPl9utBC4BflnbpixfDJyZme+rbZOZ\nd0bERODhzDzq+bWAiGjuhUqSJDVQZo654aqvkRUZQrBvy9pXgD8GPg68E/hypfy6iPh7iq7XE4G7\nMjMj4omIOB1YBbwD+FRln3cCdwJvpRi0Majx/CFJkiR1kqa24EXE9UA/cASwkaJF7v8ANwBHU7TO\nnZ+ZW8vtL6YYGbsT+EBmfr0sfylwFTAFuDkzP1CWTwauBU4DHgcWlwM0JEmSelbTu2glSZJ0YLXD\nIIumi4g3RsRPyhcl/0Wr66OhRcTciPhmRPw4Iu6NiIvK8iFfkK32EhETIuLuiPhKuey96xARMSMi\nbihfNv/jiDjD+9c5yo8F/Lj8MMB15ccAvH9tqlEfgxhK1we8iJgAfJrihcsvAi6IiN9sba00jF3A\nBzPzRcArgQvL+zXoC7LVlj4ArKkse+86xycpH
 oNZALwE+Anev45QDmh8D3BaOaixD7gA7187a9TH\nIAbV9QEPOB1Ym5m/zMydwAqKFySrDWXmI5n5w3L+KeA+YC5DvyBbbSQi5gK/C3y2Uuy96wARMR14\nTWZeCVC+dP4JvH+d4kngOeCQiOgDplK8T9b716Ya8TGI4Y7fCwGv/gXK1Rclq41FxHHAqcAdwAuG\neEG22svfAx9i3/dbeu86w/HAYxFxZdnF/k8RcTDev46QmVuATwAPUgS7JzLzG3j/Os1oPwYxpF4I\neOpAEXEoxefnPlC25NWPBnJ0UJuJiDcBG8sW2OG6Drx37akPWAj878xcCDxN0V3k370OEBEnAH8O\nHAu8kKIl7w/w/nW6Md+vXgh4G4BjKstzyzK1qbJ74Ubg2sysvSdxY0S8oFw/G9jUqvppSK8Gzo2I\nnwOfB14XEdcCj3jvOsJ6YF1mfq9c/iJF4PPvXmd4GfCdzNxcfrrzS8Cr8P51mqHu1waK18vV7DfL\n9ELAWwWcGBHHRsQkYDHFC5LVvv4ZWJOZn6yU1V6QDfu+IFttIjM/kpnHZOYJFH/PvpmZfwTchPeu\n7ZXdQusiYn5ZdBbwY/y71yl+CrwiIqaUD9+fRTHYyfvX3ob6GAQ8/2MQi8uR0cdTfgxi2AP3wnvw\nIuKNFKPDJgDLM/NjLa6ShhARrwa+DdxL0TSdwEco/kP+AoO8IFvtJyLOBP5zZp4bETPx3nWEiHgJ\nxQCZg4CfA+8CJuL96wgR8SGKcLAb+AHwn4BpeP/aUqM+BjHk8Xsh4EmSJPWSXuiilSRJ6ikGPEmS\npC5jwJMkSeoyBjxJkqQuY8CTJEnqMgY8SZKkLmPAk9RTImJb+XtsRFzQ4GNfXLd8WyOPL0kjZcCT\n1GtqL/88Hnj7aHaMiIn72eQj+5wo87dGc3xJahQDnqRe9VHgtyLi7oj4QERMiIhLI+LOiPhhRLwH\niq9yRMS3I+LLFJ/uIiK+
 FBGrIuLeiPhPZdlHganl8a4ty7bVThYRf1tuf09EnF859q0RcUNE3Ffb\nT5LGq6/VFZCkFvkw5efUAMpAtzUzzyi/W/2diKh9Cug04EWZ+WC5/K7M3BoRU4BVEfHFzLw4Ii7M\nzIWVc2R57P8IvDgzT4mIo8p9vlVucypwEvBIec5XZeZ3m3nhkrqfLXiSVHgD8I6I+AFwJzATmFeu\nu6sS7gD+LCJ+CNwBzK1sN5RXA58HyMxNwADw8sqxH87iu5E/BI4b/6VI6nW24ElSIYD3Z+Yt+xRG\nnAk8Xbf8OuCMzNwREbcCUyrHGOm5anZU5nfjv8uSGsAWPEm9phautgHTKuVfA5ZGRB9ARMyLiIMH\n2X8GsKUMd78JvKKy7rna/nXn+nfgbeVzfrOA1wB3NeBaJGlQ/p+ipF5TG0W7GthTdslelZmfjIjj\ngLsjIoBNwKJB9l8J/D8R8WPgp8DtlXX/BKyOiO9n5h/VzpWZX4qIVwD3AHuAD2XmpohYMETdJGlc\nonjsQ5IkSd3CLlpJkqQuY8CTJEnqMgY8SZKkLmPAkyRJ6jIGPEmSpC5jwJMkSeoyBjxJkqQuY8CT\nJEnqMv8/8YIC1TT8jb4AAAAASUVORK5CYII=\n",
+      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAngAAAGJCAYAAAAZsU4bAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAIABJREFUeJzt3XmUZWV97//3p7tlnhsBaUDQdCsqCkTAOMRyBhMHMnhF\nvQ7R3CQa9cbfNYrXn7QxWVETk2hMNFFETGSI8xAi6AoVf0QREAGVqR0YmpaG1m5Exh6+vz/2Ljkc\nTnVXV9fpM9T7tdZe55zn7OG7q6heH569n2enqpAkSdL4WDDoAiRJkjS3DHiSJEljxoAnSZI0Zgx4\nkiRJY8aAJ0mSNGYMeJIkSWPGgCdJs5DksCQ/n+t1JWkuGPAk9UWS65LcmeTnSX6S5GNJdmm/m0xy\nV5IlHes/I8mPu7a/O8k+Xfu9LMmmJIe0nz+e5J72OLe3r7/btc3BHd/d3m7/i462J23t+VXVj6tq\nj7led2sl+Zck7+jHviWNLgOepH4p4DfaYHM0cAzw9o7vfgH8vz226Xz/Y+CkqYYkjwF26rHee6pq\nj6ravX391P12WnVjx3e7t9sc0dH2393FJ/HfR0kjy3/AJPVTAKrqJ8B/AI/p+O4DwElJHraZ7f8F\neEXH51cAp89RXblfQ9MT9sEk/5HkduDJSZ6X5DttL991Sd7esf7Dk2zq+Pz/JVme5L/b9c9JstfW\nrtt+/6ok1ye5JcnJSW5M8utbfZLJk5NcnGRtkguTHNvx3auT/Lg9/g+SvKhtX5rkv5Ksa4//r1t7\nXEmDZ8CT1HdJDgaeC1za0XwT8BHgnZvZ9EJg9ySPaHvUXgT8K13hbA6dBJzS9vJdCNwOvLTthXwe\n8IYkz+1Yv/tZjycB/xPYD9gNeNPWrpvkCOD9NOe6BHgwsP/WnkiSxcCXgb8CFgN/D5yTZM8kuwPv\nA57RntuTgCvaTf8C+HJV7QUcBPzD1h5b0uAZ8CT10
 +eT/Az4OnA+8Jdd378b+M0kh29mH1O9eM8C\nrgZW9VjnzUl+1vZU3bIN9X6uqi4CqKp7q2qyqq5sP38XOBt46ma2P7WqflRVdwOfAo6cxbq/09bx\nrapaT3NZezaB9nnA96rq36pqU1V9EvgR8Bvt95uAI5LsWFWrq+rqtn09cGiSA9ufwTdncWxJA2bA\nk9RPL6iqfarqsKp6fVXd0/llVa0BPgi8azP7+FfgJcArgU9Ms85ftcfZu6r224Z6b+z8kOTXkpzf\nXqpcB7wa2Hcz29/c8f5Omp65rV33wM46qupOYO0Mau92IHB9V9v1wJKqup2mB/GPgZuTfDHJ0nad\nNwE7AJckuTzJy2dxbEkDZsCT1E8z6Xn6a+BpwK/2+rKqbqAZbHEC8Nm5K62n7suoZ9L0ri1pL1me\nSv8uD0/5Cc2lUQCS7ArsPYv9rAIO7Wo7hObSOFV1blU9CzgA+CHwT2376qr6/ao6kCYA/nOSh87i\n+JIGyIAnaaCq6jaakPenm1nt94CnV9Vd26eqX9oNWFtV65M8AXhx1/dbE/Zmuu6ngBcmOTbJg4A/\n44HBs9uDkuzYsTyI5v67RyX53SQLk7wEeDjNfXgHJPnNJDsDG4A72lfa9Q9s93sbzaXcjVtxnpKG\ngAFPUr9sLpR0f/cBmoDRPf1J86aZR+7SXt/NYW292v4IeHeS24C30tyDN902W6ppRuu29/r9CfBp\nmt62W4GfAvdMtw3wNprLvFPLue3l7+e3da8B3kgzbc06YCHwZppevluBX6PprQM4Dri4HUn8aeC1\nVbVyC+cmacikalv/ndzMzpNTgd8EVlfVY9u2xwEfppnLaj3wuqq6uP3uAzSXYe4AXllVl7XtrwD+\nL80/in9RVZ9o248GPt7u65yq+t99OxlJGoB2xOs64JCqumnQ9UgaDf3uwTsNeE5X23tppiE4Cjil\n/Uw79cDDq2op8Ac0IZAkewPv
 oJkk9TjglCR7tvv6EPCaqloGLEvSfSxJGjnt/Hs7J9kN+Bvg24Y7\nSVujrwGvqi7ggaO/NgFTAW0v2ht+aS4lfKLd7lvAnkn2pwmI51XVbe2lhfOA45McAOw+NaVBu+0L\n+3YykrT9nEhz+fQGmoERJ21+dUm6v0UDOOafAOcmeR/NTcdPbNuXcP8pCla2bd3tN3W0r+yxviSN\ntKr6PZqBJZI0K4MYZPFHwBur6hCasPextr17hFlo7rnrNfJsc+2SJEnz2iB68F5RVW8EqKpPJ/lo\n274SOLhjvYNoLlGsBCa62s/fzPo9JTH8SZKkkVFVs553c3v04HU/1PumJE8FSPIMYEXb/kXg5W37\nE4B1VbUaOBd4Vvv8xL1pHld0blXdDPy8nSsq7bZf2FwhVeUygsspp5wy8Bpc/P3N18Xf3+gu/u5G\ne9lWfe3BS3IGTe/b4iQ30Iya/X3gA0kWAncD/wugqs5J8twkP6CZJuVVbfvaJO8CLqG5BPvOagZb\nALyW+0+T8pV+no8kSdIo6GvAq6qXTPPV46dZ/4+naf84TZDrbv82cMQsy5MkSRpLPslCQ29iYmLQ\nJWgb+Psbbf7+Rpe/u/mtr0+yGCZJar6cqyRJGm1JqCEfZCFJkqTtyIAnSZI0Zgx4kiRJY8aAJ0mS\nNGYMeJIkSWPGgCdJkjRmDHiSJEljxoAnSZI0Zgx4kiRJY8aAJ0mSNGYMeJIkSWPGgCdJkjRmDHiS\nJEljxoAnSZI0Zgx4kiRJY8aAJ0mSNGbmbcC79164/vpBVyFJkjT35m3Au+IKeP7zB12FJEnS3EtV\nDbqG7SJJdZ7rPffAPvvArbfCLrsMsDBJkqQuSaiqzHb7eduDt+OO8KhHwWWXDboSSZKkuTVvAx7A\nMcfAJZcMugpJkqS5Na8D3uMfDxdfPOgqJEmS5ta8D3j24EmSpHEzbwdZAGzYAHvtBatWwR57DKgw\nSZKkLg6
 y2AaLFsHjHgeXXjroSiRJkubOvA544H14kiRp/Mz7gOdIWkmSNG7mfcBzoIUkSRo38z7g\nLVsGa9bAT3866EokSZLmxrwPeAsWwNFHw7e/PehKJEmS5sa8D3jgQAtJkjRe+hrwkpyaZHWSKzra\nzkpyabv8OMmlHd+dnGRFkquSPLuj/fgkVye5NslbOtoPTXJhkmuSnJlk0WzqdKCFJEkaJ/3uwTsN\neE5nQ1W9uKqOrqqjgc8AnwVIcjjwIuBw4ATgH9NYAHyw3c+jgZOSPLLd3XuA91XVI4B1wKtnU6QD\nLSRJ0jjpa8CrqguAtZtZ5UXAGe37FwBnVdWGqroOWAEc2y4rqur6qloPnNWuC/B0mpAIcDpw4mzq\nPOwwuPNOuPnm2WwtSZI0XAZ2D16SpwA3V9WP2qYlwI0dq9zUtnW3rwSWJFkMrK2qTR3tB86uFnvx\nJEnS+BjkIIuTgDM7Pvd63lptob37u1k/WNeBFpIkaVzMalDCtkqyEPgt4OiO5pXAwR2fDwJW0YS4\nQ7rbq2pNkr2SLGh78abWn9by5ct/+X5iYoKJiYlffj7mGPjIR2ZzNpIkSdtmcnKSycnJOdtfqmbd\n6TWzAySHAl+qqiM62o4H3lJVT+toexTwSeA4msuyXwWW0vQyXgM8A/gJcBHw4qq6OsnZwGer6uwk\nHwIur6oPT1NHbe5cV65s5sNbvbq5ZCtJkjQoSaiqWSeSfk+TcgbwDWBZkhuSvKr96n9w/8uzVNWV\nwL8BVwLnAK+txkbgj4HzgO/TDMS4ut3srcCbklwL7AOcOttalyyBhQvhxhu3vK4kSdIw63sP3rDY\nUg8ewPOeB696FfzWb22noiRJknoY6h68UeNAC0mSNA4MeB18ooUkSRoHXqLtsHo1PPKR8LOfOdBC\nkiQNjpdo59D++8Puu8MPfzjoSiRJkmbPgNfl8Y+HSy8ddBWSJEmzZ8DrcthhcMMNg65C
 kiRp9gx4\nXQ48EG66adBVSJIkzZ4Br8uSJQY8SZI02gx4XQx4kiRp1BnwuixZAqtWDboKSZKk2XMevC533w17\n7QV33eVceJIkaTCcB2+O7bQT7LYbrFkz6EokSZJmx4DXg/fhSZKkUWbA68GAJ0mSRpkBrwcDniRJ\nGmUGvB6c7FiSJI0yA14P9uBJkqRRZsDrwYAnSZJGmQGvBwOeJEkaZQa8Hgx4kiRplBnweth3X7jj\njuapFpIkSaPGgNdDAg95iM+klSRJo8mANw0v00qSpFFlwJuGc+FJkqRRZcCbhj14kiRpVBnwpmHA\nkyRJo8qANw0DniRJGlUGvGkY8CRJ0qgy4E3DgCdJkkZVqmrQNWwXSWprzvWuu2DvvZvXpI+FSZIk\ndUlCVc06gdiDN42dd4Zdd4Wf/nTQlUiSJG0dA95meJlWkiSNIgPeZjjZsSRJGkV9DXhJTk2yOskV\nXe2vT3J1ku8meXdH+8lJViS5KsmzO9qPb9e/NslbOtoPTXJhkmuSnJlk0VzWbw+eJEkaRf3uwTsN\neE5nQ5IJ4HnAY6rqCOCv2/bDgRcBhwMnAP+YxgLgg+1+Hg2clOSR7e7eA7yvqh4BrANePZfFG/Ak\nSdIo6mvAq6oLgLVdzX8EvLuqNrTrrGnbXwCcVVUbquo6YAVwbLusqKrrq2o9cFa7LsDTgc+0708H\nTpzL+g14kiRpFA3iHrxlwK+3l1bPT/KrbfsS4MaO9W5q27rbVwJLkiwG1lbVpo72A+eyUAOeJEka\nRXN6z9pWHHOvqnpCkmOATwEPA3rN9VL0DqHVrt+9zZxO6mfAkyRJo2gQAe9G4LMAVXVxko1tb9xK\n4JCO9Q4CVtGEuAe0V9WaJHslWdD24k2tP63ly5f/8v3ExAQTExObLdSAJ0mStofJyUkmJyfnbH99\nf5JFkkOBL7UDKkjyv4AlVXVKkmXAV6vqoUkeBXwSOI7msuxXgaU
 0PXjXAM8AfgJcBLy4qq5Ocjbw\n2ao6O8mHgMur6sPT1LFVT7IA2LSpmfD4tttgp522+tQlSZJmZaifZJHkDOAbwLIkNyR5FfAx4GFJ\nvgucAbwcoKquBP4NuBI4B3htNTYCfwycB3yfZiDG1e0h3gq8Kcm1wD7AqXNZ/4IFcMABsGqz/YKS\nJEnDxWfRbsETnwjvfS88+cl9KEqSJKmHoe7BGwfehydJkkaNAW8LDHiSJGnUGPC2wIAnSZJGjQFv\nCwx4kiRp1BjwtsCAJ0mSRo0BbwsMeJIkadQ4TcoW3Hkn7LMP3HUXZNaDlSVJkmbOaVL6bJddmqdZ\n/PSng65EkiRpZgx4M+BlWkmSNEoMeDOwZImPK5MkSaPDgDcD9uBJkqRRYsCbAQOeJEkaJQa8GTDg\nSZKkUWLAmwEDniRJGiUGvBkw4EmSpFFiwJuBAw804EmSpNHhkyxmYONG2HFHuPtuWLRojguTJEnq\n4pMstoOFC2HxYrj11kFXIkmStGUGvBnaf39YvXrQVUiSJG2ZAW+GDHiSJGlUGPBmaP/94ZZbBl2F\nJEnSlhnwZmi//ezBkyRJo8GAN0NeopUkSaPCgDdDBjxJkjQqDHgz5D14kiRpVBjwZsh78CRJ0qgw\n4M2Ql2glSdKo8FFlM3TvvbDrrnDPPbDAWCxJkvrIR5VtJzvsALvvDmvXDroSSZKkzTPgbQXvw5Mk\nSaPAgLcVvA9PkiSNAgPeVjDgSZKkUWDA2wrOhSdJkkZBXwNeklOTrE5yRUfbKUlWJrm0XY7v+O7k\nJCuSXJXk2R3txye5Osm1Sd7S0X5okguTXJPkzCSL+nk+3oMnSZJGQb978E4DntOj/W+q6uh2+QpA\nksOBFwGHAycA/5jGAuCD7X4eDZyU5JHtft4DvK+qHgGsA17dz5PxEq0kSRoFfQ14VXUB0GtikV7z\nurwAOKuqNlTVdcAK4Nh2WVFV11fVeuCsdl
 2ApwOfad+fDpw4h+U/gAFPkiSNgkHdg/e6JJcl+WiS\nPdu2JcCNHevc1LZ1t68EliRZDKytqk0d7Qf2s2jvwZMkSaNgEAHvH4GHV9WRwM3A+9r2Xr16tYX2\n7u/6+lgOe/AkSdIo6OughF6q6taOjx8BvtS+Xwkc3PHdQcAqmhB3SHd7Va1JsleSBW0v3tT601q+\nfPkv309MTDAxMbFVtU8NsqiCzPrhIZIkSfc3OTnJ5OTknO2v78+iTXIo8KWqOqL9fEBV3dy+/xPg\nmKp6SZJHAZ8EjqO5LPtVYClNL+M1wDOAnwAXAS+uqquTnA18tqrOTvIh4PKq+vA0dWzTs2in7LYb\nrFoFe+yxzbuSJEnqaVufRdvXHrwkZwATwOIkNwCnAE9LciSwCbgO+AOAqroyyb8BVwLrgde2iWxj\nkj8GzqMJe6dW1dXtId4KnJXkXcB3gFP7eT5w3314BjxJkjSs+t6DNyzmqgfviU+Ev/oreNKT5qAo\nSZKkHra1B88nWWwlJzuWJEnDzoC3lRxJK0mShp0Bbys5F54kSRp2BrytZA+eJEkadga8reQ9eJIk\nadgZ8LaSPXiSJGnYGfC2kvfgSZKkYWfA20r24EmSpGFnwNtKe+4Jd9/dLJIkScPIgLeVEgdaSJKk\n4WbAmwXvw5MkScPMgDcL3ocnSZKGmQFvFrxEK0mShpkBbxbswZMkScPMgDcL3oMnSZKGmQFvFuzB\nkyRJw8yANwsGPEmSNMwMeLPgIAtJkjTMDHiz4D14kiRpmKWqBl3DdpGk5upcN26EnXaCu+6CRYvm\nZJeSJEm/lISqymy3twdvFhYuhMWL4dZbB12JJEnSAxnwZsn78CRJ0rAy4M2S9+FJkqRhZcCbJadK\nkSRJw8qAN0sGPEmSNKwMeLPkPXiSJGlYGfBmyXvwJEnSsDLgzZKXaCVJ0rAy4M2SAU+SJA2rGQW8\nJA9PsmP7fiLJG5Ls1
 d/Shpv34EmSpGE10x68zwAbk/wK8M/AwcAZfatqBOy3H6xZA5s2DboSSZKk\n+5tpwNtUVRuAE4G/r6o3Aw/pX1nDb4cdYLfdYO3aQVciSZJ0fzMNeOuTnAS8Avhy2/ag/pQ0OrwP\nT5IkDaOZBrxXAb8G/EVV/TjJYcC/bmmjJKcmWZ3kih7f/Z8km5Ls09H2gSQrklyW5MiO9lckuTbJ\nNUle3tF+dJIr2u/+bobnMme8D0+SJA2jGQW8qrqyqt5QVWcm2RvYvarePYNNTwOe092Y5CDgmcD1\nHW0nAA+vqqXAHwAfbtv3Bt4BHAMcB5ySZM92sw8Br6mqZcCyJA84Vj85F54kSRpGMx1FO5lkj7a3\n7VLgI0n+ZkvbVdUFQK+71P4WeHNX2wuAT7TbfQvYM8n+NAHxvKq6rarWAecBxyc5gCZoXtRu/wng\nhTM5n7niJVpJkjSMZnqJds+q+jnwW8Anquo4mh64rZbkecCNVfXdrq+WADd2fF7ZtnW339TRvrLH\n+tvNAQfAzTdvzyNKkiRt2aKZrpfkIcCLgP8724Ml2bnd/lm9vu7xuXq0s4X2aS1fvvyX7ycmJpiY\nmNjc6lt08MHw1a9u0y4kSZKYnJxkcnJyzvY304D3Z8C5wH9X1cVJHgasmMXxHg4cClyeJMBBwKVJ\njqXpgTu4Y92DgFVt+0RX+/mbWX9anQFvLhxyCNxww5zuUpIkzUPdHU/vfOc7t2l/Mx1k8amqemxV\n/VH7+UdV9dszPEbahar6XlUdUFUPq6rDaELaUVV1C/BF4OUASZ4ArKuq1TTB8llJ9mwHXDwLOLeq\nbgZ+nuTYNiy+HPjCTE98LhjwJEnSMJrpIIuDknwuyS3ttCefaUfCbmm7M4Bv0IxwvSHJq7pW+eWl\n1qo6B/hxkh8A/wS8tm1fC7wLuAT4FvDOdrAF7TqnAtcCK6rqKzM5n7myZAmsWgUbN27Po0qSJG1e\n
 qjZ721qzUvJVmkeT/Uvb9DLgpVXV6166oZSkZnKuW+vAA+Gii+CgLcZdSZKkmUlCVfUabzAjMx1F\n++CqOq2qNrTLx4EHz/ag48TLtJIkadjMNOCtSfKyJAvb5WXAT/tZ2Kgw4EmSpGEz04D3ezRTpNwM\n/AT4HZrHl817BjxJkjRsZjqK9oaqen5VPbiq9quqF9JMejzvPfShBjxJkjRcZtqD18ub5qyKEWYP\nniRJGjbbEvBmPbJjnBjwJEnSsNmWgDf3c46MIAOeJEkaNpt9VFmS2+kd5ALs3JeKRsw++8A998Dt\nt8Puuw+6GkmSpC0EvKoysmxBcl8v3qMfPehqJEmStu0SrVpeppUkScPEgDcHDHiSJGmYGPDmgAFP\nkiQNEwPeHHCyY0mSNEwMeHPAHjxJkjRMDHhzwIAnSZKGSarmx3zFSapf53rPPbDHHnDnnbBwYV8O\nIUmS5pEkVNWsnxpmD94c2HFHWLwYbr550JVIkiQZ8ObMIYfA9dcPugpJkiQD3pzxPjxJkjQsDHhz\nxIAnSZKGhQFvjhjwJEnSsDDgzREDniRJGhYGvDni0ywkSdKwMODNEXvwJEnSsDDgzZF99mkmPL79\n9kFXIkmS5jsD3hxJml68G28cdCWSJGm+M+DNIS/TSpKkYWDAm0M+zUKSJA0DA94csgdPkiQNAwPe\nHDLgSZKkYWDAm0MGPEmSNAwMeHPIgCdJkoZBXwNeklOTrE5yRUfbnyW5PMl3knwlyQEd330gyYok\nlyU5sqP9FUmuTXJNkpd3tB+d5Ir2u7/r57nMxEEHwapVsHHjoCuRJEnzWb978E4DntPV9t6qelxV\nHQX8O3AKQJLnAg+vqqXAHwAfbtv3Bt4BHAMcB5ySZM92Xx8CXlNVy4BlSbqPtV3tuCMsXgw33zzI\nKiRJ0nzX14BXVRcAa7vaftHxcVdgU/v++cAn2nW+BeyZZH+agHheVd1WVeuA8
 4Dj256/3avqonb7\nTwAv7NvJzJCXaSVJ0qAN5B68JH+e5AbgJTS9cwBLgM7nQKxs27rbb+poX9lj/YEy4EmSpEEbSMCr\nqrdX1SHAJ4HXt83pWi1A9WhnC+0D5WTHkiRp0BYN+PhnAl8GltP0wB3c8d1BwKq2faKr/fzNrD+t\n5cuX//L9xMQEExMT0647W4ccAtdeO+e7lSRJY2xycpLJyck521+q+tvpleRQ4EtVdUT7+Veq6gft\n+9cDT6mqF7WDLF5XVb+R5AnA31XVE9pBFpcAR9P0OF4C/GpVrUvyLZoewItpBmx8oKq+Mk0d1e9z\nBfj85+FjH4MvfrHvh5IkSWMqCVXV62rljPS1By/JGTS9b4vbe+5OAX4jySOAjcD1wB8CVNU5SZ6b\n5AfAHcCr2va1Sd5FE+wKeGc72ALgtcDHgZ2Ac6YLd9uT9+BJkqRB63sP3rDYXj14a9bAsmXws5/1\n/VCSJGlMbWsPnk+ymGOLF8M998Dttw+6EkmSNF8Z8OZY0vTgXXXVoCuRJEnzlQGvD448Ei67bNBV\nSJKk+cqA1wdHHQXf+c6gq5AkSfOVAa8P7MGTJEmD5CjaPrjtNliypHlduHC7HFKSJI0RR9EOoT33\nhP33hxUrBl2JJEmajwx4feJ9eJIkaVAMeH3ifXiSJGlQDHh9Yg+eJEkaFANen0z14M2TMSySJGmI\nGPD65MADm9dVqwZbhyRJmn8MeH2SeB+eJEkaDANeHx11lAFPkiRtfwa8PjrySAdaSJKk7c+A10f2\n4EmSpEHwUWV9tHFj81SLm25qXiVJkmbCR5UNsYUL4TGPgSuuGHQlkiRpPjHg9ZkTHkuSpO3NgNdn\nTpUiSZK2NwNen9mDJ0mStjcHWfTZnXfCvvvCunWwww7b/fCSJGkEOchiyO2yCxx2GFx55aArkSRJ\n84UBbzvwPjxJkrQ9GfC2A+/DkyRJ25MBbzuwB0+SJG1P
 DrLYDtasgYc/HNauhQVGakmStAUOshgB\n++4Le+wB11036EokSdJ8YMDbTo46ysu0kiRp+zDgbSdHHulAC0mStH0Y8LaTxz8evvnNQVchSZLm\nAwdZbCd33AEPeQhcfz3svffAypAkSSPAQRYjYtdd4WlPg3//90FXIkmSxl1fA16SU5OsTnJFR9t7\nk1yV5LIkn0myR8d3JydZ0X7/7I7245NcneTaJG/paD80yYVJrklyZpJF/TyfbXXiifC5zw26CkmS\nNO763YN3GvCcrrbzgEdX1ZHACuBkgCSPAl4EHA6cAPxjGguAD7b7eTRwUpJHtvt6D/C+qnoEsA54\ndZ/PZ5s873nwta/BXXcNuhJJkjTO+hrwquoCYG1X29eqalP78ULgoPb984GzqmpDVV1HE/6ObZcV\nVXV9Va0HzgJe0G7zdOAz7fvTgRP7dS5zYfFi+NVfhfPOG3QlkiRpnA36HrzfA85p3y8Bbuz47qa2\nrbt9JbAkyWJgbUdYXAkc2N9yt52XaSVJUr8NLOAl+b/A+qo6c6qpx2q1hfbu74Z+SPALXwhf+hKs\nXz/oSiRJ0rgayKCEJK8AnktziXXKSuDgjs8HAatoQtwh3e1VtSbJXkkWtL14U+tPa/ny5b98PzEx\nwcTExDacxewcfHDzXNqvfx2e8YztfnhJkjSEJicnmZycnLP99X0evCSHAl+qqiPaz8cD7wN+vap+\n2rHeo4BPAsfRXJb9KrCUppfxGuAZwE+Ai4AXV9XVSc4GPltVZyf5EHB5VX14mjoGOg9ep7/8S7jp\nJvjgBwddiSRJGkbbOg9eXwNekjOACWAxsBo4BXgbsAMwFe4urKrXtuufTDMSdj3wxqo6r20/Hng/\nTdg7tare3bYfRjPoYm/gO8DL2oEYvWoZmoB39dXwzGfCDTfAgkHfBSlJkobOUAe8YTJMAQ/g8MPh\n9NPh2GMHXYkkSRo2PsliRDmaVpI
 k9YsBb0AMeJIkqV8MeAPy+MfDHXfAVVcNuhJJkjRuDHgDkjRz\n4tmLJ0mS5poBb4C8TCtJkvrBUbQDtGEDHHAAXHopHHLIlteXJEnzg6NoR9iiRfDSl8Lf/u2gK5Ek\nSePEHrwBu/lmePSj4TvfsRdPkiQ1nOh4hoY14AG87W1wyy3w0Y8OuhJJkjQMDHgzNMwBb+1aWLYM\nLrgAHvGIQVcjSZIGzXvwxsDee8Ob3gTveMegK5EkSePAHrwhcccdsHQp/Pu/w1FHDboaSZI0SPbg\njYldd23uxXv72wddiSRJGnUGvCHy+78PV17Z3IsnSZI0Wwa8IbLjjrB8OZx8Mgzx1WRJkjTkDHhD\n5mUvg59Fok5xAAAPv0lEQVT+FM49d9CVSJKkUWXAGzILF8Kf/zn86Z/CPfcMuhpJkjSKDHhD6MQT\n4bDDHHAhSZJmx2lShtSaNXDkkfDxj8MznznoaiRJ0vbkNCljat994fTT4ZWvhFtvHXQ1kiRplNiD\nN+Te8ha46ir4whcgs87xkiRplNiDN+be9S5YtQo+9KFBVyJJkkaFPXgj4Npr4UlPgvPPh8c8ZtDV\nSJKkfrMHbx5Ytgze+1446SS4665BVyNJkoadPXgjogpe8pIm4J11Fuy006ArkiRJ/WIP3jyRNFOm\n7LgjnHAC/Pzng65IkiQNKwPeCNlxRzjjDDj8cJiYgFtuGXRFkiRpGBnwRszChfAP/wDPex48+clw\n3XWDrkiSJA2bRYMuQFsvgXe+ExYvhqc8Bf7jPxxdK0mS7mMP3gh7wxvg3e+Gpz0N/vqvHWErSZIa\nBrwR99KXwn/9F3zjG7B0KXzkI7Bhw6CrkiRJg+Q0KWPkW9+Ck0+Gm26CP/9z+O3fhgVGeEmSRs62\nTpNiwBszVfC1r8Fb3wp33gmvfCW87GWwZMmgK5MkSTM11PPgJTk1yeokV3S0/U6S7yXZmOTorvVP\nTrIiyVVJnt
 3RfnySq5Ncm+QtHe2HJrkwyTVJzkwy7weNJPCsZ8Ell8BHPwo/+EEzAOP445sJkr1P\nT5Kk8dfXHrwkTwZ+AXyiqh7btj0C2AT8E/B/qurStv1w4AzgGOAg4GvAUiDAtcAzgFXAxcCLq+rq\nJGcDn66qTyX5EHBZVf3TNLXMix68Xu68Ez7/+Wai5EsuaQLgCSc0oe+AAwZdnSRJ6jbUPXhVdQGw\ntqvtmqpaQRPcOr0AOKuqNlTVdcAK4Nh2WVFV11fVeuCsdl2ApwOfad+fDpzYlxMZcbvs0jzm7Lzz\n4Hvfg2c/G778ZXjkI+Hoo+Htb4fJSVi3btCVSpKkuTBMlzSXAN/s+HxT2xbgxo72lcCxSRYDa6tq\nU0f7gduj0FF24IHw6lc3y/r18M1vNvPonXxyE/4WL4bHPQ6OPLJ5PfxweNjDmqdoSJKk0TBMAa9X\nN2TRu5ex2vW7t5mf12Bn6UEPgl//9WYB2LQJfvhDuPzyZjntNLjmGrjhhiYYLl0Ky5Y1yxFHNMvi\nxYM9B0mS9EDDFPBWAgd3fD6I5p67AId0t1fVmiR7JVnQ9uJNrT+t5cuX//L9xMQEExMTc1P5mFiw\noAlxS5fC7/zOfe3r1zePRLv2WlixAr7/fTj7bPjud2G33Zqg99jHNr19y5Y12z/4wc2AD0mStGWT\nk5NMTk7O2f76Pk1KkkOBL1XVEV3t59MMsvh2+/lRwCeB42guzX6VZpDFAuAamkEWPwEu4v6DLD5b\nVWe3gywur6oPT1PHvB1k0S9VcP31TdC74gq4+uomAK5Y0Uy2vHQp/MqvwEMeAvvt1ywPfnDzuv/+\nTftOOw36LCRJGj5DPQ9ekjOACWAxsBo4hWbQxd8D+wLraEa+ntCufzLwamA98MaqOq9tPx54P03Y\nO7Wq3t22H0Yz6GJv4DvAy9qBGL1qMeBtRz/7WRP0fvhDWL0abrnl/svNNzfLLrs0Qe8hD2l
 G9E6F\nwF7Lnns6cbMkaX4Y6oA3TAx4w6eqCYI/+cl9y6239l7WrIE77oB99mnC3r77wl57we67wx57NK9T\ny447wg47PHDZccf7lqnPO+/c9CJOLQ96kJeWJUmDZ8CbIQPe6Lv33iYQrlnThL516+D225vl5z+/\n7/299z5wueee+y/33gt33928v/vuZgLou+9uBprsuGMT9qbCYOf7XsFx0aImGD7oQfe9X7QIFi58\n4GvnsmBB789beu21384aupcddrj/61R9BllJGl4GvBky4GkmNmy4LwR2BsCpUNgrOG7Y0AxEWb/+\nvvcbNsDGjfe9dr/ftOm+952fO9s3berd3r2/DRvuX0Ov5d57m9epejdubILh1obS7kDaGT4XLGhC\nY+frdG2bW3oF4EWLHrhMhdbOHtnuEDv1OnUu3fVOve+urfv4Cxbc/7hTr4ZkSf1iwJshA550n6nA\n2BkMu0NjdyjtDqSd4XPqfVWzbNrUvHa3dbdPtXXuY3OBtjNATwXXzvB9zz0PDNpTr73q7T7+VG29\nAvjU8Tv3uWBB757enXduRpjvvvvmX6eWXj2vixZNH4C7e3+7w6f3qkqjz4A3QwY8SXNpKgx29/je\nc0/zeMA77oBf/KK5bWBzr7/4Re9e1w0bHhiCpwvA3eFzqsdxqney1zJl6n2vtl7fd+6ju4d2cz2+\n3b3CnT2r3b2svXqBp6tlJjVvbtvun1F3T/KWlul+vr1+Xr1+jpurbUvbbO4YM/1upj+vbr3at2bd\nLR13S+tOd44z+R+izv8Ge/Xq9/pvfCY/017bbAsD3gwZ8CTNB1OhcP36+3olu5fOdTtfp3vf/dq5\n36n3vXpdey3dty1032rQq7d3c7VsqebNbdt9Dp3Hnsm5dNbZ62fc63Nn+5Zq29w2mzvGTL+b6c+r\nW6/2rVl3S8fd0rrTnWOv/x6nfke9rkZM9ez36tXv9Tud7pi9aui0pf
 /Rmi50/+IX2xbwhmmiY0nS\nNursSZM0OL2C50xDd1UzNdi2MOBJkiTNsc6euUH8D5e34kqSJI0ZA54kSdKYMeBJkiSNGQOeJEnS\nmDHgSZIkjRkDniRJ0pgx4EmSJI0ZA54kSdKYMeBJkiSNGQOeJEnSmDHgSZIkjRkDniRJ0pgx4EmS\nJI0ZA54kSdKYMeBJkiSNGQOeJEnSmDHgSZIkjRkDniRJ0pgx4EmSJI0ZA54kSdKYMeBJkiSNGQOe\nJEnSmDHgSZIkjRkDniRJ0pgx4EmSJI0ZA54kSdKY6WvAS3JqktVJruho2zvJeUmuSXJukj07vvtA\nkhVJLktyZEf7K5Jc227z8o72o5Nc0X73d/08F0mSpFHR7x6804DndLW9FfhaVT0C+E/gZIAkJwAP\nr6qlwB8AH27b9wbeARwDHAec0hEKPwS8pqqWAcuSdB9LY2BycnLQJWgb+Psbbf7+Rpe/u/mtrwGv\nqi4A1nY1vwA4vX1/evt5qv0T7XbfAvZMsj9NQDyvqm6rqnXAecDxSQ4Adq+qi9rtPwG8sG8no4Hx\nH6nR5u9vtPn7G13+7ua3QdyDt19VrQaoqpuB/dr2JcCNHeutbNu622/qaF/ZY31JkqR5bZgGWaTH\n5+rRzhbaJUmS5rVU9TcTJXko8KWqemz7+SpgoqpWt5dZz6+qw5N8uH1/drve1cBTgae16/9h2/5h\n4Hzgv6a2bdtfDDy1qv5omjoMf5IkaWRUVa/OrBlZNJeFTCPcv7fti8Argfe0r1/oaH8dcHaSJwDr\n2hB4LvAX7cCKBcCzgLdW1bokP09yLHAx8HLgA9MVsS0/JEmSpFHS14CX5AxgAlic5AbgFODdwKeS\n/B5wA/C7AFV1TpLnJvkBcAfwqrZ9bZJ3AZfQXIJ9ZzvYAuC1wMeBnYBzquor/TwfSZKkUdD3S7SS\nJEnavoZpkEVfJDk+ydXtZMhvGXQ92rwkByX5z
 yRXJvlukje07dNOkK3hkmRBkkuTfLH9fGiSC9vf\n3ZlJtsetIZqFJHsm+VSSq5J8P8lx/u2NhiR/kuR77eT/n0yyg397w2uuHgSxOWMd8JIsAD5IM5fe\no4GTkjxysFVpCzYAb6qqRwG/Bryu/Z31nCBbQ+mNwJUdn98DvK/93a0DXj2QqjQT76e53eVw4HHA\n1fi3N/SSHAi8Hji6HdC4CDgJ//aG2TY/CGJLxjrgAccCK6rq+qpaD5zFfRMrawhV1c1VdVn7/hfA\nVcBBPHCCbCe1HkJJDgKeC3y0o/npwGfa96cDJ27vurRlSXYHnlJVpwFU1Yaqug3/9kbFQmDXtpdu\nZ2AVzSwU/u0NoTl6EMRmjXvAm27yZI2AJIcCRwIXAvt3TZD94MFVps34W+DNtHNSJlkMrK2qTe33\nK4EDB1SbNu9hwJokp7WX2P85yS74tzf0qmoV8D6agYs3AbcBl9LMRuHf3uiY6YMgph74sFnjHvCc\nDHlEJdkN+DTwxrYnz9/bkEvyG8Dqtgd26m+ve5ok8Hc5rBYBRwP/UFVH08xm8Fb8fQ29JHvR9PI8\nlCbE7Qqc0GNVf5ejaVZZZtwD3krgkI7PB9F0W2uItZcYPg38S1VNzZO4eqpLup0g+5ZB1adpPQl4\nfpIfAWfSXJr9O5rLCVP/1vg3OLxWAjdW1SXt58/QBD7/9obfM4EfVdXPqmoj8DngicBe/u2NlOn+\n1lYCB3esN6Pf5bgHvIuBX0ny0CQ7AC+mmVBZw+1jwJVV9f6OtqkJsgFewX0TZGtIVNXbquqQqnoY\nzd/af1bVy2iePPO77Wr+7oZUe2noxiTL2qZnAN/Hv71RcAPwhCQ7JQn3/e782xtu0z0IAh74IIiX\nA3Q+CGKLOx/3efCSHE8zMmwBcGpVvXvAJWkzkjwJ+DrwXZou6ALeBlwE/BvN/8XcAPxux4TXGjJJ\nngr8P1X1/CSH0Qxw2hv4
 DvCydtCThkySx9EMkHkQ8COaCecX4t/e0EtyCs3/WK2n+Tt7DU1Pj397\nQ6jzQRDAapoHQXwe+BQ9/taSfBA4nvZBEFV16RaPMe4BT5Ikab4Z90u0kiRJ844BT5IkacwY8CRJ\nksaMAU+SJGnMGPAkSZLGjAFPkiRpzBjwJM0rSW5vXx+a5KQ53vfJXZ8vmMv9S9JMGfAkzTdTk38e\nBrxkazbseOzTdN52vwNVPXlr9i9Jc8WAJ2m++kvgyUkuTfLGJAuSvDfJt5JcluT3oXkqR5KvJ/kC\ncGXb9rkkFyf5bpLXtG1/Cezc7u9f2rbbpw6W5K/a9S9P8qKOfZ+f5FNJrpraTpK21aJBFyBJA/JW\n2sepAbSBbl1VHdc+u/q/k5zXrnsU8OiquqH9/KqqWpdkJ+DiJJ+pqpOTvK6qju44RrX7/m3gsVV1\nRJL92m3+q13nSOBRwM3tMZ9YVd/o54lLGn/24ElS49nAy5N8B/gWsA+wtP3uoo5wB/C/k1wGXEjz\nvM+lbN6TgDMBquoWYBI4pmPfP6nmuZGXAYdu+6lImu/swZOkRoDXV9VX79eYPJXmAd+dn58OHFdV\n9yQ5H9ipYx/T7Xu6z/d0vN+I/y5LmgP24Emab6bC1e3A7h3t5wKvTbIIIMnSJLv02H5PYG0b7h4J\nPKHju3untu861teB/9He5/dg4CnARXNwLpLUk/+nKGm+mRpFewWwsb0k+/Gqen+SQ4FLkwS4BXhh\nj+2/Avxhku8D1wDf7Pjun4Erkny7qv7n1LGq6nNJngBcDmwC3lxVtyQ5fJraJGmbpLntQ5IkSePC\nS7SSJEljxoAnSZI0Zgx4kiRJY8aAJ0mSNGYMeJIkSWPGgCdJkjRmDHiSJEljxoAnSZI0Zv5/OadM\nQ71GEhAAAAAASUVORK5CYII=\n",
       "text/plain": [
-       "<matplotlib.figure.Figure at 0x1096211d0>"
+       "<matplotlib.figure.Figure at 0x107bc1ef0>"
       ]
      },
      "metadata": {},
@@ -212,8 +202,7 @@
    ],
    "source": [
     "# Plot training loss over time\n",
-    "losses = outputs.getDF(sqlContext, \"losses\")\n",
-    "xy = losses.sort(losses.ID).map(lambda r: (r[0], r[1])).collect()\n",
+    "xy = losses.toDF().sort(\"ID\").map(lambda r: (r[0], r[1])).collect()\n",
     "x, y = zip(*xy)\n",
     "plt.plot(x, y)\n",
     "plt.xlabel('Iteration')\n",
@@ -224,21 +213,21 @@
  ],
  "metadata": {
   "kernelspec": {
-   "display_name": "Python 2",
+   "display_name": "Python 3",
    "language": "python",
-   "name": "python2"
+   "name": "python3"
   },
   "language_info": {
    "codemirror_mode": {
     "name": "ipython",
-    "version": 2
+    "version": 3
    },
    "file_extension": ".py",
    "mimetype": "text/x-python",
    "name": "python",
    "nbconvert_exporter": "python",
-   "pygments_lexer": "ipython2",
-   "version": "2.7.12"
+   "pygments_lexer": "ipython3",
+   "version": "3.5.2"
   }
  },
  "nbformat": 4,