diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 76e1d6dad0..7cf2c0a4f5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,5 +1,5 @@ -# Set Ivar Stefansson and Eirik Keilegavlen as global owners -* @keileg @IvarStefansson +# Set Ivar Stefansson, Omar Duran, and Eirik Keilegavlen as global owners +* @keileg @IvarStefansson @OmarDuran # Make vlipovac code owner of the docs folder -docs/* @vlipovac +/docs/* @vlipovac diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6d74d3be63..06c6427fab 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -27,7 +27,7 @@ jobs: # https://help.github.com/en/actions/language-and-framework-guides/using-python-with-github-actions#specifying-a-python-version strategy: matrix: - python-version: ["3.8", "3.9", "3.10"] # TODO: Change 3.10.6 to 3.10 when mypy error is fixed + python-version: ["3.8", "3.9", "3.10"] # Complete all versions in matrix even if one fails. fail-fast: false @@ -53,9 +53,8 @@ jobs: # Cache the full python environment, this is more efficient than just caching pip # https://blog.allenai.org/python-caching-in-github-actions-e9452698e98d path: ${{ env.pythonLocation }} - key: ${{ env.pythonLocation }}-pip-${{ hashFiles('**/requirements-dev.txt') }} - restore-keys: | - ${{ runner.os }}-pip- + # Hash both ordinary requirements and those specific for developmnet. + key: ${{ env.pythonLocation }}-${{ hashFiles('setup.py') }}-${{ hashFiles('**/requirements.txt', '**/requirements-dev.txt') }} - name: Cache mypy uses: actions/cache@v3 @@ -66,7 +65,10 @@ jobs: - name: Install external libraries run: | - sudo apt-get install libglu1-mesa libgeos-dev + # Various packages that must be installed + # Install libffi v7. This was (seemed to be) necessary in Nov 2022. The reason could be that + # ubuntu-latest was updated, libffi was removed, and scipy complained. + sudo apt-get install libglu1-mesa libgeos-dev libffi7 export LD_LIBRARY_PATH=/usr/local/lib64/:$LD_LIBRARY_PATH - name: Install requirements @@ -97,14 +99,14 @@ jobs: if: ${{ always() }} run: flake8 src - - name: mypy - if: ${{ always() }} - run: mypy src --cache-dir mypy-cache-${{ matrix.python-version}} - - name: unit tests if: ${{always()}} run: pytest tests/unit + - name: mypy + if: ${{ always() }} + run: mypy src --cache-dir mypy-cache-${{ matrix.python-version}} + - name: integration tests if: ${{always()}} run: pytest tests/integration diff --git a/docs/conf.py b/docs/conf.py index 41c8922279..d88adb838c 100644 --- a/docs/conf.py +++ b/docs/conf.py @@ -40,9 +40,10 @@ # extensions coming with Sphinx (named 'sphinx.ext.*') or your custom # ones. extensions = [ + 'sphinx.ext.napoleon', 'sphinx.ext.autodoc', + # 'sphinx_autodoc_typehints', # this moves type links from signature to docstring 'sphinx.ext.intersphinx', - 'sphinx.ext.napoleon', 'sphinx.ext.todo', 'sphinx.ext.viewcode', ] @@ -62,28 +63,38 @@ # -- Options for HTML output ------------------------------------------------------------------ # The theme to use for HTML and HTML Help pages. Currently set to theme of Python 2 docs -html_theme = "nature" +html_theme = "sphinx_rtd_theme" # Add any paths that contain custom static files (such as style sheets) here, # relative to this directory. They are copied after the builtin static files, # so a file named "default.css" will overwrite the builtin "default.css". -html_static_path = ["static"] - -# Customize the html theme here. Supported customization depends on the chosen HTML theme, -# but unknown entries will cause no error when compiling. -html_theme_options = { - # "rightsidebar": "false", - # "relbarbgcolor": "black", - # "externalrefs": "true", - # "bodyfont": "Arial", - # "headfont": "Arial", -} +html_static_path = [] html_short_title = "PorePy" html_split_index = True html_copy_source = False html_show_sourcelink = False html_show_sphinx = False +html_baseurl = 'https://pmgbergen.github.io/porepy/' + +# relative path to project logo, to be displayed on docs webpage +# html_logo = '' + +# theme-specific customization, read the docs of respective theme +html_theme_options = { + 'logo_only': False, + 'display_version': True, + 'prev_next_buttons_location': 'bottom', + 'style_external_links': True, + 'vcs_pageview_mode': '', + 'style_nav_header_background': '#2980B9', + # Toc options + 'collapse_navigation': False, + 'sticky_navigation': True, + 'navigation_depth': 4, + 'includehidden': True, + 'titles_only': False +} # -- Autodoc Settings ------------------------------------------------------------------------- @@ -96,9 +107,21 @@ # orders the members of an object group wise, e.g. private, special or public methods autodoc_member_order = "groupwise" # alphabetical-groupwise-bysource +# Avoid double appearance of documentation if child member has no docs +autodoc_inherit_docstrings = False + +# do not evaluate default arguments, leave as is +autodoc_preserve_defaults = True + # type hints will be shortened: porepy.grids.grid.Grid -> Grid autodoc_typehints_format = "short" +# uses type hints in signatures for e.g. linking (default) +autodoc_typehints = "signature" + +# display types in signature which are documented, or all (by default) +autodoc_typehints_description_target = 'all' # all-documented + # default configurations for all autodoc directives autodoc_default_options = { "members": True, @@ -109,14 +132,15 @@ "no-value": False } -# uses type hints in signatures for e.g. linking (default) -autodoc_typehints = "signature" - -# Avoid double appearance of documentation if child member has no docs -autodoc_inherit_docstrings = False - # Used to shorten the parsing of type hint aliases -autodoc_type_aliases = {} +# NOTE: As of now, hyperlinking to type aliases is an open issue +# see https://github.com/sphinx-doc/sphinx/issues/10785 +autodoc_type_aliases = { + 'ArrayLike': 'ArrayLike', + 'NDArray': 'NDArray', + 'DTypeLike': 'DTypeLike', + 'ExampleArrayLike': 'ExampleArrayLike', +} # -- Napoleon Settings ------------------------------------------------------------------------ @@ -125,16 +149,27 @@ # napoleon_include_init_with_doc = False # napoleon_include_private_with_doc = False # napoleon_include_special_with_doc = False -napoleon_use_admonition_for_examples = False -napoleon_use_admonition_for_notes = False -napoleon_use_admonition_for_references = False +napoleon_use_admonition_for_examples = True +napoleon_use_admonition_for_notes = True +napoleon_use_admonition_for_references = True napoleon_use_ivar = False napoleon_use_param = True +napoleon_use_keyword = True napoleon_use_rtype = True -napoleon_preprocess_types = False -napoleon_type_aliases = None +napoleon_preprocess_types = True +napoleon_type_aliases = { +} napoleon_attr_annotations = True +# -- Autodoc typehints settings --------------------------------------------------------------- + +# typehints_fully_qualified = False +# always_document_param_types = False +# typehints_document_rtype = True +# typehints_use_rtype = False +# typehints_defaults = 'braces' +# simplify_optional_unions = False + # -- Intersphinx Settings --------------------------------------------------------------------- intersphinx_mapping = { @@ -149,5 +184,3 @@ todo_include_todos = True todo_emit_warnings = False todo_link_only = False - -# -- Viewcode Settings ------------------------------------------------------------------------ diff --git a/docs/docsrc/howto/howto-docstring.rst b/docs/docsrc/howto/howto-docstring.rst index bdc0ce5aaf..79b822c964 100644 --- a/docs/docsrc/howto/howto-docstring.rst +++ b/docs/docsrc/howto/howto-docstring.rst @@ -40,6 +40,10 @@ Directives Next to plain text, the content of your documentation can be created using *directives*, followed by a block of indented text. +Directives are structural blocks inside the text of a documentation. +They provide specific formatting for sections dedicated to e.g., function parameters, +return values or exmaple code. + For example, the *note* directive in plain rst code :: .. note:: Implementation @@ -142,40 +146,60 @@ As a consequence, **we abstain from including type hints in docstrings** and kee This rule does not exclude custom linking and referencing in-text, where a developer feels the necessity to do so. +.. rubric:: Google style directives + +Google style directives are aliases for standard directives, which simplify the usage and syntax. +Besides the obligatory declaration of parameters, return values and raised errors, +the PorePy style encourages the use of other sections to provide notes, example code usage, references, etc. + +For a list of all supported Google style directives, +`see Google style docstring sections `_. + +The compulsory order of directives inside a docstring is: + + 1. Examples, Note, ... + 2. References, See Also + 3. Parameters + 4. Returns/ Yields + 5. Raises + +Other rules: + + * When using Google Style directives do not type additional text **between** and **after** the + directives References/See Also, Parameters, Returns/Yields and Raises. + * End every docstring with a blank line before \"\"\". This is especially important after + the *Returns:* directive and its indented block. + +.. note:: + The Google Style directives are only valid when used inside docstrings, + but not so when used in .rst files. Keep this in mind, in case you deal with the .rst + structure of the webpage. Documenting variables --------------------- -.. autodata:: example_docstrings.module_level_var_1 +.. autodata:: example_docstrings.example_var_1 + +.. autodata:: example_docstrings.example_var_2 -.. autodata:: example_docstrings.module_level_var_2 +.. autodata:: example_docstrings.example_var_3 -.. autodata:: example_docstrings.module_level_var_3 +.. autodata:: example_docstrings.ExampleArrayLike Documenting functions --------------------- -.. autofunction:: example_docstrings.module_level_function_1 +.. autofunction:: example_docstrings.example_function_1 -.. autofunction:: example_docstrings.module_level_function_2 +.. autofunction:: example_docstrings.example_function_2 -.. autofunction:: example_docstrings.module_level_function_3 +.. autofunction:: example_docstrings.example_function_3 -.. autofunction:: example_docstrings.module_level_function_4 +.. autofunction:: example_docstrings.example_function_4 -.. autofunction:: example_docstrings.example_generator +.. autofunction:: example_docstrings.example_function_5 -.. rubric:: Directives inside docstrings - -* Write the directive blocks in the following order - 1. Examples, Note - 2. Parameters - 3. Returns/ Yields - 4. Raises -* When using Google Style directives do not type additional text **between** and **after** the - directives Parameters, Returns/Yields and Raises. -* End every docstring with a blank line before \"\"\". This is especially important after - the *Returns:* directive and its indented block. +.. autofunction:: example_docstrings.example_generator Documenting classes ------------------- diff --git a/docs/doctrees/docsrc/howto/howto-docstring.doctree b/docs/doctrees/docsrc/howto/howto-docstring.doctree index 351ddae7f9..f61886f5f2 100644 Binary files a/docs/doctrees/docsrc/howto/howto-docstring.doctree and b/docs/doctrees/docsrc/howto/howto-docstring.doctree differ diff --git a/docs/doctrees/docsrc/porepy/numerics/ad/numerics-ad.doctree b/docs/doctrees/docsrc/porepy/numerics/ad/numerics-ad.doctree index b13d7130c9..9185717384 100644 Binary files a/docs/doctrees/docsrc/porepy/numerics/ad/numerics-ad.doctree and b/docs/doctrees/docsrc/porepy/numerics/ad/numerics-ad.doctree differ diff --git a/docs/doctrees/docsrc/porepy/numerics/numerics.doctree b/docs/doctrees/docsrc/porepy/numerics/numerics.doctree index 8283a8f69a..3eaa453acf 100644 Binary files a/docs/doctrees/docsrc/porepy/numerics/numerics.doctree and b/docs/doctrees/docsrc/porepy/numerics/numerics.doctree differ diff --git a/docs/doctrees/environment.pickle b/docs/doctrees/environment.pickle index c8965603f2..6d79f4e30f 100644 Binary files a/docs/doctrees/environment.pickle and b/docs/doctrees/environment.pickle differ diff --git a/docs/doctrees/index.doctree b/docs/doctrees/index.doctree index 2ec7d51be1..d083a91530 100644 Binary files a/docs/doctrees/index.doctree and b/docs/doctrees/index.doctree differ diff --git a/docs/example_docstrings.py b/docs/example_docstrings.py index 0e9890e76a..9f2270a9c5 100644 --- a/docs/example_docstrings.py +++ b/docs/example_docstrings.py @@ -44,7 +44,8 @@ """ from __future__ import annotations -from typing import Generator, Literal, Optional +from typing import Generator, Literal, Optional, Union +from numpy.typing import ArrayLike, NDArray, DTypeLike import numpy as np import scipy.sparse as sps @@ -52,11 +53,11 @@ import porepy as pp -module_level_var_1: str = "var" +example_var_1: str = "var" """Variables at the module level are documented inline after declaration.""" -module_level_var_2: int = 1 +example_var_2: int = 1 """Multi-line docstrings are also valid. You might want to use multiline docstrings when a more detailed description @@ -96,7 +97,7 @@ """ -module_level_var_3: int = 42 +example_var_3: int = 42 """int: **DO NOT** start the docstring with ``int:``, i.e. with type hints. This will render the below ``Type: int``, which is unnecessary due to the already present @@ -107,20 +108,24 @@ .. code:: Python - module_level_var_3: int = 1 + example_var_3: int = 1 \"\"\"This is var 3.\"\"\" **DO NOT:** .. code:: Python - module_level_var_3 = 1 + example_var_3 = 1 \"\"\"int: This is var 3.\"\"\" """ -def module_level_function_1(arg1: int, arg2: str, arg3: bool) -> bool: +ExampleArrayLike = Union[list, np.ndarray] +"""This is a custom type alias, including lists and numpy's ``ndarray``.""" + + +def example_function_1(arg1: int, arg2: str, arg3: bool) -> bool: """A short description of the functionality must fit in the first line. Detailed description can be given next if necessary. The extended description @@ -133,10 +138,10 @@ def module_level_function_1(arg1: int, arg2: str, arg3: bool) -> bool: Note: You can find the ``[source]`` link in the upper right corner of this function's - documentation and take a look at the Python and rst source code of this docstring, + signature and inspect the Python and rst source code of this docstring, as well as for every docstring that follows. - The return value can be described using the Google Style directive *Returns:*. + The return value must be documented using the Google Style directive *Returns:*. Parameters: arg1: Description of arg1. @@ -161,21 +166,25 @@ def module_level_function_1(arg1: int, arg2: str, arg3: bool) -> bool: return (arg1 > len(arg2)) and arg3 -def module_level_function_2( +def example_function_2( optional_arg: Optional[int] = None, *args, **kwargs ) -> None: - """Optional arguments must be type-hinted using :class:`typing.Optional`. + """This function demonstrates linking to objects inside docstrings, optional arguments and + the *Raises:* directive. + + Optional arguments must be type-hinted using :obj:`typing.Optional`. As evident, you can link objects in-text. You can also link functions like - :meth:`module_level_function_1`. + :meth:`example_function_1`. Note the different usage of ``:obj:`` and ``:class:`` for + objects in third-party packages and objects in PorePy. If ``*args`` or ``**kwargs`` are accepted, they must be listed as ``*args`` and ``**kwargs`` in the *Parameters* directive. Note: - We note that this function returns ``None`` as per signature. - This is the default return value of Python and as such does not need documentation. - I.e., we can omit the *Returns:* directive. However, it is important to explicitly + This function returns ``None`` as per signature. + It is the default return value of Python and as such does not need documentation. + I.e., we can omit the *Returns:* directive. However, it is obligatory to explicitly specify the None return in the signature. Parameters: @@ -203,15 +212,13 @@ def module_level_function_2( pass -def module_level_function_3( +def example_function_3( mdg: pp.MixedDimensionalGrid, vector: np.ndarray, matrix: sps.spmatrix, option: Literal["A", "B", "C"] = "A", ) -> sps.spmatrix: - """We demonstrate here the intra- and inter-doc linking to non-base-type Python objects - in the signature, - as well as how to document special requirements for the arguments. + """This function demonstrates how to document special requirements for input arguments. Parameters: mdg: A mixed-dimensional grid. Notice the usage of the acronym ``mdg``. @@ -219,13 +226,12 @@ def module_level_function_3( We use the type hint brackets to indicate its supposed length. The required length is ``num_cells``, the number of cells. If unclear to what the number refers, explain. - E.g. where ``num_cells`` denotes the number of cells in ``mdg``. matrix (shape=(3, num_cells)): This argument is a sparse matrix with 3 rows and ``num_cells`` columns. option (optional): This argument has admissible values and a default value. it can only be a string ``'A'``, ``'B'`` or ``'C'``. For such admissible values use - :class:`typing.literal` to denote them in the signature. + :obj:`typing.Literal` to denote them in the signature. Since it has a default value, we mark it with ``(optional)``. Returns: @@ -246,11 +252,11 @@ def module_level_function_3( pass -def module_level_function_4( +def example_function_4( vector: np.ndarray, matrix: sps.spmatrix, -) -> tuple[sps.spmatrix, np.ndarray] | None: - """Functions with multiple return values need better description in the *Returns:* +) -> tuple[sps.spmatrix, np.ndarray]: + """This function demonstrates how to document multiple return values in the *Returns:* directive. Parameters: @@ -261,18 +267,41 @@ def module_level_function_4( Every returned object needs a description. We can use the same structure as for the parameters: indented block per returned object or value. - spmatrix: + spmatrix ``(shape=(3, nd))``: Though technically the tuple is a single object, it often is of - importance what the tuple contains. + importance what the tuple contains. If the returned object has noteworthy + characteristic, explain them next to the bullet header, the same way as for + parameters. ndarray: - We therefore use again the definition list structure with indented blocks to + Use the definition list structure with indented blocks to describe the content individually. This makes of course only sense if the tuple is of fixed length and/or contains objects of various types. - None: - The same rules hold for union return types. - Raises: - ValueError: If ``option`` is not in ``{'A', 'B', 'C'}``. + """ + pass + + +def example_function_5( + array_like: ArrayLike, + ndarray_like: NDArray, + dtype_like: DTypeLike, +) -> ExampleArrayLike: + """This function demonstrates type annotations using custom type aliases, including those + from third-party packages. + + For Sphinx to display type aliases without parsing their complete expression, + a configuration is needed which maps the type alias to its source. + + When encountering type aliases, which are not already covered by the configuration of + PorePy's docs, please contact the core developers. + + Parameters: + array_like: an argument of type :obj:`~numpy.typing.ArrayLike` + ndarray_like: an argument of type :obj:`~numpy.typing.NDArray` + dtype_like: an argument of type :obj:`~numpy.typing.DTypeLike` + + Returns: + a value of a custom array type :data:`ExampleArrayLike`. """ pass @@ -283,11 +312,8 @@ def example_generator(n: int) -> Generator[int, None, None]: Their usage is equivalent, indicating only that this is a generator object, not a regular function. - Examples: - The Google Style offers an *Examples:* directives where you can write text but also - include inline examples of code usage, without the special code directive from Sphinx. - An indented block with the content has to follow the directive. Like all for all - directives, a blank line after the indented block signalizes the end of the directive. + Example: + Here we demonstrate the usage of ``example_generator`` using the *Example:* directive: >>> print([i for i in example_generator(4)]) [0, 1, 2, 3] @@ -313,8 +339,31 @@ class ExampleClass: *Note:* directives can be used the same way as for functions. - At the end follows obligatory the *Parameters:* directive and a *Raises:* directive, - if errors are raised in the constructor for some reason. + Example: + Using the *Example:* directive, you can provide simplified python syntax using ``>>>`` + on how to instantiate the class for example: + + >>> import example_docstrings as ed + >>> A = ed.ExampleClass() + >>> print(type(A)) + + + Use the *References:* and *See Also:* directives to provide links to sources or + inspirations for your implementation. + + For readability reasons, we impose the same rules on the order of directives as for + functions. Meaning references/ see also, followed by parameters, return/yield and raises + must be placed at the end with no additional text in between. + + References: + 1. `Basic Google Style + `_. + + See Also: + `Same, but in different directive + `_. Parameters: arg1: first argument. diff --git a/docs/html/.buildinfo b/docs/html/.buildinfo index 8acfaebd74..acd5db00f9 100644 --- a/docs/html/.buildinfo +++ b/docs/html/.buildinfo @@ -1,4 +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: 73117507a055de80d3e2cd9377d56e97 +config: 21375f1304e0c230cf7e7ff241e18de7 tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/docs/html/_modules/example_docstrings.html b/docs/html/_modules/example_docstrings.html index 1a70ca4af4..7bd9254e83 100644 --- a/docs/html/_modules/example_docstrings.html +++ b/docs/html/_modules/example_docstrings.html @@ -1,41 +1,79 @@ - - - - - - - example_docstrings — PorePy 1.5 documentation - - - - - - - + + + + + example_docstrings — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
+
+ + + \ No newline at end of file diff --git a/docs/html/_modules/index.html b/docs/html/_modules/index.html index c49564d4dc..3ca07ae90f 100644 --- a/docs/html/_modules/index.html +++ b/docs/html/_modules/index.html @@ -1,40 +1,78 @@ - - - - - - - Overview: module code — PorePy 1.5 documentation - - - - - - - + + + + + Overview: module code — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ -
-
-
-
- +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/_modules/porepy/numerics/ad/functions.html b/docs/html/_modules/porepy/numerics/ad/functions.html index eec93677b9..d6c720093b 100644 --- a/docs/html/_modules/porepy/numerics/ad/functions.html +++ b/docs/html/_modules/porepy/numerics/ad/functions.html @@ -301,8 +301,15 @@

Source code for porepy.numerics.ad.functions

[docs]def heaviside_smooth(var, eps: float = 1e-3):
-    """
-    Smooth (regularized) version of the Heaviside function.
+    """Smooth (regularized) version of the Heaviside function.
+
+    Note:
+        The analytical expression for the smooth version Heaviside function reads:
+            ``H_eps(x) = (1/2) * (1 + (2/pi) * arctan(x/eps))``,
+        with its derivative smoothly approximating the Dirac delta function:
+            ``d(H(x))/dx = delta_eps = (1/pi) * (eps / (eps^2 + x^2))``.
+
+        Reference: https://ieeexplore.ieee.org/document/902291
 
     Parameters:
         var: Input array.
@@ -313,14 +320,6 @@ 

Source code for porepy.numerics.ad.functions

        Regularized heaviside function (and its Jacobian if applicable) in form of a
         Ad_array or ndarray (depending on the input).
 
-    Note:
-        The analytical expression for the smooth version Heaviside function reads:
-            ``H_eps(x) = (1/2) * (1 + (2/pi) * arctan(x/eps))``,
-        with its derivative smoothly approximating the Dirac delta function:
-            ``d(H(x))/dx = delta_eps = (1/pi) * (eps / (eps^2 + x^2))``.
-
-        Reference: https://ieeexplore.ieee.org/document/902291
-
     """
     if isinstance(var, Ad_array):
         val = 0.5 * (1 + 2 * np.pi ** (-1) * np.arctan(var.val * eps ** (-1)))
@@ -353,7 +352,7 @@ 

Source code for porepy.numerics.ad.functions

    wrapped in a pp.ad.Array, whereas the first argument is expected to be an
     Ad_array originating from a pp.ad.Operator.
 
-    Args:
+    Parameters:
         var0: First argument to the maximum function.
         var1: Second argument.
 
@@ -384,10 +383,10 @@ 

Source code for porepy.numerics.ad.functions

    Returns 1 if ``var.val`` is within absolute tolerance = ``tol`` of zero.
     The derivative is set to zero independent of ``var.val``.
 
-    Notes:
+    Note:
         See module level documentation on how to wrap functions like this in ``ad.Function``.
 
-    Args:
+    Parameters:
         tol: Absolute tolerance for comparison with 0 using np.isclose.
         var: Ad operator (variable or expression).
 
diff --git a/docs/html/_modules/porepy/numerics/ad/operator_functions.html b/docs/html/_modules/porepy/numerics/ad/operator_functions.html
index 5012f5b220..f72688343b 100644
--- a/docs/html/_modules/porepy/numerics/ad/operator_functions.html
+++ b/docs/html/_modules/porepy/numerics/ad/operator_functions.html
@@ -47,7 +47,7 @@ 

Source code for porepy.numerics.ad.operator_functions

import abc from functools import partial -from typing import Callable, List, Optional, Type, Union +from typing import Callable, Optional, Type, Union import numpy as np import scipy.sparse as sps @@ -127,7 +127,7 @@

Source code for porepy.numerics.ad.operator_functions

self._operation: Operation = Operation.evaluate self._set_tree() -
[docs] def __call__(self, *args: pp.ad.Operator | Ad_array): +
[docs] def __call__(self, *args: pp.ad.Operator | Ad_array) -> pp.ad.Operator: """Renders this function operator callable, fulfilling its notion as 'function'. Parameters: @@ -360,7 +360,7 @@

