diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..66366d9e --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 1b90b7a87d83483e91aa630c474b09cf +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.doctrees/algorithms.doctree b/.doctrees/algorithms.doctree new file mode 100644 index 00000000..2afe8908 Binary files /dev/null and b/.doctrees/algorithms.doctree differ diff --git a/.doctrees/api.doctree b/.doctrees/api.doctree new file mode 100644 index 00000000..6a9788f4 Binary files /dev/null and b/.doctrees/api.doctree differ diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle new file mode 100644 index 00000000..c04b7f8f Binary files /dev/null and b/.doctrees/environment.pickle differ diff --git a/.doctrees/example_grover.doctree b/.doctrees/example_grover.doctree new file mode 100644 index 00000000..f51ff5c5 Binary files /dev/null and b/.doctrees/example_grover.doctree differ diff --git a/.doctrees/example_grover_hash.doctree b/.doctrees/example_grover_hash.doctree new file mode 100644 index 00000000..f9505d10 Binary files /dev/null and b/.doctrees/example_grover_hash.doctree differ diff --git a/.doctrees/example_grover_subset.doctree b/.doctrees/example_grover_subset.doctree new file mode 100644 index 00000000..ab0ec374 Binary files /dev/null and b/.doctrees/example_grover_subset.doctree differ diff --git a/.doctrees/example_grover_sudoku.doctree b/.doctrees/example_grover_sudoku.doctree new file mode 100644 index 00000000..4edf0743 Binary files /dev/null and b/.doctrees/example_grover_sudoku.doctree differ diff --git a/.doctrees/example_unitary_of_f.doctree b/.doctrees/example_unitary_of_f.doctree new file mode 100644 index 00000000..eb495212 Binary files /dev/null and b/.doctrees/example_unitary_of_f.doctree differ diff --git a/.doctrees/generated/qlasskit.algorithms.grover.Grover.doctree b/.doctrees/generated/qlasskit.algorithms.grover.Grover.doctree new file mode 100644 index 00000000..867c1835 Binary files /dev/null and b/.doctrees/generated/qlasskit.algorithms.grover.Grover.doctree differ diff --git a/.doctrees/generated/qlasskit.algorithms.qalgorithm.doctree b/.doctrees/generated/qlasskit.algorithms.qalgorithm.doctree new file mode 100644 index 00000000..af1f4c17 Binary files /dev/null and b/.doctrees/generated/qlasskit.algorithms.qalgorithm.doctree differ diff --git a/.doctrees/generated/qlasskit.qcircuit.gates.doctree b/.doctrees/generated/qlasskit.qcircuit.gates.doctree new file mode 100644 index 00000000..5cf73239 Binary files /dev/null and b/.doctrees/generated/qlasskit.qcircuit.gates.doctree differ diff --git a/.doctrees/generated/qlasskit.qcircuit.qcircuit.QCircuit.doctree b/.doctrees/generated/qlasskit.qcircuit.qcircuit.QCircuit.doctree new file mode 100644 index 00000000..764bb3c5 Binary files /dev/null and b/.doctrees/generated/qlasskit.qcircuit.qcircuit.QCircuit.doctree differ diff --git a/.doctrees/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.doctree b/.doctrees/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.doctree new file mode 100644 index 00000000..dbd3478b Binary files /dev/null and b/.doctrees/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.doctree differ diff --git a/.doctrees/generated/qlasskit.qlassfun.QlassF.doctree b/.doctrees/generated/qlasskit.qlassfun.QlassF.doctree new file mode 100644 index 00000000..b6b350a1 Binary files /dev/null and b/.doctrees/generated/qlasskit.qlassfun.QlassF.doctree differ diff --git a/.doctrees/generated/qlasskit.qlassfun.qlassf.doctree b/.doctrees/generated/qlasskit.qlassfun.qlassf.doctree new file mode 100644 index 00000000..a4c9f5d2 Binary files /dev/null and b/.doctrees/generated/qlasskit.qlassfun.qlassf.doctree differ diff --git a/.doctrees/generated/qlasskit.qlassfun.qlassfa.doctree b/.doctrees/generated/qlasskit.qlassfun.qlassfa.doctree new file mode 100644 index 00000000..ebb69191 Binary files /dev/null and b/.doctrees/generated/qlasskit.qlassfun.qlassfa.doctree differ diff --git a/.doctrees/how_it_works.doctree b/.doctrees/how_it_works.doctree new file mode 100644 index 00000000..9dced07f Binary files /dev/null and b/.doctrees/how_it_works.doctree differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree new file mode 100644 index 00000000..f4191034 Binary files /dev/null and b/.doctrees/index.doctree differ diff --git a/.doctrees/quickstart.doctree b/.doctrees/quickstart.doctree new file mode 100644 index 00000000..148665af Binary files /dev/null and b/.doctrees/quickstart.doctree differ diff --git a/.doctrees/supported.doctree b/.doctrees/supported.doctree new file mode 100644 index 00000000..32b3e62a Binary files /dev/null and b/.doctrees/supported.doctree differ diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/_images/27a749800d923fb69b5d38e7722422621f8acf4ee5c2b6f517f89d74a936444a.png b/_images/27a749800d923fb69b5d38e7722422621f8acf4ee5c2b6f517f89d74a936444a.png new file mode 100644 index 00000000..ded32487 Binary files /dev/null and b/_images/27a749800d923fb69b5d38e7722422621f8acf4ee5c2b6f517f89d74a936444a.png differ diff --git a/_images/293285b423513d39c4a73e871f2211a526039c0ce9d988d5f7d9abe704adabc2.png b/_images/293285b423513d39c4a73e871f2211a526039c0ce9d988d5f7d9abe704adabc2.png new file mode 100644 index 00000000..ea911e7e Binary files /dev/null and b/_images/293285b423513d39c4a73e871f2211a526039c0ce9d988d5f7d9abe704adabc2.png differ diff --git a/_images/44c9a3aa43eda23fe096518b175fdade8ee74a3e2c36a0a34f565ca369046c0b.png b/_images/44c9a3aa43eda23fe096518b175fdade8ee74a3e2c36a0a34f565ca369046c0b.png new file mode 100644 index 00000000..cfc19c7f Binary files /dev/null and b/_images/44c9a3aa43eda23fe096518b175fdade8ee74a3e2c36a0a34f565ca369046c0b.png differ diff --git a/_images/6f943927f4e7f022046baf725bd97d0234b6d284f35b8a8d70abbd49ae18d2e5.png b/_images/6f943927f4e7f022046baf725bd97d0234b6d284f35b8a8d70abbd49ae18d2e5.png new file mode 100644 index 00000000..0bea427e Binary files /dev/null and b/_images/6f943927f4e7f022046baf725bd97d0234b6d284f35b8a8d70abbd49ae18d2e5.png differ diff --git a/_images/7a0f3cedf6e4a1650b16511d1682a30006e6d7c7a06a8f5c9c6bb427bb630934.png b/_images/7a0f3cedf6e4a1650b16511d1682a30006e6d7c7a06a8f5c9c6bb427bb630934.png new file mode 100644 index 00000000..9aa772b1 Binary files /dev/null and b/_images/7a0f3cedf6e4a1650b16511d1682a30006e6d7c7a06a8f5c9c6bb427bb630934.png differ diff --git a/_images/99d44c6d50f9b254ae7c579012cd8627b241c498203712ce1fa7b4c31181df4d.png b/_images/99d44c6d50f9b254ae7c579012cd8627b241c498203712ce1fa7b4c31181df4d.png new file mode 100644 index 00000000..9dcaf170 Binary files /dev/null and b/_images/99d44c6d50f9b254ae7c579012cd8627b241c498203712ce1fa7b4c31181df4d.png differ diff --git a/_images/bb602c4172678c017a5af45866c85d482b8102b2ff0882f9016d844672451041.png b/_images/bb602c4172678c017a5af45866c85d482b8102b2ff0882f9016d844672451041.png new file mode 100644 index 00000000..04dfb018 Binary files /dev/null and b/_images/bb602c4172678c017a5af45866c85d482b8102b2ff0882f9016d844672451041.png differ diff --git a/_images/beafab15f915183b637909d537345580eba0f3a7fb66329311dd39909074d252.png b/_images/beafab15f915183b637909d537345580eba0f3a7fb66329311dd39909074d252.png new file mode 100644 index 00000000..9348565b Binary files /dev/null and b/_images/beafab15f915183b637909d537345580eba0f3a7fb66329311dd39909074d252.png differ diff --git a/_images/c11daf869c135eac3524304f0b40bd3d1ae514f73d769f0de4a9d577f9da51ba.png b/_images/c11daf869c135eac3524304f0b40bd3d1ae514f73d769f0de4a9d577f9da51ba.png new file mode 100644 index 00000000..cde433bd Binary files /dev/null and b/_images/c11daf869c135eac3524304f0b40bd3d1ae514f73d769f0de4a9d577f9da51ba.png differ diff --git a/_images/d19805380f7379838dd2610658b919af97837aa5f3ca65e2ac7eecb6b323453f.png b/_images/d19805380f7379838dd2610658b919af97837aa5f3ca65e2ac7eecb6b323453f.png new file mode 100644 index 00000000..ebd3fb21 Binary files /dev/null and b/_images/d19805380f7379838dd2610658b919af97837aa5f3ca65e2ac7eecb6b323453f.png differ diff --git a/_images/e3c3e1af20988afbd97c6296fc6554b3f8fe2c6a40f0e173027e03f2e4b29075.png b/_images/e3c3e1af20988afbd97c6296fc6554b3f8fe2c6a40f0e173027e03f2e4b29075.png new file mode 100644 index 00000000..ce92289a Binary files /dev/null and b/_images/e3c3e1af20988afbd97c6296fc6554b3f8fe2c6a40f0e173027e03f2e4b29075.png differ diff --git a/_images/ea41932c680a118cee625c379616f3eb2bc1845c772fc3b4c9431f50c80e16ed.png b/_images/ea41932c680a118cee625c379616f3eb2bc1845c772fc3b4c9431f50c80e16ed.png new file mode 100644 index 00000000..2f672fb4 Binary files /dev/null and b/_images/ea41932c680a118cee625c379616f3eb2bc1845c772fc3b4c9431f50c80e16ed.png differ diff --git a/_images/f988cf8271837cb1b9caf21c4d307e4857aa36b6b8b9f774cf372dec22e57051.png b/_images/f988cf8271837cb1b9caf21c4d307e4857aa36b6b8b9f774cf372dec22e57051.png new file mode 100644 index 00000000..c002eef1 Binary files /dev/null and b/_images/f988cf8271837cb1b9caf21c4d307e4857aa36b6b8b9f774cf372dec22e57051.png differ diff --git a/_sources/algorithms.rst.txt b/_sources/algorithms.rst.txt new file mode 100644 index 00000000..7f960b74 --- /dev/null +++ b/_sources/algorithms.rst.txt @@ -0,0 +1,6 @@ +Algorithms +==================================== + + +Grover search +----------------- diff --git a/_sources/api.rst.txt b/_sources/api.rst.txt new file mode 100644 index 00000000..9a31913d --- /dev/null +++ b/_sources/api.rst.txt @@ -0,0 +1,15 @@ +API +=== + +.. autosummary:: + :toctree: generated + :recursive: + + qlasskit.qlassfun.qlassf + qlasskit.qlassfun.qlassfa + qlasskit.qlassfun.QlassF + qlasskit.algorithms.qalgorithm + qlasskit.algorithms.grover.Grover + qlasskit.qcircuit.qcircuit.QCircuit + qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper + qlasskit.qcircuit.gates \ No newline at end of file diff --git a/_sources/example_grover.ipynb.txt b/_sources/example_grover.ipynb.txt new file mode 100644 index 00000000..e4bb4b2b --- /dev/null +++ b/_sources/example_grover.ipynb.txt @@ -0,0 +1,165 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Grover search\n", + "\n", + "We define a function named `and_all` that returns `True` iff all the element of an input list `a_list` are `True`. We want to use a Grover search to find the input value that led to a `True` result of the function." + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qlist, Qint2\n", + "\n", + "@qlassf\n", + "def and_all(a_list: Qlist[bool, 4]) -> bool:\n", + " r = True\n", + " for i in a_list:\n", + " r = r and i\n", + " return r " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The qlasskit compiler will produce an optimized quantum circuit performing the given function." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "and_all.export('qiskit').draw('mpl')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now can use our quantum function as an oracle for a Grover search. For instance, we want to find the input value that yeld to a `True` value of the function:" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit.algorithms import Grover\n", + "\n", + "q_algo = Grover(and_all, True)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Qlasskit prepares the quantum circuit for the Grover search:" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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zzp16iRJamxsPOl5GhoaWmwD+ElhYaGKiopUWFhoOhQAQIxFshYCbMZ6CAD8qz3roWO3sOjfv7+WLl16/IvQgN+wFvInGl2WuOaaa7Rz50797ne/02WXXabXX39d1157rS699FIdPXrUdHhIsP79+0tq/fKEx37GDdoBAAAAAAD8b926dZo6daq6deum5cuX85kQgJRDo8siPXv21KxZs/Tkk0/q448/1ty5c7VixQq98MILpkNDDOTl5WnHjh0nnaW3b98+VVdXt/jZhAkTJElvv/32Sc/zzjvvyHEcnXfeeXGLFTCluLhYM2bMUHFxselQAAAxFslaCLAZ6yEA8K9o1kPr1q3T5Zdfri5dumj58uUaNGhQAiIFzGEt5E80uiwQCoVOKmaO4+icc86RJFVVVRmICrE2bdo0lZeX69lnn23x8/nz55+07bBhwzR+/Hj96U9/0p49e47/fM+ePfrTn/6kyy67TH379o17zECi1dXVaePGjdyDDgB8KJK1EGAz1kMA4F+RrofWr1+vqVOnqnPnzlq+fLkGDx6ciDABo1gL+VOa6QAQfzU1NerXr5+mT5+uc845R2eddZaKi4v13//93+rRo4emTZtmOkTEwEMPPaRnnnlGt99+u959910NHz5cK1as0FtvvaXs7Gw5jtNi+5/97GeaMmWKPve5z+kb3/iGJOkXv/iFwuGwfvSjH5n4FQAAAKIW6Vro/fff14svvihJWrVqlSTpd7/7nVauXClJ+sY3vqFu3bol9pcAAABoh0jWQ7t27dLUqVN18OBB3XvvvXrrrbf01ltvtXi+6667TllZWYn+NQAgYjS6LNCpUyd985vf1Ouvv67/+7//05EjR443vr797W8fv18TUlt2drZWrlypBx98UAsWLJDjOJoyZYqWL1+uCRMmqGPHji22v/DCC/XGG2/o4Ycf1sMPPyzHcXThhRfqT3/6k8aOHWvotwAAAIhOpGuhdevW6Tvf+U6Lny1YsOD4f8+aNYtGFwAASCmRrIeKi4t14MABSdL3vve9Vp+vuLiYRheAlECjywIZGRl69NFHTYeBBBg8eLCWLFnS4mcHDhzQgQMHNHDgwJO2nzRpkl5//fVEhQcAABBXkayFZs+erdmzZycwOgAAgPhr63ro0ksvleu6iQ4PAOKCe3QBPlJfX3/Sz37wgx9IkqZOnZrocICk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", + "text/plain": [ + "
" + ] + }, + "execution_count": 4, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc = q_algo.export('qiskit')\n", + "qc.draw('mpl')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use our prefered framework and simulator for sampling the result; this is an example using `qiskit` with `aer_simulator`.\n", + "\n", + "The `Grover` class, along with all circuit wrappers in qlasskit, provides utilities to encode inputs and decode outputs from a quantum circuit using the high level type definition. In the output histogram, it's now evident that the input leading to a `True` result in the `and_all` function is a list where all elements are set to `True`, aligning with our expectations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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MWPGoEuXLnB3d0d4eDgGDBiA8PBw/Pnnn2jdujWWLl2Kzp07Y8SIERg3blym9YwYMQITJkzAypUr0bZtW0RFRaFo0aKoX78+duzYkWn5TZs2ISgoCP369ct28Mqsrhz6+vri1q1bKrnkLzPGxJgYE2NiTIzpxYppy5YtaNGiBY4fP44yZcqo6dHR0Xj//fdx/PhxJCQkwNfXF61bt8bXX38NV1dXpKSkqLzlcX5+foiIiDB6THfu3IGHhwdiY2NN8+pek/RkzIVNmzYJABkwYECmedHR0eLg4CClS5cWEZF169YJAOnbt2+W6+rbt68AkC1btohI+kMqAKRSpUpZLv/HH38IABk5cuQz15cPpBAREVFesrgHUv755x8A6ZemH+ft7Y1y5crh3LlziI+Pf2ofwcf7JDo5OaFIkSK4ePGiQeae3fJERERElibfJYdJSUkAYNA/IKObN29Cp9PBxsYGAQEB8PHxwc6dO5GQkGCwXEJCAnbu3Al/f3/4+vqq6YGBgWre4zZu3AgAaNiwobHCISIiInqh5LvkUD/EzH/+859MD4bMmjULV69eRd26dWFnZwdN09CzZ0/Ex8dj7NixBsuOHTsW8fHx6NWrl8H03r17AwBGjhypElEg/YplaGgogoKC4OfnZ4rQiIiIiPK9fPdASmpqKpo0aYLt27fDy8sLrVu3hru7Ow4dOoStW7fCwcEBoaGhqF27NoD0K4T169fHkSNHEBQUhBo1auDQoUMICQlBrVq1EBYWBgcHB4MyevXqhblz56JixYpo1aoVoqOjsWLFCjg7O2P37t0GHVGfJi4uDm5ubqbrFEpERESUgalzj3yXHALpTwR///33+O9//4szZ84gKSkJhQsXRuPGjTF8+HCUL1/eYPnY2Fh88803+PPPPxETE4MiRYqgQ4cOGDVqFFxcXDKtPy0tDT/99BNmz56Nc+fOwdnZGc2aNcP48eNRqlSp56ork0MiIiLKSxaZHL5ImBwSERFRXjJ17pHv+hwSERERkfkwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKszV0BIiIiovyk1w+5+/yc/saohfnwyiERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKTk6+Rw1apVeP311+Hh4QF7e3v4+/ujY8eOiIyMNFguLi4OAwcOhJ+fH+zs7FCiRAkMHjwY8fHxWa43LS0N06dPR+XKleHg4ABPT0907NgRFy5cyIuwiIiIiPIta3NXICsigj59+mD27NkoVaoU3nvvPbi4uCAqKgphYWG4fPkyfH19AQAJCQkIDAxEeHg4goKC0LFjRxw+fBhTpkxBWFgYtm/fDnt7e4P1f/TRR5g7dy4qVqyIfv36ISoqCv/9738REhKCPXv2ICAgwBxhExEREZldvkwOf/zxR8yePRuffPIJfvzxR1hZWRnMT0lJUf//9ttvER4eji+//BKTJk1S04cOHYrJkyfj+++/x7Bhw9T0bdu2Ye7cuWjYsCE2bdoEW1tbAECnTp3QsmVL9O3bFxs3bjRxhERERET5kyYiYu5KZPTw4UMULVoUBQoUwJkzZ2BtnX3+KiIoVqwY4uLiEBMTAycnJzUvISEB3t7e8PLywvnz59X0Tp06YdmyZQgLC0PDhg0N1te4cWOEhobi8uXLKF68+DPVNy4uDm5uboiNjYWrq+tzRktERET5Ta8fcvf5Of2NUYvsmTr3yHd9DkNCQnD37l20adMGqampWLlyJSZNmoRZs2bh3LlzBstGREQgKioK9evXN0gMAcDJyQn169fHhQsXDPoohoaGqnmPa968OQAgLCzMBJERERER5X/57rbywYMHAQBWVlaoUqUKzp49q+bpdDoMGDAAU6ZMAZCeHALIto9gQEAANm7ciIiICPj6+iIhIQHR0dGoVKlSplvVGdejX29WEhMTkZiYqP6Oi4sDACQnJyM5OVnV08rKCqmpqUhLSzOov5WVFVJSUpDxgq2VlRV0Ol220/Xr1dNfTc14e/1J021sbJCWlobU1FQ1TdM0WFtbZzs9u7ozJsbEmBgTY2JML39MNsiNvIjJlPJdcnjjxg0AwH/+8x/UqFED+/btQ/ny5XH48GH07t0bU6dORalSpfDxxx8jNjYWAODm5pbluvSXWvXLPe/yWZk4cSJGjx6daXpISAgcHR0BAMWLF0f16tVx9OhRXLlyRS1TtmxZlCtXDvv27cPNmzfV9GrVqsHPzw/bt2/H/fv31fS6devCy8sLISEhBjtC48aN4eDggPXr1xvUoWXLlnj48CG2bdumpllbW6NVq1a4desWdu/eraa7uLigSZMmiIyMRHh4uJru6emJevXqISIiAmfOnFHTGRNjYkyMiTExJkuJCWiF3DB1TPoLaaaS7/oc9u7dG3PmzIGDgwPOnTsHHx8fNe/48eOoWrUq/P39ce7cOSxduhSdO3fGiBEjMG7cuEzrGjFiBCZMmICVK1eibdu2iIqKQtGiRVG/fn3s2LEj0/KbNm1CUFAQ+vXrh2nTpmVZv6yuHPr6+uLWrVsqueQvM8bEmBgTY2JMjOnFjemTGbm7cvhLP9PGdOfOHXh4eJisz2G+u3Kov6pXs2ZNg8QQACpVqoSSJUvi3LlzuHfvnlo2uyt9+lu++uWed/ms2NnZwc7OLtN0Gxsb2NgY7kxWVlZZ3r7O7iGb7KY/vt6cTNfpdNDpMncxzW56dnVnTIzpeaczJsYEMKbs6vi80xmT+WJ6HuaKyVjy3QMpZcuWBQC4u7tnOV8//eHDh0/tI/h4n0QnJycUKVIEFy9eNMjcs1ueiIiIyNLku+SwcePGAIBTp05lmpecnIxz587ByckJnp6eCAgIgI+PD3bu3ImEhASDZRMSErBz5074+/urAbMBIDAwUM17nH58w8eHuCEiIiKyFPkuOSxVqhSCgoJw7tw5zJ0712DepEmTcO/ePbRt2xbW1tbQNA09e/ZEfHw8xo4da7Ds2LFjER8fj169ehlM7927NwBg5MiRSEpKUtP/+ecfhIaGIigoCH5+fiaKjoiIiCh/y3cPpADA+fPnUa9ePdy4cQOtWrVCuXLlcPjwYWzduhV+fn7Ys2cPvL29AaRfIaxfvz6OHDmCoKAg1KhRA4cOHUJISAhq1aqFsLAwODg4GKy/V69e6vV5rVq1QnR0NFasWAFnZ2fs3r0bZcqUeea6chBsIiKilwsHwc6HSpUqhQMHDqBbt244ePAgfvzxR0RERODTTz/Fvn37VGIIpPcjDAsLQ//+/XHq1ClMnToVp0+fxqBBg7Bly5ZMiSEA/PLLL+pp5GnTpmH9+vVo27Yt9u3b91yJIREREdHLJl9eOXyR8MohERHRy4VXDomIiIiI/h+TQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIiUHCeH27dvx5UrV564TGRkJLZv357TIoiIiIgoj+U4OWzcuDEWLlz4xGUWL16Mxo0b57QIIiIiIspjOU4OReSpy6SlpUHTtJwWQURERER5zKR9DiMiIuDm5mbKIoiIiIjIiKyfZ+EPP/zQ4O/Vq1fj0qVLmZZLTU1V/Q1btGiRqwoSERERUd55ruQwYx9DTdMQHh6O8PDwLJfVNA21atXC999/n5v6EREREVEeeq7k8OLFiwDS+xuWLFkS/fv3x+ef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jx9H0aJFn7tSRERERGQez5Ucvvbaa9i6dSsuXbr01GUvXbqErVu3omHDhjmtGxERERHlsedKDj/99FMkJyfj7bffxq1bt7Jd7vbt2+jQoQNSUlLw8ccf57qSRERERJQ3nmsQ7Bo1aqB///744YcfUKFCBfTp0weNGzdGsWLFAADXrl3Dli1bMHv2bNy8eRMDBw5EjRo1TFJxIiIiIjK+535DytSpU2Fvb4/vvvsO48ePx/jx4w3miwisrKwwbNgwjBs3zmgVJSIiIiLTe+7kUNM0TJgwAT169MCCBQuwa9cuxMTEAAC8vb1Rv359dOvWDaVKlTJ6ZYmIiIjItJ47OdQrVaoUrwwSERERvWQ4CCERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIlHyXHF67dg0//PADgoKCULx4cdja2sLb2xvt27fH3r17s/xMXFwcBg4cCD8/P9jZ2aFEiRIYPHgw4uPjs1w+LS0N06dPR+XKleHg4ABPT0907NgRFy5cMGVoRERERPlevksOp0+fjgEDBuDChQsICgrCoEGD0KBBA/z111+oV68eVqxYYbB8QkICAgMD8f3336NcuXIYMGAAypYtiylTpqBJkyZ49OhRpjI++ugj9OvXDyKCfv36ITg4GCtXrkStWrUQERGRV6ESERER5TvW5q7A42rXro3Q0FAEBgYaTP/333/RtGlTfPzxx2jTpg3s7OwAAN9++y3Cw8Px5ZdfYtKkSWr5oUOHYvLkyfj+++8xbNgwNX3btm2YO3cuGjZsiE2bNsHW1hYA0KlTJ7Rs2RJ9+/bFxo0b8yBSIiIiovxHExExdyWeVfPmzRESEoL9+/ejZs2aEBEUK1YMcXFxiImJgZOTk1o2ISEB3t7e8PLywvnz59X0Tp06YdmyZQgLC0PDhg0N1t+4cWOEhobi8uXLKF68+DPVKS4uDm5uboiNjYWrq6txAiUiIiKz6fVD7j4/p78xapE9U+ce+e628pPY2NgAAKyt0y94RkREICoqCvXr1zdIDAHAyckJ9evXx4ULFxAZGammh4aGqnmPa968OQAgLCzMVCEQERER5Wv57rZydq5cuYLNmzejSJEiqFy5MgCo/oEBAQFZfiYgIAAbN25EREQEfH19kZCQgOjoaFSqVAlWVlZZLp9xvVlJTExEYmKi+jsuLg4AkJycjOTkZACATqeDlZUVUlNTkZaWppbVT09JSUHGC7ZWVlbQ6XTZTtevV0+fHKekpDzTdBsbG6SlpSE1NVVN0zQN1tbW2U7Pru6MiTExJsbEmBjTyx+TDXIjL2IypRciOUxOTsb777+PxMRETJ48WSV2sbGxAAA3N7csP6e/1Kpf7nmXz8rEiRMxevToTNNDQkLg6OgIAChevDiqV6+Oo0eP4sqVK2qZsmXLoly5cti3bx9u3rypplerVg1+fn7Yvn077t+/r6bXrVsXXl5eCAkJMdgRGjduDAcHB6xfv96gDi1btsTDhw+xbds2Nc3a2hqtWrXCrVu3sHv3bjXdxcUFTZo0QWRkJMLDw9V0T09P1KtXDxEREThz5oyazpgYE2NiTIyJMVlKTEAr5IapYzp48GCu6vc0+b7PYVpaGt5//30sXboUvXr1wuzZs9W8pUuXonPnzhgxYgTGjRuX6bMjRozAhAkTsHLlSrRt2xZRUVEoWrQo6tevjx07dmRaftOmTQgKCkK/fv0wbdq0LOuT1ZVDX19f3Lp1SyWX/GXGmBgTY2JMjIkxvbgxfTIjd1cOf+ln2pju3LkDDw8Pk/U5zNdXDtPS0vDhhx9i6dKl6NKlC2bNmmUwX38FMLsrffpbvvrlnnf5rNjZ2aknpTOysbFRfSL1rKyssrx9rf+SPOv0x9ebk+k6nQ46XeYuptlNz67ujIkxPe90xsSYAMaUXR2fdzpjMl9Mz8NcMRlLvn0gJS0tDd27d8eiRYvQsWNHLFy4MNMGfVofwcf7JDo5OaFIkSK4ePGiQeae3fJEREREliZfJof6xHDx4sV499138euvv2b7AImPjw927tyJhIQEg3kJCQnYuXMn/P394evrq6YHBgaqeY/Tj2/4+BA3RERERJYi3yWH+lvJixcvRocOHbBkyZIsE0Mg/V59z549ER8fj7FjxxrMGzt2LOLj49GrVy+D6b179wYAjBw5EklJSWr6P//8g9DQUAQFBcHPz8/IURERERG9GPLdAynffPMNRo8eDWdnZ3z++edZ3ldv06YNqlWrBiD9CmH9+vVx5MgRBAUFoUaNGjh06BBCQkJQq1YthIWFwcHBweDzvXr1wty5c1GxYkW0atUK0dHRWLFiBZydnbF7926UKVPmmevLQbCJiIheLpY+CHa+eyDl0qVLAID4+HiMHz8+y2VKlCihkkMnJyeEhYXhm2++wZ9//olt27ahSJEiGDRoEEaNGpUpMQSAX375BZUrV8bs2bMxbdo0ODs7o23bthg/fjxKlSplqtCIiIiI8r18d+XwRcMrh0RERC8XS79ymO/6HBIRERGR+TA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERECpNDIiIiIlKYHBIRERGRwuSQiIiIiBQmh0RERESkMDkkIiIiIoXJIREREREpTA6JiIiISGFySEREREQKk0MiIiIiUpgcEhEREZHC5JCIiIiIFCaHRERERKQwOSQiIiIihckhERERESlMDomIiIhIYXJIRERERAqTQyIiIiJSmBwSERERkcLkkIiIiIgUJodEREREpDA5JCIiIiKFySERERERKUwOiYiIiEhhckhERERE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50GTlpaGCxcuwMfHB59++in/cWZlZcVfZesKYWVSvK1MlBy7IejnJOd99erVKwQFBWHp0qX47LPP4OzsDGNjY1haWsLMzAy2trZwc3ODp6dnngligsIjksNCIKxMiq+VidJil1M/ICAAxsbGGglpzuPKfS4TEhJw/PhxzJ49GzVr1sSIESP4cWkDYWWiLCsTJccut/77kJGRwX84hoWF4dy5c3jx4gXu3r0rag51iEgOtYSwMimeViZKil0O/f9iZZFfMvrw4UOtvdYSVibKtTJRYuxy62uDonCMRRWRHP5HhJVJ8bcyUVrscusD/93KQpfm18LKRL/6gHxWJkqO3VD0BYaJSA7/BWFloj99QD4rEyXHbij6BbGykEY6CouwMlGmlYmSYzckfYHhIZLD90RYmRRvKxMlx24I+nJbWQgrE+VamSg5dkPQFxgmDABIkC9qtZqMjIwoKCiI2rVrR4MGDaLff/+diIhKlChBHTt2JEtLS9qxYwcRETHGqEyZMuTn50eNGjUqkGZmZiZZWlrSmDFj6KeffqISJUoQEdHJkydp7dq1NHfuXHJzc6P4+Hj6+eefac+ePZSamko1a9akKVOmULt27QoVs9z6ublz5w4FBQVRYGAgBQcH08OHD8nExIRatmxJn332GbVv354qVqxIFhYWhdZScuyGpn/jxg367bffaP/+/fTs2TNydHSkChUqkIODA9WsWZPKlClDT58+pfT0dHr9+jV98skn1KtXr0JpqtVqsrCwoF69etHKlSvJ2to63+0iIiLo7NmzFBAQQMHBwXTv3j0qW7YsRUVFFVj74cOHtH//furUqRNVr16dABBj7J37AKC4uDgyMTEhe3t7ysrKIpVKVST1c6PP9ldy7IaoLzAQ5MtLDR9hZaI/fTmtTJQcuyHo50QOKwthZaJcKxMlx25o+gLDQiSHb0FYmehPX24rEyXHLrf++6BrKwthZaJMKxMlx15U9AXyIZLDf0FYmSjDykSJscutrw20NYtSWJkoy8pEybEXF32BbhHJYT4IKxPlWJkoOXZD0ZcTYWUiv76cKDl2geBdiOTwb4SVifz6clqZKDl2Q9CXC2FlYhj6cqLk2AWCtyGSw78RViby6huCnYJSY5dbX26ElYly21/JsQsE70JY2eRAWJkYjr7cdgpKjl1ufX0jrEwMS19OlBy7QKCBvLmpYSCsTJRrZaLk2A1NXw6ElYnh6MuJkmMXCPJDjBwS8V/9zZs3JyKiHTt2kKurKxER3b9/n/r160fGxsYUHBxMarWajypoY6Tg1KlT1KFDB/L19SVPT888x8UY0xjFSExMpL/++ouCgoLojz/+oBYtWtC6deu4YXdR038fMjMzCQCZmJhQeHg4xcfHU/Xq1Sk+Pp4qVapUYF0lx15U9HXJqVOnqH379rRjxw7q2bOn3IeTL3Kff7n15UTJsQsEYuTwb4SVibKsTJQce3HRLwzCyqTo68uJkmMXKAPFJ4fCykR+fTlRcuwCYWUiEAgE+aH45FBCWJko08oEUHbsAmFlIhAIBLkRNYc5iIqKopCQEAoICKDAwECKiIig9PR0cnFxodGjR9OHH35IderUoZIlS2pVV6pZi46Opl9++YWWLl1KREStWrWizp07U/369alGjRpUrly5PPump6eTmZlZkdaXEyXHLhDtLxAIBPkhksO3IKxMlGnnoOTYBaL9BQKBgEgkh+Tj40MTJ04kExMTyszMJJVKpTELOT09na5fv06BgYEUEBBAISEh9OLFC7K0tKRu3brRtm3btHYsyH7NTyqVipKSkujatWt08eJFCgoKonPnztHz58/JzMyMMjMzycLCgpycnKhWrVq0ZMkSPru6KOvLiZJjF4j2FwgEgpwoOjkUViaGry8nSo5dINpfIBAoF8Umh1lZWaRWq2nEiBG0d+9emjNnDh9BzJ0Y5rf6waNHj8jS0lLrqyP8F/AeKzkUZ305UXLsAtH+AoGgeKPY5FAiOjqaBgwYQOfOnaNJkyaRl5eXxoQT6fS8K1EUCAQCgUAgKC4oPjkkyp6x+NVXX9GaNWuoWrVqNGXKFOrQoQNVrlxZY7vMzEwyNjYmIqKMjAwyMTGR43AFAoFAIBAIdIbik0NhZSEQCAQCgUDwD4pPDnMjrCwEAoFAIBAoGZEc/o2wshAIBAKBQCAQyeE7EVYWAoFAIBAIlIZIDguIsLIQCAQCgUBQHBGeLAVEJIYCgUAgEAiKIyI5FAgEAoFAIBBwRHIoEAgEAoFAIOCI5FAgEAgEAoFAwBHJoUAgEAgEAoGAI5JDgUAgEAgEAgFHJIcCgUAgEAgEAo5IDgUCgUAgEAgEHJEcCgQCgUAgEAg4IjkUCAQCgUAgEHBEcigQCAQCgUAg4Pw/AjF/JunijiEAAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "qc.measure_all()\n", + "simulator = Aer.get_backend(\"aer_simulator\")\n", + "circ = transpile(qc, simulator)\n", + "result = simulator.run(circ).result()\n", + "counts = result.get_counts(circ)\n", + "\n", + "counts_readable = q_algo.decode_counts(counts)\n", + "plot_histogram(counts_readable)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/example_grover_hash.ipynb.txt b/_sources/example_grover_hash.ipynb.txt new file mode 100644 index 00000000..d7ccf386 --- /dev/null +++ b/_sources/example_grover_hash.ipynb.txt @@ -0,0 +1,164 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Grover search: hash function preimage attack\n", + "\n", + "In the ever-evolving landscape of cybersecurity, the advent of quantum computing presents both an extraordinary opportunity and an unprecedented challenge. In this notebook we exploit a Grover Search to perform a preimage attack on a toy hash function.\n", + "\n", + "A preimage attack on a cryptographic hash function `h(m)` tries to find a message `m` that has a specific hash value. Using qlasskit it is easy to write an hash function like the following `hash_simp`:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qint4, Qint8, Qlist\n", + "\n", + "@qlassf\n", + "def hash_simp(m: Qlist[Qint4, 2]) -> Qint8:\n", + " hv = 0\n", + " for i in m:\n", + " hv = ((hv << 4) ^ (hv >> 1) ^ i) & 0xff\n", + "\n", + " return hv" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Thanks to the fact that qlasskit function are standard python functions, we can call the `original_f` to perform some kind of analysis on the hash function. Since the input space is tiny (it is a toy hash function), we can detect if the hash function is uniform (if it maps equally to the output space)." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Hash function output space: 256\n" + ] + } + ], + "source": [ + "from collections import Counter\n", + "\n", + "d = Counter(hex(hash_simp.original_f((x, y))) for x in range(2**4) for y in range(2**4))\n", + "\n", + "print('Hash function output space:', len(d))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We got that `hash_simp` is following an uniform distribution. \n", + "\n", + "We now can use our quantum function as an oracle for a Grover search, in order to find which input maps to the value `ca`." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit.algorithms import Grover\n", + "\n", + "q_algo = Grover(hash_simp, Qint8(0xca))" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use our prefered framework and simulator for sampling the result; this is an example using `qiskit` with `aer_simulator`." + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnkAAAHtCAYAAABlFmhpAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABfc0lEQVR4nO3dd3gUVdsG8Ht2kywhFUmQHjqRJiAYelEIICAioKAIAcECqC+InWYBBURRwQZKUxQERFGaIEVKBNQAokDoNZRAOiTZ3ef7g2/GLEkgCSQ7e7h/1+UlmZndnGfP7OSeejQRERARERGRUizubgARERER3XwMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBXm5uwGezul04tSpUwgICICmae5uDhERESlORJCcnIyyZcvCYsn9eB1D3g06deoUKlSo4O5mEBER0S3m+PHjKF++fK7zGfJuUEBAAIArH3RgYKCbW0NERESqS0pKQoUKFYwMkhuGvBukn6INDAxkyCMiIqIic73LxHjjBREREZGCGPKIiIiIFMSQR0RERKQghjwiIiLK1bhx46Bpmst/4eHh2ZYTEXTq1AmapmHp0qXG9Pj4eHTs2BFly5aFzWZDhQoVMGzYMCQlJRVhFbcm3nhBRERE11S7dm2sWbPG+NnLK3t8mDp1ao43AlgsFnTr1g1vvfUWQkNDceDAAQwdOhQXLlzA/PnzC7XdtzqGPCIiIromLy8vlC5dOtf5MTExmDJlCnbs2IEyZcq4zCtRogSefvpp4+ewsDAMGTIEkydPLrT20hU8XUtERETXFBsbi7Jly6JKlSp49NFHcezYMWNeWloaHnnkEUyfPv2aQVB36tQpLFmyBK1bty7MJhMY8oiIiOgaIiIiMHv2bKxcuRKffPIJDh8+jJYtWyI5ORkAMHz4cDRr1gzdunW75vv06dMHxYsXR7ly5RAYGIiZM2cWRfNvaZqIiLsb4cmSkpIQFBSExMREPgyZiIiUl5CQgLCwMLz33nsIDQ3F888/j7/++gv+/v4Arjyg9/vvv8cDDzzg8rq4uDgkJCRg//79eOWVV9C6dWt8/PHHbqjA8+U1ezDk3SCGPCIiutU0btwY7dq1w6VLl/Dhhx/CYvnvxKDD4YDFYkHLli2xfv36HF+/adMmtGzZEqdOncp2DR9dX16zB2+8ICIiojxLSUnBwYMH8dhjj+Ghhx7CoEGDXObXrVsX77//Prp27ZrrezidTgBAenp6obb1VseQR0RERLkaOXIkunbtirCwMJw6dQpjx46F1WpFnz59EBoamuPNFhUrVkTlypUBAMuXL8eZM2fQuHFj+Pv7Y8+ePXjhhRfQvHlzVKpUqYirubUw5BEREVGuTpw4gT59+iA+Ph6hoaFo0aIFoqOjERoamqfX+/r6YsaMGRg+fDjS09NRoUIFPPjgg3j55ZcLueXEa/JuEK/JIyIioqKU1+zBR6gQERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQV7ubgARERGZ0+CpRfN7ZvyvaH7PrYZH8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBHhHyJk6cCE3ToGkaoqOjXeaNGzfOmJfTf0eOHMnxPVetWoXWrVsjICAAgYGBaNu2LdauXVsE1RAREREVPi93N+B6/v77b4wdOxZ+fn5ITU3Ndbn+/fujUqVK2aYHBwdnm/bVV1/hscceQ2hoKKKiogAACxYsQPv27bFw4UL07NnzJrWeiIiIyD1MHfIyMzPRv39/1K9fH9WrV8dXX32V67JRUVFo06bNdd/z4sWLeOaZZxASEoI///wT5cuXBwC89NJLaNCgAZ5++ml06NABAQEBN6sMIiIioiJn6tO148ePx549e/Dll1/CarXelPf87rvvkJCQgGeeecYIeABQvnx5DBs2DOfPn8f3339/U34XERERkbuYNuT9+eefGD9+PMaOHYtatWpdd/mNGzdi4sSJmDx5MpYuXYqUlJQcl1u/fj0AIDIyMtu8Dh06AAA2bNhQ8IYTERERmYApT9emp6ejX79+qF+/Pl588cU8vWbs2LEuPwcHB+ODDz5Av379XKbHxsYCAKpXr57tPfRp+jK5tS09Pd34OSkpCcCVU8uZmZkAAIvFAqvVCofDAafTaSyrT7fb7RARY7rVaoXFYsl1uv6+Oi+vK91mt9vzNN3b2xtOpxMOh8OYpmkavLy8cp2eW9tZE2tiTayJNd06NQHeKApZPxv2U95qygtThrwxY8YgNjYWf/zxx3VP095555348ssv0aZNG5QpUwZxcXH46aefMGbMGERFRSE4OBj333+/sXxiYiIAICgoKNt7BQYGuiyTk7fffhuvv/56tumrV69G8eLFAQAVK1ZEgwYNsGvXLhw7dsxYpmbNmggPD8e2bdtw7tw5Y3r9+vURFhaGjRs3Ijk52ZjetGlTlCpVCqtXr3bp0LZt28LX1xfLly93acN9992HS5cuYd26dcY0Ly8vdO7cGefPn8fWrVuN6QEBAbjnnntw/PhxxMTEGNNDQ0PRrFkzxMbGYt++fcZ01sSaWBNrYk23Xk1ANxSFrJ8B++n6Nf3xxx/X/UwBQBPXyO52W7duRYsWLTBu3DiMHj3amB4VFYU5c+Zg69ataNKkyXXfZ+3atWjfvj3q1KmDXbt2GdNr1KiB2NhYZGZmGilcl5mZCR8fH9SrVw87d+7M8X1zOpJXoUIFnD9/3giJt+peBWtiTayJNbEmtWoaMr1ojuR9PJRH8vJT04ULF1CyZEkkJiYa2SMnpjqSZ7fb0b9/f9SrVw8vv/zyDb3Xvffei6pVq2L37t1ISkoyPgT9CF5iYiJKlizp8hr91GtOR/l0NpsNNpst23Rvb294e7t+GaxWa45HIq8Ol9ebfvX7FmS6xWKBxZL9EszcpufWdtbEmvI7nTWxJoA15dbG/E53V02FLT+1sp/y3k+muvEiJSUFsbGxiImJgY+Pj8tDjefMmQPgyuFUTdOwdOnS675fSEgIACAtLc2Ydq3r7q51vR4RERGRJzHVkTybzYbHH388x3kbN25EbGws7r//foSGhub44OOsUlNTsWfPHvj5+RlhDwBat26Nb775BqtXr8522nfVqlXGMkRERESezHTX5OUmp2vykpOTcfr0adSoUcNl2UuXLuHxxx/HN998gwEDBuDLL7805l28eBGVK1eGt7c3/vrrL+NZeSdOnECDBg0AAIcOHcrzw5CTkpIQFBR03fPiREREnmbw1KL5PTP+VzS/RxV5zR6mOpKXX/Hx8QgPD0fjxo1xxx13oHTp0jhz5gzWrFmDEydOoG7dupg8ebLLa0qUKIFp06bhscceQ8OGDfHwww8DuDKsWXx8PBYsWMDRLoiIiMjjeXTIu+222zBkyBBs27YNy5cvx8WLF+Hr64s77rgDzz77LIYNGwZfX99sr+vbty9CQkIwYcIEzJo1C5qm4a677sKoUaPQrl07N1RCREREdHN5zOlas+LpWiIiUhVP15pTXrOHqe6uJSIiIqKbgyGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpKACh7yNGzfi2LFj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FMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIFOGvK+++gpPPvkkGjVqBJvNBk3TMHv27ByXHTduHDRNy/W/I0eO5Pi6VatWoXXr1ggICEBgYCDatm2LtWvXFl5RREREREXIy90NyMmoUaNw9OhRhISEoEyZMjh69Oh1X9O/f39UqlQp2/Tg4OBs07766is89thjCA0NRVRUFABgwYIFaN++PRYuXIiePXveYAVERERE7mXKkDdz5kxUr14dYWFheOedd/DKK69c9zVRUVFo06bNdZe7ePEinnnmGYSEhODPP/9E+fLlAQAvvfQSGjRogKeffhodOnRAQEDAjZZBRERE5DamPF3brl07hIWFFcp7f/fdd0hISMAzzzxjBDwAKF++PIYNG4bz58/j+++/L5TfTURERFRUTBnyCmLjxo2YOHEiJk+ejKVLlyIlJSXH5davXw8AiIyMzDavQ4cOAIANGzYUWjuJiIiIioIpT9cWxNixY11+Dg4OxgcffIB+/fq5TI+NjQUAVK9ePdt76NP0ZXKSnp6O9PR04+ekpCQAQGZmJjIzMwEAFosFVqsVDocDTqfTWFafbrfbISLGdKvVCovFkut0/X11Xl5Xus1ut+dpure3N5xOJxwOhzFN0zR4eXnlOj23trMm1sSaWBNrunVqArxRFLJ+NuynvNWUFx4f8u688058+eWXaNOmDcqUKYO4uDj89NNPGDNmDKKiohAcHIz777/fWD4xMREAEBQUlO29AgMDXZbJydtvv43XX3892/TVq1ejePHiAICKFSuiQYMG2LVrF44dO2YsU7NmTYSHh2Pbtm04d+6cMb1+/foICwvDxo0bkZycbExv2rQpSpUqhdWrV7t0aNu2beHr64vly5e7tOG+++7DpUuXsG7dOmOal5cXOnfujPPnz2Pr1q3G9ICAANxzzz04fvw4YmJijOmhoaFo1qwZYmNjsW/fPmM6a2JNrIk1saZbryagG4pC1s+A/XT9mv7444/rfqYAoIlrZDcd/caLWbNmGXfC5sXatWvRvn171KlTB7t27TKm16hRA7GxscjMzDRSuC4zMxM+Pj6oV68edu7cmeP75nQkr0KFCjh//rwREm/VvQrWxJpYE2tiTWrVNGR60RzJ+3goj+Tlp6YLFy6gZMmSSExMNLJHTjz+SF5u7r33XlStWhW7d+9GUlKS8SHoR/ASExNRsmRJl9fop15zOsqns9lssNls2aZ7e3vD29v1y2C1WmG1WrMte3W4vN70q9+3INMtFgssluyXYOY2Pbe2sybWlN/prIk1Aawptzbmd7q7aips+amV/ZT3flLmxouchISEAADS0tKMade67u5a1+sREREReRJlQ15qair27NkDPz8/I+wBQOvWrQFcuYbuaqtWrXJZhoiIiMhTeXTIS05Oxv79+7NNv3TpEgYPHozk5GQ89NBDLoc1H3roIQQFBeGjjz7CiRMnjOknTpzAtGnTEBISgu7duxdJ+4mIiIgKiymvyZs5cyY2bdoEANi9e7cxTX/GXYsWLTBo0CDEx8cjPDwcjRs3xh133IHSpUvjzJkzWLNmDU6cOIG6deti8uTJLu9dokQJTJs2DY899hgaNmyIhx9+GMCVYc3i4+OxYMECjnZBREREHs+UIW/Tpk2YM2eOy7TNmzdj8+bNxs+DBg3CbbfdhiFDhmDbtm1Yvnw5Ll68CF9fX9xxxx149tlnMWzYMPj6+mZ7/759+yIkJAQTJkzArFmzoGka7rrrLowaNQrt2rUr9PqIiIiICpvpH6FidklJSQgKCrrubcxERESeZvDUovk9M/5XNL9HFXnNHh59TR4RERER5Ywhj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHREREpCCGPCIiIiIFMeQRERERKYghj4iIiEhBDHlERERECmLIIyIiIlIQQx4RERGRghjyiIiIiBTEkEdERESkIIY8IiIiIgUx5BEREREpiCGPiIiISEEMeUREREQKYsgjIiIiUhBDHhEREZGCGPKIiIiIFMSQR0RERKQghjwiIiIiBTHkERERESmIIY+IiIhIQQx5RERERApiyCMiIiJSEEMeERERkYIY8oiIiIgUxJBHVIQqVaoETdOy/Td06FB3N42IiBTDkEdUhLZv347Tp08b//3yyy8AgF69erm5ZURU1E6ePIm+ffuiZMmS8PX1Rd26dbFjxw53N4sUwpCnmHHjxmU7ShQeHu7uZhWYavWEhoaidOnSxn8//fQTqlatitatW7u7afmmWt+wHnNTrZ6LFy+iefPm8Pb2xooVK/DPP/9gypQpKFGihLubRlBnffNydwPo5qtduzbWrFlj/Ozl5dndrFo9uoyMDHz11VcYMWIENE1zd3MKRLW+YT3mplI9EydORIUKFTBr1ixjWuXKld3YIrqaCuub57WYrsvLywulS5d2dzNuGtXq0S1duhQJCQmIiopyd1MKTLW+YT3mplI9P/74Izp06IBevXphw4YNKFeuHIYMGYLBgwe7u2n0/1RY33i6VkGxsbEoW7YsqlSpgkcffRTHjh1zd5NuiGr16L744gt06tQJZcuWdXdTCky1vmE95qZSPYcOHcInn3yC6tWrY9WqVXj66afx7LPPYs6cOe5uGv0/FdY3TUTE3Y3wZElJSQgKCkJiYiICAwPd3RysWLECKSkpqFmzJk6fPo3XX38dJ0+exN9//42AgAB3Ny/fVKtHd/ToUVSpUgVLlixBt27d3N2cAlGtb1iPualWj4+PDxo1aoQtW7YY05599lls374dW7dudWPLXA2eWjS/Z8b/iub35JXZ17e8Zg+GvBtktpB3tYSEBISFheG9997D448/7u7m3DBV6hk3bhw+++wzHD9+3COv88iJKn2jYz3m5un1hIWFoX379pg5c6Yx7ZNPPsFbb72FkydPurFlrm7VkHc1s61vec0ePF2ruODgYNSoUQMHDhxwd1NuChXqcTqdmDVrFvr3769MwAPU6JusWI+5eXo9zZs3x759+1ym7d+/H2FhYW5qEV2Lp65vDHmKS0lJwcGDB1Gm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", + "text/plain": [ + "
" + ] + }, + "execution_count": 5, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "qc = q_algo.export('qiskit')\n", + "qc.measure_all()\n", + "simulator = Aer.get_backend(\"aer_simulator\")\n", + "circ = transpile(qc, simulator)\n", + "result = simulator.run(circ).result()\n", + "counts = result.get_counts(circ)\n", + "\n", + "counts_readable = q_algo.decode_counts(counts, discard_lower=5)\n", + "plot_histogram(counts_readable)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now double check using `original_f`; calling it with the tuple `(12,12)` must result in the hash value `0xca`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "0xca\n" + ] + } + ], + "source": [ + "print(hex(hash_simp.original_f((12,12))))" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/example_grover_subset.ipynb.txt b/_sources/example_grover_subset.ipynb.txt new file mode 100644 index 00000000..8fdcb820 --- /dev/null +++ b/_sources/example_grover_subset.ipynb.txt @@ -0,0 +1,108 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Grover search: subset problem\n", + "\n", + "We define a function named `subset_sum(i,j)` that returns the sum of the elements `i` and `j` of a list `l`. We want to use a Grover search to find which `i` `j` combination led to a given value." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qint2, Qint3\n", + "from typing import Tuple\n", + "\n", + "@qlassf\n", + "def subset_sum(ii: Tuple[Qint2, Qint2]) -> Qint3:\n", + " l = [0, 5, 2, 3]\n", + " return l[ii[0]] + l[ii[1]] if ii[0] != ii[1] else 0" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We now can use our quantum function as an oracle for a Grover search. For instance, we want to find the input value that produce the value `7`. Since we know that there are at least two result (`(i,j)` and `(j,i)`), we set `n_matching=2`." + ] + }, + { + "cell_type": "code", + "execution_count": 14, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit.algorithms import Grover\n", + "\n", + "q_algo = Grover(subset_sum, Qint3(7), n_matching=2)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use our prefered framework and simulator for sampling the result; this is an example using `qiskit` with `aer_simulator`.\n", + "\n", + "In the output histogram, it's now evident that the input leading to a value of `7` are the tuples `(1,2)` and `(2,1)` (5+2 and 2+5), aligning with our expectations.\n" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAAnkAAAHWCAYAAAALq58HAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAABVP0lEQVR4nO3deVxU9f4/8NcZNpFNRU1QxF3SLDTRFEMxBUzTbLeua2qL5tclNTVSM3PJUqNuLpRb6y29LdcF1AvupkmodS1xSUlwJUFQgZl5//7wNydGQGBmYIYzr+fj0eORn3PmvD+f+QxnXnPmnDOKiAiIiIiISFN09u4AEREREdkeQx4RERGRBjHkEREREWkQQx4RERGRBjHkEREREWkQQx4RERGRBjHkEREREWkQQx4RERGRBrnauwPVndFoREZGBnx8fKAoir27Q0RERBonIrh27RoCAwOh05V+vI4hz0oZGRkICgqydzeIiIjIyaSnp6NRo0alLmfIs5KPjw+AW0+0r6+vnXtDREREWpeTk4OgoCA1g5SGIc9Kpq9ofX19GfKIiIioypR1mhgvvCAiIiLSIIY8InJY8+fPh6IoGD9+vNq2YsUK9OjRA76+vlAUBVevXi318fn5+QgNDYWiKEhNTa30/hIRORKGPCJySAcPHsTy5ctx7733mrVfv34dMTExmD59epnbmDJlCgIDAyuri0REDo0hj4gcTm5uLp577jmsXLkStWvXNls2fvx4vPbaa3jggQfuuI3NmzcjMTERixYtqsyuEhE5LIY8InI4Y8aMQd++fdGrVy+LHn/hwgWMGjUK69atQ82aNW3cOyKi6oFX1xKRQ/nyyy+RkpKCgwcPWvR4EcGwYcPw4osvomPHjvjjjz9s20EiomqCIY+IHEZ6ejr+7//+D1u3bkWNGjUs2kZcXByuXbuGadOm2bh3RETVC7+uJSKHcejQIVy8eBEdOnSAq6srXF1dsWPHDrz//vtwdXWFwWAocxv//e9/sW/fPnh4eMDV1RUtWrQAAHTs2BFDhw6t7CEQETkMHskjIofx0EMP4ejRo2Ztw4cPR0hICKZOnQoXF5cyt/H+++/jrbfeUv+dkZGB6OhofPXVV+jcubPN+0xE5KgY8ojIYfj4+OCee+4xa/Py8oK/v7/afv78eZw/fx4nTpwAABw9ehQ+Pj5o3Lgx6tSpg8aNG5s93tvbGwDQvHnzO/7GIxGR1vDrWiKqVpYtW4b27dtj1KhRAICIiAi0b98e33//vZ17RkTkWBjyiMihJScnY8mSJeq/Z82aBREp9t+wYcNKfHyTJk0gIggNDa2S/mpJSb84cvPmTYwZMwb+/v7w9vbG448/jgsXLqjLr1y5gpiYGAQGBsLDwwNBQUEYO3YscnJy7DACIufGkEdERMWU9osjEyZMwA8//ICvv/4aO3bsQEZGBh577DF1uU6nw4ABA/D999/j+PHjWL16NbZt24YXX3yxqodA5PQY8oiIyExpvziSnZ2Njz/+GO+99x569uyJ+++/H6tWrcLevXuxf/9+AEDt2rXx0ksvoWPHjggODsZDDz2El19+Gbt27bLXcIicFkMeERGZKe0XRw4dOoTCwkKz9pCQEDRu3Bj79u0rcVsZGRnYsGEDunfvXql9JqLiGPKIiEhl+sWRefPmFVt2/vx5uLu7o1atWmbtd911F86fP2/WNmjQINSsWRMNGzaEr68v4uPjK7PbRFQChjwiIgLw9y+OfPbZZxb/4ojJ4sWLkZKSgu+++w4nT57ExIkTbdRLIiov3iePiIgAmP/iiInBYMDOnTvxwQcfICEhAQUFBbh69arZ0bwLFy6gQYMGZttq0KABGjRogJCQENSpUwcPPvggYmNjERAQUFXDIXJ6DHlERASg7F8cCQoKgpubG7Zv347HH38cAPD777/j7Nmz6NKlS6nbNRqNAID8/PzK6zwRFcOQR0REAMr3iyPPP/88Jk6ciDp16sDX1xevvPIKunTpggceeAAAsGnTJly4cAFhYWHw9vbGr7/+ismTJyM8PBxNmjSp6iEROTWGPCIiKrfFixdDp9Ph8ccfR35+PqKjo/HPf/5TXe7p6YmVK1diwoQJyM/PR1BQEB577DG89tprduw1kXNSRETs3YnqLCcnB35+fsjOzoavr6+9u0NEREQaV97swatriYiIiDSIIY+IiIhIgxjyiIiIiDSIIY+IiIhIgxjyiIiIiDSIIY+IiIhIgxjyiIiIiDSIIY+IiIhIgxjyiIiIiDSIIY+IiIhIg/jbtUTk0EYtse7xK8fbohdERNUPj+QRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGVYuQt2DBAiiKAkVRsH///mLLc3JyMHHiRAQHB8PDwwNNmjTB5MmTkZubW+L2jEYj4uLi0K5dO3h6eqJevXoYNGgQTp06VdlDISIiIqoSDh/yfvnlF8ycORNeXl4lLs/Ly0P37t2xePFihISEYMKECWjdujUWLVqEnj174ubNm8Ue88ILL2DcuHEQEYwbNw4xMTHYsGEDwsLCkJaWVtlDIiIiIqp0Dh3yCgsLMXToUISGhmLgwIElrrNw4UKkpqZi6tSpSEhIwPz585GQkICpU6fi4MGDWLx4sdn6SUlJiI+PR0REBFJSUrBgwQKsW7cO3377LbKysjB27NiqGBoRERFRpXLokDd37lz8+uuv+OSTT+Di4lJsuYggPj4e3t7eiI2NNVsWGxsLb29vxMfHm7WvXLkSADBnzhy4u7ur7X369EGPHj2QmJiIs2fPVsJoiIiIiKqOw94MOSUlBXPnzsWbb76JNm3alLhOWloaMjIyEB0dXezrXC8vL4SHhyMhIQHp6ekICgoCACQnJ6vLbhcdHY3k5GTs2LEDgwcPtv2giIiqEd6Imqh6c8gjefn5+RgyZAhCQ0MxZcqUUtcznT/XsmXLEpeb2k3r5eXlITMzE02bNi3xyODt6xMRERFVVw55JO+NN95AWloaDh06VGIYM8nOzgYA+Pn5lbjc19fXbL2Krl+S/Px85Ofnq//OyckBcOv8wcLCQgCATqeDi4sLDAYDjEajuq6pXa/XQ0TUdhcXF+h0ulLbTds1cXW9NW16vb5c7W5ubjAajTAYDGqboihwdXUttb20vnNMHFNVjwlwgzVMY3CkMVWXebL2LaKwsNDhxqTFeeKYnHNM5eFwIW/fvn1YtGgRZs2ahXvuucfe3Slm3rx5mD17drH2xMRE1KxZEwDQuHFjtG/fHkeOHDE7v69169YICQnBgQMHcOnSJbU9NDQUwcHB2LlzJ65du6a2d+nSBfXr10diYqLZhEZGRsLT0xObNm0y68PDDz+MGzduICkpSW1zdXVF3759cfnyZezbt09t9/HxQc+ePZGeno7U1FS1vV69eujatSvS0tLw+++/q+0cE8dkrzEBA2ANU18daUzVZZ6AnqU/seWwadMmhxuTFueJY3K+MR06dAjloUjRGGtner0ebdq0gZeXFw4cOAA3t78/wQ8bNgxr1qzBvn378MADDwAANm7ciH79+mHs2LGIi4srtr1XXnkFH3zwAbZv346ePXsiLy8P3t7euOeee3D06NFi669fvx5PPPEEYmNj8eabb5bYx5KO5AUFBeHy5cvqkUBn/VTBMXFMlTGmlz+07kjeP8fwSJ6lY3rpA+uOA/xzDI/kcUwcU2WMKSsrC/7+/sjOzlazR0kc6khebm6uej5c0Stfi+rSpQsA4N///rd6QUZp59Ddfs6el5cXAgICcPr0aRgMhmJfBZd1jh8AeHh4wMPDo1i7m5ubWSgFbr1gSvq62fTCKG/77du1pF2n00GnK34KZmntpfWdY+KYKtpuqzFZ6vY+OdKYqsM8WaNoHUcakxbniWPimEriUCHPw8MDzz//fInLdu7cibS0NPTv3x/16tVDkyZN0LJlSwQGBmLPnj3Iy8szu8I2Ly8Pe/bsQdOmTdUrawGge/fu+PLLL7Fnzx5ERESY1UhISACAYu1ERERE1Y1DhTxPT89i97UzGTZsGNLS0jBt2jT161oAGDlyJN58803MmTMH8+fPV9vnzJmD3NxcTJ8+3Ww7o0ePxpdffonY2Fhs3bpVPWK4efNmJCcnIyoqCsHBwZUwOiIiIqKq41AhzxJTpkzBd999hwULFuDnn39Ghw4dkJKSgsTERISFhWH8+PFm60dGRmLkyJGIj49Hhw4d0LdvX2RmZuKrr75CnTp1Sjy3j4iIiKi6ccj75FWEl5cXduzYgfHjx+PYsWN499138dtvv2HSpEnYvn07PD09iz1m+fLlWLp0KQBg6dKl2LRpEwYOHIgDBw6gVatWVT0EIiIiIptzqKtrq6OcnBz4+fmVeYULEVmGv7pgP3zuiRxTebNHtT+SR0RERETFMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhEREZEGMeQRERERaRBDHhER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du3aYcWKFVi6dCm8vb0xcOBAzJ07F82bN6/K4RIRERFVCoe/hYqjy8nJgZ+fX5mXMRORZUYtse7xK8fbohfOic89kWMqb/ZwuHPyiIiIiMh6DHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGmRxyNu5cyfOnj17x3XS09Oxc+dOS0sQERERkYUsDnmRkZFYvXr1HddZu3YtIiMjLS1BRERERBayOOSJSJnrGI1GKIpiaQkiIiIislClnpOXlpYGPz+/yixBRERERCVwrcjKI0aMMPv3t99+iz/++KPYegaDQT0fr0+fPlZ1kIiIiIgqrkIhr+g5eIqiIDU1FampqSWuqygKwsLCsHjxYmv6R0REREQWqFDIO336NIBb5+M1a9YM48ePx//93/8VW8/FxQW1a9eGl5eXbXpJRERERBVSoZAXHBys/v+qVavQvn17szYiIiIicgwVCnlFDR061Jb9ICIiIiIbsjjkmRw4cAAHDx7E1atXYTAYii1XFAWxsbHWliEiIiKiCrA45GVlZeHRRx/Fnj177njPPIY8IiIioqpnccibOHEidu/ejR49emDo0KFo1KgRXF2tPjBIRERERDZgcSr7z3/+g06dOmH79u38VQsiIiIiB2PxL17cuHEDERERDHhEREREDsjikBcaGlrir10QERERkf1ZHPJmzpyJ77//Hvv377dlf4iIiIjIBiw+J+/8+fPo27cvunfvjueeew4dOnSAr69viesOGTLE4g4SERERUcVZHPKGDRsGRVEgIli9ejVWr15d7Pw8EYGiKAx5RERERFXM4pC3atUqW/aDiIiIiGyIP2tGREREpEEWX3hBRERERI7L4iN5Z8+eLfe6jRs3trQMEREREVnA4pDXpEmTct0IWVEU6PV6S8sQERERkQUsDnlDhgwpMeRlZ2fj8OHDOH36NLp3744mTZpY0z8iIiIisoDFIW/16tWlLhMRvPvuu1i4cCE+/vhj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AgIwadIkzJw5E56ensW2v3z5crRr1w4rVqzA0qVL4e3tjYEDB2Lu3Llo3rx55Q6OiIiIqAo4/C1UHF1OTg78/PzKvIyZiCwzaol1j1853ha9cE587okcU3mzR7U+J4+IiIiISsaQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlEREREGsSQR0RERKRBDHlE1cDOnTvxyCOPIDAwEIqi4NtvvzVbfuHCBQwbNgyBgYGoWbMmYmJikJaWZp/OEhGRQ2DII6oG8vLycN999+HDDz8stkxE8Oijj+LUqVP47rvv8PPPPyM4OBi9evVCXl6eHXqrLWUF7NzcXIwdOxaNGjWCp6cn2rRpg2XLltmns0RERTDkUbVQ1hutoigl/vfOO+/Yp8M21qdPH7z11lsYOHBgsWVpaWnYv38/PvroI4SFhaF169b46KOPcOPGDXzxxRd26K223ClgA8DEiROxZcsWfPrppzh27BjGjx+PsWPH4vvvv6/inpLWOPt+j6zHkEflUtbOBgCOHTuG/v37w8/PD15eXggLC8PZs2dtUr+sN9rMzEyz/z755BMoioLHH3/cJvUdWX5+PgCgRo0aaptOp4OHhwd2795tr25pxp0CNgDs3bsXQ4cORY8ePdCkSROMHj0a9913Hw4cOFDFPSWt4X6PrMWQV42UFbSGDRtW7BNdTEyMTWqXtbM5efIkunXrhpCQECQnJ+PIkSOIjY01Cx7WKOuNtkGDBmb/fffdd4iMjESzZs1sUt+RhYSEoHHjxpg2bRr++usvFBQUYMGCBfjzzz+RmZlp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XLx4Ufbu3Stz5syRHj16iJubmyiKIi1btpQ1a9aUeVi7vEw7irlz58qLL74o//73v+XUqVPF/sgr6+ot0/hNh7179eol7777rsyePVuaNGkiiqLIJ598Uml9MNWfMGGC1KhRQ2bMmCG//vqrfPfdd+Lv7y/9+/eXM2fOyCOPPCL169eXBg0ayNixY232R22qP2rUKPHy8pKZM2fKqVOnRETk8OHDsnLlShk2bJg0a9ZMFEURT09PmT9/fplf65SHae6nTp0qvXv3lg8++EBSU1OLfYVUWfeDMtWZMmWKKIoiTz75pKxbt07Wrl0r4eHhoiiKzJo1S0Qqd+5feeUV8fX1lXnz5smVK1fkyJEj0rp1a+natav873//kwceeEAURREXFxd54oknJCUlxab17TH3Is49/5x75537ovXtNf/WYsirZgwGg/j4+MjIkSNLPGql1+slKSlJBg8eLIqiSP369dXbplTkZNU71Td9kqpTp4707NlT5syZI9u2bZPz588XW1dE5MKFCzJ9+nRZvXq1RTVv32atWrWkX79+cvnyZRG5NZb9+/dLcHCwNGrUqFioysvLk82bN1t85PL2+v7+/vLss8+aHal7+umnpWHDhtKpUydp1aqVREZGqmF78ODBaj9tUd/X17fU+TcYDHLo0CGZPn26eoQ3Li5OXWZtbRcXF3VH1qpVK3n++efl008/Vd90iq4rcuvT94gRI+Sdd96xqrZpm35+fjJw4ED1iIJer5djx45JWFiYeHl5yaFDh0Tk7+f62rVrsm7dOptdUV67dm35xz/+YXby9KhRo8TX11dCQ0Olc+fOMmjQIGnevLkoiiLdu3e/41GGita319ybtuGs88+5d965N9W35/xbgyGvmklKSpIaNWrI4sWLReTvT1klXUa/d+9eCQwMlLvuukt++eUXq+qa/nC2bdsmiqJI7969ZfDgwRIQEKB+XfrYY49JXFyc7N+/X7Kzs9XH/vDDD+Lh4SGTJ09W+2pp/W+++UZq1Kghn332mYiI2S1jli5dKoqiyIwZM0Tk7xNz9+zZI82aNZN58+aZbcuS+l9//bV4eHio9U3LTKH67bffVsPuX3/9JTExMaIoinz99dcVrlmS3bt3i5eXl7z99tsicuf5P336tHTs2FE8PDxk586dFtc0jf2///2vKIoiAwYMkOnTp0urVq1EURRx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", + "text/plain": [ + "
" + ] + }, + "execution_count": 15, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "qc = q_algo.export('qiskit')\n", + "qc.measure_all()\n", + "simulator = Aer.get_backend(\"aer_simulator\")\n", + "circ = transpile(qc, simulator)\n", + "result = simulator.run(circ).result()\n", + "counts = result.get_counts(circ)\n", + "\n", + "counts_readable = q_algo.decode_counts(counts)\n", + "plot_histogram(counts_readable)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/example_grover_sudoku.ipynb.txt b/_sources/example_grover_sudoku.ipynb.txt new file mode 100644 index 00000000..39d99b4e --- /dev/null +++ b/_sources/example_grover_sudoku.ipynb.txt @@ -0,0 +1,99 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Grover search: sudoku solver\n", + "\n", + "In this example we are going to solve a sudoku puzzle. Since we have few qubits, we need to simplify the puzzle and so we use a 2x2 matrix where a valid solution is when in every row and every column there are no repeated values (`0` or `1`). We encode these xor-ing the values for each row and column. \n", + "Since we want a specific solution, we add a constraint `constr`: we want the `[0][0]` element to be `True`.\n", + "\n", + "We instantiate the `Grover` algorithm without value, since sudoku_check is already an oracle." + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qint2, Qint4, Qmatrix\n", + "from qlasskit.algorithms import Grover\n", + "\n", + "@qlassf\n", + "def sudoku_check(m: Qmatrix[bool,2,2]) -> bool:\n", + " constr = m[0][0]\n", + " sub0 = (m[0][0] ^ m[0][1])\n", + " sub1 = (m[1][0] ^ m[1][1]) \n", + " sub2 = (m[0][0] ^ m[1][0])\n", + " sub3 = (m[0][1] ^ m[1][1])\n", + " return sub0 and sub1 and sub2 and sub3 and constr\n", + "\n", + "q_algo = Grover(sudoku_check)\n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Now we can use our prefered framework and simulator for sampling the result; this is an example using `qiskit` with `aer_simulator`.\n", + "\n", + "We obtain that the solution for this puzzle is the matrix `[[True, False], [False, True]]`." + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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l3CN5e61fFHs7e1hb29faLutrS1sbW1NtllbWxd5OdoYQHe7veD73s92KyurIp9fWNz24urONrFN97qdbWKbAPO2afHixejRowdq164NIG/++datW3Ho0CGT11lZWan/fuedd1C/fn08++yzJvW0tbVV28fPiW0qbru52nS/yt0NJOvXrweQNyxbULVq1RAUFITTp08jPT39jnP8Cs4pdHZ2RvXq1XHu3DmTzLy48kREVLFduHABmzdvxpAhQ9RtkZGROHPmDDw8PGBjY6N+sT755JPo0KGDWubXX39V9xtvXPTy8sKkSZPKvB1EpancjQzm5OQAgMn1/fyuX7+u/noLCAhAjRo1sHPnTmRkZJjcUZyRkYGdO3fCz88PPj4+6vawsDAsX74cO3fuRGhoqMl7b9y4EQAKbScioopp4cKF8Pb2Rq9evdRt48ePN0kOAaBx48aYNWuWepl45cqVyMrKUvfv27cPL730Ev7++2/4+/uXTeWJyki5Gxk0Lvny+eefF7qc++233+LSpUto27Yt7O3toSgKhgwZgvT0dEyePNmk7OTJk5Geno6hQ4eabB82bBiAvHUIjYknkDciuXXrVoSHh8PX17c0mkZERGXIYDBg4cKFeOGFF0wuq1WrVg2NGjUy+R+QN2nfz88PAODv72+y37i9fv368Pb2LvvGEJWicjcy2K9fP3zzzTfYvn076tWrh969e8PDwwMHDx5EZGQkHB0d8fnnn6vlx40bhz/++APTp0/HoUOH0Lx5cxw8eFB9HN2bb75p8v4dO3bEkCFDsGDBAjRv3hy9evXClStXsGLFClSuXBlffvllGbeYiIhKw+bNmxEXF4eXXnrJ3FUhKtfK5d3E2dnZmDVrFn755RecPHkSOTk5qFq1Kjp27Ij33nsP9evXNymfkpKCDz74ACtXrkRCQgKqV6+Ofv36YdKkSXB1dS30/gaDAV999RXmz5+P06dPw8XFBV26dMGUKVPuefifzyYmIiKislTSuUe5TAYrEiaDREREVJZKOvcod3MGiYiIiKjsMBkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYbZmLsCRERED2roF+b9+9+9ad6/T/QgODJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaVq6Twd9//x1du3aFp6cnHBwc4Ofnh4EDB+LixYsm5VJTU/HWW2/B19cX9vb2qFOnDsaOHYv09PQi39dgMODLL79E48aN4ejoiCpVqmDgwIE4e/ZsWTSLiIiIqNywMXcFiiIieOWVVzB//nz4+/tjwIABcHV1RXx8PLZt24YLFy7Ax8cHAJCRkYGwsDDExMQgPDwcAwcOxKFDhzBjxgxs27YN27dvh4ODg8n7Dx8+HAsWLEDDhg0xatQoxMfH45dffkFERAT27NmDgIAAczSbiIiIqMyVy2Rwzpw5mD9/Pl577TXMmTMH1tbWJvt1Op36359++iliYmLwzjvvYNq0aer28ePHY/r06Zg1axbeffdddXtUVBQWLFiA0NBQbNq0CXZ2dgCAZ555Bj179sTIkSOxcePGUm4hERERUfmgiIiYuxL5ZWVloWbNmqhUqRJOnjwJG5vi81URQa1atZCamoqEhAQ4Ozur+zIyMlCtWjV4e3vjzJkz6vZnnnkGy5Ytw7Zt2xAaGmryfh07dsTWrVtx4cIF1K5d+67qm5qaCnd3d6SkpMDNze0eW0tERCVh6Bfm/fvfvWnev0/aUtK5R7mbMxgREYEbN27g8ccfh16vx6pVqzBt2jR8++23OH36tEnZ2NhYxMfHIyQkxCQRBABnZ2eEhITg7NmzJnMMt27dqu4rqFu3bgCAbdu2lULLiIiIiMqfcneZ+MCBAwAAa2trPPzwwzh16pS6z8rKCqNHj8aMGTMA5CWDAIqd4xcQEICNGzciNjYWPj4+yMjIwJUrV9CoUaNCl57zv4/xfYuSnZ2N7Oxs9d+pqakAgNzcXOTm5qr1tLa2hl6vh8FgMKm/tbU1dDod8g/IWltbw8rKqtjtxvc1Mo6W5r9c/l/bbW1tYTAYoNfr1W2KosDGxqbY7cXVnW1im9gmtqk8tglQYE65ubn8nNimMm1TSSp3yeC1a9cAAJ9//jmaN2+O6Oho1K9fH4cOHcKwYcMwc+ZM+Pv749VXX0VKSgoAwN3dvcj3Mg6dGsvda/miTJ06FR9++GGh7REREXBycgIA1K5dG82aNcORI0cQFxenlgkMDERQUBCio6Nx/fp1dXvTpk3h6+uL7du3Iy0tTd3etm1beHt7IyIiwuSD79ixIxwdHbFu3TqTOvTs2RNZWVmIiopSt9nY2KBXr15ITEzE7t271e2urq7o1KkTLl68iJiYGHV7lSpV0K5dO8TGxuLkyZPqdraJbWKb2Kby3CbAvNN01q1bx8+JbSqzNhkHzkpKuZszOGzYMHz33XdwdHTE6dOnUaNGDXXf0aNH0aRJE/j5+eH06dNYunQpBg0ahAkTJuDjjz8u9F4TJkzAJ598glWrVqFv376Ij49HzZo1ERISgh07dhQqv2nTJoSHh2PUqFGYPXt2kfUramTQx8cHiYmJajKp1V8pbBPbxDaxTeZq07DZ5h0ZnDuCI4NsU9m1KTk5GZ6eniU2Z7DcjQwaR+1atmxpkggCQKNGjVC3bl2cPn0aN2/eVMsWN5JnvIRrLHev5Ytib28Pe3v7QtttbW1ha2trss3a2rrIy9HF3RRT3PaC73s/262srGBlVXiKaHHbi6s728Q23et2toltAkq/TeaWv178nNgmc7XpfpW7G0gCAwMBAB4eHkXuN27Pysq64xy/gnMKnZ2dUb16dZw7d84kMy+uPBEREZGlK3fJYMeOHQEAx48fL7QvNzcXp0+fhrOzM6pUqYKAgADUqFEDO3fuREZGhknZjIwM7Ny5E35+fuoC1QAQFham7ivIuL5gwSVniIiIiCxVuUsG/f39ER4ejtOnT2PBggUm+6ZNm4abN2+ib9++sLGxgaIoGDJkCNLT0zF58mSTspMnT0Z6ejqGDh1qsn3YsGEAgIkTJyInJ0fdvn79emzduhXh4eHw9fUtpdYRERERlS/l7gYSADhz5gzatWuHa9euoVevXggKCsKhQ4cQGRkJX19f7NmzB9WqVQOQNwIYEhKCw4cPIzw8HM2bN8fBgwcRERGB4OBgbNu2DY6OjibvP3ToUPVxdL169cKVK1ewYsUKuLi4YPfu3ahXr95d15WLThMRmR8XnSYtsfhFp4G80cH9+/fjxRdfxIEDBzBnzhzExsZixIgRiI6OVhNBIG8e4LZt2/Dmm2/i+PHjmDlzJk6cOIExY8Zgy5YthRJBAJg3b556t/Ds2bOxbt069O3bF9HR0feUCBIRERFVdOVyZLAi4cggEZH5cWSQtEQTI4NEREREVDaYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItKw+04Gt2/fjri4uP8sc/HiRWzfvv1+/wQRERERlbL7TgY7duyIRYsW/WeZH3/8ER07drzfP0FEREREpey+k0ERuWMZg8EARVHu908QERERUSkr1TmDsbGxcHd3L80/QURE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eceyI0aMQOXKlbFw4cL7rhwRERERla57SgZ37dqFLl26wN7e/o5l7e3t0aVLF+zcufO+K0dEREREpeueksH4+HjUrVv3rsv7+fnhypUr91wpIiIiIiob95QMWllZITc3967L5+bmwsrqvte1JiIiIqJSdk+ZWo0aNXD06NG7Ln/06FHUrFnznitFRERERGXjnpLBRx55BJGRkTh//vwdy54/fx6RkZEIDQ2937oRERERUSm7p2RwxIgRyM3NxVNPPYXExMRiyyUlJaFfv37Q6XR49dVXH7iSRERERFQ67mnR6ebNm+PNN9/EF198gQYNGuCVV15Bx44dUatWLQDA5cuXsWXLFsyfPx/Xr1/HW2+9hebNm5dKxYmIiIjowd3zE0hmzpwJBwcHfPbZZ5gyZQqmTJlisl9EYG1tjXfffRcff/xxiVWUiIiIiErePSeDiqLgk08+wcsvv4yFCxdi165dSEhIAABUq1YNISEhePHFF+Hv71/ilSUiIiKiknXPyaCRv78/R/6IiIiIKjguAkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBpW7pLBy5cv44svvkB4eDhq164NOzs7VKtWDU8++ST27t1b5GtSU1Px1ltvwdfXF/b29qhTpw7Gjh2L9PT0IssbDAZ8+eWXaNy4MRwdHVGlShUMHDgQZ8+eLc2mEREREZU75S4Z/PLLLzF69GicPXsW4eHhGDNmDNq3b48//vgD7dq1w4oVK0zKZ2RkICwsDLNmzUJQUBBGjx6NwMBAzJgxA506dcKtW7cK/Y3hw4dj1KhREBGMGjUK3bt3x6pVqxAcHIzY2NiyaioRERGR2dmYuwIFtWrVClu3bkVYWJjJ9r///hudO3fGq6++iscffxz29vYAgE8//RQxMTF45513MG3aNLX8+PHjMX36dMyaNQvvvvuuuj0qKgoLFixAaGgoNm3aBDs7OwDAM888g549e2LkyJHYuHFjGbSUiIiIyPwUERFzV+JudevWDREREdi3bx9atmwJEUGtWrWQmpqKhIQEODs7q2UzMjJQrVo1eHt748yZM+r2Z555BsuWLcO2bdsQGhpq8v4dO3bE1q1bceHCBdSuXfuu6pSamgp3d3ekpKTAzc2tZBpKRET3ZOgX5v37371p3r9P2lLSuUe5u0z8X2xtbQEANjZ5A5qxsbGIj49HSEiISSIIAM7OzggJCcHZs2dx8eJFdfvWrVvVfQV169YNALBt27bSagIRERFRuVLuLhMXJy4uDps3b0b16tXRuHFjAFDn9wUEBBT5moCAAGzcuBGxsbHw8fFBRkYGrly5gkaNGsHa2rrI8vnftyjZ2dnIzs5W/52amgoAyM3NRW5uLgDAysoK1tbW0Ov1MBgMalnjdp1Oh/wDstbW1rCysip2u/F9jYzJsE6nu6vttra2MBgM0Ov16jZFUWBjY1Ps9uLqzjaxTWwT21Qe2wQoMKfc3Fx+TmxTmbapJFWIZDA3NxfPPfccsrOzMX36dDWRS0lJAQC4u7sX+Trj0Kmx3L2WL8rUqVPx4YcfFtoeEREBJycnAEDt2rXRrFkzHDlyBHFxcWqZwMBABAUFITo6GtevX1e3N23aFL6+vti+fTvS0tLU7W3btoW3tzciIiJMPviOHTvC0dER69atM6lDz549kZWVhaioKHWbjY0NevXqhcTEROzevVvd7urqik6dOuHixYuIiYlRt1epUgXt2rVDbGwsTp48qW5nm9gmtoltKs9tAsw7TWfdunX8nNimMmvTgQMHUJLK/ZxBg8GA5557DkuXLsXQoUMxf/58dd/SpUsxaNAgTJgwAR9//HGh106YMAGffPIJVq1ahb59+yI+Ph41a9ZESEgIduzYUaj8pk2bEB4ejlGjRmH27NlF1qeokUEfHx8kJiaqyaRWf6WwTWwT28Q2matNw2abd2Rw7giODLJNZdem5ORkeHp6lticwXI9MmgwGPDSSy9h6dKlePbZZ/Htt9+a7DeO8BU3kme8hGssd6/li2Jvb6/eyZyfra2tOqfRyNrausjL0bcva9zd9oLvez/braysYGVVeIpocduLqzvbxDbd63a2iW0CSr9N5pa/Xvyc2CZztel+ldsbSAwGAwYPHozFixdj4MCBWLRoUaEDeKc5fgXnFDo7O6N69eo4d+6cSWZeXHkiIiIiS1cuk0FjIvjjjz+if//+WLJkSbE3fNSoUQM7d+5ERkaGyb6MjAzs3LkTfn5+8PHxUbeHhYWp+woyri9YcMkZIiIiIktV7pJB46XhH3/8Ef369cNPP/1UZCII5F1rHzJkCNLT0zF58mSTfZMnT0Z6ejqGDh1qsn3YsGEAgIkTJyInJ0fdvn79emzduhXh4eHw9fUt4VYRERERlU/l7gaSDz74AB9++CFcXFzwxhtvFHld/PHHH0fTpk0B5I0AhoSE4PDhwwgPD0fz5s1x8OBBREREIDg4GNu2bYOjo6PJ64cOHYoFCxagYcOG6NWrF65cuYIVK1bAxcUFu3fvRr169e66vlx0mojI/LjoNGlJSece5e4GkvPnzwMA0tPTMWXKlCLL1KlTR00GnZ2dsW3bNnzwwQdYuXIloqKiUL16dYwZMwaTJk0qlAgCwLx589C4cWPMnz8fs2fPhouLC/r27YspU6bA39+/tJpGREREVO6Uu5HBioYjg0RE5seRQdISTT+OjoiIiIhKFpNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgERERkYYxGSQiIiLSMCaDRERERBrGZJCIiIhIw5gMEhEREWkYk0EiIiIiDWMySERERKRhTAaJiIiINIzJIBEREZGGMRkkIiIi0jAmg0REREQaxmSQiIiISMOYDBIRERFpGJNBIiIiIg1jMkhERESkYUwGiYiIiDSMySARERGRhjEZJCIiItIwJoNEREREGsZkkIiIiEjDmAwSERERaRiTQSIiIiINYzJIREREpGFMBomIiIg0jMkgWZSpU6ciODgYrq6u8Pb2xuOPP46TJ08WKrd792506tQJzs7OcHNzQ2hoKLKyssxQYyIiIvNiMmhB7jYRAgARQY8ePaAoClavXl22FS1F27Ztw4gRI7Bnzx5s2rQJubm5CA8PR0ZGhlpm9+7d6N69O8LDwxEdHY19+/Zh5MiRsLKynNOBsUBERHfLcr796K4SIaMvvvgCiqKYoZala8OGDXjxxRfRsGFDNGnSBIsWLUJcXBwOHDiglhk9ejRGjRqF8ePHo2HDhggMDMTTTz8Ne3t7M9a8ZDEW8twpKU5OTsbrr7+OwMBAODo6onbt2hg1ahRSUlLMWOuSdzc/DoYPHw5/f384OjqiSpUq6NOnD06cOGGmGlNp4TlBRWEyaEHuJhECgJiYGMycORM//PCDmWpadowdWOXKlQEA165dw969e+Ht7Y127dqhatWqCAsLw44dO8xZzRLHWMhzp6Q4Pj4e8fHxmDFjBo4ePYpFixZhw4YNePnll81c85J1Nz8OWrRogYULF+L48ePYuHEjRATh4eHQ6/VmrDmVNJ4Tee7mB9KtW7cwYsQIeHp6wsXFBU8++SSuXr1qphqXLkVExNyVqMhSU1Ph7u6OlJQUuLm5mbs6Jk6fPo2AgAD8888/aNSoEQAgMzMTLVu2xNSpU9GnTx8oioLff/8djz/+uHkrWwoMBgN69+6Nmzdvqsnenj170LZtW1SuXBkzZsxA06ZN8eOPP2Lu3Lk4evQoAgICzFzr0qH1WDC6fv06vL29sW3bNoSGhhZZ5tdff8Wzzz6LjIwM2NjYlHENy8bdHIcjR46gSZMmOH36NPz9/cu4hvdu6Bfm/fvfvWnev3+/tHpOdO/eHQMGDEBwcDB0Oh3ee+89HD16FMeOHYOzszMA4NVXX8Vff/2FRYsWwd3dXZ1OtHPnTjPXvuRzD8v4VKkQg8GAN998EyEhIeqXP5B3ibRdu3bo06ePGWtXNkaMGIGjR4+ajPoZDAYAeZfEBg8eDABo1qwZtmzZgh9++AFTp041S11LE2PhtoIjxcWVcXNzs5gvvaLc6ThkZGRg4cKF8PPzg4+PT1lWjcqYVs+JDRs2mPx70aJF8Pb2xoEDBxAaGoqUlBR8//33WLp0KTp16gQAWLhwIerXr489e/agTZs25qh2qbGcT5ZMFJUIrVmzBpGRkTh06JAZa1Y2Ro4ciT///BPbt29HrVq11O3Vq1cHADRo0MCkfP369REXF1emdSwrWo8Fo+KS4vwSExMxefJkDBs2rIxrV3b+6zjMnTsX48aNQ0ZGBgIDA7Fp0ybY2dmZqaZU2nhO3FYwKT5w4AByc3PRpUsXtUxQUBBq166N3bt3W1wyyDmDFsiYCEVFRZkkQpGRkThz5gw8PDxgY2Oj/sp78skn0aFDBzPVtmSJCEaOHInff/8dkZGR8PPzM9lfp04d1KhRo9DckFOnTsHX17csq1omtBwLBRmT4uXLlxe5PzU1Fb169UKDBg3wwQcflG3lytB/HYdBgwbh0KFD2LZtG+rVq4enn34at27dMkMtqSzwnMhTVFKckJAAOzs7eHh4mJStWrUqEhISzFDL0sWRQQsiInj99dfx+++/Y+vWrYUSofHjx2PIkCEm2xo3boxZs2bhscceK8uqlpoRI0Zg6dKl+OOPP+Dq6qqetO7u7nB0dISiKBg7diwmTZqEJk2aoGnTpli8eDFOnDiB3377zcy1LzmMBVPFjRQbpaWloXv37nB1dcXvv/8OW1tbM9Sy9N3pOLi7u8Pd3R0BAQFo06YNKlWqhN9//x0DBw40Q22pNPGcuK2oqydaw2TQgtwpEapWrRqqVatW6HW1a9culCxUVN988w0AFBrdWrhwIV588UUAwJtvvolbt25h9OjRSE5ORpMmTbBp06YKMUn+bjEW8twpKQbyRj+6desGe3t7rFmzBg4ODmaoaem6m+NQ1GtEBNnZ2WVQQyorPCdMFZcUV6tWDTk5Obh586bJ6ODVq1eL7DsrOiaDFuRuEiFLd7c3x48fPx7jx48v5dqYD2Mhz52S4tTUVISHhyMzMxM//fQTUlNTkZqaCgCoUqUKrK2tzVn9EnOn43D27FmsWLEC4eHhqFKlCi5duoRp06bB0dERPXv2NHPtqSTxnMhzp6S4RYsWsLW1xZYtW/Dkk08CAE6ePIm4uDi0bdvWHFUuVVxa5gGV56VliLSuuMW0jUnx1q1b0bFjxyLLnDt3DnXq1CnF2pWdOx2H+Ph4DBkyBAcOHMCNGzdQtWpVhIaG4v3330dgYGAZ1/b+cGmZu8NzIs9rr72mJsX5Y9yYFAN5S8usW7cOixYtgpubG15//XUAwK5du8xS5/xKOvdgMviAmAwSEZkfk0G6F3dKioG8RafHjBmDZcuWITs7G926dcPcuXPLxWVirjNImsYOn4iIHtTdjIM5ODjg66+/xtdff10GNTIvJoMVhLmTIICJUHnBWKD8GA9E9KCYDBJRhcQkiMgUzwm6X0wGiYiIyGIwKb53fAIJERERkYYxGSQiIiLSMM0mg/v27UPPnj3h4eEBZ2dntGnTBr/88ou5q0VERERUpjQ5ZzAqKgrdunWDg4MDBgwYAFdXV6xcuRL9+/fHxYsXMWbMGHNXkYiIiKhMaG5kUKfTYejQobCyssL27dsxf/58zJw5E4cPH0a9evXw3nvv4cKFC+auJhEREVGZ0FwyGBkZiTNnzuCZZ55B06ZN1e3u7u547733kJOTg8WLF5uvgkRERERlSHPJ4NatWwEA4eHhhfZ169YNALBt27ayrBIRERGR2WhuzmBsbCwAICAgoNC+atWqwcXFRS1TlOzsbGRnZ6v/TklJAQAkJycjNzcXAGBlZQVra2vo9XoYDAa1rHG7TqczeRSOtbU1rKysit2em5uLnFu299nikpOaihJtU342NnmhqNPp/nO7uY9DaipKvE1Gtra2MBgM0Ov16jZFUWBjY2Oy3dzHAACSku6urXfbpvzbi4uxgtvL03EoqTbdz/mUc8v8v+mTknJLpd/L707nU86top81W1aSknJLrd8zutP5VB5iISUlr90l3e/l336n86k89A03b5ZOv2fcnpycDODuHqt3NxQpqXeqIMLDw7Fp0ybExsbioYceKrS/Zs2aSE9PV5O8gj744AN8+OGHpV1NIiIiov908eJF1KpV64HfR3Mjgw/q3XffxVtvvaX+22AwIDk5GZ6enlAU8/4yLU5qaip8fHxw8eJFuLm5mbs6ZsPjkIfHIQ+PA4+BEY9DHh6HPBXhOIgI0tLSUKNGjRJ5P80lg+7u7gBQ7MhfamoqKlWqVOzr7e3tYW9vb7LNw8OjxOpXmtzc3MptYJclHoc8PA55eBx4DIx4HPLwOOQp78fBmM+UBPNPMChjxrmCRc0LTEhIQHp6epHzCYmIiIgskeaSwbCwMABAREREoX0bN240KUNERERk6TSXDHbu3Bl169bF0qVLERMTo25PSUnBJ598Ajs7Ozz//PPmq2ApsLe3x6RJkwpd3tYaHoc8PA55eBx4DIx4HPLwOOTR4nHQ3N3EQPGPo7tw4QJmzJjBx9ERERGRZmgyGQSA6OhoTJo0Cbt27UJubi4aN26Mt956C/379zd31YiIiIjKjGaTQSIiIiLS4JxBIiIiIrqNySARERGRhjEZJCIiItIwJoNEREREGsZkkMzCYDAUuZ33M2mTluNBr9cX2iYimmh7UbQcC3QbzwvTmC/tdvNuYjKbixcvwsPDA1euXEFubi4aNmwIIC/oFUUxc+1Kl06ng42NDa5evYrMzEx4e3sjLS0NVlZW8Pb2Nnf1zELL8XDz5k14eHggLi4O9vb2qFq1qrmrZFZajgX2Dbdp+bwwxnpSUhJsbGzg7u6O5ORkODk5wcHBocT/nk2JvyPRHQwdOhSHDh1CYmIikpKS4ODggKysLLi4uKBFixbo0KEDgoOD0bRpU3h4eKi/Bq2sLGMgOyoqCt9++y0OHToEnU6H1NRU6HQ6+Pn5wc3NDfXq1cMjjzyC7t27a6Lz13I8vPLKK7h48SLOnj2L9PR02NnZISsrC1WqVEFISAjatWuHJk2aICAgAA4ODjAYDFAUxWITIi3HAsC+wUjr50VERAR+//13HDp0CLm5uUhMTIStrS3q1q0LV1dXNGrUCB06dEBoaCisra1L5G9yZJDKVEJCArp3745WrVrBYDDA09MTer0eMTExSExMxOXLl5GUlARXV1eEh4fj9ddfR2hoqLmrXaLeeecd/PHHHwgLC4O1tTWSk5NhY2ODhIQExMTEIDk5GQAQEBCAAQMGYODAgQgKCoLBYLCYLz0jLcfD4cOH0adPHzRp0gSKosDLywspKSn4999/kZGRgYSEBOTm5sLPzw9PPvkkRo4cidq1a5u72qVGy7FgxL6B5wUAPP744zh48CDatGmDrKwsZGdnAwCuXLmCY8eOqZeMO3TogEGDBuGxxx6Dt7f3g42cC1EZMRgMIiKSlpambsvNzVX/+/r16xIVFSVz5syRXr16ibOzsyiKIs8++6wcOXJERET0en3ZVroUGNufv+2pqamSlpYmycnJEhERIc8++6w4ODiIoijSrVs32bt3r7mqW2q0HA/GtsfHx6vbbt26pf73iRMnZMWKFfLee+9J8+bNRVEUcXR0lI8++kiuXLkiIiI6na5sK12KtBwL+Wm9b+B5kScxMVFEbrfdYDDI1atXJTExUU6ePCnffPONtG7dWhRFETs7Oxk+fLhcvnz5gf4mk0EqU8aTPX/HrdPp1O1G8fHx8vPPP0u7du1EURTp2rWrerJbkv/quC5duiTvvvuuVKlSRRwdHWXmzJkmnYMlYDyYxkDBeNDpdPLPP//ItGnTpFatWqIoirz66qtlXcUywVgwpfW+gedFnv+Kg927d0v//v3Fzs5O/Pz85I8//hCDwXBfMcBkkMqN4oL4q6++ksqVK4uvr6/s3LnTDDUrW3q9Xv1CzMjIkN9++02aNm0qTk5O8sMPP5i5dmVHy/FQVNvj4+PltddeE0VRpGPHjnLu3DnzVM4MtBwL+Wm9b+B5kSd/gnj16lX54osvxNvbW+rUqSO7du26r/dkMkhlLv/JnP+/9Xq9+m+DwWAyQrBs2TKpXr26tGzZUuLi4squsiWsuEtZd7q0cenSJenXr5/Y29tbXKev5XgwKngM8rc1/3G4deuWTJs2TRwdHeX55583uYRmCbQcC+wbCtPieWFsY8G23mkaxI4dO6RJkybi7e0tkZGR9/x3mQxSmdPpdJKQkKD+d2pqaqEyRY0CHDp0SOrWrSufffZZhb4UkpmZqf5/cnLyf5bN/0v4+vXr0qVLF2nRooUkJSWVej3LipbjQa/XS3p6uojktTEnJ6fQ/qLa9vPPP0vlypVl2bJlZVLPsqLlWBBh32Ck9fPCmPjdunXLZP5oUfIfh2PHjom/v7/07dtXsrOz7+lvcmkZKhO7d+/GqlWrsHfvXmRlZSEjIwOpqalo2LAhqlatioCAADRr1gwhISGoVKmSyR1R8v93TjVt2hRz586FjY1NhVxC4JNPPsHZs2cRFxeHy5cvo1KlSjAYDHB1dUVISAg6d+6M+vXro3LlygDyFl21srJS2+rl5YV169ZhxYoVcHFxMWdTHpiW42HXrl3YsWMHdu3aBZ1Oh6SkJOh0OjRs2BBeXl6oV68eWrRogWbNmhW6Q1T+/27B/v37Izc3F3Xq1DFPI0qQlmPBiH0DzwsRwZw5c5CUlIRjx47h5s2bcHNzg16vh5eXF7p06YLg4GD4+PjA3t4eQF4c5F9apn79+tiyZQv+/PNP2NjcW3rHpWWoTAwfPhy//vorWrVqBUdHRyQnJ0On0yEtLQ3nz59X15IKCwvDU089hUcffRTVq1cv1OlVVPv27UNYWBgaN26MnJwcVKlSBTqdDjExMUhNTVWfutCkSRO8+OKLGDZsGBwdHU3ew7h8xK1bt0pl0dGypOV46Ny5M3bt2oVmzZpBp9MhMzMTer0eaWlpuHLlCkQE1apVQ48ePdC3b1906NABLi4uhTp+wDIWYdZyLADsG4y0fl6sWrUK/fv3h4+PD0QElStXRmZmJk6ePKmWcXJyQpcuXTB8+HD06NGj0HsY252RkQFnZ+d7q8A9jSMS3SfjpF7j0L9I3qWNM2fOyMGDB+X777+Xnj17ip2dnTg6OspLL70kly5dKvQ+FfESkLHOJ06cULflvwS0f/9+mT17tjzzzDPi7e0tiqKIj4+PzJ8/X1JSUkTEMpbNyE+r8aDX6+Wff/4Rkbz2iuRdDo2NjZUjR47Ixo0b5X//+580aNBAFEWRmjVrytSpUwvNG6to7f4vWo0FEfYNRjwv8uJ/z549IiKSk5Mj8fHxotPp5Nq1a7JmzRoZN26cdOzYUWxtbUVRFAkNDZWIiAjJzc0tNJ/yfjAZpDJXXNDm5OTIjh075PnnnxcbGxupVq1ahZ/7UVD+thfsuIztHzFihNjY2IiDg4NMnTq1rKtY5hgPhSUnJ8vy5cslLCxMFEWRVq1aqXfLWsKXf3EYC3m03jdo+bz4rzi4du2arFixQnr27CmKokjt2rVl5cqVJfJ3mQySWRX1Sy4+Pl6++OIL8fLyklq1asm6devMULOyU9SdYseOHZMnn3xSXVj3xo0b5qlcGdNqPBTVbr1eL//++6+8+eabYmVlJW3btpXTp0+boXbmodVYyE/rfQPPi7xjUNQd5WvWrJFmzZqJtbW1fPTRR4VusrlXTAapXCjqjqnjx49LWFiYVKpUSTZv3myGWpWe/AvsFlwyw/jvS5cuyfDhw0VRFBk3blyFvgRyr7QUDwWXUCmu4/f19ZWgoCA5fvx4WVbP7LQUCyLsG4x4XuTJ3+6Cx+Hw4cMSHh4uDg4OsmTJkgf6O0wGqcwU7LCysrKKXDoi/6/ho0ePSsOGDSUkJKTIshXZ3d76P3PmTPHw8JD169eXco3KlpbjoWDbs7Ozix0FMdq4caN4eHjI888/f8flJioaLcdCUbTaN/C8uHdpaWny4osvStWqVSUmJua+34dLy1CZkP+/yyknJwerV6/G8uXLcfPmTTg7O6NWrVp48cUX0bp1awAwWTagYcOG2LJlC3755Rf1dvqKLi4uDkuWLMGmTZug0+nQpUsXtGnTBl27dlXvitPr9RAR2NjYYMiQIcjOzq6wS0YURevxoCgKRASrVq3C+vXrkZGRAScnJ/j5+eGFF16Aj48PANO2h4eHIyIiApGRkYWW1qjItB4L+Wm9b+B5kef8+fNYv3491q9fD3d3d4SFhaFly5Zo2rSpWkan08HKygouLi6YNGkS3Nzc7nk5GRMlkZkS3Q29Xi9vvfWW2NjYSOXKlaV169bi4uIiiqLIihUrRCRvsVXjr/z8d0hV9F/+xqH9tWvXqnfE+fv7S506dURRFGnYsOEd38PSLgVpMR6Mn2F6erqMHj1arK2txcnJSerWrStWVlaiKIrs2LFDRPJGx4wjRPkXGL7TYsQVkRZjwYh9A88Lkdujnb///rsEBgaKoiji7e0t7u7uoiiKPP7443f9HveDySCVOmNnt3z5crG1tZVnn31WEhMT5datWzJy5EixsrJSHx+UmJgoEydOtNgJwY0aNZI6derIxo0bRURk8eLFYmNjI5MnTxaRvBXnP/30U5k/f36RjyWyBFqOB+NlrDlz5oitra28+OKLcvHiRUlKSpI+ffqIh4eHWjYuLk6++OILSUxMNFd1S52WY6EgLfcNPC/y5OTkqD8EIiMjJSkpSaZPny6KoqiPGkxJSZHPPvvM5JFzJREHTAap1BkDNTQ0VFq2bClHjhwRkbxHSDVo0EAeffRRtezhw4dFURT56aefzFLX0mBs/6ZNm0RRFJkzZ466b+rUqaIoily+fFnd1qVLF+natavcvHmzzOtaFrQeDyIiQUFB0rlzZ3WNvR07dkitWrVk+PDhapm1a9eKoij39ZzRikLrscC+wZRWzwvjj6JFixaJra2tfP/99yKSN/L59ttvi42Njck80qCgIBkyZEiJPoPZMi6wU7lmZWWFmzdv4vTp0wgKCkJgYCAA4PDhwzh+/DheffVVtez58+dRrVo1pKenA7j9uClLsGHDBlSvXh0tWrQAAJw+fRpr165Fy5YtUaNGDQBAVlYWdDodDAZDhX2SwJ1oNR6MdT979iwuXbqEZs2aqY/NOnDgAC5fvoxXXnlFLZ+QkICqVasiLS3N5PWWRKuxUJCW+waeF7fnQK5fvx4BAQHqHNkjR47gzz//RM+ePWFnZwcAuH79OqytrZGZmVmic2WZDFKZSE5OhqurK3Jzc2FnZ4erV68iMjISbm5u6Nmzp1ruxIkTSEtLQ3BwMADLOtFtbW2RkpICX19fAHknenR0NIYNG6aWPX36NBITE1G1alXY29urj6KyNFqMB+PjsRITE+Hg4KB25BcuXEBERATq1KljMkH81KlTyM3NRbNmzcxR3TKjxVgwYt/A8wLIOwa5ubkAgIyMDDz00EMAgIMHD+LkyZMmyfDJkyeRnp6OmjVrAkCJxQGTQSp1IoK6deuiRo0a2LVrF7Kzs5GWloYtW7bg6aefVsvFx8djx44d8PDwQPPmzQHAYu4OA4DmzZsjMzMTf//9N7KysrBjxw4AwHPPPaeW2bNnD44dO4Ynn3wSgGV84RWk9Xho2LAhPDw8sG3bNgDAlStXsH37djz//PNqmdOnT2PPnj3w8fFRn1Va0Z61eje0HgtG7Bu0fV6ICGxtbdGoUSPExcXhxIkTyMjIwNatW+Hu7o4ePXqon3d0dDTi4uLQt2/fEq8EUZmYN2+eWFtbS9euXeXNN98URVFMJoNPnz5dHB0dZdKkSSJS9GKzFVliYqIEBARIrVq1ZMaMGVK/fn3p1auXuv/8+fMSHBwsPj4+Zqxl2dFyPLz11luiKIqMGjVKbXtWVpa6/3//+5/Y2dnJ3LlzRcSy2l4ULceCCPsGI62fF0ePHhV7e3tp3769fPvtt1KzZk0ZNmyYyf4mTZpI/fr1S/xvMxmkMqPT6eSNN94QRVFEURRxcnKSGTNmyG+//SbPP/+8KIoi3bt3l4SEBBGp+Msl5Gdsy5o1a6R27dpibW0tiqLIiy++KFu2bJHPPvtMWrRoIW5ubvL111+LiBS54r4l0XI8JCUlSa9evURRFLG2tpaqVavK2rVrJSoqSoYOHSqKosijjz4qGRkZImJZbS+KlmOBfcNtiYmJmj4vDAaDTJ8+XZycnMTJyUkURZEpU6ZIdHS0/PDDD9KiRQvx9PSUH3/8UURKNg6YDFKZysnJkUWLFknz5s3Vjl9RFHF0dJQBAwbI2bNnzV3FUhcZGSnPPPOMBAQEiKIo6jpa3t7esnLlSvUOMUvr6IqitXjQ6/Xq5xsfHy/jx4+XKlWqmLTdxsZGBg0apI6MaSEORLQXC0Vh33D7vPD29tbsefHTTz9Jly5dpGrVqqIoitjZ2YmiKOLh4SGrV682WWexpCgiFjbxgMoF+f+5HFlZWbh69Src3Nzg7u5usor+8ePHERUVBRsbG4SEhMDf3x/Ozs4WMw/E6MSJE/Dx8YGzs7O67fr169i/fz/i4uKgKAocHR3Rs2dPeHp6mrGmpUfL8aDX62FtbY3s7Owi7/67ceMGdu3ahZ07d6JSpUpo164dmjVrBicnJzPUtvRpORYK0nLfkD8OUlNT4erqahLzN27cwI4dO7Bjxw54eXlZ9Hlx6dIl1KpVy2Tb8ePHER0djUuXLkGv16NSpUp46qmnUL169dI5D0osrSTKxzh8/c0334ivr6+6NpilLJJ6J8ZfbEePHpVatWrJ66+/LitWrJCTJ09KTk6OmWtX9rQcD8Y2tmvXTlq0aCHLli274+UdSx710HIsiLBvMDJ+3rNmzZImTZqo6wb+17lhSeeFsf1bt26V5s2by9SpUyUqKkqdClGwXGnjyCCVGp1Oh/r168Pd3R1//PGHeiv8jRs38Pfff+Off/5B8+bNER4ero4KWJrIyEgMHz4c8fHxEBE0a9YMnTt3Rps2bdC4cWP1WZtaoOV4yMzMROfOnXHgwAHodDrY2dnhiSeewLBhw9ChQwe1nIggJyfHYp61Wxwtx4KRlvsG+f+RrWvXrqFly5bw8vLC9u3b1WcsZ2ZmYtu2bbh06RLatWuHhg0bmrnGpWfBggV48803kZ2dDS8vL7Rv3x4dOnRAy5YtERQUBHd3d7WslObIeJmknKQpxl92P/74ozg5OcmiRYvUfbdu3ZLHH39cnSRtY2Mj8+bNM1dVS51er5dr165JZGSkjBkzRn3mpKenpzz66KMyY8YM2bZtm0U+WsmI8ZDn1q1bsnXrVnn77bfl4YcfVudCVa9eXd599105efKkuatY6hgLt2m5bzDeBTxt2jSpXLmyrFy5Ut13/fp1eeKJJ9R5cjVr1lQf0WeJbt26JadPn5YlS5bIE088IZUqVRJFUaRevXoybNgw+fHHH+Xo0aMl+rSRojAZpBJnHNbu3r27NG/eXP799191+6RJk0RRFBk4cKB8//33UqtWLfHx8bHYxyvll52dLXFxcbJy5Up5+umnxc3NTZydnaVp06bSs2dPOX78uLmrWCoYD4UvbyUlJcnKlSvl+eefV5MfRVGkTp06Mn/+fDPVsvQxFoqm1b6hadOm0rVrVzl//ry6bdSoUaIoigwYMEDeffddsbKyko4dO1rsHdT5paWlyZEjR2TWrFnStm1bsba2lurVq0vHjh3llVdeKXQJuSQxGaRSkZaWJs2bN5eOHTuq29asWSPu7u7yyiuvqM/bnDBhgri7u8vevXvNVdVSVdx8j2vXrsmnn34qiqJIUFCQODk5SUpKShnXruwwHvLo9fpCieHx48elXbt24u/vL4qiyFtvvSUilrt8CGMhj9b7hkuXLomvr68MGjRI3bZy5UpxcHCQMWPGSFJSkoiI9O/fX/z8/NTnFVuaouJAp9PJ6dOnZdiwYaIoilStWlVcXFxKtR42pXPxmbTO1tYWtWvXRnR0NPbu3QuDwYAJEybA0dERkyZNQrVq1dRytra26lwRsbC7BY1PSZC8H17qv6tUqYKxY8fiyJEj8PT0xNixY+Hm5gaDwWBRT1Yw0mo85K+/Xq+HoihQFAUion7WQUFBeP311/Huu+9i8+bNaNWqFQBU6Hb/F63GQkFa7xtsbW3h5eWFU6dO4erVqzh9+jQmTJiAWrVq4b333kPlypUBAJUqVYJer4ejo6OZa1w68scBkHfeW1tbw9/fH99++y3OnDmD8PBwPPXUUwBur05Q0pgMUoko2KHZ29ujWbNm+OOPP9CzZ0/odDrY2tri448/Vjv7hIQExMTEwMXFBQ0aNABQ8b8AjSfq8ePHcfXqVTRs2BBeXl5qEgDkHSvj8XBwcMCpU6fg5uYGwHIescV4yKMoCjZt2oROnTqZdOAFv9iDgoJgZWUFJycnNflhLFhWLGi9bzA+Q9fYDm9vb9SrVw/Lly9HaGgokpOTISKYM2eOmgiePXsWx48fR7Vq1VC1alWL+EFgjINjx45Bp9Opyyblb1fBY3Xu3DnUrl0bAErthiomg/TAbt26BQcHBzWYjV9077//Pvz8/PDrr7/i8uXLmDp1KkJDQ9XXbd68Gdu3b8eIESMA5N1haGNTsUPSePK+9tpr2LVrF/r27YsuXbqgZcuW8PPzg7u7OxRFga2tLdLS0mAwGHDixAm4urqaueYlh/FwexRr06ZN6NatG4KCgtCzZ0/0798fwcHBJmvqWVtb4+zZs7hx4wbOnTuHNm3aWMSXHsBYyE/rfUP+ZNb4eX7//fcICAjAmjVrAACzZ89Gp06d1HLr16/HgQMH8OmnnwLIO18qehwYz/1+/fohKysLTzzxBDp06ICGDRuiRo0asLe3V4/V1atX4erqisOHD5d+u0v1IjRpwhNPPCEjR46UqKioQnc8FTcv5urVq1K3bl2pX7++XLx4UUQsZw0pg8Eg3333nfTr109q1KghVlZW4u/vL8OHD5cVK1bIwYMHJTk5WRYsWCC2trby4osviojlzBFjPNx28OBB6dWrl8nTFFq1aiXTp0+XM2fOiIjIP//8I927dxdbW1uLmxvGWDCl1b5hwIABMnPmTDlx4kShfTk5OSZP5jF+1mfPnhV/f39p2rSppKWllWl9S1tWVpaMHz9e2rdvL46OjuLo6Cjt27eXyZMnS2RkpMTGxoqIyFdffSVWVlby3nvviUjpxgGTQXog8fHx6pecra2thIaGytSpU+XQoUOFyhoXVM3OzpYVK1ZIQECALFiwQEQso7M3nqjXr18XEZGMjAzZtWuXfP755xIeHi5ubm5ia2srderUETc3N1EURWrVqiWHDx8WEctYdJfxcJvBYJDU1FQREUlISJBvvvlGOnXqJPb29uoxCggIEA8PD1EURV599VURqfhf/EaMhdu03DccOHBAjYNq1arJwIED5aeffpIrV64UKmuMg1u3bsnnn38u1atXV5/DW5GPgZGxDcZnK1+5ckXWrl0rb731ljRu3Fisra2lUqVK0qxZM/Hx8RFra2upXbu2+qOoNI8BF52m+yb/fylLr9dj1apV+PbbbxEVFQUA8PDwQGhoKHr27ImuXbvCz89PfZ1er0diYiKysrJQrVo1ODg4WMxlMQBo0KABGjZsiIULF8LFxQU6nQ5Xr17F8ePHsXv3buzbtw+xsbFo3bo1XnnlFbRp08bcVS4RjIc8xktgS5cuxXfffYePPvoIjzzyiLr/+PHjWLlyJSIjI5GUlAQ3NzcMGDAAAwcOROXKlS3iRgHGQtG01jcYP7uzZ8/i559/xg8//IALFy4AAOrVq4cuXbqgV69eeOSRR9S5skDe9IKEhARkZ2fD19fX4uLgoYcewtNPP40pU6ZAURRkZGQgLi4OMTEx2Lp1K/bv34+LFy+ie/fuePnllxEWFlb67S+1NJM0oeAoxvXr12XmzJnSsGFD9degr6+vDB48WFauXGmRC6iK3P7FduzYMXFwcJCPPvqoyHLGB4yLiEU+dJ7xcDsWOnToIA0aNFDXiCvqUWOXLl2yiBGPojAW8mi9bygY39HR0TJ06FB1BFRRFGndurVMmjRJ9uzZYxFtLorxOGzZskXs7Oxk5syZRZZLS0uT3NxcycjIkKysrDKrH5NBKhE6na7QSX/8+HF5++23pWrVqupJ//DDD8u4ceNkw4YN6ir0lmTLli3i7+8vf/75p4jc7gDyd3CW2tnlp/V4yMzMlNDQUHn66acLHQe9Xm8xl4LvhtZjwUjLfYPBYCjyM12zZo08+uijagw4OztL9+7d5csvv5R//vnHDDUtfT/88IPUq1dPXT+zqB+D5ogDJoNUogwGg9y6datQMG/dulWeeeYZk/lSf//9t5lqWXJu3LghERERJr/+3dzc5I8//hCRvONhqR383dBCPBg/+yNHjsjVq1fV7Z9//rk89thjIpL3+C0tx4GINmIhP/YNRdPpdCajoCJ5o2Hz5s2Tli1bqjFgZ2cnp0+fNlMtH5zxs01ISFCftCMisnPnTrGzs1OT3fJyZYDJIJUpnU4nP//8s/Ts2dPcVXkgxhP4gw8+ED8/P7l48aLs27dPnnjiCWnbtq08+uij6t2i+Wmx8/8vlhIPGRkZ4ujoKHPnzhWRvLtoQ0JCpGrVqvLXX3+p5QwGg6ZGBe+FpcQC+4YHc/78eRk/fry0bdvW3FV5IMbz/JVXXpE2bdpIRkaGbNmyRYYPHy5NmzaVt956q1zdJc0bSKjEGAwG7N27F2lpafDy8oKbmxuqVatmMjG4IKngk4J9fHzQpEkT/PLLL/juu+8wevRodV/Xrl0xePBgtG3bFtWqVYO9vb0Za1r2tBAPxps95s2bh1dffRV//PEHWrdujWrVqsHOzg45OTmoWbMmXn/9dbzwwguoWrWqyWtFpNQWkS1PtBALBbFvKExEcPjwYdjZ2cHe3h5OTk7w8vKCra1tsa+p6DdUOTs7o1+/fli4cCFeffVVzJ8/X903ePBgPPvss2jcuDE8PT3NGu9MBumBGBfNPX36NGbOnInFixerC822bt0arVq1QlhYGOrXr68uqFnRGb+k9u/fj1atWuHLL7/EiBEjkJCQgGPHjmH//v2IjIzEzp07odfr0bJlS3Tr1g2PPPIIAgMD4eXlZbEJgNbiwfhF1bx5c7i6umLRokXw8/PD8ePHsXbtWqxatQrR0dEAAE9PT3Tq1AkDBgxAz549K3zb70RrsQCwbyiK8RyJjY3FrFmzsHTpUqSmpqJ69ep45JFH0K5dO7Ru3Rp169ZVn8hS0RnjYM2aNXj88cexZMkSDBo0CCdOnMA///yDPXv2YMuWLTh69CiqVKmCDh06oFu3bmjRogXq1KljnoXGzTMgSZbmySefFEVR5IUXXpDffvtNmjRpIoqiiI2Njbi5ucmjjz4qn332mURGRsq1a9fMXd0HYhz+Hzx4sNSpU0diYmJM9mdlZcmZM2dk7dq1Mnr0aGnUqJFYW1uLp6en9O3bV2bMmCE3b940R9XLjJbi4cKFC6IoinzyySdF7t+3b5+MHTtWAgIC1PlQ/v7+8tJLLxW55p6l0VIssG8oXo8ePURRFOnfv7988803Jgux+/r6ytChQ2Xx4sVy6NAhdR2+iso4VSA8PFyaNm1aaLHt5ORkOXTokLoAube3t1hZWUlgYKCMHDlSli1bVmiR9tLGZJDumzHgDx8+LFZWVuqiuSIibm5u0r9/f/n222+lbdu2auevKIr8/PPP5qpyifLw8JDOnTsXuXiqUVpamvz777/y008/yYsvvijVqlUTV1fXMqxl2dFaPBjb+9FHH4mNjY389ttvInJ77lfBOWA6nU7++usvee6556RWrVqiKIp88803RZat6LQWCwWxb8hjTI43btwo1tbWMnr0aBHJa7uNjY28+OKLMnnyZPH19RVFUcTJyUk8PDws4gaizMxMsbKykueff77Ym0QMBoNcvXpVdu7cKZ9++ql07dpVFEWRhx56qIxry2SQHoDxRB8zZozUqlVLoqKiRERk5cqVoiiKLF++XETyvhBatmwpffr0kQEDBkhcXJyIVMwvQGOdN2zYIIqiiL29vbRr104++OADdamA4iQnJ8uuXbvU42RpNxJoMR5ERB3xa9mypXzyySeya9cuSU5ONvkCKNi25ORk+eGHHyQzM7PI/RWdFmOBfUNhxnYMGDBAGjRoINHR0SIiMmfOHLG1tZV169aJiMjq1avFx8dHnnjiCenSpUu5urHiXhnP+4ULF4qiKOLl5SVPP/20LFiwQI3vouTk5MjFixdl9erVsnnzZhGRMl1iickg3Zf8X3RdunSRrl27Snx8vIiIPP744xIYGKg+SklE5H//+5/Uq1fPZOmNisjY7h49ekilSpWkTZs26qUOd3d36dmzp3z55Zdy8uRJM9e0bGktHoxf/Pv27RNFUaR58+ZSo0YNk7XS5s6dK0ePHpX09PQiX2uptBYLRuwbTBmPR25urjRt2lQGDhyoPp6xVatW0rZtW5O7qvv37y9dunRRFx+vqOeJsd3NmzcXT09PddTTOD1k2LBhsnr16nI3HaDi3qJDZmW8uys5ORnW1tZwcHBA9erVkZ2djePHj6Nu3bqoX7++Wr5KlSoAgKSkJLPUt6RYWVkhKysLGzduxNChQxEVFYWjR49i4sSJqFmzJtavX49Ro0ahc+fOeO6557Bs2TJcu3bN3NUudVqLB4PBAACYO3cuateujVmzZmH16tX44IMP0Lp1a+zevRsjRoxA586d8corr2DFihU4f/48srOzLWKC/H/RWiwYsW8wZYyDy5cvw9raGu7u7nB1dUVCQgLOnz+PoKAg1K1bVy1fu3ZtpKenQ6/XA0CFPU+srKxw4cIFHDp0COPGjcORI0fw119/YdCgQUhKSsJ3332Hvn37olOnTnj33Xfx999/Q6fTmbvaYDJI92zWrFk4d+4cAMDJyQmNGjVCYGAgAODKlStwcHDArVu31OUCRARnz57F1atXUatWLbPV+0EZE4Aff/wR1tbWCAkJgYODAxo0aIAPP/wQBw4cQGRkJIYPHw69Xo+ff/4ZgwYNQseOHfHWW29hzZo1yM3NNXMrSp4W48F4x+fKlSvRqVMntGrVCsHBwXj//fexbNky/PTTTxg9ejRq1aqFX375BQMHDkS3bt0wfvx4bNy4EVevXjVzC0qHFmMBYN9Q0M8//4y0tDQAgJubG2rWrIk6deoAyEsOCy4lk5mZiYSEBFy+fBne3t5lXd0SY4yD7777Du7u7ggODoabmxt69OiBJUuW4Pjx4/jhhx/QtWtXHD58GNOnT0f37t3RvXt3fP755zh06JD5Km/mkUmqIApeFvv+++9N9udfUb5z585iZ2cny5Ytk4SEBPnmm2/Ey8tL+vTpIyIVdz6Mcfi/UaNGEhYWJhcuXDDZnl9SUpL8+uuv8sQTT4iTk5N6mcB4uayi03I8GNu+evVqURRFfvrpJxEpuh1nzpyRJUuWyEsvvST16tUTW1vb/7zzuCLSciwYsW8wPS9sbGzUJ60YGadLGAwGqVu3rtSpU0d2794tqamp8tVXX4m7u7sMGzZMRCpuHBjVrFlTnnjiCfXu+KLi4MSJEzJ9+nRp3ry5GgNeXl5l+jzi/JgM0l3Jv2RCrVq1ZN++feq+7OxsSUtLUzuDv//+WwIDA0VRFKlZs6YoiiJ169aV7du3m7xXRXTt2jVxcnKSiRMn3vWclri4OJk1a5YMHTpURMrP44cehJbjwdiuQYMGSfPmzeX48eMm2w0GQ6HPWKfTyaFDh+Srr76SLl26qEvKMBYqdizkp/W+wVj3bt26SaNGjdTzQiRv3mD+HwULFiyQSpUqiZ2dnTRs2FCNg/L2iLb7cfToUVEURT7//PO7Kp+TkyN79uyRYcOGyUsvvSQi5jkPmAzSPXFzc5PBgwerE4FFRLZv3y5hYWGyYcMGddu6devk9ddflwEDBsjQoUPl1KlT5qhuicvMzJR9+/apv/zvZ5JzRZ0YXRQtx8OuXbtkw4YN/3nHX1HPn63oa6gVR8uxIMK+QSQvtq2srOTtt982Sf42bNggTzzxhBw9elRE8hKgBQsWSL9+/aRLly7Sv39/k+SxIktMTJSIiIj7igNjEmiOZJjJIN2RMZjXrFkjiqLIjz/+aLL/008/FUVRCp3MxgfTk2VhPNwfvV5f4b/sC2IskMjt5GXu3Llia2trcok4JydHxo0bJ4qiyI0bN0xel5qaqi6vROZlY77ZilRRyP8/Wmfu3Llo3Lgx2rVrp+67dOkSNm7ciEaNGiEoKAiS7+mGiqJYxCOmyBTjIY/c47NzK/LzVYvDWKD85s+fj5CQELRo0ULddu7cOWzevBldunSBh4cH9Ho9rKysoCiKeR67RkWyvN6JSpxxyYRNmzahcePGJg+XP378OHbu3IkXXngBQN7zSBVFqbDLAtCdMR7yWGKb7hVjgYC8OIiLi8Phw4fRokULeHp6qvsOHTqEQ4cOYciQIeo2xkD5w5FB+k/GX/5r166FwWBAVFQU3n//fbRv3x6NGjXCpk2bkJ2djREjRgDIO8nvdcSEKg7GAxkxFgi4HQfLly8HAGzatAmurq5o06YNfH19ERkZCUdHRzz99NMAmAiWV4rkH7snKkZ0dDRWr16NHTt2YN++fQCAunXr4tq1a6hZsyZ27twJGxsbk0s/xtDiyW95GA9kxFggAFi7di1WrVqFXbt24fTp0/D09ES9evVw4sQJtGzZEhs2bCj0Y4A/DsoPJoN017KysnD58mX8888/iIqKwrZt23Dy5EkYDAZ06dIFbdq0QUhICBo2bIhq1aqZu7pUyhgPZMRYICDvqTPnzp1DdHQ0IiIiEB0djStXrsDLywu9e/dGq1at0KpVKzz00EMmUwrI/JgM0n1JTU3FuXPncOjQIWzevBnbtm3D5cuXUa1aNbRr1w6dOnVC48aN0bp1a9jZ2Zm7ulTKGA9kxFggvV6Pa9eu4eTJk9i7dy/Wr1+PAwcOIDs7G0FBQQgLC0NYWBgaNGiA+vXrc3SwHGAySA9ERJCUlITTp09jz549iIiIwN69e3Hjxg3UrVsX//77L+8a1BDGAxkxFggAsrOzceXKFRw9ehTbtm3D5s2bcfz4cRgMBnTo0AERERHmriKBySCVIJ1Oh4SEBJw8eRLr16+Hoij47LPPoNfr1We5aoHBYOBdk2A80G2MhTxa6huKmg+Ynp6OuLg4HDlyBL/++iuCgoIwZcoUTcZBeVtqiskglYrMzEwAeQ+r18IkYS208UFoLR7yK48dvzlpLRa00MY7KeoYJCUlwdHRUTNxUN6xh6ISZfxt4eTkBCcnJwDaumPw448/xvz585GSkgIgLxHQMq3Fg06nAwAcOHAAS5cuxa1bt5gI/j+txUJBWu4bivqcPT09NRkHM2fOxPr165GbmwvJewqcuasEgCODRPesuF+xFy9ehK+vL9zc3DBhwgSMHTvWDLUjczKOArZt2xZ79+5F27Zt8eWXX6J58+Yc/dAA9g1UFGNcREdHo02bNvD398dnn32Gxx9/3NxVU/EnK9E9Ku4LXa/XY+LEiWjcuDHeeecdvP3227h161YZ145KW1EjOgaDweRy8NNPP402bdpg9+7dGDt2LOLj45kIagD7BiqKMS6sra3x0ksvQUTwzDPPYN68eeVmhJgjg0T34MKFC8jMzISLiwusra3h5eVlsjxGdnY2/v33X3z77bdYsGAB1q5di169epmxxlQasrOzER8fj8TERNSrVw/u7u5Flvv1118xbtw4+Pv7Y/PmzWVcSypL7BsIABISEmBra6veKFSpUiWT/SkpKdi1axe++OILbN68GYcPH0ajRo3MVNt8hIiKZTAYRETk8uXL8vLLL4unp6coiiLVq1eXDh06yPr164t97cqVK+XmzZtlVVUqRcY4SE9Pl99++00aN24snp6e4urqKnXr1pUBAwZITk5Oka/dsGGDrF69uiyrS2WAfQPll5CQIK+++qrUrFlTbG1tpUmTJjJw4EA5ePBgkeUzMjJk+vTpahyZG0cGqURY4pIJ8v/zPBITE/H4449j165d6N+/PwICArBlyxbs3r0bmzdvRqdOnZCZmQkHBwdYWVlxbhgsLx6MS19MmzYN06dPR6VKldCvXz+cOHECa9euxSOPPIJt27ZBp9Ph0qVLcHFxgZeXl7mrXS5YWiwA7BvuhyXeVW9s09mzZ/Hss89iz5496NatG+rUqYNNmzbh7NmzOH78OAIDA5Gdna2uq1ku48CMiShVcOXlF01pyc3NFRGRKVOmiIuLi8ycOVNERG7evCn9+vUTb29vteyxY8fEy8tLNm3aZJa6lgeWHg+ZmZni7u4uHTt2lKtXr4qISFRUlCiKIkuWLFHLTZo0Sf73v/9Jbm6uGAwGiz8uRbH0NrNvIJHbcfD6669LpUqV5JtvvhERkQsXLkiHDh2kfv36atmtW7dK/fr15fjx42ap651YVppOZmGpSybY2NgAAJYuXYq2bduiX79+AIB///0XO3bsUP8N5C0pkp6ejnPnzpmlruWJpcWDXq8HkDf/79atWxg6dCi8vb2RkpKC3377Dba2thgwYIBaftOmTdixYwdSU1MtbkTsXllaLBixb7g35XU5lQdljINffvkF3bt3x1NPPQUAOHnyJPbv34/nnntOLZuZmYnY2FicOXPGLHW9ExtzV4AqBiliWFtRFFy8eBHvv/8+3NzckJKSgrFjx1rUpYBLly4hNTUVwcHB8PHxAQBER0cjISEBw4cPV8sdOXIErq6ucHBwAGCZl0Ty01I8GJ+MsH//fri6uiIwMBAAcP78eWzatAmPPvqo+qWQlJQEBwcHiAgqV65stjqXJS3FQn7sG/6b5FtOZezYseVyOZUHYWxfTEwMcnJy4OfnBy8vL+Tm5mLHjh3IyMjAkCFD1PInTpxA5cqVy+2lYsuPSCoRWl0ywcnJCc7Ozrh58yYA4OrVq9i4cSPq1q2Lxo0bA8jr3E+ePIn09HSEhYUBsPxFVLUYD76+vkhKSoKnpyeAvC/+2NhYvPrqq2qZU6dOITY2Fk2aNAFwe1TRkmkxFgD2DXdSEZZTeRDG9jk5OUFRFOTk5ADI+5G4YcMGtG3bFlWqVAEA3Lp1C2fOnIFer0e7du1MXl9umOv6NFUc58+fl2PHjklcXJxcvnxZsrOzTfbfunVLDhw4IEOHDhVFUeTPP/80U01LR9++fcXe3l42b94sGzZsEGdnZ5k2bZq6/99//5WmTZtKcHCwiFj+fCmtxYPx84yIiBBFUeTtt98WvV4vgwcPFk9PT5OyH374oSiKInv27BEREb1eX+b1LUtai4WC2DfkuXLliiQmJkpSUpIkJycX2n/z5k1Zt26dhIeHi5WVlfzzzz9mqGXp0Ov10qBBA3nooYfk5MmTsmrVKlEURX766Se1zJ49e+Shhx6SRx99VEREdDqduapbLCaDVAiXTDAVExMjDg4OUqdOHenatasoiqJ2ZikpKTJgwABxcXGRn3/+WURuTyq2FIyHPMbPWlEU6datm3h5ecnrr78uIiLZ2dmyYcMGqVSpkjzyyCNmrmnpYSyY0nrfUNGXUykpK1euFEVRpG3bttK9e3dxcHCQGzduiEjeclR9+vQRV1dXiYiIEBEmg1QBGE/S69evS0hIiCiKIgMGDJCJEydKu3btRFEU2bJli4jkndjGkQ9LO7lF8tpk7LxXrlwpDRo0EGtra1EURQYOHCi9e/eWevXqiaIoMnbs2EKjIpaA8WDqzJkzEh4eLoqiiKIoUqdOHXn99delU6dOoiiKtGzZUrZu3Soi5bPDfxCMBVPGdSW11jcYP9czZ85I27ZtRVEU6d69u7zyyivi7+8viqLIiRMnRCRvZNjIEuPAYDCITqcTvV4vU6ZMUX8cOTs7y9tvvy3PPfecPPzww6IoiowfP97c1f1PTAbJBJdMKF50dLS8//770qlTJ6lWrZpYWVlJq1at5OuvvzZ31UoN4+E245dZSkqKfP3119K0aVNRFEXs7OykevXq8sILL0hsbKyZa1l6GAvF279/v9o3VK1a1aL7BktaTqUkGQwG+euvv2T48OHSuHFjcXBwEEVRpGHDhvLll1+alCuPeDcxmdD6kgk6nQ42NjaIjo7GmTNn0KFDB1SvXh0AEBwcjEaNGiE+Ph7W1taws7NDpUqV4OjoCKD83R1WErQeDwAQGRmJNm3awMnJCQDg5uaG1157Da+99hrOnz+P+Ph4PPTQQ6hcuTJsbGwsMg4AxoLxLuC4uDisX78eHTp0UO8sb9Gihdo32NraAgAqV66sxowlxcSdllN577331LL5l1MJCgoyS31LmvE7Yvfu3cjJyUGrVq3g6OgIRVHQs2dPtGzZUo0DnU6HevXqqd8RQDm8ceT/MRmkQrS8ZIKxoxs5ciT279+PsLAwhIaGIjQ0FC1atICHhwf8/f3V8jqdTv3v8nqSPygtxoPxy3vTpk3o1q0bAgIC0KdPH/Tv3x9NmjRR46ROnTqoU6dOoddZKi3GQkEzZ87Et99+i9mzZyMwMFBtm729Pfz8/JCTkwM7OzuL7BvEwpZTuR/Gc3/AgAFISUlBjx49EBYWhpCQEDRq1Aje3t7w9vZWy+ePg/KMySAVwiUTgA8++AC//vor1qxZg23btqFy5cpo164dOnTogEceeQRNmjSBnZ2d2jFYMi3Gg7Hu7u7uGDx4MGJiYjBjxgzMmDEDLVq0wIABA9C3b1/UrVu3yNdZKi3GApCXxFhZWSE+Ph4//fQTnn76aQwbNgwAYGVlhX/++QczZ85ERkYGmjRpgtdee80i15m0uOVU7pNOp8Po0aOxevVqrFixAitWrEC9evXQoUMHhIWFoW3btuqPxArzHWG+K9RUnnHJhDzXr1+XJUuWSI8ePcTOzk4URZF69erJCy+8IN9//70m5sKIMB5OnTolCxculOeff17q1KkjiqKIvb29PPnkk7J8+XL18XRaoMVYMN4M9NFHH0mlSpVk7dq16r6TJ0+Kr6+vKIoiVapUESsrK+nfv79F3TRSkKUsp1ISjh49Kh988IE0aNBA7RfatWsnY8eOlb/++kuuX79u7ireFSaDVCStL5lQlBMnTsiECRPEw8NDTQy7detm7mqVCa3GQ8F1AnNycuTAgQPy0UcfSZUqVdS7ihVFkZiYGDPVsmxpNRZEREJDQ6VDhw4SHx8vIiJJSUny5JNPSqVKleSLL76Q6Oho6dixo1SqVMnifyBYwnIqJSknJ0c2b94sAwYMEBsbG3F1dRVbW1sZNWqUuat2V5gMkgkup5JHr9cXOaKRlpYmo0ePlsDAQOnfv7/MnTtXRCzrC68grS6hodPp1BgwGAyF4uHw4cPSvHlz6dGjh/To0cMcVSxzWo0FEZHk5GRp1aqVtG3bVo2Fzz//XBRFkTlz5qh9wEcffSTe3t4SFRVlxtqWHktaTuV+GQyGYheUv3LlivTq1UuCgoKkXbt28uOPP4pI+U+GmQzSf9LKcirGzj0jI6PQvoInfVZWlvj4+MiBAwfKpG7liZaW0DDS6/UmHbler1cTnf79+8vLL7+sJgKWcEn0bmkxFgYOHCiKosjSpUtlzpw54u7url4OF8n7wn/33XfFzc1NLl++LCKWHRMVfTmV+1Hwh39RPxRPnDghgYGBcuXKlbKs2gOpIDMbqTRxOZXbE5tHjx6N5s2bo02bNggICICTk5N6F6TxOJ09exbOzs7YtGkTmjdvbs5qlwotL6Fh/Iznz5+PhIQEvPbaa/Dy8lL3G581bGdnBwCoVq0adu3ahbS0NFSqVKlCt70oWo6F/IxtGTlyJA4ePIhBgwYBAFq1aoVPP/1ULXf69GlERUWhfv36qFGjhsUcA0tdTuVeZWdnY+LEiWjfvj2aNGkCX19fk7YZ7yS/du0aMjMzsXXrVgwYMMCMNb4HZk1FqVwJDg4WRVGkQ4cO8v7778vmzZvVOSD5Weol0f3796sTgBs2bCgjR46UFStWSGxsrEmblyxZIk5OTrJgwQIRsbznzxrbM2rUKLGzs1MXlS3YTuPomCXGg3FBaUVRpGPHjvLzzz8Xusxz/fp16datmzRo0MBMtSx9Wo2FkydPyvnz5wu1R6fTSUREhHz22WeycOFCuXjxosn+Dz74QNzd3WXhwoVqeUtSu3ZtcXd3lwEDBsg333wjR44cKXLUz1LioCDjjTKenp7SuXNnmTJlikRGRsq1a9dMyn377bdiZ2cnGzduFJGK8R2hiIiYOyGl8mHdunXqcio3btwodjkVSyT//wt+//792LJlC1avXo39+/fD1tYWzZo1wyOPPII6derA1tYWEydORHp6OuLj4+Hi4mLuqpco43GIj49H48aN0bNnTyxevFgdHdXKEhonTpzA+vXr8ccff2DXrl3Q6XSws7ND37590b9/f9jZ2eGnn37C8uXL8eGHH2LixInq6Iml0HIs+Pn5oU6dOujTpw/atGmDhx56CJ6env85whUTE4OQkBC0b98ef/zxh7rGoqXQ6XT46quvsHr1amzfvh0Ail1OxVJlZ2dj3bp12LRpE/766y9cvHgRVatWRfv27dGuXTt1ncmRI0fC2toaV65cMXeV755ZU1Eql7S0nIrxV212drasWrVK3Xbt2jWJjIyUMWPGSFBQkMldo76+vjJ79mwRsbxf/lpeQsPY9o0bN8quXbtEJC8uoqKiZOzYseqkeEVRxMrKShRFkd69e6ujApY0L0pEu7Fw7do1GThwoAQFBYmVlZVUq1ZN+vfvLz/88IMcOnRIkpOTC70mMzNTfvzxR3n22Wdlx44dImJ58ZCfpSyncjeMo3o3btyQI0eOiEjeM5fPnDkjS5YskSeffFIqV65s8h1Rq1YtmT9/vohUnO8IJoP0nyx9ORXjifrVV1+Joigmk55F8u6evHTpkkRGRsoXX3whU6dOlZMnT1r8DQNaXkKjatWqMmTIEElKSjLZnpSUJH/88Yd8+OGH8tlnn8mSJUskKyvLTLUsO1qMhRs3bsjhw4dlwYIF0q9fP/UGmXr16smrr74qK1eulNjYWMnMzDR5XVZWVoX58i8JFX05lbth/DzHjBkjiqLI77//brI/LS1Njh49Kj/++KO88cYb8u6778rRo0fVH0YV5TvCcq5p0AMzGAxQFMXkUkhgYCDGjx+PzMxMrFu3Dk2bNlWfKlDRL4vp9Xq1rdu2bcMjjzyC8PBwdZ+1tTVsbW1Rs2ZN1KxZEx07diz0HpYyMTq/Gzdu4NatW7C2tka1atUAAIsXL8aqVaswe/ZsvPrqq7CxsUHHjh3x77//4tixYyaPX6qIjDdK7Ny5ExkZGWjRogUqV64MyfvBDEVRULlyZfTu3Ru9e/c2d3XLjBZjAQA8PDzg4eGBxo0bo3fv3oiNjcXu3buxYcMG/PTTT/j+++/RpEkTdOvWDWFhYQgMDIS3t7fFXRrOz3gu5H+soK2tLTp37oyGDRsiLS0NZ86cQeXKldGyZUsAt/vRiip//ffu3YtHH30ULVq0AHC7z3BxcUHDhg3RsGFDPPfcc4Xeo6J8R1Tcb3J6YMYvuczMTJO7ZgHTZ4m6uLjgk08+wW+//YZx48apd9BW5EQQgEkn9fDDD2PDhg2oV69eoX1GFb1ju1uVKlWCv78/li9fjuXLlyMxMREffvghWrZsiddffx1A3rHIysrCrVu31GMmFfTOyfw/aqysrODk5ISaNWsCyDsPjJ95UV+Glk5rsVCQoiioUqUKqlSpguDgYDz99NM4fvw4tm7dioiICEyfPh1z5sxB+/bt0bZtWwwaNAh+fn7mrnaJM54jxs9U/v9WA+O/q1WrhpkzZ6JPnz5YuXKl+sOhoveXxvrn5ubioYceQmZmJnx8fIrsByp6/1Axa00lIv9yKvPmzcPhw4eRmZkJACbLqQAwWU6lIjMYDACAcePGYdmyZQCAU6dOISsrC3Fxcbhx44Za1nhyG1X0ju1uGNs7cuRI1KtXD4MGDcIbb7yBoKAgzJgxQy1X0ZfQMLbz1KlTmDNnDpKTkyEiaNSoEYKDg3H16lUAeeeBMWYURamwHf390Eos3Inx87e1tYWPjw/Cw8MxceJELFu2DEuXLsXAgQNx5swZvP/++0hLSzNzbUtednY23nvvPaxZswYXLlwAAJMrSMbnE+dfTqUiM37ekyZNwt69ewEAcXFxsLGxQWxsLAAUSoqN2yp0/1CW16Sp/NHiciqpqamiKIq89dZbIiLSqFEjqVevnjg5OUm/fv3kn3/+KdS+ijLv415pdQkNY32ffPJJqV69uiQlJcl3330niqKIu7u7+Pr6yu7du01ek5uba7FxIKLdWLgb//W537x5Uw4ePCgrVqwowxqVHUteTqUg4+d85swZURRFPv30UxERqVevnrRp00bc3d3lf//7X6G2539tRcWlZTRMNLacivHS95dffomxY8fi999/R/fu3fHGG29g586dOHToEACgcePG6N+/P9q1a4eGDRuiSpUqZq556dH6Ehpubm7o378/vvrqKyxbtgxTp05Famoqrl69ChcXF/Tv3x8jRoxA06ZN1dcYDAaIiMWNFGs9Fopy/vx5/PXXXzhw4ABcXV3Ru3dvdO7c2dzVKlMWvZxKAcapQO+88w6+//57rFmzBo0bN0a/fv1w7NgxXLp0CQDQrVs39OvXD8HBwQgICLCMuDdvLkrmoNXlVIy/VB9++GEJDQ2V8+fPi0jeHYCXLl2SdevWyciRI9UlM6pXry79+vWTuXPnyv79+yU1NdWc1S9xWl1Cw1jfX3/9VX20mFFKSor8/vvvMnz4cAkICFDj39/fXyZPniyXLl0yV7VLlVZjoSjG/m3t2rXq0imVKlVSY6Fy5coyatQo+eeff8xc09KjleVUilOjRg3p27evOgKYkpIi//77ryxYsEAee+wxcXZ2FhsbG3n44YfljTfekJUrV8rp06cr5GioEZNBDdLicirGOp89e7ZQm/O3JysrS06fPi0//vijPPHEE+Lh4SG2trZSrVo1mTp1apnXu7RpcQkNY4fdtWtXady4sZw5c8Zku9GlS5dk8eLF0r9/f/H29la/9Bo0aFBo2RlLoMVY+C+NGjWS6tWry+rVq0VEpHnz5lK9enXx9PRUY6F+/foyYcIEi1pXT0Q7y6nkZ6zzrl27RFEUWbJkicl2kbw+4saNGxIdHS2TJ0+W4OBgsba2Fnd3d2ncuLEsX77cLHUvCUwGNUan06lfev369ZPQ0FA5efKkus9SGdv24YcfiqIoMnr0aElMTDQpU7ADS0tLk8OHD8vs2bOlQYMGFj8n6tq1a7Jz506ZMWOGdOnSRVxdXcXOzk6Cg4Plf//7n2zatEni4uLk1q1b5q7uA0tLSxNFUSQsLEwiIyPl+vXr//m5/vvvvzJr1iwJCQmx6MfPiWgvFvLLPyqoKIp8/vnnIpKX8CqKIhMnTpSTJ0/Ku+++K7a2tlK1alVRFEXmzZsnIhUzCSoo/3nQvn17eeyxxyQuLk5EKuY8wLtlbPfQoUOLHCQRMf18dTqdXL16VSIiImT06NHi5uYm69evF5GKeZw4Z1DDPv74Y2zYsAE7duwotoylLadSt25dnD9/HgDg6OiIbt26YcCAAejZs6fJXEjJd0ekwWBQH89nSXdJFic3NxcJCQkmS2gcOXIEjo6OFX4JDeO80W+//RavvfYabG1t4eXlhZCQEHTp0gXBwcHw8/ODh4dHka/X6/W4cuUKatWqZXHnRlEsORaKYoyPl156CXv37sWiRYsQHByMWbNmYfz48fjtt9/w2GOPITc3F7169UJKSgoGDBiA1157Dfb29hZ1J3Vubi6GDRuGzMxMrFixosi2SQVfTqUo7u7u6l3h/v7+6NOnD55++mm0atXKpFz+45GdnY1r167Bx8enzOtbUpgMaoCxgxs3bhyaNWuGgQMH4tSpU1i8eDGWLFmCw4cPo1KlSgAKrx9lCYwn7e7duxESEoJx48bhxo0bWLp0KTIyMgAA1atXx2OPPYb+/fsXWlzakjr4/5J/bUmjrKwsXLp0CYcPH8bmzZuxdetWnDp1CjExMXj44YfNVNP7Z2xjkyZNoNPp0LNnT8TExGDfvn1IS0uDv78/OnXqhE6dOqFJkyaoVasWnJ2dzV3tMqeFWCiOTqdD9+7d4ebmhiVLlsDZ2RmPPPIIsrOzsWLFCjXx/frrr/Hzzz9jx44dFT4ZMn7ekyZNQs+ePdG6dWucOXMG06ZNw4EDB3Dw4EG1rCX2h8Y2/fbbb3j66acxYsQI/PvvvybL5AQHB+Opp57CE088AX9/f5PXAhbwnVn2g5FkDlpeTsU4/P/cc8+Jr6+vxMbGikhe+1avXi2PPvqoyUTohg0bysSJE9WJ01piyUtoFFw2YubMmaLT6eTs2bOycuVKGT16tLRo0UIcHBzE3t5eWrZsKePHj5d169bJhQsXLOK5u/fCkmPByNjGGzduqNuSk5Olc+fO0q5dOxHJu7kmICBAevbsKSK3LwF++umn4uXlJQcPHizbSpcwLS+nYmT8TDt37izNmjVT5wRfunRJpk+fbnJDpY2NjfTo0UMWLVpkUXOHmQxaOGOQz5kzR+zt7WXdunViMBjk9ddfl+bNm6sB/vDDD8uUKVMkKiqqyJPeEri6usqQIUPk5s2bhfalpKTIN998Iy1btjRJDNu2baveIWfJzp07J1999ZUMHjxYRo0aJZs3bzZ3lUqc8UfBuHHjxMvLS7Zu3WqyPysrS44cOSILFy6UwYMHS0BAgDo5vHv37jJx4kRJSEgwR9XLlBZioaCXX35Ztm7dqvaXO3fulA0bNoiISGJiorRq1Upatmyplr9586YMHDhQvL29zVLfkpT/vPD09JSdO3dKamqqdOvWTXx8fNS+sHv37vL999/LkSNHLPKZ3CkpKaIoirzzzjuSkZFRaP+RI0fkzTffFC8vL/WYeHt7S//+/SUqKqrsK1zCmAxaOK0vp2L85bpkyRJRFEWWLVtmsl+n0xW6ceDs2bPy/vvvy0MPPSSKosiAAQNEpGJOCv4vWl1Cw9vbW3r37q3eAVrUjSM3btyQ3bt3yxdffCFPPPGEeqNAwTtpLYUWY8HYNyxfvlwURZFffvml2LJvv/22KIoiffv2lcWLF8tLL70kiqLIm2++KSJSaKHuikiLy6mI3O7XP/nkE7G2tpZ169aJSF58GAyGIj/biIgI6devnzg4OIiiKDJhwgT1NRUVk0ELxuVUbps7d6706NFDjh07JiKFT1rjSV9w+99//y0XLlwQEcu8i1hEW0toXLx4UR555BF12YiCiurMr1y5In/++ad6SdRS40BEW7FgTALCw8OlWbNmcuLECXVfUlKSbNq0Sb2KcPLkSQkJCTG5avDMM8+oT2OpqAmR1pdTyW/kyJESHh6u9vcF+wK9Xl8oMbx165b88MMP6rlQUeNAhMmgReNyKnkLaxtP4LtdBqOok97SaHEJDeMPgfPnz6tzff6rHRWxjfdDi7FgZJxL/c4770hOTo66fe3ateLq6lroR8PWrVtl5syZsm7duiIvJVY0Wl9ORcT0eyElJeWuXlPUFaWKjsmgBvj5+am/Zp2cnKRv376yYsUKSUtLMylX8NdgYmJihe7oRUQmT54srVq1UpPgitphlTTjcRg8eLA0aNBAoqOjRUTk888/Fzs7O1mzZo2I5C1A3rVrV2nVqpV8/vnnasdZ0eIiOztbHn74YTl+/Pg9v9Z4uchSaS0WRG63efbs2WJvby9//vmnui87O1vGjh0riqKofWRxPw4rYtuL4ubmpn5HPPTQQzJmzBjZu3dvoXL523vr1i11/cGK7LXXXpPBgwerPwa0+h1Rse+Hp2LJ/9/uvnv3bpw/fx7jxo3D0KFDYWVlhdWrV2PAgAEIDAzEK6+8gqioKACmt8YrinLH55JWBI0bN8aJEyfw8ccfQ6/XV/glIEqKlZUVdDod4uLiEBgYiAYNGgAAVq1ahSZNmqBRo0YAAFtbW/Tp0wfW1tZ44403YG9vD6DiLaNw48YNZGdno0ePHti4caO63WAw3PG1iqJUuPbeC63FQn7ff/89HnnkETRp0kTddu7cOURERKBr165wcXGBXq+HjY0NgNvPpTaqyG03tuO3335DWloaRowYgQ4dOuDMmTP4/PPP0aZNG7Ru3RqfffYZzpw5A+B2e0UEdnZ2FXpdPSM/Pz+sXLkSixcvBgDtfkeYNxel0sLlVG778ssvxdraWrp06SL79u1Tf90WNUfQUnEJDZF//vlH/Pz8xN/fXzZu3Gju6pgNYyHP+fPn1bl/+VcY+Pnnn0VRFFm5cqWIWMbNIUXhcip50tPTZdiwYaIoigwfPlzOnj0rInnHx9IuBf8XJoMWjsup5CXGEydOFEVRpEWLFvLrr7+a7C940he8XG5JtLqEhvEzPXr0qAQHB4uiKDJkyBDZv3+/yVwxY9n8n7ul/mDQaiwYzZs3T+3zvLy8ZNiwYfLXX3/J4MGDxdXVVS1naX1AflpfTsXoxo0bMmDAAFEURZ544gk5cOCAyf78j3EtyFL6ByaDFojLqRRt5cqVEhgYKIqiSMuWLWXhwoUmoyOWikto5DEehx07dkjr1q3VHwfTpk2TAwcOFLq5yhIxFm5LTk6WpUuXyssvvyx16tQxGQVr3LixXL9+3eSL3lK+9EW4nEpxPvnkE3VJpYEDB8q2bdvMXaUyw8fRWbBvvvkGa9euxcyZM1G/fv1CjxESEfX5qvm379ixA7Vr10bt2rUt4vmrBoMBiqJAr9fj77//xsyZM7Fu3ToAQJUqVdC+fXv07NkTgYGBMBgMcHZ2Rq1atXDgwAHY2NigWbNmqFKliplbcf+Mj5rq1q0brl+/jmXLliEwMBAAkJycjIMHDyI4OBju7u44deoUXnrpJezatUt9/cCBAzF9+nTUqlWryMeUVVRffPEFvv76a5w9exZ+fn5o3bo1mjZtiho1aqB+/frw8/NDXFwcHBwckJSUBBsbGwQHB1foeWKMhaKdP38emzZtwl9//YXDhw/jwoULAIDWrVtj0KBB6Nu3L2rWrGnmWpa8119/HadOncJ3332H2rVrF/qOMBgMMBgM6pxJIO85vEuXLsVjjz0GLy8vi4gDYxvS09OxevVqfPrppzh69CgA4OGHH0Z4eDh69OgBb29v5ObmokqVKqhcuTL27dsHLy8v1K5d2+TZ9hWSWVNRKhVcTuXOIiMj5emnnxYPDw+TEQFHR0exs7MTRVHE2dlZunTpIpcvXzZ3dR+Y1pfQyM84Kp6bmyv79u2TDz74QEJDQ6Vy5com0yXs7e3F09NT7O3txdXVVX744Qcz17xkaD0WjOsJ5uTkFNnn7d+/X6ZNmyZhYWFib28viqKInZ2dPPHEE7JkyRKLmEfG5VT+282bN2X+/PnSokULkz7B1dVVvL29xcXFRdzc3MTV1VUee+yxIqdhVTQcGbRAH3/8MdauXYt169bB09PTIn65lZSCxyIrKwvbtm3DqVOnICJIS0uDTqdD/fr14ejoiGbNmlXoO+aM7Z0zZw7GjRuHlStXolevXgCAnJwc/O9//8OMGTOQmpoKFxcX6HQ6k1EAI7HAh9Mb5eTk4PLly7h48SKSkpJw7NgxXL58GbVq1UJubi4eeughNGzYEAEBAXB2djZ3de8bYyGvncHBwVixYgWCgoLU7ZI3Zcqkb8jJycHOnTuxbt06bN68GYcPHwZwd3egl3cjRoxAVlYW5s2bB1tbW35H/D9jOpQ/vs+cOYOoqCicP38eAHDt2jU4OTnB398frq6u6NSpE2rXrm2O6pYoJoMW6I8//sDzzz+Pl156CTNmzKjwl3lLg16vBwCLPzbGTr5Jkybw9vbGwoULUatWLQDAyZMn0b9/f1StWhUbN240mRJgvLReUb/0qTDGAnD16lWEhYUhOzsb8+bNQ3h4OADTH4nGZC9/cpScnIz169dDRPDss88WmyhXFDNmzMDkyZMxc+ZMDBkyxNzVKXekmClUlow/BSxQnz59MGXKFHz55Zfo3r079u/fr/7i0el0YP6flwTm/7Izyv/flnCcrKyscOHCBfzzzz/w9vaGq6uruu/AgQM4cuQIhg8fDsC0vVZWVprpBAHTtht/KACWMQpkxFgAqlatit9++w2KouC1115DREQEANPEz8rKyiQxFBFUrlwZgwYNwrPPPgsAFToRBIBXX30VAwYMwLBhw/DKK6/g3LlzAPLamz/+tUpRFNjY2EBRFIhIkd8RlvD9YKJML0pTmeFyKmTEJTTISOuxcL9LDFninGoup0L58TKxhVu1ahXee+89nDp1Ci1atMCIESPw+OOPw8PDw9xVozJy48YNbNiwAVu2bMGWLVvUOyWtra1Rv359REZGmjxtRirwnDD6b4yF223auXMnxowZg+joaDRv3hz9+vVD165d4evrC09PT3NXs8xMnToVn332GW7evIkBAwbglVdeQWhoqLmrRWWMyaCF0vpyKlQ0rS6hQYUxFvJocYkhgMupkCkmgxoSFRWFb7/9FhEREUhJSQGQNyJga2sLvV6P3NxcODk5oW3btli8eDFq1Khh5hrTgzh58iQCAwORm5urzoHJ78CBA9i8eTPWr1+PPXv2ICcnB7a2tnj00UfRt29fDBw40OJvsNEKxkJhxhsEdDodYmJi8NdffyEyMhJHjx7FjRs31HJ2dnZwcXFBeno67OzsMHv2bAwePNiMNS8dKSkp+OWXXzBv3jwcPHhQ3e7i4gJHR0dkZmbCysoKIoIOHTpgyZIlcHd3N2ONqSQxGdQArS2nQlxCg25jLNwdrSwxVJBoeDkVuo3JoIZoZTkV4hIa90Ov11vUnbNGjAW6G6LB5VToNiaDGlXwi8D435Y4YbwgY3vT0tJga2sLBwcHi3jsXkFHjx5F7969YWVlhblz56pJQFEsaS25e6WFBXcZC3cnf/9XcK1FS4+R/AqOGhvbr4XvB+B2HGRlZcHOzg7W1tYW+R2Rn3aim0wUXFfLSAsnurG9/fv3xwcffIC0tDSLO8lFBI0aNcLatWtRuXJldO/eHUOHDsWBAweQm5tbqCyQ99kbDAbodDpzVLnMGdv5ww8/oHXr1vj111+h1+stbv0wxsLdy9//5e8TtJQIAnnHoajvCC18PwBQ1xd88cUX8cMPPwCw/CtqHBkki5L/F2zB+VD5HTlyBE2bNgUABAcHY/HixSbzqSyBVpfQMLY7/wjXf41odO/eHREREfD19cXcuXPRo0ePMq5x6dNqLBAVVFT/UJR169bh0UcfBQA888wz+OKLL+Dl5VWWVS1TTAapQrvfyxbZ2dlYv349fv31VyxbtgxhYWFYtmwZqlatarG/frW6hEZ+8v9PE8j/K//YsWPYtWsX5syZg/Pnz2PevHkYMGCARbW7IMYCaYXxO+JevysSEhLU74c9e/bg1VdfxVdffQXAMkdImQxShXfp0iVkZmYiOjoajo6OSElJQW5urnpXtLOzM5ycnIqd/L5582a88sormDNnDnr27FnGtS99WllCIycnBxcvXkRqairi4uJw48YNVK9eHYqiwNHREY0aNUKlSpXU8vm/HHJzc7F//3688847sLe3x6ZNm8zVjFKllVggyi89PR03btzAv//+Czc3N8THx8PR0RFNmjSBh4cHrK2t4ejoWOzrv/rqK/zvf/9DVFQUmjVrVoY1LztMBqlCu3LlCho3boyUlBR16D//MhhVqlRB27Zt0b17d3Tr1g1+fn4Abs8XM945d/ToUTRq1MgsbShrlrqExjPPPIP169fj/9o77/AqiraN33OSQxJCSCWEHqq0UAy9G1G68AnSmyAiYAMEkaKEagHEAiJdxBBRaYpIgAQIRaSXAAlC6JCQBEgCaeec+/sj7y45JCAiyeHszu+63uuVs7O5ntl9ZubZmWfuuXPnjlWum5OTE5ycnODv74+GDRuiR48eaN68OYxGY55/59y5c6hQoUJBmW1TtOoLEonCsWPH0Lp1a6Snp+Pu3bu5ZJICAgLQvHlztGnTBk2aNFHTJXJqclosFuzbtw+NGze2RRUKBBkMSuyaQ4cOITQ0FB06dEBSUhLc3d1hNBrx119/4ezZs4iKikJ0dDTi4+NRuXJlDB8+HG+88QacnJxsbbrkCUISn376KYQQqFGjBpydnXH58mWkp6cjMTERkZGRCA8PR1ZWFpycnNC1a1e88cYbaNasGYDsGbP7k+Yl+kSrEkN6Zd26ddiyZQuaN2+O5ORkFC9eHCkpKdi/fz8uX76MU6dO4fz58zCZTGjevDnGjh2LNm3a2NrsAkcGgzpBL3Iq93PlyhVERUUhLCwMa9euRWxsLFq0aIEpU6ao52/qRS4hJ3qU0Lhz5w5+/PFHfPvtt9i/fz+qVq2K4OBgvPLKK7Y2zabo0RfyQm/1vR89yqlkZGTgzJkzOHz4MDZt2oTffvsNqampGDBgAD744ANUqVIlT1FuTUKJrmjXrh3ff/99Jicn29qUJ4LJZCJJWiwWWiwWkqTZbKbZbLYqZzab+ddff7Ffv34UQjAgIIB79uxR75VoA+W9m81mq/ea878zMzP53XffMSAggEIIjh8/XvUjif7IysoiSS5atIgNGjTg6tWraTKZdNkvWCwWdu/enQsXLrS1KU+MnH2CQl7v99atW1y7di0bN25MIQS7dOnCa9eukdTHGCGDQQ2gOLnFYskVBOXk6NGjFEJQCMEGDRrw1KlTBWVigaM0XpPJlOuZbNmyhVWqVGGJEiX4119/2cI8SQGS8/0rfpGZmcldu3axTZs2FEJw0qRJTE9Pt5WJknwg58eh8t8PG9QVX/D39+fvv/9eIDYWFHk9i7zYuHGjOkb06dOHN27cKCgTC5Sc/pDXh+C8efPo5ubGwMBAXrlypaDNswkyGLRDHvcrJT09nWvXrmXv3r0phGCrVq147do1XXz1kPe+Bi0WCzdv3swqVaqwTJkyPH78uK1NkxQAD5r9++CDD1ikSBEuX768gC2S2Iq8goCoqCguWrSIAQEBdHNzY0hIiN32jY8S/ObFtWvX+OWXX6qzY8OHD7daddE6ik+kpaVx4cKFLFKkCIOCgnj9+nUbW5b/yJxBO0XKqeSGJK5evYo///wT3t7e8PLygqenJ8qUKZNn+bNnz2L48OF49913NSk0rEf4v7ynxMREXLt2DefOnUPRokXRsGFDK+kI/u8cVkdHRyQmJmL48OEAgJUrVz5wl7HEPpASQ9lIOZXckER8fDxiYmLg4+MDJycneHp6WvlDTjZv3ozg4GDMmzdPM8/ggdgwEJU8JleuXKGXlxcdHR1pNBrp4OCgTu0LIejr68vOnTvzm2++4blz59T7srKymJWVpX7laWFGTFkCjIuL40cffURXV1f1Ofj5+XHgwIG57jGZTOoXYHR0NBMTEwvUZkn+sm3bNjZo0IBGo5FCCBYuXJiurq7cvn37Q+87dOhQAVkoyU969epFDw8P9f0r/3N2dqa7uztr167N119/ndu2bWNmZuYD/87Zs2cL0Oony9GjR1msWDG6ubnlGh+EEKxVqxZHjBjBDRs2MCEhQb0vMzNTzaE0m81qXrU9o4wRN27c4IcffshixYpRCMFChQqxRo0anDJlilV5ZdbYbDbTZDJx165dvH37ti1ML1DkzKAdIuVU7sH/fdUPGjQIy5cvR/fu3dGmTRucOXMGH3/8Mbp164bVq1cjMzMTly9f1o1+3KOgJQkNZdfjrl270K9fP9y9exfDhw9H6dKlMWvWLERHRyMxMRGenp64du0aLl++jNq1a6NQoUJWRxhq4Vk8DlrxBUqJIQBSTiUvevbsidWrV6Nz585o0qQJTp48ie+++w6jR4/GZ599hoyMDKSkpGj6yLmHYtNQVJIvXL58mZs3b+bo0aNZoUIFCiHYsmVL7tixQy2jhRwQpQ6xsbF0dHTkkCFD1GsLFy6kEII7d+5Uf2vWrBm7dOnCtLS0Arf1aeJhm4zsFWWmt2PHjixTpgzDw8NJkomJiWzUqBFbtWqllt23bx+fffZZTW+gelS06Av/RGpqKpcsWcIGDRpQCMFq1apx9erVtjarwEhPT+fx48e5YsUK9urVi25ubhRCcODAgYyOjiZJzeQJKv79559/0sHBgSNGjFCvzZw5k0IIxsTEkMx+LlWrVtWtuoAMBu0QKaeSjfIcZsyYQXd3d3UH4PXr19mjRw/6+vpalW/WrBnbtm2riyn/vNC6hEZqaird3Nz41ltvMTU1lSS5cuVKCiG4atUqtdyyZctYuHBhbtq0yVam2hyt+4LeJYaknEo2yvscNmwYS5UqxV27dpEkz58/z9atW7NatWpW5StVqsRBgwY9NH1Aq9j3XLhOUURAhRDqsk7OJR6z2awufdWvXx8rVqxAWFgYMjIy0LVrV+zfv9/ul4OAe8/h3LlzKFKkCCpXrgwAiI6ORnh4OPr06aOWvXDhArKysmA0GlG0aFGb2Jtf8H+ZHhaLRf1v5pH9oWwm+vnnn7F//36MHTsWYWFhmvAFADhy5AgsFgu8vb3h6uqKlJQU7Nq1C05OTujZs6da7uLFiyhSpIh67FRez8pekb6QjbLMm7NftFgs6n+ThNFoRK9evfDNN9/gxRdfxMyZMxEcHIyMjAyb2f2kyFn/nL8JIdTNUwDg7u6OLl26YM+ePfj666+xbds2dOzYEVevXtWELyhjRGxsLLy9vVG1alUAwIkTJ7B792689tpratljx47BwcEBjo6OMBqNmuoXHgUZDGoIpfE6ODionYDZbAZJPP/88/jqq6/g5uaGrl274sSJE7Y09YlSrVo1XL16VR3g9u/fj4SEBAwZMkQtExUVhZiYGKvcIK2Q1wdBzkHv/rrOmTMHCxcuhJubG3r06IFVq1ZpouMrUaIEXFxcEBcXBwA4deoUwsLC0KVLF7XMrVu3cPLkSbi4uKB+/foAtHWygPSFB5OzT1SeidFoRNOmTfHHH39g3Lhx+PzzzxEaGmpLM/ONnP6Q81QRxScGDRqE2bNnIzo6Gv369VPbkRYoV64crl27Bnd3dwDAnj17kJ6ejoEDB6ploqKicOnSJfVkqvvPMNY6cgOJnUMpp4Lt27cjKCgIvXv3xogRIzBx4kRcv34dUVFRaplBgwbh+++/x/nz51GqVClNbBaQEhrWZGVloV27djh48CAOHDiAQ4cOoUePHoiIiEDLli0BZCfWDx06FF27dsX8+fNhMpkeKL9kT0hfsIZSYkiFUk4Fixcvxuuvv44pU6agXbt2GDJkCDw8PBAeHg4ASE9PR//+/fH7778jMTFRk5st/5GCW5GWPCmknEpu+vfvTyEE69SpQycnJ7777rsks5/RzJkz6erqygEDBpDUTtK8lNC4h/JON2/eTHd3dxYtWpQ1atSgj4+PWubYsWOsWrUq/fz8ePLkSav77B3pC7nRs8SQlFOxJiMjg40aNaKjoyOfe+45Ojg4cO7cuSTJlJQUdRx9++23ST5YoF7LyJlBO4RSTkVFkRTJzMzERx99hO+//x5Xr16Fv78/SpYsidjYWFy7dg3du3fH5MmTUbVqVU0cSE8pofFAli5dinHjxiEhIQEAEBAQAGdnZxw4cABeXl6YO3euVT6pvSN94R5SYsgaKacCdfb//PnzeO+99xAWFobU1FQ0atQInp6eOHv2LGJiYtCrVy9MmzYN5cuX18QY8a+xZSQq+fdIOZUHk5KSwrVr13L06NFs1aoVK1SowMDAQH7xxRfq7kk9oWcJjYsXLzI4OJgBAQH09fVlrVq12K9fP0ZGRqpltLBb8lHRiy9IiSEpp/IwLl++zG+//ZZ9+/ZljRo16O7uzho1anDatGmaWSV4XGQwaGdIOZVssrKy+NVXX3Hq1Km5lr1SU1N569YtktR8EKxnCQ0lwA8JCWFERMQDA/4LFy7wxo0bBWmaTdCzL+RE7xJDepdTyZlGNWvWLB4+fDhX33Dt2jVevHiRKSkpVmOjnj4Q78f+M6d1xj/JqfTt21ctq0U5FWUZaP369Zg6dSoaNGigJnrzf8ngLi4uSEhIgMlkgrOzs6aWfe4nLwmJnEsczCGhUbFiRUydOhUzZ86Eg4MDJkyYYNeJ0srGj2HDhiE5ORkBAQHo3r07Xn75ZVStWlV952XLllXvkb6gTV/IyX+RGNKCb/yTnMq0adPUsnnJqdj7M1Ds/+abbxAcHIwqVaqgSZMmaNWqFRo3bozKlSvDz89PLU9SbSf2Xvf/gs4WxbWDXuVUlIHtq6++QsmSJa06trNnz2LUqFGoWrUqBg8ejA0bNgDQlnTIo6AnCY20tDTMnj0br7/+OtLS0jBp0iTUrFkTQUFBWLJkCa5evWpVXvqCdn1BQUoMZaNXORXlPQ4YMABTpkxBkSJFsHz5crz66qvo0aMHRo4cifXr1+P69etqed3lB+aF7SYlJf+FiIgICiHYp08f7tmzh0FBQaxevbpVmVdffZWOjo68fPkySfufAs+ZLymEYHBwsFWeR6tWrSiEYOXKlenj40Oj0ciIiAgbWVswKM8kISGBx48f5/r16xkREcG7d+/mKqcslSQkJLB79+7s3r27ppaGjh07xnnz5rFbt24sXrw4hRD09PTkwIEDuXbtWiYnJ9vazHxF+kI2mZmZfP755+nh4cG///6bq1evphDCahfx2rVr6evry2HDhpGkJnOKFy1aRCEEp06dygMHDrBu3bp87rnn1OtpaWl85ZVX6OrqyvT0dBtamr+YTCbu27ePI0eOZLly5SiEoIeHB9u0acPg4GBu3rxZM77/X5DBoB2jNzkVpQ7z5s2jl5cX169fT5K8c+cO58+fr+ZAxcbGcsmSJRRC8KuvvrKlyQWCniU0LBZLLt9OTU1lREQEX331VSuZlaFDh9rIyoJDz75ASomhnEg5ldwkJydz5cqVrFu3LoUQdHR0ZJEiRZiUlGRr02yODAbtEKXRZmRkcNy4cSxVqhSFECxfvjybNm3KkiVLUgjBHj16qDvltNTZzZkzh0ajkX/88QdJcv369SxZsiS7du2qbhT4+++/Wbp0ab755pu2NDXfUHwgMjKS/v7+9PX15eTJk7l48WJWrVqVQgi1g7t69Sr/+usvZmRkkLznC/Y+U0xaz+jcv3GCJCdOnMjq1atzwIAB/PPPP0lqb9CTvpA3S5YsUfX1hBCsVasWGzRoQIPBQB8fH65cudLWJuYbSruIjY1l165d6ebmRiEEGzduzPbt2/OZZ56hEIK9e/fmuXPnSGprjCCzfTovvzabzVyzZg0rVarE1157jePHj1d/1zMyGLRz9CCncn+DjoyMpBCCHTt25DfffEN/f3+6u7vz9OnTapmNGzfS09OTn3/+OUntBgB6ltDISU5RdZJqsLNr1y76+/szPj7eVqblO9IX7nF/O7906RKDg4NZs2ZN3UoM6UVORXmPd+7cyeUHeX0oNm3alLNmzcp1v16RwaAdIeVUssnMzOQHH3xAd3d3CiFYvHhxhoSEqNdNJhPfffddFipUSDP5knmhRwkN5T2eO3eOAQEBXLJkSa6cOJPJpH4IhYWFsVSpUpqeBSL16QsKSkCzf/9+fvHFFzx8+DBNJlOuNn/27Flev37dFibmO1JO5d6HwNixYzlmzBhu2bKFV69etSqj1DUlJYVdunThSy+9pKmA+L8gpWXsAL3KqcTFxSEqKgo1atRAsWLF1B1fRqMRo0aNQv369eHs7IxKlSqpEjsAEB4ejvXr16Ndu3YoVaqUZtXk9Sihodi9a9cunDhxAq+99hqGDBmCl156CUOGDEH79u1VaQ2l3NWrVxEQEADAvuv+MPToCwpK237//ffx559/4tChQ1Y+cP36dRQrVkzTJzFJOZVsSZ2MjAyEhobi0qVLWL58ORo1aoSgoCA0bNgQVatWVc9jPnHiBKKiolCnTh0YDAbNjhH/CltGopJHQ/maadmyJevUqcMjR46o186cOcO33nqLlStXZseOHfnLL7/YyswnzogRIyiEYLdu3bhgwQIePHiQN2/efOg9N27cYJMmTVixYkXu2LGDpPaWiBXOnj1LHx8fdUfkvn37WKFCBfbs2VMtc/PmTfbo0YPlypWzkZX5x8GDB/nhhx+yXr16al6Yh4cHX3vtNS5cuJBDhgyhs7MzAwMDbW1qvqNXX1Da9oYNG1ikSBFOnTpVvWaxWPjjjz/yxRdfZOXKlfn222/zypUrtjK1QIiNjeXUqVMZGBhIIQQNBgPr1q3Ld999l+vWreO1a9dsbWK+Ex8fz9WrV7NPnz709fWlEIL+/v7s3bs3p0+fznnz5qkbSLZu3UpSu2PEv0EGg085epZTCQ0NZc+ePVm2bFkaDAb6+/tz8ODBDA0NZVRUVJ5SIWfOnOG4ceO4bt06zSx/PAi9SWgofh8TE8PPPvtMHdiTk5P566+/ctiwYaxcuTKFEHRwcKAQgs2aNdNFh683X1DImS9Zp04dHjt2TL32008/0Wg0skiRIurHwoQJE2xlaoGiNzkVpW/45ptveOnSJZLZqROnTp3iggUL2KZNG3UTjRCCvr6+fO+992xp8lOHDAafcvQup5KYmMh9+/bxyy+/ZPv27enh4UFHR0fWrl2bY8aM4e+//87z58+rGwYUtDzwk/qU0FDeaZ8+fVihQgXu3r07V5krV65w7dq1XLZsGbdt28aEhISCNrPA0aMv5OTOnTssUaIE+/fvr+aPRkdHs3LlyqxRowb//PNPpqWlMSAggIGBgWputV7QupyK8tF/5swZCiHYt2/fXNdv3brFEydOcM2aNfz888954MABtT/R+qTBoyKDQTtB73IqJpOJV65cYXh4OIODg9m4cWM6OzvT1dWVLVu25MyZM7lz505euXJF84Hg/ehNQqNevXrs3r27OqibzWbdvfMHoTdfIMnTp0+zYsWKfOWVV0hm7yQfNGgQjUYjIyMjVd/o378/y5Yty7Nnz9rS3HxFb3IqZrNZneGeN28ey5Urx7CwMJLanxB40shg8ClFyqk8mLS0NJ49e5br1q3j22+/zWrVqtHBwYHFixdnx44duXz5clubWOBcvHiRwcHBDAgI0IyEhmJvcnKyOmiZzWb26NGDnTt3fuA99lbP/4qe5VSU9926dWsWLlyYH330Efv160chBN966y21XFJSEnv27MmqVava0Nonj5RTucf27dvp7++vjol5pUHYe/Cbn8hg0E7Qu5zKgwb55ORknjhxgitWrODAgQNpNBr5zjvvkNRew1c6t5CQEEZERDww5+vChQvqbLEWePPNN7l582aSZFRUFOfMmcOgoCBeu3aNFouFJpNJc+/6n9C7nMr973zp0qVWuYEDBw7kxYsX1et//PEHS5QoweHDh6v3awE9yqkoti9atIgjR46kyWRiXFwcFy9eTC8vL3X1TEFL42B+IoPBp4zr169z27ZtvH79eq4Ge+PGDa5Zs4a///47Y2JirK6FhYWxfPny6oyJPTf2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", + "text/plain": [ + "
" + ] + }, + "execution_count": 13, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "qc = q_algo.export('qiskit')\n", + "qc.measure_all()\n", + "simulator = Aer.get_backend(\"aer_simulator\")\n", + "circ = transpile(qc, simulator)\n", + "result = simulator.run(circ).result()\n", + "counts = result.get_counts(circ)\n", + "\n", + "counts_readable = q_algo.decode_counts(counts, discard_lower=20)\n", + "plot_histogram(counts_readable)" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/example_unitary_of_f.ipynb.txt b/_sources/example_unitary_of_f.ipynb.txt new file mode 100644 index 00000000..9173b846 --- /dev/null +++ b/_sources/example_unitary_of_f.ipynb.txt @@ -0,0 +1,114 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Unitary of qlasskit function" + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "\n", + "QlassF(a:bool, b:bool) -> bool:\n", + "\t_ret = a ^ ~b\n", + "\n" + ] + }, + { + "data": { + "image/png": "iVBORw0KGgoAAAANSUhEUgAAATEAAAEvCAYAAAAtufaDAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjguMCwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy81sbWrAAAACXBIWXMAAA9hAAAPYQGoP6dpAAAbfElEQVR4nO3de3RU5b3/8feeBHKPEAIN5AIECIRb8CRSw6lCqBcoolK1aim1/vits6xaspYcYi/LRbu6Vike1FP0tIWKP6tdYlqLlhI5ehQ8RkQNN0tN5B7MbdCRQEhIIJnZvz9GkEgCyWRuz+TzWmtWYPbl+e4k88mzn/3MHsu2bRsREUM5Ql2AiEhfKMRExGgKMRExmkJMRIymEBMRoynERMRoCjERMZpCTESMphATEaMpxETEaAoxETGaQkxEjKYQExGjKcRExGgKMRExmkJMRIymEBMRoynERMRoCjERMZpCTESMphATEaMpxETEaAoxETGaQkxEjKYQExGjKcRExGgKMRExmkJMRIymEBMRoynERMRoCjERMZpCTESMphATEaMpxETEaAoxETGaQkxEjKYQExGjKcRExGgKMRExmkJMRIymEBMRoynERMRoCjERMZpCTESMphATEaMpxETEaAoxETGaQkxEjKYQExGjKcRExGgKMRExmkJMRIzWL0LM5XJRUlLC2LFjiY2NJTMzk+LiYlpaWli8eDGWZfHUU0+FusyA63BDyxnvV5FIER3qAgJtz549zJ07F6fTSUJCAhMnTqS+vp7Vq1dz6NAhjh8/DsC0adNCW2iAtLthz1F45wAcdX35/MhU+MY4mDYSBkSFrj6RvrJs27ZDXUSguFwurrzySmpra1m6dCnLly8nKSkJgEcffZSHH36Y6Oho3G43J06cIDk5OcQV+1fDCVj7FjS2dL/O4AT4t1kwfFBwahLxt4gOse9+97usX7+eBx98kCeffPKi5dOmTePDDz9k9OjRHD58OAQVBs6nTfCb172nj5eTEAPFN8CwyMpw6ScidkysqqqK0tJSUlNTWbFiRZfr5OfnA5CXl9fp+SNHjnDzzTeTlJTE4MGD+f73v8/nn38e8Jr96U/v9izAwLven94NbD0igRKxIbZ+/Xo8Hg8LFy4kMTGxy3Xi4uKAziF26tQpioqKqK2tZf369axdu5by8nJuuukmPB5PUGrvq08+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", + "text/plain": [ + "
" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile, execute\n", + "from qiskit.visualization import array_to_latex\n", + "from qlasskit import qlassf\n", + "\n", + "@qlassf\n", + "def f(a: bool, b: bool) -> bool:\n", + " return a ^ (not b)\n", + "\n", + "print(f\"\\n{f}\\n\")\n", + "\n", + "qc = QuantumCircuit(f.num_qubits, f.num_qubits)\n", + "qc.append(f.gate(), f.qubits)\n", + "\n", + "qc.decompose().draw('mpl')\n" + ] + }, + { + "cell_type": "code", + "execution_count": 20, + "metadata": {}, + "outputs": [ + { + "data": { + "text/latex": [ + "$$\n", + "\n", + "\\begin{bmatrix}\n", + "0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\\\\n", + " 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n", + " 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\\\\n", + " 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\\\\n", + " 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\\\\n", + " 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\\\\n", + " 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\\\\n", + " 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\\\\n", + " \\end{bmatrix}\n", + "$$" + ], + "text/plain": [ + "" + ] + }, + "execution_count": 20, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "simulator = Aer.get_backend('unitary_simulator')\n", + "job = execute(qc, simulator, shots=8192)\n", + "result = job.result()\n", + "array_to_latex(result.get_unitary(qc,3), max_size=16)\n" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/generated/qlasskit.algorithms.grover.Grover.rst.txt b/_sources/generated/qlasskit.algorithms.grover.Grover.rst.txt new file mode 100644 index 00000000..c5426915 --- /dev/null +++ b/_sources/generated/qlasskit.algorithms.grover.Grover.rst.txt @@ -0,0 +1,40 @@ +qlasskit.algorithms.grover.Grover +================================= + +.. currentmodule:: qlasskit.algorithms.grover + +.. autoclass:: Grover + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~Grover.__init__ + ~Grover.circuit + ~Grover.decode_counts + ~Grover.decode_output + ~Grover.draw + ~Grover.encode_input + ~Grover.export + ~Grover.gate + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~Grover.input_qubits + ~Grover.input_size + ~Grover.num_qubits + ~Grover.output_qubits + ~Grover.output_size + ~Grover.qubits + + \ No newline at end of file diff --git a/_sources/generated/qlasskit.algorithms.qalgorithm.rst.txt b/_sources/generated/qlasskit.algorithms.qalgorithm.rst.txt new file mode 100644 index 00000000..d819a261 --- /dev/null +++ b/_sources/generated/qlasskit.algorithms.qalgorithm.rst.txt @@ -0,0 +1,41 @@ +qlasskit.algorithms.qalgorithm +============================== + +.. automodule:: qlasskit.algorithms.qalgorithm + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + oraclize + + + + + + .. rubric:: Classes + + .. autosummary:: + + QAlgorithm + + + + + + .. rubric:: Exceptions + + .. autosummary:: + + ConstantOracleException + + + + + diff --git a/_sources/generated/qlasskit.qcircuit.gates.rst.txt b/_sources/generated/qlasskit.qcircuit.gates.rst.txt new file mode 100644 index 00000000..35c21029 --- /dev/null +++ b/_sources/generated/qlasskit.qcircuit.gates.rst.txt @@ -0,0 +1,49 @@ +qlasskit.qcircuit.gates +======================= + +.. automodule:: qlasskit.qcircuit.gates + + + + + + + + .. rubric:: Functions + + .. autosummary:: + + apply + + + + + + .. rubric:: Classes + + .. autosummary:: + + Barrier + CCX + CX + H + MCX + MCtrl + NopGate + QControlledGate + QGate + S + T + Toffoli + X + Y + Z + + + + + + + + + diff --git a/_sources/generated/qlasskit.qcircuit.qcircuit.QCircuit.rst.txt b/_sources/generated/qlasskit.qcircuit.qcircuit.QCircuit.rst.txt new file mode 100644 index 00000000..88d70e89 --- /dev/null +++ b/_sources/generated/qlasskit.qcircuit.qcircuit.QCircuit.rst.txt @@ -0,0 +1,45 @@ +qlasskit.qcircuit.qcircuit.QCircuit +=================================== + +.. currentmodule:: qlasskit.qcircuit.qcircuit + +.. autoclass:: QCircuit + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~QCircuit.__init__ + ~QCircuit.add_qubit + ~QCircuit.append + ~QCircuit.barrier + ~QCircuit.ccx + ~QCircuit.copy + ~QCircuit.cx + ~QCircuit.draw + ~QCircuit.export + ~QCircuit.get_key_by_index + ~QCircuit.h + ~QCircuit.mctrl + ~QCircuit.mcx + ~QCircuit.s + ~QCircuit.t + ~QCircuit.x + ~QCircuit.y + ~QCircuit.z + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~QCircuit.num_gates + + \ No newline at end of file diff --git a/_sources/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.rst.txt b/_sources/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.rst.txt new file mode 100644 index 00000000..fc0e682b --- /dev/null +++ b/_sources/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.rst.txt @@ -0,0 +1,40 @@ +qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper +================================================= + +.. currentmodule:: qlasskit.qcircuit.qcircuitwrapper + +.. autoclass:: QCircuitWrapper + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~QCircuitWrapper.__init__ + ~QCircuitWrapper.circuit + ~QCircuitWrapper.decode_counts + ~QCircuitWrapper.decode_output + ~QCircuitWrapper.draw + ~QCircuitWrapper.encode_input + ~QCircuitWrapper.export + ~QCircuitWrapper.gate + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~QCircuitWrapper.input_qubits + ~QCircuitWrapper.input_size + ~QCircuitWrapper.num_qubits + ~QCircuitWrapper.output_qubits + ~QCircuitWrapper.output_size + ~QCircuitWrapper.qubits + + \ No newline at end of file diff --git a/_sources/generated/qlasskit.qlassfun.QlassF.rst.txt b/_sources/generated/qlasskit.qlassfun.QlassF.rst.txt new file mode 100644 index 00000000..148773ed --- /dev/null +++ b/_sources/generated/qlasskit.qlassfun.QlassF.rst.txt @@ -0,0 +1,52 @@ +qlasskit.qlassfun.QlassF +======================== + +.. currentmodule:: qlasskit.qlassfun + +.. autoclass:: QlassF + + + .. automethod:: __init__ + + + .. rubric:: Methods + + .. autosummary:: + + ~QlassF.__init__ + ~QlassF.bind + ~QlassF.circuit + ~QlassF.compile + ~QlassF.decode_counts + ~QlassF.decode_output + ~QlassF.draw + ~QlassF.encode_input + ~QlassF.export + ~QlassF.f + ~QlassF.from_function + ~QlassF.gate + ~QlassF.to_logicfun + ~QlassF.truth_table + ~QlassF.truth_table_header + + + + + + .. rubric:: Attributes + + .. autosummary:: + + ~QlassF.input_qubits + ~QlassF.input_size + ~QlassF.num_qubits + ~QlassF.output_qubits + ~QlassF.output_size + ~QlassF.qubits + ~QlassF.name + ~QlassF.original_f + ~QlassF.args + ~QlassF.returns + ~QlassF.expressions + + \ No newline at end of file diff --git a/_sources/generated/qlasskit.qlassfun.qlassf.rst.txt b/_sources/generated/qlasskit.qlassfun.qlassf.rst.txt new file mode 100644 index 00000000..51d99df6 --- /dev/null +++ b/_sources/generated/qlasskit.qlassfun.qlassf.rst.txt @@ -0,0 +1,6 @@ +qlasskit.qlassfun.qlassf +======================== + +.. currentmodule:: qlasskit.qlassfun + +.. autofunction:: qlassf \ No newline at end of file diff --git a/_sources/generated/qlasskit.qlassfun.qlassfa.rst.txt b/_sources/generated/qlasskit.qlassfun.qlassfa.rst.txt new file mode 100644 index 00000000..cb63d945 --- /dev/null +++ b/_sources/generated/qlasskit.qlassfun.qlassfa.rst.txt @@ -0,0 +1,6 @@ +qlasskit.qlassfun.qlassfa +========================= + +.. currentmodule:: qlasskit.qlassfun + +.. autofunction:: qlassfa \ No newline at end of file diff --git a/_sources/how_it_works.ipynb.txt b/_sources/how_it_works.ipynb.txt new file mode 100644 index 00000000..ace3f58c --- /dev/null +++ b/_sources/how_it_works.ipynb.txt @@ -0,0 +1,250 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# How it works\n", + "\n", + "To convert Python code into a quantum circuit, qlasskit implements a series of transformations:\n", + "\n", + "1. It begins with the Python *AST* (Abstract Syntax Tree), converting it into a more streamlined form using the `ast2ast` module. \n", + "2. Next, the streamlined AST is translated into *boolean expressions* as an intermediate step by the `ast2logic` module. \n", + "During this phase, boolean expressions are refined and optimized in preparation for the final transformation.\n", + "3. Finally, the `compiler` module takes these optimized boolean expressions and compiles them into a \n", + "*quantum circuit*.\n", + "\n", + "Unlike other libraries that translate individual operations into quantum circuits before combining them, \n", + "qlasskit constructs a singular boolean expression for each output qubit of the entire function. \n", + "This unique approach facilitates advanced optimization leveraging boolean algebraic properties.\n", + "\n", + "\n", + "For instance, let assume we have the following function:\n" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qint2, Qint4\n", + "from qiskit import QuantumCircuit\n", + "\n", + "@qlassf\n", + "def f_comp(b: bool, n: Qint2) -> Qint2:\n", + " for i in range(3):\n", + " n += (1 if b else 2)\n", + " return n" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "If we decompose the algorithm in 3 separate additions and we compile them separately, we obtain the following circuit:" + ] + }, + { + "cell_type": "code", + "execution_count": 22, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Operations: OrderedDict([('cx', 12), ('barrier', 3), ('x', 3), ('ccx', 3)])\n" + ] + }, + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "execution_count": 22, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "@qlassf\n", + "def f1(b: bool, n: Qint2) -> Qint2:\n", + " return n + (1 if b else 2)\n", + "\n", + "qc = QuantumCircuit(f_comp.num_qubits * 2 - 1)\n", + "\n", + "for i in range(3):\n", + " qc.barrier(label=f\"it_{i}\")\n", + " qc.append(f1.gate(), [0] + list(range(1 + i * 2, 5 + i * 2)))\n", + "\n", + "print('Operations:', qc.decompose().count_ops())\n", + "qc.decompose().draw(\"mpl\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "While if we compile the whole function to a quantum circuit using qlasskit, we obtain the following quantum circuit:" + ] + }, + { + "cell_type": "code", + "execution_count": 12, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Operations: OrderedDict([('cx', 4), ('x', 1), ('ccx', 1)])\n" + ] + }, + { + "data": { + "image/png": "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XLhySvg7NyrI/XfqIBx5E1r8eOpM8mTIvh6SDBo2REEuttTaAX89AuXVcOJ0/w9ZGR1tnZJdMN0a8EUBbh8fNcPuKthXZ/13fxJjIetya2yCrMvCH+DnKMiHx+uFMyegtgIaa6Cj/6ffEjcOJmRCej6MMfB5Cgpysb3uHivMTzVZR+kOrNvX0pJhYmJo70WW8GjrhNpGaGy19ocop3UNPD0FxsZFTnhfTEEeWB0t0HwSOtvA0wPOKIhNsq6DjzJ8xMbI/IuLBFB0FEweb/3IyBQXA9kR9sQqCa3RCdaPHanXuoiIiMEU5CIiIgZTkIuIiBhMQS4iImIw9VoXEYlAXq+Xsx4fB0MIs3hnFI5IvAXA5hTkIiIiBtOpdREREYMpyEVERAymIBcRETGYglxERMRgCnIRERGDKchFREQMpiAXERExmIJcRETEYApyERERgynIRUREDKYgFxERMZiCXERExGAKchEREYMpyEVERAymIBcRETGYglxERMRgCnIRERGDKchFREQMpiAXERExmIJcRETEYApyERERgynIRUREDKYgFxERMZiCXERExGAKchEREYP9f/bRrXXb6XzvAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "execution_count": 12, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "qc = QuantumCircuit(f_comp.num_qubits)\n", + "qc.append(f_comp.gate(), f_comp.qubits)\n", + "\n", + "print('Operations:', qc.decompose().count_ops())\n", + "qc.decompose().draw(\"mpl\")" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "As we can see from the circuit drawings, qlasskit approach needs half the number of qubits and half the number of gates." + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "## AST Traslator\n", + "Given a python function, the `qlasskit.ast2logic` module walks its syntax tree translating all the statements / \n", + "expressions to boolean expressions.\n", + "\n", + "\n", + "For instance, the following function:" + ] + }, + { + "cell_type": "code", + "execution_count": 13, + "metadata": {}, + "outputs": [], + "source": [ + "@qlassf\n", + "def f(n: Qint4) -> bool:\n", + " return n == 3 " + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "Is translated to this boolean expression:" + ] + }, + { + "cell_type": "code", + "execution_count": 15, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "[(_ret, n.0 & n.1 & ~n.2 & ~n.3)]\n" + ] + } + ], + "source": [ + "print(f.expressions)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "\n", + "## Compiler\n", + "\n", + "The boolean expressions are then being fed to the `qlasskit.compiler`` which compiles boolean expressions\n", + "to invertible circuits, introducing auxiliary qubits. In this step, the compiler will automatically uncompute \n", + "auxiliary qubits in order to reduce the number of qubits needed and the circuit footprint. \n", + "\n", + "For the compilation, two backends are supported:\n", + "\n", + "- InternalCompiler\n", + "- Tweedledum.xag_synth\n", + "\n", + "\n", + "## Result \n", + "\n", + "The result of the compiler is a quantum circuit represented with qlasskit `QCircuit`. This circuit\n", + "can now be exported to one of the supported framework as a gate or as a standalone circuit.\n", + "\n", + "\n", + "The previous example function `f`, is translated to the following quantum circuit: the \n", + "result is available at qubit `q6`." + ] + }, + { + "cell_type": "code", + "execution_count": 19, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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", + "text/plain": [ + "
" + ] + }, + "execution_count": 19, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "f.export().draw('mpl')" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "qlasskit_310-env", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.13" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt new file mode 100644 index 00000000..aa6ab8db --- /dev/null +++ b/_sources/index.rst.txt @@ -0,0 +1,33 @@ +Qlasskit +==================================== + +Qlasskit is a Python library that allows quantum developers to write classical algorithms in pure +Python and translate them into unitary operators (gates) for use in quantum circuits. + +.. toctree:: + :maxdepth: 2 + :caption: Qlasskit + + quickstart.ipynb + how_it_works.ipynb + supported + algorithms + api + +.. toctree:: + :maxdepth: 2 + :caption: Examples + + example_grover.ipynb + example_grover_subset.ipynb + example_grover_hash.ipynb + example_grover_sudoku.ipynb + example_unitary_of_f.ipynb + + +Indices and tables +================== + +* :ref:`genindex` +* :ref:`modindex` +* :ref:`search` diff --git a/_sources/quickstart.ipynb.txt b/_sources/quickstart.ipynb.txt new file mode 100644 index 00000000..c78f106f --- /dev/null +++ b/_sources/quickstart.ipynb.txt @@ -0,0 +1,136 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# Quickstart\n", + "\n", + "First install qlasskit using pip.\n", + "\n", + "```pip install qlasskit```\n", + "\n", + "We now define a qlassf function that sums two numbers:" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [], + "source": [ + "from qlasskit import qlassf, Qint2\n", + "\n", + "@qlassf \n", + "def sum_two_numbers(a: Qint2, b: Qint2) -> Qint2:\n", + " return a + b" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "We can now export the resulting quantum circuit to any supported framework:" + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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7GIwzZgxgwMHDvSbdu7cOebOnUt6ejo//OEP6e7uprKykkmTJrF7925iYsw5iD3fCy+8A38+Cn0D3MsdGwNl0+DeeQoxEbtqa4L6V+HjQZ70Ez8BZi6EtJxwVhVco3LztXevNRLi06cVAVJSUti+fTurVq3iK1/5CnFxcdx999385Cc/MSrEwAqnB26CzxfBngbr6fdHPrRCbVwc/K8vQLKB58NFZPgmZkP5N61AO/mBddOzz2uddiz+AqTmgMPPa+rRRkE2gOnTp7N169ZwlhRSyfGwaA4sAtY+D2e7rAcEK8RERgeHA1KnWD9tJ6wn4Y9xQpqf19KjlVmHGEEyVJCJiIg5RuUR2cXnMIqIiPlG5RGZiIjYh4JMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMdqoCDKPx0NlZSV5eXk4nU6ys7NZtWoVnZ2dLF++HIfDwaZNmyJdpoiIBCAu0gWEWl1dHRUVFbjdbhITEyksLOTkyZNs3LiRhoYGWltbASgpKYlsoRJS3RdgnwvOdUOMA9KTYWYmxI6KXTkRe7N1kHk8HpYsWYLb7Wb16tWsXbuW5ORkAJ588kkeeeQR4uLicDgcFBUVRbhaCYW2Tnh1H7xzDHp6+08bHw/z82HBLBhr6/8TROzN1vujK1euxOVysWLFCjZs2HApxAAqKyspLi6mt7eXnJwcUlJSIliphIKrFX78e3jr8JUhBnC2C15+H376GnT2hL8+EQkO2wZZfX09VVVVpKens27dugHnmTdvHgDFxcWXXrsYfGVlZYwbNw6HwxGWeiW42jrh6R3Q3j30vMdPwy/+CH3e0NclIsFn2yDbsmULXq+XpUuXkpSUNOA88fHxQP8gO3LkCM899xwZGRnceOONYalVgm97vXU9bLiOfgR7XaGrR0RCx7ZBtn37dgAWLFgw6Dwul7XlujzIbrvtNlpaWnjxxRdZuHBhaIuUkOi5ANVH/W+361DwaxGR0LNtkB0/fhyAqVOnDji9t7eXXbt2Af2DLCbGtn+SUaO+xRql6K/DH8K5ruDXIyKhZduxWp2dnQB0dQ28ZaqqqsLj8ZCcnExubm5IayktLcXtdoe0j+H6/GPVJIzPpMXdQlaWPU+dTi9/iOu/+H8Calv+mUWcddcHuSKR6PHj5dWkJmfS0hJd24CMjAxqamoCamvbIMvIyKCtrY3a2lrKy8v7TWtpaWHNmjUAFBUVhXxAh9vtprm5OaR9DFdfX9+l39FSU7BNPP1RwG1bTjbR1mLPv4sI2HMbYNsgW7hwIfX19axfv55FixZRUFAAQHV1NcuWLcPj8QDhuRE6IyMj5H0MV2xs7KXfkydPjnA1oRHXewYAn8/n105K34VuUpw+Emz6dxGB6N0GjGQ7adsgq6ys5D/+4z9oampi9uzZzJw5k+7ubo4cOUJFRQU5OTm88sor/a6PhUqgh8uhsPZ56/6pzIzMS4Nd7Mbrgx+9BJ52/460y2c4eerowRBVJRIddv4cejogM9M+2wDbjmzIyspi586dLF68GKfTSWNjI6mpqWzevJlt27Zx6JA1RC0cQSbhFeOAW/L9b3drQfBrEZHQs+0RGcCsWbPYunXrFa93dHTQ2NhITEwMc+bMiUBlEmqfKYD9zdZIxOFYNBumpIW2JhEJDVsH2WD27duHz+ejoKCAhISEK6Y/++yzAOzfv7/fv3NycigtLQ1foRKwuFj4q9vhl29C/cmrz7toNnxeB+YixhqVQbZ3715g8NOK999//4D/fuihh/jlL38Z0tokeMaNgW/dAQdOwq7D1hGa77Lp5XnWKcis1EhVKCLBoCAbgM/nG/B1MU+MAwonWz8fn4cfvQgdPZDihAduinR1IhIMth3scTVDBZnYU8LYT75/TM+CFrGPUXlEdvE5jCIiYr5ReUQmIiL2oSATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERo42KIPN4PFRWVpKXl4fT6SQ7O5tVq1bR2dnJ8uXLcTgcbNq0KdJlioSUzwc9vdDZA33eSFcjkeDzWT8X/9su4iJdQKjV1dVRUVGB2+0mMTGRwsJCTp48ycaNG2loaKC1tRWAkpKSyBYqEiId3fB2A7x1BE53WK/FOGBOFtySDwUZ4HBEtkYJrc5WcNVByz7o7bFeO98JB16DrBJISo9kdSNn6yDzeDwsWbIEt9vN6tWrWbt2LcnJyQA8+eSTPPLII8TFxeFwOCgqKopwtSLB994J+Pe34EJf/9e9Pni/yfrJvxa+eRskjI1MjRI6Ph80vAmNbw883VVn/UyZB/l3mLtDY+tTiytXrsTlcrFixQo2bNhwKcQAKisrKS4upre3l5ycHFJSUiJYqUjwvXcCfrnzyhD7tMMfws+3W6cdxV4O/3HwELvciXesozNTTzfaNsjq6+upqqoiPT2ddevWDTjPvHnzACguLr702rPPPst9993H1KlTSUhIYObMmXz/+9+no6MjLHWLBENnD/zqLRjudunEafj9+yEtScLs9HE4UTP8+Zvfg48aQldPKNk2yLZs2YLX62Xp0qUkJSUNOE98fDzQP8g2bNhAbGwsP/rRj3j55Zf5zne+w89+9jPuuusuvF5dIRcz/PkonB/iSOzT3m6A8zoqsw3Xu+FpEw1se41s+/btACxYsGDQeVwuF9A/yF566SUmTZp06d+33347kyZNYunSpbz55pvcdtttIapYJHjeOux/m4/PQ90JKJsW/HokvHo6Aju6aj0OH5+BhAnBrii0bBtkx48fB2Dq1KkDTu/t7WXXrl1A/yC7PMQuKi0tBaC5uTmgWkpLS3G73QG1DbbPP1ZNwvhMWtwtZGXdGOlywm40vH9HTBz3rWsMqO3adf/E3pd/FNyCJOxmZs3ne1/6dUBt71/yEO8dez3IFQ0tIyODmho/zoVexrZB1tnZCUBXV9eA06uqqvB4PCQnJ5Obm3vVZe3YsQOAWbNmBVSL2+0OOASDra+v79LvaKkpnEbD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kRlqQgLcO8//due64MzH/j14+N554d/7l6EVToayaf61CeTzj42Br5Xr26Eleo26I7KLz2G0g7JpcPQjeLth+G2G+/X2F9003f+NpYTPX5bCyTPWNzgPh7+fP1hHfhnj/W8nEi7axzKYw2FtZOblhGb583LggTKNVIxmzjHw7QVw3cTQLP++UmtnRiSaKcgMFxsDS+fDXxQGL3AcDmt5S+fra+1NkOSEFQthdhCfNuQcA1+/BT4zI3jLFAmVUXdq0Y5iHLDkepiTBVv2wKnBnys8pGtS4Ks3W/cpiTkSxsJf3W59i/cL70DX+cCXNTMTvnKzrouKORRkNpI7Cf5nBdQcgzcPWddOhuu6ida9SaW5MFZrhZEcDut65qxM2HUYdh8Z/jd6O7DuEbs13xpEotPJYhJtsmxmbJx1w3R5HjR64GCL9fX0rlZrpJoPa6OVEm89sy87FWZkQk66Nl52kRwPdxXBojmwv9kaEORqBVfbJ0dqMQ7rfsTsVMhOg7lZ1hNDREykILMph8M6Qrv8FKHPB16ftRFTaNlfbAzMzbZ+LvL6rPVAQ+nFThRko4jDAbEKsFEtxoF1SC5iI9ovExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRocZEuQCSUPu4BVxs0nYZT7fDxeev1rvPw5iHISoXrJsBY/Z9gSz4fnO2yPv+mVmjr7L8OVB+11oFrUyDGprv1veeh4xSc+xA6T8OFbuv1C91wvAZSroXkayFubGTrHAmHz+fzRboIkWDyeqG+xQqqAydhqBV8TCzMy4FbCiA7NRwVSqj19EJto7UONLcNPX+yE8rzrJ+JiSEvL+R8PjjbDE11cOoQ+LxXn9/hgEn5kFUCE7Otf5tEQSa2crAFfvNn8HQE1j7/WvjyTTApObh1SXh4fbDrEGx7D7ov+N/e4YCbp8M910O8oUco7aeg/hXrCCwQSZNg1mdhfGZw6wolBZnYQvcFeLEW3joy8mWNiYW7S+AzMyDGsD3T0czTDv/5NhwJcAN+uQkJ8MBNMOu6kS8rXLx9cGwPNL499BHYkByQcyNMmw8xBpx2V5CJ8dq74efbh3cKyR+lOfDVcoi16bUTOznugc07Prn+FSz3lVo7NNGu7wK8/zs43Rjc5U7MhuJ7o//6mYJMjNbZA0+9Cu6zoVn+9VNh2Xz7DgSwg6ZW+OlrgZ1KHI5oDzNvL9S9AK3HQ7P88ZPhhi9B7JjQLD8Y9L+nGMvrg1/uDF2IAbx7HH6/N3TLl5Hp6LaOxEIVYgDP1UD9ydAtf6QOvB66EANr0Mj+V0K3/GAw4OynyMB2HYLDfl4P+du7ICUeznXBj38/vDav7YM5WTAlzf8aJbSerbbCzB+BrANVb8Mji6NvAIjnKJz0c0er7EEYmwjnO+HP/z68Nh8egGsK4NoC/2sMh1FxRObxeKisrCQvLw+n00l2djarVq2is7OT5cuX43A42LRpU6TLFD+c7oCX3vW/XUq8dSE/JX74bbw+2LIbevv8709C570TUHfC/3aBrANnPobf1frfVyj19kD9H/xvNzYRnMnWb38ceBXOd/nfXzjY/oisrq6OiooK3G43iYmJFBYWcvLkSTZu3EhDQwOtra0AlJSURLZQ8cuO/XA+jMHSchbeb4IbcsLXpwzO5wv/Kd+3j8Ln5kbPfWYnP4CeAG8zCcSFLmh+D3JvDl+fw2XrIzKPx8OSJUtwu92sXr2alpYWamtrcbvdrF+/nm3btlFdXY3D4aCoqCjS5cowdV+A6mPh73fX4fD3KQM79hG0nAlvnz4fvBUl64DPB6668Pfres964EC0sXWQrVy5EpfLxYoVK9iwYQPJyZ/c5VpZWUlxcTG9vb3k5OSQkpISwUrFH7WN1pMbwq3hVGgHlsjwRWqnYk8D9EXBhrytCT4O8u0mw9HTDqePhr/fodg2yOrr66mqqiI9PZ1169YNOM+8efMAKC4uvvTaG2+8gcPhuOJHpx6jh78DPIIpGDfbyshF6nNo74ZT5yLT9+XaArg2GLS+myLX92Bse41sy5YteL1eli5dSlJS0oDzxMdbV3svD7KLfvrTn3LDDTdc+ndiYpScGBdcraOzb7Gc67IeBBwpTa2QOSFy/UPgj58yve/B2DbItm/fDsCCBQsGncflcgEDB1lhYSE33xyFVzVHue4L8FF75PpvUpBFXKR3JppaoWxaZGtoj2CYtJ+yrtFF04OFbRtkx49bdwhOnTp1wOm9vb3s2rULGDjIgqm0tBS32x3SPkaLhInZfP57uwedfvEeocGkOD/5/fi9g8832D1Gh4+dJCurbJjVSihMueE+yh74xwGnDfX5w8jXgV/9529Z9cUVw6w2NJ5ZeZyYmNgBp128T2ww4xI/+X3rw4PPN9h9Zn3nITdnGr19wX0eWEZGBjU1NQG1tW2QdXZ2AtDVNfA5iKqqKjweD8nJyeTm5l4x/YEHHsDj8ZCWlsY999zDE088QXp6ekC1uN1umpubA2or/U3oS7jq9Iv3CA0lJmZ4813BEavPMsIm5A0+5ny4nz8Evg70XOiN6DrgcDgGDTH45D6xIZcTM7z5BnLqw4/oCufY/yHYNsgyMjJoa2ujtraW8vLyftNaWlpYs2YNAEVFRTguO0YeP348a9as4bbbbiMpKYndu3ezbt069uzZQ01NDU6nM6BaJDgSJky86vRzQ1w7SXFaGzCvF85d5YkQgy3H573A5MmTh6hSQiklefDDjaE+fxj5OjA2Libi60Bv33niYgd+zMj5zqu3HZdohZjPCz1Xmfdqy5l0TRp93vHDqHT4RrKdtO1Dg1euXMlTTz1FdnY2r732GgUF1rNVqqurWbZsGUePHuXChQt897vfHfKpHi+99BL33HMPzzzzDN/85jfDUb4MorcPHvl14EOgH7/X2gs/8zE8/oL/7adNgpWfDaxvCY6GD+Gp1wJvP9J1YNFsWFwSeP/BsOtfoOtMYG1vfdg6Eutuhzc3+99+bCLc9p3A+g4V2w6/r6ysJC0tjaamJmbPns3cuXPJz8+nrKyMadOmceeddwLDuz529913k5iYGPD5WwmeuNjIjhjL1vMWI25yKkRynEFWFHyLeMq1o7Pvwdg2yLKysti5cyeLFy/G6XTS2NhIamoqmzdvZtu2bRw6dAjwb6CHI5qG6Yxi2RHckESyb7E4x8CkCD6/IBrWgeQIhkkk+x6Mba+RAcyaNYutW7de8XpHRweNjY3ExMQwZ86cIZfz4osv0tnZSVmZRqtFg9mTYXcQvgnaX7ExMMOgr3+3s9mTI3NjcuaE6HjWYvo0OPKnyPUdbWwdZIPZt28fPp+PgoICEhL6D1t68MEHmTZtGjfccMOlwR5PPvkkJSUlfOUrX4lQxXK5wutgYgK0fRzefouzIdn/sT4SArfkw476yPQbDSdmktKtb28O91M2UjJgfBTuzNn21OLV7N1rPTZ7oNOKs2fP5oUXXuDrX/86FRUVPPPMM3zrW9/ijTfeYOzYKPsyolEqJgbm54e/31ui9LuYRqP0ZJgZ5g3quDgovfJOnYjJKolAn6G95TZgo/KI7GpB9uijj/Loo4+GuyTx02dmwFtHoG2IocbBUpRtjViU6LHkejjktr4vLhwqiqzrc9HimnwYP9n6BudwSL4WMgrD05e/dEQmRnKOga+G6QliCWPh/huj45SSfGLyRPjs3PD0lTsJbpsRnr6GyxEDhZ+DmDAcjjhioPAuuMp92BE1Ko/ILj6HUcxWkAG3z4Q/Hhh+m4s3uQ7nxtmLvnwTJPvxbcISPotmQ/1JOO4Zfht/14H4sfC1m61T2tEmMRXyb4eDrw+/zcUbnYe6cfpy02+F5Cg+I2HbG6JldPB64Ve74Z3G0Cz/vlLrNKZEr84e2PRaaL5oc2wcfOdO64gsmjW8Ccf2hGbZU+ZB/h3RfUZCQSbG83rhN9XBHZIf44D7y6A8L3jLlNDp7IGn3/DvyGwoiePgW3dATmCPWA0rnw8a37YCLZhyb4Zpt0R3iIGCTGyk7rgVaJ09I1vOdRPga+XR8QQHGb4+L7y6D/6wd+QDQIqyreuipp1SbmuC/b+HrhF+k/m4ZOv6W1pOUMoKOQWZ2Ep7N2yrs041Xujzr22SE24rgDsLrUdhiZma2+Cld+FAi/9tM8bDZ+fA9VOj/yhkMH3n4ehuaH4fev3cqYsdC9fNhenzIW5caOoLBQWZ2FJnD/z5KNQ2wskzgz9keFwcTE2Hm6ZbNzwrwOzjo3bYdQj2NV/9y1iTnZB3rXVvYt415gbYp/WdB/dBaPnA+lZnb+/A88XEQfI1kFloDa+PM/B2WQWZ2F5vnxVmp85ZR2kOrOH7mRNhUrJ1PUzsres8uNqs+w57+6zHjSWOs04fj4+3T3gNxuuFj09Dx2nouwD4IHYMJKZbIx+jdVj9cCnIRETEaFF4Z4SIiMjwKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMZqCTEREjKYgExERoynIRETEaAoyERExmoJMRESMpiATERGjKchERMRoCjIRETGagkxERIymIBMREaMpyERExGgKMhERMdr/B6Ec2X7W6GUmAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "execution_count": 2, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "circuit = sum_two_numbers.export('qiskit')\n", + "circuit.draw('mpl')" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "The qlassf function can be also exported as a gate, if the destination framwork supports it. We can use `encode_input` and `decode_output` in order to conver from/to high level types of qlasskit without worrying about the binary representation." + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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yWezOjonVylqktEpzMfJ1egEAABUHGXOAVkskrOb0SkAAEBN4DArAACAiVHmAAAATIwyBwAAYGKUOQAAABOjzAEAAJgYZQ4AAMDEKHMAAAAmRpkDAAAwMcocAACAiVHmAAAATIwyBwAAYGKUOQAAABOjzAEAAJgYZQ4AAMDEKHMAAAAmRpkDAAAwMcocAACAiVHmAAAATMzF6AAAAKCkoqIinT171ugYFeLl5SWLxWJ0jDqHMgcAQC109uxZ+fj4GB2jQrKysuTt7W10jDqHw6wAAAAmRpkDAAAwMcocAACAiVHmAAAATIwyBwAAYGKUOQAAABOjzAEAAJgYZQ4AAMDEKHMAAAAmRpkDAAAwMcocAAB1gJOTk5o2bao2bdooJCRE9erVq9D6Xl5emjp1qpycqA61Dc9mBQDAQfXt21e33nqrunfvri5dupR41uuRI0e0c+dObdmyRUuWLJHNZit1O15eXlq7dq0GDBigzp07a/z48SosLKyJHwHlYCkqKioyOgSA6lWQJ22Yb3QKoHaJmiQ5uxmdomzZ2dklyld5ODs76+6779aDDz6oyMjIcq937tw5vffee5o3b5727Nljn35pkZOkkydPqkePHjp48GCJbWRlZcnb27vCmXF1HH6s1GazKT4+XqGhofLw8FDz5s01efJkZWdna8KECbJYLFqwYIHRMYFaJzfvrMbNbK2YOIte+ijW6DgAyqFjx4769ttvtWjRohJF7vDhw1q5cqWWLl2q5cuX66uvvtKZM2fs893d3TVu3DglJibq2WeflZubW6lFLjo6utQiB+M49GHWpKQkDRkyRFarVd7e3goPD9exY8c0f/58HTp0SJmZmZKkLl26GBsUqIXe/uwpncr+zegYAMopNjZWc+fOlbu7u33aN998o1dffVVr1661/867lJOTkzp06KDx48drwoQJatiwoVxcXPT4449r1KhRysrKUq9evST9r8jt3Lmzxn4mlI/DjszZbDYNHz5cVqtVU6ZMUUZGhnbt2iWr1apZs2ZpzZo12rFjhywWiyIiIoyOC9QqKWm79OHXL2h8zDNGRwFQDk899ZReeukle5Hbv3+/+vTpo759+2rp0qWlFjlJKiws1L59+zR16lQFBwfrySefVF5enqQLo3wUOXNw2DI3adIkpaWl2f9S8fX1tc+Lj49XZGSk8vPzFRISIj8/PwOTArVLQWGBnn9/onq0G6zrOt9idBwAVzB58mQ988z//vCaN2+errnmGm3durVC28nNzdWzzz6rfv36KTs72z69sLBQY8eOpcjVYg5Z5pKTk7VixQoFBARo5syZpS7TrVs3SbrsyaFDhgyRxWLR008/XR0xgVrpw6+e19Fff1DsKM4lBWq7rl27au7cufbXDz/8sB555BGdO3euUtvz8vLS7Nmzi13E4OTkpIcfflgWi+Wq86J6OGSZW758uQoLCzVmzJgyrwTy9PSUVHaZe++995SUlFRdEYFaKSPzsJasn64xMU8psEGI0XEAXIarq6sWL14sF5cLp7/PnDlTL7zwQqW39/uLHU6dOiWr1SpJuv7663XPPfdcdWZUD4cscwkJCZKkqKioMpdJS0uTVHqZO336tB566KFif+0AdcGLH9ynwIatdWv/vxodBcAVTJo0yX7Od1JSkqZPn17pbZV21er111+vcePG2ZeZM2eO/P39ry40qoVDXs165MgRSVLLli1LnZ+fn68tW7ZIKr3MPf744woLC9OYMWM0duzYq87TvXt3+183gBHcXDy1KDblsst8sXOpdqV8rn/e/5VcnF1rKBlgnLZhbZWXn2N0jDJd7qa8Tk5OevDBB+2v//SnP+n8+fOVep+ybj9y8Ry5N998UxMmTJCvr6/uvPPOy47+tW3blidEVFJgYKASExMrta5DlrmLJ27m5JT+JV2xYoVsNpt8fX3VqlWrYvMSExP1+uuvV+mJnlarVenp6VW2PaCiPFy9Ljs/L/+cFn7yV/VsP1T+voFKt124h5Tt1IX9Njv3lNJtB1XPO0A+nvWrOy5QIzKOHVPu+bNGx6iUwYMH239/ffrpp5U+LehKRU6SZs+erQkTJkiSHnjgAb344osq63kDGRkZlcqBq+OQZS4wMFAnTpzQrl271Lt372LzMjIyFBcXJ0mKiIgodkJnQUGB7r33XsXGxqpjx45VmgcwkpuL52Xn553P0cns37QteY22Ja8pMf/LXUv15a6luuemObpt4CPVFROoUUFNm9b6kbmyytEf//hH+3+/8sorldp+eYqcJB04cEBffPGFoqOj1bZtW3Xr1q3MEaSgoCBG5irparqCQ5a56OhoJScna9asWYqJiVFYWJgkaceOHRo3bpz92XO/v1nwggUL9Msvv1T51auVHTYFqsqVHufl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", + "text/plain": [ + "
" + ] + }, + "execution_count": 9, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import QuantumCircuit\n", + "\n", + "qc = QuantumCircuit(sum_two_numbers.num_qubits,len(sum_two_numbers.output_qubits))\n", + "\n", + "qc.initialize(sum_two_numbers.encode_input(Qint2(1), Qint2(2)), sum_two_numbers.input_qubits)\n", + "qc.append(sum_two_numbers.gate('qiskit'), sum_two_numbers.qubits)\n", + "qc.measure(sum_two_numbers.output_qubits, range(len(sum_two_numbers.output_qubits)))\n", + "qc.draw('mpl')" + ] + }, + { + "cell_type": "code", + "execution_count": 10, + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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+Piod+/eOnLkiE6dOuUy1+l06h//+Id8fX11zz33GOOxsbGS9O+HN1wlJye7zAEAAGisqhSFPXr00IwZM3TgwAHdeeedmjdvnrZv3y6LxSKLxaK0tDTNnTtXd955p/bv368XX3xRPXr0qK21S5K+//57Xblyxe34rFmzJElPPPGEMT5lyhRJ1x4Auf4hjdWrV+vEiRP65S9/KR8fH2N80qRJ8vLy0sKFC10uI2dkZOj9999X586ddf/999f45wIAAKhLVf5FE6fTqZdffllLly41vhfvxu2enp763e9+p9dff93lC6JrwyuvvKI//vGPGjBggMLDw+Xr66ujR49qy5Ytstvtmj17thYtWmTMdzgceuCBB4yfuYuNjdWxY8f08ccfKyIiQvv27avwZ+4ef/xx42fuioqKqvwzd/yiCQAAuF5D+UWTKkdhqePHjyshIUG7d+827rdr27at+vXrp4kTJ7o8Kl2bduzYob/85S/65ptvdO7cOV25ckVBQUG699579eyzz7r90unCwkL94Q9/0IYNG5SVlaVWrVppxIgRev3119WmTRu3x3n33Xf11ltv6fDhw2revLn69eun1157rcpnQolCAABwvUYfhageohAAAFyvoURh7X+JIAAAABo8ohAAAABEIQAAAIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAiCgEAACAiEIAAACIKAQAAICIQgAAAIgoBAAAgIhCAAAAqAlE4ZkzZ/TWW28pPj5e7du3V/PmzdW2bVs9/vjj2rdvX5n5r7zy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", + "text/plain": [ + "
" + ] + }, + "execution_count": 10, + "metadata": {}, + "output_type": "execute_result" + } + ], + "source": [ + "from qiskit import Aer, QuantumCircuit, transpile\n", + "from qiskit.visualization import plot_histogram\n", + "\n", + "simulator = Aer.get_backend(\"aer_simulator\")\n", + "circ = transpile(qc, simulator)\n", + "result = simulator.run(circ).result()\n", + "counts = result.get_counts(circ)\n", + "\n", + "counts_readable = sum_two_numbers.decode_counts(counts)\n", + "plot_histogram(counts_readable)" + ] + }, + { + "cell_type": "markdown", + "metadata": {}, + "source": [] + } + ], + "metadata": { + "language_info": { + "name": "python" + } + }, + "nbformat": 4, + "nbformat_minor": 2 +} diff --git a/_sources/supported.rst.txt b/_sources/supported.rst.txt new file mode 100644 index 00000000..b9dbf439 --- /dev/null +++ b/_sources/supported.rst.txt @@ -0,0 +1,253 @@ +Supported python subset +==================================== + +Qlasskit supports a subset of python. This subset will be expanded, but it is +limited by the linearity of quantum circuits and by the number of qubits. + +The structure of a qlasskit function has the following pattern: + +.. code-block:: python + + @qlasskit + def f(param: type, [...param: type]) -> type: + statement + ... + statement + + +Types +----- + +All types has a static size. + +bool +^^^^ + +Boolean type. + + +Qint +^^^^ + +Unsigned integers; this type has subtypes for different Qint sizes (Qint2, Qint4, Qint8, Qint12, Qint16). +Single bit of the Qint are accessible by the subscript operator `[]`. + + +Tuple +^^^^^ + +Container type holding different types. + + +List +^^^^ + +Qlist[T, size] denotes a fixed-size list in qlasskit. +For example, the list `[1,2,3]` is typed as `Qlist[Qint2,3]`. + + +Matrix +^^^^ + +Qmatrix[T, m, n] denotes a fixed-size list in qlasskit. +For example, the matrix `[[1,2],[3,4]]` is typed as `Qmatrix[Qint2,2,2]`. + + + + + +Expressions +----------- + +Constants +^^^^^^^^^^^^^ + +.. code-block:: python + + True + +.. code-block:: python + + 42 + + +Tuple +^^^^^ + +.. code-block:: python + + (a, b) + +List (fixed size) +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + [a, b] + + +2D Matrix (fixed size) +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + [[a, b], [c,d]] + + +Subscript +^^^^^^^^^ + +.. code-block:: python + + a[0] + +Boolean operators +^^^^^^^^^^^^^^^^^ + +.. code-block:: python + + not a + +.. code-block:: python + + a and b + +.. code-block:: python + + a or b + + + +If expressions +^^^^^^^^^^^^^^ + +.. code-block:: python + + a if b else c + +Comparators +^^^^^^^^^^^ + +.. code-block:: python + + a > b or b <= c and c == d or c != a + + +Unary Op +^^^^^^^^^ + +.. code-block:: python + + ~a + + + +Bin Op +^^^^^^^^^ + +.. code-block:: python + + a << 1 + +.. code-block:: python + + a >> 2 + +.. code-block:: python + + a + b + +.. code-block:: python + + a - b + +.. code-block:: python + + a * b + + + +Function call +^^^^^^^^^^^^^ + +Bultin functions: +- `print()`: debug function, ignore by conversion +- `len(Tuple)`, `len(Qlist)``: returns the length of a tuple +- `max(a, b, ...)`, `max(Tuple)`, `max(Qlist)`: returns the max of a tuple +- `min(a, b, ...)`, `min(Tuple)`, `min(Qlist)`: returns the min of a tuple +- `sum(Tuple)`, `sum(Qlist)`: returns the sum of the elemnts of a tuple / list +- `all(Tuple)`, `all(Qlist)`: returns True if all of the elemnts are True +- `any(Tuple)`, `any(Qlist)`: returns True if any of the elemnts are True + + + +Statements +---------- + +Assign +^^^^^^ + +.. code-block:: python + + c = not a + +Return +^^^^^^ + +.. code-block:: python + + return b+1 + + +For loop +^^^^^^^^ + +.. code-block:: python + + for i in range(4): + a += i + + +.. note:: + Please note that in qlasskit, for loops are unrolled during compilation. Therefore, + it is essential that the number of iterations for each for loop is known at the + time of compilation. + +Function def +^^^^^^^^^^^^ + +.. code-block:: python + + def f(t: Qlist[Qint4,2]) -> Qint4: + return t[0] + t[1] + + +If then else +^^^^^^^^^^^^ + +.. code-block:: python + + c = 0 + if cond: + c += 12 + else: + c += 13 + +.. note:: + At present, the if-then-else statement in qlasskit is designed to support branch bodies + that exclusively contain assignment statements. + + + +Quantum Hybrid +--------------- + +In a qlassf function, you have the option to utilize quantum gates through the Q module. It's +important to keep in mind that incorporating quantum gates within a qlasskit function leads +to a Python function that exhibits distinct behaviors compared to its quantum counterpart. + +.. code-block:: python + + def bell(a: bool, b: bool) -> bool: + return Q.CX(Q.H(a), b) + diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..30fee9d0 --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/dark_mode_css/custom.css b/_static/dark_mode_css/custom.css new file mode 100644 index 00000000..989c2ada --- /dev/null +++ b/_static/dark_mode_css/custom.css @@ -0,0 +1,77 @@ +.wy-side-nav-search input[type='text'] { + border-radius: 3px; +} + +input[type='color'], +input[type='date'], +input[type='datetime-local'], +input[type='datetime'], +input[type='email'], +input[type='month'], +input[type='number'], +input[type='password'], +input[type='search'], +input[type='tel'], +input[type='text'], +input[type='time'], +input[type='url'], +input[type='week'] { + box-shadow: none; +} + +.theme-switcher { + border-radius: 50%; + position: fixed; + right: 1.6em; + bottom: 1.4em; + z-index: 3; + border: none; + height: 2.2em; + width: 2.2em; + background-color: #fcfcfc; + font-size: 20px; + -webkit-box-shadow: 0px 3px 14px 4px rgba(0, 0, 0, 0.62); + box-shadow: 0px 3px 14px 4px rgba(0, 0, 0, 0.62); + color: #404040; + transition: all 0.3s ease-in-out; +} + +.wy-nav-content a, +.wy-nav-content a:visited { + color: #3091d1; +} + +body, +.wy-nav-content-wrap, +.wy-nav-content, +.section, +.highlight, +.rst-content div[class^='highlight'], +.wy-nav-content a, +.btn-neutral, +.btn, +footer, +.wy-nav-side, +.wy-menu-vertical li, +.wy-menu-vertical a, +.wy-side-nav-search .wy-dropdown, +.wy-side-nav-search a, +.wy-side-nav-search input, +html.writer-html4 .rst-content dl:not(.docutils) > dt, +html.writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) + > dt, +.rst-content code, +.rst-content tt, +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list) > dt, +html.writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) + dl:not(.field-list) + > dt, +code, +.rst-content code.xref, +.rst-content tt.xref { + transition: all 0.2s ease-in-out; +} diff --git a/_static/dark_mode_css/dark.css b/_static/dark_mode_css/dark.css new file mode 100644 index 00000000..e863889c --- /dev/null +++ b/_static/dark_mode_css/dark.css @@ -0,0 +1,520 @@ +:root { + --dark-text-color: #c1c1c1; + --dark-link-color: #249ee8; +} + +html[data-theme="dark"] body { + color: #bfbfbf; +} + +html[data-theme="dark"] .wy-nav-content-wrap { + background-color: #101010; +} + +html[data-theme="dark"] .wy-nav-content { + background-color: #141414; +} + +html[data-theme="dark"] .section { + color: var(--dark-text-color); +} + +html[data-theme="dark"] .highlight { + background-color: #17181c; +} + +html[data-theme="dark"] .highlight .nn { + color: var(--dark-text-color); +} + +html[data-theme="dark"] .highlight .nb { + color: #8bb8df; +} + +html[data-theme="dark"] .highlight .nv { + color: #40ffff; +} + +html[data-theme="dark"] .highlight .kn, +html[data-theme="dark"] .highlight .kc, +html[data-theme="dark"] .highlight .k { + color: #41c2ea; +} + +html[data-theme="dark"] .highlight .s1, +html[data-theme="dark"] .highlight .s2 { + color: #b3e87f; +} + +html[data-theme="dark"] .highlight .nt { + color: #ccb350; +} + +html[data-theme="dark"] .highlight .c1 { + color: #686868; +} + +html[data-theme="dark"] .highlight .hll { + background-color: #002c4d; +} + +html[data-theme="dark"] .rst-content div[class^="highlight"] { + border-color: #1a1a1a; +} + +html[data-theme="dark"] .wy-nav-content a, +html[data-theme="dark"] .wy-nav-content a:visited { + color: var(--dark-link-color); +} + +html[data-theme="dark"] .btn-neutral { + background-color: #17181c !important; +} + +html[data-theme="dark"] .btn-neutral:hover { + background-color: #101114 !important; +} + +html[data-theme="dark"] .btn-neutral:visited { + color: #c1c1c1 !important; +} + +html[data-theme="dark"] .btn { + box-shadow: none; +} + +html[data-theme="dark"] footer { + color: #bdbdbd; +} + +html[data-theme="dark"] .wy-nav-side { + background-color: #0d0d0d; +} + +html[data-theme="dark"] .wy-menu-vertical li.current { + background-color: #141414; +} + +html[data-theme="dark"] .wy-menu-vertical li.current > a, +html[data-theme="dark"] .wy-menu-vertical li.on a { + background-color: #141415; + color: var(--dark-text-color); +} + +html[data-theme="dark"] .wy-menu-vertical li.toctree-l1.current > a, +html[data-theme="dark"] .wy-menu-vertical li.current a { + border-color: #0b0c0d; +} + +html[data-theme="dark"] .wy-menu-vertical li.current a { + color: #bbb; +} + +html[data-theme="dark"] .wy-menu-vertical li.current a:hover { + background-color: #222; +} + +html[data-theme="dark"] .wy-menu-vertical a:hover, +html[data-theme="dark"] .wy-menu-vertical li.current > a:hover, +html[data-theme="dark"] .wy-menu-vertical li.on a:hover { + background-color: #1e1e1e; +} + +html[data-theme="dark"] .wy-menu-vertical li.toctree-l2.current > a, +html[data-theme="dark"] + .wy-menu-vertical + li.toctree-l2.current + li.toctree-l3 + > a { + background-color: #18181a; +} + +html[data-theme="dark"] .wy-side-nav-search { + background-color: #0b152d; +} + +html[data-theme="dark"] .wy-side-nav-search .wy-dropdown > a, +html[data-theme="dark"] .wy-side-nav-search > a { + color: #ddd; +} + +html[data-theme="dark"] .wy-side-nav-search input[type="text"] { + border-color: #111; + background-color: #141414; + color: var(--dark-text-color); +} + +html[data-theme="dark"] .theme-switcher { + background-color: #0b0c0d; + color: var(--dark-text-color); +} + +html[data-theme="dark"].writer-html4 .rst-content dl:not(.docutils) > dt, +html[data-theme="dark"].writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not( + .glossary + ):not(.simple) + > dt { + background-color: #0b0b0b; + color: #007dce; + border-color: #282828; +} + +html[data-theme="dark"] .rst-content code, +html[data-theme="dark"] .rst-content tt { + color: var(--dark-text-color); +} + +html[data-theme="dark"].writer-html4 + .rst-content + dl:not(.docutils) + dl:not(.field-list) + > dt, +html[data-theme="dark"].writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not( + .glossary + ):not(.simple) + dl:not(.field-list) + > dt { + background-color: #0f0f0f; + color: #959595; + border-color: #2b2b2b; +} + +html[data-theme="dark"] .rst-content code, +html[data-theme="dark"] .rst-content tt, +html[data-theme="dark"] code { + background-color: #2d2d2d; + border-color: #1c1c1c; +} + +html[data-theme="dark"] .rst-content code.xref, +html[data-theme="dark"] .rst-content tt.xref, +html[data-theme="dark"] a .rst-content code, +html[data-theme="dark"] a .rst-content tt { + color: #cecece; +} + +html[data-theme="dark"] .rst-content .hint, +html[data-theme="dark"] .rst-content .important, +html[data-theme="dark"] .rst-content .tip, +html[data-theme="dark"] .rst-content .wy-alert-success.admonition, +html[data-theme="dark"] .rst-content .wy-alert-success.admonition-todo, +html[data-theme="dark"] .rst-content .wy-alert-success.attention, +html[data-theme="dark"] .rst-content .wy-alert-success.caution, +html[data-theme="dark"] .rst-content .wy-alert-success.danger, +html[data-theme="dark"] .rst-content .wy-alert-success.error, +html[data-theme="dark"] .rst-content .wy-alert-success.note, +html[data-theme="dark"] .rst-content .wy-alert-success.seealso, +html[data-theme="dark"] .rst-content .wy-alert-success.warning, +html[data-theme="dark"] .wy-alert.wy-alert-success { + background-color: #00392e; +} + +html[data-theme="dark"] .rst-content .hint .admonition-title, +html[data-theme="dark"] .rst-content .hint .wy-alert-title, +html[data-theme="dark"] .rst-content .important .admonition-title, +html[data-theme="dark"] .rst-content .important .wy-alert-title, +html[data-theme="dark"] .rst-content .tip .admonition-title, +html[data-theme="dark"] .rst-content .tip .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.admonition-todo + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.admonition-todo + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.admonition + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.admonition + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.attention + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.attention + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.caution + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.caution .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-success.danger .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.danger .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-success.error .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.error .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-success.note .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.note .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.seealso + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.seealso .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-success.warning + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-success.warning .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert.wy-alert-success + .admonition-title, +html[data-theme="dark"] + .wy-alert.wy-alert-success + .rst-content + .admonition-title, +html[data-theme="dark"] .wy-alert.wy-alert-success .wy-alert-title { + background-color: #006a56; +} + +html[data-theme="dark"] .rst-content .admonition, +html[data-theme="dark"] .rst-content .note, +html[data-theme="dark"] .rst-content .seealso, +html[data-theme="dark"] .rst-content .wy-alert-info.admonition, +html[data-theme="dark"] .rst-content .wy-alert-info.admonition-todo, +html[data-theme="dark"] .rst-content .wy-alert-info.attention, +html[data-theme="dark"] .rst-content .wy-alert-info.caution, +html[data-theme="dark"] .rst-content .wy-alert-info.danger, +html[data-theme="dark"] .rst-content .wy-alert-info.error, +html[data-theme="dark"] .rst-content .wy-alert-info.hint, +html[data-theme="dark"] .rst-content .wy-alert-info.important, +html[data-theme="dark"] .rst-content .wy-alert-info.tip, +html[data-theme="dark"] .rst-content .wy-alert-info.warning, +html[data-theme="dark"] .wy-alert.wy-alert-info { + background-color: #002c4d; +} + +html[data-theme="dark"] .rst-content .admonition .admonition-title, +html[data-theme="dark"] .rst-content .note .admonition-title, +html[data-theme="dark"] .rst-content .note .wy-alert-title, +html[data-theme="dark"] .rst-content .seealso .admonition-title, +html[data-theme="dark"] .rst-content .seealso .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-info.admonition-todo + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-info.admonition-todo + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-info.admonition + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.admonition .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.attention .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.attention .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.caution .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.caution .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.danger .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.danger .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.error .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.error .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.hint .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.hint .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.important .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.important .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.tip .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.tip .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-info.warning .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-info.warning .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert.wy-alert-info .admonition-title, +html[data-theme="dark"] .wy-alert.wy-alert-info .rst-content .admonition-title, +html[data-theme="dark"] .wy-alert.wy-alert-info .wy-alert-title { + background-color: #004a7b; +} + +html[data-theme="dark"] .rst-content .admonition-todo, +html[data-theme="dark"] .rst-content .attention, +html[data-theme="dark"] .rst-content .caution, +html[data-theme="dark"] .rst-content .warning, +html[data-theme="dark"] .rst-content .wy-alert-warning.admonition, +html[data-theme="dark"] .rst-content .wy-alert-warning.danger, +html[data-theme="dark"] .rst-content .wy-alert-warning.error, +html[data-theme="dark"] .rst-content .wy-alert-warning.hint, +html[data-theme="dark"] .rst-content .wy-alert-warning.important, +html[data-theme="dark"] .rst-content .wy-alert-warning.note, +html[data-theme="dark"] .rst-content .wy-alert-warning.seealso, +html[data-theme="dark"] .rst-content .wy-alert-warning.tip, +html[data-theme="dark"] .wy-alert.wy-alert-warning { + background-color: #533500; +} + +html[data-theme="dark"] .rst-content .admonition-todo .admonition-title, +html[data-theme="dark"] .rst-content .admonition-todo .wy-alert-title, +html[data-theme="dark"] .rst-content .attention .admonition-title, +html[data-theme="dark"] .rst-content .attention .wy-alert-title, +html[data-theme="dark"] .rst-content .caution .admonition-title, +html[data-theme="dark"] .rst-content .caution .wy-alert-title, +html[data-theme="dark"] .rst-content .warning .admonition-title, +html[data-theme="dark"] .rst-content .warning .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-warning.admonition + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-warning.admonition + .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.danger .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.danger .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.error .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.error .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.hint .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.hint .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-warning.important + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-warning.important + .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.note .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.note .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-warning.seealso + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.seealso .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.tip .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-warning.tip .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert.wy-alert-warning + .admonition-title, +html[data-theme="dark"] + .wy-alert.wy-alert-warning + .rst-content + .admonition-title, +html[data-theme="dark"] .wy-alert.wy-alert-warning .wy-alert-title { + background-color: #803b00; +} + +html[data-theme="dark"] .rst-content .danger, +html[data-theme="dark"] .rst-content .error, +html[data-theme="dark"] .rst-content .wy-alert-danger.admonition, +html[data-theme="dark"] .rst-content .wy-alert-danger.admonition-todo, +html[data-theme="dark"] .rst-content .wy-alert-danger.attention, +html[data-theme="dark"] .rst-content .wy-alert-danger.caution, +html[data-theme="dark"] .rst-content .wy-alert-danger.hint, +html[data-theme="dark"] .rst-content .wy-alert-danger.important, +html[data-theme="dark"] .rst-content .wy-alert-danger.note, +html[data-theme="dark"] .rst-content .wy-alert-danger.seealso, +html[data-theme="dark"] .rst-content .wy-alert-danger.tip, +html[data-theme="dark"] .rst-content .wy-alert-danger.warning, +html[data-theme="dark"] .wy-alert.wy-alert-danger { + background-color: #82231a; +} + +html[data-theme="dark"] .rst-content .danger .admonition-title, +html[data-theme="dark"] .rst-content .danger .wy-alert-title, +html[data-theme="dark"] .rst-content .error .admonition-title, +html[data-theme="dark"] .rst-content .error .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.admonition-todo + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.admonition-todo + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.admonition + .admonition-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.admonition + .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.attention + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.attention .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.caution .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.caution .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.hint .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.hint .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert-danger.important + .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.important .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.note .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.note .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.seealso .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.seealso .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.tip .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.tip .wy-alert-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.warning .admonition-title, +html[data-theme="dark"] .rst-content .wy-alert-danger.warning .wy-alert-title, +html[data-theme="dark"] + .rst-content + .wy-alert.wy-alert-danger + .admonition-title, +html[data-theme="dark"] + .wy-alert.wy-alert-danger + .rst-content + .admonition-title, +html[data-theme="dark"] .wy-alert.wy-alert-danger .wy-alert-title { + background-color: #b9372b; +} + +html[data-theme="dark"] .wy-nav-top { + background-color: #0b152d; +} + +html[data-theme="dark"] .rst-content table.docutils thead, +html[data-theme="dark"] .rst-content table.field-list thead, +html[data-theme="dark"] .wy-table thead { + color: var(--dark-text-color); +} + +html[data-theme="dark"] + .rst-content + table.docutils:not(.field-list) + tr:nth-child(2n-1) + td, +html[data-theme="dark"] .wy-table-backed, +html[data-theme="dark"] html[data-theme="dark"] .wy-table-odd td, +html[data-theme="dark"] .wy-table-striped tr:nth-child(2n-1) td { + background-color: #181818; +} + +html[data-theme="dark"] .rst-content table.docutils td, +html[data-theme="dark"] .wy-table-bordered-all td, +html[data-theme="dark"].writer-html5 .rst-content table.docutils th, +html[data-theme="dark"] .rst-content table.docutils, +html[data-theme="dark"] .wy-table-bordered-all { + border-color: #262626; +} + +html[data-theme="dark"] .rst-content table.docutils caption, +html[data-theme="dark"] .rst-content table.field-list caption, +html[data-theme="dark"] .wy-table caption { + color: var(--dark-text-color); +} + +html[data-theme="dark"] .wy-menu-vertical li.toctree-l3.current > a, +html[data-theme="dark"] + .wy-menu-vertical + li.toctree-l3.current + li.toctree-l4 + > a { + background-color: #18181a; +} + +html[data-theme="dark"] .guilabel { + background-color: #343434; + border-color: #4d4d4d; +} diff --git a/_static/dark_mode_css/general.css b/_static/dark_mode_css/general.css new file mode 100644 index 00000000..aa614f81 --- /dev/null +++ b/_static/dark_mode_css/general.css @@ -0,0 +1,68 @@ +input[type='color'], +input[type='date'], +input[type='datetime-local'], +input[type='datetime'], +input[type='email'], +input[type='month'], +input[type='number'], +input[type='password'], +input[type='search'], +input[type='tel'], +input[type='text'], +input[type='time'], +input[type='url'], +input[type='week'] { + box-shadow: none; +} + +.theme-switcher { + border-radius: 50%; + position: fixed; + right: 1.6em; + bottom: 1.4em; + z-index: 3; + border: none; + height: 2.2em; + width: 2.2em; + background-color: #fcfcfc; + font-size: 20px; + -webkit-box-shadow: 0px 3px 14px 4px rgba(0, 0, 0, 0.62); + box-shadow: 0px 3px 14px 4px rgba(0, 0, 0, 0.62); + color: #404040; + transition: all 0.3s ease-in-out; +} + +body, +.wy-nav-content-wrap, +.wy-nav-content, +.section, +.highlight, +.rst-content div[class^='highlight'], +.wy-nav-content a, +.btn-neutral, +.btn, +footer, +.wy-nav-side, +.wy-menu-vertical li, +.wy-menu-vertical a, +.wy-side-nav-search .wy-dropdown, +.wy-side-nav-search a, +.wy-side-nav-search input, +html.writer-html4 .rst-content dl:not(.docutils) > dt, +html.writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) + > dt, +.rst-content code, +.rst-content tt, +html.writer-html4 .rst-content dl:not(.docutils) dl:not(.field-list) > dt, +html.writer-html5 + .rst-content + dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.glossary):not(.simple) + dl:not(.field-list) + > dt, +code, +.rst-content code.xref, +.rst-content tt.xref { + transition: all 0.2s ease-in-out; +} diff --git a/_static/dark_mode_js/default_dark.js b/_static/dark_mode_js/default_dark.js new file mode 100644 index 00000000..ea63e072 --- /dev/null +++ b/_static/dark_mode_js/default_dark.js @@ -0,0 +1,13 @@ +const loadTheme = () => { + let theme = localStorage.getItem('theme'); + + if (theme !== null) { + if (theme === 'dark') + document.documentElement.setAttribute('data-theme', 'dark'); + } else { + localStorage.setItem('theme', 'dark'); + document.documentElement.setAttribute('data-theme', 'dark'); + } +}; + +loadTheme(); diff --git a/_static/dark_mode_js/default_light.js b/_static/dark_mode_js/default_light.js new file mode 100644 index 00000000..2b19f92e --- /dev/null +++ b/_static/dark_mode_js/default_light.js @@ -0,0 +1,13 @@ +const loadTheme = () => { + let theme = localStorage.getItem('theme'); + + if (theme !== null) { + if (theme === 'dark') + document.documentElement.setAttribute('data-theme', 'dark'); + } else { + localStorage.setItem('theme', 'light'); + document.documentElement.setAttribute('data-theme', 'light'); + } +}; + +loadTheme(); diff --git a/_static/dark_mode_js/theme_switcher.js b/_static/dark_mode_js/theme_switcher.js new file mode 100644 index 00000000..8e260552 --- /dev/null +++ b/_static/dark_mode_js/theme_switcher.js @@ -0,0 +1,39 @@ +const createThemeSwitcher = () => { + let btn = document.createElement('BUTTON'); + btn.className = 'theme-switcher'; + btn.id = 'themeSwitcher'; + btn.innerHTML = + ''; + document.body.appendChild(btn); + + if (localStorage.getItem('theme') === 'dark') $('#themeMoon').hide(0); + else $('#themeSun').hide(0); +}; + +$(document).ready(() => { + createThemeSwitcher(); + $('#themeSwitcher').click(switchTheme); + + $('footer').html( + $('footer').html() + + 'Dark theme provided by MrDogeBro.' + ); +}); + +const switchTheme = () => { + if (localStorage.getItem('theme') === 'dark') { + localStorage.setItem('theme', 'light'); + document.documentElement.setAttribute('data-theme', 'light'); + + $('#themeSun').fadeOut(200, () => { + $('#themeMoon').fadeIn(200); + }); + } else { + localStorage.setItem('theme', 'dark'); + document.documentElement.setAttribute('data-theme', 'dark'); + + $('#themeMoon').fadeOut(200, () => { + $('#themeSun').fadeIn(200); + }); + } +}; diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..d06a71d7 --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..7e4c114f --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css new file mode 100644 index 00000000..33566310 --- /dev/null +++ b/_static/mystnb.4510f1fc1dee50b3e5859aac5469c37c29e427902b24a333a5f9fcb2f0b3ac41.css @@ -0,0 +1,2342 @@ +/* Variables */ +:root { + --mystnb-source-bg-color: #f7f7f7; + --mystnb-stdout-bg-color: #fcfcfc; + --mystnb-stderr-bg-color: #fdd; + --mystnb-traceback-bg-color: #fcfcfc; + --mystnb-source-border-color: #ccc; + --mystnb-source-margin-color: green; + --mystnb-stdout-border-color: #f7f7f7; + --mystnb-stderr-border-color: #f7f7f7; + --mystnb-traceback-border-color: #ffd6d6; + --mystnb-hide-prompt-opacity: 70%; + --mystnb-source-border-radius: .4em; + --mystnb-source-border-width: 1px; +} + +/* Whole cell */ +div.container.cell { + padding-left: 0; + margin-bottom: 1em; +} + +/* Removing all background formatting so we can control at the div level */ +.cell_input div.highlight, +.cell_output pre, +.cell_input pre, +.cell_output .output { + border: none; + box-shadow: none; +} + +.cell_output .output pre, +.cell_input pre { + margin: 0px; +} + +/* Input cells */ +div.cell div.cell_input, +div.cell details.above-input>summary { + padding-left: 0em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + background-color: var(--mystnb-source-bg-color); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; + border-radius: var(--mystnb-source-border-radius); +} + +div.cell_input>div, +div.cell_output div.output>div.highlight { + margin: 0em !important; + border: none !important; +} + +/* All cell outputs */ +.cell_output { + padding-left: 1em; + padding-right: 0em; + margin-top: 1em; +} + +/* Text outputs from cells */ +.cell_output .output.text_plain, +.cell_output .output.traceback, +.cell_output .output.stream, +.cell_output .output.stderr { + margin-top: 1em; + margin-bottom: 0em; + box-shadow: none; +} + +.cell_output .output.text_plain, +.cell_output .output.stream { + background: var(--mystnb-stdout-bg-color); + border: 1px solid var(--mystnb-stdout-border-color); +} + +.cell_output .output.stderr { + background: var(--mystnb-stderr-bg-color); + border: 1px solid var(--mystnb-stderr-border-color); +} + +.cell_output .output.traceback { + background: var(--mystnb-traceback-bg-color); + border: 1px solid var(--mystnb-traceback-border-color); +} + +/* Collapsible cell content */ +div.cell details.above-input div.cell_input { + border-top-left-radius: 0; + border-top-right-radius: 0; + border-top: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; +} + +div.cell div.cell_input.above-output-prompt { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; +} + +div.cell details.above-input>summary { + border-bottom-left-radius: 0; + border-bottom-right-radius: 0; + border-bottom: var(--mystnb-source-border-width) var(--mystnb-source-border-color) dashed; + padding-left: 1em; + margin-bottom: 0; +} + +div.cell details.above-output>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.below-input>summary { + background-color: var(--mystnb-source-bg-color); + padding-left: 1em; + padding-right: 0em; + border: var(--mystnb-source-border-width) var(--mystnb-source-border-color) solid; + border-top: none; + border-bottom-left-radius: var(--mystnb-source-border-radius); + border-bottom-right-radius: var(--mystnb-source-border-radius); + border-left-color: var(--mystnb-source-margin-color); + border-left-width: medium; +} + +div.cell details.hide>summary>span { + opacity: var(--mystnb-hide-prompt-opacity); +} + +div.cell details.hide[open]>summary>span.collapsed { + display: none; +} + +div.cell details.hide:not([open])>summary>span.expanded { + display: none; +} + +@keyframes collapsed-fade-in { + 0% { + opacity: 0; + } + + 100% { + opacity: 1; + } +} +div.cell details.hide[open]>summary~* { + -moz-animation: collapsed-fade-in 0.3s ease-in-out; + -webkit-animation: collapsed-fade-in 0.3s ease-in-out; + animation: collapsed-fade-in 0.3s ease-in-out; +} + +/* Math align to the left */ +.cell_output .MathJax_Display { + text-align: left !important; +} + +/* Pandas tables. Pulled from the Jupyter / nbsphinx CSS */ +div.cell_output table { + border: none; + border-collapse: collapse; + border-spacing: 0; + color: black; + font-size: 1em; + table-layout: fixed; +} + +div.cell_output thead { + border-bottom: 1px solid black; + vertical-align: bottom; +} + +div.cell_output tr, +div.cell_output th, +div.cell_output td { + text-align: right; + vertical-align: middle; + padding: 0.5em 0.5em; + line-height: normal; + white-space: normal; + max-width: none; + border: none; +} + +div.cell_output th { + font-weight: bold; +} + +div.cell_output tbody tr:nth-child(odd) { + background: #f5f5f5; +} + +div.cell_output tbody tr:hover { + background: rgba(66, 165, 245, 0.2); +} + +/** source code line numbers **/ +span.linenos { + opacity: 0.5; +} + +/* Inline text from `paste` operation */ + +span.pasted-text { + font-weight: bold; +} + +span.pasted-inline img { + max-height: 2em; +} + +tbody span.pasted-inline img { + max-height: none; +} + +/* Font colors for translated ANSI escape sequences +Color values are copied from Jupyter Notebook +https://github.com/jupyter/notebook/blob/52581f8eda9b319eb0390ac77fe5903c38f81e3e/notebook/static/notebook/less/ansicolors.less#L14-L21 +Background colors from +https://nbsphinx.readthedocs.io/en/latest/code-cells.html#ANSI-Colors +*/ +div.highlight .-Color-Bold { + font-weight: bold; +} + +div.highlight .-Color[class*=-Black] { + color: #3E424D +} + +div.highlight .-Color[class*=-Red] { + color: #E75C58 +} + +div.highlight .-Color[class*=-Green] { + color: #00A250 +} + +div.highlight .-Color[class*=-Yellow] { + color: #DDB62B +} + +div.highlight .-Color[class*=-Blue] { + color: #208FFB +} + +div.highlight .-Color[class*=-Magenta] { + color: #D160C4 +} + +div.highlight .-Color[class*=-Cyan] { + color: #60C6C8 +} + +div.highlight .-Color[class*=-White] { + color: #C5C1B4 +} + +div.highlight .-Color[class*=-BGBlack] { + background-color: #3E424D +} + +div.highlight .-Color[class*=-BGRed] { + background-color: #E75C58 +} + +div.highlight .-Color[class*=-BGGreen] { + background-color: #00A250 +} + +div.highlight .-Color[class*=-BGYellow] { + background-color: #DDB62B +} + +div.highlight .-Color[class*=-BGBlue] { + background-color: #208FFB +} + +div.highlight .-Color[class*=-BGMagenta] { + background-color: #D160C4 +} + +div.highlight .-Color[class*=-BGCyan] { + background-color: #60C6C8 +} + +div.highlight .-Color[class*=-BGWhite] { + background-color: #C5C1B4 +} + +/* Font colors for 8-bit ANSI */ + +div.highlight .-Color[class*=-C0] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC0] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C1] { + color: #800000 +} + +div.highlight .-Color[class*=-BGC1] { + background-color: #800000 +} + +div.highlight .-Color[class*=-C2] { + color: #008000 +} + +div.highlight .-Color[class*=-BGC2] { + background-color: #008000 +} + +div.highlight .-Color[class*=-C3] { + color: #808000 +} + +div.highlight .-Color[class*=-BGC3] { + background-color: #808000 +} + +div.highlight .-Color[class*=-C4] { + color: #000080 +} + +div.highlight .-Color[class*=-BGC4] { + background-color: #000080 +} + +div.highlight .-Color[class*=-C5] { + color: #800080 +} + +div.highlight .-Color[class*=-BGC5] { + background-color: #800080 +} + +div.highlight .-Color[class*=-C6] { + color: #008080 +} + +div.highlight .-Color[class*=-BGC6] { + background-color: #008080 +} + +div.highlight .-Color[class*=-C7] { + color: #C0C0C0 +} + +div.highlight .-Color[class*=-BGC7] { + background-color: #C0C0C0 +} + +div.highlight .-Color[class*=-C8] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC8] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C9] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC9] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C10] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC10] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C11] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC11] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C12] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC12] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C13] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC13] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C14] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC14] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C15] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC15] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C16] { + color: #000000 +} + +div.highlight .-Color[class*=-BGC16] { + background-color: #000000 +} + +div.highlight .-Color[class*=-C17] { + color: #00005F +} + +div.highlight .-Color[class*=-BGC17] { + background-color: #00005F +} + +div.highlight .-Color[class*=-C18] { + color: #000087 +} + +div.highlight .-Color[class*=-BGC18] { + background-color: #000087 +} + +div.highlight .-Color[class*=-C19] { + color: #0000AF +} + +div.highlight .-Color[class*=-BGC19] { + background-color: #0000AF +} + +div.highlight .-Color[class*=-C20] { + color: #0000D7 +} + +div.highlight .-Color[class*=-BGC20] { + background-color: #0000D7 +} + +div.highlight .-Color[class*=-C21] { + color: #0000FF +} + +div.highlight .-Color[class*=-BGC21] { + background-color: #0000FF +} + +div.highlight .-Color[class*=-C22] { + color: #005F00 +} + +div.highlight .-Color[class*=-BGC22] { + background-color: #005F00 +} + +div.highlight .-Color[class*=-C23] { + color: #005F5F +} + +div.highlight .-Color[class*=-BGC23] { + background-color: #005F5F +} + +div.highlight .-Color[class*=-C24] { + color: #005F87 +} + +div.highlight .-Color[class*=-BGC24] { + background-color: #005F87 +} + +div.highlight .-Color[class*=-C25] { + color: #005FAF +} + +div.highlight .-Color[class*=-BGC25] { + background-color: #005FAF +} + +div.highlight .-Color[class*=-C26] { + color: #005FD7 +} + +div.highlight .-Color[class*=-BGC26] { + background-color: #005FD7 +} + +div.highlight .-Color[class*=-C27] { + color: #005FFF +} + +div.highlight .-Color[class*=-BGC27] { + background-color: #005FFF +} + +div.highlight .-Color[class*=-C28] { + color: #008700 +} + +div.highlight .-Color[class*=-BGC28] { + background-color: #008700 +} + +div.highlight .-Color[class*=-C29] { + color: #00875F +} + +div.highlight .-Color[class*=-BGC29] { + background-color: #00875F +} + +div.highlight .-Color[class*=-C30] { + color: #008787 +} + +div.highlight .-Color[class*=-BGC30] { + background-color: #008787 +} + +div.highlight .-Color[class*=-C31] { + color: #0087AF +} + +div.highlight .-Color[class*=-BGC31] { + background-color: #0087AF +} + +div.highlight .-Color[class*=-C32] { + color: #0087D7 +} + +div.highlight .-Color[class*=-BGC32] { + background-color: #0087D7 +} + +div.highlight .-Color[class*=-C33] { + color: #0087FF +} + +div.highlight .-Color[class*=-BGC33] { + background-color: #0087FF +} + +div.highlight .-Color[class*=-C34] { + color: #00AF00 +} + +div.highlight .-Color[class*=-BGC34] { + background-color: #00AF00 +} + +div.highlight .-Color[class*=-C35] { + color: #00AF5F +} + +div.highlight .-Color[class*=-BGC35] { + background-color: #00AF5F +} + +div.highlight .-Color[class*=-C36] { + color: #00AF87 +} + +div.highlight .-Color[class*=-BGC36] { + background-color: #00AF87 +} + +div.highlight .-Color[class*=-C37] { + color: #00AFAF +} + +div.highlight .-Color[class*=-BGC37] { + background-color: #00AFAF +} + +div.highlight .-Color[class*=-C38] { + color: #00AFD7 +} + +div.highlight .-Color[class*=-BGC38] { + background-color: #00AFD7 +} + +div.highlight .-Color[class*=-C39] { + color: #00AFFF +} + +div.highlight .-Color[class*=-BGC39] { + background-color: #00AFFF +} + +div.highlight .-Color[class*=-C40] { + color: #00D700 +} + +div.highlight .-Color[class*=-BGC40] { + background-color: #00D700 +} + +div.highlight .-Color[class*=-C41] { + color: #00D75F +} + +div.highlight .-Color[class*=-BGC41] { + background-color: #00D75F +} + +div.highlight .-Color[class*=-C42] { + color: #00D787 +} + +div.highlight .-Color[class*=-BGC42] { + background-color: #00D787 +} + +div.highlight .-Color[class*=-C43] { + color: #00D7AF +} + +div.highlight .-Color[class*=-BGC43] { + background-color: #00D7AF +} + +div.highlight .-Color[class*=-C44] { + color: #00D7D7 +} + +div.highlight .-Color[class*=-BGC44] { + background-color: #00D7D7 +} + +div.highlight .-Color[class*=-C45] { + color: #00D7FF +} + +div.highlight .-Color[class*=-BGC45] { + background-color: #00D7FF +} + +div.highlight .-Color[class*=-C46] { + color: #00FF00 +} + +div.highlight .-Color[class*=-BGC46] { + background-color: #00FF00 +} + +div.highlight .-Color[class*=-C47] { + color: #00FF5F +} + +div.highlight .-Color[class*=-BGC47] { + background-color: #00FF5F +} + +div.highlight .-Color[class*=-C48] { + color: #00FF87 +} + +div.highlight .-Color[class*=-BGC48] { + background-color: #00FF87 +} + +div.highlight .-Color[class*=-C49] { + color: #00FFAF +} + +div.highlight .-Color[class*=-BGC49] { + background-color: #00FFAF +} + +div.highlight .-Color[class*=-C50] { + color: #00FFD7 +} + +div.highlight .-Color[class*=-BGC50] { + background-color: #00FFD7 +} + +div.highlight .-Color[class*=-C51] { + color: #00FFFF +} + +div.highlight .-Color[class*=-BGC51] { + background-color: #00FFFF +} + +div.highlight .-Color[class*=-C52] { + color: #5F0000 +} + +div.highlight .-Color[class*=-BGC52] { + background-color: #5F0000 +} + +div.highlight .-Color[class*=-C53] { + color: #5F005F +} + +div.highlight .-Color[class*=-BGC53] { + background-color: #5F005F +} + +div.highlight .-Color[class*=-C54] { + color: #5F0087 +} + +div.highlight .-Color[class*=-BGC54] { + background-color: #5F0087 +} + +div.highlight .-Color[class*=-C55] { + color: #5F00AF +} + +div.highlight .-Color[class*=-BGC55] { + background-color: #5F00AF +} + +div.highlight .-Color[class*=-C56] { + color: #5F00D7 +} + +div.highlight .-Color[class*=-BGC56] { + background-color: #5F00D7 +} + +div.highlight .-Color[class*=-C57] { + color: #5F00FF +} + +div.highlight .-Color[class*=-BGC57] { + background-color: #5F00FF +} + +div.highlight .-Color[class*=-C58] { + color: #5F5F00 +} + +div.highlight .-Color[class*=-BGC58] { + background-color: #5F5F00 +} + +div.highlight .-Color[class*=-C59] { + color: #5F5F5F +} + +div.highlight .-Color[class*=-BGC59] { + background-color: #5F5F5F +} + +div.highlight .-Color[class*=-C60] { + color: #5F5F87 +} + +div.highlight .-Color[class*=-BGC60] { + background-color: #5F5F87 +} + +div.highlight .-Color[class*=-C61] { + color: #5F5FAF +} + +div.highlight .-Color[class*=-BGC61] { + background-color: #5F5FAF +} + +div.highlight .-Color[class*=-C62] { + color: #5F5FD7 +} + +div.highlight .-Color[class*=-BGC62] { + background-color: #5F5FD7 +} + +div.highlight .-Color[class*=-C63] { + color: #5F5FFF +} + +div.highlight .-Color[class*=-BGC63] { + background-color: #5F5FFF +} + +div.highlight .-Color[class*=-C64] { + color: #5F8700 +} + +div.highlight .-Color[class*=-BGC64] { + background-color: #5F8700 +} + +div.highlight .-Color[class*=-C65] { + color: #5F875F +} + +div.highlight .-Color[class*=-BGC65] { + background-color: #5F875F +} + +div.highlight .-Color[class*=-C66] { + color: #5F8787 +} + +div.highlight .-Color[class*=-BGC66] { + background-color: #5F8787 +} + +div.highlight .-Color[class*=-C67] { + color: #5F87AF +} + +div.highlight .-Color[class*=-BGC67] { + background-color: #5F87AF +} + +div.highlight .-Color[class*=-C68] { + color: #5F87D7 +} + +div.highlight .-Color[class*=-BGC68] { + background-color: #5F87D7 +} + +div.highlight .-Color[class*=-C69] { + color: #5F87FF +} + +div.highlight .-Color[class*=-BGC69] { + background-color: #5F87FF +} + +div.highlight .-Color[class*=-C70] { + color: #5FAF00 +} + +div.highlight .-Color[class*=-BGC70] { + background-color: #5FAF00 +} + +div.highlight .-Color[class*=-C71] { + color: #5FAF5F +} + +div.highlight .-Color[class*=-BGC71] { + background-color: #5FAF5F +} + +div.highlight .-Color[class*=-C72] { + color: #5FAF87 +} + +div.highlight .-Color[class*=-BGC72] { + background-color: #5FAF87 +} + +div.highlight .-Color[class*=-C73] { + color: #5FAFAF +} + +div.highlight .-Color[class*=-BGC73] { + background-color: #5FAFAF +} + +div.highlight .-Color[class*=-C74] { + color: #5FAFD7 +} + +div.highlight .-Color[class*=-BGC74] { + background-color: #5FAFD7 +} + +div.highlight .-Color[class*=-C75] { + color: #5FAFFF +} + +div.highlight .-Color[class*=-BGC75] { + background-color: #5FAFFF +} + +div.highlight .-Color[class*=-C76] { + color: #5FD700 +} + +div.highlight .-Color[class*=-BGC76] { + background-color: #5FD700 +} + +div.highlight .-Color[class*=-C77] { + color: #5FD75F +} + +div.highlight .-Color[class*=-BGC77] { + background-color: #5FD75F +} + +div.highlight .-Color[class*=-C78] { + color: #5FD787 +} + +div.highlight .-Color[class*=-BGC78] { + background-color: #5FD787 +} + +div.highlight .-Color[class*=-C79] { + color: #5FD7AF +} + +div.highlight .-Color[class*=-BGC79] { + background-color: #5FD7AF +} + +div.highlight .-Color[class*=-C80] { + color: #5FD7D7 +} + +div.highlight .-Color[class*=-BGC80] { + background-color: #5FD7D7 +} + +div.highlight .-Color[class*=-C81] { + color: #5FD7FF +} + +div.highlight .-Color[class*=-BGC81] { + background-color: #5FD7FF +} + +div.highlight .-Color[class*=-C82] { + color: #5FFF00 +} + +div.highlight .-Color[class*=-BGC82] { + background-color: #5FFF00 +} + +div.highlight .-Color[class*=-C83] { + color: #5FFF5F +} + +div.highlight .-Color[class*=-BGC83] { + background-color: #5FFF5F +} + +div.highlight .-Color[class*=-C84] { + color: #5FFF87 +} + +div.highlight .-Color[class*=-BGC84] { + background-color: #5FFF87 +} + +div.highlight .-Color[class*=-C85] { + color: #5FFFAF +} + +div.highlight .-Color[class*=-BGC85] { + background-color: #5FFFAF +} + +div.highlight .-Color[class*=-C86] { + color: #5FFFD7 +} + +div.highlight .-Color[class*=-BGC86] { + background-color: #5FFFD7 +} + +div.highlight .-Color[class*=-C87] { + color: #5FFFFF +} + +div.highlight .-Color[class*=-BGC87] { + background-color: #5FFFFF +} + +div.highlight .-Color[class*=-C88] { + color: #870000 +} + +div.highlight .-Color[class*=-BGC88] { + background-color: #870000 +} + +div.highlight .-Color[class*=-C89] { + color: #87005F +} + +div.highlight .-Color[class*=-BGC89] { + background-color: #87005F +} + +div.highlight .-Color[class*=-C90] { + color: #870087 +} + +div.highlight .-Color[class*=-BGC90] { + background-color: #870087 +} + +div.highlight .-Color[class*=-C91] { + color: #8700AF +} + +div.highlight .-Color[class*=-BGC91] { + background-color: #8700AF +} + +div.highlight .-Color[class*=-C92] { + color: #8700D7 +} + +div.highlight .-Color[class*=-BGC92] { + background-color: #8700D7 +} + +div.highlight .-Color[class*=-C93] { + color: #8700FF +} + +div.highlight .-Color[class*=-BGC93] { + background-color: #8700FF +} + +div.highlight .-Color[class*=-C94] { + color: #875F00 +} + +div.highlight .-Color[class*=-BGC94] { + background-color: #875F00 +} + +div.highlight .-Color[class*=-C95] { + color: #875F5F +} + +div.highlight .-Color[class*=-BGC95] { + background-color: #875F5F +} + +div.highlight .-Color[class*=-C96] { + color: #875F87 +} + +div.highlight .-Color[class*=-BGC96] { + background-color: #875F87 +} + +div.highlight .-Color[class*=-C97] { + color: #875FAF +} + +div.highlight .-Color[class*=-BGC97] { + background-color: #875FAF +} + +div.highlight .-Color[class*=-C98] { + color: #875FD7 +} + +div.highlight .-Color[class*=-BGC98] { + background-color: #875FD7 +} + +div.highlight .-Color[class*=-C99] { + color: #875FFF +} + +div.highlight .-Color[class*=-BGC99] { + background-color: #875FFF +} + +div.highlight .-Color[class*=-C100] { + color: #878700 +} + +div.highlight .-Color[class*=-BGC100] { + background-color: #878700 +} + +div.highlight .-Color[class*=-C101] { + color: #87875F +} + +div.highlight .-Color[class*=-BGC101] { + background-color: #87875F +} + +div.highlight .-Color[class*=-C102] { + color: #878787 +} + +div.highlight .-Color[class*=-BGC102] { + background-color: #878787 +} + +div.highlight .-Color[class*=-C103] { + color: #8787AF +} + +div.highlight .-Color[class*=-BGC103] { + background-color: #8787AF +} + +div.highlight .-Color[class*=-C104] { + color: #8787D7 +} + +div.highlight .-Color[class*=-BGC104] { + background-color: #8787D7 +} + +div.highlight .-Color[class*=-C105] { + color: #8787FF +} + +div.highlight .-Color[class*=-BGC105] { + background-color: #8787FF +} + +div.highlight .-Color[class*=-C106] { + color: #87AF00 +} + +div.highlight .-Color[class*=-BGC106] { + background-color: #87AF00 +} + +div.highlight .-Color[class*=-C107] { + color: #87AF5F +} + +div.highlight .-Color[class*=-BGC107] { + background-color: #87AF5F +} + +div.highlight .-Color[class*=-C108] { + color: #87AF87 +} + +div.highlight .-Color[class*=-BGC108] { + background-color: #87AF87 +} + +div.highlight .-Color[class*=-C109] { + color: #87AFAF +} + +div.highlight .-Color[class*=-BGC109] { + background-color: #87AFAF +} + +div.highlight .-Color[class*=-C110] { + color: #87AFD7 +} + +div.highlight .-Color[class*=-BGC110] { + background-color: #87AFD7 +} + +div.highlight .-Color[class*=-C111] { + color: #87AFFF +} + +div.highlight .-Color[class*=-BGC111] { + background-color: #87AFFF +} + +div.highlight .-Color[class*=-C112] { + color: #87D700 +} + +div.highlight .-Color[class*=-BGC112] { + background-color: #87D700 +} + +div.highlight .-Color[class*=-C113] { + color: #87D75F +} + +div.highlight .-Color[class*=-BGC113] { + background-color: #87D75F +} + +div.highlight .-Color[class*=-C114] { + color: #87D787 +} + +div.highlight .-Color[class*=-BGC114] { + background-color: #87D787 +} + +div.highlight .-Color[class*=-C115] { + color: #87D7AF +} + +div.highlight .-Color[class*=-BGC115] { + background-color: #87D7AF +} + +div.highlight .-Color[class*=-C116] { + color: #87D7D7 +} + +div.highlight .-Color[class*=-BGC116] { + background-color: #87D7D7 +} + +div.highlight .-Color[class*=-C117] { + color: #87D7FF +} + +div.highlight .-Color[class*=-BGC117] { + background-color: #87D7FF +} + +div.highlight .-Color[class*=-C118] { + color: #87FF00 +} + +div.highlight .-Color[class*=-BGC118] { + background-color: #87FF00 +} + +div.highlight .-Color[class*=-C119] { + color: #87FF5F +} + +div.highlight .-Color[class*=-BGC119] { + background-color: #87FF5F +} + +div.highlight .-Color[class*=-C120] { + color: #87FF87 +} + +div.highlight .-Color[class*=-BGC120] { + background-color: #87FF87 +} + +div.highlight .-Color[class*=-C121] { + color: #87FFAF +} + +div.highlight .-Color[class*=-BGC121] { + background-color: #87FFAF +} + +div.highlight .-Color[class*=-C122] { + color: #87FFD7 +} + +div.highlight .-Color[class*=-BGC122] { + background-color: #87FFD7 +} + +div.highlight .-Color[class*=-C123] { + color: #87FFFF +} + +div.highlight .-Color[class*=-BGC123] { + background-color: #87FFFF +} + +div.highlight .-Color[class*=-C124] { + color: #AF0000 +} + +div.highlight .-Color[class*=-BGC124] { + background-color: #AF0000 +} + +div.highlight .-Color[class*=-C125] { + color: #AF005F +} + +div.highlight .-Color[class*=-BGC125] { + background-color: #AF005F +} + +div.highlight .-Color[class*=-C126] { + color: #AF0087 +} + +div.highlight .-Color[class*=-BGC126] { + background-color: #AF0087 +} + +div.highlight .-Color[class*=-C127] { + color: #AF00AF +} + +div.highlight .-Color[class*=-BGC127] { + background-color: #AF00AF +} + +div.highlight .-Color[class*=-C128] { + color: #AF00D7 +} + +div.highlight .-Color[class*=-BGC128] { + background-color: #AF00D7 +} + +div.highlight .-Color[class*=-C129] { + color: #AF00FF +} + +div.highlight .-Color[class*=-BGC129] { + background-color: #AF00FF +} + +div.highlight .-Color[class*=-C130] { + color: #AF5F00 +} + +div.highlight .-Color[class*=-BGC130] { + background-color: #AF5F00 +} + +div.highlight .-Color[class*=-C131] { + color: #AF5F5F +} + +div.highlight .-Color[class*=-BGC131] { + background-color: #AF5F5F +} + +div.highlight .-Color[class*=-C132] { + color: #AF5F87 +} + +div.highlight .-Color[class*=-BGC132] { + background-color: #AF5F87 +} + +div.highlight .-Color[class*=-C133] { + color: #AF5FAF +} + +div.highlight .-Color[class*=-BGC133] { + background-color: #AF5FAF +} + +div.highlight .-Color[class*=-C134] { + color: #AF5FD7 +} + +div.highlight .-Color[class*=-BGC134] { + background-color: #AF5FD7 +} + +div.highlight .-Color[class*=-C135] { + color: #AF5FFF +} + +div.highlight .-Color[class*=-BGC135] { + background-color: #AF5FFF +} + +div.highlight .-Color[class*=-C136] { + color: #AF8700 +} + +div.highlight .-Color[class*=-BGC136] { + background-color: #AF8700 +} + +div.highlight .-Color[class*=-C137] { + color: #AF875F +} + +div.highlight .-Color[class*=-BGC137] { + background-color: #AF875F +} + +div.highlight .-Color[class*=-C138] { + color: #AF8787 +} + +div.highlight .-Color[class*=-BGC138] { + background-color: #AF8787 +} + +div.highlight .-Color[class*=-C139] { + color: #AF87AF +} + +div.highlight .-Color[class*=-BGC139] { + background-color: #AF87AF +} + +div.highlight .-Color[class*=-C140] { + color: #AF87D7 +} + +div.highlight .-Color[class*=-BGC140] { + background-color: #AF87D7 +} + +div.highlight .-Color[class*=-C141] { + color: #AF87FF +} + +div.highlight .-Color[class*=-BGC141] { + background-color: #AF87FF +} + +div.highlight .-Color[class*=-C142] { + color: #AFAF00 +} + +div.highlight .-Color[class*=-BGC142] { + background-color: #AFAF00 +} + +div.highlight .-Color[class*=-C143] { + color: #AFAF5F +} + +div.highlight .-Color[class*=-BGC143] { + background-color: #AFAF5F +} + +div.highlight .-Color[class*=-C144] { + color: #AFAF87 +} + +div.highlight .-Color[class*=-BGC144] { + background-color: #AFAF87 +} + +div.highlight .-Color[class*=-C145] { + color: #AFAFAF +} + +div.highlight .-Color[class*=-BGC145] { + background-color: #AFAFAF +} + +div.highlight .-Color[class*=-C146] { + color: #AFAFD7 +} + +div.highlight .-Color[class*=-BGC146] { + background-color: #AFAFD7 +} + +div.highlight .-Color[class*=-C147] { + color: #AFAFFF +} + +div.highlight .-Color[class*=-BGC147] { + background-color: #AFAFFF +} + +div.highlight .-Color[class*=-C148] { + color: #AFD700 +} + +div.highlight .-Color[class*=-BGC148] { + background-color: #AFD700 +} + +div.highlight .-Color[class*=-C149] { + color: #AFD75F +} + +div.highlight .-Color[class*=-BGC149] { + background-color: #AFD75F +} + +div.highlight .-Color[class*=-C150] { + color: #AFD787 +} + +div.highlight .-Color[class*=-BGC150] { + background-color: #AFD787 +} + +div.highlight .-Color[class*=-C151] { + color: #AFD7AF +} + +div.highlight .-Color[class*=-BGC151] { + background-color: #AFD7AF +} + +div.highlight .-Color[class*=-C152] { + color: #AFD7D7 +} + +div.highlight .-Color[class*=-BGC152] { + background-color: #AFD7D7 +} + +div.highlight .-Color[class*=-C153] { + color: #AFD7FF +} + +div.highlight .-Color[class*=-BGC153] { + background-color: #AFD7FF +} + +div.highlight .-Color[class*=-C154] { + color: #AFFF00 +} + +div.highlight .-Color[class*=-BGC154] { + background-color: #AFFF00 +} + +div.highlight .-Color[class*=-C155] { + color: #AFFF5F +} + +div.highlight .-Color[class*=-BGC155] { + background-color: #AFFF5F +} + +div.highlight .-Color[class*=-C156] { + color: #AFFF87 +} + +div.highlight .-Color[class*=-BGC156] { + background-color: #AFFF87 +} + +div.highlight .-Color[class*=-C157] { + color: #AFFFAF +} + +div.highlight .-Color[class*=-BGC157] { + background-color: #AFFFAF +} + +div.highlight .-Color[class*=-C158] { + color: #AFFFD7 +} + +div.highlight .-Color[class*=-BGC158] { + background-color: #AFFFD7 +} + +div.highlight .-Color[class*=-C159] { + color: #AFFFFF +} + +div.highlight .-Color[class*=-BGC159] { + background-color: #AFFFFF +} + +div.highlight .-Color[class*=-C160] { + color: #D70000 +} + +div.highlight .-Color[class*=-BGC160] { + background-color: #D70000 +} + +div.highlight .-Color[class*=-C161] { + color: #D7005F +} + +div.highlight .-Color[class*=-BGC161] { + background-color: #D7005F +} + +div.highlight .-Color[class*=-C162] { + color: #D70087 +} + +div.highlight .-Color[class*=-BGC162] { + background-color: #D70087 +} + +div.highlight .-Color[class*=-C163] { + color: #D700AF +} + +div.highlight .-Color[class*=-BGC163] { + background-color: #D700AF +} + +div.highlight .-Color[class*=-C164] { + color: #D700D7 +} + +div.highlight .-Color[class*=-BGC164] { + background-color: #D700D7 +} + +div.highlight .-Color[class*=-C165] { + color: #D700FF +} + +div.highlight .-Color[class*=-BGC165] { + background-color: #D700FF +} + +div.highlight .-Color[class*=-C166] { + color: #D75F00 +} + +div.highlight .-Color[class*=-BGC166] { + background-color: #D75F00 +} + +div.highlight .-Color[class*=-C167] { + color: #D75F5F +} + +div.highlight .-Color[class*=-BGC167] { + background-color: #D75F5F +} + +div.highlight .-Color[class*=-C168] { + color: #D75F87 +} + +div.highlight .-Color[class*=-BGC168] { + background-color: #D75F87 +} + +div.highlight .-Color[class*=-C169] { + color: #D75FAF +} + +div.highlight .-Color[class*=-BGC169] { + background-color: #D75FAF +} + +div.highlight .-Color[class*=-C170] { + color: #D75FD7 +} + +div.highlight .-Color[class*=-BGC170] { + background-color: #D75FD7 +} + +div.highlight .-Color[class*=-C171] { + color: #D75FFF +} + +div.highlight .-Color[class*=-BGC171] { + background-color: #D75FFF +} + +div.highlight .-Color[class*=-C172] { + color: #D78700 +} + +div.highlight .-Color[class*=-BGC172] { + background-color: #D78700 +} + +div.highlight .-Color[class*=-C173] { + color: #D7875F +} + +div.highlight .-Color[class*=-BGC173] { + background-color: #D7875F +} + +div.highlight .-Color[class*=-C174] { + color: #D78787 +} + +div.highlight .-Color[class*=-BGC174] { + background-color: #D78787 +} + +div.highlight .-Color[class*=-C175] { + color: #D787AF +} + +div.highlight .-Color[class*=-BGC175] { + background-color: #D787AF +} + +div.highlight .-Color[class*=-C176] { + color: #D787D7 +} + +div.highlight .-Color[class*=-BGC176] { + background-color: #D787D7 +} + +div.highlight .-Color[class*=-C177] { + color: #D787FF +} + +div.highlight .-Color[class*=-BGC177] { + background-color: #D787FF +} + +div.highlight .-Color[class*=-C178] { + color: #D7AF00 +} + +div.highlight .-Color[class*=-BGC178] { + background-color: #D7AF00 +} + +div.highlight .-Color[class*=-C179] { + color: #D7AF5F +} + +div.highlight .-Color[class*=-BGC179] { + background-color: #D7AF5F +} + +div.highlight .-Color[class*=-C180] { + color: #D7AF87 +} + +div.highlight .-Color[class*=-BGC180] { + background-color: #D7AF87 +} + +div.highlight .-Color[class*=-C181] { + color: #D7AFAF +} + +div.highlight .-Color[class*=-BGC181] { + background-color: #D7AFAF +} + +div.highlight .-Color[class*=-C182] { + color: #D7AFD7 +} + +div.highlight .-Color[class*=-BGC182] { + background-color: #D7AFD7 +} + +div.highlight .-Color[class*=-C183] { + color: #D7AFFF +} + +div.highlight .-Color[class*=-BGC183] { + background-color: #D7AFFF +} + +div.highlight .-Color[class*=-C184] { + color: #D7D700 +} + +div.highlight .-Color[class*=-BGC184] { + background-color: #D7D700 +} + +div.highlight .-Color[class*=-C185] { + color: #D7D75F +} + +div.highlight .-Color[class*=-BGC185] { + background-color: #D7D75F +} + +div.highlight .-Color[class*=-C186] { + color: #D7D787 +} + +div.highlight .-Color[class*=-BGC186] { + background-color: #D7D787 +} + +div.highlight .-Color[class*=-C187] { + color: #D7D7AF +} + +div.highlight .-Color[class*=-BGC187] { + background-color: #D7D7AF +} + +div.highlight .-Color[class*=-C188] { + color: #D7D7D7 +} + +div.highlight .-Color[class*=-BGC188] { + background-color: #D7D7D7 +} + +div.highlight .-Color[class*=-C189] { + color: #D7D7FF +} + +div.highlight .-Color[class*=-BGC189] { + background-color: #D7D7FF +} + +div.highlight .-Color[class*=-C190] { + color: #D7FF00 +} + +div.highlight .-Color[class*=-BGC190] { + background-color: #D7FF00 +} + +div.highlight .-Color[class*=-C191] { + color: #D7FF5F +} + +div.highlight .-Color[class*=-BGC191] { + background-color: #D7FF5F +} + +div.highlight .-Color[class*=-C192] { + color: #D7FF87 +} + +div.highlight .-Color[class*=-BGC192] { + background-color: #D7FF87 +} + +div.highlight .-Color[class*=-C193] { + color: #D7FFAF +} + +div.highlight .-Color[class*=-BGC193] { + background-color: #D7FFAF +} + +div.highlight .-Color[class*=-C194] { + color: #D7FFD7 +} + +div.highlight .-Color[class*=-BGC194] { + background-color: #D7FFD7 +} + +div.highlight .-Color[class*=-C195] { + color: #D7FFFF +} + +div.highlight .-Color[class*=-BGC195] { + background-color: #D7FFFF +} + +div.highlight .-Color[class*=-C196] { + color: #FF0000 +} + +div.highlight .-Color[class*=-BGC196] { + background-color: #FF0000 +} + +div.highlight .-Color[class*=-C197] { + color: #FF005F +} + +div.highlight .-Color[class*=-BGC197] { + background-color: #FF005F +} + +div.highlight .-Color[class*=-C198] { + color: #FF0087 +} + +div.highlight .-Color[class*=-BGC198] { + background-color: #FF0087 +} + +div.highlight .-Color[class*=-C199] { + color: #FF00AF +} + +div.highlight .-Color[class*=-BGC199] { + background-color: #FF00AF +} + +div.highlight .-Color[class*=-C200] { + color: #FF00D7 +} + +div.highlight .-Color[class*=-BGC200] { + background-color: #FF00D7 +} + +div.highlight .-Color[class*=-C201] { + color: #FF00FF +} + +div.highlight .-Color[class*=-BGC201] { + background-color: #FF00FF +} + +div.highlight .-Color[class*=-C202] { + color: #FF5F00 +} + +div.highlight .-Color[class*=-BGC202] { + background-color: #FF5F00 +} + +div.highlight .-Color[class*=-C203] { + color: #FF5F5F +} + +div.highlight .-Color[class*=-BGC203] { + background-color: #FF5F5F +} + +div.highlight .-Color[class*=-C204] { + color: #FF5F87 +} + +div.highlight .-Color[class*=-BGC204] { + background-color: #FF5F87 +} + +div.highlight .-Color[class*=-C205] { + color: #FF5FAF +} + +div.highlight .-Color[class*=-BGC205] { + background-color: #FF5FAF +} + +div.highlight .-Color[class*=-C206] { + color: #FF5FD7 +} + +div.highlight .-Color[class*=-BGC206] { + background-color: #FF5FD7 +} + +div.highlight .-Color[class*=-C207] { + color: #FF5FFF +} + +div.highlight .-Color[class*=-BGC207] { + background-color: #FF5FFF +} + +div.highlight .-Color[class*=-C208] { + color: #FF8700 +} + +div.highlight .-Color[class*=-BGC208] { + background-color: #FF8700 +} + +div.highlight .-Color[class*=-C209] { + color: #FF875F +} + +div.highlight .-Color[class*=-BGC209] { + background-color: #FF875F +} + +div.highlight .-Color[class*=-C210] { + color: #FF8787 +} + +div.highlight .-Color[class*=-BGC210] { + background-color: #FF8787 +} + +div.highlight .-Color[class*=-C211] { + color: #FF87AF +} + +div.highlight .-Color[class*=-BGC211] { + background-color: #FF87AF +} + +div.highlight .-Color[class*=-C212] { + color: #FF87D7 +} + +div.highlight .-Color[class*=-BGC212] { + background-color: #FF87D7 +} + +div.highlight .-Color[class*=-C213] { + color: #FF87FF +} + +div.highlight .-Color[class*=-BGC213] { + background-color: #FF87FF +} + +div.highlight .-Color[class*=-C214] { + color: #FFAF00 +} + +div.highlight .-Color[class*=-BGC214] { + background-color: #FFAF00 +} + +div.highlight .-Color[class*=-C215] { + color: #FFAF5F +} + +div.highlight .-Color[class*=-BGC215] { + background-color: #FFAF5F +} + +div.highlight .-Color[class*=-C216] { + color: #FFAF87 +} + +div.highlight .-Color[class*=-BGC216] { + background-color: #FFAF87 +} + +div.highlight .-Color[class*=-C217] { + color: #FFAFAF +} + +div.highlight .-Color[class*=-BGC217] { + background-color: #FFAFAF +} + +div.highlight .-Color[class*=-C218] { + color: #FFAFD7 +} + +div.highlight .-Color[class*=-BGC218] { + background-color: #FFAFD7 +} + +div.highlight .-Color[class*=-C219] { + color: #FFAFFF +} + +div.highlight .-Color[class*=-BGC219] { + background-color: #FFAFFF +} + +div.highlight .-Color[class*=-C220] { + color: #FFD700 +} + +div.highlight .-Color[class*=-BGC220] { + background-color: #FFD700 +} + +div.highlight .-Color[class*=-C221] { + color: #FFD75F +} + +div.highlight .-Color[class*=-BGC221] { + background-color: #FFD75F +} + +div.highlight .-Color[class*=-C222] { + color: #FFD787 +} + +div.highlight .-Color[class*=-BGC222] { + background-color: #FFD787 +} + +div.highlight .-Color[class*=-C223] { + color: #FFD7AF +} + +div.highlight .-Color[class*=-BGC223] { + background-color: #FFD7AF +} + +div.highlight .-Color[class*=-C224] { + color: #FFD7D7 +} + +div.highlight .-Color[class*=-BGC224] { + background-color: #FFD7D7 +} + +div.highlight .-Color[class*=-C225] { + color: #FFD7FF +} + +div.highlight .-Color[class*=-BGC225] { + background-color: #FFD7FF +} + +div.highlight .-Color[class*=-C226] { + color: #FFFF00 +} + +div.highlight .-Color[class*=-BGC226] { + background-color: #FFFF00 +} + +div.highlight .-Color[class*=-C227] { + color: #FFFF5F +} + +div.highlight .-Color[class*=-BGC227] { + background-color: #FFFF5F +} + +div.highlight .-Color[class*=-C228] { + color: #FFFF87 +} + +div.highlight .-Color[class*=-BGC228] { + background-color: #FFFF87 +} + +div.highlight .-Color[class*=-C229] { + color: #FFFFAF +} + +div.highlight .-Color[class*=-BGC229] { + background-color: #FFFFAF +} + +div.highlight .-Color[class*=-C230] { + color: #FFFFD7 +} + +div.highlight .-Color[class*=-BGC230] { + background-color: #FFFFD7 +} + +div.highlight .-Color[class*=-C231] { + color: #FFFFFF +} + +div.highlight .-Color[class*=-BGC231] { + background-color: #FFFFFF +} + +div.highlight .-Color[class*=-C232] { + color: #080808 +} + +div.highlight .-Color[class*=-BGC232] { + background-color: #080808 +} + +div.highlight .-Color[class*=-C233] { + color: #121212 +} + +div.highlight .-Color[class*=-BGC233] { + background-color: #121212 +} + +div.highlight .-Color[class*=-C234] { + color: #1C1C1C +} + +div.highlight .-Color[class*=-BGC234] { + background-color: #1C1C1C +} + +div.highlight .-Color[class*=-C235] { + color: #262626 +} + +div.highlight .-Color[class*=-BGC235] { + background-color: #262626 +} + +div.highlight .-Color[class*=-C236] { + color: #303030 +} + +div.highlight .-Color[class*=-BGC236] { + background-color: #303030 +} + +div.highlight .-Color[class*=-C237] { + color: #3A3A3A +} + +div.highlight .-Color[class*=-BGC237] { + background-color: #3A3A3A +} + +div.highlight .-Color[class*=-C238] { + color: #444444 +} + +div.highlight .-Color[class*=-BGC238] { + background-color: #444444 +} + +div.highlight .-Color[class*=-C239] { + color: #4E4E4E +} + +div.highlight .-Color[class*=-BGC239] { + background-color: #4E4E4E +} + +div.highlight .-Color[class*=-C240] { + color: #585858 +} + +div.highlight .-Color[class*=-BGC240] { + background-color: #585858 +} + +div.highlight .-Color[class*=-C241] { + color: #626262 +} + +div.highlight .-Color[class*=-BGC241] { + background-color: #626262 +} + +div.highlight .-Color[class*=-C242] { + color: #6C6C6C +} + +div.highlight .-Color[class*=-BGC242] { + background-color: #6C6C6C +} + +div.highlight .-Color[class*=-C243] { + color: #767676 +} + +div.highlight .-Color[class*=-BGC243] { + background-color: #767676 +} + +div.highlight .-Color[class*=-C244] { + color: #808080 +} + +div.highlight .-Color[class*=-BGC244] { + background-color: #808080 +} + +div.highlight .-Color[class*=-C245] { + color: #8A8A8A +} + +div.highlight .-Color[class*=-BGC245] { + background-color: #8A8A8A +} + +div.highlight .-Color[class*=-C246] { + color: #949494 +} + +div.highlight .-Color[class*=-BGC246] { + background-color: #949494 +} + +div.highlight .-Color[class*=-C247] { + color: #9E9E9E +} + +div.highlight .-Color[class*=-BGC247] { + background-color: #9E9E9E +} + +div.highlight .-Color[class*=-C248] { + color: #A8A8A8 +} + +div.highlight .-Color[class*=-BGC248] { + background-color: #A8A8A8 +} + +div.highlight .-Color[class*=-C249] { + color: #B2B2B2 +} + +div.highlight .-Color[class*=-BGC249] { + background-color: #B2B2B2 +} + +div.highlight .-Color[class*=-C250] { + color: #BCBCBC +} + +div.highlight .-Color[class*=-BGC250] { + background-color: #BCBCBC +} + +div.highlight .-Color[class*=-C251] { + color: #C6C6C6 +} + +div.highlight .-Color[class*=-BGC251] { + background-color: #C6C6C6 +} + +div.highlight .-Color[class*=-C252] { + color: #D0D0D0 +} + +div.highlight .-Color[class*=-BGC252] { + background-color: #D0D0D0 +} + +div.highlight .-Color[class*=-C253] { + color: #DADADA +} + +div.highlight .-Color[class*=-BGC253] { + background-color: #DADADA +} + +div.highlight .-Color[class*=-C254] { + color: #E4E4E4 +} + +div.highlight .-Color[class*=-BGC254] { + background-color: #E4E4E4 +} + +div.highlight .-Color[class*=-C255] { + color: #EEEEEE +} + +div.highlight .-Color[class*=-BGC255] { + background-color: #EEEEEE +} diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..c15243c2 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,85 @@ +pre { line-height: 125%; } +td.linenos .normal { color: #3c4354; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: #3c4354; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #3c4354; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #3c4354; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #6e7681 } +.highlight { background: #1d2331; color: #d4d2c8 } +.highlight .c { color: #7e8aa1 } /* Comment */ +.highlight .err { color: #f88f7f } /* Error */ +.highlight .esc { color: #d4d2c8 } /* Escape */ +.highlight .g { color: #d4d2c8 } /* Generic */ +.highlight .k { color: #FFAD66 } /* Keyword */ +.highlight .l { color: #D5FF80 } /* Literal */ +.highlight .n { color: #d4d2c8 } /* Name */ +.highlight .o { color: #FFAD66 } /* Operator */ +.highlight .x { color: #d4d2c8 } /* Other */ +.highlight .p { color: #d4d2c8 } /* Punctuation */ +.highlight .ch { color: #f88f7f; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #7e8aa1 } /* Comment.Multiline */ +.highlight .cp { color: #FFAD66; font-weight: bold } /* Comment.Preproc */ +.highlight .cpf { color: #7e8aa1 } /* Comment.PreprocFile */ +.highlight .c1 { color: #7e8aa1 } /* Comment.Single */ +.highlight .cs { color: #7e8aa1; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #f88f7f; background-color: #3d1e20 } /* Generic.Deleted */ +.highlight .ge { color: #d4d2c8; font-style: italic } /* Generic.Emph */ +.highlight .ges { color: #d4d2c8 } /* Generic.EmphStrong */ +.highlight .gr { color: #f88f7f } /* Generic.Error */ +.highlight .gh { color: #d4d2c8 } /* Generic.Heading */ +.highlight .gi { color: #6ad4af; background-color: #19362c } /* Generic.Inserted */ +.highlight .go { color: #7e8aa1 } /* Generic.Output */ +.highlight .gp { color: #d4d2c8 } /* Generic.Prompt */ +.highlight .gs { color: #d4d2c8; font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #d4d2c8 } /* Generic.Subheading */ +.highlight .gt { color: #f88f7f } /* Generic.Traceback */ +.highlight .kc { color: #FFAD66 } /* Keyword.Constant */ +.highlight .kd { color: #FFAD66 } /* Keyword.Declaration */ +.highlight .kn { color: #FFAD66 } /* Keyword.Namespace */ +.highlight .kp { color: #FFAD66 } /* Keyword.Pseudo */ +.highlight .kr { color: #FFAD66 } /* Keyword.Reserved */ +.highlight .kt { color: #73D0FF } /* Keyword.Type */ +.highlight .ld { color: #D5FF80 } /* Literal.Date */ +.highlight .m { color: #DFBFFF } /* Literal.Number */ +.highlight .s { color: #D5FF80 } /* Literal.String */ +.highlight .na { color: #FFD173 } /* Name.Attribute */ +.highlight .nb { color: #FFD173 } /* Name.Builtin */ +.highlight .nc { color: #73D0FF } /* Name.Class */ +.highlight .no { color: #FFD173 } /* Name.Constant */ +.highlight .nd { color: #7e8aa1; font-weight: bold; font-style: italic } /* Name.Decorator */ +.highlight .ni { color: #95E6CB } /* Name.Entity */ +.highlight .ne { color: #73D0FF } /* Name.Exception */ +.highlight .nf { color: #FFD173 } /* Name.Function */ +.highlight .nl { color: #d4d2c8 } /* Name.Label */ +.highlight .nn { color: #d4d2c8 } /* Name.Namespace */ +.highlight .nx { color: #d4d2c8 } /* Name.Other */ +.highlight .py { color: #FFD173 } /* Name.Property */ +.highlight .nt { color: #5CCFE6 } /* Name.Tag */ +.highlight .nv { color: #d4d2c8 } /* Name.Variable */ +.highlight .ow { color: #FFAD66 } /* Operator.Word */ +.highlight .pm { color: #d4d2c8 } /* Punctuation.Marker */ +.highlight .w { color: #d4d2c8 } /* Text.Whitespace */ +.highlight .mb { color: #DFBFFF } /* Literal.Number.Bin */ +.highlight .mf { color: #DFBFFF } /* Literal.Number.Float */ +.highlight .mh { color: #DFBFFF } /* Literal.Number.Hex */ +.highlight .mi { color: #DFBFFF } /* Literal.Number.Integer */ +.highlight .mo { color: #DFBFFF } /* Literal.Number.Oct */ +.highlight .sa { color: #F29E74 } /* Literal.String.Affix */ +.highlight .sb { color: #D5FF80 } /* Literal.String.Backtick */ +.highlight .sc { color: #D5FF80 } /* Literal.String.Char */ +.highlight .dl { color: #D5FF80 } /* Literal.String.Delimiter */ +.highlight .sd { color: #7e8aa1 } /* Literal.String.Doc */ +.highlight .s2 { color: #D5FF80 } /* Literal.String.Double */ +.highlight .se { color: #95E6CB } /* Literal.String.Escape */ +.highlight .sh { color: #D5FF80 } /* Literal.String.Heredoc */ +.highlight .si { color: #95E6CB } /* Literal.String.Interpol */ +.highlight .sx { color: #95E6CB } /* Literal.String.Other */ +.highlight .sr { color: #95E6CB } /* Literal.String.Regex */ +.highlight .s1 { color: #D5FF80 } /* Literal.String.Single */ +.highlight .ss { color: #DFBFFF } /* Literal.String.Symbol */ +.highlight .bp { color: #5CCFE6 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #FFD173 } /* Name.Function.Magic */ +.highlight .vc { color: #d4d2c8 } /* Name.Variable.Class */ +.highlight .vg { color: #d4d2c8 } /* Name.Variable.Global */ +.highlight .vi { color: #d4d2c8 } /* Name.Variable.Instance */ +.highlight .vm { color: #d4d2c8 } /* Name.Variable.Magic */ +.highlight .il { color: #DFBFFF } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..7918c3fa --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,574 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2023 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + `Search finished, found ${resultCount} page(s) matching the search query.` + ); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + htmlElement.querySelectorAll(".headerlink").forEach((el) => { el.remove() }); + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent !== undefined) return docContent.textContent; + console.warn( + "Content block not found. Sphinx search tries to obtain it via '[role=main]'. Could you check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + /** + * execute search (requires search index to be loaded) + */ + query: (query) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + const allTitles = Search._index.alltitles; + const indexEntries = Search._index.indexentries; + + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + // array of [docname, title, anchor, descr, score, filename] + let results = []; + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + let score = Math.round(100 * queryLower.length / title.length) + results.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // search for explicit entries in index directives + for (const [entry, foundEntries] of Object.entries(indexEntries)) { + if (entry.includes(queryLower) && (queryLower.length >= entry.length/2)) { + for (const [file, id] of foundEntries) { + let score = Math.round(100 * queryLower.length / entry.length) + results.push([ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]); + } + } + } + + // lookup as object + objectTerms.forEach((term) => + results.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + results.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) results.forEach((item) => (item[4] = Scorer.score(item))); + + // now sort the results by score (in opposite order of appearance, since the + // display function below uses pop() to retrieve items) and then + // alphabetically + results.sort((a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; + }); + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + results = results.reverse(); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord) && !terms[word]) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord) && !titleTerms[word]) + arr.push({ files: titleTerms[word], score: Scorer.partialTitle }); + }); + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (fileMap.has(file) && fileMap.get(file).indexOf(word) === -1) + fileMap.get(file).push(word); + else fileMap.set(file, [word]); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords) => { + const text = Search.htmlToText(htmlText); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/algorithms.html b/algorithms.html new file mode 100644 index 00000000..90a3677d --- /dev/null +++ b/algorithms.html @@ -0,0 +1,134 @@ + + + + + + + Algorithms — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Algorithms

+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/api.html b/api.html new file mode 100644 index 00000000..33f42928 --- /dev/null +++ b/api.html @@ -0,0 +1,166 @@ + + + + + + + API — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

API

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

qlasskit.qlassfun.qlassf(f[, types, defs, ...])

Decorator / function creating a QlassF object

qlasskit.qlassfun.qlassfa([types, defs, ...])

Decorator with parameters for qlassf

qlasskit.qlassfun.QlassF(name, original_f, ...)

Class representing a qlassf function

qlasskit.algorithms.qalgorithm

qlasskit.algorithms.grover.Grover(oracle[, ...])

qlasskit.qcircuit.qcircuit.QCircuit([...])

qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper()

Wrapper interface for a class containing a qcircuit

qlasskit.qcircuit.gates

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/example_grover.html b/example_grover.html new file mode 100644 index 00000000..7e0003e0 --- /dev/null +++ b/example_grover.html @@ -0,0 +1,202 @@ + + + + + + + Grover search — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ + + + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/example_grover_hash.html b/example_grover_hash.html new file mode 100644 index 00000000..ba83d700 --- /dev/null +++ b/example_grover_hash.html @@ -0,0 +1,208 @@ + + + + + + + Grover search: hash function preimage attack — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Grover search: hash function preimage attack

+

In the ever-evolving landscape of cybersecurity, the advent of quantum computing presents both an extraordinary opportunity and an unprecedented challenge. In this notebook we exploit a Grover Search to perform a preimage attack on a toy hash function.

+

A preimage attack on a cryptographic hash function h(m) tries to find a message m that has a specific hash value. Using qlasskit it is easy to write an hash function like the following hash_simp:

+
+
+
from qlasskit import qlassf, Qint4, Qint8, Qlist
+
+@qlassf
+def hash_simp(m: Qlist[Qint4, 2]) -> Qint8:
+    hv = 0
+    for i in m:
+        hv = ((hv << 4) ^ (hv >> 1) ^ i) & 0xff
+
+    return hv
+
+
+
+
+

Thanks to the fact that qlasskit function are standard python functions, we can call the original_f to perform some kind of analysis on the hash function. Since the input space is tiny (it is a toy hash function), we can detect if the hash function is uniform (if it maps equally to the output space).

+
+
+
from collections import Counter
+
+d = Counter(hex(hash_simp.original_f((x, y))) for x in range(2**4) for y in range(2**4))
+
+print('Hash function output space:', len(d))
+
+
+
+
+
Hash function output space: 256
+
+
+
+
+

We got that hash_simp is following an uniform distribution.

+

We now can use our quantum function as an oracle for a Grover search, in order to find which input maps to the value ca.

+
+
+
from qlasskit.algorithms import Grover
+
+q_algo = Grover(hash_simp, Qint8(0xca))
+
+
+
+
+

Now we can use our prefered framework and simulator for sampling the result; this is an example using qiskit with aer_simulator.

+
+
+
from qiskit import Aer, QuantumCircuit, transpile
+from qiskit.visualization import plot_histogram
+
+qc = q_algo.export('qiskit')
+qc.measure_all()
+simulator = Aer.get_backend("aer_simulator")
+circ = transpile(qc, simulator)
+result = simulator.run(circ).result()
+counts = result.get_counts(circ)
+
+counts_readable = q_algo.decode_counts(counts, discard_lower=5)
+plot_histogram(counts_readable)
+
+
+
+
+_images/d19805380f7379838dd2610658b919af97837aa5f3ca65e2ac7eecb6b323453f.png +
+
+

We now double check using original_f; calling it with the tuple (12,12) must result in the hash value 0xca.

+
+
+
print(hex(hash_simp.original_f((12,12))))
+
+
+
+
+
0xca
+
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/example_grover_subset.html b/example_grover_subset.html new file mode 100644 index 00000000..507fa9b0 --- /dev/null +++ b/example_grover_subset.html @@ -0,0 +1,175 @@ + + + + + + + Grover search: subset problem — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Grover search: subset problem

+

We define a function named subset_sum(i,j) that returns the sum of the elements i and j of a list l. We want to use a Grover search to find which i j combination led to a given value.

+
+
+
from qlasskit import qlassf, Qint2, Qint3
+from typing import Tuple
+
+@qlassf
+def subset_sum(ii: Tuple[Qint2, Qint2]) -> Qint3:
+    l = [0, 5, 2, 3]
+    return l[ii[0]] + l[ii[1]] if ii[0] != ii[1] else 0
+
+
+
+
+

We now can use our quantum function as an oracle for a Grover search. For instance, we want to find the input value that produce the value 7. Since we know that there are at least two result ((i,j) and (j,i)), we set n_matching=2.

+
+
+
from qlasskit.algorithms import Grover
+
+q_algo = Grover(subset_sum, Qint3(7), n_matching=2)
+
+
+
+
+

Now we can use our prefered framework and simulator for sampling the result; this is an example using qiskit with aer_simulator.

+

In the output histogram, it’s now evident that the input leading to a value of 7 are the tuples (1,2) and (2,1) (5+2 and 2+5), aligning with our expectations.

+
+
+
from qiskit import Aer, QuantumCircuit, transpile
+from qiskit.visualization import plot_histogram
+
+qc = q_algo.export('qiskit')
+qc.measure_all()
+simulator = Aer.get_backend("aer_simulator")
+circ = transpile(qc, simulator)
+result = simulator.run(circ).result()
+counts = result.get_counts(circ)
+
+counts_readable = q_algo.decode_counts(counts)
+plot_histogram(counts_readable)
+
+
+
+
+_images/6f943927f4e7f022046baf725bd97d0234b6d284f35b8a8d70abbd49ae18d2e5.png +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/example_grover_sudoku.html b/example_grover_sudoku.html new file mode 100644 index 00000000..b1561067 --- /dev/null +++ b/example_grover_sudoku.html @@ -0,0 +1,173 @@ + + + + + + + Grover search: sudoku solver — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Grover search: sudoku solver

+

In this example we are going to solve a sudoku puzzle. Since we have few qubits, we need to simplify the puzzle and so we use a 2x2 matrix where a valid solution is when in every row and every column there are no repeated values (0 or 1). We encode these xor-ing the values for each row and column. +Since we want a specific solution, we add a constraint constr: we want the [0][0] element to be True.

+

We instantiate the Grover algorithm without value, since sudoku_check is already an oracle.

+
+
+
from qlasskit import qlassf, Qint2, Qint4, Qmatrix
+from qlasskit.algorithms import Grover
+
+@qlassf
+def sudoku_check(m: Qmatrix[bool,2,2]) -> bool:
+    constr = m[0][0]
+    sub0 = (m[0][0] ^ m[0][1])
+    sub1 = (m[1][0] ^ m[1][1])    
+    sub2 = (m[0][0] ^ m[1][0])
+    sub3 = (m[0][1] ^ m[1][1])
+    return sub0 and sub1 and sub2 and sub3 and constr
+
+q_algo = Grover(sudoku_check)
+
+
+
+
+

Now we can use our prefered framework and simulator for sampling the result; this is an example using qiskit with aer_simulator.

+

We obtain that the solution for this puzzle is the matrix [[True, False], [False, True]].

+
+
+
from qiskit import Aer, QuantumCircuit, transpile
+from qiskit.visualization import plot_histogram
+
+qc = q_algo.export('qiskit')
+qc.measure_all()
+simulator = Aer.get_backend("aer_simulator")
+circ = transpile(qc, simulator)
+result = simulator.run(circ).result()
+counts = result.get_counts(circ)
+
+counts_readable = q_algo.decode_counts(counts, discard_lower=20)
+plot_histogram(counts_readable)
+
+
+
+
+_images/ea41932c680a118cee625c379616f3eb2bc1845c772fc3b4c9431f50c80e16ed.png +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/example_unitary_of_f.html b/example_unitary_of_f.html new file mode 100644 index 00000000..47447334 --- /dev/null +++ b/example_unitary_of_f.html @@ -0,0 +1,178 @@ + + + + + + + Unitary of qlasskit function — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Unitary of qlasskit function

+
+
+
from qiskit import Aer, QuantumCircuit, transpile, execute
+from qiskit.visualization import array_to_latex
+from qlasskit import qlassf
+
+@qlassf
+def f(a: bool, b: bool) -> bool:
+    return a ^ (not b)
+
+print(f"\n{f}\n")
+
+qc = QuantumCircuit(f.num_qubits, f.num_qubits)
+qc.append(f.gate(), f.qubits)
+
+qc.decompose().draw('mpl')
+
+
+
+
+
QlassF<f>(a:bool, b:bool) -> bool:
+	_ret = a ^ ~b
+
+
+_images/f988cf8271837cb1b9caf21c4d307e4857aa36b6b8b9f774cf372dec22e57051.png +
+
+
+
+
simulator = Aer.get_backend('unitary_simulator')
+job = execute(qc, simulator, shots=8192)
+result = job.result()
+array_to_latex(result.get_unitary(qc,3), max_size=16)
+
+
+
+
+
+\[\begin{split}\begin{bmatrix} +0 & 0 & 0 & 0 & 1 & 0 & 0 & 0 \\ + 0 & 1 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 1 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 & 0 & 1 \\ + 1 & 0 & 0 & 0 & 0 & 0 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 1 & 0 & 0 \\ + 0 & 0 & 0 & 0 & 0 & 0 & 1 & 0 \\ + 0 & 0 & 0 & 1 & 0 & 0 & 0 & 0 \\ + \end{bmatrix} +\end{split}\]
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.algorithms.grover.Grover.html b/generated/qlasskit.algorithms.grover.Grover.html new file mode 100644 index 00000000..2eeffe3f --- /dev/null +++ b/generated/qlasskit.algorithms.grover.Grover.html @@ -0,0 +1,224 @@ + + + + + + + qlasskit.algorithms.grover.Grover — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.algorithms.grover.Grover

+
+
+class qlasskit.algorithms.grover.Grover(oracle: QlassF, element_to_search: Qtype | None = None, n_iterations: int | None = None, n_matching: int = 1)
+
+
+__init__(oracle: QlassF, element_to_search: Qtype | None = None, n_iterations: int | None = None, n_matching: int = 1)
+
+
Parameters:
+
    +
  • oracle (QlassF) – our f(x) -> bool that returns True if x satisfies the function or +a generic function f(x) = y that we want to compare with element_to_search

  • +
  • element_to_search (Qtype, optional) – the element we want to search

  • +
  • n_iterations (int, optional) – force a number of iterations +(otherwise, pi/4*sqrt(N/n_matching))

  • +
  • n_matching (int) – the number of expected matching values (default: 1)

  • +
+
+
+
+ +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

__init__(oracle[, element_to_search, ...])

+
param oracle:
+

our f(x) -> bool that returns True if x satisfies the function or

+
+
+

circuit()

decode_counts(counts[, discard_lower])

Decode data from a circuit counts dict

decode_output(istr)

draw()

encode_input(*qvals)

export([framework])

Export the circuit to a supported framework

gate([framework])

Returns the gate for a specific framework

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + +

input_qubits

Returns the list of input qubits

input_size

num_qubits

output_qubits

Returns the list of output qubits

output_size

qubits

Returns all the qubits of the circuit

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.algorithms.qalgorithm.html b/generated/qlasskit.algorithms.qalgorithm.html new file mode 100644 index 00000000..d598fcb7 --- /dev/null +++ b/generated/qlasskit.algorithms.qalgorithm.html @@ -0,0 +1,163 @@ + + + + + + + qlasskit.algorithms.qalgorithm — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.algorithms.qalgorithm

+

Functions

+ + + + + + +

oraclize(qf, element[, name])

Transform a QlassF qf and an element to an oracle {f(x) = x == element}

+

Classes

+ + + + + + +

QAlgorithm()

+

Exceptions

+ + + + + + +

ConstantOracleException

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qcircuit.gates.html b/generated/qlasskit.qcircuit.gates.html new file mode 100644 index 00000000..189df090 --- /dev/null +++ b/generated/qlasskit.qcircuit.gates.html @@ -0,0 +1,197 @@ + + + + + + + qlasskit.qcircuit.gates — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qcircuit.gates

+

Functions

+ + + + + + +

apply(gate, qubits[, param])

+

Classes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

Barrier()

CCX()

CX()

H()

MCX(n_controls)

MCtrl(gate, n_controls)

NopGate([name])

QControlledGate(gate, n_controls)

QGate(name[, n_qubits])

S()

T()

Toffoli

alias of CCX

X()

Y()

Z()

+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qcircuit.qcircuit.QCircuit.html b/generated/qlasskit.qcircuit.qcircuit.QCircuit.html new file mode 100644 index 00000000..96679035 --- /dev/null +++ b/generated/qlasskit.qcircuit.qcircuit.QCircuit.html @@ -0,0 +1,228 @@ + + + + + + + qlasskit.qcircuit.qcircuit.QCircuit — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qcircuit.qcircuit.QCircuit

+
+
+class qlasskit.qcircuit.qcircuit.QCircuit(num_qubits=0, name='qc', native=None)
+
+
+__init__(num_qubits=0, name='qc', native=None)
+

Initialize a quantum circuit.

+
+
Parameters:
+

num_qubits (int, optional) – The number of qubits in the circuit. Defaults to 0.

+
+
+
+ +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

__init__([num_qubits, name, native])

Initialize a quantum circuit.

add_qubit([name])

Add a qubit to the circuit.

append(gate, qubits[, param])

Append a gate operation to the circuit.

barrier([label])

Add a barrier to the circuit

ccx(w1, w2, w3)

CCX gate

copy()

cx(w1, w2)

CX gate

draw()

Draw the circuit

export([mode, framework])

Exports the circuit to another framework.

get_key_by_index(i)

Return the qubit name given its index

h(w)

H gate

mctrl(g, wl, target[, param])

Multi controlled gate

mcx(wl, target)

Multi CX gate

s(w)

S gate

t(w)

T gate

x(w)

X gate

y(w)

Y gate

z(w)

Z gate

+

Attributes

+ + + + + + +

num_gates

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.html b/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.html new file mode 100644 index 00000000..66d4c5d4 --- /dev/null +++ b/generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.html @@ -0,0 +1,208 @@ + + + + + + + qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper

+
+
+class qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper
+

Wrapper interface for a class containing a qcircuit

+
+
+__init__()
+
+ +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + +

__init__()

circuit()

decode_counts(counts[, discard_lower])

Decode data from a circuit counts dict

decode_output(istr)

draw()

encode_input(*qvals)

export([framework])

Export the circuit to a supported framework

gate([framework])

Returns the gate for a specific framework

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + +

input_qubits

Returns the list of input qubits

input_size

num_qubits

output_qubits

Returns the list of output qubits

output_size

qubits

Returns all the qubits of the circuit

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qlassfun.QlassF.html b/generated/qlasskit.qlassfun.QlassF.html new file mode 100644 index 00000000..97a277d6 --- /dev/null +++ b/generated/qlasskit.qlassfun.QlassF.html @@ -0,0 +1,244 @@ + + + + + + + qlasskit.qlassfun.QlassF — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qlassfun.QlassF

+
+
+class qlasskit.qlassfun.QlassF(name: str, original_f: Callable, args: List[Arg], returns: Arg, exps: List[Tuple[Symbol, Boolean]])
+

Class representing a qlassf function

+
+
+__init__(name: str, original_f: Callable, args: List[Arg], returns: Arg, exps: List[Tuple[Symbol, Boolean]])
+
+ +

Methods

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

__init__(name, original_f, args, returns, exps)

bind(**kwargs)

Returns a new QlassF with defined params

circuit()

compile([compiler, uncompute])

decode_counts(counts[, discard_lower])

Decode data from a circuit counts dict

decode_output(istr)

draw()

encode_input(*qvals)

export([framework])

Export the circuit to a supported framework

f()

Returns the classical python function

from_function(f[, types, defs, to_compile, ...])

Create a QlassF from a function or a string containing a function

gate([framework])

Returns the gate for a specific framework

to_logicfun()

truth_table([max])

Returns the truth table for the function using the sympy boolean for computing

truth_table_header()

Returns the list of string containing the truth table header

+

Attributes

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +

input_qubits

Returns the list of input qubits

input_size

num_qubits

output_qubits

Returns the list of output qubits

output_size

Return the size of the return type (in bits)

qubits

Returns all the qubits of the circuit

name

original_f

args

returns

expressions

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qlassfun.qlassf.html b/generated/qlasskit.qlassfun.qlassf.html new file mode 100644 index 00000000..b738ee98 --- /dev/null +++ b/generated/qlasskit.qlassfun.qlassf.html @@ -0,0 +1,163 @@ + + + + + + + qlasskit.qlassfun.qlassf — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qlassfun.qlassf

+
+
+qlasskit.qlassfun.qlassf(f: str | ~typing.Callable, types: ~typing.List[~qlasskit.types.qtype.Qtype] = [], defs: ~typing.List[~qlasskit.qlassfun.QlassF] = [], to_compile: bool = True, compiler: ~typing.Literal['internal', 'poc3', 'tweedledum'] = 'internal', bool_optimizer: ~qlasskit.boolopt.bool_optimizer.BoolOptimizerProfile = <qlasskit.boolopt.bool_optimizer.BoolOptimizerProfile object>, uncompute: bool = True) QlassF
+

Decorator / function creating a QlassF object

+
+
Parameters:
+
    +
  • f (Union[str, Callable]) – the function to be parsed, as a str code or callable

  • +
  • types (List[Qtype]) – list of qtypes to inject

  • +
  • defs (List[Qlassf]) – list of qlassf to inject

  • +
  • to_compile (boolean, optional) – if True, compile to quantum circuit (default: True)

  • +
  • compiler (SupportedCompiler, optional) – override default compiler (default: internal)

  • +
  • bool_optimizer (BoolOptimizerProfile, optional) – override default optimizer +(default: bestWorkingOptimizer)

  • +
  • uncompute (bool, optional) – whenever uncompute input qubits during compilation +(default: True)

  • +
+
+
+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/qlasskit.qlassfun.qlassfa.html b/generated/qlasskit.qlassfun.qlassfa.html new file mode 100644 index 00000000..7bbe84cc --- /dev/null +++ b/generated/qlasskit.qlassfun.qlassfa.html @@ -0,0 +1,148 @@ + + + + + + + qlasskit.qlassfun.qlassfa — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

qlasskit.qlassfun.qlassfa

+
+
+qlasskit.qlassfun.qlassfa(types: ~typing.List[~qlasskit.types.qtype.Qtype] = [], defs: ~typing.List[~qlasskit.qlassfun.QlassF] = [], to_compile: bool = True, compiler: ~typing.Literal['internal', 'poc3', 'tweedledum'] = 'internal', bool_optimizer: ~qlasskit.boolopt.bool_optimizer.BoolOptimizerProfile = <qlasskit.boolopt.bool_optimizer.BoolOptimizerProfile object>, uncompute: bool = True)
+

Decorator with parameters for qlassf

+
+ +
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..c05eabff --- /dev/null +++ b/genindex.html @@ -0,0 +1,199 @@ + + + + + + Index — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+ +
+ +
+ +
+

© Copyright 2023, Davide Gessa (dakk).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/how_it_works.html b/how_it_works.html new file mode 100644 index 00000000..e17c57b5 --- /dev/null +++ b/how_it_works.html @@ -0,0 +1,263 @@ + + + + + + + How it works — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

How it works

+

To convert Python code into a quantum circuit, qlasskit implements a series of transformations:

+
    +
  1. It begins with the Python AST (Abstract Syntax Tree), converting it into a more streamlined form using the ast2ast module.

  2. +
  3. Next, the streamlined AST is translated into boolean expressions as an intermediate step by the ast2logic module. +During this phase, boolean expressions are refined and optimized in preparation for the final transformation.

  4. +
  5. Finally, the compiler module takes these optimized boolean expressions and compiles them into a +quantum circuit.

  6. +
+

Unlike other libraries that translate individual operations into quantum circuits before combining them, +qlasskit constructs a singular boolean expression for each output qubit of the entire function. +This unique approach facilitates advanced optimization leveraging boolean algebraic properties.

+

For instance, let assume we have the following function:

+
+
+
from qlasskit import qlassf, Qint2, Qint4
+from qiskit import QuantumCircuit
+
+@qlassf
+def f_comp(b: bool, n: Qint2) -> Qint2:
+      for i in range(3):
+            n += (1 if b else 2)
+      return n
+
+
+
+
+

If we decompose the algorithm in 3 separate additions and we compile them separately, we obtain the following circuit:

+
+
+
@qlassf
+def f1(b: bool, n: Qint2) -> Qint2:
+    return n + (1 if b else 2)
+
+qc = QuantumCircuit(f_comp.num_qubits * 2 - 1)
+
+for i in range(3):
+    qc.barrier(label=f"it_{i}")
+    qc.append(f1.gate(), [0] + list(range(1 + i * 2, 5 + i * 2)))
+
+print('Operations:', qc.decompose().count_ops())
+qc.decompose().draw("mpl")
+
+
+
+
+
Operations: OrderedDict([('cx', 12), ('barrier', 3), ('x', 3), ('ccx', 3)])
+
+
+
/opt/hostedtoolcache/Python/3.10.13/x64/lib/python3.10/site-packages/qiskit/visualization/circuit/matplotlib.py:266: FutureWarning: The default matplotlib drawer scheme will be changed to "iqp" in a following release. To silence this warning, specify the current default explicitly as style="clifford", or the new default as style="iqp".
+  self._style, def_font_ratio = load_style(self._style)
+
+
+_images/99d44c6d50f9b254ae7c579012cd8627b241c498203712ce1fa7b4c31181df4d.png +
+
+

While if we compile the whole function to a quantum circuit using qlasskit, we obtain the following quantum circuit:

+
+
+
qc = QuantumCircuit(f_comp.num_qubits)
+qc.append(f_comp.gate(), f_comp.qubits)
+
+print('Operations:', qc.decompose().count_ops())
+qc.decompose().draw("mpl")
+
+
+
+
+
Operations: OrderedDict([('cx', 4), ('x', 1), ('ccx', 1)])
+
+
+_images/bb602c4172678c017a5af45866c85d482b8102b2ff0882f9016d844672451041.png +
+
+

As we can see from the circuit drawings, qlasskit approach needs half the number of qubits and half the number of gates.

+
+

AST Traslator

+

Given a python function, the qlasskit.ast2logic module walks its syntax tree translating all the statements / +expressions to boolean expressions.

+

For instance, the following function:

+
+
+
@qlassf
+def f(n: Qint4) -> bool:
+        return n == 3       
+
+
+
+
+

Is translated to this boolean expression:

+
+
+
print(f.expressions)
+
+
+
+
+
[(_ret, n.0 & n.1 & ~n.2 & ~n.3)]
+
+
+
+
+
+
+

Compiler

+

The boolean expressions are then being fed to the `qlasskit.compiler`` which compiles boolean expressions +to invertible circuits, introducing auxiliary qubits. In this step, the compiler will automatically uncompute +auxiliary qubits in order to reduce the number of qubits needed and the circuit footprint.

+

For the compilation, two backends are supported:

+
    +
  • InternalCompiler

  • +
  • Tweedledum.xag_synth

  • +
+
+
+

Result

+

The result of the compiler is a quantum circuit represented with qlasskit QCircuit. This circuit +can now be exported to one of the supported framework as a gate or as a standalone circuit.

+

The previous example function f, is translated to the following quantum circuit: the +result is available at qubit q6.

+
+
+
f.export().draw('mpl')
+
+
+
+
+_images/293285b423513d39c4a73e871f2211a526039c0ce9d988d5f7d9abe704adabc2.png +
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..c773a8be --- /dev/null +++ b/index.html @@ -0,0 +1,180 @@ + + + + + + + Qlasskit — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+ + +
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..d391a431 Binary files /dev/null and b/objects.inv differ diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 00000000..d16d126c --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,149 @@ + + + + + + Python Module Index — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ q +
+ + + + + + + + + + + + + +
 
+ q
+ qlasskit +
    + qlasskit.algorithms.qalgorithm +
    + qlasskit.qcircuit.gates +
+ + +
+
+
+ +
+ +
+

© Copyright 2023, Davide Gessa (dakk).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/quickstart.html b/quickstart.html new file mode 100644 index 00000000..08b93760 --- /dev/null +++ b/quickstart.html @@ -0,0 +1,195 @@ + + + + + + + Quickstart — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Quickstart

+

First install qlasskit using pip.

+

pip install qlasskit

+

We now define a qlassf function that sums two numbers:

+
+
+
from qlasskit import qlassf, Qint2
+
+@qlassf 
+def sum_two_numbers(a: Qint2, b: Qint2) -> Qint2:
+    return a + b
+
+
+
+
+

We can now export the resulting quantum circuit to any supported framework:

+
+
+
circuit = sum_two_numbers.export('qiskit')
+circuit.draw('mpl')
+
+
+
+
+
/opt/hostedtoolcache/Python/3.10.13/x64/lib/python3.10/site-packages/qiskit/visualization/circuit/matplotlib.py:266: FutureWarning: The default matplotlib drawer scheme will be changed to "iqp" in a following release. To silence this warning, specify the current default explicitly as style="clifford", or the new default as style="iqp".
+  self._style, def_font_ratio = load_style(self._style)
+
+
+_images/27a749800d923fb69b5d38e7722422621f8acf4ee5c2b6f517f89d74a936444a.png +
+
+

The qlassf function can be also exported as a gate, if the destination framwork supports it. We can use encode_input and decode_output in order to conver from/to high level types of qlasskit without worrying about the binary representation.

+
+
+
from qiskit import QuantumCircuit
+
+qc = QuantumCircuit(sum_two_numbers.num_qubits,len(sum_two_numbers.output_qubits))
+
+qc.initialize(sum_two_numbers.encode_input(Qint2(1), Qint2(2)), sum_two_numbers.input_qubits)
+qc.append(sum_two_numbers.gate('qiskit'), sum_two_numbers.qubits)
+qc.measure(sum_two_numbers.output_qubits, range(len(sum_two_numbers.output_qubits)))
+qc.draw('mpl')
+
+
+
+
+_images/c11daf869c135eac3524304f0b40bd3d1ae514f73d769f0de4a9d577f9da51ba.png +
+
+
+
+
from qiskit import Aer, QuantumCircuit, transpile
+from qiskit.visualization import plot_histogram
+
+simulator = Aer.get_backend("aer_simulator")
+circ = transpile(qc, simulator)
+result = simulator.run(circ).result()
+counts = result.get_counts(circ)
+
+counts_readable = sum_two_numbers.decode_counts(counts)
+plot_histogram(counts_readable)
+
+
+
+
+_images/beafab15f915183b637909d537345580eba0f3a7fb66329311dd39909074d252.png +
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file diff --git a/search.html b/search.html new file mode 100644 index 00000000..f5ea6cd3 --- /dev/null +++ b/search.html @@ -0,0 +1,139 @@ + + + + + + Search — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+
+ +
+ +
+

© Copyright 2023, Davide Gessa (dakk).

+
+ + Built with Sphinx using a + theme + provided by Read the Docs. + + +
+
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..4f1a59ea --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"docnames": ["algorithms", "api", "example_grover", "example_grover_hash", "example_grover_subset", "example_grover_sudoku", "example_unitary_of_f", "generated/qlasskit.algorithms.grover.Grover", "generated/qlasskit.algorithms.qalgorithm", "generated/qlasskit.qcircuit.gates", "generated/qlasskit.qcircuit.qcircuit.QCircuit", "generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper", "generated/qlasskit.qlassfun.QlassF", "generated/qlasskit.qlassfun.qlassf", "generated/qlasskit.qlassfun.qlassfa", "how_it_works", "index", "quickstart", "supported"], "filenames": ["algorithms.rst", "api.rst", "example_grover.ipynb", "example_grover_hash.ipynb", "example_grover_subset.ipynb", "example_grover_sudoku.ipynb", "example_unitary_of_f.ipynb", "generated/qlasskit.algorithms.grover.Grover.rst", "generated/qlasskit.algorithms.qalgorithm.rst", "generated/qlasskit.qcircuit.gates.rst", "generated/qlasskit.qcircuit.qcircuit.QCircuit.rst", "generated/qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.rst", "generated/qlasskit.qlassfun.QlassF.rst", "generated/qlasskit.qlassfun.qlassf.rst", "generated/qlasskit.qlassfun.qlassfa.rst", "how_it_works.ipynb", "index.rst", "quickstart.ipynb", "supported.rst"], "titles": ["Algorithms", "API", "Grover search", "Grover search: hash function preimage attack", "Grover search: subset problem", "Grover search: sudoku solver", "Unitary of qlasskit function", "qlasskit.algorithms.grover.Grover", "qlasskit.algorithms.qalgorithm", "qlasskit.qcircuit.gates", "qlasskit.qcircuit.qcircuit.QCircuit", "qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper", "qlasskit.qlassfun.QlassF", "qlasskit.qlassfun.qlassf", "qlasskit.qlassfun.qlassfa", "How it works", "Qlasskit", "Quickstart", "Supported python subset"], "terms": {"we": [2, 3, 4, 5, 7, 15, 17], "defin": [2, 4, 17], "function": [2, 4, 7, 8, 9, 12, 13, 15, 16, 17], "name": [2, 4, 10, 12], "and_al": 2, "return": [2, 3, 4, 5, 6, 7, 12, 15, 17], "true": [2, 5, 7, 13, 14, 18], "iff": 2, "all": [2, 15, 18], "element": [2, 4, 5, 7], "an": [2, 3, 4, 5, 15], "input": [2, 3, 4, 13], "list": [2, 4, 12, 13, 14, 15], "a_list": 2, "ar": [2, 3, 4, 5, 15, 18], "want": [2, 4, 5, 7], "us": [2, 3, 4, 5, 15, 16, 17], "find": [2, 3, 4], "valu": [2, 3, 4, 5, 7], "led": [2, 4], "result": [2, 3, 4, 5, 6, 16, 17], "from": [2, 3, 4, 5, 6, 15, 17], "qlasskit": [2, 3, 4, 5, 15, 17, 18], "import": [2, 3, 4, 5, 6, 15, 17, 18], "qlassf": [2, 3, 4, 5, 6, 7, 14, 15, 16, 17, 18], "qlist": [2, 3, 18], "qint2": [2, 4, 5, 15, 17, 18], "def": [2, 3, 4, 5, 6, 13, 14, 15, 17], "bool": [2, 5, 6, 7, 13, 14, 15], "4": [2, 3, 7, 15, 18], "r": 2, "i": [2, 3, 4, 5, 15, 16, 18], "The": [2, 10, 15, 17, 18], "compil": [2, 13, 14, 16, 18], "produc": [2, 4], "optim": [2, 13, 15], "quantum": [2, 3, 4, 10, 13, 15, 16, 17], "circuit": [2, 10, 13, 15, 16, 17, 18], "perform": [2, 3], "given": [2, 4, 15], "export": [2, 3, 4, 5, 15, 17], "qiskit": [2, 3, 4, 5, 6, 15, 17], "draw": [2, 6, 15, 17], "mpl": [2, 6, 15, 17], "opt": [2, 15, 17], "hostedtoolcach": [2, 15, 17], "python": [2, 3, 15, 16, 17], "3": [2, 4, 6, 15, 17, 18], "10": [2, 15, 17], "13": [2, 15, 17, 18], "x64": [2, 15, 17], "lib": [2, 15, 17], "python3": [2, 15, 17], "site": [2, 15, 17], "packag": [2, 15, 17], "visual": [2, 3, 4, 5, 6, 15, 17], "matplotlib": [2, 15, 17], "py": [2, 15, 17], "266": [2, 15, 17], "futurewarn": [2, 15, 17], "default": [2, 7, 10, 13, 15, 17], "drawer": [2, 15, 17], "scheme": [2, 15, 17], "chang": [2, 15, 17], "iqp": [2, 15, 17], "follow": [2, 3, 15, 17, 18], "releas": [2, 15, 17], "To": [2, 15, 17], "silenc": [2, 15, 17], "thi": [2, 3, 4, 5, 15, 17, 18], "warn": [2, 15, 17], "specifi": [2, 15, 17], "current": [2, 15, 17], "explicitli": [2, 15, 17], "style": [2, 15, 17], "clifford": [2, 15, 17], "new": [2, 15, 17], "self": [2, 15, 17], "_style": [2, 15, 17], "def_font_ratio": [2, 15, 17], "load_styl": [2, 15, 17], "now": [2, 3, 4, 5, 15, 17], "can": [2, 3, 4, 5, 15, 17], "our": [2, 3, 4, 5, 7], "oracl": [2, 3, 4, 5, 7], "For": [2, 4, 15], "instanc": [2, 4, 15], "yeld": 2, "algorithm": [2, 3, 4, 5, 15, 16], "q_algo": [2, 3, 4, 5], "prepar": [2, 15], "qc": [2, 3, 4, 5, 6, 10, 15, 17], "prefer": [2, 3, 4, 5], "framework": [2, 3, 4, 5, 15, 17], "simul": [2, 3, 4, 5, 6, 17], "sampl": [2, 3, 4, 5], "exampl": [2, 3, 4, 5, 15, 18], "aer_simul": [2, 3, 4, 5, 17], "class": [2, 7, 8, 9, 10, 11, 12], "along": 2, "wrapper": [2, 11], "provid": 2, "util": [2, 18], "encod": [2, 5], "decod": 2, "output": [2, 3, 4, 15], "high": [2, 17], "level": [2, 17], "type": [2, 4, 13, 14, 16, 17], "definit": 2, "In": [2, 3, 4, 5, 15, 18], "histogram": [2, 4], "": [2, 4, 18], "evid": [2, 4], "lead": [2, 4, 18], "where": [2, 5], "set": [2, 4], "align": [2, 4], "expect": [2, 4, 7], "aer": [2, 3, 4, 5, 6, 17], "quantumcircuit": [2, 3, 4, 5, 6, 15, 17], "transpil": [2, 3, 4, 5, 6, 17], "plot_histogram": [2, 3, 4, 5, 17], "measure_al": [2, 3, 4, 5], "get_backend": [2, 3, 4, 5, 6, 17], "circ": [2, 3, 4, 5, 17], "run": [2, 3, 4, 5, 17], "count": [2, 3, 4, 5, 17], "get_count": [2, 3, 4, 5, 17], "counts_read": [2, 3, 4, 5, 17], "decode_count": [2, 3, 4, 5, 17], "ever": 3, "evolv": 3, "landscap": 3, "cybersecur": 3, "advent": 3, "comput": 3, "present": [3, 18], "both": 3, "extraordinari": 3, "opportun": 3, "unpreced": 3, "challeng": 3, "notebook": 3, "exploit": 3, "toi": 3, "A": 3, "cryptograph": 3, "h": [3, 18], "m": [3, 5, 18], "tri": 3, "messag": 3, "ha": [3, 18], "specif": [3, 5], "easi": 3, "write": [3, 16], "like": 3, "hash_simp": 3, "qint4": [3, 5, 15, 18], "qint8": [3, 18], "2": [3, 4, 5, 15, 17, 18], "hv": 3, "0": [3, 4, 5, 6, 10, 15, 18], "1": [3, 4, 5, 6, 7, 15, 17, 18], "0xff": 3, "thank": 3, "fact": 3, "standard": 3, "call": 3, "original_f": [3, 12], "some": 3, "kind": 3, "analysi": 3, "sinc": [3, 4, 5], "space": 3, "tini": 3, "detect": 3, "uniform": 3, "map": 3, "equal": 3, "collect": 3, "counter": 3, "d": [3, 18], "hex": 3, "x": [3, 7, 15], "y": [3, 7], "rang": [3, 15, 17, 18], "print": [3, 6, 15, 18], "len": [3, 17, 18], "256": 3, "got": 3, "distribut": 3, "order": [3, 15, 17], "which": [3, 4, 15], "ca": 3, "0xca": 3, "discard_low": [3, 5], "5": [3, 4, 15], "doubl": 3, "check": 3, "tupl": [3, 4, 12], "12": [3, 15, 18], "must": 3, "subset_sum": 4, "j": 4, "sum": [4, 17, 18], "l": 4, "combin": [4, 15], "qint3": 4, "ii": 4, "els": [4, 15], "7": 4, "know": 4, "least": 4, "two": [4, 15, 17], "n_match": [4, 7], "go": 5, "solv": 5, "puzzl": 5, "have": [5, 15, 18], "few": 5, "qubit": [5, 6, 10, 13, 15, 17, 18], "need": [5, 15], "simplifi": 5, "so": 5, "2x2": 5, "matrix": 5, "valid": 5, "solut": 5, "when": 5, "everi": 5, "row": 5, "column": 5, "repeat": 5, "xor": 5, "ing": 5, "each": [5, 15, 18], "add": 5, "constraint": 5, "constr": 5, "instanti": 5, "without": [5, 17], "sudoku_check": 5, "alreadi": 5, "qmatrix": [5, 18], "sub0": 5, "sub1": 5, "sub2": 5, "sub3": 5, "obtain": [5, 15], "fals": 5, "20": 5, "execut": 6, "array_to_latex": 6, "f": [6, 7, 13, 15, 18], "b": [6, 15, 17, 18], "n": [6, 7, 15, 18], "num_qubit": [6, 10, 15, 17], "append": [6, 15, 17], "gate": [6, 15, 16, 17, 18], "decompos": [6, 15], "_ret": [6, 15], "unitary_simul": 6, "job": 6, "shot": 6, "8192": 6, "get_unitari": 6, "max_siz": 6, "16": 6, "begin": [6, 15], "bmatrix": 6, "end": 6, "element_to_search": 7, "qtype": [7, 13, 14], "none": [7, 10], "n_iter": 7, "int": [7, 10], "__init__": [7, 10, 11, 12], "paramet": [7, 10, 13, 14], "satisfi": 7, "gener": 7, "compar": 7, "option": [7, 10, 13, 18], "search": [7, 16], "forc": 7, "number": [7, 10, 15, 17, 18], "iter": [7, 18], "otherwis": 7, "pi": 7, "sqrt": 7, "match": 7, "method": [7, 10, 11, 12], "attribut": [7, 10, 11, 12], "except": 8, "nativ": 10, "initi": [10, 17], "interfac": 11, "contain": [11, 18], "str": [12, 13], "callabl": [12, 13], "arg": 12, "exp": 12, "symbol": 12, "boolean": [12, 13, 15], "repres": [12, 15], "to_compil": [13, 14], "liter": [13, 14], "intern": [13, 14], "poc3": [13, 14], "tweedledum": [13, 14, 15], "bool_optim": [13, 14], "boolopt": [13, 14], "booloptimizerprofil": [13, 14], "object": [13, 14], "uncomput": [13, 14, 15], "decor": [13, 14], "creat": 13, "union": 13, "pars": 13, "code": [13, 15], "inject": 13, "supportedcompil": 13, "overrid": 13, "bestworkingoptim": 13, "whenev": 13, "dure": [13, 15, 18], "convert": 15, "implement": 15, "seri": 15, "transform": 15, "It": [15, 18], "abstract": 15, "syntax": 15, "tree": 15, "more": 15, "streamlin": 15, "form": 15, "ast2ast": 15, "modul": [15, 16, 18], "next": 15, "translat": [15, 16], "express": [15, 16], "intermedi": 15, "step": 15, "ast2log": 15, "phase": 15, "refin": 15, "final": 15, "take": 15, "them": [15, 16], "unlik": 15, "other": 15, "librari": [15, 16], "individu": 15, "oper": [15, 16], "befor": 15, "construct": 15, "singular": 15, "entir": 15, "uniqu": 15, "approach": 15, "facilit": 15, "advanc": 15, "leverag": 15, "algebra": 15, "properti": 15, "let": 15, "assum": 15, "f_comp": 15, "If": 15, "separ": 15, "addit": 15, "f1": 15, "barrier": 15, "label": 15, "it_": 15, "count_op": 15, "ordereddict": 15, "cx": [15, 18], "ccx": 15, "while": 15, "whole": 15, "As": 15, "see": 15, "half": 15, "walk": 15, "its": [15, 18], "statement": [15, 16], "being": 15, "fed": 15, "invert": 15, "introduc": 15, "auxiliari": 15, "automat": 15, "reduc": 15, "footprint": 15, "backend": 15, "support": [15, 16, 17], "internalcompil": 15, "xag_synth": 15, "qcircuit": [15, 16], "one": 15, "standalon": 15, "previou": 15, "avail": 15, "q6": 15, "allow": 16, "develop": 16, "classic": 16, "pure": 16, "unitari": 16, "quickstart": 16, "how": 16, "work": 16, "ast": 16, "traslat": 16, "subset": 16, "hybrid": 16, "grover": 16, "api": 16, "qlassfun": 16, "qlassfa": 16, "qalgorithm": 16, "qcircuitwrapp": 16, "problem": 16, "hash": 16, "preimag": 16, "attack": 16, "sudoku": 16, "solver": 16, "index": 16, "page": 16, "first": 17, "instal": 17, "pip": 17, "sum_two_numb": 17, "ani": [17, 18], "also": 17, "destin": 17, "framwork": 17, "encode_input": 17, "decode_output": 17, "conver": 17, "worri": 17, "about": 17, "binari": 17, "represent": 17, "output_qubit": 17, "input_qubit": 17, "measur": 17, "expand": 18, "limit": 18, "linear": 18, "structur": 18, "pattern": 18, "param": 18, "static": 18, "unsign": 18, "integ": 18, "subtyp": 18, "differ": 18, "qint12": 18, "qint16": 18, "singl": 18, "bit": 18, "access": 18, "hold": 18, "t": 18, "denot": 18, "42": 18, "c": 18, "bultin": 18, "debug": 18, "ignor": 18, "convers": 18, "length": 18, "max": 18, "min": 18, "elemnt": 18, "pleas": 18, "note": 18, "unrol": 18, "therefor": 18, "essenti": 18, "known": 18, "time": 18, "cond": 18, "At": 18, "design": 18, "branch": 18, "bodi": 18, "exclus": 18, "you": 18, "through": 18, "q": 18, "keep": 18, "mind": 18, "incorpor": 18, "within": 18, "exhibit": 18, "distinct": 18, "behavior": 18, "counterpart": 18, "bell": 18}, "objects": {"qlasskit.algorithms.grover": [[7, 0, 1, "", "Grover"]], "qlasskit.algorithms.grover.Grover": [[7, 1, 1, "", "__init__"]], "qlasskit.algorithms": [[8, 2, 0, "-", "qalgorithm"]], "qlasskit.qcircuit": [[9, 2, 0, "-", "gates"]], "qlasskit.qcircuit.qcircuit": [[10, 0, 1, "", "QCircuit"]], "qlasskit.qcircuit.qcircuit.QCircuit": [[10, 1, 1, "", "__init__"]], "qlasskit.qcircuit.qcircuitwrapper": [[11, 0, 1, "", "QCircuitWrapper"]], "qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper": [[11, 1, 1, "", "__init__"]], "qlasskit.qlassfun": [[12, 0, 1, "", "QlassF"], [13, 3, 1, "", "qlassf"], [14, 3, 1, "", "qlassfa"]], "qlasskit.qlassfun.QlassF": [[12, 1, 1, "", "__init__"]]}, "objtypes": {"0": "py:class", "1": "py:method", "2": "py:module", "3": "py:function"}, "objnames": {"0": ["py", "class", "Python class"], "1": ["py", "method", "Python method"], "2": ["py", "module", "Python module"], "3": ["py", "function", "Python function"]}, "titleterms": {"algorithm": [0, 7, 8], "grover": [0, 2, 3, 4, 5, 7], "search": [0, 2, 3, 4, 5], "api": 1, "hash": 3, "function": [3, 6, 18], "preimag": 3, "attack": 3, "subset": [4, 18], "problem": 4, "sudoku": 5, "solver": 5, "unitari": 6, "qlasskit": [6, 7, 8, 9, 10, 11, 12, 13, 14, 16], "qalgorithm": 8, "qcircuit": [9, 10, 11], "gate": 9, "qcircuitwrapp": 11, "qlassfun": [12, 13, 14], "qlassf": [12, 13], "qlassfa": 14, "how": 15, "work": 15, "ast": 15, "traslat": 15, "compil": 15, "result": 15, "exampl": 16, "indic": 16, "tabl": 16, "quickstart": 17, "support": 18, "python": 18, "type": 18, "bool": 18, "qint": 18, "tupl": 18, "list": 18, "matrix": 18, "express": 18, "constant": 18, "fix": 18, "size": 18, "2d": 18, "subscript": 18, "boolean": 18, "oper": 18, "If": 18, "compar": 18, "unari": 18, "op": 18, "bin": 18, "call": 18, "statement": 18, "assign": 18, "return": 18, "For": 18, "loop": 18, "def": 18, "els": 18, "quantum": 18, "hybrid": 18}, "envversion": {"sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx": 60}, "alltitles": {"Algorithms": [[0, "algorithms"]], "Grover search": [[0, "grover-search"], [2, "grover-search"]], "API": [[1, "api"]], "Grover search: hash function preimage attack": [[3, "grover-search-hash-function-preimage-attack"]], "Grover search: subset problem": [[4, "grover-search-subset-problem"]], "Grover search: sudoku solver": [[5, "grover-search-sudoku-solver"]], "Unitary of qlasskit function": [[6, "unitary-of-qlasskit-function"]], "qlasskit.algorithms.grover.Grover": [[7, "qlasskit-algorithms-grover-grover"]], "qlasskit.algorithms.qalgorithm": [[8, "module-qlasskit.algorithms.qalgorithm"]], "qlasskit.qcircuit.gates": [[9, "module-qlasskit.qcircuit.gates"]], "qlasskit.qcircuit.qcircuit.QCircuit": [[10, "qlasskit-qcircuit-qcircuit-qcircuit"]], "qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper": [[11, "qlasskit-qcircuit-qcircuitwrapper-qcircuitwrapper"]], "qlasskit.qlassfun.QlassF": [[12, "qlasskit-qlassfun-qlassf"]], "qlasskit.qlassfun.qlassf": [[13, "qlasskit-qlassfun-qlassf"]], "qlasskit.qlassfun.qlassfa": [[14, "qlasskit-qlassfun-qlassfa"]], "How it works": [[15, "how-it-works"]], "AST Traslator": [[15, "ast-traslator"]], "Compiler": [[15, "compiler"]], "Result": [[15, "result"]], "Qlasskit": [[16, "qlasskit"], [16, null]], "Examples": [[16, null]], "Indices and tables": [[16, "indices-and-tables"]], "Quickstart": [[17, "quickstart"]], "Supported python subset": [[18, "supported-python-subset"]], "Types": [[18, "types"]], "bool": [[18, "bool"]], "Qint": [[18, "qint"]], "Tuple": [[18, "tuple"], [18, "id1"]], "List": [[18, "list"]], "Matrix": [[18, "matrix"]], "Expressions": [[18, "expressions"]], "Constants": [[18, "constants"]], "List (fixed size)": [[18, "list-fixed-size"]], "2D Matrix (fixed size)": [[18, "d-matrix-fixed-size"]], "Subscript": [[18, "subscript"]], "Boolean operators": [[18, "boolean-operators"]], "If expressions": [[18, "if-expressions"]], "Comparators": [[18, "comparators"]], "Unary Op": [[18, "unary-op"]], "Bin Op": [[18, "bin-op"]], "Function call": [[18, "function-call"]], "Statements": [[18, "statements"]], "Assign": [[18, "assign"]], "Return": [[18, "return"]], "For loop": [[18, "for-loop"]], "Function def": [[18, "function-def"]], "If then else": [[18, "if-then-else"]], "Quantum Hybrid": [[18, "quantum-hybrid"]]}, "indexentries": {"grover (class in qlasskit.algorithms.grover)": [[7, "qlasskit.algorithms.grover.Grover"]], "__init__() (qlasskit.algorithms.grover.grover method)": [[7, "qlasskit.algorithms.grover.Grover.__init__"]], "module": [[8, "module-qlasskit.algorithms.qalgorithm"], [9, "module-qlasskit.qcircuit.gates"]], "qlasskit.algorithms.qalgorithm": [[8, "module-qlasskit.algorithms.qalgorithm"]], "qlasskit.qcircuit.gates": [[9, "module-qlasskit.qcircuit.gates"]], "qcircuit (class in qlasskit.qcircuit.qcircuit)": [[10, "qlasskit.qcircuit.qcircuit.QCircuit"]], "__init__() (qlasskit.qcircuit.qcircuit.qcircuit method)": [[10, "qlasskit.qcircuit.qcircuit.QCircuit.__init__"]], "qcircuitwrapper (class in qlasskit.qcircuit.qcircuitwrapper)": [[11, "qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper"]], "__init__() (qlasskit.qcircuit.qcircuitwrapper.qcircuitwrapper method)": [[11, "qlasskit.qcircuit.qcircuitwrapper.QCircuitWrapper.__init__"]], "qlassf (class in qlasskit.qlassfun)": [[12, "qlasskit.qlassfun.QlassF"]], "__init__() (qlasskit.qlassfun.qlassf method)": [[12, "qlasskit.qlassfun.QlassF.__init__"]], "qlassf() (in module qlasskit.qlassfun)": [[13, "qlasskit.qlassfun.qlassf"]], "qlassfa() (in module qlasskit.qlassfun)": [[14, "qlasskit.qlassfun.qlassfa"]]}}) \ No newline at end of file diff --git a/supported.html b/supported.html new file mode 100644 index 00000000..99aacfd2 --- /dev/null +++ b/supported.html @@ -0,0 +1,353 @@ + + + + + + + Supported python subset — qlasskit documentation + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Supported python subset

+

Qlasskit supports a subset of python. This subset will be expanded, but it is +limited by the linearity of quantum circuits and by the number of qubits.

+

The structure of a qlasskit function has the following pattern:

+
@qlasskit
+def f(param: type, [...param: type]) -> type:
+   statement
+   ...
+   statement
+
+
+
+

Types

+

All types has a static size.

+
+

bool

+

Boolean type.

+
+
+

Qint

+

Unsigned integers; this type has subtypes for different Qint sizes (Qint2, Qint4, Qint8, Qint12, Qint16). +Single bit of the Qint are accessible by the subscript operator [].

+
+
+

Tuple

+

Container type holding different types.

+
+
+

List

+

Qlist[T, size] denotes a fixed-size list in qlasskit. +For example, the list [1,2,3] is typed as Qlist[Qint2,3].

+
+
+

Matrix

+

Qmatrix[T, m, n] denotes a fixed-size list in qlasskit. +For example, the matrix [[1,2],[3,4]] is typed as Qmatrix[Qint2,2,2].

+
+
+
+

Expressions

+
+

Constants

+
True
+
+
+
42
+
+
+
+
+

Tuple

+
(a, b)
+
+
+
+
+

List (fixed size)

+
[a, b]
+
+
+
+
+

2D Matrix (fixed size)

+
[[a, b], [c,d]]
+
+
+
+
+

Subscript

+
a[0]
+
+
+
+
+

Boolean operators

+
not a
+
+
+
a and b
+
+
+
a or b
+
+
+
+
+

If expressions

+
a if b else c
+
+
+
+
+

Comparators

+
a > b or b <= c and c == d or c != a
+
+
+
+
+

Unary Op

+
~a
+
+
+
+
+

Bin Op

+
a << 1
+
+
+
a >> 2
+
+
+
a + b
+
+
+
a - b
+
+
+
a * b
+
+
+
+
+

Function call

+

Bultin functions: +- print(): debug function, ignore by conversion +- len(Tuple), len(Qlist)`: returns the length of a tuple +- max(a, b, …), max(Tuple), max(Qlist): returns the max of a tuple +- min(a, b, …), min(Tuple), min(Qlist): returns the min of a tuple +- sum(Tuple), sum(Qlist): returns the sum of the elemnts of a tuple / list +- all(Tuple), all(Qlist): returns True if all of the elemnts are True +- any(Tuple), any(Qlist): returns True if any of the elemnts are True

+
+
+
+

Statements

+
+

Assign

+
c = not a
+
+
+
+
+

Return

+
return b+1
+
+
+
+
+

For loop

+
for i in range(4):
+   a += i
+
+
+
+

Note

+

Please note that in qlasskit, for loops are unrolled during compilation. Therefore, +it is essential that the number of iterations for each for loop is known at the +time of compilation.

+
+
+
+

Function def

+
def f(t: Qlist[Qint4,2]) -> Qint4:
+   return t[0] + t[1]
+
+
+
+
+

If then else

+
c = 0
+if cond:
+   c += 12
+else:
+   c += 13
+
+
+
+

Note

+

At present, the if-then-else statement in qlasskit is designed to support branch bodies +that exclusively contain assignment statements.

+
+
+
+
+

Quantum Hybrid

+

In a qlassf function, you have the option to utilize quantum gates through the Q module. It’s +important to keep in mind that incorporating quantum gates within a qlasskit function leads +to a Python function that exhibits distinct behaviors compared to its quantum counterpart.

+
def bell(a: bool, b: bool) -> bool:
+   return Q.CX(Q.H(a), b)
+
+
+
+
+ + +
+
+ +
+
+
+
+ + + + \ No newline at end of file