From 348a86d12c0c3990c7100d92c514456a058d298a Mon Sep 17 00:00:00 2001 From: Markus Binsteiner Date: Mon, 31 May 2021 14:18:23 +0200 Subject: [PATCH] refactor: support type conversions & metadata extranction via modules --- .pre-commit-config.yaml | 2 +- dev/dev.ipynb | 75 +++++++ docs/modules/module_development.ipynb | 52 +++++ docs/usage.md | 8 +- onboarding.folder_to_table.json | 20 ++ setup.cfg | 6 + src/kiara/data/registry.py | 27 +++ src/kiara/data/types/__init__.py | 70 ++---- src/kiara/data/types/graphs.py | 27 +++ src/kiara/data/types/type_mgmt.py | 244 +++++++++++++++++++++ src/kiara/data/values.py | 86 ++++++-- src/kiara/interfaces/cli/__init__.py | 301 ++++++++++++++------------ src/kiara/kiara.py | 203 ++++++----------- src/kiara/metadata/__init__.py | 0 src/kiara/module.py | 40 +++- src/kiara/module_config.py | 85 +++++--- src/kiara/modules/metadata.py | 154 +++++++++++++ src/kiara/modules/type_conversion.py | 128 +++++++++++ src/kiara/pipeline/module.py | 19 +- src/kiara/pipeline/pipeline.py | 29 ++- src/kiara/pipeline/structure.py | 158 ++++++++------ src/kiara/pipeline/utils.py | 211 ++++++++++++++++++ src/kiara/profiles.py | 197 +++++++++++++++++ src/kiara/utils/__init__.py | 25 ++- src/kiara/utils/class_loading.py | 1 + src/kiara/utils/output.py | 178 +++++++++++++++ src/kiara/utils/pretty_print.py | 75 ------- src/kiara/workflow.py | 5 +- 28 files changed, 1889 insertions(+), 537 deletions(-) create mode 100644 dev/dev.ipynb create mode 100644 docs/modules/module_development.ipynb create mode 100644 onboarding.folder_to_table.json create mode 100644 src/kiara/data/types/graphs.py create mode 100644 src/kiara/data/types/type_mgmt.py delete mode 100644 src/kiara/metadata/__init__.py create mode 100644 src/kiara/modules/metadata.py create mode 100644 src/kiara/modules/type_conversion.py create mode 100644 src/kiara/pipeline/utils.py create mode 100644 src/kiara/profiles.py create mode 100644 src/kiara/utils/output.py delete mode 100644 src/kiara/utils/pretty_print.py diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 5ef648fea..7f6741380 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -44,7 +44,7 @@ repos: files: "^src/" pass_filenames: true args: ["--config-file", "setup.cfg"] - additional_dependencies: [pydantic>=1.8.0, rich>=10.0.0, ruamel.yaml, anyio>=3.0.0, pyzmq>=22.0.3] + additional_dependencies: [pydantic>=1.8.0, rich>=10.0.0, ruamel.yaml, anyio>=3.0.0, pyzmq>=22.0.3, bidict] - repo: git://github.com/pre-commit/pre-commit-hooks diff --git a/dev/dev.ipynb b/dev/dev.ipynb new file mode 100644 index 000000000..4cc9d869e --- /dev/null +++ b/dev/dev.ipynb @@ -0,0 +1,75 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 8, + "metadata": { + "pycharm": { + "name": "#%%\n" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "The autoreload extension is already loaded. To reload it, use:\n", + " %reload_ext autoreload\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAACXkAAAe7CAYAAAD/MDH9AAAABmJLR0QA/wD/AP+gvaeTAAAgAElEQVR4nOzdeXRV5bnH8d8JGUhCBoiQRIhCnKgUTwABY0IACcFcUZSC8bZ0OVS0y9sqWl11vl3isFRar12l12ndtlrbJnorFVGBo8SSBCSWBGoRUCMIhJQwZSAQMrz3D292OWTg7JOT7JPk+1krq4t93vPuZ7/73e+TZj/u7TLGGAEAAAAAAAAAAAAAAAAAgtEbIU5HAAAAAAAAAAAAAAAAAADoHEVeAAAAAAAAAAAAAAAAABDEKPICAAAAAAAAAAAAAAAAgCAW6nQAAAAAAAD0BXv37lVJSYnTYQAYgFJSUpSent4jfW/YsEF79uzpkb4BAD3n8ssv16hRo3qkb37vBYC+7frrr3c6BABAD3EZY4zTQQAAAAAAEOwKCgqUl5fndBgABqAFCxbojTfe6JG+Fy5cqDfffLNH+gYA9Jz8/Pweu4nP770A0Ldx+x8A+q03eJIXAAAAAAA28MdSAL1p4cKFPb6PniwiAwAEnsvl6pX98HsvAPQtFOkCQP8X4nQAAAAAAAAAAAAAAAAAAIDOUeQFAAAAAAAAAAAAAAAAAEGMIi8AAAAAAAAAAAAAAAAACGIUeQEAAAAAAAAAAAAAAABAEKPICwAAAAAAAAAAAAAAAACCGEVeAAAAAAAAAAAAAAAAABDEKPICAAAAAAAAAAAAAAAAgCBGkRcAAAAAAAAAAAAAAAAABDGKvAAAAAAAAAAAAAAAAAAgiFHkBQAAAAAAAAAAAAAAAABBjCIvAAAAAAAAAAAAAAAAAAhiFHkBAAAAAAAAAAAAAAAAQBCjyAsAAAAAAAAAAAAAAAAAghhFXgAAAAAADFDLli2Ty+WSy+XSqFGjnA4HQWLFihXWvHC5XDpx4kRA+t29e7euueYa1dbWBqS/vuD+++9Xfn6+02EMOKxtaNPTc+FPf/qT1f/gwYODsu/PPvtMeXl5SkpKUmhoqNVnfHy81SYYr5n+nDPIDc4IxnmO4ECu6Pk+A40cAQAYyCjyAgAAAAAgSNTX1+uCCy7Q3Llze2V/9957r4wxcrvdjsfSlWCKZSC49tprZYzRvHnzAtZneXm5Lr30UuXk5Cg2NjZg/frKqTm0ePFiPfDAA3rkkUd6db/BhrWtY8EUS2/qzePuai4Ewg033CBjjGbNmhWUfe/atUvp6en67LPP9Oc//1m1tbWqra1VQUGBQkL+dWugp8fJLqdzRk8jN3yD3NCxYIploBjoucJOn8EwP8kRAICBjiIvAAAAAACChDFGra2tam1tdToUYvHTkCFDlJmZ6XQYPumtWGtra3X11VfrO9/5jn70ox/51Ud3Y3VqDp133nl666239MQTT6igoKBX9x1MgukaJhb/BHK96EvH3de99NJLqqmp0fLly3X55ZcrKipKMTExWrhwoQ4fPux0eB0KRM4IduSGbwTTWkAs/ulLv/ciMJyen+QIAACkUKcDAAAAAAAA34iJidGXX37pdBiSiAWB88wzz6iqqkqPPvqoYzE4OYfcbrcWLFign/zkJ5o/f75CQwfen+OC6RomFucN1ON2wueffy5JuuSSSxyOxHfBkDN6A7khuNYCYgF84/T8JEcAAMCTvAAAAAAAANBDjDF65ZVXNHXqVJ199tlOh+OY6667Tnv37tWqVaucDgXAANLU1CRJioiIcDgS3wy0nEFuAADfkSMAAPgGRV4AAAAAAPSAZcuWyeVyyeVyadSoUSotLdWsWbMUExOjqKgozZw5U8XFxVb7FStWWO1dLpdOnDjhVz9tqqurdeedd2r06NEKDw/X8OHDNX/+fJWXl58x9s5iOX37rl27lJeXp/j4eCUkJGju3Lkd/pfdwRCL3XF8/PHHrfanvobm/ffft7afddZZ7fo/duyYiouLrTb+/lfX/pz35uZm5efna/bs2UpKSlJkZKTGjx+v559/3uuVKnZjraqq8uk8d2TLli365z//Kbfb3e6zxsZGPfrooxo7dqyioqI0bNgwXX311Xr77bfV0tLiU6ynz4MdO3bo+uuvV0JCgrXtlVdeCeh83r59u6699lrFxcUpKipKU6ZM0TvvvKPs7Gyrr1tvvdXrO2lpaZKk1atX+zRuwYy1Lbhi6WtrW6DPwaFDh3TPPffovPPOU0REhEaNGqXs7Gz99re/1fHjxzuNw+44tDn1+o+Ojta0adNUVFTU6X7szBG7fXelbTz/8pe/SJIiIyO9xrft56abbvKpP1+Pw5d1vStd5Qxfc5w/eaGjNgcPHvRpn0ePHm03ro8//rgV86nbFyxY4HVM5AZyQ0/F0tdyg52xy8zM9BqLRYsWSZLX72Eul0tHjx61vkOu6Jqvffo6PztbU8kRAzdHAAACzAAAAAAAgDPKz883/vzfaLfbbaKjo016eropKSkx9fX1prS01FxyySUmPDzcFBYWerWfN2+ekWSOHz/udz+VlZXm3HPPNYmJiWbVqlWmrq7OfPrpp2b69Olm8ODBpqSkpF3fI0eObBd7Z7G0bZ83b54Vy9q1a01kZKSZPHmyV1u7sXQmELHYHUdjjImOjjYZGRnt+pk0aZJJSEhot72z9m1mzpxphg0bZjZs2ODTcduJd+XKlUaSefLJJ83hw4dNdXW1+eUvf2lCQkLMvffeazvWjsb2gw8+MLGxsR2ObUdee+01K6bT3XrrrSYuLs6sWbPGNDQ0mKqqKnPvvfcaSWbdunV+xTp9+nSzbt06c+zYMbNx40YzaNAgU11d7dWmO3Po888/N/Hx8WbkyJFmzZo11nzOzs42w4cPNxERER3GV1NTYySZadOm+TJsXhYsWGAWLFhg+3s93T9rG2vbqeyubYE47v3795sxY8aYpKQks3LlSlNbW2uqqqrM0qVLjSTz3HPPeY1PR3PBzjh0dP1v3brV5OTkmNGjR7e7/u3MEbt9+6qzca6urjaSzI033ui1vaNxsnMcdtb1jnSVM+zmODt5obM2dvY5Z84cExISYr744ot2saSnp5vXX3+93fbu5AZJJj8/3/b3fMXvve23kxt6NjfYGbvy8nITHR1t3G63qa+vN8YYc+LECTN16lTzxz/+0atfckXX/OnzTPOzszWVHNE7OcLf9RsA0GcUsMoDAAAAAOCD7tzskmTKysq8tm/dutVIMm6322t7Vze7fO3nxhtvNJLa/bF4//79JiIiwkyaNKld3/7c7Fq5cqXX9gULFhhJ1h/G/YmlM4GIpe1Y7ZyPQN/smj59uhk6dKjPN/nsxLty5UozY8aMdn0sWrTIhIWFmZqaGluxdja23/3udzsc244888wzRpJZvnx5u8/GjBljLr/88nbbL7zwQr+LvN59990ztunOHFq4cKGRZN58802vtgcOHDBRUVFd3lxzuVzm/PPP7/TzzgRzkRdrG2tbG7trWyCO+6abbuq00OXKK68M+I37zq7/ffv2mYiIiHbXv505YrdvXwWiyMvOcdhZ1zvSVc6wm+Ps5IXO2tjZ5+rVq40kc8cdd3i1LSoqMiNHjjQnT57scB/+5oZgLvIiN5Ab2tjJDXbHrqCgwEgy8+fPN62trebGG280Dz74YLt+yRVd86fPM83PztZUckTv5AiKvACg3yvgdY0AAAAAAPSw6Oho63ULbcaPH6+zzz5bW7Zs0f79+wPaz4oVKxQSEqK5c+d6tU1KStK4ceP0t7/9TXv37u3GEX1j8uTJXv9OSUmRJFVWVlrbgimWNoE6H/4oLCzU4cOHlZ6e7vN3fI137ty5WrduXbvvu91uNTU16R//+IdfMZ8+tiNHjpTU8dieru01LmFhYe0+u/LKK1VSUqLbbrtNGzdutF7TsmPHDs2YMcOvWKdMmeLX9yTf5tD7778vSZozZ45X2+HDh2vs2LFd9h8aGtrlK4H6Ita24IilTV9b27riy3G/9dZbkqTc3Nx233/vvfe0ZMmSgMTSprPr/+yzz9aFF17Yrr2dOWK3795k5zi6u653lTP8zXG+5IXO2tjZZ05OjsaPH6/f/va3OnTokLX92Wef1Y9//OMOj0kiNwSin2Baj4MpljZ9JTfYHbuFCxfqoYce0p///GdlZmbq0KFDWrp0abt+yRWBjdcXna2p5AhyBAAgMCjyAgAAAACgh8XHx3e4fcSIEZKkAwcOBKyfxsZG1dTUqLW1VXFxcXK5XF4/mzdvliR9/vnndg+jnbi4OK9/h4eHS5JaW1slKahiOVWgzkdv8TXempoaPfrooxo/fryGDh1qjfN9990nSWpoaPBr/6ePbUjIN39O6mhsTzd48GBJUlNTU7vPli9frldffVUVFRWaNWuWYmNjdeWVV1o34/wRHR3t93d9mc91dXUaPHiwhgwZ0u77Q4cO7bL/5uZmRUZG+h1fMGJtcz6WU/W1ta0rvp6DwYMHKyYmpsfjOdP13zbGp7b3dY7Y7bs32Z3r3V3Xu8oZ/uY4X/JCZ23s7nPJkiVqaGjQr3/9a0nSzp079eGHH+q2227rdN/khu71E0zrcTDFcqq+kBv8HbulS5dq6tSpKikp0cKFC63fUU/vl1wRmHh91dmaSo4gRwAAAoMiLwAAAAAAetihQ4dkjGm3ve2miq9/QPeln4iICMXHxys0NFRNTU0yxnT4M3PmzG4ckW+CKZZT2TkfISEhOnnyZLu2R48e7bBvl8sVoCj/xdd4r776ai1dulSLFy/Wzp071draKmOMnnvuOUlq10dPxHq65ORkSd/cBDmdy+XS97//fXk8Hh09elQrVqyQMUbz58/XL37xi16P9UwiIiIUExOjEydOqL6+vt3nXd0kra2tlTHGGo/+grXN+VhO1dfWtu6IiIhQXFycTpw4obq6Or/78XUcznT9Hz58uF17X+eI3b57k925bmdd70hXOcNujgsEu/v83ve+p8TERP3qV79SY2Ojfv7zn+vGG2/stAiY3ND9foJpPQ6mWE7VF3KDv2NXWFiompoajR8/XnfccYe2bNnSrl9yRed6O/+QI8gRAIDAoMgLAAAAAIAeduLECZWWlnpt+/vf/67Kykq53W6f/3Draz/z589Xc3OziouL2/Xx9NNP65xzzlFzc7OfR2NPMMXSxs75SE5O1r59+7zaVlVV6euvv+6w76ioKK+bQBdddJFeeumlHo+3paVFxcXFSkpK0p133qnhw4dbN946e8VHT8R6um9/+9uS1OGrieLj47V9+3ZJ37x2Zfbs2VqxYoVcLpdWrVrV67H6ou1VP22vtmlTVVWlnTt3dvq9tjnUNh79BWtbcMTSpq+tbd113XXXSZLefffddp9NmDBBd9999xn7sDMOnV3/Bw8e1I4dO9q1tzNH7Pbdm+wch511vSOd5Qx/clx3+bPPiIgI3XHHHTpw4IB+/vOf6/XXX9ddd93V6T7IDYHpJ5jW42CKpU1fyQ12x+6rr77SD37wA/3v//6v3n77bUVGRmrevHmqrq72+i65omu9mX/IEeQIAEBgUOQFAAAAAEAPi4uL04MPPqgNGzbo2LFj+uSTT7Ro0SKFh4fr+eefD3g/Tz31lM477zzdcssteu+991RTU6PDhw/rxRdf1GOPPaZly5YpNDS0Jw61nWCKpY2d85GTk6PKykr96le/Un19vb788kvdddddnT6FYuLEidq5c6f27NmjDRs2qKKiQtOmTbM+v+KKK5SQkKCNGzcGNN5BgwZpxowZqqqq0rPPPquDBw/q+PHjWrdunV544QW/Yg0Et9utESNGtHuyQpsf/vCH2rp1qxobG3XgwAE988wzMsboiiuu6PVYffHkk09q2LBhWrJkidauXav6+np9+umnuvnmm5WUlNTp98rLyyV9M5/6E9a24IilTV9b27rrqaee0pgxY3T33Xdr1apVqqur0969e3XHHXdo//79Pt24tzMOHV3/27Zt06JFizp8zZWdOWK3795kd677uq53pLOc4U+O6y5/93nHHXcoMjJSDz/8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fvppnXPOOWpubvbafuLECZWWlnpt+/vf/67Kykq53e4evUnpa7wtLS0qLi5WUlKS7rzzTg0fPty6gd7R65DaXk3V9uqmNgcPHtSOHTt64Eh8Z+cc2ZkXfcV1110nSe3ib2xs1AcffKDIyMh2r9o6nd3z68914Y9vf/vbktTh670Cxc74+XMdJCcna9++fV7bqqqq9PXXX/scY0+OdyDmz5nU19dry5YtXts6WhN9jcXu+uULp9a4zvZbVVWlnTt39th+/eVrfuuJedVVru4OO7G2tX333Xfb9TNhwgTdfffdPTI//dGfckPbGtqWEwAAAND/UeQFAAAAAAAwwPzwhz/U1q1b1djYqAMHDuiZZ56RMUZXXHGFV7uJEydq586d2rNnjzZs2KCKigpNmzZNkvTUU0/pvPPO0y233KL33ntPNTU1Onz4sF588UU99thjWrZsmUJDQ736i4uL04MPPqgNGzbo2LFj+uSTT7Ro0SKFh4fr+eef92p7xRVXKCEhQRs3bgzIMfsa76BBgzRjxgxVVVXp2Wef1cGDB3X8+HGtW7dOL7zwQrt+n3zySQ0bNkxLlizR2rVrVV9fr23btmnRokUdvsapN9k9R77Oi77iqaee0pgxY7RkyRK98847qqur086dO/Xd735X+/fv1/PPP2+9mqszds+vP9eFP9xut0aMGNGuQCiQ7IyfP9dBTk6OKisr9atf/Ur19fX68ssvddddd9l6op/d8bazrgRi/pxJdHS0fvSjH+njjz/uck30NRa765cvnFrjOtrvp59+qptvvrnDpyzt2rVLgwYN8nr9XW/yNb/1xLzqKld3h51Y29refffdWrVqlerq6rR3717dcccd2r9/v+6+++4emZ89fVydCZbcUF5eLumb9RQAAAADhAEAAAAAAECflJ+fb+z+eae8vNzcfvvt5lvf+paJiooyw4YNM5dddpl5+eWXTWtrq1fb7du3m2nTppno6GiTkpJili9f7vX5oUOHzD333GNSU1NNWFiYGT58uMnJyTFr165tt1+3221Gjhxptm3bZubMmWNiYmJMZGSkmT59uikqKmrXftq0aWbo0KGmpKSky+PZsGGDkdTupyO+xltdXW1uv/12k5KSYsLCwkxiYqK56aabzP3332/1P2nSJKv9jh07zLXXXmtiY2NNZGSkmTx5snnnnXfMrFmzrPY/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KrW56wk9PeajYY6XLFkSKaW4+uqrY+DAgXHCCSfEK6+8EieffHKxSztq3XXXXbFr165YtGhRfPjDH44BAwZEdXV1LFiwIHbs2FHs8trV2NgYc+bMiU984hPxuc99LmvbkTieo8EJJ5wQ9913X9xyyy1RX19f7HIAAKBohLwAAAAA4AhUXV0dv/vd7+LBBx8sdinQI1555ZWIiBg2bFiRK6HFc889FxERp5xySpEryd1tt90WW7dujRtvvLHNtiNxPEeL2tramD9/fnzhC1+IAwcOFLscAAAoCiEvAAAAAABK3ttvv13sEjjI/v37IyKioqKiyJXkJqUU//Iv/xJnnHFGjB49us32I208R5vzzz8/Xn311Vi2bFmxSwEAgKIQ8gIAAADgqLVv37648cYb44//+I9jwIABMXTo0JgzZ0785Cc/aQ2U3HHHHZHJZOKNN96IlStXRiaTiUwmE+Xl5Vl9NTQ0xFVXXRXHH3989OvXL4YPHx7z5s2LtWvXtu7T0lcmk4ljjz021qxZE9OnT4/q6uoYMGBATJs2LVauXNlp3ffff39rP5lMJvbu3dtu+4svvhh1dXUxePDgGDZsWMyePTt+97vfdbmem2++uXX/d78a8OGHH25tf8973tOm/87mLl/bt2+Pz3/+83HCCSdERUVFHHvssfHRj3407r777tizZ0+bedi4cWNccMEFMWzYsNa2bdu2RURu5y0i4sCBA7F48eL42Mc+FiNHjozKysqYMGFCfOtb38p6ZWYh10sucjlerrUf7Jlnnolzzz03ampq8lqfhR5jy/n88Y9/HBERlZWVkclk4kMf+lBe5/rd66Zfv34xZMiQOOecc2L58uVtjtXy9dJLL0VdXV1UV1fHsGHD4uKLL44//OEP8eKLL8acOXOiuro6Ro0aFVdccUU0NTXlNa4Wna3niM7vVTt37syqO5PJxM033xwR75z/d7fPnz8/pz67ck4O/rrssstymoNc10p3ao6IWLduXbz22mtRW1tbEuPJV2fXZL736HyfGe+u47zzzouampqoqqqKKVOmxIoVK/IeT77zdOqpp0ZExE9/+tO8jwUAAL1CAgAAAIBeYPHixSnfX3ddfvnlqaamJj3yyCPpzTffTFu3bk3XXXddioi0fPnyrH2rqqrSRz7ykXb72bx5c3rve9+bRowYkZYtW5aamprSU089laZOnZr69++fVq1albV/bW1tqqqqSpMnT06rVq1Ku3fvTmvWrEmnnHJK6tevX3r00Udzqn/u3LkpItKePXvabZ87d25r/z/72c9SZWVlOv3009v0k289Hc3FpEmT0rBhw9q0H2ruUkpp2rRpaejQoWn16tWdjnnLli1p3LhxaeTIkWnp0qWpsbExbd26Nd10000pItI3v/nNNvMwderUtHz58vTGG2+kxx57LPXp0yc1NDTkdd6WLl2aIiJ97WtfSzt27EgNDQ3pH//xH1NZWVm67rrr8hpzvuslF4c6Xr6119bWppqamjRt2rS0YsWK1NTUdMj1UFtbm8aMGXPYx9jRen/3to7Odcu6GTFiRFq6dGnatWtX2rhxY5o3b17KZDLpu9/9brv9zZs3Lz3++ONp9+7d6Z577kkRkc4555w0d+7c9OSTT6ampqZ05513pohI1157bd5jynU953qvmjVrViorK0vPP/98m2NNnjw53Xvvva3f53P/60hH56ShoSFFRLr00kuz2ru7Vrpb8/e+973Wa6EUxpOrfK/JfO/R+TwznnvuuTR48OA0ZsyY9Mgjj6Smpqa0fv36NGPGjHT88cenioqKdusvxDzt2rUrRUSaMmVKTvPWoiv/PgAAgBJU71+1AAAAAPQKXfkQd9y4cenDH/5wm/b3v//9eYW8Lr300hQR6fvf/35W+5YtW1JFRUWaNGlSVnttbW2KiPTkk09mta9fvz5FRKqtrc2p/s5CXkuXLs1qnz9/foqI1NDQ0K16Ch3ymjp1ahoyZEhO4YfLLrssRURavHhxm22zZs1qN+T14IMPtttXPudt6dKl6ayzzmrTx8KFC1Pfvn3Trl27stoLuV5y0VnIK5/aW9bDwaG7jtZDewGOwzHGXEJeHZ3rlnXzH//xH1nte/fuTaNHj06VlZVp69atbfpbtmxZ1v7jx49PEZF++ctfZrWPGzcunXTSSXmPKdf1nOu96uc//3mKiPTZz342a78VK1ak4447Lu3fvz+r5lzvfx0pRCgqn7XS3Zpvu+22FBFp0aJFJTGeXOV7TXY15JXLM2PBggUpItIPf/jDrH03bdqUKioqcg55dXWeMplMOvHEE9vd1hEhLwAAeol6r2sEAAAA4Kg1a9asWLVqVXzmM5+Jxx57rPV1Xxs3boyzzjor537uv//+KCsri9mzZ2e1jxw5MsaPHx9PPPFEvPrqq1nbqqqqWl891WLChAkxevToWLduXWzZsqVrg3qX008/Pev7sWPHRkTE5s2b2+zbE/V05NFHH40dO3bE5MmTO933vvvui4iIc845p822hx56KK655po27R/84Afb7Suf8zZ79uys1/q1qK2tjf3798fTTz/dae1dOW4hdKX2/v37xxlnnJHVls966OkxtujoXLesm3PPPTervaKiIqZPnx579uxp9xVwp512Wtb3o0ePbrd9zJgx7V5Xncl1Ped6r5o+fXpMnDgx7r777ti+fXtr++233x7XXHNN1ms8C3X/66581kp3a255tW3fvn0LO4h3OVxrv7vXZC5yeWY8/PDDERExc+bMrH1Hjx4d73//+3M+Vlfnqby8vPU1pgAAcLQR8gIAAADgqLVo0aK455574oUXXojp06fHoEGDYtasWa3Bi1zs27cvdu3aFc3NzVFTUxOZTCbr63//938jIuK5557L+rnBgwe3298xxxwTERGvv/56F0f1f2pqarK+79evX0RENDc3t9m3J+rprpa57t+/f1RXV+f8c1VVVR32let527VrV9x4440xYcKEGDJkSOt+119/fUREvPnmm3mNId/10h1dqX3YsGGRyWTatOeyHooxxhaHOtcdrZsRI0ZERMTWrVvbbBs0aFDW92VlZdGnT58YMGBAVnufPn3ava4OJZ/1nM+96gtf+EK8+eab8c///M8REfHss8/Gr371q7j88su73Ofhku9a6W7N/fv3j4iI/fv3l8R48tGdazJXnT0z9u3bF01NTdG/f/8YOHBgh7V0pjvzdODAgaisrMxrXAAA0FsIeQEAAABw1MpkMnHxxRfHz3/+89i5c2fcf//9kVKKefPmxT/8wz+02bc9FRUVMXjw4CgvL4/9+/dHSqndr2nTpmX93Pbt2yOl1Ka/lg/qc/2wvFDyqaesrCzeeuutNvvu3Lmz3b47mrt8VVRURE1NTezduzeampq63Vc+523OnDlx0003xRVXXBHPPvtsNDc3R0opvvnNb0ZEtJm7Qq+XzhxqjvOtPeKdYFh7clmfh2uMXdXZunnttdci4p2/INST8lnP+dyr6urqYuzYsfHtb3879u3bF9/4xjfiiiuuaBMky6fPwyXftdLdmkeNGhURHa/vnh5PPvK5JvO9R+eqoqIiqqurY+/evbF79+42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TZuWVqxYkZqamg55/mpra9OYMWMO+xhbzueePXs63NbRuW5ZNyNGjEhLly5Nu3btShs3bkzz5s1LmUwmffe73223v3nz5qXHH3887d69O91zzz0pItI555yT5s6dm5588snU1NSU7rzzzhQR6dprr817TLmu51yv5VmzZqWysrL0/PPPtznW5MmT07333tv6fT73h/Z873vfa11X7SnEHOZz3p577rk0ePDgNGbMmPTII4+kpqamtH79+jRjxox0/PHHp4qKijY1dnTdTJo0KQ0bNqxNeyHWej73u0PVmNLhv7YLMT/51tjZtXwwz4T2eSYcmc+ElAq3VtauXZuqqqpSbW1t2r17d0oppb1796Yzzjgj/cd//Edex81VR+ekoaEhRUS69NJLs9q7u1byfY7t2rUrRUSaMmVK3mObP39+mj9/ft4/BwDQy9ULeQEAAAB0IN+Q17hx49KHP/zhNu3vf//78wp5XXrppSki0ve///2s9i1btqSKioo0adKkrPba2toUEenJJ5/Mal+/fn2KiFRbW5vVPnXq1DRkyJCcPuS97LLLOpyHWbNmtfuB/oMPPtjtcS1dujSdddZZbfpYuHBh6tu3b9q1a1dWeyHnMxedfaCfT+0t5+/gEEpH56+9D2kPxxhz+UC/o3Pdsm4O/mB77969afTo0amysjJt3bq1TX/Lli3L2n/8+PEpItIvf/nLrPZx48alk046Ke8x5bqec72Wf/7zn6eISJ/97Gez9luxYkU67rjj0v79+7NqzvX+0J7bbrstRURatGhRu9sLMYf5nLcFCxakiEg//OEPs/bdtGlTqqioOGwhr3zXej73u0PVmNLhv7YLFfLKp8bOruWDeSa0zzPhyHwmpFTYtVJfX98aTmtubk6XXnpp+tKXvpT3cXNViJBXPmPsynMsk8mkE088MY9RvUPICwCgXfVe1wgAAABQILNmzYpVq1bFZz7zmXjsscdaX12zcePGOOuss3Lu5/7774+ysrKYPXt2VvvIkSNj/Pjx8cQTT8Srr76ata2qqqr1tTgtJkyYEKNHj45169bFli1bWtsfffTR2LFjR0yePLnTWu67776IiDjnnHPabHvooYfimmuuadP+wQ9+sNvjmj17druvh6utrY39+/fH008/3WntXTluIXSl9v79+8cZZ5yR1dbR+WtPT4+xRUfnumXdnHvuuVntFRUVMX369NizZ0+7r2867bTTsr4fPXp0u+1jxoyJzZs3511vrus512t5+vTpMXHixLj77rtj+/btre233357XHPNNVmv3+ru/WHv3r0REdG3b99D7tedOcznvD388MMRETFz5sw2x3v/+9/f6Xi6Kt+1ns/9rjPFuLZ7osaIjq/lg3km5M8zoXSfCZ3Jdx4XLFgQX/7yl+NHP/pRnHnmmbF9+/a46aabCl5XIeUzxq48x8rLy1tfhQwAQPcJeQEAAAAUyKJFi+Kee+6JF154IaZPnx6DBg2KWbNmtX64mYt9+/bFrl27orm5OWpqaiKTyWR9/e///m9ERDz33HNZPzd48OB2+zvmmGMiIuL111/PezwttfTv3z+qq6tz/rmqqqoO+8p1XLt27Yobb7wxJkyYEEOGDGnd7/rrr4+IiDfffDOvMeQ7n93RldqHDRsWmUymTXsu568YY2xxqHPd0boZMWJERERs3bq1zbZBgwZlfV9WVhZ9+vSJAQMGZLX36dMnmpub86o1n/Wcz7X8hS98Id58883453/+54iIePbZZ+NXv/pVXH755V3usz39+/ePiIj9+/cfcr+uzmE+523fvn3R1NQU/fv3j4EDB7bZt2XdFlox13pEz1/bPVVjRPvX8sE8E7rGM6E0nwmd6eo83nTTTXHGGWfEqlWrYsGCBVFWVrofw+U7xq48xw4cOBCVlZU9Mh4AgKNB6f7rEgAAAOAIk8lk4uKLL46f//znsXPnzrj//vsjpRTz5s2Lf/iHf2izb3sqKipi8ODBUV5eHvv374+UUrtf06ZNy/q57du3R0qpTX8tHwR3JXRRUVERNTU1sXfv3mhqasr75w/uK59xzZkzJ2666aa44oor4tlnn43m5uZIKcU3v/nNiIg2Yy30fHamo+N1pfaId0IA7cnl/B2uMXZVZ+vmtddei4h3/kpIT8pnPedzLdfV1cXYsWPj29/+duzbty++8Y1vxBVXXNEmzJBPn+0ZNWpURHS8Vrorn/NWUVER1dXVsXfv3ti9e3ebfXfs2NHuMcrKyuKtt95q075z586cazzca72Y13Z356erNebKM6FjngkdK9VnQotCr5VHH300du3aFRMmTIjPfvazsW7duryO25PyHWO+z7HGxsZIKbU+vwAA6D4hLwAAAIACGTx4cDzzzDMR8c4r1T72sY/F/fffH5lMJpYtW5a174ABA7I+zD/ppJPirrvuioiIefPmxYEDB2LlypVtjnHrrbfGcccdFwcOHMhq37t3b6xZsyar7Te/+U1s3rw5amtru/wB2/nnnx8REQ8++GCbbRMnToxrr702575yHdfbb78dK1eujJEjR8ZVV10Vw4cPb/0wtKNX/hR6PjvT0fG6UntExO7du9t8EJzP+TscY+yOlnVz8Lrft29f/OIXv4jKyso2r/nrybo6W8/5XMvl5eVx9dVXx+uvvx7f+MY34gc/+EFcddVVbfrPp8/2nHzyyRERh+UVay3yOW8tr+treW1ji23btsXGjRvb7X/UqFGxadOmrLatW7fGyy+/nHONh3utF/Pa7u78dLXGfHgmtM8z4dBK9ZkQUdi18vvf/z4+/elPx3/+53/GT37yk6isrIy5c+dGQ0NDXsftSfmMMd/nWMv9rOX5BQBAASQAAAAA2hURafHixTnvX1NTk6ZOnZrWrVuX9u7dm1577bX01a9+NUVEuvnmm7P2nTVrVqqpqUkvv/xyWrVqVSovL08bNmxIKaX02muvpRNOOCG9733vSw8++GDauXNn2r59e7rzzjvTgAED2tRUW1ubampq0vTp09OqVavS7t2705o1a9Ipp5yS+vXrlx599NGs/adNm5aGDh2aVq9e3emYtmzZksaNG5dGjRqVHnjggdTY2JheeeWV9Fd/9VdpxIgR6aWXXmrdd+7cuSki0p49e9rtK59xnX322Ski0m233ZYaGhrSm2++mf7rv/4rHXfccSki0s9+9rPDNp+5ONTx8q29trY2VVVVpTPPPDM99thjnZ6/2traNGbMmC7Pba4OdT47O9ct62bEiBFp6dKlqbGxMW3cuDHNmzcvZTKZdNddd+XU38yZM1OfPn3a9D916tRUVVWV95hyXc/5XMsppdTY2JhqampSJpNJl1xySbvHzrfPgzU3N6djjjkmfeQjH2l3eyHmMJ/z9vzzz6ehQ4emMWPGpEceeSQ1NTWlp59+Os2cOTMdc8wxqaKios0xP/e5z6WISP/0T/+Umpqa0vPPP58uuOCCNGbMmDRs2LA2+xdiredzv0upuNd2IeYn3xo7Wje///3vU1lZWYqI9MQTT7S2eya0zzPhyHwmpFS4tdLU1JROOeWU9OMf/7i17dFHH019+/ZN/+///b/01ltv5XzcXHU0Tw0NDSki0qWXXprV3t21ku9z7N57700Rke677768xpVSSvPnz0/z58/P++cAAHq5eiEvAAAAgA7kG/Jau3ZtuvLKK9Of/MmfpAEDBqShQ4emD33oQ+m73/1uam5uztr3mWeeSVOmTElVVVVp7NixadGiRVnbt2/fnj7/+c+n973vfalv375p+PDhacaMGW0+DE7p/z6027BhQ5o5c2aqrq5OlZWVaerUqWnFihVt9p8yZUoaMmRIWrVqVU7j2rZtW7rmmmvSuHHjUt++fdOoUaPShRdemJ599tmUUkqrV69OEdHmqz25jquhoSFdeeWVaezYsalv375pxIgR6bLLLktf/OIXW/ufNGnSYZnPXBzqeLnWfvvtt7d+P2bMmPQ///M/adq0aWngwIHtnr9379/y9eUvf7ngY7zvvvvaPZ+rV6/O61wfvG5qamrSzJkz0y9+8YvWfdrr78tf/nJas2ZNm/avf/3r6de//nWb9r/7u7/La3ydreeU8ruWW1x//fUpItK6deva3d6VPg/2pS99KZWXl6dNmza1thV6DnM5by02btyYzjvvvDRo0KBUWVmZTj/99PTAAw+k6dOnt/b96U9/unX/nTt3pssvvzyNGjUqVVZWpjPPPDOtWbMmTZo0qXX/v/mbvynoWs/3fleMa7uQ85NrjZ1dyy0hr0wmk9avX59Vp2dCW54JR+4zoRBr5a//+q+zavjNb37TGrR699dNN92U83EPpb1zctFFF6WU3gnCHbytJQzW3bWS73NswYIFacyYMW0CbrkQ8gIAaFd9JqV2XvgOAAAAQGQymVi8eHFccMEFxS7lkE499dTYtm3bYX2NG1B8u3btivHjx8fs2bPjzjvvLHY5ANCudevWxcSJE+Pee++NCy+8MO+fX7BgQURELFmypNClAQAcyZaUFbsCAAAAAAA6V1NTE0uXLo0f/vCHsWjRomKXAwBtvPDCCzFv3ry44YYbuhTwAgCgY0JeAAAAAABHiIkTJ8bjjz8eDz30UDQ2Nha7HADI8p3vfCduueWWuOWWW4pdCgBAryPkBQAAAHCEuuOOOyKTycS6deti06ZNkclk4itf+UqxyzpiZTKZTr+++tWvFrvMbumtY+yt4+rI8ccfHw888EAMGjSo2KVAr3U03Fd66xiP5HEdybW3uPXWW/0FLwCAw6S82AUAAAAA0DXXXXddXHfddcUuo9dIKRW7hMOut46xt44LKJ6j4b7SW8d4JI/rSK4dAIDDz1/yAgAAAAAAAAAAKGFCXgAAAAAAAAAAACVMyAsAAAAAAAAAAKCECXkBAAAAAAAAAACUMCEvAAAAAAAAAACAEibkBQAAAAAAAAAAUMKEvAAAAAAAAAAAAEqYkBcAAAAAAAAAAEAJE/ICAAAAAAAAAAAoYUJeAAAAAAAAAAAAJUzICwAAAAAAAAAAoIQJeQEAAAAAAAAAAJQwIS8AAAAAAAAAAIASVl7sAgAAAABK2erVq4tdAtCOt956K1599dUYNmxY1NTUFLscgILbvn17DBw4MCoqKopdCvSoV199NY499thilwEAUHIyKaVU7CIAAAAASlEmkyl2CQAAcNSZP39+LFmypNhlAACUkiX+khcAAABAB/y/cdBz9u/fH6+88ko8/fTTsWHDhnj66afjiSeeiI0bN8bbb78dffv2jbFjx8af/umfxvjx41v/e/LJJ/srN7RRX18fdXV17uMc0Xbs2BEPPPBALFmyJH76059GeXl5TJ8+PRYsWBDz5s2LgQMHFrtEAACgB/lLXgAAAABAjzlw4EC8/PLLWWGulv/u3bs3ysvL47jjjmsT5ho/fnz079+/2OVzhBDyorfZvn17LFu2LJYsWRIPP/xw9O3btzXw9YlPfCKqqqqKXSIAAHB4LRHyAgAAAAAK7u23346XXnqpTZhrw4YNsWfPnoiIGDVqVEyaNCkrzPWnf/qnUVlZWeTqOdIJedGbbd26Nf7zP/8zlixZEr/+9a+jqqoq5syZExdccEHMmjXLXzcEAIDeScgLAAAAAOiezZs3t/mrXE8++WS8+eabEfFOmOvgINcHPvCBGDBgQJErp7cS8uJosW3btnjwwQdb/8LXwIED44ILLoiLL744zjzzzGKXBwAAFI6QFwAAAACQm/bCXGvXro033ngjItoPc02cONFrxOhxQl4cjTZt2hT//u//HnfffXc888wzcfLJJ8ef//mfx8KFC+OYY44pdnkAAED3CHkBAAAAANnaC3OtX78+mpqaIqL9MFdtbW1UV1cXuXJ4h5AXR7snnngi7rnnnvj+978fO3fujGnTpsVnPvOZmDt3bvTr16/Y5QEAAPkT8gIAAACAo9Uf/vCHrCDXhg0bYt26ddHQ0BAREUOGDMkKco0fPz5qa2tj+PDhRa4cDk3IC96xb9+++MlPfhL33HNPPPzww1FdXR0LFiyIK6+8Mj7wgQ8UuzwAACB3Ql4AAAAA0Nu1F+Zav359vP766xHRfpjrlFNO8XovjlhCXtDWyy+/HPfcc0/827/9Wzz//PPxgQ98ID796U/HxRdf7C8xAgBA6RPyAgAAAIDeor0w11NPPRVbt26NiPbDXCeffHKMHDmyyJVDYQl5QcdSSrFixYr413/916ivr48+ffrEpZdeGn/9138dJ510UrHLAwAA2ifkBQAAAABHmp07d8bvfve7NoGuF154ISIiampq4sQTT2wT6Hrf+95X5MqhZwh5QW4aGxvj/7N35+FRlYfbx+/JShICgYAkhAghoLIGihRRMAgYFaFITAhWBKxAK1ZRhKqoaMWlIIqoKAJtLdRXCCggYl1awJbFFigQ9sUEIYRA2LKwhCzP+4e/pIyTkJlkkjMJ38915erFmTNn7ueZk+Rp5vacRYsW6a233tKePXt0yy23aPz48YqPj5e3t7fV8QAAAAD8DyUvAAAAAAAAwFPl5OTowIEDDmWutLQ0GWPUoEEDtW3b1qHMFRUVJZvNZnV8wDKUvADXFBcXa/Xq1Zo1a5ZWrVqlqKgojR07VqNHj1ZoaKjV8QAAAABQ8gIAAAAAAACsl5+fr4MHD2rLli1llrn8/f0VHR2tbt26UeYCnEDJC6i8gwcPav78+Zo7d64uXLigxMRETZw4UZ07d7Y6GgAAAHA1o+QFAAAAAAAA1JRLly7pwIEDdkWuXbt2ae/evSouLpafn5/atGljV+Rq37692rVrJy8vL6vjA7UGJS+g6nJycrRgwQK9++672rdvn/r06aNHH31U99xzD7+TAAAAgJpHyQsAAAAAAABwt4KCAu3fv7/cMpevr6/atm3rUOa64YYb5O3tbXV8oNaj5AW4jzFG33zzjd555x198cUXio6O1qRJkzRixAj5+/tbHQ8AAAC4WlDyAgAAAAAAACqroKBAR44c0a5du+xutbhv3z4VFRXJ19dXkZGRat++vd2tFilzAdWLkhdQPb7//nu9/fbbmjdvnoKDg/Xwww9r/PjxatSokdXRAAAAgLqOkhcAAAAAAABQkcLCQh0+fNjuqly7d+/Wzp07lZ+fLx8fH1177bV2V+Xq0KGDOnbsyFVOAAtQ8gKqV0ZGht566y198MEHkqSHH35YEyZM0DXXXGNxMgAAAKDOouQFAAAAAAAAlCivzLVr1y5dvHix3DJX+/btFRAQYHV8AP+HkhdQM7Kzs/X+++/rrbfeUm5urn7zm99o0qRJCgsLszoaAAAAUNdQ8gIAAAAAAMDVKSMjo7TAVXKrxT179uj8+fOSpPDw8NICV8mtFtu1a6fAwECLkwOoCCUvoGbl5+frL3/5i1566SWdPHlSI0eO1JQpUxQREWF1NAAAAKCuoOQFAAAAAACAuu3yMlfJ/27btk3nzp2TZF/mKvnfrl27KigoyOLkACqLkhdgjYsXL2revHmaPn26Tp48qTFjxmjy5Mlc2QsAAACoOkpeAAAAAAAAqBvKKnNt375deXl5ksouc3Xp0kX169e3ODkAd6PkBVgrPz9ff/zjH/Xqq6/qzJkzeuyxxzRp0iQ1btzY6mgAAABAbUXJCwAAAAAAALXLmTNn7IpcW7ZsUUpKinJzcyVJjRo1sitydevWTTExMQoODrY4OYCaQskL8AyXLl3Shx9+qClTpujcuXN65JFHNHnyZDVo0MDqaAAAAEBtQ8kLAAAAAAAAnumnZa7du3crJSVFJ06ckORY5urQoYM6d+6sa665xuLkAKxGyQvwLLm5uZo5c6beeOMN1atXT88++6wefvhh+fr6Wh0NAAAAqC0oeQEAAAAAAMBaZZW5duzYoePHj0squ8zVqVMnNWvWzOLkADwVJS/AM506dUrTpk3TO++8o8jISP3hD39QfHy81bEAAACA2oCSFwAAAAAAAGrG2bNn9f333zvcavHYsWOSpJCQEEVHR9sVum688UaFh4dbnBxAbUPJC/Bs6enpmjp1qubPn6/u3btrxowZ6tWrl9WxAAAAAE9GyQsAAAAAAADulZ2drYMHDzpcnSs1NVWS1LBhQ7Vp08bh6lytW7e2ODmAuoKSF1A7bNq0SRMnTtS//vUvJSUl6Q9/+INatmxpdSwAAADAEy3xsToBAAAAAAAAaqecnBwdOHDAocyVlpYmY4waNGigtm3bqn379ho7dmxpmSsqKko2m83q+AAAwGLdu3fXt99+q+XLl+upp55S+/bt9dRTT2nSpEkKCAiwOh4AAADgUbiSFwAAAAAAAK7o0qVLOnDggF2Ra9euXdq7d6+Ki4vl5+enNm3a2F2Vq3379mrXrp28vLysjg/gKsSVvIDap6CgQO+9956mTJmiBg0a6JVXXtGIESOsjgUAAAB4Cm7XCAAAAAAAgB9R5gJQV1DyAmqvo0eP6ne/+50+/vhj3X777Zo1a5ZuuOEGq2MBAAAAVqPkBQAAAAAAcLUpKCjQ/v37Hcpc+/btU1FRkXx9fdW2bVuHMtcNN9wgb29vq+MDQIUoeQG133/+8x89+uij2rp1qyZMmKAXX3xR9erVszoWAAAAYBVKXgAAAAAAAHVVQUGBjhw5Ylfk2r17t3bu3Kn8/Hz5+Pjo2muvtStydejQQR07dpS/v7/V8QGg0ih5AXVDUVGR3nnnHT3//PMKDw/XnDlz1LdvX6tjAQAAAFag5AUAAAAAAFDbFRYW6vDhww5lrl27dunixYvllrk6dOjAFTEA1EmUvIC6JSMjQ+PHj9fSpUuVmJio2bNnq2nTplbHAgAAAGoSJS8AAAAAAIDaJCMjQ1u2bLErc+3evVsXLlyQJIWHh6tbt24Ot1oMCAiwODkA1BxKXkDdtGzZMj366KPKz8/XzJkzNXz4cKsjAQAAADWFkhcAAAAAAIAnysjIcLgq19atW3X+/HlJP5a5flrk+tnPfqbAwECLkwOA9Sh5AXVXTk6OJk+erPfee0+/+MUvNGfOHIWFhVkdCwAAAKhulLwAAAAAAACsVFaZa/v27crLy5NUdpmrS5cuql+/vsXJAcAzZGRkaODAgSooKCjdlpubq2PHjum6666z27dLly5auHBhTUcEUA3Wr1+vX/3qVzpx4oSmTZumsWPHWh0JAAAAqE5LfKxOAAAAAAAAcDU4c+aMdu3aZXerxZSUFOXm5kqSGjVqpPbt26tbt24aMWKE2rdvr5iYGAUHB1ucHAA8W/PmzZWfn6/du3c7PLZz5067fw8bNqymYgGoZrfccou2bdum3//+93r44Ye1YsUKzZ07VxEREVZHAwAAAKoFV/ICAAAAAABwo5Iy1+VX59q+fbuysrIk/a/MdfnVuWJiYtS0aVOLkwNA7TVt2jQ999xzKiwsvOJ+Bw4cUJs2bWooFYCacvlVvd5//30KnQAAAKiLuF0jAAAAAABAZZRV5tqxY4eOHz8uqewyV6dOndSsWTOLkwNA3XPkyBG1bNlS5f2522azqVu3btq0aVMNJwNQU/Ly8vTEE09o/vz5Gjt2rN58800FBQVZHQsAAABwF0peAAAAAAAAV3LmzBmlpqba3Wpx586dyszMlPRjmat169alt1rs0KGDOnbsqLCwMIuTA8DV5aabbtKmTZtUXFzs8JiPj4/efPNNPfrooxYkA1CTli1bpjFjxqhBgwb66KOP1LNnT6sjAQAAAO5AyQsAAAAAAECSsrOzdfDgQYerc6WmpkqSGjZsqDZt2jhcnat169YWJwcASNJ7772nxx57TEVFRQ6PeXl56ejRoxRwgavE0aNHNWLECK1bt05Tp07VxIkT5eXlZXUsAAAAoCooeQEAAAAAAGtdunRJa9euVVxcXI28Xk5Ojg4cOOBQ5kpLS5MxRg0aNFDbtm0dylxRUVGy2Ww1khEA4LqsrCyFh4c7lLy8vb116623avXq1RYlA2CF4uJizZgxQ88//7z69u2rhQsXqkmTJlbHAgAAACqLkhcAAAAAALCGMUaLFi3S008/raKiIqWnp7v1+Pn5+Tp48GBpkavkVoslZS5/f39FR0eXFrlKbrVImQsAaq+4uDitXr3arujl7e2tefPm6cEHH7QwGQCrbN68WUOHDlVBQYEWLVqkW265xepIAAAAQGVQ8gIAAAAAADXv73//uyZOnKiUlJTSbTk5Oapfv77Lx7p06ZIOHDhgd1WuXbt2ae/evTi1/bYAACAASURBVCouLpafn5/atGljd1Wu9u3bq127dty2BwDqmAULFujBBx9UcXFx6TZfX1+dOHFCISEhFiYDYKXs7Gw99NBDWrFihZ599lm98MILlPoBAABQ21DyAgAAAAAANWfXrl16/vnntWzZMvn4+KiwsLD0sc2bN6tbt27lPregoED79+93KHPt27dPRUVF8vX1Vdu2bR3KXDfccIO8vb1rYngAAIvl5uaqadOmys/PlyT5+Pjo7rvv1vLlyy1OBsBqxhhNnz5dzz33nAYOHKgPP/xQDRs2tDoWAAAA4CxKXgAAAAAAoPodPnxYU6dO1Z/+9Cd5e3uroKDA7nEvLy8tWLBA999/vwoKCnTkyBG7IteWLVvsylyRkZF2Ra5u3bpR5gIASJISEhL02WefqaCgQF5eXlq8eLESEhKsjgXAQ/zrX//SsGHDFBwcrBUrVuj666+3OhIAAADgDEpeAAAAAACg+pw6dUqvv/663nzzTUlyKHeV8Pf313XXXaeCggIdPHhQhYWFdlfmKvnq2LGj2rRpIx8fn5ocBgCgFlm2bJnuvfdeGWMUEBCgU6dOKSAgwOpYADzIsWPHFB8fr127dmnBggW65557rI4EAAAAVGQJfxEFAAAAAABud/78eb3zzjuaOnWq8vPz7W7LWJaCggJduHBB9913nzp27Kj27dvr+uuvl6+vbw0lBgDUFQMGDFBQUJDy8vKUkJBAwQuAg/DwcK1du1aPPPKI4uPj9bvf/U6vvfaabDab1dEAAACAclHyAgAAQJnS09O1YcMGq2MAAGqZoqIirV69WosXL1ZeXp6cvYB4cXGxcnNz1bFjR0nS7t27tXv37uqMihoQGRmpnj171vjrso4B0L17d61Zs0aRkZFKTk62Og4ACw0dOrTM7f7+/po/f746deqkiRMnKi0tTX/+858VGBhYwwkBAAAA53C7RgAAAJQpOTlZSUlJVscAAAC1WEJCgpYsWVLjr8s6BgAAlHDmY7DVq1dr6NChat26tT777DOFhYXVQDIAAADAJdyuEQAAAFfGfxMAAKiMS5cuadeuXdqxY4dSUlL03//+V9u3b9fp06clSX5+fjLGqKCgwO55u3fvVrt27ayIDDdLTEy0OgLrGOAqVlxcrGnTpumZZ56xOgoAi7hS+u7bt6/+/e9/a+DAgbrxxhv1+eefq0uXLtWcEAAAAHANJS8AAAAAAOB2fn5+6tq1q7p27Wq3/fjx40pJSSn92rx5s/bv36/CwkJJ0p49eyh5AQCqzMvLS5MmTbI6BoBaJDo6WuvXr1d8fLxuvfVWLVq0SAMGDLA6FgAAAFCKkhcAAAAAAKgxzZo10+23367bb7+9dFthYaH27dunlJQURUREWJgOAFCX+Pjw528ArmncuLG++uorjR49WoMHD9bbb7+thx9+2OpYAAAAgCRKXgAAAAAAwGI+Pj7q0KGDOnToYHUUAAAAXOX8/f21YMECRUdH65FHHtHevXs1c+ZMeXl5WR0NAAAAVzlKXgAAAAAAAAAAAMD/sdlsevHFFxUVFaWxY8fq6NGjWrhwoQICAqyOBgAAgKsY/9kBAAAAAAAAAAAA8BMjR47Ul19+qdWrV6t///46efKk1ZEAAABwFaPkBQAAAAAAAAAAAJThtttu0/r163Xs2DH17t1bhw8ftjoSAAAArlKUvAAAAAAAAAAAAIBytGvXThs2bJC/v79uuukm7dixw+pIAAAAuApR8gIAAAAAAAAAAACuICwsTGvXrlV0dLRiY2O1YcMGqyMBAADgKkPJCwAAAAAAAAAAAKhASEiIvvrqK918882Ki4vTl19+aXUkAAAAXEUoeQEAAAAAAAAAAABOCAwM1IoVK5SUlKTBgwdr0aJFVkcCAADAVcLH6gAAAAAAAAAAAABAbeHt7a358+ercePG+uUvf6ljx47piSeesDoWAAAA6jhKXgAAAAAAAAAAAIALbDabXn/9dTVq1EhPPvmkLly4oMmTJ1sdCwAAAHUYJS8AAAAAAAAAAACgEiZPnqyQkBD99re/VVFRkZ5//nmrIwEAAKCO8rI6AAAAAADUdosWLZLNZpPNZlO9evWsjuOyxYsXq0uXLgoICCgdx86dO62OVWV79uxRUlKSwsLC5OPjUzq2kJCQ0n1mzJhRur1FixYWpkVt9cMPP+gXv/iFcnJyrI7idk8//bQWL15sdQwAtUBV1xKsRViLoPJYi3iGcePGae7cuXrxxRf19NNPWx0HAAAAdRQlLwAAAEBSXl6e2rZtq4EDB1odBbXQsGHDZIxRv379rI7isvXr1+u+++5TXFycsrKydPDgwTrxAeOhQ4fUs2dP7dmzR59++qlycnKUk5Oj5ORkeXn97/8KT5w4UcYYxcTEWJgWtdW2bdt04403Ki4uTg0aNLA6jtuNGTNGzzzzDFejqAVYx8BKVV1LsBZhLYLKYy3iWUaPHq25c+fq9ddfp+gFAACAakHJCwAAAJaoX7++evXqZXWMUsYYFRcXq7i42OooFfK0uSuPp+b01FwlajrfkiVLZIzR+PHjVb9+fUVHR+vIkSPq2LFjjWWoDnPnzlV2drZmz56tm2++WYGBgQoODlZiYqJOnz5tdTzUATk5ORo0aJDuvfde/fa3v7U6TrWIjo7WsmXL9Morryg5OdnqOB7F036XsI5xP0/N6Ym5qrqWYC0CVA5rEc/00EMPad68eRS9AAAAUC18rA4AAAAAeILg4GB9//33VscAatyRI0ckSaGhoRYnca8DBw5Ikjp37mxxEtRV06dPV2ZmpqZMmWJ1lGoVExOjhIQEPfnkk4qPj5ePD39K8kSsY2Clqq4lWIsAlcNaxHP96le/ks1m0+jRo2WM0bRp06yOBAAAgDqCK3kBAAAAwFWsqKjI6gjVoqCgQJLk7+9vcRLURcYYzZ8/Xz169FDz5s2tjlPthgwZovT0dK1atcrqKAA8UFXXEqxFANexFvF8Dz74oP74xz9qxowZeu6556yOAwAAgDqCkhcAAADcJj8/X1OmTNENN9ygwMBANW7cWIMGDdJnn31W+uHNjBkzZLPZdO7cOa1fv142m002m83hv8bNysrSY489platWsnPz09NmzZVfHy8tm3bVrpPybFsNptatGihTZs2qV+/fgoODlZgYKBuu+02rV+/vsLcy5cvLz2OzWbTxYsXy9x+6NAhJSUlKSQkRKGhoRo4cKDdVTNczfPyyy+X7n/5bXe+/PLL0u1NmjRxOH5Fc+cqZ+a6V69ednMxfPhwSVL//v3ttp89e7bCnD+d13379mno0KEKDQ0t3Xby5EkVFhZq8eLFuv322xUWFqaAgAB16tRJs2bNKvN2VKdOndKECRMUHR0tf39/tWjRQv3799eHH36oCxcuuHX+9u7dq3vuuUcNGzZUUFCQevfurXXr1pW5r7PjcOf3hjNK3ocVK1ZIkgICAmSz2XTTTTc5/R5J9vPu5+enRo0a6a677tKaNWscXqvk64cfflBSUpKCg4MVGhqqBx54QGfOnNGhQ4c0aNAgBQcHKzw8XGPGjFFubq5bxvXTr1GjRjl1PHfPt7M/TyTnzx13z29Vx1zZ3GWdZ/Pnz3fbz4uzZ886nAcvv/xyaebLtyckJFxxjNu3b9fx48cVExNzVYy/S5cukqSvvvrKqXOgtmIdwzqmrq9jXPn97sy8Xmkt4Uoe1iJXxlqEtUhZWIvUDqNGjdKf/vQnvfbaa5oxY4bVcQAAAFAXGAAAAKAMixcvNq4uF0ePHm0aNmxovv76a3P+/HmTmZlpJk6caCSZNWvW2O0bFBRkbrnlljKPk5GRYVq2bGmaNWtmVq1aZXJzc83OnTtNbGysqVevntmwYYPd/jExMSYoKMj07NnTbNiwweTl5ZlNmzaZzp07Gz8/P7N27Vqn8g8ePNhIMhcuXChz++DBg0uP/80335iAgADTvXt3h+O4mqe8uejWrZsJDQ112H6luTPGmNtuu800btzYbNy4scIxuzLX27ZtM0FBQSYmJsbk5eUZY4y5ePGi6dGjh/n4449dzlkyr7GxsWbNmjXm3Llz5rvvvjPe3t4mKyvLrFy50kgyr776qjl9+rTJysoyb7/9tvHy8jITJ060O9axY8dMVFSUCQsLMytXrjQ5OTkmMzPTTJ061UgyM2fOdDpXRQ4cOGBCQkJMRESE+frrr01ubq5JSUkxcXFxplWrVsbf399uf1fGUVE+V783nFHeeX/5Y+W9RyXz3qxZM7Ny5UqTnZ1t9u3bZ+Lj443NZjPz5s0r83jx8fFm8+bNJi8vzyxYsMBIMnfddZcZPHiw2bp1q8nNzTVz5swxkswTTzzh8piuNK6srCwjyYwcOdJue0xMjImIiLDbVp3z7czPE1fPHXfMrzvGXNnc5Z1nzuzjymvecccdxsvLyxw8eNAhS8+ePc1HH31U4RgXLlxY+npXw/izs7ONJNO7d+8K5+ZyCQkJJiEhwaXnuAvrGMftrGNYxzib3dVz+EprCVfysBZhLeKuMdfF38U/xVrEOZVZD1SH2bNnG5vNZubPn291FAAAANRuydavbgEAAOCRKvPH0KioKHPzzTc7bL/uuutc+nB05MiRRpLDH3ePHTtm/P39Tbdu3ey2x8TEGElm69atdttTUlKMJBMTE+NU/oo+HF25cqXd9oSEBCOp9A/flc3j7g9HY2NjTaNGjZz6AMTVuU5OTi794Ka4uNiMHDnSTJ48ucxjO/vh6BdffFHm4ytXrjR9+vRx2D58+HDj6+trsrOzS7eNGjXKSDKLFy922P/OO+9064ejiYmJRpJZunSp3fajR48af3//Mktezo6jonyuvl/OcOaD1fLeo5J5/+mH4xcvXjTNmzc3AQEBJjMz0+F4q1atstu/Q4cORpL59ttv7bZHRUWZ66+/3uUxXWlcrnywWp3z7czPE1fPHXfMrzvGXNnc5Z1nzuzjymt+9dVXRpIZN26c3b7r1q0zERER5tKlS1ccnzHGTJ8+3Ugys2fPrlIWZ8bmzD41MX6bzWbatGlTbsay1LaSF+uYyuVhHVO71jHOZHd1Xmui5MVahLUIaxF7rEWc4yklL2OMefbZZ423t7f55JNPrI4CAACA2iuZ2zUCAADAbe68805t2LBBY8eO1XfffVd6a6N9+/apT58+Th9n+fLl8vLy0sCBA+22h4WFqUOHDtqyZYvS09PtHgsKCiq9hUOJTp06qXnz5tq+fbuOHTtWuUFdpnv37nb/joyMlCRlZGQ47FsTecqzdu1anT59Wj179qxwX1fnOjExUc8++6w+/fRT9erVS6dOndLUqVOrlPfnP/95mdsHDhxod5udEjExMSooKNCuXbtKty1btkySdNdddzns/7e//U2PP/54lTJe7ssvv5Qk3XHHHXbbmzdvruuuu85hf1fGUZHKfG+4Q3nvUcm833333Xbb/f391a9fP124cKHMW6rceOONdv9u3rx5mdsjIiLK/P6qKdU53878PKnsuVOV+XXHmCubu7zzzJl9XHnNuLg4derUSR9++KFOnTpVuv3111/Xo48+Kl9f3wpzlNwOr6x96+r4fXx8dOHChQoz1masY2o2T3lYx9hz9zrmcuVlt2q9cSWsRViLsBaxx1qk9nn55Zc1btw4DR8+XP/85z+tjgMAAIBaipIXAAAA3Gb27NlasGCBUlNT1a9fPzVo0EB33nln6YcvzsjPz1d2draKi4vVsGFD2Ww2u6///ve/kqQDBw7YPS8kJKTM411zzTWSpBMnTlRyVP/TsGFDu3/7+flJkoqLix32rYk8VVXZuZ46dap69OihDRs2KDExUV5eVfu/FUFBQWVuz87O1pQpU9SpUyc1atSoNNekSZMkSefPn7cbR7169RQcHFylLBXJz89Xbm6u6tWrp/r16zs8XvL+VmYczrx2Zd4vdyjrPapo3ps1ayZJyszMdHisQYMGdv/28vKSt7e3AgMD7bZ7e3uX+f1VE6p7vp35eVLZc6ey8+uuMVc2d3k/C5zZx9XXfPzxx3X+/Hm99957kqT9+/dr9erVGjt2bIUZJKlevXqSpIKCgipnqWhszuxTE+MvLCxUQEBAhRlrM9YxNZunqljHVN2Vfr9bsd6obFbWIqxFfqqu/i6+HGuR2mnmzJkaOHCgBg0apK1bt1odBwAAALUQJS8AAAC4jc1m0wMPPKC///3vOnv2rJYvXy5jjOLj4/Xmm2867FsWf39/hYSEyMfHRwUFBTLGlPl122232T3v1KlTMsY4HK/kQ8iyyjfVyZU8Xl5eunTpksO+Z8+eLfPY5c2dqyo712vXrlV2drY6deqkcePGafv27dWSc9CgQZo6darGjBmj/fv3q7i4WMYYzZw5U5JK59ff318NGzbUxYsXlZubW+Fxq5LL399fwcHBunjxovLy8hweP336dKXHUVG+yr5f1aWieT9+/LikH6+6UBt5wny7eu5UlbvGXNO5K/Oa999/v5o1a6Z3331X+fn5euONNzRy5Eg1atTIqdcLDw+X9OMHmlXN4g7VPf6cnBwZY0rHXVexjqlcHtYxZfPEdYwzPOH3nytZWYuwFvGE3JV5TdYiV+daxNvbW3/961/Vo0cP3XnnnTVemAUAAEDtR8kLAAAAbhMSEqK9e/dK+vG2EbfffruWL18um82mVatW2e0bGBho94Hg9ddfr7lz50qS4uPjVVhYqPXr1zu8xrRp03TttdeqsLDQbvvFixe1adMmu207duxQRkaGYmJiavyPwa7kCQ8P19GjR+32zczM1OHDh8s89pXmzlWuznVaWpoeeughffLJJ/rss88UEBCgwYMHKysry605i4qKtH79eoWFhemxxx5T06ZNSz/ULOsWHUOGDJEkffHFFw6Pde3aVU888YRbckn/u5VSyW0bS5w8eVL79u2r0jgqyleZ743qVDLvP/3+zs/P1z/+8Q8FBAQ43NayNrFyvitz7rhDVcdsRe7KvKa/v7/GjRunEydO6I033tBHH32k8ePHO/2aHTt2lCSH20XV1fGX/I4qGXddxTqmcnlYxzjy5HWMMzxtvXElrEVYi3hCbtYirEVc4efnp6VLlyoiIkKDBw9WTk6O1ZEAAABQi1DyAgAAgFv95je/UUpKivLz83XixAlNnz5dxhj17dvXbr+f/exn2r9/v44cOaKNGzcqNTVVvXv3liS99tprio6O1q9+9Sv97W9/U3Z2tk6fPq0PPvhAL730kmbMmCEfHx+74zVs2FCTJ0/Wxo0bde7cOW3evFnDhw+Xn5+fZs2aVWPjr0yeuLg4ZWRk6N1331VeXp6+//57jR8/vtyrdlxp7iSpb9++Cg0N1XfffVdhTlfmOi8vT/fcc4/eeusttW/fXq1atdLSpUuVkZGhhIQEh1uFVJTzSry9vdWnTx9lZmbq9ddf18mTJ3XhwgWtWbNGc+bMKXMcUVFReuKJJ7Rq1Srl5uYqPT1d48aN07Fjx+w+HK1KLkl69dVX1bhxYz3++OP65ptvlJeXp927d2v48OEOt3B0dRwV5avM90Z1Kpn3xx9/XJ9//rlyc3O1f/9+/fKXv9SxY8c0a9as0lsl1UZWzndlzh13cGXMhw4dkre3t93tk6zIXdnXHDdunAICAvTcc8+pf//+atOmjdOvGRMTo2uuucbhCkB1dfzbtm2T9OPvq7qOdYzreVjHOPLkdYwzPG29cSWsRViLsBZhLVIbNWjQQKtWrVJOTo6GDh2qoqIiqyMBAACgtjAAAABAGRYvXmxcXS5u27bN/PrXvzbt2rUzgYGBpnHjxuamm24y8+bNM8XFxXb77t271/Tu3dsEBQWZyMhIM3v2bLvHT506ZSZMmGBat25tfH19TdOmTU1cXJz55ptvHF43JibGREREmN27d5s77rjDBAcHm4CAABMbG2vWrVtXYe5ly5YZSXZf999/v9m4caPD9meffdYYYxy233333ZXOc/bsWTN69GgTHh5uAgICTK9evcymTZtMt27dSo//1FNPOT13vXv3No0aNTIbNmyocOzOzvUjjzxiN94dO3aYrKwsh3mYOnVqhTnLmteyzrWsrCzz61//2kRGRhpfX1/TrFkzM2rUKPP000+XPqdbt26l+588edI8/vjjJioqyvj6+prw8HAzbNgws3//frvjVjR/zti3b5+55557TIMGDUxAQIDp3r27+fzzz02/fv1Ksz300EOVGoc7vzeupKzzXpLZuHGj0++RMY7z3rBhQ3PHHXeYf/zjH6X7lPe9tGnTJoftr732mvnXv/7lsP2FF16o9Ljuv/9+Y4wxd9xxh8NjgwcPLvf73J3zXZmfJ86eO+6eX2fHnJaWZry8vIzNZjMpKSml26uS+6fnWXX9vCgxZswYI8l8++23Lr2fxhgzefJk4+PjY44ePVqpLLVp/ImJiSYiIsJcunTJpTlKSEgwCQkJLj3HXVjHsI5hHePIld/vzszrldYSzmAtwlqEtQhrkepei1RmPVCTNm7caPz9/c3kyZOtjgIAAIDaIdlmTDXcgB0AAAC1XnJyspKSklQblotdunTRyZMnHW5VYRVPywMAKNuf//xnzZ49W5s3b3b5udnZ2erQoYMGDhxYrVc0qU7OjH/79u3q2rWr/t//+38aNmyYS8dPTEyUJC1ZsqRKOSuDdUzleVoeAKjLWItU71qkNqwHFixYoFGjRumjjz7SfffdZ3UcAAAAeLYl3K4RAAAAAABclebMmaMJEyZU6rkNGzbUypUrtXTpUs2ePdvNyWpGReNPTU1VfHy8nnnmGZc/VAUAABVjLcJaZMSIEXrsscf00EMPVarsBwAAgKsLJS8AAAAAAHBVmD9/voYMGaK8vDzNmTNHZ86c0dChQyt9vK5du2rz5s3629/+ppycHDcmrR6ujv+DDz7QK6+8oldeeaUGUwIAUHexFmEtUpY33nhDffr00b333qsTJ05YHQcAAAAejJIXAAAAaq0ZM2bIZrNp+/btOnr0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8vriiy/KfHzlypWmT58+DtuHDx9ufH19TXZ2dum2UaNGlfvh+Z133lltJa/ysrs6rzVR8iova8nc/bSod/HiRdO8eXMTEBBgMjMzHY63atUqu/07dOhgJJlvv/3WbntUVJS5/vrr3TouV0perr4XruRauXKl3faEhAQjqbRwY4xr5/Hlx67K/LpjzNOnTzeSzOzZs8t83B05XTn3EhMTjSSzdOlSu32PHj1q/P39q63k5epcuvLzt7LnRnnfy87s48prfvXVV0aSGTdunN2+69atMxEREebSpUul21z5/VhR9qqcU67Oqau/X0vYbDbTpk0bp8Z1ubpW8vr444+Nl5eX1TEAAABQdcncrhEAAAAAoNTUVEnido0A6oQ777xTGzZs0NixY/Xdd9+V3qJo37596tOnj9PHWb58uby8vDRw4EC77WFhYerQoYO2bNmi9PR0u8eCgoJKbxFVolOnTmrevLm2b9+uY8eOlW5fu3atTp8+rZ7/n707D4+qPNg/fk/2PQQKgbBIAhZlMayNqFQQBHkB0RgWi4pvFfXFhUVbFSm2ovKiuFBEcau9tFvAFhCRVkRoAYOClkUpoJ4TZCdsIQGykef3hz/yOmRhJtuZ5fu5rvyRM2fOuc8yMyG5eZ6+fes9y6hRo/TYY4/pb3/7m6666iodPXpUM2fO9PjYq/KTn/ykyuXDhw+vcsq29PR0lZaW6quvvqpYtnjxYknS0KFDK62/YsUKTZ48uU4Zq1Nd9tpc44ZWXdZz527YsGFuyyMjIzVw4ECdOXOmymnJevfu7fZ9SkpKlctbt26t/fv31zp3XTXktejTp4/b923btpUkt+P15j7+obqc3/o45qKiIklSeHh4jevVJac3997f//53SdKQIUMq7e/HP/5xjRnrwttz6c37b23vjepey56s480+Bw8erG7duun3v/+9jh49WrH82Wef1f333+92b9TX56NUt3uqNufUm8/Xc8LCwnTmzBnPDiiAhYSEVDl9MgAAAPwPJS8AAAAAgGzbVmJiopKSkpyOAgB1Nn/+fL399tuyLEsDBw5UQkKCrrvuuoqigieKi4uVn5+v8vJyJSYmyuVyuX198cUXkqSvv/7a7XlNmjSpcnstWrSQJB0+fNjr46ltlpkzZyojI0OffPKJRo0apZCQuv0qMDY2tsrl+fn5mjFjhrp166akpKSKXL/4xS8kSadPn3Y7jqioKMXHx9cpi7eqyl7b8+pk1urOXXJysiTp4MGDlR5LSEhw+z4kJEShoaGKiYlxWx4aGupYCaChr0ViYqLb9xEREZLkdrye3sfnq+35ra9jjoqKkiSVlpbWuF5dc3py7xUXF6ugoEBRUVGKi4urtO6598H61tD3T23vjereMz1Zx9t9Tp48WadPn9bLL78sSdq1a5c+/vhj3XXXXW7r1cfn4zl1eW+pzTmtzedrWVmZoqOjPT8oAAAAwMdR8gIAAAAAyLZtdejQwekYAFAvXC6Xbr31Vn300Uc6ceKElixZImOMMjMz9fzzz1datyqRkZFq0qSJwsLCVFpaKmNMlV8DBgxwe97Ro0dljKm0vXN/fK5NyaG2WdasWaP8/Hx169ZNEydO1JYtW6rcfnXnwFMjRozQzJkzNWHCBO3atUvl5eUyxuiFF16QpIrzERkZqcTERBUVFamgoOCC261rrgup7Xl1woXO3aFDhyR9P2qRP/KFa+HpfVxf6uuYW7VqJen70kxD8Obei4yMVHx8vIqKilRYWFhp3WPHjlW5j5CQEJWUlFRafuLECY8zNuT909j3Rm32OW7cOCUnJ+ull15ScXGxnnvuOY0fP77Sf+Dw5vOxIdXmnHr7+Xry5EkZYypeIwAAAEAgoOQFAAAAAJBlWUzVCCBgNGnSRDt27JD0/RRm1157rZYsWSKXy6Xly5e7rRsTE+NWLujUqZNee+01SVJmZqbKysq0fv36SvuYPXu22rVrp7KyMrflRUVF2rhxo9uybdu2af/+/UpPT6/1H5u9zWLbtu644w799a9/1Xvvvafo6GiNHDlSeXl5lZ5f0zm4kLNnz2r9+vVq2bKlHnjgATVv3ryinFXVFFk33nijJOmDDz6o9FiPHj00ZcqUesnlqdpcY6ecO3fn38PFxcVatWqVoqOjK02R50+cvBbe3sf1pT6OuWvXrpLUoNOKenPvnZuK9dy0jeccOXJEO3furHL7rVq10r59+9yWHTx4UN99953HGRvq/nHi3qjNPiMjIzVx4kQdPnxYzz33nP74xz9q0qRJldbz5vOxodT2nHr7+Xrunjr3GgEAAAACASUvAAAAAIBs21ZaWprTMQCg3txzzz3aunWriouLdfjwYT3zzDMyxuiaa65xW69nz57atWuX9uzZo5ycHFmWpX79+kmSZs2apQ4dOujnP/+5VqxYofz8fB07dkyvvvqqnnjiCc2ZM0dhYWFu20tMTNS0adOUk5OjU6dOadOmTbrlllsUERGhuXPnuq17zTXXqFmzZtqwYcMFj8ebLIWFhbrhhhv04osvqnPnzmrfvr3effdd7d+/X1lZWZWmdavpHFxIaGio+vfvr4MHD+rZZ5/VkSNHdObMGa1evVoLFiyo8jhSU1M1ZcoULV++XAUFBdq7d68mTpyoAwcOuJW86pLLU7W5xk45d+4mT56s999/XwUFBdq1a5d+9rOf6cCBA5o7d27F1Hn+yMlr4e19XF/q45jT09PVokWLakfqq6+cnt57Tz/9tJo2barJkydr5cqVKiws1Pbt23XLLbdUOYWjJA0ePFj79+/XSy+9pMLCQn377beaNGmSVyMfensuPX3/deLeqO0+J06cqOjoaE2fPl2DBg1Sx44dq1zPk8/H3NxchYaGuk136fTxefP5KkmbN2+W9P39BQAAAAQMAwAAAAAIeklJSebll192OgYAVJKVlWWysrK8es7mzZvN3XffbS699FITExNjmjZtai6//HLz+uuvm/Lycrd1d+zYYfr162diY2NN27Ztzfz5890eP3r0qJk6dapJS0sz4eHhpnnz5mbw4MFm5cqVlfabnp5uWrdubbZv326GDBli4uPjTXR0tLn66qvNunXrKq3fr18/k5SUZD755BOPjsuTLPfee6+RVPG1bds2k5eX57ZMkpk5c+YFz0FOTk6l51X168S8vDxz9913m7Zt25rw8HCTnJxsbr/9dvPII49UPKdXr14V6x85csRMnjzZpKammvDwcNOqVSszduxYs2vXLq+uTU08ze7peV28eHGV28vJyfEoT03P9ybr+ecuMTHRDBkyxKxatarGY3/sscfMxo0bKy2fNWuWWbt2baXljz/+eK2Pa9y4ccYYY4YMGVLpsZEjR1aZzZtr4YnqzoExptLyYcOGGWM8v4/r+/zWxzFPmzbNhIWFmX379l3wHNQ2pyf33jk7d+40N9xwg0lISDDR0dGmT58+5v333zcDBw6s2PYdd9xRsf6JEyfMnXfeaVq1amWio6PNVVddZTZu3Gh69epVsf7DDz9snn322Xq7f7x5/63LvXH+a7mh3lfPmTBhgpFk/vnPf1Z5LJ5+Ptq2bUJCQozL5TJbt26tNntt7ylvj8/b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AAhglmUpNTXV6RgA4JM++OADzZ49Wy+99JJ69uzpdBwAAAAAAACgWpS8AAAAACBAlZaWat++fUzXCABV2Lt3r2677TbdeuutuuOOO5yOAwAAAAAAANSIkhcAAAAABKjc3FydPXuWkbwA4Dzl5eUaP368kpKSNG/ePKfjAAAAAAAAABcU5nQAAAAAAEDDsG1bkhjJCwDOM2vWLK1fv145OTmKj493Og4AAAAAAABwQZS8AAAAACBAWZalxMREJSUlOR0FAHzGxo0b9Zvf/EbPPPOMevTo4XQcAAAAAAAAwCNM1wgAAAAAAcq2bUbxAoAfOHnypMaMGaNBgwZp0qRJTscBAAAAAAAAPEbJCwAAAAACFCUvAHD34IMPqrCwUG+99ZZcLpfTcQAAAAAAAACPUfICAAAAgABlWZZSU1OdjgEAPmHlypV688039fLLLys5OdnpOPBDc+bMkcvlksvlUps2bQJuf77O2/PB+QMq2717t66//nqdPHnS6Sj17pFHHlF2drbTMQAAAIAGRckLAAAAAAKUbduUvABAUn5+vu644w7dfPPNysrKcjpOQCgsLNTFF1+s4cOHOx2l0Tz00EMyxig9PT0g9+frvD0fNa3vS/evL2VBYNu8ebN69+6twYMHKyEhwek49W7ChAl69NFH9atf/crpKAAAAECDoeQFAAAAAAEoPz9fx44dY7pGAJB03333qaysTPPmzXM6Sq3FxcXpqquucjpGBWOMysvLVV5e7nSUC/K1cwfnNfb9W9M96E+vJfivkydPasSIEbrpppt03333OR2nQXTo0EGLFy/WU089pYULFzodBwAAAGgQYU4HAAAAAADUP8uyJImRvAAEveXLl+sPf/iD3nvvPTVt2tTpOAEjPj5e3377rdMxgFrxpfvXl7IgcD3zzDM6ePCgZsyY4XSUBpWenq6srCw9+OCDyszMVFgYfwIDAABAYGEkLwAAAAAIQLZty+Vy6aKLLnI6CgA45vTp07r//vt18803a8SIEU7HAQCg0Rlj9MYbbygjI0MpKSlOx2lwN954o/bu3avly5c7HQUAAACod5S8AAAAACAAWZal1q1bKyoqyukoAOCYadOmKT8/Xy+88ILTUapUXFysGTNm6JJLLlFMTIyaNm2qESNG6L333tPZs2clSXPmzJHL5dKpU6e0fv16uVwuuVyuSqOT5OXl6YEHHlD79u0VERGh5s2bKzMzU5s3b65Y59y2XC6X2rRpo40bN2rgwIGKj49XTEyMBgwYoPXr118w95IlSyq243K5VFRUVOXy3NxcjRkzRk2aNFGzZs00fPhwtxGLvM3z5JNPVqz/w6nv/v73v1cs/9GPflRp+xc6d/Xl6NGjmjp1qjp06KCIiAglJSVp6NChWr16dZ3WPd8f/vAHt/Pscrl033331erc1PVe+KGGvp7n27Fjh4YNG6bExMR6uX/P+eG1iYyMVJs2bTRo0CD9/ve/15kzZyRJZWVlys7O1rXXXquWLVsqOjpa3bp109y5c92mXbzQPehNluruE29fd56ozTY9PSfnb3v37t0aM2aM4uPj1axZM9166606fvy4cnNzNWLECMXHx6tVq1aaMGGCCgoKKmX15L2vJrXNvXPnTo0ePVrNmjWrWPbGG29ccJ0jR454tM8TJ05Uep0/+eSTFZl/uDwrK6vGY9yyZYsOHTqk9PT0oDj+7t27S5L+8Y9/eHQPAAAAAH7FAAAAAAACzsSJE02/fv2cjgEAjvnss89MaGioefPNNxtlf1lZWSYrK8ur59x5550mMTHRfPjhh+b06dPm4MGD5qGHHjKSzOrVq93WjY2NNVdeeWWV29m/f7+56KKLTHJyslm+fLkpKCgwX375pbn66qtNVFSU+eSTT9zWT09PN7GxsaZv377mk08+MYWFhWbjxo3msssuMxEREWbNmjUe5R85cqSRZM6cOVPl8pEjR1Zsf+XKlSY6Otr06dOn0na8zVPduejVq5dp1qxZpeU1nTtjjBkwYIBp2rSpycnJ8ei409PTTevWrd2WHThwwKSmpprk5GSzbNkyk5+fb3bu3GkyMzONy+Uyr7/+eq3WrWp/ZWVlZurUqebaa681x44d8+hYqzs39XUv1GWbtcmcmJhoBgwYYNatW2cKCgpq3H5V18uYqu/fc9emZcuWZtmyZebkyZPm4MGDZubMmUaSeeGFF4wxxixbtsxIMk8//bQ5duyYycvLM7/97W9NSEiIeeihhyrt60L3YE1ZPL1PvH3decKbbXp7Ts5tOzMz02zatMkUFhaat99+20gyQ4cONSNHjjT//ve/TUFBgVmwYIGRZKZMmeK2DW/f+6pS29xXX321Wb16tTl16pTZsGGDCQ0NNXl5eR6t480+hwwZYkJCQsw333xTKUvfvn3NH//4xwse4zvvvFOxv2A4/vz8fCOpVv8WkmSys7O9fp6vy87ONvw5EAAAICAs5Kc6AAAAAAhAQ4cONePHj3c6BgA4oqyszHTv3t3079/flJeXN8o+a1PySk1NNVdccUWl5T/+8Y+9KnmNHz/eSKr0x+4DBw6YyMhI06tXL7fl6enpRpL597//7bZ869atRpJJT0/3KP+FSl7Lli1zW56VlWUkVRQBapunvkteV199tUlKSvKoEHIu7/mlodtvv91IMn/+85/dlhcVFZmUlBQTHR1tDh486PW65+/v+PHjZsiQIWbSpEmmrKzM42OtqTBVH/dCXbZZ28znl/Kq2743Ja9z16aqksd1113nVvLq379/pXVuueUWEx4ebvLz8z06Rk+yeHqfePu684Q32/T2nJzb9vLly92Wd+nSxUgy//znP92Wp6ammk6dOrkt8/a9ryq1zf3BBx9Uu80LrePNPv/xj38YSWbixIlu665bt860bt3alJSU1Hh8xhjzzDPPGElm/vz5dcriybF5sk5jHL/L5TIdO3asNmN1KHkBAADAxy1kukYAAAAACECWZSk1NdXpGADgiFdffVXbt2/XK6+8IpfL5XScal133XX65JNPdNddd2nDhg0VUzTu3LlT/fv393g7S5YsUUhIiIYPH+62vGXLlurSpYs+//xz7d271+2x2NjYiimtzunWrZtSUlK0ZcsWHThwoHYH9QN9+vRx+75t27aSpP3791datzHyVGfNmjU6duyY+vbtW+ttLF68WJI0bNgwt+WRkZEaOHCgzpw5UzF1mDfr/tDOnTuVkZGhkJAQvfjiiwoNDa113h9qiHPf0NczKipKGRkZ9b79c9dm6NChlR5bsWKFJk+eLEkaPnx4lVNrpqenq7S0VF999VWt9l9VFm/vE29ed57yZJu1PSe9e/d2+z4lJaXK5a1bt650DLV57ztfbXP/5Cc/qXG7Na3jzT4HDx6sbt266fe//72OHj1asfzZZ5/V/fffr/Dw8AvmODcNaFXrBurxh4WFVUyvCgAAAAQSSl4AAAAAEGCMMdq9ezclLwBB6fjx43r88cf1wAMP6JJLLnE6To3mz5+vt99+W5ZlaeDAgUpISNB1111XUe7wRHFxsfLz81VeXq7ExES5XC63ry+++EKS9PXXX7s9r0mTJlVur0WLFpKkw4cP1/Ko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y/iBI4YOHapJkyZpypQpVkexxMMPP6xPPvlESUlJVkcpNPL62MSxMD1n++Nm6ycmJqpevXoKCQlxdUynuVOWwoz5FfCXgjK/unLlij744AM99thjstlsVscBAACAC1HkBQAAkI+UKFFCQUFBVsewlLv2gbvmui6v80VGRsoYozFjxqhEiRLy9/fXsWPHdPvtt+dZhtywZMkSxcXFacGCBWrfvr2KFSumkiVLKiwsTOfPn7c6XoEXHx+vnj17qm/fvho1apTVcQBL+fv7a8WKFZoxY4YiIiKsjpPnHn74YcXFxWnNmjVWR3EJd59HoGAxxshut8tut+fJ691sfOd1FmTE/Ar4n4IyvwoPD1diYqL+9a9/WR0FAAAALkaRFwAAAACXO3bsmCSpXLlyFidxrf3790uSmjVrZnGSwmn27Nk6ffq0pk6danUUwC0EBAQoNDRUEyZMUEpKitVx8lTVqlV1991367333rM6CpDvlCxZUgcPHnSLIkl3ylJYMb8C0isI86s333xTffv2VYUKFayOAgAAABejyAsAAACAy6WmplodIVckJydLknx8fCxOUvgYY/TOO++oTZs2qlKlitVxALfRu3dvHT9+XKtXr7Y6Sp579NFHtWbNGh09etTqKACQLzG/AjKXn+dXa9eu1a+//qoJEyZYHQUAAAC5gCIvAAAAiyUlJWnq1Klq2LChihUrprJly6pnz5768ssv0wpl5s6dK5vNpkuXLmnjxo2y2Wyy2Wzy8vJKt63Y2Fg98cQTqlWrlooUKaLy5curT58+2r59e9o617dls9lUrVo1RUdHq3PnzipZsqSKFSumTp06aePGjTlulyNZgoKC0rLYbDYNHDhQktSlS5d0yy9evHjLPvjiiy/S/c7evXvVr18/lStXLm3Z2bNnlZKSovDwcN1zzz2qVKmSfH191bRpU73++uuZ3ibm3LlzGj9+vPz9/eXj46Nq1aqpS5cuev/993XlyhWH940j9uzZo/vvv19+fn4qXry47rjjDkVFRWW6rqPtcOXYccT1/bBy5UpJkq+vr2w2m9q2bevwPpLS93uRIkVUpkwZde/eXevXr8/wWtcfR48eVf/+/VWyZEmVK1dOgwYN0oULF3TkyBH17NlTJUuWVOXKlTV06FAlJCS4pF03Ph555BGHtufq/r7+OHLkiPr376/SpUurXLlyCgkJ0cGDB9P9jqNjx9X9m9M2x8TE6MyZMwoICLhpH+Q0pyNj7zpH37MvvvhiWr6/367q66+/Tlt+2223OdQPkuvGz42yOzYyey+/8847LjsmX7x4McN77cUXX0zL/PfloaGhkhw7t2bFlWPK2WN1ds7NgYGBkqRvvvnGyT2e//Xu3VsVK1bUu+++a3WUTBXUOV5WnDl+OrPujT766KMMx4RRo0Y5dZzNjb5ydps5PTfs2bNHwcHB8vPzcyrzjce4q1evpnv+VnNfyXXzUGeyODofdGQu5GwfMb9ifpUTzK8ybx/zq9wzc+ZMde3aVS1atLA6CgAAAHKDAQAAgEtJMuHh4Q6v/+ijjxo/Pz+zdu1ac/nyZXP69Gnz5JNPGklm/fr16dYtXry46dChQ6bbOXnypKlZs6apWLGiWb16tUlISDC///676dixoylatKjZtGlTuvUDAgJM8eLFTbt27cymTZtMYmKiiY6ONs2aNTNFihQxGzZsSLd+p06dTNmyZc3mzZtv2SZnsmzfvt0UL17cBAQEmMTERGOMMVevXjVt2rQxn376aYZt36wPjDGmV69eRpLp2LGjWb9+vbl06ZL5+eefjaenp4mNjTWrVq0yksxLL71kzp8/b2JjY80bb7xhPDw8zJNPPpluW6dOnTK1a9c2lSpVMqtWrTLx8fHm9OnTZvr06UaSefXVVx3OdSv79+83pUuXNlWrVjVr1641CQkJZseOHaZr166mVq1axsfHJ936zrTjVvmcHTuOuL4frly5kuVzWe2j6/1esWJFs2rVKhMXF2f27t1r+vTpY2w2m3n77bcz3V6fPn3Mli1bTGJiovnwww+NJNO9e3fTq1cvs23bNpOQkGAWL15sJJlx48Y53aabtSs2NtZIMoMHD063PCAgwFStWjXdstzs7169eqW9n7/99lvj6+trWrVqlW5dZ8eOK/rXFW1eunRpWu6b9UFOcjoz9px9zxqT9fuwRYsWply5chmWu2L8OHPszu7YyOq97Mg6zrxmt27djIeHhzlw4ECGLO3atTMff/xx2s/OnFuz4oox5WyfOntuNsaYuLg4I8nccccdDrXr70JDQ01oaKjTv+dOJk+ebCpVqmSuXbuWq68THh5unP0YrSDO8a5v/8ZjkzPHT2fP8ze+XkpKihk/fry55557zPnz5x3qx5sdZ519zznSP85sMzuZ/fz8TKdOnUxUVJRJSEi46fYz21/GZD6ncXTu68p56K2yODsfdGQu5CjmV8yvmF8xv3J2fpWd+YIrbdq0yUgy69atsywDAAAAclUERV4AAAAu5myRV+3atU379u0zLK9fv75TXwAOHjzYSEr3Iawxf32o7uPjY1q0aJFueUBAgJFktm3blm75jh07jCQTEBCQbnnHjh1NmTJlHPqywNksERERaR/02u12M3jwYDN58uRMt+3ol0Rr1qzJ9PlVq1aZu+66K8PygQMHGm9vbxMXF5e27JFHHslyf957770uLfIKCwszkszy5cvTLT9x4oTx8fHJtMjL0XbcKp+z+8sRjhR5ZbWPrvf7jUV+V69eNVWqVDG+vr7m9OnTGba3evXqdOs3adLESDI//PBDuuW1a9c2DRo0cLpNN2uXM0Veudnfq1atSrc8NDTUSEr7QsgY58eOK/rXFW2ePXu2kWQWLFiQ6fOuyOnM2HP2PWuMa76EdLYvnTl2Z3dsZPVedmQdZ17zm2++MZLMiBEj0q0bFRVlqlatmq7Ix5lz662y52RMOdunzp6br7PZbKZu3boOtevvCkKR19GjR42np2eG96KrZedL24I4x7u+/RuPTc4cP509z//99S5cuGC6detmxowZY1JSUjJky85xNjvvuZtxdpvZzXxjcUlW23emyMvRua8r56G3yuLsfNCRuZCjmF8xv2J+xfzK2fmV1UVenTp1ylbhPwAAAPKNCG7XCAAAYLF7771XmzZt0mOPPaaff/457TYHe/fu1V133eXwdr744gt5eHgoJCQk3fJKlSqpSZMm2rp1q44fP57uueLFi6fdhuC6pk2bqkqVKoqJidGpU6fSlm/YsEHnz59Xu3btXJ4lLCxMzzzzjD7//HMFBQXp3Llzmj59usNtz0zr1q0zXR4SEpLpbUECAgKUnJysnTt3pi1bsWKFJKl79+4Z1v/Pf/6jsWPH5ijj33399deSpG7duqVbXqVKFdWvXz/D+s6041ayM3ZcIat9dL3fg4OD0y338fFR586ddeXKlUxvm9GyZct0P1epUiXT5VWrVtXJkyeznTuncrO/W7Vqle7n6tWrS1K69mZ37OSkf13R5uu3cPL29r7pejnJ6czYc/Y96yrO9qUzx+7sjo2s3suOrOPMa3bt2lVNmzbV+++/r3PnzqUtnzNnjkaPHp1ubLjq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167VPffcY3UsAMiWgwcPav78+fq///s/paamatCgQfryyy/VqFEjq6MBAAAAN0WRFwAAAAAAKDByWvjVrl073XbbbVbFh5t78MEH5enpqYEDByoxMVELFy7kNk4o8LZu3aphw4Zpx44dGjdunJ5//nn5+PhYHQsAnJKamqr169dryZIl+vzzz1WhQgWNGzdOo0ePVrly5ayOBwAAADiEIi8AAAAAAFCgZVb4deHCBe3cuZPCLzitf//+8vT01IMPPqjU1FQtXrxYHh4eVscCXO7ixYt67rnnNH/+fN15552KiYlRw4YNrY4FAE45dOiQ3nnnHb333nv6888/de+992r58uUKCQmRlxdfkQEAACB/YQYLAAAAAAAKnTJlyty08Gvjxo1asmSJTp06JYnCL6QXGhoqX19fhYaG6vLly/rggw/k6elpdSzAZSIjIzVq1Ch5eHjovffe08MPP2x1JABw2KVLl/TZZ5/pgw8+0IYNG1S5cmUNHTpUQ4YMUc2aNa2OBwAAAGSbzRhjrA4BAAAAAMhaRESE+vfvL/58A/LeyZMn0672df2RVeFX+/btud1PIbNmzRr17dtXISEh+vDDD+Xr62t1JCBHDhw4oJEjR+rbb7/VwIED9eqrr3JcA5Av2O12/fjjj3r//ff12Wef6dq1awoODtYjjzyiHj16cNUuAAAAFASRFHkBAAAAgJujyAtwLxR+4e9+/PFH9e7dW/Xq1dPKlStVsWJFqyMBTktOTta8efM0bdo0NWjQQIsXL1bbtm2tjgUAt7R161ZFREQoPDxcR48eVYsWLTR48GA98MADXHUVAAAABQ1FXgAAAADg7ijyAtzfjYVfW7Zs0enTpyVlLPzq0KGDypYta3FiuNLBgwcVHBysS5cuadWqVQoMDLQ6EuCwH374QcOHD9fRo0f11FNP6ZlnnpG3t7fVsQAgS9u2bVNERIQiIiJ06NAh1a5dW/369dPAgQN1++23Wx0PAAAAyC0UeQEAAACAu6PIC8ifKPwqXM6fP68+ffro119/VXh4uLp37251JOCmzpw5o6eeekofffSRgoODNX/+fNWsWdPqWACQqZ07dyoyMlLLli3T3r17Vb16dfXu3VthYWHq0KGDbDab1REBAACA3EaRFwAAAAC4O4q8gIKDwq+CLSkpSY8++qiWLVumN954Q8OHD7c6EpCBMUZLly7V+PHjVbRoUb322msKDQ21OhYAZHC9sCsiIkK7d+9WtWrV1KdPHwq7AAAAUFhFelmdAAAAAAAAoLCoUqWKqlSpop49e6Ytu7Hwa/HixTpz5oykjIVfQUFBKlOmjFXxcQs+Pj768MMP5e/vr5EjR2r79u168803VaRIEaujAZKkHTt2aNiwYYqOjtaIESP04osvqmTJklbHAgBJUmpqqjZv3qzVq1dr5cqVaYVdoaGhevfdd9W2bVsKuwAAAFCocSUvAAAAAHBzXMkLKHxuLPyKjo6m8CufiYiI0KOPPqpGjRopMjJSNWrUsDoSCrHLly9r9uzZevnll9W0aVO99dZbatGihdWxAEDnz5/XN998o9WrV+vrr7/WuXPn5O/vr549eyo0NFTt2rWTh4eH1TEBAAAAd8DtGgEAAADA3VHkBUC6eeFXnTp11KFDh7TCr+bNm6t48eIWJ8a+ffsUFhamEydOaOnSperevbvVkVAIrVq1SqNHj1ZcXJymTZum0aNHUzABwFKHDh3SqlWr9NVXX+mHH36Q3W5X27Zt1bNnT3Xp0oUiVAAAACBzFHkBAAAAgLujyAtAVm4s/Prll1/0559/ytPTUw0aNEh3xS8Kv6xx9epVjR49Wu+++67+/e9/a8aMGfL09LQ6FgqBEydOaOzYsVq+fLnCwsI0f/58VahQwepYAAqhq1evKioqSt99952++OIL7d27V+XKldPdd9+tkJAQ3XfffSpdurTVMQEAAAB3R5EXAAAAALg7irwAOIPCL/f09ttv64knnlCHDh20dOlSVa5c2epIKKBSUlK0YMECTZkyRRUrVtSCBQvUtWtXq2MBKETsdrtiYmL0/fffa926dfrxxx91+fJlBQYGqkePHgoJCVHr1q25qiAAAADgHIq8AAAAAMDdUeQFIKduLPz673//q9jY2EwLv/7xj3+oWLFiVkcukLZt26Z+/frpwoULWrhwofr162d1JBQwW7du1bBhwxQTE6Px48fr+eefl4+Pj9WxABQC+/fv17p16/T9999r/fr1Onv2rMqXL69OnTqpS5cu6tGjh6pWrWp1TAAAACA/o8gLAAAAANzJyZMnFRISouTk5LRlCQkJOnXqlOrXr59u3cDAQC1dujSvIwIoICj8ssaVK1f09NNP680331RoaKgWLVqkcuXKWR0L+dzFixf13HPPaf78+brzzju1aNEiNWzY0OpYAAqwM2fO6Mcff9R3332ntWvX6siRIypWrJjat2+vLl26qEuXLmrevDlX6wIAAABchyIvAAAAAHA3TZo00a5du2653osvvqhnnnkmDxIBKCwo/Mo7a9eu1ZAhQ5SSkqK3335bISEhVkdCPhUZGanRo0dLkmbPnq1BgwbJZrNZnApAQRMbG6uoqKi0WzDu3r1bRYoUUdu2bdW5c2d17txZrVu3lre3t9VRAQAAgIKKIi8AAAAAcDezZs3Ss88+q5SUlJuut3//ftWtWzePUgEorG4s/Pr555919uxZeXl5qX79+hR+5cD58+c1cuRIhYeHa9iwYZozZ46KFy+e5frHjx9XiRIlVLp06TxMCStcuXJFgwYN0gcffJDlmDhw4IBGjhypb7/9VgMHDtSrr77KVeEAuMzJkye1ceNGRUVFaePGjfr1119ls9nUsGFDBQUFqUuXLurWrZtKlSpldVQAAACgsKDICwAAAADczbFjx1SzZk1l9eeazWZTixYtFB0dncfJAOAvzhR+tWjRQr6+vlZHdmuRkZEaPny4ihYtqtdff119+/bNdL0HH3xQR48e1bp161S0aNE8Tom8YozRgAEDFBERoUmTJumll15K93xycrLmzZunadOmqX79+lq8eLHatWtnUVoABUFKSopiYmIUFRWlrVu3asOGDTp27Ji8vb3VrFkzdejQQUFBQbr77rspJgUAAACsQ5EXAAAAALijtm3bKjo6Wna7PcNzXl5emjdvXtqtmQDAHVD4lTOnT5/WuHHjtGzZMoWGhur1119XlSpV0p7ftm2bWrRoIZvNpuDgYK1YsUKenp4WJkZumTlzpp555hnZ7XZ5eXlpx44datSokSTphx9+0PDhw3X06FE99dRTmjx5sooUKWJxYgD5TUJCgv773/+mXaVr06ZNunz5skqVKqXWrVunFXUFBQVRVAwAAAC4D4q8AAAAAMAdLVy4UE888YRSU1MzPOfh4aETJ06oUqVKFiQDAMfdWPi1efNmnTt3jsKvm9iwYYOGDx+uY8eOacqUKXryySfl6empu+++W1FRUUpOTpanp6ceeeQRvfPOO1bHhYt988036tGjR1qRt7e3t1q2bKnPP/9c//73v/XRRx8pODhY8+fPV82aNS1OCyA/SE5OVkxMjKKjoxUdHa1ffvlFu3fvlt1u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UF2R5AUANdGJEye0Y8cOh8SvXbt2yRijunXrqn379g6Pe2zbti2P0EOlWbFihR5++GFt2bJFN998s2bOnKkmTZpYHRZQ5aSlpWn+/Pn65z//qf/+979Fd+0aNWoUd9gAAAAVlpWVpfj4eGVlZemHH35Qo0aNrA4JAAAAAACgOiPJCwDwp6ysLG3btq0o6Wvnzp365ZdfdPbsWdWuXVutW7d2eNxj165dVatWLavDRjVljNFnn32mRx99VOnp6fr73/+uxx57TBEREVaHBvi0goICrVq1SklJSVq8eLHCw8M1fPhw3XvvverYsaPV4QEAgGoiJydHAwYM0G+//abVq1eradOmVocEAAAAAABQ3ZHkBQAoXV5enlJTUx3u+LV582adOXNGAQEBatWqlcPjHrt06aJ69epZHTaqkXPnzum9997TE088ocLCQj300EOaOHGigoODrQ4N8Cn79+/XRx99pLfeeksHDhxQnz59lJiYqMGDBysoKMjq8AAAQDWSl5enoUOHav369fp//+//qV27dlaHBAAAAAAAUBOQ5AUAcE1BQYF2796tnTt3Fj3y8ccff1RGRoYkKTo62uFRj926dVNUVJTFUaOqO3HihKZPn67XX39dUVFRevbZZzV69GjZbDarQwMsc/bsWX3xxRdKSkrSihUr1KhRI912221KTEzUZZddZnV4AACgGjLG6I477tCiRYv07bffqkePHlaHBAAAAAAAUFOQ5AUA8Iy0tDSHO37t3LlTv//+u6T/S/xq37590SMf27VrR4IOXLZ//35NmzZN//rXv9SlSxfNnDlTvXv3tjosoFLt3r1b7733nt59910dO3as6K5dQ4cOVUBAgNXhAQCAamzSpEl666239MUXX6h///5WhwMAAAAAAFCTkOQFAPCeEydOFN3ty/6ze/duFRYWKiIiQh06dHC461ebNm3k7+9vddioAnbs2KFHHnlEy5YtU79+/fTKK6+oY8eOVocFeE1ubq6Sk5OL7toVExOjUaNGacKECbr00kutDg8AANQAU6ZM0QsvvKCPP/5Yw4cPtzocAAAAAACAmoYkLwBA5crOztbWrVsdHve4adMm5ebmKigoSC1atHBI/IqLi1NISIjVYcNHLV++XA899JC2bdumUaNGafr06YqOjrY6LMBjduzYofnz52vu3Lk6deqUBg8erMTERPXt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AQBQbbp06RK33357jBgxIqZNm5Z2HACAKiktLY3BgwfH6tWrI5vNRqNGjdKOBAAAAMAuzusaAQCoVkmSxCmnnBIffvhhvPPOO17bCADUOTfccEPceeed8eqrr0bXrl3TjgMAAAAAXtcIAED1ymQycd9998Wnn34av/jFL9KOAwBQKSUlJXH77bfH6NGjNXgBAAAAkDM8yQsAgBpx//33x6WXXhqvvPJKHHPMMWnHAQDYodmzZ0e3bt3ivPPOi6KiorTjAAAAAMBmWU1eAADUiCRJ4tRTT41//OMf8c4770STJk3SjgQAUK6lS5dG165do3379jFp0qRo1KhR2pEAAAAAYDOvawQAoGZkMpl48MEHY+HChXHzzTenHQcAoFylpaUxePDgWL16dWSzWQ1eAAAAAOQcTV4AANSYTp06xR133BF33XVXvPrqq2nHAQDYpptuuikmTpwYJSUl0bFjx7TjAAAAAMBWvK4RAIAad9ppp8Xs2bNj5syZ0bx587TjAACUKSkpif79+8f9998fF110UdpxAAAAAGBbvK4RAICa98ADD8TSpUu9thEAyCmzZ8+OCy64IC699FINXgAAAADkNE/yAgCgVvzhD3+IH/3oR/HnP/85jjvuuLTjAAC7uKVLl0bXrl2jffv2MWnSpGjUqFHakQAAAACgPFlNXgAA1Jr+/fvHjBkzYtasWV7bCACkprS0NE4//fR4++23Y/r06dGxY8e0IwEAAADA9nhdIwAAtaeoqCiWL18e119/fdpRAIBd2E033RQTJ06MkpISDV4AAAAA1AmavAAAqDV77rlnjBo1KoqKiuLFF19MOw4AsAsqKSmJ22+/PUaPHh1du3ZNOw4AAAAAVIjXNQIAUOsGDBgQb731VsyaNStatGiRdhwAYBcxe/bs6NatW5x33nlRVFSUdhwAAAAAqKisJi8AAGrdokWL4pBDDomzzjor7rnnnrTjAAC7gKVLl0bXrl2jffv2MWnSpGjUqFHakQAAAACgorJe1wgAQK1r165djBo1KsaMGRMvvPBC2nEAgHqutLQ0Bg8eHKtXr45sNqvBCwAAAIA6x5O8AABITWFhYUydOjX+9re/RevWrdOOAwDUUzfccEPceeed8eqrr0bXrl3TjgMAAAAAleVJXgAApOfee++NjRs3xs9+9rO0owAA9VRJSUncfvvtMXr0aA1eAAAAANRZnuQFAECqnnrqqejXr19MmDAhTjnllLTjAAD1yOzZs6Nbt25x3nnnRVFRUdpxAAAAAKCqspq8AABI3dlnnx2vvfZa/O1vf4s2bdqkHQcAqAeWLl0aXbt2jfbt28ekSZOiUaNGaUcCAAAAgKryukYAANJXVFQUpaWlcc0116QdBQCoB0pLS2Pw4MGxevXqyGazGrwAAAAAqPM0eQEAkLq2bdvGfffdF//xH/8RJSUlW33+wQcfxLx581JIBgDkqvXr18f69eu3+dlNN90UEydOjJKSkujYsWMtJwMAAACA6qfJCwCAnHD66afHOeecE5dddlksWbIkIiKSJIn77rsvDj744Bg/fnzKCQGAXDJhwoQ44YQTYsGCBVtMLykpidtvvz1Gjx4dXbt2TSkdAAAAAFQvTV4AAOSMoqKiyMvLi6uuuir+53/+J0466aS49NJL48svv4wXXngh7XgAQA555JFHYsqUKVFQUBBvvPFGRETMnj07Lrjggrj00kvjoosuSjkhAABZlsD7AAAgAElEQVQAAFSfTJIkSdohAABgs6effjrOOOOMaNq0aWzYsCE2bNgQERGNGjWKZcuWRZMmTVJOCACkbcWKFdGuXbtYv359NGjQIDKZTIwcOTJGjx4d7du3j0mTJkWjRo3SjgkAAAAA1SXrSV4AAOSMBQsWxP333x8REWvWrClr8IqIWL9+fdlTOgCAXdsTTzwRGzdujIiITZs2xcaNG+Oqq66KJEli3LhxGrwAAAAAqHc0eQEAkBOy2WwceOCB8eKLL0ZExNcfONuoUaN4+eWX04gGAOSYhx9+ODKZzBbTkiSJDz/8MM4666z47LPPUkoGAAAAADVDkxcAAKkqLS2NgQMHxsCBA2PlypVbPL3rq9avXx/PP/98LacDAHLNwoUL45VXXolNmzZt9dnGjRtjxowZUVBQ4AmgAAAAANQrmrwAAEhVXl5e3HjjjbHffvtFfn7+duedMWNGrFixopaSAQC5qLi4eKuneH3Vhg0bYvHixXHcccdFSUlJLSYDAAAAgJqjyQsAgNQVFBTEjBkzYsCAAdudr7S0NF599dVaSgUA5KKxY8du8ylem+Xn50deXl5ce+210bt371pMBgAAAAA1R5MXAAA5oUWLFvHoo4/GH/7wh9htt922+VSvhg0bxssvv5xCOgAgF8yfPz/eeuutSJJkm5/n5eXF9773vZg5c2b86le/iiZNmtRyQgAAAACoGZq8AADIKeeff368/fbb23x94/r16+P5559PKRkAkLZHH310m43g+fn50bx587jzzjtj6tSpcfDBB6eQDgAAAABqjiYvAAByzkEHHRRvvfVWDBw4cKvP5syZE59//nkKqQCAtD388MOxYcOGsu/z8v75T1u9evWK2bNnx9ChQ8umAQAAAEB94l+9AADISc2bN49HHnlkq9c3ZjKZ+Mtf/pJuOACg1s2YMSPef//9su8bNGgQnTp1iueeey4mTJgQnTp1SjEdAAAAANQsTV4AAOS0888/P6ZNmxb77LNPNGzYMJIkiZdffjntWABALRs3blxkMpnIz8+PBg0axLXXXhtz5syJH/zgB2lHAwAAAIAal0mSJEk7BABQu8aPH592BKi0tWvXxgMPPBCTJ0+Otm3bxj333JN2JKiTjj766OjcuXPaMXZZU6dOjY8++ijtGFDnJEkSP/7xj2PZsmWx//77x49//OPYe++9044F5VJvAQAAgGqW1eQFALugTCaTdgQAUlJcXBwDBw5MO8Yuq7CwMB5//PG0YwBQw9RbAAAAoJpl89NOAACkw00H6rK//vWvsXz58jjmmGPSjgJ1iibf3DBgwIDIZrNpx4A65YUXXoiCgoLo0KFD2lFgh9RbAAAAoCZo8gIAoM459NBD044AANSi3r17px0BAAAAAFKVl3YAAAAAAAAAAAAAyqfJCwAAAAAAAAAAIIdp8gIAAAAAAAAAAMhhmrwAAAAAAAAAAABymCYvAAAAAAAAAACAHKbJCwAAAAAAAAAAIIdp8gIAAAAAAAAAAMhhmrwAAAAAAAAAAABymCYvAAAAAAAAAACAHKbJCwAAAAAAAAAAIIdp8gIAAAAAAAAAAMhhmrwAAAAAAAAAAABymCYvAIB67L333otBgwZFhw4dIj8/PzKZTGQymWjdunXZPCNHjiyb3rlz5xTT7rxx48aVjaVx48ap5ajsNq1P+6AyamLcH374YZx++umxYsWKalleLrnuuuuiuLg47RhAJajD6aivdTiXx1VT9TetMau5AAAAQC7S5AUA1GurVq2Kb33rW9GnT5+0o9S6Dz74ILp37x7vvfdePPHEE7FixYpYsWJFjB8/PvLy/vcy8JprrokkSaKgoCDFtNXj7LPPjiRJomfPnqnmqOw2rU/7oDKqe9wzZsyI73//+9GrV69o2bJltSwzlwwZMiSuv/76uPnmm9OOAhWmDqvDaaivdThXx1WT9TetMau5AAAAQC7S5AUAVKvmzZvHMccck3aMMkmSRGlpaZSWlqYdZYeqe9vdf//9sXz58igqKoqjjz46mjZtGi1atIjCwsJYsmRJarly3a423vpixYoV0bdv3zjrrLPi8ssvTztOjdh///3jySefjFtvvTXGjx+fdhxyVK6dw9Rhdbiy6ut46+u4tld/6/KY1VwAAAAgF2nyAgDqtRYtWsS8efPiP//zP9OOUuvmzp0bERHf/e53U04CNW/EiBGxYMGCuOWWW9KOUqMKCgpiwIAB8dOf/jQ2btyYdhzYIXVYHaZ+q8/1V80FAAAAco0mLwCAemrDhg0REbHbbrulnARqVpIk8eCDD0a3bt2iY8eOacepcf369YuPP/44JkyYkHYUYDvUYeq7XaH+qrkAAABALtHkBQDs0Lp16+KWW26Jb3/729G0adPYfffdo2/fvvH000/Hpk2bIiJi5MiRkclkYvXq1fH6669HJpOJTCYT+fn5Wyxr0aJFccUVV0SXLl2iUaNG0a5du+jfv3/MmDGjbJ7Ny8pkMtG5c+d48803o2fPntGiRYto2rRpnHDCCfH666/vMHdJSUnZcjKZTKxdu3ab0z/44IMYNGhQtG7dOtq2bRt9+vSJefPmVTnPr371q7L5v/qKmueff75s+je+8Y2tlr+jbVdRm8f31FNPRUREkyZNthjv5q8LL7xwu8upzn369W0+Z86cGDhwYLRt27Zs2uLFiyu8vM1mz54dZ555ZrRq1SqaNWsWxx57bEyePLlK260i4924cWMUFxfHySefHB06dIgmTZrEoYceGqNGjdruq8hmz54dp512WrRq1apSx/BmldkmX/f1bf/hhx/GoEGDokWLFtG2bdsYPHhwLF26ND744IPo27dvtGjRIvbcc88YMmRIrFy5cotlVWb8FTlvlOePf/zjVsfrggULyp1/5syZ8fnnn0dBQcFWn1U0c0WO0QcffLBCx3FF1rls2bKtxvirX/2qLPNXpw8YMGCLMR122GEREfHCCy9sdztSf6jD6rA6/E91sQ7X13FFlF9/69OY1VwAAAAgpyQAwC4nIpLi4uIKz3/RRRclrVq1Sl588cXkyy+/TBYsWJBcc801SUQkkyZN2mLeZs2aJT169Njmcj799NNkn332SfbYY49kwoQJycqVK5O//e1vyXHHHZc0btw4mTJlyhbzFxQUJM2aNUu6d++eTJkyJVm1alXy5ptvJt/97neTRo0aJX/5y18qlP+MM85IIiJZs2bNNqefccYZZct/6aWXkiZNmiRHHnnkVsupbJ7ytsURRxyRtG3bdqvp29t2SZIkJ5xwQrL77rsnU6dO3alxL1q0KImI5IILLthqfJ06dapUrsru082ZjjvuuGTSpEnJ6tWrkzfeeCNp0KBBsmjRokotb+7cuUnr1q2TTp06JS+++GKycuXKZNasWUmvXr2SLl26JLvttluFtlNlxvvMM88kEZHcdtttyZIlS5JFixYlv/3tb5O8vLzkmmuu2Wr+goKCpFWrVskJJ5yQTJ48OVm5cuV2j5lt7YPKbuPybN72/fv3T6ZPn56sWrUqGTt2bBIRySmnnJKcccYZyTvvvJOsXLkyGTNmTBIRyVVXXVXl8VfmvPH1cW/cuDG5+uqrk5NPPjlZsmTJDsf28MMPl+X6usrusx0doxWZpzLr7N27d5KXl5f893//91ZZunfvnjzyyCNbTV++fHkSEcmxxx67w23zdZU9/1P9BgwYkAwYMKBSP6MOVy2POqwO51Idro/j2l79rS9jrmrNVW8BAACAGjBekxcA7IIqe9Nh3333TY4++uitph9wwAGVurl8wQUXJBGxVdPCZ599luy2227JEUccscX0goKCJCKSd955Z4vps2bNSiIiKSgoqFD+Hd1cfuaZZ7aYPmDAgCQiyho6qpqnum8uH3fccUmbNm0q3dRTkzeXK7tPN2f6z//8z51eXmFhYRIRyeOPP77FvJ988kmy22671djN5eOPP36r6eedd17SsGHDZPny5VtM33zMfL0hoLxjZlv7oLLbuDybt/2ECRO2mH7wwQcnEZG88sorW0zfd999kwMPPHCLaZUZf2XOG18d99KlS5PevXsnQ4cOTTZu3FihsY0YMSKJiKSoqGirzyq7z3Z0jFZknsqs84UXXkgiIrnsssu2mHfy5MlJp06dkvXr129zHZlMJvnmN79ZbsbyuOmcvqo0eanDVcujDqvDuVSH6+O4tld/k6T+jLkqNVe9BQAAAGrAeK9rBAB26Ac/+EFMmTIlLr744njjjTfKXg01Z86cOP744yu8nJKSksjLy4s+ffpsMb1Dhw5x8MEHx1tvvRUff/zxFp81a9as7DUpmx166KHRsWPHmDlzZnz22WdVG9RXHHnkkVt8v9dee0VExKeffrrVvLWRpzx/+ctfYsmSJdG9e/caW0dlVWWfRkR07dp1p5f3/PPPR0RE7969t5i3Y8eOccABB1R5TNvTp0+fmDRp0lbTCwoKYsOGDfHuu+9u9Vnjxo2jW7duW0yrzDFT1W1cnu9///tbfN+xY8dtTu/UqdNWvwOVGX9Vzhtz5syJbt26RV5eXtx9993RoEGDCo1p8yvgGjZsuNVnVdlnEeUfoxWZpzLr7NWrVxx66KHx+9//Pr744ouy6XfccUf85Cc/2eaYIiLy8/NjzZo1O8xI/aAO126e8qjD6vBXVbUOb0tdHdf26u+O1KUxq7kAAABArtDkBQDsUFFRUYwdOzbmz58fPXv2jJYtW8YPfvCDePLJJyu8jHXr1sXy5cujtLQ0WrVqFZlMZouvt99+OyIi5s6du8XPtW7depvLa9++fURELFy4sIqj+l+tWrXa4vtGjRpFRERpaelW89ZGnrqiqvs04p836XdmeevWrYuVK1dG48aNo3nz5lsta/P+qG7Lly+PW265JQ499NBo06ZNWbZrr702IiK+/PLLrX6mbdu2kclkys24vWNmZ7ZxeVq2bLnF93l5edGgQYNo2rTpFtMbNGiw1e9AZcZf2fPG0qVL48wzz4zOnTvHc889F3/84x8rPKbGjRtHRMSGDRu2+qwq+yxi28doReep7DqvvPLK+PLLL+Oee+6JiIj3338//vznP8fFF19c7ro3btwYTZo02WFG6gd1uHbz1BXqcN2sw/VpXNurvztSl8as5gIAAAC5QpMXALBDmUwmBg8eHBMnToxly5ZFSUlJJEkS/fv3jzvvvHOrebdlt912i9atW0d+fn5s2LAhkiTZ5tcJJ5ywxc998cUXkSTJVsvbfBOnpm4ilqcyefLy8mL9+vVbzbts2bJtLru8bZe26t6n5anM8nbbbbdo0aJFrF27NlatWrXVspYsWVLt442I6Nu3b/zbv/1bDBkyJN5///0oLS2NJEnirrvuiojY5rGxfPnybS6rIsdwdW/jnVWZ8VfmvBHxz6dkTJw4MZ566qk49NBDY8iQIfHmm29WKNeee+4ZEdve1lXZZzursus899xzY4899ojRo0fHunXr4je/+U1ccMEF0aZNm20uf8WKFZEkSdm4qf/U4arlUYfV4YjcqcP1cVzbq78R9WPMai4AAACQSzR5AQA71Lp165g9e3ZE/PN1LCeffHKUlJREJpOJCRMmbDFv06ZNt7iheuCBB8b9998fERH9+/ePjRs3xuuvv77VOoYPHx577713bNy4cYvpa9eu3arR469//Wt8+umnUVBQUOs3XCqTZ88994xPPvlki3kXLFgQ//M//7PNZW9v26Wpuvfp9lRmeaecckpE/O/rojZbvHhxzJkzp8Lr/Lryxrtp06Z4/fXXo0OHDnHFFVdEu3btym5ebu8VPqtWrYqZM2duMa0yx3B1b+Oqquz4K3PeiIho0aJFdOrUKZo3bx5PP/10NG/ePM4888wKvXrtkEMOiYjY6hVLVd1nO6Mq69xtt93isssui4ULF8ZvfvObeOSRR2Lo0KHlrmPzeWXzuKn/1OGq5VGH1eGI3KnD9XFc5dXfzerDmNVcAAAAIJdo8gIAKuTHP/5xzJo1K9atWxcLFy6MESNGRJIkceKJJ24x3/e+9714//3346OPPoqpU6fG/Pnz49hjj42IiF//+tex//77x49+9KN47rnnYvny5bFkyZK477774pe//GWMHDky8vPzt1heq1at4oYbboipU6fG6tWrY/r06XHeeedFo0aNYtSoUbU2/qrk6dWrV3z66acxevToWLVqVcybNy+GDh1a7lMGtrftIiJOPPHEaNu2bbzxxhs1OsbK5KrKPt2eyizvtttui9133z2uvPLKeOmll2LVqlXx97//Pc4777xtvjpqZ8fboEGDOP7442PBggVxxx13xOLFi2PNmjUxadKkGDNmTLnLa9asWVx++eXxX//1X1U6hiuzTT744INo0KDBFq8dqi5VGX9Fzxtf16VLl3j88cdj0aJF0b9//1i3bt125y8oKIj27dtvdeO3qvtsZ1R1nZdddlk0adIkbrrppjjppJPim9/8ZrnzzpgxIyL+eY5h16EOVz6POqwOR+ROHa7L4ypPefW3Po1ZzQUAAABySgIA7HIiIikuLq7w/DNmzEguueSS5Dvf+U7StGnTZPfdd0+OOuqo5IEHHkhKS0u3mHf27NnJsccemzRr1izZa6+9kqKioi0+/+KLL5Krr7462W+//ZKGDRsm7dq1S3r16pW89NJLW623oKAg6dSp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DaBabNq0KaZOnRoPP/xwFBcXx8qVK8sauwoLC6Njx45pRwQAAAAAqAhNXgAAsKtbsGBBjBkzJkaNGhWbNm2Kf/mXf4mf/exn0alTp7SjAVTa5saubDYbjz32WCxatCgOOuigKCwsjPPPPz/222+/tCMCAAAAAFSWJi8AAOCfVqxYEQ899FDccccdsWjRohg0aFBcf/318Z3vfCftaADbVVpaGlOmTIlsNhvFxcXx+eeflzV2nXfeefHNb34z7YgAAAAAADtDkxcAALCl9evXx7hx4+L222+POXPmxKmnnhrXXXdd9OjRI+1oAGW+2tg1fvz4WLBgQVlj17nnnhvf+ta30o4IAAAAAFBdNHkBAADbVlpaGhMmTIjbb789pkyZEj169IihQ4dG//79o0GDBmnHA3ZBX23symaz8dlnn5U1dv3whz+MAw88MO2IAAAAAAA1QZMXAACwY5MnT47hw4fHhAkTYv/994/LL788LrnkkmjcuHHa0YBdwLvvvhvZbDYefvjhmD9/fllj16BBg7xSFgAAAADYFWjyAgAAKm7u3LkxevTouP/++6NVq1bx4x//OIYOHRpt2rRJOxpQz2xu7HrkkUfiv//7v6NLly5x+umnR2FhYRxzzDFpxwMAAAAAqE2avAAAgMr7/PPP4957741Ro0bFpk2b4l/+5V/i2muvjc6dO6cdDajDNjd2PfroozF37tzYZ5994owzztDYBQAAAADs6jR5AQAAVbdy5cr4j//4jxg5cmQsXLgwBg0aFMOGDYuDDz447WhAHbG5sWvcuHExZ86c2GuvvaJfv35RWFgYPXr0iEwmk3ZEAAAAAIC0afICAAB23vr162PcuHExfPjweO+99+K0006LoUOHxkknnZR2NCAH/f3vf4/x48fH+PHj47333ovOnTtH//79NXYBAAAAAGybJi8AAKD6JEkSzz77bAwfPjxef/31+N73vhdDhw6Nc889Nxo0aJB2PCBFH3zwQTz11FORzWbj9ddfj2984xvRv3//GDx4cBx99NGRl5eXdkQAAAAAgFylyQsAAKgZb731VowaNSoeffTR6NKlS/zkJz+Jiy++OJo0aZJ2NKCWfPjhh1FSUlLW2NW2bds49dRTo7CwME455ZTIz89POyIAAAAAQF2gyQsAAKhZ8+bNi9/+9rfxwAMPRIsWLeLSSy+NK664Inbf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6afHihUranQ9lVVd+66uH881nT8Xts+udl6qjLTOHdddd10UFxdX+ecBAAAAgPpJkxcAANSCDz74ILp37x7vvfdePPHEE7FixYpYsWJFjB8/PvLy/vey/JprrokkSaKgoCDFtNXj7LPPjiRJomfPnqnmqOw2ra19MGPGjPj+978fvXr1ipYtW9bouiqruvZdXT+eazp/2ttnVzwvVUZa544hQ4bE9ddfHzfffPNOLQcAAAAAqF80eQEAUGc1b948jjnmmLRjVMj9998fy5cvj6Kiojj66KOjadOm0aJFiygsLIwlS5ZUeDl1aczVob6Od8WKFdG3b98466yz4vLLL087Tr1UX4+d6lSfz0u5mKmi9t9//3jyySfj1ltvjfHjx6cdBwAAAADIEZq8AACgFsydOzciIr773e+mnIRcMGLEiFiwYEHccsstaUdhF+a8lLsKCgpiwIAB8dOf/jQ2btyYdhwAAID/x969R1lZ3vcC/+2ZgWEYh+ES5N5ItSY9lowWlZJIAVHQOBSZDuKKKK7WS5cnVbRk1Uvq6QqaLJXUmBV6NLrWyYlJ00EbqIjXpJhVuaSYCMS4BKsxCcIoFxkGBWSc5/yRzBy3MzB7DwN7g5/PWvuP/exnv+/vubyva8I3+wUAioCQFwAAHAUHDhyIiIjy8vICV0KhpZTioYceinHjxsXw4cMLXQ4fY+5LxW3mzJmxefPmWL58eaFLAQAAAACKgJAXAABFZf/+/XH77bfHpz/96ejbt28MHDgwpk+fHo899lh88MEHERGxcOHCyGQy8e6778bKlSsjk8lEJpOJsrKyrGNt27Ytrr/++jjppJOid+/eMXjw4Kirq4t169a192k7ViaTiZEjR8batWtjypQpUVVVFX379o3JkyfHypUruz2epUuXRiaTiX//93+PiIiKior28334deWVVx7yOD055raa2l4bN26MSy65JAYNGtTetn379pyP1+aVV16Jiy++OKqrq6OysjImTJgQzz//fLfmLZfxtrS0RENDQ5x//vkxdOjQqKioiDFjxsR9990Xra2tBz32K6+8EhdddFFUV1d3a43zmZPOrF+/Pt56662oqanJav/ouvz617+O2bNnR1VVVQwaNCguv/zyeOedd+KNN96I6dOnR1VVVQwbNiyuvvrqaG5u7nCeHTt2xE033RQnn3xy9O7dOwYMGBAXXnhhrFixotM5yWXt7rjjjvb6PvwovKeeeqq9/ROf+ERO8xBx+HPZmULunZ6cn1xrzOd6/uh3jtX70uHWdKzcO04//fSIiHj66adzPgcAAAAAcBxLAABwhNTX16f6+vq8vnPVVVel6urq9Mwzz6T33nsvNTY2pvnz56eISCtWrMjqW1lZmT73uc91epwtW7akT37yk2nIkCFp+fLlqbm5Ob300ktp4sSJqU+fPmnVqlVZ/WtqalJlZWUaP358WrVqVdqzZ09au3Zt+sxnPpN69+6dnnvuuaz+kydPTgMHDkyrV6/OaVwzZsxIEZH27t2b1b5t27YUEWnu3Lkd6hkxYkSH4/TkmNtqmjhxYlqxYkV6991305o1a1JpaWnatm1bXsd79dVXU//+/dOIESPSM888k5qbm9OGDRvS1KlT00knnZTKy8tzmqd8xrts2bIUEemrX/1q2rlzZ9q2bVv65je/mUpKStL8+fM79K+pqUnV1dVp8uTJ6fnnn0/Nzc2HXOPO1iDfOe7Mww8/3F53Z9rWpa6uLr3wwgtpz5496bvf/W6KiHThhRemGTNmpBdffDE1Nzen+++/P0VEuvHGG7OOsXXr1jR69Og0ZMiQtGzZstTU1JQ2btyY6urqUiaTSQ8++GB73+6s3cHWZezYsWnQoEEd2ntiLvO95gq5d3pifvKtsavruTPH4n0pV8fDvaOpqSlFRJowYULO404ppYhIDQ0NeX0HAAAAACh6i4W8AAA4YroT8ho9enT67Gc/26H91FNPzSvkNXfu3BQR6fvf/35W+9atW1N5eXkaO3ZsVntNTU2KiPTiiy9mtW/YsCFFRKqpqclqnzhxYhowYEBOoZ6Ujk6YIt8xt9X0xBNPHPbxZs2alSIiPfroo1l933zzzVReXn7EQl6TJk3q0D5nzpzUq1ev1NTUlNXetsYfDQkdbI07W4N857gzd999d4qItGjRok4/b1uX5cuXZ7WfdtppKSLST37yk6z20aNHp0996lNZbVdeeWWKiPSDH/wgq33fvn1p+PDhqaKiIjU2NqaUurd2PRFiyncu873mCrl3eirklU+NXV3PnTkW70u5Ol7uHZlMJp1yyimdD/IghLwAAAAA4Li02OMaAQAoKhdccEGsWrUqrrnmmlizZk37Ixo3btwYkyZNyvk4S5cujZKSkqitrc1qHzp0aJx22mnxs5/9LDZv3pz1WWVlZfvjsdqMGTMmhg8fHuvXr4+tW7e2tz/33HOxc+fOGD9+fJ4jPHK6M+aIiLPPPvuwj/fUU09FRMS0adOy+g4fPjxOPfXUbo/pUGprazt99GBNTU0cOHAgfvnLX3b4rE+fPjFu3ListoOtcWe6O8cftm/fvoiI6NWr1yH7nXnmmVnvhw8f3mn7iBEjYsuWLVltS5YsiYiIiy66KKu9vLw8pkyZEnv37m1/BFwh1i4i/7nsyWuuEHvnaNQYcfDruVB6+r7UE46le0dZWVns3bs3l2EBAAAAAMe5skIXAAAAH7Zo0aIYP358/N//+39jypQpERExYcKEuPbaa2PmzJk5HWP//v3R1NQUERHV1dUH7ffqq6/GyJEj29/379+/034nnnhibNmyJd5+++0YNmxYrkM5qro75ojfhdsO53iDBw+O5ubm6NOnT5xwwgkd+px44omxadOmnMaRj6ampvj6178eS5Ysic2bN8euXbuyPn/vvfc6fGfQoEGRyWQ6rbGrNT6cOf6wPn36RETEgQMHDtonIqJfv35Z70tKSqK0tDT69u2b1V5aWhqtra0d6uzTp09UVVV1OO6QIUMiIqKxsTH2799fkLXrqbnsrqO9d45WjRGdX8+F0tP3pZ5yLN07WlpaoqKiossxAQAAAADHP7/kBQBAUclkMnH55ZfHj370o9i1a1csXbo0UkpRV1cX//RP/9Shb2fKy8ujf//+UVZWFgcOHIiUUqevyZMnZ31vx44dkVLqcLy33347In73j/mF1tNjPph8jldeXh5VVVWxb9++2LNnT4dj7dy5s8fHGxExffr0WLBgQVx99dWxadOmaG1tjZRS3HvvvRERna5lW9Dio3JZ456a47YgyMFqOVzl5eVRXV0d+/bti+bm5g6fv/XWWxHxu18Q6u7alZSUxPvvv9+h/aNhmUPV2JP7tTOF3DuHOz/drbFQjtZ9qSdqijh27h27d++OlFLRhosBAAAAgKNLyAsAgKLSv3//eOWVVyLid4+zO//882Pp0qWRyWRi+fLlWX379u2bFaT41Kc+Fd/+9rcjIqKuri5aWlpi5cqVHc5x1113xR/8wR9ES0tLVvu+ffti7dq1WW2/+MUvYsuWLVFTU1MU/9De02M+lHyOd+GFF0bE/3/0X5vt27fHxo0bcz7nRx1svB988EGsXLkyhg4dGtdff30MHjy4PdRxqEeb7dmzJ9avX5/Vls8a98Qc/8mf/ElERJePdTwcbb9699FrZv/+/fHjH/84Kioq2h/P2J21GzZsWLz55ptZbY2NjfGb3/wm5xp7er9+VCH3zuHOT3drLJSjeV863JqOpXtH2x5qu2cAAAAAAB9vQl4AABSdv/mbv4kNGzbE/v374+2334677747Ukpx7rnnZvX70z/909i0aVP89re/jdWrV8frr78eEyZMiIiIr33ta3HyySfHX/3VX8WTTz4ZTU1NsXPnznjggQfiK1/5SixcuDDKyrKfXl5dXR233nprrF69Ot5999144YUXYs6cOdG7d++47777svqee+65MWjQoFizZs2RnYyP6OkxH0o+x/vqV78aAwcOjHnz5sWzzz4be/bsiZdffjnmzJnT6WMAD3e8paWlMWnSpGhsbIx77rkntm/fHnv37o0VK1bE/ffff9DjVVZWxhe/+MX46U9/2uUaH+6cHExNTU2ceOKJHQIjPelrX/tajB49OubNmxePP/54NDc3x6ZNm+ILX/hCbN26Ne677772xzZ2Z+2mTp0aW7ZsiW9961uxZ8+eeO211+KGG27I69fu8p3LfK+5Qu6dw52f7tbYmTfeeCNKS0sjk8nEz3/+87y+m6ujeV863JqOpXvHunXrIuJ3+wkAAAAAIBIAABwh9fX1qb6+Pq/vrFu3Ll177bXpj//4j1Pfvn3TwIED05/92Z+lBx98MLW2tmb1feWVV9KECRNSZWVlGjVqVFq0aFHW5zt27Eg33XRT+sM//MPUq1evNHjw4DR16tT07LPPdjhvTU1NGjFiRHr55ZfTtGnTUlVVVaqoqEgTJ05Mzz//fIf+EyZMSAMGDEirVq065HiWLFmSIiLrddlll6WUUpo2bVqHz2bMmNGh7bbbbuvRMa9evbrDOQ72p0E+c7hx48Z08cUXp379+qWKiop01llnpccffzxNmTKl/Rx//dd/fcj5+qhDjXfbtm3p2muvTaNGjUq9evVKQ4YMSVdeeWW6+eab2883duzYdM8997S/HzFiRPqv//qvNHny5HTCCSd0usYf7t/ZGuQzJwdz6623prKysvTmm2+2t3W2Lrfddltau3Zth/avfe1r6T//8z87tP+v//W/2o+3ffv2NG/evDR69OjUq1evVF1dnaZNm5Z+/OMf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3kuNjY1p/vz5KSLSihUrsvpWVlamz33uc50eZ8uWLemTn/xkGjJkSFq+fHlqbm5OL730Upo4cWLq06dPWrVqVVb/mpqaVFlZmcaPH59WrVqV9uzZk9auXZs+85nPpN69e6fnnnsup/pnzJiRIiLt3bu30/YZM2a0H//ZZ59NFRUV6ayzzupwnHzrOdhcjB07Ng0aNKhD+6HmLqWUJk+enAYOHJhWr16d07gPdbytW7em0aNHpyFDhqRly5alpqamtHHjxlRXV5cymUx68MEHs/rX1NSkESNGtL9vaWlJN910Uzr//PPTzp0729vzXeN816Cztayurk7Nzc1Z/b7yla+kiEhf/epXu11bLnpqv69bty5VVlammpqatGfPnpRSSvv27Uvjxo1LP/jBD/I6by7a1n/o0KFp2bJlaffu3amxsTEtWLAgRUS69957s/rluk/a1mfixIlpxYoV6d13301r1qxJpaWladu2bSmlI3sd5XOv6syyZcva983OnTvTtm3b0je/+c1UUlKS5s+f36F/LuPtqk8+55w2bVoqKSlJ//3f/92hlvHjx6fvf//7XY7x4Ycf7nBtHM/jb2pqShGRJkyY0OXcfFhEpIaGhry+AwAAAAAcNxYLeQEAUHDdCXmNHj06ffazn+3Qfuqpp+YV8po7d26KiA7/EL9169ZUXl6exo4dm9VeU1OTIiK9+OKLWe0bNmxIEZFqampyqr+rkNeyZcuy2uvr61NEtIcUultPT4e8Jk6cmAYMGJBzGOlQx7vyyitTRHQIEO3bty8NHz48VVRUpMbGxvb2D4e83nnnnTRt2rR0ww03pJaWlqzv57vG+a5BLiGvhoaGlMlk0pVXXnlYteWiJ/f74sWLU0Skurq61NramubOnZtuvfXWvM+bi7b17yzEcsEFF7SHvPLdJ23r88QTTxz03EfyOsrnXtWZZcuWpUmTJnVonzNnTurVq1dqamrKas9lvF31yeecTz/9dIqIdN1112X1ff7559OIESPS+++/f8jxpZTS3XffnSIiLVq06LBqyWVsufQ5GuPPZDLplFNOOWiNnRHyAgAAAICPtcUe1wgAwDHpggsuiFWrVsU111wTa9asaX/s2caNG2PSpEk5H2fp0qVRUlIStbW1We1Dhw6N0047LX72s59lPVovIqKysrL9cVttxowZE8OHD4/169fH1q1buzeoDznrrLOy3o8aNSoiIrZs2dKh79Go52Cee+652LlzZ4wfP/6wj7VkyZKIiLjooouy2svLy2PKlCmxd+/eTh9vtnHjxhg3blyUlJTEN77xjSgtLc36vDtrHJHfGnzUrl274oQTToiIiJ/+9Kcxd+7c+PM///N44IEHeqS27sr3fLNmzYrbbrstfvjDH8Y555wTO3bsiAULFvRYPR/Wtv4XXnhhh8+efPLJmDdvXla/fPfJ2WeffcjzH6nr6HDvVbW1tZ0+rrSmpiYOHDgQv/zlLzv9XlfjPVSffM45derUGDNmTHznO9+JHTt2tLffc8898bd/+7fRq1evLutoe9RpZ32P1/GXlZVlPYIUAAAAAKArQl4AAByTFi1aFN/97nfj9ddfjylTpkS/fv3iggsuaA+A5GL//v3R1NQUra2tUV1dHZlMJuv185//PCIiXn311azv9e/fv9PjnXjiiRER8fbbb3dzVP9fdXV11vvevXtHRERra2uHvkejniOtbS369OkTVVVVHT4fMmRIREQ0NjZmtb/zzjtx8cUXx8iRI+PJJ5+M733ve50eN981jshvDQ7mN7/5TcyYMSNGjRoVP/zhD9uPcbi1dUd3z7dgwYIYN25crFq1KmbNmhUlJT3/Z2RX659rv4Ptk4jfhbgO5UhdR4d7r2pqaorbb789xowZEwMGDGhfry996UsREfHee+91+r2uxnuoPvmec968efHee+/FP//zP0dExKZNm+I//uM/4pprrslpjH369ImIiAMHDhx2LV2NLZc+R2P8LS0tUVFR0WWNAAAAAABthLwAADgmZTKZuPzyy+NHP/pR7Nq1K5YuXRoppairq4t/+qd/6tC3M+Xl5dG/f/8oKyuLAwcOREqp09fkyZOzvrdjx45IKXU4XlsIpC0UcrTkU09JSUm8//77Hfru2rWr02MfbO6661BrUV1dHfv27Yvm5uYOn7/11lsR8btfnPqwsrKy+NGPfhT//u//HmPGjImrr7461q5dm3Xc7qxxT2hubo7a2to4cOBAPP744zFw4MAOYz4StfX0fn/uueeiqakpxowZE9ddd12sX78+r/Pmoqv1z7XfwfZJLo7UdZTPvaoz06dPjwULFsTVV18dmzZtitbW1kgpxb333hsR0WnNhyvfc1522WUxZMiQ+Na3vhX79++Pr3/96zF37twYMGBATucbNmxYRPwuXHW4tfSEIz3+3bt3R0qpfdwAAAAAALkQ8gIA4JjUv3//eOWVVyLid4/4Ov/882Pp0qWRyWRi+fLlWX379u2bFcj41Kc+Fd/+9rcjIqKuri5aWlpi5cqVHc5x1113xR/8wR9ES0tLVvu+ffuygkQREb/4xS9iy5YtUVNTc9T/4T6feoYNGxZvvvlmVt/Gxsb4zW9+0+mxDzV33XGo482cOTMiosP67d+/P3784x9HRUVFTJs2LeuzqqqqGDFiRJxwwgnx2GOPxQknnBAXX3xx1qP1urPGh+uDDz6ISy+9NF555ZX4t3/7tzj11FPbP6uvr4+lS5cesdp6cr//6le/ir/+67+Of/u3f4vHHnssKioqYsaMGbFt27a8zpuLtvV/4oknOnx2xhlnxI033pjVL599kosjdR3lc6/6qA8++CBWrlwZQ4cOjeuvvz4GDx7cHqY7Uo/66845y8vL47rrrou33347vv71r8f3v//9uOGGG3I+55/8yZ9ERHR4NOnxOv62vdM2bgAAAACAXAh5AQBwzPqbv/mb2LBhQ+zfvz/efvvtuPvuuyOlFOeee25Wvz/90z+NTZs2xW9/+9tYvXp1vP766zFhwoSIiPja174WJ598cvzVX/1VPPnkk9HU1BQ7d+6MBx54IL7yla/EwoULo6ysLOt41dXVceutt8bq1avj3XffjRdeeCHmzJkTvXv3jvvuu++ojb879UydOjW2bNkS3/rWt2LPnj3x2muvxQ033HDQXx871NxFRJx77rkxaNCgWLNmTU61drUWo0ePjnnz5sXjjz8ezc3NsWnTpvjCF74QW7dujfvuu6/9cXydOemkk+LRRx+Nbdu2RV1dXezfv7/9uPmu8eG68cYb44knnohvf/vbMWnSpIP2OxK19dR+37NnT1x88cXxjW98I/7H//gf7fO7ZcuWqK+v7/Bova72Slfa1v/GG2+M5cuXR3Nzc2zevDmuu+662Lp1a3vI63D3ycEcyesol3vVG2+8EaWlpVmPziwtLY1JkyZFY2Nj3HPPPbF9+/bYu3dvrFixIu6///68x5iL7p7zuuuui4qKivjyl78c5513Xpxyyik5n7OmpiZOPPHEDr8Sd7yOf926dRHxu30EAAAAAJCzBAAABVZfX5/q6+vz+s66devStddem/74j/849e3bNw0cODD92Z/9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yURZWVnWsbZt2xbXX399nHTSSdG7d+8YPHhw1NXVxbp169r7tB0rk8nEyJEjY+3atTFlypSoqqqKvn37xuTJk2PlypXdHk+ute7YsSNuuummOPnkk6N3794xYMCAuPDCC2PFihVdnuN73/te+3HbXo2NjTnPwdKlS7O++8Ybb8Ts2bOjf//+MWjQoKitrY3XXnvtoP337dvX/ln//v071NL2Kikpic2bN7f3zaW2npzjXM53zjnnZNU8Z86ciIg477zzstp37dqV83lz8eH1Ly8vj5EjR8Z5550X3/nOd2Lv3r2d9jvYPvno+mzcuDEuueSSGDRoUHvbzTffnNe+v+OOO9r7f/jRlE899VR7+yc+8YmsMeVyLR/K+vXr46233oqampqs9o+O79e//nXMnj07qqqqYtCgQXH55ZfHO++8E2+88UZMnz49qqqqYtiwYXH11VdHc3PzIee+q2vvlVdeiYsvvjiqq6ujsrIyJkyYEM8//3yHft2Zr0PpqWvlo1paWqKhoSHOP//8GDp0aFRUVMSYMWPivvvuy3oUay576qGHHuqyz/bt23M6565duzrcP+644472mj/cXl9fHxGHt996ck/lOqeH89+e008/PSIinn766TxXHAAAAAA4riQAAOhBEZEaGhpy7n/VVVel6urq9Mwzz6T33nsvNTY2pvnz56eISCtWrMjqW1lZmT73uc91epwtW7akT37yk2nIkCFp+fLlqbm5Ob300ktp4sSJqU+fPmnVqlVZ/WtqalJlZWUaP358WrVqVdqzZ09au3Zt+sxnPpN69+6dnnvuuaz+kydPTgMHDkyrV6/OaVyHqnXr1q1p9OjRaciQIWnZsmWpqakpbdy4MdXV1aVMJpMefPDBDrWOGDGi/X1LS0u66aab0vnnn5927tzZ7TmYMWNGiog0Y8aM9jl49tlnU0VFRTrrrLM61N3Wf+/eve1t1dXVqbm5OavfV77ylRQR6atf/Wq3a8tFT+2HdevWpcrKylRTU5P27NmTUkpp3759ady4cekHP/hBXufNRdv6Dx06NC1btizt3r07NTY2pgULFqSISPfee29Wv1z3Sdv6TJw4Ma1YsSK9++67ac2aNam0tDRt27YtpZT/vj/YWMeOHZsGDRqU1ZbPtdyZhx9+uMO+6Wx8dXV16YUXXkh79uxJ3/3ud1NEpAsvvDDNmDEj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To8++qi+8Y1vqG/fvh7ztbe92bV9kv/XnsrKShljrHMEAAAAAAAAQM9EyAsAAAC26tOnj/bt2yfpi2Harr32Wq1fv14Oh0Ovvfaax7zR0dEeAYpRo0bp6aefliTNnz9fDQ0NysnJabaOhx56SMOGDVNDQ4PH9NraWo+glCR98MEHKi0tVUpKSrt+UG+t1nnz5klSs+2rq6vT22+/raioqGZDxMXGxiopKUm9e/fWq6++qt69e2vu3Lkew3oFsg/aq7GxUTfddJP27dunP//5zx7D2GVmZmr9+vUdVlsw28Mnn3yib37zm/rzn/+sV199VVFRUZozZ44qKir8Wq8v3Mf/9ddfb/Zaamqq7rzzTo/5/GknvvCn3ScmJurQoUMe85aXl+vTTz9ttlx/zuWWfPnLX5akoA7beT5/9ql7OE33sI1uR48eVXFxcYvL92d/edNR53FjY6NycnI0aNAg3X777erfv78VWOyoYQADWWdkZKRuu+02HTlyRI8++qief/553XHHHc3ma297C4ZA96m/1x53m3KfIwAAAAAAAAB6JkJeAAAAsN2///u/a/fu3aqrq9ORI0f08MMPyxij6dOne8x3xRVXaP/+/frss8+Ul5enkpISZWRkSJIefPBBXXjhhfq3f/s3vfHGGzp16pSOHz+up556Sr/4xS+0YsUKuVwuj+XFx8frnnvuUV5enk6fPq0dO3bolltuUUREhH796197zDt9+nT169dP27Zt82mb2qp15MiRWr58uTZu3Kiqqirt379fX//611VWVqZf//rX1tBxLRkxYoRefvllVVRUaP78+aqrqwt4H7TXnXfeqddff11PP/20pk6d6nW+jqgtWO2hurpac+fO1RNPPKHLLrvM2r+lpaXKzMxsNnxga+v1hfv433nnnXrttddUVVWlzz//XLfddpvKysqskFd724k3/rT7mTNnqrS0VL/5zW9UXV2tjz/+WHfccYfXp9z5ei63JCUlRQMGDPD6BLVg8Gef/upXv1JCQoKWL1+ut956S9XV1dqzZ49uueWWFodwlPzfX95q9Odc8bVvCgsL09SpU1VeXq5HHnlER48e1ZkzZ7R582atWrXK5/r8Eeg6b7vtNkVFRem+++7TNddco4suuqjF+XxpbwcOHFBYWJjHcJd2b58/56Ak7dq1S9IX7QsAAAAAAABAD2YAAACA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ItS3b19df/312rx5syTp5MmTHutzOBy6//77JUkNDQ0e0zMzM63l+rItvgpmm29re89dlq9tbO7cuR774dx29vbbb8vhcGjDhg3WtOXLl3vM39DQ4HNt/rSnffv2ae7cuYqPj1dMTIwyMjKUnZ0d8D72Jpj73ps//elPzdpheXm5pMDOm7b6mfbw1tdJwWvL7TleklRUVKTDhw8rJSWl2WsNDQ1avXq1rr32Wg0aNEhRUVEaM2aMfv3rX3sMj+JLW3z22Wd9aq++rDPQvkiSxo4dK0n629/+5uthDFn+9k/e2mOg1/b29O3Bug8IpVq62j1JawI99309Xudek6KjozVhwgRt3LhR11xzjbWsJUuW+L2P/Knd31rcfG1rHdk3t6Qzrjdu9KP0ox1VS1fsR9vT57R1T+7P/G21TW/b3FrfIQX2mcSXNufvfgsUnx1D+7OjxPUOAADYyAAAAABBIMmsXr3a5/mXLFli4uPjzZtvvmlqampMeXm5+f73v28kmc2bN3vMGxMTYyZPntzickpLS83w4cPNwIEDzWuvvWaqqqrMhx9+aKZMmWJ69eplcnNzPeZPSUkxMTEx5qqrrjK5ubmmurra5Ofnm8svv9xERESYLVu2+FT/nDlzjCRz5syZFqfPmTPHWv5bb71loqKizPjx45stx996vO2LtLQ0069fv2bTW9t3xhgzbdo0k5CQYPLy8vza7ilTppjNmzeb06dPm23btpmwsDBTUVHh9/FwL2/+/Plmx44dprq62vzxj380ksz1119v5syZYwoLC01VVZVZtWqVkWTuvPNOj2WUlZWZkSNHmoEDB5oNGzaYU6dOmeLiYjN//nzjcDjMM888Y8173XXXGafTaT766KNm23bVVVeZF154wfq/v9vSlmC1eX+21xj/2tjKlSuNJPP88897LOPWW281kkxWVpbH9HXr1pkZM2YEXFtb7ekf//iH6dOnj0lKSjJvvvmmqaqqMrt37zYzZ840I0aMMJGRkQHvY2+Cve+TkpKs/zc0NJi77rrLXHvtteb48ePW9EDPG1/7GV+cX+v56zq3rwtWW27v8XruueeMJPOrX/2q2WsbNmywXjt+/LipqKgwTz75pHE6neb73/++1+301hZ9mcefdc6aNavVvuj8c9AYY06dOmUkmYyMjDb3zfkyMzNNZmam3+/r6OX7ew30du31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TPvOG2Na72da88gjj7S4TG99nT/7ua396c9yvLnnnnuMy+Uyhw4d8pheUVFhli1bZoYOHWrCw8PNwIEDza233mp+/OMfW9uTlpbmU1v0tb36us7zLV261Egy7777bqvbumDBApOUlGTOnj3r0745VyiHvHzpn1prj/4sx82X883fcyPQ87M915meek/i7dgY075z35d9dO41KTo62kyaNMm8++67ZurUqSY6Orpd+8jfPsTfWnxtax3VN9t5vXELtB8N9ZAX/Sj9qJuv/agx7etz2ron92f+ttqmt21u632BfiZp6zj7ut9au1b5gs+OofPZsTXd7XonEfICAKALWOMwJkiDhAMAAKBHczgcWr16tRYuXGh3Ka0aO3asjh49GpRH6gdDqNWD7oc2hu7s1KlTGj16tGbPnq1Vq1bZXU5Afve732nlypXasWOH13mKioqUmpqqF154QTfddJPf61iwYIEkae3atQHX2RHLD1b/RD8XHOzHwF1yySU6c+aMDh48aHcpIVFLKPbN7elH16xZo6ysLHXk1+j0o90D+xFdHW3YP93tetdVvtcDAKCHW+u0uwIAAAAAAIBAxMfHa8OGDXr55Ze1cuVKu8sJyKpVq3TXXXd5fb2kpETz58/X3XffHVDAC0BwlJeXKyEhQfX19R7TDxw4oI8//ljTp0/vkbW0JNT6ZvpRAEBH4HoHAADsQMgLAAAAAAB0WampqdqxY4feeOMNVVZW2l1Om5599lnNmzdP1dXVWrVqlU6cONHqX8s/9dRTeuCBB/TAAw90YpUAWnLixAktW7ZMn332mWpqarR9+3ZlZWUpLi5OP/nJT3psLS0Jpb6ZfhQA0FG43gEAgM5GyAsAAAA9wooVK+RwOFRUVKRDhw7J4XDovvvuox60m8PhaPPfz3/+806vizaGUG2bHWHEiBHauHGj4uLi7C7FJ+vXr1ffvn3129/+Vi+99JJcLpfXeR966KFu95f4weqf6OeCg/3om0GDBmnTpk06efKkrr76avXt21df/epX9aUvfUnbt29XcnJyj6ylNaHSN9OPdvxyejr2I3wVqvfntOH24XoHAAA6k8MYY+wuAgAAAF2fw+HQ6tWrW30aCQAA6HwLFiyQJK1du7ZLLh8A7LRmzRplZWWpI79Gpx8FANiN7/UAAOgS1vIkLwAAAAAAAAAAAAAAAAAIYYS8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rVuceuqp8fzzz7d5jfdmCKb6VQAAIABJREFU5cqV8dZbb0VlZWVWe0fv1w9r7fyvu+66Js/dz3/+84b2j33sYy2uwR7tufdbo76+PubOnRtnnnlmDBgwIEpLS2PEiBFx2223xe7duxv6ffRcvP7661FTUxM9e/aMPn36xMSJE+PVV19tNP6H17GsrCz+4R/+IR599NE444wzGsa68MIL27SOra0911r22Jdz0Z73lObce++9je6vtbW1ra69Led0X651zzPPs4PxefbpT386IiJ+8YtftO4kAgAAhSkBAAAA+6S6ujpVV1fn9J4LL7wwVVRUpCeeeCJt37491dbWpiuvvDJFRHrmmWey+nbr1i19/vOfb3KcN998M3384x9P/fv3T4sXL051dXXp97//fRo1alTq2rVrWrp0aVb/ysrK1K1bt3TyySenpUuXpm3btqXly5enT33qU6lz587p2Wefzeo/evTo1Lt377Rs2bJWzWvy5MkpItKoUaPSM888k9599930wgsvpOLi4rR+/fqc690zXlVVVXrxxRfTtm3b0t13350iIk2YMCFNnjw5vfTSS6muri7dfvvtKSLS5ZdfnjXGunXr0vDhw1P//v3TokWL0pYtW9KqVatSVVVVymQy6ac//WlD3/Hjx6eioqL05z//udHcTj755HT//fe3ee1b0l57Ipf5ppTbnpgzZ06KiHTfffdljTFjxowUEammpiarfcGCBWnMmDFtrq2l/fSnP/0p9ezZMw0ePDg98cQTqa6uLr388stp7NixadiwYalLly5tXuOm3HPPPSki0ve///0mX+/o/Zrr/FNqfu+MHDky9enTp1F7ZWVlGjx4cFZbrns/1/tIU8dctGhRw9q/8847af369emHP/xhKioqSldeeWWjMfaci8mTJzfs6yeffDKVlpamE088MatvU+v4+9//Pp1xxhmpb9+++7yOudSeay3tdR9q73vKh89ffX19uuKKK9KZZ56Z3nnnnTbXnss53ddr/cPH8zzzPEvpwH+ebdmyJUVEOvXUU5tc6+bMnTs3+RgJAAAKxjz/6xwAAAD2UVtCXsOHD0+f+9znGrUfddRROX0A+uUvf7nJDynXrVuXunTpkkaOHJnVXllZmSIivfTSS1ntL7/8coqIVFlZmdU+atSo1KtXr1Z/wLvnQ8zHHnusXerdM97ixYuz2o877rgUEem5557Lah8+fHg6+uijs9r2fGD7wAMPZLXv2LEjDRo0KJWWlqba2tqUUkpPPfVUioh08cUXZ/V9/vnn02GHHZY++OCDNs+lJe21J3KZb0q57YmNGzemzp07p/Hjxze0bd++PfXq1St94hOfSKWlpWnr1q0Nr5199tnpZz/7WZtra2k/TZ06NUVEeuihh7La33jjjdSlS5dGH4rnssZNuemmm1JEpDlz5jT5ekfv11znn1L7hLxy3fu53keaC3mddtppjfqef/75qVOnTmnLli1Z7XvOxaJFi7Laq6urU0Sk9evXN7Q1t45vv/12Kisra5eQV2trz7WW9roPtfc9Zc/527RpUxo3bly69NJLU319/T7Vnss53ddr/cPH8zzzPEvp4HieZTKZ9IlPfKLJ15oj5AUAAAVFyAsAAAD2VVtCXv/6r/+aIiLNnDkzLVu2rNGH3x+2tw9AKyoqUlFRUaOAQ0opnXDCCSki0t/+9reGtj3fctGUQYMGpYhIb775Zk5z+bA9H2Ju2LChXerdM95bb72V1ffMM89MEZHefffdrPZTTjkllZeXNzpmRGR9WLvH9OnTU0RkfXB7/PHHp7Kysqw5TJ48Of3gBz/Yp7m0pD33RC7zzXVPTJkyJRUXF6d169allFJ64IEH0vjx49Ott96aIiLdddddKaW/f4Deq1evVFdX1+baWtpP5eXlKSKyjrHHiBEjGn0onssaN+W73/1uioh0xx13NPl6R+/XXOefUvuEvNp777fmmM25+eabU0Q0+61JHw5ZpJTS5ZdfniIirVy5sqFtb+t4wgkntMs6trb2XGtpr3PR3veUwYMHp1deeSUdddRRacKECc2O25bnQWvO6b5e6x8+nueZ59nB8jzr1KlTq++tewh5AQBAQZlXFAAAAECHmzNnTtx9993x2muvxZgxY6JHjx4xfvz4WLBgQavH2LlzZ2zZsiV2794dFRUVkclksv5++9vfRkTEn/70p6z39ezZs8nx+vXrFxERb7/9dhtn9f9169at3eqNiOjRo0fWv4uKiqK4uDjKysqy2ouLi2P37t2Njtm1a9coLy9vNG7//v0jIqK2trah7Wtf+1ps3749fvzjH0dExOrVq+N///d/48ILL2yXuTSnPfdELvONyG1PXHDBBbFr1664//77IyLinnvuiQsuuCC+9KUvRXFxcdx3330REfHAAw/ExIkTo3v37vtUW0Tz+6muri66du3acIymav+wfV3jrl27RkTEBx98sNd+HbFf2zL/9rA/9n5rbNmyJa655poYMWJE9OrVq+F4X//61yMiYvv27U2+r6KiIuvfnTt3johoWPeW1rFXr14dVnuutXTEuWjrdbtp06aYMmVKDBkyJB5//PG499572632ls5pRPvcT/fwPPM8O1ieZ/X19VFaWtrs6wAAQOET8gIAAIA8yGQyMX369Hjqqadi8+bNsXDhwkgpRVVVVfzgBz9o1LcpXbp0iZ49e0ZJSUl88MEHkVJq8m/06NFZ79u4cWOklBqNt+eDz/0VDmlrvft6zIqKitixY0fU1dU1ev2tt96KiIgBAwY0tNXU1MTQoUPjRz/6UezcuTNuueWWmDlzZtYHuftjLu21J3Kdb0Rue+KLX/xi9O7dO+65555Yv359vPDCCzFlypTo379/jB07Nn75y1/GunXr4mc/+1lccMEF+1xbc7p06RLl5eWxY8eO2LZtW6PX33nnnUZtuaxxUwYOHBgRfw/t7A+5rFFb5h/x90DJ+++/36h98+bNra6xo6/jiIhJkybF9773vZg5c2asXr06du/eHSmluPXWWyMimty/rdHSOjYXes1lHVtbe661tOe5aO97SklJSTz11FPx8MMPx4gRI2LmzJmxfPny/VJ7c/PZl2u9JZ5ne+d5VnjPs61bt0ZKqeE5BgAAHJiEvAAAACAPevbsGa+88kpERHTq1CnOPPPMWLhwYWQymVi8eHFW37KysqwwwdFHHx133HFHRERUVVVFfX19LFmypNExbrzxxjjssMOivr4+q33Hjh1ZH7ZHRPzud7+LN998MyorK/frB4BtqXdfnX322RERjdZ1586d8fTTT0dpaWmMGzeuob2kpCQuvfTSePvtt+OWW26JBx98MC655JL9Ppf22hO5zjcitz3RuXPnqKmpiRUrVsS3vvWtmDx5csM3g0yfPj127doV3/nOd2LdunVx+umnZ43Zltr2ZsKECRER8fOf/zyrfcOGDbFq1apG/XNZ46Z88pOfjIiItWvXtrrGXOWyRrnOP+LvQbU33ngjq622tjb++te/trrGjr6Od+3aFUuWLIkBAwbEJZdcEn379m0Ihrz33nv7PH5z61hbWxurV69u8j2tXcdca8+1lvY6F+19TykvL4/BgwdH9+7d45FHHonu3bvHlClTYt26de1ee1P29VpvDc+z5nmeFd7zbM/9as9zDAAAOEC1x48+AgAAwKGsuro6VVdX5/SeioqKNGrUqLRy5cq0Y8eO9NZbb6Vrr702RUS67rrrsvqOHz8+VVRUpL/+9a9p6dKlqaSkJP3xj39MKaX01ltvpSOOOCIdfvjh6bHHHkubN29OGzduTLfffnsqKytLc+fOzRqrsrIyVVRUpDFjxqSlS5embdu2peXLl6dPfepTqXPnzunZZ5/N6j969OjUu3fvtGzZslbNa/LkySki0nvvvdfk67nW29x448aNS8XFxY3GHzVqVOrWrVtW27p169Lw4cNT//7906JFi9LWrVvTqlWrUlVVVcpkMumOO+5oNM7WrVtTRUVFymQy6YILLmiXubSkvfZErvPNdU+klNLSpUtTRKSISM8880xD+/bt21N5eXmKiPSNb3yj0ftyra2l/fTnP/859e7dOw0ePDg98cQTqa6uLv3hD39I48aNS/369UtdunRp8xo3Zffu3alfv37p85//fJOvd/R+zXX+KaX01a9+NUVE+o//+I9UV1eX/vznP6dzzz03DR48OPXp06dR/8rKyjR48OCstlz3fq73kaaOefrpp6eISDfddFNav3592r59e/rlL3+ZDjvssBQR6cknn8zq39y5+MY3vpEiIr300kt7Xcff/e53afz48enjH//4Pq9jLrXnWksu5+Ivf/lLKioqShGRfvOb32SN0973lI+ev2effTZ16tQpffazn007duzIufZcz2lrr/W9rYnnmefZwfQ8u//++1NEpAULFjR5/ObMnTs3+RgJAAAKxjz/6xwAAAD2UVtCXitWrEgXXXRROvbYY1NZWVnq3bt3+uxnP5t++tOfpt27d2f1feWVV9Kpp56aunXrloYOHZrmzJmT9frGjRvTFVdckQ4//PDUqVOn1Ldv3zR27NhGoYeU/v+H73/84x/TuHHjUnl5eSotLU2jRo1Kzz//fKP+p556aurVq1daunTpXuezbNmyhg9JP/zXlNbU29R43/rWt9Ly5csbtd9www3pV7/6VaP273znOw3jbdiwIV122WVp+PDhqVOnTqmioiKNGzcuPf30083O6etf/3qKiLRy5cpm++Sy9i1pzz2Ry3xz3RN7HHnkkemwww5rVNuMGTNSRKQ//OEP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De0f+9jHGo3f0tq1l9acg4+u0Zo1a6KmpibKy8ujT58+MX369Ni0aVO8/vrrMWnSpCgvL4+BAwfGzJkzo66urt3HiYior6+PuXPnxplnnhkDBgyI0tLSGDFiRNx2221ZP7vY0no2ty8iInr27Jn12of/ioqKYu3atTmtYy42btwYV1xxRRxxxBHRpUuXGDJkSJxxxhlx1113xXvvvddkv86dO0evXr1iwoQJ8cwzzzS77qtWrYpzzz03+vTp09A2a9as/bqvI1p372hOa6+L1qxHc+69995G57m2tjYi2nadtHQv2dc1+ajWXhOt2Q933nlni302bNjQqmNu3ry50bped911DTV/uL26unqvc1y5cmW89dZbUVlZeUjM/9Of/nRERPziF7/IaS8AAADwEQkAAADgADd37tyU63/muPDCC1NFRUV64okn0vbt21NtbW268sorU0SkZ555Jqtvt27d0uc///kmx3nzzTfTxz/+8dS/f/+0ePHiVFdXl37/+9+nUaNGpa5du6alS5dm9a+srEzdunVLJ598clq6dGnatm1bWr58efrUpz6VOnfunJ599tlW1T958uQUEem9995rsn3y5MkN4z/55JOptLQ0nXjiiY3GybWe5tZi5MiRqU+fPo3a97Z2KaU0evTo1Lt377Rs2bJWzbuysjINHjw4qy3Xc7BnjaqqqtKLL76Ytm3blu6+++4UEWnChAlp8uTJ6aWXXkp1dXXp9ttvTxGRLr/88ka1tMc4ixYtShGRvv/976d33nknrV+/Pv3whz9MRUVF6corr8x5PZvaFxUVFamuri6r33e/+92G47Z1HVuybt26NHz48DRgwIC0aNGitHXr1lRbW5u+973vpYhIt956a1a//v37p0WLFqUtW7akVatWpaqqqpTJZNJPf/rTJuc4atSo9Mwzz6R33303vfDCC6m4uDitX78+pbR/93Uu947m7O085roeH70m6uvr0xVXXJHOPPPM9M477zS0t/U6ac29pD3WZI9cr4nW7IeW+uRyzHHjxqWioqL05z//uVEtJ598crrvvvtanOM999zT6Po7mOe/ZcuWFBHp1FNPbXFtPqy6ujpVV1fn9B4AAICD2DwhLwAAAOCA15aQ1/Dhw9PnPve5Ru1HHXVUTiGvL3/5yykiGn2wvW7dutSlS5c0cuTIrPbKysoUEemll17Kan/55ZdTRKTKyspW1d9SyGvRokVZ7dXV1SkiGj70b2s97R3yGjVqVOrVq1erA0RNhbxyPQd71mjx4sVZ7ccdd1yKiPTcc89ltQ8fPjwdffTRjWppj3EWLVqUTjvttEZjn3/++alTp05py5YtWe3tEfKaO3duymQyacaMGVnvzXUdWzJjxowUEWnu3LmNXhs/fnxDyGtPvwceeCCrz44dO9KgQYNSaWlpqq2tbTTHxx57rNlj7899ncu9ozl7O4+5rseHr4lNmzalcePGpUsvvTTV19dnvb+t10lr7iXtsSZ75HpNtGY/tNQnl2P+4he/SBGRLr744qy+zz//fBo8eHB6//339zq/lFK66aabUkSkOXPm7FMtrZlba/p0xPwzmUz6xCc+0WyNTRHyAgAAyDLPzzUCAAAAh6Tx48fH0qVL4ytf+Uq88MILDT8ptmrVqjjttNNaPc7ChQujqKgoJk6cmNU+YMCAOO644+I3v/lN1s/hRUR069at4eer9hgxYkQMGjQoVq5cGevWrWvbpD7kxBNPzPr30KFDIyLizTffbNS3I+ppzrPPPhvvvPNOnHzyyW0eoy3nICLiM5/5TNa/Bw0a1GT74MGDm1y39hhn4sSJTf4EX2VlZXzwwQfxhz/8odnjttbmzZuje/fuERHxf//3f/HlL385vvCFL8RPfvKTrH5tXcfmLFiwICIiJkyY0Oi1xx9/PC677LKsfl/84hez+nTp0iXGjBkT7733XpM/8/YP//APez3+/trX7XXvaE5b12PVqlVx0kknRVFRUfz7v/97FBcXZ73e1vPbmntJe65JW6+JlvbD3vrkcsyxY8fGiBEj4q677oqNGzc2tN98883xb//2b9GpU6cW69jzc6pN9T1Y519SUpL1E60AAADkTsgLAAAAOCTNmTMn7r777njttddizJgx0aNHjxg/fnxDwKI1du7cGVu2bIndu3dHRUVFZDKZrL/f/va3ERHxpz/9Ket9PXv2bHK8fv36RUTE22+/3cZZ/X8VFRVZ/+7cuXNEROzevbtR346oZ39p6zmIiOjRo0fWv4uKiqK4uDjKysqy2ouLi5tct/YYZ8uWLXHNNdfEiBEjolevXg11f/3rX4+IiO3bt7ewAq3317/+NSZPnhxDhw6N//mf/2nYExH7to5N2TNe165do7y8vM39+vfvHxERtbW1jV7r1q3bXmvYX/u6Pe4dzWnremzatCmmTJkSQ4YMiccffzzuvffeJsdty/ltzb2kPdekrddES/thb31yPeZll10W27dvjx//+McREbF69er45S9/GV/5yldaNceuXbtGRMQHH3ywz7W0NLfW9OmI+dfX10dpaWmLNQIkJbOcAAAgAElEQVQAANA8IS8AAADgkJTJZGL69Onx1FNPxebNm2PhwoWRUoqqqqr4wQ9+0KhvU7p06RI9e/aMkpKS+OCDDyKl1OTf6NGjs963cePGSCk1Gm9P6GRPCKWj5FJPUVFRvP/++436bt68ucmxm1u79tLWc1AoJk2aFN/73vdi5syZsXr16ti9e3eklOLWW2+NiGh0Xtq6nnV1dTFx4sT44IMP4tFHH43evXtnvd7e69ilS5eoqKiIHTt2RF1dXZv7vfXWWxHx92+bytX+2te53Duas7d7SlvWo6SkJJ566ql4+OGHY8SIETFz5sxYvnx51rj78zppjzXZI9droj3keszzzjsv+vfvHz/60Y9i586dccstt8SXv/zl6NWrV6uON3DgwIj4e7hqX2tpD/t7/lu3bo2UUsO8AQAAaBshLwAAAOCQ1LNnz3jllVci4u8/mXXmmWfGwoULI5PJxOLFi7P6lpWVZQVAjj766LjjjjsiIqKqqirq6+tjyZIljY5x4403xmGHHRb19fVZ7Tt27MgKYERE/O53v4s333wzKisrO/yD8FzqGThwYLzxxhtZfWtra+Ovf/1rk2Pvbe3aS1vOQSHYtWtXLFmyJAYMGBCXXHJJ9O3btyH809zPmrVlPXft2hXTpk2LV155Jf77v/87jjrqqIbXqqurY+HChRHR/ut49tlnR0TEY4891ui1448/Pi6//PKsfh+97nbu3BlPP/10lJaWxrhx41p93D32177O5d7RnL2dx7asR3l5eQwePDi6d+8ejzzySHTv3j2mTJmS9ZOU+/M6aY81iWjbNbGv2nLMLl26xMUXXxxvv/123HLLLXHffffFpZde2upjfvKTn4yIaPTzmAfr/PdcW3vmDQAAQNsIeQEAAACHrH/5l3+Jl19+OXbu3Blvv/123HTTTZFSitNPPz2r3wknnBCrV6+Ov/3tb7Fs2bJ47bXX4tRTT42IiBtuuCGOOOKI+Kd/+qd4/PHHY8uWLfHOO+/ET37yk/jud78bs2fPjpKSkqzxKioq4pvf/GYsW7Ys3n333XjxxRfj/PPPj86dO8dtt93WYfNvSz1jx46NN998M370ox/Ftm3b4tVXX41LL7202W8f29vaRUScfvrp0adPn3jhhRfaXH9bzkEhKC4ujtNOOy1qa2vj5ptvjg0bNsR7770XzzzzTNx+++1Nvqel9WzK5ZdfHo899ljccccdcdpppzXbr73X8YYbbojhw4fH5ZdfHosXL466urpYu3ZtXHzxxbFu3bqGkNeefpdddlk8+uijUVdXF6tXr45//Md/jHXr1sVtt93W8DOFudif+7o1947XX389iouLs34OcY+W7in7sh7Dhg2Lhx56KNavXx9VVVWxc+fOhnH353XS2vvp3rTlmthXbT3mxRdfHKWlpfHtb387zjjjjPjEJz7R6mNWVlZGv379YuXKle1Sy77oiPmvWLEiIv5+nQEAALAPEgAAAMABbu7cuSnX/8yxYsWKdNFFF6Vjjz02lZWVpd69e6fPfvaz6ac//WnavXt3Vt9XXnklnXrqqalbt25p6NChac6cOVmvb9y4MV1xxRXp8MMPT506dUp9+/ZNY8eOTU8++WSj41ZWVqbBgwenP/7xj2ncuHGpvLw8lZaWplGjRqXnn3++xboXLFiQIiLr77zzzkvLli1r1P6tb30rpZQatX/xi19scz2bN29OF154YRo4cGAqLS1Np5xySlq+fHkaOXJkw/jf+MY3Wr12p556aurVq1daunTpXud98803Nzu/1p6D5tZo+fLljdpvuOGG9Ktf/apR+3e+8512GyellNavX58uuuiiNHTo0NSpU6fUv3//NGPGjDRr1qyGviNHjmxxPZvbFy+++GKj9o/+LViwIKd1zMWGDRvSZZddloYPH546deqUBg4cmKZNm5ZWr169134VFRVp3Lhx6emnn97r+Wvuut+f+7q1946//OUvqaioKGUymfTyyy9nHa+l66I16/HAAw80Wotbb721yXU677zzUkr7dp2k1Py9JJf7aUtae020Zj+0ds/keh3uMXPmzBQR6bnnnstpjiml9M1vfjOVlJSkN95446Cf/9SpU9PgwYPT+++/n9MaVVdXp+rq6pzeAwAAcBCbl0kppabCXwAAAAAHinnz5kVNTU0cCP+Z49Of/nRs2LCh0c905Uuh1QPtwb6mI/zXf/1XzJkzJ1588cWc37tly5Y47rjjYuLEifvtW7r2t9bMf+XKlXH88cfH/fffH9OmTctp/KlTp0ZExPz58/epTgAAgIPEfD/XCAAAAAAAObr99tvjiiuuaNN7KyoqYtGiRfHQQw/FnDlz2rmyjtHS/F977bWoqqqKq666KueAFwAAAI0JeQEAAAAAQAvuvPPOOPvss2Pbtm1x++23x6ZNm+Lcc89t83jHH398vPjii/H444/H1q1b27HS/SPX+f/kJz+J66+/Pq6//voOrBIAAODgJeQFAAAA0AFmz54dmUwmVq5cGW+88UZkMpn49re/rR4OOJlMpsW/a6+9Ni+12deFq5D3TS4WLlwYvXr1iv/8z/+MBx98MEpKSvZpvGHDhsWjjz4aPXr0aKcK969c5n/jjTf6Bi8AAIB2lEkppXwXAQAAALAv5s2bFzU1NeE/cwDAwWHq1KkRETF//vw8VwIAAFAQ5vsmLwAAAAAAAAAAgAIm5AUAAAAAAAAAAFDAhLwAAAAAAAAAAAAKmJAXAAAAAAAAAABAARPyAgAAAAAAAAAAKGBCXgAAAAAAAAAAAAVMyAsAAAAAAAAAAKCACXkBAAAAAAAAAAAUMCEvAAAAAAAAAACAAibkBQAAAAAAAAAAUMCEvAAAAAAAAAAAAAqYkBcAAAAAAAAAAEABE/ICAAAAAAAAAAAoYCX5LgAAAACgvcybNy/fJQAA7WDt2rUxZMiQfJcBAABQMIS8AAAAgINGTU1NvksAANpJdXV1vksAAAAoGJmUUsp3EQAAAAAArZHJZGLu3Llx7rnn5rsUAAAAgI4yvyjfFQAAAAAAAAAAANA8IS8AAAAAAAAAAIACJuQFAAAAAAAAAABQwIS8AAAAAAAAAAAACpiQFwAAAAAAAAAAQAET8gIAAAAAAAAAAChgQl4AAAAAAAAAAAAFTMgLAAAAAAAAAACggAl5AQAAAAAAAAAAFDAhLwAAAAAAAAAAgAIm5AUAAAAAAAAAAFDAhLwAAAAAAAAAAAAKmJAXAAAAAAAAAABAARPyAgAAAAAAAAAAKGBCXgAAAAAAAAAAAAVMyAsAAAAAAAAAAKCACXkBAAAAAAAAAAAUMCEvAAAAAAAAAACAAibkBQAAAAAAAAAAUMCEvAAAAAAAAAAAAAqYkBcAAAAAAAAAAEABE/ICAAAAAAAAAAAoYEJeAAAAAAAAAAAABUzICwAAAAAAAAAAoIAJeQEAAAAAAAAAABQwIS8AAAAAAAAAAIACJuQFAAAAAAAAAABQwIS8AAAAAAAAAAAACpiQFwAAAAAAAAAAQAET8gIAAAAAAAAAAChgQl4AAAAAAAAAAAAFTMgLAAAAAAAAAACggGVSSinfRQAAAAAAfNT06dNjxYoVWW2rV6+OgQMHRnl5eUNbp06d4tFHH41BgwZ1dIkAAAAAHWF+Sb4rAAAAAABoyjHHHBP33ntvo/Y1a9Zk/fvYY48V8AIAAAAOan6uEQAAAAAoSF/60pcik8nstU+nTp1ixowZHVMQAAAAQJ4IeQEAAAAABenwww+PE044Ya9Br/r6+jj33HM7sCoAAACAjifkBQAAAAAUrAsuuCCKi4ubfC2TycRJJ50Uw4YN69iiAAAAADqYkBcAAAAAULCmTZsWu3fvbvK14uLiuOCCCzq4IgAAAICOJ+QFAAAAABSsfv36xRe+8IUmv80rpRTnnHNOHqoCAAAA6FhCXgAAAABAQZs+fXqjtuLi4hgzZkz069cvDxUBAAAAdCwhLwAAAACgoFVXVzf6Jq+UUpx//vl5qggAAACgYwl5AQAAAAAFrUePHjF+/PgoKSlpaCspKYnJkyfnsSoAAACAjiPkBQAAAAAUvPPPPz927doVEX8PeJ111lnRo0ePPFcFAAAA0DGEvAAAAACAgjdp0qQoKyuLiIhdu3bFeeedl+eKAAAAADqOkBcAAAAAUPC6du0aVVVVERHRrVu3mDBhQp4rAgAAAOg4JfkuAAAAAA5Fa9eujaVLl+a7DIADypAhQyIi4sQTT4yHH344z9UAHFiGDh0aJ598cr7LAAAA2iiTUkr5LgIAAAAONfPmzYuampp8lwEAwCGiuro65s+fn+8yAACAtpnvm7wAAAAgj/x/rwByc91118VVV10VxcXF+S4F4IAxderUfJcAAADso6J8FwAAAAAA0FqzZs0S8AIAAAAOOUJeAAAAAMABo6TEjxMAAAAAhx4hLwAAAAAAAAAAgAIm5AUAAAAAAAAAAFDAhLwAAAAAAAAAAAAKmJAXAAAAAAAAAABAARPyAgAAAAAAAAAAKGBCXgAAAAAAAAAAAAVMyAsAAAAAAAAAAKCACXkBAAAAAAAAAAAUMCEvAAAAAAAAAACAAibkBQAAAAAAAAAAUMCEvAAAAAAAAAAAAAqYkBcAAACQF7Nnz45MJhOZTCaGDBmS73KgXaxZsybOOuus2Lp1a75LyfLggw82XG9du3Zt8zj5uG7dKzqeNT+0ON+Fb9asWTF37tx8lwEAAOSZkBcAAACQF1deeWWklKKysjLfpRSsbdu2xZFHHhkTJ07Mdym0wooVK+Izn/lMjB07Nnr06JHvcrJMmzYtUkoxZsyYfRonH9ete0XHs+YtO5juz8534Zs5c2ZcddVVcfXVV+e7FAAAII+EvAAAAOAg1L179zjllFPyXQatsLdzlVKK3bt3x+7duzu4KnK1devWmDRpUpxzzjnx1a9+Nd/lAO3gQLg/e94fGo444ohYsGBBXH/99TFv3rx8lwMAAORJSb4LAAAAAKBp5eXl8eqrr+a7DFrhpptuitra2rjmmmvyXQrQAdyf6WiVlZVRXV0dX/va16KqqipKSny8AwAAhxrf5AUAAAAA+yClFHfeeWecdNJJMWjQoHyXA8BB6uyzz461a9fG4sWL810KAACQB0JeAAAAcIDYuXNnXHPNNXHMMcdEWVlZ9O7dOyZNmhSPPPJI7Nq1KyIiZs+eHZlMJt59991YsmRJZDKZyGQyjb7tYf369XHJJZfEsGHDonPnztG3b9+oqqqKFStWNPTZM1Ymk4khQ4bE8uXLY8yYMVFeXh5lZWUxevToWLJkyX6bb2tqXLhwYUONmUwm1qxZEzU1NVFeXh59+vSJ6dOnx6ZNm+L111+PSZMmRXl5eQwcODBmzpwZdXV17T5ORER9fX3MnTs3zjzzzBgwYECUlpbGiBEj4rbbbsv6Wa+WztVHa9qxY0fDe3v27Jn12of/ioqKYu3atTmtYy42btwYV1xxRRxxxBHRpUuXGDJkSJxxxhlx1113xXvvvddkv//H3r3HR1Xd+/9/Ty7kfkUIIVABK6gUBhqCBQIBUS4PUTANl1O0ek5FT320FTj2VHuxfdTb8VZsT2nx8ni0x2ptwHOgBcRrkZoEJEFItDRBpXghiYRLboaEhKzfH35nfhlmJpk9mclMktfz8cgf7FnZ+7PW2nut2dkf9hoyZIjS0tK0ePFi7d6922u7V1VVacWKFRo6dKhz2913323pPLz//vud5bsuYfbyyy87t1900UUudfLl2upOeXm5PvvsM9ntdpftgTyvfG1Th8rKSi1btkwpKSlKSEjQ7NmzVVRU5FbOn/bqTqDPt574er1d2BfHjh3TypUrlZqaqqFDh2rJkiUe38rUtR3j4+M1ffp07dixQ1dffbVzX7feeqtf7ehr7FZjcQhmXzA+h3589nW+tzJuXOi5555zq0Ntba3f54Av111vx+Ou/B0fPM1FzzzzTI9lTp486dMx6+vr3dr1/vvvd8bcdXtBQYFLnaZMmSJJeuWVVyy1BQAAAIABwgAAAAAAgD5XWFhorN6W33rrrSYlJcW8+uqrpqWlxdTW1pq77rrLSDK7d+92KZuQkGBmzZrlcT/V1dXm4osvNhkZGWbnzp2mqanJvPfeeyYvL8/ExsaakpISl/J2u90kJCSYGTNmmJKSEtPc3GxKS0vN5MmTzZAhQ8ybb77pUn7evHkmPT3d7N2716d62e12k5WV1asYly5daiSZ/Px8U1ZWZpqbm82zzz5rJJnFixebpUuXmoMHD5qmpiazadMmI8msW7fOLZZA7Gf79u1GknnwwQfN6dOnTV1dnfnVr35lIiIizF133eV2zO76qmtMZ8+edW5LSUkxTU1NLuV+/vOfO4/rbzv2pKamxowdO9aMGDHCbN++3TQ2Npra2lpz3333GUlmw4YNLuUyMjLM9u3bTUNDg6mqqjL5+fnGZrOZp59+2mMd8/LyzO7du83nn39u9u3bZyIjI01dXZ0xxvp56K1ds7OzzdChQ122Wbm2PPnDH/7g1vae6teb88pKm77//vsmNTXVZGVlmVdffdU0NTWZiooKs2DBAjNmzBgTExPjFqOV9jImMNdtIMYKq9eboy+WLl3qPI9ee+01ExcXZ3JyclzKemrH9957z1x99dVm2LBhvW5HK7FbjSVQ1z7jc/iPz93FaHUsvrC/Ozo6zPr1680111xjTp8+7XfsVq673o7HXfk7PnQ3F/VUxsoxFy5caCIiIswHH3zgFsuMGTPM888/77a9oaHBSDKzZ8+21BbGGFNQUGAKCgos/x4AAACAsLGZJC8AAAAAAELAnySvsWPHmpkzZ7ptHz9+vKUkr5tvvtlIcnt4WFNTY2JiYkx2drbLdrvdbiSZgwcPumyvqKgwkozdbnfZnpeXZ9LS0nqVRGA1RsdD1507d7psnzhxopFk9uzZ47J97NixZsKECW6xBGI/27dvN3PnznXb94033miio6NNQ0ODy/ZAJBEUFhYam81mbrnlFpfftdqOPbnllluMJFNYWOj22aJFi5xJXo5yL7zwgkuZ1tZWM3LkSBMXF2dqa2vd6vjSSy95PbbV89BKso2Va8uTRx55xEgyGzdu9Ph5IM4rK226fPlyI8m8+OKLLmWPHz9uYmJigpbkZfV8C8RYYfV6c/TF9u3bXbYXFBQYSc5EDmO8t+OJEydMfHx8QJK8fI3daiyBuvYZn8N/fO4uRqtjcdf+PnPmjFm4cKG58847TUdHR69it3Ld9XY87srf8aG7uainMlaO+corrxhJ5o477nApW1RUZLKyssy5c+c8HsNms5kvf/nLXmP0hiQvAAAAoN/bzHKNAAAAAAD0E4sWLVJJSYluu+027du3z7lsUVVVlebOnevzfrZt26aIiAgtWbLEZfuIESM0ceJEHThwwGU5KUlKSEhwLhHkMGnSJI0cOVLl5eWqqalxbn/zzTd1+vRpzZgxw2INexejJE2bNs3l3yNHjvS4PSsrS9XV1V6P35v9LFmyxOMyWHa7Xe3t7fr73//u9bi+qq+vV2JioiTp7bff1s0336w5c+boySefdCnnbzt6s3XrVknS4sWL3T7btWuX1q5d61Lu2muvdSkTExOj+fPn6+zZsx6Xmpo+fXq3x7dyHlrR22vLsVRbdHR0t+V6c15ZadOXX35ZkrRw4UK3440fP77H+vjL6vkWiLHC3+stJyfH5d+jR4+WJJd299aOw4YN02WXXeZ3zA5WYrcaS6Cv/UDsm/E5uOOzJ/6OxVVVVbryyisVERGhJ554QpGRkQGJ3ZfrLlDfdST/+7unuai7MlaOuWDBAk2aNEm///3vderUKef2Rx99VN/97ne9zilRUVEuyyMDAAAAGDxI8gIAAAAAoJ/YuHGjnn32WR09elTz589XcnKyFi1a5HyI64u2tjY1NDSos7NTKSkpstlsLj/vvPOOJOn99993+b3U1FSP+xs+fLgk6cSJE37WKnAxSlJycrLLvyMiIhQZGan4+HiX7ZGRkers7PQaQ2/209DQoHvvvVeTJk1SWlqaM+7vf//7kqSWlpYeWsB3H3/8sZYuXarRo0fr//7v/zRkyBDnZ71pR08c+4uNjVVSUpLf5TIyMiRJtbW1bp8lJCR0G0OwzsPeXluxsbGSpPb29m7L+XteWWnTtrY2NTU1KTY21plo0pWjrQIt0Oebr/y93lJSUlz+7bh2HO3eUzumpaX1WexWYwlmXzA++64vx2dP/B2Lz5w5o2XLlmnUqFHatWuXnnvuOY/79Sf2nq47KTDfdRz87e+e5qLuylg95tq1a9XS0qLf/OY3kqQjR47or3/9q2677Tavx+7o6FBcXFyPMQIAAAAYeEjyAgAAAACgn7DZbLrpppv0+uuvq76+Xtu2bZMxRvn5+frFL37hVtaTmJgYpaamKioqSu3t7TLGePyZN2+ey++dOnVKxhi3/TmSagKZOOJvjOHiuuuu03333ac1a9boyJEj6uzslDFGGzZskCS3dvTWVz1pamrSkiVL1N7erh07dig9Pd3l80C3Y0xMjFJSUtTa2qqmpia/y3322WeSvnjji1VWzsOIiAidO3fOrWx9fb3bNivXlieZmZmSvni4HwxW2jQmJkZJSUlqbW1Vc3OzW9nTp097PIaV9vIWYyiuW6vXm696akdvCYVW2tHX2K3GEsy+YHz2TV+Oz93N9/6MxVFRUXr99df15z//WZMmTdKaNWtUWloalNi91ac343FXwRofAnnM1atXKyMjQ7/+9a/V1tamxx9/XDfffLPXRNLGxkYZY5zzDgAAAIDBhSQvAAAAAAD6idTUVFVWVkr6Ylm4a665Rtu2bZPNZtPOnTtdysbHx7skGkyYMEFPPfWUJCk/P18dHR0qLi52O8bDDz+sL33pS+ro6HDZ3tra6vKQV5LeffddVVdXy263B/xhoz8xhoPz58+ruLhYI0aM0Pe+9z0NGzbM+QDe29JK3fVVd8dZtWqVKisr9b//+78uS/AVFBRo27ZtkgLfjjfccIMk6aWXXnL7bOrUqVq3bp1LuQvPy7a2Nr3xxhuKi4tzW3bOF1bOw8zMTB0/ftylbG1trT7++GO3/Vq5tjz5yle+Ikm9XlqtO1ba1LGcpmOJP4eTJ0+qqqrK4/6ttJc3fX3d+nO9WeGtHWtra3XkyBGPv+NrO1qN3WoswewLxufwGp+7i9GfsTgpKUlZWVlKTEzUX/7yFyUmJmrZsmUuy+EG8xzo7XjsEOzxIVDHjImJ0R133KETJ07o8ccf1/PPP68777zT6zEc44tj3gEAAAAwuJDkBQAAAABAP/Lv//7vqqioUFtbm06cOKFHHnlExhhdddVVLuW++tWv6siRI/rkk0+0d+9eHT16VLNnz5YkPfTQQ7rkkkv0b//2b9q1a5caGhp0+vRpPfnkk/r5z3+uxx57TFFRUS77S0lJ0Q9/+EPt3btXn3/+ucrKynTjjTdqyJAh+uUvf+lS9qqrrtLQoUO1b98+v+vpT4zhIDIyUnPnzlVtba0effRRnTx5UmfPntXu3bu1adMmj7/TXV95s27dOr300kt66qmnNHfuXK/lAt2ODz30kMaOHat169Zp586dampq0qeffqo77rhDNTU1ziQvR7m1a9dqx44dampq0pEjR/SNb3xDNTU1+uUvf+lcKswKK+fhggULVF1drV//+tdqbm7Whx9+qDvvvNPrW+d8vbY8sdvtGj58uMrLyy3XyVdW2vTBBx9Uenq61q5dq9dee03Nzc06fPiwbrzxRo/L/UnW28tbjFbOt96OFf5cb1Z4asf33ntP//qv/+r1TXS+tqPV2K3GYqUvjh07psjISJel9rrD+Nz343N3fdTTfN+bsXjMmDF68cUXVVdXp/z8fLW1tVmO3R+9GY8dgj0+BPKYd9xxh+Li4vTjH/9YV199tb785S97LXvo0CFJX4w1AAAAAAYhAwAAAAAA+lxhYaGxelt+6NAhc/vtt5vLL7/cxMfHm/T0dPO1r33NPP3006azs9OlbGVlpZk9e7ZJSEgwo0ePNhs3bnT5/NSpU2b9+vVm3LhxJjo62gwbNswsWLDAvPbaa27HtdvtJisryxw+fNgsXLjQJCUlmbi4OJOXl2eKiorcys+ePdukpaWZkpKSbuvz6KOPGkkuPz/60Y8sxbh3716P+ygtLXXb/tBDD5m33nrLbftPf/rTgO3HGGPq6urM7bffbkaPHm2io6NNRkaGueWWW8zdd9/tLJudnd1jX23dutXtGKtXrzZlZWVu2y/82bp1q1997YuTJ0+atWvXmrFjx5ro6GiTmZlpVq1aZY4cOdJtuZSUFLNw4ULzxhtvdNt/3q4Lq+dhfX29ufXWW01mZqaJi4szubm5prS01GRnZzuP84Mf/MAYY+3a8uaHP/yhiYqKMsePH++2fv6eV762qUNVVZVZtmyZSU5ONnFxcSYnJ8fs2LHDzJ8/37nvb33rW5bbKxDXrUMgxgpfrzdvfWGMcdt+7bXXemzH+Ph4M3PmTLNnzx4zd+5cEx8f7xarlfPO6lhhNRZf++Kf//yniYiIMDabzVRUVPTY5r7um/E5cOOzpz7qKUYHX8aNF154wS3ODRs2eGz71atX9/ocMMb7dReI8dihN+PDhXORr/OV1XPMYc2aNUaS2bNnT7d1Wr58ucnKyjLnzp2z1BbGGFNQUGAKCgos/x4AAACAsLHZZkwQFp4HAAAAAADd2rx5s1auXKn+cFs+ZcoUnTx5MqhL0QE9CffzsKGhQRMnTtSSJUuC9pYYhI/LLrtMZ8+e1UcffRTqUMIqFgD++d3vfqeNGzeqrKzMa5ny8nJNnTpVf/zjH7Vq1SrLx1i+fLkkacuWLX7HCQAAACCktrBcIwAAAAAAANBLKSkp2r59u1588UVt3Lgx1OEgAGpra5Wenq729naX7ceOHdOHH35oadBy+xwAACAASURBVOm4gRQLgMDbtGmT1q9f7/Xzo0ePKj8/X/fcc49fCV4AAAAABgaSvAAAAAAAAIAAmDp1qsrKyrRr1y41NjaGOhwEwJkzZ3T77bfrk08+UUtLi/bv36+VK1cqOTlZP/nJTwZtLAB655lnntENN9yg5uZmbdq0SWfOnNGKFSu8ln/yySf1wAMP6IEHHujDKAEAAACEG5K8AAAAAACAR4899phsNpvKy8t1/Phx2Ww2/fjHPw51WAgCm83W48/PfvazkMTW387DMWPGaMeOHUpOTg51KOilESNG6PXXX1d9fb3mzJmjtLQ0XX/99br00ku1f/9+jRs3blDGAoRaOM9ZVmzbtk1paWn67W9/qz/96U+KioryWvbhhx/mDV4AAAAAZDPGmFAHAQAAAADAYLN582atXLlS3JYDAAAg2JYvXy5J2rJlS4gjAQAAAOCnLbzJCwAAAAAAAAAAAAAAAADCGEleAAAAAAAAAAAAAAAAABDGSPICAAAAAAAAAAAAAAAAgDBGkhcAAAAAAAAAAAAAAAAAhDGSvAAAAAAAAAAAAAAAAAAgjJHkBQAAAAAAAAAAAAAAAABhjCQvAAAAAAAAAAAAAAAAAAhjJHkBAAAAAAAAAAAAAAAAQBgjyQsAAAAAAAAAAAAAAAAAwhhJXgAAAAAAAAAAAAAAAAAQxkjyAgAAAAAAAAAAAAAAAIAwRpIXAAAAAAAAAAAAAAAAAIQxkrwAAAAAAAAAAAAAAAAAIIxFhToAAAAAAAAGs82bN4c6BAAAAAxwn376qUaNGhXqMAAAAAD0AkleAAAAAACE0MqVK0MdAgAAAAaBgoKCUIcAAAAAoBdsxhgT6iAAAAAAAAAAwBc2m02FhYVasWJFqEMBAAAAAADoK1siQh0BAAAAAAAAAAAAAAAAAMA7krwAAAAAAAAAAAAAAAAAIIyR5AUAAAAAAAAAAAAAAAAAYYwkLwAAAAAAAAAAAAAAAAAIYyR5AQAAAAAAAAAAAAAAAEAYI8kLAAAAAAAAAAAAAAAAAMIYSV4AAAAAAAAAAAAAAAAAEMZI8gIAAAAAAAAAAAAAAACAMEaSFwAAAAAAAAAAAAAAAACEMZK8AAAAAAAAAAAAAAAAACCMkeQFAAAAAAAAAAAAAAAAAGGMJC8AAAAAAAAAAAAAAAAACGMkeQEAAAAAAAAAAAAAAABAGCPJCwAAAAAAAAAAAAAAAADCGEleAAAAAAAAAAAAAAAAABDGSPICAAAAAAAAAAAAAAAAgDBGkhcAAAAAAAAAAAAAAAAAhDGSvAAAAAAAAAAAAAAAAAAgjJHkBQAAAAAAAAAAAAAAAABhjCQvAAAAAAAAAAAAAAAAAAhjJHkBAAAAAAAAAAAAAAAAQBgjyQsAAAAAAAAAAAAAAAAAwhhJXgAAAAAAAAAAAAAAAAAQxkjyAgAAAAAAAAAAAAAAAIAwRpIXAAAAAAAAAAAAAAAAAIQxkrwAAAAAAAAAAAAAAAAAIIyR5AUAAAAAAAAAAAAAAAAAYYwkLwAAAAAAAAAAAAAAAAAIYyR5AQAAAAAAAAAAAAAAAEAYI8kLAAAAAAAAAAAAAAAAAMIYSV4AAAAAAAAAAAAAAAAAEMZI8gIAAAAAAAAAAAAAAACAMGYzxphQBwEAAAAAAAAAF7rpppt06NAhl21HjhxRZmamkpKSnNuio6O1Y8cOjRw5sq9DBAAAAAAA6AtbokIdAQAAAAAAAAB4ctlll+m5555z2/7RRx+5/Pvyyy8nwQsAAAAAAAxoLNcIAAAAAAAAICz9y7/8i2w2W7dloqOjdcstt/RNQAAAAAAAACFCkhcAAAAAAACAsDRu3Dh99atf7TbRq6OjQytWrOjDqAAAAAAAAPoeSV4AAAAAAAAAwtY3v/lNRUZGevzMZrPpyiuv1JgxY/o2KAAAAAAAgD5GkhcAAAAAAACAsLVq1Sp1dnZ6/CwyMlLf/OY3+zgiAAAAAACAvkeSFwAAAAAAAICwNXz4cM2ZM8fj27yMMfr6178egqgAAAAAAAD6FkleAAAAAAAAAMLaTTfd5LYtMjJS8+fP1/Dhw0MQEQAAAAAAQN8iyQsAAAAAAABAWCsoKHB7k5cxRjfeeGOIIgIAAAAAAOhbJHkBAAAAAAAACGvJyclatGiRoqKinNuioqK0dOnSEEYFAAAAAADQd0jyAgAAAAAAABD2brzxRp0/f17SFwle119/vZKTk0McFQAAAAAAQN8gyQsAAAAAAABA2LvuuusUHx8vSTp//rxWr14d4ogAAAAAAAD6DkleAAAAAAAAAMJebGys8vPzJUkJCQlavHhxiCMCAAAAAADoO1GhDgAAAAAAACDcffrppyopKQl1GMCgN2rUKElSTk6O/vznP4c4GgCjR4/WjBkzgrb/zZs3B23fAIDAWbFiRVD2y30YAGAw8zS/2owxJgSxAAAAAAAA9BubN2/WypUrQx0GAABhpaCgQFu2bAna/m02W9D2DQAInGA9buY+DAAwmHmYX7fwJi8AAAAAAAAf8X/lgNC7//77dc899ygyMjLUoQCD2vLly/vkOIWFhUF7QwwAoHf6KgmL+zAAwGDS3fwa0cexAAAAAAAAAIDf7r77bhK8AAAAAADAoEOSFwAAAAAAAIB+IyqKxQkAAAAAAMDgQ5IXAAAAAAAAAAAAAAAAAIQxkrwAAAAAAAAAAAAAAAAAIIyR5AUAAAAAAAAAAAAAAAAAYYwkLwAAAAAAAAAAAAAAAAAIYyR5AQAAAAAAAAAAAAAAAEAYI8kLAAAAAAAAAAAAAAAAAMIYSV4AAAAAAAAAAAAAAAAAEMZI8gIAAAAAAAAAAAAAAACAMEaSFwAAAAAAAAAAAAAAAACEMZK8AAAAAAAAAAAAAAAAACCMkeQFAAAAAAAAAAAAAAAAAGGMJC8AAAAAAAAAIfHYY4/JZrPJZrNp1KhRPZb/05/+5CwfGxvbBxH6x2q9EJ4++ugjXX/99WpsbAx1KAF39913q7CwMNRhDDqMDUDfGsjjeKAwH/Q95gIgOLZt2+a8tmw2m1pbW0Md0oDQdS4Nl/ErXOLoTjDnV5K8AAAAAAAA4KK5uVmXXnqplixZEupQMMDdddddMsbIbrf7VH7VqlUyxmj+/PlBjqx3rNYL4efQoUOaNm2aFixYoOTk5FCHE3Br1qzRPffco5/85CehDiWk+nq+625sCKe5N5xiQf8TLuePp3E8XGILJ8wHzAXehFMsgC+WLVsmY4yWLl0a6lAGjAvn0nC5zw2XOLoTzPmVJC8AAAAAAIAQS0xMVG5ubqjDcDLGqLOzU52dnaEOpUfh1nYDxWBu18Fcd3yhsbFR1113nb7+9a/rO9/5TqjDCYpLLrlEW7du1QMPPKDNmzeHOpyQCaf5jlj8w5jtXajaJhzOH2/jeCBjGyjnHvNBeJyzxNI7A+V6DAe0JRwGwz1RMAVzfo0K6N4AAAAAAADQ7yUlJenDDz8MdRgAEBKPPPKIamtrde+994Y6lKCy2+0qKCjQf/zHfyg/P19RUYPvcUE4zXfEgoEiHM4fb+N4OMQWjgb7fBBO5wWxAAgXg+WeKJiCNb/yJi8AAAAAAAAAAPTFWyueeeYZXXnllRo5cmSowwm6G264QZ9++ql27twZ6lAAICAG2zgeKMwHAAAH5tLACcb8SpIXAAAAAABAELS1tenee+/VZZddpvj4eKWnp+u6667TX/7yF50/f16S9Nhjj8lms+nzzz9XcXGxbDabbDab2//uq6ur0/e+9z2NGTNGQ4YM0bBhw5Sfn69Dhw45yzj2ZbPZNGrUKJWWlmr+/PlKSkpSfHy85s2bp+Li4h7j3rZtm3M/NptNra2tHrcfO3ZMK1euVGpqqoYOHaolS5a4/E9vq/Hcf//9zvJdl4d4+eWXndsvuugit/331HZWVVZWatmyZUpJSVF8fLymT5+uHTt26Oqrr3Ye49Zbb3WW96VvrLZdb/ZdVVWlFStWaOjQoc5tJ0+eVEdHhwoLC3XNNddoxIgRiouL06RJk/TLX/7SZQmWQJ6TgdC1PxISEjR79mwVFRV5LOtrHb3xte6nTp3S+vXrdckll2jIkCFKS0vT4sWLtXv37h6P8dxzz7n0l81mU21traTgnUu+jEW+8rWNfTkvn3nmmYCdu/X19W7tev/99ztj7rq9oKCg2zqWl5frs88+k91uHxT1nzJliiTplVdesXQuhCOr8463+c7f+bQ342Kg5t5wiqW/fQ+wWj+r8V64/48++kgrV65UUlKShg4dqptuuklnzpzRsWPHdN111ykpKUmZmZlas2aNmpqaLNUlkPNZoK4rT8eMiYnRqFGjdPXVV+v3v/+9zp49K6n385a3cTzQ53Ygvyv1xfdPb/OMw0CZD5gLwiuW/jYXOPgyVl1Yzts4GqjxP1zaMtD3gYFs6wvV1tb2+X23v/vz9br2tb1620/d3RN1VVlZqWuvvdY5f3kbG630X2/utx18rb+/93e+9pcUpPnVAAAAAAAAoFuFhYXG6p9Rbr31VpOSkmJeffVV09LSYmpra81dd91lJJndu3e7lE1ISDCzZs3yuJ/q6mpz8cUXm4yMDLNz507T1NRk3nvvPZOXl2diY2NNSUmJS3m73W4SEhLMjBkzTElJiWlubjalpaVm8uTJZsiQIebNN9/0Kf6lS5caSebs2bMety9dutS5/9dee83ExcWZnJwct/1YjcdbW2RnZ5uhQ4e6be+u7YwxZt68eSY9Pd3s3bu3xzq///77JjU11WRlZZlXX33V2dZXX321GTZsmImJiXEpb7VvrLSdv/vOy8szu3fvNp9//rnZt2+fiYyMNHV1dWb79u1GknnwwQfN6dOnTV1dnfnVr35lIiIizF133WWpXa3G5gu73W6ysrJctnnqj4qKCrNgwQIzZswYt/6wWkdvuqt7TU2NGTt2rMnIyDDbt283DQ0NpqqqyuTn5xubzWaefvrpbuvV0dFh1q9fb6655hpz+vRp5/ZgnktWxqKeWG3jns5LX8pYOebChQtNRESE+eCDD9ximTFjhnn++ed7rOMf/vAH5/EGQ/0bGhqMJDN79uwe2+ZCBQUFpqCgwPLvWSHJFBYWWvodq/OOt/nOyn78masvHPO6iyWY84c3g/F7gD/1sxqvY//5+fmmrKzMNDc3m2effdZIMosXLzZLly41Bw8eNE1NTWbTpk1Gklm3bp1PsfsamzH+zWe9va4cxxwxYoTZvn27aWxsNLW1tea+++4zksyGDRuMMb2ft7obx73F1nV7b/veGGvXYV99/+xuLjLG//nAn/ukvtg/cwFzQVdW5gJfxyqr42igxv9QtmWg7wOD3dZdz8833njDJCcnB/2+O5j3db62VyD6qae51G63m5SUFDNv3jxTVFRkmpqavJ6HVvqvt/fbVuvv7/2dr2OfMUGZXzeT5AUAAAAAANADfx4ujB071sycOdNt+/jx4y0led18881GktvD+ZqaGhMTE2Oys7NdttvtdiPJHDx40GV7RUWFkWTsdrtP8ff0B/3t27e7bC8oKDCSXB4W+RNPoP+gn5eXZ9LS0nz6Q+by5cuNJPPiiy+6bD9x4oSJj493e8hmtW+stJ2/+37ppZc81m379u1m7ty5bttvvPFGEx0dbRoaGly2B/Kc9IWnP85664/jx4+bmJgYj0leVuroTXd1v+WWW4wk88ILL7hsb21tNSNHjjRxcXGmtrbWY73OnDljFi5caO68807T0dHh8vvBPJesjEU9sdrGPZ2XvpSxcsxXXnnFSDJ33HGHS9mioiKTlZVlzp071239jDHmkUceMZLMxo0bexWLL3XzpUxf1N9ms5kvf/nLXmP0JpyTvKzMO9092Pd1P/7M1f482A/G/OHNYPweYIz1+vmb5LVz506X7RMnTjSSzJ49e1y2jx071kyYMMGn2C8U6Pmst9eV45ierulFixY5H073dt7qbhz3FlvX7b3te2OsXYd99f2zu7nIwZ/5IJyTvJgLmAscrMwFvo5VVsfRQI3/oWzLQN8HBrutLzw/v/GNbwT9vjuY93W+tlcg+qmnudRxHl6YOOnpPLTSf72533awUn9/7+98HfscAjy/bma5RgAAAAAAgCBYtGiRSkpKdNttt2nfvn3O5WWqqqo0d+5cn/ezbds2RUREaMmSJS7bR4wYoYkTJ+rAgQP69NNPXT5LSEhwvhLeYdKkSRo5cqTKy8tVU1PjX6W6yMnJcfn36NGjJUnV1dVuZfsiHm/efPNNnT59WjNmzOix7MsvvyxJWrhwocv2YcOG6bLLLnMr70/fSL61nb/7nj59use6LVmyxOPyBna7Xe3t7fr73//u8fc88Tc2q7z1x8iRIzV+/Hi38oGsozdbt26VJF177bUu22NiYjR//nydPXvW4zIMVVVVuvLKKxUREaEnnnhCkZGRLp8H81wK1Fgk+d/G3s5LX8pYOeaCBQs0adIk/f73v9epU6ec2x999FF997vfVXR0dI9xOJYj8lR2oNY/KirKZXmXgSBQ846v++mrcTGY80cwYnHoL98DurJSP39MmzbN5d8jR470uD0rKytgx+zKn/mst/3oOObixYvdPtu1a5fWrl0rqffzVnfjuC8C0fdWrsO++v7py1w00OYD5oLwiMWhv8wFvo5V/t4XBGL8D1VbBvq8CnZbX3h+ZmVlSQrufXcw7+t8ba9A9JMvc2lsbKyuvPJKl22ezkMr/edvX3dlpf7+3t9Z/a4Q6PmVJC8AAAAAAIAg2Lhxo5599lkdPXpU8+fPV3JyshYtWuT8o5Uv2tra1NDQoM7OTqWkpMhms7n8vPPOO5Kk999/3+X3UlNTPe5v+PDhkqQTJ074Wav/X0pKisu/hwwZIknq7Ox0K9sX8fRWW1ubmpqaFBsbq8TERLfP09LS3Mr70zdSz23Xm30nJCR4rF9DQ4PuvfdeTZo0SWlpac59ff/735cktbS0dNs+gai3FT31h+Pc6SpQdewupoaGBsXGxiopKcnt84yMDElSbW2ty/YzZ85o2bJlGjVqlHbt2qXnnnvO436DcS5JgRmLHPxtY2/npS9lrB5z7dq1amlp0W9+8xtJ0pEjR/TXv/5Vt912m091jI2NlSS1t7f3Opae6uZLmb6of0dHh+Li4nqMsT8J1Lzjy376alyUgjt/BDqWrvrD94ALWamfP5KTk13+HRERocjISMXHx7tsj4yMDNgxHfydz3rTjz0ds6vezlvdjeO+6G3fW7kO+/L7py9z0UCbD5gLQh9LV/1hLvB1rPJ3HJUCM/6Hoi0DfV71RVtfeH5GRHyRGhOs++6++BuBr+3V237yZS4dOnSobDab23ZPY6Mv/debvnawWn9/7++sflcI9PxKkhcAAAAAAEAQ2Gw23XTTTXr99ddVX1+vbdu2yRij/Px8/eIXv3Ar60lMTIxSU1MVFRWl9vZ2GWM8/sybN8/l906dOiVjjNv+HH/s9ZQgE0xW4omIiNC5c+fcytbX13vct7e2syomJkZJSUlqbW1Vc3Oz11i7lvenb3yNJdD7vu6663TfffdpzZo1OnLkiDo7O2WM0YYNGyTJrX8CfU5a1VN/nD59utd19Ka7uqekpKi1tVVNTU1un3/22WeSvvgfwl1FRUXp9ddf15///GdNmjRJa9asUWlpqct+g9mmVsaingSqjYN5zNWrVysjI0O//vWv1dbWpscff1w333yz24NybzIzMyV98Qf/3sYSCMGuf2Njo4wxznoPFIGaB33ZT1+Ni74Ip1i66g/fA/xlNd6+FOj5rDfXVU/HvDDu3sxb3Y3jgRSI70rh9P1zIM4HzAWhj6Wr/jAX+DpW+TuOBkoo2jLQ51U4tHUw6hTMvxH42l6BiMGXudTbZxeOjb72XyD62mr9++L+LhjzK0leAAAAAAAAQZCamqrKykpJX7zi/pprrtG2bdtks9m0c+dOl7Lx8fEuf3idMGGCnnrqKUlSfn6+Ojo6VFxc7HaMhx9+WF/60pfU0dHhsr21tdUliUSS3n33XVVXV8tut/f5wxsr8WRmZur48eMuZWtra/Xxxx973Hd3bWeVY9kDx7I5XY9/5MgRt/L+9I2vArnv8+fPq7i4WCNGjND3vvc9DRs2zPnHe29LBgT6nPSHt/44efKkqqqqXLb5U0dvuqv7DTfcIElu13BbW5veeOMNxcXFuS23lJSUpKysLCUmJuovf/mLEhMTtWzZMpdlVILZplbGou4Eso2DecyYmBjdcccdOnHihB5//HE9//zzuvPOO30+5le+8hVJclvCZKDW3zHeOuo9UARqHvR1P301LvoinGJx6C/fA/xhNd6+FOj5rLfXleOYL730kttnU6dO1bp16yT1ft7yNo4HWqC+K4XL98+BOB8wF4RHLA79ZS7wdazyZxwNlFC1ZaDPq3Bo60DXKZjXnq/tFYgYfJlLm5ubVV5e7rLN03lopf8C0de+1r+v7u+CMr8aAAAAAAAAdKuwsNBY/TNKSkqKycvLM+Xl5aa1tdV89tln5mc/+5mRZO6//36XsosWLTIpKSnm448/NiUlJSYqKsocPnzYGGPMZ599Zi655BIzbtw489JLL5n6+npz6tQps2nTJhMfH28KCwtd9mW3201KSoqZP3++KSkpMc3Nzaa0tNRMnjzZDBkyxLz55ps+xb906VIjyZw9e9an7T/4wQ+MJHPw4MFexfOd73zHSDL//d//bZqamswHH3xgVqxYYbKysszQoUPd4uyu7YwxZt68eSY9Pd3s3bu3xzp/8MEHJj093WRlZZlXX33VNDU1mXfffdcsWrTIXHzxxSYmJsalvNW+sdJ2gdq3w1VXXWUkmUceecTU1dWZlpYW89e//tV86UtfMpLMa6+95nO7Wo3NF3a73WRlZbls89Qff//7383ChQvN8OHD3frDSh3/+c9/moiICCPJHDhwwOe619TUmLFjx5qMjAyzfft209jYaKqqqkx+fr6x2Wzmqaee6rFeb775pomOjjZf+9rXTGtrq19tauVcsjIW9cTqedTTeelLGavHNMaYuro6ExcXZ2w2m1m6dKmlOnZ2dprhw4ebWbNmDYr6//GPfzSSzNatW7st50lBQYEpKCiw/HtWSLI8plidd7z1gZX9+DNXXzg2dBdLMOcPbwbj9wB/6mc1Xm/7X7hwoYmMjHQrn5eXZxISEnyK/UKBns96e105jpmZmWl27NhhGhsbzSeffGK+/e1vm4yMDPPRRx8ZY3o/b3U3jnuLrbvt3vo+UN+VQvX980L+zgf+3Cf1xf6ZC5gL/J0LfB2rrI6jgRr/Q9mWgb4P7Ou27ov77mDe1/naXoHop57mUrvdbhISEkxubq7Zt29ft+ehlf4LxP22lfoH6v7O29hnTFDm180keQEAAAAAAPTAn4cLhw4dMrfffru5/PLLTXx8vElPTzdf+9rXzNNPP206OztdylZWVprZs2ebhIQEM3r0aLNx40aXz0+dOmXWr19vxo0bZ6Kjo82wYcPMggULPD7cd/yR6/Dhw2bhwoUmKSnJxMXFmby8PFNUVNRj3Fu3bjWSXH5Wr15t9u7d67b9Rz/6kTHGuG2/9tpr/Y6nvr7e3HrrrSYzM9PExcWZ3NxcU1paarKzs537/8EPfuBz282ePdukpaWZkpKSHutujDFVVVVm2bJlJjk52cTHx5uZM2eaPXv2mLlz55r4+Hi38r70jb9t5+++PZ2rdXV15vbbbzejR4820dHRJiMjw9xyyy3m7rvvdv5Odna2z+1q5ZzszqOPPuq1bS7sj7i4OJOTk2N27Nhh5s+f7yz/rW99y3IdHUleNpvNVFRUuMTUU91Pnjxp1q5da8aOHWuio6NNSkqKWbhwoXnjjTecZV544QW3em3YsMFjf61evbpX/d3TuWRlLOqJr23sy3kZrHPXYc2aNUaS2bNnj6U6GmPMD3/4QxMVFWWOHz8+4Ou/fPlyk5WVZc6dO2e5ncI5ycuXecfbfGd1Pw6+XMPexrxAz729GaMH6/cAf+vna7ze9l9aWuq2/aGHHjJvvfWW2/af/vSnPfZfV4GYzxwCdV1deMzMzEyzatUqc+TIEWeZQMxbnsbxQJ/bgfyu1FffPz3NMw7+zgfhnOTFXMBc4GD1ntCXscpTOU/jaKDH/1C3ZaDuA/uyrY3pu/vu3uzPl1h9ba9A9JOnubTr+JWVlWX2799v5s2bZxITE7s9D6185/ClbE9/R/C1/r25v/Olv4wJyvy62fb/DgwAAAAAAAAvNm/erJUrV6o//BllypQpOnnyZNCXqPFVuMXjr8suu0xnz57VRx99FOpQAPjgd7/7nTZu3KiysjLLv9vQ0KCJEydqyZIl2rRpUxCiCz5f6l9eXq6pU6fqj3/8o1atWmX5GMuXL5ckbdmyxe84e2Kz2VRYWKgVK1b4/DuBmncGyvwVarTjwNDf+nEgjONS333/7M18EOz7JH/3z1wQXmjHwKEt0VcGylwaSkGaX7dEBCxCAAAAAAAAoB+rra1Venq62tvbXbYfO3ZMH374oa666qoQRQbAqk2bNmn9+vV+/W5KSoq2b9+uF198URs3bgxwZH2jp/ofPXpU+fn5uueee/xK8AKAcNafxvFQf/9kPgAAeNKf5tJwFMz5lSQvAAAAAAAA4P85c+aMbr/9dn3yySdqaWnR/v37tXLlSiUnJ+snP/lJqMMD4MUzzzyjG264Qc3Nzdq0aZPOnDlj6e1PF5o6darKysq0a9cuNTY2BjDS4LBa/yeffFIPPPCAHnjggT6MEgD6Tn8ax0P5/ZP5AADgTX+aS8NNMOdXkrwAAAAAAAAGgMcee0w2m03l5eU6fvy4bDabfvzjHxOPBSNGjNDrr7+u+vp6zZkzR2lpabr++ut16aWXav/+/Ro3blyoQ+xXbDZbjz8/+9nPQh0mNHD6atu2bUpLS9Nvf/tb/elPf1JU8df20QAAIABJREFUVFSv9jdmzBjt2LFDycnJAYowuKzU/+GHHx5wb2wJ1LzTH+evcEQ7Bkdfj9f9vR/7wzge6u+fA20+YC4IL7Rj4PSnthwo9xb4Qn+YS8NRMOdXmwnWIskAAAAAAAADxObNm7Vy5UrxZxQAAL6wfPlySdKWLVuCdgybzabCwsJevZUNABA8wb5P4j4MADAYdTP/beFNXgAAAAAAAAAAAAAAAAAQxkjyAgAAAAAAAAAAAAAAAIAwRpIXAAAAAAAAAAAAAAAAAIQxkrwAAAAAAAAAAAAAAAAAIIyR5AUAAAAAAAAAAAAAAAAAYYwkLwAAAAAAAAAAAAAAAAAIYyR5AQAAAAAAAAAAAAAAAEAYI8kLAAAAAAAAAAAAAAAAAMIYSV4AAAAAAAAAAAAAAAAAEMZI8gIAAAAAAAAAAAAAAACAMEaSFwAAAAAAAAAAAAAAAACEMZK8AAAAAAAAAAAAAAAAACCMkeQFAAAAAAAAAAAAAAAAAGEsKtQBAAAAAAAA9BebN28OdQgA0C9UV1froosu0pAhQ0IdCoLk008/1ahRo4J+nL179wb9GAAA//TVGM192MDT1tam06dPKzMzM9ShAEDY6W5+JckLAAAAAADARytXrgx1CAAAhI2CgoKgH+OJJ57QE088EfTjAADCF/dhAAB8wWaMMaEOAgAAAAAAAAAwcFRXV+vAgQMqLi5WUVGR3nnnHZ09e1bJycmaNGmScnNzNWvWLF155ZUaPnx4qMMFgD6xYsUKSbyVCMDA1tjYqIqKCuf3wH379unkyZOKjo7WpZde6vwemJ2drYkTJ4Y6XADoT7aQ5AUAAAAAAAAACKqOjg5VVVU5H/YdOHBA//jHP2SMUWZmprKzs50P/KZNm6bY2NhQhwwAAUeSF4CBxvEdr2tyf2VlpTo7O/mOBwCBR5IXAAAAAAAAAKDveXvLQ1RUlMaPH+/ylocrrrhCNpst1CEDQK+Q5AWgv3O8rdWR1FVSUqKWlhYlJibKbrc7k7ry8vJ4WysABB5JXgAAAAAAAACA8FBdXe3ytq+ysjK1tbUpJSVFOTk5zqSvGTNm6KKLLgp1uABgCUleAPqT9vZ2VVRUOL+XFRcX6+jRo4qMjNSECROUnZ3tTOqaOnWqIiIiQh0yAAx0JHkBAAAAAAAAAMLThQ8XL1zmsevbvnJychQTExPqkAHAK5K8AIQzb8n2I0aM0LRp01ySutLS0kIdLgAMRiR5AQAAAAAAAAD6j/r6epWVlTkfQO7du1enTp1SdHS0Jk+e7Ez6YplHAOGGJC8A4YJlswGgXyLJCwAAAAAAAADQvx09etTlbV+lpaU6d+6c25snZs2apfT09FCHC2CQIskLQCicP39elZWVziUXi4qKVFlZqc7OTmVmZjrfzjVr1ixNmzZNsbGxoQ4ZAOAZSV4AAAAAAAAAgIHl888/18GDB51JXwcOHNDhw4clSePGjXN529f06dM1ZMiQEEcMYDAgyQtAX6iurnZ+/ykuLlZJSYlaWlqUmJgou93uTOrKy8vT8OHDQx0uAMB3JHkBAAAAAAAAAAa+mpoalZWVuTz0PHPmjBISEjRlyhRn0ldubq7GjRsX6nABDEAkeQEItPb2dlVUVDjfaFpcXKyjR48qMjJSEyZMcPl+M3XqVEVERIQ6ZACA/0jyAgAAAAAAAAAMPl2XLnI8FD106JDOnz/vXLrI8TN79mylpqaGOmQA/RxJXgB6q7q62rnk4oEDB1RWVqa2tja3Japzc3OVlpYW6nABAIFFkhcAAAAAAAAAAJLU3NysQ4cOORO/3nrrLR07doy3YQAICJK8AFjR2NioiooKZ1LXvn37dPLkSUVFRWn8+PHKzc11LkF9xRVXyGazhTpkAEBwkeQFAAAAAAAAAIA31dXVLm/7KikpUUtLixITE2W3252JX3l5ebr44otDHS6AMEaSFwBvur5h1JHUVVlZqc7OTucbRh1JXdOmTVNsbGyoQwYA9D2SvAAAAAAAAAAA8FVHR4eqqqq6fQjreBA7c+ZMxcfHhzpkAGGCJC8ADr4kkefm5iovL0/Dhw8PdbgAgPBAkhcAAAAAAAAAAL3R1NSk8vJy54PaPXv26MSJE87llLq+fePyyy9nmUdgkCLJCxic2tvbVVFRoaKiIud3haNHj7IcNADAKpK8AAAAAAAAAAAINMcbOhxv+3rnnXd09uxZJSUlafLkybyhAxiESPICBofq6mrn/H/gwAGVlZWpra1NqampmjZtmmbNmuX8HpCWlhbqcAEA/QdJXgAAAAAAAAAABJtjmceuD33/8Y9/yBjjXObR8bav7OxsxcXFhTpkAAFGkhcw8DQ2NqqiosI5v+/bt08nT550vs2z69x+xRVXyGazhTpkAED/RZIXAAAAAAAAAAChcOGD4bffflt1dXU8GAYGKJK8gP7t/PnzqqysdHlTZ2VlpTo7O90StqdNm6bY2NhQhwwAGFhI8gIAAAAAAAAAIFxcuMTTgQMH1NraqpSUFH3lK19xPjyeMWOGLrroolCHC8ACkryA/sWx9LIjqaukpEQtLS1KTEyU3W5n6WUAQF8jyQsAAAAAAAAAgHDV3t6uiooKl6Svrss8dn3bV05OjmJiYkIdMgAvSPICwpen+fbw4cOKjIzUhAkTlJ2d7Uzqmjp1qiIiIkIdMgBg8NkSFeoIAAAAAAAAAACAZ9HR0c4Hyw4NDQ0qLS11Poi+7777dOrUKUVHR2vy5MnOpC+WeQQAwLML35xZVlamtrY2paamatq0aVq+fLkzqSstLS3U4QIAIEniTV4AAAAAAAAAAPRzR48edXn7SGlpqc6dO+d8WO1I/Jo1a5bS09NDHS4wKPEmLyA0GhsbVVFR4Uzq2rdvn06ePKmoqCiNHz/e5a2YJEcDAMIYyzUCAAAAAAAAADDQfP755zp48KAz6cux7JQkjRs3zuVtX9OnT9eQIUNCHDEw8JHkBQTf+fPnVVlZqQMHDjiTuiorK9XZ2anMzEzn27lmzZqladOmKTY2NtQhAwDgK5K8AAAAAAAAAAAYDGpqalRWVuZM+iouLtaZM2eUkJCgKVOmOJO+srOzNXHixFCHCww4JHkBgdd1bisuLlZJSYlaWlqUmJgou93uTOqaM2eOMjIyQh0uAAC9QZIXAAAAAAAAAACDUde3nTh+9u/fr/b2dufbThw/ubm5SktLC3XIQL9GkhfQO+3t7aqoqHBZnvjw4cOKjIzUhAkTXOasqVOnKiIiItQhAwAQSCR5AQAAAAAAAACALzQ3N+vQoUPOh+dvvfWWjh07xgN0IABI8gKsqa6udi65eODAAZWVlamtrU0pKSnKyclxLj08a9YspaenhzpcAACCjSQvAAAAAAAAAADgXXV1tcsSj56WwsrOztacOXM0ZsyYUIcLhC2SvADvmpqaVF5e7kzqevvtt1VXV6eoqCiNHz9eubm5zqSuK664QjabLdQhAwDQ10jyAgAAAAAAAAAAvrtwmcfi4mIdPHhQnZ2dLss85ubmaubMmYqPjw91yEBYIMkL+ELXecSR1FVZWekyjziSuqZNm6bY2NhQhwwAQDggyQsAAAAAAAAAAPSO4w0sjgf2f/vb3/TZZ58538DS9YH95ZdfzjKPGJRI8sJgVVNTo7Kysm7fCJmbm6s5c+YoIyMj1OECABCuSPICAAAAAAAAAACB51jm0fGWlnfeeUdnz55VUlKSJk+e7Hyon5eXp+HDh4c6XCDoSPLCYNDe3q6KigoVFRU53/h4+PBhSdK4ceOcSy7m5uZq6tSpJP0CAOA7krwAAAAAAAAAAEDwdXR0qKqqyiXx6x//+IeMMW7Lc2VnZysuLi7UIQMBRZIXBqLq6mrnmH7gwAGVlZWpra1NKSkpysnJcY7ps2bNUnp6eqjDBQCgPyPJCwAAAAAAAAAAhEZjY6MqKiqcCQJvv/226urqnMs8dk36uuKKK2Sz2UIdMuA3krzQ3zmW5mXMBgAgJEjyAgAAAAAAAAAA4ePCt8IcOHBAra2tSk5O1qRJk5xJBDNmzNBFF10U6nABn5Hkhf7k/PnzqqysdHn7YmVlpTo7O93evjht2jTFxsaGOmQAAAY6krwAAAAAAAAAAED4am9v15EjR1wSv7ou89j1zTEkGiCckeSFcFZTU6OysjJncm1RUZHq6+uVmJgou93uTOqaM2eOMjIyQh0uAACDEUleAAAAAAAAAACgf2loaFBpaakz6Wvv3r06deqUoqOjNXnyZGfSF0uGIVT+53/+Rxs2bND58+ed22pqaiRJmZmZzm2RkZFat26dbr755j6PEYNXe3u7KioqXN6YePjwYUnSuHHjnGNobm6upkyZosjIyBBHDAAARJIXAAAAAAAAAAAYCI4ePeqSsFBWVqa2tjalpqZq2rRpzqSFmTNnaujQoaEOFwPckSNHNGHCBJ/KVlVVafz48UGOCIPZhcvgOsbHlJQU5eTkOMfHWbNmKT09PdThAgAAz0jyAgAAAAAAAAAAA4+vb6rJzs7W9OnTNWTIkBBHjIHGbrfr3XfflbdHcTabTZMmTVJ5eXkfR4aBrKmpSeXl5c6krrffflt1dXWKiorS+PHjXZa45U2HAAD0KyR5AQAAAAAAAACAwaGmpkZlZWXOpK/i4mKdOXNGCQkJmjJlijPpKzs7WxMnTgx1uOjnHn/8cd19993q6Ojw+Hl0dLT+67/+S+vXr+/jyDBQnD9/XpWVlc7xrKioSJWVlers7FRmZqZzyUVHUldcXFyoQwYAAP4jyQsAAAAAAAAAAAxOXRMkHD/79+9Xe3u7M0HC8ZObm6u0tLRQh4x+pLq6WqNHj1ZnZ6fHz202mz755BNlZWX1cWTory5MVC0qKlJ9fb0SExNlt9udY9WcOXOUkZER6nABAEBgkeQFAAAAAAAAAADg0NzcrEOHDrkkUfzzn/9UZGSkJkyY4JL0NWXKFEVGRgY8hvb2dkVERARl3+hbs2fPVklJiVuiV0REhGbOnKm33norRJEhEM6dO6eoqChFREQEfN++LjkbzLEIAACEFZK8AAAAAAAAAAAAulNdXe2yxGNJSYlaWlpc3p6TnZ2tOXPmaMyYMb0+3t/+9jfdeeedevLJJzV9+vTeVwAh89RTT+nb3/62W5JXZGSkfvvb32rNmjUhigy9tWfPHn37299WYWGhJk2a1Ov9VVdXO5dcPHDggMrKytTW1qaUlBTl5OQ4k7pmzZql9PT0ANQAAAD0MyR5AQAAAAAAAAAAWHHhMo/FxcU6ePCgOjs7XZZ5zM3N1cyZMxUfH29p/48++qj+8z//UzabTbfddpseeughlorsp86cOaPhw4er4/9r7+6jrKzqxYF/z7wwDG/DS7xDghqWb6OhKSohUShLCEEQr2GaSd5bLUPj3tTKWpl6VW4tK+7VbFVXrxnoShPIt7xqCaj4AlRewKVBvL+IDoOAgrN/f7hmfh5nBuYMM5wDfD5rneU6+9nP3t+999lnWOt8ffbu3VnlxcXFsWHDhujWrVueIqO5Nm7cGNOmTYv/+Z//iZRS3HnnnXHZZZfl1EZ1dXUsXry4Lqnrueeei02bNkVJSUkMGjQozjjjjLqkrqOPPjoymUwrjQYAOIBI8gIAAAAAANhXtUkbtUlff/rTn2LDhg1ZxzzWJm584hOf2OPxbuPGjYuHHnooampqorS0NMrLy+PWW2+NKVOmSPY4AJ1zzjnx6KOPxnvvvRcR7yd4nX322TFnzpw8R0YuUkpx9913xxVXXBFvv/127N69O0pKSuKSSy6JO++8s9H7PpgUWpvUtXTp0qyk0A8mdZWXl+/HUQEABxBJXgAAAAAAAK2h9pjH2sSOl156KXbs2BEdO3aM448/vi65Y9iwYdGjR4+6+3r06BGbNm2qe1+b2HXqqafGnXfeGcccc8x+HwvNd++998YXvvCFqP1JrqioKO6555644IIL8hwZTbV48eKYMmVKvPjii5FSig/+vDpo0KBYtmxZ3ft169bFCy+8UPekv2eeeSbeeuutrONdzzjjjPj0pz8dPXv2zMdwAIADkyQvAAAAAACA/WHXrl2xaNGieO655+K5556L559/PpYvXx4REYcffniceuqpMWjQoPj+97/f4P2lpaVRU1MTX/va1+KGG26IDh067Mfoaa7t27dHt27dYufOnRER0bZt29i0aZP1OwC8/fbbcf3118f06dOjqKgodu3aVa9OJpOJ66+/vm5vr1q1KoqKiuLoo4+OU045JU499dQ45ZRT4uijj47i4uI8jAIAOEhI8gIAAAAAAMiXrVu3xpIlS+qe9vWnP/0pqqurY08/35SWlkbXrl1jxowZcd555+3HaGmuCy64IH73u99FSikmTJgQ9957b75DYi9mz54dX/nKV2Lz5s2xe/fuPdZt3759DBkypO7IxdNPPz26du26nyIFAA4RkrwAAAAAAAAKxbRp0+KnP/1pvPvuu3usV1RUFDU1NTFq1Kj4r//6rzjssMP2U4Q0x+zZs2Ps2LEREfH73/8+xowZk+eIaMxrr70WX/3qV+Oxxx6r22d70qZNm/je974X11577X6KEAA4RN1Xku8IAAAAAACAfbNgwYJYtWpVvsOgBTz00EN7TfCKiLrEk0cffTQGDRoUkyZNilGjRjkOrkC99957UV5eHimlqK6ujlmzZuU7JD5k165d8fvf/z4eeOCBuv21twSv2vvuv//+OPLII1s7RPaT/v37x5AhQ/IdBgDU40leAAAAAABwgJs4cWLcf//9+Q4DAA54EyZMiPvuuy/fYQDAh3mSFwAAAAAAHAz8KH3ge+mll2Lw4MFRWloaKaXYvXt33bWuXbvGYYcdFkceeWQMHDgwDjvssDjssMNiwIABMWDAgGjfvn0eI6cpnnrqqchkMjFs2LB8h8IeVFdXx8qVK+Pvf/97rFy5MlasWBErVqyIV199NVatWhVvvvlmXd0P7tXXX389Bg4cmMfIaQkTJ07MdwgA0ChJXgAAAAAAAAVg48aNceGFF2YlcNX+t23btvkOj3306U9/Ot8h0AQdO3aMY489No499tgGr2/fvr0u8WvlypV1rzVr1kjyAgBalSQvAAAAAACAAnD22WfH2Wefne8waCVFRUX5DoEW0K5duzj66KPj6KOPzncoAMAhxr8mAQAAAAAAAAAACpgkLwAAAAAAAAAAgAImyQsAAAAAAAAAAKCASfICAAAAAAAAAAAoYJK8AAAAAAAAAAAACpgkLwAAAAAAAAAAgAImyQsAAAAAAAAAAKCASfICAAAAAAAAAAAoYJK8AAAAAAAAAAAACpgkLwAAAAAAAAAAgAImyQsAAAAAAAAAAKCASfICAAAAAACgWaZPnx6ZTCYymUz069dvr/V/+9vf1tVv27Ztq8a2cuXK+PznPx9bt25t1X5y1VJzkOvct4R89HmoK7Q91qFDh7r2a1/Tp0/PqX5RUVF06dIlKisr46tf/Wq8+OKLTer71VdfjUwmE6eeemqjda6++uqYOXNmzuMCgAOBJC8AAAAAAACaZdq0aZFSisrKyibVv+CCCyKlFCNGjGjVuBYtWhQnnXRSjBw5Mjp16tSqfeWqpeYg17lvCfno81BXaHts27Zt8fLLL0dExNixYyOlFNOmTcup/q5du2Lp0qXxgx/8IJYuXRonnXRSfOlLX4rt27fvse9f/epXERHx3HPPxSuvvNJgnSlTpsQ111wT3/3ud5szPAAoaJK8AAAAAACAPerQoUOcccYZ+Q6DHBzKa7Z169YYM2ZMnHfeefH1r3893+EAH1JcXBw9e/aMsWPHxv/+7//Gv/3bv8Wvf/3r+Kd/+qdIKTV4T01NTdx1111x4oknRsT/T/j6sCOOOCIeeOCBuOGGG2LWrFmtNgYAyAdJXgAAAAAAABw0brnllli/fn1cd911+Q4FaIJ///d/j1NOOSUeeuih+O1vf9tgncceeyxKSkri5z//eURE3H333bF79+4G61ZWVsaECRPim9/8ZqN1AOBAJMkLAAAAAACAg0JKKX7xi1/EKaecEn369Ml3OEATZDKZuqfu/ed//meDdX75y1/GJZdcEieddFIcf/zxsWHDhvjDH/7QaJvjxo2L1atXx9y5c1slZgDIB0leAAAAAABwCHrnnXfiuuuui49//OPRrl276Nq1a4wZMyYeeuiheO+99yIiYvr06ZHJZOLtt9+OefPmRSaTiUwmEyUlJVltbdq0Ka644ooYMGBAtGnTJrp37x7jx4+PRYsW1dWpbSuTyUS/fv1i4cKFMWLEiOjYsWO0a9cuhg8fHvPmzdvncS1dujTOPffcqKioiHbt2sWnPvWpmDNnTnz2s5+t6/+yyy7LKfYHH3yw7t5MJhMrVqyISZMmRefOnaNbt24xevToeO211+rF0py2ly1bFueff35069atrmzz5s2xe/fumDlzZnzuc5+LXr16RXl5eRx33HFx2223RU1NTb15bok1awkfXI/27dvH0KFD45lnnmmwblPHuCeLFy+ODRs2RGVlZVb5h+d55cqVMWnSpOjYsWN069YtLrroonjzzTdjxYoVMWbMmOjYsWP07t07pkyZEtXV1fX6eeONN+Kqq66KI444Itq0aRNdunSJUaNGxZNPPtnsOfjhD39YF98Hj9p85JFH6so/8pGPNGkeIvbfGtdq6vo1dz81dW83Zx5z/ey1xvdMc+3vPdZaatfq2WefjV27dmVd27JlS8yePTsuvvjiiIj40pe+FBHvJ3415oQTToiIiEcffbQ1wgWA/EgAAAAAAMABbcKECWnChAk53XPZZZelioqK9Nhjj6Xt27en9evXp2nTpqWISE8++WRW3fbt26fTTz+9wXbWrl2bDjvssNSzZ880d+7cVF1dnf7617+mYcOGpbZt26b58+dn1a+srEzt27dPQ4YMSfPnz0/btm1LCxcuTMcff3xq06ZNeuqpp7LqDx8+PHXt2jUtWLBgr2N69dVXU+fOnVPfvn3TY489VhfLZz/72dS9e/dUVla2T7GPHTs2RUQaO3ZsXeyPP/54Ki8vTyeffHKLtD1s2LD05JNPprfffjs9++yzqbi4OG3atCnNnj07RUS68cYb05YtW9KmTZvST37yk1RUVJSmTZtWby5acs2aorKyMvXt2zerrKH1WLJkSRo5cmQaMGBAvfXIdYwNufvuu+vaaEjtPI8fPz698MILadu2bemuu+5KEZFGjRqVxo4dm15++eVUXV2dbr/99hQR6corr8xqY926dWngwIGpZ8+eafbs2amqqiotW7YsjR8/PmUymXTnnXc2ew5SanztBg8enLp161avvKG5z3WNc9lnjfWZ6/rlsp9y3dsp5TaPucTe2t8zjSmUPZZSSi+//HLd2rVU/R07dqSISBGR1q5dm3Xtpz/9aRo+fHjd+02bNqXS0tJUUlKSNmzY0GB7VVVVKSLS0KFDmxRjreb8PQWA/WSWJC8AAAAAADjANedH6YEDB6bTTjutXvmgQYNySvK6+OKLU0Ske+65J6t83bp1qaysLA0ePDirvLKyMkVEevnll7PKlyxZkiIiVVZWZpUPGzYsdenSpUmJEBMnTkwRke6///6s8o0bN6Z27drVS3jINfbapJTZs2dnlU+YMCFFRNq0adM+t/2HP/yhwbHNnj07nXnmmfXKJ0+enEpLS1NVVVVWeUuuWVM0lIDS2HqsWbMmlZWVNZiAkssYG3LLLbekiEgzZsxo8HrtPM+dOzer/JhjjkkRkZ5++ums8oEDB6ajjjoqq+ySSy5JEZHuvfferPKdO3emPn36pPLy8rR+/fqUUu5zkFLLJHnlusa57LPG+sx1/XLZT7nu7ZRyT/Jqauyt/T3TmELZYym1TpLX9u3bG03y+uQnP5nuuuuurLJx48aliEjTp09vtM1MJpOOPPLIJsVYS5IXAAVsluMaAQAAAADgEHT22WfH/Pnz4ytf+Uo8++yzdUc0Llu2LM4888wmt/Pggw9GUVFRjB49Oqu8V69eccwxx8SLL74Yq1evzrrWvn37uqO0ah133HHRp0+fWLx4caxbt66u/KmnnootW7bEkCFD9hrLI488EhERZ511VlZ59+7d4+Mf/3iLxB4RcfLJJ2e979+/f0RErF27dp/b/tSnPtXg2EaPHt3gUYCVlZWxa9eu+Nvf/tbgfQ1pbmy5amw9+vTpE4MGDapXvyXGuHPnzoiIKC0t3WO9k046qV5MDZX37ds3a10jIh544IGIiDjnnHOyysvKymLEiBGxY8eOuiPicp2DlpLrGueyzxrT3PVryn7KdW/nKpfY99f3TFPkY4+1ltrv/dLS0qzjNJcsWRKvvvpqnHfeeVn1a49s/NWvftVomyUlJbFjx45WiBYA8qNk71UAAAAAAICDzYwZM2LIkCHx3//93zFixIiIiBg6dGhcfvnlMW7cuCa18c4770RVVVVERFRUVDRa79VXX41+/frVve/cuXOD9Xr06BFr166NjRs3Ru/evZs6lLpYqquro23bttGhQ4d617t06dIisTdUv02bNhERUVNTs89tt2/fvsG6VVVV8R//8R/xwAMPxOrVq+Ott97Kur59+/ZG+/mgfYktF3tbjx49esTy5cuzylpijG3bto2IiF27du2xXqdOnbLeFxUVRXFxcbRr1y6rvLi4uG5da8dVVVUVbdu2jY4dO9Zrt2fPnhERsX79+mbNQUvYX2v8Yc1dv6bsp1z2dmvGvj+/Z/YmX3ustTzzzDMRETFkyJCsJM1f/vKXUV1d3eh349/+9rd4/vnnG0yQ3b17d5SXl7dOwACQB57kBQAAAAAAh6BMJhMXXXRR/PGPf4y33norHnzwwUgpxfjx4+NHP/pRvboNKSsri86dO0dJSUns2rUrUkoNvoYPH5513xtvvBEppXrtbdy4MSLeT07IVVlZWXTs2DF27twZ27Zta7RMSMihAAAcoklEQVTtfY29qbG0dNtjxoyJ66+/PqZMmRLLly+PmpqaSCnFj3/844iIevPZ0muWq72tx5YtW/Z5jA2pTQ6sTaxpaWVlZVFRURE7d+6M6urqetc3bNgQEe8/pak5cxDxfsLZu+++W6/8wwk5e4pxf6zxh7XE+jUk171dK5d5bGrshfY9k4891hpqampixowZERHxta99ra58165dcc8998S8efManLepU6dGRMNP89q6dWuklHJOGAaAQibJCwAAAAAADkGdO3eOpUuXRsT7x2N97nOfiwcffDAymUzMnTs3q267du2ykiWOOuqo+PnPfx4REePHj4/du3fHvHnz6vVx8803x0c/+tHYvXt3VvnOnTtj4cKFWWV/+ctfYu3atVFZWdnsH+VHjRoVEf//CLNa69evb/CJSc2Jvalasu333nsv5s2bF7169YorrrgiunfvXpfE1dhRZC29Zs3R2Hps3rw5li1bllXWnDE25Nhjj42IaJHjJhtT+6S7D++Td955J5544okoLy+vOz4vlzmo1bt371izZk1W2fr16+Mf//hHk2PcX2tcq6XWrzG57u2Ips9jrrEX0vdMPvZYU5WUlNT9jdmba665Jp5//vkYN25cTJw4sa589uzZ8ZGPfCROO+20Bu/78pe/HBER9957b70x1K597XcCABwMJHkBAAAAAMAh6p//+Z9jyZIl8c4778TGjRvjlltuiZRSfOYzn8mq98lPfjKWL18eq1atigULFsTrr78eQ4cOjYiIm266KY444oi49NJL4+GHH46qqqrYsmVL3HHHHfGDH/wgpk+fHiUlJVntVVRUxLXXXhsLFiyIt99+O1544YWYPHlytGnTJm677basup/5zGeiW7du8eyzz+51PDfeeGN07do1pk6dGo8//nhs27Yt/vrXv8aXvvSl6NWrV736zYm9qVqy7eLi4jjzzDNj/fr1ceutt8bmzZtjx44d8eSTT8btt9/e4D0tvWbN0dB6vPLKKzF58uR6x8s1Z4wNqaysjB49esTixYv3Of7G3HTTTTFw4MCYOnVqzJkzJ6qrq2P58uVx4YUXxrp16+K2226rO7YxlzmoNXLkyFi7dm387Gc/i23btsVrr70W3/jGN3J6wl2ua5zLPmtIS61fY3Ld2xFNn8dcY2/N75kVK1ZEcXFxZDKZeOmll5o1Ly21x3KNJRc1NTWxcePG+P3vfx8jRoyIW265JS699NK45557sp5C+Ktf/SouvfTSRts59thj41Of+lRUVVXF7373u6xrixYtioj3PwcAcNBIAAAAAADAAW3ChAlpwoQJOd2zaNGidPnll6dPfOITqV27dqlr167p1FNPTXfeeWeqqanJqrt06dI0dOjQ1L59+9S/f/80Y8aMrOtvvPFGuuqqq9Lhhx+eSktLU/fu3dPIkSPT448/Xq/fysrK1Ldv3/TKK6+ks846K3Xs2DGVl5enYcOGpWeeeaZe/aFDh6YuXbqk+fPnN2lcy5YtS+eee27q1KlTateuXTrttNPS008/nc4888zUrl27evWbEvuCBQtSRGS9vv3tb6eUUr3yc845Z5/bbujnm02bNqXLL7889e/fP5WWlqaePXumSy65JF199dV19wwePLiufkuu2Z7ceuutjc7Nh9ejvLw8nXzyyWnOnDlpxIgRdfW//OUvN2uMjbn22mtTSUlJWrNmzR7n+dvf/nZauHBhvfKbbrop/fnPf65X/r3vfa+uvc2bN6epU6emgQMHptLS0lRRUZHOOuus9MQTT9SLJ5c5SCmlt956K1122WWpd+/eqby8PJ1xxhlp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AgAAAAAAB5X27dvXHUFW67jjjos+ffrE4sWLY926dS3azoMPPhhFRUUxevTorLq9evWKY445Jl588cVYvXr1PozofSeffHLW+/79+0dExNq1a+vKWiKWBx54ICIizjnnnKzysrKyGDFiROzYsaPVj3ZrqTVsjqeeeiq2bNkSQ4YM2ee2mjOX+zr22j5HjRpV79rDDz8cU6dOzXkcEREnnXRS1vs+ffo0WN63b9+sz+QHY2rKPDzyyCMREXHWWWfV62/QoEH14mrN/Vd7DGZpaWnO944ePbrBoygrKytj165d8be//a3etbZt28Ypp5ySVZbL2jd3LkpKSpp8jCcAkD+SvAAAAAAAgINK586dGyzv0aNHRERs3Lixxdp55513oqqqKmpqaqKioiIymUzW66WXXoqIiFdffTXXYdRTUVGR9b5NmzYREVFTUxMR0SKx1LbRtm3b6NixY73rPXv2jIiI9evX7/N49qSl1jCfmjuX+zL2vfW5Lzp16pT1vqioKIqLi6Ndu3ZZ5cXFxXWfyabE9MF5eOedd6K6ujratm0bHTp0qFe3dg4+3HZr7b+2bdtGRMSuXbtyvreqqiquu+66OO6446JLly51Mf3rv/5rRERs37693j3dunWLTCZTrzyXtW/OXOzevTvKy8tzHiMAsH9J8gIAAAAAAA4qb7zxRqSU6pXXJkh8OFFkX9opKyuLzp07R0lJSezatStSSg2+hg8fvg8japqWiKWsrCwqKipi586dUV1dXe/6hg0bIuL9JwPVKioqinfffbde3bfeeqvBPhpKYvmwXNawNfrPRWPtNWcuI/bt87u3PvMhl3koKyuLjh07xs6dO2Pbtm316m7ZsqVe2625/3r37h0R7ydsNWRPn6UxY8bE9ddfH1OmTInly5dHTU1NpJTixz/+cUREg2vcWD9NXfvmzMXWrVsjpVQ3VgCgcEnyAgAAAAAADio7d+6MhQsXZpX95S9/ibVr10ZlZWWTkxma2s748eNj9+7dMW/evHpt3HzzzfHRj340du/e3czR5KYlYhk3blxERMydOzer/J133oknnngiysvLs47S6927d6xZsyar7vr16+Mf//hHg+23a9cuKynrqKOOip///OdZdXJZw9boPxd7ai/XuYzY989vbZ9/+MMf6l078cQT48orr2ziyFpOLvNQe8xk7bGNtTZv3hzLli2r13Zr7r9jjz02IqLR4x4bW/v33nsv5s2bF7169YorrrgiunfvXpcQtqdjEbdt2xaLFy/OKstl7ZszF7V7p3asAEDhkuQFAAAAAAAcVCoqKuLaa6+NBQsWxNtvvx0vvPBCTJ48Odq0aRO33XZbi7dz0003xRFHHBGXXnppPPzww1FVVRVbtmyJO+64I37wgx/E9OnTo6SkpDWGWk9LxHLTTTfFwIEDY+rUqTFnzpyorq6O5cuXx4UXXhjr1q2L2267re6IvYiIkSNHxtq1a+NnP/tZbNu2LV577bX4xje+0ehThz75yU/G8uXLY9WqVbFgwYJ4/fXXY+jQoVl1clnDlu7/M5/5THTr1i2effbZPc5TU9rLdS5zHXtDavu88sorY+7cuVFdXR2rV6+Or371q7Fu3bq8JHnlMg833nhjdO3aNaZOnRqPP/54bNu2LV555ZWYPHlyg0c4tub+q6ysjB49etRLvKrV2NoXFxfHmWeeGevXr49bb701Nm/eHDt27Ignn3wybr/99kb7a9++fXz961+P5557rtlrn+tcLFq0KCLe30cAQIFLAAAAAAAABWbmzJmpOT9jVFZWpr59+6ZXXnklnXXWWaljx46pvLw8DRs2LD3zzDN19R544IEUEVmvL3zhCzm3U+uNN95IV111VTr88MNTaWlp6t69exo5cmR6/PHH6+rceuut9fr89re/3WgsCxYsaLB+Sqle+TnnnJNTLHuzefPmNHXq1DRw4MBUWlqaKioq0llnnZWeeOKJenXfeuutdNlll6XevXun8vLydMYZZ6SFCxemwYMH18X3rW99q67+0qVL09ChQ1P79u1T//7904wZM5q1hq3V/9ChQ1OXLl3S/PnzmzRXe2svl7lsqc/vh/vs3bt3uuCCC9Ly5cubNKaUUqOfv4ULF9Yrv+mmm9Kf//zneuXf+973mjUPy5YtS+eee27q1KlTKi8vTyeffHKaM2dOGjFiRF3bX/7yl+vq78v+25trr702lZSUpDVr1tS7tqe137RpU7r88stT//79U2lpaerZs2e65JJL0tVXX13X/+DBg7Pi6tu3b3r++efT8OHDU4cOHRpc+72NI9f9P3HixNS3b9/07rvv7nUuPiwi0syZM3O+DwBollmZlBo48BkAAAAAACCPZs2aFZMmTYpcf8Y44YQTYvPmzY0er7a/2yF3h/LcH8pjL1RVVVVxzDHHxOjRo/f4FK4D0eLFi+PEE0+M3/zmN3HBBRfkfH8mk4mZM2fG+eef3wrRAQAfcp/jGgEAAAAAAAAaUFFREbNnz477778/ZsyYke9wWszrr78e48ePj2uuuaZZCV4AwP4nyQsAAAAAAACgESeeeGK88MIL8fDDD8fWrVvzHU6LuOOOO+KGG26IG264Id+hAABNJMkLAAAAAAA44E2fPj0ymUwsXrw41qxZE5lMJr7zne/krR1ydyjP/f4eeyaT2evr+9//fqv1fyAaMGBAzJkzJzp16pTvUFrEzTff7AleAHCAyaRcD7MHAAAAAABoZbNmzYpJkyaFnzEAClMmk4mZM2fG+eefn+9QAOBQcJ8neQEAAAAAAAAAABQwSV4AAAAAAAAAAAAFTJIXAAAAAAAAAABAAZPkBQAAAAAAAAAAUMAkeQEAAAAAAAAAABQwSV4AAAAAAAAAAAAFTJIXAAAAAAAAAABAAZPkBQAAAAAAAAAAUMAkeQEAAAAAAAAAABQwSV4AAAAAAAAAAAAFTJIXAAAAAAAAAABAAZPkBQAAAAAAAAAAUMAkeQEAAAAAAAAAABSwknwHAAAAAAAA0JhZs2blOwQAAIC8k+QFAAAAAAAUrEmTJuU7BAAAgLzLpJRSvoMAAAAAAAAAAACgQfcV5TsCAAAAAAAAAAAAGifJCwAAAAAAAAAAoIBJ8gIAAAAAAAAAAChgJRFxX76DAAAAAAAAAAAAoEHP/j+C1VvBa6ep3gAAAABJRU5ErkJggg==\n", + "text/plain": "" + }, + "execution_count": 8, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "\n", + "from kiara import Kiara\n", + "from rich.jupyter import print\n", + "\n", + "from kiara.utils.jupyter import graph_to_image, save_image\n", + "\n", + "kiara: Kiara = Kiara.instance()\n", + "\n", + "# print(kiara.available_module_types)\n", + "\n", + "# # print('---')\n", + "workflow = kiara.create_workflow(\"language.topic_modeling\")\n", + "#\n", + "# kiara.explain(workflow.steps)\n", + "#\n", + "save_image(workflow.structure.data_flow_graph_simple, path=\"/tmp/data_flow.png\")\n", + "\n", + "graph_to_image(workflow.structure.data_flow_graph_simple)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "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.9.2" + } + }, + "nbformat": 4, + "nbformat_minor": 1 +} diff --git a/docs/modules/module_development.ipynb b/docs/modules/module_development.ipynb new file mode 100644 index 000000000..3c623465f --- /dev/null +++ b/docs/modules/module_development.ipynb @@ -0,0 +1,52 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": { + "collapsed": true, + "pycharm": { + "name": "#%% md\n" + } + }, + "source": [ + "# Developing *kiara* modules\n", + "\n", + "This page will show you how to create your own *kiara* modules. It's early days still, so the way this is done\n", + "currently is not as pythonic, user-friendly and easy as I hope it will eventually be. I do hope it is easy enough\n", + "for everyone with a bit of Python experience to be able to create their own, simple modules, though.\n", + "\n", + "## (Optional) Create a project structure\n", + "\n", + "*kiara* modules live in Python packages. Although technically it would be possible to just use Python files,\n", + "this is not supported for now, possibly ever. The main reason for that is that it is very important to be\n", + "able to pinpoint the exact version of a module that was used to create/transform some data. Python packages\n", + "can be versioned (as well as their dependencies) relatively easy, in a generic way. Simple scripts can't,\n", + "at least not to the extend we need.\n", + "\n", + "Creating Python packages correctly is not trivial, which is why I created a [project template](https://github.com/DHARPA-Project/kiara_modules.project_template) that includes\n", + "all the necessary bits and integrations to make this as painless as possible." + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 2 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython2", + "version": "2.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 0 +} diff --git a/docs/usage.md b/docs/usage.md index a8f257958..552fe665f 100644 --- a/docs/usage.md +++ b/docs/usage.md @@ -23,11 +23,11 @@ Display information about a modules, like description, configuration schema, sou #### ...for a core module -{{ cli("kiara", "module", "describe-type", "and") }} +{{ cli("kiara", "module", "explain-type", "and") }} #### ...for a pipeline module -{{ cli("kiara", "module", "describe-type", "nand") }} +{{ cli("kiara", "module", "explain-type", "nand") }} ### get properties of an instantiated module @@ -38,11 +38,11 @@ This command also can take module configuration, in different forms. This will b #### ...for a core module -{{ cli("kiara", "module", "describe-instance", "and") }} +{{ cli("kiara", "module", "explain-instance", "and") }} #### ...for a pipeline module -{{ cli("kiara", "module", "describe-instance", "nand") }} +{{ cli("kiara", "module", "explain-instance", "nand") }} ## pipeline-specific sub-commands diff --git a/onboarding.folder_to_table.json b/onboarding.folder_to_table.json new file mode 100644 index 000000000..5dafaa6f9 --- /dev/null +++ b/onboarding.folder_to_table.json @@ -0,0 +1,20 @@ +{ + "table": { + "id": [ + 0, + 1 + ], + "rel_path": [ + "csv_1.csv", + "csv_2.csv" + ], + "file_name": [ + "csv_1.csv", + "csv_2.csv" + ], + "content": [ + "a,b,c\nd,e,f\n", + "a,b,c\nd,e,f\n" + ] + } +} \ No newline at end of file diff --git a/setup.cfg b/setup.cfg index dc5589c86..fa80a2e1f 100644 --- a/setup.cfg +++ b/setup.cfg @@ -25,6 +25,7 @@ packages = find_namespace: install_requires = anyio>=3.0.0,<4.0.0 appdirs>=1.4.4,<2.0.0 + bidict>=0.21.0 deepdiff>=5.2.0,<6.0.0 filetype>=1.0.0,<2.0.0 networkx>=2.5,<3.0 @@ -32,6 +33,7 @@ install_requires = pyarrow>=4.0.0,<5.0.0 pydantic>=1.7.0,<2.0.0 python-dateutil>=2.8.0 + python-slugify>=5.0.0 pyyaml>=5.4.0,<6.0.0 pyzmq>=22.0.0,<23.0.0 rich>=9.0.0,<11.0.0 @@ -52,6 +54,7 @@ console_scripts = kiara = kiara.interfaces.cli:cli kiara.modules = pipeline = kiara.pipeline.module:PipelineModule + metadata.extract_python_class = kiara.modules.metadata:ExtractPythonClass [options.extras_require] cli = @@ -210,6 +213,9 @@ ignore_missing_imports = true [mypy-filetype] ignore_missing_imports = true +[mypy-kiara_modules.*] +ignore_missing_imports = true + [mypy-IPython.*] ignore_missing_imports = true diff --git a/src/kiara/data/registry.py b/src/kiara/data/registry.py index 8d5c4a938..99b3ef917 100644 --- a/src/kiara/data/registry.py +++ b/src/kiara/data/registry.py @@ -362,6 +362,33 @@ def get_value_data(self, item: typing.Union[str, KiaraValue]) -> typing.Any: return value + def get_value_metadata( + self, + value: typing.Union[KiaraValue, str], + *metadata_keys: str, + also_return_schema: bool = False, + ): + + value = self.get_value_item(value) + result = {} + missing = set() + for metadata_key in metadata_keys: + if metadata_keys in value.metadata.keys(): + result[metadata_key] = value.metadata[metadata_key]["metadata"] + else: + missing.add(metadata_key) + + if not missing: + return result + + _md = self._kiara.get_value_metadata(value, metadata_keys=missing) + result.update(_md) + + if also_return_schema: + return result + else: + return {k: v["metadata"] for k, v in result.items()} + def get_value_hash( self, item: typing.Union[str, KiaraValue] ) -> typing.Union[int, ValueHashMarker]: diff --git a/src/kiara/data/types/__init__.py b/src/kiara/data/types/__init__.py index 36e3bf3ba..019738bf2 100644 --- a/src/kiara/data/types/__init__.py +++ b/src/kiara/data/types/__init__.py @@ -20,18 +20,17 @@ """ import datetime -import networkx -import networkx as nx -import pyarrow import typing from dateutil import parser from deepdiff import DeepHash from enum import Enum -from networkx import DiGraph from rich.console import Console, ConsoleOptions, RenderResult from kiara.utils import camel_case_to_snake_case +if typing.TYPE_CHECKING: + from kiara.data.values import Value + class ValueHashMarker(Enum): @@ -93,9 +92,19 @@ def get_type_transformation_configs( The name of the transformation is the key of the result dictionary, the configuration is a module configuration (dictionary wth 'module_type' and optional 'module_config', 'input_name' and 'output_name' keys). """ - return { - "to_string": {"module_type": "strings.pretty_print", "input_name": "item"} - } + return {"string": {"module_type": "strings.pretty_print", "input_name": "item"}} + + @classmethod + def check_value_type(cls, value: "Value") -> typing.Optional["ValueType"]: + return cls.check_data_type(value.get_value_data()) + + @classmethod + def check_data_type(cls, data: typing.Any) -> typing.Optional["ValueType"]: + return None + + @classmethod + def relevant_python_types(cls) -> typing.Optional[typing.Iterable[typing.Type]]: + return None def __init__(self, **type_config: typing.Any): @@ -349,50 +358,3 @@ def parse_value(self, v: typing.Any) -> typing.Any: def validate(cls, value: typing.Any): assert isinstance(value, datetime.datetime) - - -class TableType(ValueType): - def validate(cls, value: typing.Any) -> None: - assert isinstance(value, pyarrow.Table) - - def extract_type_metadata( - cls, value: typing.Any - ) -> typing.Mapping[str, typing.Any]: - - table: pyarrow.Table = value - table_schema = {} - for name in table.schema.names: - field = table.schema.field(name) - md = field.metadata - if not md: - md = {} - _type = field.type - _d = {"item_type": str(_type), "arrow_type_id": _type.id, "metadata": md} - table_schema[name] = _d - - return { - "column_names": table.column_names, - "schema": table_schema, - "rows": table.num_rows, - "size_in_bytes": table.nbytes, - } - - -class NetworkGraphType(ValueType): - def validate(cls, value: typing.Any) -> typing.Any: - - if not isinstance(value, networkx.Graph): - raise ValueError(f"Invalid type '{type(value)}' for graph: {value}") - return value - - def extract_type_metadata( - cls, value: typing.Any - ) -> typing.Mapping[str, typing.Any]: - - graph: nx.Graph = value - return { - "directed": isinstance(value, DiGraph), - "number_of_nodes": len(graph.nodes), - "number_of_edges": len(graph.edges), - "density": nx.density(graph), - } diff --git a/src/kiara/data/types/graphs.py b/src/kiara/data/types/graphs.py new file mode 100644 index 000000000..3f3fa84c2 --- /dev/null +++ b/src/kiara/data/types/graphs.py @@ -0,0 +1,27 @@ +# -*- coding: utf-8 -*- +import networkx +import networkx as nx +import typing +from networkx import DiGraph + +from kiara.data.types import ValueType + + +class NetworkGraphType(ValueType): + def validate(cls, value: typing.Any) -> typing.Any: + + if not isinstance(value, networkx.Graph): + raise ValueError(f"Invalid type '{type(value)}' for graph: {value}") + return value + + def extract_type_metadata( + cls, value: typing.Any + ) -> typing.Mapping[str, typing.Any]: + + graph: nx.Graph = value + return { + "directed": isinstance(value, DiGraph), + "number_of_nodes": len(graph.nodes), + "number_of_edges": len(graph.edges), + "density": nx.density(graph), + } diff --git a/src/kiara/data/types/type_mgmt.py b/src/kiara/data/types/type_mgmt.py new file mode 100644 index 000000000..a6a435722 --- /dev/null +++ b/src/kiara/data/types/type_mgmt.py @@ -0,0 +1,244 @@ +# -*- coding: utf-8 -*- +import typing + +from kiara.data import Value +from kiara.data.types import ValueType + +if typing.TYPE_CHECKING: + from kiara.kiara import Kiara + + +class TypeMgmt(object): + def __init__(self, kiara: "Kiara"): + + self._kiara: Kiara = kiara + self._value_types: typing.Optional[ + typing.Dict[str, typing.Type[ValueType]] + ] = None + self._value_type_transformations: typing.Dict[ + str, typing.Dict[str, typing.Any] + ] = {} + self._registered_python_classes: typing.Dict[typing.Type, typing.List[str]] = None # type: ignore + + @property + def value_types(self) -> typing.Mapping[str, typing.Type[ValueType]]: + + if self._value_types is not None: + return self._value_types + + all_value_type_classes = ValueType.__subclasses__() + value_type_dict: typing.Dict[str, typing.Type[ValueType]] = {} + for cls in all_value_type_classes: + type_name = cls.type_name() + if type_name in value_type_dict.keys(): + raise Exception( + f"Can't initiate types: duplicate type name '{type_name}'" + ) + value_type_dict[type_name] = cls + + self._value_types = value_type_dict + return self._value_types + + @property + def value_type_names(self) -> typing.List[str]: + return list(self.value_types.keys()) + + @property + def registered_python_classes( + self, + ) -> typing.Mapping[typing.Type, typing.Iterable[str]]: + + if self._registered_python_classes is not None: + return self._registered_python_classes + + registered_types = {} + for name, v_type in self.value_types.items(): + rel = v_type.relevant_python_types() + if rel: + for cls in rel: + registered_types.setdefault(cls, []).append(name) + + self._registered_python_classes = registered_types + return self._registered_python_classes + + def determine_type(self, data: typing.Any) -> typing.Optional[ValueType]: + + if isinstance(data, Value): + data = data.get_value_data() + + result: typing.List[ValueType] = [] + + registered_types = set(self.registered_python_classes.get(data.__class__, [])) + for cls in data.__class__.__bases__: + reg = self.registered_python_classes.get(cls) + if reg: + registered_types.update(reg) + + if registered_types: + for rt in registered_types: + _cls: typing.Type[ValueType] = self.get_value_type_cls(rt) + match = _cls.check_data_type(data) + if match: + result.append(match) + + # TODO: re-run all checks on all modules, not just the ones that registered interest in the class + + if len(result) == 0: + return None + elif len(result) > 1: + result_str = [x.type_name() for x in result] + raise Exception( + f"Multiple value types found for value: {', '.join(result_str)}." + ) + else: + return result[0] + + def get_value_type_cls(self, type_name: str) -> typing.Type[ValueType]: + + t = self.value_types.get(type_name, None) + if t is None: + raise Exception( + f"No value type '{type_name}', available types: {', '.join(self.value_types.keys())}" + ) + return t + + def get_value_type_transformations( + self, value_type_name: str + ) -> typing.Mapping[str, typing.Mapping[str, typing.Any]]: + """Return available transform pipelines for value types.""" + + if value_type_name in self._value_type_transformations.keys(): + return self._value_type_transformations[value_type_name] + + type_cls = self.get_value_type_cls(type_name=value_type_name) + _configs = type_cls.get_type_transformation_configs() + if _configs is None: + configs = {} + else: + configs = dict(_configs) + for base in type_cls.__bases__: + if hasattr(base, "get_type_transformation_configs"): + _b_configs = base.get_type_transformation_configs() # type: ignore + if not _b_configs: + continue + for k, v in _b_configs.items(): + if k not in configs.keys(): + configs[k] = v + + # TODO: check input type compatibility? + result: typing.Dict[str, typing.Dict[str, typing.Any]] = {} + for name, config in configs.items(): + config = dict(config) + module_type = config.pop("module_type", None) + if not module_type: + raise Exception( + f"Can't create transformation '{name}' for type '{value_type_name}', no module type specified in config: {config}" + ) + module_config = config.pop("module_config", {}) + module = self._kiara.create_module( + f"_transform_{value_type_name}_{name}", + module_type=module_type, + module_config=module_config, + ) + + if "input_name" not in config.keys(): + + if len(module.input_schemas) == 1: + config["input_name"] = next(iter(module.input_schemas.keys())) + else: + required_inputs = [ + inp + for inp, schema in module.input_schemas.items() + if schema.is_required() + ] + if len(required_inputs) == 1: + config["input_name"] = required_inputs[0] + else: + raise Exception( + f"Can't create transformation '{name}' for type '{value_type_name}': can't determine input name between those options: '{', '.join(required_inputs)}'" + ) + + if "output_name" not in config.keys(): + + if len(module.input_schemas) == 1: + config["output_name"] = next(iter(module.output_schemas.keys())) + else: + required_outputs = [ + inp + for inp, schema in module.output_schemas.items() + if schema.is_required() + ] + if len(required_outputs) == 1: + config["output_name"] = required_outputs[0] + else: + raise Exception( + f"Can't create transformation '{name}' for type '{value_type_name}': can't determine output name between those options: '{', '.join(required_outputs)}'" + ) + + result[name] = { + "module": module, + "module_type": module_type, + "module_config": module_config, + "transformation_config": config, + } + + self._value_type_transformations[value_type_name] = result + return self._value_type_transformations[value_type_name] + + # def get_available_transformations_for_type( + # self, value_type_name: str + # ) -> typing.Iterable[str]: + # + # return self.get_value_type_transformations(value_type_name=value_type_name) + + # def transform_value( + # self, + # transformation_alias: str, + # value: Value, + # other_inputs: typing.Optional[typing.Mapping[str, typing.Any]] = None, + # ) -> Value: + # + # transformations = self.get_value_type_transformations(value.value_schema.type) + # + # if transformation_alias not in transformations.keys(): + # raise Exception( + # f"Can't transform value of type '{value.value_schema.type}', transformation '{transformation_alias}' not available for this type. Available: {', '.join(transformations.keys())}" + # ) + # + # config = transformations[transformation_alias] + # + # transformation_config = config["transformation_config"] + # input_name = transformation_config["input_name"] + # + # module: KiaraModule = config["module"] + # + # constants = module.get_config_value("constants") + # inputs = dict(constants) + # + # if other_inputs: + # + # for k, v in other_inputs.items(): + # if k in constants.keys(): + # raise Exception(f"Invalid value '{k}' for 'other_inputs', this is a constant that can't be overwrittern.") + # inputs[k] = v + # + # defaults = transformation_config.get("defaults", None) + # if defaults: + # for k, v in defaults.items(): + # if k in constants.keys(): + # raise Exception(f"Invalid default value '{k}', this is a constant that can't be overwrittern.") + # if k not in inputs.keys(): + # inputs[k] = v + # + # if input_name in inputs.keys(): + # raise Exception( + # f"Invalid value for inputs in transform arguments, can't contain the main input key '{input_name}'." + # ) + # + # inputs[input_name] = value + # + # result = module.run(**inputs) + # output_name = transformation_config["output_name"] + # + # result_value = result.get_value_obj(output_name) + # return result_value diff --git a/src/kiara/data/values.py b/src/kiara/data/values.py index e5e231558..b923bbeda 100644 --- a/src/kiara/data/values.py +++ b/src/kiara/data/values.py @@ -277,17 +277,25 @@ def _create_value_table(self, padding=(0, 1)) -> Table: return table + def get_metadata( + self, *metadata_keys: str, also_return_schema: bool = False + ) -> typing.Mapping[str, typing.Mapping[str, typing.Any]]: + + raise NotImplementedError() + def transform( self, - transformation_alias: str, + target_type: str, return_data: bool = True, - other_inputs: typing.Optional[typing.Mapping[str, typing.Any]] = None, - ) -> typing.Any: - - transformed = self._kiara.transform_value( - transformation_alias=transformation_alias, - value=self, - other_inputs=other_inputs, + config: typing.Optional[typing.Mapping[str, typing.Any]] = None, + register_result: bool = False, + ) -> typing.Union[typing.Mapping[str, typing.Any], "Value"]: + + transformed = self._kiara.transform_data( + data=self, + target_type=target_type, + config=config, + register_result=register_result, ) if not return_data: return transformed @@ -394,6 +402,27 @@ def get_value_hash(self) -> typing.Any: else: return self.value_hash + def get_metadata( + self, *metadata_keys: str, also_return_schema: bool = False + ) -> typing.Mapping[str, typing.Mapping[str, typing.Any]]: + + result = {} + missing = set() + for metadata_key in metadata_keys: + if metadata_keys in self.metadata.keys(): + if also_return_schema: + result[metadata_key] = self.metadata[metadata_key] + else: + result[metadata_key] = self.metadata[metadata_key]["metadata"] + else: + missing.add(metadata_key) + + if not missing: + return result + _md = self.registry.get_value_metadata(self, *missing) + result.update(_md) + return result + def __eq__(self, other): # TODO: compare all attributes if id is equal, just to make sure... @@ -834,12 +863,13 @@ class ValuesInfo(object): def __init__(self, value_set: ValueSet, title: typing.Optional[str] = None): self._value_set: ValueSet = value_set + self._title: typing.Optional[str] = title def create_value_data_table( self, show_headers: bool = False, - transformer: typing.Optional[str] = None, - transformer_config: typing.Optional[typing.Mapping[str, typing.Any]] = None, + convert_module_type: typing.Optional[str] = None, + convert_config: typing.Optional[typing.Mapping[str, typing.Any]] = None, ) -> Table: table = Table(show_header=show_headers, box=box.SIMPLE) @@ -851,7 +881,9 @@ def create_value_data_table( if not value.is_set: if value.item_is_valid(): - value_str = "-- not set --" + value_str: typing.Union[ + ConsoleRenderable, RichCast, str + ] = "-- not set --" else: value_str = "[red]-- not set --[/red]" elif value.is_none: @@ -860,13 +892,14 @@ def create_value_data_table( else: value_str = "[red]-- no value --[/red]" else: - if not transformer: + if not convert_module_type: value_str = value.get_value_data() else: - value_str = value.transform( - transformer, return_data=True, other_inputs=transformer_config + _value_str = value.transform( + convert_module_type, return_data=True, config=convert_config ) - if not isinstance(value_str, (ConsoleRenderable, RichCast, str)): + + if not isinstance(_value_str, (ConsoleRenderable, RichCast, str)): value_str = str(value_str) table.add_row(field_name, value_str) @@ -1042,6 +1075,9 @@ class StepInputField(ValueField): connected_pipeline_input: typing.Optional[str] = Field( default=None, description="A potential pipeline input." ) + is_constant: bool = Field( + "Whether this input is a constant and can't be changed by the user." + ) @root_validator(pre=True) def ensure_single_connected_item(cls, values): @@ -1101,6 +1137,9 @@ class PipelineInputField(ValueField): description="The step inputs that are connected to this pipeline input", default_factory=list, ) + is_constant: bool = Field( + "Whether this input is a constant and can't be changed by the user." + ) @property def alias(self) -> str: @@ -1117,6 +1156,23 @@ def alias(self) -> str: return generate_step_alias(PIPELINE_PARENT_MARKER, self.value_name) +class ValueSetType(ValueType): + def validate(cls, value: typing.Any) -> None: + assert isinstance(value, ValueSet) + + @classmethod + def check_data_type(cls, data: typing.Any) -> typing.Optional[ValueType]: + + if isinstance(data, ValueSet): + return ValueSetType() + else: + return None + + @classmethod + def relevant_python_types(cls) -> typing.Optional[typing.Iterable[typing.Type]]: + return [ValueSet] + + Value.update_forward_refs() DataValue.update_forward_refs() LinkedValue.update_forward_refs() diff --git a/src/kiara/interfaces/cli/__init__.py b/src/kiara/interfaces/cli/__init__.py index 4f4b177d1..70a82a50a 100644 --- a/src/kiara/interfaces/cli/__init__.py +++ b/src/kiara/interfaces/cli/__init__.py @@ -6,22 +6,21 @@ import os.path import sys import typing +from kiara_modules.core.json import DEFAULT_TO_JSON_CONFIG +from pathlib import Path +from rich import box +from rich.console import Console, RenderGroup from rich.panel import Panel +from rich.syntax import Syntax from kiara import Kiara -from kiara.data.values import ValuesInfo from kiara.interfaces import get_console from kiara.module import KiaraModule, ModuleInfo from kiara.pipeline.controller import BatchController from kiara.pipeline.module import PipelineModuleInfo from kiara.processing.parallel import ThreadPoolProcessor from kiara.utils import create_table_from_field_schemas, dict_from_cli_args - -# from importlib.metadata import entry_points - - -# from asciinet import graph_to_ascii - +from kiara.utils.output import OutputDetails try: import uvloop @@ -43,7 +42,7 @@ def rich_print(msg: typing.Any = None) -> None: def _create_module_instance( ctx, module_type: str, module_config: typing.Iterable[typing.Any] -): +) -> KiaraModule: config = dict_from_cli_args(*module_config) kiara_obj = ctx.obj["kiara"] @@ -115,10 +114,10 @@ def list_modules(ctx, only_pipeline_modules: bool, only_core_modules: bool): kiara_obj.explain(p) -@module.command(name="describe-type") +@module.command(name="explain-type") @click.argument("module_type", nargs=1, required=True) @click.pass_context -def describe_module_type(ctx, module_type: str): +def explain_module_type(ctx, module_type: str): """Print details of a (Python) module.""" kiara_obj: Kiara = ctx.obj["kiara"] @@ -139,14 +138,14 @@ def describe_module_type(ctx, module_type: str): rich_print(info) -@module.command("describe-instance") +@module.command("explain-instance") @click.argument("module_type", nargs=1) @click.argument( "module_config", nargs=-1, ) @click.pass_context -def describe_module(ctx, module_type: str, module_config: typing.Iterable[typing.Any]): +def explain_module(ctx, module_type: str, module_config: typing.Iterable[typing.Any]): """Describe a step. A step, in this context, is basically a an instantiated module class, incl. (optional) config.""" @@ -265,6 +264,23 @@ def explain_steps(ctx, pipeline_type: str): kiara_obj.explain(structure.to_details().steps_info) +@cli.group(name="type") +@click.pass_context +def type_group(ctx): + """Information about available modules, and details about them.""" + + +@type_group.command(name="list") +@click.pass_context +def list_types(ctx): + + kiara_obj: Kiara = ctx.obj["kiara"] + + print() + for type_name, type in kiara_obj.value_types.items(): + rich_print(f"{type_name}: {type}") + + @cli.command() @click.argument("module", nargs=1) @click.argument("inputs", nargs=-1, required=False) @@ -276,40 +292,20 @@ def explain_steps(ctx, pipeline_type: str): multiple=True, ) @click.option( - "--data-details", + "--workflow-details", "-d", - help="Print details/metadata about input/output data.", + help="Display additional workflow details.", is_flag=True, - default=False, ) @click.option( - "--only-output", - "-o", - help="Only print output data. Overrides all other display options.", - is_flag=True, - default=False, + "--output", "-o", help="The output format and configuration.", multiple=True ) @click.pass_context -async def run(ctx, module, inputs, module_config, data_details, only_output): +async def run(ctx, module, inputs, module_config, output, workflow_details): if module_config: raise NotImplementedError() - display_state = True - display_input_values = True - display_input_details = False - display_output_values = True - display_output_details = False - - if data_details: - display_input_details = True - display_output_details = True - - if only_output: - display_state = False - display_input_values = False - display_input_details = False - kiara_obj: Kiara = ctx.obj["kiara"] if module in kiara_obj.available_module_types: @@ -335,8 +331,8 @@ async def run(ctx, module, inputs, module_config, data_details, only_output): ) one_required = False - for schema in module_obj.input_schemas.values(): - if schema.is_required(): + for input_name in module_obj.input_names: + if module_obj.input_required(input_name): one_required = True break @@ -350,17 +346,41 @@ async def run(ctx, module, inputs, module_config, data_details, only_output): "No inputs provided, not running the workflow. To run it, provide input following this schema:" ) rich_print(inputs_table) - sys.exit(0) + sys.exit(1) + + output_details = OutputDetails.from_data(output) + if output_details.format != "terminal": + pass + + force_overwrite = output_details.config.get("force", False) + + # SUPPORTED_TARGETS = ["terminal", "file"] + # if output_details.target not in SUPPORTED_TARGETS: + # print() + # rich_print(f"Invalid output target '{output_details.target}', must be one of: [i]{', '.join(SUPPORTED_TARGETS)}[/i]") + # sys.exit(1) + + target_file: typing.Optional[Path] = None + if output_details.target != "terminal": + if output_details.target == "file": + target_dir = Path.cwd() + target_file = target_dir / f"{module_name}.{output_details.format}" + else: + target_file = Path( + os.path.realpath(os.path.expanduser(output_details.target)) + ) + + if target_file.exists() and not force_overwrite: + print() + print( + f"Can't run workflow, the target files already exist, and '--output force=true' not specified: {target_file}" + ) + sys.exit(1) processor = ThreadPoolProcessor() # processor = None controller = BatchController(processor=processor) - workflow = kiara_obj.create_workflow(module_name, controller=controller) - - # l = DebugListener() - # workflow.pipeline.add_listener(l) - list_keys = [] for name, value in workflow.inputs.items(): @@ -374,49 +394,88 @@ async def run(ctx, module, inputs, module_config, data_details, only_output): else: workflow.controller.process_pipeline() - transformer = "to_string" - transformer_config = {"max_lines": 6} + if workflow_details: + kiara_obj.explain(workflow.current_state) - if display_input_values: - vi = ValuesInfo(workflow.inputs) - vt = vi.create_value_data_table( - show_headers=True, - transformer=transformer, - transformer_config=transformer_config, - ) - rich_print(Panel(vt, title_align="left", title="Workflow input data")) - print() - - if display_input_details: - vi = ValuesInfo(workflow.inputs) - vt = vi.create_value_info_table(show_headers=True) - rich_print(Panel(vt, title_align="left", title="Workflow input details")) - print() - - if display_state: - state_panel = Panel( - workflow.current_state, - title="Workflow state", - title_align="left", - padding=(1, 0, 0, 2), - ) - rich_print(state_panel) - print() - - if display_output_details: - vi = ValuesInfo(workflow.outputs) - vt = vi.create_value_info_table(show_headers=True) - rich_print(Panel(vt, title_align="left", title="Workflow output details")) - print() - - if display_output_values: - vi = ValuesInfo(workflow.outputs) - vt = vi.create_value_data_table( - show_headers=True, - transformer=transformer, - transformer_config=transformer_config, - ) - rich_print(Panel(vt, title_align="left", title="Workflow output data")) + if output_details.target == "terminal": + if output_details.format == "terminal": + print() + pretty_print = kiara_obj.create_workflow("strings.pretty_print") + pretty_print.inputs.set_value("item", workflow.outputs) + + renderables = pretty_print.outputs.get_value_data("renderables") + output = Panel(RenderGroup(*renderables), box=box.SIMPLE) + rich_print("[b]Output data[/b]") + rich_print(output) + else: + + format = output_details.format + available_formats = kiara_obj.get_convert_target_types( + source_type="value_set" + ) + if format not in available_formats: + print() + print( + f"Can't convert to output format '{format}', this format is not supported. Available formats: {', '.join(available_formats)}." + ) + sys.exit(1) + + config = {} + config.update(DEFAULT_TO_JSON_CONFIG) + + transformed = kiara_obj.transform_data( + workflow.outputs, + source_type="value_set", + target_type=format, + config=config, + ) + transformed_value = transformed.get_value_data("target_value") + + if format in ["json", "yaml"]: + transformed_str = Syntax( + transformed_value, lexer_name=format, background_color="default" + ) + rich_print(transformed_str) + else: + print(transformed_value) + + else: + if output_details.format == "terminal": + pretty_print = kiara_obj.create_workflow("strings.pretty_print") + pretty_print.inputs.set_value("item", workflow.outputs) + + renderables = pretty_print.outputs.get_value_data("renderables") + output = Panel(RenderGroup(*renderables), box=box.SIMPLE) + with open(target_file, "wt") as f: + console = Console(record=True, file=f) + console.print(output) + else: + + format = output_details.format + available_formats = kiara_obj.get_convert_target_types( + source_type="value_set" + ) + if format not in available_formats: + print() + print( + f"Can't convert to output format '{format}', this format is not supported. Available formats: {', '.join(available_formats)}." + ) + sys.exit(1) + + config = {} + config.update(DEFAULT_TO_JSON_CONFIG) + + transformed = kiara_obj.transform_data( + workflow.outputs, + source_type="value_set", + target_type=format, + config=config, + ) + transformed_value = transformed.get_value_data("target_value") + + target_file.parent.mkdir(parents=True, exist_ok=True) + # TODO: check whether to write text or bytes + target_file.write_text(transformed_value) # @cli.command() @@ -426,60 +485,34 @@ async def run(ctx, module, inputs, module_config, data_details, only_output): # # os.environ["DEBUG"] = "true" # -# # kiara = Kiara.instance() -# -# ctx = Context.instance() -# -# sub = ctx.socket(zmq.SUB) -# sub.setsockopt_string(zmq.SUBSCRIBE, "") -# sub.connect("tcp://127.0.0.1:5556") -# while True: -# message = sub.recv() -# print("Received request: %s" % message) -# # socket.send(b"World") -# -# module_info = kiara.get_module_info("import_local_folder") -# # kiara.explain(module_info) -# -# workflow = kiara.create_workflow("import_local_folder") -# workflow.inputs.path = ( -# "/home/markus/projects/dharpa/notebooks/TopicModelling/data_tm_workflow" -# ) -# -# # kiara.explain(workflow.outputs) -# kiara.explain(workflow.outputs.file_bundle) -# - -# @cli.command() -# @click.pass_context -# def dev2(ctx): -# import os -# -# os.environ["DEBUG"] = "true" +# kiara = Kiara.instance() # -# # kiara = Kiara.instance() +# workflow = kiara.create_workflow("onboarding.import_local_folder") # -# ctx = Context.instance() +# extended = { +# "steps": [ +# { +# "module_type": "tabular.create_table_from_text_files", +# "module_config": { +# "columns": ["id", "rel_path", "file_name", "content"] +# }, +# "step_id": "create_table_from_files", +# } +# ], +# "input_aliases": {"create_table_from_files__files": "file_bundle"}, +# } # -# pub = ctx.socket(zmq.PUB) -# pub.connect("tcp://127.0.0.1:5555") -# while True: -# topic = random.randrange(9999, 10005) -# messagedata = random.randrange(1, 215) - 80 -# print("%d %d" % (topic, messagedata)) -# pub.send_string("%d %d" % (topic, messagedata)) -# time.sleep(1) +# structure = workflow.structure +# new_structure = structure.extend(extended) # -# module_info = kiara.get_module_info("import_local_folder") -# # kiara.explain(module_info) +# workflow = kiara.create_workflow("tabular.import_table_from_folder") +# workflow.inputs.set_value("path", "/home/markus/projects/dharpa/data/csvs") # -# workflow = kiara.create_workflow("import_local_folder") -# workflow.inputs.path = ( -# "/home/markus/projects/dharpa/notebooks/TopicModelling/data_tm_workflow" -# ) +# import pp # -# # kiara.explain(workflow.outputs) -# kiara.explain(workflow.outputs.file_bundle) +# table = workflow.outputs.get_value_obj("table") +# md = table.get_metadata() +# pp(md) if __name__ == "__main__": diff --git a/src/kiara/kiara.py b/src/kiara/kiara.py index 670a95f8c..3a5a66504 100644 --- a/src/kiara/kiara.py +++ b/src/kiara/kiara.py @@ -14,6 +14,7 @@ from kiara.data import Value from kiara.data.registry import DataRegistry from kiara.data.types import ValueType +from kiara.data.types.type_mgmt import TypeMgmt from kiara.interfaces import get_console from kiara.module_config import KiaraWorkflowConfig, PipelineModuleConfig from kiara.module_mgmt import ModuleManager @@ -22,6 +23,7 @@ from kiara.pipeline.controller import PipelineController from kiara.pipeline.pipeline import Pipeline from kiara.processing import Job, ModuleProcessor +from kiara.profiles import ModuleProfileMgmt from kiara.utils import get_auto_workflow_alias, get_data_from_file, is_debug from kiara.workflow import KiaraWorkflow @@ -67,6 +69,8 @@ def __init__(self, config: typing.Optional[KiaraConfig] = None): self._default_pipeline_mgr = PipelineModuleManager(folders=None) self._custom_pipelines_mgr = PipelineModuleManager(folders={}) + self._profile_mgmt = ModuleProfileMgmt(kiara=self) + self.start_zmq_device() self.start_log_thread() @@ -91,12 +95,7 @@ def __init__(self, config: typing.Optional[KiaraConfig] = None): self._modules: typing.Dict[str, ModuleManager] = {} - self._value_types: typing.Optional[ - typing.Dict[str, typing.Type[ValueType]] - ] = None - self._value_type_transformations: typing.Dict[ - str, typing.Dict[str, typing.Any] - ] = {} + self._type_mgmt: TypeMgmt = TypeMgmt(self) self._data_registry: DataRegistry = DataRegistry(self) @@ -152,159 +151,93 @@ def explain(self, item: typing.Any): @property def value_types(self) -> typing.Mapping[str, typing.Type[ValueType]]: - - if self._value_types is not None: - return self._value_types - - all_value_type_classes = ValueType.__subclasses__() - value_type_dict: typing.Dict[str, typing.Type[ValueType]] = {} - for cls in all_value_type_classes: - type_name = cls.type_name() - if type_name in value_type_dict.keys(): - raise Exception( - f"Can't initiate types: duplicate type name '{type_name}'" - ) - value_type_dict[type_name] = cls - - self._value_types = value_type_dict - return self._value_types + return self._type_mgmt.value_types @property def value_type_names(self) -> typing.List[str]: - return list(self.value_types.keys()) - - def get_value_type_cls(self, type_name: str) -> typing.Type[ValueType]: + return self._type_mgmt.value_type_names - t = self.value_types.get(type_name, None) - if t is None: - raise Exception( - f"No value type '{type_name}', available types: {', '.join(self.value_types.keys())}" - ) - return t + def determine_type(self, data: typing.Any) -> typing.Optional[ValueType]: - def get_value_type_transformations( - self, value_type_name: str - ) -> typing.Mapping[str, typing.Mapping[str, typing.Any]]: - """Return available transform pipelines for value types.""" + return self._type_mgmt.determine_type(data) - if value_type_name in self._value_type_transformations.keys(): - return self._value_type_transformations[value_type_name] - - type_cls = self.get_value_type_cls(type_name=value_type_name) - _configs = type_cls.get_type_transformation_configs() - if _configs is None: - configs = {} - else: - configs = dict(_configs) - for base in type_cls.__bases__: - if hasattr(base, "get_type_transformation_configs"): - _b_configs = base.get_type_transformation_configs() # type: ignore - if not _b_configs: - continue - for k, v in _b_configs.items(): - if k not in configs.keys(): - configs[k] = v - - # TODO: check input type compatibility? - result: typing.Dict[str, typing.Dict[str, typing.Any]] = {} - for name, config in configs.items(): - config = dict(config) - module_type = config.pop("module_type", None) - if not module_type: - raise Exception( - f"Can't create transformation '{name}' for type '{value_type_name}', no module type specified in config: {config}" - ) - module_config = config.pop("module_config", {}) - module = self.create_module( - f"_transform_{value_type_name}_{name}", - module_type=module_type, - module_config=module_config, - ) + def get_value_metadata( + self, + value: Value, + metadata_keys: typing.Union[None, str, typing.Iterable[str]] = None, + ): - if "input_name" not in config.keys(): + value_type = value.value_schema.type + # TODO: validate type exists - if len(module.input_schemas) == 1: - config["input_name"] = next(iter(module.input_schemas.keys())) - else: - required_inputs = [ - inp - for inp, schema in module.input_schemas.items() - if schema.is_required() - ] - if len(required_inputs) == 1: - config["input_name"] = required_inputs[0] - else: - raise Exception( - f"Can't create transformation '{name}' for type '{value_type_name}': can't determine input name between those options: '{', '.join(required_inputs)}'" - ) + all_profiles_for_type = self._profile_mgmt.extract_metadata_profiles.get( + value_type, None + ) + if all_profiles_for_type is None: + all_profiles_for_type = {} - if "output_name" not in config.keys(): + if not metadata_keys: + metadata_keys = all_profiles_for_type.keys() + elif isinstance(metadata_keys, str): + metadata_keys = [metadata_keys] - if len(module.input_schemas) == 1: - config["output_name"] = next(iter(module.output_schemas.keys())) - else: - required_outputs = [ - inp - for inp, schema in module.output_schemas.items() - if schema.is_required() - ] - if len(required_outputs) == 1: - config["output_name"] = required_outputs[0] - else: - raise Exception( - f"Can't create transformation '{name}' for type '{value_type_name}': can't determine output name between those options: '{', '.join(required_outputs)}'" - ) + result = {} - result[name] = { - "module": module, - "module_type": module_type, - "module_config": module_config, - "transformation_config": config, - } + for mk in metadata_keys: + if not all_profiles_for_type or mk not in all_profiles_for_type: + raise Exception( + f"Can't extract metadata profile '{mk}' for type '{value_type}': metadata profile does not exist (for this type, anyway)." + ) + profile = all_profiles_for_type[mk] + module = profile.create_module(kiara=self) + metadata_result = module.run(value=value) + result[mk] = metadata_result.get_all_value_data() - self._value_type_transformations[value_type_name] = result - return self._value_type_transformations[value_type_name] + return result - def get_available_transformations_for_type( - self, value_type_name: str - ) -> typing.Iterable[str]: + def get_value_type_cls(self, type_name: str) -> typing.Type[ValueType]: - return self.get_value_type_transformations(value_type_name=value_type_name) + return self._type_mgmt.get_value_type_cls(type_name=type_name) - def transform_value( + def transform_data( self, - transformation_alias: str, - value: Value, - other_inputs: typing.Optional[typing.Mapping[str, typing.Any]] = None, + data: typing.Any, + target_type: str, + source_type: typing.Optional[str] = None, + config: typing.Optional[typing.Mapping[str, typing.Any]] = None, + register_result: bool = False, ) -> Value: - transformations = self.get_value_type_transformations(value.value_schema.type) - if transformation_alias not in transformations.keys(): - raise Exception( - f"Can't transform value of type '{value.value_schema.type}', transformation '{transformation_alias}' not available for this type. Available: {', '.join(transformations.keys())}" - ) + if register_result: + raise NotImplementedError() - config = transformations[transformation_alias] - input_name = config["transformation_config"]["input_name"] + if not source_type: + if isinstance(data, Value): + source_type = data.type_name + else: + _source_type = self._type_mgmt.determine_type(data) + if not _source_type: + raise Exception( + f"Can't transform data to '{target_type}': can not determine source type." + ) + source_type = _source_type.type_name() - module: KiaraModule = config["module"] + module = self._profile_mgmt.get_type_conversion_module( + source_type=source_type, target_type=target_type # type: ignore + ) + from kiara.modules.type_conversion import TypeConversionModule - if other_inputs is None: - inputs = {} - else: - inputs = dict(other_inputs) - if input_name in other_inputs.keys(): - raise Exception( - f"Invalid value for 'other_inputs' in transform arguments, can't contain the main input key '{input_name}'." - ) + if isinstance(module, TypeConversionModule): - inputs[input_name] = value + result = module.run(source_value=data, config=config) + return result.get_value_obj("target_value") + + else: + raise NotImplementedError() - result = module.run(**inputs) - output_name = config["transformation_config"]["output_name"] + def get_convert_target_types(self, source_type: str) -> typing.Iterable[str]: - result_value = result.get_value_obj(output_name) - return result_value + return self._profile_mgmt.type_convert_profiles.get(source_type, []) def add_module_manager(self, module_manager: ModuleManager): diff --git a/src/kiara/metadata/__init__.py b/src/kiara/metadata/__init__.py deleted file mode 100644 index e69de29bb..000000000 diff --git a/src/kiara/module.py b/src/kiara/module.py index 44f7ec648..88a9498de 100644 --- a/src/kiara/module.py +++ b/src/kiara/module.py @@ -326,6 +326,19 @@ def config(self) -> KIARA_CONFIG: """ return self._config + def input_required(self, input_name: str): + + if input_name not in self._input_schemas.keys(): + raise Exception(f"No input '{input_name}' for module '{self.id}'.") + + if not self._input_schemas[input_name].is_required(): + return False + + if input_name in self.get_config_value("constants"): + return False + else: + return True + def get_config_value(self, key: str) -> typing.Any: """Retrieve the value for a specific configuration option. @@ -370,6 +383,7 @@ def input_schemas(self) -> typing.Mapping[str, ValueSchema]: result = {} for k, v in _input_schemas.items(): + if isinstance(v, ValueSchema): result[k] = v elif isinstance(v, typing.Mapping): @@ -380,6 +394,23 @@ def input_schemas(self) -> typing.Mapping[str, ValueSchema]: raise Exception( f"Invalid return type when tryping to create schema for '{self.id}': {type(v)}" ) + default_value = self.config.defaults.get(k, None) + constant_value = self.config.constants.get(k, None) + + # value_to_test = None + if default_value is not None and constant_value is not None: + raise Exception( + f"Module configuration error. Value '{k}' set in both 'constants' and 'defaults', this is not allowed." + ) + # elif default_value is not None: + # value_to_test = default_value + # elif constant_value is not None: + # value_to_test = constant_value + + # TODO: perform validation for constants/defaults + + if default_value is not None: + result[k].default = default_value self._input_schemas = result @@ -478,6 +509,10 @@ def clean_value(v: typing.Any) -> typing.Any: for k, v in inputs.items(): v = clean_value(v) if not isinstance(v, Value): + if k not in self.input_schemas.keys(): + raise Exception( + f"Invalid input name '{k}. Not part of the schema, allowed input names: {', '.join(self.input_names)}" + ) schema = self.input_schemas[k] v = NonRegistryValue( _init_value=v, # type: ignore @@ -590,8 +625,11 @@ def __rich_console__( config_str = json.dumps(config, indent=2) c = Syntax(config_str, "json", background_color="default") table.add_row("config", c) + + constants = self.config.get("constants") + inputs_table = create_table_from_field_schemas( - _show_header=True, **self.input_schemas + _show_header=True, _constants=constants, **self.input_schemas ) table.add_row("inputs", inputs_table) outputs_table = create_table_from_field_schemas( diff --git a/src/kiara/module_config.py b/src/kiara/module_config.py index 40e08ea4d..eec0d3fd8 100644 --- a/src/kiara/module_config.py +++ b/src/kiara/module_config.py @@ -21,16 +21,20 @@ def create_step_value_address( value_address_config: typing.Union[str, typing.Mapping[str, typing.Any]], - field_name: str, + default_field_name: str, ) -> StepValueAddress: + if isinstance(value_address_config, StepValueAddress): + return value_address_config + sub_value: typing.Optional[typing.Mapping[str, typing.Any]] = None + if isinstance(value_address_config, str): tokens = value_address_config.split(".") if len(tokens) == 1: step_id = value_address_config - output_name = field_name + output_name = default_field_name elif len(tokens) == 2: step_id = tokens[0] output_name = tokens[1] @@ -45,6 +49,10 @@ def create_step_value_address( step_id = value_address_config["step_id"] output_name = value_address_config["output_name"] sub_value = value_address_config.get("sub_value", None) + else: + raise TypeError( + f"Invalid type for creating step value address: {type(value_address_config)}" + ) if sub_value is not None and not isinstance(sub_value, typing.Mapping): raise ValueError( @@ -57,6 +65,30 @@ def create_step_value_address( return input_link +def ensure_step_value_addresses( + link: typing.Union[str, typing.Mapping, typing.Iterable], default_field_name: str +) -> typing.List[StepValueAddress]: + + if isinstance(link, (str, typing.Mapping)): + input_links: typing.List[StepValueAddress] = [ + create_step_value_address( + value_address_config=link, default_field_name=default_field_name + ) + ] + + elif isinstance(link, typing.Iterable): + input_links = [] + for o in link: + il = create_step_value_address( + value_address_config=o, default_field_name=default_field_name + ) + input_links.append(il) + else: + raise TypeError(f"Can't parse input map, invalid type for output: {link}") + + return input_links + + class PipelineStepConfig(BaseModel): """A class to hold the configuration of one module within a [PipelineModule][kiara.pipeline.module.PipelineModule].""" @@ -81,42 +113,45 @@ def ensure_input_links_valid(cls, v): result = {} for input_name, output in v.items(): - if isinstance(output, (str, typing.Mapping)): - input_links = [ - create_step_value_address( - value_address_config=output, field_name=input_name - ) - ] - - elif isinstance(output, collections.abc.Sequence): - input_links = [] - for o in output: - il = create_step_value_address( - value_address_config=o, field_name=input_name - ) - input_links.append(il) - else: - raise TypeError( - f"Can't parse input map, invalid type for output: {output}" - ) - + input_links = ensure_step_value_addresses( + default_field_name=input_name, link=output + ) result[input_name] = input_links return result +class PipelineStructureConfig(BaseModel): + + parent_id: str = Field(description="The id of the parent of this structure.") + steps: typing.List[PipelineStepConfig] + input_aliases: typing.Union[None, str, typing.Dict[str, str]] = None + output_aliases: typing.Union[None, str, typing.Dict[str, str]] = None + + class KiaraModuleConfig(BaseModel): - """Base class that describes the configuration a [KiaraModule][kiara.module.KiaraModule] class accepts. + """Base class that describes the configuration a [``KiaraModule``][kiara.module.KiaraModule] class accepts. This is stored in the ``_config_cls`` class attribute in each ``KiaraModule`` class. By default, such a ``KiaraModule`` is not configurable. + There are two config options every ``KiaraModule`` supports: + + - ``constants``, and + - ``defaults`` + + Constants are pre-set inputs, and users can't change them and an error is thrown if they try. Defaults are default + values that override the schema defaults, and those can be overwritten by users. If both a constant and a default + value is set for an input field, an error is thrown. """ _config_hash: str = PrivateAttr(default=None) constants: typing.Dict[str, typing.Any] = Field( default_factory=dict, description="Value constants for this module." ) + defaults: typing.Dict[str, typing.Any] = Field( + default_factory=dict, description="Value defaults for this module." + ) class Config: extra = Extra.forbid @@ -267,9 +302,7 @@ def create_structure( ps = PipelineStructure( parent_id=parent_id, - steps=self.steps, - input_aliases=self.input_aliases, - output_aliases=self.output_aliases, + config=self, kiara=kiara, ) return ps @@ -277,7 +310,6 @@ def create_structure( def create_pipeline( self, parent_id: typing.Optional[str] = None, - constants: typing.Optional[typing.Mapping[str, typing.Any]] = None, controller: typing.Optional["PipelineController"] = None, kiara: typing.Optional["Kiara"] = None, ): @@ -290,7 +322,6 @@ def create_pipeline( pipeline = Pipeline( structure=structure, - constants=constants, controller=controller, ) return pipeline diff --git a/src/kiara/modules/metadata.py b/src/kiara/modules/metadata.py new file mode 100644 index 000000000..55f5cfeee --- /dev/null +++ b/src/kiara/modules/metadata.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +import abc +import typing +from pydantic import BaseModel, Field + +from kiara import KiaraModule +from kiara.data import Value, ValueSet +from kiara.data.values import ValueSchema +from kiara.exceptions import KiaraProcessingException +from kiara.module_config import KiaraModuleConfig + + +class MetadataModuleConfig(KiaraModuleConfig): + + type: str = Field(description="The data type this module will be used for.") + + +class ExtractMetadataModule(KiaraModule): + """Extract metadata for the 'table' type.""" + + _config_cls = MetadataModuleConfig + + @classmethod + @abc.abstractmethod + def _get_supported_types(self) -> typing.Union[str, typing.Iterable[str]]: + pass + + @classmethod + def get_metadata_key(cls) -> str: + return cls._module_type_name # type: ignore + + @classmethod + def get_supported_value_types(cls) -> typing.Set[str]: + _types = cls._get_supported_types() + if isinstance(_types, str): + _types = [_types] + + return set(_types) + + def __init__(self, *args, **kwargs): + + self._metadata_schema: typing.Optional[str] = None + super().__init__(*args, **kwargs) + + @property + def value_type(self) -> str: + data_type = self.get_config_value("type") + sup_types = self.get_supported_value_types() + if "*" not in sup_types and data_type not in sup_types: + raise ValueError( + f"Invalid module configuration, type '{data_type}' not supported. Supported types: {', '.join(self.get_supported_value_types())}." + ) + + return data_type + + @property + def metadata_schema(self) -> str: + if self._metadata_schema is not None: + return self._metadata_schema + + schema = self._get_metadata_schema(type=self.value_type) + if isinstance(schema, type) and issubclass(schema, BaseModel): + schema = schema.schema_json() + elif not isinstance(schema, str): + raise TypeError(f"Invalid type for metadata schema: {type(schema)}") + + self._metadata_schema = schema + return self._metadata_schema + + @abc.abstractmethod + def _get_metadata_schema( + self, type: str + ) -> typing.Union[str, typing.Type[BaseModel]]: + """Create the metadata schema for the configured type.""" + + @abc.abstractmethod + def extract_metadata(self, value: Value) -> typing.Mapping[str, typing.Any]: + pass + + def create_input_schema( + self, + ) -> typing.Mapping[ + str, typing.Union[ValueSchema, typing.Mapping[str, typing.Any]] + ]: + + inputs = { + "value": { + "type": self.value_type, + "doc": f"A value of type '{self.value_type}'", + "optional": False, + } + } + return inputs + + def create_output_schema( + self, + ) -> typing.Mapping[ + str, typing.Union[ValueSchema, typing.Mapping[str, typing.Any]] + ]: + outputs = { + "metadata": {"type": "dict", "doc": "The metadata for the provided value."}, + "metadata_schema": { + "type": "string", + "doc": "The (json) schema for the metadata.", + }, + } + + return outputs + + def process(self, inputs: ValueSet, outputs: ValueSet) -> None: + + value = inputs.get_value_obj("value") + if value.value_schema.type != self.value_type: + raise KiaraProcessingException( + f"Can't extract metadata for value of type '{value.value_schema.type}'. Expected type '{self.value_type}'." + ) + + outputs.set_value("metadata_schema", self.metadata_schema) + metadata = self.extract_metadata(value) + # TODO: validate metadata? + outputs.set_value("metadata", metadata) + + +class ExtractPythonClass(ExtractMetadataModule): + @classmethod + def _get_supported_types(cls) -> typing.Union[str, typing.Iterable[str]]: + return "*" + + @classmethod + def get_metadata_key(cls) -> str: + return "python_cls" + + def _get_metadata_schema( + self, type: str + ) -> typing.Union[str, typing.Type[BaseModel]]: + class PythonClassModel(BaseModel): + class_name: str = Field(description="The name of the Python class") + module_name: str = Field( + description="The name of the Python module this class lives in." + ) + full_name: str = Field(description="The full class namespace.") + + return PythonClassModel + + def extract_metadata(self, value: Value) -> typing.Mapping[str, typing.Any]: + + item = value.get_value_data() + cls = item.__class__ + + return { + "class_name": cls.__name__, + "module_name": cls.__module__, + "full_name": f"{cls.__module__}.{cls.__name__}", + } diff --git a/src/kiara/modules/type_conversion.py b/src/kiara/modules/type_conversion.py new file mode 100644 index 000000000..e1e36591d --- /dev/null +++ b/src/kiara/modules/type_conversion.py @@ -0,0 +1,128 @@ +# -*- coding: utf-8 -*- +import abc +import typing +from pydantic import Field + +from kiara import KiaraModule +from kiara.data.values import Value, ValueSchema, ValueSet +from kiara.exceptions import KiaraProcessingException +from kiara.module_config import KiaraModuleConfig + + +class TypeConversionModuleConfig(KiaraModuleConfig): + + source_type: str = Field(description="The source type.") + target_type: str = Field(description="The target type.") + + +class TypeConversionModule(KiaraModule): + + _config_cls = TypeConversionModuleConfig + + @classmethod + @abc.abstractmethod + def _get_supported_source_types(self) -> typing.Union[typing.Iterable[str], str]: + pass + + @classmethod + @abc.abstractmethod + def _get_target_types(self) -> typing.Union[typing.Iterable[str], str]: + pass + + @classmethod + def get_supported_source_types(self) -> typing.Set[str]: + + _types: typing.Iterable[str] = self._get_supported_source_types() + if isinstance(_types, str): + _types = [_types] + + if "config" in _types: + raise Exception("Invalid source type, type name 'config' is invalid.") + return set(_types) + + @classmethod + def get_supported_target_types(self) -> typing.Set[str]: + + _types: typing.Iterable[str] = self._get_target_types() + if isinstance(_types, str): + _types = [_types] + return set(_types) + + def __init__(self, *args, **kwargs): + + super().__init__(*args, **kwargs) + + @property + def source_type(self) -> str: + data_type = self.get_config_value("source_type") + supported = self.get_supported_source_types() + if "*" not in supported and data_type not in supported: + raise ValueError( + f"Invalid module configuration, source type '{data_type}' not supported. Supported types: {', '.join(self.get_supported_source_types())}." + ) + + return data_type + + @property + def target_type(self) -> str: + data_type = self.get_config_value("target_type") + if data_type not in self.get_supported_target_types(): + raise ValueError( + f"Invalid module configuration, target type '{data_type}' not supported. Supported types: {', '.join(self.get_supported_target_types())}." + ) + + return data_type + + def create_input_schema( + self, + ) -> typing.Mapping[ + str, typing.Union[ValueSchema, typing.Mapping[str, typing.Any]] + ]: + + inputs: typing.Mapping[str, typing.Any] = { + "source_value": { + "type": self.source_type, + "doc": f"A value of type '{self.source_type}'.", + }, + "config": { + "type": "dict", + "doc": "The configuration for the transformation.", + "optional": True, + }, + } + + return inputs + + def create_output_schema( + self, + ) -> typing.Mapping[ + str, typing.Union[ValueSchema, typing.Mapping[str, typing.Any]] + ]: + outputs = { + "target_value": { + "type": self.target_type, + "doc": f"A value of type '{self.target_type}'.", + } + } + return outputs + + def process(self, inputs: ValueSet, outputs: ValueSet) -> None: + + value = inputs.get_value_obj("source_value") + if value.value_schema.type != self.source_type: + raise KiaraProcessingException( + f"Can't convert value of source type '{value.value_schema.type}'. Expected type '{self.source_type}'." + ) + config = inputs.get_value_data("config") + if config is None: + config = {} + + target_value = self.convert(value=value, config=config) + # TODO: validate value? + outputs.set_value("target_value", target_value) + + @abc.abstractmethod + def convert( + self, value: Value, config: typing.Mapping[str, typing.Any] + ) -> typing.Any: + pass diff --git a/src/kiara/pipeline/module.py b/src/kiara/pipeline/module.py index 3f3bb0725..c829be530 100644 --- a/src/kiara/pipeline/module.py +++ b/src/kiara/pipeline/module.py @@ -59,7 +59,6 @@ def __init__( if controller is None: controller = BatchController() - self._pipeline_structure: typing.Optional[PipelineStructure] = None self._pipeline_controller: PipelineController = controller super().__init__( id=id, @@ -68,21 +67,23 @@ def __init__( meta=meta, kiara=kiara, ) + self._pipeline_structure: PipelineStructure = self._create_structure() + assert not self._config.constants + self._config.constants = dict(self._pipeline_structure.constants) @property def structure(self) -> PipelineStructure: """The ``PipelineStructure`` of this module.""" - if self._pipeline_structure is None: - self._pipeline_structure = PipelineStructure( - parent_id=self.full_id, - steps=self._config.steps, - input_aliases=self._config.input_aliases, - output_aliases=self._config.output_aliases, - kiara=self._kiara, - ) return self._pipeline_structure + def _create_structure(self) -> PipelineStructure: + + pipeline_structure = PipelineStructure( + parent_id=self.full_id, config=self.config, kiara=self._kiara + ) + return pipeline_structure + def create_input_schema(self) -> typing.Mapping[str, ValueSchema]: return self.structure.pipeline_input_schema diff --git a/src/kiara/pipeline/pipeline.py b/src/kiara/pipeline/pipeline.py index 845005b8d..054668f72 100644 --- a/src/kiara/pipeline/pipeline.py +++ b/src/kiara/pipeline/pipeline.py @@ -58,7 +58,7 @@ class Pipeline(object): def __init__( self, structure: PipelineStructure, - constants: typing.Optional[typing.Mapping[str, typing.Any]] = None, + # constants: typing.Optional[typing.Mapping[str, typing.Any]] = None, controller: typing.Optional[PipelineController] = None, ): @@ -75,10 +75,6 @@ def __init__( self._kiara: Kiara = self._structure._kiara - if constants is None: - constants = {} - self._constants: typing.Mapping[str, typing.Any] = constants - self._data_registry: DataRegistry = self._kiara.data_registry self._init_values() @@ -226,15 +222,26 @@ def _init_values(self): # if the pipeline input wasn't created by another step input before, # we need to take care of it here - constant = self._constants.get( - connected_pipeline_input_name, None - ) + if pipeline_input_field.is_constant: + init_value = self.structure.constants[ + pipeline_input_field.value_name + ] + origin = f"pipeline_input:{self.structure.pipeline_id}.{input_name} (constant)" + else: + init_value = self.structure.defaults.get( + pipeline_input_field.value_name, None + ) + if init_value is not None: + origin = f"pipeline_input:{self.structure.pipeline_id}.{input_name} (default)" + else: + origin = f"pipeline_input:{self.structure.pipeline_id}.{input_name}" + pipeline_input = self._data_registry.register_value( value_schema=pipeline_input_field.value_schema, value_fields=pipeline_input_field, - is_constant=False if constant is None else True, - initial_value=constant, - origin=f"pipeline_input:{self.structure.pipeline_id}.{input_name}", + is_constant=pipeline_input_field.is_constant, + initial_value=init_value, + origin=origin, ) self._data_registry.register_callback( self.values_updated, pipeline_input diff --git a/src/kiara/pipeline/structure.py b/src/kiara/pipeline/structure.py index 7c103254f..b348e6a68 100644 --- a/src/kiara/pipeline/structure.py +++ b/src/kiara/pipeline/structure.py @@ -2,9 +2,10 @@ import networkx as nx import typing import uuid +from bidict import frozenbidict from functools import lru_cache from networkx import NetworkXNoPath, NodeNotFound -from pydantic import BaseModel, Extra, Field, PrivateAttr +from pydantic import BaseModel, Extra, Field, PrivateAttr, validator from rich import box from rich.console import Console, ConsoleOptions, RenderGroup, RenderResult from rich.markdown import Markdown @@ -22,10 +23,12 @@ ) from kiara.defaults import DEFAULT_NO_DESC_VALUE, PIPELINE_PARENT_MARKER, SpecialValue from kiara.module import KiaraModule +from kiara.pipeline.utils import create_pipeline_structure_desc, extend_pipeline if typing.TYPE_CHECKING: from kiara.kiara import Kiara - from kiara.module_config import PipelineStepConfig + from kiara.module_config import PipelineModuleConfig, PipelineStepConfig + from kiara.pipeline.pipeline import Pipeline class PipelineStep(BaseModel): @@ -62,6 +65,15 @@ def create_steps( _module: typing.Optional[KiaraModule] = PrivateAttr(default=None) + @validator("step_id") + def _validate_step_id(cls, v): + + assert isinstance(v, str) + if "." in v: + raise ValueError("Step ids can't contain '.' characters.") + + return v + step_id: str parent_id: str module_type: str = Field(description="The module type.") @@ -235,13 +247,16 @@ class PipelineStructure(object): def __init__( self, parent_id: str, - steps: typing.Iterable["PipelineStepConfig"], - input_aliases: typing.Union[str, typing.Mapping[str, str]] = None, - output_aliases: typing.Union[str, typing.Mapping[str, str]] = None, - add_all_workflow_outputs: bool = False, + config: "PipelineModuleConfig", kiara: typing.Optional["Kiara"] = None, ): + self._structure_config: "PipelineModuleConfig" = config + + steps = self._structure_config.steps + input_aliases = self._structure_config.input_aliases + output_aliases = self._structure_config.output_aliases + if not steps: raise Exception("No steps provided.") @@ -276,12 +291,16 @@ def __init__( self._steps, output_aliases, "outputs" ) - self._input_aliases: typing.Mapping[str, str] = input_aliases # type: ignore + self._input_aliases: frozenbidict[str, str] = frozenbidict(input_aliases) # type: ignore if output_aliases is None: output_aliases = {} - self._output_aliases: typing.Mapping[str, str] = output_aliases # type: ignore + self._output_aliases: frozenbidict[str, str] = frozenbidict(output_aliases) # type: ignore - self._add_all_workflow_outputs: bool = add_all_workflow_outputs + # this is hardcoded for now + self._add_all_workflow_outputs: bool = False + + self._constants: typing.Dict[str, typing.Any] = None # type: ignore + self._defaults: typing.Dict[str, typing.Any] = None # type: ignore self._execution_graph: nx.DiGraph = None # type: ignore self._data_flow_graph: nx.DiGraph = None # type: ignore @@ -296,6 +315,10 @@ def __init__( def pipeline_id(self) -> str: return self._pipeline_id + @property + def structure_config(self) -> "PipelineModuleConfig": + return self._structure_config + @property def steps(self) -> typing.Iterable[PipelineStep]: return self._steps @@ -317,6 +340,20 @@ def step_ids(self) -> typing.Iterable[str]: self._process_steps() return self._steps_details.keys() + @property + def constants(self) -> typing.Mapping[str, typing.Any]: + + if self._constants is None: + self._process_steps() + return self._constants + + @property + def defaults(self) -> typing.Mapping[str, typing.Any]: + + if self._defaults is None: + self._process_steps() + return self._defaults + def get_step(self, step_id: str) -> PipelineStep: d = self.steps_details.get(step_id, None) @@ -436,6 +473,8 @@ def _process_steps(self): data_flow_graph = nx.DiGraph() data_flow_graph_simple = nx.DiGraph() processing_stages = [] + constants = {} + structure_defaults = {} # temp variable, to hold all outputs outputs: typing.Dict[str, StepOutputField] = {} @@ -518,9 +557,16 @@ def _process_steps(self): other_step_dependency: typing.Set = set() # go through all the inputs of a module, create input points and connect them to either # other module outputs, or pipeline inputs (which need to be created) + + module_constants: typing.Mapping[ + str, typing.Any + ] = step.module.get_config_value("constants") + for input_name, schema in step.module.input_schemas.items(): matching_input_links: typing.List[StepValueAddress] = [] + is_constant = input_name in module_constants.keys() + for value_name, input_links in step.input_links.items(): if value_name == input_name: for input_link in input_links: @@ -541,7 +587,7 @@ def _process_steps(self): if output_id not in outputs.keys(): raise Exception( - f"Can't connect input '{input_name}' for step '{step.step_id}': no output '{output_id}' available." + f"Can't connect input '{input_name}' for step '{step.step_id}': no output '{output_id}' available. Available output names: {', '.join(outputs.keys())}" ) connected_output_points.append(outputs[output_id]) connected_outputs.append(input_link) @@ -553,6 +599,7 @@ def _process_steps(self): pipeline_id=self._pipeline_id, value_name=input_name, value_schema=schema, + is_constant=is_constant, connected_pipeline_input=None, connected_outputs=connected_outputs, ) @@ -572,6 +619,7 @@ def _process_steps(self): pipeline_input_name = generate_pipeline_endpoint_name( step_id=step.step_id, value_name=input_name ) + # check whether this input has an alias associated with it if self._input_aliases: if pipeline_input_name in self._input_aliases.keys(): # this means we use the pipeline alias @@ -585,12 +633,14 @@ def _process_steps(self): connected_pipeline_input = existing_pipeline_input_points[ pipeline_input_name ] + assert connected_pipeline_input.is_constant == is_constant else: # we need to create the pipeline input connected_pipeline_input = PipelineInputField( value_name=pipeline_input_name, value_schema=schema, pipeline_id=self._pipeline_id, + is_constant=is_constant, ) existing_pipeline_input_points[ @@ -603,6 +653,20 @@ def _process_steps(self): data_flow_graph_simple.add_node( connected_pipeline_input, type=PipelineInputField.__name__ ) + if is_constant: + constants[ + pipeline_input_name + ] = step.module.get_config_value("constants")[input_name] + + default_val = step.module.get_config_value("defaults").get( + input_name, None + ) + if is_constant and default_val is not None: + raise Exception( + f"Module config invalid for step '{step.step_id}': both default value and constant provided for input '{input_name}'." + ) + elif default_val is not None: + structure_defaults[pipeline_input_name] = default_val step_input_point = StepInputField( step_id=step.step_id, @@ -652,6 +716,8 @@ def _process_steps(self): steps_details[_step_id]["processing_stage"] = i steps_details[_step_id]["step"].processing_stage = i + self._constants = constants + self._defaults = structure_defaults self._steps_details = steps_details self._execution_graph = execution_graph self._data_flow_graph = data_flow_graph @@ -716,64 +782,24 @@ def _process_steps(self): if optional: inp.value_schema.optional = True - def to_details(self) -> "PipelineStructureDesc": - - steps = {} - workflow_inputs: typing.Dict[str, typing.List[str]] = {} - workflow_outputs: typing.Dict[str, str] = {} - - for m_id, details in self.steps_details.items(): - - step = details["step"] - - input_connections: typing.Dict[str, typing.List[str]] = {} - for k, v in details["inputs"].items(): - - if v.connected_pipeline_input is not None: - connected_item = v.connected_pipeline_input - input_connections[k] = [ - generate_step_alias(PIPELINE_PARENT_MARKER, connected_item) - ] - workflow_inputs.setdefault(f"{connected_item}", []).append(v.alias) - elif v.connected_outputs is not None: - assert len(v.connected_outputs) > 0 - for co in v.connected_outputs: - input_connections.setdefault(k, []).append(co.alias) - else: - raise TypeError(f"Invalid connection type: {type(connected_item)}") - - output_connections: typing.Dict[str, typing.Any] = {} - for k, v in details["outputs"].items(): - for connected_item in v.connected_inputs: + def extend( + self, + other: typing.Union[ + "Pipeline", + "PipelineStructure", + "PipelineModuleConfig", + typing.Mapping[str, typing.Any], + ], + input_links: typing.Optional[ + typing.Mapping[str, typing.Iterable[StepValueAddress]] + ] = None, + ) -> "PipelineStructure": + + return extend_pipeline(self, other) - output_connections.setdefault(k, []).append( - generate_step_alias( - connected_item.step_id, connected_item.value_name - ) - ) - if v.pipeline_output: - output_connections.setdefault(k, []).append( - generate_step_alias(PIPELINE_PARENT_MARKER, v.pipeline_output) - ) - workflow_outputs[v.pipeline_output] = v.alias - - steps[step.step_id] = StepDesc( - step=step, - processing_stage=details["processing_stage"], - input_connections=input_connections, - output_connections=output_connections, - required=step.required, - ) + def to_details(self) -> "PipelineStructureDesc": - return PipelineStructureDesc( - pipeline_id=self._pipeline_id, - steps=steps, - processing_stages=self.processing_stages, - pipeline_input_connections=workflow_inputs, - pipeline_output_connections=workflow_outputs, - pipeline_inputs=self.pipeline_inputs, - pipeline_outputs=self.pipeline_outputs, - ) + return create_pipeline_structure_desc(self) def __rich_console__( self, console: Console, options: ConsoleOptions diff --git a/src/kiara/pipeline/utils.py b/src/kiara/pipeline/utils.py new file mode 100644 index 000000000..a1987226f --- /dev/null +++ b/src/kiara/pipeline/utils.py @@ -0,0 +1,211 @@ +# -*- coding: utf-8 -*- +import typing +from bidict import bidict + +from kiara.data.values import StepValueAddress, generate_step_alias +from kiara.defaults import PIPELINE_PARENT_MARKER + +if typing.TYPE_CHECKING: + from kiara.module_config import PipelineModuleConfig + from kiara.pipeline.pipeline import Pipeline + from kiara.pipeline.structure import PipelineStructure, PipelineStructureDesc + + +def create_pipeline_structure_desc( + pipeline: typing.Union["Pipeline", "PipelineStructure"] +) -> "PipelineStructureDesc": + + from kiara.pipeline.pipeline import Pipeline + from kiara.pipeline.structure import ( + PipelineStructure, + PipelineStructureDesc, + StepDesc, + ) + + if isinstance(pipeline, Pipeline): + structure: PipelineStructure = pipeline.structure + elif isinstance(pipeline, PipelineStructure): + structure = pipeline + + steps = {} + workflow_inputs: typing.Dict[str, typing.List[str]] = {} + workflow_outputs: typing.Dict[str, str] = {} + + for m_id, details in structure.steps_details.items(): + + step = details["step"] + + input_connections: typing.Dict[str, typing.List[str]] = {} + for k, v in details["inputs"].items(): + + if v.connected_pipeline_input is not None: + connected_item = v.connected_pipeline_input + input_connections[k] = [ + generate_step_alias(PIPELINE_PARENT_MARKER, connected_item) + ] + workflow_inputs.setdefault(f"{connected_item}", []).append(v.alias) + elif v.connected_outputs is not None: + assert len(v.connected_outputs) > 0 + for co in v.connected_outputs: + input_connections.setdefault(k, []).append(co.alias) + else: + raise TypeError(f"Invalid connection type: {type(connected_item)}") + + output_connections: typing.Dict[str, typing.Any] = {} + for k, v in details["outputs"].items(): + for connected_item in v.connected_inputs: + + output_connections.setdefault(k, []).append( + generate_step_alias( + connected_item.step_id, connected_item.value_name + ) + ) + if v.pipeline_output: + output_connections.setdefault(k, []).append( + generate_step_alias(PIPELINE_PARENT_MARKER, v.pipeline_output) + ) + workflow_outputs[v.pipeline_output] = v.alias + + steps[step.step_id] = StepDesc( + step=step, + processing_stage=details["processing_stage"], + input_connections=input_connections, + output_connections=output_connections, + required=step.required, + ) + + return PipelineStructureDesc( + pipeline_id=structure._pipeline_id, + steps=steps, + processing_stages=structure.processing_stages, + pipeline_input_connections=workflow_inputs, + pipeline_output_connections=workflow_outputs, + pipeline_inputs=structure.pipeline_inputs, + pipeline_outputs=structure.pipeline_outputs, + ) + + +def extend_pipeline( + pipeline: typing.Union["Pipeline", "PipelineStructure"], + other: typing.Union[ + "Pipeline", + "PipelineStructure", + "PipelineModuleConfig", + typing.Mapping[str, typing.Any], + ], + input_links: typing.Optional[ + typing.Mapping[str, typing.Iterable[StepValueAddress]] + ] = None, +): + + from kiara.module_config import PipelineModuleConfig + from kiara.pipeline.pipeline import Pipeline + from kiara.pipeline.structure import PipelineStructure + + if isinstance(pipeline, Pipeline): + structure: PipelineStructure = pipeline.structure + elif isinstance(pipeline, PipelineStructure): + structure = pipeline + + other_pipeline_config: typing.Optional[PipelineModuleConfig] = None + + other_name = "extended" + + if isinstance(other, typing.Mapping): + other_pipeline_config = PipelineModuleConfig(**other) + elif isinstance(other, PipelineModuleConfig): + other_pipeline_config = other + elif isinstance(other, PipelineStructure): + other_pipeline_config = other.structure_config + other_name = other.pipeline_id + + if other_pipeline_config is None: + from kiara.pipeline.pipeline import Pipeline + + if isinstance(other, Pipeline): + other_pipeline_config = other.structure.structure_config + + if other_pipeline_config is None: + raise TypeError( + f"Can't extend pipeline structure, invalid type: {type(other)}." + ) + + other_structure: PipelineStructure = PipelineStructure( + parent_id="_", config=other_pipeline_config, kiara=structure._kiara + ) + + step_id_overlap = [ + el for el in set(structure.step_ids) if el in other_structure.step_ids + ] + if step_id_overlap: + raise Exception( + f"Can't extend pipeline, duplicate step id(s) are not allowed: {', '.join(step_id_overlap)}." + ) + + if input_links is None: + input_links = {} + else: + input_links = dict(input_links) + + full_input_links: typing.Dict[ + str, typing.Dict[str, typing.Iterable[StepValueAddress]] + ] = {} + for input_name, input in other_structure.pipeline_inputs.items(): + if input_name not in input_links.keys(): + # this means we try to see whether there is an output in this structure with the same name + if input_name in structure.pipeline_outputs.keys(): + output_step_address: typing.Iterable[StepValueAddress] = [ + structure.pipeline_outputs[input_name].connected_output + ] + else: + # output_step_address = "NEW INPUT" + raise NotImplementedError() + else: + output_step_address = input_links[input_name] + + connected_inputs = other_structure.pipeline_inputs[input_name].connected_inputs + if len(connected_inputs) != 1: + raise NotImplementedError() + else: + connected_input = connected_inputs[0] + full_input_links.setdefault(connected_input.step_id, {})[ + connected_input.value_name + ] = output_step_address + + new_input_aliases = bidict(structure._input_aliases) + if not other_structure._output_aliases: + new_output_aliases: typing.Union[str, typing.Mapping[str, str]] = "auto" + else: + new_output_aliases = bidict(other_structure._output_aliases) + + config = structure.structure_config.dict( + exclude={"input_aliases", "output_aliases", "steps"} + ) + config["input_aliases"] = new_input_aliases + config["output_aliases"] = new_output_aliases + + new_steps = [ + step.dict(exclude={"parent_id", "processing_stage", "required"}) + for step in structure.steps + ] + + for step in other_structure.steps: + step_dict = step.dict(exclude={"parent_id", "processing_stage", "required"}) + if step.step_id in full_input_links.keys(): + if step.step_id not in full_input_links.keys(): + new_steps.append(step_dict) + else: + for input_name in full_input_links[step.step_id].keys(): + if input_name in step_dict["input_links"].keys(): + raise NotImplementedError() + step_dict["input_links"][input_name] = full_input_links[ + step.step_id + ][input_name] + new_steps.append(step_dict) + + config["steps"] = new_steps + pmc = PipelineModuleConfig(**config) + new_structure = pmc.create_structure( + f"{structure.pipeline_id}_{other_name}", kiara=structure._kiara + ) + return new_structure diff --git a/src/kiara/profiles.py b/src/kiara/profiles.py new file mode 100644 index 000000000..c90bcf506 --- /dev/null +++ b/src/kiara/profiles.py @@ -0,0 +1,197 @@ +# -*- coding: utf-8 -*- +import typing +from pydantic import BaseModel, Extra, Field, PrivateAttr + +if typing.TYPE_CHECKING: + from kiara import Kiara + from kiara.module import KiaraModule + + +class ModuleProfileConfig(BaseModel): + class Config: + extra = Extra.forbid + validate_all = True + + _module: typing.Optional["KiaraModule"] = PrivateAttr(default=None) + module_type: str = Field(description="The module type.") + module_config: typing.Dict[str, typing.Any] = Field( + default_factory=dict, description="The configuration for the module." + ) + + def create_module(self, kiara: "Kiara"): + + if self._module is None: + self._module = kiara.create_module( + id=f"extract_metadata_{self.module_type}", + module_type=self.module_type, + module_config=self.module_config, + ) + return self._module + + +class TypeConversionProfileConfig(ModuleProfileConfig): + + convert_source_type: str = Field(description="The source type.") + convert_target_type: str = Field(description="The target type.") + doc: str = Field( + description="Documentation of what this profile does/is appropriate for.", + default="-- n/a --", + ) + + +class ExtractMetadataProfileConfig(ModuleProfileConfig): + + value_type: str = Field( + description="The type of the value to extract metadata from." + ) + + +class ModuleProfileMgmt(object): + def __init__(self, kiara: "Kiara"): + + self._kiara: "Kiara" = kiara + self._convert_profiles: typing.Dict[ + str, typing.Dict[str, TypeConversionProfileConfig] + ] = None # type: ignore + self._metadata_profiles: typing.Dict[ + str, typing.Dict[str, ExtractMetadataProfileConfig] + ] = None # type: ignore + + @property + def extract_metadata_profiles( + self, + ) -> typing.Mapping[str, typing.Mapping[str, ExtractMetadataProfileConfig]]: + + if self._metadata_profiles is not None: + return self._metadata_profiles + + from kiara.modules.metadata import ExtractMetadataModule + + all_metadata_profiles = {} + for module_type in self._kiara.available_module_types: + + cls = self._kiara.get_module_class(module_type=module_type) + + if issubclass(cls, ExtractMetadataModule): + value_types = cls.get_supported_value_types() + if "*" in value_types: + value_types = self._kiara._type_mgmt.value_type_names + metadata_key = cls.get_metadata_key() + + for value_type in value_types: + if ( + metadata_key + in all_metadata_profiles.setdefault(value_type, {}).keys() + ): + raise Exception( + f"Multiple profiles for type '{value_type}' and metadata key '{metadata_key}'. This is not allowed." + ) # yet, anyway + + mc = {"type": value_type} + all_metadata_profiles[value_type][ + metadata_key + ] = ExtractMetadataProfileConfig( + module_type=module_type, module_config=mc, value_type=value_type + ) + + if hasattr(cls, "_extract_metadata_profiles"): + profiles: typing.Mapping[str, typing.Mapping[str, typing.Any]] = cls._convert_profiles # type: ignore + for value_type, extract_details in profiles.items(): + for metadata_key, module_config in extract_details.items(): + if ( + metadata_key + in all_metadata_profiles.setdefault(value_type, {}).keys() + ): + raise Exception( + f"Multiple profiles for type '{value_type}' and metadata key '{metadata_key}'. This is not allowed." + ) # yet, anyway + all_metadata_profiles[value_type][ + metadata_key + ] = ExtractMetadataProfileConfig( + module_type=module_type, + module_config=module_config, + value_type=value_type, + ) + + self._metadata_profiles = all_metadata_profiles + return self._metadata_profiles + + @property + def type_convert_profiles( + self, + ) -> typing.Mapping[str, typing.Mapping[str, TypeConversionProfileConfig]]: + + if self._convert_profiles is not None: + return self._convert_profiles + + from kiara.modules.type_conversion import TypeConversionModule + + all_convert_profiles = {} + for module_type in self._kiara.available_module_types: + cls = self._kiara.get_module_class(module_type=module_type) + + if issubclass(cls, TypeConversionModule): + source_types = cls.get_supported_source_types() + if "*" in source_types: + source_types = self._kiara._type_mgmt.value_type_names + target_types = cls.get_supported_target_types() + + for source_type in source_types: + for target_type in target_types: + if ( + target_type + in all_convert_profiles.setdefault(source_type, {}).keys() + ): + raise Exception( + f"Multiple convert targets for '{source_type} -> {target_type}', this is not allowed." + ) # yet, anyway + mc = {"source_type": source_type, "target_type": target_type} + all_convert_profiles[source_type][ + target_type + ] = TypeConversionProfileConfig( + module_type=module_type, + module_config=mc, + convert_source_type=source_type, + convert_target_type=target_type, + ) + + if hasattr(cls, "_convert_profiles"): + profiles: typing.Mapping[str, typing.Mapping[str, typing.Any]] = cls._convert_profiles # type: ignore + for source_type, module_config in profiles.items(): + for target_type, details in module_config.items(): + if ( + target_type + in all_convert_profiles.setdefault(source_type, {}).keys() + ): + raise Exception( + f"Multiple convert targets for '{source_type} -> {target_type}', this is not allowed." + ) # yet, anyway + all_convert_profiles[source_type][ + target_type + ] = TypeConversionProfileConfig( + module_type=module_type, + module_config=module_config, + convert_source_type=source_type, + convert_target_type=target_type, + ) + + self._convert_profiles = all_convert_profiles + return self._convert_profiles + + def get_type_conversion_module( + self, source_type: str, target_type: str + ) -> "KiaraModule": + + all_source_profiles = self.type_convert_profiles.get(source_type, None) + if not all_source_profiles: + raise Exception( + f"No type conversion profiles for source type '{source_type}'." + ) + + convert_profile = all_source_profiles.get(target_type, None) + if not convert_profile: + raise Exception( + f"No target conversion profile '{target_type}' for source type '{source_type}' available." + ) + + return convert_profile.create_module(self._kiara) diff --git a/src/kiara/utils/__init__.py b/src/kiara/utils/__init__.py index 3380214a2..9667aa904 100644 --- a/src/kiara/utils/__init__.py +++ b/src/kiara/utils/__init__.py @@ -16,6 +16,7 @@ model_process_schema, ) from rich import box +from rich.console import ConsoleRenderable, RichCast from rich.table import Table from ruamel.yaml import YAML from types import ModuleType @@ -48,6 +49,10 @@ def log_message(msg: str): log.debug(msg) +def is_rich_renderable(item: typing.Any): + return isinstance(item, (ConsoleRenderable, RichCast, str)) + + def get_data_from_file( path: Union[str, Path], content_type: typing.Optional[str] = None ) -> typing.Any: @@ -160,6 +165,7 @@ def create_table_from_field_schemas( _add_default: bool = True, _add_required: bool = True, _show_header: bool = False, + _constants: typing.Optional[typing.Mapping[str, typing.Any]] = None, **fields: "ValueSchema", ): @@ -167,10 +173,14 @@ def create_table_from_field_schemas( table.add_column("Field name", style="i") table.add_column("Type") table.add_column("Description") + if _add_required: table.add_column("Required") if _add_default: - table.add_column("Default") + if _constants: + table.add_column("Default / Constant") + else: + table.add_column("Default") for field_name, schema in fields.items(): @@ -192,10 +202,17 @@ def create_table_from_field_schemas( row.append(req_str) if _add_default: - if schema.default in [None, SpecialValue.NO_VALUE, SpecialValue.NOT_SET]: - d = "-- no default --" + if _constants and field_name in _constants.keys(): + d = f"[b]{_constants[field_name]}[/b] (constant)" else: - d = str(schema.default) + if schema.default in [ + None, + SpecialValue.NO_VALUE, + SpecialValue.NOT_SET, + ]: + d = "-- no default --" + else: + d = str(schema.default) row.append(d) table.add_row(*row) diff --git a/src/kiara/utils/class_loading.py b/src/kiara/utils/class_loading.py index 0c5a8f251..e018e5145 100644 --- a/src/kiara/utils/class_loading.py +++ b/src/kiara/utils/class_loading.py @@ -185,6 +185,7 @@ def find_all_kiara_modules() -> typing.Dict[str, typing.Type["KiaraModule"]]: if isinstance(plugin.plugin, type) and issubclass(plugin.plugin, KiaraModule): ep = plugin.entry_point module_cls = ep.load() + setattr(module_cls, "_module_type_name", name) result_entrypoints[name] = module_cls elif ( isinstance(plugin.plugin, tuple) diff --git a/src/kiara/utils/output.py b/src/kiara/utils/output.py new file mode 100644 index 000000000..3e981c49b --- /dev/null +++ b/src/kiara/utils/output.py @@ -0,0 +1,178 @@ +# -*- coding: utf-8 -*- +import typing +from pyarrow import Table +from pydantic import BaseModel, Field, root_validator +from rich import box +from rich.console import RenderableType +from rich.table import Table as RichTable + +from kiara.utils import dict_from_cli_args + + +class OutputDetails(BaseModel): + @classmethod + def from_data(cls, data: typing.Any): + + if isinstance(data, str): + if "=" in data: + data = [data] + else: + data = [f"format={data}"] + + if isinstance(data, typing.Iterable): + data = list(data) + if len(data) == 1 and isinstance(data[0], str) and "=" not in data[0]: + data = [f"format={data[0]}"] + output_details_dict = dict_from_cli_args(*data) + else: + raise TypeError( + f"Can't parse output detail config: invalid input type '{type(data)}'." + ) + + output_details = OutputDetails(**output_details_dict) + return output_details + + format: str = Field(description="The output format.") + target: str = Field(description="The output target.") + config: typing.Dict[str, typing.Any] = Field( + description="Output configuration.", default_factory=dict + ) + + @root_validator(pre=True) + def _set_defaults(cls, values): + + target: str = values.pop("target", "terminal") + format: str = values.pop("format", None) + if format is None: + if target == "terminal": + format = "terminal" + else: + if target == "file": + format = "json" + else: + ext = target.split(".")[-1] + if ext in ["yaml", "json"]: + format = ext + else: + format = "json" + result = {"format": format, "target": target, "config": dict(values)} + + return result + + +def pretty_print_arrow_table( + table: Table, + rows_head: typing.Optional[int] = None, + rows_tail: typing.Optional[int] = None, + max_row_height: typing.Optional[int] = None, + max_cell_length: typing.Optional[int] = None, +) -> RenderableType: + + rich_table = RichTable(box=box.SIMPLE) + for cn in table.column_names: + rich_table.add_column(cn) + + num_split_rows = 1 + + if rows_head is not None: + + if rows_head < 0: + rows_head = 0 + + if rows_head > table.num_rows: + rows_head = table.num_rows + rows_tail = None + num_split_rows = 0 + + if rows_tail is not None: + if rows_head + rows_tail >= table.num_rows: # type: ignore + rows_head = table.num_rows + rows_tail = None + num_split_rows = 0 + else: + num_split_rows = 0 + + if rows_head is not None: + head = table.slice(0, rows_head) + num_rows = rows_head + else: + head = table + num_rows = table.num_rows + + table_dict = head.to_pydict() + for i in range(0, num_rows): + row = [] + for cn in table.column_names: + cell = table_dict[cn][i] + cell_str = str(cell) + if max_row_height and max_row_height > 0 and "\n" in cell_str: + lines = cell_str.split("\n") + if len(lines) > max_row_height: + if max_row_height == 1: + lines = lines[0:1] + else: + half = int(len(lines) / 2) + lines = lines[0:half] + [".."] + lines[-half:] + cell_str = "\n".join(lines) + + if max_cell_length and max_cell_length > 0: + lines = [] + for line in cell_str.split("\n"): + if len(line) > max_cell_length: + line = line[0:(max_cell_length)] + " ..." + else: + line = line + lines.append(line) + cell_str = "\n".join(lines) + + row.append(cell_str) + + rich_table.add_row(*row) + + if num_split_rows: + for i in range(0, num_split_rows): + row = [] + for _ in table.column_names: + row.append("...") + rich_table.add_row(*row) + + if rows_head: + if rows_tail is not None: + if rows_tail < 0: + rows_tail = 0 + + tail = table.slice(table.num_rows - rows_tail) + table_dict = tail.to_pydict() + for i in range(0, num_rows): + + row = [] + for cn in table.column_names: + cell = table_dict[cn][i] + cell_str = str(cell) + + if max_row_height and max_row_height > 0 and "\n" in cell_str: + lines = cell_str.split("\n") + if len(lines) > max_row_height: + if max_row_height == 1: + lines = lines[0:1] + else: + half = int(len(lines) / 2) + lines = lines[0:half] + [".."] + lines[-half:] + cell_str = "\n".join(lines) + + if max_cell_length and max_cell_length > 0: + lines = [] + for line in cell_str.split("\n"): + + if len(line) > max_cell_length: + line = line[0:(max_cell_length)] + " ..." + else: + line = line + lines.append(line) + cell_str = "\n".join(lines) + + row.append(cell_str) + + rich_table.add_row(*row) + + return rich_table diff --git a/src/kiara/utils/pretty_print.py b/src/kiara/utils/pretty_print.py deleted file mode 100644 index 46557930b..000000000 --- a/src/kiara/utils/pretty_print.py +++ /dev/null @@ -1,75 +0,0 @@ -# -*- coding: utf-8 -*- -import typing -from pyarrow import Table -from rich import box -from rich.console import RenderableType -from rich.table import Table as RichTable - - -def pretty_print_arrow_table( - table: Table, - num_head: typing.Optional[int] = None, - num_tail: typing.Optional[int] = None, -) -> RenderableType: - - rich_table = RichTable(box=box.SIMPLE) - for cn in table.column_names: - rich_table.add_column(cn) - - num_split_rows = 1 - - if num_head is not None: - - if num_head < 0: - num_head = 0 - - if num_head > table.num_rows: - num_head = table.num_rows - num_tail = None - num_split_rows = 0 - - if num_tail is not None: - if num_head + num_tail >= table.num_rows: # type: ignore - num_head = table.num_rows - num_tail = None - num_split_rows = 0 - else: - num_split_rows = 0 - - if num_head is not None: - head = table.slice(0, num_head) - num_rows = num_head - else: - head = table - num_rows = table.num_rows - - table_dict = head.to_pydict() - for i in range(0, num_rows): - row = [] - for cn in table.column_names: - row.append(str(table_dict[cn][i])) - - rich_table.add_row(*row) - - if num_split_rows: - for i in range(0, num_split_rows): - row = [] - for _ in table.column_names: - row.append("...") - rich_table.add_row(*row) - - if num_head: - if num_tail is not None: - if num_tail < 0: - num_tail = 0 - - tail = table.slice(table.num_rows - num_tail) - table_dict = tail.to_pydict() - for i in range(0, num_rows): - row = [] - for cn in table.column_names: - row.append(str(table_dict[cn][i])) - - rich_table.add_row(*row) - - return rich_table diff --git a/src/kiara/workflow.py b/src/kiara/workflow.py index b8427f1d1..a321a1f42 100644 --- a/src/kiara/workflow.py +++ b/src/kiara/workflow.py @@ -3,6 +3,7 @@ from rich import box from rich.console import Console, ConsoleOptions, RenderResult from rich.table import Table +from slugify import slugify from kiara.data.values import ValueSet from kiara.module_config import KiaraWorkflowConfig @@ -45,7 +46,9 @@ def __init__( "steps": [ { "module_type": self._workflow_config.module_type, - "step_id": self._workflow_config.module_type, + "step_id": slugify( + self._workflow_config.module_type, separator="_" + ), "module_config": self._workflow_config.module_config, } ],