{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Barycenter of MNIST Digits" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [], "source": [ "\n", "from mmot import MMOTSolver\n", "\n", "import numpy as np \n", "import matplotlib.pyplot as plt \n", "import itertools" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Download and open the MNIST dataset" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "vscode": { "languageId": "markdown" } }, "outputs": [], "source": [ "import hashlib \n", "import os \n", "import requests \n", "import gzip\n", "\n", "#fetch data (adapted from https://github.com/geohot/ai-notebooks/blob/master/mnist_from_scratch.ipynb)\n", "path='./'\n", "def fetch(url):\n", " fp = os.path.join(path, hashlib.md5(url.encode('utf-8')).hexdigest())\n", " if os.path.isfile(fp):\n", " with open(fp, \"rb\") as f:\n", " data = f.read()\n", " else:\n", " with open(fp, \"wb\") as f:\n", " data = requests.get(url).content\n", " f.write(data)\n", " return np.frombuffer(gzip.decompress(data), dtype=np.uint8).copy()\n", "\n", "digits = fetch(\"http://yann.lecun.com/exdb/mnist/train-images-idx3-ubyte.gz\")[0x10:].reshape((-1, 28, 28))\n", "labels = fetch(\"http://yann.lecun.com/exdb/mnist/train-labels-idx1-ubyte.gz\")[8:]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot a few samples of the digit we're interested in" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "image/png": "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V9Y33XTT4hkPPPBAsafkueeeK/ZcddVVxZ4tttii4yzwTv/6r//adoSIiHj3u99d7Nlmm216kKTsAx/4QLFn/vz5lfWnn366eMYtt9xS7JkzZ05H9YiIj3/848WeqVOnFnugn82YMaOy/vDDD/coCd1w++23F3umTJlSWT/ssMOKZ3z3u9+tnYnRYdGiRcWexYsXV9Zvu+224hl1ekabgw46qLK+1lpr9SYIy8U7lQEAAAAAqM1SGQAAAACA2iyVAQAAAACozVIZAAAAAIDaLJUBAAAAAKjNUhkAAAAAgNoslQEAAAAAqM1SGQAAAACA2obaDkC1HXfcsdhz0UUXdXydDTbYoNhzxBFHVNbffPPN4hljxnT+5xi33HJLsefyyy/v+DpAc0qz7CMf+UjxjN///veV9XXWWad4xgMPPFDsacK3vvWtnlwH3unWW2+trD/yyCPFMzbaaKOOc6y00krFntVXX73j6/SL1157rdjzwQ9+sNjTxIz65S9/WeyZOnVqx9eBNpV+nz3mmGN6kmPChAnFnjPPPLOy/r3vfa94xp133lk702jx4osvVtavueaa4hn7779/sWe99darnYl23XzzzZX13/72t8UzbrjhhmLPf/zHf9TORH2XXHJJZf22224rnrHaaqs1FYeavFMZAAAAAIDaLJUBAAAAAKjNUhkAAAAAgNoslQEAAAAAqM1SGQAAAACA2iyVAQAAAACozVIZAAAAAIDahtoOQLWdd9652PPcc891fJ0xY8p/vrD66qt3fJ0mHHDAAcWeD3zgA8WeRx55pOMs++67b2X9Pe95T8fXgNHg1FNPLfYcccQRlfXf/e53TcXp2Ouvv952BEaptddeu6M6K2b27NnFngceeKDj66yyyirFnv3337/j60C/22effSrr++23X09y1Pkaavz48ZX1L3zhC8UzZs2aVVk/5JBDimfssssuxZ758+dX1hcsWFA8o188+OCDxZ4XXnih2LPeeus1EYce+NSnPlVZr3O/1un5y7/8y9qZluWLX/xiZX3dddctnjF16tSOczRh7ty5xZ7vfve7xZ577rmnsn7VVVcVz9h9992LPTTLO5UBAAAAAKjNUhkAAAAAgNoslQEAAAAAqM1SGQAAAACA2iyVAQAAAACozVIZAAAAAIDaLJUBAAAAAKjNUhkAAAAAgNqG2g5AtTFjynv/NddcswdJ+se8efOKPc8880wPkkRstNFGlfWhIbcY1PGJT3yi2HPttddW1j/72c8Wz5g9e3btTJ34+7//+2LPueee24MkQMnixYuLPccdd1xlfdasWU3FqfSnP/2p2DNp0qQeJIF2zZ8/v7I+c+bMHiXp3Pjx44s9xx9/fMfXueyyy4o9e+65Z2X9+uuv7zhHU971rndV1q+66qriGe973/uaikMf+NCHPlRZL/2aiYg47bTTij1bbbVV7UwjwYsvvlhZ/81vftOTHJtssklPrsPyKW4sU0o/SSk9nVK6e4nH1k4pXZ9Sum/42wndjQkAAAAAQD+o8/EXP42Iz7/jsaMj4rc55ykR8dvhHwMAAAAAMMIVl8o555sj4rl3PLxTRJw//P3zI+Jvmo0FAAAAAEA/WtG/qG/dnPMTERHD3757WY0ppf1TSnNTSnMXLFiwgpcDWDFmENAW8wdokxkEtMX8gdFhRZfKteWcz805T8s5T5s4cWK3LwfwP5hBQFvMH6BNZhDQFvMHRocVXSo/lVJaPyJi+Nunm4sEAAAAAEC/WtGl8pURsffw9/eOiCuaiQMAAAAAQD8rLpVTSj+PiNsi4n0ppcdSSt+IiFMi4nMppfsi4nPDPwYAAAAAYIQbKjXknPdYRmm7hrNARETceuutlfXTTz+9eMYrr7zSVJxKRx55ZE+uAyPdzTffXOyZPXt2ZX3OnDlNxenYdtv5LRL6xb333ltZP++884pnnHrqqR3nGDduXLHnsssuq6yvt956HeeAkWDmzJltR6ht0aJFlfU6X7fsuuuuHed49tlniz133XVXx9dpwpprrlnsufLKKyvr06dPbyoOA+LOO+9sO8LAef7554s9u+yyS2X9pptuaiTLPvvsU1mfOnVqI9ehWV3/i/oAAAAAABg5LJUBAAAAAKjNUhkAAAAAgNoslQEAAAAAqM1SGQAAAACA2iyVAQAAAACozVIZAAAAAIDahtoOwMhx8803F3sOP/zwYs8999xTWV+0aFHtTJ3YZpttij1jxvhzGViwYEGxZ/vtt6+s33333cUz3njjjdqZ2lb69wWa8fDDDxd7PvShD1XWFy9e3FScSnVeM0yaNKmynlJqKg7QgDpfl/zd3/1dZf3ss89uKs7AmDBhQmX917/+dfGMGTNmNBUHBtLrr79e7Lnzzjsr61/+8peLZzz55JO1M3XixBNPrKyvvPLKPcnB8rERAwAAAACgNktlAAAAAABqs1QGAAAAAKA2S2UAAAAAAGqzVAYAAAAAoDZLZQAAAAAAarNUBgAAAACgNktlAAAAAABqG2o7ANWef/75Ys+ll15a7LnmmmsaSFPtqquuKvaklLqeIyJirbXWKvZccMEFlfVPfvKTxTPGjRtXNxKMWA8++GCx5957762sv/HGG03F6Qs//OEPiz3HHXdcD5LAyPaLX/yi2LN48eIeJCl77bXXij0f+9jHKuuf/vSni2d85StfKfbsuOOOlfX111+/eAZQ774+++yze5BksFxyySWV9RkzZvQoCQyuH/zgB8Weo48+uvtBGnLggQdW1tdYY41GrvOJT3yisr7nnnsWz6izbxotvFMZAAAAAIDaLJUBAAAAAKjNUhkAAAAAgNoslQEAAAAAqM1SGQAAAACA2iyVAQAAAACozVIZAAAAAIDahtoOMNo98cQTlfVtt922eMb999/fUJqRY8cddyz27LDDDj1IAiPf9OnTiz0XXnhhZX2vvfYqnvHqq6/WztS2xx9/vO0IMCrstttuxZ677767sn7DDTcUz3jqqadqZ+qmG2+8sZGeb3/725X1k046qXjGwQcfXFlfbbXVimfAoBsaKn85/ZnPfKay/u///u9NxRkY++yzT2X997//ffGMSZMmNRUHBtIf//jHtiM06sorr+zJdX72s59V1kuvGyMizjzzzMr6mDGj5/27o+ffFAAAAACAjlkqAwAAAABQm6UyAAAAAAC1WSoDAAAAAFCbpTIAAAAAALVZKgMAAAAAUJulMgAAAAAAtVkqAwAAAABQ21DbAaiWc26kpxfefPPNYs+YMb35c4wLLrig2HPIIYdU1qdOndpQGuBv//ZvK+tTpkwpnvHiiy92nGPx4sXFnp133rmy/vzzz3ecA2jGpptuWuy58MILK+svvPBC8YzS/HnuueeKZ/z85z8v9vzTP/1TZb2p13yl12zHHHNM8Yw5c+ZU1n/1q18Vz0gpFXugn6266qrFnksuuaSyPn/+/KbiVPrsZz9b7Fm0aFEPkkQ8/vjjlfU68/LII49sKg4MpJNOOqnYc9RRR/UgSVmd10nnnHNOZf3b3/528YyHHnqo2LPXXnt1lCMi4tFHH62sX3HFFcUzerUb67biv0VK6ScppadTSncv8djxKaXHU0p3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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "desired_digit = 3\n", "inds = np.where(labels==desired_digit)[0]\n", "\n", "num_plot = 5\n", "fig,axs = plt.subplots(ncols=num_plot, sharey=True, figsize=(num_plot*5,5))\n", "for i in range(num_plot):\n", " axs[i].imshow(digits[inds[i],:,:],cmap='Greys')\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Extract digits with similar total measure" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "# Grid of size n1 x n2\n", "n1 = digits.shape[1] # x axis\n", "n2 = digits.shape[2] # y axis\n", "\n", "x, y = np.meshgrid(np.linspace(0.5/n1,1-0.5/n1,n1), np.linspace(0.5/n2,1-0.5/n1,n2))" ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [], "source": [ "unroll_node = 0\n", "\n", "num_digits = 10 \n", "sums = np.array([np.sum(digits[i,:,:]) for i in inds])\n", "\n", "val = np.sum(digits[inds[0],:,:])\n", "\n", "sorted_inds = inds[np.argsort(np.abs(sums-val))]\n", "measures = [digits[sorted_inds[i],:,:]* (n1*n2/np.sum(digits[sorted_inds[i],:,:])) for i in range(num_digits)]" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Define the edge list for the barycenter problem" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "\n", "edge_list = []\n", "for i in range(num_digits):\n", " for j in range(i+1,num_digits):\n", " edge_list += [[i,j]]\n", "\n", "weights = np.ones(num_digits)/num_digits\n", "prob = MMOTSolver(measures, edge_list, x, y, unroll_node, weights)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Solve the problem" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Iteration, StepSize, Cost, Error, Line Its\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 2 = 0\n", "next_root 3 = 0\n", "next_root 4 = 0\n", "next_root 5 = 0\n", "next_root 6 = 0\n", "next_root 7 = 0\n", "next_root 8 = 0\n", " 0, 0.0008, 1.2998e-04, 1.0349e+00, 8\n", "next_root 0 = 1\n", "next_root 0 = 2\n", "next_root 0 = 3\n", "next_root 0 = 4\n", "next_root 0 = 5\n", "next_root 0 = 6\n", "next_root 0 = 7\n", "next_root 0 = 8\n", "next_root 0 = 9\n", "next_root 1 = 9\n", "next_root 0 = 10\n", "next_root 1 = 10\n", " 10, 0.0012, 1.2499e-03, 1.5150e-01, 1\n", "next_root 0 = 11\n", "next_root 0 = 12\n", "next_root 0 = 13\n", "next_root 0 = 14\n", "next_root 0 = 15\n", "next_root 0 = 16\n", "next_root 0 = 17\n", "next_root 1 = 17\n", "next_root 2 = 17\n", "next_root 0 = 18\n", "next_root 0 = 19\n", "next_root 0 = 20\n", "next_root 1 = 20\n", " 20, 0.0009, 1.4826e-03, 4.6731e-02, 1\n", "next_root 0 = 21\n", "next_root 0 = 22\n", "next_root 0 = 23\n", "next_root 1 = 23\n", "next_root 0 = 24\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 1 = 26\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 0 = 29\n", "next_root 1 = 29\n", "next_root 0 = 30\n", " 30, 0.0007, 1.5566e-03, 4.0157e-02, 0\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 0 = 33\n", "next_root 0 = 34\n", "next_root 0 = 35\n", "next_root 0 = 36\n", "next_root 1 = 36\n", "next_root 0 = 37\n", "next_root 0 = 38\n", "next_root 0 = 39\n", "next_root 1 = 39\n", "next_root 0 = 40\n", " 40, 0.0006, 1.6275e-03, 4.0973e-02, 0\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", "next_root 0 = 43\n", "next_root 0 = 44\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 0 = 1\n", "next_root 0 = 2\n", "next_root 0 = 3\n", "next_root 1 = 3\n", "next_root 0 = 4\n", " 50, 0.0009, 1.7358e-03, 3.2187e-02, 0\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 0 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 0 = 8\n", "next_root 0 = 9\n", "next_root 0 = 10\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 0 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 0 = 14\n", " 60, 0.0003, 1.7963e-03, 2.8782e-02, 0\n", "next_root 0 = 15\n", "next_root 0 = 16\n", "next_root 0 = 17\n", "next_root 0 = 18\n", "next_root 0 = 19\n", "next_root 1 = 19\n", "next_root 0 = 20\n", "next_root 0 = 21\n", "next_root 0 = 22\n", "next_root 1 = 22\n", "next_root 0 = 23\n", "next_root 0 = 24\n", " 70, 0.0005, 1.8271e-03, 2.7783e-02, 0\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 1 = 26\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 0 = 29\n", "next_root 1 = 29\n", "next_root 0 = 30\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 0 = 33\n", "next_root 1 = 33\n", "next_root 0 = 34\n", " 80, 0.0002, 1.8805e-03, 2.8257e-02, 0\n", "next_root 0 = 35\n", "next_root 0 = 36\n", "next_root 0 = 37\n", "next_root 0 = 38\n", "next_root 1 = 38\n", "next_root 0 = 39\n", "next_root 0 = 40\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", "next_root 0 = 43\n", "next_root 0 = 44\n", " 90, 0.0003, 1.9226e-03, 2.9543e-02, 0\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 0 = 2\n", "next_root 0 = 3\n", "next_root 0 = 4\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 0 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 0 = 8\n", " 100, 0.0001, 1.9420e-03, 2.8192e-02, 0\n", "next_root 0 = 9\n", "next_root 0 = 10\n", "next_root 0 = 11\n", "next_root 0 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 0 = 14\n", "next_root 0 = 15\n", "next_root 0 = 16\n", "next_root 0 = 17\n", "next_root 1 = 17\n", "next_root 0 = 18\n", " 110, 0.0002, 1.9607e-03, 2.6876e-02, 0\n", "next_root 0 = 19\n", "next_root 0 = 20\n", "next_root 1 = 20\n", "next_root 0 = 21\n", "next_root 0 = 22\n", "next_root 0 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 1 = 28\n", " 120, 0.0001, 1.9792e-03, 2.6153e-02, 1\n", "next_root 0 = 29\n", "next_root 0 = 30\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 0 = 33\n", "next_root 1 = 33\n", "next_root 0 = 34\n", "next_root 0 = 35\n", "next_root 0 = 36\n", "next_root 0 = 37\n", "next_root 0 = 38\n", "next_root 1 = 38\n", " 130, 0.0001, 1.9903e-03, 2.7401e-02, 1\n", "next_root 0 = 39\n", "next_root 0 = 40\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", "next_root 0 = 43\n", "next_root 0 = 44\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 0 = 2\n", "next_root 1 = 2\n", " 140, 0.0000, 2.0004e-03, 2.7720e-02, 1\n", "next_root 0 = 3\n", "next_root 0 = 4\n", "next_root 0 = 5\n", "next_root 0 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 0 = 8\n", "next_root 0 = 9\n", "next_root 0 = 10\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 0 = 12\n", " 150, 0.0001, 2.0087e-03, 2.7586e-02, 0\n", "next_root 0 = 13\n", "next_root 0 = 14\n", "next_root 0 = 15\n", "next_root 1 = 15\n", "next_root 0 = 16\n", "next_root 0 = 17\n", "next_root 0 = 18\n", "next_root 0 = 19\n", "next_root 0 = 20\n", "next_root 1 = 20\n", "next_root 0 = 21\n", "next_root 0 = 22\n", " 160, 0.0001, 2.0155e-03, 2.7085e-02, 0\n", "next_root 0 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 1 = 28\n", "next_root 0 = 29\n", "next_root 0 = 30\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", " 170, 0.0001, 2.0205e-03, 2.7040e-02, 1\n", "next_root 0 = 33\n", "next_root 1 = 33\n", "next_root 0 = 34\n", "next_root 0 = 35\n", "next_root 0 = 36\n", "next_root 0 = 37\n", "next_root 1 = 37\n", "next_root 0 = 38\n", "next_root 0 = 39\n", "next_root 0 = 40\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", " 180, 0.0001, 2.0259e-03, 2.7703e-02, 1\n", "next_root 0 = 43\n", "next_root 0 = 44\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 0 = 2\n", "next_root 1 = 2\n", "next_root 0 = 3\n", "next_root 0 = 4\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 0 = 6\n", " 190, 0.0000, 2.0300e-03, 2.7548e-02, 0\n", "next_root 0 = 7\n", "next_root 0 = 8\n", "next_root 0 = 9\n", "next_root 0 = 10\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 0 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 0 = 14\n", "next_root 0 = 15\n", "next_root 0 = 16\n", " 200, 0.0000, 2.0350e-03, 2.7808e-02, 0\n", "next_root 0 = 17\n", "next_root 0 = 18\n", "next_root 0 = 19\n", "next_root 1 = 19\n", "next_root 0 = 20\n", "next_root 0 = 21\n", "next_root 0 = 22\n", "next_root 0 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 1 = 26\n", " 210, 0.0000, 2.0386e-03, 2.7053e-02, 1\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 0 = 29\n", "next_root 1 = 29\n", "next_root 0 = 30\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 0 = 33\n", "next_root 0 = 34\n", "next_root 0 = 35\n", "next_root 0 = 36\n", " 220, 0.0000, 2.0425e-03, 2.7091e-02, 0\n", "next_root 0 = 37\n", "next_root 1 = 37\n", "next_root 0 = 38\n", "next_root 0 = 39\n", "next_root 0 = 40\n", "next_root 1 = 40\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 0 = 43\n", "next_root 0 = 44\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", " 230, 0.0000, 2.0447e-03, 2.7168e-02, 1\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 2 = 1\n", "next_root 0 = 2\n", "next_root 1 = 2\n", "next_root 0 = 3\n", "next_root 1 = 3\n", "next_root 0 = 4\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 0 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 0 = 8\n", "next_root 0 = 9\n", "next_root 0 = 10\n", " 240, 0.0000, 2.0456e-03, 2.7954e-02, 0\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 0 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 0 = 14\n", "next_root 0 = 15\n", "next_root 1 = 15\n", "next_root 0 = 16\n", "next_root 0 = 17\n", "next_root 0 = 18\n", "next_root 0 = 19\n", "next_root 1 = 19\n", "next_root 0 = 20\n", " 250, 0.0000, 2.0472e-03, 2.7679e-02, 0\n", "next_root 0 = 21\n", "next_root 0 = 22\n", "next_root 0 = 23\n", "next_root 1 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 0 = 27\n", "next_root 0 = 28\n", "next_root 1 = 28\n", "next_root 0 = 29\n", "next_root 0 = 30\n", " 260, 0.0000, 2.0484e-03, 2.7547e-02, 0\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 0 = 33\n", "next_root 1 = 33\n", "next_root 0 = 34\n", "next_root 0 = 35\n", "next_root 1 = 35\n", "next_root 0 = 36\n", "next_root 0 = 37\n", "next_root 0 = 38\n", "next_root 1 = 38\n", "next_root 0 = 39\n", "next_root 0 = 40\n", " 270, 0.0000, 2.0494e-03, 2.7256e-02, 0\n", "next_root 0 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", "next_root 0 = 43\n", "next_root 0 = 44\n", "next_root 0 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 2 = 1\n", "next_root 0 = 2\n", "next_root 1 = 2\n", "next_root 2 = 2\n", "next_root 0 = 3\n", "next_root 1 = 3\n", "next_root 0 = 4\n", "next_root 1 = 4\n", " 280, 0.0000, 2.0503e-03, 2.7424e-02, 1\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 2 = 5\n", "next_root 0 = 6\n", "next_root 1 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 2 = 7\n", "next_root 0 = 8\n", "next_root 1 = 8\n", "next_root 0 = 9\n", "next_root 1 = 9\n", "next_root 0 = 10\n", "next_root 1 = 10\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 0 = 12\n", "next_root 1 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 0 = 14\n", "next_root 1 = 14\n", " 290, 0.0000, 2.0511e-03, 2.7508e-02, 1\n", "next_root 0 = 15\n", "next_root 1 = 15\n", "next_root 0 = 16\n", "next_root 1 = 16\n", "next_root 0 = 17\n", "next_root 1 = 17\n", "next_root 0 = 18\n", "next_root 1 = 18\n", "next_root 0 = 19\n", "next_root 1 = 19\n", "next_root 0 = 20\n", "next_root 1 = 20\n", "next_root 0 = 21\n", "next_root 1 = 21\n", "next_root 0 = 22\n", "next_root 1 = 22\n", "next_root 0 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", " 300, 0.0000, 2.0520e-03, 2.7258e-02, 1\n", "next_root 0 = 25\n", "next_root 0 = 26\n", "next_root 1 = 26\n", "next_root 0 = 27\n", "next_root 1 = 27\n", "next_root 0 = 28\n", "next_root 1 = 28\n", "next_root 0 = 29\n", "next_root 1 = 29\n", "next_root 0 = 30\n", "next_root 1 = 30\n", "next_root 0 = 31\n", "next_root 0 = 32\n", "next_root 1 = 32\n", "next_root 2 = 32\n", "next_root 0 = 33\n", "next_root 1 = 33\n", "next_root 2 = 33\n", "next_root 0 = 34\n", "next_root 1 = 34\n", " 310, 0.0000, 2.0527e-03, 2.7769e-02, 1\n", "next_root 0 = 35\n", "next_root 1 = 35\n", "next_root 0 = 36\n", "next_root 1 = 36\n", "next_root 0 = 37\n", "next_root 1 = 37\n", "next_root 0 = 38\n", "next_root 1 = 38\n", "next_root 0 = 39\n", "next_root 1 = 39\n", "next_root 0 = 40\n", "next_root 1 = 40\n", "next_root 0 = 41\n", "next_root 1 = 41\n", "next_root 0 = 42\n", "next_root 1 = 42\n", "next_root 0 = 43\n", "next_root 1 = 43\n", "next_root 0 = 44\n", "next_root 1 = 44\n", " 320, 0.0000, 2.0535e-03, 2.7419e-02, 1\n", "next_root 0 = 45\n", "next_root 1 = 45\n", "next_root 0 = 0\n", "next_root 1 = 0\n", "next_root 2 = 0\n", "next_root 0 = 1\n", "next_root 1 = 1\n", "next_root 2 = 1\n", "next_root 0 = 2\n", "next_root 1 = 2\n", "next_root 2 = 2\n", "next_root 3 = 2\n", "next_root 0 = 3\n", "next_root 1 = 3\n", "next_root 2 = 3\n", "next_root 0 = 4\n", "next_root 1 = 4\n", "next_root 2 = 4\n", "next_root 0 = 5\n", "next_root 1 = 5\n", "next_root 2 = 5\n", "next_root 3 = 5\n", "next_root 0 = 6\n", "next_root 1 = 6\n", "next_root 2 = 6\n", "next_root 0 = 7\n", "next_root 1 = 7\n", "next_root 2 = 7\n", "next_root 3 = 7\n", "next_root 0 = 8\n", "next_root 1 = 8\n", "next_root 2 = 8\n", " 330, 0.0000, 2.0539e-03, 2.7790e-02, 2\n", "next_root 0 = 9\n", "next_root 1 = 9\n", "next_root 2 = 9\n", "next_root 0 = 10\n", "next_root 1 = 10\n", "next_root 2 = 10\n", "next_root 0 = 11\n", "next_root 1 = 11\n", "next_root 2 = 11\n", "next_root 0 = 12\n", "next_root 1 = 12\n", "next_root 2 = 12\n", "next_root 0 = 13\n", "next_root 1 = 13\n", "next_root 2 = 13\n", "next_root 0 = 14\n", "next_root 1 = 14\n", "next_root 2 = 14\n", "next_root 0 = 15\n", "next_root 1 = 15\n", "next_root 2 = 15\n", "next_root 0 = 16\n", "next_root 1 = 16\n", "next_root 2 = 16\n", "next_root 0 = 17\n", "next_root 1 = 17\n", "next_root 2 = 17\n", "next_root 0 = 18\n", "next_root 1 = 18\n", "next_root 2 = 18\n", " 340, 0.0000, 2.0544e-03, 2.7167e-02, 2\n", "next_root 0 = 19\n", "next_root 1 = 19\n", "next_root 2 = 19\n", "next_root 0 = 20\n", "next_root 1 = 20\n", "next_root 2 = 20\n", "next_root 0 = 21\n", "next_root 1 = 21\n", "next_root 2 = 21\n", "next_root 0 = 22\n", "next_root 1 = 22\n", "next_root 2 = 22\n", "next_root 0 = 23\n", "next_root 1 = 23\n", "next_root 2 = 23\n", "next_root 0 = 24\n", "next_root 1 = 24\n", "next_root 2 = 24\n", "next_root 0 = 25\n", "next_root 1 = 25\n", " 347, 0.0000, 2.0548e-03, 2.7386e-02, 1\n", "Terminating due to small change in objective.\n" ] } ], "source": [ "res = prob.Solve(max_its=10000, step_size=0.2, ftol_abs=1e-9, gtol_abs=1e-3)\n" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAA7UAAAEWCAYAAAC5TrBcAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjUuMSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/YYfK9AAAACXBIWXMAAAsTAAALEwEAmpwYAAB7h0lEQVR4nO3dd5hkVZ3/8fe3qro6d0/qyTPMwAxDlDQkFUEBBRQxCyYwjewad/WnmHZdw8quu7roqojKKqIiBhQQCaJIkAEGGGACA5OnJ/ZM93QOFc7vj3ururq6qrs6VlXX5/U89XTVDeeeW12n6n7vSeacQ0RERERERKQYBfKdAREREREREZHRUlArIiIiIiIiRUtBrYiIiIiIiBQtBbUiIiIiIiJStBTUioiIiIiISNFSUCsiIiIiIiJFS0FtCTOzL5nZzWNMY7uZXZBl3Tlmtmks6U9muiITyczOM7PGfOdjvJjZP5jZfjPrMLOZecrDEjNzZhbyX//JzK7MR16k8Ezgb1CDmW0ys4oct5/QspL+3WJm683svPE+Tr6ll/cM6z9mZtdOdr5K3VS/JjOzq8zs4XznYyT875oj852PyaagtoD5AWO3mbWb2WEz+7uZXW1mk/J/M7NpZvZ9M9tnZl1m9pyZvTfX/Z1zDznnVoxDPpyZLRvvdKU4mdnL/bLQambNZvaImZ2e73yNlf85fy61fJvZV83sJ3nMVkZmVgZ8E3i1c67GOXcowzZhM/sX/+K/08x2+0HnqycqX865i51zPx1rOsV4EZNPQ5XJiX4vzex4M7vXzFr838knzewSmNDfimuA/3PO9eSQvwFlBThxom9uOeeOd849MJHHKFA3AO8ys9n5zshUlK0SYyKvyczsMjNba2ZtZnbQzO43syUTcazxkvo+TcZviZk9YGYfSF3m/y5vncjjFiIFtYXvUudcLXAEcC3wGeDHE31QMwsDf/aPezZQD/w/4Foz++eJPr5IJmZWB9wJfAeYASwA/g3ozUNeghOQ7Hzg8rEmkq0mYxzNASqA9UNs8xvgMuA9wHRgKXAd8NpMG09CnmUCFECZvAO4D+8zORv4GNA2UQczs3LgSiDXVk65lJWRHH9Kl5OxnJ9/k+FPeN85UuT8yoybgE/iXYMuBb4HxCfgWBPxez5mU728jzvnnB4F+gC2AxekLTsDr0Cf4L9+APhAyvqrgIdTXl8H7ML7kX8SOCdl3ZeAm7Mc+/3AAaA6bfnbgQ6gLiWPnwU2AC3A/wEV/rrzgMaUfecDvwWagG3Ax1LWBYHPAVuAdj+vi4AHAQd0+sd9e2q6eHfMf5OWx+uAb/vP6/FuAuwFdgNfBYL5/t/qMeoysRI4PMT6IPBfwEFgK/Bh//MTSvm8XpCy/YAyAPwa2Ae0+p+941PW/QT4PnCX/3m8YJjPdKW/T4tfPv5fannIkHeHd9PqxZT8fhX4Sco2r8e7OD6MV/aPTVm33d//WbyAYpmf5nvxvgNagKuB0/1tDgP/O0R+yoH/Afb4j//xlx3tn7/zy+RfMux7AdANLBzm/5me55BfphPfAxuAN47g//sAA78P3wds9M/9HuCItPf7av/9bgG+CxhwLNADxPzzy/p502PoMpntvfQ/R/8F7AT2A9cDlf6684BGvN+Dg/5n5J1Z0p/l/x+nZVl/Hv2/FYnfrsSjF3hguPxkSPMVwOa0Ze/1P2ft/ufyQ/7y9LLyV79cxFPyMR+vgiHxuT8E3ArM8NNY4u//fj9/Dw51ninl6gL/+Zf89G7y87ceWJmybdbvsAzHuQSvTLbj/Z5+KmXd64C1eN8rfwdekrJuqDJ9FfAI8C2gGe87rxL4b2AH3nfxw/6yxHtxpf9eHAQ+n5bHdwJ/zXe5mIoPMlyTDvH5+xTe93or8Cv868LhPitp6b4FWDtEfrKWG3/9SH/PFwG/88vCIfzfR/8z+jDed0SLX04uHu59Ymzff5/x8/4zvJvCd/r5avGfL/S3/5qffo9/jESeHbDMf16PV/6b/DL1BSCQy7n567fild1tZPkuLpRH3jOgxxD/nOxfIDuBf/CfP8DQQe27gJl4F4uf9AtJIuj8EtmD2luAn2ZYHgKiwGtS8rjO/zKYgffj9FV/3Xn0X1AE8ALVfwHCwJF+QUmk8/+A54AVeBeWJwEz/XXJwpkh3SOALvqD7CBeAHuW//r3wA+Aary7+I/jX3DoUXwPoA7vx+anwMXA9LT1VwPPp3we/8rIgtr3AbX0B3RrU9b9BO/H8WX+57lqmM/0tcBDfj4W+eVkuKB2uZ/mB/xlyaCW/gvkC4Ey4NPAZiCccm5r/WOlXgBej1dT9Gq8H77f+2VhAd6Nq3Oz5OfLwGp/2wa8i4+v+OsSaYey7HstfsAwzP9zQJ79ZW+l/0L/7f45z8vx//tAynv3Bv/9ORbve+sLwN/T3u87gWnAYrwf/Iv8dVeR8j2qx5jK5KD3Eq9s3e7/D2vxalu/7q87D+835pt45fBc/zOwIsOxDe+mxJ3+/3tO2vrzyFDm/DxvpD/4zJqfDPt+GPhj2rLXAkf5+TkX7zfp1ExlJVOegE/glbWF/jn/APhl2v434f2ODQq209NkcFDbgxeQBoGvA6v9dUP+Lmc4zl78G+N4F9qJczwV77vkTP8YV/p5KM+hTF/l/78/ildOK/FuMD2A9x0VBF7qvy+J9+KH/nYn4d2cSL25dyrQnO9yMRUfjCyofdz/n8/AK2tX5/JZSUv3SP+z+y3glUBNruXGXz+S3/Nq4Bn/WNV4v5kvT/mMRoAP+nn+B7wbvTbc+8Tov//+w893Jd41/Jvxrjlq8YL136ek9wApcYC/LDWovQn4g7/vEuAF4P3DnZv/PrThf/cC80i5MVCIj7xnQI8h/jnZv0BW49+dTP8wZypAafu2ACf5z79E9qD2z8C1Wdbtw79b4+fx6pR1lwBb/Ofn0R98ngnsTEvns3j9kgA2AZdlOV7WoNZ//TDwHv/5hSnHn4P3g1eZsu0V6C5uUT/wgpSf4N3NjPo/DnP8dX9J+zy+mhEEtWnHmebvW++//glwU8r64T7TW/GDJP/1KoYPapf5ZWgn3g9aalD7ReDWlO0DeLUl56Wc2/tS1i/x01yQsuwQ8PaU178FPpElP1uAS1JevwbYnpZ2tqD2R8AtKa9n4N2VbwV6UpYPyHOWtNYmvhty+P8+QH9Q+yf8H+6U96sLv7bW3+/lKetvBa7xn1+FgtrxKpMD3ku8i6VO4KiUZWcD2/zn5/lpVKesvxX4YpZjLwT+1/+8xvFqZJanpJUeQAbwguDv55KfDMf7fOpnO8s2vwc+7j8fUFay5GkjcH7K63l4F5qhlP2PHOJ4A9JkcFD755R1xwHd/vMhv8MyHGcn8CH8m8gpy7+Pf8MrZdkmst8wW0t/mb4qNQ/+/6cb/zolbb/Ee7EwZdnjwOUpr5cDsXyXian4YGRB7btSXv8ncP0oPytn+eW/CS/A/Ql+cDtUucmQzjSG/j0/2z9Gpn2vIqV1Bl5w6YC5w71PjO77r4+Umu0M6Z8MtKS8foAsQS1eoNoLHJey7kP0t1LJem54Qe1hvIA6Y8uVQnuoT21xWoDXTGdYZvZJM9voD+BxGK8Zwqwcdj2I9wWRnl7I3/9gyuJdKc934N2dS3cEMN8fyOOwn5fP4QWe4NW8bMkhX5n8Ai9YBXiH/zpxzDJgb8oxf4BX8yRFyjm30Tl3lXNuIXAC3uftf/zV8xn8ecyJmQXN7Foz22JmbXg/TDCwvKSmPdxnelR5cc7dhXfxuCpt1fzUNJxzcT/9BVnyl7A/5Xl3htc1WbIy4HhkL9uZHCLl+8M51+ycmwachhespxqQZzN7jz8wSOI9PYH+/8FI3tMjgOtS0mnGu6BIfb/2pTzvIvt7IUMYpkyma8Bv5ZDyv7nbX57Q4pzrTHmd9bPnnGt0zn3EOXcU3v+8E69mIpuv4dVYfGwE+UnV4u+fZGYXm9lqf5Csw3g3pnL5nU04Argt5fgb8ZoUzknZJlPZzlX657zC/y0f7jss3Zvxzm2Hmf3NzM5Oyf8n09JZhP8/G6ZMp5/bLLxasqGuB4Yqt7V4N88kv7L9j4b8rKRzzq12zr3NOdcAnIPX/P/zKWllLDej+D1fBOxwzkWHOx/nXJf/dDS/F7l83zS5lEHozKzKzH5gZjv8c3kQmJZjP+BZeK0w0n/LM/4Opp6b/x38drwWUnvN7I9mdkyuJ5oPCmqLjD+i5AK82knwfsCrUjaZm7LtOXjt8t+G1yRsGt6XveVwqD8DF5tZddryN+Pd9VmdsmxRyvPFeE0X0u3CuxM1LeVR65y7JGX9UTnkK5NfA+eZ2ULgjfQHtbv8vM5KOWadc+74UR5HCoxz7nm8O64n+Iv2MvjzmCprecG7IXIZXl+YerxaARhYXlzK8+E+08PlZShfwPvhTs3rHrwfcS9TZuanvztL/sZqwPHIXrYzuR843S+Tw0nm2cyOwGta+BG87gfT8JptJ/4HI3lPd+E1L039/1Q65/4+kjzJyGQok+nv5UG8mynHp/xf6p03MnDC9LTfnpw+e865XXhNV0/ItN7MLse7AfoW51xkBPlJ9SxeV4BEmuV4LR7+C692ehpeP71sv7OZPlu78PqxpX5WK5xzE1W2U4871HfYwIw794Rz7jK8G8O/x6tBS6TztbR0qpxzv8yhTKef20G8GrnRXg8ci9eMVApT1s/KcDs6557A6/OaKN9DlZvR/J4vnoCBmUbz/Ze+zyfxuuad6Zyrwwvsof9chvpuOIhXe53+W7478+ZpmXfuHufchXg3qZ/HK8sFS0FtkTCzOjN7HV5f15udc8/5q9YCb/Lv5CzDG0wioRavGVcTEDKzf8HrS5SLn+E1Jfu1eXPDlZnZa4BvA19yzqXeCf2wmS00sxl4d3l/lSG9x4E2M/uMmVX6d9FOsP6pWH4EfMXMlpvnJdY/n99+vL4VGTnnmvCaX/wf3g/0Rn/5XuBe4L/99y9gZkeZ2bk5vgdSYMzsGL/1wUL/9SK8i9TETZZbgY/5n8fpeINIpFoLXO5/nlfiDUSRUIt3E+QQXjD578NkZ7jP9K3AZ81sup/fj+Z6ns6bjuM5vP5GCbcCrzWz882bJuSTfn5zCdJG45fAF8ybk3MWXr+7nEZ8dc7di9ff9fdmdqZ50/uU4TUlG0o13g90E4B5U4ilBijD/X9TXY/3/h/vp1VvZm/NJf943zkLzRsFXoaQQ5kc8F76LQx+CHzL/KlXzGyB//uS6t/8z805eAPL/DrDsaeb2b+Z2TL/+30WXj+61Rm2PQVvhOY3+L8ZjDA/CY/j1ZIkajrCeK0PmoComV2M1yw+m/3ATDOrT1l2PfA1PwBMzIN72RBpjJfhvsOS/P/FO82s3r8h0IZXKwbe+3e1X9bNzKrN7LVmVsvwZXoA//9xI/BNM5vv5+ls/+ZBLs7F63ogE6PMzCpSHiMNAof6rAxg3lRhH0wpl8fgDZaYKN9DlZvR/J7vxZvho9o/t5eN8NwyGe33X6pavED4sH+d/a8ZjpHxGtk5F8P73fyamdX679U/k8NvuZnNMbPXm3eDsRdvIKrYMLvllYLawneHmbXj3UX6PN7gGalzxX4Lr/39fryBOn6esu4evC/3F/CaG/SQYxMm51wv3h2uXcBjeD9g38Try/uNtM1/gRc8bvUfX82QXgy4FK8vwDa8u0c/wruDhp/2rX46bXgjFlf6674E/NS8phpvy5LlX/j5/UXa8vfgXXQkRmf+DRmaVUvRaMfrB/aYmXXi/bitwwvwwPuxuAfvTv1TeHd1U30RrwagBW/akdTPy0145WQ33udl0IVxqhw+0//mp7cN73P9s5GcKF5t7YyU423CG/jtO/6xLsWb8qtvhOnm6qvAGryaqefw3s9BZXsIb8Lru3gzXr+cbXgjk16UbQfn3Aa8UU8fxftOOxFv8LmE4f6/qWndhjfYxi3mNdlahzeQUS7+gjdK7D4zOzjcxiVuuDKZ6b38DN4gXqv9/82f8WoiEvbhldE9eL9pV/s1wOn68Gpg/oz3u7EO7+LrqgzbXoY3uNHDZtbhPxLBz3D5SfLL20/wyiLOuXa8psy3+nl+B16f4oz88/glsNX/TZuPN2L/7cC9/u/9arz3dELl8B2W7t3Adv89upr+92AN3kAz/4v3HmzG/x/kUKYz+RTed84TeN0G/oMcrlfNrAKvefSY56qWrO7CC7ASjy+NZOehPisZHMYLYp8zsw68Zrq34fXRhaHLzWh/z5fhdf9pxGt6O1aj+f5L9z9418MH8c7j7rT11wFvMW+u7m9n2P+jeK3UtuK18vwF3o2j4QTwvsf34JXDc4F/zGG/vDHn1MpKJoaZvQr4kXMuay2ryEQyb5L2bUDZEH1lRKRAmNl5eK2Rcmm6nhdm1oA3svkpzrnufOdHPGb2UWCRc+7T+c6LiEw+TeorE+kEvIBCRERkSvCbLxf0gCmlyDn3nXznQUTyR0GtTAgzuw6v2ciVw20rIiIiIiIyWmp+LCIiIiIiIkVLA0WJiIiIiIhI0ZoSzY9nzZrllixZku9siOTVk08+edCfoLzgqIyKqIyKFDqVUZHCNlQZnRJB7ZIlS1izZk2+syGSV2a2I995yEZlVERlVKTQqYyKFLahyqiaH4uIiJQoM7vUzG5obW3Nd1ZERERGTUGtiIhIiXLO3eGcW1VfX5/vrIiIiIyagloREREREREpWgpqRUREREREpGgpqBUREREREZGipaBWRERERGQSmdk/mdl6M1tnZr80s4p850mkmCmoFRERERGZJGa2APgYsNI5dwIQBC7Pb65EituUmKdWZKI554g7iMTixOKOaNx5f2Px/uc5vI7F40RiQ7z2t+9P3xF3Duccr33JfFbMrc33W4GZVQPfA/qAB5xzPx9rmr9/ejftvVHefdYRY86fiIy/m1fvoLo8yBtPWZjvrIhMFSGg0swiQBWwZyyJ3fDgFo6YWc1rjp87LpkTKTYKaqUgRWJxDndFaOnqo7mzj8NdfRzuitDRG6WzN0ZfLEZfdGBAGE0POONxorGhXg/eJz1oTX2dT2Zw9NzaCQtqzexG4HXAAf+ucWL5RcB1eHeRf+ScuxZ4E/Ab59wdZvYrYMxB7Z3P7mFva4+CWpFJZmaXApcuW7ZsyO1+9cQuZtWEFdSKjAPn3G4z+y9gJ9AN3Oucuzd9OzNbBawCWLx48ZBp3vjwds49ukFBrZQsBbUyoZxz9ETitPVEaOuO0OIHqi2dfTQn/nb6y5Kv+2jriQ6ZbjBghIMBQkGjLBggGDBCASMYGPw6FAwkn4dDAapSXofS1nuvjVAgexqZ9xn+9VB5HPA6aJT5xw8GjICBmU30v+onwP8CNyUWmFkQ+C5wIdAIPGFmtwMLgef8zWLjcfBgwIjG8nvjQKQUOefuAO5YuXLlB4fazgxUQkXGh5lNBy4DlgKHgV+b2bucczenbuecuwG4AWDlypXDFkGnUiolLKegNkttTep689dfAnQBVznnnhpqXzP7BnApXhPGLcB7nXOH/XWfBd6Pd8H8MefcPWM7TRlvsbhjf1sPB9p7ae2OsPlABzsOdXKos4/mjr5kDWtLVx+RIYKVyrIgM6rDTKsqY0Z1mEXTq5hRHWZ6VZgZ1WVM959Pr/K2qakIUVUWJBRUd/Dx5Jx70MyWpC0+A9jsnNsKYGa34P0IN+IFtmsZol/+SO4wh4IBovH4KHMvIhPNAKfrZZHxcgGwzTnXBGBmvwNeCtw85F5DMFMZldI2bFCbrbbGObchZbOLgeX+40zg+8CZw+x7H/BZ51zUzP4D+CzwGTM7Dq+z/PHAfODPZna0c25caoQkNx29Ufa1drPncA+7D3ezu6WbPYe7afSf72vrIZbWJLeuIsSs2nJmVIVZPKOKkxdNY1pVmPrKMuory6irDFFX4QWvicC1MhzM0xlKDhYAu1JeN+KV728D/2tmrwXuyLbzSO4whwKW9ybeIpKdmakOSGT87ATOMrMqvObH5wNrxpLghLfnEilwudTUZqutSQ1qLwNucs45YLWZTTOzecCSbPum9R1YDbwlJa1bnHO9wDYz2+zn4dFRnqMMoa0nwvN729m0r43W7gi7D3fz1I7DvHCgfcAdv4DB3LoKFkyv5PQl05k/rZIF0yuZU1tBXWUZRzVUM7OmPH8nIhMh02+kc851Au8dzwOFAgE1PxYpYF4tkMqoyHhwzj1mZr8BngKiwNP4N4HHlO5YExApYrkEtdlqa4bbZkGO+wK8D/hVSlqrM6QlY+CcY/uhLl7c387Gve1s2NvKhr1t7GruHrBdXUWIU4+YzmtfMo8jZlYxr76S+dMqmFtXoSa/pacRWJTyeiFjHJ0xG6+mVs2PRQqVmh+LjC/n3L8C/zpe6ZmZyqiUtFyC2oy1NTluM+y+ZvZ5vLtUiRFUczneiPrrlaJILM4zuw7z/L52XtzfzkMvHmTrwU7Au+O+dGY1L1k4jctPX8xx8+o4Zl4tM6rDhIOByRiUSIrDE8ByM1sK7MbrFvCOiThQKGiDmrOLSOHwmh+rjIqISGHKJajNpbYm2zbhofY1syvxphE53/W3a8qpdmikI8KVAucc63a38b0HNnP/xgP0xbyar9qKEMfOreN9L1/K8fPrOHpOLdXlGvha+pnZL4HzgFlm1gj8q3Pux2b2EeAevIHebnTOrZ+I44cCNuSAYiKSX6qpFSl8uvEkpSyXyCaX2prbgY/4fWbPBFqdc3vNrCnbvv6oyJ8BznXOdaWl9Qsz+ybeQFHLgcdHe4KlYGtTB7c9vZs/rN3DzuYuQgHjijMW87JlM1kxt44lM6tU+ypDcs5dkWX5XcBdo0031zkwQ8GAampFCphGVhUpbGaoU62UtGGDWn904kG1NWZ2tb/+eryL3kuAzXhT+rx3qH39pP8XKAfu8wOu1c65q/20b8UbiCoKfFgjHw8UjzvWNh7m75sPcueze3l+XzsBg5ctm8VHXrWM84+ZrUGbpCDkOgemV1OrPrUihcpQ82ORQqa6Cyl1ObVBzVRb4weziecO+HCu+/rLs1bdOOe+Bnwtl7yVknjc8fj2Zr50+3qe39cOwEkL6/nUq4/mbSsXMbuuIs85FBkd9akVKXCqqRUpeCqiUsrUsbLAPbb1EDc8uJUdzV3sPdxNZ1+MuXUV/NdbT+IVR89idq0CWSl+wUCAaNzhnFNTeZECFDDQfSeRwmWYpt2SkqagtoDd8vhOvvD7dcyqKeekRfW8fNksXrKwnlcfP5caDfQkU0hZwAtkY3FHKKigVmSszOxI4PNAvXPuLcNtP2x6GM6pi4BIodL9YCl1iowK1F+fP8Bnb3uOc5Y38L/vOIW6irJ8Z0lkwgT9QDYad4SCec6MSJ6Z2Y14MwMccM6dkLL8IuA6vDEqfuScuzZbGs65rcD7zew345MnNT8WKXQqolLKFNQWmM7eKP997wv839+3sXx2Dd9/56mafkeKVq6jH5cFAoAX1IoIP8EbTPGmxAIzCwLfBS7Em/ruCTO7HS/A/Xra/u9zzh0YzwyZ6YJZpJBp2i0pdYqWCshfNx3gC7etY/fhbt511mI+d8mxVIX1L5Lilevox0G/+XFUIyCL4Jx70MyWpC0+A9js18DiT6F3mXPu63i1uiNmZquAVQCLFy8eelv11xMpaBqPQkpdIN8ZEM/d6/bxvp88QWU4yG+uPpuvvuFEBbRSMspSmh+LSEYLgF0prxv9ZRmZ2Uwzux44xcw+m2kb59wNzrmVzrmVDQ0NQx5cNbUihU9lVEqZoqYC8NsnG/m3O9Zz4oJ6bv3Q2VSUqVOhlJZgovlxTD/JIllkqobJWmCcc4eAq4dNNMcuAl6aw24iInniNT9WIZXSpZraPLt59Q4++etnOGp2Dd++/BQFtFKSQsmaWjU/FsmiEViU8nohsGesiTrn7nDOraqvrx9yOzNTLZBIIVPrYylxqqnNk0gszrV/ep7/e2Qbr1zRwI+uPD3Zr1Ck1ISSfWp12SySxRPAcjNbCuwGLgfeMVkHD5hqgUQKnUqolDLV1ObJv96+nh8/vI03nbqQ777zVAW0UtJCQY1+LJJgZr8EHgVWmFmjmb3fORcFPgLcA2wEbnXOrR+HY11qZje0trYOvR1qfixSyAwU1UpJU03tJIvE4vzr7ev5xWM7ufrco7jm4mPynSWRCZNrf71kTa2aH4vgnLsiy/K7gLvG+Vg5jVDuNT/WFbNIodLox1LqVFM7iXoiMb74+3X84rGdvHJFA5969dH5zpLIhMq1v56aH4sUNtXUiowfM1thZmtTHm1m9omxpqsbT1LKVFM7CfYc7uaPz+7l/x7Zxp7WHq48+wj+7bIT8p0tkYIR0pQ+InmRa2sKMwW1IuPFObcJOBnAzIJ4/eRvG0uauvEkpU5B7QT703N7+fzv19Hc2cfx8+v40uuP54Jj5+Q7WyIFJeRP6RNT82ORSZVr82PQ6MciE+R8YItzbsdYElHrYyl1Cmon0LONh/n4LWtZOquan73/DI6fP3QTTJFSlWh+HFHzY5GCZBr9WGSiXA78MtMKM1sFrAJYvHjxsAmpiEopU5/aCXK4q49/uPkpZtWEuWXVWQpoRYaQHP1YQa3IpBrJ6MciMr7MLAy8Hvh1pvXOuRuccyudcysbGhqGTgsN5ialTUHtBOiNxvjIL57mQHsP333nqUyvDuc7SyIFLajRj0XyItfB3MwgrmogkfF2MfCUc27/WBNS82MpdWp+PM4isTgf/vnTPLz5IN94y0s4ZfH0fGdJpOCVBTX6sUghC5ipaaPI+LuCLE2PR0NlVEqZamrHUSzu+KdfreXPG/fzlcuO560rF+U7SyJFoaIsCEBPNJbnnIhIJmaoYaPIODKzKuBC4HfjlabKqJQyBbXjpLGliytuWM2dz+7lsxcfw7vPXpLvLInkXa799WrKvUYjHT3RyciWiPhy71NrGihKZBw557qcczOdc0MXPhHJiYLacfLxW9aybk8rX7r0OD507lH5zo5IQci1v15NhR/U9iqoFZlMuZZRVFMrUtBMXQSkxCmoHQc//ft2ntzRwj9feDRXvWxpvrMjUnSqw15Q26aaWpGCZKCoVqSAeSNTqJBK6VJQO0aRWJz/vncTR86q5u2nqw+tyGgEA0ZNeUjNj0UKlJnpcllERAqWgtoxemTzQdp6onzm4mOorSjLd3ZEilZNeYiO3ki+syEiGRioT61IATPT6MdS2hTUjtHNq3cyszrMeSuGnhRbRIZWUxFSn1qRSZbzQFEGcV0wixQsjVAupU5B7Rjsau7i/uf3c8UZiykPBfOdHZGiVlMeol3Nj0UmVa4DRQXMcLpkFhGRAqWgdgwe2HQA5+Atpy3Md1ZEil5thYJakULlNT/Ody5EJBtNuyWlTkHtGKzZ0cKcunKOmFmV76yIFL3qcIhONT8WKUzqrydS0MzynQOR/FJQO0oH2nq4b8N+XrZsFqZvEpGMcu2vB1AZDtITjU1CrkRkpAz9zokUOt13klKmoHaUvnnfC0RicT5+/vJ8Z0WkYOXaXw+goixATyQ+CbkSkZHyRlbVJbNIoVIXASl1CmpHYePeNn61ZhfvOXsJR8ysznd2RKaEirIgPX2qqRWZTDmPfoxqgUQKmloNSolTUDtCT+9s4Z9+tZb6yjI+9irV0oqMl4oyNT8WmWy5tqbQHJgihU9FVEpZKN8ZKCZ7W7t5948fpyoc5BtvOYn6qrJ8Z0lkyqgsCxKJOaKxOKGg7reJFBLDiCuqFSlYXvNjlVEpXQpqc+Sc40M/e5K4c/zqQ2ezdJaaHYuMp4oyL5DticapUVArUlACAdUCiRQytT6WUqcrxxx9455NPNvYyucuOVYBrcgEqCwLAtATURNkkcJjan4sIiIFS0FtDh7f1sz3HtjCGUtm8OZTF+Y7OyJTUrkf1HZrsCiRguPVAimqFSlUGv1YSp2C2hz86KGtzKgOc9P7z6AyHMx3dkSmpERNba8GixIpOLpgFhlfZjbNzH5jZs+b2UYzO3uM6Y1X1kSKkoLaYdz13F7u3bCfd591BBVlCmhFJkpFsqZWc9WKFBoz1dOKjLPrgLudc8cAJwEbx5qgUymVEqaBoobw+LZm/ulXazl50TQ+/Mpl+c6OyJSW7FOrmlqRgmOYRlYVGSdmVge8ArgKwDnXB/SNKU3UmkJKW041tWZ2kZltMrPNZnZNhvVmZt/21z9rZqcOt6+ZvdXM1ptZ3MxWpixfYmbdZrbWf1w/1pMcjXjc8eU71zOrppwfX7mScEiV2iITKTH6sfrUikweM7vUzG5obW0dZjvV1IqMoyOBJuD/zOxpM/uRmQ0ahdTMVpnZGjNb09TUNGSCan0spW7YSM3MgsB3gYuB44ArzOy4tM0uBpb7j1XA93PYdx3wJuDBDIfd4pw72X9cPeKzGge/e3o363a38anXHM3MmvJ8ZEGk6OV6wQwpzY81+rHIpHHO3eGcW1VfXz/kdoZ3s1dExkUIOBX4vnPuFKATGFRp5Jy7wTm30jm3sqGhYdhEVVMrpSyX6sczgM3Oua1+84hbgMvStrkMuMl5VgPTzGzeUPs65zY65zaN25mMo80H2vnaHzdw0sJ6LjtpQb6zI1K0cr1gBqit8HpDdPZGJzpbIjJCZqaaWpHx0wg0Ouce81//Bi/IHTXD1KdWSlouQe0CYFfK60Z/WS7b5LJvJkv95hh/M7Nzcth+3Djn+O97X6AvGuebbz+ZQEDtOUQmQ11FGQBt3ZE850RE0pmh9sci48Q5tw/YZWYr/EXnAxvGlKguV6XE5TJQVKZikv7Tlm2bXPZNtxdY7Jw7ZGanAb83s+Odc20DDmi2Cq+pM4sXLx4mydx9874X+NO6fVz10iUc1VAzbumKyNASNbVtPaqpFSk0Xi2QiIyjjwI/N7MwsBV471gTVPNjKWW5BLWNwKKU1wuBPTluE85h3wGcc71Ar//8STPbAhwNrEnb7gbgBoCVK1eOSzHe29rNd/+6mdefNJ/PXnLMeCQpIjkKBQNUh4OqqRUpQGZo9GORceScWwusHG67XKkxhZS6XJofPwEsN7Ol/t2ky4Hb07a5HXiPPwryWUCrc25vjvsOYGYN/gBTmNmReINPbR3RWY2Cc46rbnyCuIN/uvBoykOak1ZkstVVltGqoFak4OiCWaSwafRjKXXD1tQ656Jm9hHgHiAI3OicW29mV/vrrwfuAi4BNgNd+E0osu0LYGZvBL4DNAB/NLO1zrnX4M3b9WUziwIx4GrnXPN4nnQmO5u72LS/nateuoSlswaNqi4ik6Cuooy2HgW1IoXGq6nNdy5EZEgqo1LCcml+jHPuLrzANXXZ9SnPHfDhXPf1l98G3JZh+W+B3+aSr/G0dtdhAN5y2sLJPrSI+IIB4571+2lq76WhVlNpiRQKb/RjXTGLFCqv33s839kQyZtcmh9Peftae/ifP7/IrJpyVsytzXd2RErWhr3eeHB/Wrc3zzkRkVQGaJpaEREpVApqgZ8+up1tBzu5/l2nUhbUWyKSLz++0hszo10jIIsUFDNT00aRAqYuAlLqFMEBL+xrZ8WcWlYumZHvrIiUtPOPnUNtRYim9t58Z0WkqJnZG8zsh2b2BzN79djTQ82PRQqY7jtJqVNQC7x4oINlczQnrUghmF1bzoH2nnxnQyRvzOxGMztgZuvSll9kZpvMbLOZXTNUGs653zvnPghcBbx9zHlCtUAiIlK4Sj6o7e6Lsauli+WzFdSKFILZtRWqqZVS9xPgotQF/lR33wUuBo4DrjCz48zsRDO7M+0xO2XXL/j7jYlqgUQKm2GaS1pKWk6jH09lW5o6cA6Wz9YAUSKFYFZtOet2t+Y7GyJ545x70MyWpC0+A9jsnNsKYGa3AJc5574OvC49DTMz4FrgT865p8aaJ10wixQ23XiSUlfyNbWbD3QAsFzNj0UKQl1FiLZuzVUrkmYBsCvldaO/LJuPAhcAb0nMK5/OzFaZ2RozW9PU1DTkwXXBLCIihazka2pfPNBOMGAsmVmd76yICFBXWUZbTwTnnDfiqoiA1601XdY40zn3beDbQyXonLsBuAFg5cqVQ8as6lMrUvhURqWUlXxN7Yv7O1gys4pwqOTfCpFxZ2aXmtkNra25NyeuqygjEnP0RjWJvEiKRmBRyuuFwJ6xJppzGfVvMKkJskhhMjO1ppCSVvKR3OYDHepPKzJBnHN3OOdW1dfX57xPbYXXgERNkEUGeAJYbmZLzSwMXA7cPtZEcy2jltx+rEcUEREZfyUd1PZGY2w/1Kn+tCIFpK6yDIC2HgW1UprM7JfAo8AKM2s0s/c756LAR4B7gI3Arc659eNwrJxqagOJmtqxHlBEJoSB7jpJSSvpPrXbDnYSd7BM0/mIFIxETW1rdzTPORHJD+fcFVmW3wXcNc7HugO4Y+XKlR8cartE93av+bH6uosUGg3mJqWupIPaF/f7Ix+r+bFIwair8Gpq21VTK1Iwks2P85oLkanDzLYD7UAMiDrnVuY3RyLFraSD2s0HOjCDIxs08rFIoahL9KntUU2tyEQzs0uBS5ctWzbMdt5ftW4UGVevdM4dHI+ENEK5lLqS7lO7t7WbhppyKsqC+c6KiPiqyr2gtqtXQa3IRMt5oKhkn1pdNYsUIk2BJ6WupIPa/W29zKmryHc2RCRFlX+TqasvlueciEg61QSJjBsH3GtmT5rZqkwbmNkqM1tjZmuamppySFAFVEpXiQe1PQpqRQpMZdgLarsjCmpFCoWaH4uMu5c5504FLgY+bGavSN/AOXeDc26lc25lQ0PDkImp+bGUupIOave19TC3vjzf2RCRFOWhAAGDrj41PxaZaLlO6WOo+bHIeHLO7fH/HgBuA84YS3pqfSylrmSD2p5IjMNdEebUqqZWpJCYGdXhkJofi0yCXPvUBlRTKzJuzKzazGoTz4FXA+vGmq7Kp5Sykh39+EBbLwBz6hXUihSaynCQbgW1IgUj2fw4v9kQmSrmALf5gzuFgF845+4eW5Km8iklrWSD2n1tPQDMVZ9akYJTFQ6qplZkEuQ8pU+i+bGqgkTGzDm3FThpPNNU82MpdSXb/DgR1GqgKJHCU6nmxyKTIvcpffztJyFPIjI6uukkpaxkg9oDqqkVKVhV4SDdEQ0UJVJohrpm3n6wUxfVInmiilopdSUb1O5v66E8FKCusmRbYIsULDU/Fiksft+/rEHr1qYOXvnfD/DI5kOTmS0R8an5sZS6kg1qD3X2MbM6nPyhFpHCUVmmgaJECknilzIR03b0Rvn8bc/R2h0B4IX9HTgHzV19+cmgiGj0YylpJRvUtnT2MaMmnO9siEgGleEg3REFtSITLed5atP61K7ecoifP7aTJ3c0A9DY0gVANBafqKyKyBAM0zzSUtJKNqht7uxjRnV5vrMhIhmEgwEiUV0ci0y03OepHdj8eGezF8Qmugnsak4EtbqoFskHNTyUUleyQe2hzj5mVJXlOxsikkE4FKBPNT4iBSO9pnaXXzPb1esHtS3dAETiKrci+aLmx1LKSjaoVU2tSOEqCwboU02tSMFI71O7q9kLYjv7ov5r1dSK5JOZptyS0laSQW1PJEZXX4yZ6lMrUpDKVVMrUlgSzY/9y+ZEH9quvhjOuWTNbUTlVkRE8qAkg9rmTm90xulVCmpFJlKug9CkKwsGiKjGR6RgJLvrOa9f7a5kn9ooTR299ES8YDYaV7kVyQfDNE+0lLSSDmpnVCuoFZlIuQ5Cky4cChCLO2K6QBaZUCMd/TjuoKUrQqc/QFRnbyzZFBk0+rFI3qj5sZS4kg5q1fxYpDCVBb2vJvWrFZlYud54MvqbHydqacGrqU00RQbUwkJERPKipINaNT8WKUzhkB/UqtZHpCAkRz92/dP5BAw6+2LJINcMohr9WCQvDFRVKyWtJIPaQ4maWjU/FilI4aB3Ba2aWpHCEEiZ0icxKNSSmdV09UbZ2dxFQ2055aGARj8WyRMzU0wrJa0kg9qWzj4CBvWVmqdWpBAlampP/9qf+dNze/OcGxFJNj92jl3N3cyoDtNQW05Xn9endtH0SsoCGuBNRETyoySD2raeCLUVZQQCNvzGIjLpEn1qAX62ekcecyIiQHL4Y+e86XwWTa+kujzkBbUtXSyaUUUoaJrSRyRPDDT6sZS0kgxqO3tj1JSH8p0NEckiUVMLAwNcEcmP1FvAu5q7WDijiqpwkLaeCHtbe1g0vYpQMKA+tSIjYGZBM3vazO4ce1rqUiulrSSvFjt7o1SXB/OdDRHJIjWQVVArkn/mjxQVjTt2H+5m0fQqqsMhdjV3EYs7Fs2opCxgan4sMjIfBzbmOxMiU0FJXi129kWpCqumVqRQpdbUhkPqJiCSb4lSuLe1m0jMC2Irw0ESU0kna2rV/FgkJ2a2EHgt8KNxSQ+ve4BIqcopqDWzi8xsk5ltNrNrMqw3M/u2v/5ZMzt1uH3N7K1mtt7M4ma2Mi29z/rbbzKz14zlBDPp7I2q+bFIAQurplZkUpjZpWZ2Q2tr6zDbeX8T0/csnlE1oMVTok/t4e4Ihzp6Jyy/IlPI/wCfBrLeCTKzVWa2xszWNDU1DZmYN/qxolopXcNeLZpZEPgucDFwHHCFmR2XttnFwHL/sQr4fg77rgPeBDyYdrzjgMuB44GLgO/56Yybrr4YVWE1PxYpVOpTKzI5nHN3OOdW1dfXD7ldIqhNzFG7aHpVssVTMGDMq6+gLBDggU1NnPbVP09onkWKnZm9DjjgnHtyqO2cczc451Y651Y2NDRMUu5EilMuV4tnAJudc1udc33ALcBladtcBtzkPKuBaWY2b6h9nXMbnXObMhzvMuAW51yvc24bsNlPZ9x09qmmVqSQpQayGqRcJP8CflS7s7kbM5g/rZJq/+bw/GkVhIIBQkEVVpEcvQx4vZltx7s2fpWZ3TyWBNX8WEpdLkHtAmBXyutGf1ku2+Sy72iON6ImGek6e2NUaaAokYKV2vy4N6o+eiKFYmdzF/PqKgiHAlT5N4cXTa8CIJRSbiOxuKYXEcnCOfdZ59xC59wSvNaJf3HOvWtMiZqCWiltuQS1mW69phebbNvksu9ojjemJhne6MeqqRUpVKmDQ/VEYnnMiYhA/+jHiel8AKrDA4Pa3pSyuvzzf+IPa/dMci5FRKRU5RLUNgKLUl4vBNJ/qbJtk8u+ozneqEVjcXqj8eSPsYgUnjl1FSyYVglAT0Q1tSL5lrjN1NzZlwxiEy2eFs3wyuq+tp4B+9y7Yd+k5U+kWDnnHnDOvW6s6VjGOiGR0pFLUPsEsNzMlppZGK+ZxO1p29wOvMcfBfksoNU5tzfHfdPdDlxuZuVmthRv8KnHR3BOQ+rs9e4kq6ZWpHDVVpTxyDWv4owlM+iNqqZWJN8s5Xp5cXpNrf/6cFdkwD4zqsMjOsb//uVFntzRPIZcipQuM9TkX0rasEGtcy4KfAS4B2+C6Fudc+vN7Gozu9rf7C5gK96gTj8E/nGofQHM7I1m1gicDfzRzO7x91kP3ApsAO4GPuycG7er2rYe70e3tkJBrUihKy8LqKZWpACk1gIlamZPXFDPO85czCuWZ+4CdPPqnbzuOw/llH5PJMZ/3fsCt6vJsoiIjEJOkZ1z7i68wDV12fUpzx3w4Vz39ZffBtyWZZ+vAV/LJW8jlQhq6yrKJiJ5ERlH5aEgTRHNeSmSb6k1tYma2cpwkH9/44lD7rdud1tO6e8+3A14U+6JyMgZww9aIzKVldwEkO09UQDqVFMrUvAqygIa/VikAKT21kv0qU13/jGzR53+Ln/+WwW1IqNjGv1YSlzJBbVt3X5NbaVqakUKXWVZkG5d5IrkXWL043AowOza8ozb/Piq0/nVqrMGLX/3jx9j3e7WIdPf1eLV1Hb2RceYUxERKUUlF9QmamrVp1ak8NVWlNHRq4tckXxLND9eOK2SQCD7KKuh4OB1D714kC/+Yd2Q6Tcmamp7dRNLZDQMw6kBspSwkgtq1adWpHjUVYbo6I0SjakJsshImNmxZna9mf3GzP5hzOn5fxP9abOZWZ25FjexfG9rNw+92DRo/a4WP6iN6CaWyGiYZvSREldyQW2iprZGNbUiBa/e7ybQ1qMLXSkdZnajmR0ws3Vpyy8ys01mttnMrhkqDefcRufc1cDbgJXjkCegf+TjbJbMqubxz50/aPm2gx388MGt/OBvW1l105OD1u9q9pofr9vdxjO7Do81uyIlSX1qpZSVYFAbobIsSFmw5E5dpOgkgtrW7sgwW4pMKT8BLkpdYGZB4LvAxcBxwBVmdpyZnWhmd6Y9Zvv7vB54GLh/rBlK1tRmGSQq1ey6ikHLtjR18rW7NrL9UCfdkdig1heJmlqAy777yJjyKlKKzDT6sZS2kovs2rqj1FWqllakGCRrahXUSglxzj0INKctPgPY7Jzb6pzrA24BLnPOPeece13a44Cfzu3OuZcC78x0HDNbZWZrzGxNU9PgJsEDt/X+Dtf8OKEhy2BSO/2+s0/vOkyn31++rSfC4S6VcZGxUftjKW0lF9S290aoVX9akaKgmlqRpAXArpTXjf6yjMzsPDP7tpn9gAxzxQM4525wzq10zq1saGgY+uDTKykPBThhfn1Omf3Tx8/hW28/adDyHYe8oPat1z/Kp379DNA/nU+CptwTGR01P5ZSVnK/HG3dUf1gihSJOgW1IgmZqmGyXsI65x4AHhg2UbNLgUuXLVs25HbHzK3j+a9clOxbO5xZNeUcnyEAjsX7s/xsozfNT6I/bYJuPIuMnFc0FdVK6Sq9mtoe1dSKFIvEKOWJUctFSlgjsCjl9UJgz1gTdc7d4ZxbVV8/fA1srgFtwnBjV0yrKqOls49Gvz9tYo7bOXWZmy5f89tn+dFDW0eUBxERKQ0lF9S29USTtT8iUtiqyoMAdPdp7kopeU8Ay81sqZmFgcuB2/OcpyEtnVXNd644Jev69XvaOOUr97GzuYva8hBnLJ3BhcfNoTviDSK1YU8bB9p7ktv/8bm9rN6a3tVYRMBryqHmx1LKSi6o9Wpq1fxYpBhUlXlBbZeCWikhZvZL4FFghZk1mtn7nXNR4CPAPcBG4Fbn3PpxONalZnZDa2vrWJPK6NKT5g+7zQv721k0owozoyocZOPeNtbvaeXK/3ucb9//IgCtXRHae6J09XmDS3X3xbj+b1s0h7WIT6MfS6krueiurTuqoFakSISCAcKhAJ19mqdWSodz7oosy+8iy6BPYzjWHcAdK1eu/OB4pjsSm/a1c8bSGQBU+jeyXvvthwFo8UdFTkz588L+dj70szWcf8wcrv3T85y+ZAanHTE9D7kWEZFCUlI1tT2RGH2xeLKfnogUvupwUM2PRYrYnR99Oe972VIA5tUPnsO2pSuSnP+2o3fgDaxE2U9MBXSwo4971u/n54/tAEhOCyRSTMyswsweN7NnzGy9mf3bmNPEcGp/LCWspILaF/a3AzB/2uAfVREpTFXhEJ29CmpFJsJENz8GOGFBPVe+9AgAjp5Tm3GbxPy3hzr6BixPBK3p0/40d3nbPbWzhc0H2sc1vyKToBd4lXPuJOBk4CIzO2ssCar5sZS6kgpq//L8AQIG5x49O99ZESlqZnakmf3YzH4z0ceqCgfpjqg2RmQijGT047GoCnvdfo6fX0dF2eBLj0UzKoHB03cl+tMnmh8nNLZ40wD9z59f5IJvPjju+RWZSM7T4b8s8x+KSWXK+PqfNvKK//wrS675I0uu+SN/em7vhB+zpILafa09zKopZ0Z1ON9ZEckbM7vRzA6Y2bq05ReZ2SYz22xm1wyVhnNuq3Pu/RObU09VOKiaWpEiN7M6zDvPXMylJ83n+a9czPy0ZsiL/Zrab7z1JQOWJ/rTp89lq1aWUuzMLGhma4EDwH3OuccybLPKzNaY2Zqmpqah00PlQgrHD/62NdltBOCb970w4ccsqaC2OxKjMhzMdzZE8u0nwEWpC8wsCHwXuBg4DrjCzI4zsxPN7M60x6Q2dagKh9SnVmSCTEbzY4BAwPjaG0/k2Hl1ABzqHNjMeKHfp/b4+fVcdPzc5PKtTZ00d/YNqqlNt35Pq/oTSlFxzsWccyfjzTl9hpmdkGGbG5xzK51zKxsaGoZMz0x9aqW0lVZQ2xdLjqwoUqqccw8C6ZM9ngFs9mtg+4BbgMucc885516X9jiQy3FGcod5KFXhoEY/Fpkgk9X8ON27zjoi+byhtpyKlN/mxPzUCZdc9xCNaTW16V777Ye5d8P+8c2kyCRwzh0GHiDtZrOIjExpBbWqqRXJZgGwK+V1o78sIzObaWbXA6eY2WczbTOSO8xDqSpXTa3IVPOF1x7L3695FQCLplcOWFeV9ju9r62HvlicUMCGTHNfa8/4ZlJkgphZg5lN859XAhcAz481XdXTSqGajM9mSU3YqppakawyXS1m/Q5yzh0Crp647PSrKlNNrchUY2ZMq/Km10uMfJxQHc58abJ8Ti0b97ZlTbOusqQuaaS4zQN+6nf9CQC3OufuHEuCZiiqlZJWUr8A3ZEY9ZWao1Ykg0ZgUcrrhcCePOVlgKryYHIEVBEZX2Z2KXDpsmXLJv3YlWVBaitCg6b5qcoS1H7jLS9h3e5Wvv6n52nviRBPu4DvicQnKqsi48o59yxwSr7zITJZhm5nMz7U/FhEAJ4AlpvZUjMLA5cDt+c5T4DXFLGrL6YBMEQmQL761IJXW3v3J17B+1++dMDyar9P7YdfedSA5ctm13D5GYupKQ8xr35gk2Xon9M2VTzu+NFDWwdNFSQy1RimilopaaUV1Kr5sQhm9kvgUWCFmTWa2fudc1HgI8A9wEa8plDrx+FYYx5ZtSocIhZ39MVUCyMy1SyYVjlgkCiAM5fO5MLj5vDx84/m9SfNB2BOXf9gUlXhIAunV/KhVxzJrJr+KfpSW3R09Eb50M/WcO+G/Xz1jxu5f6MGkZKpzQzd/JWCpT6140w1tSLgnLsiy/K7gLvG+Vh3AHesXLnyg6NNIzFoTFdvjPKQyq/IVHfiwnp++J6VQH+t7aLp/f1uP3r+cuoryzj36AaWzKrms797DvCC2j2Hu3n9/z7Mh1+5jHvW9weymWpxRURk6iitoFY1tSJFJzFoTGdflOnV4WG2FpGpJNG/NnUwqUTtLUBzyny3XX1Rnm1s5WBHH3/d5E0jtmlfOwCd6pcvU5zGiZJCpj614yged/RG46qpFSkyiTKraX1Ext94dBGYSNV++U8fITnhlStmJ5939sZobOkCYNM+b5TkHc3eaw02J1Od1/w437kQyZ+SCWq7I94PmmpqRYpLovmhalpExl8+B4rKRVW5X1M7ffDAUADHza9j+7WvZfnsGrr6ouzyg9j9bb1A/0V+l5ofi4jkzWTcbymZoLbHD2rTB6QQkcJWWeZd1HZprlqRkjNcTW1CVXmIzr4YO/2gNp1uislUZ2Y4NUCWElYyfWpj/oR2oeBktOoWkfGSqKnt6tVFqUipOWJmNVXhIMtn1wy5XXU4SHdflJauzFP36KaYTHWGmh9LaSuZmtqoH9QGTUGtyGQZnyl9/KA2oqBWpNScs3wWT//LhcysKR9yu6pwiI6UPrXpOoe4KfbUzhb+588vjCmfIiKSXyUT1CZqaoMBBbUik2U8+utV+qOfqk+cSOkxs5ym8qouD7KruYueSOb5rLsjg78/fvtkIx/46Rp+vWYX193/4qA5PnujMeJxx8d++TS/f3r36E5AZLKYRj+W0qagVkQKWpXfD16jl4qMv0If/ThXXk3twMA15P/eL5pRSWdvjANtPWzY05Zc/9dNB3jwhSZ2NXfjHPRGvYB4w542WrsjXPDNv/H9v23hjmf3sHrrock7GZFRMEW1UuJKJ6h1CmpFilFySh81PxYZd4U++nGuqlOm60vMcnBkQzVmsHx2LV19Uf7znk186OY1ye12tXTTF4uz7WAnADc+so2tTR286fuP8K37XmBXczd/33IQ5zTQlIhIoSudoFY1tSJFqTwUwKx/BHMRkXRVKUHt8jk1VJYFWTyjmjm1FUyrKqOzN8a2g50c7uwfSCox/c/uw90A/Ofdm7j4uofoicR5pvEwAJv2tQPq/iCFzwyNfiwFIb0rx2QpvdGPFdSKFBUzo6osqObHIpJVYj7bWTXlzKmroC8a570vW8KB9h6e2nGYrr4oO5u76IrEcM7R1RejubNvUDqJJsgv+MHswQ5vm2zfPx29UUIB03SBknca/VgKRSSmoHZCJYLagEY/Fik6leGgmh+LSFaJ5seLZ1TyuUuOpScS49h5dQA8v6+d9p5ochaE3micXVlGSU5Ib26cPiXQhj1t1FeV8Ylbnmb5nFr+/Y0njtepiIgUtWh88IB98Um441IyQW1U89SKTDozuxS4dNmyZWNKpzIcpFs1tSKSRZU/SvqiGVUsnVU9YF11OJS8BgCv1nVXc/eI0k8Eub99spGlDdV8/JanOf2IGazb3ZY8tkiuzGwRcBMwF4gDNzjnrhtbmhonSgpDppra6CTU3pZcn1rV1IpMnvEahKayTEGtiGRXXe7V1C6aXjVoXWp/W4DO3miyP22uunqjOOf40u3r+fHD22hs6WbLwU66I7FBtbgiOYgCn3TOHQucBXzYzI4ba6L56ssokioSG1xTG82wbLzldHvRzC4CrgOCwI+cc9emrTd//SVAF3CVc+6pofY1sxnAr4AlwHbgbc65FjNbAmwENvnJr3bOXT36U/T096ktmTheZMqoLAvSpebHIpJFf01t5aB11eUDL3XW7W5lZ0pQGzCIDxMLdPbFaO2O0N4bZfP+DpyDF/d7/W47e/XdJCPjnNsL7PWft5vZRmABsGG0aRrDV9rsau5i0YzBN36kMB3u6sPMqK8sG/e0I7E4zzYeZsXcOlo6+wgEjAXTBn9/DpW3HYe6eMnCeiytwvBwV2TQ9p19MR7dkn1qtDl15RzZUJP7CWQwbFBrZkHgu8CFQCPwhJnd7pxLLXgXA8v9x5nA94Ezh9n3GuB+59y1ZnaN//ozfnpbnHMnj+nM0iRrahXTihSdynCQHtXUioy78eoikG+LZlQRChgnLpg2aF16Te0//PwpLjh2NuFQgL5onCWzqtna1Jk17XAwQFdfNNlkeUtTB9A/eJRqamUs/MqcU4DHMqxbBawCWLx48TDpDN38+M5n9/CRXzzNT993Buce3TD6DMukOfnL9wGw/drXjnvav17TyOdue27AstWfPZ+59RU57f/Bm9bwxPYWfnP12axcMmPAuu/9dfOg7Vu7I1zxw9VZ0wuHAjz3pVdTHhr9oHu51NSeAWx2zm0FMLNbgMsYeDfpMuAm57V7WG1m08xsHl4tbLZ9LwPO8/f/KfAA/UHtuFNNrUjxqiwL0tTRm+9siEw5zrk7gDtWrlz5wXznZSyWzqpmw5cvIhwa/Bufqc/rruZuls+uYf2eNo6ZW5sxqK0tD9HeG+Wo2TVs3NvG1oNeMBtNq9bVHLYyWmZWA/wW+IRzri19vXPuBuAGgJUrV46pbfGzja0APL+3TUGtcLh78OjvBzt6cw5qN+71Wqq0dg+ulY3435F3f+IcyoIBwsEAuw93Zx2d+67n9vKz1TvojcYnPKhdAOxKed2IVxs73DYLhtl3jt/8AufcXjObnbLdUjN7GmgDvuCceyg9UyO5ewUQc5qnVqRYVYVDdPeNrA+ciJSWTAEt9I+M3FBbTlO7d3NsV0sXl5w4zw9q61gwrZKHXjzI8/vamVVTzsGOXo6eW8uTO1o4Zm4tG/e28bw/zU869feX0TCzMryA9ufOud+NOT00pY/kbqwDNyXCqcyDQsU5ek4Nx8ytSy4bqtn7C35XjjHnKYdtMkWB6UfNtk0u+6bbCyx2zp0C/DPwCzOrS9/IOXeDc26lc25lQ8Pwd5xi/vDSCmpFik+FBooSkVFKzGF7VEP/qMhdfTGOm1fHt684hXeeuZjPv/Y4zljqNaE7Zm4tACcvmkZZ0Dh2nvd6U5agtrMvqgF6ZET8sWh+DGx0zn1znBIdl2SkNGQazGkkEvFUpnQisfiIWsYmZqYZa55yOWIjsCjl9UJgT47bDLXvfr+JMv7fAwDOuV7n3CH/+ZPAFuDoXE5mKIn3KaSgVqTo1FaEaO9RvzURGblETe1pR0wfsHzRjCpef9J8ZtaUA/3NlM89uoGG2nI+fsFy7vjoy5lX7w2eki2odQ56IqO7GNvS1MHfXmga1b5S1F4GvBt4lZmt9R+X5DtTUjoy1bCORGI2mUxz0kZijrIRTKFa5gfAYw1qc2l+/ASw3MyWAruBy4F3pG1zO/ARv8/smUCr36S4aYh9bweuBK71//4BwMwagGbnXMzMjsQbfGrrGM4R6K+p1ZQ+IpNnvAahaagtp703yt+3HOSlR80an8yJSElYNKOKV65o4A0nL+DIWTV88tfP+MsHjvR59lEz2X6wkw+cs5T3vXwpwYBRN7eM3S3eAFG7Dw+e2zZxw62zL0plOPe+YH95fj9bDnSyYW8bD28+yBOfv2AMZyjFxjn3MJlbM45aIjHn3KDRaEXSZZpiZyQNTgLJmtoMzY/jcULBkdfUjrX58bBBrXMuamYfAe7Bm5bnRufcejO72l9/PXAX3nQ+m/Gm9HnvUPv6SV8L3Gpm7wd2Am/1l78C+LKZRYEYcLVzrnlMZ0lKTe0I7hyIyNiM1yA0s2u9mpR3/PAxtn39Ev1gi0jOKsqC/N97zwD6Ry6GwXPannt0Q3IAndRLhdSBpsy8C7/ZteUcaO/lmLm1PLG9ha7eGAwxG0VPJEYs7vjpo9vZ2tRJS2cf6/a0smBaJR1qhSLjIPGz6JxaIsvwMjYbzlDrmk2i4WumQHTENbXByaupxTl3F17gmrrs+pTnDvhwrvv6yw8B52dY/lu8jvPjKqqaWpGiNaeufzS+1u4I06rCecyNiBSrRIA6szo8aP7abKrL+2tgF8+oYsehLlbMreVAey8r/KC2c5hpfb7w+3Xsbe2mLxpnz+EeqsJBunpj7GrpptsPeDXmh4hMlkiGybkj0dyDyqAN3ae2JsfvVyAZAI+5SfSY9i4icZeY0kc/GiLFZnZdefJ5piaAIiK5SASoC4cYiTNdak3tijneoFHnHzObmdVhTl3s9dMdbq7adbtb2d3Sza7mbjr7ouxq6aKjL5ocjbk7ooHwZGzMb4CsIcskF5maH6dPVzaUwBADRUVjbkTxVmJQqUz9c0eiZILaRPW47oSKFJ/EQC1Asn+biMhIJQLURdMrh9myX2pN7ZtPW8hrjp/D5Wcs5skvXshiPzjuGmJ0duccjS3dtHRF2N/ew+GuCD2R+ID+a5mC4se3NfPF36/LOZ9S2vqbH2cOTBLLFfQKZGs2PJLmx4mBojKnM5I+tWWhRPNj1dTmJK55akWKVn1lGQ99+pUA7G3tyXNuRKRYVSeC2pHU1JZ5+5h5/W5/8O6VVJR5gW4iSO7szR7UtnRF6OiN0todyToQS1fK/rc+sYs3fPcR7nhmDz9bvYO+ETQJFBHJRV/GZsO5B5XJKX0yfD9FYnHCIwlqh6j1HYncGzwXucSdBAW1IsVpbr3Xr/ZwVyTPORGRYjWjJkxNeYiTF03LeZ/EqMZzaiuSwWxCohY3U01rLO747VONA+bHzSa1T+7ftxxk7a7D1FWWAdDdFyMcKpk6CBml5OjH2db7NWu6Ci4OEz33daaa2kxNkrNJtAzI1Dc3GncjGpg3Uas71tGPS+ZbMq6gVqSolQUDVIWDtPUoqBUZjplVm9mTZva6fOelkNSUh3jqixfy6uPm5LxPOBQgHAwMmgIIUmpqU5oft/VEuOa3z/Lnjfv59G+e5VdP7Br2GKnNl3f5XSxe8OfFHW4QKhEYOPqxFL+R9G8dXfqZRj/O/ZiJz1nGvrkxl+wnm4tEADyS0ZczKZmgNllTq9GPRYpWXUUZj29rpkeDqsgUZWY3mtkBM1uXtvwiM9tkZpvN7JockvoMcOvE5LK4hUOBEU8LVlMRythkucqvxe3qjbL9YCev/tbf+MPTu7nliV38Ye1uADbsbRs2/c7e/sB1V3MXAPvavK4Www1CJSJTT2qt5UTU2macX3YENbUxP67K1qd2JFP6hFVTOzKJNz+oeWpFitpzu1v51K+fyXc2RCbKT4CLUheYWRD4LnAxcBxwhZkdZ2YnmtmdaY/ZZnYBsAHYP9mZn6q++baT+Oirlg9aXuk3R+7si/HE9mZe2N/BXzc1AfC8X9P64v6OQfslGo0tmObV/nb3xdi4t43W7ggH/BGRE4bqryuSkLhR4zQU1JSQWms5EbW22abiyVUirsrU598LakdRUzvGPrWlF9SqplZk0pjZpWZ2Q2tr67ikl2h6fOeze8clPZFC45x7EGhOW3wGsNk5t9U51wfcAlzmnHvOOfe6tMcB4JXAWcA7gA+aWcbfejNbZWZrzGxNU1PTBJ5V8TtvxWyWzhrcNzYQMH/O2Wiy2fAmP5jdfrATgN6Ui75yv2/sEj+tFXO9KYJ2H+7m0u88zLfvf3HQMdT8WEZCzY+nhtQBmMZag5lJ5tGPR9L8OFFTm6X58Uj61AYSox8rqM1JTKMfi0w659wdzrlV9fX145LeUNNmiExhC4DUjpmN/rKMnHOfd859AvgF8EPnXMYrBefcDc65lc65lQ0NDeOZ35JSFQ7R2RdLNhtOzKWdWrlSW+H1vV0+pwaAY+fWAf1B7YY9bUTjjrW7Dg9Kv0s1tSIlJ7V2dqx9TTPJlOaImh8ngtpMwXF8ZDW1iabKan6co5jmqRWZUjTNhZSQTD9cw/76O+d+4py7cwLyIymqy4N090WTQW0mx/jB6/HzvBt8L18+i/ecfQRvOsW7N5Foqpyo5U3VpTEEJAdqiDi1pNZaTlZN7UiaOSeyl7lvrhtRn9pEAJyp1nckSieodWp+LFLs5tSVJ5+v+tkant7ZksfciEyaRmBRyuuFwJ7xSHi8uwiUosqyoFdT25I9qD31iOkAXHTCXL75tpN4w8kL+PJlJ7Bsdg1msPmA1++2I2XAqMRN+K5eNT+W4Zl/70vNj6eG1KBzrM1yM8mUZqa5a7NJND9OT8c5503pM4rRj/tUU5ubWNxh5vV/EZHidNs/voz3vWwpAA9sauKzv3suzzkSmRRPAMvNbKmZhYHLgdvHI+Hx7iJQiqrLQ7R09rG/rTfrNi87ahb3f/JczlvRwJtOXZic+9bMqA6HBlxMJgafSsxv25ljt4uO3ig/fnhbcgpDESleqbWWkxXUjqRGOJalT22i5nZENbWBxOjHqqnNiXfXQAGtSDGbP62Sy06eP+C1yFRiZr8EHgVWmFmjmb3fORcFPgLcA2wEbnXOrR+n46mmdoyqwkFe2D+42XCqRTOqOKqhJuNUQolpgRKO9vvdrvD73eZaU3vXs3v5yp0beOHA0HmRqSk5T61GP54S+qL9/8cJaX6c4ebXSILKxM2z9ObHiSA3NIrRj9WnNkfxuCOgpsciRW92ShNk3aiSqcY5d4Vzbp5zrsw5t9A592N/+V3OuaOdc0c55742jsdTTe0YVYdDtPUMDDxTp+wxg/nTKrLvXx4a8PqYuXUEA8ZRDdWEQ4Gca2p3+n16O9VcuSQlfg3V/HhqiA6Y0mf8a2ozD/CU+4cnsWl6INxfUzuSgaL80Y/VpzY3qqkVmRoaaso5cYF3AX7vhv386KGtfPevm3muUTVNIjL5qsr7a1rDiSl7ZlZTWRZk4fRK5tZVUB4KZtt9UE3tstk1/OS9p3PVS5d40wXlOKVPok9vrqPEP/Ri05ib+8nomdmNZnbAzNZN5nEV8xaH1BrQ1Frb8ZKp/2xkBANwxrLU1CaaNY9moKjIGM+zZILaWNypP63IFBAKBrjjoy/nSL+/2Vf/uJFv3LOJt9/w6KBtv3zHBv6wdvdkZ1GkaKj58dhVh72a1nAowOIZVcyuLWd6dZhFMyo588iZXHjcnJz2T1g0o5JzljcwrSpMdThEZ45T+uxK1tQOv/36Pa28+8eP88AmzU+cRz8BLhqvxPqbHw9NNbnFIfWG08TU1GboUzuimtrMA0UlaoBHMlBUMGCYjf08Q8NvMjXEVFMrMqU0tnQPeN3VF8M5x+due47zVsxmVk05Nz6yDYDW7gjvOXtJHnIpUticc3cAd6xcufKD+c5LsUrUtC6cXkltRYhplWW848zFROOOt61cNMzeJAeNmlUT5mBHHwunVw1IuzsydE3tv/xhHScsqGeX/52YS83utoOdALR09Q27rUwM59yDZrZkvNLrH/3YCypauyP8+KGtnHfMbE5dPD253ZrtzTyxfTob97Zx/Pw6+qKOzQfaOW5+Pd19MWbVhtnf1svew92smFtLc2cf5x/r3Zi57elGDnV4n5nXvWQ+T+5oYW9rN685fi6LZlRx7/p9zKotZ8uBDl59/FzuXreXufWVVJYFeejFJs4/dg7HzK3l12t28daVi7h1zS7ectpCfvjgNlYumU5NeYgntjdz/Px6zj5qJhv2tHGos5fZtRXsbe3mQFsvrzl+Lvdt3M8rVzTw4ItNvGzZLP684QChgPG20xdx13N7OXFBPev3tHHsvFrW7jrMhj1tvOnUhcybVsEfn93L60+az21P7+bNpy7kN0818q4zF/P4tmbKy4LE4nHACJgX5AUM/vbCQT5wzlJuX7uHN526gF3N3ext7WZufQW3PbWb4xfUE4nGOXdFA7NqyvnD2t00tffy2pfMY159JXev28vx8+upCge57end1FeWMaumnPqqMjbta+fy0xfxyOZDVJUHWb+njXeduXhADei379/MWUfO4KRF0ygPBXh8WzMAx86rY2ZNmANtvcyqKeeu5/Zy1cuW8MCmJl51zGzufHYPLZ0Rjp5TQzTuWLlkOk/vPMxLFtZnbH782LZm/v2ujRk/X9OqynDO+1wB9Pq1utsPdQ7Yp93vihEaQU0teINFZZoeaCRKJqiNxh3BEdw1EJHCdt3bT+Yffv7UgGW/e2o3v3x8F798fNeA5f/yh/UKakVkQlT5Na2Lplfx8QuWEwoYL1k4Lef9q/3myyvm1nJw8yEWz0wJassH19RubepgZk059ZVlOOf49ZpG9hzupqndG305lz64u5q9ALhbc+AWNDNbBawCWLx48Yj2ffjFg3z7L5t54IUmbv/Iy5PL73/+APc/f2BEaW2/9rU0d/bxT796JrnsF4/vZGuTd3Pkew9s4akvXsiqnz2ZXH/jI9vZuLdtQDqPbjnE6Utn8P0HtvDzx3by/L521u48zO+e3s30qjJauiIDjnnJtx8alJcbH9nG8/vaWTGnlk372zlmbm1ynue3rlzIP/78KWZUh2nu7CMcClAeCtDeE6W9N0p7T5Q7ntnDT/++nef3tXPz6h08v6+dhppyrr75yUHHApLpN3f2cvPqnWzY28YvHtsJwBVnLBpwvbHyiOnc/IEz+fgtawG46dEdPPjpV3L1zU9RWx7i2Hl1PL69edAxjp1Xx7t+/FjydUNNOeVl/THLnzfu588b92fMX8KFx83hvg37iTnH9x/YwksW1vNsWresxTOq2NncxczqMJF4nGPn1bH9YGfye2D7wU62+ze8UvVEY8ka/vT6wbbuKD97dMeAZfWVZSybXTNkftPVVITGPNdyyQS13X3RQf1WRKR4XXziPH73jy/lTd/7e3LZJ3/9TMZtp1eVTVa2RIqKmV0KXLps2bJ8Z6VoJYLSxTOqBtSI5aoqHCJgcPaRM9lzuIe6iv7vq+q0PrXOOd56/aO85bSFfPaSYznY0Ud3JMamlNGXb3x4G+86c3HGkZYTEv1vc23aLPnhnLsBuAFg5cqVQ1ZjpTc/7ot5/9uOnvEZOCy9uWqiuTtAc+fgGv/GDPM2d/RGafG3TbS2aurwbsakBrRD2X24e8DfnSn5SNT0JfLTF40nW2n2ReM0tfcMOHZjDq0bEjWTifw1d/Sfa29aH9R9bT0DmvDuOdydrDlv742yr60n4zF60m4udfVFCQa874FpVWUczuG9SaSR+H+n/n8SEuX+UGcfwYDxqmMa+H+vOWfYtN/0vUd4audhAM5bMZto3PHgC0187Pzl/POFRw+7fy6e+uKFY06jZKouuyOx5NxvIjI5Jrq/3qKUZnrZvOHk+bR0RTjUkX0OSZFSpdGPxy5ZUztjdFOMvfSomVx28gL+8bxl3P2JgReYVeHggMDzcFeEQ519HPQvrBMXqYmaV/CaFj+8+eCQx0xc8OY6CJUUj0SNWnpTzrHOX5y+91ibiiaMdhqXRLCYun9PdPBNmsT6sQ6KlrEPaoa8p28XG+X7nkhnpLFLol9qpryl9qf2umXmFgamTs8TCljyRkGh9eosmaC2qy+W7LciIpNjoi+YZ9WEecXRDXzs/OVcfe5RAJx2xMCakguPmwvAC/s7JiQPIlLaEjW1udxky+RNpy7kW28/mUDABo2SXBUODQg8+0c4zl4bA/39KxP+655N/Ofdz/enM4JBpaQ4JYKaRBwzxph22EGEBgXNWTZPBFYuy0BDw0pMJeMfL3UU3+4MTe8T08RE4m7Qsfv/DnG4tJsEqfMApw9s5NzAYN8x8H3LNodw+vGd6z+vkcYuieNnGt04Xa4jFKduVxYMJIPZYIFNlVoyzY97VFMrMuWYGTe974zk67ectoDZdRX8Ye0eTlxQz8mLprHfb+7zwv52zj5qZr6yKiJT1PxplQTM6xM73qrLgwP6yCZqZBPT9qQGtRVlAXoi3oXsC/vbWTKrKjno1F3r9lLrz4cbi7tk003V1OaPmf0SOA+YZWaNwL8m5qUeZXrek2QQNjCoiY9h2GPn3LDTvaTPMZrr8UYyNyr0B4mZguFM01klg9IRTFeTSabjZZpqJ327XILLTBI3JUYauySaROcyknGuc8mmblcWNCIxv6a2wKpqS6qmVn1qRaa2ZbNrqaso491nHcHJi6YBMLvWG1Blw562oXcWKUGa0mfsTl8yg8c+dwFHNoxsYJRcVIVDdPUOVVPb3+w4ddTkL9+5gZf/x18BrwatsaU7GRzvb+tJ1ubkMqiUTAzn3BXOuXnOuTLn3MKxBLQD0iVz0DfaZrCJfYebbiW9uWu2oCoReyeC8JE2C06cR6bkM9XUpuYn/dj9f4c/buL8UltBpL8nZgPfByP9dW5BYOr0NrnGLongPfEe5PL/DuUY1KY2Uw4FAwSTzY8V1OZFdyRGhYJakZJjZrx8+Szu27h/5M2cRKY49akdHw215ROSbnU4SFcklmwmuTOt2fCulMF4Fk2v5Jzlswal0dTRS180zt7D3Vz9syd52h/wBRgQMEtxSw8vEkFlYvlYamqjcTdsH9pcg9rh9htOeo1wqqFG8079/XcjeC8ScVumoD7TNUV6/nIJ2jM1S0683xU51tQm8pc+6NRQRtf82JLBbI4x8aQpsOxMnO6+GFVqfixSkl65YjbNnX0DRkkUESl0VeUhnCPZrDjR3HhzUwcdvdGBQe2MKv7n7ScP2H9Xc1d//9m+GHev35ecU7Khtjxjc00pTsnWx4k+p34w1d+ndvRBbSQWHzb4TA/mstUUjrVP7VCnMWRNbcwN6h8bH0Gf2r4MfWrTj+fcwCDdMbB5dbY+tek3DLy+uSOrqe3zmx2PpEtBrgNFDWx+HEg2O1ZNbZ6o+bFI6ZpW6Q2N36laCREpIonrlk7/QjUxBUlfNM7lNzzKnsM9yVqURdOrqC4fOFTKOf/5V377VOOAZe09Ecxg+ewa9amdgvqn9Bk4GNJYmh9HYm7YvqG5BKeptbeJpr9D1byO1FCf59T8JY45kvekN0MNaHdk+NrbXPryZkp7pH1qE3nJlKdscq2pDaVsFwoESLxUUJsnan4sUroSF3rjNV+fiMhkSEwX9LU/buTJHc3sbunvQ7tudxuxuOMovy/vohlVlIcGX9Y9uuXQgNftvVHm11dSX1mmPrVTyKDmx7GBAwaNZfTjaCw+bDPaXJoRR2PxQf1Xs+03kibCCUM2P07pU5uszY4PrLHNmA//NkFiAKbUfrHdaUG02cCg1hjYbDlbn9r0fMedSwbeleHcxvRN5CU9T0PJeaCowMCBovqbHyuonXSxuKMvGqeqrGQGexaRFDWJoFY1tSIDaKCowlbt34y/7endvPn7j2asLTt2Xh3gzZNrGWpOmjv7Brx2DhZOr6SiLEhvhnk9pTgl/vfJ+VvjA+dxHcs8tZG4G7aPbC41tanNbBPBXra+uqOpWR6qP2mmoDxxjKHOLbFNpqbNmYLo9LRymc83Pd/RuBtFTW0sa56yCY2mpjZoKc2Pcz7UpCiJoDbxD64Ml8TpikiaxDySnWpqJzKABooqbFXlw9+Mf9/LlvKF1x7LsXPrMq5vy9BCJVGr25tjU8X2ngjP7xs4gvwL+9tp7Y5k3H7bwU6a2ntzSlsmRiRZU+s3tR3LQFGx+LBBay4DQ0Xj8ZQ+v4ka0MxBWK4DTaUaqo94ap/adEMFw71pfVVT+8WmHy+1L6y3bXof28wZSE8n8X6bQXlZbrFLIo2R9JPPtU9t6r2y1HlqNaVPHiQ+iLlW4YvI1NJfU6taCREpHtUZuk29+6wjks+DAePYebV84Jwjh7zADKc1S140vcqvqR0YqGzc28bd6/YmX29p6uAPa3dzw4NbefP3/o5zjt891ci2g5286Xt/50cPbR2w/93r9rFhTxvv+8kT/Nc9m0Z0rjI2adPUJoOrxABCY2l+HInFh61x7Muh7+jAmlrvebaAcjTzu2YL6EIBGzIoHyoQ7BmiBrQnEhvUBDf9fcrlPNKP3xfzRpsuCwQoyzFwTORzJKMfh0M5TjGU0my6LGVKn0JTEkFtT5/fLl2jH4uUpJoKL6j94u/XqfZARIpGVdrNeDP4wuuO5bwVDQDMq68YNNfkJSfOHZTOrOrwgNeLZlR6NbVptWTfe2ALX/j9uuTrHz+8jU//5lm2NHXQ2RejtTvCP9/6DN+5/0U6eqMcSmva/OnfPMMPHtzCjkOdg9bJxEqEGek1ocl+o2McKGrYPrU5pB/J0Kc2W7A80ql+IHtAVxkOEokPPvZw+6XmL/E3NcCLxNyAmVW8eWrT+tTGhu9TO6j5sd+HObWp73DS85mLXGtqU2uYQ4H+PrVjuVEyEUoiqO2KeDW1Gv1YpDSl3tB6ckdLHnMiIpK79OuWuXUVlIeCzKjygtRF06sG7fO9d57GF1577IBli2ZUDXpdHgrQE4kPGJBnZ3PXgLEHdjV30RuNs7WpE4BN+9oB2LDXa4qcOs9ta1eEtp4om/a1E3cjm1pExl8iuImmTV8zGtGYGzA1TeZtchj9eAQBVy7ppcs2pU9lWXDIYw81FdBw0gehTQ8qcwn2048f9fswhya4RjTXPrWpgqlBbYFFtaUR1PofFtXUipSm1MFTrr75ST556zMjaqIjIpIPVeUDr1sSQWylfyG9aEZlxv0OdgysJf3Y+cv5yhtOYMlMb//FM6oo96+JUptHNjZ30ROJJwfHScxxmwxq97cPeJ06enJiztxM62QSJAaKIlFD6w/EFPduXIxpSp/48KMf51JDGI3Hc87HcEF0Jl1ZfterwsEh85dtv1yk33iKpk1RlMsAWunHj/h9atO7DYy3cI6jH6dLND8ey2dqIpREUNuTCGpVUysiwG+fauQff/7UqKYMSDjc1cf/+/UzXH7Do+OYM5HJpdGPC1t1WvPjhX4Qm5imbPGMwTW1AOce3TDg9REzq3j3WUdQXxUmHArQUFOenP4n0a+2M6U5cXckRizu2H3YnxfXvzB/3q+pTbxO1MbevHoHdzyzZ+A6jTY/qZK3bv2ftUQw5ZwXfIylpjYSHX6gqFxHP85lu8QxRyprTW04NORxR1JTmz7YU3qF2aB5anMI9tOPnwhqc20ePFrpXReySW823d/8WEHtpEvU1Kr5sUjp+sfzjhrw+i/PH+APa/eMKq0X97dz6lfu49dPNrJ6a7NqfaVoafTjwpZ+wZwIYquSNbWZg9qzj5rJtq9fwuIZVYQCxrx6PxgOB1k4vZJAwJI1tYnvr8aUOXC7eqPsa+sZdEGeaH6c0NkbIx53fPmODfzgwYGDRo1kFFYZf+mDMo1pntq4GzY4S6+hzKYnxxG3RzNQVPbmx4Eha5pHEtSm106mV5gNan6cw3kMan4c86b0GU3z4JEYbfPmxG4KavMgOaWPmh+LTKpCqgX69EXH8IN3nzZg2Sd+tZbVWw/lnEZ3X4wX97dz4bceHHCBsO1g53hlM8k5x5M7msdUmywixS0QMP7zzS/hnOWzgP7mx4ka3IUZ+tQmmBlV4SALplcmmwu+/+VL+acLjgagIlFT6wcZiabG4DUdTn2dkB7UdvfFONDemzEAUZ/ayZU++nFqMBWJ5d7sN5NIbHyaH0Pu86iOpp9rtrS9gaKyT+kzkrld+2JD19Sm993NpRl1+vEjfh/mslE2D85Vrumn104nvk8KrPUxJTHHTbeaH4vkhXPuDuCOlStXfjDfeQF4zfFz+dv/O4/KsiBn/Pv9AFx+w2rqK8t43Uvmsa+1h7edvoiXLZuVnAYoFnc452jviXL+N/9Gc8qInotmVLKruZuLr3uIc5bP4n+vOJX6qjJaOvuorywb1RxuzjnW7W7j0799lo1727j+Xady0QnzxucNSNHc2UdVOEiFbvaJFLS3nb6IrQc7eejFg8ma2YXTK6koC3DkrOoh950/rXJAv7nzj52TfJ6oqU00P96ZEsT+8dk9zKmrGJReR1qT4s6+aLIvbTr1qZ1ciSaiydGPUyKOaGxszY+jMTfsgEe5DgKVa7A6mpr+7DW1IW9E4SznMJIAuidt2+H61I6qptbvw1w2wTW1o00/MU5JofWpLYmgNjlPrS7eREreETO9i8DrLj+Z//jT8+xp7aG1O8LPH9sJwP3PHwDgC689lg+ccyQf+cVT3Lth/4Av71MXT+OfLjyaOXUVvPpbDwLw0IsHWfWzNXT0Rlm/p413nrmYr73xxBHlraM3yqqb1vD3Lf21x1ua+muBD3b08qsndlFfWca7UuaqzNXWpg72tfWwv62Hf/rVM1x60ny+c8UpgPfj9MCmA2xt6uTKly4hHArQ1hOhJhzKKTjv6I3S2Ruluy/G/rYetjR18o4zFyfXt/VEeHrnYU5eNI36yjIaW7ro7ouxZFZ11rvFzjnMDOcce1t7mD+tkmgszkMvHuTcoxsG5OtQRy+RmGNufQUtnX08sb2Zo2bXsGBaZdZ59eJxRyBgtPdEqCkPYWY0tfdSVxmiPNT/e9HaHWHnoS5OXFhPd1+M3z7VyMzqMLPrKlg2u4aqcHDC76hLaatKGxjqNcfPZfVnz2daVXio3bju8pMHDJSXKtGn9o5n9rB66yEe29acXPdf976QU74aW7p57/89kXFdn98PM5eycccze7h59Q4uOmEu733ZUu7bsJ8tTR1cfe5Rw+4rmaXOGxuJxcfWpzYWH7Y5cK59ZRMzkgynO8ftckm7Khwk7hg0hdVI85Rp28q0fu/p8/XmNlDUwDQnq09trr9b6X1qE7sV2ujHJRHUdvtNa9LnexOR0nXZyQu47OQFADy29RCt3RGqy0O880ePAfDVP26kKhziT+v2Ddjvjacs4B/PO4rlc2qJxx1vPW0hl7xkHv/8q7UDLgp//thOTlk8nctOns/6PW1c/8AWrrvi5AHBUsL6Pa08taOFL/5hfXLZgmmV7D7czTfu2cT3H9hCQ235gGbO923Yz1lHzmRncydPbG/h4hPmcvW5RyUHkEnYfrCTB19s4ug5tVx+w+oB6+54Zg/Nnb1UhILsaO5i84EOAP79Txu57KT5/N7vc3zK4mlUhIJ88BVLOevImYQCAZ5pPMzB9l6+/ZfNXHPxMXzud88lB5VJaOnqoycS49nGVv72QtOA9/C2p3cnX0+vKuO8FbN506kLmFYZ5rndrURicW5ds4uVR0xn0YwqvvrHjQDUVoRo74nyjjMXc+bSGURijh8+uJVN+9uZVlXGiQvqWbe7lZauyIC8vOmUBVx68nw6e6P87qnd9ERi7DjUxTfe+hLe8UPvf+7N2xnnouPnctnJ82nvjXLfhv3ct2E/ALNqwoQCAfa19QxIe+msaq5904mceeTMQf9bkfFw4XFzaOuOMKfWqz0NBGzYgBagtqIs67pEK43r7n9x2HRm1YQHjaicWJZee5u6rqsvRn3l8BfOH/3l0wA8tq2Z975sKR+8aQ0AH3rFkVmDchmov/nxwPlpwWsCO7bRj92wNbG5BrW51op2943vlD5DrR9JTW36tpVl/Z9v5wZP4ZPaLDvbjYXBA0V5fZgnuqZ2tH12gwU6T21OUZ6ZXQRcBwSBHznnrk1bb/76S4Au4Crn3FND7WtmM4BfAUuA7cDbnHMt/rrPAu8HYsDHnHP3jOUku/2a2vIJHhpbRIpTajCy5gsX8JU7N/CHtXv43G3PJZefdsR0Pnnh0bx02azkskDA+MZbTwLgx1edzqqbnuSUxdP41ttP5o3ffYRP/foZPvXrZ5Lbr/jC3bx82SzM4APnHIkB//KHdWw/1N9875UrGrjxqtMB+Pgta3l480HOWT6LZxu9fsmVZUG6IzH+9kLTgEDxO3/ZzHf+shmAc5bP4oJj5/DgC03Jmudkng1e95L5bD7QwYa9bTyy2asVLgsay2fXsLmpA+fgzmf3Jvd5eudhAB7N0v/4yhsfTz6vrywjGovT2RfjG/dsGrRtMGA8tvUQ4WAgeec/YMZtT+8eEOgmrN/TNuB1Q2057T1RfvHYTn7h166DNwDO4a4I2w91MqM6nAxqz1k+i4dePMjvnt7N7zKknwhooX9gkrvX7+Pu9f03M2orQnT2RplZXU55WYCO3igdvVGOnlPDwY4+th3s5L/vfYFbrz474/sjMlbHzqvjC687blzTzHRNlLhplGDmXaivmFvLQf+7YuH0ShpbugcsS0isO2ZuHQ9vPkhXX5T6yuyBdSapA++1dkdyCt6L0XDX1iNOz/+bbH6cEmRGY/GxDRSVQ5/aXOZjhdwHihpJP9fh0k50P8y2Ptc8Zdo2tRVoNMPURwP/D5nfo/Q0vabS8ZxHJx6tXGuC0/vUJpsfF9iYH8MGtWYWBL4LXAg0Ak+Y2e3OuQ0pm10MLPcfZwLfB84cZt9rgPudc9ea2TX+68+Y2XHA5cDxwHzgz2Z2tHNu1J0zuiMxKsuCo+rfJiKlZVZNOV9+/QnsbulmV0sXJy+axvXvOm3Y2oJTF09nzRcuSL7+9EXH8O93bRw0iNTDmw8CXnPlVDOqw/zm6rOZP60yeaz/efvJxJ1L/rDtau5i4fRKNh/ooKIsyLfue4G4c9y7YT/z6iuSTZUfevEgD714kGlVZSyaUUlteRkLplfyzjMXc96K2YDXDOvJ7S3MrqugtiLEjOowZcEAPZEYZcEAAYM9rT186fb1fO2NJ3DP+v188ffrAC+A7OyLcfW5R/GW0xbyH3c/zzFza6kpD/GmUxcyszrMjx7eSsCMA+29vOb4uSyeUcWsmjB9sTjloSDOOb5y50bOW9HAK45u4HsPbKatO8r6Pa1Uh0NMry7jqpcu5Qd/20LMOd506kLm1JVzzNw67npuL882trKlqYMLjp3NyiUzOKqhZsD7ec/6fWxt6uQfzjuKXc1d3L1uH+29UcJBo60nyltPW8gzja3c9Oh23rZyEZ29UT54zpFs2NvGbU/vZtO+do6fX8ebT1vI0rQm0i2dfdz4yDY+/MpllIcCrNvdxvTqkV24i+RbpqA2fTTU6nCIjt4oK+bUJW+AHTO3lsaWbk5eNC25LCGx7qRF9Ty8+SA7D3UlR17OJn30+MaUPrq7mrunZFCb47X1mKTWEEZibkxNRaP+wEVDHy/H5sc5DiDWPYqBxrKlnQhqs60fyaBm6dumNj+OxgaPEp0a7Gdt/pyWZiQ+OTW1Y52nthibH58BbHbObQUws1uAy4DUgncZcJPzhulcbWbTzGweXi1stn0vA87z9/8p8ADwGX/5Lc65XmCbmW328zDqySC7+mKazkdEclZfVcZv/uGlY0rjwuPmcOFxc3DOsaWp07+D63jddx4esN0dH3k586ZVMKumfFAagYARSOnLkhgkZvmcWgC++faTB2x/29ON3LdhP69Y3sAvH9/JD969krn1gwd7ASgPBQfUOiekDhy1YFolP3zPSgDefdYRvOa4OczOMHhMYptUq16RuS9covm1mfEvl/bXPP3jecsybp9+jgCXnDiPS04cevCs1xw/N/l80YwqPviKIwdts3xOLW85beGAZScsqOeEBUNPbzO9OswnX70i+frEhZoOR4pPpkHiTlhQz5M7WpKD9Bwxs4rZteVccNxsbnxkGwBvOW0hzsHlpy/mu3/dMmD/y05eQEdvlCtfuoQfPrSND//iaaZXDX3DJ72G78ob+/voXn3zk+N2/faqY2fz2YuPHZe0xkEu19Yjkrjv+s4fPUYoYOxIaQH0vp88wf60bhMj8Y17Nw0btH77/s05pXW4OzL8RsB1OaaXS9pV/mc92/pc85Rp29TPZ0tXHzc9uj35Ohp3XP+3/jKS6/H/tqmJaDzO6UtmTOh4Dbk2P65I6TZVFgxQUeaV2UxjVeRTLkHtAmBXyutGvNrY4bZZMMy+c5xzewGcc3vNbHZKWqvT9lmQnikzWwWsAli8eHH66gGOm19XcO2+RaQ0mBnLZvfXIv7s/Wcwr76Sv285yLz6ynENiN54ykLeeIoXpF1+xtDfi6ORKaCV4mZmlwKXLluW+aaCTF1HNdRwxRmLk31iy0MBPvXqFcyuLedbf36B3Ye7+fj5y5OD69350ZfztxeauOiEeckR2T9/ybFs2NvG+cfOZtO+dl574jwuPWl+ct1j23KbMu34+XWAN2CdmdePv7svRnnZ+F3Qzy2s769crq1HdK370qNm8YaT5ye7USyfU8OrjpnD37ccpCcS44QFdQO2d867cRqNxQkGjGDAa6mT6OISChjhUIDO3hjhkCXyQ004RCQepy8axzkoLwsQiTli8Th9UUd1eZDeiJdmLO6NmlwVDnLu0Q08svkgPRlqK889uoEnd7TQE4kTsMS8um5Anrr6vDwl0g0GLNlEd8WcWiKxOFuaOojGHOVlweR+DbXlXHbyAjY3dRCJeXlONKtPbYAVj0MwaMT9z6DhHaeqPMjZR87kr5sOJPcJBQJ09cWoLg/yxlMW0NodYXdLN8GgJQc4LA8F6It6A3RFYo6KsiDxuKO8zFveE4lTXR6kLxrHzKtNrywLEonFk/l6/UkLOPfoBg609dDZF6M36r0/wYARNKOrL0YgYPREYlSHg7zi6Abu33gg+f4cv6AO57xxO2L+FEG90TgVZUHmT6vI+YbRxy9YTk80RigQ4O2nLwLgYEcfHzp38M3ifLLh5kA0s7cCr3HOfcB//W7gDOfcR1O2+SPwdefcw/7r+4FPA0dm29fMDjvnpqWk0eKcm25m3wUedc7d7C//MXCXc+632fK4cuVKt2bNmlGcvsjUYWZPOucGV5kVAJVREZVRkUI3WWU0l2vrdCqjIkOX0VxugTUCi1JeLwT25LjNUPvu95so4/9NjGaSy/FERERERIqRrnVFxlkuQe0TwHIzW2pmYbxBnG5P2+Z24D3mOQto9ZsWD7Xv7cCV/vMrgT+kLL/czMrNbCne4FP9Q2uKiIiIiBSvXK6tRWQEhu1T65yLmtlHgHvwhh2/0Tm33syu9tdfD9yFN53PZrwpfd471L5+0tcCt5rZ+4GdwFv9fdab2a14neWjwIfHMvKxiIiIiEihGOb6WERGIad5ap1zd+EFrqnLrk957oAP57qvv/wQcH6Wfb4GfC2XvImIiIiIFJNs18ciMjoTO6uviIiIiIiIyARSUCsiIiIiIiJFS0GtiIiIiIiIFC0FtSIiIiIiIlK0zBvjqbiZWROwY5jNZgEHJyE7k0HnUngK4TyOcM415DkPGamMFq2pch5QGOeiMlo4psq5TJXzgMI4F5XRwjFVzmWqnAcUxrlkLaNTIqjNhZmtcc6tzHc+xoPOpfBMlfPIp6n0Hk6Vc5kq5wFT61zyZSq9h1PlXKbKecDUOpd8mUrv4VQ5l6lyHlD456LmxyIiIiIiIlK0FNSKiIiIiIhI0SqloPaGfGdgHOlcCs9UOY98mkrv4VQ5l6lyHjC1ziVfptJ7OFXOZaqcB0ytc8mXqfQeTpVzmSrnAQV+LiXTp1ZERERERESmnlKqqRUREREREZEpRkGtiIiIiIiIFK2SCGrN7CIz22Rmm83smnznZyhmdqOZHTCzdSnLZpjZfWb2ov93esq6z/rntcnMXpOfXGdmZovM7K9mttHM1pvZx/3lRXU+ZlZhZo+b2TP+efybv7yozqNQFVP5BJXRQjwfldGJpTKaPyqjhXUehUplND+mSvmEKVJGnXNT+gEEgS3AkUAYeAY4Lt/5GiK/rwBOBdalLPtP4Br/+TXAf/jPj/PPpxxY6p9nMN/nkJLvecCp/vNa4AU/z0V1PoABNf7zMuAx4KxiO49CfBRb+fTzrDJaYOejMjqh763KaH7PRWW0gM6jEB8qo3k9jylRPv28FX0ZLYWa2jOAzc65rc65PuAW4LI85ykr59yDQHPa4suAn/rPfwq8IWX5Lc65XufcNmAz3vkWBOfcXufcU/7zdmAjsIAiOx/n6fBflvkPR5GdR4EqqvIJKqMU4PmojE4oldE8UhktrPMoUCqjeTJVyidMjTJaCkHtAmBXyutGf1kxmeOc2wteAQJm+8uL5tzMbAlwCt6dn6I7HzMLmtla4ABwn3OuKM+jAE2V96roPwsqo4VxHgVoqrxXRf9ZUBktjPMoQFPlvSrqz0Kxl08o/jJaCkGtZVg2VeYxKopzM7Ma4LfAJ5xzbUNtmmFZQZyPcy7mnDsZWAicYWYnDLF5wZ5HAZrq71VRnJ/KqJfEhGSs+E3196oozk9l1EtiQjJW/Kb6e1Xw5zcVyicUfxkthaC2EViU8nohsCdPeRmt/WY2D8D/e8BfXvDnZmZleAX958653/mLi/Z8nHOHgQeAiyji8yggU+W9KtrPgsooUIDnUUCmyntVtJ8FlVGgAM+jgEyV96ooPwtTrXxC8ZbRUghqnwCWm9lSMwsDlwO35zlPI3U7cKX//ErgDynLLzezcjNbCiwHHs9D/jIyMwN+DGx0zn0zZVVRnY+ZNZjZNP95JXAB8DxFdh4FaiqUTyjSz4LKaGGdR4FSGc0jldHCOo8CpTKaJ1OlfMIUKaPDjSQ1FR7AJXgjkm0BPp/v/AyT118Ce4EI3l2Q9wMzgfuBF/2/M1K2/7x/XpuAi/Od/7RzeTleU4RngbX+45JiOx/gJcDT/nmsA/7FX15U51Goj2Iqn35+VUYL7HxURif8/VUZzd+5qIwW0HkU6kNlNG/nMSXKp5+voi+j5mdKREREREREpOiUQvNjERERERERmaIU1IqIiIiIiEjRUlArIiIiIiIiRUtBrYiIiIiIiBQtBbUiIiIiIiJStBTUligz6/D/LjGzd4xz2p9Le/338UxfpBSojIoUNpVRkcKmMlpaFNTKEmBEBd3MgsNsMqCgO+deOsI8iUi/JaiMihSyJaiMihSyJaiMTnkKauVa4BwzW2tm/2RmQTP7hpk9YWbPmtmHAMzsPDP7q5n9AnjOX/Z7M3vSzNab2Sp/2bVApZ/ez/1liTtl5qe9zsyeM7O3p6T9gJn9xsyeN7Ofm5nl4b0QKUQqoyKFTWVUpLCpjJYC55weJfgAOvy/5wF3pixfBXzBf14OrAGW+tt1AktTtp3h/60E1gEzU9POcKw3A/cBQWAOsBOY56fdCizEu9HyKPDyfL9HeuiRz4fKqB56FPZDZVQPPQr7oTJaWg/V1Eq6VwPvMbO1wGPATGC5v+5x59y2lG0/ZmbPAKuBRSnbZfNy4JfOuZhzbj/wN+D0lLQbnXNxYC1eUxERGUxlVKSwqYyKFDaV0SkolO8MSMEx4KPOuXsGLDQ7D+/uVerrC4CznXNdZvYAUJFD2tn0pjyPoc+mSDYqoyKFTWVUpLCpjE5BqqmVdqA25fU9wD+YWRmAmR1tZtUZ9qsHWvxCfgxwVsq6SGL/NA8Cb/f7MjQArwAeH5ezEJm6VEZFCpvKqEhhUxktAbpDIM8CUb9pxU+A6/CaQzzld2BvAt6QYb+7gavN7FlgE16zjIQbgGfN7Cnn3DtTlt8GnA08Azjg0865ff4XhYhkpjIqUthURkUKm8poCTC/U7OIiIiIiIhI0VHzYxERERERESlaCmpFRERERESkaCmoFRERERERkaKloFZERERERESKloJaERERERERKVoKakVERERERKRoKagVERERERGRovX/AYdY2VVL7SDnAAAAAElFTkSuQmCC", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "\n", " \n", "fig, axs = plt.subplots(ncols=4,sharex=True,figsize=(16,4))\n", "axs[0].plot(res.costs)\n", "axs[0].set_title('Dual Objective')\n", "axs[0].set_xlabel('Iteration')\n", "\n", "axs[1].semilogy(res.grad_sq_norms)\n", "axs[1].set_title('Squared Norm of Gradient')\n", "axs[1].set_xlabel('Iteration')\n", "\n", "axs[2].semilogy(res.step_sizes)\n", "axs[2].set_title('Step Size (after line search)')\n", "axs[2].set_xlabel('Iteration')\n", "\n", "axs[3].plot(res.line_its)\n", "axs[3].set_title('Line Search Iterations')\n", "axs[3].set_xlabel('Iteration')\n", "\n", "plt.show()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Compute the Barycenter" ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "\n", "bary = prob.Barycenter(res.dual_vars)" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### Plot the images used and the barycenter" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "Text(0.5, 1.0, 'Barycenter')" ] }, "execution_count": 10, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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AAAAAAAAALqCBXEAAAAAAAAAAAB0BQviAAAAAAAAAAAA6AoWxAEAAAAAAAAAANAVLIgDAAAAAAAAAACgK1gQBwAAAAAAAAAAQFewIA4AAAAAAAAAAICuYEEcAAAAAAAAAAAAXcGCOAAAAAAAAAAAALrCqE43UFezZ8/O1i677LJs7ZOf/GS29uyzz5aO77vvvtk573//+7O1rbfeOltbeOGFszXolDfffDNb23nnnUvHr7zyyrb3kVIqHR89enRLjzd37txsrepnSSsmT56crV199dWl4+PGjcvOyT0XUEfTpk3L1pZeeulsrdVsQ7e49dZbs7X//d//LR0/77zz2t5HURSl44N5LMr9eyMi/uM//mPQ+gCgM+69995s7fLLLy8dv/7667Nz5syZk60dfvjh2dp1112XrbXi4IMPztYWXHDBtu4LgOHhxRdfLB0/44wzsnMefvjhbO3UU09tuoddd901W3v729+erX3kIx/J1nLXj8aOHdtwXwAA3SZ37T6i+j54TtU1/9deey1be/7557O1Rx99tHS86h7g66+/3lIfSy21VOn4pEmTsnNGjMh/FtnIkSOztVz/7uG3h0+IAwAAAAAAAAAAoCtYEAcAAAAAAAAAAEBXsCAOAAAAAAAAAACArmBBHAAAAAAAAAAAAF3BgjgAAAAAAAAAAAC6ggVxAAAAAAAAAAAAdIVRnW6g0x577LHS8eOPPz4753vf+15bezjzzDNbqq2zzjrZ2oQJE0rHt9tuu+yc/fffP1tbZpllsjXoa+7cudnazjvvnK1deeWVbe1jhRVWyNZOP/300vFtt922pX29/PLL2drFF19cOn7sscdm5/z1r3/N1qZOnZqt5XL/q1/9Kjun6t88atSwP0TQ66abbsrWnnvuuWzttttuy9Zayfzvf//7bG2jjTbK1k466aTS8c0226zpHqCTqo431157bbb2iU98Ilt76aWX+tXTUHPkkUdma2PGjMnWDjrooGxtxAi/Y8TAqToG//a3v83WHnzwwWzt7LPPLh0viiI7J6WUrW2yySbZWu78//3vf392ztprr52tOT+lv6666qps7Qtf+ELp+OzZs1vaV+694ED4z//8z2ztmmuuKR2vOn+uOibCUHPjjTdmaxdeeGHpeNVx6p577snW/vCHP2RrX/rSl0rH11hjjewcGGhf+9rXsrWvfvWrpeNV54XtVnUsveSSS7K1I444IlvLnWvm/r0REdtvv322Nm7cuGwNOmHWrFnZ2p577pmtXXTRRaXjrWZ+scUWy9Zy91/f9ra3Zec4Xg5PVa/n1157ra37uuuuu7K13HuqVlXdR23lOmPV8fzNN99s+vGqzmnf/va3N/14DA1V1wWrXkdvvPFG6fjDDz+cnTN+/Phs7YILLsjWctc7q64XVt1Tefzxx7O1P/3pT6XjI0eOzM6pWk+zww47ZGu566dV11wXWmihbI1/5u4NAAAAAAAAAAAAXcGCOAAAAAAAAAAAALqCBXEAAAAAAAAAAAB0BQviAAAAAAAAAAAA6AoWxAEAAAAAAAAAANAVLIgDAAAAAAAAAACgK4xqZKOU0vYRcVxEjIyIM4qi+PY89YkRcU5ErNj7mP9bFMUP29zrgPjYxz5WOn7TTTcNcifNu+uuu5qe88c//jFbO+OMM7K1vfbaK1v76le/Wjo+alRDLy8aNFRyOHfu3GztyiuvHLQ+zjrrrGxt6623buu+JkyYkK194hOfaGo8IuLEE0/M1r70pS9la6+88krp+E477ZSd8453vCNb+93vfpetjR49OlvrdkMhi2+++Wa2Nn369Gzt61//eun4mWeemZ1TFEW2llJqel7VnKrarbfemq1tvvnmpeOf/OQns3NOPfXUbI16GApZbFUuw7vsskt2znXXXTdQ7fyLkSNHZmvjx4/P1mbOnFk6Pm7cuH731KgZM2Zka4ceemi2tuSSS2ZrH/7wh/vV01DWzTkcCK+//nq29o1vfKN0/Hvf+152zqxZs/rdUzvccsstTde+8pWvZOd88YtfbKm26KKLZmvdThYbd8kll2Rrc+bMKR1/5zvfmZ1z/fXX97eltpg9e3a2lut/2223zc6pOuc4+OCDG29smJHF9nj22WdLx3fdddfsnKr3uY888ki2lntfeswxxzQ9J6L6PetPf/rT0vGqc9BDDjkkW1t11VWzteFMDv9V1T2Eo48+uq372mqrrbK1pZZaqunH+9Of/pStPfjgg00/XkTE3XffXTr+0Y9+NDun6lzg17/+dba28MILN95Yl5HFgTVt2rRsbcstt2xpXrs999xz2drHP/7x0vGq+yznnntutlb1b15wwQWzteGgLlm85557srWLL744W7vsssuytbq8F2tFq+eT7bb++uuXji+wwAKD1sNwUJccNtBntnb//fdnaxMnTiwdrzr3e/TRR7O1e++9N1t74403mn68qn9X7r1nRH69Q+5efET1tZnTTz89W8vdg61an1P1XnGNNdbI1oaj+X5CXEppZEScFBE7RMQ6EbF7SmmdeTb7VETcVRTFBhGxdUT8v5TSmDb3CsOWHEI9yCLUgyxC58kh1IMsQj3IInSeHEI9yCLUgyxC58khdF4jX5m6aUQ8UBTFQ0VRvBER50XEvL8qWkTE+NSzxHLhiHg+IvJLIIFmySHUgyxCPcgidJ4cQj3IItSDLELnySHUgyxCPcgidJ4cQoc1siBuuYjo+zm6j/WO9XViRKwdEU9ExB0R8ZmiKPLfmwg0Sw6hHmQR6kEWofPkEOpBFqEeZBE6Tw6hHmQR6kEWofPkEDqskQVxZV+sO++XW783Im6NiGUjYsOIODGl9C9f9p5SOiClNDWlNPWZZ55pslUY1tqWwwhZhH5wTIR6kEXoPOenUA+OiVAPsgid5/wU6sExEepBFqHznJ9ChzWyIO6xiFihz9+Xj54Vqn3tExEXFT0eiIiHI2KteR+oKIrTiqKYXBTF5CWWWKLVnmE4alsOI2QR+sExEepBFqHznJ9CPTgmQj3IInSe81OoB8dEqAdZhM5zfgod1siCuFsiYlJKaZWU0piI2C0ifjnPNo9GxHsiIlJKS0XEmhHxUDsbhWFODqEeZBHqQRah8+QQ6kEWoR5kETpPDqEeZBHqQRah8+QQOmzU/DYoimJ2SumQiLg8IkZGxJlFUdyZUjqot35KRHw9Is5KKd0RPR/9eHhRFM8OYN+19eUvfzlbmzCh9NMtB8Sll15aOn7NNddk5zzxxLwLkv/h6KOPztbuv//+0vHPf/7z2TmbbbZZtsa/Gko5TKns0197jB8/Plt75ZVXSsdXXHHF7Jxjjz02W3vrW9+ardXdIYcckq3tvvvu2dr6669fOj59+vTsnD/+8Y/Z2syZM7O1iRMnZmvdbKhk8YYbbsjWttlmm2xt7ty5peMjRuTXz+fmzG9eUcz7qdDz18qcqnlnnHFGds4mm2ySrX3yk59sqQ/aZ6hksVVz5swpHb/uuutaerxFFlkkWzvyyCObfrzll18+W/vIRz6Srd1yyy2l41V5a7cLL7wwW9ttt92yteuvvz5b+/CHP9yvnoaqbs/hQHjyySeztW9961uD2Em5quNs1Tl+u33nO9/J1s4777xs7eabby4d7/bfmJXF5lRl7fjjjy8d/8EPfpCd88ADD/S7p76+//3vZ2tV5wG33XZb0/u68sors7Wq94L77LNPtrbAAgs03Ue3kMX22W677UrHW3md10nuOHvcccdl5/zlL3/J1qZMmZKtLbjggo031kXksNxFF12Urc2aNStb23nnnUvHTz755OycxRZbLFsbO3ZstpaTu14cETFt2rRsrep6z09+8pPS8eeeey475w9/+EO2ttFGG2Vrl19+een4Kquskp3TDWRx4I0alb+1u/baa7dUyx2nrr322uycqp8hrXjppZeytfe9733Z2qc+9alsreo42+3qlMWq+3WDeb1hMB188MHZ2kILLZSt5Y7bDz3U/vVRt99+e+n4TjvtlJ1Tdf+yKotV94e7WZ1y2B9LLbVUtpa7R/jyyy9n5zz88MMt7St3blj1/meZZZbJ1pZccslsLafqvvr555+fra233nrZWu6a8VVXXZWdM3v27GztqKOOytZa+TcPdfNdEBcRURTFlIiYMs/YKX3+/ERElF+tANpCDqEeZBHqQRah8+QQ6kEWoR5kETpPDqEeZBHqQRah8+QQOquRr0wFAAAAAAAAAACA2rMgDgAAAAAAAAAAgK5gQRwAAAAAAAAAAABdwYI4AAAAAAAAAAAAusKoTjfQaWeddVbp+FFHHZWdc/7552drn/3sZ7O1CRMmNNpWvx100EGl4zfffHN2zgc/+MFs7aWXXsrWLrrootLxyy67LDunqo+11lorW6P+Ro4cma3ddttt2drdd99dOr7RRhtl5yy55JKNN9YlFltssWztggsuKB2vyvYzzzyTrW2//fbZ2m9/+9vS8YUWWig7h8GzzTbbZGsppWxtxIjydfJVOax6fVXZYIMNSsd/8pOfZOc8+eST2drUqVOztRkzZpSOVz0XBx54YLZ2yy23ZGunnnpqtgaNGjt2bOn4d77zneycL37xi9la7lwtImLLLbdsvLF+2mSTTQZtXzmrr756p1tgGFt88cWztfXWW690/I477mh7H+PGjSsdrzoujh8/PlvbfPPNs7WbbrqpdPzxxx/Pzqny6KOPZmsf/ehHS8d/97vftbQvutPGG2+crZ199tlNP167r18cd9xx2VrunDYiYrvttsvWbrzxxqb7uP7667O1P/7xj9nau9/97qb3xfBU9Xp+5JFHSsdz58gR+WPA/FxyySWl46+88kpLj9du1157bbZ28sknZ2uf//znB6IdhqgtttgiWyuKIlv7yEc+Ujq+7LLL9runRlWdg66zzjrZ2ve+971s7eCDDy4drzpHqPqZ8OCDD2Zr//M//1M6fvrpp2fnQCOWWWaZbG3KlClt3ddf/vKXbO3www/P1q6++uq29lEld18kIuKTn/xk6XjuPTgDo+qa5jHHHNPSY+buRVVdI1133XWztbe97W0t9ZEzevTobK3q+ss3vvGN0vG5c+dm59x///3Z2pFHHpmtXXfddaXj06dPz8750pe+lK3de++92doPfvCD0vHcPSkGX9Xrsur1l/t/uPDCC2fnVN3rrtrXSiutVDpetV5g0qRJLfUxZsyY0vGtttoqO2ennXbK1n72s59la7lz8qqfI7l1FRH597kREfvuu2/p+KhR3btszE8ZAAAAAAAAAAAAuoIFcQAAAAAAAAAAAHQFC+IAAAAAAAAAAADoChbEAQAAAAAAAAAA0BUsiAMAAAAAAAAAAKArWBAHAAAAAAAAAABAVxjV6QY6bdKkSaXjP/rRj7JzvvCFL2RrCy64YL97aodcH1tttVV2znnnnZetfeQjH8nWXn311dLxmTNnZue8/vrr2Rrda6WVVmqpRmM233zz0vFPfepT2TlHHXVUtnbzzTdna6eeemrp+Oc+97nsHAbPBhtskK3ddttt2dojjzxSOr700ktn54wePbrhvhqx4447tjTv6aefztauvvrq0vGq1+v06dOztTPOOCNbyx1/jz322OwcmFdKqXR8tdVWy8656qqrsrWNN9643z0NNa+88krp+Le+9a2WHu/Tn/50f9qBiIgYP358tnbNNdeUjp9++unZOZtttllLfay88sql4wsssEB2zhJLLNHSvmbPnl06fuGFF2bnHHTQQdlaLtsREXfccUfp+N13352ds/baa2drUDcLLbRQtlZ1HvCLX/yidHyPPfZoqY+f/exn2dq73/3ulh6T4afqmPPFL36xdHynnXbKzll33XVb6iN3ffKpp57KzvnmN7+Zrf34xz/O1t54443GG2vAEUccka0tuuiipeP77rtvW3tgaNh6662zteWWWy5bu/LKK0vHP/7xj/e3pY7K3Q/KnUtGRKy66qrZWu79e0T1/REYKt72trdla6ecckq2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ssgAdAPVTj/99Gzt7rvvztZuu+22bK0oiqb7aGVOq/M22GCDlvYFdfSud70rW5s2bVrp+L333puds+2227bUxyc/+cnS8R//+MfZORdffHG25hyURl1wwQXZ2uWXX95SLWfJJZfM1k444YRs7QMf+EDp+MiRI5vuYX6ee+650vGVVlqppcf72Mc+lq0dc8wxLT0m3eeHP/xhtvbZz342W8tl6umnn+53T+2w0UYbZWsnn3xytrbuuuuWji+44IL97gkGwp577lk6XvU6r4uUUrb2oQ99qHT8tNNOy85xXYZ2qLrmsN1222VrL730Uun4Aw88kJ2TO/dr1YwZM7K1I444oq37qjJqVP422qmnnpqt7bHHHgPRDsT48eOztd122y1bW3311Zve1y9+8Yum57Rqs802y9ZefPHFbK3q+YB2GDduXOl41TFgn332ydaqroXmzienTp2anbPjjjtmaxtvvHG2Nnbs2NLx3L8X2mXOnDnZ2lvf+tZsLXd/4ZBDDsnOqbpGVHV/P5eD0aNHZ+dUvX+r+jfnrmlWnau/8MIL2dqmm26arbV673Mo8wlxAAAAAAAAAAAAdAUL4gAAAAAAAAAAAOgKFsQBAAAAAAAAAADQFSyIAwAAAAAAAAAAoCtYEAcAAAAAAAAAAEBXGNXpBoaTRRZZpHT8gAMOyM6pqrXi2muvzdY+//nPZ2t33nlntvbGG2+Ujr/44ovZOe9///uztXe9613Z2hVXXFE6Pnr06OwcaNQaa6yRrd1xxx3Z2owZM5re15lnnpmtnXDCCdnaCy+80PS+XnvttWxt4YUXbvrxYCCNGzcuW/vzn//c0mPef//9peMHHnhgds4111yTraWUmu6has7OO++crR133HHZ2sc+9rHS8SWWWKLxxmAQLbvssqXjEydOzM759a9/na19+MMfztZyx76qbO+yyy7Z2m9+85tsbYEFFsjWGH6effbZQdvX008/na3ljhERER/5yEdKx6veo2200UbZWtV5be79W6v22GOPbG3ppZdu674YuiZNmtTSvKpM1cFKK62UrT3++OPZ2iabbDIQ7cCAmTx5cun4rbfemp3zuc99Llu7+uqr+9tSW3zhC18oHc9dL4Z2WXTRRbO1KVOmNP14Tz75ZLb23HPPZWunn356tnbGGWeUjr/++uuNN9ZPu+66a7b2zW9+M1tbc801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m0MKHSCHUA+yCPUgi9B5cgj1IItQD7IInSeHUA+yCPUgi9B5cggdNt8FcUVRzE4pHRIRl0fEyIg4syiKO1NKB/XW5/t9xkD/yCHUgyxCPcgidJ4cQj3IItSDLELnySHUgyxCPcgidJ4cQuc18glxURTFlIiYMs9YaUCLovi3/rcFzEsOoR5kEepBFqHz5BDqQRahHmQROk8OoR5kEepBFqHz5BA6q+u/mBkAAAAAAAAAAIDhwYI4AAAAAAAAAAAAuoIFcQAAAAAAAAAAAHSFUZ1uYDiZO3du6firr77a0uONGJFfz7jwwgu39Jit2GijjUrHF1988eycRx99tKV95ebNnj07O2fUKC/zbjVr1qxs7fe//322duWVV5aOb7vtti31sfnmm2dr48ePb+kxczbccMNsbfnlly8df+mll7JzXnjhhWztkUceydbWWmutbA364+mnn87WVlpppWwtpZStFUVROr700ktn5wzmazx3fhBRfazPzauaw9Dw8ssvl45/5jOfaenxFltssWztK1/5StOPN27cuGytLudd6623Xun4Oeeck52zzTbbDFQ7EBHV+VhhhRVKx/fbb7/snKpa7udIRMSBBx5YOn7++edn57TqiCOOKB0fM2ZM2/fF0PXKK69ka+94xztKx/fff//snFNOOSVbu/XWW7O1BRdcMFtrRdV1mf/8z/8sHT/ooIOycz7+8Y9na1dccUW2ljsX/sQnPpGdc9ttt2Vryy67bLYGQ811111XOv6hD30oO+e3v/1tS/vKXbusun5VlVOGp9dff710fM6cOdk5VeegY8eO7XdPA6nq+sYyyyyTrW288cbZ2oMPPlg6PnPmzMYbg0GSO6+98847s3NOPvnklvZVh+uMVddITzrppGxt7733Hoh2YMhYYIEFsrUvf/nL2dqhhx5aOr7vvvtm5/ziF7/I1g477LBs7Z3vfGfp+CabbJKdw/CUu4YRkT8XrppTdRyrOv976qmnSsefffbZ7Jy77747W6u6h5m7j191rj5x4sSmHy8i4p577ikdX2eddbJzqnqvuldUF+6YAgAAAAAAAAAA0BUsiAMAAAAAAAAAAKArWBAHAAAAAAAAAABAV7AgDgAAAAAAAAAAgK5gQRwAAAAAAAAAAABdYVSnGxhOLr744tLxj33sYy093rLLLputHXbYYaXjc+fOzc4ZMaK19ZHXXXdd6fijjz7a0uNVOfPMM0vHDz/88Oyc1VZbre19MHhmzJiRra255prZ2pNPPtn0vo455pim50RELLHEEtnaJptsUjq+//77Z+esvPLK2dr666/fcF/99fa3vz1be/rpp0vHx4wZM1DtMExMnTo1W0sptVTLyb2OIyKeeuqplvZVFEXTc6qOv63Ma+W5oF6+/OUvl47/+Mc/bvu+jj322KbnfOYzn8nWVlpppWxt8803Lx2fPHly0z3Mz49+9KPS8f/93/9t+76gjiZMmJCtnXvuuaXjd999d3bOHXfc0VIfd911V0vzGF4mTpyYrb3rXe8qHc9d85ifvfbaK1vbbrvtSse33HLL7JwFF1wwW6s6Js6cObN0vOocdPfdd8/Wrrjiimwt5/nnn2+pVnUtCvrKvTeKqL5mk7vOWKXq+tCGG26YrY0fP750/PTTT8/OWWWVVRruC9rtv/7rv0rHjz/++OyctddeO1vLHfsiIhZaaKHS8ar3g4sttli21oo5c+Zka1XXdF5++eW29gH9dd9992VrVRlt5Rpfq9cFW7nOuMIKK2RrVffsDjrooMYbgy70zDPPZGvjxo0rHf/LX/7S0r4uueSSbC13zWb27Nkt7atK7lpt7h4q3e3ZZ5/N1qqub/z5z38uHX/xxRezczbddNNsbdVVV83Wcj2++uqr2TmPPfZYtjZy5Mim5y299NLZOVXX0qr+XYsvvnjp+KhR3btszCfEAQAAAAAAAAAA0BUsiAMAAAAAAAAAAKArWBAHAAAAAAAAAABAV7AgDgAAAAAAAAAAgK5gQRwAAAAAAAAAAABdwYI4AAAAAAAAAAAAusKoTjcwnFx66aVtfbwnnngiW/vc5z5XOl4URXZOSqnfPUG7Vb1mn3zyyUHsJO+ZZ57J1qZMmdLUeETE2LFjs7UJEyZka88991y21opXXnmlrY8Hjdh6662ztaqfB1VamTeY+5o7d262NmJE/ncXcvOOP/74pnugXjbffPPS8ZNOOmmQOyl33HHHtTRvzJgxpeMLLbRQf9op9dJLL5WOV+UN5pV7vcyZM6elxxs9enTTc6r2NXLkyJb6yPnWt76Vre20004tPebKK6/cYjfQ47DDDisdnz59enbOr371q2zt4osvbqmWs+CCC2ZrueN5RMTTTz9dOn7HHXc03QPU1a233pqtTZ48ua37WnHFFbO1c845p+k+Jk6c2O+eoC7uvvvulmq56xsnnnhids4OO+zQeGMNmDVrVrZ2ySWXtHVfkyZNauvj0b1ee+210vFrr702O2ePPfYYqHba5oADDigd/+///u/snPHjx2drA3GtBzplxowZpePf+MY3snN+8pOfZGtV995y10/bff+vVVVrCQ499NBs7aijjhqAbqiz2bNnZ2t77rlntva73/0uW9twww1Lx6uuP1Zd66l6z5o7N1xttdWyc6rWC9x///3Z2vPPP186vv3222fnLLrootnaIosskq21cn16qN9T8QlxAAAAAAAAAAAAdAUL4gAAAAAAAAAAAOgKFsQBAAAAAAAAAADQFSyIAwAAAAAAAAAAoCtYEAcAAAAAAAAAAEBXsCAOAAAAAAAAAACArjCq0w0MJ9/+9rdLx9dZZ53snNNOOy1bmzt3brb26KOPNt7YEPLZz362dHz55Zcf5E4YLAsttFC2NnPmzGztxhtvzNZyr6Pbbrut8cYG0KxZs7K1Z555ZtD62HrrrbO1ESOsp2ZgjBs3LlurOu5V+Y//+I/S8SlTpmTnPPjgg9laSilbu+GGG0rHN9tss+wcmNeuu+5aOr7ccstl5zz++OMD1E375I5vb7zxxqD1MHbs2Gxtww03zNa+8IUvDEA31F3ufPJd73pXds6CCy6YrX36059uuoeq89MNNtig6cercvTRR2drVce+xRdfPFt7//vf36+eYNKkSaXjF154YXbO7bffnq295z3vydZeeeWVxhvrtcoqq2RriyyySLZ21VVXNb2vVo0fP750/OCDD87Oqco1NOrNN9/M1pZccsls7emnn256X1XXQbfccstsLXfcbvW9Z5Udd9yxdPyDH/xg2/dF98pd06xSdX3j17/+ddOP9/LLL2dr559/ftOPV6Uoimyt6vy0ypprrlk6ft1117X0eHSn1157LVv793//99LxH//4xwPVzr+YOHFitnb22Wdna1X3IlddddV+9QTd7Fe/+lXp+He/+92WHm8gjm/t9PGPfzxby/0MjHAPhH9W9Z5q2WWXzdaqjlWPPPJI6fidd96ZnbPUUktla1tttVW2dscdd5SOV11zqrp3XnXvYZdddikd/9CHPpSd85a3vCVbW3jhhbO13DqDZZZZJjtnqLOiAQAAAAAAAAAAgK5gQRwAAAAAAAAAAABdwYI4AAAAAAAAAAAAuoIFcQAAAAAAAAAAAHSFhhbEpZS2Tyndm1J6IKV0REn94yml23v/uyGltEH7W4XhTQ6hHmQR6kEWofPkEOpBFqEeZBE6Tw6hHmQR6kEWofPkEDprvgviUkojI+KkiNghItaJiN1TSuvMs9nDEbFVURTrR8TXI+K0djcKw5kcQj3IItSDLELnySHUgyxCPcgidJ4cQj3IItSDLELnySF03qgGttk0Ih4oiuKhiIiU0nkRsUtE3PX3DYqiuKHP9jdGxPLtbLJbLL300qXjX/ziF7Nz9t1332xt9uzZ2drNN99cOr7LLrtk54wYUY9v0N1nn32ytW9/+9ul4yNHjhyodupi2OYwpZStjR07NlvbaqutsrVbbrmldLwoisYb6+Oll17K1s4999yWHjPntttuy9Z+8IMftHVfl156abY2alQjh4+uNGyzOJQde+yxpeP/8z//k53zy1/+Mlur+rm02WabNdwX/dLVWcwd3/7whz9k5/zlL39paV/nn39+6fhiiy2WnXPSSSe1tK+5c+eWjq+77rrZObnz54iIq6++Ols77bTy6warrbZads7WW2+drVGqq3MYEXH66ac3Pee1117L1r7zne/0p51/cfnll7f18Vr1rW99K1tbccUVB7GTYavrs1hm9OjR2drGG2+crU2fPj1b22uvvUrHf/7zn2fnrLTSStnaL37xi2wt996z6j1p1Tno0Ucfna3ljulV15toybDMYpVNN900W7vvvvuytZ/85Cel48cff3x2zr333tt4Y31UHbdb8cEPfjBbO+KIf/kwiIio/plF07o+hyussELp+Pe+973snDfffDNbmzVrVrZ28sknl44//fTT2TnHHHNMtlZlm222KR3fdttts3OqjotV9ttvv9Lxt7zlLS09HqWGfBYPPvjgbO2cc84ZtD5233330vEjjzwyO2ettdYaqHYYeoZ8Fusid7629957Z+dceOGF2dqMGTP63dNAmjx5crbm/kfThm0Ox4wZk62deOKJ2VrVuWbuvt0999yTnXPFFVdka7l7IxER48ePLx1ffPHFs3Pe9ra3ZWtrr712tpazxBJLZGsXXHBBtla19ih3v6XVc+uhoJEVUMtFxLQ+f3+sdyxnv4j4TX+aAv6FHEI9yCLUgyxC58kh1IMsQj3IInSeHEI9yCLUgyxC58khdFgjH/FTthyw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", "text/plain": [ "
" ] }, "metadata": { "needs_background": "light" }, "output_type": "display_data" } ], "source": [ "vmax = np.max([np.max(m) for m in measures])\n", "fig, axs = plt.subplots(1, num_digits+1, figsize=((num_digits+1)*4,4))\n", "for i in range(num_digits):\n", " axs[i].imshow(measures[i], origin='lower', extent=(0,1,0,1), vmin=0, vmax=vmax, cmap='Greys')\n", " axs[i].set_title(\"$\\\\mu_{{ {:0d} }}$\".format(i))\n", " \n", "axs[-1].imshow(bary, origin='lower', extent=(0,1,0,1), vmin=0, vmax=vmax, cmap='Greys')\n", "axs[-1].set_title('Barycenter')" ] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] }, { "cell_type": "code", "execution_count": null, "metadata": {}, "outputs": [], "source": [] } ], "metadata": { "interpreter": { "hash": "545e036c4b32438aced1f6b3c8d38ca151d9c36189e05839cb0aa568fda70ddd" }, "kernelspec": { "display_name": "Python 3 (ipykernel)", "language": "python", "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.10.4" } }, "nbformat": 4, "nbformat_minor": 4 }