Source code for porepy.numerics.ad.operator_functions

self, func: Callable, name: str, - multipliers: Union[List[float], float], + multipliers: float | list[float], array_compatible: bool = False, ): super().__init__(func, name, array_compatible) @@ -625,7 +625,7 @@

Source code for porepy.numerics.ad.operator_functions

# This will trigger the function evaluation. return partial(self.__call__, binding_instance)
-
[docs] def ad_wrapper(self, *args, **kwargs) -> AbstractFunction: +
[docs] def ad_wrapper(self, *args, **kwargs) -> Operator: """Actual wrapper function. Constructs the necessary AD-Operator class wrapping the decorated callable and performs the evaluation/call. diff --git a/docs/html/_modules/porepy/numerics/ad/operators.html b/docs/html/_modules/porepy/numerics/ad/operators.html index 19b81c777e..7482e10f8e 100644 --- a/docs/html/_modules/porepy/numerics/ad/operators.html +++ b/docs/html/_modules/porepy/numerics/ad/operators.html @@ -293,9 +293,6 @@

Source code for porepy.numerics.ad.operators

"""Perform the ``discretize`` function of all child operators which are discretizations
         using data from mdg.
 
-        IMPLEMENTATION NOTE: The discretizations was identified at initialization of
-        Expression - it is now done here to accommodate updates (?) and
-
         """
         unique_discretizations: dict[
             _ad_utils.MergedOperator, GridLike
@@ -781,7 +778,7 @@ 

Source code for porepy.numerics.ad.operators

self,
         dof_manager: pp.DofManager,
         state: Optional[np.ndarray] = None,
-    ) -> Ad_array:
+    ):
         """Evaluate the residual and Jacobian matrix for a given state.
 
         Parameters:
diff --git a/docs/html/_modules/typing.html b/docs/html/_modules/typing.html
new file mode 100644
index 0000000000..9343d64333
--- /dev/null
+++ b/docs/html/_modules/typing.html
@@ -0,0 +1,2307 @@
+
+
+
+  
+  
+  typing — PorePy 1.5 documentation
+      
+      
+  
+  
+        
+        
+        
+        
+        
+    
+    
+     
+
+
+ 
+  
+ + +
+ +
+
+
+ +
+
+
+
+ +

Source code for typing

