{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "(sec-extend)=\n", "# Advanced: Extending lambeq\n", "\n", "In this tutorial you will find examples of how to extend `lambeq` to add more {term}`readers `, {term}`rewrite rules ` and {term}`ansätze `, so you can start making your own [contributions](https://github.com/CQCL/lambeq/pulls) to the toolkit.\n", "\n", "{download}`⬇️ Download code <../_code/extend-lambeq.ipynb>`" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating readers\n", "\n", "The {py:class}`.Reader` class is an abstract base class for converting sentences to diagrams. Each {term}`reader` can be seen as a different {term}`compositional model`, and `lambeq` can accommodate any compositional model that represents sentences in a {term}`string diagram`/{term}`tensor network` form.\n", "\n", "A concrete subclass of {py:class}`.Reader` should implement the {py:meth}`.Reader.sentence2diagram` method, which converts a single sentence into a rigid diagram.\n", "\n", "### Reader example: \"Comb\" reader\n", "\n", "In this example we will create a reader that, given a sentence, it generates the following tensor network:\n", "\n", "
\n", "\"drawing\"\n", "
\n", "\n", "Note that the particular compositional model is not appropriate for classical experiments, since the tensor that implements the layer can become very large for long sentences. However, the model can be implemented without problems on a quantum computer." ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import warnings\n", "warnings.filterwarnings('ignore')\n", "\n", "from lambeq import AtomicType, Reader\n", "from lambeq.backend.grammar import Box, Id, Word\n", "\n", "\n", "N = AtomicType.NOUN\n", "\n", "class CombReader(Reader):\n", " def sentence2diagram(self, sentence):\n", " words = Id().tensor(*[Word(w, N) for w in sentence.split()])\n", " layer = Box('LAYER', words.cod, N)\n", " return words >> layer\n", "\n", "diagram = CombReader().sentence2diagram('John gave Mary a flower')\n", "diagram.draw()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Note that, in the above code, the method {py:meth}`~lambeq.backend.grammar.Diagram.tensor` refers to the monoidal product and not to a physical tensor object. What the specific line does, using the monoidal identity {py:obj}`Id()` as a starting point, is to tensor one-by-one the boxes of the words in the sentence accumulatively, from left to right, into a single diagram, as in a standard fold operation.\n" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAAAgcAAABGCAYAAABYOjfbAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAD9hJREFUeJzt3QlsFFUcx/FXaS2HglpUCioi4gFaL5SIB6go3njHG+8jIHgEo0iC0WgUD5RGEW1UUDzAoxpPEKlBNAUVEU88AKNoARUBBaow5vtwNjO7S3fLTjuzO79Psuke7e70zcx7/3nv/94WOY7jGBEREZH/bebeEREREYGCAxEREfFRcCAiIiI+Cg5ERETER8GBiIiI+Cg4EBERER8FByIiIuKj4EBERER8FByIiIiIj4IDERER8VFwICIiIj4KDkRERMSn2P8wntauXWt++eUXe1u8eLH9uWTJErPVVluZjh07mvLy8sTPLbbYIuzNLRh859fKlSsT5e6W/YoVK0yHDh18Zc/jkpKSsDe5YKxfv94sW7bMd8zzE95y51ZWVmY220zXEUH5559/zK+//uo75nnctm3blPpmyy23NEVFRWFvcsFYtWpVyjG/fPlys9122/nKvby83JSWlpo4K45To+89ILzP/f77776/23zzzc22225rD5q//vrL9xona3Ll6T2oFERsvNFPLnfuJ5cvFSRlTHBGJerFPmmo3BVEbLzRT94H3P7999+U8sXSpUt9zxcXFycqzIaO/fbt28c6iEjX6KfbB8nly/FK48Q5Q2Ds1aZNm4zHvIKI9I1+un1AGSeXLxeB7JP6+nrfa2VlZRmP+UIOIory8Sub3UY/3c7P1Og3dIK5P7fZZpvEicbBlOlk52emIGJjn5VPQYTb6Gcqi401+tmcaG550Mj99ttvGT+LyjgOQURyo7+xcqE80jX6mRqX7bff3p4foJKsq6vL+FnZBhHJn5VvQQTlQblmOubTNfrJPWDpysXbM+M2cpk+q7FBhPsz34IIb6PfUH2frtHPdMy75eHWbbQX2VzQ1CcFEbQXmT4rH4OISAUHDTX63vtBNPpByyWIyObKoCmDiHSN/sb+j7///junRj9oQQURG9t2Kne30WzKRj+b7c+10Q9aLkGE22iGGUQ0Z6MftCCCiIa2vamDiEyNvns/10Y/aE4AQUSmIC4qQUTowcGJJ55oFi1aFNlGP4pBxBNPPGF23nnnnLbj008/NUOHDo1sox/FIGKfffYxEyZMyHlbHnnkEbsPo9roRzGIuPjii81VV12V87ZceOGFZu7cuZFt9KMSRLRu3Trx/z/44INm3333zWk7Fi5caPdhVBv9KAYRnTt3Nq+99lp8g4OWLVua3r17m6OPPjqvG/3mCCJo0CdOnGgrt4qKipzef+rUqeaYY44xV155pdl9993zttFvriDi1VdftQ0clVyurrnmGvPss8+aq6++Oq8b/eYKIsaOHWvOOeccU1lZmfNnEFRTxieffHJeN/rNEUR88803Zty4cWbKlCm2fs7FZ599ZoPr8847zwYa+droN1cQQf38wQcfmDVr1phYJySedtppZvDgwWFvRqRwstBoc3PNmjXLBgdBGj58uNlpp50Cfc98RuPAlTs3KjMXJ+lTTz0V2Od06tTJ3H777YG9XyEgKNpxxx3tzYvALEgExbfcckug75nvuBjo1q2bvbl+/PFHGxwEaciQIeaggw4K9D3zWVFRkQ1Kue21116++p/gIEzxDJMbUFNTY3cYMxVERCR6V9tXXHFFomeZ2QbXXntt2JtVcGIRHFx00UXmlFNOCXszRJrlWKfCTDc+P2jQIPsavyOSr9566y3z5JNP2vF4uuC9V9wSnFgEByJxQrf8c889Z1avXu0bFnnmmWdyHkJKTtYUaW7ff/+9zVUgV40EUhJXo6Q+KcEwX8UuOGC6JONeLDpCMuShhx5qZs+enfJ7H3/8senZs6fN2uUgJDnHdeutt9qkGsagSXBq166dOfvss1MycOOMsiD5yJ06NXr0aNO3b99E9x9lR/kytsYJfu6559qFj9ykwB122MEmonnNmTPH5gQwuwUM/Vx22WU2P4DZFUceeaRN1oy7/fff3wYIL730UuI57hMY7Lfffr4rMI5/umUZ82TmEBWvi+RLehqef/5506dPH3u+PProo7asX3jhBd9nVldX232tc6BxMu0D8aPXi4Re8iE4NtPN2vrjjz/srJStt97a1t/HHXec+fbbbxNDEtQX3uOXupw6yvX+++/b6YTuDK5M9YzbHlRVVZkuXbrY86QQxC44uPHGG82LL75oxo8fbz755BOz6667mv79+6dMoyRh6b777jMfffSRjUwvueQS3+ucwFSIdG1xe++998xdd93VzP9N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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "Id().tensor(*[Word(w, N) for w in ['John', 'gave', 'Mary', 'a', 'flower']]).draw(figsize=(5,1))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "This diagram is then combined with the `layer` box to create the final output of the {term}`reader`.\n", "\n", "```{note}\n", "In an actual implementation, the `layer` box should be shared among all sentences so it can be trained properly.\n", "```" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating rewrite rules" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [], "source": [ "from lambeq import BobcatParser\n", "\n", "\n", "parser = BobcatParser(verbose='text')\n", "d = parser.sentence2diagram('The food is fresh')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### SimpleRewriteRule example: Negation functor\n", "\n", "The {py:class}`.SimpleRewriteRule` class contains functionality that facilitates the creation of simple {term}`rewrite rules `, without the need to define a new {py:class}`.RewriteRule` class from scratch. A {py:class}`.SimpleRewriteRule` finds words with codomain `cod` and name in list `words`, then replaces their boxes with the diagram in `template`.\n", "\n", "Here is an example of a negation {term}`functor` using {py:class}`.SimpleRewriteRule`. The functor adds a \"NOT\" box to the wire of certain auxiliary verbs:" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [], "source": [ "from lambeq import AtomicType, SimpleRewriteRule\n", "\n", "\n", "N = AtomicType.NOUN\n", "S = AtomicType.SENTENCE\n", "adj = N @ N.l\n", "\n", "NOT = Box('NOT', S, S)\n", "\n", "negation_rewrite = SimpleRewriteRule(\n", " cod=N.r @ S @ S.l @ N,\n", " template=SimpleRewriteRule.placeholder(N.r @ S @ S.l @ N) >> Id(N.r) @ NOT @ Id(S.l @ N),\n", " words=['is', 'was', 'has', 'have'])" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "```{note}\n", "The placeholder `SimpleRewriteRule.placeholder(t)` in the template above will be replaced by a box with the same name as the original box and type `t`.\n", "```\n", "\n", "A list of {py:class}`.RewriteRule`s can be passed to {py:class}`.Rewriter` to create a rewriting {term}`functor`. If no list is provided, then the default rewriting rules are used (see [Diagram Rewriting](./rewrite.ipynb))." ] }, { "cell_type": "code", "execution_count": 5, "metadata": {}, "outputs": [ { "data": { "image/png": "iVBORw0KGgoAAAANSUhEUgAABYwAAACxCAYAAABnc/kPAAAAOnRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjEwLjMsIGh0dHBzOi8vbWF0cGxvdGxpYi5vcmcvZiW1igAAAAlwSFlzAAAPYQAAD2EBqD+naQAAOHFJREFUeJzt3QeUFGW6xvFPQckZAZEkiAQFRAEDiCRJggJGVMADiAEUw0VMq6isK0lR3FUv4souqChB1CvpgogXBCWDIkFABJEgSBQE5J7n3a3ZnqZnpmemu6vD/3dOne7pme6p7uqqr+qpr97vtJMnT550AAAAAAAAAICUd7rfMwAAAAAAAAAAiA8ExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAQ2AMAAAAAAAAADAExgAAAAAAAAAAk/dfNwAAIJFs2bLF7d692+/ZQIIpXbq0q1Spkksl8b6usEwAAJFCmwJkLRXXk5wgMAYAIAF3jGvVquUOHz7s96wgwRQsWNCtWbMmZXaSE2FdYZkAACKFNgXIWqqtJzlFYAwAQIJRLwrtGI8bN852koFwaMf49ttvt+9Pquwgx/u6wjKJv2UCAImKNoU2BVlLxfUkpwiMAQBIUNoxvvjii/2eDSDusa7EH5YJACBSaFOAyGPQOwAAAAAAAACAITAGAAAJbe7cue60005zv/76q9+zggRy8uRJ16dPH1eyZEn7/ixfvjwq/6dZs2bugQceiMprA4g81lkAqbKfcscdd7hOnTpF/HWRHChJAQAA4pZ2kDPz9NNP28E9kF3Tp093b7/9tp1wqFq1qo2YDQCTJ092Z5xxht+zASDFsZ8CvxEYAwCAuLV9+/a0+xMmTHBPPfWUW7t2bdpjhQsXdosXL/Zp7pDIvv/+e3f22We7K664wu9ZARBH1JsPAOJ9P+X33393Z555ZsznC6mDkhQAACBulStXLm0qVqyY9TgOfEyBsWfJkiWuQYMGrmDBgrZzHRgsy9SpU21AlPz581tPjWeeecYdP37ch3cFv+kSzPvuu89t2bLFvlNVqlRxR48edffff78rU6aMfUeaNGnivv7663TP+/zzz12jRo1cvnz57CDu0UcfTfcdOnTokOvevbt9L/X7ESNG+PDuAESqJMXf/vY3V716ddsmlC1b1t1www1+zx6AFN1P0bapX79+tn1Sb+M2bdrY365evdq1a9fO9j20nerWrZvbvXt32mtNnDjR1alTxxUoUMCVKlXKtWrVyvZXAg0fPtz2W/T7vn37umPHjsX8PSP+EBgDAICk8MQTT1hApx7HefPmdT179kz73RdffGFBXv/+/d23337r3njjDbvM789//rOv8wx/vPzyy+7ZZ591FSpUsF7sCoYfeeQRN2nSJDd27Fi3dOlSd95559nB2J49e+w527Ztc+3bt3cNGzZ0K1ascK+99pobM2aMGzx4cNrrDhgwwEJlnZyYOXOmXUaq1wKQeNSW6CSSthU6AanLw5s2ber3bAFI0f0U0T6KehXPnz/fvf766zZ+R4sWLVz9+vVtm6Xt1I4dO9xNN91kf6/ndu3a1faJ16xZY/slXbp0sfrIns8++8x6M+tWr6/9Y00AJSkAAEBSUPh71VVX2X31/LzmmmvckSNHrGeYehPrsR49etjv1cP4ueees5BQdZCRWtRbvUiRIi5PnjzWU109bRQA6wBJvXRk9OjRbtasWRYKKwhWT8OKFSu6V1991Xr71KxZ0/30009u4MCBVirl8OHD9rfjxo1zLVu2tNfQgZcO9gAkHvXsK1SokOvQoYNtLypXrmyhDADEej/Foysehg4dmvazTlpru/T888+nPfbWW2/Z/sq6devcwYMH7UoohcTahol6GwcqUaKE7dvof2nfRvvPs2fPdnfeeWdM3iviF4ExAABICnXr1k27r8vqZOfOna5SpUrWI1S9MQJ7FJ84ccICZQV9KmOB1KWeNbr8snHjxmmPadArlZ9QjxzR7eWXX55uIEb9vQ7Gtm7d6vbu3Wv1BC+99NJ0tVBr1KgR43cDIBKuvvpqC1h0grFt27Y2de7cmfYCgG8uueSSdD9r/1Y9gwNLtAXu27Ru3dpOYisk1lVT+lmldRQSey644AILiwP3oVetWhXld4JEQEkKAACQFAJHtfdCvT/++MNuFeqpl/Hy5cvTJu0Mr1+/3nogAwAQSL37VFLm3XfftQBFVxLUq1fPLgEHAD/oqodA2r/t2LFjuv1bTdq/VQkdBcG6WmratGmudu3abtSoUXYie9OmTSH3n719aG//GamNwBgAACQ9DXanGpSqSxs8nX46u0Oprlq1amk1AT3qcayagTrAklq1arkvv/wyXd0//b1CJZWd0GvooGvRokVpv1evY10SCiAxqR6+BojSJeArV650mzdvdnPmzPF7tgAgbf/2m2++sUHxgvdvvXBZAbCuiFLHiWXLltn+zpQpU/yedSQASlIAAICkp55hqkOp8hS6FE8hsS7j08jSgYOWITXpoOqee+6xWsUqI6HviQIilSvp1auX/c29997rRo4caaOWa5RynYBQ/euHHnrIvk+6HFR/q9fQKONlypSxgRg5IQEkpk8++cRt3LjReunp8u1PP/3Uet1RZgZAvOjbt6+NuaCB7TQuh/ZhNmzY4N577z335ptv2kB4qkesUhTaL9FJ7V27dtlJcCArBMYAACDpqW6bDv414vSQIUOsJ6gG9ujdu7ffs4Y48cILL1gY1K1bN3fgwAHXoEEDN2PGjLQ6f+ecc44FRgqEdVm6DsoUED/55JNprzFs2LC0y0PV8/jhhx92+/bt8/FdAcip4sWLu8mTJ7tBgwZZvXsNNqXyFKr3CQDxoHz58na1kwbgVSh89OhRq72umus6YV20aFE3b948O+G9f/9++92IESPSBvgFMnPaycDr6pBQNFiPzg5phG4NsqKNhUbQ1CUG8IdWJ11+qmWiA8SyZctazbPgWkOILR34b9++3dYXHfhrXdHIs4EDFyG2dOD1888/23IpUKCALZPSpUvTEy9MqqmoQS+WLFlil6IB4UjF7028v+d4n79oSMX3DACxkIrb11R8z8gdvjPho4dxnAfBClMCbwPv79ixw/42mEIXhZQKYDSFuk+wnPMgONSyCLzVWb1gOrOX0bIIvCVYzh714spoWQTe198F0yBXGS2LwPsEy9mj739m64h3f8+ePSHrBGrblNW6QrAMAAAAAED0EBj7EARnFaYEB8EKq1RvxgtMLrroIte+fft0IYrCX71G8Gt/++23VrNG9zV4SyCFLlmFZckeLIcKgjNaPsFBsNdTVZOKyqu+WeBnqJB4586dp7zOli1b3MKFC+3n3377Ld1rEiznLgjW5+J9bpp05jA4aNTI1qFeW3VMvZ7h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97//+7/ugQcecFWqVHHxejKkZ8+eEXu9wYMH20B6OfXBBx+4+fPnu8cff9yVKVMm28//8ssv3YQJE1z37t1t5yu7fvzxRxtVVYHttdde63JCy1ufQW4GqIrUwJDStWtXd+TIEXfw4EEXiwG6NFjfwIEDbVCoaJo0aZINfPDoo4+6cuXKuWjTwBdArClwWbZsmfvmm2/8nhX829q1a92qVavcNddc4/esABEPixWSqDNBJDVv3jxir1WwYEELoAmNkSw0KLwGG2ZgyPixfv16t2LFCle7dm2/ZwWICwTGYe7sRHKHJyMKQBQYX3bZZa5///5R/V+ff/65BcaXX3551P9XNNSsWdOmeLVz504LjG+++WZbnqmgePHiufou6UBcgXGPHj3c+eefn6PeeAqM27Vr52655ZZsP187bAqML7nkkhy/DwXGFStWjJt1SqPG9+rVKyb/a+PGjRYY62qMCy+8MOonvLS97NatGzt0SFpajxSMjB492q5wuvTSS/2epZSmIM3btrdv397v2QEiSj2L9R0fN26cBcfxRkGx9i80nwTGSBbqINOgQQM3bdo0N2XKFNe5c2e/ZymlnThxwvXp08fuc2IY+BcCYwAAgDij3nQKb5o1a+ZuvfVW9z//8z9xfaI0mR04cMAOIr/77jv3X//1X+7KK6/0e5aAqFBYnJOrtABkn8rFqZ3XOte7d29Xvnx5Tg775Pfff3ePPfaYdaq78cYbbb8LAIPeAQAAxCUFk3/605+sB3/dunWtDEssSszgP7UMdeWKgvr33nvPeoKp/BIAAJFQo0YNu8J4z549duWvTk5GqpY4wjNr1izbx3rxxRdd5cqVbYwkxn4B/oXAGAAAIE4NGjTIffzxx65ChQpuyJAhFl4+/fTTbvXq1QyIFyW7du1y//3f/22BvUoc6UD+ueees1I4GqQIAIBI0Zgy//d//2ehpcpQKUQeMGCADSZOOx8d+/fvtzGRVGJK4yyp3J1KC6p+scaQAPAvBMbINdVW7NSpk9+zAcSFOXPmuF9//dXv2QCQRDp06GCD3yk83rt3r3v22WddnTp1rIb3U089ZYPjHT9+3O/ZTFg6INfApwqJr776ahu486677rK6+tq/Uf3UJ5980uXPn9/vWQV829dXj7sXXngh3eMffvhhup54qgH60ksv2fZJ64uCF40toXXJozI7ek5G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1J122mmucePGNvDdsmXL3JlnnummTJni92wBAIAg1DAGAAAAAETVokWL3OzZs13r1q1tcFf9vGvXLlerVi2/Zw0AAAQhMAYAAAAARFXRokXdvHnz3MiRI93+/ftt4LsRI0a4du3a+T1rAAAgCIExAAAAACCq1JN4+vTpfs8GAAAIAzWMAQAAAAAAAACGwBgAAAAAAAAAYAiMAQAAAAAAAACGwDiOFCtWzF100UXup59+8ntWgJjTKNmXXHKJK1KkiC//v0SJEq5+/fo2CAvi28GDB+27om0mIqNmzZquWrVqbs6cOX7PCgCEbcOGDe7YsWOuadOmfs8KENeqVq1qNaRp5wEkkp07d7pt27a5Nm3a+D0rKYnAOI6cf/75FlaNGTPGTZgwwZ08edLvWQKiTt/z1157zU2cONGddtpprmzZsr7MR4UKFdy3337rJk+e7LZv3+7LPCBrP/74o/voo4/cunXr3Nlnn+337CSNxo0bu71797oBAwa4/v37u++++87vWQKADP3666/ulVdesaBYB5KXXXaZ37MExDWdaP/tt9/cqFGjXI8ePdySJUv8niUAyNDhw4fd3//+d9ekSRM7OayOXYg9AuM4kj9/fjd69Gh35plnultuucV17tzZbdmyxe/ZAqJm7dq1rkWLFu7ee++13qL6/p9+uj+bpTPOOMMNGzbMejrfdttt7sSJE77MBzKmXmQ333yz27Nnj3vppZd8+64kaw/j2bNnu/Lly1sIo15IzZs3t5OX+/bt83v2AMDagAULFriePXvatkont9QeaJt11113+T17QFxTh4y5c+da+/6Pf/zDNWjQwDVs2NA6Ku3evdvv2QMAO/5evny5te9q59Xeb9y40Q0cONANHjzY79lLSaedpBtr3NFK0adPHzt4V4/Lyy+/3MJjTbpkGEhU2tysWbPGTZkyxXryLl261B7v0qWLe/XVV3PVY/TNN990d955p3v33XfthEtO5++mm26y3s6NGjVyI0eOtPUP/ps3b5578MEH7TvTrVs3N3bsWNs+IvKBzCeffGK9/mfNmpX2ePXq1a13kjddfPHFlAQBENVt0erVq60XpDetXLnSHT16NG2bdPfdd1tPyVKlSvk9uwhy66232v7Yzz//7NuVYwjtjz/+sGPM119/3U2dOjWtg0SlSpUsRA5s60uXLu337AJIUtr2qPOY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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "from lambeq import Rewriter\n", "from lambeq.backend import draw_equation\n", "\n", "\n", "not_d = Rewriter([negation_rewrite])(d)\n", "draw_equation(d, not_d, symbol='->', figsize=(14, 4))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### RewriteRule example: \"Past\" functor\n", "\n", "Sometimes, a {term}`rewrite rule` may become too complicated to be implemented using the {py:class}`.SimpleRewriteRule` class, so the more general {py:class}`.RewriteRule` class should be used instead. A concrete subclass of a {py:class}`.RewriteRule` should implement the methods {py:meth}`~.RewriteRule.matches` and {py:meth}`~.RewriteRule.rewrite`.\n", "\n", "A rewriter uses the {py:meth}`~.RewriteRule.matches` methods of its {py:class}`.RewriteRule`s to detect if a rule can be applied. If there is a match, then the matching box is replaced with the result of `rewrite(box)`.\n", "\n", "In the following example, a {term}`functor` that changes the tense of certain auxiliary verbs is implemented by directly subclassing {py:class}`.RewriteRule`:" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [], "source": [ "from lambeq import RewriteRule\n", "\n", "\n", "class PastRewriteRule(RewriteRule):\n", " mapping = {\n", " 'is': 'was',\n", " 'are': 'were',\n", " 'has': 'had'\n", " }\n", " def matches(self, box):\n", " return box.name in self.mapping\n", " \n", " def rewrite(self, box):\n", " new_name = self.mapping[box.name]\n", " return type(box)(name=new_name, cod=box.cod)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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vY+Qufw8R4455hg7P6COTQ1Ekq7PyTea5/L444+POic22zb34pr2t/521apVntc/27qutm3b1s6pHAlxLXhcufSZDupQtWrVMr/99ltK71W8eHGzYMEC8+mnn6b9s/LJunXrbAtVpAJZ2K7JSXZ7qQB2C/GmTZuaDh062Od69uxpHn74YbNx48aEPzvR12/dujViYpnK+mcTBcC3337brF271vd9lyiv+xjB8/Mc0aiWimuLFy9O6+fkm0WLFpn3338/ZmN0KLZt9se1H374wSayfqx/NlmxYoV59913zZ49eyL+P3EteCSXPitVqlSh39Uyu3fv3pTe6+yzzzblypUz1113XcRhpv38rHyivvg7d+40F1xwQcT/Z7smJ9ntpVZCV4kSJWyi/8orr9gW93vvvdfe86CgmYhEX9+lSxff1j+bPPDAA/bnaaed5vu+S5TXfYzg+XmOXHjhhfan7osK70KWy+diOukKyuDBg+3jf/zjHxH/hm2bm3FNV6z9WP9sQlzLfCSXGUyX2nVp/9dff7UBY/369UGvUlZT4XL33Xfb+yHUVfDyyy8PepXw/wW/un/feOON9iq9WhBnzpzp6+u7detW0IUm0hWTXLR8+XIzadIkU61atagNKdmyj5E7VCFUw+n8+fPN0KFDGZ3Ro+3bt5tLL73UfP7552bAgAGmdevWQa8SiiiuXXHFFbaLudsjKx/MnTvXzJkzx5x88sm2i32QiGvRkVxmOLVGagSq2bNn23vG1EqSaOvwiBEj0r5+2WL16tWmc+fOZtCgQaZGjRq2f71anpBe8Y5D3XA/duxY8/HHH5uVK1eaGTNm2C6cjRs3Tuj9Y71ehXyjRo0KuphffPHFBYmmXpfLNMBAu3btzIYNG+xgBhrNLll+lSFe9zFyjxr5Dj30UHPnnXea4447LmqX9VDEtH199NFHplmzZjaeqXvebbfdFvQq5YVMiWvq7nnuuefax127djVr1qwxueyll14yZ5xxhilTpoyNa6kgrhUNBvTJcLq8r1YaBWOdEGr1VUuJWqn+/PPPqK/Twa4KdT5TlyvdbzZ16lTz73//296LoiGnH3roIVO9evWgVy8vxDsOK1asaPfRXXfdZbZs2WKv1t9xxx0xu7Em+vpp06bZEeBcJ554ov2pocJPOukk29Cg7mS5dhXjnnvusZXMzZs32646uqqRCr/KEK/7GLlHvQg+++wze+VSXdyUIFWqVMkuOifdqzGhiGn/pW6QqmQrrqluoDg3bNgwc/PNN5vSpUsHvXp5IZPiWv/+/c1TTz1lli5dapo3b257u+XaiKUaO+CWW24xDz74oE0sdfyrHpwK4loRcZCUefPm6ax1xo4dW+Sf/eWXXzpdunRxihcvbtehQoUKzkUXXeQ8/fTTznfffefs3bvXyXfr1q1z5syZ49xwww3OIYccYreTloYNGzrTpk1jG6WoQ4cOdjumqnPnzvb1u3btSun1Xbt2ta/fvn2749WsWbOcunXr2verXLmyc9NNNzmLFy/O2mND67106VJnwoQJTq1atez3ql69uvPkk08W6Xq8/vrr9rPHjBlTpJ8L77TPtO+0D4va7NmznRYtWhSU1TVr1nSGDh3qvPjii86aNWucfKfze+XKlc6MGTOcgQMHOlWrVi3YVm3btnXmz58f9CpmLdWhWrZsmfLrFT+aNWuW8utVTjdp0sTx4xiZOHGi/T46LlT3mTx5svPjjz862WrPnj3OwoULneHDhzvlypWz36tRo0bO+++/X6Trobq+Plt1fySOK5dZ5Mgjj7TdY9XFU/P4qOXSXeSAAw6w9xK2aNGiYFFrSvhw77lCV2Y0Qp66JbhL6M3UuklbcxBp0X0oubodkBxd/Vcr7+TJk+3Eyddff71ddDXl1FNPtYu6out8ylS///67efPNN82rr75ql++//94+X6FCBXv/h7rT77///kGvJhCXWvq1fPHFFzaWPfnkk2bChAl2EU1sHhrTtORyz5NffvnFdncNjWuhI11qUvhrrrnG9O3bN6kJ35G7VLdRTxyNzXHrrbfae+3dHisabMaNayeccIK98pepdJzrnkrFNF2Vd+8jrVu3rp1ORGMHROrVgMzDXspCderUMaNGjbLdZBWEFi5caAOQHr/xxht2Ph+XBvPQvRi6z7Bq1ar2d3cJ/V2PNTJt0AmYuvrqPjEVKlo0iJH7OPT3ZcuW2QQhlL6j7jtwKyDqBkkFG5EowCoB69evn5k1a1ZBkvbII4/YRffj6hjSfWFKOkMXnX+q4KUzyGmIdQ3k9dNPPxUsalTSTzWg6H4Pt1t85cqVTa9evWzl4fTTT7fnMpBtNH2Aupjdfvvt5p133ilIrBTXXnzxRbu41Giq+84ixbLQ3/UzE7qKanTy8HgW/lj3a3399df2HA+l+ZjVjd+Na5rfjwo2IlGji+5jHjJkiO06qjE6VB/Uc1pUx/vrX/9q5/lWHAuPbXp9Oruea/Au3RcaGtfc2Kb6XOi0e1pHDVClhifFtkxOirEvSqgspkJAgyFoCZ3PTydoaKunrnAkQidvpGBdpUoVOwqWAlqsRa/X/SC6ZyZ8UWXZfaxKsfqoRwqyuhqZCK2fBugJbc1W4Rh0cozsovsmzjvvPLtoNGHdB+Ymmu+9917UgX907h144IGFEk4FZp0nWnSvtBb3sQbUUQVTwVXHvxb3sX7q2A8NtrrHJNocXjrGW7ZsWdAa3apVKwanQs5QMqieA1pCr2iE9lJRwqkrG4nQ1fxIcU09E3RuJhLXdL9+tHjmLjqPNc9dpARS93knQldoNCm7G9PUE0nxF0iGYtI///lPu+i41LyyblzTBYhodD6op0BowqnjLzSWhf7UuapzIzSWuT+1qIHUbRTVEmuuSb1Xp06dCpJJNR5Rn8teJJc5RlfqNEqkFpcCn3s1MFbLqftYE9Sqkp0sJbmpjMKp1jQFfbXQRrqiGt4i7V5lBfykhFEDImgZOXKkPW/Cg2P4VURdaVBlNx51R9LVmHgUYJWoarCC8Kul7mONEBg+jxeQy9Qrxe0+61JDphu3ovVwCX387bff2u7kyVIPGE2bkkrDlWKWuiVG6y0UHteSncgdiEfHlK58a1GvAJ037tXDaLFNjTdqXPWrzqd6qWKXeidE6gmknzrHGbArd5Bc5gG1vurE1ZKo0IRUP9UaFa3F1l1U4b3kkkvs5+lKSrSWYP2fRgUkUUQm07HqBsBoNCqfrrYrKLsjOEe6OqkAr3t/I13V1KLWYbeVmNbazKBKlu7bVrdjZB41xOgqi5ZEhSakOm+jxbLQRZ/Tu3fvuFc4tehYIVFEJtPxXL9+fbtEo148bm8anSfhVyXd+KZj3P0ZHtP0WHVOxTVuT8o/JJfwLSEF8o0SQXWvy+TBf5Ca1157zQ6KoW6KGu6/ffv2JP55mJAC+UZXEKn/wQuuQQMAEOaUU04xV155pb1H6eSTT7aDO2l04fABVwAAwP+QXAIAEEZXt8aNG2dWrVplXnjhBXu/kKZ50UilGpV65syZBSP2AgCA/yK5BAAgxi0CZ5xxhk0mdR+mBsX48ccfbXdZDUYxbNgwkkwAAP4fySUAIG9pgApNXB+6RJsGRvcgaQ45jaSo+zA1tP6ECRMSnmoCAIBcx4A+AIC8pURRw/SH+uGHH8zBBx+8z8jAb731lpk6dap57rnn7LylHTp0sEmmpp0AAAAklwCAPNa0aVMzb968Qs/VrFmz4LHm/X3sscfMtGnT7GN1hdXVy379+u2TgAIAkO9ILgEAeUtzE3bs2HGf5xcvXmwGDx5sR4vVfZfdunUzkyZNMp07d7Zz9QIAgH2RXAIAEGbRokUFA/j07t2bOd8AAEgAySUAAGF69uxp+vTpE/RqAACQVRgtFgCAMOXLlw96FQAAyDoklwAAAAAAz0guAQAAAACekVwCAAAAADwjuQQAAAAAeEZyCQAAAADwjOQSAAAAAOAZySUAAAAAwLOS3t8iv1SoUMG0b9/e7N27N+hVAYpMtWrVTKdOnQL7/COOOMKsX7/e7Ny505QtWzaw9UB027dvN23btjW1atUKelWQpJo1a9p9t23btqBXBSgSe/bsMU2bNrWxJSjt2rWzMQ2Zy3EcW+dX3R+J48plkurVq2fee+8988ADD5hff/016NUB0u6tt94yzz77rE3ugrJ7927zwQcfmPnz5we2Dojt7bffNu+++66pWLFi0KuCJNWuXdvuu7vvvpvKLvLCxIkTzYIFC0yJEiUCW4dffvnFzJkzx6xYsSKwdUB0uog0b948Wwc66KCDgl6drEJymSS1yl933XVm9erVtsXr8ccfty0bQC5eiRo+fLjp0KGDPcbvueeewNblwgsvNPvtt58ZMGCAWbNmTWDrgcjeeOMNM2HCBHPwwQfb4wXZpXPnzqZbt27m9ddfN8ccc4x55513gl4lIC1+/vlnc/bZZ5thw4aZKlWqmBtvvDGwdVE8U8Npr169zK5duwJbD0R2xx132MTy1FNPNXXq1Al6dbIKyWUKRo0aZe6//35bGPTu3du0aNHC3HbbbWbJkiVBrxrguauQKpZXX321adiwoRk/frxp0KCBLWDbtGkT2HqpwnvXXXeZtWvXmi5dupgPP/wwsHXB/6jRQVe1//a3v5mSJUvaxwcccEDQq4UkFStWzDzzzDNmyJAh5rvvvrPd9VShevDBB+3VFSCb7dixw7z44oumb9++plGjRmbGjBm2q6PiSI0aNQJtNO3Tp49ZuHChOeecc8yPP/4Y2Lrgf/744w9b9xkxYoS9YvnEE0/YMhJJcJCylStXOmeffbZTsmRJXbq0S+PGjZ2RI0c6H330kbN3796gVxGIa+fOnc7s2bOdiy++2KlRo0bBsVypUiXn2muvdbZv3+75Mzp37mzfc9euXSm/h86nyy67rGD9zj//fGfVqlWe1w2pURnXpk0buy9Kly7tPPLII0GvEnywcOFCp3Xr1gXnWbFixezv48ePd5YtWxb06gEJ2bRpkzN9+nRbRytfvnzB8VynTh3noYce8qV+VrlyZadZs2ae3mPbtm1Ou3btCsrRUaNGOVu3bvW8bkiejokZM2Y4DRo0sPujevXqzoIFC4JeraxUTP8kk4xiX5s2bTKzZs0yM2fONK+88ortTii69+ioo44yTZo0KbRUrlw56FVGHtKp/tNPP5kvvvjCLF68uGD55ptvzJ9//lkwsEePHj3MmWeeaVt21RXVD7oKontLdLW/VKlSnt5L9zwPHjzYtvZq/dQNU+t7xhlnmAMPPNCX9UVk6p2hck6Ltr+ce+655vbbb7ddYpE7Vq1aZZ5//nm7r3U/rXo1iK70HH300YVimm4RKVeuXNCrjDyk43L58uWFYppinJ5zq7e6WnnWWWfZOHHsscf6dhVK3WpV7n3yySe+9ADRbSgrV640lSpVMl27drXrq9jJYDLpva9SscyNa+q5oTrKoEGDbC9F7Qskj+QyDd0v5s6da1544QXz8ccfm2+//bag4u5S3203KKtgUoVelWL91EKQRip0Km/evNl2YwtdVFi6QVcNIaH2339/2wCikSIVyI477jhTvLj/veX9TC7dgDB9+nR7H6jOM1GFoXXr1vbeMY0CeOSRR5q6devSnSVFuhdo2bJl5quvvrLbWGWaGiJEXWCV1Ov+cx07yG0azOull14yL7/8svnss8/M999/X2isAZ1jhx56qI1pKk903rnxTLFNi18NVcgvKut1/IXGNN03qbqVksivv/7a1rtCVa9e3R6LHTt2tHFNyWU6+JVcuvQ9dPvHlClT7DkmpUuXtiO1675onVuKa/p+SH0b69hRXFNDtRrQdDy59aHu3bub0aNHm0MOOSToVc1qJJdppsr00qVLC7WqaYnVt14HuBuYQwN0+HNqQfajoo7MpivhCqganTg8cXQX9/90r0AkSgZ0D2X4VXSNflwUyZffyWUotfSGXmEJnSZILb66qqKAHLqogYek839JpFr5FWxDF12lDG0YU6OX7ndVZU2t6txbmb80ZYmOkfC4pnuiY1XEE4lrVatWDXQET6Sfqp1btmxJKK5pca+ah9O0VCrPw+NaUfVg8Tu5DN0+Op/cq2mff/55of9XchkprmnKMPyXRr12k8jQJbxhTNtSCaXimhpMlczDO5LLgKhg1YGuboqxClZV/GJRYeK2DKsircI2dFGFMPy5RBcS18ToFFJSpxYxv5bQK5Bbt26N+fnaVxrFOFplTcFPiWWQhWY6k8tQ69ats1MqhAYTBZjwkfjUZV3BWVMwKEnSou7q7uNIz+lcyvSEVIm1jhddoQ5dNm7cGPF3DYEfafuogSu00uJe3WaOUcSimKWr27oSEC2uKQGNVe1QYqmGU5Vl+plsDIv39ySuiZclqqD7Gdc2bNhQcBzEm/JG3RGjNULo98MOO8wONhfk/kxXchlOCZEGHwqNa2oQDJ9vXedL48aN7c9IMS3S79mQTKlxQXWiePFMi44x9biJtn1C45p6OLVq1YoyIQ1ILjOYTgydNPGuVrkB22864VJNTFVgqXulFlXI3cden1PXKiVyOmy1fUIXL89FCqS6YphIwNTr/D6NdKUxUqIYKdCqUSHTk56iSi7jXZlTF6rQK3PJDP+u9Y6VfKoypL/ReaP9p5/uEu13HTcKnFq0nu7jaL/r2I+VOCoAhwfUWHTsuIE2tCWcK7tIFx3HagSKFtdCY1t4N34/6Bz10uDqVywLf07nuB+xLPQ5vWe8+BUtzkXrBeNFmTJlIsa08Limx9nQkFVUyWW8K3OhcS30XtNE90ms5FMNjaHxK15sUx1NPV7ixbLQ33UMxmoM1cWYZOhqZGgS6cY2ruwWHZLLHBEpiCSaHKWyBDXRtu6pUz/5oqZKgJfW8mQXFfjpuPcxH5PLWOeMglakYBYtyIU+p66BXqgS5cc0D0pqY7VOR3tOiyoOJJHIVKqkppIYpboENdegEhT1IihqiTYg+xXf1OicS+VNkMllrHMm0VgW6XmvdTuN2+B1qjDVfWLFrVgxTvGwfPnynj4f3pFcIiVqFY3VFTT86qJfLbEKUHr/dLQeK6GLFhTVGpdLQbGoZWJy6UcQD+2qo8dui228llotOp70fKTW32gtxDoOw1uV6dID+EPnZayuoDq//e41o+dUJqos8LunjxZufcmv5NIrHf/hVw3jxbLQ59SAoPdIpOeOu+hYDE0Ys6E3FmIrGef/gYhCgxaQj1QxUzcbutoAuUEVXV314MoH8lVo12UgVbnT7w4AAAAAEBiSSwAAAACAZySXAAAAAADPSC4BAAAAAJ6RXAIAAAAAPCO5BAAAAAB4RnIJAAAAAPCM5BIAAAAA4BnJJQAAAADAM5JLAAAAAIBnJJcAAAAAAM9ILgEAAAAAnpFcAgAAAAA8I7kEAAAAAHhGcgkAAAAA8IzkEgAAAADgGcklAAAAAMAzkksAAAAAgGcklwAAAAAAz0guAQAAAACekVwCAAAAADwjuQQAAAAAeEZyCQAAAADwjOQSAAAAAOAZySUAAAAAwDOSSwAAAACAZySXAAAAAADPSnp/CwCIrWvXrqZ+/fqmeHHaswAA2a9v376matWqQa8GkHGKOY7jBL0SAAAAAIDsxmUEAAAAAIBnJJcAAAAAAM9ILgEAAAAAnpFcAgAAAAA8I7kEAAAAAHhGcgkAAAAA8IzkEgAAAADgGcklAAAAAMAzkksAAAAAgGcklwAAAAAAz0guAQAAAACekVwCAAAAADwjuQQAAAAAeEZyCQAAAADwjOQSAAAAAOAZySUAAAAAwDOSSwAAAACAZySXAAAAAADPSC4BAAAAAMar/wNIT2g6d0GiJgAAAABJRU5ErkJggg==", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "past_d = Rewriter([PastRewriteRule()])(d)\n", "draw_equation(d, past_d, symbol='->', figsize=(9, 2))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Creating ansätze" ] }, { "cell_type": "code", "execution_count": 8, "metadata": {}, "outputs": [], "source": [ "d = parser.sentence2diagram('We will go')" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "{term}`Ansätze ` for the quantum pipeline are implemented by extending the {py:class}`.CircuitAnsatz` class, while ansätze for the classical pipeline need to extend the {py:class}`.TensorAnsatz` class. Both classes extend {py:class}`.BaseAnsatz`, sharing a common interface. Once an {term}`ansatz ` is instantiated, it can be used as a {term}`functor` to convert diagrams to either a {term}`circuit ` or a tensor diagram.\n", "\n", "An {term}`ansatz ` should be initialised with an `ob_map` argument, a dictionary which maps a rigid type to the number of {term}`qubits ` in the quantum case, or to a dimension size (e.g. `Dim(2, 2)`) for the classical case. Some {term}`ansätze ` may require additional arguments (see the [API documentation](../api/lambeq.ansatz.rst) for more details).\n", "\n", "In `lambeq`, a {term}`functor` is defined by specifying the mappings for objects `ob` and arrows `ar`. The {py:class}`.CircuitAnsatz` and {py:class}`.TensorAnsatz` classes already implement methods which extend `ob_map` to map not just base (atomic) types, but also compound types, into {term}`qubits ` and dimensions respectively. Therefore, to complete a new {term}`ansatz ` class, you only need to provide the mapping from rigid boxes to diagrams. This typically involves the following steps:\n", "\n", "1. Obtain the label of the box using the `_summarise_box` method. This provides a unique token which can be used to parameterise the box.\n", "2. Apply the {term}`functor` to the domain and the codomain of the box.\n", "3. Construct and return an {term}`ansatz ` with new domain and codomain -- see how to construct diagrams using the low-level `lambeq` backend [here](./discocat.ipynb).\n", "\n", "### CircuitAnsatz example: \"Real-valued\" ansatz\n", "\n", "This {term}`ansatz ` always returns a tensor with real-valued entries, since the ansatz is constructed using only the CNOT and Y rotation gates, which both implement real-valued unitaries.\n", "The {py:class}`.CircuitAnsatz` provides functionality to add postselections or discards to ensure that domains and codomains for the boxes match. To extend the {py:class}`.CircuitAnsatz` to create a new ansatz thus only involves providing a function to generate the circuit within a box." ] }, { "cell_type": "code", "execution_count": 9, "metadata": {}, "outputs": [], "source": [ "from lambeq import CircuitAnsatz\n", "from lambeq.backend.quantum import CX, Id, Ry\n", "\n", "\n", "class RealAnsatz(CircuitAnsatz):\n", " def __init__(self, ob_map, n_layers, n_single_qubit_params = 1, discard = False):\n", "\n", " super().__init__(ob_map,\n", " n_layers,\n", " n_single_qubit_params,\n", " discard,\n", " [Ry, ])\n", "\n", " def params_shape(self, n_qubits):\n", " return (self.n_layers + 1, n_qubits)\n", " \n", " def circuit(self, n_qubits, params):\n", " circuit = Id(n_qubits)\n", " n_layers = params.shape[0] - 1\n", "\n", " for i in range(n_layers):\n", " syms = params[i]\n", "\n", " # adds a layer of Y rotations\n", " circuit >>= Id().tensor(*[Ry(sym) for sym in syms])\n", "\n", " # adds a ladder of CNOTs\n", " for j in range(n_qubits - 1):\n", " circuit >>= Id(j) @ CX @ Id(n_qubits - j - 2)\n", "\n", " # adds a final layer of Y rotations\n", " circuit >>= Id().tensor(*[Ry(sym) for sym in params[-1]])\n", "\n", " return circuit" ] }, { "cell_type": "code", "execution_count": 10, "metadata": {}, "outputs": [ { "data": { "image/png": "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Fy/2PX706FHnpptuck455RTnk08+ieg+wnt79+51GjRo4KSkpDg//fST7/G///7bufjii53ixYs733//fUT3Ed779ddfnUqVKjlVq1Z1tm3b5ntcf5999tn2OS2D+Pbdd985xYoVcxo1amTLAJfKBpURF1xwgS0zAMS/KVOm2HPDf/3rX2kaTEyfPt3JkyeP06NHDxpSJIAhQ4bYOHj22WfTPP7UU0/Zx0eOHBmxfYt3JMQ88Pzzz9vAHTBgQIbPDx061D4/evTosO8bgPA5duyYc9tttzn58+d3Pvroo5OeP3TokNOiRQvn9NNPd7788suI7CO8d+DAAadJkyZOkSJFnBUrVpz0/O7du526des6Z5xxhrN27dqI7CO8t337dufcc891ypcv72zevPmk5zdt2uSUK1fOLrNjx46I7CO89/PPP9vf+vnnn29/++mpjFBZcemll9qyA0D8evPNN528efM6d999d4ZJr4kTJ9pzxn79+pEUi2OjRo2y3/OwYcMyfL5///72+QkTJoR93xIBCbEQe/XVV23APvDAA5kWXHr84YcftsupoAMQf9TEvUuXLrbJ+zvvvJPpcjrh0YmPToCWL18e1n2E95T0vOqqq2zS86uvvsp0OSVAqlevbhMiSowgvvz1119OnTp1nNKlS2eZ9NRzSpYoQZpRsgSxzU166reeVdJTF0hUZlx99dW2DAEQf95//307dEb79u3tBdTMjBkzxp4zqkEF4s+LL75ov99HHnkk02WUO7j//vtti8H//Oc/Yd2/REBCLITefvttm+XXSXB2WXw937NnTxvYr732Wtj2EYD3gj1wqWuMusioq8yPP/4Yln2E99Qt9sYbb7TdYhcsWBBwdzp1nfv999/Dso/w3r59+5yLLroo4G6xWkbL6jX+3ekQ2/SbrlKlilO5cmXnt99+y3Z5lRkqO1SGqCwBED8+/fRT59RTT3Vat25th9bIjobaUdJk7NixYdk/hMe0adPsucJ9992Xbe5AF9o7d+6c7YV2BI+EWIh8+OGHtluUukdlleVPH9gaLFGBrcETAcQHdZdWxeWFF14I+DUaRFmDKZcpU8YOrozYpvL99ttvt1d/33vvvYBfp0HVNbh6zZo17WDriG2aOOHyyy8PeuIELavX6LVaB2Lbn3/+aX/T+m1v3Lgx4Ndp0hWVIR06dGBgbSBOfP3117YF6JVXXhlwC1AlSzQpm+qWkyZN8nwf4b1Zs2YFPXGCcgxt27a1OQflHhAaJMRCYNGiRTbLr4GzA8ny+9NVv1tuucUpUKCAM2/ePM/2EUB4aCKNnA5++ccffzjnnHOOU6FCBWfr1q2e7B+8p4rr//3f/9kWw6+//nrQr09NTXVKlizp1K9f39mzZ48n+wjvHT582Ln22mvthBqff/550K//7LPP7Guvu+46uy7EJv2G69Wr55QqVcpZs2ZN0K+fOXOmLUu6devGGEJAjFu5cqVTtGhRp3Hjxs7+/fuDeq1+/927d7ctimbMmOHZPsJ7H3/8sT33v/XWWwNuSJN+si7lHvwn60LOkRDLpW+++cYpWLCgc8UVV9hpszMybtw4e4Krpu8XXnihfY0/VXRV4c1ppRlAdNBvXcmwQYMGZblMVuXBli1b7PNKjClBhtiiCmvv3r1tHLzyyis5joNVq1bluNKMyAvkYld2MZDbSjMiT7/dSy65xP6W9ZvOaRy8/PLLtkzp06cPSTEgRgVysSu78kAtiTp27Ghbjs6dOzdMe45QCuRiV3ZxoJyDcg9qSb506dIw7Xn8IiGWC6tXr/ZNm53ZCYuu7Kkyq8qMxgbSLCKqGGm2qYy6VRQuXDiobhUAooOSHzphefDBBzM9YQm0PFi3bp3tOnneeefZrpSIHYMHD7Zx8Nxzz2W6TKBxkJNuFYi8QIZDCDQGctqtApGnExb9dnXRdMmSJbmOg2effdaWLUOGDAnD3gMIpUCGQwi0PNAFlzZt2thkyfz588P0DhAKgQyHEGgcaIxR5SCUi1BOAjlHQiyH1Oxdzd/VDD6rmaCU1e3Ro4fvviqzZcuWdZ566qlcD7wLIDq88cYbtkuLuslldfU+mPJAB8ESJUrY16hsQPRTN1mdsGb0feY0DoIdeBeRpd+/vtvsJswJJgb8B97VZDy0EIp++q22atXK/nb1Gw5VHDz55JO2jBk1apQn+w0g9AKdMCeY8kAti6655honOTnZ+eKLLzzbd4SOO2HOxRdfnOWEOcHEgXIQ559/vs1J/Pzzz57te7wjIZYDGhD1rLPOcmrUqGEHSs2MCitd1dXVXX9q6qqKUmZTs2u69eymZgcQHTRgupquawD1rFpv5KQ8WL58uW01etlllzkHDhwI+b4jdCZMmGBPVPv375/lcjmJA03NrgFUs5uaHZGlRFW/fv1sHEycODGkMRDo1OyIPP1G27VrZ3+zH3zwQcjjQN+/4kDxACC67dixwzn33HOdcuXKOZs2bQppeaAWRqofqp6o+iKil87pzzjjDHuOn1VDmpzEgWKsevXqNjcRzKQt+J+8BkH5/fffzRVXXGFOOeUUM3/+fJOSkpLpsjt37jTHjx83Z5xxRprHdf+PP/7I8DXFihUzH3/8sSlatKjdzpYtW0L+HgCExqeffmratGljrr/+ejNlyhSTN2/ekJYH9erVMx9++KFZtmyZufnmm82RI0dC/h6Qe9OmTTP33nuvuf/++83QoUOzXDYncXDttdea6dOnm5kzZ5pu3brpQlZI9x+h8eSTT5qnn37ajB492tx9990hjQG55557zKhRo8xTTz1lt4Xoo9+mfqOvv/66mTFjhrnmmmtCHgfDhg0z9913n92Oyh4A0WnPnj3mqquuMrt37zYLFiwwFSpUCGl5cNppp5l3333XnHvuuXY7P/74Y8jfA3Jv8+bN9pxe5/jz5s2z5/ihjIOSJUuaTz75xBQoUMA0b97cbNu2LeTvId6REAuCgvTKK6+0J6UKvLJly3qynVKlStn1JyUl2R9QVhUjAJHx9ddfm5YtW5rLLrvMJir0e/VCo0aNzJw5c2xlqn379ubYsWOebAc5M2vWLHPXXXeZTp06mTFjxpg8efJ4sh0lRF9++WUzadIk07t3b5JiUebf//63GThwoHn88cfNv/71L8+28+CDD5ohQ4aYAQMGmGeffdaz7SB4+k3q+9Fv9JVXXrEXS7ygMmbs2LG23NFNZRCA6LJ//36bEFfDBjWgqFq1qifbKVSokL1weuaZZ9pz1PXr13uyHeSMklNKUukcQef2Sl55QTkJnSccPnzYbk85CwSOhFiQWX4FmAKuYsWK2b5Grcfy5ctntm/fnuZx3S9dunSWr1XBpu0cPHjQFnC7du3K9XsAEBqrVq2yFR214NLJiFqMelke6OD21ltv2cRY586dzYkTJ3L9HpB7H330kWnbtq1NVk2cODHLFoKhiIM777zTjB8/3ibeBg8enOv9R2hMnjzZ9OrVy/Tt29cmxbyMAXn00UdNnz59zAMPPGCTpIgOgwYNsokq/UY7duzoaRyorHnppZds0u22226zPQsARId//vnHtGrVyrbY0m+zdu3anpYHxYsXty2PlBxTQ4qtW7fm+j0g93TurnN4xYPO6XVu72UcKDehpJtyFVdffbXZu3dvrt9DwvDrPolMaAbJnM7ioIHxNAiuS2MMaZaR7AZddv30009OSkqK06BBA2fv3r1B7zuA0NJvUtNm5+Q3mdvyYMaMGXZg7e7duzOwdoQtXrzYDph9/fXXBz3YfW7jYPjw4XYMoWeeeSbo/UZo5fQ3mdsY0La6detmt60ZqRBZTz/9tP1N6v9g5DYONN7Mdddd55x22mm2TAIQWf6/yc8++yys5cGWLVucChUqOOecc47zxx9/BL3vCJ09e/Y49evXt+cLqampYY2DVatW2VkpL7nkEpvDQPZIiAUwbfYVV1xhp83+5ptvgn69KqqaFnfKlCn2RPqee+6xQRpMQbVy5Ur7miZNmjCwNhBB69evtzO91KpVK9Nps70uDyZNmmRPvPr27UtSLEKWLl1qp81u1qyZPUZEIg4GDhxo4+D5558PevsIjblz59oJNe64444sJ9TwKga0TW1b+6B9QWSMHz/e/hYfffTRoF8bijjQwNoqi1QmqWwCELkJNW699VanQIECzkcffRSR8uCXX35xypQp49SuXdvZtWtX0PuA3FMSqnHjxva70zl8JOJgyZIlNnfRvHnzHNVTEw0JsSzoqn/Lli1tK4BFixbleD3PPfecU758eVtAKuurIA3W119/7Zx++unOVVdd5Rw6dCjH+wIgd9NmV61a1dm2bVtEy4OxY8faE7DHH388x/uBnFErYbUWVqvhrKbN9joOlAx94IEHbBxMnTo1x/uBnJk/f76tsLZp08Y5evRoxMoCbfumm26y+/LJJ5/kaD+Qczph0W+wV69eOb5AEYo4UFl08cUXO8WLF3e+++67HO0HgJzTBYq77rorwxkCw10e/Pjjj7Z3kV5P76Lw0jn6lVdeac/Zde4eyThQ7kI5DM1OGWxPhkRDQiyLLH/btm3ttNkffvihEw0WLlxoA/uGG24gsIEw2r59u502WwenzZs3O9Fg6NCh9kRs9OjRkd6VhPHzzz87pUqVcs4///wsp80OF52Ad+3a1cmbN6/z1ltvRXp3EsYXX3zhJCcnO9dcc43tHhMNFfAWLVrYffryyy8jvTsJ480337S/Pf0Go6G1rsqkunXrOmeccYYtqwCEh37/6uKmLuzTpk1zosHy5cudIkWKOJdeeim9i8JE5+atW7e25+qffvqpEw0++OADm8u47bbbbG4DGSMhlkmWv0uXLjbL//bbbzvR5L333rPdI26//fagu2gACN5ff/3l1KlTxyldurSzbt06J5oqYA8//LBNik2cODHSuxP3Nm3a5JQrV86pXr26s2PHDidaqILTrl07W+FRxQfen2QULlzYueyyy2xXtWihEx6d+OgESPsIb73//vv2N9e+ffuoOslQ2aQySmWVyiwA3nvkkUdsXezFF190ookukKilki6Y0LvIWzoO6Hig44KOD9FEF0yj6eJNNCIhlo4C5f7777cF26uvvupEozfeeMMGtvoUE9iAd/bt2+dcdNFFthvK999/70TzVcnXXnst0rsTt37//XenSpUqTuXKlZ3ffvvNicarkmoSn9vu/cjaDz/84JQoUcJ2X1DZEG3UNeaCCy6wXWXUZQbe0JV//dbUEiAaW+u73fvPPvtsW3YB8M6wYcPsOeOoUaOcaKSu9OpSr671Oe3ej+zr4nfffbc9N1fL4WikoTUUpxpqg9zByUiIpTNgwAAbMBMmTIj0rmTplVdesfv54IMPEtiAB9T6o2nTprY1yLfffuvE+7gVyNiff/7p1KhRwznrrLOcjRs3OtFKg6Zq8FQNopqTsSYQ2EDF5513XlQPVKx902DK2lftM0LLHahYY8RE80DFGzZssLOS1axZ05ZhAELv3//+tz0XGzJkiBOvE8AgazoH/9e//mXjQGNKRjNNwqT91KRMSIuEmB9NZ6pAGTFihBMLxo0bZ/d30KBBkd4VIK5oXKBrr73WTpv9+eefO9FOV/1uueUWO/jmvHnzIr07cTVtdr169ey4YWvWrHFiYWYjTbOt2Yg07TZCI9amstc+al+1z9p3hIY7lb1mD4uFqexTU1OdkiVLOvXr17dlGYDQmTx5sj0H69OnT0w0TNDMhWrB1K1bt5jY31jx2GOP2TjQbMOx4JlnnrH7O3z48EjvSlQhIeY3m4MCRIEdS2ItiQdEu1hNLimJd91119kk3meffRbp3Yl5sZpccpN4OhGOhSRetIvV5FKsJfGiXawml9wknsqyWEjiAbFAySUNVRFryaVYS+JFu1hNLj366KN2v9WwBv8fCbE46H4YK908gWinpuR33nmn7X44e/ZsJxa7eV5++eVOoUKFnGXLlkV6d2JWrHc/jJVuntEu1rsfahKQWOjmGe1ivfvh119/HRPdPIFYEOvdD2Olm2e0i+Xuh7HUzTNc8ugfk8DefPNNc9ttt5nbb7/dTJgwweTJk8fEGn2FDz74oHnppZfM1KlTzR133BHpXQJi8nd03333mfHjx5tJkyaZdu3amVi0f/9+c80115hNmzaZxYsXm1q1akV6l2LK0aNHzc0332w++ugjM3v2bHPZZZeZWLRt2zbTrFkzk5SUZD7//HNTtmzZSO9STNm3b5+58sorzdq1a838+fNNjRo1TCz66aef7Ps455xzzCeffGIKFSoU6V2KKb/99pu59NJLzbFjx8zChQtNmTJlTCxatGiRueGGG8y1115r67358+eP9C4BMWfBggXmuuuuM1dccYWZMWOGPb7GoieffNIMGzbMjBo1yp4/IjivvvqqufPOO80999xjRo8eHbO5g+7du5vXXnvNvP7667bem8gSPiFWv359s2LFChMvqlevbivAAILz559/2qSBTnziRY8ePcy4ceMivRsxZeXKlaZevXomnowcOdL07t070rsRU9555x3Tpk0bE2/v6cYbb4z0bsQUnTD26dPHxFsZV7du3UjvBhBzlFD+8MMPTbwoWbKk+f3332M2sRfJc+01a9aYeMqFfPvttyaRJXxCbNWqVZ4nkL766ivb6uTuu+82TZs29XRb1apVs4ENIHhqFfTXX395ug215NTV+jFjxphSpUp5ui21bDjrrLM83UY8evvtt83hw4c9v0L7448/2qtzXlOLwWLFinm+nXhrKaiWNF7r1auX/X/s2LGeb+uWW26hZVCQdu/eHZYTYPVSqFmzpunfv7+n2znllFPiLtELhIuSIF43olC9QPWDW2+91bRu3drTbZUvX940btzY023EIyWP1HrcSzpP0PmCLmw3atTI023VqFEj4S+SJHxCLBzUrLZ9+/a2G1aXLl0ivTsAIqhr165m8uTJZsOGDaZSpUqR3h1EiLpcqAsWh+DEVrlyZfu/ygMkLnW5URdndckCkLhUL1D9QF0avU6QI3rpPEHnC9OnT4/ZIVxiSd5I7wAAAAAAAAAQTiTEAAAAAAAAkFBIiAEAAAAAACChkBADAAAAAABAQiEhFgc2bdpkB2TVjJlZzVahZfbs2RPWfQMQXpQHEOIAQhxAiAMALsoDEANpkRBLEJqyddu2baZIkSL2/pQpU0zRokUjvVsAIoDyAEIcQIgD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FQfvvPOOueqqq+zxR9/JqlWr0jxfoEABW0b369fPRJuYT4hJixYtzLZt2+wBcMyYMfYLDvRH5x6wVdly6YCrCpi/Tz/91J6UpX9c9xVU0Uwnks8++6z90X/zzTe2Qnn11VenKTA6depkK5h//fVXRPcV8fkbGzdunOnSpUuOt1+8eHFTqFAhEwv8K+fDhw83DRs2NCdOnDAjR440ixcvNq+88oqtyLdq1co88sgjQa/fi3VmZ968efZApxMelSMffPCB3Y/ff//dPPjgg7Y8OXDgQMjiYN++ffagWqFCBbN8+XIzYsQIe9L11ltv+eJAFSxVvL788ksTjYiD3MfB8ePH7Xd8//332wp2RuWBKlg6pn3++ecmGhEHuY8DXbk/77zzzNtvv20T5aqv6ORKj1MeeLfOQOLgnHPOMcuWLbMnOW5cXH/99TZRGUgcBEMnvPretR0lx9Ri7aWXXkpTF1EcaLsTJkwI2XYRnSJdL41GujjkUt2pRo0atpXs3XffbebOnWvee+89myRX4w4lsUN1zhfJ80ziIHdxoDI1VFTeK+n29NNPZ7rM7bffbr744gvz448/mqjixLg777zTad26dZrHbrrpJuf88893hgwZ4tSsWfOk19SpU8cZOHCg/fs///mPMmLOZ5995nv+448/to9t27bN99gZZ5zhjB8/3qlQoYLvsQ0bNtjlPv30U3t/y5Ytzi233OIUKVLEKVasmNOqVStn48aNIXuPI0aMcEqXLu0UL17cuffee50jR46kWW758uV2f/S/68SJE/Y1eq1rz549zimnnOLMmDEjzesrVarkTJo0Kdf7i/iS29/YsmXLnLx58zr79u3zPd+mTRunR48evvsPPPCAjd3U1FR7//Dhw05ycrIzf/58e/+yyy6zy7j0OxwzZozvvl47a9asXL3Pd999165Hv5WmTZs6p512mnPeeec5X331VZav02uef/55p2XLlnafBw0aZB8fN26cU6VKFefnn3/O8HU7duywn+HIkSN9j23atMm5/vrrnaJFi9p11ahRw3n//fd9zwezTrc8eO+997JcZ3rpP1t9fypzmjVrlmEc1K1b126zUKFCvsdV7mnbFStWtOvTZ3n22WcHHAePPfaYLUP//vtvXxz069fPrsc/DlJSUmx56/9dEAfxEwf+5UFSUpJz8cUXZ1ge6BiXL18+5+DB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4sSJZs6cOYwfA8Qp/+OCbv44LsQvjgnRg4QYACAgp5xyih3cs1y5cuaGG24wzZs3t+MaPP7446ZWrVonLa8Boh999FH7tw7c69evt62JXDfffLPp2bOn7766Q6oFkK5+uV0sTz/9dJsQyajLpBd+//13+//ChQvN5ZdfbpKTk02dOnWybXWl/VZSRsko7fOwYcPs4+PHjzeTJk2y718JRL1/fVaNGze2yUS18vr444/NqFGjfOvSrEItW7Y0xYoVs+uqWbOm+eCDD3zP52SdSiRltc5AKm7t2rUzU6ZMMe+//769Unn++efbMS3USk2z45111ll2mfQtvJQ0C+azTE+t3xR37k0tFP3pfamFWrRTt5cBAwYEtKyWo5tMfFH5oBaVKveCoeVV5sZK0hdA4DguJC6OCdEjKdI7AACIPT/88IMdC0xN+Tt37mxnxFHLIXWlk5UrV5rvvvvOJkPk888/t62L/Ft4XXbZZTah41IrJ7X4UZPwc889165PLa1y2sUyN5R0Uos2dUNUJVSJnl9++cUkJWV+2FRXQrXc0thbWm7nzp12/A+9H733WbNm2QThX3/9ZT+zb775xj4/Y8YMc/HFF5t77rnHfj49evSwycDPPvvMJq+U4CpYsKDdRrDrvPDCC+3rtF+nnXZahusMhMbpUpJPySe3q6b+V6JLiTB9b+oSqzFPNMaFHnfp81MrtmA+S39KMqprrt6vuunqvj+9R50kKAGnsc+ila7qKkEYKI0jQreI+HDw4EHz6quvmltuueWkcQ79u51n1sKyU6dOZsSIEWb06NGmcOHCnu8vgPDguJCYAj0mHD58OMPjAseEEHPguenTp6vTtzNp0qRI7wqACOvSpYstDzZs2ODEkjvvvNPJly+fc/rppzunnHKKfQ958+Z13nrrLfv8Nddc43Tv3t23/H333ec0bdrUd/+BBx5wmjVrlmad3333nZMnTx5nx44dzl9//eUUKFDAeeKJJ5y2bdva54cOHeo0atTIt/xll11m1+OqUKGCM2bMGN997dOsWbNy9T7fffddu55HH33U99iPP/5oH0tNTc30dXq+V69eaR6bOHGi06ZNG/v3L7/8Yj+3cePGOStXrrRxoM/z008/tc83btzY+fDDD+3ftWvXdgYPHpzhdoJd53PPPWf37eyzz850nRnx/2zXrl3rlC5d2jl69Khz7Ngx55xzznHuueceu81nn33WSUpKcgYNGmSXHThwoNOvXz/798aNG0869gXyWbr+/PNPZ9SoUc6SJUucpUuX2vUqXubMmZNmub1799p1Llq0yIlm1atXt/vJjVtOb6tXr450GAMIIY4L3HJz45gQGrQQAwAERK1+1ERbV6s0hpha+LRp08Y+d/fdd9sWSrpalTdvXjswrJZx/fPPP+bUU09Nsz5189O4YGoZVqBAAdsFT+NRqXWW6HF1k4wEtWZylSlTxv6/Y8cO23ItM+o+6O/777/3tW5TF8ZLL73Utv6S559/3rbi8t/G7t277d/333+/bYGlMbrULVWf8XnnnZejde7bt8/+fdttt5mhQ4dmuM7saJtq+afvW63CfvvtN9t6Tl0X1S1WY2D4b1PdJ/35byfQz1LU6uzBBx/03dc+qEurror6txJTyzf3ims027t3b1DL66qvWh0i9mmGsOeeey7X69FA2wDiB8eFxMQxIbqQEAMABERd7c4++2z798svv2zHg5o8ebIdKF9d6TTGmLrwKbmlro7+4yIouaHEij91E1BCR93/9Folv5Q8URNxt0umBm+PBP/ufG53hvSD3Wb0+fg7duyYL1njjofm0mekm7veVatW+aba7tq1qx0oXmN1KYH11FNP2fHA1G0x2HXqe5Ebb7zRdsnMaJ3ZSb9NJcL8x/Hy73q5YsUKU61atTSv91820M8yM5pIQOPW+VN3UdGsl9GsSJEivjHqAqGuqP/617883SeEh5LEOvlRd2K3W7lLFxjOOOMM+/f27dtPKkdE3cd1QSJWJhUBEBiOC4kp0GOCLkLfcccdJ72eY0JoMag+ACBoagXWv39/M3DgQNv6SwmkO++80850qJtaJLlJFFHrLw2Wn37acI0jpoSYbkqIab1KkqkVkBJjl1xyiYlVSh66SUANeK9E1JIlS+ysUWphtWfPHtuCq3fv3ubMM89MUynSgKndunWzY7Dpec1ClJN1avD87NYZzPtQsksJLm1L29S21VJNCdCpU6eaDz/80Nx1113GK0ryua3MXEqeap/832s0UoI4synV09NywQ60i+hVqVIlWx4qya+EV/qbK6PndPvyyy/t66N5jDwAweO4kJgCPSboYjHHBO+REAMA5IgGA1UFze3iqJZNmp3xo48+st0n/elK1v79+82PP/6Y5nElwdQNT48r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Qrr9WbNmmSVLlpiyZcue9FynTp3Ma6+9FvJtEge5iwMlqLz4PtzbjBkzwhIHuebAc9OnT9dlMmfSpEmR3hUAYbR161Ynb9689vef3U3LaXnEj86dOzvly5d3jh07lubx/fv3+753/Z3e0aNHnXLlyjldunRxos2dd97ptG7dOs1jN910k3P++ec7Q4YMcWrWrHnSa+rUqeMMHDjQ/r1s2TIb6/v27fM936ZNG6dHjx6++w888ID9bFJTU+39w4cPO8nJyc78+fPt/csuu8wu46pQoYIzZswY3329dtasWbl6n++++65dz4gRI5ymTZs6p512mnPeeec5X331VZav02uef/55p2XLlnafBw0aZB8fN26cU6VKFefnn3/O8HU7duywn+HIkSN9j23atMm5/vrrnaJFi9p11ahRw3n//fd9zwezzuXLl9t9e++997JcZ3rpP1t9f8WLF3eaNWuWYRzUrVvXbrNQoUK+xzdu3Gi3XbFiRbs+fZZnn312wHGgfU5KSnK+++67LOOgdOnSTr58+ZyDBw/6vgviwNs4mDt3bobLqwzr1KmTff/p4+Dtt98O6rPMzKpVq+z6PvvsszSPT5061TnrrLNytE7EBi+OQ/Lll1/a5U455RSnfv36tvxQjK1cudI+7/5+tP4CBQrYMqdfv3423nNL5dl9993n9O3b1ylWrJhzxhln+MqN7D6HoUOHOmXKlLFlrFtmlCpVypk4cWKGrztx4oTz6KOPOueee659P3pfekzbU91D703r0/4E6tdff3XOPPNM54cffjipvHBVqlQppOfCxEHu46Br1672vSxZssT3WE7jIKPvIyOhjoNQICEWBiTEgMSkCodO0AJJiGm5xx57LNK7jBDZu3evrUypYqGkl/9t+/btvu9df6d/XjfFgk4YtZ5okr7C8/3339vKYMOGDX0J4KVLl/qeX7FihZMnTx5n/fr19v7o0aNtJdzfs88+m6biqqRKSkqKM2HCBHv/iy++cPLnz+8cOHAg7AkxVSyVPFCy4eabb7bbyqrSq9eoAvryyy/b97x582bnzz//tMkDJXTknXfese9XFc0BAwY4zZs3tyf1a9assRVgt3J+3XXXOVdeeaV9ndalfVq8eLF9Lth16m/tW+PGjTNdZ0bSf7YXXXSR/V4UB0qKXXrppfa7uuqqq2xiRZVorddNCPknQtx6kD5LJUKU5PL/LDOLgxtvvNE555xzbLJM63CTxZdcckmaOFDyWbH26aef+r4L4sDbOJAff/zRFwe33HKL869//csZNmyYTWQrUbdw4cI0caDffzCfZWZ69uxp4yI9JdK1HW0P8cmL45COtfotdejQwcb0Bx98YOPLPxHy4Ycf2vuKc8WZyhfFfXYJi0DouFa4cGFn8ODBztq1a21iV/s8b968LD+HggULOnfccYdNROkmt912m03QiD4PlSElS5a05fTjjz/u/N///Z99TokjNyH25ptv2u3rfau8+uabbzJNpKR3/Phx5/LLL3fGjh1r72eWEGvbtq3d51AhDnIfB25yb9B/9z03caD9KFKkiN2GPrNu3bo5O3fu9DwOQiEp0i3UACBeaQD99N0kM6PlNObCunXrPN8veG/37t3m8OHDZsiQIfaWmTPOOCPL9WzatMmcd955JpqouX3BggXt2BN6j3nz5rXdDs466yzbXUldtdQdQ/T3ZZddZrtuyebNm0/qTqGub+oS9+eff9qxqDQW0qOPPmrHU9N4JPpf69Og6eF2xx132DGRRN9jzZo1zS+//GLOPffcTF/Tvn172y3ApS6zl19+ualdu7Yd40rjb2k8D42Bpc9NEykMGDDAVKtWza7/yy+/tN0OtmzZYtq0aWNfJ+5n6HZNCWadq1evtq/7448/7Ph0Ga0zOyqbFI9du3a141ItXLjQfl/6/tVdTvRZaZ0aT0zvW2NaubQvbtcUxfR3332X5rPMLA7UrUOD8Kobca1atcxzzz1n/vWvf9l90cysLo1Xcuqpp9oYCzXiIOM40HHrxhtvtN/dv//9b9tlVd1mtU11Y9X+fPzxx3Yf/bs+BvtZpqcxgtTtxn/GXpdbvigONBkA4lOoj0PTp0+3ZYh+pypH1M3st99+s93MXG+++ab9v1+/fjZedVNXcd3XJEnah9xQueh299MYgHo/CxYssJMwZUZdxdWdXL83d7yo999/307UI+oap8/po48+MqmpqfaYqvJE1L155cqV9m+VMxpfqnnz5nY8Lo0HeOGFFwa03xryQ2X2/fffn+Vy+szd7YUKcZD7OBB3rMncxIGOVzfddJMdk03HI00Ydc0119h1+4+f60Uc5BYJMQDwiDuAfqD27dt3Un97JLa///7bRBud3GqMHo0PpDE7VBF2K1aqNGqA89GjR9tKoSqXWsb1zz//2EqmPyU5NC6Yxj1SZe7888+3FfXx48fb5/W4TrgjQZVRV5kyZez/O3bsyPLk3T9JI99//71vwF4lBy699FLTo0cPe//5559P85vXNpRMFZ1cKKGkZJMqp/qM3eRosOtU2SK33XabGTp0aIbrzI62qRMLfd8q2/T9Kqml8Ur0Hc+fP9+ePIgG7NXg5kpcuOOZKDnicivH/p9lZnGgyUd0oqMJSHQyo1iYPHmyqV+/vu+zcqkCf/DgQRNqxEHGcaCkpU4WdcKmz75u3bp2jBr/bbpJOJf/dgL9LNNTIlBlo07y0jvttNPs/17EAeL3OPTzzz/b2PR/PH0iwE0uKGHiUvJZyQcl7ZU8yI30v0H9PvTbyIqS2m4SRNauXWsTwZpYQ5+NLlzoN6okhMYo1QUmd0xDjbnn0lh8uiirZJESG9dee61p2bKl/VyzojGqlAxfsWJFms8lI/pthvp3SRzkPg7EPTbkNA7c44r//uh96OKYtnXFFVd4Gge5RUIMADxSpEgRe9UoUBqgOFoHhUZwfvzxR5sU0CDTOkn0p4qATv5l+/btaWZJc2mgalX0onHweO2vpimXl19+2dSpU8cmKNT6RxUnzQKoE1ZVzlThuvnmm32vVQVcJ9T+VKnUibwqTXqtEh6qSCkJ8sMPP9jp0NWqJBL8K4Fu5VcDl2cl/fepK9fuSbqSQ/7P6zNyK7Fa76pVq0zfvn3tfbXA0RVuXeVV4uKpp56yrX/uu+++oNep70XUmueee+7JcJ3Z8d+m1qsTDM1o6MZBsWLF7EmRu6z2QXGwZ88e+5jei0uV9PSfZWZxoB6ISqDpfejqu7jbTZ8w1m9Lg/2HGnGQ+ftQIkw3l1ohuBQPap3mz3/ZQD/L9NQSQsnSjFrYuoM1exEHiN/jUDTw/224v4/clDNuwsN/Gf0+3WS7JihxlStXziaDPvnkE3tx49577zUjRoywFyjS75c/1VmVrPFPAqnlaO/evW1iRa1J/X+bof5dEge5jwP3+89NHGRESTV9xmoB7J8Q8yIOcouEGAB4RAdetW4IpNukTvh0daVUqVJh2Td4S1cXVRlR03SdfPrzn3lNFZSMEmLqLqXXR3uXHyVF1Cxe3aTURUz7rFYb6pqgCqhi2q2UiVr96Gqukhz+V1fV8kddFFR5HTZsmF2vkiOqiCkxpquvsUqVdbfSrWnP1Z1MM3GplY0+CyWMdHVWJxCaDt3t3uFWTtW1QTfNFKjPSEmLYNepbmnZrTOY96Fkv9s1Ra2XlMDV1XZdhdb61FpJU7ArDtzyz/+Ku3sF/P8Pt2WyjAPFjLpc+MeBrn6Lf8JYJwC6afloFI9xoGSXTpL840DfvVoKqoXghx9+aJNtoaTWGeoK6t8SzZ+S6Non//eK+BaK45Biedq0abacUfkjimd/6gqm2PMvt3SsVjmkLnrRQEkIlY9KghQtWtT+DlSW6qZubDNnzrRd75QMf+ONN9K8Vp+Rkki6qaWpWm3qt57VLNnqTq5Wpv6UwNfj/l3G3d+ml629iYPg48C9CN+2bdtcxUFG1Fpu165dvpbA4YqDnMhdJ1cAQKZ0BT79CV9mtJz/GAWIbYULF7ZdxF544YWAx5Fz6aReU4erQqf1RDs1sVdC1+3iqBYtSoxorAp1V/CnVm/qVqAWdP5UOVL3Kz2uE3v3MY0TpK5nGSUNI03dD1RRXLp0aZbLtWrVyo45oquiei8a96hJkya2sq3WOer6p4q6rtbqSrarV69eNrmgBIBa2qgC7raMyuk6R44cmek6Re/Hf3l/OnlQ0kuv0fetyrFabGmbOvHR2CFK9g4fPtzug7r6KQ50ZTk97av4tx7ILA4UX24lXRV8ddH5v//7P9siTTeXumeq5Zm6aIRTIseBvhON8eYfBzfccIMdU0gnodqHULcEUCsQnWBpbJqM6ARPn4H/iS/iX26PQzreqhWO6m26kKXfh34n4iZL3LLomWeesa2rNK6hxnpSAia340YFomPHjjZ5nRW1yNEFByV1RL9DdZ3W70GJK5UZek6/Wf1OXfodq2WVkhUbNmywy+g16qqeFZW5avHuf1NCWuNQ+bcOVetdld1XXXWV8RJxEFwcqI7qJvlyEwf6HNWqWRdkdFzXmGetW7e2F1D8W4eHKw6CRUIMADyiK0W6GhMILRctV5YQGmpqvnXrVju5QjC0vF6n18cCdSfr2bOnrRwqIaLxljSukU6qGzZseFLlWS3mlOjyp/EmdBVT3UvdLldKjiiZGG1XEl268qquBdmNhaEKoSrQSpBqWQ0Ur1Y76k6tVi4ffPCBbcmjiqg+A5feu67OKlGhsTzUpVrjQuVmnaroZ7ZO0fvJbOxDnQzoBEpX3FX5VXc1DYCvgYmVxFLFevDgwbYbo1o2unGQUYJKY4WJumVkFwfugOxKgqjVoAZk1/6745W5FHsXXXSRCbdEjgOd+GiMGf840Hq0TXV9DXUrLe233otaH/oP0uxPLR+4uJR4cnsc0sWnd99913YtVvmj1pZuF223davbgl8JFHXNU+tKdc0bOHBgWN6jBjzftm1btsupVaaGGVCyW61F9Trd9HtV12gl0JWU8G9Nq/JBrUTVCleJFJXN+jzc7u25paSRulW6F0O8QhwEFwfp62JFcxgHKo81pqgSbTqe6PPQBRldoHBb2oUzDoIW6WkuE8H06dN9040DSCwnTpxwnnrqKTv9c758+WxZ4N50X4/reS2H+NOqVSunUKFCdmpr1/79+30xoL/9aTlNn+0/lXisUSxXqVLFGTVqVIbPr1692ilVqpTz999/O9HKnYrc/3vLjcOHD9tYqF69ujNjxgxnz5499vHdu3c7kydPdmrWrGmnRfdqnaF8P8OGDXNKlCjhjBw50rf+Q4cOOR9//LHTuHFj55133gl7HGiaea3L/QxChTjIfRyE0wcffGA/h6NHj4Z924guoSh/pk2b5uTPn985ePCgJ+WBl6ZMmeIUKVLEefTRR51169bZz0O/iy+//NK5/vrrndGjR4f1/TRs2NB57bXXnHAjDrKOgwcffDCs7yVScZAdEmJhQEIMgE4YHnvsMado0aK2PDj77LPt/WBPfhBbVMm64IILbFJs5syZzrFjxzJMiKmCopNZLXfhhRdGdbIoKzt27HCeffZZ5/TTT3f++uuvTJd75ZVXnO+++86JVl5UeFUR1fuuW7euXXeBAgWcpKQk5/LLL3cWLFjg6TpD/X4+++wz56qrrrLb04lCnjx5bOLlxRdfdI4fPx72OJg/f77z0UcfOaFGHOQuDsLtzTffdJYsWRL27SK65LT8mTp1qvP55587GzZscGbNmuWceeaZzu233+57PpYSIW6yp02bNk5ycrItD3QBtlKlSs7w4cNtIj1c7+fPP/90nn766bBf+CUOso8DlZcmTO8lUnEQCBJiYUBCDICrS5cutjzQgRaJQckttfjS916uXDmbCHUTYp9++qkzdOhQ+7jua7lYTYaJ3kNKSkpUXAFUCxZVhDO6aT8ze65FixaeV3j1HW/evNl3xdnrdXr1ftQiaMuWLbY1Uk7jQJ93Zt+FvsPcIg4iFwfB8DoOkDhyehzSyXqFChWcU045xalYsaLTq1cv58CBAwH9fvSbyyx+lSjWLbPn9Vov6YLbr7/+ahMSwZYHSnpntt+6RTPiIPs4CPSY8FkMx0EgmGUSAAAPaSyk2bNn2zE7NKORZk50aXwkDViqgVw1S5vGXIhlgU4iEQ4a1+PWW2/N8Dl95hoYPLPntm/f7nlMuGNkRfM6s6OxQdzp2nMaB5MmTcr0u3DHGssN4iBycRAMr+MAiSOnx6GHHnrI3nKibNmydtypnL7W63G1NMtsTmiyjpy+r0gjDtJK1DgIBAkxAADCQMkunfSNHj3aTnetWelWr15tByCPhdkkY41OonN6Iu11IgT/k9MKeqCIg9jgdRwAXicbNMlFvNGFgXh8X14hDmITCTEAAMJIyS+3BYdm8QEAAAAQfnkjsE0AAAAAAAAgYkiIAQAAAAAAIKHQZRIAwtwPXwNnRtPg44hMt0mvB1BF7qWmpnq6/h07dtj/S5UqFdPvI955/flt27bNFChQwJQoUcLT7RAHQHT/jg4fPmz++usvO6xCoUKFjJcoD6L38zt48KDZu3evKVq0qD1v8Aox8P+REAOAMNIsWr///rvJkydPpHcFEbRv3z4bB4hOKSkpJjk52XTo0MHEC70fvS8EjjgA4KI8QDzGQTIxQEIMAADAX/ny5e2V0507d3q6nVatWtn/586da7ymCq/eF6IvDjQD7QUXXGBeeOEF4zXiAIje8kCzT3fv3t306NHDdO7c2XiN8iA642D27NnmiSeeMMOGDTMtWrQwXkohBkiIAQAApKcKoteVRHWTk3r16nm6HUR3HIi6RxEHQGKXB3v27LH/a0gFyoPEjYOVK1fa/ytVqkQchAGD6gMAAAAAACChkBADAAAAAABAQiEhBgAAAAAAgIRCQgwA4simTZvsDJarVq3KdJlFixbZZdyxKhB/iAMIcQAhDgC4KA9ADKRFQgwAEkyjRo3Mtm3bTJEiRez9KVOmmKJFi0Z6txBmxAGEOIAQBwBclAdolEAxwCyTAJBgNLNd6dKlI70biDDiAEIcQIgDAC7KAxRIoBighRgARJEDBw6Yjh07moIFC5oyZcqYUaNGmaZNm5pevXrZ59V8efbs2Wleoys2unLjb82aNfbqzqmnnmpq1aplFi9enGEzaP3dqVMns3fvXvuYboMHDw7Tu0VmiAMIcQAhDgC4KA9ADIQWCTEAiCJ9+/a1B6Q5c+aYefPm2YPQihUrcrSe3r17m5UrV5qLL77YtGzZ0uzateuk5XQgHDt2rClcuLBtGq1bnz59QvRukFPEAYQ4gBAHAFyUByAGQouEGABEif3795vJkyebkSNHmiuuuMLUrl3bTJ061Rw7dizodfXs2dO0adPGVK9e3UyYMMGOAaB1Z9QkWs/pao+aRuumK06IHOIAQhxAiAMALsoDEAOhR0IMAKLE+vXrzZEjR0zDhg19jxUvXtxUq1Yt6HXpSo8rKSnJNGjQwKSmpoZsX+Ed4gBCHECIAwAuygMQA6FHQgwAYoiuzjiOk+axo0ePRmx/EBnEAYQ4gBAHAFyUByAGgkNCDACiRJUqVUz+/PnNN99843ts9+7dZu3atb77JUuWtH33XevWrTMHDx48aV1Llizx/a1m1MuXL7dNojOiptDHjx8P4TtBbhAHEOIAQhwAcFEegBgIvSQP1gkAyAH1x+/SpYsd5LJEiRKmVKlSZsCAASZv3v9du2jWrJkZN26cbeasA1O/fv3sgTG98ePHm6pVq9oD25gxY+zBsnPnzhlut2LFinZMggULFpg6deqY5ORke0NkEAcQ4gBCHABwUR6AGAg9WogBQBQZMWKEadKkiZ3ppXnz5qZx48amfv36vuc1tXK5cuXsMu3bt7ezvGR0QBo+fLi96aD1xRdfmLlz55qUlJQMt6nZY7p162batm1rryo988wznr5HZI84gBAHEOIAgIvyAMRAaOVx0ncwRcjNmDHDBuOkSZNsRhdA4urataudwWXDhg2mUqVKAb2madOmpm7dunbKY8QHzQy0cOHCk8Z4yApxEH8qV65s/1d5ECjiID7He9EVfV15DxRxAMQf1QtUPxg2bJjp379/wK+jPIgvOk/Q+cL06dNNu3btAnoNMZBztBADAAAAAABAQiEhBgAAAAAAgITCoPoAEOUWLVoU6V1AFCAOIMQBhDgA4KI8ADGQc7QQAwAAAAAAQEIhIQYAAAAAAICEQkIMAAAAAAAACYWEGAAAAAAAABIKCTEAAAAAAAAkFGaZBID/2rJli9m5c6en23DX/8MPP5jdu3d7uq2UlBRTvnx5T7cBAAAAALGIhBgA/DcZVr16dXPw4MGwbK9Vq1aebyM5OdmkpqaSFItCpUqVMueee26kdwMRxm8TAAAgckiIAcB/W24pGTZt2jSbGIt1SoR16NDBvi9OuqPPjh07zJo1ayK9G4iCRDwAAAAig4QYAPhRMqxevXqR3g0AAAAAgIcYVB8AAAAAAAAJhYQYAAAAAAAAEgoJMQAAgDDbt2+fOXLkiDl06JBZvXq1vQ8AAIDwISEGAAAQJsuXLzddunSxM43+9ttvZtu2baZu3bqmdOnS9nE9DwAAAO+REAMAAPDY/v37TevWrU2DBg3MJ598Yh5++GHfc59++qkZOHCgmT9/vn1ey2l5AAAAeIeEGADPqVvQ2Wefbb766qscvb5p06amV69evvsVK1Y0Y8eO9d3PkyePmT17dkj2NdGl/2yj1QsvvGBatmxpYs2vv/5qHnvsMbNkyRJ7v0aNGva+Hkf8UnKrWbNmNvE1c+ZMs2HDBtO3b1/f8xdccIHp37+/2bhxo31ey2l5kmIAAADeISEGIEt33XWXTTjplj9/flOpUiXz0EMP2XFvgkle6HWNGjXK0T6888475oknnjCx6KeffjLdu3c31atXNyVKlDBVq1Y1d955p/n666+jap3Z2bVrlxk8eLA9cS9ZsqQpX768ue666+zJu+M4Id/exx9/bC666CJTqFAhu702bdqYTZs2+Z7v3LmzWbFihfn8889NLNBnNHz4cFOhQgXz5JNPmoMHD9rHU1NT7X09rue9+CwRebfffrtZs2aNWbRokWnbtq3Jly9fhsvpcT2v5bR8hw4dwr6vAAAAiYKEGIBstWjRwo5zo1YNY8aMMS+++KIZNGhQQK/VCf64cePs2Dg5Vbx4cZsYiQVHjx71/a0ER8OGDc2JEyfMyJEjzeLFi80rr7xiKleubFq1amUeeeSRoNfvxTqzM2/ePHPOOeeYZcuWmT59+tj7SlJef/31NlF59dVXmwMHDoRse2oloy5jaiGzatUqmxzbuXOnuemmm3zLFChQwLRv3948++yzJhY8/fTT9rvR93b8+PE0z+m+HtfzWg7x5dtvvzVz5841L730kqlXr15Ar9FyEydONHPmzGFMMQAAAI+QEAOQrVNOOcUO+FyuXDlzww03mObNm9uxbh5//HFTq1atk5bXANGPPvqo/Vsnc+vXr7etiVw333yz6dmzp+++ukOqBZpaRLhdLE8//XQ7zk5GXSa98Pvvv9v/Fy5caC6//HKTnJxs6tSpk22rK+33hAkTbDJK+zxs2DD7+Pjx482kSZPs+1cCUe9fn1Xjxo1tMlGtvJToGTVqlG9dmzdvtt0AixUrZtdVs2ZN88EHH/iez8k6lcjMap2BnMy3a9fOTJkyxbz//vu29cr5559vxzlSKzXNjnfWWWfZZVxqyaXPRUmzYD5Ll96fkkRDhw41VapUsckBJeKUHPNPOOp9KdHwzz//mGim7pADBgwIaFktR/fJ+KLyQS0qVe4FQ8urzNXrAQAAEHokxAAE5YcffrBjgamFjrqtqcuXWg65Vq5cab777jvTqVMne19d2tS6yL+F12WXXWa7BLnUyiklJcX3mNanxEdOu1jmhpJObvJF+61Ez7Fjx7J8jboS3njjjeb777+3n4laM2lcqFmzZtl16H8lrsqWLWsHzr7yyitt8m/GjBk2gfb333/b9fTo0cMcPnzYfPbZZ3Zdai1UsGBB+1yw63RbbKlFWWbrDMR9991n16fkkxJu+u7UhfHWW281Dz74oHnmmWdsl1g9p3GP0id3gv0spX79+iZv3ry25ZsSY3v37jX/+c9/bCJW3XZdSsppfd98842JZmrpowRhMMurZSW32L8pdqdNm2a7nitxqzHB/G8u/V7T3/S7VTk6ffp0s2/fPo+iEwAAIHGREAOQrffee88mUU499VRTu3Zts2PHDjsgtFoGqbucEhcu/a2kibrwua2elLTxpxZfSqD8+eefZvfu3fbvBx54wJcQ0/8aq0oti8LtjjvusC2vlMAZMmSI3f9ffvkly9eo655OXPWe1RJEySq1jNJnpdZxSgSpNZVaZv3xxx82caRET7Vq1WyLrS+//NKuZ8uWLeaSSy6xr9O61CXx0ksvtc8Fu0613BI9l9k6s7Nu3Trb2qtr16523Ur6nXvuubZ1YJMmTcxzzz1nW/MpOar9Ues0f0qGBftZisabU7dMDTKu1olFixa1rabeeOONNMspPooUKWLXG83eeuutk7pJZkZdJ9UNVQlBbrF/U+zqN6LWtLoo4H9Tq1vXGWecYcvY9De9Tok0//HzAAAAEBpJIVoPgDimRIy67ajVgsYQS0pKsoOcy913321bRY0ePdqeAKo1g5Zx6WROiTR/atmkccHUMkzJFHXBU6JGrbNEjytpFgkaoN5VpkwZ+78SgEoEZUYtlfypJZbbuk1JIiWg1PpLnn/+eduKy38bSgrK/fffb5NcSgapNZQ+4/POOy9H63RblNx2222262FG68yOtqnEpL5vJS1/++03Ox6cWmmpW6y6K/pv003Cufy3E+hn6SbxFFeaKECJNrWgU+s4dSFTMs6/tdVpp53mG6A+WqmVUDD0mwg0aYnotmfPHtvtOLfcVqQAAAAIHRJiALKlsafOPvts+/fLL79sx4OaPHmyHShfXenUikctmHQir66O/mPlqCukEiv+lNDQCb9agum1Sn4peaIuQm6XTLUuigQlf/z30221k93n40/d+JSo8R8PzaXPSDd3vepOqNZ2opZYanGnsbqUwHrqqafseGDqthjsOvW9iFp13XPPPRmuMzvpt6lEmH+XRf+ul5rxUa3T/PkvG+hnKUqMquWXumO61O1M4ympe6Rmn3T99ddftgtnNNN7cceoC4R+a0r8IfYpSazksVpwKrnsTxcY1DJMtm/fflI54nYf1wWJWJlUBAAAIJbQZRJAUNQKTF3ZNG6VWn8pgaSWPOoqqZtaJLlJFFHrL41tpfF0/LnjiOmmhJjWqyTZiBEjbGJM3fxilRIabhJQA94rEbVkyRLbbU4trNRqRC24evfubc4888w0J8pK+nTr1s0OSK/nNTNdTtapbpPZrTOY96FklxJc2pa2qW2rpZoSoFOnTjUffvihHScpFNTiS/HgL1++fCcl1NR19NChQzbGopkSxO7+Z0fLBTv4OqKXuv+qPFSSXwmv9DdXRs/ppu7Uen3FihUj+j4AAADiEQkxAEG75ZZb7Im728VRLZs0O+NHH31ku0/6U+sGDR79448/ZjiOmB5Xgsd97LXXXrNdEDNqLRFp6jKo7n5Lly7NcjnNOPnmm2/a1kt6Lw8//LAdc0ut4ZTI0qDxShyqq6Ra1rk0k6aSTBs3brQtrtSqpHr16rla58iRIzNdp+j9+C/vT4kmJT31Gp2Ua6ZJdV3UNjVmmmYc1SD9SoRqH0LVUkvjjqlljMZP0jhm2m9tr0KFCmmSX5qwQeOiaSbKaKYWeukTwpnRcuouivhQuHBh2+1XE08EOo6cfwtNzSarMQq1HgAAAIQWCTEAQVOrsJ49e9ouber2o3G3NL6VkisNGzZMs2yJEiVstz0luvxpkHcNOK3uRG7XOyXEdNIYqfHDsqPWUD///HO2Y1apZZWShjoR1rKPPvqobb2lbnMad0sD4atFlxJM+gxceu8aF0wJqxYtWtjB6DU+WG7WqRZVma1T9H4yG+NK3RyV8FILQA3qfe2119qJEDSIvZKZWo+2qVZ+/i3ScqtZs2Z2LLrZs2fbBJj2W0k4JVz9Wx9q3LRYSB5p8gnN1BkILaflET/uvfdes3XrVju5QjC0vF6n1wMAAMADDjw3ffp0NQ1wJk2aFOldATxx4sQJp0qVKs6oUaMyfH716tVOqVKlnL///tuJVsuXL7e/U/0fCocPH3ZatWrlVK9e3ZkxY4azZ88e+/ju3budyZMnOzVr1nS2bt3q2TpD+X6GDRvmlChRwhk5cqRv/YcOHXI+/vhjp3Hjxs4777zjhNsPP/xgY8r9DGLhN/LUU085efPmdfLly2e/G/em+3pcz2s5xB/9bgsVKpTm97h//35fDOhvf1quYMGCTuvWrSOwtwg3xUCzZs0ivRsAImzBggW2PFC9C4lLOQPFgXII8B4txADkiloMaVwpzQyobm0Z0YD5ammkbnuJQoPcq4XTQw89ZN+7Wm2plZO6FWqA+GeffTbolkBerDMQGjNO3SrVLVLdE7Ufaqn14IMPmjvuuMO0bt3ahNu2bdvMq6++agesjwVqbadurmpdN2DAAJOcnGwfr1Gjhr2vx/W8/wyaiB9qIasWtGr9+vrrr2fafVLdJGfOnGmXU2zodw0AAABvMMskgFwpVaqUnUly4sSJplixYpkuF6oB17Py5JNP2ltG1LUzs3HJNBZXoF3agqHkht63bhpHzZ0R0b/bXzSsMxD6jDQWmSY82LFjh531zr9rZjCuueYaO/5XZsk33bLTvHlzE4uUsBwyZIj54osv7Lh76cfWQ3xSt3B93x06dLBj/WmiC/8LCBozTwPoa8wwdZNUklnJMP+ZXAEAABBaJMQA5Eqgg4WHg2ZSvPXWWzN8TgkjDRCf2XPbt2/3dN90Yhvqk1sv1pkdtUjTyXxuTJo0KdPvonjx4rlaNxCt9FtVC8/ly5ebCRMm2Bl1/ScfUTmkAfS7d+9uJ8kAAACAt0iIAYgbSqbkNKHidUIM/3PmmWdGeheAiFGyS0nh0aNH226RmvhCE0ZUrFiR2SQBAADCiIQYAABAmCn5pfH43HEWAQAAEF4Mqg8AAAAAAICEQkIMAAAAAAAACYUukwDgJzU11dP1a3bFdevWmVtuucXO1Bir7wO5U7lyZXP8+PFI7wYirE6dOpHeBQAAgIRFQgwAjDEpKSkmOTnZdOjQISzbGz9+vOfb0PvR+0L02bBhg1m8eHGkdwMRtnr16kjvAgAAQMIiIQYAxpjy5cvbVlU7d+70dDuPP/64mTNnjpk7d67nsy0qGab3BQAAAABIi4QYAPyXkkdeJ5DcFlu1atUylSpV8nRbAAAAAICMMag+AAAAAAAAEgoJMQAAAAAAACQUEmIAAAAAAABIKCTEACCObNq0yeTJk8esWrUq02UWLVpkl9mzZ09Y9w3hQxxAiAMAAIDMkRADgATTqFEjs23bNlOkSBF7f8qUKaZo0aKR3i2EGXEAIQ4AAECiYpZJAEgwBQoUMKVLl470biDCiAMIcQAAABIVLcQAIIocOHDAdOzY0RQsWNCUKVPGjBo1yjRt2tT06tXLPq+uTbNnz07zGrXmUKsOf2vWrLEtP0499VRTq1Yts3jx4gy7SOnvTp06mb1799rHdBs8eHCY3i0yQxxAiAMAAADvkBADgCjSt29fe7I6Z84cM2/ePHuCumLFihytp3fv3mblypXm4osvNi1btjS7du06aTmdJI8dO9YULlzYdpvSrU+fPiF6N8gp4gBCHAAAAHiHhBgARIn9+/ebyZMnm5EjR5orrrjC1K5d20ydOtUcO3Ys6HX17NnTtGnTxlSvXt1MmDDBjg+kdWfUXUrPqSWIuk3pptYoiBziAEIcAAAAeIuEGABEifXr15sjR46Yhg0b+h4rXry4qVatWtDrUisQV1JSkmnQoIFJTU0N2b7CO8QBhDgAAADwFgkxAIgharnhOE6ax44ePRqx/UFkEAcQ4gAAACDnSIgBQJSoUqWKyZ8/v/nmm298j+3evdusXbvWd79kyZJ2XB/XunXrzMGDB09a15IlS3x/q4vV8uXLbXepjKib1PHjx0P4TpAbxAGEOAAAAPBWksfrBwAESGP1dOnSxQ6AXaJECVOqVCkzYMAAkzfv/65dNGvWzIwbN852gdJJa79+/exJc3rjx483VatWtSe9Y8aMsSfSnTt3znC7FStWtOMVLViwwNSpU8ckJyfbGyKDOIAQBwAAAN6ihRgARJERI0aYJk2a2Fngmjdvbho3bmzq16/ve37UqFGmXLlydpn27dvbGeAyOlkdPny4vemE9osvvjBz5841KSkpGW5TM8t169bNtG3b1rY4eeaZZzx9j8gecQAhDgAAALxDCzEAiLJWIf/5z3/szfX+++/7/i5btqz5+OOP07xmz549aVp3uGMKtWvXLsNtNG3a9KRxhzTznG6IDsQBhDgAAADwDi3EAAAAAAAAkFBIiAEAAAAAACCh0GUSAKLcokWLIr0LiALEAYQ4AAAACA1aiAEAAAAAACChkBADAAAAAABAQiEhBgAAAAAAgIRCQgwAAAAAAAAJhYQYAAAAAAAAEgqzTIZBvnz5TMWKFU1SEh83kOhOP/10Wx44jhPpXUEmtmzZYnbu3OnpNk477TRToUIFs2LFCuO1lJQUU758ec+3g+CVLl060ruAKKBjQrFixSK9GwAAJBwyNGFw/Phxs2nTJnPs2LFI7wqACDtw4IAtD/LkyRPpXUEmybDq1aubgwcPhmV79evX93wbycnJJjU1laRYFPrjjz8ivQuIAjomVK5cOdK7AQBAwiEhBgDAf6llmJJh06ZNs4mxWKdEWIcOHez7IiEGAAAA/A8JMQAA0lEyrF69epHeDQAAAAAeYVB9AAAAAAAAJBQSYgAAAAAAAEgoJMQAIEz27dtn/vrrL9/YTroPAEhc7nFg7969ZvXq1RwXAAAIIxJiAOCx5cuXmy5duphSpUqZWbNm2ceuu+46U7p0afu4ngcAJOZxwb1ft25djgsAAIQRCTEA8Mj+/ftN69atTYMGDcwnn3xiHn74Yd9z06dPNwMHDjTz58+3z2s5LQ8ASMzjwqeffspxAQCAMCIh5rFff/3VvPnmm/bv3r17mxo1apjHHnvMPg4gfukkplmzZvYEZ+bMmWbDhg2mb9++vufPO+88079/f7Nx40b7vJbT8vF88nPkyBFz9tlnm6+++ipHr2/atKnp1auX737FihXN2LFjfffz5MljZs+eHZJ9TXTpP9to9cILL5iWLVuaWKM6gFsX2LJlC3WDBJHdceGCCy5IuOMCAACRRELMI47jmOHDh5sKFSr4TtA0PoTGDXryySft43peywGIP7fffrtZs2aNWbRokWnbtq3Jly9fhsvpcT2v5bR8hw4dTDS66667bMJJt/z585tKlSqZhx56yBw6dCio5IVe16hRoxztwzvvvGOeeOIJE4t++ukn0717d1O9enVTokQJU7VqVXPnnXear7/+OqrWmZ1du3aZwYMH2xP3kiVLmvLly9vuvzp59+J49sYbb9huZMnJyfa4OWLEiDTPd+7c2axYscJ8/vnnJtbqBqoLHD161Bw/fpy6QYKIt+MCAACxjoSYR55++mnzyCOPmBMnTpxUsVXlV4/reS0HIL58++23Zu7cueall14y9erVC+g1Wm7ixIlmzpw5UTt2TIsWLcy2bdtsq4YxY8aYF1980QwaNCig16ocHDdunB0bJ6eKFy9uChUqZGKBEh0uJTgaNmxoy/2RI0eaxYsXm1deecVUrlzZtGrVyh4LguXFOrMzb948c84555hly5aZPn362PtKUl5//fU2UXn11VebAwcOhGx7H374oU0gdOvWzfzwww/m+eeft3GnOHIVKFDAtG/f3jz77LMm1uoGqgv4o24Q3+L1uAAAQExzEHJbt2518ubNqyxYtjctp+UBxI/OnTs75cuXd44dO5bm8f379/t++z/88MNJrzt69KhTrlw5p0uXLk60ufPOO53WrVuneeymm25yzj//fGfIkCFOzZo1T3pNnTp1nIEDB9q/ly1bZsu7ffv2+Z5v06aN06NHD9/9Bx54wH42qamp9v7hw4ed5ORkZ/78+fb+ZZddZpdxVahQwRkzZozvvl47a9asXL3Pd999165nxIgRTtOmTZ3TTjvNOe+885yvvvoqy9fpNc8//7zTsmVLu8+DBg2yj48bN86pUqWK8/PPP2f4uh07dtjPcOTIkb7HNm3a5Fx//fVO0aJF7bpq1KjhvP/++77ng1nn8uXL7b699957Wa4zvfSfrb6/4sWLO3Pnzs1wecVup06d7Pt3bdy40W777bffDuqzdLVr1865+eab0zz27LPPOmeddZZz4sQJ32OLFy92ChQo4Bw8ePD/tXcncDbX7eP/r2EMxpp1VJYsiYgM5kuWwVjLUmQLZY07biI3odIist/dREKULCVbdoZRCnUPWjQoIpV9y9jGjPN/XO//78w9yxnOzJxtzuf1fDzOY+ac81nenzPvOefzuc71vt42X8a5gbU587mgv2elzwUArhUZGWneC8aNG+ftpsCL5s6da/rB4sWLvd0USwj0dkDOH+m3eTqsyBl6HTVo0CBp376929sFwP2uX78uH330kalrtGDBgmTP3bx5M/H3a9euOcym6dmzpxkWNnXqVMmfP7/4Ks3Y0VpgOsRLh629/vrrJnNIh9Kpffv2yQ8//GAyiJQOadPsoqQZXg0bNjRZZnaa5VSkSBEzTOihhx4y29NMq4wOscyMmTNnmkwkHYY4evRo6dKli/z6668SGJj2x6YOJdTMLa29pcudO3fO1IXS49Fj1xlGX3nlFblw4YJ5zfbs2WOeX7JkidSpU0f69etnXp8XXnjB1Fv78ssvJU+ePGZoZN68ec0+0rvN2rVrm/W0Xblz53a4TWfo59S4ceNMv7YP1dSfjRo1kvvvv9/83XRIrNbC0rpH+ridvn6axZae19L+/6JDJZPSY9A6W8ePHzd1zpQWH4+PjzfHrnXmfBXnBtbl7OdCWhmWWeVzAQCALMfbETl/VKlSJae+AebGjRu3tG7ff/+9zdcyxLJnz27LkyePLWfOnIlZLMuXLzfPt2zZ0jZgwIDE5QcNGmSyguw0s6tx48bJtvnDDz/YAgICTEbThQsXTJbPm2++aevUqZN5/q233rLVrVs3cXlPZoi98soriY8dOHAgWeaaI/r8kCFDkj02Z84ckwWnfv31V/O6aXbXvn37TLaHvp7bt283z9erV8+2YcMG83vVqlVtY8eOdbif9G7zP//5j2lb+fLl09ymI0lf28OHD9tCQkJMpopmtzz44IO2fv36mX1qxlZgYGBiRpxmBI4YMSJZhph+05me19Lu/fffN9lsW7dutSUkJJiMuIceesisnzLL7J577rEtWLDA5ss4N+Dmb58LAFyLDDEoMsQ8iwwxN9Di+elRsGBBUxcFQNb3yy+/mOLYmXXlyhXxNZr1M2vWLJPFoO9ZmuFjz2Dp27evyVDSDIZs2bLJ4sWLk72vaYZErly5km2vSpUqpi6YZoZpLahHH33U1KPS7Cylj3sr40ezmexKlChhfp45c8ZkrqVFM5WS+vHHHxOz2zZt2iQNGjQw2V9K62FpFlfSfVy8eNH8/s9//tNkYGmNroiICPMa66ykGdnm33//bX7v3LmzvPXWWw63eTe6T83807+3ZoX9+eefJntOJ1fQgvdaFynpPr///vtk6yfdj7Ovpb1PHTlyxPQJzRTUzJjBgwebTDztYykzxzTr0pdxbmBd/vy5AABAVkZAzA0KFCggf/31l9PL33vvvWYGNwBZnwYD9MJHh43Zhw/aaSCpePHi5vdvv/3WDC9LSYcJauDJF4vH61C78uXLm9/nz58v1apVk3nz5plC+ToUKGfOnGYInwa3NIDRoUOHxHV1SJ0GVpLS4WMa0NHhf7quBr80eKJDiOxDMrV4uzckHc5nH+amBc/v9vokpcP4NFCjdAhk0uf1NdKbfbv79++X4cOHm/t9+vQxBerXrVtnAljjx4+XKVOmmCF06d2m/l3Uk08+aYZkOtrm3aTcpwbC9GaXdOilzvhYsWLFZOsnXdbZ19K+rBaX1/+nU6dOmVktIyMjzXM6eUBSOmRUn/dlnBtYl7OfC6dPn071PuLrnwsAAGRlzDLpBnoRmNZU2inpckkvGgFkbQ888IAJHmgwRy9sUt7stDaSo+e//vprs769PpKv0gydUaNGyZgxY0z2lwaQnn32WTPTod40I8keRFGa/XXw4MFUs+5qHTENiOlNA2K6XQ2Sab0cDYw99thjklVp8NAeBKxXr54JRO3evdvMJqgZVpcuXTIZXMOGDZP77rsv2YVyyZIlzeyKWoNNn9eZ6TKyzYcffviu20zPcWiwSwNcui/dp+5bM9U0ALpw4UIzM6Srgzj6OanHosE+e220pMEvzSK7ceOG6WO+jHMD63L2c8HRc1npcwEAgKyGgJgb6LfwKS/60qLL6bAQAP5Bh3Vp0XAtMK4Bg/TQTBwtMt+1a9csUTj56aefNhfu9iGOmtm0bds22bhxoxk+mZRmN8TGxsqBAweSPa5BMB2Gp49rgMf+2CeffGKGIDrKlvA2HTKow/00y+9O2rRpI5999pnJXtJjGTlypNSvX99kw2kgKzQ01AQOdaikZtbZDRkyxASZfvvtN5NxpVkllSpVytQ2tah9WttUejxJl09KA00a9NR19KJci4Jr4X7dpxb7bteuncnk0kCotsFVmVo6gYD+H2kgVbPddLikHrtOWpCUTtigGWPlypUTX8a5gXVZ6XMBAICshICYG+iMWzoblzN0OV0egP/4xz/+ISdOnJDly5enaz1dXtfT9bMCzQobOHCgTJw40Qz70bpbWt9KgythYWHJli1cuLAZtqeBrqSqVq1qaiVpLSr70DsNiOlFo6/OGKjZUIcOHbprzSrNrNKgoV4I67I6G6Rmb+mwOa27tX79epPRpQEmfQ3s9Ni1LpgGrFq0aGFmk9T6YJnZpg5RTGubSo8nrRpX9qGLmgF47NgxadWqlZw9e9bM9KjBTN2O7lOz/JJmpLmCZp1p4E8zBTVoqvuwz5xpp1ljWSF4xLmBtVnlcwEAgCzFw0X8LeP27du28ePHm1nYdBa1pLME6Sxg+rg+r8sB8D9t2rSx5cuXzxYdHZ34WGxsbOL7wE8//ZRseV0ub968trZt29qyKn0/K1eunG3KlCkOn9cZ0ooVK2a7cuWKzVfp30H/Pkn/bplx8+ZN0xd0hsElS5bYLl26ZB6/ePGibd68ebaHH37YduLECbdt05XHo7NeFS5c2DZ58uTE7d+4ccO2adMmM6PlihUrbJ6m/0fap+yvQVY6N9BzAc4NrOVunwv6u799LgBwHrNMQjHLpGeRIeYm+o26DmXRb9A1K8JeUFeLaI8ePdo8rs/bCwwD8C+aCaWZUprltGzZsjSHyehwmKVLl5rl9P1h0aJFkhVpxpDWldLi5zqMzhEtmK+ZRjpszyq07tWqVavkX//6lzl2zdrSoYY6rFD/1u+++266M4HcsU1naM04HVapwyJ1eKK2Q4dQDh06VLp37y5t27YVTzt58qR89NFH5vM1q50b6LmA1mPTYcecG1iD1T4XAADwdcwy6WZ6UaKFcbWIsc7opbOxAfB/OvxP62l169bN1HTSguZJA0U//PCDCWpobRgdDqPBBL3oSTpjX1ZSrFgxM5PknDlz5J577klzOU/MmqezuenNER3amVZdMq3F5eyQtvTQ4IYet960jpp9RsSkkw74wjadoa+R1iLTCQ/OnDljZr1LOjQzPVq2bGnqf6UVfNPb3UREREhWPTd4/fXX5eOPPzb3U9bWgzU/F3Q2SS2g7y+fCwAA+DoCYgDgJnoRo0Gv6OhomTVrlpk50U4LJGvwQn8OGDDAFEPPypwtFu4JOpNix44dHT6nr7kWiE/rudOnT7u9T7j64tYd27wbzUjTi/nMmDt3bpp/i0KFCmVq20BW/FzQyUf86XMBAABfR0AMANxML2r04n/q1Kkmo0eHna1bt87MqsisYa6nwZSMBlTcHRDD/9x3333ebgLgE58LOuRX78+fP1/KlCnD5wIAAB5CQAwAPEQvcuyBGp3tj4seALA2++eABsW0ziIAAPAciuoDAAAAAADAUsgQAwAghZiYGPEH/nIcAAAAgKsREPMAnVJdp6gPDOTlBqxOCyrr+4EvFaHH/+hMmcHBwWYWOH+hx6PHBd9DHTUo/UwoXLiwt5sBAIDlEKHxgISEBDly5IjEx8d7uykAvCw2Nta8HwQEBHi7KXCgVKlSJqvq3Llzbp8J87vvvjMzzbmbBsP0uOB7/vzzT283AT5APxNKly7t7WYAAGA5BMQAAEhCg0fuDiDly5fP/KxRo4Zb9wMAAADAMYrqAwAAAAAAwFIIiAEAAAAAAMBSCIgBAAAAAADAUgiIAQAAAAAAwFIIiPmBY8eOmRnr9u/fn+YyUVFRZplLly55tG0APIv3Ayj6ART9AIp+AACAYwTELKJu3bpy8uRJKVCggLm/YMECKViwoLebBcALeD+Aoh9A0Q+g6AcAACsK9HYD4BlBQUESEhLi7WYA8AG8H0DRD6DoB1D0AwCAFZEh5gOuXr0qPXr0kLx580qJEiVkypQpEh4eLkOGDDHPawr7qlWrkq2j39rpt3dJHTx40HzDlytXLqlSpYrs2LHDYSq8/t6zZ0+5fPmyeUxvY8eO9dDRArgT3g+g6AdQ9AMo+gEAAO5BQMwHDB8+3JyUrF69WjZv3mxORPbu3Zuh7QwbNkz27dsnderUkdatW8v58+dTLacnQ9OnT5f8+fOb9Hi9vfTSSy46GgCZwfsBFP0Ain4ART8AAMA9CIh5WWxsrMybN08mT54sTZo0kapVq8rChQslPj4+3dsaOHCgtG/fXipVqiSzZs0ydSB0247S4vU5/cZP0+P1pt86AvAu3g+g6AdQ9AMo+gEAAO5DQMzLjhw5InFxcRIWFpb4WKFChaRixYrp3pZ+22cXGBgoNWvWlJiYGJe1FYB78X4ART+Aoh9A0Q8AAHAfAmJZgH5DZ7PZkj1269Ytr7UHgPfwfgBFP4CiH0DRDwAAyBgCYl5Wrlw5yZEjh+zZsyfxsYsXL8rhw4cT7xctWtTUb7D75Zdf5Nq1a6m2tXv37sTfNZU+OjrapMU7ounwCQkJLjwSAJnF+wEU/QCKfgBFPwAAwH0C3bhtOEFrMvTu3dsUOi1cuLAUK1ZMRo8eLdmy/S9W2bhxY5kxY4ZJddeTkxEjRpiTo5RmzpwpFSpUMCc306ZNMydMvXr1crjfMmXKmLoUkZGRUq1aNQkODjY3AN7D+wEU/QCKfgBFPwAAwH3IEPMBkyZNkvr165vZfiIiIqRevXoSGhqa+LxOr12yZEmzTNeuXc1MP45OSiZMmGBueuKyc+dOWbNmjRQpUsThPnUGof79+0unTp3MN4sTJ0506zECcA7vB1D0Ayj6ART9AAAA9wiwpSw6AJdbsmSJOUGZO3eu+ZbPGeHh4VK9enUz7TUA/9GnTx8zq9fRo0flgQcecGod3g/8j84Wt23btlR1f+6EfuB/ypYta37q+4Gz6Af+WQNMs7w0G8tZ9APA/+h5gZ4fjBs3TkaNGuXt5sBL9DpBrxcWL14sXbp08XZz/B4ZYgAAAAAAALAUAmIAAAAAAACwFIrq+6ioqChvNwGAj+D9AIp+AEU/gKIfAACQeWSIAQAAAAAAwFIIiAEAAAAAAMBSCIgBAAAAAADAUgiIAQAAAAAAwFIoqi8iv//+u5w7d85t2//tt9/Mz+PHj8vevXvFnYoUKSKlSpVy6z78kbv7gKfRDzLm4MGDEhsb69Z92PvZDz/8IOfPn3frvipUqCAFChRw6z4Af+WJz4W4uDjz093nBorPBd8+P7hy5Qr9AAAAD7N8QExPdCpVqiTXrl1z+77efPNNc3On4OBgiYmJ4WTHR/uAp9AP0u/ixYsSGhrqsX7Qrl07t+9j+PDhMnHiRLfvB/A3nv5c0Pced+Nzwbf7wXfffUc/AADAwywfENNv/fREZ9GiReakJyvTE5xu3bqZY+JEx5p9QNEPMiZv3rzSuHFjWbt2rfz73/+WBg0aSFYUHx8v/fr1kwMHDkizZs283RwgS+JzAYp+AACAf7N8QMxOT3Rq1Kjh7WbAi+gD1pYjRw757LPP5PHHH5cxY8ZIZGSk1KpVS7KS27dvS8+ePeXHH3+UFStWSEREhLebBGRpfC5A0Q8AAPBPFNUHgP8nV65csnr1aqlatao0b97cBJayCpvNJgMHDpSPP/7Y3Fq3bu3tJgEAAACAzyIgBgAphk6uW7dOypQpI02bNpXDhw9LVgiGjRgxQmbNmiVz586Vzp07e7tJAAAAAODTCIgBQAoFCxaUTZs2SaFChcywQ50h1pe99dZbMmnSJFP7rFevXt5uDgAAAAD4PAJiAOBA0aJFZevWraa2WJMmTeTkyZPii6ZPny6vvvqqCYr985//9HZzAAAAACBLICAGuMG7774rPXr08HYzkEn33nuvKa5/8+ZNM3xSZ+byJR988IG8+OKLMnLkSBk1apS3mwMAAAAAWQYBMcAN9ZyWL18uCxcuNPcPHTokISEhcuXKFae3oQGOQYMGubGVcJbWEtNMsbNnz5pC+5cvXxZfsHjxYnn++edNIf23335bAgICvN0kwKG4uDgpX768fPPNNxlaPzw8XIYMGZLsf1IzI+20769atcolbbW6lK9tVu4DWktxypQpmWi1NbmrD3gD51IAgLshIOZGzz33nLRr1y7V41FRUebk7dKlS15pF9xL/74NGzZMDFC8/PLL5oQsX758ic+3bdtWSpQoIXny5JHq1avLJ598kmwbL730kgmoHT161CvHgOQqVqwomzdvNn+Pxx9/XK5evZrhbc2cOdNccOiMlmFhYfLtt9+mexs6E6ZmID777LOmbhjBMLjzc0z7l950+PADDzwg//rXv+TGjRtOb2P27Nlmvbp162aoDStWrJA333xTsqKff/5ZBgwYIJUqVZLChQtLhQoVzP/trl27fGqbzvaBbNmySfbs2SV//vzSokULWbp0qfkSyJV9QPuW7lNn+w0MDDTnUY76wK+//io1atSQnDlzmvvbtm1L9vyYMWNk3LhxXv8Swx/6gDp//ryMHTtWatWqZUoKlCpVynweOtsH0sNRH0hJyxh07dpVHnzwQdMvkwZM7TiXAgDcDQExwMUWLVqUOFzy999/l7Vr15oTOzv9hvyRRx6Rzz//XH744Qfp2bOnWV6XsytSpIjJRtJZA+EbqlWrJhs3bpTvv/9ennzyyXQFBOyWLVsmQ4cOlddee0327t1rtql/5zNnzji9jS1btkjHjh3lqaeeMkMm9UIAcCcNfOjFp15UTps2Td5//33Th52hF8ozZsyQ3r17Z3j/OrmF/QsFX3fr1q3E3ydMmGCC3rdv35bJkyfLjh075MMPP5SyZctKmzZtzJcl6eWObd7NX3/9lVhL8T//+Y+ZwEP3rzcNUul72J2+JEhvH0hISJDcuXObmog6qYmjPhAfHy9z5syRRo0ayf79+xO/bNDJUOyqVKki5cqVM5/JnuSPfUC/ENLA03fffWeCTHpfg5RPPPGEU30gvRz1gZS0lIEG5jTwqZ+ljnAuBQC4K5vFRUdH69da5qerPfvss7a2bdumenz79u1mnxcvXswyx+LPXPm6Xbt2zda8efPE+5MmTbLVrFnzruu1atXK1rNnz2SPLVy40Hb//fenuw30A/eKioqy5cqVy9amTRtbXFxcutatXbu27YUXXki8n5CQYLv33ntt48ePd2r9L7/80pY7d27b448/brt582a62w7f0bhxY/N/6uscfY499dRTtkcffdT2+uuv2x5++OFU61SrVs02ZswY8/t3331ny5Ytm+3vv/9OfL59+/bJ/g8GDx5sXouYmBhzX/t2cHCwbcuW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AAAATilQoIBs2rRJihYtKhEREXLs2DHxZYcPHzbBuzJlyphgXt68eb3dJJ9BQAwAAAAAACAds7VqcfqcOXNKkyZN5K+//hJfpME6bV/hwoVNEK9gwYLebpJPISAGAAAAAB7w7rvvSo8ePbzdDAAuUKJECYmMjJRbt26ZTLGzZ8+KLzl58qRpV1BQkAneaUYbkiMgBgAAAABuZrPZZPny5bJw4UJzX2sPhYSEyJUrV5zexsiRI2XQoEFubCWA9ChdurQJNl24cMEU27906ZL4Ap1JVoNhN2/eNEG7e++919tN8kkExAAAADzkueeek3bt2qV6XGeqCggI8JkTaQCup//nDRs2NP/r6uWXXzbBrXz58iU+37ZtW5N1ooW7q1evLp988kmybbz00ksmoHb06FGvHAOA1B588EHZsmWLGZ7YqlUriY2NzfC2Zs6caWp9adH7sLAwMzNkel2+fNkE5zQopsE63R4cIyAGAAAAAG62aNGixOGSv//+u6xdu9YEye2++eYbeeSRR+Tzzz83M8L17NnTLK/LJa1bpBe6s2bN8soxAHBMZ2/UGl0//fSTCWzfuHEj3dtYtmyZDB06VF577TXZu3evVKtWzfy/nzlzxultXL16VR5//HH57bffTJCuYsWK6W6HlRAQAwAAAAA3un79uvz5559SoUIFc//TTz81F7v33Xdf4jKjRo2SN998U+rWrSvlypWTwYMHS4sWLWTFihXJttW6dWtZunSpx48BwJ3VqlXLBLB37dolTz/9tKktlh5Tp06Vvn37mmB45cqVZfbs2RIcHCzz5893an0NwmkW+vfffy8bN240AXbcGQExAAAAAHCRPXv2mIvhd955J/Gx1atXm6wRu6+++kpq1qzp1NCnQoUKJXusdu3a8scff5jhWQB8S4MGDWTlypUmW6x79+6SkJDg1HpxcXESHR1t6n7ZZcuWzdzXANvdaPCtY8eOsnPnThOU0/cJ3B0BMQAAAA/SE9W8efMmu7Vs2dLbzQLgImXLljVDlpJmdWhGWOfOnRPvHz9+/K5FrnWd7777zmSLJGVfT7cBwPfoMEcd/qiTaPTr109u375913W03pcGz4oXL57scb1/6tSpO66r6+nwas0K04xSrVUI5xAQAwAA8KBGjRrJ/v37k93mzp3r7WYBcJGiRYtKhw4dTBaXBrS0/k9QUJDcc889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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "real_d = RealAnsatz({N: 1, S: 1}, n_layers=2)(d)\n", "real_d.draw(figsize=(12, 10))" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "### TensorAnsatz example" ] }, { "cell_type": "code", "execution_count": 11, "metadata": {}, "outputs": [], "source": [ "from lambeq import TensorAnsatz, Symbol\n", "from lambeq.backend import tensor\n", "from lambeq.backend.tensor import Dim\n", "\n", "\n", "class UnitSpiderAnsatz(TensorAnsatz):\n", "\n", " def _ar(self, functor, box):\n", " # step 1: obtain label\n", " name = self._summarise_box(box)\n", "\n", " # step 2: map domain and codomain\n", " dom, cod = functor(box.dom), functor(box.cod)\n", "\n", " # step 3: construct and return ansatz\n", " syms = Symbol(name, 2, 2)\n", " tnsr = tensor.Box(box.name, Dim(2), Dim(2), syms)\n", "\n", " return tensor.Spider(Dim(2), len(box.dom), 1) >> tnsr >> tensor.Spider(Dim(2), 1, len(box.cod))" ] }, { "cell_type": "code", "execution_count": 12, "metadata": {}, "outputs": [ { "data": { "image/png": "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", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "ansatz = UnitSpiderAnsatz({N: Dim(2), S: Dim(2)})\n", "positive_d = ansatz(d)\n", "positive_d.draw()" ] }, { "cell_type": "code", "execution_count": 13, "metadata": {}, "outputs": [ { "data": { "text/plain": [ "array([-8., -8.])" ] }, "execution_count": 13, "metadata": {}, "output_type": "execute_result" } ], "source": [ "import numpy as np\n", "\n", "\n", "syms = sorted(positive_d.free_symbols)\n", "sym_dict = {k: -np.ones(k.size) for k in syms}\n", "subbed_diagram = positive_d.lambdify(*syms)(*sym_dict.values())\n", "\n", "subbed_diagram.eval()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Contributions\n", "\n", "We encourage you to implement your own {term}`readers `, {term}`rewrite rules ` and {term}`ansätze ` and [contribute to lambeq](https://github.com/CQCL/lambeq/pulls) -- detailed guidelines are available [here](../CONTRIBUTING.rst). Below you can find some sources of inspiration:\n", "\n", "- rewrites for relative pronouns: {cite:p}`sadrzadeh_2013`, {cite:p}`sadrzadeh_2014`\n", "- rewrites to deal with coordination: {cite:p}`kartsaklis_2016a`\n", "- rewrites to reduce the dimension size of verbs: {cite:p}`kartsaklis_2016b`\n", "- rewrites to language circuits (DisCoCirc): {cite:p}`coecke_2021a,coecke2021b`\n", "- ansätze benchmarked by their expressibility: {cite:p}`sim_2019`\n", "- high-level examples of ansätze: [\\[link\\]](https://pennylane.ai/qml/glossary/circuit_ansatz.html)\n" ] } ], "metadata": { "language_info": { "name": "python" } }, "nbformat": 4, "nbformat_minor": 4 }