+"""
+The typing module: Support for gradual typing as defined by PEP 484.
+
+At large scale, the structure of the module is following:
+* Imports and exports, all public names should be explicitly added to __all__.
+* Internal helper functions: these should never be used in code outside this module.
+* _SpecialForm and its instances (special forms): Any, NoReturn, ClassVar, Union, Optional
+* Two classes whose instances can be type arguments in addition to types: ForwardRef and TypeVar
+* The core of internal generics API: _GenericAlias and _VariadicGenericAlias, the latter is
+  currently only used by Tuple and Callable. All subscripted types like X[int], Union[int, str],
+  etc., are instances of either of these classes.
+* The public counterpart of the generics API consists of two classes: Generic and Protocol.
+* Public helper functions: get_type_hints, overload, cast, no_type_check,
+  no_type_check_decorator.
+* Generic aliases for collections.abc ABCs and few additional protocols.
+* Special types: NewType, NamedTuple, TypedDict.
+* Wrapper submodules for re and io related types.
+"""
+
+from abc import abstractmethod, ABCMeta
+import collections
+import collections.abc
+import contextlib
+import functools
+import operator
+import re as stdlib_re  # Avoid confusion with the re we export.
+import sys
+import types
+from types import WrapperDescriptorType, MethodWrapperType, MethodDescriptorType, GenericAlias
+
+# Please keep __all__ alphabetized within each category.
+__all__ = [
+    # Super-special typing primitives.
+    'Annotated',
+    'Any',
+    'Callable',
+    'ClassVar',
+    'Final',
+    'ForwardRef',
+    'Generic',
+    'Literal',
+    'Optional',
+    'Protocol',
+    'Tuple',
+    'Type',
+    'TypeVar',
+    'Union',
+
+    # ABCs (from collections.abc).
+    'AbstractSet',  # collections.abc.Set.
+    'ByteString',
+    'Container',
+    'ContextManager',
+    'Hashable',
+    'ItemsView',
+    'Iterable',
+    'Iterator',
+    'KeysView',
+    'Mapping',
+    'MappingView',
+    'MutableMapping',
+    'MutableSequence',
+    'MutableSet',
+    'Sequence',
+    'Sized',
+    'ValuesView',
+    'Awaitable',
+    'AsyncIterator',
+    'AsyncIterable',
+    'Coroutine',
+    'Collection',
+    'AsyncGenerator',
+    'AsyncContextManager',
+
+    # Structural checks, a.k.a. protocols.
+    'Reversible',
+    'SupportsAbs',
+    'SupportsBytes',
+    'SupportsComplex',
+    'SupportsFloat',
+    'SupportsIndex',
+    'SupportsInt',
+    'SupportsRound',
+
+    # Concrete collection types.
+    'ChainMap',
+    'Counter',
+    'Deque',
+    'Dict',
+    'DefaultDict',
+    'List',
+    'OrderedDict',
+    'Set',
+    'FrozenSet',
+    'NamedTuple',  # Not really a type.
+    'TypedDict',  # Not really a type.
+    'Generator',
+
+    # One-off things.
+    'AnyStr',
+    'cast',
+    'final',
+    'get_args',
+    'get_origin',
+    'get_type_hints',
+    'NewType',
+    'no_type_check',
+    'no_type_check_decorator',
+    'NoReturn',
+    'overload',
+    'runtime_checkable',
+    'Text',
+    'TYPE_CHECKING',
+]
+
+# The pseudo-submodules 're' and 'io' are part of the public
+# namespace, but excluded from __all__ because they might stomp on
+# legitimate imports of those modules.
+
+
+def _type_convert(arg):
+    """For converting None to type(None), and strings to ForwardRef."""
+    if arg is None:
+        return type(None)
+    if isinstance(arg, str):
+        return ForwardRef(arg)
+    return arg
+
+
+def _type_check(arg, msg, is_argument=True):
+    """Check that the argument is a type, and return it (internal helper).
+
+    As a special case, accept None and return type(None) instead. Also wrap strings
+    into ForwardRef instances. Consider several corner cases, for example plain
+    special forms like Union are not valid, while Union[int, str] is OK, etc.
+    The msg argument is a human-readable error message, e.g::
+
+        "Union[arg, ...]: arg should be a type."
+
+    We append the repr() of the actual value (truncated to 100 chars).
+    """
+    invalid_generic_forms = (Generic, Protocol)
+    if is_argument:
+        invalid_generic_forms = invalid_generic_forms + (ClassVar, Final)
+
+    arg = _type_convert(arg)
+    if (isinstance(arg, _GenericAlias) and
+            arg.__origin__ in invalid_generic_forms):
+        raise TypeError(f"{arg} is not valid as type argument")
+    if arg in (Any, NoReturn):
+        return arg
+    if isinstance(arg, _SpecialForm) or arg in (Generic, Protocol):
+        raise TypeError(f"Plain {arg} is not valid as type argument")
+    if isinstance(arg, (type, TypeVar, ForwardRef)):
+        return arg
+    if not callable(arg):
+        raise TypeError(f"{msg} Got {arg!r:.100}.")
+    return arg
+
+
+def _type_repr(obj):
+    """Return the repr() of an object, special-casing types (internal helper).
+
+    If obj is a type, we return a shorter version than the default
+    type.__repr__, based on the module and qualified name, which is
+    typically enough to uniquely identify a type.  For everything
+    else, we fall back on repr(obj).
+    """
+    if isinstance(obj, types.GenericAlias):
+        return repr(obj)
+    if isinstance(obj, type):
+        if obj.__module__ == 'builtins':
+            return obj.__qualname__
+        return f'{obj.__module__}.{obj.__qualname__}'
+    if obj is ...:
+        return('...')
+    if isinstance(obj, types.FunctionType):
+        return obj.__name__
+    return repr(obj)
+
+
+def _collect_type_vars(types):
+    """Collect all type variable contained in types in order of
+    first appearance (lexicographic order). For example::
+
+        _collect_type_vars((T, List[S, T])) == (T, S)
+    """
+    tvars = []
+    for t in types:
+        if isinstance(t, TypeVar) and t not in tvars:
+            tvars.append(t)
+        if isinstance(t, (_GenericAlias, GenericAlias)):
+            tvars.extend([t for t in t.__parameters__ if t not in tvars])
+    return tuple(tvars)
+
+
+def _check_generic(cls, parameters, elen):
+    """Check correct count for parameters of a generic cls (internal helper).
+    This gives a nice error message in case of count mismatch.
+    """
+    if not elen:
+        raise TypeError(f"{cls} is not a generic class")
+    alen = len(parameters)
+    if alen != elen:
+        raise TypeError(f"Too {'many' if alen > elen else 'few'} parameters for {cls};"
+                        f" actual {alen}, expected {elen}")
+
+
+def _deduplicate(params):
+    # Weed out strict duplicates, preserving the first of each occurrence.
+    all_params = set(params)
+    if len(all_params) < len(params):
+        new_params = []
+        for t in params:
+            if t in all_params:
+                new_params.append(t)
+                all_params.remove(t)
+        params = new_params
+        assert not all_params, all_params
+    return params
+
+
+def _remove_dups_flatten(parameters):
+    """An internal helper for Union creation and substitution: flatten Unions
+    among parameters, then remove duplicates.
+    """
+    # Flatten out Union[Union[...], ...].
+    params = []
+    for p in parameters:
+        if isinstance(p, _UnionGenericAlias):
+            params.extend(p.__args__)
+        elif isinstance(p, tuple) and len(p) > 0 and p[0] is Union:
+            params.extend(p[1:])
+        else:
+            params.append(p)
+
+    return tuple(_deduplicate(params))
+
+
+def _flatten_literal_params(parameters):
+    """An internal helper for Literal creation: flatten Literals among parameters"""
+    params = []
+    for p in parameters:
+        if isinstance(p, _LiteralGenericAlias):
+            params.extend(p.__args__)
+        else:
+            params.append(p)
+    return tuple(params)
+
+
+_cleanups = []
+
+
+def _tp_cache(func=None, /, *, typed=False):
+    """Internal wrapper caching __getitem__ of generic types with a fallback to
+    original function for non-hashable arguments.
+    """
+    def decorator(func):
+        cached = functools.lru_cache(typed=typed)(func)
+        _cleanups.append(cached.cache_clear)
+
+        @functools.wraps(func)
+        def inner(*args, **kwds):
+            try:
+                return cached(*args, **kwds)
+            except TypeError:
+                pass  # All real errors (not unhashable args) are raised below.
+            return func(*args, **kwds)
+        return inner
+
+    if func is not None:
+        return decorator(func)
+
+    return decorator
+
+def _eval_type(t, globalns, localns, recursive_guard=frozenset()):
+    """Evaluate all forward references in the given type t.
+    For use of globalns and localns see the docstring for get_type_hints().
+    recursive_guard is used to prevent prevent infinite recursion
+    with recursive ForwardRef.
+    """
+    if isinstance(t, ForwardRef):
+        return t._evaluate(globalns, localns, recursive_guard)
+    if isinstance(t, (_GenericAlias, GenericAlias)):
+        ev_args = tuple(_eval_type(a, globalns, localns, recursive_guard) for a in t.__args__)
+        if ev_args == t.__args__:
+            return t
+        if isinstance(t, GenericAlias):
+            return GenericAlias(t.__origin__, ev_args)
+        else:
+            return t.copy_with(ev_args)
+    return t
+
+
+class _Final:
+    """Mixin to prohibit subclassing"""
+
+    __slots__ = ('__weakref__',)
+
+    def __init_subclass__(self, /, *args, **kwds):
+        if '_root' not in kwds:
+            raise TypeError("Cannot subclass special typing classes")
+
+class _Immutable:
+    """Mixin to indicate that object should not be copied."""
+    __slots__ = ()
+
+    def __copy__(self):
+        return self
+
+    def __deepcopy__(self, memo):
+        return self
+
+
+# Internal indicator of special typing constructs.
+# See __doc__ instance attribute for specific docs.
+class _SpecialForm(_Final, _root=True):
+    __slots__ = ('_name', '__doc__', '_getitem')
+
+    def __init__(self, getitem):
+        self._getitem = getitem
+        self._name = getitem.__name__
+        self.__doc__ = getitem.__doc__
+
+    def __mro_entries__(self, bases):
+        raise TypeError(f"Cannot subclass {self!r}")
+
+    def __repr__(self):
+        return 'typing.' + self._name
+
+    def __reduce__(self):
+        return self._name
+
+    def __call__(self, *args, **kwds):
+        raise TypeError(f"Cannot instantiate {self!r}")
+
+    def __instancecheck__(self, obj):
+        raise TypeError(f"{self} cannot be used with isinstance()")
+
+    def __subclasscheck__(self, cls):
+        raise TypeError(f"{self} cannot be used with issubclass()")
+
+    @_tp_cache
+    def __getitem__(self, parameters):
+        return self._getitem(self, parameters)
+
+
+class _LiteralSpecialForm(_SpecialForm, _root=True):
+    @_tp_cache(typed=True)
+    def __getitem__(self, parameters):
+        return self._getitem(self, parameters)
+
+
+@_SpecialForm
+def Any(self, parameters):
+    """Special type indicating an unconstrained type.
+
+    - Any is compatible with every type.
+    - Any assumed to have all methods.
+    - All values assumed to be instances of Any.
+
+    Note that all the above statements are true from the point of view of
+    static type checkers. At runtime, Any should not be used with instance
+    or class checks.
+    """
+    raise TypeError(f"{self} is not subscriptable")
+
+@_SpecialForm
+def NoReturn(self, parameters):
+    """Special type indicating functions that never return.
+    Example::
+
+      from typing import NoReturn
+
+      def stop() -> NoReturn:
+          raise Exception('no way')
+
+    This type is invalid in other positions, e.g., ``List[NoReturn]``
+    will fail in static type checkers.
+    """
+    raise TypeError(f"{self} is not subscriptable")
+
+@_SpecialForm
+def ClassVar(self, parameters):
+    """Special type construct to mark class variables.
+
+    An annotation wrapped in ClassVar indicates that a given
+    attribute is intended to be used as a class variable and
+    should not be set on instances of that class. Usage::
+
+      class Starship:
+          stats: ClassVar[Dict[str, int]] = {} # class variable
+          damage: int = 10                     # instance variable
+
+    ClassVar accepts only types and cannot be further subscribed.
+
+    Note that ClassVar is not a class itself, and should not
+    be used with isinstance() or issubclass().
+    """
+    item = _type_check(parameters, f'{self} accepts only single type.')
+    return _GenericAlias(self, (item,))
+
+@_SpecialForm
+def Final(self, parameters):
+    """Special typing construct to indicate final names to type checkers.
+
+    A final name cannot be re-assigned or overridden in a subclass.
+    For example:
+
+      MAX_SIZE: Final = 9000
+      MAX_SIZE += 1  # Error reported by type checker
+
+      class Connection:
+          TIMEOUT: Final[int] = 10
+
+      class FastConnector(Connection):
+          TIMEOUT = 1  # Error reported by type checker
+
+    There is no runtime checking of these properties.
+    """
+    item = _type_check(parameters, f'{self} accepts only single type.')
+    return _GenericAlias(self, (item,))
+
+@_SpecialForm
+def Union(self, parameters):
+    """Union type; Union[X, Y] means either X or Y.
+
+    To define a union, use e.g. Union[int, str].  Details:
+    - The arguments must be types and there must be at least one.
+    - None as an argument is a special case and is replaced by
+      type(None).
+    - Unions of unions are flattened, e.g.::
+
+        Union[Union[int, str], float] == Union[int, str, float]
+
+    - Unions of a single argument vanish, e.g.::
+
+        Union[int] == int  # The constructor actually returns int
+
+    - Redundant arguments are skipped, e.g.::
+
+        Union[int, str, int] == Union[int, str]
+
+    - When comparing unions, the argument order is ignored, e.g.::
+
+        Union[int, str] == Union[str, int]
+
+    - You cannot subclass or instantiate a union.
+    - You can use Optional[X] as a shorthand for Union[X, None].
+    """
+    if parameters == ():
+        raise TypeError("Cannot take a Union of no types.")
+    if not isinstance(parameters, tuple):
+        parameters = (parameters,)
+    msg = "Union[arg, ...]: each arg must be a type."
+    parameters = tuple(_type_check(p, msg) for p in parameters)
+    parameters = _remove_dups_flatten(parameters)
+    if len(parameters) == 1:
+        return parameters[0]
+    return _UnionGenericAlias(self, parameters)
+
+@_SpecialForm
+def Optional(self, parameters):
+    """Optional type.
+
+    Optional[X] is equivalent to Union[X, None].
+    """
+    arg = _type_check(parameters, f"{self} requires a single type.")
+    return Union[arg, type(None)]
+
+@_LiteralSpecialForm
+def Literal(self, parameters):
+    """Special typing form to define literal types (a.k.a. value types).
+
+    This form can be used to indicate to type checkers that the corresponding
+    variable or function parameter has a value equivalent to the provided
+    literal (or one of several literals):
+
+      def validate_simple(data: Any) -> Literal[True]:  # always returns True
+          ...
+
+      MODE = Literal['r', 'rb', 'w', 'wb']
+      def open_helper(file: str, mode: MODE) -> str:
+          ...
+
+      open_helper('/some/path', 'r')  # Passes type check
+      open_helper('/other/path', 'typo')  # Error in type checker
+
+    Literal[...] cannot be subclassed. At runtime, an arbitrary value
+    is allowed as type argument to Literal[...], but type checkers may
+    impose restrictions.
+    """
+    # There is no '_type_check' call because arguments to Literal[...] are
+    # values, not types.
+    if not isinstance(parameters, tuple):
+        parameters = (parameters,)
+
+    parameters = _flatten_literal_params(parameters)
+
+    try:
+        parameters = tuple(p for p, _ in _deduplicate(list(_value_and_type_iter(parameters))))
+    except TypeError:  # unhashable parameters
+        pass
+
+    return _LiteralGenericAlias(self, parameters)
+
+
+class ForwardRef(_Final, _root=True):
+    """Internal wrapper to hold a forward reference."""
+
+    __slots__ = ('__forward_arg__', '__forward_code__',
+                 '__forward_evaluated__', '__forward_value__',
+                 '__forward_is_argument__')
+
+    def __init__(self, arg, is_argument=True):
+        if not isinstance(arg, str):
+            raise TypeError(f"Forward reference must be a string -- got {arg!r}")
+        try:
+            code = compile(arg, '<string>', 'eval')
+        except SyntaxError:
+            raise SyntaxError(f"Forward reference must be an expression -- got {arg!r}")
+        self.__forward_arg__ = arg
+        self.__forward_code__ = code
+        self.__forward_evaluated__ = False
+        self.__forward_value__ = None
+        self.__forward_is_argument__ = is_argument
+
+    def _evaluate(self, globalns, localns, recursive_guard):
+        if self.__forward_arg__ in recursive_guard:
+            return self
+        if not self.__forward_evaluated__ or localns is not globalns:
+            if globalns is None and localns is None:
+                globalns = localns = {}
+            elif globalns is None:
+                globalns = localns
+            elif localns is None:
+                localns = globalns
+            type_ =_type_check(
+                eval(self.__forward_code__, globalns, localns),
+                "Forward references must evaluate to types.",
+                is_argument=self.__forward_is_argument__,
+            )
+            self.__forward_value__ = _eval_type(
+                type_, globalns, localns, recursive_guard | {self.__forward_arg__}
+            )
+            self.__forward_evaluated__ = True
+        return self.__forward_value__
+
+    def __eq__(self, other):
+        if not isinstance(other, ForwardRef):
+            return NotImplemented
+        if self.__forward_evaluated__ and other.__forward_evaluated__:
+            return (self.__forward_arg__ == other.__forward_arg__ and
+                    self.__forward_value__ == other.__forward_value__)
+        return self.__forward_arg__ == other.__forward_arg__
+
+    def __hash__(self):
+        return hash(self.__forward_arg__)
+
+    def __repr__(self):
+        return f'ForwardRef({self.__forward_arg__!r})'
+
+
+class TypeVar(_Final, _Immutable, _root=True):
+    """Type variable.
+
+    Usage::
+
+      T = TypeVar('T')  # Can be anything
+      A = TypeVar('A', str, bytes)  # Must be str or bytes
+
+    Type variables exist primarily for the benefit of static type
+    checkers.  They serve as the parameters for generic types as well
+    as for generic function definitions.  See class Generic for more
+    information on generic types.  Generic functions work as follows:
+
+      def repeat(x: T, n: int) -> List[T]:
+          '''Return a list containing n references to x.'''
+          return [x]*n
+
+      def longest(x: A, y: A) -> A:
+          '''Return the longest of two strings.'''
+          return x if len(x) >= len(y) else y
+
+    The latter example's signature is essentially the overloading
+    of (str, str) -> str and (bytes, bytes) -> bytes.  Also note
+    that if the arguments are instances of some subclass of str,
+    the return type is still plain str.
+
+    At runtime, isinstance(x, T) and issubclass(C, T) will raise TypeError.
+
+    Type variables defined with covariant=True or contravariant=True
+    can be used to declare covariant or contravariant generic types.
+    See PEP 484 for more details. By default generic types are invariant
+    in all type variables.
+
+    Type variables can be introspected. e.g.:
+
+      T.__name__ == 'T'
+      T.__constraints__ == ()
+      T.__covariant__ == False
+      T.__contravariant__ = False
+      A.__constraints__ == (str, bytes)
+
+    Note that only type variables defined in global scope can be pickled.
+    """
+
+    __slots__ = ('__name__', '__bound__', '__constraints__',
+                 '__covariant__', '__contravariant__', '__dict__')
+
+    def __init__(self, name, *constraints, bound=None,
+                 covariant=False, contravariant=False):
+        self.__name__ = name
+        if covariant and contravariant:
+            raise ValueError("Bivariant types are not supported.")
+        self.__covariant__ = bool(covariant)
+        self.__contravariant__ = bool(contravariant)
+        if constraints and bound is not None:
+            raise TypeError("Constraints cannot be combined with bound=...")
+        if constraints and len(constraints) == 1:
+            raise TypeError("A single constraint is not allowed")
+        msg = "TypeVar(name, constraint, ...): constraints must be types."
+        self.__constraints__ = tuple(_type_check(t, msg) for t in constraints)
+        if bound:
+            self.__bound__ = _type_check(bound, "Bound must be a type.")
+        else:
+            self.__bound__ = None
+        try:
+            def_mod = sys._getframe(1).f_globals.get('__name__', '__main__')  # for pickling
+        except (AttributeError, ValueError):
+            def_mod = None
+        if def_mod != 'typing':
+            self.__module__ = def_mod
+
+    def __repr__(self):
+        if self.__covariant__:
+            prefix = '+'
+        elif self.__contravariant__:
+            prefix = '-'
+        else:
+            prefix = '~'
+        return prefix + self.__name__
+
+    def __reduce__(self):
+        return self.__name__
+
+
+def _is_dunder(attr):
+    return attr.startswith('__') and attr.endswith('__')
+
+class _BaseGenericAlias(_Final, _root=True):
+    """The central part of internal API.
+
+    This represents a generic version of type 'origin' with type arguments 'params'.
+    There are two kind of these aliases: user defined and special. The special ones
+    are wrappers around builtin collections and ABCs in collections.abc. These must
+    have 'name' always set. If 'inst' is False, then the alias can't be instantiated,
+    this is used by e.g. typing.List and typing.Dict.
+    """
+    def __init__(self, origin, *, inst=True, name=None):
+        self._inst = inst
+        self._name = name
+        self.__origin__ = origin
+        self.__slots__ = None  # This is not documented.
+
+    def __call__(self, *args, **kwargs):
+        if not self._inst:
+            raise TypeError(f"Type {self._name} cannot be instantiated; "
+                            f"use {self.__origin__.__name__}() instead")
+        result = self.__origin__(*args, **kwargs)
+        try:
+            result.__orig_class__ = self
+        except AttributeError:
+            pass
+        return result
+
+    def __mro_entries__(self, bases):
+        res = []
+        if self.__origin__ not in bases:
+            res.append(self.__origin__)
+        i = bases.index(self)
+        for b in bases[i+1:]:
+            if isinstance(b, _BaseGenericAlias) or issubclass(b, Generic):
+                break
+        else:
+            res.append(Generic)
+        return tuple(res)
+
+    def __getattr__(self, attr):
+        # We are careful for copy and pickle.
+        # Also for simplicity we just don't relay all dunder names
+        if '__origin__' in self.__dict__ and not _is_dunder(attr):
+            return getattr(self.__origin__, attr)
+        raise AttributeError(attr)
+
+    def __setattr__(self, attr, val):
+        if _is_dunder(attr) or attr in ('_name', '_inst', '_nparams'):
+            super().__setattr__(attr, val)
+        else:
+            setattr(self.__origin__, attr, val)
+
+    def __instancecheck__(self, obj):
+        return self.__subclasscheck__(type(obj))
+
+    def __subclasscheck__(self, cls):
+        raise TypeError("Subscripted generics cannot be used with"
+                        " class and instance checks")
+
+
+# Special typing constructs Union, Optional, Generic, Callable and Tuple
+# use three special attributes for internal bookkeeping of generic types:
+# * __parameters__ is a tuple of unique free type parameters of a generic
+#   type, for example, Dict[T, T].__parameters__ == (T,);
+# * __origin__ keeps a reference to a type that was subscripted,
+#   e.g., Union[T, int].__origin__ == Union, or the non-generic version of
+#   the type.
+# * __args__ is a tuple of all arguments used in subscripting,
+#   e.g., Dict[T, int].__args__ == (T, int).
+
+
+class _GenericAlias(_BaseGenericAlias, _root=True):
+    def __init__(self, origin, params, *, inst=True, name=None):
+        super().__init__(origin, inst=inst, name=name)
+        if not isinstance(params, tuple):
+            params = (params,)
+        self.__args__ = tuple(... if a is _TypingEllipsis else
+                              () if a is _TypingEmpty else
+                              a for a in params)
+        self.__parameters__ = _collect_type_vars(params)
+        if not name:
+            self.__module__ = origin.__module__
+
+    def __eq__(self, other):
+        if not isinstance(other, _GenericAlias):
+            return NotImplemented
+        return (self.__origin__ == other.__origin__
+                and self.__args__ == other.__args__)
+
+    def __hash__(self):
+        return hash((self.__origin__, self.__args__))
+
+    @_tp_cache
+    def __getitem__(self, params):
+        if self.__origin__ in (Generic, Protocol):
+            # Can't subscript Generic[...] or Protocol[...].
+            raise TypeError(f"Cannot subscript already-subscripted {self}")
+        if not isinstance(params, tuple):
+            params = (params,)
+        msg = "Parameters to generic types must be types."
+        params = tuple(_type_check(p, msg) for p in params)
+        _check_generic(self, params, len(self.__parameters__))
+
+        subst = dict(zip(self.__parameters__, params))
+        new_args = []
+        for arg in self.__args__:
+            if isinstance(arg, TypeVar):
+                arg = subst[arg]
+            elif isinstance(arg, (_GenericAlias, GenericAlias)):
+                subparams = arg.__parameters__
+                if subparams:
+                    subargs = tuple(subst[x] for x in subparams)
+                    arg = arg[subargs]
+            new_args.append(arg)
+        return self.copy_with(tuple(new_args))
+
+    def copy_with(self, params):
+        return self.__class__(self.__origin__, params, name=self._name, inst=self._inst)
+
+    def __repr__(self):
+        if self._name:
+            name = 'typing.' + self._name
+        else:
+            name = _type_repr(self.__origin__)
+        args = ", ".join([_type_repr(a) for a in self.__args__])
+        return f'{name}[{args}]'
+
+    def __reduce__(self):
+        if self._name:
+            origin = globals()[self._name]
+        else:
+            origin = self.__origin__
+        args = tuple(self.__args__)
+        if len(args) == 1 and not isinstance(args[0], tuple):
+            args, = args
+        return operator.getitem, (origin, args)
+
+    def __mro_entries__(self, bases):
+        if self._name:  # generic version of an ABC or built-in class
+            return super().__mro_entries__(bases)
+        if self.__origin__ is Generic:
+            if Protocol in bases:
+                return ()
+            i = bases.index(self)
+            for b in bases[i+1:]:
+                if isinstance(b, _BaseGenericAlias) and b is not self:
+                    return ()
+        return (self.__origin__,)
+
+
+# _nparams is the number of accepted parameters, e.g. 0 for Hashable,
+# 1 for List and 2 for Dict.  It may be -1 if variable number of
+# parameters are accepted (needs custom __getitem__).
+
+class _SpecialGenericAlias(_BaseGenericAlias, _root=True):
+    def __init__(self, origin, nparams, *, inst=True, name=None):
+        if name is None:
+            name = origin.__name__
+        super().__init__(origin, inst=inst, name=name)
+        self._nparams = nparams
+        if origin.__module__ == 'builtins':
+            self.__doc__ = f'A generic version of {origin.__qualname__}.'
+        else:
+            self.__doc__ = f'A generic version of {origin.__module__}.{origin.__qualname__}.'
+
+    @_tp_cache
+    def __getitem__(self, params):
+        if not isinstance(params, tuple):
+            params = (params,)
+        msg = "Parameters to generic types must be types."
+        params = tuple(_type_check(p, msg) for p in params)
+        _check_generic(self, params, self._nparams)
+        return self.copy_with(params)
+
+    def copy_with(self, params):
+        return _GenericAlias(self.__origin__, params,
+                             name=self._name, inst=self._inst)
+
+    def __repr__(self):
+        return 'typing.' + self._name
+
+    def __subclasscheck__(self, cls):
+        if isinstance(cls, _SpecialGenericAlias):
+            return issubclass(cls.__origin__, self.__origin__)
+        if not isinstance(cls, _GenericAlias):
+            return issubclass(cls, self.__origin__)
+        return super().__subclasscheck__(cls)
+
+    def __reduce__(self):
+        return self._name
+
+
+class _CallableGenericAlias(_GenericAlias, _root=True):
+    def __repr__(self):
+        assert self._name == 'Callable'
+        if len(self.__args__) == 2 and self.__args__[0] is Ellipsis:
+            return super().__repr__()
+        return (f'typing.Callable'
+                f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
+                f'{_type_repr(self.__args__[-1])}]')
+
+    def __reduce__(self):
+        args = self.__args__
+        if not (len(args) == 2 and args[0] is ...):
+            args = list(args[:-1]), args[-1]
+        return operator.getitem, (Callable, args)
+
+
+class _CallableType(_SpecialGenericAlias, _root=True):
+    def copy_with(self, params):
+        return _CallableGenericAlias(self.__origin__, params,
+                                     name=self._name, inst=self._inst)
+
+    def __getitem__(self, params):
+        if not isinstance(params, tuple) or len(params) != 2:
+            raise TypeError("Callable must be used as "
+                            "Callable[[arg, ...], result].")
+        args, result = params
+        # This relaxes what args can be on purpose to allow things like
+        # PEP 612 ParamSpec.  Responsibility for whether a user is using
+        # Callable[...] properly is deferred to static type checkers.
+        if isinstance(args, list):
+            params = (tuple(args), result)
+        else:
+            params = (args, result)
+        return self.__getitem_inner__(params)
+
+    @_tp_cache
+    def __getitem_inner__(self, params):
+        args, result = params
+        msg = "Callable[args, result]: result must be a type."
+        result = _type_check(result, msg)
+        if args is Ellipsis:
+            return self.copy_with((_TypingEllipsis, result))
+        if not isinstance(args, tuple):
+            args = (args,)
+        args = tuple(_type_convert(arg) for arg in args)
+        params = args + (result,)
+        return self.copy_with(params)
+
+
+class _TupleType(_SpecialGenericAlias, _root=True):
+    @_tp_cache
+    def __getitem__(self, params):
+        if params == ():
+            return self.copy_with((_TypingEmpty,))
+        if not isinstance(params, tuple):
+            params = (params,)
+        if len(params) == 2 and params[1] is ...:
+            msg = "Tuple[t, ...]: t must be a type."
+            p = _type_check(params[0], msg)
+            return self.copy_with((p, _TypingEllipsis))
+        msg = "Tuple[t0, t1, ...]: each t must be a type."
+        params = tuple(_type_check(p, msg) for p in params)
+        return self.copy_with(params)
+
+
+class _UnionGenericAlias(_GenericAlias, _root=True):
+    def copy_with(self, params):
+        return Union[params]
+
+    def __eq__(self, other):
+        if not isinstance(other, _UnionGenericAlias):
+            return NotImplemented
+        return set(self.__args__) == set(other.__args__)
+
+    def __hash__(self):
+        return hash(frozenset(self.__args__))
+
+    def __repr__(self):
+        args = self.__args__
+        if len(args) == 2:
+            if args[0] is type(None):
+                return f'typing.Optional[{_type_repr(args[1])}]'
+            elif args[1] is type(None):
+                return f'typing.Optional[{_type_repr(args[0])}]'
+        return super().__repr__()
+
+
+def _value_and_type_iter(parameters):
+    return ((p, type(p)) for p in parameters)
+
+
+class _LiteralGenericAlias(_GenericAlias, _root=True):
+
+    def __eq__(self, other):
+        if not isinstance(other, _LiteralGenericAlias):
+            return NotImplemented
+
+        return set(_value_and_type_iter(self.__args__)) == set(_value_and_type_iter(other.__args__))
+
+    def __hash__(self):
+        return hash(frozenset(_value_and_type_iter(self.__args__)))
+
+
+class Generic:
+    """Abstract base class for generic types.
+
+    A generic type is typically declared by inheriting from
+    this class parameterized with one or more type variables.
+    For example, a generic mapping type might be defined as::
+
+      class Mapping(Generic[KT, VT]):
+          def __getitem__(self, key: KT) -> VT:
+              ...
+          # Etc.
+
+    This class can then be used as follows::
+
+      def lookup_name(mapping: Mapping[KT, VT], key: KT, default: VT) -> VT:
+          try:
+              return mapping[key]
+          except KeyError:
+              return default
+    """
+    __slots__ = ()
+    _is_protocol = False
+
+    @_tp_cache
+    def __class_getitem__(cls, params):
+        if not isinstance(params, tuple):
+            params = (params,)
+        if not params and cls is not Tuple:
+            raise TypeError(
+                f"Parameter list to {cls.__qualname__}[...] cannot be empty")
+        msg = "Parameters to generic types must be types."
+        params = tuple(_type_check(p, msg) for p in params)
+        if cls in (Generic, Protocol):
+            # Generic and Protocol can only be subscripted with unique type variables.
+            if not all(isinstance(p, TypeVar) for p in params):
+                raise TypeError(
+                    f"Parameters to {cls.__name__}[...] must all be type variables")
+            if len(set(params)) != len(params):
+                raise TypeError(
+                    f"Parameters to {cls.__name__}[...] must all be unique")
+        else:
+            # Subscripting a regular Generic subclass.
+            _check_generic(cls, params, len(cls.__parameters__))
+        return _GenericAlias(cls, params)
+
+    def __init_subclass__(cls, *args, **kwargs):
+        super().__init_subclass__(*args, **kwargs)
+        tvars = []
+        if '__orig_bases__' in cls.__dict__:
+            error = Generic in cls.__orig_bases__
+        else:
+            error = Generic in cls.__bases__ and cls.__name__ != 'Protocol'
+        if error:
+            raise TypeError("Cannot inherit from plain Generic")
+        if '__orig_bases__' in cls.__dict__:
+            tvars = _collect_type_vars(cls.__orig_bases__)
+            # Look for Generic[T1, ..., Tn].
+            # If found, tvars must be a subset of it.
+            # If not found, tvars is it.
+            # Also check for and reject plain Generic,
+            # and reject multiple Generic[...].
+            gvars = None
+            for base in cls.__orig_bases__:
+                if (isinstance(base, _GenericAlias) and
+                        base.__origin__ is Generic):
+                    if gvars is not None:
+                        raise TypeError(
+                            "Cannot inherit from Generic[...] multiple types.")
+                    gvars = base.__parameters__
+            if gvars is not None:
+                tvarset = set(tvars)
+                gvarset = set(gvars)
+                if not tvarset <= gvarset:
+                    s_vars = ', '.join(str(t) for t in tvars if t not in gvarset)
+                    s_args = ', '.join(str(g) for g in gvars)
+                    raise TypeError(f"Some type variables ({s_vars}) are"
+                                    f" not listed in Generic[{s_args}]")
+                tvars = gvars
+        cls.__parameters__ = tuple(tvars)
+
+
+class _TypingEmpty:
+    """Internal placeholder for () or []. Used by TupleMeta and CallableMeta
+    to allow empty list/tuple in specific places, without allowing them
+    to sneak in where prohibited.
+    """
+
+
+class _TypingEllipsis:
+    """Internal placeholder for ... (ellipsis)."""
+
+
+_TYPING_INTERNALS = ['__parameters__', '__orig_bases__',  '__orig_class__',
+                     '_is_protocol', '_is_runtime_protocol']
+
+_SPECIAL_NAMES = ['__abstractmethods__', '__annotations__', '__dict__', '__doc__',
+                  '__init__', '__module__', '__new__', '__slots__',
+                  '__subclasshook__', '__weakref__', '__class_getitem__']
+
+# These special attributes will be not collected as protocol members.
+EXCLUDED_ATTRIBUTES = _TYPING_INTERNALS + _SPECIAL_NAMES + ['_MutableMapping__marker']
+
+
+def _get_protocol_attrs(cls):
+    """Collect protocol members from a protocol class objects.
+
+    This includes names actually defined in the class dictionary, as well
+    as names that appear in annotations. Special names (above) are skipped.
+    """
+    attrs = set()
+    for base in cls.__mro__[:-1]:  # without object
+        if base.__name__ in ('Protocol', 'Generic'):
+            continue
+        annotations = getattr(base, '__annotations__', {})
+        for attr in list(base.__dict__.keys()) + list(annotations.keys()):
+            if not attr.startswith('_abc_') and attr not in EXCLUDED_ATTRIBUTES:
+                attrs.add(attr)
+    return attrs
+
+
+def _is_callable_members_only(cls):
+    # PEP 544 prohibits using issubclass() with protocols that have non-method members.
+    return all(callable(getattr(cls, attr, None)) for attr in _get_protocol_attrs(cls))
+
+
+def _no_init(self, *args, **kwargs):
+    if type(self)._is_protocol:
+        raise TypeError('Protocols cannot be instantiated')
+
+
+def _allow_reckless_class_cheks():
+    """Allow instance and class checks for special stdlib modules.
+
+    The abc and functools modules indiscriminately call isinstance() and
+    issubclass() on the whole MRO of a user class, which may contain protocols.
+    """
+    try:
+        return sys._getframe(3).f_globals['__name__'] in ['abc', 'functools']
+    except (AttributeError, ValueError):  # For platforms without _getframe().
+        return True
+
+
+_PROTO_WHITELIST = {
+    'collections.abc': [
+        'Callable', 'Awaitable', 'Iterable', 'Iterator', 'AsyncIterable',
+        'Hashable', 'Sized', 'Container', 'Collection', 'Reversible',
+    ],
+    'contextlib': ['AbstractContextManager', 'AbstractAsyncContextManager'],
+}
+
+
+class _ProtocolMeta(ABCMeta):
+    # This metaclass is really unfortunate and exists only because of
+    # the lack of __instancehook__.
+    def __instancecheck__(cls, instance):
+        # We need this method for situations where attributes are
+        # assigned in __init__.
+        if ((not getattr(cls, '_is_protocol', False) or
+                _is_callable_members_only(cls)) and
+                issubclass(instance.__class__, cls)):
+            return True
+        if cls._is_protocol:
+            if all(hasattr(instance, attr) and
+                    # All *methods* can be blocked by setting them to None.
+                    (not callable(getattr(cls, attr, None)) or
+                     getattr(instance, attr) is not None)
+                    for attr in _get_protocol_attrs(cls)):
+                return True
+        return super().__instancecheck__(instance)
+
+
+class Protocol(Generic, metaclass=_ProtocolMeta):
+    """Base class for protocol classes.
+
+    Protocol classes are defined as::
+
+        class Proto(Protocol):
+            def meth(self) -> int:
+                ...
+
+    Such classes are primarily used with static type checkers that recognize
+    structural subtyping (static duck-typing), for example::
+
+        class C:
+            def meth(self) -> int:
+                return 0
+
+        def func(x: Proto) -> int:
+            return x.meth()
+
+        func(C())  # Passes static type check
+
+    See PEP 544 for details. Protocol classes decorated with
+    @typing.runtime_checkable act as simple-minded runtime protocols that check
+    only the presence of given attributes, ignoring their type signatures.
+    Protocol classes can be generic, they are defined as::
+
+        class GenProto(Protocol[T]):
+            def meth(self) -> T:
+                ...
+    """
+    __slots__ = ()
+    _is_protocol = True
+    _is_runtime_protocol = False
+
+    def __init_subclass__(cls, *args, **kwargs):
+        super().__init_subclass__(*args, **kwargs)
+
+        # Determine if this is a protocol or a concrete subclass.
+        if not cls.__dict__.get('_is_protocol', False):
+            cls._is_protocol = any(b is Protocol for b in cls.__bases__)
+
+        # Set (or override) the protocol subclass hook.
+        def _proto_hook(other):
+            if not cls.__dict__.get('_is_protocol', False):
+                return NotImplemented
+
+            # First, perform various sanity checks.
+            if not getattr(cls, '_is_runtime_protocol', False):
+                if _allow_reckless_class_cheks():
+                    return NotImplemented
+                raise TypeError("Instance and class checks can only be used with"
+                                " @runtime_checkable protocols")
+            if not _is_callable_members_only(cls):
+                if _allow_reckless_class_cheks():
+                    return NotImplemented
+                raise TypeError("Protocols with non-method members"
+                                " don't support issubclass()")
+            if not isinstance(other, type):
+                # Same error message as for issubclass(1, int).
+                raise TypeError('issubclass() arg 1 must be a class')
+
+            # Second, perform the actual structural compatibility check.
+            for attr in _get_protocol_attrs(cls):
+                for base in other.__mro__:
+                    # Check if the members appears in the class dictionary...
+                    if attr in base.__dict__:
+                        if base.__dict__[attr] is None:
+                            return NotImplemented
+                        break
+
+                    # ...or in annotations, if it is a sub-protocol.
+                    annotations = getattr(base, '__annotations__', {})
+                    if (isinstance(annotations, collections.abc.Mapping) and
+                            attr in annotations and
+                            issubclass(other, Generic) and other._is_protocol):
+                        break
+                else:
+                    return NotImplemented
+            return True
+
+        if '__subclasshook__' not in cls.__dict__:
+            cls.__subclasshook__ = _proto_hook
+
+        # We have nothing more to do for non-protocols...
+        if not cls._is_protocol:
+            return
+
+        # ... otherwise check consistency of bases, and prohibit instantiation.
+        for base in cls.__bases__:
+            if not (base in (object, Generic) or
+                    base.__module__ in _PROTO_WHITELIST and
+                    base.__name__ in _PROTO_WHITELIST[base.__module__] or
+                    issubclass(base, Generic) and base._is_protocol):
+                raise TypeError('Protocols can only inherit from other'
+                                ' protocols, got %r' % base)
+        cls.__init__ = _no_init
+
+
+class _AnnotatedAlias(_GenericAlias, _root=True):
+    """Runtime representation of an annotated type.
+
+    At its core 'Annotated[t, dec1, dec2, ...]' is an alias for the type 't'
+    with extra annotations. The alias behaves like a normal typing alias,
+    instantiating is the same as instantiating the underlying type, binding
+    it to types is also the same.
+    """
+    def __init__(self, origin, metadata):
+        if isinstance(origin, _AnnotatedAlias):
+            metadata = origin.__metadata__ + metadata
+            origin = origin.__origin__
+        super().__init__(origin, origin)
+        self.__metadata__ = metadata
+
+    def copy_with(self, params):
+        assert len(params) == 1
+        new_type = params[0]
+        return _AnnotatedAlias(new_type, self.__metadata__)
+
+    def __repr__(self):
+        return "typing.Annotated[{}, {}]".format(
+            _type_repr(self.__origin__),
+            ", ".join(repr(a) for a in self.__metadata__)
+        )
+
+    def __reduce__(self):
+        return operator.getitem, (
+            Annotated, (self.__origin__,) + self.__metadata__
+        )
+
+    def __eq__(self, other):
+        if not isinstance(other, _AnnotatedAlias):
+            return NotImplemented
+        return (self.__origin__ == other.__origin__
+                and self.__metadata__ == other.__metadata__)
+
+    def __hash__(self):
+        return hash((self.__origin__, self.__metadata__))
+
+
+class Annotated:
+    """Add context specific metadata to a type.
+
+    Example: Annotated[int, runtime_check.Unsigned] indicates to the
+    hypothetical runtime_check module that this type is an unsigned int.
+    Every other consumer of this type can ignore this metadata and treat
+    this type as int.
+
+    The first argument to Annotated must be a valid type.
+
+    Details:
+
+    - It's an error to call `Annotated` with less than two arguments.
+    - Nested Annotated are flattened::
+
+        Annotated[Annotated[T, Ann1, Ann2], Ann3] == Annotated[T, Ann1, Ann2, Ann3]
+
+    - Instantiating an annotated type is equivalent to instantiating the
+    underlying type::
+
+        Annotated[C, Ann1](5) == C(5)
+
+    - Annotated can be used as a generic type alias::
+
+        Optimized = Annotated[T, runtime.Optimize()]
+        Optimized[int] == Annotated[int, runtime.Optimize()]
+
+        OptimizedList = Annotated[List[T], runtime.Optimize()]
+        OptimizedList[int] == Annotated[List[int], runtime.Optimize()]
+    """
+
+    __slots__ = ()
+
+    def __new__(cls, *args, **kwargs):
+        raise TypeError("Type Annotated cannot be instantiated.")
+
+    @_tp_cache
+    def __class_getitem__(cls, params):
+        if not isinstance(params, tuple) or len(params) < 2:
+            raise TypeError("Annotated[...] should be used "
+                            "with at least two arguments (a type and an "
+                            "annotation).")
+        msg = "Annotated[t, ...]: t must be a type."
+        origin = _type_check(params[0], msg)
+        metadata = tuple(params[1:])
+        return _AnnotatedAlias(origin, metadata)
+
+    def __init_subclass__(cls, *args, **kwargs):
+        raise TypeError(
+            "Cannot subclass {}.Annotated".format(cls.__module__)
+        )
+
+
+def runtime_checkable(cls):
+    """Mark a protocol class as a runtime protocol.
+
+    Such protocol can be used with isinstance() and issubclass().
+    Raise TypeError if applied to a non-protocol class.
+    This allows a simple-minded structural check very similar to
+    one trick ponies in collections.abc such as Iterable.
+    For example::
+
+        @runtime_checkable
+        class Closable(Protocol):
+            def close(self): ...
+
+        assert isinstance(open('/some/file'), Closable)
+
+    Warning: this will check only the presence of the required methods,
+    not their type signatures!
+    """
+    if not issubclass(cls, Generic) or not cls._is_protocol:
+        raise TypeError('@runtime_checkable can be only applied to protocol classes,'
+                        ' got %r' % cls)
+    cls._is_runtime_protocol = True
+    return cls
+
+
+def cast(typ, val):
+    """Cast a value to a type.
+
+    This returns the value unchanged.  To the type checker this
+    signals that the return value has the designated type, but at
+    runtime we intentionally don't check anything (we want this
+    to be as fast as possible).
+    """
+    return val
+
+
+def _get_defaults(func):
+    """Internal helper to extract the default arguments, by name."""
+    try:
+        code = func.__code__
+    except AttributeError:
+        # Some built-in functions don't have __code__, __defaults__, etc.
+        return {}
+    pos_count = code.co_argcount
+    arg_names = code.co_varnames
+    arg_names = arg_names[:pos_count]
+    defaults = func.__defaults__ or ()
+    kwdefaults = func.__kwdefaults__
+    res = dict(kwdefaults) if kwdefaults else {}
+    pos_offset = pos_count - len(defaults)
+    for name, value in zip(arg_names[pos_offset:], defaults):
+        assert name not in res
+        res[name] = value
+    return res
+
+
+_allowed_types = (types.FunctionType, types.BuiltinFunctionType,
+                  types.MethodType, types.ModuleType,
+                  WrapperDescriptorType, MethodWrapperType, MethodDescriptorType)
+
+
+def get_type_hints(obj, globalns=None, localns=None, include_extras=False):
+    """Return type hints for an object.
+
+    This is often the same as obj.__annotations__, but it handles
+    forward references encoded as string literals, adds Optional[t] if a
+    default value equal to None is set and recursively replaces all
+    'Annotated[T, ...]' with 'T' (unless 'include_extras=True').
+
+    The argument may be a module, class, method, or function. The annotations
+    are returned as a dictionary. For classes, annotations include also
+    inherited members.
+
+    TypeError is raised if the argument is not of a type that can contain
+    annotations, and an empty dictionary is returned if no annotations are
+    present.
+
+    BEWARE -- the behavior of globalns and localns is counterintuitive
+    (unless you are familiar with how eval() and exec() work).  The
+    search order is locals first, then globals.
+
+    - If no dict arguments are passed, an attempt is made to use the
+      globals from obj (or the respective module's globals for classes),
+      and these are also used as the locals.  If the object does not appear
+      to have globals, an empty dictionary is used.
+
+    - If one dict argument is passed, it is used for both globals and
+      locals.
+
+    - If two dict arguments are passed, they specify globals and
+      locals, respectively.
+    """
+
+    if getattr(obj, '__no_type_check__', None):
+        return {}
+    # Classes require a special treatment.
+    if isinstance(obj, type):
+        hints = {}
+        for base in reversed(obj.__mro__):
+            if globalns is None:
+                base_globals = sys.modules[base.__module__].__dict__
+            else:
+                base_globals = globalns
+            ann = base.__dict__.get('__annotations__', {})
+            for name, value in ann.items():
+                if value is None:
+                    value = type(None)
+                if isinstance(value, str):
+                    value = ForwardRef(value, is_argument=False)
+                value = _eval_type(value, base_globals, localns)
+                hints[name] = value
+        return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
+
+    if globalns is None:
+        if isinstance(obj, types.ModuleType):
+            globalns = obj.__dict__
+        else:
+            nsobj = obj
+            # Find globalns for the unwrapped object.
+            while hasattr(nsobj, '__wrapped__'):
+                nsobj = nsobj.__wrapped__
+            globalns = getattr(nsobj, '__globals__', {})
+        if localns is None:
+            localns = globalns
+    elif localns is None:
+        localns = globalns
+    hints = getattr(obj, '__annotations__', None)
+    if hints is None:
+        # Return empty annotations for something that _could_ have them.
+        if isinstance(obj, _allowed_types):
+            return {}
+        else:
+            raise TypeError('{!r} is not a module, class, method, '
+                            'or function.'.format(obj))
+    defaults = _get_defaults(obj)
+    hints = dict(hints)
+    for name, value in hints.items():
+        if value is None:
+            value = type(None)
+        if isinstance(value, str):
+            value = ForwardRef(value)
+        value = _eval_type(value, globalns, localns)
+        if name in defaults and defaults[name] is None:
+            value = Optional[value]
+        hints[name] = value
+    return hints if include_extras else {k: _strip_annotations(t) for k, t in hints.items()}
+
+
+def _strip_annotations(t):
+    """Strips the annotations from a given type.
+    """
+    if isinstance(t, _AnnotatedAlias):
+        return _strip_annotations(t.__origin__)
+    if isinstance(t, _GenericAlias):
+        stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
+        if stripped_args == t.__args__:
+            return t
+        return t.copy_with(stripped_args)
+    if isinstance(t, GenericAlias):
+        stripped_args = tuple(_strip_annotations(a) for a in t.__args__)
+        if stripped_args == t.__args__:
+            return t
+        return GenericAlias(t.__origin__, stripped_args)
+    return t
+
+
+def get_origin(tp):
+    """Get the unsubscripted version of a type.
+
+    This supports generic types, Callable, Tuple, Union, Literal, Final, ClassVar
+    and Annotated. Return None for unsupported types. Examples::
+
+        get_origin(Literal[42]) is Literal
+        get_origin(int) is None
+        get_origin(ClassVar[int]) is ClassVar
+        get_origin(Generic) is Generic
+        get_origin(Generic[T]) is Generic
+        get_origin(Union[T, int]) is Union
+        get_origin(List[Tuple[T, T]][int]) == list
+    """
+    if isinstance(tp, _AnnotatedAlias):
+        return Annotated
+    if isinstance(tp, (_BaseGenericAlias, GenericAlias)):
+        return tp.__origin__
+    if tp is Generic:
+        return Generic
+    return None
+
+
+def get_args(tp):
+    """Get type arguments with all substitutions performed.
+
+    For unions, basic simplifications used by Union constructor are performed.
+    Examples::
+        get_args(Dict[str, int]) == (str, int)
+        get_args(int) == ()
+        get_args(Union[int, Union[T, int], str][int]) == (int, str)
+        get_args(Union[int, Tuple[T, int]][str]) == (int, Tuple[str, int])
+        get_args(Callable[[], T][int]) == ([], int)
+    """
+    if isinstance(tp, _AnnotatedAlias):
+        return (tp.__origin__,) + tp.__metadata__
+    if isinstance(tp, (_GenericAlias, GenericAlias)):
+        res = tp.__args__
+        if tp.__origin__ is collections.abc.Callable and res[0] is not Ellipsis:
+            res = (list(res[:-1]), res[-1])
+        return res
+    return ()
+
+
+def no_type_check(arg):
+    """Decorator to indicate that annotations are not type hints.
+
+    The argument must be a class or function; if it is a class, it
+    applies recursively to all methods and classes defined in that class
+    (but not to methods defined in its superclasses or subclasses).
+
+    This mutates the function(s) or class(es) in place.
+    """
+    if isinstance(arg, type):
+        arg_attrs = arg.__dict__.copy()
+        for attr, val in arg.__dict__.items():
+            if val in arg.__bases__ + (arg,):
+                arg_attrs.pop(attr)
+        for obj in arg_attrs.values():
+            if isinstance(obj, types.FunctionType):
+                obj.__no_type_check__ = True
+            if isinstance(obj, type):
+                no_type_check(obj)
+    try:
+        arg.__no_type_check__ = True
+    except TypeError:  # built-in classes
+        pass
+    return arg
+
+
+def no_type_check_decorator(decorator):
+    """Decorator to give another decorator the @no_type_check effect.
+
+    This wraps the decorator with something that wraps the decorated
+    function in @no_type_check.
+    """
+
+    @functools.wraps(decorator)
+    def wrapped_decorator(*args, **kwds):
+        func = decorator(*args, **kwds)
+        func = no_type_check(func)
+        return func
+
+    return wrapped_decorator
+
+
+def _overload_dummy(*args, **kwds):
+    """Helper for @overload to raise when called."""
+    raise NotImplementedError(
+        "You should not call an overloaded function. "
+        "A series of @overload-decorated functions "
+        "outside a stub module should always be followed "
+        "by an implementation that is not @overload-ed.")
+
+
+def overload(func):
+    """Decorator for overloaded functions/methods.
+
+    In a stub file, place two or more stub definitions for the same
+    function in a row, each decorated with @overload.  For example:
+
+      @overload
+      def utf8(value: None) -> None: ...
+      @overload
+      def utf8(value: bytes) -> bytes: ...
+      @overload
+      def utf8(value: str) -> bytes: ...
+
+    In a non-stub file (i.e. a regular .py file), do the same but
+    follow it with an implementation.  The implementation should *not*
+    be decorated with @overload.  For example:
+
+      @overload
+      def utf8(value: None) -> None: ...
+      @overload
+      def utf8(value: bytes) -> bytes: ...
+      @overload
+      def utf8(value: str) -> bytes: ...
+      def utf8(value):
+          # implementation goes here
+    """
+    return _overload_dummy
+
+
+def final(f):
+    """A decorator to indicate final methods and final classes.
+
+    Use this decorator to indicate to type checkers that the decorated
+    method cannot be overridden, and decorated class cannot be subclassed.
+    For example:
+
+      class Base:
+          @final
+          def done(self) -> None:
+              ...
+      class Sub(Base):
+          def done(self) -> None:  # Error reported by type checker
+                ...
+
+      @final
+      class Leaf:
+          ...
+      class Other(Leaf):  # Error reported by type checker
+          ...
+
+    There is no runtime checking of these properties.
+    """
+    return f
+
+
+# Some unconstrained type variables.  These are used by the container types.
+# (These are not for export.)
+T = TypeVar('T')  # Any type.
+KT = TypeVar('KT')  # Key type.
+VT = TypeVar('VT')  # Value type.
+T_co = TypeVar('T_co', covariant=True)  # Any type covariant containers.
+V_co = TypeVar('V_co', covariant=True)  # Any type covariant containers.
+VT_co = TypeVar('VT_co', covariant=True)  # Value type covariant containers.
+T_contra = TypeVar('T_contra', contravariant=True)  # Ditto contravariant.
+# Internal type variable used for Type[].
+CT_co = TypeVar('CT_co', covariant=True, bound=type)
+
+# A useful type variable with constraints.  This represents string types.
+# (This one *is* for export!)
+AnyStr = TypeVar('AnyStr', bytes, str)
+
+
+# Various ABCs mimicking those in collections.abc.
+_alias = _SpecialGenericAlias
+
+Hashable = _alias(collections.abc.Hashable, 0)  # Not generic.
+Awaitable = _alias(collections.abc.Awaitable, 1)
+Coroutine = _alias(collections.abc.Coroutine, 3)
+AsyncIterable = _alias(collections.abc.AsyncIterable, 1)
+AsyncIterator = _alias(collections.abc.AsyncIterator, 1)
+Iterable = _alias(collections.abc.Iterable, 1)
+Iterator = _alias(collections.abc.Iterator, 1)
+Reversible = _alias(collections.abc.Reversible, 1)
+Sized = _alias(collections.abc.Sized, 0)  # Not generic.
+Container = _alias(collections.abc.Container, 1)
+Collection = _alias(collections.abc.Collection, 1)
+Callable = _CallableType(collections.abc.Callable, 2)
+Callable.__doc__ = \
+    """Callable type; Callable[[int], str] is a function of (int) -> str.
+
+    The subscription syntax must always be used with exactly two
+    values: the argument list and the return type.  The argument list
+    must be a list of types or ellipsis; the return type must be a single type.
+
+    There is no syntax to indicate optional or keyword arguments,
+    such function types are rarely used as callback types.
+    """
+AbstractSet = _alias(collections.abc.Set, 1, name='AbstractSet')
+MutableSet = _alias(collections.abc.MutableSet, 1)
+# NOTE: Mapping is only covariant in the value type.
+Mapping = _alias(collections.abc.Mapping, 2)
+MutableMapping = _alias(collections.abc.MutableMapping, 2)
+Sequence = _alias(collections.abc.Sequence, 1)
+MutableSequence = _alias(collections.abc.MutableSequence, 1)
+ByteString = _alias(collections.abc.ByteString, 0)  # Not generic
+# Tuple accepts variable number of parameters.
+Tuple = _TupleType(tuple, -1, inst=False, name='Tuple')
+Tuple.__doc__ = \
+    """Tuple type; Tuple[X, Y] is the cross-product type of X and Y.
+
+    Example: Tuple[T1, T2] is a tuple of two elements corresponding
+    to type variables T1 and T2.  Tuple[int, float, str] is a tuple
+    of an int, a float and a string.
+
+    To specify a variable-length tuple of homogeneous type, use Tuple[T, ...].
+    """
+List = _alias(list, 1, inst=False, name='List')
+Deque = _alias(collections.deque, 1, name='Deque')
+Set = _alias(set, 1, inst=False, name='Set')
+FrozenSet = _alias(frozenset, 1, inst=False, name='FrozenSet')
+MappingView = _alias(collections.abc.MappingView, 1)
+KeysView = _alias(collections.abc.KeysView, 1)
+ItemsView = _alias(collections.abc.ItemsView, 2)
+ValuesView = _alias(collections.abc.ValuesView, 1)
+ContextManager = _alias(contextlib.AbstractContextManager, 1, name='ContextManager')
+AsyncContextManager = _alias(contextlib.AbstractAsyncContextManager, 1, name='AsyncContextManager')
+Dict = _alias(dict, 2, inst=False, name='Dict')
+DefaultDict = _alias(collections.defaultdict, 2, name='DefaultDict')
+OrderedDict = _alias(collections.OrderedDict, 2)
+Counter = _alias(collections.Counter, 1)
+ChainMap = _alias(collections.ChainMap, 2)
+Generator = _alias(collections.abc.Generator, 3)
+AsyncGenerator = _alias(collections.abc.AsyncGenerator, 2)
+Type = _alias(type, 1, inst=False, name='Type')
+Type.__doc__ = \
+    """A special construct usable to annotate class objects.
+
+    For example, suppose we have the following classes::
+
+      class User: ...  # Abstract base for User classes
+      class BasicUser(User): ...
+      class ProUser(User): ...
+      class TeamUser(User): ...
+
+    And a function that takes a class argument that's a subclass of
+    User and returns an instance of the corresponding class::
+
+      U = TypeVar('U', bound=User)
+      def new_user(user_class: Type[U]) -> U:
+          user = user_class()
+          # (Here we could write the user object to a database)
+          return user
+
+      joe = new_user(BasicUser)
+
+    At this point the type checker knows that joe has type BasicUser.
+    """
+
+
+@runtime_checkable
+class SupportsInt(Protocol):
+    """An ABC with one abstract method __int__."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __int__(self) -> int:
+        pass
+
+
+@runtime_checkable
+class SupportsFloat(Protocol):
+    """An ABC with one abstract method __float__."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __float__(self) -> float:
+        pass
+
+
+@runtime_checkable
+class SupportsComplex(Protocol):
+    """An ABC with one abstract method __complex__."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __complex__(self) -> complex:
+        pass
+
+
+@runtime_checkable
+class SupportsBytes(Protocol):
+    """An ABC with one abstract method __bytes__."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __bytes__(self) -> bytes:
+        pass
+
+
+@runtime_checkable
+class SupportsIndex(Protocol):
+    """An ABC with one abstract method __index__."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __index__(self) -> int:
+        pass
+
+
+@runtime_checkable
+class SupportsAbs(Protocol[T_co]):
+    """An ABC with one abstract method __abs__ that is covariant in its return type."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __abs__(self) -> T_co:
+        pass
+
+
+@runtime_checkable
+class SupportsRound(Protocol[T_co]):
+    """An ABC with one abstract method __round__ that is covariant in its return type."""
+    __slots__ = ()
+
+    @abstractmethod
+    def __round__(self, ndigits: int = 0) -> T_co:
+        pass
+
+
+def _make_nmtuple(name, types, module, defaults = ()):
+    fields = [n for n, t in types]
+    types = {n: _type_check(t, f"field {n} annotation must be a type")
+             for n, t in types}
+    nm_tpl = collections.namedtuple(name, fields,
+                                    defaults=defaults, module=module)
+    nm_tpl.__annotations__ = nm_tpl.__new__.__annotations__ = types
+    return nm_tpl
+
+
+# attributes prohibited to set in NamedTuple class syntax
+_prohibited = frozenset({'__new__', '__init__', '__slots__', '__getnewargs__',
+                         '_fields', '_field_defaults',
+                         '_make', '_replace', '_asdict', '_source'})
+
+_special = frozenset({'__module__', '__name__', '__annotations__'})
+
+
+class NamedTupleMeta(type):
+
+    def __new__(cls, typename, bases, ns):
+        assert bases[0] is _NamedTuple
+        types = ns.get('__annotations__', {})
+        default_names = []
+        for field_name in types:
+            if field_name in ns:
+                default_names.append(field_name)
+            elif default_names:
+                raise TypeError(f"Non-default namedtuple field {field_name} "
+                                f"cannot follow default field"
+                                f"{'s' if len(default_names) > 1 else ''} "
+                                f"{', '.join(default_names)}")
+        nm_tpl = _make_nmtuple(typename, types.items(),
+                               defaults=[ns[n] for n in default_names],
+                               module=ns['__module__'])
+        # update from user namespace without overriding special namedtuple attributes
+        for key in ns:
+            if key in _prohibited:
+                raise AttributeError("Cannot overwrite NamedTuple attribute " + key)
+            elif key not in _special and key not in nm_tpl._fields:
+                setattr(nm_tpl, key, ns[key])
+        return nm_tpl
+
+
+def NamedTuple(typename, fields=None, /, **kwargs):
+    """Typed version of namedtuple.
+
+    Usage in Python versions >= 3.6::
+
+        class Employee(NamedTuple):
+            name: str
+            id: int
+
+    This is equivalent to::
+
+        Employee = collections.namedtuple('Employee', ['name', 'id'])
+
+    The resulting class has an extra __annotations__ attribute, giving a
+    dict that maps field names to types.  (The field names are also in
+    the _fields attribute, which is part of the namedtuple API.)
+    Alternative equivalent keyword syntax is also accepted::
+
+        Employee = NamedTuple('Employee', name=str, id=int)
+
+    In Python versions <= 3.5 use::
+
+        Employee = NamedTuple('Employee', [('name', str), ('id', int)])
+    """
+    if fields is None:
+        fields = kwargs.items()
+    elif kwargs:
+        raise TypeError("Either list of fields or keywords"
+                        " can be provided to NamedTuple, not both")
+    try:
+        module = sys._getframe(1).f_globals.get('__name__', '__main__')
+    except (AttributeError, ValueError):
+        module = None
+    return _make_nmtuple(typename, fields, module=module)
+
+_NamedTuple = type.__new__(NamedTupleMeta, 'NamedTuple', (), {})
+
+def _namedtuple_mro_entries(bases):
+    if len(bases) > 1:
+        raise TypeError("Multiple inheritance with NamedTuple is not supported")
+    assert bases[0] is NamedTuple
+    return (_NamedTuple,)
+
+NamedTuple.__mro_entries__ = _namedtuple_mro_entries
+
+
+class _TypedDictMeta(type):
+    def __new__(cls, name, bases, ns, total=True):
+        """Create new typed dict class object.
+
+        This method is called when TypedDict is subclassed,
+        or when TypedDict is instantiated. This way
+        TypedDict supports all three syntax forms described in its docstring.
+        Subclasses and instances of TypedDict return actual dictionaries.
+        """
+        for base in bases:
+            if type(base) is not _TypedDictMeta:
+                raise TypeError('cannot inherit from both a TypedDict type '
+                                'and a non-TypedDict base class')
+        tp_dict = type.__new__(_TypedDictMeta, name, (dict,), ns)
+
+        annotations = {}
+        own_annotations = ns.get('__annotations__', {})
+        own_annotation_keys = set(own_annotations.keys())
+        msg = "TypedDict('Name', {f0: t0, f1: t1, ...}); each t must be a type"
+        own_annotations = {
+            n: _type_check(tp, msg) for n, tp in own_annotations.items()
+        }
+        required_keys = set()
+        optional_keys = set()
+
+        for base in bases:
+            annotations.update(base.__dict__.get('__annotations__', {}))
+            required_keys.update(base.__dict__.get('__required_keys__', ()))
+            optional_keys.update(base.__dict__.get('__optional_keys__', ()))
+
+        annotations.update(own_annotations)
+        if total:
+            required_keys.update(own_annotation_keys)
+        else:
+            optional_keys.update(own_annotation_keys)
+
+        tp_dict.__annotations__ = annotations
+        tp_dict.__required_keys__ = frozenset(required_keys)
+        tp_dict.__optional_keys__ = frozenset(optional_keys)
+        if not hasattr(tp_dict, '__total__'):
+            tp_dict.__total__ = total
+        return tp_dict
+
+    __call__ = dict  # static method
+
+    def __subclasscheck__(cls, other):
+        # Typed dicts are only for static structural subtyping.
+        raise TypeError('TypedDict does not support instance and class checks')
+
+    __instancecheck__ = __subclasscheck__
+
+
+def TypedDict(typename, fields=None, /, *, total=True, **kwargs):
+    """A simple typed namespace. At runtime it is equivalent to a plain dict.
+
+    TypedDict creates a dictionary type that expects all of its
+    instances to have a certain set of keys, where each key is
+    associated with a value of a consistent type. This expectation
+    is not checked at runtime but is only enforced by type checkers.
+    Usage::
+
+        class Point2D(TypedDict):
+            x: int
+            y: int
+            label: str
+
+        a: Point2D = {'x': 1, 'y': 2, 'label': 'good'}  # OK
+        b: Point2D = {'z': 3, 'label': 'bad'}           # Fails type check
+
+        assert Point2D(x=1, y=2, label='first') == dict(x=1, y=2, label='first')
+
+    The type info can be accessed via the Point2D.__annotations__ dict, and
+    the Point2D.__required_keys__ and Point2D.__optional_keys__ frozensets.
+    TypedDict supports two additional equivalent forms::
+
+        Point2D = TypedDict('Point2D', x=int, y=int, label=str)
+        Point2D = TypedDict('Point2D', {'x': int, 'y': int, 'label': str})
+
+    By default, all keys must be present in a TypedDict. It is possible
+    to override this by specifying totality.
+    Usage::
+
+        class point2D(TypedDict, total=False):
+            x: int
+            y: int
+
+    This means that a point2D TypedDict can have any of the keys omitted.A type
+    checker is only expected to support a literal False or True as the value of
+    the total argument. True is the default, and makes all items defined in the
+    class body be required.
+
+    The class syntax is only supported in Python 3.6+, while two other
+    syntax forms work for Python 2.7 and 3.2+
+    """
+    if fields is None:
+        fields = kwargs
+    elif kwargs:
+        raise TypeError("TypedDict takes either a dict or keyword arguments,"
+                        " but not both")
+
+    ns = {'__annotations__': dict(fields)}
+    try:
+        # Setting correct module is necessary to make typed dict classes pickleable.
+        ns['__module__'] = sys._getframe(1).f_globals.get('__name__', '__main__')
+    except (AttributeError, ValueError):
+        pass
+
+    return _TypedDictMeta(typename, (), ns, total=total)
+
+_TypedDict = type.__new__(_TypedDictMeta, 'TypedDict', (), {})
+TypedDict.__mro_entries__ = lambda bases: (_TypedDict,)
+
+
+def NewType(name, tp):
+    """NewType creates simple unique types with almost zero
+    runtime overhead. NewType(name, tp) is considered a subtype of tp
+    by static type checkers. At runtime, NewType(name, tp) returns
+    a dummy function that simply returns its argument. Usage::
+
+        UserId = NewType('UserId', int)
+
+        def name_by_id(user_id: UserId) -> str:
+            ...
+
+        UserId('user')          # Fails type check
+
+        name_by_id(42)          # Fails type check
+        name_by_id(UserId(42))  # OK
+
+        num = UserId(5) + 1     # type: int
+    """
+
+    def new_type(x):
+        return x
+
+    new_type.__name__ = name
+    new_type.__supertype__ = tp
+    return new_type
+
+
+# Python-version-specific alias (Python 2: unicode; Python 3: str)
+Text = str
+
+
+# Constant that's True when type checking, but False here.
+TYPE_CHECKING = False
+
+
+class IO(Generic[AnyStr]):
+    """Generic base class for TextIO and BinaryIO.
+
+    This is an abstract, generic version of the return of open().
+
+    NOTE: This does not distinguish between the different possible
+    classes (text vs. binary, read vs. write vs. read/write,
+    append-only, unbuffered).  The TextIO and BinaryIO subclasses
+    below capture the distinctions between text vs. binary, which is
+    pervasive in the interface; however we currently do not offer a
+    way to track the other distinctions in the type system.
+    """
+
+    __slots__ = ()
+
+    @property
+    @abstractmethod
+    def mode(self) -> str:
+        pass
+
+    @property
+    @abstractmethod
+    def name(self) -> str:
+        pass
+
+    @abstractmethod
+    def close(self) -> None:
+        pass
+
+    @property
+    @abstractmethod
+    def closed(self) -> bool:
+        pass
+
+    @abstractmethod
+    def fileno(self) -> int:
+        pass
+
+    @abstractmethod
+    def flush(self) -> None:
+        pass
+
+    @abstractmethod
+    def isatty(self) -> bool:
+        pass
+
+    @abstractmethod
+    def read(self, n: int = -1) -> AnyStr:
+        pass
+
+    @abstractmethod
+    def readable(self) -> bool:
+        pass
+
+    @abstractmethod
+    def readline(self, limit: int = -1) -> AnyStr:
+        pass
+
+    @abstractmethod
+    def readlines(self, hint: int = -1) -> List[AnyStr]:
+        pass
+
+    @abstractmethod
+    def seek(self, offset: int, whence: int = 0) -> int:
+        pass
+
+    @abstractmethod
+    def seekable(self) -> bool:
+        pass
+
+    @abstractmethod
+    def tell(self) -> int:
+        pass
+
+    @abstractmethod
+    def truncate(self, size: int = None) -> int:
+        pass
+
+    @abstractmethod
+    def writable(self) -> bool:
+        pass
+
+    @abstractmethod
+    def write(self, s: AnyStr) -> int:
+        pass
+
+    @abstractmethod
+    def writelines(self, lines: List[AnyStr]) -> None:
+        pass
+
+    @abstractmethod
+    def __enter__(self) -> 'IO[AnyStr]':
+        pass
+
+    @abstractmethod
+    def __exit__(self, type, value, traceback) -> None:
+        pass
+
+
+class BinaryIO(IO[bytes]):
+    """Typed version of the return of open() in binary mode."""
+
+    __slots__ = ()
+
+    @abstractmethod
+    def write(self, s: Union[bytes, bytearray]) -> int:
+        pass
+
+    @abstractmethod
+    def __enter__(self) -> 'BinaryIO':
+        pass
+
+
+class TextIO(IO[str]):
+    """Typed version of the return of open() in text mode."""
+
+    __slots__ = ()
+
+    @property
+    @abstractmethod
+    def buffer(self) -> BinaryIO:
+        pass
+
+    @property
+    @abstractmethod
+    def encoding(self) -> str:
+        pass
+
+    @property
+    @abstractmethod
+    def errors(self) -> Optional[str]:
+        pass
+
+    @property
+    @abstractmethod
+    def line_buffering(self) -> bool:
+        pass
+
+    @property
+    @abstractmethod
+    def newlines(self) -> Any:
+        pass
+
+    @abstractmethod
+    def __enter__(self) -> 'TextIO':
+        pass
+
+
+class io:
+    """Wrapper namespace for IO generic classes."""
+
+    __all__ = ['IO', 'TextIO', 'BinaryIO']
+    IO = IO
+    TextIO = TextIO
+    BinaryIO = BinaryIO
+
+
+io.__name__ = __name__ + '.io'
+sys.modules[io.__name__] = io
+
+Pattern = _alias(stdlib_re.Pattern, 1)
+Match = _alias(stdlib_re.Match, 1)
+
+class re:
+    """Wrapper namespace for re type aliases."""
+
+    __all__ = ['Pattern', 'Match']
+    Pattern = Pattern
+    Match = Match
+
+
+re.__name__ = __name__ + '.re'
+sys.modules[re.__name__] = re
+
+ +
+
+
+ +
+ +
+

© Copyright 2022 UiB Center for Modeling of Coupled Subsurface Dynamics, GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007..

+
+ + + +
+
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/html/_static/basic.css b/docs/html/_static/basic.css index 4e9a9f1fac..eeb0519a69 100644 --- a/docs/html/_static/basic.css +++ b/docs/html/_static/basic.css @@ -236,6 +236,16 @@ div.body p, div.body dd, div.body li, div.body blockquote { a.headerlink { visibility: hidden; } +a.brackets:before, +span.brackets > a:before{ + content: "["; +} + +a.brackets:after, +span.brackets > a:after { + content: "]"; +} + h1:hover > a.headerlink, h2:hover > a.headerlink, @@ -324,15 +334,11 @@ aside.sidebar { 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; @@ -371,8 +377,6 @@ div.body p.centered { 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; @@ -380,8 +384,6 @@ div.admonition > :last-child { div.sidebar::after, aside.sidebar::after, -nav.contents::after, -aside.topic::after, div.topic::after, div.admonition::after, blockquote::after { @@ -606,26 +608,19 @@ ol.simple p, ul.simple p { margin-bottom: 0; } -aside.footnote > span, -div.citation > span { +dl.footnote > dt, +dl.citation > dt { float: left; + margin-right: 0.5em; } -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 { + +dl.footnote > dd, +dl.citation > dd { margin-bottom: 0em; } -aside.footnote > p:last-of-type:after, -div.citation > p:last-of-type:after { + +dl.footnote > dd:after, +dl.citation > dd:after { content: ""; clear: both; } @@ -641,6 +636,10 @@ dl.field-list > dt { padding-left: 0.5em; padding-right: 5px; } +dl.field-list > dt:after { + content: ":"; +} + dl.field-list > dd { padding-left: 0.5em; diff --git a/docs/html/_static/css/badge_only.css b/docs/html/_static/css/badge_only.css new file mode 100644 index 0000000000..c718cee441 --- /dev/null +++ b/docs/html/_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/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 0000000000..6cb6000018 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 0000000000..7059e23142 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 0000000000..f815f63f99 Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 0000000000..f2c76e5bda Binary files /dev/null and b/docs/html/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.eot b/docs/html/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000..e9f60ca953 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.ttf b/docs/html/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000..35acda2fa1 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff b/docs/html/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000..400014a4b0 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/docs/html/_static/css/fonts/fontawesome-webfont.woff2 b/docs/html/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000..4d13fc6040 Binary files /dev/null and b/docs/html/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff b/docs/html/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 0000000000..88ad05b9ff Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold-italic.woff differ diff --git a/docs/html/_static/css/fonts/lato-bold-italic.woff2 b/docs/html/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 0000000000..c4e3d804b5 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff b/docs/html/_static/css/fonts/lato-bold.woff new file mode 100644 index 0000000000..c6dff51f06 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold.woff differ diff --git a/docs/html/_static/css/fonts/lato-bold.woff2 b/docs/html/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 0000000000..bb195043cf Binary files /dev/null and b/docs/html/_static/css/fonts/lato-bold.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff b/docs/html/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 0000000000..76114bc033 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal-italic.woff differ diff --git a/docs/html/_static/css/fonts/lato-normal-italic.woff2 b/docs/html/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 0000000000..3404f37e2e Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff b/docs/html/_static/css/fonts/lato-normal.woff new file mode 100644 index 0000000000..ae1307ff5f Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal.woff differ diff --git a/docs/html/_static/css/fonts/lato-normal.woff2 b/docs/html/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 0000000000..3bf9843328 Binary files /dev/null and b/docs/html/_static/css/fonts/lato-normal.woff2 differ diff --git a/docs/html/_static/css/theme.css b/docs/html/_static/css/theme.css new file mode 100644 index 0000000000..09a1af86db --- /dev/null +++ b/docs/html/_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 .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:max-content auto}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>dt:after,html.writer-html5 .rst-content dl.field-list>dt:after,html.writer-html5 .rst-content dl.footnote>dt:after{content:":"}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,html.writer-html5 .rst-content dl.footnote>dt>span.brackets{margin-right:.5rem}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{font-style:italic}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,html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content dl.citation,.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content dl.citation code,.rst-content dl.citation tt,.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 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{border:1px solid #7fbbe3;background:#e7f2fa;font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.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/docs/html/_static/doctools.js b/docs/html/_static/doctools.js index c3db08d1c3..527b876ca6 100644 --- a/docs/html/_static/doctools.js +++ b/docs/html/_static/doctools.js @@ -10,6 +10,13 @@ */ "use strict"; +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + const _ready = (callback) => { if (document.readyState !== "loading") { callback(); @@ -18,73 +25,11 @@ const _ready = (callback) => { } }; -/** - * 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))); - parent.insertBefore( - span, - parent.insertBefore( - document.createTextNode(val.substr(pos + text.length)), - node.nextSibling - ) - ); - node.nodeValue = val.substr(0, pos); - - 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 Documentation = { init: () => { - Documentation.highlightSearchWords(); Documentation.initDomainIndexTable(); Documentation.initOnKeyListeners(); }, @@ -126,51 +71,6 @@ const Documentation = { Documentation.LOCALE = catalog.locale; }, - /** - * highlight the search words provided in the url in the text - */ - highlightSearchWords: () => { - const highlight = - new URLSearchParams(window.location.search).get("highlight") || ""; - 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")); - const url = new URL(window.location); - url.searchParams.delete("highlight"); - window.history.replaceState({}, "", url); - }, - /** * helper function to focus on search bar */ @@ -210,15 +110,11 @@ const Documentation = { ) return; - const blacklistedElements = new Set([ - "TEXTAREA", - "INPUT", - "SELECT", - "BUTTON", - ]); document.addEventListener("keydown", (event) => { - if (blacklistedElements.has(document.activeElement.tagName)) return; // bail for input elements - if (event.altKey || event.ctrlKey || event.metaKey) return; // bail with special keys + // 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) { @@ -240,10 +136,6 @@ const Documentation = { event.preventDefault(); } break; - case "Escape": - if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; - Documentation.hideSearchWords(); - event.preventDefault(); } } diff --git a/docs/html/_static/js/badge_only.js b/docs/html/_static/js/badge_only.js new file mode 100644 index 0000000000..526d7234b6 --- /dev/null +++ b/docs/html/_static/js/badge_only.js @@ -0,0 +1 @@ +!function(e){var t={};function r(n){if(t[n])return t[n].exports;var o=t[n]={i:n,l:!1,exports:{}};return e[n].call(o.exports,o,o.exports,r),o.l=!0,o.exports}r.m=e,r.c=t,r.d=function(e,t,n){r.o(e,t)||Object.defineProperty(e,t,{enumerable:!0,get:n})},r.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(e){var t=e&&e.__esModule?function(){return e.default}:function(){return e};return r.d(t,"a",t),t},r.o=function(e,t){return Object.prototype.hasOwnProperty.call(e,t)},r.p="",r(r.s=4)}({4:function(e,t,r){}}); \ No newline at end of file diff --git a/docs/html/_static/js/html5shiv-printshiv.min.js b/docs/html/_static/js/html5shiv-printshiv.min.js new file mode 100644 index 0000000000..2b43bd062e --- /dev/null +++ b/docs/html/_static/js/html5shiv-printshiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3-pre | @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=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/docs/html/_static/js/html5shiv.min.js b/docs/html/_static/js/html5shiv.min.js new file mode 100644 index 0000000000..cd1c674f5e --- /dev/null +++ b/docs/html/_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/docs/html/_static/js/theme.js b/docs/html/_static/js/theme.js new file mode 100644 index 0000000000..1fddb6ee4a --- /dev/null +++ b/docs/html/_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;t { const _escapeRegExp = (string) => string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string -const _displayItem = (item, highlightTerms, searchTerms) => { +const _displayItem = (item, searchTerms) => { const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; const docUrlRoot = DOCUMENTATION_OPTIONS.URL_ROOT; const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; - const [docName, title, anchor, descr] = item; + const [docName, title, anchor, descr, score, _filename] = item; let listItem = document.createElement("li"); let requestUrl; @@ -82,10 +82,9 @@ const _displayItem = (item, highlightTerms, searchTerms) => { requestUrl = docUrlRoot + docName + docFileSuffix; linkUrl = docName + docLinkSuffix; } - const params = new URLSearchParams(); - params.set("highlight", [...highlightTerms].join(" ")); let linkEl = listItem.appendChild(document.createElement("a")); - linkEl.href = linkUrl + "?" + params.toString() + anchor; + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; linkEl.innerHTML = title; if (descr) listItem.appendChild(document.createElement("span")).innerHTML = @@ -96,7 +95,7 @@ const _displayItem = (item, highlightTerms, searchTerms) => { .then((data) => { if (data) listItem.appendChild( - Search.makeSearchSummary(data, searchTerms, highlightTerms) + Search.makeSearchSummary(data, searchTerms) ); }); Search.output.appendChild(listItem); @@ -116,15 +115,14 @@ const _finishSearch = (resultCount) => { const _displayNextItem = ( results, resultCount, - highlightTerms, searchTerms ) => { // results left, load the summary and display it // this is intended to be dynamic (don't sub resultsCount) if (results.length) { - _displayItem(results.pop(), highlightTerms, searchTerms); + _displayItem(results.pop(), searchTerms); setTimeout( - () => _displayNextItem(results, resultCount, highlightTerms, searchTerms), + () => _displayNextItem(results, resultCount, searchTerms), 5 ); } @@ -237,6 +235,12 @@ const Search = { * 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(); @@ -264,6 +268,10 @@ const Search = { } }); + 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]); @@ -272,6 +280,40 @@ const Search = { 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)) @@ -318,7 +360,7 @@ const Search = { // console.info("search results:", Search.lastresults); // print the results - _displayNextItem(results, results.length, highlightTerms, searchTerms); + _displayNextItem(results, results.length, searchTerms); }, /** @@ -399,8 +441,8 @@ const Search = { // prepare search const terms = Search._index.terms; const titleTerms = Search._index.titleterms; - const docNames = Search._index.docnames; const filenames = Search._index.filenames; + const docNames = Search._index.docnames; const titles = Search._index.titles; const scoreMap = new Map(); @@ -497,11 +539,9 @@ const Search = { /** * helper function to return a node containing the * search summary for a given text. keywords is a list - * of stemmed words, highlightWords is the list of normal, unstemmed - * words. the first one is used to find the occurrence, the - * latter for highlighting it. + * of stemmed words. */ - makeSearchSummary: (htmlText, keywords, highlightWords) => { + makeSearchSummary: (htmlText, keywords) => { const text = Search.htmlToText(htmlText); if (text === "") return null; @@ -519,10 +559,6 @@ const Search = { summary.classList.add("context"); summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; - highlightWords.forEach((highlightWord) => - _highlightText(summary, highlightWord, "highlighted") - ); - return summary; }, }; diff --git a/docs/html/_static/sphinx_highlight.js b/docs/html/_static/sphinx_highlight.js new file mode 100644 index 0000000000..aae669d7ea --- /dev/null +++ b/docs/html/_static/sphinx_highlight.js @@ -0,0 +1,144 @@ +/* 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))); + parent.insertBefore( + span, + parent.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + + 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(SphinxHighlight.highlightSearchWords); +_ready(SphinxHighlight.initEscapeListener); diff --git a/docs/html/docsrc/howto/howto-docstring.html b/docs/html/docsrc/howto/howto-docstring.html index 3ee7add2df..f70c80bc80 100644 --- a/docs/html/docsrc/howto/howto-docstring.html +++ b/docs/html/docsrc/howto/howto-docstring.html @@ -1,47 +1,82 @@ - - - - - - - - 1. How-To docstring — PorePy 1.5 documentation - - - - - - - + + + + + + 1. How-To docstring — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
-

1.2.3. Documenting classes

+

1.2.3. Documenting classes

When documenting classes, three aspects have to be considered.

Documenting Constructor Arguments

In PorePy, the constructor description is to be included in the class-docstring, not in the @@ -532,17 +610,41 @@

1.2.3. Documenting classesExample class documentation

-class ExampleClass(arg1: int, arg2: str)[source]
+class ExampleClass(arg1: int, arg2: str)[source]

Bases: object

A quick purpose of the class is to be provided in the first line.

After the first line, a broader, multi-line description of the class can follow. It can contain multiple paragraphs as well as elements like code snippets.

Example: directives are encouraged to demonstrate the usage of a class.

Note: directives can be used the same way as for functions.

-

At the end follows obligatory the Parameters: directive and a Raises: directive, -if errors are raised in the constructor for some reason.

+
+

Example

+

Using the Example: directive, you can provide simplified python syntax using >>> +on how to instantiate the class for example:

+
>>> import example_docstrings as ed
+>>> A = ed.ExampleClass()
+>>> print(type(A))
+<class 'example_docstrings.ExampleClass'>
+
+
+
+

Use the References: and See Also: directives to provide links to sources or +inspirations for your implementation.

+

For readability reasons, we impose the same rules on the order of directives as for +functions. Meaning references/ see also, followed by parameters, return/yield and raises +must be placed at the end with no additional text in between.

+
+

References

+
    +
  1. Basic Google Style.

  2. +
+
+
-
Parameters:
+
Parameters
-example_method(arg: bool) bool[source]
+example_method(arg: bool) bool[source]

A short description of the method must fit in the first line.

A more elaborate description can follow afterwards.

-
Parameters:
+
Parameters

arg – The first argument (even though self is technically the first one).

-
Returns:
+
Returns

True.

@@ -573,25 +675,25 @@

1.2.3. Documenting classes
-static example_static_method() None[source]
+static example_static_method() None[source]

This is the docstring of a static method.

Note the absence of self.

-attribute_1: int
+attribute_1: int

This is how to properly document an instance-level attribute in the constructor.

-attribute_2: str
+attribute_2: str

This is an instance-level attribute with a redundant field ‘Type:’ caused by type hints in the docstring. The type should only be given by its annotation. DO NOT use type hints in docstrings (cannot repeat often enough).

-
Type:
+
Type

str

@@ -599,7 +701,7 @@

1.2.3. Documenting classes
-attribute_3: dict[str, int]
+attribute_3: dict[str, int]

Some attributes are calculated during construction, possibly in a separate method.

Document nevertheless what the attribute contains and what it is used for etc., but leave the documentation of how it is calculated to the separate method.

@@ -607,7 +709,7 @@

1.2.3. Documenting classes
-class_attribute_1: int = 1
+class_attribute_1: int = 1

This is how to properly document a class-level attribute.

The value 1 is shown in the docs, because it is static upon class type creation and Sphinx realizes that.

@@ -615,12 +717,12 @@

1.2.3. Documenting classes
-class_attribute_2: str = 'A'
+class_attribute_2: str = 'A'

This is a class attribute with a redundant field ‘Type:’ caused by type hints in the docstring. The type should only be given by its annotation. DO NOT use type hints in docstrings.

-
Type:
+
Type

str

@@ -628,13 +730,13 @@

1.2.3. Documenting classes
-property readonly_property: str
+property readonly_property: str

Document properties only in their getter-methods.

-property readwrite_property: str
+property readwrite_property: str

Properties with both a getter and setter should only be documented in their getter method.

If the setter method contains notable behavior, it should be @@ -645,7 +747,7 @@

1.2.3. Documenting classes -

1.2.4. Module-level documentation

+

1.2.4. Module-level documentation

Module level documentation can be achieved by writing a docstring at the very top of a file. Subpackages i.e., folders containing an __init__ file and multiple modules, have their docstring at the top of the __init__ file. @@ -662,69 +764,30 @@

1.2.4. Module-level documentation -
+

-
-
- - - - + +
+ + + \ No newline at end of file diff --git a/docs/html/docsrc/porepy/numerics/ad/numerics-ad.html b/docs/html/docsrc/porepy/numerics/ad/numerics-ad.html index 7927a6d774..8a2e8599c2 100644 --- a/docs/html/docsrc/porepy/numerics/ad/numerics-ad.html +++ b/docs/html/docsrc/porepy/numerics/ad/numerics-ad.html @@ -1,59 +1,91 @@ - - - - - - - - Automatic Differentiation — PorePy 1.5 documentation - - - - - - - + + + + + + Automatic Differentiation — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+ -
- - - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/docsrc/porepy/numerics/numerics.html b/docs/html/docsrc/porepy/numerics/numerics.html index c1a060e8cf..0748131f60 100644 --- a/docs/html/docsrc/porepy/numerics/numerics.html +++ b/docs/html/docsrc/porepy/numerics/numerics.html @@ -1,51 +1,83 @@ - + + + - - - - - - Numerics — PorePy 1.5 documentation - - - - - - - + + Numerics — PorePy 1.5 documentation + + + + + + + + + + + + - - - + + + + +
+ -
-
-
-
- +
+ +
+ -
- - - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-A.html b/docs/html/genindex-A.html index 3795ed1c4a..c4f2937923 100644 --- a/docs/html/genindex-A.html +++ b/docs/html/genindex-A.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + -
-
-
-
- + +
+ + +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex-C.html b/docs/html/genindex-C.html index bcc93be3c0..61b2016ff2 100644 --- a/docs/html/genindex-C.html +++ b/docs/html/genindex-C.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-D.html b/docs/html/genindex-D.html index 61df69299e..ea1c2ed409 100644 --- a/docs/html/genindex-D.html +++ b/docs/html/genindex-D.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-E.html b/docs/html/genindex-E.html index b63b903cfa..87a470726f 100644 --- a/docs/html/genindex-E.html +++ b/docs/html/genindex-E.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
+ + - -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex-F.html b/docs/html/genindex-F.html index 1f6a8fc099..5f09d7f076 100644 --- a/docs/html/genindex-F.html +++ b/docs/html/genindex-F.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-G.html b/docs/html/genindex-G.html index d7eccca44c..5731973d5e 100644 --- a/docs/html/genindex-G.html +++ b/docs/html/genindex-G.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex-H.html b/docs/html/genindex-H.html index c9a1eb168b..3d998dc56d 100644 --- a/docs/html/genindex-H.html +++ b/docs/html/genindex-H.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-I.html b/docs/html/genindex-I.html index 8ab133fce8..ad0de26782 100644 --- a/docs/html/genindex-I.html +++ b/docs/html/genindex-I.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-J.html b/docs/html/genindex-J.html index f83bd75ff9..6b1972ff8b 100644 --- a/docs/html/genindex-J.html +++ b/docs/html/genindex-J.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-L.html b/docs/html/genindex-L.html index 3e1a0d0ef4..fbb2419bbb 100644 --- a/docs/html/genindex-L.html +++ b/docs/html/genindex-L.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-M.html b/docs/html/genindex-M.html index 6edb42770b..6df448eff5 100644 --- a/docs/html/genindex-M.html +++ b/docs/html/genindex-M.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- + - -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-O.html b/docs/html/genindex-O.html index dbee5767ac..bc1c08e561 100644 --- a/docs/html/genindex-O.html +++ b/docs/html/genindex-O.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-P.html b/docs/html/genindex-P.html index 6d5d2bad19..8932dcf754 100644 --- a/docs/html/genindex-P.html +++ b/docs/html/genindex-P.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex-R.html b/docs/html/genindex-R.html index 72e7773543..9591ed2954 100644 --- a/docs/html/genindex-R.html +++ b/docs/html/genindex-R.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-S.html b/docs/html/genindex-S.html index be5367a49b..8d390d773c 100644 --- a/docs/html/genindex-S.html +++ b/docs/html/genindex-S.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex-T.html b/docs/html/genindex-T.html index 6cde8cc1bc..4756477d95 100644 --- a/docs/html/genindex-T.html +++ b/docs/html/genindex-T.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-V.html b/docs/html/genindex-V.html index 0e8a11a0b7..cd0e069e6a 100644 --- a/docs/html/genindex-V.html +++ b/docs/html/genindex-V.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-_.html b/docs/html/genindex-_.html index 445c42efc5..1dc2e06000 100644 --- a/docs/html/genindex-_.html +++ b/docs/html/genindex-_.html @@ -1,41 +1,79 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + + + +
+ + +
-
-
-
-
- +
+
- -
-
- - - +
+
+ + + \ No newline at end of file diff --git a/docs/html/genindex-all.html b/docs/html/genindex-all.html index 7207f414b9..8a52a64539 100644 --- a/docs/html/genindex-all.html +++ b/docs/html/genindex-all.html @@ -1,40 +1,78 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ + - -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/genindex.html b/docs/html/genindex.html index 60e85fe960..15060731b8 100644 --- a/docs/html/genindex.html +++ b/docs/html/genindex.html @@ -1,40 +1,78 @@ - - - - - - - Index — PorePy 1.5 documentation - - - - - - - + + + + + Index — PorePy 1.5 documentation + + + + + + + + + + + + - - + -
-
-
-
- + +
+ + +
+ +
+ +
+ +
+ +
+

© Copyright 2022 UiB Center for Modeling of Coupled Subsurface Dynamics, GNU LESSER GENERAL PUBLIC LICENSE Version 3, 29 June 2007..

+
+ + + +
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/index.html b/docs/html/index.html index 4aba03b15e..61bf845ad2 100644 --- a/docs/html/index.html +++ b/docs/html/index.html @@ -1,47 +1,82 @@ - + + + - - - - - - Welcome to PorePy! — PorePy 1.5 documentation - - - - - - - + + PorePy Documentation — PorePy 1.5 documentation + + + + + + + + + + + + - - + -
-
-
-
- -
-

Welcome to PorePy!

+ +
+ + +
+ +
+
-
+
-
-
- - - - + +
+ + + \ No newline at end of file diff --git a/docs/html/objects.inv b/docs/html/objects.inv index 0750d58b71..6c42f3120a 100644 Binary files a/docs/html/objects.inv and b/docs/html/objects.inv differ diff --git a/docs/html/py-modindex.html b/docs/html/py-modindex.html index 7c5db5d75a..badc534e0b 100644 --- a/docs/html/py-modindex.html +++ b/docs/html/py-modindex.html @@ -1,43 +1,81 @@ - - - - - - - Python Module Index — PorePy 1.5 documentation - - - - - - - + + + + + Python Module Index — PorePy 1.5 documentation + + + + + + + + + + + + - - - -
-
-
-
- + + + +
+ + +
+ +
+
- -
-
- - - + +
+ + + \ No newline at end of file diff --git a/docs/html/search.html b/docs/html/search.html index 76953c01af..f4b4592a21 100644 --- a/docs/html/search.html +++ b/docs/html/search.html @@ -1,102 +1,123 @@ - - - - - - - Search — PorePy 1.5 documentation - - + + + + + Search — PorePy 1.5 documentation + + + - - - - - + + + + + + + + + - - - + + - - + +
+ + +
+ +
+ - -
-
- - - +
+
+ + + + + + + + \ No newline at end of file diff --git a/docs/html/searchindex.js b/docs/html/searchindex.js index 460497bde8..22ac96c46a 100644 --- a/docs/html/searchindex.js +++ b/docs/html/searchindex.js @@ -1 +1 @@ -Search.setIndex({"docnames": ["docsrc/howto/howto-docstring", "docsrc/porepy/numerics/ad/numerics-ad", "docsrc/porepy/numerics/numerics", "index"], "filenames": ["docsrc/howto/howto-docstring.rst", "docsrc/porepy/numerics/ad/numerics-ad.rst", "docsrc/porepy/numerics/numerics.rst", "index.rst"], "titles": ["1. How-To docstring", "Automatic Differentiation", "Numerics", "Welcome to PorePy!"], "terms": {"welcom": 0, "creat": [0, 1], "your": 0, "submodul": [0, 1], "here": [0, 1], "we": [0, 1], "explain": 0, "shortli": 0, "work": [0, 1], "give": 0, "exampl": [0, 1], "write": 0, "proper": [0, 1], "The": [0, 1], "i": [0, 1], "us": [0, 1, 3], "sphinx": 0, "an": [0, 1], "engin": 0, "effect": [0, 1], "import": [0, 1], "python": [0, 1], "packag": 0, "extract": [0, 1], "ar": [0, 1, 3], "fill": 0, "pre": [0, 1], "defin": [0, 1, 3], "structur": 0, "html": 0, "base": [0, 1], "written": 0, "markup": 0, "languag": 0, "call": [0, 1], "restructuredtext": 0, "short": 0, "rst": 0, "A": [0, 1], "quick": 0, "overview": 0, "can": [0, 1, 3], "found": 0, "quickref": 0, "you": [0, 3], "also": [0, 1, 3], "find": [0, 3], "vast": 0, "support": [0, 1, 3], "elsewher": 0, "internet": 0, "though": [0, 1], "close": 0, "follow": [0, 1, 3], "googl": 0, "introduc": 0, "minor": 0, "adapt": 0, "readabl": 0, "reason": [0, 1], "after": 0, "familiar": [0, 3], "yourself": 0, "read": [0, 1], "through": 0, "rest": [0, 1], "thi": [0, 1, 3], "get": [0, 1], "know": [0, 1], "specif": [0, 1, 3], "onc": 0, "have": [0, 1], "program": [0, 1], "test": 0, "merg": [0, 1], "contribut": 0, "sourc": [0, 1, 3], "contact": 0, "one": [0, 1], "core": 0, "develop": 0, "ensur": [0, 1], "integr": 0, "whole": 0, "In": [0, 1], "remain": [0, 1], "section": [0, 3], "demonstr": 0, "variou": [0, 1], "aspect": 0, "code": [0, 1, 3], "while": [0, 1, 3], "aim": [0, 3], "provid": [0, 1], "complet": 0, "instruct": [0, 3], "cannot": [0, 3], "guarante": 0, "coverag": 0, "everi": [0, 1], "possibl": 0, "case": [0, 1, 3], "world": 0, "If": [0, 1], "unsur": 0, "about": 0, "issu": 0, "don": [0, 1], "t": [0, 1], "hesit": 0, "next": 0, "compil": 0, "fleet": 0, "link": 0, "example_docstr": 0, "py": 0, "where": [0, 1], "see": [0, 1], "raw": 0, "all": [0, 1, 3], "its": [0, 1], "glori": 0, "respect": [0, 1], "wai": [0, 1], "abl": 0, "directli": [0, 1], "compar": 0, "what": [0, 1], "certain": 0, "syntax": 0, "end": 0, "look": 0, "like": [0, 1, 3], "format": [0, 1], "properli": [0, 1, 3], "includ": [0, 1, 3], "autodoc": 0, "global": 0, "done": [0, 1], "step": [0, 1], "befor": [0, 3], "option": [0, 1], "beforehand": [0, 1], "start": 0, "tripl": 0, "place": 0, "below": [0, 3], "declar": 0, "object": [0, 1], "var_1": 0, "int": [0, 1], "1": [0, 1], "inlin": 0, "liter": 0, "render": [0, 1], "becom": 0, "public": 0, "member": 0, "method": [0, 1, 3], "must": [0, 1], "It": [0, 1], "": [0, 1], "good": 0, "practic": 0, "sai": 0, "demand": 0, "privat": 0, "well": 0, "thei": [0, 1], "doc": 0, "default": [0, 1], "from": [0, 1, 3], "should": [0, 1], "clear": 0, "doe": [0, 1], "take": [0, 1], "argument": [0, 1], "return": [0, 1], "avoid": 0, "overli": 0, "scientif": 0, "complic": 0, "extens": [0, 3], "cross": 0, "referenc": 0, "featur": [0, 3], "e": [0, 1], "g": [0, 1], "domain": 0, "omit": 0, "project": 0, "limit": [0, 1], "length": [0, 1], "line": 0, "88": 0, "charact": 0, "pr": 0, "routin": 0, "check": [0, 1], "black": [0, 3], "flake8": 0, "mypi": 0, "which": [0, 1, 3], "exactli": [0, 1], "tip": 0, "most": [0, 1], "id": [0, 1], "modif": 0, "editor": 0, "vertic": 0, "displai": 0, "88th": 0, "column": [0, 1], "multi": 0, "blank": 0, "independ": [0, 1], "plain": 0, "text": 0, "content": 0, "block": [0, 1], "indent": 0, "For": [0, 1], "note": [0, 1], "implement": [0, 1], "someth": 0, "break": 0, "resum": 0, "non": [0, 1, 3], "indirectli": 0, "anytim": 0, "new": [0, 1, 3], "other": [0, 1, 3], "lineno": 0, "usag": 0, "number": [0, 1], "print": 0, "hello": 0, "deprec": 0, "versionnumb": 0, "x": [0, 1, 3], "instead": [0, 1], "miss": 0, "do": 0, "list": [0, 1], "result": [0, 1], "sinc": [0, 1], "version": [0, 1], "type": [0, 1], "onlin": 0, "some": [0, 1], "kind": 0, "top": 0, "between": [0, 1], "them": [0, 1], "addition": 0, "allow": [0, 1], "input": [0, 1], "need": [0, 1], "etc": 0, "each": [0, 1], "As": [0, 3], "mention": 0, "abov": [0, 1], "chang": [0, 1], "These": 0, "involv": 0, "team": 0, "principl": [0, 3], "aesthet": 0, "guid": 0, "especi": 0, "name": [0, 1], "convent": 0, "more": [0, 3], "inform": [0, 1], "out": [0, 1], "offici": 0, "user": [0, 1, 3], "manual": 0, "gener": [0, 1, 3], "rule": [0, 1], "accept": 0, "subsect": 0, "acronym": 0, "reserv": 0, "encourag": 0, "consist": [0, 1], "uniform": [0, 1], "appear": [0, 1], "sd": 0, "singl": 0, "subdomain": [0, 1], "mdg": [0, 1], "mixeddimensionalgrid": [0, 1], "p": [0, 1], "u": 0, "common": 0, "physic": [0, 1], "num_dof": 0, "degre": 0, "freedom": 0, "nd": 0, "ambient": 0, "dimens": [0, 1], "correspond": [0, 1], "highest": 0, "np": [0, 1], "point": [0, 1], "nc": 0, "cell": [0, 1], "provis": 0, "annot": 0, "implic": 0, "attribut": [0, 1], "valu": [0, 1], "known": 0, "interpret": 0, "intra": 0, "inter": 0, "consequ": 0, "abstain": 0, "hint": 0, "keep": 0, "light": 0, "exclud": 0, "custom": 0, "feel": 0, "necess": 0, "so": 0, "module_level_var_1": 0, "str": [0, 1], "module_level_var_2": 0, "valid": [0, 1], "might": [0, 1], "want": [0, 1], "multilin": 0, "when": [0, 1], "detail": 0, "descript": 0, "requir": [0, 1, 3], "separ": [0, 1], "var": [0, 1], "introduct": 0, "2": [0, 1], "NOT": 0, "module_level_var_3": 0, "unnecessari": 0, "due": [0, 1, 3], "alreadi": [0, 1], "present": 0, "click": 0, "forward": [0, 1], "right": 0, "3": [0, 1], "module_level_function_1": 0, "arg1": 0, "arg2": 0, "arg3": 0, "bool": [0, 1], "fit": 0, "first": [0, 1], "given": [0, 1], "necessari": [0, 1], "extend": 0, "cours": 0, "span": 0, "sever": 0, "natur": [0, 3], "broken": 0, "paragraph": 0, "without": [0, 1], "paramet": [0, 1], "upper": [0, 1], "corner": 0, "describ": 0, "than": 0, "even": [0, 1], "multipl": 0, "There": 0, "restrict": 0, "regard": 0, "util": [0, 1], "signatur": [0, 1], "module_level_function_2": 0, "optional_arg": 0, "none": [0, 1], "arg": [0, 1], "kwarg": [0, 1], "evid": 0, "per": [0, 1], "howev": [0, 1], "explicitli": [0, 1], "specifi": [0, 3], "easili": [0, 1], "spottabl": 0, "word": 0, "mark": 0, "arbitrari": 0, "adequ": 0, "keyword": [0, 1], "admiss": 0, "kw_arg1": 0, "kw_arg2": 0, "onli": [0, 1], "markdown": 0, "rais": [0, 1], "valueerror": [0, 1], "error": 0, "unexpect": 0, "wa": [0, 1], "pass": [0, 1], "typeerror": 0, "Be": 0, "awar": 0, "module_level_function_3": 0, "vector": 0, "ndarrai": [0, 1], "matrix": [0, 1, 3], "spmatrix": [0, 1], "b": 0, "c": 0, "special": [0, 1], "mix": [0, 3], "dimension": [0, 3], "grid": 0, "notic": 0, "len": 0, "num_cel": [0, 1], "bracket": 0, "indic": [0, 1], "suppos": 0, "unclear": 0, "refer": [0, 1], "denot": 0, "shape": [0, 1], "spars": [0, 1], "row": [0, 1], "ha": [0, 1], "string": [0, 1], "depend": [0, 1], "altern": [0, 1], "begin": 0, "exemplarili": 0, "module_level_function_4": 0, "sp": 0, "tupl": 0, "better": 0, "same": [0, 1], "technic": 0, "often": 0, "contain": [0, 1], "therefor": [0, 1], "again": 0, "definit": 0, "individu": [0, 1], "make": 0, "sens": [0, 1], "fix": 0, "hold": 0, "union": [0, 1], "example_gener": 0, "n": [0, 1], "yield": 0, "Their": 0, "equival": 0, "regular": [0, 1], "offer": 0, "signal": 0, "4": 0, "0": [0, 1], "integ": 0, "until": 0, "reach": 0, "insid": [0, 1], "order": [0, 1], "addit": 0, "three": 0, "consid": 0, "constructor": 0, "__init__": 0, "exampleclass": 0, "def": [0, 1], "__init": 0, "self": [0, 1], "wherea": [0, 1], "sue": 0, "appli": [0, 3], "instanc": [0, 1], "set": [0, 1], "build": 0, "configur": 0, "those": 0, "ani": [0, 1], "second": [0, 1], "redund": 0, "similar": [0, 1], "guidelin": [0, 3], "exploit": 0, "would": 0, "show": 0, "why": [0, 1], "class_attribute_1": 0, "attribute_1": 0, "becaus": 0, "AND": 0, "static": 0, "whether": [0, 1], "never": [0, 1], "cl": 0, "By": [0, 1], "nevertheless": 0, "he": 0, "audodoc": 0, "later": 0, "hi": 0, "group": 0, "properti": [0, 1], "sort": 0, "alphabet": 0, "purpos": 0, "broader": 0, "element": 0, "snippet": 0, "At": 0, "obligatori": 0, "classmethod": 0, "example_class_method": 0, "replac": [0, 1], "example_method": 0, "elabor": 0, "afterward": 0, "true": [0, 1], "example_static_method": 0, "absenc": 0, "attribute_2": 0, "field": 0, "caus": 0, "repeat": 0, "enough": 0, "attribute_3": 0, "dict": [0, 1], "calcul": 0, "dure": [0, 1], "construct": [0, 1, 3], "possibli": 0, "leav": [0, 1], "shown": [0, 1], "upon": [0, 1], "creation": 0, "realiz": 0, "class_attribute_2": 0, "readonly_properti": 0, "getter": [0, 1], "readwrite_properti": 0, "both": [0, 1], "setter": 0, "notabl": [0, 3], "behavior": [0, 1], "achiev": 0, "veri": 0, "file": 0, "subpackag": 0, "folder": 0, "usual": 0, "fact": [0, 1], "page": [0, 3], "supplement": 0, "decis": 0, "incorpor": 0, "made": 0, "framework": 1, "algorithm": 1, "orient": 1, "term": 1, "model": [1, 3], "goal": 1, "cheap": 1, "autom": 1, "evalu": 1, "deriv": 1, "approxim": 1, "techniqu": 1, "class": 1, "access": 1, "porepi": 1, "pp": 1, "accumul": 1, "nest": 1, "express": 1, "recurs": 1, "chain": 1, "subterm": 1, "preced": 1, "central": 1, "ad_arrai": 1, "basic": 1, "arithmet": 1, "tree": 1, "wrapper": 1, "diverg": 1, "enabl": 1, "symbol": 1, "explan": 1, "repres": [1, 3], "document": 1, "val": 1, "jac": 1, "copi": 1, "diagvec_mul_jac": 1, "full_jac": 1, "jac_mul_diagvec": 1, "interfac": [1, 3], "mortar_grid": 1, "mortargrid": 1, "parent": 1, "meant": 1, "initi": 1, "rather": 1, "subclass": 1, "still": 1, "combin": [1, 3], "child": 1, "overload": 1, "Will": 1, "empti": 1, "associ": 1, "convert": 1, "perform": 1, "identifi": 1, "now": 1, "accommod": 1, "updat": 1, "dof_manag": 1, "dofmanag": 1, "state": 1, "residu": 1, "jacobian": 1, "problem": [1, 3], "pars": 1, "sub": 1, "form": 1, "pull": [1, 3], "previou": 1, "iter": 1, "exist": 1, "time": 1, "arrai": 1, "invert": 1, "squar": 1, "is_leaf": 1, "leaf": 1, "impli": 1, "expect": [1, 3], "children": 1, "translat": 1, "atom": 1, "overrid": 1, "previous_timestep": 1, "timestep": 1, "shallow": 1, "thu": 1, "ident": 1, "origin": 1, "except": [1, 3], "set_nam": 1, "reset": 1, "instanti": 1, "assign": 1, "viz": 1, "draw": 1, "visual": 1, "root": 1, "mortar": 1, "modul": [1, 3], "wrap": 1, "part": [1, 3], "compound": 1, "f": 1, "partial": 1, "functool": 1, "adfunct": 1, "other_paramet": 1, "being": 1, "regularizedheavisid": 1, "callabl": 1, "ab": 1, "arcco": 1, "arccosh": 1, "arcsin": 1, "arcsinh": 1, "arctan": 1, "arctanh": 1, "characteristic_funct": 1, "tol": 1, "float": 1, "characterist": 1, "within": 1, "absolut": 1, "toler": 1, "zero": 1, "level": 1, "how": [1, 3], "comparison": 1, "isclos": 1, "appropri": 1, "co": 1, "cosh": 1, "exp": 1, "heavisid": 1, "zerovalu": 1, "5": 1, "heaviside_smooth": 1, "ep": 1, "001": 1, "smooth": 1, "converg": 1, "1e": 1, "applic": 1, "analyt": 1, "h_ep": 1, "pi": 1, "smoothli": 1, "dirac": 1, "delta": 1, "d": 1, "h": 1, "dx": 1, "delta_ep": 1, "http": 1, "ieeexplor": 1, "ieee": 1, "org": 1, "902291": 1, "l2_norm": 1, "dim": 1, "l2": 1, "norm": 1, "compon": 1, "assum": 1, "u0": 1, "v0": 1, "w0": 1, "u1": 1, "v1": 1, "w1": 1, "un": 1, "vn": 1, "wn": 1, "satisfi": 1, "ui": 1, "vi": 1, "wi": 1, "entri": 1, "jacobi": 1, "log": 1, "maximum": 1, "var0": 1, "var1": 1, "numpi": 1, "sign": 1, "sin": 1, "sinh": 1, "tan": 1, "tanh": 1, "around": 1, "real": 1, "mai": 1, "immut": 1, "deep": 1, "reflect": [1, 3], "contrast": 1, "timedependentarrai": 1, "fals": 1, "ti": 1, "distribut": 1, "among": 1, "dictionari": 1, "store": 1, "_name": 1, "current": 1, "dt": 1, "intend": 1, "vari": 1, "quantiti": 1, "futur": [1, 3], "boundari": 1, "condit": 1, "pend": 1, "item": 1, "flag": 1, "either": 1, "pick": 1, "prev_tim": 1, "mat": 1, "dens": 1, "transpos": 1, "ndof": 1, "previous_iter": 1, "differ": 1, "mergedvari": 1, "convers": 1, "dof": 1, "kei": 1, "face": 1, "node": 1, "relev": 1, "prev_it": 1, "size": 1, "uniqu": 1, "collect": 1, "live": 1, "treat": 1, "jointli": 1, "suffici": 1, "total": 1, "sum": 1, "sub_var": 1, "abstractfunct": 1, "func": 1, "array_compat": 1, "ad_compat": 1, "abstract": 1, "obtain": 1, "mean": 1, "interpol": 1, "fd": 1, "One": 1, "compat": 1, "itself": 1, "alwai": 1, "arraylik": 1, "output": 1, "wise": 1, "bypass": 1, "correctli": 1, "__call__": 1, "fulfil": 1, "notion": 1, "get_jacobian": 1, "get_valu": 1, "md": 1, "abstractjacobianfunct": 1, "direct": 1, "formal": 1, "constantfunct": 1, "ergo": 1, "impos": 1, "scipi": 1, "henc": 1, "trivial": 1, "diagonaljacobianfunct": 1, "multipli": 1, "match": 1, "interpolatedfunct": 1, "min_val": 1, "max_val": 1, "npt": 1, "preval": 1, "chosen": 1, "cartesian": 1, "imag": 1, "multidimension": 1, "lower": 1, "bound": 1, "linear": [1, 3], "influenc": 1, "runtim": 1, "admethod": 1, "ad_function_typ": 1, "operator_funct": 1, "operator_kwarg": 1, "decor": 1, "idealga": 1, "ad_oper": 1, "operators_arg": 1, "densiti": 1, "dummy_rel_perm": 1, "With": 1, "pressur": 1, "temperatur": 1, "analog": 1, "satur": 1, "explicit": 1, "implicitli": 1, "factori": 1, "belong": 1, "unbound": 1, "anoth": 1, "immedi": 1, "dereferenc": 1, "save": 1, "potenti": 1, "memori": 1, "leak": 1, "__get__": 1, "binding_inst": 1, "binding_typ": 1, "descriptor": 1, "protocol": 1, "syntact": 1, "contrari": 1, "whose": 1, "been": 1, "owner": 1, "ad_wrapp": 1, "actual": 1, "todo": 1, "automat": [2, 3], "differenti": [2, 3], "research": 3, "mainli": 3, "depart": 3, "mathemat": 3, "univers": 3, "bergen": 3, "simul": 3, "multiphys": 3, "process": 3, "fractur": 3, "porou": 3, "media": 3, "typic": 3, "technologi": 3, "discret": 3, "coupl": 3, "scheme": 3, "studi": 3, "standard": 3, "tool": 3, "product": 3, "two": 3, "main": 3, "third": 3, "topic": 3, "design": 3, "softwar": 3, "strength": 3, "represent": 3, "variabl": 3, "network": 3, "semi": 3, "mesh": 3, "conform": 3, "flow": 3, "deform": 3, "transport": 3, "friction": 3, "flexibl": 3, "constitut": 3, "relat": 3, "simpl": 3, "function": 3, "propag": 3, "newli": 3, "ad": 3, "care": 3, "comput": 3, "geometri": 3, "under": 3, "activ": 3, "improv": 3, "No": 3, "nativ": 3, "solver": 3, "few": 3, "setup": 3, "avail": 3, "mostli": 3, "respons": 3, "hierarchi": 3, "mechan": 3, "poromechan": 3, "thermo": 3, "box": 3, "solv": 3, "rel": 3, "straightforwardli": 3, "complex": 3, "dive": 3, "partli": 3, "lack": 3, "resourc": 3, "side": 3, "difficult": 3, "robust": 3, "divid": 3, "numer": 3, "themselv": 3, "To": 3, "attempt": 3, "request": 3, "docstr": 3, "index": 3, "search": 3}, "objects": {"": [[0, 0, 0, "-", "example_docstrings"]], "example_docstrings": [[0, 1, 1, "", "ExampleClass"], [0, 5, 1, "", "example_generator"], [0, 5, 1, "", "module_level_function_1"], [0, 5, 1, "", "module_level_function_2"], [0, 5, 1, "", "module_level_function_3"], [0, 5, 1, "", "module_level_function_4"], [0, 6, 1, "", "module_level_var_1"], [0, 6, 1, "", "module_level_var_2"], [0, 6, 1, "", "module_level_var_3"]], "example_docstrings.ExampleClass": [[0, 2, 1, "", "attribute_1"], [0, 2, 1, "", "attribute_2"], [0, 2, 1, "", "attribute_3"], [0, 2, 1, "", "class_attribute_1"], [0, 2, 1, "", "class_attribute_2"], [0, 3, 1, "", "example_class_method"], [0, 3, 1, "", "example_method"], [0, 3, 1, "", "example_static_method"], [0, 4, 1, "", "readonly_property"], [0, 4, 1, "", "readwrite_property"]], "porepy.numerics.ad": [[1, 0, 0, "-", "functions"]], "porepy.numerics.ad.functions": [[1, 1, 1, "", "RegularizedHeaviside"], [1, 5, 1, "", "abs"], [1, 5, 1, "", "arccos"], [1, 5, 1, "", "arccosh"], [1, 5, 1, "", "arcsin"], [1, 5, 1, "", "arcsinh"], [1, 5, 1, "", "arctan"], [1, 5, 1, "", "arctanh"], [1, 5, 1, "", "characteristic_function"], [1, 5, 1, "", "cos"], [1, 5, 1, "", "cosh"], [1, 5, 1, "", "exp"], [1, 5, 1, "", "heaviside"], [1, 5, 1, "", "heaviside_smooth"], [1, 5, 1, "", "l2_norm"], [1, 5, 1, "", "log"], [1, 5, 1, "", "maximum"], [1, 5, 1, "", "sign"], [1, 5, 1, "", "sin"], [1, 5, 1, "", "sinh"], [1, 5, 1, "", "tan"], [1, 5, 1, "", "tanh"]], "porepy.numerics.ad.operator_functions": [[1, 1, 1, "", "ADmethod"], [1, 1, 1, "", "AbstractFunction"], [1, 1, 1, "", "AbstractJacobianFunction"], [1, 1, 1, "", "ConstantFunction"], [1, 1, 1, "", "DiagonalJacobianFunction"], [1, 1, 1, "", "Function"], [1, 1, 1, "", "InterpolatedFunction"]], "porepy.numerics.ad.operator_functions.ADmethod": [[1, 3, 1, "", "__call__"], [1, 3, 1, "", "__get__"], [1, 3, 1, "", "ad_wrapper"]], "porepy.numerics.ad.operator_functions.AbstractFunction": [[1, 3, 1, "", "__call__"], [1, 3, 1, "", "get_jacobian"], [1, 3, 1, "", "get_values"], [1, 3, 1, "", "parse"]], "porepy.numerics.ad.operator_functions.AbstractJacobianFunction": [[1, 3, 1, "", "get_values"]], "porepy.numerics.ad.operator_functions.ConstantFunction": [[1, 3, 1, "", "get_jacobian"], [1, 3, 1, "", "get_values"]], "porepy.numerics.ad.operator_functions.DiagonalJacobianFunction": [[1, 3, 1, "", "get_jacobian"]], "porepy.numerics.ad.operators": [[1, 1, 1, "", "Ad_array"], [1, 1, 1, "", "Array"], [1, 1, 1, "", "Matrix"], [1, 1, 1, "", "MergedVariable"], [1, 1, 1, "", "Operator"], [1, 1, 1, "", "Scalar"], [1, 1, 1, "", "TimeDependentArray"], [1, 1, 1, "", "Variable"]], "porepy.numerics.ad.operators.Ad_array": [[1, 3, 1, "", "copy"], [1, 3, 1, "", "diagvec_mul_jac"], [1, 3, 1, "", "full_jac"], [1, 3, 1, "", "jac_mul_diagvec"]], "porepy.numerics.ad.operators.Array": [[1, 2, 1, "", "interfaces"], [1, 3, 1, "", "parse"], [1, 2, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Matrix": [[1, 2, 1, "", "interfaces"], [1, 3, 1, "", "parse"], [1, 2, 1, "", "shape"], [1, 2, 1, "", "subdomains"], [1, 3, 1, "", "transpose"]], "porepy.numerics.ad.operators.MergedVariable": [[1, 3, 1, "", "copy"], [1, 2, 1, "", "interfaces"], [1, 2, 1, "", "prev_iter"], [1, 2, 1, "", "prev_time"], [1, 3, 1, "", "previous_iteration"], [1, 3, 1, "", "previous_timestep"], [1, 3, 1, "", "size"], [1, 2, 1, "", "sub_vars"], [1, 2, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Operator": [[1, 3, 1, "", "discretize"], [1, 3, 1, "", "evaluate"], [1, 2, 1, "", "interfaces"], [1, 3, 1, "", "is_leaf"], [1, 3, 1, "", "parse"], [1, 3, 1, "", "previous_timestep"], [1, 3, 1, "", "set_name"], [1, 2, 1, "", "subdomains"], [1, 3, 1, "", "viz"]], "porepy.numerics.ad.operators.Scalar": [[1, 2, 1, "", "interfaces"], [1, 3, 1, "", "parse"], [1, 2, 1, "", "subdomains"]], "porepy.numerics.ad.operators.TimeDependentArray": [[1, 2, 1, "", "interfaces"], [1, 3, 1, "", "parse"], [1, 2, 1, "", "prev_time"], [1, 3, 1, "", "previous_timestep"], [1, 2, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Variable": [[1, 2, 1, "", "id"], [1, 2, 1, "", "interfaces"], [1, 2, 1, "", "prev_iter"], [1, 2, 1, "", "prev_time"], [1, 3, 1, "", "previous_iteration"], [1, 3, 1, "", "previous_timestep"], [1, 3, 1, "", "size"], [1, 2, 1, "", "subdomains"]]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:attribute", "3": "py:method", "4": "py:property", "5": "py:function", "6": "py:data"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "attribute", "Python attribute"], "3": ["py", "method", "Python method"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"], "6": ["py", "data", "Python data"]}, "titleterms": {"how": 0, "To": 0, "docstr": 0, "basic": 0, "direct": 0, "todo": 0, "porepi": [0, 3], "style": 0, "document": 0, "variabl": [0, 1], "function": [0, 1], "class": 0, "modul": 0, "level": 0, "automat": 1, "differenti": 1, "element": 1, "ad": 1, "data": 1, "structur": 1, "common": 1, "mathemat": 1, "represent": 1, "constant": 1, "scalar": 1, "vector": 1, "matric": 1, "singl": 1, "mix": 1, "dimension": 1, "domain": 1, "oper": 1, "grid": 1, "numer": [1, 2], "discret": 1, "scheme": 1, "equat": 1, "manag": 1, "submodul": 2, "welcom": 3, "what": 3, "i": 3, "good": 3, "so": 3, "The": 3, "packag": 3, "For": 3, "develop": 3, "indic": 3, "tabl": 3}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 6, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 56}}) \ No newline at end of file +Search.setIndex({"docnames": ["docsrc/howto/howto-docstring", "docsrc/porepy/numerics/ad/numerics-ad", "docsrc/porepy/numerics/numerics", "index"], "filenames": ["docsrc/howto/howto-docstring.rst", "docsrc/porepy/numerics/ad/numerics-ad.rst", "docsrc/porepy/numerics/numerics.rst", "index.rst"], "titles": ["1. How-To docstring", "Automatic Differentiation", "Numerics", "PorePy Documentation"], "terms": {"welcom": 0, "creat": [0, 1], "your": 0, "submodul": [0, 1], "here": [0, 1], "we": [0, 1], "explain": 0, "shortli": 0, "work": [0, 1], "give": 0, "exampl": [], "write": 0, "proper": [0, 1], "The": [0, 1], "i": [0, 1], "us": [0, 1, 3], "sphinx": 0, "an": [0, 1], "engin": 0, "effect": [0, 1], "import": [0, 1], "python": [0, 1], "packag": 0, "extract": [0, 1], "ar": [0, 1, 3], "fill": 0, "pre": [0, 1], "defin": [0, 1, 3], "structur": 0, "html": 0, "base": [0, 1], "written": 0, "markup": 0, "languag": 0, "call": [0, 1], "restructuredtext": 0, "short": 0, "rst": 0, "A": [0, 1], "quick": 0, "overview": 0, "can": [0, 1, 3], "found": 0, "quickref": 0, "you": [0, 3], "also": [0, 1, 3], "find": [0, 3], "vast": 0, "support": [0, 1, 3], "elsewher": 0, "internet": 0, "though": [0, 1], "close": 0, "follow": [0, 1, 3], "googl": 0, "introduc": 0, "minor": 0, "adapt": 0, "readabl": 0, "reason": [0, 1], "after": 0, "familiar": [0, 3], "yourself": 0, "read": [0, 1], "through": 0, "rest": [0, 1], "thi": [0, 1, 3], "get": [0, 1], "know": [0, 1], "specif": [0, 1, 3], "onc": 0, "have": [0, 1], "program": [0, 1], "test": 0, "merg": [0, 1], "contribut": 0, "sourc": [0, 1, 3], "contact": 0, "one": [0, 1], "core": 0, "develop": 0, "ensur": [0, 1], "integr": 0, "whole": 0, "In": [0, 1], "remain": [0, 1], "section": [0, 3], "demonstr": 0, "variou": [0, 1], "aspect": 0, "code": [0, 1, 3], "while": [0, 1, 3], "aim": [0, 3], "provid": [0, 1], "complet": 0, "instruct": [0, 3], "cannot": [0, 3], "guarante": 0, "coverag": 0, "everi": [0, 1], "possibl": 0, "case": [0, 1, 3], "world": 0, "If": [0, 1], "unsur": 0, "about": 0, "issu": 0, "don": [0, 1], "t": [0, 1], "hesit": 0, "next": 0, "compil": 0, "fleet": 0, "link": 0, "example_docstr": 0, "py": 0, "where": [0, 1], "see": [0, 1], "raw": 0, "all": [0, 1, 3], "its": [0, 1], "glori": 0, "respect": [0, 1], "wai": [0, 1], "abl": 0, "directli": [0, 1], "compar": 0, "what": [0, 1], "certain": 0, "syntax": 0, "end": 0, "look": 0, "like": [0, 1, 3], "format": [0, 1], "properli": [0, 1, 3], "includ": [0, 1, 3], "autodoc": 0, "global": 0, "done": [0, 1], "step": [0, 1], "befor": [0, 3], "option": [0, 1], "beforehand": [0, 1], "start": 0, "tripl": 0, "place": 0, "below": [0, 3], "declar": 0, "object": [0, 1], "var_1": 0, "int": [0, 1], "1": [0, 1], "inlin": 0, "liter": 0, "render": [0, 1], "becom": 0, "public": 0, "member": 0, "method": [0, 1, 3], "must": [0, 1], "It": [0, 1], "": [0, 1], "good": 0, "practic": 0, "sai": 0, "demand": 0, "privat": 0, "well": 0, "thei": [0, 1], "doc": 0, "default": [0, 1], "from": [0, 1, 3], "should": [0, 1], "clear": 0, "doe": [0, 1], "take": [0, 1], "argument": [0, 1], "return": [0, 1], "avoid": 0, "overli": 0, "scientif": 0, "complic": 0, "extens": [0, 3], "cross": 0, "referenc": 0, "featur": [0, 3], "e": [0, 1], "g": [0, 1], "domain": 0, "omit": 0, "project": 0, "limit": [0, 1], "length": [0, 1], "line": 0, "88": 0, "charact": 0, "pr": 0, "routin": 0, "check": [0, 1], "black": [0, 3], "flake8": 0, "mypi": 0, "which": [0, 1, 3], "exactli": [0, 1], "tip": 0, "most": [0, 1], "id": [0, 1], "modif": 0, "editor": 0, "vertic": 0, "displai": 0, "88th": 0, "column": [0, 1], "multi": 0, "blank": 0, "independ": [0, 1], "plain": 0, "text": 0, "content": 0, "block": [0, 1], "indent": 0, "insid": [0, 1], "dedic": 0, "paramet": [0, 1], "valu": [0, 1], "exmapl": 0, "For": [0, 1], "note": [0, 1], "implement": [0, 1], "someth": 0, "break": 0, "resum": 0, "non": [0, 1, 3], "indirectli": 0, "anytim": 0, "new": [0, 1, 3], "other": [0, 1, 3], "lineno": 0, "usag": 0, "number": [0, 1], "print": 0, "hello": 0, "deprec": 0, "versionnumb": 0, "x": [0, 1, 3], "instead": [0, 1], "miss": 0, "do": 0, "list": [0, 1], "result": [0, 1], "sinc": [0, 1], "version": [0, 1], "type": [0, 1], "onlin": 0, "some": [0, 1], "kind": 0, "top": 0, "between": [0, 1], "them": [0, 1], "addition": 0, "allow": [0, 1], "input": [0, 1], "need": [0, 1], "etc": 0, "each": [0, 1], "As": [0, 3], "mention": 0, "abov": [0, 1], "chang": [0, 1], "These": 0, "involv": 0, "team": 0, "principl": [0, 3], "aesthet": 0, "guid": 0, "especi": 0, "name": [0, 1], "convent": 0, "more": [0, 3], "inform": [0, 1], "out": [0, 1], "offici": 0, "user": [0, 1, 3], "manual": 0, "gener": [0, 1, 3], "rule": [0, 1], "accept": 0, "subsect": 0, "acronym": 0, "reserv": 0, "encourag": 0, "consist": [0, 1], "uniform": [0, 1], "appear": [0, 1], "sd": 0, "singl": 0, "subdomain": [0, 1], "mdg": [0, 1], "mixeddimensionalgrid": [0, 1], "p": [0, 1], "u": 0, "common": 0, "physic": [0, 1], "num_dof": 0, "degre": 0, "freedom": 0, "nd": 0, "ambient": 0, "dimens": [0, 1], "correspond": [0, 1], "highest": 0, "np": [0, 1], "point": [0, 1], "nc": 0, "cell": [0, 1], "provis": 0, "annot": 0, "implic": 0, "attribut": [0, 1], "known": 0, "interpret": 0, "intra": 0, "inter": 0, "consequ": 0, "abstain": 0, "hint": 0, "keep": 0, "light": 0, "exclud": 0, "custom": 0, "feel": 0, "necess": 0, "so": 0, "alias": 0, "standard": [0, 3], "simplifi": 0, "besid": 0, "obligatori": 0, "rais": [0, 1], "error": 0, "refer": 1, "compulsori": 0, "order": [0, 1], "yield": 0, "when": [0, 1], "addit": 0, "module_level_var_1": [], "str": [0, 1], "module_level_var_2": [], "valid": [0, 1], "might": [0, 1], "want": [0, 1], "multilin": 0, "detail": 0, "descript": 0, "requir": [0, 1, 3], "separ": [0, 1], "var": [0, 1], "introduct": 0, "2": [0, 1], "NOT": 0, "module_level_var_3": [], "unnecessari": 0, "due": [0, 1, 3], "alreadi": [0, 1], "present": 0, "click": 0, "forward": [0, 1], "right": 0, "3": [0, 1], "examplearraylik": 0, "alia": 0, "numpi": [0, 1], "ndarrai": [0, 1], "union": [0, 1], "module_level_function_1": [], "arg1": 0, "arg2": 0, "arg3": 0, "bool": [0, 1], "fit": 0, "first": [0, 1], "given": [0, 1], "necessari": [0, 1], "extend": 0, "cours": 0, "span": 0, "sever": 0, "natur": [0, 3], "broken": 0, "paragraph": 0, "without": [0, 1], "upper": [0, 1], "corner": 0, "signatur": [0, 1], "inspect": 0, "than": 0, "even": [0, 1], "multipl": 0, "describ": 0, "There": 0, "restrict": 0, "regard": 0, "util": [0, 1], "module_level_function_2": [], "optional_arg": 0, "none": [0, 1], "arg": [0, 1], "kwarg": [0, 1], "evid": 0, "differ": [0, 1], "obj": 0, "third": [0, 3], "parti": 0, "per": [0, 1], "howev": [0, 1], "explicitli": [0, 1], "specifi": [0, 3], "easili": [0, 1], "spottabl": 0, "word": 0, "mark": 0, "arbitrari": 0, "adequ": 0, "keyword": [0, 1], "admiss": 0, "kw_arg1": 0, "kw_arg2": 0, "onli": [0, 1], "markdown": 0, "valueerror": [0, 1], "unexpect": 0, "wa": [0, 1], "pass": [0, 1], "typeerror": 0, "Be": 0, "awar": 0, "module_level_function_3": [], "vector": 0, "matrix": [0, 1, 3], "spmatrix": [0, 1], "b": 0, "c": 0, "special": [0, 1], "mix": [0, 3], "dimension": [0, 3], "grid": 0, "notic": 0, "len": 0, "num_cel": [0, 1], "bracket": 0, "indic": [0, 1], "suppos": 0, "unclear": 0, "denot": 0, "shape": [0, 1], "spars": [0, 1], "row": [0, 1], "ha": [0, 1], "string": [0, 1], "depend": [0, 1], "altern": [0, 1], "begin": 0, "exemplarili": 0, "module_level_function_4": [], "sp": [], "tupl": 0, "same": [0, 1], "technic": 0, "often": 0, "contain": [0, 1], "noteworthi": 0, "characterist": [0, 1], "definit": 0, "individu": [0, 1], "make": 0, "sens": [0, 1], "fix": 0, "hold": 0, "module_level_function_5": [], "array_lik": 0, "arraylik": [0, 1], "ndarray_lik": 0, "dtype_lik": 0, "dtypelik": 0, "those": 0, "pars": [0, 1], "express": [0, 1], "configur": 0, "map": 0, "encount": 0, "cover": 0, "pleas": 0, "arrai": [0, 1], "example_gener": 0, "n": [0, 1], "Their": 0, "equival": 0, "regular": [0, 1], "offer": [], "signal": [], "4": 0, "0": [0, 1], "integ": 0, "until": 0, "reach": 0, "three": 0, "consid": 0, "constructor": 0, "__init__": 0, "exampleclass": 0, "def": [0, 1], "__init": 0, "self": [0, 1], "wherea": [0, 1], "sue": 0, "appli": [0, 3], "instanc": [0, 1], "set": [0, 1], "build": 0, "ani": [0, 1], "second": [0, 1], "redund": 0, "similar": [0, 1], "guidelin": [0, 3], "exploit": 0, "would": 0, "show": 0, "why": [0, 1], "class_attribute_1": 0, "attribute_1": 0, "becaus": 0, "AND": 0, "static": 0, "whether": [0, 1], "never": [0, 1], "cl": 0, "By": [0, 1], "nevertheless": 0, "he": 0, "audodoc": 0, "later": 0, "hi": 0, "group": 0, "properti": [0, 1], "sort": 0, "alphabet": 0, "purpos": 0, "broader": 0, "element": 0, "snippet": 0, "At": [], "classmethod": 0, "example_class_method": 0, "replac": [0, 1], "example_method": 0, "elabor": 0, "afterward": 0, "true": [0, 1], "example_static_method": 0, "absenc": 0, "attribute_2": 0, "field": 0, "caus": 0, "repeat": 0, "enough": 0, "attribute_3": 0, "dict": [0, 1], "calcul": 0, "dure": [0, 1], "construct": [0, 1, 3], "possibli": 0, "leav": [0, 1], "shown": [0, 1], "upon": [0, 1], "creation": 0, "realiz": 0, "class_attribute_2": 0, "readonly_properti": 0, "getter": [0, 1], "readwrite_properti": 0, "both": [0, 1], "setter": 0, "notabl": [0, 3], "behavior": [0, 1], "achiev": 0, "veri": 0, "file": 0, "subpackag": 0, "folder": 0, "usual": 0, "fact": [0, 1], "page": [0, 3], "supplement": 0, "decis": 0, "incorpor": 0, "made": 0, "framework": 1, "algorithm": 1, "orient": 1, "term": 1, "model": [1, 3], "goal": 1, "cheap": 1, "autom": 1, "evalu": 1, "deriv": 1, "approxim": 1, "techniqu": 1, "class": 1, "access": 1, "porepi": 1, "pp": 1, "accumul": 1, "nest": 1, "recurs": 1, "chain": 1, "subterm": 1, "preced": 1, "central": 1, "ad_arrai": 1, "basic": 1, "arithmet": 1, "tree": 1, "wrapper": 1, "diverg": 1, "enabl": 1, "symbol": 1, "explan": 1, "repres": [1, 3], "document": 1, "val": 1, "jac": 1, "copi": 1, "diagvec_mul_jac": 1, "full_jac": 1, "jac_mul_diagvec": 1, "interfac": [1, 3], "mortar_grid": 1, "mortargrid": 1, "parent": 1, "meant": 1, "initi": 1, "rather": 1, "subclass": 1, "still": 1, "combin": [1, 3], "child": 1, "overload": 1, "Will": 1, "empti": 1, "associ": 1, "convert": 1, "perform": 1, "dof_manag": 1, "dofmanag": 1, "state": 1, "residu": 1, "jacobian": 1, "problem": [1, 3], "sub": 1, "form": 1, "pull": [1, 3], "previou": 1, "iter": 1, "exist": 1, "time": 1, "invert": 1, "squar": 1, "is_leaf": 1, "leaf": 1, "impli": 1, "expect": [1, 3], "children": 1, "translat": 1, "atom": 1, "overrid": 1, "previous_timestep": 1, "timestep": 1, "shallow": 1, "thu": 1, "ident": 1, "origin": 1, "except": [1, 3], "set_nam": 1, "reset": 1, "instanti": [0, 1], "assign": 1, "viz": 1, "draw": 1, "visual": 1, "root": 1, "mortar": 1, "modul": [1, 3], "wrap": 1, "part": [1, 3], "compound": 1, "f": 1, "partial": 1, "functool": 1, "adfunct": 1, "other_paramet": 1, "being": 1, "regularizedheavisid": 1, "callabl": 1, "ab": 1, "arcco": 1, "arccosh": 1, "arcsin": 1, "arcsinh": 1, "arctan": 1, "arctanh": 1, "characteristic_funct": 1, "tol": 1, "float": 1, "within": 1, "absolut": 1, "toler": 1, "zero": 1, "level": 1, "how": [1, 3], "comparison": 1, "isclos": 1, "appropri": 1, "co": 1, "cosh": 1, "exp": 1, "heavisid": 1, "zerovalu": 1, "5": 1, "heaviside_smooth": 1, "ep": 1, "001": [], "smooth": 1, "analyt": 1, "h_ep": 1, "pi": 1, "smoothli": 1, "dirac": 1, "delta": 1, "d": 1, "h": 1, "dx": 1, "delta_ep": 1, "http": 1, "ieeexplor": 1, "ieee": 1, "org": 1, "902291": 1, "converg": 1, "1e": 1, "applic": 1, "l2_norm": 1, "dim": 1, "l2": 1, "norm": 1, "compon": 1, "assum": 1, "u0": 1, "v0": 1, "w0": 1, "u1": 1, "v1": 1, "w1": 1, "un": 1, "vn": 1, "wn": 1, "satisfi": 1, "ui": 1, "vi": 1, "wi": 1, "entri": 1, "jacobi": 1, "log": 1, "maximum": 1, "var0": 1, "var1": 1, "sign": 1, "sin": 1, "sinh": 1, "tan": 1, "tanh": 1, "around": 1, "real": 1, "mai": 1, "immut": 1, "deep": 1, "reflect": [1, 3], "contrast": 1, "timedependentarrai": 1, "fals": 1, "ti": 1, "distribut": 1, "among": 1, "dictionari": 1, "store": 1, "_name": 1, "current": 1, "dt": 1, "intend": 1, "vari": 1, "quantiti": 1, "futur": [1, 3], "boundari": 1, "condit": 1, "pend": 1, "updat": 1, "item": 1, "flag": 1, "either": 1, "pick": 1, "prev_tim": 1, "mat": 1, "dens": 1, "transpos": 1, "ndof": 1, "previous_iter": 1, "mergedvari": 1, "convers": 1, "therefor": 1, "dof": 1, "kei": 1, "face": 1, "node": 1, "relev": 1, "prev_it": 1, "size": 1, "uniqu": 1, "identifi": 1, "collect": 1, "live": 1, "treat": 1, "jointli": 1, "suffici": 1, "total": 1, "sum": 1, "sub_var": 1, "abstractfunct": 1, "func": 1, "array_compat": 1, "ad_compat": 1, "abstract": 1, "obtain": 1, "mean": [0, 1], "interpol": 1, "fd": 1, "One": 1, "compat": 1, "now": 1, "itself": 1, "alwai": 1, "output": 1, "wise": 1, "bypass": 1, "correctli": 1, "__call__": 1, "fulfil": 1, "notion": 1, "get_jacobian": 1, "get_valu": 1, "md": 1, "abstractjacobianfunct": 1, "direct": 1, "formal": 1, "constantfunct": 1, "ergo": 1, "impos": [0, 1], "scipi": [0, 1], "henc": 1, "trivial": 1, "diagonaljacobianfunct": 1, "multipli": 1, "match": 1, "interpolatedfunct": 1, "min_val": 1, "max_val": 1, "npt": 1, "preval": 1, "chosen": 1, "cartesian": 1, "imag": 1, "multidimension": 1, "lower": 1, "bound": 1, "linear": [1, 3], "influenc": 1, "runtim": 1, "admethod": 1, "ad_function_typ": 1, "operator_funct": [], "operator_kwarg": 1, "decor": 1, "idealga": 1, "ad_oper": 1, "operators_arg": 1, "densiti": 1, "dummy_rel_perm": 1, "With": 1, "pressur": 1, "temperatur": 1, "analog": 1, "satur": 1, "explicit": 1, "implicitli": 1, "factori": 1, "belong": 1, "unbound": 1, "anoth": 1, "immedi": 1, "dereferenc": 1, "save": 1, "potenti": 1, "memori": 1, "leak": 1, "__get__": 1, "binding_inst": 1, "binding_typ": 1, "descriptor": 1, "protocol": 1, "syntact": 1, "contrari": 1, "whose": 1, "been": 1, "owner": 1, "ad_wrapp": 1, "actual": 1, "todo": 1, "automat": [2, 3], "differenti": [2, 3], "research": 3, "mainli": 3, "depart": 3, "mathemat": 3, "univers": 3, "bergen": 3, "simul": 3, "multiphys": 3, "process": 3, "fractur": 3, "porou": 3, "media": 3, "typic": 3, "technologi": 3, "discret": 3, "coupl": 3, "scheme": 3, "studi": 3, "tool": 3, "product": 3, "two": 3, "main": 3, "topic": 3, "design": 3, "softwar": 3, "strength": 3, "represent": 3, "variabl": 3, "network": 3, "semi": 3, "mesh": 3, "conform": 3, "flow": 3, "deform": 3, "transport": 3, "friction": 3, "flexibl": 3, "constitut": 3, "relat": 3, "simpl": 3, "function": 3, "propag": 3, "newli": 3, "ad": 3, "care": 3, "comput": 3, "geometri": 3, "under": 3, "activ": 3, "improv": 3, "No": 3, "nativ": 3, "solver": 3, "few": 3, "setup": 3, "avail": 3, "mostli": 3, "respons": 3, "hierarchi": 3, "mechan": 3, "poromechan": 3, "thermo": 3, "box": 3, "solv": 3, "rel": 3, "straightforwardli": 3, "complex": 3, "dive": 3, "partli": 3, "lack": 3, "resourc": 3, "side": 3, "difficult": 3, "robust": 3, "divid": 3, "numer": 3, "themselv": 3, "To": 3, "attempt": 3, "request": 3, "docstr": 3, "index": 3, "search": 3, "_base": 0, "_supportsarrai": [], "dtype": [], "_nestedsequ": [], "byte": [], "typevar": [], "scalartyp": [], "covari": [], "_supportsdtyp": [], "supportsindex": [], "sequenc": [], "_dtypedict": [], "ref": [], "bullet": 0, "header": 0, "_": [], "example_var_1": 0, "example_var_2": 0, "example_var_3": 0, "example_function_1": 0, "example_function_2": 0, "example_function_3": 0, "example_function_4": 0, "example_function_5": 0, "ed": 0, "inspir": 0, "www": [], "en": [], "master": [], "example_googl": [], "mind": 0, "deal": 0, "webpag": 0, "remark": []}, "objects": {"": [[0, 0, 0, "-", "example_docstrings"]], "example_docstrings": [[0, 1, 1, "", "ExampleArrayLike"], [0, 2, 1, "", "ExampleClass"], [0, 6, 1, "", "example_function_1"], [0, 6, 1, "", "example_function_2"], [0, 6, 1, "", "example_function_3"], [0, 6, 1, "", "example_function_4"], [0, 6, 1, "", "example_function_5"], [0, 6, 1, "", "example_generator"], [0, 1, 1, "", "example_var_1"], [0, 1, 1, "", "example_var_2"], [0, 1, 1, "", "example_var_3"]], "example_docstrings.ExampleClass": [[0, 3, 1, "", "attribute_1"], [0, 3, 1, "", "attribute_2"], [0, 3, 1, "", "attribute_3"], [0, 3, 1, "", "class_attribute_1"], [0, 3, 1, "", "class_attribute_2"], [0, 4, 1, "", "example_class_method"], [0, 4, 1, "", "example_method"], [0, 4, 1, "", "example_static_method"], [0, 5, 1, "", "readonly_property"], [0, 5, 1, "", "readwrite_property"]], "porepy.numerics.ad": [[1, 0, 0, "-", "functions"]], "porepy.numerics.ad.functions": [[1, 2, 1, "", "RegularizedHeaviside"], [1, 6, 1, "", "abs"], [1, 6, 1, "", "arccos"], [1, 6, 1, "", "arccosh"], [1, 6, 1, "", "arcsin"], [1, 6, 1, "", "arcsinh"], [1, 6, 1, "", "arctan"], [1, 6, 1, "", "arctanh"], [1, 6, 1, "", "characteristic_function"], [1, 6, 1, "", "cos"], [1, 6, 1, "", "cosh"], [1, 6, 1, "", "exp"], [1, 6, 1, "", "heaviside"], [1, 6, 1, "", "heaviside_smooth"], [1, 6, 1, "", "l2_norm"], [1, 6, 1, "", "log"], [1, 6, 1, "", "maximum"], [1, 6, 1, "", "sign"], [1, 6, 1, "", "sin"], [1, 6, 1, "", "sinh"], [1, 6, 1, "", "tan"], [1, 6, 1, "", "tanh"]], "porepy.numerics.ad.operator_functions": [[1, 2, 1, "", "ADmethod"], [1, 2, 1, "", "AbstractFunction"], [1, 2, 1, "", "AbstractJacobianFunction"], [1, 2, 1, "", "ConstantFunction"], [1, 2, 1, "", "DiagonalJacobianFunction"], [1, 2, 1, "", "Function"], [1, 2, 1, "", "InterpolatedFunction"]], "porepy.numerics.ad.operator_functions.ADmethod": [[1, 4, 1, "", "__call__"], [1, 4, 1, "", "__get__"], [1, 4, 1, "", "ad_wrapper"]], "porepy.numerics.ad.operator_functions.AbstractFunction": [[1, 4, 1, "", "__call__"], [1, 4, 1, "", "get_jacobian"], [1, 4, 1, "", "get_values"], [1, 4, 1, "", "parse"]], "porepy.numerics.ad.operator_functions.AbstractJacobianFunction": [[1, 4, 1, "", "get_values"]], "porepy.numerics.ad.operator_functions.ConstantFunction": [[1, 4, 1, "", "get_jacobian"], [1, 4, 1, "", "get_values"]], "porepy.numerics.ad.operator_functions.DiagonalJacobianFunction": [[1, 4, 1, "", "get_jacobian"]], "porepy.numerics.ad.operators": [[1, 2, 1, "", "Ad_array"], [1, 2, 1, "", "Array"], [1, 2, 1, "", "Matrix"], [1, 2, 1, "", "MergedVariable"], [1, 2, 1, "", "Operator"], [1, 2, 1, "", "Scalar"], [1, 2, 1, "", "TimeDependentArray"], [1, 2, 1, "", "Variable"]], "porepy.numerics.ad.operators.Ad_array": [[1, 4, 1, "", "copy"], [1, 4, 1, "", "diagvec_mul_jac"], [1, 4, 1, "", "full_jac"], [1, 4, 1, "", "jac_mul_diagvec"]], "porepy.numerics.ad.operators.Array": [[1, 3, 1, "", "interfaces"], [1, 4, 1, "", "parse"], [1, 3, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Matrix": [[1, 3, 1, "", "interfaces"], [1, 4, 1, "", "parse"], [1, 3, 1, "", "shape"], [1, 3, 1, "", "subdomains"], [1, 4, 1, "", "transpose"]], "porepy.numerics.ad.operators.MergedVariable": [[1, 4, 1, "", "copy"], [1, 3, 1, "", "interfaces"], [1, 3, 1, "", "prev_iter"], [1, 3, 1, "", "prev_time"], [1, 4, 1, "", "previous_iteration"], [1, 4, 1, "", "previous_timestep"], [1, 4, 1, "", "size"], [1, 3, 1, "", "sub_vars"], [1, 3, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Operator": [[1, 4, 1, "", "discretize"], [1, 4, 1, "", "evaluate"], [1, 3, 1, "", "interfaces"], [1, 4, 1, "", "is_leaf"], [1, 4, 1, "", "parse"], [1, 4, 1, "", "previous_timestep"], [1, 4, 1, "", "set_name"], [1, 3, 1, "", "subdomains"], [1, 4, 1, "", "viz"]], "porepy.numerics.ad.operators.Scalar": [[1, 3, 1, "", "interfaces"], [1, 4, 1, "", "parse"], [1, 3, 1, "", "subdomains"]], "porepy.numerics.ad.operators.TimeDependentArray": [[1, 3, 1, "", "interfaces"], [1, 4, 1, "", "parse"], [1, 3, 1, "", "prev_time"], [1, 4, 1, "", "previous_timestep"], [1, 3, 1, "", "subdomains"]], "porepy.numerics.ad.operators.Variable": [[1, 3, 1, "", "id"], [1, 3, 1, "", "interfaces"], [1, 3, 1, "", "prev_iter"], [1, 3, 1, "", "prev_time"], [1, 4, 1, "", "previous_iteration"], [1, 4, 1, "", "previous_timestep"], [1, 4, 1, "", "size"], [1, 3, 1, "", "subdomains"]]}, "objtypes": {"0": "py:module", "1": "py:data", "2": "py:class", "3": "py:attribute", "4": "py:method", "5": "py:property", "6": "py:function"}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "data", "Python data"], "2": ["py", "class", "Python class"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "method", "Python method"], "5": ["py", "property", "Python property"], "6": ["py", "function", "Python function"]}, "titleterms": {"how": 0, "To": 0, "docstr": 0, "basic": 0, "direct": 0, "todo": 0, "porepi": [0, 3], "style": 0, "document": [0, 3], "variabl": [0, 1], "function": [0, 1], "class": 0, "modul": 0, "level": 0, "automat": 1, "differenti": 1, "element": 1, "ad": 1, "data": 1, "structur": 1, "common": 1, "mathemat": 1, "represent": 1, "constant": 1, "scalar": 1, "vector": 1, "matric": 1, "singl": 1, "mix": 1, "dimension": 1, "domain": 1, "oper": 1, "grid": 1, "numer": [1, 2], "discret": 1, "scheme": 1, "equat": 1, "manag": 1, "submodul": 2, "welcom": [], "what": 3, "i": 3, "good": 3, "so": 3, "The": 3, "packag": 3, "For": 3, "develop": 3, "indic": 3, "tabl": 3, "exampl": [0, 1], "refer": 0}, "envversion": {"sphinx.domains.c": 2, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 8, "sphinx.domains.index": 1, "sphinx.domains.javascript": 2, "sphinx.domains.math": 2, "sphinx.domains.python": 3, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2, "sphinx.ext.viewcode": 1, "sphinx": 57}, "alltitles": {"How-To docstring": [[0, "module-example_docstrings"]], "Docstring-Basics": [[0, "docstring-basics"]], "Directives": [[0, "directives"]], "Todo": [[0, "id1"]], "PorePy style": [[0, "porepy-style"]], "Documenting variables": [[0, "documenting-variables"]], "Documenting functions": [[0, "documenting-functions"]], "Example": [[0, null], [0, null]], "Documenting classes": [[0, "documenting-classes"]], "References": [[0, null]], "Module-level documentation": [[0, "module-level-documentation"]], "Automatic Differentiation": [[1, "automatic-differentiation"]], "Elemental AD data structures": [[1, "elemental-ad-data-structures"]], "Common mathematical functions": [[1, "module-porepy.numerics.ad.functions"]], "Examples": [[1, null], [1, null]], "AD-representation of constant scalars, vectors and matrices": [[1, "ad-representation-of-constant-scalars-vectors-and-matrices"]], "Variables on single and mixed-dimensional domains": [[1, "variables-on-single-and-mixed-dimensional-domains"]], "Operator functions": [[1, "operator-functions"]], "Grid operators": [[1, "grid-operators"]], "Numerical discretization schemes": [[1, "numerical-discretization-schemes"]], "AD Equation Manager": [[1, "ad-equation-manager"]], "Numerics": [[2, "numerics"]], "Submodules": [[2, null]], "PorePy Documentation": [[3, "porepy-documentation"]], "What is PorePy good at?": [[3, "what-is-porepy-good-at"]], "What is PorePy not so good at?": [[3, "what-is-porepy-not-so-good-at"]], "The PorePy package": [[3, "the-porepy-package"]], "For developers": [[3, "for-developers"]], "Indices and tables": [[3, "indices-and-tables"]]}, "indexentries": {"examplearraylike (in module example_docstrings)": [[0, "example_docstrings.ExampleArrayLike"]], "exampleclass (class in example_docstrings)": [[0, "example_docstrings.ExampleClass"]], "attribute_1 (exampleclass attribute)": [[0, "example_docstrings.ExampleClass.attribute_1"]], "attribute_2 (exampleclass attribute)": [[0, "example_docstrings.ExampleClass.attribute_2"]], "attribute_3 (exampleclass attribute)": [[0, "example_docstrings.ExampleClass.attribute_3"]], "class_attribute_1 (exampleclass attribute)": [[0, "example_docstrings.ExampleClass.class_attribute_1"]], "class_attribute_2 (exampleclass attribute)": [[0, "example_docstrings.ExampleClass.class_attribute_2"]], "example_class_method() (exampleclass class method)": [[0, "example_docstrings.ExampleClass.example_class_method"]], "example_docstrings": [[0, "module-example_docstrings"]], "example_function_1() (in module example_docstrings)": [[0, "example_docstrings.example_function_1"]], "example_function_2() (in module example_docstrings)": [[0, "example_docstrings.example_function_2"]], "example_function_3() (in module example_docstrings)": [[0, "example_docstrings.example_function_3"]], "example_function_4() (in module example_docstrings)": [[0, "example_docstrings.example_function_4"]], "example_function_5() (in module example_docstrings)": [[0, "example_docstrings.example_function_5"]], "example_generator() (in module example_docstrings)": [[0, "example_docstrings.example_generator"]], "example_method() (exampleclass method)": [[0, "example_docstrings.ExampleClass.example_method"]], "example_static_method() (exampleclass static method)": [[0, "example_docstrings.ExampleClass.example_static_method"]], "example_var_1 (in module example_docstrings)": [[0, "example_docstrings.example_var_1"]], "example_var_2 (in module example_docstrings)": [[0, "example_docstrings.example_var_2"]], "example_var_3 (in module example_docstrings)": [[0, "example_docstrings.example_var_3"]], "module": [[0, "module-example_docstrings"], [1, "module-porepy.numerics.ad.functions"]], "readonly_property (exampleclass property)": [[0, "example_docstrings.ExampleClass.readonly_property"]], "readwrite_property (exampleclass property)": [[0, "example_docstrings.ExampleClass.readwrite_property"]], "admethod (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.ADmethod"]], "abstractfunction (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.AbstractFunction"]], "abstractjacobianfunction (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.AbstractJacobianFunction"]], "ad_array (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Ad_array"]], "array (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Array"]], "constantfunction (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.ConstantFunction"]], "diagonaljacobianfunction (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.DiagonalJacobianFunction"]], "function (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.Function"]], "interpolatedfunction (class in porepy.numerics.ad.operator_functions)": [[1, "porepy.numerics.ad.operator_functions.InterpolatedFunction"]], "matrix (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Matrix"]], "mergedvariable (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.MergedVariable"]], "operator (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Operator"]], "regularizedheaviside (class in porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.RegularizedHeaviside"]], "scalar (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Scalar"]], "timedependentarray (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.TimeDependentArray"]], "variable (class in porepy.numerics.ad.operators)": [[1, "porepy.numerics.ad.operators.Variable"]], "__call__() (admethod method)": [[1, "porepy.numerics.ad.operator_functions.ADmethod.__call__"]], "__call__() (abstractfunction method)": [[1, "porepy.numerics.ad.operator_functions.AbstractFunction.__call__"]], "__get__() (admethod method)": [[1, "porepy.numerics.ad.operator_functions.ADmethod.__get__"]], "abs() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.abs"]], "ad_wrapper() (admethod method)": [[1, "porepy.numerics.ad.operator_functions.ADmethod.ad_wrapper"]], "arccos() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arccos"]], "arccosh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arccosh"]], "arcsin() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arcsin"]], "arcsinh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arcsinh"]], "arctan() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arctan"]], "arctanh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.arctanh"]], "characteristic_function() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.characteristic_function"]], "copy() (ad_array method)": [[1, "porepy.numerics.ad.operators.Ad_array.copy"]], "copy() (mergedvariable method)": [[1, "porepy.numerics.ad.operators.MergedVariable.copy"]], "cos() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.cos"]], "cosh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.cosh"]], "diagvec_mul_jac() (ad_array method)": [[1, "porepy.numerics.ad.operators.Ad_array.diagvec_mul_jac"]], "discretize() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.discretize"]], "evaluate() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.evaluate"]], "exp() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.exp"]], "full_jac() (ad_array method)": [[1, "porepy.numerics.ad.operators.Ad_array.full_jac"]], "get_jacobian() (abstractfunction method)": [[1, "porepy.numerics.ad.operator_functions.AbstractFunction.get_jacobian"]], "get_jacobian() (constantfunction method)": [[1, "porepy.numerics.ad.operator_functions.ConstantFunction.get_jacobian"]], "get_jacobian() (diagonaljacobianfunction method)": [[1, "porepy.numerics.ad.operator_functions.DiagonalJacobianFunction.get_jacobian"]], "get_values() (abstractfunction method)": [[1, "porepy.numerics.ad.operator_functions.AbstractFunction.get_values"]], "get_values() (abstractjacobianfunction method)": [[1, "porepy.numerics.ad.operator_functions.AbstractJacobianFunction.get_values"]], "get_values() (constantfunction method)": [[1, "porepy.numerics.ad.operator_functions.ConstantFunction.get_values"]], "heaviside() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.heaviside"]], "heaviside_smooth() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.heaviside_smooth"]], "id (variable attribute)": [[1, "porepy.numerics.ad.operators.Variable.id"]], "interfaces (array attribute)": [[1, "porepy.numerics.ad.operators.Array.interfaces"]], "interfaces (matrix attribute)": [[1, "porepy.numerics.ad.operators.Matrix.interfaces"]], "interfaces (mergedvariable attribute)": [[1, "porepy.numerics.ad.operators.MergedVariable.interfaces"]], "interfaces (operator attribute)": [[1, "porepy.numerics.ad.operators.Operator.interfaces"]], "interfaces (scalar attribute)": [[1, "porepy.numerics.ad.operators.Scalar.interfaces"]], "interfaces (timedependentarray attribute)": [[1, "porepy.numerics.ad.operators.TimeDependentArray.interfaces"]], "interfaces (variable attribute)": [[1, "porepy.numerics.ad.operators.Variable.interfaces"]], "is_leaf() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.is_leaf"]], "jac_mul_diagvec() (ad_array method)": [[1, "porepy.numerics.ad.operators.Ad_array.jac_mul_diagvec"]], "l2_norm() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.l2_norm"]], "log() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.log"]], "maximum() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.maximum"]], "parse() (abstractfunction method)": [[1, "porepy.numerics.ad.operator_functions.AbstractFunction.parse"]], "parse() (array method)": [[1, "porepy.numerics.ad.operators.Array.parse"]], "parse() (matrix method)": [[1, "porepy.numerics.ad.operators.Matrix.parse"]], "parse() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.parse"]], "parse() (scalar method)": [[1, "porepy.numerics.ad.operators.Scalar.parse"]], "parse() (timedependentarray method)": [[1, "porepy.numerics.ad.operators.TimeDependentArray.parse"]], "porepy.numerics.ad.functions": [[1, "module-porepy.numerics.ad.functions"]], "prev_iter (mergedvariable attribute)": [[1, "porepy.numerics.ad.operators.MergedVariable.prev_iter"]], "prev_iter (variable attribute)": [[1, "porepy.numerics.ad.operators.Variable.prev_iter"]], "prev_time (mergedvariable attribute)": [[1, "porepy.numerics.ad.operators.MergedVariable.prev_time"]], "prev_time (timedependentarray attribute)": [[1, "porepy.numerics.ad.operators.TimeDependentArray.prev_time"]], "prev_time (variable attribute)": [[1, "porepy.numerics.ad.operators.Variable.prev_time"]], "previous_iteration() (mergedvariable method)": [[1, "porepy.numerics.ad.operators.MergedVariable.previous_iteration"]], "previous_iteration() (variable method)": [[1, "porepy.numerics.ad.operators.Variable.previous_iteration"]], "previous_timestep() (mergedvariable method)": [[1, "porepy.numerics.ad.operators.MergedVariable.previous_timestep"]], "previous_timestep() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.previous_timestep"]], "previous_timestep() (timedependentarray method)": [[1, "porepy.numerics.ad.operators.TimeDependentArray.previous_timestep"]], "previous_timestep() (variable method)": [[1, "porepy.numerics.ad.operators.Variable.previous_timestep"]], "set_name() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.set_name"]], "shape (matrix attribute)": [[1, "porepy.numerics.ad.operators.Matrix.shape"]], "sign() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.sign"]], "sin() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.sin"]], "sinh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.sinh"]], "size() (mergedvariable method)": [[1, "porepy.numerics.ad.operators.MergedVariable.size"]], "size() (variable method)": [[1, "porepy.numerics.ad.operators.Variable.size"]], "sub_vars (mergedvariable attribute)": [[1, "porepy.numerics.ad.operators.MergedVariable.sub_vars"]], "subdomains (array attribute)": [[1, "porepy.numerics.ad.operators.Array.subdomains"]], "subdomains (matrix attribute)": [[1, "porepy.numerics.ad.operators.Matrix.subdomains"]], "subdomains (mergedvariable attribute)": [[1, "porepy.numerics.ad.operators.MergedVariable.subdomains"]], "subdomains (operator attribute)": [[1, "porepy.numerics.ad.operators.Operator.subdomains"]], "subdomains (scalar attribute)": [[1, "porepy.numerics.ad.operators.Scalar.subdomains"]], "subdomains (timedependentarray attribute)": [[1, "porepy.numerics.ad.operators.TimeDependentArray.subdomains"]], "subdomains (variable attribute)": [[1, "porepy.numerics.ad.operators.Variable.subdomains"]], "tan() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.tan"]], "tanh() (in module porepy.numerics.ad.functions)": [[1, "porepy.numerics.ad.functions.tanh"]], "transpose() (matrix method)": [[1, "porepy.numerics.ad.operators.Matrix.transpose"]], "viz() (operator method)": [[1, "porepy.numerics.ad.operators.Operator.viz"]]}}) \ No newline at end of file diff --git a/docs/index.rst b/docs/index.rst index 1e9ef010d7..8391065a1c 100644 --- a/docs/index.rst +++ b/docs/index.rst @@ -1,5 +1,6 @@ -Welcome to PorePy! -================== +==================== +PorePy Documentation +==================== PorePy is a research code that is mainly developed at the Department of Mathematics at the University of Bergen. The code is aimed at simulation of multiphysics processes in fractured porous media.