diff --git a/.buildinfo b/.buildinfo new file mode 100644 index 00000000..6ab4ab5b --- /dev/null +++ b/.buildinfo @@ -0,0 +1,4 @@ +# Sphinx build info version 1 +# This file hashes the configuration used when building these files. When it is not found, a full rebuild will be done. +config: 19b0f2988220fad24f697c800d967535 +tags: 645f666f9bcd5a90fca523b33c5a78b7 diff --git a/.cruft.json b/.cruft.json deleted file mode 100644 index 9ff358a7..00000000 --- a/.cruft.json +++ /dev/null @@ -1,46 +0,0 @@ -{ - "template": "https://codebase.helmholtz.cloud/psyplot/psyplot-plugin-template.git", - "commit": "63fa8a2b3c1bab8e173cb91b9fca045639a243dd", - "checkout": null, - "context": { - "cookiecutter": { - "project_authors": "Philipp S. Sommer", - "project_author_emails": "philipp.sommer@hereon.de", - "project_maintainers": "Philipp S. Sommer", - "project_maintainer_emails": "philipp.sommer@hereon.de", - "gitlab_host": "codebase.helmholtz.cloud", - "gitlab_username": "psyplot", - "git_remote_protocoll": "ssh", - "institution": "Helmholtz-Zentrum Hereon", - "institution_url": "https://www.hereon.de", - "copyright_holder": "Helmholtz-Zentrum hereon GmbH", - "copyright_year": "2021-2024", - "use_reuse": "yes", - "code_license": "LGPL-3.0-only", - "documentation_license": "CC-BY-4.0", - "supplementary_files_license": "CC0-1.0", - "project_title": "psy-simple", - "project_slug": "psy-simple", - "package_folder": "psy_simple", - "project_short_description": "Psyplot plugin for simple visualization tasks", - "keywords": "visualization,psyplot,netcdf,matplotlib", - "documentation_url": "https://psyplot.github.io/psy-simple", - "use_markdown_for_documentation": "no", - "ci_build_stage": "no", - "ci_matrix": "pipenv", - "use_pytest_xdist": "yes", - "requires_gui": "yes", - "deploy_package_in_ci": "yes", - "deploy_pages_in_ci": "git-push", - "_extensions": [ - "local_extensions.UnderlinedExtension" - ], - "_template": "https://codebase.helmholtz.cloud/psyplot/psyplot-plugin-template.git" - } - }, - "directory": null, - "skip": [ - ".git", - ".mypy_cache" - ] -} diff --git a/.cruft.json.license b/.cruft.json.license deleted file mode 100644 index 919c9c1e..00000000 --- a/.cruft.json.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/.flake8 b/.flake8 deleted file mode 100644 index 18607fff..00000000 --- a/.flake8 +++ /dev/null @@ -1,10 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[flake8] -extend-ignore = - E203 - E402 - E501 - W503 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 90360c89..00000000 --- a/.gitattributes +++ /dev/null @@ -1,5 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -psy_simple/_version.py export-subst diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 652fbd9c..00000000 --- a/.gitignore +++ /dev/null @@ -1,156 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -# Byte-compiled / optimized / DLL files -__pycache__/ -*.py[cod] -*$py.class - -# C extensions -*.so - -# Distribution / packaging -.Python -build/ -develop-eggs/ -dist/ -downloads/ -eggs/ -.eggs/ -lib/ -lib64/ -parts/ -sdist/ -var/ -wheels/ -share/python-wheels/ -*.egg-info/ -.installed.cfg -*.egg -MANIFEST - -# PyInstaller -# Usually these files are written by a python script from a template -# before PyInstaller builds the exe, so as to inject date/other infos into it. -*.manifest -*.spec - -# Installer logs -pip-log.txt -pip-delete-this-directory.txt - -# Unit test / coverage reports -htmlcov/ -.tox/ -.nox/ -.coverage -.coverage.* -.cache -nosetests.xml -coverage.xml -*.cover -*.py,cover -.hypothesis/ -.pytest_cache/ -cover/ - -# Translations -*.mo -*.pot - -# Django stuff: -*.log -local_settings.py -db.sqlite3 -db.sqlite3-journal - -# Flask stuff: -instance/ -.webassets-cache - -# Scrapy stuff: -.scrapy - -# Sphinx documentation -docs/_build/ - -# PyBuilder -.pybuilder/ -target/ - -# Jupyter Notebook -.ipynb_checkpoints - -# IPython -profile_default/ -ipython_config.py - -# pyenv -# For a library or package, you might want to ignore these files since the code is -# intended to run in multiple environments; otherwise, check them in: -# .python-version - -# pipenv -# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. -# However, in case of collaboration, if having platform-specific dependencies or dependencies -# having no cross-platform support, pipenv may install dependencies that don't work, or not -# install all needed dependencies. -#Pipfile.lock - -# PEP 582; used by e.g. github.com/David-OConnor/pyflow -__pypackages__/ - -# Celery stuff -celerybeat-schedule -celerybeat.pid - -# SageMath parsed files -*.sage.py - -# Environments -.env -.venv -env/ -venv/ -ENV/ -env.bak/ -venv.bak/ - -# Spyder project settings -.spyderproject -.spyproject - -# Rope project settings -.ropeproject - -# mkdocs documentation -/site - -# mypy -.mypy_cache/ -.dmypy.json -dmypy.json - -# Pyre type checker -.pyre/ - -# pytype static type analyzer -.pytype/ - -# Cython debug symbols -cython_debug/ - -static/ - -docs/api -psy_simple/migrations/00*.py -docs/_static/orcid.* - -# ignore Pipfile.lock files in ci -# if a lock-file needs to be added, add it with `git add -f` -ci/matrix/*/Pipfile.lock - -# test artifacts -tests/reference_figures/ -tests/test_figures/ \ No newline at end of file diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml deleted file mode 100644 index 6becb554..00000000 --- a/.gitlab-ci.yml +++ /dev/null @@ -1,135 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -image: python:3.9 - -variables: - PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip" - -cache: - paths: - - .cache/pip - -before_script: - # replace git internal paths in order to use the CI_JOB_TOKEN - - apt-get update -y && apt-get install -y pandoc graphviz - - python -m pip install -U pip - -test-package: - stage: test - script: - - pip install build twine - - make dist - - twine check dist/* - artifacts: - name: python-artifacts - paths: - - "dist/*" - expire_in: 7 days - -test: - stage: test - image: "${IMAGE}" - variables: - PIPENV_PIPFILE: "ci/matrix/${SCENARIO}/Pipfile" - # disable sandboxing, otherwise chrome reports errors when the - # container runs as root - # https://doc.qt.io/qt-5/qtwebengine-platform-notes.html#sandboxing-support - QTWEBENGINE_DISABLE_SANDBOX: "true" - tags: - - performance - script: - # install necessary libraries for pyqt - - apt-get install -y xvfb python3-pyqt5.qtwebengine - - pip install pipenv - - pipenv install - - NPROCS=auto xvfb-run make pipenv-test - parallel: - matrix: - - SCENARIO: default - IMAGE: python:3.9 - # python scenarios - - SCENARIO: mpl_38_py39 - IMAGE: python:3.9 - - SCENARIO: mpl_38_py310 - IMAGE: python:3.10 - - SCENARIO: mpl_38_py311 - IMAGE: python:3.11 - - SCENARIO: mpl_38_py312 - IMAGE: python:3.12 - # matplotlib scenarios - - SCENARIO: mpl_35_py39 - IMAGE: python:3.9 - - SCENARIO: mpl_36_py310 - IMAGE: python:3.10 - - SCENARIO: mpl_37_py311 - IMAGE: python:3.11 - - SCENARIO: mpl_39_py312 - IMAGE: python:3.12 - artifacts: - name: pipfile - paths: - - "ci/matrix/${SCENARIO}/*" - - "tests/reference_figures/*.png" - - "tests/test_figures/*.png" - expire_in: 30 days - coverage: '/(?i)total.*? (100(?:\.0+)?\%|[1-9]?\d(?:\.\d+)?\%)$/' - -test-docs: - stage: test - script: - # install necessary libraries for pyqt - - apt-get install -y python3-pyqt5.qtwebengine - - make dev-install - # install PyQt5 (not part of requirements.txt because this is complicated - # to install on different platforms) - - pip install PyQt5 PyQtWebEngine - - make -C docs html - - make -C docs linkcheck - artifacts: - paths: - - docs/_build - - -deploy-package: - stage: deploy - needs: - - test-package - - test-docs - - test - only: - - master - script: - - pip install twine - - TWINE_PASSWORD=${CI_JOB_TOKEN} TWINE_USERNAME=gitlab-ci-token python -m twine upload --repository-url ${CI_API_V4_URL}/projects/${CI_PROJECT_ID}/packages/pypi dist/* - - - -deploy-docs: - stage: deploy - only: - - master - needs: - - test-docs - image: node:21 - before_script: - - npm install -g gh-pages@6.1.1 - - mkdir .gh-pages-cache - script: - # make sure, the DEPLOY_TOKEN is defined - - >- - [ ${CI_DEPLOY_TOKEN} ] || - echo "The CI_DEPLOY_TOKEN variable is not set. Please create an access - token with scope 'read_repository' and 'write_repository'" && - [ ${CI_DEPLOY_TOKEN} ] - - >- - CACHE_DIR=$(realpath .gh-pages-cache) - gh-pages - --dotfiles - --nojekyll - --branch gh-pages - --repo https://ci-user:${CI_DEPLOY_TOKEN}@${CI_SERVER_HOST}/${CI_PROJECT_PATH}.git - --user "${CI_COMMIT_AUTHOR}" - --message "CI Pipeline ${CI_PIPELINE_ID}, commit ${CI_COMMIT_SHORT_SHA}" - --dist docs/_build/html diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 00000000..e69de29b diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml deleted file mode 100644 index 3a6a9857..00000000 --- a/.pre-commit-config.yaml +++ /dev/null @@ -1,62 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -# https://pre-commit.com/ -repos: - - repo: https://github.com/pre-commit/pre-commit-hooks - rev: v4.4.0 - hooks: - - id: trailing-whitespace - - id: end-of-file-fixer - - id: check-yaml - # isort should run before black as black sometimes tweaks the isort output - - repo: https://github.com/PyCQA/isort - rev: 5.12.0 - hooks: - - id: isort - args: - - --profile - - black - - --line-length - - "79" - - --filter-files - - -skip-gitignore - - --float-to-top - # https://github.com/python/black#version-control-integration - - repo: https://github.com/psf/black - rev: 23.1.0 - hooks: - - id: black - args: - - --line-length - - "79" - - --exclude - - venv - # - repo: https://github.com/keewis/blackdoc - # rev: v0.3.8 - # hooks: - # - id: blackdoc - - repo: https://github.com/pycqa/flake8 - rev: 6.0.0 - hooks: - - id: flake8 -# - repo: https://github.com/pre-commit/mirrors-mypy -# rev: v1.0.1 -# hooks: -# - id: mypy -# additional_dependencies: -# - types-PyYAML -# args: -# - --ignore-missing-imports - - - repo: https://github.com/fsfe/reuse-tool - rev: v1.1.2 - hooks: - - id: reuse - - - repo: https://github.com/citation-file-format/cff-converter-python - # there is no release with this hook yet - rev: "44e8fc9" - hooks: - - id: validate-cff diff --git a/.reuse/add_license.py b/.reuse/add_license.py deleted file mode 100644 index 963cb601..00000000 --- a/.reuse/add_license.py +++ /dev/null @@ -1,118 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: LGPL-3.0-only - -"""Helper script to add licenses to files. - -This script can be used to apply the licenses and default copyright holders -to files in the repository. - -It uses the short cuts from the ``.reuse/shortcuts.yaml`` file and -adds them to the call of ``reuse annotate``. Any command line option however -overwrites the config in ``shortcuts.yaml`` - -Usage:: - - python .reuse/add_license.py [OPTIONS] -""" - -import os.path as osp -from argparse import ArgumentParser -from textwrap import dedent -from typing import Dict, Optional, TypedDict -from pathlib import Path - -import yaml -from reuse.project import Project - -try: - from reuse._annotate import add_arguments as _orig_add_arguments - from reuse._annotate import run -except ImportError: - # reuse < 3.0 - from reuse.header import add_arguments as _orig_add_arguments - from reuse.header import run - - -class LicenseShortCut(TypedDict): - """Shortcut to add a copyright statement""" - - #: The copyright statement - copyright: str - - #: year of copyright statement - year: str - - #: SPDX Identifier of the license - license: Optional[str] - - -def load_shortcuts() -> Dict[str, LicenseShortCut]: - """Load the ``shortcuts.yaml`` file.""" - - with open(osp.join(osp.dirname(__file__), "shortcuts.yaml")) as f: - return yaml.safe_load(f) - - -def add_arguments( - parser: ArgumentParser, shortcuts: Dict[str, LicenseShortCut] -): - parser.add_argument( - "shortcut", - choices=[key for key in shortcuts if not key.startswith(".")], - help=( - "What license should be applied? Shortcuts are loaded from " - ".reuse/shortcuts.yaml. Possible shortcuts are %(choices)s" - ), - ) - - _orig_add_arguments(parser) - - parser.set_defaults(func=run) - parser.set_defaults(parser=parser) - - -def main(argv=None): - shortcuts = load_shortcuts() - - parser = ArgumentParser( - prog=".reuse/add_license.py", - description=dedent( - """ - Add copyright and licensing into the header of files with shortcuts - - This script uses the ``reuse annotate`` command to add copyright - and licensing information into the header the specified files. - - It accepts the same arguments as ``reuse annotate``, plus an - additional required `shortcuts` argument. The given `shortcut` - comes from the file at ``.reuse/shortcuts.yaml`` to fill in - copyright, year and license identifier. - - For further information, please type ``reuse annotate --help``""" - ), - ) - add_arguments(parser, shortcuts) - - args = parser.parse_args(argv) - - shortcut = shortcuts[args.shortcut] - - if args.year is None: - args.year = [] - if args.copyright is None: - args.copyright = [] - - if args.license is None and shortcut.get("license"): - args.license = [shortcut["license"]] - elif args.license and shortcut.get("license"): - args.license.append(shortcut["license"]) - args.year.append(shortcut["year"]) - args.copyright.append(shortcut["copyright"]) - - project = Project(Path(__file__).parent.parent) - args.func(args, project) - - -if __name__ == "__main__": - main() diff --git a/.reuse/shortcuts.yaml b/.reuse/shortcuts.yaml deleted file mode 100644 index 43a4548a..00000000 --- a/.reuse/shortcuts.yaml +++ /dev/null @@ -1,23 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -.defaults: &defaults - year: "2021-2024" - copyright: "Helmholtz-Zentrum hereon GmbH" - -# The following dictionaries items map to dictionaries with three possible -# keys: -# -# copyright: The copyright statement -# year: year of copyright statement -# license: SPDX Identifier -docs: - <<: *defaults - license: "CC-BY-4.0" -code: - <<: *defaults - license: "LGPL-3.0-only" -supp: - <<: *defaults - license: "CC0-1.0" diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index 5010f375..00000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,13 +0,0 @@ -{ - "editor.formatOnSave": true, - "editor.defaultFormatter": "ms-python.python", - "gitlab.featureFlags": {"securityScansFlag": false}, - "python.formatting.provider": "black", - "python.formatting.blackArgs": [ - "--line-length", - "79" - ], - "python.linting.mypyCategorySeverity.note": "Hint", - "python.linting.mypyEnabled": true, - -} diff --git a/.vscode/settings.json.license b/.vscode/settings.json.license deleted file mode 100644 index 919c9c1e..00000000 --- a/.vscode/settings.json.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/CHANGELOG.rst b/CHANGELOG.rst deleted file mode 100644 index 75c8f4f0..00000000 --- a/CHANGELOG.rst +++ /dev/null @@ -1,158 +0,0 @@ -.. SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -.. -.. SPDX-License-Identifier: CC-BY-4.0 - -v1.5.1 -====== -regular update for matplotlib 3.9 - -Added ------ -- add tests for mpl 3.9, see `!43 `__ - -Known issues ------------- -- the colorbar tests as updating the colorbar is currently broken with matplotlib 3.9, see `#35 `__ - -v1.5.0 -====== -Compatibility fixes and code formatting - -Changed -------- -- migrate to psyplot-plugin-template, see `!36 `__ -- Update psyplot min version, see `!41 `__ - -Fixed ------ -- fixed compatiblity with latest matplotlib version, see `!38 `__ -- fix image comparison and add reference and test images as CI artifacts, see `!37 `__ - -v1.4.1 -====== -Compatibility fixes - -Changed -------- -- We now use the new ``convert_coordinate`` method that has been introduced - with psyplot v1.4.1 (see - `psyplot/psyplot#39 `__ and - `#30 `__) - -Fixed ------ -- psy-simple is now compatible with matplotlib 3.5 (see - `#31 `__) - -v1.4.0 -====== -Compatibility fixes and LGPL license - -As with psyplot 1.4.0, psy-simple is now continuously tested and deployed with -CircleCI. - -Fixed ------ -- Compatibility fixes for matplotlib>=3.3 - -Added ------ -- psyplot does now have a CITATION.cff file, see https://citation-file-format.github.io - -Changed -------- -- psy-simple is now officially licensed under LGPL-3.0-only, - see `#28 `__ -- We use CicleCI now for a standardized CI/CD pipeline to build and test - the code and docs all at one place, see `#27 `__ - - -v1.3.1 -====== -Patch for plotting the polygons with 3D bounds - -Changed -------- -* the values ``'tri'``, ``'tricontour'`` and ``'tricontourf'`` for the ``plot`` - formatoptions have been depreceated and should be replaced by ``'poly'``, - ``'contour'`` and ``'contourf'`` respectively, see - `#23 `__ - -Fixed ------ -* A bug was fixed with the ``extend`` formatoption if ``plot=None``, see - `#20 `__ -* variables with 3D bounds are now interpreted correctly, see - `#24 `__ - -v1.3.0 -====== -New background and mask formatoptions and more options for colorbar bounds - -Added ------ -* a new ``background`` formatoption has been implemented that allows to set the - facecolor of the axes (i.e. the background color for the plot) -* a new ``mask`` formatoption has been implemented that allows to mask the - data based on a mask that can either be in the dataset or in a separate - file (see `#15 `__) -* the ``bounds`` and other ``ticks`` (e.g. ``xticks, yticks, cticks``) - formatoptions have gained multiple new values (all backwards-compatible, see - `#13 `__): - - * they now support discrete logarithmic and symmetric bounds/ticks via - ``bounds='log'`` and ``bounds='symlog'``. - * The bounds and other tick formatoptions (`xticks, cticks, yticks, etc.`) now - support a dictionary as a value, e.g.:: - - plotter.update(bounds={'method': 'rounded', 'percmin': 5}) - * You can specify ``vmin`` and ``vmax`` for color bounds and ticks which - prevents their automatic estimation, e.g. via:: - - plotter.update(bounds={'method': 'rounded', 'vmin': 50, 'vmax': 75}) - # or - plotter.update(bounds=['rounded', None, None, None, 50, 75]) - -Changed -------- -* values in the statusbar are only shown, if the drawn artist contains the - cursor position, see `#18 `__ -* psy-simple now requires matplotlib greater or equal than 2.0 -* psy-simple has been moved from https://github.com/Chilipp/psy-simple to https://github.com/psyplot/psy-simple, - see `#7 `__ -* The color handling of the `color` formatoption has been changed to allow - appending of new data. The `colors` attribute can be extended by the - `color_cycle` using the `extended_colors` attribute (see - `#10 `__) - -Fixed ------ -* Fixed a bug to calculate color bounds for uniform data, - see `#9 `__ -* An issue has been fixed with the setting of colorbar ticks after updating - the colorbar bounds (see `#13 `__) - - -v1.2.0 -====== -Added ------ -* The ``plot2d`` plotmethod now also supports unstructured data of any shape - (see `issue#6 `__) -* Added a ``categorical`` formatoption to the ``barplot`` plot method to allow - a switch between categorical and non-categorical plots -* The lineplot method now also support ``'stacked'`` plots - -v1.1.0 -====== -Added ------ -* Changelog -* ``interp_bounds`` formatoption for the ``plot2d`` plot method (see the - `docs `__) -* Added the ``fldmean`` plot method that can be used to directly calculate and - plot the mean over the x- and y-dimensions - -Changed -------- -* The xlim and ylim formatoptions now consider inverted x- and y-axes diff --git a/CITATION.cff b/CITATION.cff deleted file mode 100644 index 81611b29..00000000 --- a/CITATION.cff +++ /dev/null @@ -1,56 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -# YAML 1.2 ---- -cff-version: "1.2.0" -message: "If you use this software, please cite both the article from preferred-citation and the software itself." -title: "psy-simple: A psyplot plugin for simple visualization tasks" -authors: - - family-names: Sommer - given-names: "Philipp S." - affiliation: "Helmholtz-Zentrum Hereon" - orcid: "https://orcid.org/0000-0001-6171-7716" - website: "https://www.philipp-s-sommer.de" - post-code: 21502 - city: Geesthacht - country: DE - email: philipp.sommer@hereon.de -doi: "10.5281/zenodo.845643" -contact: - - email: psyplot@hereon.de - name: "Psyplot developers at hereon" -license: "LGPL-3.0-only" -repository-code: https://github.com/psyplot/psyplot -type: software -keywords: - - psyplot - - python - - visualization - - xarray - - matplotlib - - netcdf4 - - climate models - - unstructured - - earth-sciences - - raster -preferred-citation: - title: "The psyplot interactive visualization framework" - authors: - - family-names: Sommer - given-names: "Philipp S." - affiliation: "Helmholtz-Zentrum Hereon" - orcid: "https://orcid.org/0000-0001-6171-7716" - year: 2017 - type: article - doi: "10.21105/joss.00363" - date-published: 2017-08-22 - journal: Journal of Open Source Software - volume: 2 - number: 16 - pages: 363 - publisher: - name: The Open Journal - license: CC-BY-4.0 -... diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index e7e9b883..00000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,11 +0,0 @@ - - -# Contributing to psy-simple - -:+1::tada: First off, thanks for taking the time to contribute! :tada::+1: - -For some guidelines, please see the [contribution guidelines for psyplot](https://github.com/psyplot/psyplot/blob/master/CONTRIBUTING.md). diff --git a/LICENSES/CC-BY-4.0.txt b/LICENSES/CC-BY-4.0.txt deleted file mode 100644 index 13ca539f..00000000 --- a/LICENSES/CC-BY-4.0.txt +++ /dev/null @@ -1,156 +0,0 @@ -Creative Commons Attribution 4.0 International - - Creative Commons Corporation (“Creative Commons”) is not a law firm and does not provide legal services or legal advice. Distribution of Creative Commons public licenses does not create a lawyer-client or other relationship. Creative Commons makes its licenses and related information available on an “as-is” basis. Creative Commons gives no warranties regarding its licenses, any material licensed under their terms and conditions, or any related information. Creative Commons disclaims all liability for damages resulting from their use to the fullest extent possible. - -Using Creative Commons Public Licenses - -Creative Commons public licenses provide a standard set of terms and conditions that creators and other rights holders may use to share original works of authorship and other material subject to copyright and certain other rights specified in the public license below. The following considerations are for informational purposes only, are not exhaustive, and do not form part of our licenses. - -Considerations for licensors: Our public licenses are intended for use by those authorized to give the public permission to use material in ways otherwise restricted by copyright and certain other rights. Our licenses are irrevocable. Licensors should read and understand the terms and conditions of the license they choose before applying it. Licensors should also secure all rights necessary before applying our licenses so that the public can reuse the material as expected. Licensors should clearly mark any material not subject to the license. This includes other CC-licensed material, or material used under an exception or limitation to copyright. More considerations for licensors. - -Considerations for the public: By using one of our public licenses, a licensor grants the public permission to use the licensed material under specified terms and conditions. If the licensor’s permission is not necessary for any reason–for example, because of any applicable exception or limitation to copyright–then that use is not regulated by the license. Our licenses grant only permissions under copyright and certain other rights that a licensor has authority to grant. Use of the licensed material may still be restricted for other reasons, including because others have copyright or other rights in the material. A licensor may make special requests, such as asking that all changes be marked or described. Although not required by our licenses, you are encouraged to respect those requests where reasonable. More considerations for the public. - -Creative Commons Attribution 4.0 International Public License - -By exercising the Licensed Rights (defined below), You accept and agree to be bound by the terms and conditions of this Creative Commons Attribution 4.0 International Public License ("Public License"). To the extent this Public License may be interpreted as a contract, You are granted the Licensed Rights in consideration of Your acceptance of these terms and conditions, and the Licensor grants You such rights in consideration of benefits the Licensor receives from making the Licensed Material available under these terms and conditions. - -Section 1 – Definitions. - - a. Adapted Material means material subject to Copyright and Similar Rights that is derived from or based upon the Licensed Material and in which the Licensed Material is translated, altered, arranged, transformed, or otherwise modified in a manner requiring permission under the Copyright and Similar Rights held by the Licensor. For purposes of this Public License, where the Licensed Material is a musical work, performance, or sound recording, Adapted Material is always produced where the Licensed Material is synched in timed relation with a moving image. - - b. Adapter's License means the license You apply to Your Copyright and Similar Rights in Your contributions to Adapted Material in accordance with the terms and conditions of this Public License. - - c. Copyright and Similar Rights means copyright and/or similar rights closely related to copyright including, without limitation, performance, broadcast, sound recording, and Sui Generis Database Rights, without regard to how the rights are labeled or categorized. For purposes of this Public License, the rights specified in Section 2(b)(1)-(2) are not Copyright and Similar Rights. - - d. Effective Technological Measures means those measures that, in the absence of proper authority, may not be circumvented under laws fulfilling obligations under Article 11 of the WIPO Copyright Treaty adopted on December 20, 1996, and/or similar international agreements. - - e. Exceptions and Limitations means fair use, fair dealing, and/or any other exception or limitation to Copyright and Similar Rights that applies to Your use of the Licensed Material. - - f. Licensed Material means the artistic or literary work, database, or other material to which the Licensor applied this Public License. - - g. Licensed Rights means the rights granted to You subject to the terms and conditions of this Public License, which are limited to all Copyright and Similar Rights that apply to Your use of the Licensed Material and that the Licensor has authority to license. - - h. Licensor means the individual(s) or entity(ies) granting rights under this Public License. - - i. Share means to provide material to the public by any means or process that requires permission under the Licensed Rights, such as reproduction, public display, public performance, distribution, dissemination, communication, or importation, and to make material available to the public including in ways that members of the public may access the material from a place and at a time individually chosen by them. - - j. Sui Generis Database Rights means rights other than copyright resulting from Directive 96/9/EC of the European Parliament and of the Council of 11 March 1996 on the legal protection of databases, as amended and/or succeeded, as well as other essentially equivalent rights anywhere in the world. - - k. You means the individual or entity exercising the Licensed Rights under this Public License. Your has a corresponding meaning. - -Section 2 – Scope. - - a. License grant. - - 1. Subject to the terms and conditions of this Public License, the Licensor hereby grants You a worldwide, royalty-free, non-sublicensable, non-exclusive, irrevocable license to exercise the Licensed Rights in the Licensed Material to: - - A. reproduce and Share the Licensed Material, in whole or in part; and - - B. produce, reproduce, and Share Adapted Material. - - 2. Exceptions and Limitations. For the avoidance of doubt, where Exceptions and Limitations apply to Your use, this Public License does not apply, and You do not need to comply with its terms and conditions. - - 3. Term. The term of this Public License is specified in Section 6(a). - - 4. Media and formats; technical modifications allowed. The Licensor authorizes You to exercise the Licensed Rights in all media and formats whether now known or hereafter created, and to make technical modifications necessary to do so. The Licensor waives and/or agrees not to assert any right or authority to forbid You from making technical modifications necessary to exercise the Licensed Rights, including technical modifications necessary to circumvent Effective Technological Measures. For purposes of this Public License, simply making modifications authorized by this Section 2(a)(4) never produces Adapted Material. - - 5. Downstream recipients. - - A. Offer from the Licensor – Licensed Material. Every recipient of the Licensed Material automatically receives an offer from the Licensor to exercise the Licensed Rights under the terms and conditions of this Public License. - - B. No downstream restrictions. You may not offer or impose any additional or different terms or conditions on, or apply any Effective Technological Measures to, the Licensed Material if doing so restricts exercise of the Licensed Rights by any recipient of the Licensed Material. - - 6. No endorsement. Nothing in this Public License constitutes or may be construed as permission to assert or imply that You are, or that Your use of the Licensed Material is, connected with, or sponsored, endorsed, or granted official status by, the Licensor or others designated to receive attribution as provided in Section 3(a)(1)(A)(i). - -b. Other rights. - - 1. Moral rights, such as the right of integrity, are not licensed under this Public License, nor are publicity, privacy, and/or other similar personality rights; however, to the extent possible, the Licensor waives and/or agrees not to assert any such rights held by the Licensor to the limited extent necessary to allow You to exercise the Licensed Rights, but not otherwise. - - 2. Patent and trademark rights are not licensed under this Public License. - - 3. To the extent possible, the Licensor waives any right to collect royalties from You for the exercise of the Licensed Rights, whether directly or through a collecting society under any voluntary or waivable statutory or compulsory licensing scheme. In all other cases the Licensor expressly reserves any right to collect such royalties. - -Section 3 – License Conditions. - -Your exercise of the Licensed Rights is expressly made subject to the following conditions. - - a. Attribution. - - 1. If You Share the Licensed Material (including in modified form), You must: - - A. retain the following if it is supplied by the Licensor with the Licensed Material: - - i. identification of the creator(s) of the Licensed Material and any others designated to receive attribution, in any reasonable manner requested by the Licensor (including by pseudonym if designated); - - ii. a copyright notice; - - iii. a notice that refers to this Public License; - - iv. a notice that refers to the disclaimer of warranties; - - v. a URI or hyperlink to the Licensed Material to the extent reasonably practicable; - - B. indicate if You modified the Licensed Material and retain an indication of any previous modifications; and - - C. indicate the Licensed Material is licensed under this Public License, and include the text of, or the URI or hyperlink to, this Public License. - - 2. You may satisfy the conditions in Section 3(a)(1) in any reasonable manner based on the medium, means, and context in which You Share the Licensed Material. For example, it may be reasonable to satisfy the conditions by providing a URI or hyperlink to a resource that includes the required information. - - 3. If requested by the Licensor, You must remove any of the information required by Section 3(a)(1)(A) to the extent reasonably practicable. - - 4. If You Share Adapted Material You produce, the Adapter's License You apply must not prevent recipients of the Adapted Material from complying with this Public License. - -Section 4 – Sui Generis Database Rights. - -Where the Licensed Rights include Sui Generis Database Rights that apply to Your use of the Licensed Material: - - a. for the avoidance of doubt, Section 2(a)(1) grants You the right to extract, reuse, reproduce, and Share all or a substantial portion of the contents of the database; - - b. if You include all or a substantial portion of the database contents in a database in which You have Sui Generis Database Rights, then the database in which You have Sui Generis Database Rights (but not its individual contents) is Adapted Material; and - - c. You must comply with the conditions in Section 3(a) if You Share all or a substantial portion of the contents of the database. -For the avoidance of doubt, this Section 4 supplements and does not replace Your obligations under this Public License where the Licensed Rights include other Copyright and Similar Rights. - -Section 5 – Disclaimer of Warranties and Limitation of Liability. - - a. Unless otherwise separately undertaken by the Licensor, to the extent possible, the Licensor offers the Licensed Material as-is and as-available, and makes no representations or warranties of any kind concerning the Licensed Material, whether express, implied, statutory, or other. This includes, without limitation, warranties of title, merchantability, fitness for a particular purpose, non-infringement, absence of latent or other defects, accuracy, or the presence or absence of errors, whether or not known or discoverable. Where disclaimers of warranties are not allowed in full or in part, this disclaimer may not apply to You. - - b. To the extent possible, in no event will the Licensor be liable to You on any legal theory (including, without limitation, negligence) or otherwise for any direct, special, indirect, incidental, consequential, punitive, exemplary, or other losses, costs, expenses, or damages arising out of this Public License or use of the Licensed Material, even if the Licensor has been advised of the possibility of such losses, costs, expenses, or damages. Where a limitation of liability is not allowed in full or in part, this limitation may not apply to You. - - c. The disclaimer of warranties and limitation of liability provided above shall be interpreted in a manner that, to the extent possible, most closely approximates an absolute disclaimer and waiver of all liability. - -Section 6 – Term and Termination. - - a. This Public License applies for the term of the Copyright and Similar Rights licensed here. However, if You fail to comply with this Public License, then Your rights under this Public License terminate automatically. - - b. Where Your right to use the Licensed Material has terminated under Section 6(a), it reinstates: - - 1. automatically as of the date the violation is cured, provided it is cured within 30 days of Your discovery of the violation; or - - 2. upon express reinstatement by the Licensor. - - c. For the avoidance of doubt, this Section 6(b) does not affect any right the Licensor may have to seek remedies for Your violations of this Public License. - - d. For the avoidance of doubt, the Licensor may also offer the Licensed Material under separate terms or conditions or stop distributing the Licensed Material at any time; however, doing so will not terminate this Public License. - - e. Sections 1, 5, 6, 7, and 8 survive termination of this Public License. - -Section 7 – Other Terms and Conditions. - - a. The Licensor shall not be bound by any additional or different terms or conditions communicated by You unless expressly agreed. - - b. Any arrangements, understandings, or agreements regarding the Licensed Material not stated herein are separate from and independent of the terms and conditions of this Public License. - -Section 8 – Interpretation. - - a. For the avoidance of doubt, this Public License does not, and shall not be interpreted to, reduce, limit, restrict, or impose conditions on any use of the Licensed Material that could lawfully be made without permission under this Public License. - - b. To the extent possible, if any provision of this Public License is deemed unenforceable, it shall be automatically reformed to the minimum extent necessary to make it enforceable. If the provision cannot be reformed, it shall be severed from this Public License without affecting the enforceability of the remaining terms and conditions. - - c. No term or condition of this Public License will be waived and no failure to comply consented to unless expressly agreed to by the Licensor. - - d. Nothing in this Public License constitutes or may be interpreted as a limitation upon, or waiver of, any privileges and immunities that apply to the Licensor or You, including from the legal processes of any jurisdiction or authority. - -Creative Commons is not a party to its public licenses. Notwithstanding, Creative Commons may elect to apply one of its public licenses to material it publishes and in those instances will be considered the “Licensor.” Except for the limited purpose of indicating that material is shared under a Creative Commons public license or as otherwise permitted by the Creative Commons policies published at creativecommons.org/policies, Creative Commons does not authorize the use of the trademark “Creative Commons” or any other trademark or logo of Creative Commons without its prior written consent including, without limitation, in connection with any unauthorized modifications to any of its public licenses or any other arrangements, understandings, or agreements concerning use of licensed material. For the avoidance of doubt, this paragraph does not form part of the public licenses. - -Creative Commons may be contacted at creativecommons.org. diff --git a/LICENSES/CC0-1.0.txt b/LICENSES/CC0-1.0.txt deleted file mode 100644 index 0e259d42..00000000 --- a/LICENSES/CC0-1.0.txt +++ /dev/null @@ -1,121 +0,0 @@ -Creative Commons Legal Code - -CC0 1.0 Universal - - CREATIVE COMMONS CORPORATION IS NOT A LAW FIRM AND DOES NOT PROVIDE - LEGAL SERVICES. DISTRIBUTION OF THIS DOCUMENT DOES NOT CREATE AN - ATTORNEY-CLIENT RELATIONSHIP. CREATIVE COMMONS PROVIDES THIS - INFORMATION ON AN "AS-IS" BASIS. CREATIVE COMMONS MAKES NO WARRANTIES - REGARDING THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS - PROVIDED HEREUNDER, AND DISCLAIMS LIABILITY FOR DAMAGES RESULTING FROM - THE USE OF THIS DOCUMENT OR THE INFORMATION OR WORKS PROVIDED - HEREUNDER. - -Statement of Purpose - -The laws of most jurisdictions throughout the world automatically confer -exclusive Copyright and Related Rights (defined below) upon the creator -and subsequent owner(s) (each and all, an "owner") of an original work of -authorship and/or a database (each, a "Work"). - -Certain owners wish to permanently relinquish those rights to a Work for -the purpose of contributing to a commons of creative, cultural and -scientific works ("Commons") that the public can reliably and without fear -of later claims of infringement build upon, modify, incorporate in other -works, reuse and redistribute as freely as possible in any form whatsoever -and for any purposes, including without limitation commercial purposes. -These owners may contribute to the Commons to promote the ideal of a free -culture and the further production of creative, cultural and scientific -works, or to gain reputation or greater distribution for their Work in -part through the use and efforts of others. - -For these and/or other purposes and motivations, and without any -expectation of additional consideration or compensation, the person -associating CC0 with a Work (the "Affirmer"), to the extent that he or she -is an owner of Copyright and Related Rights in the Work, voluntarily -elects to apply CC0 to the Work and publicly distribute the Work under its -terms, with knowledge of his or her Copyright and Related Rights in the -Work and the meaning and intended legal effect of CC0 on those rights. - -1. Copyright and Related Rights. A Work made available under CC0 may be -protected by copyright and related or neighboring rights ("Copyright and -Related Rights"). Copyright and Related Rights include, but are not -limited to, the following: - - i. the right to reproduce, adapt, distribute, perform, display, - communicate, and translate a Work; - ii. moral rights retained by the original author(s) and/or performer(s); -iii. publicity and privacy rights pertaining to a person's image or - likeness depicted in a Work; - iv. rights protecting against unfair competition in regards to a Work, - subject to the limitations in paragraph 4(a), below; - v. rights protecting the extraction, dissemination, use and reuse of data - in a Work; - vi. database rights (such as those arising under Directive 96/9/EC of the - European Parliament and of the Council of 11 March 1996 on the legal - protection of databases, and under any national implementation - thereof, including any amended or successor version of such - directive); and -vii. other similar, equivalent or corresponding rights throughout the - world based on applicable law or treaty, and any national - implementations thereof. - -2. Waiver. To the greatest extent permitted by, but not in contravention -of, applicable law, Affirmer hereby overtly, fully, permanently, -irrevocably and unconditionally waives, abandons, and surrenders all of -Affirmer's Copyright and Related Rights and associated claims and causes -of action, whether now known or unknown (including existing as well as -future claims and causes of action), in the Work (i) in all territories -worldwide, (ii) for the maximum duration provided by applicable law or -treaty (including future time extensions), (iii) in any current or future -medium and for any number of copies, and (iv) for any purpose whatsoever, -including without limitation commercial, advertising or promotional -purposes (the "Waiver"). Affirmer makes the Waiver for the benefit of each -member of the public at large and to the detriment of Affirmer's heirs and -successors, fully intending that such Waiver shall not be subject to -revocation, rescission, cancellation, termination, or any other legal or -equitable action to disrupt the quiet enjoyment of the Work by the public -as contemplated by Affirmer's express Statement of Purpose. - -3. Public License Fallback. Should any part of the Waiver for any reason -be judged legally invalid or ineffective under applicable law, then the -Waiver shall be preserved to the maximum extent permitted taking into -account Affirmer's express Statement of Purpose. In addition, to the -extent the Waiver is so judged Affirmer hereby grants to each affected -person a royalty-free, non transferable, non sublicensable, non exclusive, -irrevocable and unconditional license to exercise Affirmer's Copyright and -Related Rights in the Work (i) in all territories worldwide, (ii) for the -maximum duration provided by applicable law or treaty (including future -time extensions), (iii) in any current or future medium and for any number -of copies, and (iv) for any purpose whatsoever, including without -limitation commercial, advertising or promotional purposes (the -"License"). The License shall be deemed effective as of the date CC0 was -applied by Affirmer to the Work. Should any part of the License for any -reason be judged legally invalid or ineffective under applicable law, such -partial invalidity or ineffectiveness shall not invalidate the remainder -of the License, and in such case Affirmer hereby affirms that he or she -will not (i) exercise any of his or her remaining Copyright and Related -Rights in the Work or (ii) assert any associated claims and causes of -action with respect to the Work, in either case contrary to Affirmer's -express Statement of Purpose. - -4. Limitations and Disclaimers. - - a. No trademark or patent rights held by Affirmer are waived, abandoned, - surrendered, licensed or otherwise affected by this document. - b. Affirmer offers the Work as-is and makes no representations or - warranties of any kind concerning the Work, express, implied, - statutory or otherwise, including without limitation warranties of - title, merchantability, fitness for a particular purpose, non - infringement, or the absence of latent or other defects, accuracy, or - the present or absence of errors, whether or not discoverable, all to - the greatest extent permissible under applicable law. - c. Affirmer disclaims responsibility for clearing rights of other persons - that may apply to the Work or any use thereof, including without - limitation any person's Copyright and Related Rights in the Work. - Further, Affirmer disclaims responsibility for obtaining any necessary - consents, permissions or other rights required for any use of the - Work. - d. Affirmer understands and acknowledges that Creative Commons is not a - party to this document and has no duty or obligation with respect to - this CC0 or use of the Work. diff --git a/LICENSES/LGPL-3.0-only.txt b/LICENSES/LGPL-3.0-only.txt deleted file mode 100644 index 513d1c01..00000000 --- a/LICENSES/LGPL-3.0-only.txt +++ /dev/null @@ -1,304 +0,0 @@ -GNU LESSER GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright (C) 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -This version of the GNU Lesser General Public License incorporates the terms and conditions of version 3 of the GNU General Public License, supplemented by the additional permissions listed below. - -0. Additional Definitions. - -As used herein, "this License" refers to version 3 of the GNU Lesser General Public License, and the "GNU GPL" refers to version 3 of the GNU General Public License. - -"The Library" refers to a covered work governed by this License, other than an Application or a Combined Work as defined below. - -An "Application" is any work that makes use of an interface provided by the Library, but which is not otherwise based on the Library. Defining a subclass of a class defined by the Library is deemed a mode of using an interface provided by the Library. - -A "Combined Work" is a work produced by combining or linking an Application with the Library. The particular version of the Library with which the Combined Work was made is also called the "Linked Version". - -The "Minimal Corresponding Source" for a Combined Work means the Corresponding Source for the Combined Work, excluding any source code for portions of the Combined Work that, considered in isolation, are based on the Application, and not on the Linked Version. - -The "Corresponding Application Code" for a Combined Work means the object code and/or source code for the Application, including any data and utility programs needed for reproducing the Combined Work from the Application, but excluding the System Libraries of the Combined Work. - -1. Exception to Section 3 of the GNU GPL. -You may convey a covered work under sections 3 and 4 of this License without being bound by section 3 of the GNU GPL. - -2. Conveying Modified Versions. -If you modify a copy of the Library, and, in your modifications, a facility refers to a function or data to be supplied by an Application that uses the facility (other than as an argument passed when the facility is invoked), then you may convey a copy of the modified version: - - a) under this License, provided that you make a good faith effort to ensure that, in the event an Application does not supply the function or data, the facility still operates, and performs whatever part of its purpose remains meaningful, or - - b) under the GNU GPL, with none of the additional permissions of this License applicable to that copy. - -3. Object Code Incorporating Material from Library Header Files. -The object code form of an Application may incorporate material from a header file that is part of the Library. You may convey such object code under terms of your choice, provided that, if the incorporated material is not limited to numerical parameters, data structure layouts and accessors, or small macros, inline functions and templates (ten or fewer lines in length), you do both of the following: - - a) Give prominent notice with each copy of the object code that the Library is used in it and that the Library and its use are covered by this License. - - b) Accompany the object code with a copy of the GNU GPL and this license document. - -4. Combined Works. -You may convey a Combined Work under terms of your choice that, taken together, effectively do not restrict modification of the portions of the Library contained in the Combined Work and reverse engineering for debugging such modifications, if you also do each of the following: - - a) Give prominent notice with each copy of the Combined Work that the Library is used in it and that the Library and its use are covered by this License. - - b) Accompany the Combined Work with a copy of the GNU GPL and this license document. - - c) For a Combined Work that displays copyright notices during execution, include the copyright notice for the Library among these notices, as well as a reference directing the user to the copies of the GNU GPL and this license document. - - d) Do one of the following: - - 0) Convey the Minimal Corresponding Source under the terms of this License, and the Corresponding Application Code in a form suitable for, and under terms that permit, the user to recombine or relink the Application with a modified version of the Linked Version to produce a modified Combined Work, in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source. - - 1) Use a suitable shared library mechanism for linking with the Library. A suitable mechanism is one that (a) uses at run time a copy of the Library already present on the user's computer system, and (b) will operate properly with a modified version of the Library that is interface-compatible with the Linked Version. - - e) Provide Installation Information, but only if you would otherwise be required to provide such information under section 6 of the GNU GPL, and only to the extent that such information is necessary to install and execute a modified version of the Combined Work produced by recombining or relinking the Application with a modified version of the Linked Version. (If you use option 4d0, the Installation Information must accompany the Minimal Corresponding Source and Corresponding Application Code. If you use option 4d1, you must provide the Installation Information in the manner specified by section 6 of the GNU GPL for conveying Corresponding Source.) - -5. Combined Libraries. -You may place library facilities that are a work based on the Library side by side in a single library together with other library facilities that are not Applications and are not covered by this License, and convey such a combined library under terms of your choice, if you do both of the following: - - a) Accompany the combined library with a copy of the same work based on the Library, uncombined with any other library facilities, conveyed under the terms of this License. - - b) Give prominent notice with the combined library that part of it is a work based on the Library, and explaining where to find the accompanying uncombined form of the same work. - -6. Revised Versions of the GNU Lesser General Public License. -The Free Software Foundation may publish revised and/or new versions of the GNU Lesser General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Library as you received it specifies that a certain numbered version of the GNU Lesser General Public License "or any later version" applies to it, you have the option of following the terms and conditions either of that published version or of any later version published by the Free Software Foundation. If the Library as you received it does not specify a version number of the GNU Lesser General Public License, you may choose any version of the GNU Lesser General Public License ever published by the Free Software Foundation. - -If the Library as you received it specifies that a proxy can decide whether future versions of the GNU Lesser General Public License shall -apply, that proxy's public statement of acceptance of any version is permanent authorization for you to choose that version for the Library. - -GNU GENERAL PUBLIC LICENSE -Version 3, 29 June 2007 - -Copyright © 2007 Free Software Foundation, Inc. - -Everyone is permitted to copy and distribute verbatim copies of this license document, but changing it is not allowed. - -Preamble - -The GNU General Public License is a free, copyleft license for software and other kinds of works. - -The licenses for most software and other practical works are designed to take away your freedom to share and change the works. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change all versions of a program--to make sure it remains free software for all its users. We, the Free Software Foundation, use the GNU General Public License for most of our software; it applies also to any other work released this way by its authors. You can apply it to your programs, too. - -When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for them if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs, and that you know you can do these things. - -To protect your rights, we need to prevent others from denying you these rights or asking you to surrender the rights. Therefore, you have certain responsibilities if you distribute copies of the software, or if you modify it: responsibilities to respect the freedom of others. - -For example, if you distribute copies of such a program, whether gratis or for a fee, you must pass on to the recipients the same freedoms that you received. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights. - -Developers that use the GNU GPL protect your rights with two steps: (1) assert copyright on the software, and (2) offer you this License giving you legal permission to copy, distribute and/or modify it. - -For the developers' and authors' protection, the GPL clearly explains that there is no warranty for this free software. For both users' and authors' sake, the GPL requires that modified versions be marked as changed, so that their problems will not be attributed erroneously to authors of previous versions. - -Some devices are designed to deny users access to install or run modified versions of the software inside them, although the manufacturer can do so. This is fundamentally incompatible with the aim of protecting users' freedom to change the software. The systematic pattern of such abuse occurs in the area of products for individuals to use, which is precisely where it is most unacceptable. Therefore, we have designed this version of the GPL to prohibit the practice for those products. If such problems arise substantially in other domains, we stand ready to extend this provision to those domains in future versions of the GPL, as needed to protect the freedom of users. - -Finally, every program is threatened constantly by software patents. States should not allow patents to restrict development and use of software on general-purpose computers, but in those that do, we wish to avoid the special danger that patents applied to a free program could make it effectively proprietary. To prevent this, the GPL assures that patents cannot be used to render the program non-free. - -The precise terms and conditions for copying, distribution and modification follow. - -TERMS AND CONDITIONS - -0. Definitions. - -“This License” refers to version 3 of the GNU General Public License. - -“Copyright” also means copyright-like laws that apply to other kinds of works, such as semiconductor masks. - -“The Program” refers to any copyrightable work licensed under this License. Each licensee is addressed as “you”. “Licensees” and “recipients” may be individuals or organizations. - -To “modify” a work means to copy from or adapt all or part of the work in a fashion requiring copyright permission, other than the making of an exact copy. The resulting work is called a “modified version” of the earlier work or a work “based on” the earlier work. - -A “covered work” means either the unmodified Program or a work based on the Program. - -To “propagate” a work means to do anything with it that, without permission, would make you directly or secondarily liable for infringement under applicable copyright law, except executing it on a computer or modifying a private copy. Propagation includes copying, distribution (with or without modification), making available to the public, and in some countries other activities as well. - -To “convey” a work means any kind of propagation that enables other parties to make or receive copies. Mere interaction with a user through a computer network, with no transfer of a copy, is not conveying. - -An interactive user interface displays “Appropriate Legal Notices” to the extent that it includes a convenient and prominently visible feature that (1) displays an appropriate copyright notice, and (2) tells the user that there is no warranty for the work (except to the extent that warranties are provided), that licensees may convey the work under this License, and how to view a copy of this License. If the interface presents a list of user commands or options, such as a menu, a prominent item in the list meets this criterion. - -1. Source Code. -The “source code” for a work means the preferred form of the work for making modifications to it. “Object code” means any non-source form of a work. - -A “Standard Interface” means an interface that either is an official standard defined by a recognized standards body, or, in the case of interfaces specified for a particular programming language, one that is widely used among developers working in that language. - -The “System Libraries” of an executable work include anything, other than the work as a whole, that (a) is included in the normal form of packaging a Major Component, but which is not part of that Major Component, and (b) serves only to enable use of the work with that Major Component, or to implement a Standard Interface for which an implementation is available to the public in source code form. A “Major Component”, in this context, means a major essential component (kernel, window system, and so on) of the specific operating system (if any) on which the executable work runs, or a compiler used to produce the work, or an object code interpreter used to run it. - -The “Corresponding Source” for a work in object code form means all the source code needed to generate, install, and (for an executable work) run the object code and to modify the work, including scripts to control those activities. However, it does not include the work's System Libraries, or general-purpose tools or generally available free programs which are used unmodified in performing those activities but which are not part of the work. For example, Corresponding Source includes interface definition files associated with source files for the work, and the source code for shared libraries and dynamically linked subprograms that the work is specifically designed to require, such as by intimate data communication or control flow between those subprograms and other parts of the work. - -The Corresponding Source need not include anything that users can regenerate automatically from other parts of the Corresponding Source. - -The Corresponding Source for a work in source code form is that same work. - -2. Basic Permissions. -All rights granted under this License are granted for the term of copyright on the Program, and are irrevocable provided the stated conditions are met. This License explicitly affirms your unlimited permission to run the unmodified Program. The output from running a covered work is covered by this License only if the output, given its content, constitutes a covered work. This License acknowledges your rights of fair use or other equivalent, as provided by copyright law. - -You may make, run and propagate covered works that you do not convey, without conditions so long as your license otherwise remains in force. You may convey covered works to others for the sole purpose of having them make modifications exclusively for you, or provide you with facilities for running those works, provided that you comply with the terms of this License in conveying all material for which you do not control copyright. Those thus making or running the covered works for you must do so exclusively on your behalf, under your direction and control, on terms that prohibit them from making any copies of your copyrighted material outside their relationship with you. - -Conveying under any other circumstances is permitted solely under the conditions stated below. Sublicensing is not allowed; section 10 makes it unnecessary. - -3. Protecting Users' Legal Rights From Anti-Circumvention Law. -No covered work shall be deemed part of an effective technological measure under any applicable law fulfilling obligations under article 11 of the WIPO copyright treaty adopted on 20 December 1996, or similar laws prohibiting or restricting circumvention of such measures. - -When you convey a covered work, you waive any legal power to forbid circumvention of technological measures to the extent such circumvention is effected by exercising rights under this License with respect to the covered work, and you disclaim any intention to limit operation or modification of the work as a means of enforcing, against the work's users, your or third parties' legal rights to forbid circumvention of technological measures. - -4. Conveying Verbatim Copies. -You may convey verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice; keep intact all notices stating that this License and any non-permissive terms added in accord with section 7 apply to the code; keep intact all notices of the absence of any warranty; and give all recipients a copy of this License along with the Program. - -You may charge any price or no price for each copy that you convey, and you may offer support or warranty protection for a fee. - -5. Conveying Modified Source Versions. -You may convey a work based on the Program, or the modifications to produce it from the Program, in the form of source code under the terms of section 4, provided that you also meet all of these conditions: - - a) The work must carry prominent notices stating that you modified it, and giving a relevant date. - - b) The work must carry prominent notices stating that it is released under this License and any conditions added under section 7. This requirement modifies the requirement in section 4 to “keep intact all notices”. - - c) You must license the entire work, as a whole, under this License to anyone who comes into possession of a copy. This License will therefore apply, along with any applicable section 7 additional terms, to the whole of the work, and all its parts, regardless of how they are packaged. This License gives no permission to license the work in any other way, but it does not invalidate such permission if you have separately received it. - - d) If the work has interactive user interfaces, each must display Appropriate Legal Notices; however, if the Program has interactive interfaces that do not display Appropriate Legal Notices, your work need not make them do so. - -A compilation of a covered work with other separate and independent works, which are not by their nature extensions of the covered work, and which are not combined with it such as to form a larger program, in or on a volume of a storage or distribution medium, is called an “aggregate” if the compilation and its resulting copyright are not used to limit the access or legal rights of the compilation's users beyond what the individual works permit. Inclusion of a covered work in an aggregate does not cause this License to apply to the other parts of the aggregate. - -6. Conveying Non-Source Forms. -You may convey a covered work in object code form under the terms of sections 4 and 5, provided that you also convey the machine-readable Corresponding Source under the terms of this License, in one of these ways: - - a) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by the Corresponding Source fixed on a durable physical medium customarily used for software interchange. - - b) Convey the object code in, or embodied in, a physical product (including a physical distribution medium), accompanied by a written offer, valid for at least three years and valid for as long as you offer spare parts or customer support for that product model, to give anyone who possesses the object code either (1) a copy of the Corresponding Source for all the software in the product that is covered by this License, on a durable physical medium customarily used for software interchange, for a price no more than your reasonable cost of physically performing this conveying of source, or (2) access to copy the Corresponding Source from a network server at no charge. - - c) Convey individual copies of the object code with a copy of the written offer to provide the Corresponding Source. This alternative is allowed only occasionally and noncommercially, and only if you received the object code with such an offer, in accord with subsection 6b. - - d) Convey the object code by offering access from a designated place (gratis or for a charge), and offer equivalent access to the Corresponding Source in the same way through the same place at no further charge. You need not require recipients to copy the Corresponding Source along with the object code. If the place to copy the object code is a network server, the Corresponding Source may be on a different server (operated by you or a third party) that supports equivalent copying facilities, provided you maintain clear directions next to the object code saying where to find the Corresponding Source. Regardless of what server hosts the Corresponding Source, you remain obligated to ensure that it is available for as long as needed to satisfy these requirements. - - e) Convey the object code using peer-to-peer transmission, provided you inform other peers where the object code and Corresponding Source of the work are being offered to the general public at no charge under subsection 6d. - -A separable portion of the object code, whose source code is excluded from the Corresponding Source as a System Library, need not be included in conveying the object code work. - -A “User Product” is either (1) a “consumer product”, which means any tangible personal property which is normally used for personal, family, or household purposes, or (2) anything designed or sold for incorporation into a dwelling. In determining whether a product is a consumer product, doubtful cases shall be resolved in favor of coverage. For a particular product received by a particular user, “normally used” refers to a typical or common use of that class of product, regardless of the status of the particular user or of the way in which the particular user actually uses, or expects or is expected to use, the product. A product is a consumer product regardless of whether the product has substantial commercial, industrial or non-consumer uses, unless such uses represent the only significant mode of use of the product. - -“Installation Information” for a User Product means any methods, procedures, authorization keys, or other information required to install and execute modified versions of a covered work in that User Product from a modified version of its Corresponding Source. The information must suffice to ensure that the continued functioning of the modified object code is in no case prevented or interfered with solely because modification has been made. - -If you convey an object code work under this section in, or with, or specifically for use in, a User Product, and the conveying occurs as part of a transaction in which the right of possession and use of the User Product is transferred to the recipient in perpetuity or for a fixed term (regardless of how the transaction is characterized), the Corresponding Source conveyed under this section must be accompanied by the Installation Information. But this requirement does not apply if neither you nor any third party retains the ability to install modified object code on the User Product (for example, the work has been installed in ROM). - -The requirement to provide Installation Information does not include a requirement to continue to provide support service, warranty, or updates for a work that has been modified or installed by the recipient, or for the User Product in which it has been modified or installed. Access to a network may be denied when the modification itself materially and adversely affects the operation of the network or violates the rules and protocols for communication across the network. - -Corresponding Source conveyed, and Installation Information provided, in accord with this section must be in a format that is publicly documented (and with an implementation available to the public in source code form), and must require no special password or key for unpacking, reading or copying. - -7. Additional Terms. -“Additional permissions” are terms that supplement the terms of this License by making exceptions from one or more of its conditions. Additional permissions that are applicable to the entire Program shall be treated as though they were included in this License, to the extent that they are valid under applicable law. If additional permissions apply only to part of the Program, that part may be used separately under those permissions, but the entire Program remains governed by this License without regard to the additional permissions. - -When you convey a copy of a covered work, you may at your option remove any additional permissions from that copy, or from any part of it. (Additional permissions may be written to require their own removal in certain cases when you modify the work.) You may place additional permissions on material, added by you to a covered work, for which you have or can give appropriate copyright permission. - -Notwithstanding any other provision of this License, for material you add to a covered work, you may (if authorized by the copyright holders of that material) supplement the terms of this License with terms: - - a) Disclaiming warranty or limiting liability differently from the terms of sections 15 and 16 of this License; or - - b) Requiring preservation of specified reasonable legal notices or author attributions in that material or in the Appropriate Legal Notices displayed by works containing it; or - - c) Prohibiting misrepresentation of the origin of that material, or requiring that modified versions of such material be marked in reasonable ways as different from the original version; or - - d) Limiting the use for publicity purposes of names of licensors or authors of the material; or - - e) Declining to grant rights under trademark law for use of some trade names, trademarks, or service marks; or - - f) Requiring indemnification of licensors and authors of that material by anyone who conveys the material (or modified versions of it) with contractual assumptions of liability to the recipient, for any liability that these contractual assumptions directly impose on those licensors and authors. - -All other non-permissive additional terms are considered “further restrictions” within the meaning of section 10. If the Program as you received it, or any part of it, contains a notice stating that it is governed by this License along with a term that is a further restriction, you may remove that term. If a license document contains a further restriction but permits relicensing or conveying under this License, you may add to a covered work material governed by the terms of that license document, provided that the further restriction does not survive such relicensing or conveying. - -If you add terms to a covered work in accord with this section, you must place, in the relevant source files, a statement of the additional terms that apply to those files, or a notice indicating where to find the applicable terms. - -Additional terms, permissive or non-permissive, may be stated in the form of a separately written license, or stated as exceptions; the above requirements apply either way. - -8. Termination. -You may not propagate or modify a covered work except as expressly provided under this License. Any attempt otherwise to propagate or modify it is void, and will automatically terminate your rights under this License (including any patent licenses granted under the third paragraph of section 11). - -However, if you cease all violation of this License, then your license from a particular copyright holder is reinstated (a) provisionally, unless and until the copyright holder explicitly and finally terminates your license, and (b) permanently, if the copyright holder fails to notify you of the violation by some reasonable means prior to 60 days after the cessation. - -Moreover, your license from a particular copyright holder is reinstated permanently if the copyright holder notifies you of the violation by some reasonable means, this is the first time you have received notice of violation of this License (for any work) from that copyright holder, and you cure the violation prior to 30 days after your receipt of the notice. - -Termination of your rights under this section does not terminate the licenses of parties who have received copies or rights from you under this License. If your rights have been terminated and not permanently reinstated, you do not qualify to receive new licenses for the same material under section 10. - -9. Acceptance Not Required for Having Copies. -You are not required to accept this License in order to receive or run a copy of the Program. Ancillary propagation of a covered work occurring solely as a consequence of using peer-to-peer transmission to receive a copy likewise does not require acceptance. However, nothing other than this License grants you permission to propagate or modify any covered work. These actions infringe copyright if you do not accept this License. Therefore, by modifying or propagating a covered work, you indicate your acceptance of this License to do so. - -10. Automatic Licensing of Downstream Recipients. -Each time you convey a covered work, the recipient automatically receives a license from the original licensors, to run, modify and propagate that work, subject to this License. You are not responsible for enforcing compliance by third parties with this License. - -An “entity transaction” is a transaction transferring control of an organization, or substantially all assets of one, or subdividing an organization, or merging organizations. If propagation of a covered work results from an entity transaction, each party to that transaction who receives a copy of the work also receives whatever licenses to the work the party's predecessor in interest had or could give under the previous paragraph, plus a right to possession of the Corresponding Source of the work from the predecessor in interest, if the predecessor has it or can get it with reasonable efforts. - -You may not impose any further restrictions on the exercise of the rights granted or affirmed under this License. For example, you may not impose a license fee, royalty, or other charge for exercise of rights granted under this License, and you may not initiate litigation (including a cross-claim or counterclaim in a lawsuit) alleging that any patent claim is infringed by making, using, selling, offering for sale, or importing the Program or any portion of it. - -11. Patents. -A “contributor” is a copyright holder who authorizes use under this License of the Program or a work on which the Program is based. The work thus licensed is called the contributor's “contributor version”. - -A contributor's “essential patent claims” are all patent claims owned or controlled by the contributor, whether already acquired or hereafter acquired, that would be infringed by some manner, permitted by this License, of making, using, or selling its contributor version, but do not include claims that would be infringed only as a consequence of further modification of the contributor version. For purposes of this definition, “control” includes the right to grant patent sublicenses in a manner consistent with the requirements of this License. - -Each contributor grants you a non-exclusive, worldwide, royalty-free patent license under the contributor's essential patent claims, to make, use, sell, offer for sale, import and otherwise run, modify and propagate the contents of its contributor version. - -In the following three paragraphs, a “patent license” is any express agreement or commitment, however denominated, not to enforce a patent (such as an express permission to practice a patent or covenant not to sue for patent infringement). To “grant” such a patent license to a party means to make such an agreement or commitment not to enforce a patent against the party. - -If you convey a covered work, knowingly relying on a patent license, and the Corresponding Source of the work is not available for anyone to copy, free of charge and under the terms of this License, through a publicly available network server or other readily accessible means, then you must either (1) cause the Corresponding Source to be so available, or (2) arrange to deprive yourself of the benefit of the patent license for this particular work, or (3) arrange, in a manner consistent with the requirements of this License, to extend the patent license to downstream recipients. “Knowingly relying” means you have actual knowledge that, but for the patent license, your conveying the covered work in a country, or your recipient's use of the covered work in a country, would infringe one or more identifiable patents in that country that you have reason to believe are valid. - -If, pursuant to or in connection with a single transaction or arrangement, you convey, or propagate by procuring conveyance of, a covered work, and grant a patent license to some of the parties receiving the covered work authorizing them to use, propagate, modify or convey a specific copy of the covered work, then the patent license you grant is automatically extended to all recipients of the covered work and works based on it. - -A patent license is “discriminatory” if it does not include within the scope of its coverage, prohibits the exercise of, or is conditioned on the non-exercise of one or more of the rights that are specifically granted under this License. You may not convey a covered work if you are a party to an arrangement with a third party that is in the business of distributing software, under which you make payment to the third party based on the extent of your activity of conveying the work, and under which the third party grants, to any of the parties who would receive the covered work from you, a discriminatory patent license (a) in connection with copies of the covered work conveyed by you (or copies made from those copies), or (b) primarily for and in connection with specific products or compilations that contain the covered work, unless you entered into that arrangement, or that patent license was granted, prior to 28 March 2007. - -Nothing in this License shall be construed as excluding or limiting any implied license or other defenses to infringement that may otherwise be available to you under applicable patent law. - -12. No Surrender of Others' Freedom. -If conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot convey a covered work so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not convey it at all. For example, if you agree to terms that obligate you to collect a royalty for further conveying from those to whom you convey the Program, the only way you could satisfy both those terms and this License would be to refrain entirely from conveying the Program. - -13. Use with the GNU Affero General Public License. -Notwithstanding any other provision of this License, you have permission to link or combine any covered work with a work licensed under version 3 of the GNU Affero General Public License into a single combined work, and to convey the resulting work. The terms of this License will continue to apply to the part which is the covered work, but the special requirements of the GNU Affero General Public License, section 13, concerning interaction through a network will apply to the combination as such. - -14. Revised Versions of this License. -The Free Software Foundation may publish revised and/or new versions of the GNU General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns. - -Each version is given a distinguishing version number. If the Program specifies that a certain numbered version of the GNU General Public License “or any later version” applies to it, you have the option of following the terms and conditions either of that numbered version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of the GNU General Public License, you may choose any version ever published by the Free Software Foundation. - -If the Program specifies that a proxy can decide which future versions of the GNU General Public License can be used, that proxy's public statement of acceptance of a version permanently authorizes you to choose that version for the Program. - -Later license versions may give you additional or different permissions. However, no additional obligations are imposed on any author or copyright holder as a result of your choosing to follow a later version. - -15. Disclaimer of Warranty. -THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM “AS IS” WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION. - -16. Limitation of Liability. -IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. - -17. Interpretation of Sections 15 and 16. -If the disclaimer of warranty and limitation of liability provided above cannot be given local legal effect according to their terms, reviewing courts shall apply local law that most closely approximates an absolute waiver of all civil liability in connection with the Program, unless a warranty or assumption of liability accompanies a copy of the Program in return for a fee. - -END OF TERMS AND CONDITIONS - -How to Apply These Terms to Your New Programs - -If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms. - -To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively state the exclusion of warranty; and each file should have at least the “copyright” line and a pointer to where the full notice is found. - - - Copyright (C) - - This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. - - This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. - - You should have received a copy of the GNU General Public License along with this program. If not, see . - -Also add information on how to contact you by electronic and paper mail. - -If the program does terminal interaction, make it output a short notice like this when it starts in an interactive mode: - - Copyright (C) - This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, your program's commands might be different; for a GUI interface, you would use an “about box”. - -You should also get your employer (if you work as a programmer) or school, if any, to sign a “copyright disclaimer” for the program, if necessary. For more information on this, and how to apply and follow the GNU GPL, see . - -The GNU General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Lesser General Public License instead of this License. But first, please read . diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index fd6ac620..00000000 --- a/MANIFEST.in +++ /dev/null @@ -1,11 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -include README.rst -include COPYING -include COPYING.LESSER -include psy_simple/widgets/icons/*.png -include psy_simple/widgets/icons/cmaps/*.png -include versioneer.py -include psy_simple/_version.py diff --git a/Makefile b/Makefile deleted file mode 100644 index d25e2bbd..00000000 --- a/Makefile +++ /dev/null @@ -1,128 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -.PHONY: clean clean-build clean-pyc clean-test coverage dist docs help install lint lint/flake8 lint/black -.DEFAULT_GOAL := help - -define BROWSER_PYSCRIPT -import os, webbrowser, sys - -from urllib.request import pathname2url - -webbrowser.open("file://" + pathname2url(os.path.abspath(sys.argv[1]))) -endef -export BROWSER_PYSCRIPT - -define PRINT_HELP_PYSCRIPT -import re, sys - -for line in sys.stdin: - match = re.match(r'^([a-zA-Z_-]+):.*?## (.*)$$', line) - if match: - target, help = match.groups() - print("%-20s %s" % (target, help)) -endef -export PRINT_HELP_PYSCRIPT - -BROWSER := python -c "$$BROWSER_PYSCRIPT" - -NPROCS ?= 1 - -help: - @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) - -clean: clean-build clean-pyc clean-test clean-venv ## remove all build, virtual environments, test, coverage and Python artifacts - -clean-build: ## remove build artifacts - rm -fr build/ - rm -fr dist/ - rm -fr .eggs/ - find . -name '*.egg-info' -exec rm -fr {} + - find . -name '*.egg' -exec rm -f {} + - -clean-pyc: ## remove Python file artifacts - find . -name '*.pyc' -exec rm -f {} + - find . -name '*.pyo' -exec rm -f {} + - find . -name '*~' -exec rm -f {} + - find . -name '__pycache__' -exec rm -fr {} + - -clean-test: ## remove test and coverage artifacts - rm -fr .tox/ - rm -f .coverage - rm -fr htmlcov/ - rm -fr .pytest_cache - -clean-venv: # remove the virtual environment - rm -rf venv - -lint/isort: ## check style with flake8 - isort --check psy_simple tests -lint/flake8: ## check style with flake8 - flake8 psy_simple tests -lint/black: ## check style with black - black --check psy_simple tests - blackdoc --check psy_simple tests -lint/reuse: ## check licenses - reuse lint - -lint: lint/isort lint/black lint/flake8 lint/reuse ## check style - -formatting: - isort psy_simple tests - black psy_simple tests - blackdoc psy_simple tests - -quick-test: ## run tests quickly with the default Python - python -m pytest - -pipenv-test: ## run tox - pipenv run isort --check psy_simple - pipenv run black --line-length 79 --check psy_simple - pipenv run flake8 psy_simple - pipenv run pytest -v --cov=psy_simple -x --ref - pipenv run pytest -v --cov=psy_simple -x --cov-append -n $(NPROCS) - pipenv run reuse lint - pipenv run cffconvert --validate - -test: ## run tox - tox - -test-all: test test-docs ## run tests and test the docs - -coverage: ## check code coverage quickly with the default Python - python -m pytest --cov psy_simple --cov-report=html - $(BROWSER) htmlcov/index.html - -docs: ## generate Sphinx HTML documentation, including API docs - $(MAKE) -C docs clean - $(MAKE) -C docs html - $(BROWSER) docs/_build/html/index.html - -test-docs: ## generate Sphinx HTML documentation, including API docs - $(MAKE) -C docs clean - $(MAKE) -C docs linkcheck - -servedocs: docs ## compile the docs watching for changes - watchmedo shell-command -p '*.rst' -c '$(MAKE) -C docs html' -R -D . - -release: dist ## package and upload a release - twine upload dist/* - -dist: clean ## builds source and wheel package - python -m build - ls -l dist - -install: clean ## install the package to the active Python's site-packages - python -m pip install . - -dev-install: clean - python -m pip install -r docs/requirements.txt - python -m pip install -e .[dev] - pre-commit install - -venv-install: clean - python -m venv venv - venv/bin/python -m pip install -r docs/requirements.txt - venv/bin/python -m pip install -e .[dev] - venv/bin/pre-commit install diff --git a/README.rst b/README.rst deleted file mode 100644 index a1dbe860..00000000 --- a/README.rst +++ /dev/null @@ -1,75 +0,0 @@ -.. SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -.. -.. SPDX-License-Identifier: CC-BY-4.0 - -======================================================== -psy-simple: The psyplot plugin for simple visualizations -======================================================== - -.. start-badges - - -|CI| -|Code coverage| -|Latest Release| -|PyPI version| -|Code style: black| -|Imports: isort| -|PEP8| -|REUSE status| - -.. end-badges - -Welcome to the psyplot plugin for simple visualization. This package targets -simple visualization like line plots, 2D plots, bar plots, density plots, etc. -It provides the basics for all the more advanced and specialized plugins like -the psy-maps_ or psy-reg_ plugin. - -See the full documentation on -`psyplot.github.io/psy-simple/ `__ for all -`plot methods`_, and checkout the examples_. - -.. _psy-maps: http://psyplot.github.io/psy-maps/ -.. _psy-reg: http://psyplot.github.io/psy-reg/ -.. _plot methods: http://psyplot.github.io/psy-simple/plot_methods -.. _examples: http://psyplot.github.io/examples/ - -Copyright ---------- -Copyright © 2021-2024 Helmholtz-Zentrum Hereon, 2020-2021 Helmholtz-Zentrum -Geesthacht, 2016-2024 University of Lausanne - -This file is part of psy-simple and is released under the GNU LGPL-3.O license. -See COPYING and COPYING.LESSER in the root of the repository for full -licensing details. - -This program is free software: you can redistribute it and/or modify -it under the terms of the GNU Lesser General Public License version 3.0 as -published by the Free Software Foundation. - -This program is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -GNU LGPL-3.0 license for more details. - -You should have received a copy of the GNU LGPL-3.0 license -along with this program. If not, see https://www.gnu.org/licenses/. - -.. |CI| image:: https://codebase.helmholtz.cloud/psyplot/psy-simple/badges/master/pipeline.svg - :target: https://codebase.helmholtz.cloud/psyplot/psy-simple/-/pipelines?page=1&scope=all&ref=master -.. |Code coverage| image:: https://codebase.helmholtz.cloud/psyplot/psy-simple/badges/master/coverage.svg - :target: https://codebase.helmholtz.cloud/psyplot/psy-simple/-/graphs/master/charts -.. |Latest Release| image:: https://codebase.helmholtz.cloud/psyplot/psy-simple/-/badges/release.svg - :target: https://codebase.helmholtz.cloud/psyplot/psy-simple -.. |PyPI version| image:: https://img.shields.io/pypi/v/psy-simple.svg - :target: https://pypi.python.org/pypi/psy-simple/ -.. |Code style: black| image:: https://img.shields.io/badge/code%20style-black-000000.svg - :target: https://github.com/psf/black -.. |Imports: isort| image:: https://img.shields.io/badge/%20imports-isort-%231674b1?style=flat&labelColor=ef8336 - :target: https://pycqa.github.io/isort/ -.. |PEP8| image:: https://img.shields.io/badge/code%20style-pep8-orange.svg - :target: https://www.python.org/dev/peps/pep-0008/ -.. |Checked with mypy| image:: http://www.mypy-lang.org/static/mypy_badge.svg - :target: http://mypy-lang.org/ -.. |REUSE status| image:: https://api.reuse.software/badge/codebase.helmholtz.cloud/psyplot/psy-simple - :target: https://api.reuse.software/info/codebase.helmholtz.cloud/psyplot/psy-simple diff --git a/docs/api.rst b/_sources/api.rst.txt similarity index 100% rename from docs/api.rst rename to _sources/api.rst.txt diff --git a/_sources/api/psy_simple.base.rst.txt b/_sources/api/psy_simple.base.rst.txt new file mode 100644 index 00000000..b6ef3658 --- /dev/null +++ b/_sources/api/psy_simple.base.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.base + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/psy_simple.colors.rst.txt b/_sources/api/psy_simple.colors.rst.txt new file mode 100644 index 00000000..1f7a57bb --- /dev/null +++ b/_sources/api/psy_simple.colors.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.colors + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/psy_simple.plotters.rst.txt b/_sources/api/psy_simple.plotters.rst.txt new file mode 100644 index 00000000..a2e10fa4 --- /dev/null +++ b/_sources/api/psy_simple.plotters.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.plotters + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/psy_simple.plugin.rst.txt b/_sources/api/psy_simple.plugin.rst.txt new file mode 100644 index 00000000..b4492585 --- /dev/null +++ b/_sources/api/psy_simple.plugin.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.plugin + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/psy_simple.rst.txt b/_sources/api/psy_simple.rst.txt new file mode 100644 index 00000000..21d9f9a0 --- /dev/null +++ b/_sources/api/psy_simple.rst.txt @@ -0,0 +1,26 @@ +psy\_simple package +=================== + +.. automodule:: psy_simple + :members: + :undoc-members: + :show-inheritance: + +Subpackages +----------- + +.. toctree:: + :maxdepth: 4 + + psy_simple.widgets + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + psy_simple.base + psy_simple.colors + psy_simple.plotters + psy_simple.plugin diff --git a/_sources/api/psy_simple.widgets.colors.rst.txt b/_sources/api/psy_simple.widgets.colors.rst.txt new file mode 100644 index 00000000..57f7591d --- /dev/null +++ b/_sources/api/psy_simple.widgets.colors.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.widgets.colors + :members: + :undoc-members: + :show-inheritance: diff --git a/_sources/api/psy_simple.widgets.rst.txt b/_sources/api/psy_simple.widgets.rst.txt new file mode 100644 index 00000000..da7bac89 --- /dev/null +++ b/_sources/api/psy_simple.widgets.rst.txt @@ -0,0 +1,16 @@ +psy\_simple.widgets package +=========================== + +.. automodule:: psy_simple.widgets + :members: + :undoc-members: + :show-inheritance: + +Submodules +---------- + +.. toctree:: + :maxdepth: 4 + + psy_simple.widgets.colors + psy_simple.widgets.texts diff --git a/_sources/api/psy_simple.widgets.texts.rst.txt b/_sources/api/psy_simple.widgets.texts.rst.txt new file mode 100644 index 00000000..f9cf971e --- /dev/null +++ b/_sources/api/psy_simple.widgets.texts.rst.txt @@ -0,0 +1,4 @@ +.. automodule:: psy_simple.widgets.texts + :members: + :undoc-members: + :show-inheritance: diff --git a/docs/changelog.rst b/_sources/changelog.rst.txt similarity index 100% rename from docs/changelog.rst rename to _sources/changelog.rst.txt diff --git a/docs/contributing.rst b/_sources/contributing.rst.txt similarity index 100% rename from docs/contributing.rst rename to _sources/contributing.rst.txt diff --git a/_sources/generated/psyplot.project.plot.barplot.rst.txt b/_sources/generated/psyplot.project.plot.barplot.rst.txt new file mode 100644 index 00000000..3b453999 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.barplot.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.barplot +============================ + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.barplot \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.combined.rst.txt b/_sources/generated/psyplot.project.plot.combined.rst.txt new file mode 100644 index 00000000..f0d406e3 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.combined.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.combined +============================= + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.combined \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.density.rst.txt b/_sources/generated/psyplot.project.plot.density.rst.txt new file mode 100644 index 00000000..c8329703 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.density.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.density +============================ + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.density \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.fldmean.rst.txt b/_sources/generated/psyplot.project.plot.fldmean.rst.txt new file mode 100644 index 00000000..1b0a3cd6 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.fldmean.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.fldmean +============================ + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.fldmean \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.lineplot.rst.txt b/_sources/generated/psyplot.project.plot.lineplot.rst.txt new file mode 100644 index 00000000..4689ef87 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.lineplot.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.lineplot +============================= + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.lineplot \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.plot2d.rst.txt b/_sources/generated/psyplot.project.plot.plot2d.rst.txt new file mode 100644 index 00000000..2bfe0b89 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.plot2d.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.plot2d +=========================== + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.plot2d \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.vector.rst.txt b/_sources/generated/psyplot.project.plot.vector.rst.txt new file mode 100644 index 00000000..302893b3 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.vector.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.vector +=========================== + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.vector \ No newline at end of file diff --git a/_sources/generated/psyplot.project.plot.violinplot.rst.txt b/_sources/generated/psyplot.project.plot.violinplot.rst.txt new file mode 100644 index 00000000..69a91ce3 --- /dev/null +++ b/_sources/generated/psyplot.project.plot.violinplot.rst.txt @@ -0,0 +1,6 @@ +psyplot.project.plot.violinplot +=============================== + +.. currentmodule:: psyplot.project + +.. autoattribute:: plot.violinplot \ No newline at end of file diff --git a/docs/index.rst b/_sources/index.rst.txt similarity index 100% rename from docs/index.rst rename to _sources/index.rst.txt diff --git a/docs/installation.rst b/_sources/installation.rst.txt similarity index 100% rename from docs/installation.rst rename to _sources/installation.rst.txt diff --git a/docs/plot_methods.rst b/_sources/plot_methods.rst.txt similarity index 100% rename from docs/plot_methods.rst rename to _sources/plot_methods.rst.txt diff --git a/_sphinx_design_static/design-tabs.js b/_sphinx_design_static/design-tabs.js new file mode 100644 index 00000000..b25bd6a4 --- /dev/null +++ b/_sphinx_design_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_sphinx_design_static/sphinx-design.min.css b/_sphinx_design_static/sphinx-design.min.css new file mode 100644 index 00000000..a325746f --- /dev/null +++ b/_sphinx_design_static/sphinx-design.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/_static/_sphinx_javascript_frameworks_compat.js b/_static/_sphinx_javascript_frameworks_compat.js new file mode 100644 index 00000000..81415803 --- /dev/null +++ b/_static/_sphinx_javascript_frameworks_compat.js @@ -0,0 +1,123 @@ +/* Compatability shim for jQuery and underscores.js. + * + * Copyright Sphinx contributors + * Released under the two clause BSD licence + */ + +/** + * small helper function to urldecode strings + * + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/decodeURIComponent#Decoding_query_parameters_from_a_URL + */ +jQuery.urldecode = function(x) { + if (!x) { + return x + } + return decodeURIComponent(x.replace(/\+/g, ' ')); +}; + +/** + * small helper function to urlencode strings + */ +jQuery.urlencode = encodeURIComponent; + +/** + * This function returns the parsed url parameters of the + * current request. Multiple values per key are supported, + * it will always return arrays of strings for the value parts. + */ +jQuery.getQueryParameters = function(s) { + if (typeof s === 'undefined') + s = document.location.search; + var parts = s.substr(s.indexOf('?') + 1).split('&'); + var result = {}; + for (var i = 0; i < parts.length; i++) { + var tmp = parts[i].split('=', 2); + var key = jQuery.urldecode(tmp[0]); + var value = jQuery.urldecode(tmp[1]); + if (key in result) + result[key].push(value); + else + result[key] = [value]; + } + return result; +}; + +/** + * highlight a given string on a jquery object by wrapping it in + * span elements with the given class name. + */ +jQuery.fn.highlightText = function(text, className) { + function highlight(node, addItems) { + if (node.nodeType === 3) { + var val = node.nodeValue; + var pos = val.toLowerCase().indexOf(text); + if (pos >= 0 && + !jQuery(node.parentNode).hasClass(className) && + !jQuery(node.parentNode).hasClass("nohighlight")) { + var span; + var isInSVG = jQuery(node).closest("body, svg, foreignObject").is("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.className = className; + } + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + node.parentNode.insertBefore(span, node.parentNode.insertBefore( + document.createTextNode(val.substr(pos + text.length)), + node.nextSibling)); + node.nodeValue = val.substr(0, pos); + if (isInSVG) { + var rect = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + var bbox = node.parentElement.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute('class', className); + addItems.push({ + "parent": node.parentNode, + "target": rect}); + } + } + } + else if (!jQuery(node).is("button, select, textarea")) { + jQuery.each(node.childNodes, function() { + highlight(this, addItems); + }); + } + } + var addItems = []; + var result = this.each(function() { + highlight(this, addItems); + }); + for (var i = 0; i < addItems.length; ++i) { + jQuery(addItems[i].parent).before(addItems[i].target); + } + return result; +}; + +/* + * backward compatibility for jQuery.browser + * This will be supported until firefox bug is fixed. + */ +if (!jQuery.browser) { + jQuery.uaMatch = function(ua) { + ua = ua.toLowerCase(); + + var match = /(chrome)[ \/]([\w.]+)/.exec(ua) || + /(webkit)[ \/]([\w.]+)/.exec(ua) || + /(opera)(?:.*version|)[ \/]([\w.]+)/.exec(ua) || + /(msie) ([\w.]+)/.exec(ua) || + ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec(ua) || + []; + + return { + browser: match[ 1 ] || "", + version: match[ 2 ] || "0" + }; + }; + jQuery.browser = {}; + jQuery.browser[jQuery.uaMatch(navigator.userAgent).browser] = true; +} diff --git a/_static/basic.css b/_static/basic.css new file mode 100644 index 00000000..f316efcb --- /dev/null +++ b/_static/basic.css @@ -0,0 +1,925 @@ +/* + * basic.css + * ~~~~~~~~~ + * + * Sphinx stylesheet -- basic theme. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ + +/* -- main layout ----------------------------------------------------------- */ + +div.clearer { + clear: both; +} + +div.section::after { + display: block; + content: ''; + clear: left; +} + +/* -- relbar ---------------------------------------------------------------- */ + +div.related { + width: 100%; + font-size: 90%; +} + +div.related h3 { + display: none; +} + +div.related ul { + margin: 0; + padding: 0 0 0 10px; + list-style: none; +} + +div.related li { + display: inline; +} + +div.related li.right { + float: right; + margin-right: 5px; +} + +/* -- sidebar --------------------------------------------------------------- */ + +div.sphinxsidebarwrapper { + padding: 10px 5px 0 10px; +} + +div.sphinxsidebar { + float: left; + width: 230px; + margin-left: -100%; + font-size: 90%; + word-wrap: break-word; + overflow-wrap : break-word; +} + +div.sphinxsidebar ul { + list-style: none; +} + +div.sphinxsidebar ul ul, +div.sphinxsidebar ul.want-points { + margin-left: 20px; + list-style: square; +} + +div.sphinxsidebar ul ul { + margin-top: 0; + margin-bottom: 0; +} + +div.sphinxsidebar form { + margin-top: 10px; +} + +div.sphinxsidebar input { + border: 1px solid #98dbcc; + font-family: sans-serif; + font-size: 1em; +} + +div.sphinxsidebar #searchbox form.search { + overflow: hidden; +} + +div.sphinxsidebar #searchbox input[type="text"] { + float: left; + width: 80%; + padding: 0.25em; + box-sizing: border-box; +} + +div.sphinxsidebar #searchbox input[type="submit"] { + float: left; + width: 20%; + border-left: none; + padding: 0.25em; + box-sizing: border-box; +} + + +img { + border: 0; + max-width: 100%; +} + +/* -- search page ----------------------------------------------------------- */ + +ul.search { + margin: 10px 0 0 20px; + padding: 0; +} + +ul.search li { + padding: 5px 0 5px 20px; + background-image: url(file.png); + background-repeat: no-repeat; + background-position: 0 7px; +} + +ul.search li a { + font-weight: bold; +} + +ul.search li p.context { + color: #888; + margin: 2px 0 0 30px; + text-align: left; +} + +ul.keywordmatches li.goodmatch a { + font-weight: bold; +} + +/* -- index page ------------------------------------------------------------ */ + +table.contentstable { + width: 90%; + margin-left: auto; + margin-right: auto; +} + +table.contentstable p.biglink { + line-height: 150%; +} + +a.biglink { + font-size: 1.3em; +} + +span.linkdescr { + font-style: italic; + padding-top: 5px; + font-size: 90%; +} + +/* -- general index --------------------------------------------------------- */ + +table.indextable { + width: 100%; +} + +table.indextable td { + text-align: left; + vertical-align: top; +} + +table.indextable ul { + margin-top: 0; + margin-bottom: 0; + list-style-type: none; +} + +table.indextable > tbody > tr > td > ul { + padding-left: 0em; +} + +table.indextable tr.pcap { + height: 10px; +} + +table.indextable tr.cap { + margin-top: 10px; + background-color: #f2f2f2; +} + +img.toggler { + margin-right: 3px; + margin-top: 3px; + cursor: pointer; +} + +div.modindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +div.genindex-jumpbox { + border-top: 1px solid #ddd; + border-bottom: 1px solid #ddd; + margin: 1em 0 1em 0; + padding: 0.4em; +} + +/* -- domain module index --------------------------------------------------- */ + +table.modindextable td { + padding: 2px; + border-collapse: collapse; +} + +/* -- general body styles --------------------------------------------------- */ + +div.body { + min-width: 360px; + max-width: 800px; +} + +div.body p, div.body dd, div.body li, div.body blockquote { + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; +} + +a.headerlink { + visibility: hidden; +} + +a:visited { + color: #551A8B; +} + +h1:hover > a.headerlink, +h2:hover > a.headerlink, +h3:hover > a.headerlink, +h4:hover > a.headerlink, +h5:hover > a.headerlink, +h6:hover > a.headerlink, +dt:hover > a.headerlink, +caption:hover > a.headerlink, +p.caption:hover > a.headerlink, +div.code-block-caption:hover > a.headerlink { + visibility: visible; +} + +div.body p.caption { + text-align: inherit; +} + +div.body td { + text-align: left; +} + +.first { + margin-top: 0 !important; +} + +p.rubric { + margin-top: 30px; + font-weight: bold; +} + +img.align-left, figure.align-left, .figure.align-left, object.align-left { + clear: left; + float: left; + margin-right: 1em; +} + +img.align-right, figure.align-right, .figure.align-right, object.align-right { + clear: right; + float: right; + margin-left: 1em; +} + +img.align-center, figure.align-center, .figure.align-center, object.align-center { + display: block; + margin-left: auto; + margin-right: auto; +} + +img.align-default, figure.align-default, .figure.align-default { + display: block; + margin-left: auto; + margin-right: auto; +} + +.align-left { + text-align: left; +} + +.align-center { + text-align: center; +} + +.align-default { + text-align: center; +} + +.align-right { + text-align: right; +} + +/* -- sidebars -------------------------------------------------------------- */ + +div.sidebar, +aside.sidebar { + margin: 0 0 0.5em 1em; + border: 1px solid #ddb; + padding: 7px; + background-color: #ffe; + width: 40%; + float: right; + clear: right; + overflow-x: auto; +} + +p.sidebar-title { + font-weight: bold; +} + +nav.contents, +aside.topic, +div.admonition, div.topic, blockquote { + clear: left; +} + +/* -- topics ---------------------------------------------------------------- */ + +nav.contents, +aside.topic, +div.topic { + border: 1px solid #ccc; + padding: 7px; + margin: 10px 0 10px 0; +} + +p.topic-title { + font-size: 1.1em; + font-weight: bold; + margin-top: 10px; +} + +/* -- admonitions ----------------------------------------------------------- */ + +div.admonition { + margin-top: 10px; + margin-bottom: 10px; + padding: 7px; +} + +div.admonition dt { + font-weight: bold; +} + +p.admonition-title { + margin: 0px 10px 5px 0px; + font-weight: bold; +} + +div.body p.centered { + text-align: center; + margin-top: 25px; +} + +/* -- content of sidebars/topics/admonitions -------------------------------- */ + +div.sidebar > :last-child, +aside.sidebar > :last-child, +nav.contents > :last-child, +aside.topic > :last-child, +div.topic > :last-child, +div.admonition > :last-child { + margin-bottom: 0; +} + +div.sidebar::after, +aside.sidebar::after, +nav.contents::after, +aside.topic::after, +div.topic::after, +div.admonition::after, +blockquote::after { + display: block; + content: ''; + clear: both; +} + +/* -- tables ---------------------------------------------------------------- */ + +table.docutils { + margin-top: 10px; + margin-bottom: 10px; + border: 0; + border-collapse: collapse; +} + +table.align-center { + margin-left: auto; + margin-right: auto; +} + +table.align-default { + margin-left: auto; + margin-right: auto; +} + +table caption span.caption-number { + font-style: italic; +} + +table caption span.caption-text { +} + +table.docutils td, table.docutils th { + padding: 1px 8px 1px 5px; + border-top: 0; + border-left: 0; + border-right: 0; + border-bottom: 1px solid #aaa; +} + +th { + text-align: left; + padding-right: 5px; +} + +table.citation { + border-left: solid 1px gray; + margin-left: 1px; +} + +table.citation td { + border-bottom: none; +} + +th > :first-child, +td > :first-child { + margin-top: 0px; +} + +th > :last-child, +td > :last-child { + margin-bottom: 0px; +} + +/* -- figures --------------------------------------------------------------- */ + +div.figure, figure { + margin: 0.5em; + padding: 0.5em; +} + +div.figure p.caption, figcaption { + padding: 0.3em; +} + +div.figure p.caption span.caption-number, +figcaption span.caption-number { + font-style: italic; +} + +div.figure p.caption span.caption-text, +figcaption span.caption-text { +} + +/* -- field list styles ----------------------------------------------------- */ + +table.field-list td, table.field-list th { + border: 0 !important; +} + +.field-list ul { + margin: 0; + padding-left: 1em; +} + +.field-list p { + margin: 0; +} + +.field-name { + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; + hyphens: manual; +} + +/* -- hlist styles ---------------------------------------------------------- */ + +table.hlist { + margin: 1em 0; +} + +table.hlist td { + vertical-align: top; +} + +/* -- object description styles --------------------------------------------- */ + +.sig { + font-family: 'Consolas', 'Menlo', 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', monospace; +} + +.sig-name, code.descname { + background-color: transparent; + font-weight: bold; +} + +.sig-name { + font-size: 1.1em; +} + +code.descname { + font-size: 1.2em; +} + +.sig-prename, code.descclassname { + background-color: transparent; +} + +.optional { + font-size: 1.3em; +} + +.sig-paren { + font-size: larger; +} + +.sig-param.n { + font-style: italic; +} + +/* C++ specific styling */ + +.sig-inline.c-texpr, +.sig-inline.cpp-texpr { + font-family: unset; +} + +.sig.c .k, .sig.c .kt, +.sig.cpp .k, .sig.cpp .kt { + color: #0033B3; +} + +.sig.c .m, +.sig.cpp .m { + color: #1750EB; +} + +.sig.c .s, .sig.c .sc, +.sig.cpp .s, .sig.cpp .sc { + color: #067D17; +} + + +/* -- other body styles ----------------------------------------------------- */ + +ol.arabic { + list-style: decimal; +} + +ol.loweralpha { + list-style: lower-alpha; +} + +ol.upperalpha { + list-style: upper-alpha; +} + +ol.lowerroman { + list-style: lower-roman; +} + +ol.upperroman { + list-style: upper-roman; +} + +:not(li) > ol > li:first-child > :first-child, +:not(li) > ul > li:first-child > :first-child { + margin-top: 0px; +} + +:not(li) > ol > li:last-child > :last-child, +:not(li) > ul > li:last-child > :last-child { + margin-bottom: 0px; +} + +ol.simple ol p, +ol.simple ul p, +ul.simple ol p, +ul.simple ul p { + margin-top: 0; +} + +ol.simple > li:not(:first-child) > p, +ul.simple > li:not(:first-child) > p { + margin-top: 0; +} + +ol.simple p, +ul.simple p { + margin-bottom: 0; +} + +aside.footnote > span, +div.citation > span { + float: left; +} +aside.footnote > span:last-of-type, +div.citation > span:last-of-type { + padding-right: 0.5em; +} +aside.footnote > p { + margin-left: 2em; +} +div.citation > p { + margin-left: 4em; +} +aside.footnote > p:last-of-type, +div.citation > p:last-of-type { + margin-bottom: 0em; +} +aside.footnote > p:last-of-type:after, +div.citation > p:last-of-type:after { + content: ""; + clear: both; +} + +dl.field-list { + display: grid; + grid-template-columns: fit-content(30%) auto; +} + +dl.field-list > dt { + font-weight: bold; + word-break: break-word; + padding-left: 0.5em; + padding-right: 5px; +} + +dl.field-list > dd { + padding-left: 0.5em; + margin-top: 0em; + margin-left: 0em; + margin-bottom: 0em; +} + +dl { + margin-bottom: 15px; +} + +dd > :first-child { + margin-top: 0px; +} + +dd ul, dd table { + margin-bottom: 10px; +} + +dd { + margin-top: 3px; + margin-bottom: 10px; + margin-left: 30px; +} + +.sig dd { + margin-top: 0px; + margin-bottom: 0px; +} + +.sig dl { + margin-top: 0px; + margin-bottom: 0px; +} + +dl > dd:last-child, +dl > dd:last-child > :last-child { + margin-bottom: 0; +} + +dt:target, span.highlighted { + background-color: #fbe54e; +} + +rect.highlighted { + fill: #fbe54e; +} + +dl.glossary dt { + font-weight: bold; + font-size: 1.1em; +} + +.versionmodified { + font-style: italic; +} + +.system-message { + background-color: #fda; + padding: 5px; + border: 3px solid red; +} + +.footnote:target { + background-color: #ffa; +} + +.line-block { + display: block; + margin-top: 1em; + margin-bottom: 1em; +} + +.line-block .line-block { + margin-top: 0; + margin-bottom: 0; + margin-left: 1.5em; +} + +.guilabel, .menuselection { + font-family: sans-serif; +} + +.accelerator { + text-decoration: underline; +} + +.classifier { + font-style: oblique; +} + +.classifier:before { + font-style: normal; + margin: 0 0.5em; + content: ":"; + display: inline-block; +} + +abbr, acronym { + border-bottom: dotted 1px; + cursor: help; +} + +.translated { + background-color: rgba(207, 255, 207, 0.2) +} + +.untranslated { + background-color: rgba(255, 207, 207, 0.2) +} + +/* -- code displays --------------------------------------------------------- */ + +pre { + overflow: auto; + overflow-y: hidden; /* fixes display issues on Chrome browsers */ +} + +pre, div[class*="highlight-"] { + clear: both; +} + +span.pre { + -moz-hyphens: none; + -ms-hyphens: none; + -webkit-hyphens: none; + hyphens: none; + white-space: nowrap; +} + +div[class*="highlight-"] { + margin: 1em 0; +} + +td.linenos pre { + border: 0; + background-color: transparent; + color: #aaa; +} + +table.highlighttable { + display: block; +} + +table.highlighttable tbody { + display: block; +} + +table.highlighttable tr { + display: flex; +} + +table.highlighttable td { + margin: 0; + padding: 0; +} + +table.highlighttable td.linenos { + padding-right: 0.5em; +} + +table.highlighttable td.code { + flex: 1; + overflow: hidden; +} + +.highlight .hll { + display: block; +} + +div.highlight pre, +table.highlighttable pre { + margin: 0; +} + +div.code-block-caption + div { + margin-top: 0; +} + +div.code-block-caption { + margin-top: 1em; + padding: 2px 5px; + font-size: small; +} + +div.code-block-caption code { + background-color: transparent; +} + +table.highlighttable td.linenos, +span.linenos, +div.highlight span.gp { /* gp: Generic.Prompt */ + user-select: none; + -webkit-user-select: text; /* Safari fallback only */ + -webkit-user-select: none; /* Chrome/Safari */ + -moz-user-select: none; /* Firefox */ + -ms-user-select: none; /* IE10+ */ +} + +div.code-block-caption span.caption-number { + padding: 0.1em 0.3em; + font-style: italic; +} + +div.code-block-caption span.caption-text { +} + +div.literal-block-wrapper { + margin: 1em 0; +} + +code.xref, a code { + background-color: transparent; + font-weight: bold; +} + +h1 code, h2 code, h3 code, h4 code, h5 code, h6 code { + background-color: transparent; +} + +.viewcode-link { + float: right; +} + +.viewcode-back { + float: right; + font-family: sans-serif; +} + +div.viewcode-block:target { + margin: -1px -10px; + padding: 0 10px; +} + +/* -- math display ---------------------------------------------------------- */ + +img.math { + vertical-align: middle; +} + +div.body div.math p { + text-align: center; +} + +span.eqno { + float: right; +} + +span.eqno a.headerlink { + position: absolute; + z-index: 1; +} + +div.math:hover a.headerlink { + visibility: visible; +} + +/* -- printout stylesheet --------------------------------------------------- */ + +@media print { + div.document, + div.documentwrapper, + div.bodywrapper { + margin: 0 !important; + width: 100%; + } + + div.sphinxsidebar, + div.related, + div.footer, + #top-link { + display: none; + } +} \ No newline at end of file diff --git a/_static/css/badge_only.css b/_static/css/badge_only.css new file mode 100644 index 00000000..c718cee4 --- /dev/null +++ b/_static/css/badge_only.css @@ -0,0 +1 @@ +.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}@font-face{font-family:FontAwesome;font-style:normal;font-weight:400;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#FontAwesome) format("svg")}.fa:before{font-family:FontAwesome;font-style:normal;font-weight:400;line-height:1}.fa:before,a .fa{text-decoration:inherit}.fa:before,a .fa,li .fa{display:inline-block}li .fa-large:before{width:1.875em}ul.fas{list-style-type:none;margin-left:2em;text-indent:-.8em}ul.fas li .fa{width:.8em}ul.fas li .fa-large:before{vertical-align:baseline}.fa-book:before,.icon-book:before{content:"\f02d"}.fa-caret-down:before,.icon-caret-down:before{content:"\f0d7"}.fa-caret-up:before,.icon-caret-up:before{content:"\f0d8"}.fa-caret-left:before,.icon-caret-left:before{content:"\f0d9"}.fa-caret-right:before,.icon-caret-right:before{content:"\f0da"}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60}.rst-versions .rst-current-version:after{clear:both;content:"";display:block}.rst-versions .rst-current-version .fa{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}} \ No newline at end of file diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff b/_static/css/fonts/Roboto-Slab-Bold.woff new file mode 100644 index 00000000..6cb60000 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Bold.woff2 b/_static/css/fonts/Roboto-Slab-Bold.woff2 new file mode 100644 index 00000000..7059e231 Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Bold.woff2 differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff b/_static/css/fonts/Roboto-Slab-Regular.woff new file mode 100644 index 00000000..f815f63f Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff differ diff --git a/_static/css/fonts/Roboto-Slab-Regular.woff2 b/_static/css/fonts/Roboto-Slab-Regular.woff2 new file mode 100644 index 00000000..f2c76e5b Binary files /dev/null and b/_static/css/fonts/Roboto-Slab-Regular.woff2 differ diff --git a/_static/css/fonts/fontawesome-webfont.eot b/_static/css/fonts/fontawesome-webfont.eot new file mode 100644 index 00000000..e9f60ca9 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.eot differ diff --git a/_static/css/fonts/fontawesome-webfont.svg b/_static/css/fonts/fontawesome-webfont.svg new file mode 100644 index 00000000..855c845e --- /dev/null +++ b/_static/css/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/_static/css/fonts/fontawesome-webfont.ttf b/_static/css/fonts/fontawesome-webfont.ttf new file mode 100644 index 00000000..35acda2f Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.ttf differ diff --git a/_static/css/fonts/fontawesome-webfont.woff b/_static/css/fonts/fontawesome-webfont.woff new file mode 100644 index 00000000..400014a4 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff differ diff --git a/_static/css/fonts/fontawesome-webfont.woff2 b/_static/css/fonts/fontawesome-webfont.woff2 new file mode 100644 index 00000000..4d13fc60 Binary files /dev/null and b/_static/css/fonts/fontawesome-webfont.woff2 differ diff --git a/_static/css/fonts/lato-bold-italic.woff b/_static/css/fonts/lato-bold-italic.woff new file mode 100644 index 00000000..88ad05b9 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff differ diff --git a/_static/css/fonts/lato-bold-italic.woff2 b/_static/css/fonts/lato-bold-italic.woff2 new file mode 100644 index 00000000..c4e3d804 Binary files /dev/null and b/_static/css/fonts/lato-bold-italic.woff2 differ diff --git a/_static/css/fonts/lato-bold.woff b/_static/css/fonts/lato-bold.woff new file mode 100644 index 00000000..c6dff51f Binary files /dev/null and b/_static/css/fonts/lato-bold.woff differ diff --git a/_static/css/fonts/lato-bold.woff2 b/_static/css/fonts/lato-bold.woff2 new file mode 100644 index 00000000..bb195043 Binary files /dev/null and b/_static/css/fonts/lato-bold.woff2 differ diff --git a/_static/css/fonts/lato-normal-italic.woff b/_static/css/fonts/lato-normal-italic.woff new file mode 100644 index 00000000..76114bc0 Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff differ diff --git a/_static/css/fonts/lato-normal-italic.woff2 b/_static/css/fonts/lato-normal-italic.woff2 new file mode 100644 index 00000000..3404f37e Binary files /dev/null and b/_static/css/fonts/lato-normal-italic.woff2 differ diff --git a/_static/css/fonts/lato-normal.woff b/_static/css/fonts/lato-normal.woff new file mode 100644 index 00000000..ae1307ff Binary files /dev/null and b/_static/css/fonts/lato-normal.woff differ diff --git a/_static/css/fonts/lato-normal.woff2 b/_static/css/fonts/lato-normal.woff2 new file mode 100644 index 00000000..3bf98433 Binary files /dev/null and b/_static/css/fonts/lato-normal.woff2 differ diff --git a/_static/css/theme.css b/_static/css/theme.css new file mode 100644 index 00000000..19a446a0 --- /dev/null +++ b/_static/css/theme.css @@ -0,0 +1,4 @@ +html{box-sizing:border-box}*,:after,:before{box-sizing:inherit}article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio,canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden],audio:not([controls]){display:none}*{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%}body{margin:0}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:700}blockquote{margin:0}dfn{font-style:italic}ins{background:#ff9;text-decoration:none}ins,mark{color:#000}mark{background:#ff0;font-style:italic;font-weight:700}.rst-content code,.rst-content tt,code,kbd,pre,samp{font-family:monospace,serif;_font-family:courier new,monospace;font-size:1em}pre{white-space:pre}q{quotes:none}q:after,q:before{content:"";content:none}small{font-size:85%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-.5em}sub{bottom:-.25em}dl,ol,ul{margin:0;padding:0;list-style:none;list-style-image:none}li{list-style:none}dd{margin:0}img{border:0;-ms-interpolation-mode:bicubic;vertical-align:middle;max-width:100%}svg:not(:root){overflow:hidden}figure,form{margin:0}label{cursor:pointer}button,input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}button,input{line-height:normal}button,input[type=button],input[type=reset],input[type=submit]{cursor:pointer;-webkit-appearance:button;*overflow:visible}button[disabled],input[disabled]{cursor:default}input[type=search]{-webkit-appearance:textfield;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}textarea{resize:vertical}table{border-collapse:collapse;border-spacing:0}td{vertical-align:top}.chromeframe{margin:.2em 0;background:#ccc;color:#000;padding:.2em 0}.ir{display:block;border:0;text-indent:-999em;overflow:hidden;background-color:transparent;background-repeat:no-repeat;text-align:left;direction:ltr;*line-height:0}.ir br{display:none}.hidden{display:none!important;visibility:hidden}.visuallyhidden{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.visuallyhidden.focusable:active,.visuallyhidden.focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}.invisible{visibility:hidden}.relative{position:relative}big,small{font-size:100%}@media print{body,html,section{background:none!important}*{box-shadow:none!important;text-shadow:none!important;filter:none!important;-ms-filter:none!important}a,a:visited{text-decoration:underline}.ir a:after,a[href^="#"]:after,a[href^="javascript:"]:after{content:""}blockquote,pre{page-break-inside:avoid}thead{display:table-header-group}img,tr{page-break-inside:avoid}img{max-width:100%!important}@page{margin:.5cm}.rst-content .toctree-wrapper>p.caption,h2,h3,p{orphans:3;widows:3}.rst-content .toctree-wrapper>p.caption,h2,h3{page-break-after:avoid}}.btn,.fa:before,.icon:before,.rst-content .admonition,.rst-content .admonition-title:before,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .code-block-caption .headerlink:before,.rst-content .danger,.rst-content .eqno .headerlink:before,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-alert,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before,input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week],select,textarea{-webkit-font-smoothing:antialiased}.clearfix{*zoom:1}.clearfix:after,.clearfix:before{display:table;content:""}.clearfix:after{clear:both}/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:FontAwesome;src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713);src:url(fonts/fontawesome-webfont.eot?674f50d287a8c48dc19ba404d20fe713?#iefix&v=4.7.0) format("embedded-opentype"),url(fonts/fontawesome-webfont.woff2?af7ae505a9eed503f8b8e6982036873e) format("woff2"),url(fonts/fontawesome-webfont.woff?fee66e712a8a08eef5805a46892932ad) format("woff"),url(fonts/fontawesome-webfont.ttf?b06871f281fee6b241d60582ae9369b9) format("truetype"),url(fonts/fontawesome-webfont.svg?912ec66d7572ff821749319396470bde#fontawesomeregular) format("svg");font-weight:400;font-style:normal}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14286em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14286em;width:2.14286em;top:.14286em;text-align:center}.fa-li.fa-lg{left:-1.85714em}.fa-border{padding:.2em .25em .15em;border:.08em solid #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa-pull-left.icon,.fa.fa-pull-left,.rst-content .code-block-caption .fa-pull-left.headerlink,.rst-content .eqno .fa-pull-left.headerlink,.rst-content .fa-pull-left.admonition-title,.rst-content code.download span.fa-pull-left:first-child,.rst-content dl dt .fa-pull-left.headerlink,.rst-content h1 .fa-pull-left.headerlink,.rst-content h2 .fa-pull-left.headerlink,.rst-content h3 .fa-pull-left.headerlink,.rst-content h4 .fa-pull-left.headerlink,.rst-content h5 .fa-pull-left.headerlink,.rst-content h6 .fa-pull-left.headerlink,.rst-content p .fa-pull-left.headerlink,.rst-content table>caption .fa-pull-left.headerlink,.rst-content tt.download span.fa-pull-left:first-child,.wy-menu-vertical li.current>a button.fa-pull-left.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-left.toctree-expand,.wy-menu-vertical li button.fa-pull-left.toctree-expand{margin-right:.3em}.fa-pull-right.icon,.fa.fa-pull-right,.rst-content .code-block-caption .fa-pull-right.headerlink,.rst-content .eqno .fa-pull-right.headerlink,.rst-content .fa-pull-right.admonition-title,.rst-content code.download span.fa-pull-right:first-child,.rst-content dl dt .fa-pull-right.headerlink,.rst-content h1 .fa-pull-right.headerlink,.rst-content h2 .fa-pull-right.headerlink,.rst-content h3 .fa-pull-right.headerlink,.rst-content h4 .fa-pull-right.headerlink,.rst-content h5 .fa-pull-right.headerlink,.rst-content h6 .fa-pull-right.headerlink,.rst-content p .fa-pull-right.headerlink,.rst-content table>caption .fa-pull-right.headerlink,.rst-content tt.download span.fa-pull-right:first-child,.wy-menu-vertical li.current>a button.fa-pull-right.toctree-expand,.wy-menu-vertical li.on a button.fa-pull-right.toctree-expand,.wy-menu-vertical li button.fa-pull-right.toctree-expand{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left,.pull-left.icon,.rst-content .code-block-caption .pull-left.headerlink,.rst-content .eqno .pull-left.headerlink,.rst-content .pull-left.admonition-title,.rst-content code.download span.pull-left:first-child,.rst-content dl dt .pull-left.headerlink,.rst-content h1 .pull-left.headerlink,.rst-content h2 .pull-left.headerlink,.rst-content h3 .pull-left.headerlink,.rst-content h4 .pull-left.headerlink,.rst-content h5 .pull-left.headerlink,.rst-content h6 .pull-left.headerlink,.rst-content p .pull-left.headerlink,.rst-content table>caption .pull-left.headerlink,.rst-content tt.download span.pull-left:first-child,.wy-menu-vertical li.current>a button.pull-left.toctree-expand,.wy-menu-vertical li.on a button.pull-left.toctree-expand,.wy-menu-vertical li button.pull-left.toctree-expand{margin-right:.3em}.fa.pull-right,.pull-right.icon,.rst-content .code-block-caption .pull-right.headerlink,.rst-content .eqno .pull-right.headerlink,.rst-content .pull-right.admonition-title,.rst-content code.download span.pull-right:first-child,.rst-content dl dt .pull-right.headerlink,.rst-content h1 .pull-right.headerlink,.rst-content h2 .pull-right.headerlink,.rst-content h3 .pull-right.headerlink,.rst-content h4 .pull-right.headerlink,.rst-content h5 .pull-right.headerlink,.rst-content h6 .pull-right.headerlink,.rst-content p .pull-right.headerlink,.rst-content table>caption .pull-right.headerlink,.rst-content tt.download span.pull-right:first-child,.wy-menu-vertical li.current>a button.pull-right.toctree-expand,.wy-menu-vertical li.on a button.pull-right.toctree-expand,.wy-menu-vertical li button.pull-right.toctree-expand{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);-ms-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scaleY(-1);-ms-transform:scaleY(-1);transform:scaleY(-1)}:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:""}.fa-music:before{content:""}.fa-search:before,.icon-search:before{content:""}.fa-envelope-o:before{content:""}.fa-heart:before{content:""}.fa-star:before{content:""}.fa-star-o:before{content:""}.fa-user:before{content:""}.fa-film:before{content:""}.fa-th-large:before{content:""}.fa-th:before{content:""}.fa-th-list:before{content:""}.fa-check:before{content:""}.fa-close:before,.fa-remove:before,.fa-times:before{content:""}.fa-search-plus:before{content:""}.fa-search-minus:before{content:""}.fa-power-off:before{content:""}.fa-signal:before{content:""}.fa-cog:before,.fa-gear:before{content:""}.fa-trash-o:before{content:""}.fa-home:before,.icon-home:before{content:""}.fa-file-o:before{content:""}.fa-clock-o:before{content:""}.fa-road:before{content:""}.fa-download:before,.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{content:""}.fa-arrow-circle-o-down:before{content:""}.fa-arrow-circle-o-up:before{content:""}.fa-inbox:before{content:""}.fa-play-circle-o:before{content:""}.fa-repeat:before,.fa-rotate-right:before{content:""}.fa-refresh:before{content:""}.fa-list-alt:before{content:""}.fa-lock:before{content:""}.fa-flag:before{content:""}.fa-headphones:before{content:""}.fa-volume-off:before{content:""}.fa-volume-down:before{content:""}.fa-volume-up:before{content:""}.fa-qrcode:before{content:""}.fa-barcode:before{content:""}.fa-tag:before{content:""}.fa-tags:before{content:""}.fa-book:before,.icon-book:before{content:""}.fa-bookmark:before{content:""}.fa-print:before{content:""}.fa-camera:before{content:""}.fa-font:before{content:""}.fa-bold:before{content:""}.fa-italic:before{content:""}.fa-text-height:before{content:""}.fa-text-width:before{content:""}.fa-align-left:before{content:""}.fa-align-center:before{content:""}.fa-align-right:before{content:""}.fa-align-justify:before{content:""}.fa-list:before{content:""}.fa-dedent:before,.fa-outdent:before{content:""}.fa-indent:before{content:""}.fa-video-camera:before{content:""}.fa-image:before,.fa-photo:before,.fa-picture-o:before{content:""}.fa-pencil:before{content:""}.fa-map-marker:before{content:""}.fa-adjust:before{content:""}.fa-tint:before{content:""}.fa-edit:before,.fa-pencil-square-o:before{content:""}.fa-share-square-o:before{content:""}.fa-check-square-o:before{content:""}.fa-arrows:before{content:""}.fa-step-backward:before{content:""}.fa-fast-backward:before{content:""}.fa-backward:before{content:""}.fa-play:before{content:""}.fa-pause:before{content:""}.fa-stop:before{content:""}.fa-forward:before{content:""}.fa-fast-forward:before{content:""}.fa-step-forward:before{content:""}.fa-eject:before{content:""}.fa-chevron-left:before{content:""}.fa-chevron-right:before{content:""}.fa-plus-circle:before{content:""}.fa-minus-circle:before{content:""}.fa-times-circle:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before{content:""}.fa-check-circle:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before{content:""}.fa-question-circle:before{content:""}.fa-info-circle:before{content:""}.fa-crosshairs:before{content:""}.fa-times-circle-o:before{content:""}.fa-check-circle-o:before{content:""}.fa-ban:before{content:""}.fa-arrow-left:before{content:""}.fa-arrow-right:before{content:""}.fa-arrow-up:before{content:""}.fa-arrow-down:before{content:""}.fa-mail-forward:before,.fa-share:before{content:""}.fa-expand:before{content:""}.fa-compress:before{content:""}.fa-plus:before{content:""}.fa-minus:before{content:""}.fa-asterisk:before{content:""}.fa-exclamation-circle:before,.rst-content .admonition-title:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before{content:""}.fa-gift:before{content:""}.fa-leaf:before{content:""}.fa-fire:before,.icon-fire:before{content:""}.fa-eye:before{content:""}.fa-eye-slash:before{content:""}.fa-exclamation-triangle:before,.fa-warning:before{content:""}.fa-plane:before{content:""}.fa-calendar:before{content:""}.fa-random:before{content:""}.fa-comment:before{content:""}.fa-magnet:before{content:""}.fa-chevron-up:before{content:""}.fa-chevron-down:before{content:""}.fa-retweet:before{content:""}.fa-shopping-cart:before{content:""}.fa-folder:before{content:""}.fa-folder-open:before{content:""}.fa-arrows-v:before{content:""}.fa-arrows-h:before{content:""}.fa-bar-chart-o:before,.fa-bar-chart:before{content:""}.fa-twitter-square:before{content:""}.fa-facebook-square:before{content:""}.fa-camera-retro:before{content:""}.fa-key:before{content:""}.fa-cogs:before,.fa-gears:before{content:""}.fa-comments:before{content:""}.fa-thumbs-o-up:before{content:""}.fa-thumbs-o-down:before{content:""}.fa-star-half:before{content:""}.fa-heart-o:before{content:""}.fa-sign-out:before{content:""}.fa-linkedin-square:before{content:""}.fa-thumb-tack:before{content:""}.fa-external-link:before{content:""}.fa-sign-in:before{content:""}.fa-trophy:before{content:""}.fa-github-square:before{content:""}.fa-upload:before{content:""}.fa-lemon-o:before{content:""}.fa-phone:before{content:""}.fa-square-o:before{content:""}.fa-bookmark-o:before{content:""}.fa-phone-square:before{content:""}.fa-twitter:before{content:""}.fa-facebook-f:before,.fa-facebook:before{content:""}.fa-github:before,.icon-github:before{content:""}.fa-unlock:before{content:""}.fa-credit-card:before{content:""}.fa-feed:before,.fa-rss:before{content:""}.fa-hdd-o:before{content:""}.fa-bullhorn:before{content:""}.fa-bell:before{content:""}.fa-certificate:before{content:""}.fa-hand-o-right:before{content:""}.fa-hand-o-left:before{content:""}.fa-hand-o-up:before{content:""}.fa-hand-o-down:before{content:""}.fa-arrow-circle-left:before,.icon-circle-arrow-left:before{content:""}.fa-arrow-circle-right:before,.icon-circle-arrow-right:before{content:""}.fa-arrow-circle-up:before{content:""}.fa-arrow-circle-down:before{content:""}.fa-globe:before{content:""}.fa-wrench:before{content:""}.fa-tasks:before{content:""}.fa-filter:before{content:""}.fa-briefcase:before{content:""}.fa-arrows-alt:before{content:""}.fa-group:before,.fa-users:before{content:""}.fa-chain:before,.fa-link:before,.icon-link:before{content:""}.fa-cloud:before{content:""}.fa-flask:before{content:""}.fa-cut:before,.fa-scissors:before{content:""}.fa-copy:before,.fa-files-o:before{content:""}.fa-paperclip:before{content:""}.fa-floppy-o:before,.fa-save:before{content:""}.fa-square:before{content:""}.fa-bars:before,.fa-navicon:before,.fa-reorder:before{content:""}.fa-list-ul:before{content:""}.fa-list-ol:before{content:""}.fa-strikethrough:before{content:""}.fa-underline:before{content:""}.fa-table:before{content:""}.fa-magic:before{content:""}.fa-truck:before{content:""}.fa-pinterest:before{content:""}.fa-pinterest-square:before{content:""}.fa-google-plus-square:before{content:""}.fa-google-plus:before{content:""}.fa-money:before{content:""}.fa-caret-down:before,.icon-caret-down:before,.wy-dropdown .caret:before{content:""}.fa-caret-up:before{content:""}.fa-caret-left:before{content:""}.fa-caret-right:before{content:""}.fa-columns:before{content:""}.fa-sort:before,.fa-unsorted:before{content:""}.fa-sort-desc:before,.fa-sort-down:before{content:""}.fa-sort-asc:before,.fa-sort-up:before{content:""}.fa-envelope:before{content:""}.fa-linkedin:before{content:""}.fa-rotate-left:before,.fa-undo:before{content:""}.fa-gavel:before,.fa-legal:before{content:""}.fa-dashboard:before,.fa-tachometer:before{content:""}.fa-comment-o:before{content:""}.fa-comments-o:before{content:""}.fa-bolt:before,.fa-flash:before{content:""}.fa-sitemap:before{content:""}.fa-umbrella:before{content:""}.fa-clipboard:before,.fa-paste:before{content:""}.fa-lightbulb-o:before{content:""}.fa-exchange:before{content:""}.fa-cloud-download:before{content:""}.fa-cloud-upload:before{content:""}.fa-user-md:before{content:""}.fa-stethoscope:before{content:""}.fa-suitcase:before{content:""}.fa-bell-o:before{content:""}.fa-coffee:before{content:""}.fa-cutlery:before{content:""}.fa-file-text-o:before{content:""}.fa-building-o:before{content:""}.fa-hospital-o:before{content:""}.fa-ambulance:before{content:""}.fa-medkit:before{content:""}.fa-fighter-jet:before{content:""}.fa-beer:before{content:""}.fa-h-square:before{content:""}.fa-plus-square:before{content:""}.fa-angle-double-left:before{content:""}.fa-angle-double-right:before{content:""}.fa-angle-double-up:before{content:""}.fa-angle-double-down:before{content:""}.fa-angle-left:before{content:""}.fa-angle-right:before{content:""}.fa-angle-up:before{content:""}.fa-angle-down:before{content:""}.fa-desktop:before{content:""}.fa-laptop:before{content:""}.fa-tablet:before{content:""}.fa-mobile-phone:before,.fa-mobile:before{content:""}.fa-circle-o:before{content:""}.fa-quote-left:before{content:""}.fa-quote-right:before{content:""}.fa-spinner:before{content:""}.fa-circle:before{content:""}.fa-mail-reply:before,.fa-reply:before{content:""}.fa-github-alt:before{content:""}.fa-folder-o:before{content:""}.fa-folder-open-o:before{content:""}.fa-smile-o:before{content:""}.fa-frown-o:before{content:""}.fa-meh-o:before{content:""}.fa-gamepad:before{content:""}.fa-keyboard-o:before{content:""}.fa-flag-o:before{content:""}.fa-flag-checkered:before{content:""}.fa-terminal:before{content:""}.fa-code:before{content:""}.fa-mail-reply-all:before,.fa-reply-all:before{content:""}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:""}.fa-location-arrow:before{content:""}.fa-crop:before{content:""}.fa-code-fork:before{content:""}.fa-chain-broken:before,.fa-unlink:before{content:""}.fa-question:before{content:""}.fa-info:before{content:""}.fa-exclamation:before{content:""}.fa-superscript:before{content:""}.fa-subscript:before{content:""}.fa-eraser:before{content:""}.fa-puzzle-piece:before{content:""}.fa-microphone:before{content:""}.fa-microphone-slash:before{content:""}.fa-shield:before{content:""}.fa-calendar-o:before{content:""}.fa-fire-extinguisher:before{content:""}.fa-rocket:before{content:""}.fa-maxcdn:before{content:""}.fa-chevron-circle-left:before{content:""}.fa-chevron-circle-right:before{content:""}.fa-chevron-circle-up:before{content:""}.fa-chevron-circle-down:before{content:""}.fa-html5:before{content:""}.fa-css3:before{content:""}.fa-anchor:before{content:""}.fa-unlock-alt:before{content:""}.fa-bullseye:before{content:""}.fa-ellipsis-h:before{content:""}.fa-ellipsis-v:before{content:""}.fa-rss-square:before{content:""}.fa-play-circle:before{content:""}.fa-ticket:before{content:""}.fa-minus-square:before{content:""}.fa-minus-square-o:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before{content:""}.fa-level-up:before{content:""}.fa-level-down:before{content:""}.fa-check-square:before{content:""}.fa-pencil-square:before{content:""}.fa-external-link-square:before{content:""}.fa-share-square:before{content:""}.fa-compass:before{content:""}.fa-caret-square-o-down:before,.fa-toggle-down:before{content:""}.fa-caret-square-o-up:before,.fa-toggle-up:before{content:""}.fa-caret-square-o-right:before,.fa-toggle-right:before{content:""}.fa-eur:before,.fa-euro:before{content:""}.fa-gbp:before{content:""}.fa-dollar:before,.fa-usd:before{content:""}.fa-inr:before,.fa-rupee:before{content:""}.fa-cny:before,.fa-jpy:before,.fa-rmb:before,.fa-yen:before{content:""}.fa-rouble:before,.fa-rub:before,.fa-ruble:before{content:""}.fa-krw:before,.fa-won:before{content:""}.fa-bitcoin:before,.fa-btc:before{content:""}.fa-file:before{content:""}.fa-file-text:before{content:""}.fa-sort-alpha-asc:before{content:""}.fa-sort-alpha-desc:before{content:""}.fa-sort-amount-asc:before{content:""}.fa-sort-amount-desc:before{content:""}.fa-sort-numeric-asc:before{content:""}.fa-sort-numeric-desc:before{content:""}.fa-thumbs-up:before{content:""}.fa-thumbs-down:before{content:""}.fa-youtube-square:before{content:""}.fa-youtube:before{content:""}.fa-xing:before{content:""}.fa-xing-square:before{content:""}.fa-youtube-play:before{content:""}.fa-dropbox:before{content:""}.fa-stack-overflow:before{content:""}.fa-instagram:before{content:""}.fa-flickr:before{content:""}.fa-adn:before{content:""}.fa-bitbucket:before,.icon-bitbucket:before{content:""}.fa-bitbucket-square:before{content:""}.fa-tumblr:before{content:""}.fa-tumblr-square:before{content:""}.fa-long-arrow-down:before{content:""}.fa-long-arrow-up:before{content:""}.fa-long-arrow-left:before{content:""}.fa-long-arrow-right:before{content:""}.fa-apple:before{content:""}.fa-windows:before{content:""}.fa-android:before{content:""}.fa-linux:before{content:""}.fa-dribbble:before{content:""}.fa-skype:before{content:""}.fa-foursquare:before{content:""}.fa-trello:before{content:""}.fa-female:before{content:""}.fa-male:before{content:""}.fa-gittip:before,.fa-gratipay:before{content:""}.fa-sun-o:before{content:""}.fa-moon-o:before{content:""}.fa-archive:before{content:""}.fa-bug:before{content:""}.fa-vk:before{content:""}.fa-weibo:before{content:""}.fa-renren:before{content:""}.fa-pagelines:before{content:""}.fa-stack-exchange:before{content:""}.fa-arrow-circle-o-right:before{content:""}.fa-arrow-circle-o-left:before{content:""}.fa-caret-square-o-left:before,.fa-toggle-left:before{content:""}.fa-dot-circle-o:before{content:""}.fa-wheelchair:before{content:""}.fa-vimeo-square:before{content:""}.fa-try:before,.fa-turkish-lira:before{content:""}.fa-plus-square-o:before,.wy-menu-vertical li button.toctree-expand:before{content:""}.fa-space-shuttle:before{content:""}.fa-slack:before{content:""}.fa-envelope-square:before{content:""}.fa-wordpress:before{content:""}.fa-openid:before{content:""}.fa-bank:before,.fa-institution:before,.fa-university:before{content:""}.fa-graduation-cap:before,.fa-mortar-board:before{content:""}.fa-yahoo:before{content:""}.fa-google:before{content:""}.fa-reddit:before{content:""}.fa-reddit-square:before{content:""}.fa-stumbleupon-circle:before{content:""}.fa-stumbleupon:before{content:""}.fa-delicious:before{content:""}.fa-digg:before{content:""}.fa-pied-piper-pp:before{content:""}.fa-pied-piper-alt:before{content:""}.fa-drupal:before{content:""}.fa-joomla:before{content:""}.fa-language:before{content:""}.fa-fax:before{content:""}.fa-building:before{content:""}.fa-child:before{content:""}.fa-paw:before{content:""}.fa-spoon:before{content:""}.fa-cube:before{content:""}.fa-cubes:before{content:""}.fa-behance:before{content:""}.fa-behance-square:before{content:""}.fa-steam:before{content:""}.fa-steam-square:before{content:""}.fa-recycle:before{content:""}.fa-automobile:before,.fa-car:before{content:""}.fa-cab:before,.fa-taxi:before{content:""}.fa-tree:before{content:""}.fa-spotify:before{content:""}.fa-deviantart:before{content:""}.fa-soundcloud:before{content:""}.fa-database:before{content:""}.fa-file-pdf-o:before{content:""}.fa-file-word-o:before{content:""}.fa-file-excel-o:before{content:""}.fa-file-powerpoint-o:before{content:""}.fa-file-image-o:before,.fa-file-photo-o:before,.fa-file-picture-o:before{content:""}.fa-file-archive-o:before,.fa-file-zip-o:before{content:""}.fa-file-audio-o:before,.fa-file-sound-o:before{content:""}.fa-file-movie-o:before,.fa-file-video-o:before{content:""}.fa-file-code-o:before{content:""}.fa-vine:before{content:""}.fa-codepen:before{content:""}.fa-jsfiddle:before{content:""}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-ring:before,.fa-life-saver:before,.fa-support:before{content:""}.fa-circle-o-notch:before{content:""}.fa-ra:before,.fa-rebel:before,.fa-resistance:before{content:""}.fa-empire:before,.fa-ge:before{content:""}.fa-git-square:before{content:""}.fa-git:before{content:""}.fa-hacker-news:before,.fa-y-combinator-square:before,.fa-yc-square:before{content:""}.fa-tencent-weibo:before{content:""}.fa-qq:before{content:""}.fa-wechat:before,.fa-weixin:before{content:""}.fa-paper-plane:before,.fa-send:before{content:""}.fa-paper-plane-o:before,.fa-send-o:before{content:""}.fa-history:before{content:""}.fa-circle-thin:before{content:""}.fa-header:before{content:""}.fa-paragraph:before{content:""}.fa-sliders:before{content:""}.fa-share-alt:before{content:""}.fa-share-alt-square:before{content:""}.fa-bomb:before{content:""}.fa-futbol-o:before,.fa-soccer-ball-o:before{content:""}.fa-tty:before{content:""}.fa-binoculars:before{content:""}.fa-plug:before{content:""}.fa-slideshare:before{content:""}.fa-twitch:before{content:""}.fa-yelp:before{content:""}.fa-newspaper-o:before{content:""}.fa-wifi:before{content:""}.fa-calculator:before{content:""}.fa-paypal:before{content:""}.fa-google-wallet:before{content:""}.fa-cc-visa:before{content:""}.fa-cc-mastercard:before{content:""}.fa-cc-discover:before{content:""}.fa-cc-amex:before{content:""}.fa-cc-paypal:before{content:""}.fa-cc-stripe:before{content:""}.fa-bell-slash:before{content:""}.fa-bell-slash-o:before{content:""}.fa-trash:before{content:""}.fa-copyright:before{content:""}.fa-at:before{content:""}.fa-eyedropper:before{content:""}.fa-paint-brush:before{content:""}.fa-birthday-cake:before{content:""}.fa-area-chart:before{content:""}.fa-pie-chart:before{content:""}.fa-line-chart:before{content:""}.fa-lastfm:before{content:""}.fa-lastfm-square:before{content:""}.fa-toggle-off:before{content:""}.fa-toggle-on:before{content:""}.fa-bicycle:before{content:""}.fa-bus:before{content:""}.fa-ioxhost:before{content:""}.fa-angellist:before{content:""}.fa-cc:before{content:""}.fa-ils:before,.fa-shekel:before,.fa-sheqel:before{content:""}.fa-meanpath:before{content:""}.fa-buysellads:before{content:""}.fa-connectdevelop:before{content:""}.fa-dashcube:before{content:""}.fa-forumbee:before{content:""}.fa-leanpub:before{content:""}.fa-sellsy:before{content:""}.fa-shirtsinbulk:before{content:""}.fa-simplybuilt:before{content:""}.fa-skyatlas:before{content:""}.fa-cart-plus:before{content:""}.fa-cart-arrow-down:before{content:""}.fa-diamond:before{content:""}.fa-ship:before{content:""}.fa-user-secret:before{content:""}.fa-motorcycle:before{content:""}.fa-street-view:before{content:""}.fa-heartbeat:before{content:""}.fa-venus:before{content:""}.fa-mars:before{content:""}.fa-mercury:before{content:""}.fa-intersex:before,.fa-transgender:before{content:""}.fa-transgender-alt:before{content:""}.fa-venus-double:before{content:""}.fa-mars-double:before{content:""}.fa-venus-mars:before{content:""}.fa-mars-stroke:before{content:""}.fa-mars-stroke-v:before{content:""}.fa-mars-stroke-h:before{content:""}.fa-neuter:before{content:""}.fa-genderless:before{content:""}.fa-facebook-official:before{content:""}.fa-pinterest-p:before{content:""}.fa-whatsapp:before{content:""}.fa-server:before{content:""}.fa-user-plus:before{content:""}.fa-user-times:before{content:""}.fa-bed:before,.fa-hotel:before{content:""}.fa-viacoin:before{content:""}.fa-train:before{content:""}.fa-subway:before{content:""}.fa-medium:before{content:""}.fa-y-combinator:before,.fa-yc:before{content:""}.fa-optin-monster:before{content:""}.fa-opencart:before{content:""}.fa-expeditedssl:before{content:""}.fa-battery-4:before,.fa-battery-full:before,.fa-battery:before{content:""}.fa-battery-3:before,.fa-battery-three-quarters:before{content:""}.fa-battery-2:before,.fa-battery-half:before{content:""}.fa-battery-1:before,.fa-battery-quarter:before{content:""}.fa-battery-0:before,.fa-battery-empty:before{content:""}.fa-mouse-pointer:before{content:""}.fa-i-cursor:before{content:""}.fa-object-group:before{content:""}.fa-object-ungroup:before{content:""}.fa-sticky-note:before{content:""}.fa-sticky-note-o:before{content:""}.fa-cc-jcb:before{content:""}.fa-cc-diners-club:before{content:""}.fa-clone:before{content:""}.fa-balance-scale:before{content:""}.fa-hourglass-o:before{content:""}.fa-hourglass-1:before,.fa-hourglass-start:before{content:""}.fa-hourglass-2:before,.fa-hourglass-half:before{content:""}.fa-hourglass-3:before,.fa-hourglass-end:before{content:""}.fa-hourglass:before{content:""}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:""}.fa-hand-paper-o:before,.fa-hand-stop-o:before{content:""}.fa-hand-scissors-o:before{content:""}.fa-hand-lizard-o:before{content:""}.fa-hand-spock-o:before{content:""}.fa-hand-pointer-o:before{content:""}.fa-hand-peace-o:before{content:""}.fa-trademark:before{content:""}.fa-registered:before{content:""}.fa-creative-commons:before{content:""}.fa-gg:before{content:""}.fa-gg-circle:before{content:""}.fa-tripadvisor:before{content:""}.fa-odnoklassniki:before{content:""}.fa-odnoklassniki-square:before{content:""}.fa-get-pocket:before{content:""}.fa-wikipedia-w:before{content:""}.fa-safari:before{content:""}.fa-chrome:before{content:""}.fa-firefox:before{content:""}.fa-opera:before{content:""}.fa-internet-explorer:before{content:""}.fa-television:before,.fa-tv:before{content:""}.fa-contao:before{content:""}.fa-500px:before{content:""}.fa-amazon:before{content:""}.fa-calendar-plus-o:before{content:""}.fa-calendar-minus-o:before{content:""}.fa-calendar-times-o:before{content:""}.fa-calendar-check-o:before{content:""}.fa-industry:before{content:""}.fa-map-pin:before{content:""}.fa-map-signs:before{content:""}.fa-map-o:before{content:""}.fa-map:before{content:""}.fa-commenting:before{content:""}.fa-commenting-o:before{content:""}.fa-houzz:before{content:""}.fa-vimeo:before{content:""}.fa-black-tie:before{content:""}.fa-fonticons:before{content:""}.fa-reddit-alien:before{content:""}.fa-edge:before{content:""}.fa-credit-card-alt:before{content:""}.fa-codiepie:before{content:""}.fa-modx:before{content:""}.fa-fort-awesome:before{content:""}.fa-usb:before{content:""}.fa-product-hunt:before{content:""}.fa-mixcloud:before{content:""}.fa-scribd:before{content:""}.fa-pause-circle:before{content:""}.fa-pause-circle-o:before{content:""}.fa-stop-circle:before{content:""}.fa-stop-circle-o:before{content:""}.fa-shopping-bag:before{content:""}.fa-shopping-basket:before{content:""}.fa-hashtag:before{content:""}.fa-bluetooth:before{content:""}.fa-bluetooth-b:before{content:""}.fa-percent:before{content:""}.fa-gitlab:before,.icon-gitlab:before{content:""}.fa-wpbeginner:before{content:""}.fa-wpforms:before{content:""}.fa-envira:before{content:""}.fa-universal-access:before{content:""}.fa-wheelchair-alt:before{content:""}.fa-question-circle-o:before{content:""}.fa-blind:before{content:""}.fa-audio-description:before{content:""}.fa-volume-control-phone:before{content:""}.fa-braille:before{content:""}.fa-assistive-listening-systems:before{content:""}.fa-american-sign-language-interpreting:before,.fa-asl-interpreting:before{content:""}.fa-deaf:before,.fa-deafness:before,.fa-hard-of-hearing:before{content:""}.fa-glide:before{content:""}.fa-glide-g:before{content:""}.fa-sign-language:before,.fa-signing:before{content:""}.fa-low-vision:before{content:""}.fa-viadeo:before{content:""}.fa-viadeo-square:before{content:""}.fa-snapchat:before{content:""}.fa-snapchat-ghost:before{content:""}.fa-snapchat-square:before{content:""}.fa-pied-piper:before{content:""}.fa-first-order:before{content:""}.fa-yoast:before{content:""}.fa-themeisle:before{content:""}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:""}.fa-fa:before,.fa-font-awesome:before{content:""}.fa-handshake-o:before{content:""}.fa-envelope-open:before{content:""}.fa-envelope-open-o:before{content:""}.fa-linode:before{content:""}.fa-address-book:before{content:""}.fa-address-book-o:before{content:""}.fa-address-card:before,.fa-vcard:before{content:""}.fa-address-card-o:before,.fa-vcard-o:before{content:""}.fa-user-circle:before{content:""}.fa-user-circle-o:before{content:""}.fa-user-o:before{content:""}.fa-id-badge:before{content:""}.fa-drivers-license:before,.fa-id-card:before{content:""}.fa-drivers-license-o:before,.fa-id-card-o:before{content:""}.fa-quora:before{content:""}.fa-free-code-camp:before{content:""}.fa-telegram:before{content:""}.fa-thermometer-4:before,.fa-thermometer-full:before,.fa-thermometer:before{content:""}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:""}.fa-thermometer-2:before,.fa-thermometer-half:before{content:""}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:""}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:""}.fa-shower:before{content:""}.fa-bath:before,.fa-bathtub:before,.fa-s15:before{content:""}.fa-podcast:before{content:""}.fa-window-maximize:before{content:""}.fa-window-minimize:before{content:""}.fa-window-restore:before{content:""}.fa-times-rectangle:before,.fa-window-close:before{content:""}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:""}.fa-bandcamp:before{content:""}.fa-grav:before{content:""}.fa-etsy:before{content:""}.fa-imdb:before{content:""}.fa-ravelry:before{content:""}.fa-eercast:before{content:""}.fa-microchip:before{content:""}.fa-snowflake-o:before{content:""}.fa-superpowers:before{content:""}.fa-wpexplorer:before{content:""}.fa-meetup:before{content:""}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0,0,0,0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto}.fa,.icon,.rst-content .admonition-title,.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content code.download span:first-child,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink,.rst-content tt.download span:first-child,.wy-dropdown .caret,.wy-inline-validate.wy-inline-validate-danger .wy-input-context,.wy-inline-validate.wy-inline-validate-info .wy-input-context,.wy-inline-validate.wy-inline-validate-success .wy-input-context,.wy-inline-validate.wy-inline-validate-warning .wy-input-context,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li button.toctree-expand{font-family:inherit}.fa:before,.icon:before,.rst-content .admonition-title:before,.rst-content .code-block-caption .headerlink:before,.rst-content .eqno .headerlink:before,.rst-content code.download span:first-child:before,.rst-content dl dt .headerlink:before,.rst-content h1 .headerlink:before,.rst-content h2 .headerlink:before,.rst-content h3 .headerlink:before,.rst-content h4 .headerlink:before,.rst-content h5 .headerlink:before,.rst-content h6 .headerlink:before,.rst-content p.caption .headerlink:before,.rst-content p .headerlink:before,.rst-content table>caption .headerlink:before,.rst-content tt.download span:first-child:before,.wy-dropdown .caret:before,.wy-inline-validate.wy-inline-validate-danger .wy-input-context:before,.wy-inline-validate.wy-inline-validate-info .wy-input-context:before,.wy-inline-validate.wy-inline-validate-success .wy-input-context:before,.wy-inline-validate.wy-inline-validate-warning .wy-input-context:before,.wy-menu-vertical li.current>a button.toctree-expand:before,.wy-menu-vertical li.on a button.toctree-expand:before,.wy-menu-vertical li button.toctree-expand:before{font-family:FontAwesome;display:inline-block;font-style:normal;font-weight:400;line-height:1;text-decoration:inherit}.rst-content .code-block-caption a .headerlink,.rst-content .eqno a .headerlink,.rst-content a .admonition-title,.rst-content code.download a span:first-child,.rst-content dl dt a .headerlink,.rst-content h1 a .headerlink,.rst-content h2 a .headerlink,.rst-content h3 a .headerlink,.rst-content h4 a .headerlink,.rst-content h5 a .headerlink,.rst-content h6 a .headerlink,.rst-content p.caption a .headerlink,.rst-content p a .headerlink,.rst-content table>caption a .headerlink,.rst-content tt.download a span:first-child,.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand,.wy-menu-vertical li a button.toctree-expand,a .fa,a .icon,a .rst-content .admonition-title,a .rst-content .code-block-caption .headerlink,a .rst-content .eqno .headerlink,a .rst-content code.download span:first-child,a .rst-content dl dt .headerlink,a .rst-content h1 .headerlink,a .rst-content h2 .headerlink,a .rst-content h3 .headerlink,a .rst-content h4 .headerlink,a .rst-content h5 .headerlink,a .rst-content h6 .headerlink,a .rst-content p.caption .headerlink,a .rst-content p .headerlink,a .rst-content table>caption .headerlink,a .rst-content tt.download span:first-child,a .wy-menu-vertical li button.toctree-expand{display:inline-block;text-decoration:inherit}.btn .fa,.btn .icon,.btn .rst-content .admonition-title,.btn .rst-content .code-block-caption .headerlink,.btn .rst-content .eqno .headerlink,.btn .rst-content code.download span:first-child,.btn .rst-content dl dt .headerlink,.btn .rst-content h1 .headerlink,.btn .rst-content h2 .headerlink,.btn .rst-content h3 .headerlink,.btn .rst-content h4 .headerlink,.btn .rst-content h5 .headerlink,.btn .rst-content h6 .headerlink,.btn .rst-content p .headerlink,.btn .rst-content table>caption .headerlink,.btn .rst-content tt.download span:first-child,.btn .wy-menu-vertical li.current>a button.toctree-expand,.btn .wy-menu-vertical li.on a button.toctree-expand,.btn .wy-menu-vertical li button.toctree-expand,.nav .fa,.nav .icon,.nav .rst-content .admonition-title,.nav .rst-content .code-block-caption .headerlink,.nav .rst-content .eqno .headerlink,.nav .rst-content code.download span:first-child,.nav .rst-content dl dt .headerlink,.nav .rst-content h1 .headerlink,.nav .rst-content h2 .headerlink,.nav .rst-content h3 .headerlink,.nav .rst-content h4 .headerlink,.nav .rst-content h5 .headerlink,.nav .rst-content h6 .headerlink,.nav .rst-content p .headerlink,.nav .rst-content table>caption .headerlink,.nav .rst-content tt.download span:first-child,.nav .wy-menu-vertical li.current>a button.toctree-expand,.nav .wy-menu-vertical li.on a button.toctree-expand,.nav .wy-menu-vertical li button.toctree-expand,.rst-content .btn .admonition-title,.rst-content .code-block-caption .btn .headerlink,.rst-content .code-block-caption .nav .headerlink,.rst-content .eqno .btn .headerlink,.rst-content .eqno .nav .headerlink,.rst-content .nav .admonition-title,.rst-content code.download .btn span:first-child,.rst-content code.download .nav span:first-child,.rst-content dl dt .btn .headerlink,.rst-content dl dt .nav .headerlink,.rst-content h1 .btn .headerlink,.rst-content h1 .nav .headerlink,.rst-content h2 .btn .headerlink,.rst-content h2 .nav .headerlink,.rst-content h3 .btn .headerlink,.rst-content h3 .nav .headerlink,.rst-content h4 .btn .headerlink,.rst-content h4 .nav .headerlink,.rst-content h5 .btn .headerlink,.rst-content h5 .nav .headerlink,.rst-content h6 .btn .headerlink,.rst-content h6 .nav .headerlink,.rst-content p .btn .headerlink,.rst-content p .nav .headerlink,.rst-content table>caption .btn .headerlink,.rst-content table>caption .nav .headerlink,.rst-content tt.download .btn span:first-child,.rst-content tt.download .nav span:first-child,.wy-menu-vertical li .btn button.toctree-expand,.wy-menu-vertical li.current>a .btn button.toctree-expand,.wy-menu-vertical li.current>a .nav button.toctree-expand,.wy-menu-vertical li .nav button.toctree-expand,.wy-menu-vertical li.on a .btn button.toctree-expand,.wy-menu-vertical li.on a .nav button.toctree-expand{display:inline}.btn .fa-large.icon,.btn .fa.fa-large,.btn .rst-content .code-block-caption .fa-large.headerlink,.btn .rst-content .eqno .fa-large.headerlink,.btn .rst-content .fa-large.admonition-title,.btn .rst-content code.download span.fa-large:first-child,.btn .rst-content dl dt .fa-large.headerlink,.btn .rst-content h1 .fa-large.headerlink,.btn .rst-content h2 .fa-large.headerlink,.btn .rst-content h3 .fa-large.headerlink,.btn .rst-content h4 .fa-large.headerlink,.btn .rst-content h5 .fa-large.headerlink,.btn .rst-content h6 .fa-large.headerlink,.btn .rst-content p .fa-large.headerlink,.btn .rst-content table>caption .fa-large.headerlink,.btn .rst-content tt.download span.fa-large:first-child,.btn .wy-menu-vertical li button.fa-large.toctree-expand,.nav .fa-large.icon,.nav .fa.fa-large,.nav .rst-content .code-block-caption .fa-large.headerlink,.nav .rst-content .eqno .fa-large.headerlink,.nav .rst-content .fa-large.admonition-title,.nav .rst-content code.download span.fa-large:first-child,.nav .rst-content dl dt .fa-large.headerlink,.nav .rst-content h1 .fa-large.headerlink,.nav .rst-content h2 .fa-large.headerlink,.nav .rst-content h3 .fa-large.headerlink,.nav .rst-content h4 .fa-large.headerlink,.nav .rst-content h5 .fa-large.headerlink,.nav .rst-content h6 .fa-large.headerlink,.nav .rst-content p .fa-large.headerlink,.nav .rst-content table>caption .fa-large.headerlink,.nav .rst-content tt.download span.fa-large:first-child,.nav .wy-menu-vertical li button.fa-large.toctree-expand,.rst-content .btn .fa-large.admonition-title,.rst-content .code-block-caption .btn .fa-large.headerlink,.rst-content .code-block-caption .nav .fa-large.headerlink,.rst-content .eqno .btn .fa-large.headerlink,.rst-content .eqno .nav .fa-large.headerlink,.rst-content .nav .fa-large.admonition-title,.rst-content code.download .btn span.fa-large:first-child,.rst-content code.download .nav span.fa-large:first-child,.rst-content dl dt .btn .fa-large.headerlink,.rst-content dl dt .nav .fa-large.headerlink,.rst-content h1 .btn .fa-large.headerlink,.rst-content h1 .nav .fa-large.headerlink,.rst-content h2 .btn .fa-large.headerlink,.rst-content h2 .nav .fa-large.headerlink,.rst-content h3 .btn .fa-large.headerlink,.rst-content h3 .nav .fa-large.headerlink,.rst-content h4 .btn .fa-large.headerlink,.rst-content h4 .nav .fa-large.headerlink,.rst-content h5 .btn .fa-large.headerlink,.rst-content h5 .nav .fa-large.headerlink,.rst-content h6 .btn .fa-large.headerlink,.rst-content h6 .nav .fa-large.headerlink,.rst-content p .btn .fa-large.headerlink,.rst-content p .nav .fa-large.headerlink,.rst-content table>caption .btn .fa-large.headerlink,.rst-content table>caption .nav .fa-large.headerlink,.rst-content tt.download .btn span.fa-large:first-child,.rst-content tt.download .nav span.fa-large:first-child,.wy-menu-vertical li .btn button.fa-large.toctree-expand,.wy-menu-vertical li .nav button.fa-large.toctree-expand{line-height:.9em}.btn .fa-spin.icon,.btn .fa.fa-spin,.btn .rst-content .code-block-caption .fa-spin.headerlink,.btn .rst-content .eqno .fa-spin.headerlink,.btn .rst-content .fa-spin.admonition-title,.btn .rst-content code.download span.fa-spin:first-child,.btn .rst-content dl dt .fa-spin.headerlink,.btn .rst-content h1 .fa-spin.headerlink,.btn .rst-content h2 .fa-spin.headerlink,.btn .rst-content h3 .fa-spin.headerlink,.btn .rst-content h4 .fa-spin.headerlink,.btn .rst-content h5 .fa-spin.headerlink,.btn .rst-content h6 .fa-spin.headerlink,.btn .rst-content p .fa-spin.headerlink,.btn .rst-content table>caption .fa-spin.headerlink,.btn .rst-content tt.download span.fa-spin:first-child,.btn .wy-menu-vertical li button.fa-spin.toctree-expand,.nav .fa-spin.icon,.nav .fa.fa-spin,.nav .rst-content .code-block-caption .fa-spin.headerlink,.nav .rst-content .eqno .fa-spin.headerlink,.nav .rst-content .fa-spin.admonition-title,.nav .rst-content code.download span.fa-spin:first-child,.nav .rst-content dl dt .fa-spin.headerlink,.nav .rst-content h1 .fa-spin.headerlink,.nav .rst-content h2 .fa-spin.headerlink,.nav .rst-content h3 .fa-spin.headerlink,.nav .rst-content h4 .fa-spin.headerlink,.nav .rst-content h5 .fa-spin.headerlink,.nav .rst-content h6 .fa-spin.headerlink,.nav .rst-content p .fa-spin.headerlink,.nav .rst-content table>caption .fa-spin.headerlink,.nav .rst-content tt.download span.fa-spin:first-child,.nav .wy-menu-vertical li button.fa-spin.toctree-expand,.rst-content .btn .fa-spin.admonition-title,.rst-content .code-block-caption .btn .fa-spin.headerlink,.rst-content .code-block-caption .nav .fa-spin.headerlink,.rst-content .eqno .btn .fa-spin.headerlink,.rst-content .eqno .nav .fa-spin.headerlink,.rst-content .nav .fa-spin.admonition-title,.rst-content code.download .btn span.fa-spin:first-child,.rst-content code.download .nav span.fa-spin:first-child,.rst-content dl dt .btn .fa-spin.headerlink,.rst-content dl dt .nav .fa-spin.headerlink,.rst-content h1 .btn .fa-spin.headerlink,.rst-content h1 .nav .fa-spin.headerlink,.rst-content h2 .btn .fa-spin.headerlink,.rst-content h2 .nav .fa-spin.headerlink,.rst-content h3 .btn .fa-spin.headerlink,.rst-content h3 .nav .fa-spin.headerlink,.rst-content h4 .btn .fa-spin.headerlink,.rst-content h4 .nav .fa-spin.headerlink,.rst-content h5 .btn .fa-spin.headerlink,.rst-content h5 .nav .fa-spin.headerlink,.rst-content h6 .btn .fa-spin.headerlink,.rst-content h6 .nav .fa-spin.headerlink,.rst-content p .btn .fa-spin.headerlink,.rst-content p .nav .fa-spin.headerlink,.rst-content table>caption .btn .fa-spin.headerlink,.rst-content table>caption .nav .fa-spin.headerlink,.rst-content tt.download .btn span.fa-spin:first-child,.rst-content tt.download .nav span.fa-spin:first-child,.wy-menu-vertical li .btn button.fa-spin.toctree-expand,.wy-menu-vertical li .nav button.fa-spin.toctree-expand{display:inline-block}.btn.fa:before,.btn.icon:before,.rst-content .btn.admonition-title:before,.rst-content .code-block-caption .btn.headerlink:before,.rst-content .eqno .btn.headerlink:before,.rst-content code.download span.btn:first-child:before,.rst-content dl dt .btn.headerlink:before,.rst-content h1 .btn.headerlink:before,.rst-content h2 .btn.headerlink:before,.rst-content h3 .btn.headerlink:before,.rst-content h4 .btn.headerlink:before,.rst-content h5 .btn.headerlink:before,.rst-content h6 .btn.headerlink:before,.rst-content p .btn.headerlink:before,.rst-content table>caption .btn.headerlink:before,.rst-content tt.download span.btn:first-child:before,.wy-menu-vertical li button.btn.toctree-expand:before{opacity:.5;-webkit-transition:opacity .05s ease-in;-moz-transition:opacity .05s ease-in;transition:opacity .05s ease-in}.btn.fa:hover:before,.btn.icon:hover:before,.rst-content .btn.admonition-title:hover:before,.rst-content .code-block-caption .btn.headerlink:hover:before,.rst-content .eqno .btn.headerlink:hover:before,.rst-content code.download span.btn:first-child:hover:before,.rst-content dl dt .btn.headerlink:hover:before,.rst-content h1 .btn.headerlink:hover:before,.rst-content h2 .btn.headerlink:hover:before,.rst-content h3 .btn.headerlink:hover:before,.rst-content h4 .btn.headerlink:hover:before,.rst-content h5 .btn.headerlink:hover:before,.rst-content h6 .btn.headerlink:hover:before,.rst-content p .btn.headerlink:hover:before,.rst-content table>caption .btn.headerlink:hover:before,.rst-content tt.download span.btn:first-child:hover:before,.wy-menu-vertical li button.btn.toctree-expand:hover:before{opacity:1}.btn-mini .fa:before,.btn-mini .icon:before,.btn-mini .rst-content .admonition-title:before,.btn-mini .rst-content .code-block-caption .headerlink:before,.btn-mini .rst-content .eqno .headerlink:before,.btn-mini .rst-content code.download span:first-child:before,.btn-mini .rst-content dl dt .headerlink:before,.btn-mini .rst-content h1 .headerlink:before,.btn-mini .rst-content h2 .headerlink:before,.btn-mini .rst-content h3 .headerlink:before,.btn-mini .rst-content h4 .headerlink:before,.btn-mini .rst-content h5 .headerlink:before,.btn-mini .rst-content h6 .headerlink:before,.btn-mini .rst-content p .headerlink:before,.btn-mini .rst-content table>caption .headerlink:before,.btn-mini .rst-content tt.download span:first-child:before,.btn-mini .wy-menu-vertical li button.toctree-expand:before,.rst-content .btn-mini .admonition-title:before,.rst-content .code-block-caption .btn-mini .headerlink:before,.rst-content .eqno .btn-mini .headerlink:before,.rst-content code.download .btn-mini span:first-child:before,.rst-content dl dt .btn-mini .headerlink:before,.rst-content h1 .btn-mini .headerlink:before,.rst-content h2 .btn-mini .headerlink:before,.rst-content h3 .btn-mini .headerlink:before,.rst-content h4 .btn-mini .headerlink:before,.rst-content h5 .btn-mini .headerlink:before,.rst-content h6 .btn-mini .headerlink:before,.rst-content p .btn-mini .headerlink:before,.rst-content table>caption .btn-mini .headerlink:before,.rst-content tt.download .btn-mini span:first-child:before,.wy-menu-vertical li .btn-mini button.toctree-expand:before{font-size:14px;vertical-align:-15%}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning,.wy-alert{padding:12px;line-height:24px;margin-bottom:24px;background:#e7f2fa}.rst-content .admonition-title,.wy-alert-title{font-weight:700;display:block;color:#fff;background:#6ab0de;padding:6px 12px;margin:-12px -12px 12px}.rst-content .danger,.rst-content .error,.rst-content .wy-alert-danger.admonition,.rst-content .wy-alert-danger.admonition-todo,.rst-content .wy-alert-danger.attention,.rst-content .wy-alert-danger.caution,.rst-content .wy-alert-danger.hint,.rst-content .wy-alert-danger.important,.rst-content .wy-alert-danger.note,.rst-content .wy-alert-danger.seealso,.rst-content .wy-alert-danger.tip,.rst-content .wy-alert-danger.warning,.wy-alert.wy-alert-danger{background:#fdf3f2}.rst-content .danger .admonition-title,.rst-content .danger .wy-alert-title,.rst-content .error .admonition-title,.rst-content .error .wy-alert-title,.rst-content .wy-alert-danger.admonition-todo .admonition-title,.rst-content .wy-alert-danger.admonition-todo .wy-alert-title,.rst-content .wy-alert-danger.admonition .admonition-title,.rst-content .wy-alert-danger.admonition .wy-alert-title,.rst-content .wy-alert-danger.attention .admonition-title,.rst-content .wy-alert-danger.attention .wy-alert-title,.rst-content .wy-alert-danger.caution .admonition-title,.rst-content .wy-alert-danger.caution .wy-alert-title,.rst-content .wy-alert-danger.hint .admonition-title,.rst-content .wy-alert-danger.hint .wy-alert-title,.rst-content .wy-alert-danger.important .admonition-title,.rst-content .wy-alert-danger.important .wy-alert-title,.rst-content .wy-alert-danger.note .admonition-title,.rst-content .wy-alert-danger.note .wy-alert-title,.rst-content .wy-alert-danger.seealso .admonition-title,.rst-content .wy-alert-danger.seealso .wy-alert-title,.rst-content .wy-alert-danger.tip .admonition-title,.rst-content .wy-alert-danger.tip .wy-alert-title,.rst-content .wy-alert-danger.warning .admonition-title,.rst-content .wy-alert-danger.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-danger .admonition-title,.wy-alert.wy-alert-danger .rst-content .admonition-title,.wy-alert.wy-alert-danger .wy-alert-title{background:#f29f97}.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .warning,.rst-content .wy-alert-warning.admonition,.rst-content .wy-alert-warning.danger,.rst-content .wy-alert-warning.error,.rst-content .wy-alert-warning.hint,.rst-content .wy-alert-warning.important,.rst-content .wy-alert-warning.note,.rst-content .wy-alert-warning.seealso,.rst-content .wy-alert-warning.tip,.wy-alert.wy-alert-warning{background:#ffedcc}.rst-content .admonition-todo .admonition-title,.rst-content .admonition-todo .wy-alert-title,.rst-content .attention .admonition-title,.rst-content .attention .wy-alert-title,.rst-content .caution .admonition-title,.rst-content .caution .wy-alert-title,.rst-content .warning .admonition-title,.rst-content .warning .wy-alert-title,.rst-content .wy-alert-warning.admonition .admonition-title,.rst-content .wy-alert-warning.admonition .wy-alert-title,.rst-content .wy-alert-warning.danger .admonition-title,.rst-content .wy-alert-warning.danger .wy-alert-title,.rst-content .wy-alert-warning.error .admonition-title,.rst-content .wy-alert-warning.error .wy-alert-title,.rst-content .wy-alert-warning.hint .admonition-title,.rst-content .wy-alert-warning.hint .wy-alert-title,.rst-content .wy-alert-warning.important .admonition-title,.rst-content .wy-alert-warning.important .wy-alert-title,.rst-content .wy-alert-warning.note .admonition-title,.rst-content .wy-alert-warning.note .wy-alert-title,.rst-content .wy-alert-warning.seealso .admonition-title,.rst-content .wy-alert-warning.seealso .wy-alert-title,.rst-content .wy-alert-warning.tip .admonition-title,.rst-content .wy-alert-warning.tip .wy-alert-title,.rst-content .wy-alert.wy-alert-warning .admonition-title,.wy-alert.wy-alert-warning .rst-content .admonition-title,.wy-alert.wy-alert-warning .wy-alert-title{background:#f0b37e}.rst-content .note,.rst-content .seealso,.rst-content .wy-alert-info.admonition,.rst-content .wy-alert-info.admonition-todo,.rst-content .wy-alert-info.attention,.rst-content .wy-alert-info.caution,.rst-content .wy-alert-info.danger,.rst-content .wy-alert-info.error,.rst-content .wy-alert-info.hint,.rst-content .wy-alert-info.important,.rst-content .wy-alert-info.tip,.rst-content .wy-alert-info.warning,.wy-alert.wy-alert-info{background:#e7f2fa}.rst-content .note .admonition-title,.rst-content .note .wy-alert-title,.rst-content .seealso .admonition-title,.rst-content .seealso .wy-alert-title,.rst-content .wy-alert-info.admonition-todo .admonition-title,.rst-content .wy-alert-info.admonition-todo .wy-alert-title,.rst-content .wy-alert-info.admonition .admonition-title,.rst-content .wy-alert-info.admonition .wy-alert-title,.rst-content .wy-alert-info.attention .admonition-title,.rst-content .wy-alert-info.attention .wy-alert-title,.rst-content .wy-alert-info.caution .admonition-title,.rst-content .wy-alert-info.caution .wy-alert-title,.rst-content .wy-alert-info.danger .admonition-title,.rst-content .wy-alert-info.danger .wy-alert-title,.rst-content .wy-alert-info.error .admonition-title,.rst-content .wy-alert-info.error .wy-alert-title,.rst-content .wy-alert-info.hint .admonition-title,.rst-content .wy-alert-info.hint .wy-alert-title,.rst-content .wy-alert-info.important .admonition-title,.rst-content .wy-alert-info.important .wy-alert-title,.rst-content .wy-alert-info.tip .admonition-title,.rst-content .wy-alert-info.tip .wy-alert-title,.rst-content .wy-alert-info.warning .admonition-title,.rst-content .wy-alert-info.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-info .admonition-title,.wy-alert.wy-alert-info .rst-content .admonition-title,.wy-alert.wy-alert-info .wy-alert-title{background:#6ab0de}.rst-content .hint,.rst-content .important,.rst-content .tip,.rst-content .wy-alert-success.admonition,.rst-content .wy-alert-success.admonition-todo,.rst-content .wy-alert-success.attention,.rst-content .wy-alert-success.caution,.rst-content .wy-alert-success.danger,.rst-content .wy-alert-success.error,.rst-content .wy-alert-success.note,.rst-content .wy-alert-success.seealso,.rst-content .wy-alert-success.warning,.wy-alert.wy-alert-success{background:#dbfaf4}.rst-content .hint .admonition-title,.rst-content .hint .wy-alert-title,.rst-content .important .admonition-title,.rst-content .important .wy-alert-title,.rst-content .tip .admonition-title,.rst-content .tip .wy-alert-title,.rst-content .wy-alert-success.admonition-todo .admonition-title,.rst-content .wy-alert-success.admonition-todo .wy-alert-title,.rst-content .wy-alert-success.admonition .admonition-title,.rst-content .wy-alert-success.admonition .wy-alert-title,.rst-content .wy-alert-success.attention .admonition-title,.rst-content .wy-alert-success.attention .wy-alert-title,.rst-content .wy-alert-success.caution .admonition-title,.rst-content .wy-alert-success.caution .wy-alert-title,.rst-content .wy-alert-success.danger .admonition-title,.rst-content .wy-alert-success.danger .wy-alert-title,.rst-content .wy-alert-success.error .admonition-title,.rst-content .wy-alert-success.error .wy-alert-title,.rst-content .wy-alert-success.note .admonition-title,.rst-content .wy-alert-success.note .wy-alert-title,.rst-content .wy-alert-success.seealso .admonition-title,.rst-content .wy-alert-success.seealso .wy-alert-title,.rst-content .wy-alert-success.warning .admonition-title,.rst-content .wy-alert-success.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-success .admonition-title,.wy-alert.wy-alert-success .rst-content .admonition-title,.wy-alert.wy-alert-success .wy-alert-title{background:#1abc9c}.rst-content .wy-alert-neutral.admonition,.rst-content .wy-alert-neutral.admonition-todo,.rst-content .wy-alert-neutral.attention,.rst-content .wy-alert-neutral.caution,.rst-content .wy-alert-neutral.danger,.rst-content .wy-alert-neutral.error,.rst-content .wy-alert-neutral.hint,.rst-content .wy-alert-neutral.important,.rst-content .wy-alert-neutral.note,.rst-content .wy-alert-neutral.seealso,.rst-content .wy-alert-neutral.tip,.rst-content .wy-alert-neutral.warning,.wy-alert.wy-alert-neutral{background:#f3f6f6}.rst-content .wy-alert-neutral.admonition-todo .admonition-title,.rst-content .wy-alert-neutral.admonition-todo .wy-alert-title,.rst-content .wy-alert-neutral.admonition .admonition-title,.rst-content .wy-alert-neutral.admonition .wy-alert-title,.rst-content .wy-alert-neutral.attention .admonition-title,.rst-content .wy-alert-neutral.attention .wy-alert-title,.rst-content .wy-alert-neutral.caution .admonition-title,.rst-content .wy-alert-neutral.caution .wy-alert-title,.rst-content .wy-alert-neutral.danger .admonition-title,.rst-content .wy-alert-neutral.danger .wy-alert-title,.rst-content .wy-alert-neutral.error .admonition-title,.rst-content .wy-alert-neutral.error .wy-alert-title,.rst-content .wy-alert-neutral.hint .admonition-title,.rst-content .wy-alert-neutral.hint .wy-alert-title,.rst-content .wy-alert-neutral.important .admonition-title,.rst-content .wy-alert-neutral.important .wy-alert-title,.rst-content .wy-alert-neutral.note .admonition-title,.rst-content .wy-alert-neutral.note .wy-alert-title,.rst-content .wy-alert-neutral.seealso .admonition-title,.rst-content .wy-alert-neutral.seealso .wy-alert-title,.rst-content .wy-alert-neutral.tip .admonition-title,.rst-content .wy-alert-neutral.tip .wy-alert-title,.rst-content .wy-alert-neutral.warning .admonition-title,.rst-content .wy-alert-neutral.warning .wy-alert-title,.rst-content .wy-alert.wy-alert-neutral .admonition-title,.wy-alert.wy-alert-neutral .rst-content .admonition-title,.wy-alert.wy-alert-neutral .wy-alert-title{color:#404040;background:#e1e4e5}.rst-content .wy-alert-neutral.admonition-todo a,.rst-content .wy-alert-neutral.admonition a,.rst-content .wy-alert-neutral.attention a,.rst-content .wy-alert-neutral.caution a,.rst-content .wy-alert-neutral.danger a,.rst-content .wy-alert-neutral.error a,.rst-content .wy-alert-neutral.hint a,.rst-content .wy-alert-neutral.important a,.rst-content .wy-alert-neutral.note a,.rst-content .wy-alert-neutral.seealso a,.rst-content .wy-alert-neutral.tip a,.rst-content .wy-alert-neutral.warning a,.wy-alert.wy-alert-neutral a{color:#2980b9}.rst-content .admonition-todo p:last-child,.rst-content .admonition p:last-child,.rst-content .attention p:last-child,.rst-content .caution p:last-child,.rst-content .danger p:last-child,.rst-content .error p:last-child,.rst-content .hint p:last-child,.rst-content .important p:last-child,.rst-content .note p:last-child,.rst-content .seealso p:last-child,.rst-content .tip p:last-child,.rst-content .warning p:last-child,.wy-alert p:last-child{margin-bottom:0}.wy-tray-container{position:fixed;bottom:0;left:0;z-index:600}.wy-tray-container li{display:block;width:300px;background:transparent;color:#fff;text-align:center;box-shadow:0 5px 5px 0 rgba(0,0,0,.1);padding:0 24px;min-width:20%;opacity:0;height:0;line-height:56px;overflow:hidden;-webkit-transition:all .3s ease-in;-moz-transition:all .3s ease-in;transition:all .3s ease-in}.wy-tray-container li.wy-tray-item-success{background:#27ae60}.wy-tray-container li.wy-tray-item-info{background:#2980b9}.wy-tray-container li.wy-tray-item-warning{background:#e67e22}.wy-tray-container li.wy-tray-item-danger{background:#e74c3c}.wy-tray-container li.on{opacity:1;height:56px}@media screen and (max-width:768px){.wy-tray-container{bottom:auto;top:0;width:100%}.wy-tray-container li{width:100%}}button{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle;cursor:pointer;line-height:normal;-webkit-appearance:button;*overflow:visible}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}button[disabled]{cursor:default}.btn{display:inline-block;border-radius:2px;line-height:normal;white-space:nowrap;text-align:center;cursor:pointer;font-size:100%;padding:6px 12px 8px;color:#fff;border:1px solid rgba(0,0,0,.1);background-color:#27ae60;text-decoration:none;font-weight:400;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 2px -1px hsla(0,0%,100%,.5),inset 0 -2px 0 0 rgba(0,0,0,.1);outline-none:false;vertical-align:middle;*display:inline;zoom:1;-webkit-user-drag:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transition:all .1s linear;-moz-transition:all .1s linear;transition:all .1s linear}.btn-hover{background:#2e8ece;color:#fff}.btn:hover{background:#2cc36b;color:#fff}.btn:focus{background:#2cc36b;outline:0}.btn:active{box-shadow:inset 0 -1px 0 0 rgba(0,0,0,.05),inset 0 2px 0 0 rgba(0,0,0,.1);padding:8px 12px 6px}.btn:visited{color:#fff}.btn-disabled,.btn-disabled:active,.btn-disabled:focus,.btn-disabled:hover,.btn:disabled{background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);filter:alpha(opacity=40);opacity:.4;cursor:not-allowed;box-shadow:none}.btn::-moz-focus-inner{padding:0;border:0}.btn-small{font-size:80%}.btn-info{background-color:#2980b9!important}.btn-info:hover{background-color:#2e8ece!important}.btn-neutral{background-color:#f3f6f6!important;color:#404040!important}.btn-neutral:hover{background-color:#e5ebeb!important;color:#404040}.btn-neutral:visited{color:#404040!important}.btn-success{background-color:#27ae60!important}.btn-success:hover{background-color:#295!important}.btn-danger{background-color:#e74c3c!important}.btn-danger:hover{background-color:#ea6153!important}.btn-warning{background-color:#e67e22!important}.btn-warning:hover{background-color:#e98b39!important}.btn-invert{background-color:#222}.btn-invert:hover{background-color:#2f2f2f!important}.btn-link{background-color:transparent!important;color:#2980b9;box-shadow:none;border-color:transparent!important}.btn-link:active,.btn-link:hover{background-color:transparent!important;color:#409ad5!important;box-shadow:none}.btn-link:visited{color:#9b59b6}.wy-btn-group .btn,.wy-control .btn{vertical-align:middle}.wy-btn-group{margin-bottom:24px;*zoom:1}.wy-btn-group:after,.wy-btn-group:before{display:table;content:""}.wy-btn-group:after{clear:both}.wy-dropdown{position:relative;display:inline-block}.wy-dropdown-active .wy-dropdown-menu{display:block}.wy-dropdown-menu{position:absolute;left:0;display:none;float:left;top:100%;min-width:100%;background:#fcfcfc;z-index:100;border:1px solid #cfd7dd;box-shadow:0 2px 2px 0 rgba(0,0,0,.1);padding:12px}.wy-dropdown-menu>dd>a{display:block;clear:both;color:#404040;white-space:nowrap;font-size:90%;padding:0 12px;cursor:pointer}.wy-dropdown-menu>dd>a:hover{background:#2980b9;color:#fff}.wy-dropdown-menu>dd.divider{border-top:1px solid #cfd7dd;margin:6px 0}.wy-dropdown-menu>dd.search{padding-bottom:12px}.wy-dropdown-menu>dd.search input[type=search]{width:100%}.wy-dropdown-menu>dd.call-to-action{background:#e3e3e3;text-transform:uppercase;font-weight:500;font-size:80%}.wy-dropdown-menu>dd.call-to-action:hover{background:#e3e3e3}.wy-dropdown-menu>dd.call-to-action .btn{color:#fff}.wy-dropdown.wy-dropdown-up .wy-dropdown-menu{bottom:100%;top:auto;left:auto;right:0}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu{background:#fcfcfc;margin-top:2px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a{padding:6px 12px}.wy-dropdown.wy-dropdown-bubble .wy-dropdown-menu a:hover{background:#2980b9;color:#fff}.wy-dropdown.wy-dropdown-left .wy-dropdown-menu{right:0;left:auto;text-align:right}.wy-dropdown-arrow:before{content:" ";border-bottom:5px solid #f5f5f5;border-left:5px solid transparent;border-right:5px solid transparent;position:absolute;display:block;top:-4px;left:50%;margin-left:-3px}.wy-dropdown-arrow.wy-dropdown-arrow-left:before{left:11px}.wy-form-stacked select{display:block}.wy-form-aligned .wy-help-inline,.wy-form-aligned input,.wy-form-aligned label,.wy-form-aligned select,.wy-form-aligned textarea{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-form-aligned .wy-control-group>label{display:inline-block;vertical-align:middle;width:10em;margin:6px 12px 0 0;float:left}.wy-form-aligned .wy-control{float:left}.wy-form-aligned .wy-control label{display:block}.wy-form-aligned .wy-control select{margin-top:6px}fieldset{margin:0}fieldset,legend{border:0;padding:0}legend{width:100%;white-space:normal;margin-bottom:24px;font-size:150%;*margin-left:-7px}label,legend{display:block}label{margin:0 0 .3125em;color:#333;font-size:90%}input,select,textarea{font-size:100%;margin:0;vertical-align:baseline;*vertical-align:middle}.wy-control-group{margin-bottom:24px;max-width:1200px;margin-left:auto;margin-right:auto;*zoom:1}.wy-control-group:after,.wy-control-group:before{display:table;content:""}.wy-control-group:after{clear:both}.wy-control-group.wy-control-group-required>label:after{content:" *";color:#e74c3c}.wy-control-group .wy-form-full,.wy-control-group .wy-form-halves,.wy-control-group .wy-form-thirds{padding-bottom:12px}.wy-control-group .wy-form-full input[type=color],.wy-control-group .wy-form-full input[type=date],.wy-control-group .wy-form-full input[type=datetime-local],.wy-control-group .wy-form-full input[type=datetime],.wy-control-group .wy-form-full input[type=email],.wy-control-group .wy-form-full input[type=month],.wy-control-group .wy-form-full input[type=number],.wy-control-group .wy-form-full input[type=password],.wy-control-group .wy-form-full input[type=search],.wy-control-group .wy-form-full input[type=tel],.wy-control-group .wy-form-full input[type=text],.wy-control-group .wy-form-full input[type=time],.wy-control-group .wy-form-full input[type=url],.wy-control-group .wy-form-full input[type=week],.wy-control-group .wy-form-full select,.wy-control-group .wy-form-halves input[type=color],.wy-control-group .wy-form-halves input[type=date],.wy-control-group .wy-form-halves input[type=datetime-local],.wy-control-group .wy-form-halves input[type=datetime],.wy-control-group .wy-form-halves input[type=email],.wy-control-group .wy-form-halves input[type=month],.wy-control-group .wy-form-halves input[type=number],.wy-control-group .wy-form-halves input[type=password],.wy-control-group .wy-form-halves input[type=search],.wy-control-group .wy-form-halves input[type=tel],.wy-control-group .wy-form-halves input[type=text],.wy-control-group .wy-form-halves input[type=time],.wy-control-group .wy-form-halves input[type=url],.wy-control-group .wy-form-halves input[type=week],.wy-control-group .wy-form-halves select,.wy-control-group .wy-form-thirds input[type=color],.wy-control-group .wy-form-thirds input[type=date],.wy-control-group .wy-form-thirds input[type=datetime-local],.wy-control-group .wy-form-thirds input[type=datetime],.wy-control-group .wy-form-thirds input[type=email],.wy-control-group .wy-form-thirds input[type=month],.wy-control-group .wy-form-thirds input[type=number],.wy-control-group .wy-form-thirds input[type=password],.wy-control-group .wy-form-thirds input[type=search],.wy-control-group .wy-form-thirds input[type=tel],.wy-control-group .wy-form-thirds input[type=text],.wy-control-group .wy-form-thirds input[type=time],.wy-control-group .wy-form-thirds input[type=url],.wy-control-group .wy-form-thirds input[type=week],.wy-control-group .wy-form-thirds select{width:100%}.wy-control-group .wy-form-full{float:left;display:block;width:100%;margin-right:0}.wy-control-group .wy-form-full:last-child{margin-right:0}.wy-control-group .wy-form-halves{float:left;display:block;margin-right:2.35765%;width:48.82117%}.wy-control-group .wy-form-halves:last-child,.wy-control-group .wy-form-halves:nth-of-type(2n){margin-right:0}.wy-control-group .wy-form-halves:nth-of-type(odd){clear:left}.wy-control-group .wy-form-thirds{float:left;display:block;margin-right:2.35765%;width:31.76157%}.wy-control-group .wy-form-thirds:last-child,.wy-control-group .wy-form-thirds:nth-of-type(3n){margin-right:0}.wy-control-group .wy-form-thirds:nth-of-type(3n+1){clear:left}.wy-control-group.wy-control-group-no-input .wy-control,.wy-control-no-input{margin:6px 0 0;font-size:90%}.wy-control-no-input{display:inline-block}.wy-control-group.fluid-input input[type=color],.wy-control-group.fluid-input input[type=date],.wy-control-group.fluid-input input[type=datetime-local],.wy-control-group.fluid-input input[type=datetime],.wy-control-group.fluid-input input[type=email],.wy-control-group.fluid-input input[type=month],.wy-control-group.fluid-input input[type=number],.wy-control-group.fluid-input input[type=password],.wy-control-group.fluid-input input[type=search],.wy-control-group.fluid-input input[type=tel],.wy-control-group.fluid-input input[type=text],.wy-control-group.fluid-input input[type=time],.wy-control-group.fluid-input input[type=url],.wy-control-group.fluid-input input[type=week]{width:100%}.wy-form-message-inline{padding-left:.3em;color:#666;font-size:90%}.wy-form-message{display:block;color:#999;font-size:70%;margin-top:.3125em;font-style:italic}.wy-form-message p{font-size:inherit;font-style:italic;margin-bottom:6px}.wy-form-message p:last-child{margin-bottom:0}input{line-height:normal}input[type=button],input[type=reset],input[type=submit]{-webkit-appearance:button;cursor:pointer;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;*overflow:visible}input[type=color],input[type=date],input[type=datetime-local],input[type=datetime],input[type=email],input[type=month],input[type=number],input[type=password],input[type=search],input[type=tel],input[type=text],input[type=time],input[type=url],input[type=week]{-webkit-appearance:none;padding:6px;display:inline-block;border:1px solid #ccc;font-size:80%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;box-shadow:inset 0 1px 3px #ddd;border-radius:0;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}input[type=datetime-local]{padding:.34375em .625em}input[disabled]{cursor:default}input[type=checkbox],input[type=radio]{padding:0;margin-right:.3125em;*height:13px;*width:13px}input[type=checkbox],input[type=radio],input[type=search]{-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}input[type=search]::-webkit-search-cancel-button,input[type=search]::-webkit-search-decoration{-webkit-appearance:none}input[type=color]:focus,input[type=date]:focus,input[type=datetime-local]:focus,input[type=datetime]:focus,input[type=email]:focus,input[type=month]:focus,input[type=number]:focus,input[type=password]:focus,input[type=search]:focus,input[type=tel]:focus,input[type=text]:focus,input[type=time]:focus,input[type=url]:focus,input[type=week]:focus{outline:0;outline:thin dotted\9;border-color:#333}input.no-focus:focus{border-color:#ccc!important}input[type=checkbox]:focus,input[type=file]:focus,input[type=radio]:focus{outline:thin dotted #333;outline:1px auto #129fea}input[type=color][disabled],input[type=date][disabled],input[type=datetime-local][disabled],input[type=datetime][disabled],input[type=email][disabled],input[type=month][disabled],input[type=number][disabled],input[type=password][disabled],input[type=search][disabled],input[type=tel][disabled],input[type=text][disabled],input[type=time][disabled],input[type=url][disabled],input[type=week][disabled]{cursor:not-allowed;background-color:#fafafa}input:focus:invalid,select:focus:invalid,textarea:focus:invalid{color:#e74c3c;border:1px solid #e74c3c}input:focus:invalid:focus,select:focus:invalid:focus,textarea:focus:invalid:focus{border-color:#e74c3c}input[type=checkbox]:focus:invalid:focus,input[type=file]:focus:invalid:focus,input[type=radio]:focus:invalid:focus{outline-color:#e74c3c}input.wy-input-large{padding:12px;font-size:100%}textarea{overflow:auto;vertical-align:top;width:100%;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif}select,textarea{padding:.5em .625em;display:inline-block;border:1px solid #ccc;font-size:80%;box-shadow:inset 0 1px 3px #ddd;-webkit-transition:border .3s linear;-moz-transition:border .3s linear;transition:border .3s linear}select{border:1px solid #ccc;background-color:#fff}select[multiple]{height:auto}select:focus,textarea:focus{outline:0}input[readonly],select[disabled],select[readonly],textarea[disabled],textarea[readonly]{cursor:not-allowed;background-color:#fafafa}input[type=checkbox][disabled],input[type=radio][disabled]{cursor:not-allowed}.wy-checkbox,.wy-radio{margin:6px 0;color:#404040;display:block}.wy-checkbox input,.wy-radio input{vertical-align:baseline}.wy-form-message-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle}.wy-input-prefix,.wy-input-suffix{white-space:nowrap;padding:6px}.wy-input-prefix .wy-input-context,.wy-input-suffix .wy-input-context{line-height:27px;padding:0 8px;display:inline-block;font-size:80%;background-color:#f3f6f6;border:1px solid #ccc;color:#999}.wy-input-suffix .wy-input-context{border-left:0}.wy-input-prefix .wy-input-context{border-right:0}.wy-switch{position:relative;display:block;height:24px;margin-top:12px;cursor:pointer}.wy-switch:before{left:0;top:0;width:36px;height:12px;background:#ccc}.wy-switch:after,.wy-switch:before{position:absolute;content:"";display:block;border-radius:4px;-webkit-transition:all .2s ease-in-out;-moz-transition:all .2s ease-in-out;transition:all .2s ease-in-out}.wy-switch:after{width:18px;height:18px;background:#999;left:-3px;top:-3px}.wy-switch span{position:absolute;left:48px;display:block;font-size:12px;color:#ccc;line-height:1}.wy-switch.active:before{background:#1e8449}.wy-switch.active:after{left:24px;background:#27ae60}.wy-switch.disabled{cursor:not-allowed;opacity:.8}.wy-control-group.wy-control-group-error .wy-form-message,.wy-control-group.wy-control-group-error>label{color:#e74c3c}.wy-control-group.wy-control-group-error input[type=color],.wy-control-group.wy-control-group-error input[type=date],.wy-control-group.wy-control-group-error input[type=datetime-local],.wy-control-group.wy-control-group-error input[type=datetime],.wy-control-group.wy-control-group-error input[type=email],.wy-control-group.wy-control-group-error input[type=month],.wy-control-group.wy-control-group-error input[type=number],.wy-control-group.wy-control-group-error input[type=password],.wy-control-group.wy-control-group-error input[type=search],.wy-control-group.wy-control-group-error input[type=tel],.wy-control-group.wy-control-group-error input[type=text],.wy-control-group.wy-control-group-error input[type=time],.wy-control-group.wy-control-group-error input[type=url],.wy-control-group.wy-control-group-error input[type=week],.wy-control-group.wy-control-group-error textarea{border:1px solid #e74c3c}.wy-inline-validate{white-space:nowrap}.wy-inline-validate .wy-input-context{padding:.5em .625em;display:inline-block;font-size:80%}.wy-inline-validate.wy-inline-validate-success .wy-input-context{color:#27ae60}.wy-inline-validate.wy-inline-validate-danger .wy-input-context{color:#e74c3c}.wy-inline-validate.wy-inline-validate-warning .wy-input-context{color:#e67e22}.wy-inline-validate.wy-inline-validate-info .wy-input-context{color:#2980b9}.rotate-90{-webkit-transform:rotate(90deg);-moz-transform:rotate(90deg);-ms-transform:rotate(90deg);-o-transform:rotate(90deg);transform:rotate(90deg)}.rotate-180{-webkit-transform:rotate(180deg);-moz-transform:rotate(180deg);-ms-transform:rotate(180deg);-o-transform:rotate(180deg);transform:rotate(180deg)}.rotate-270{-webkit-transform:rotate(270deg);-moz-transform:rotate(270deg);-ms-transform:rotate(270deg);-o-transform:rotate(270deg);transform:rotate(270deg)}.mirror{-webkit-transform:scaleX(-1);-moz-transform:scaleX(-1);-ms-transform:scaleX(-1);-o-transform:scaleX(-1);transform:scaleX(-1)}.mirror.rotate-90{-webkit-transform:scaleX(-1) rotate(90deg);-moz-transform:scaleX(-1) rotate(90deg);-ms-transform:scaleX(-1) rotate(90deg);-o-transform:scaleX(-1) rotate(90deg);transform:scaleX(-1) rotate(90deg)}.mirror.rotate-180{-webkit-transform:scaleX(-1) rotate(180deg);-moz-transform:scaleX(-1) rotate(180deg);-ms-transform:scaleX(-1) rotate(180deg);-o-transform:scaleX(-1) rotate(180deg);transform:scaleX(-1) rotate(180deg)}.mirror.rotate-270{-webkit-transform:scaleX(-1) rotate(270deg);-moz-transform:scaleX(-1) rotate(270deg);-ms-transform:scaleX(-1) rotate(270deg);-o-transform:scaleX(-1) rotate(270deg);transform:scaleX(-1) rotate(270deg)}@media only screen and (max-width:480px){.wy-form button[type=submit]{margin:.7em 0 0}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=text],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week],.wy-form label{margin-bottom:.3em;display:block}.wy-form input[type=color],.wy-form input[type=date],.wy-form input[type=datetime-local],.wy-form input[type=datetime],.wy-form input[type=email],.wy-form input[type=month],.wy-form input[type=number],.wy-form input[type=password],.wy-form input[type=search],.wy-form input[type=tel],.wy-form input[type=time],.wy-form input[type=url],.wy-form input[type=week]{margin-bottom:0}.wy-form-aligned .wy-control-group label{margin-bottom:.3em;text-align:left;display:block;width:100%}.wy-form-aligned .wy-control{margin:1.5em 0 0}.wy-form-message,.wy-form-message-inline,.wy-form .wy-help-inline{display:block;font-size:80%;padding:6px 0}}@media screen and (max-width:768px){.tablet-hide{display:none}}@media screen and (max-width:480px){.mobile-hide{display:none}}.float-left{float:left}.float-right{float:right}.full-width{width:100%}.rst-content table.docutils,.rst-content table.field-list,.wy-table{border-collapse:collapse;border-spacing:0;empty-cells:show;margin-bottom:24px}.rst-content table.docutils caption,.rst-content table.field-list caption,.wy-table caption{color:#000;font:italic 85%/1 arial,sans-serif;padding:1em 0;text-align:center}.rst-content table.docutils td,.rst-content table.docutils th,.rst-content table.field-list td,.rst-content table.field-list th,.wy-table td,.wy-table th{font-size:90%;margin:0;overflow:visible;padding:8px 16px}.rst-content table.docutils td:first-child,.rst-content table.docutils th:first-child,.rst-content table.field-list td:first-child,.rst-content table.field-list th:first-child,.wy-table td:first-child,.wy-table th:first-child{border-left-width:0}.rst-content table.docutils thead,.rst-content table.field-list thead,.wy-table thead{color:#000;text-align:left;vertical-align:bottom;white-space:nowrap}.rst-content table.docutils thead th,.rst-content table.field-list thead th,.wy-table thead th{font-weight:700;border-bottom:2px solid #e1e4e5}.rst-content table.docutils td,.rst-content table.field-list td,.wy-table td{background-color:transparent;vertical-align:middle}.rst-content table.docutils td p,.rst-content table.field-list td p,.wy-table td p{line-height:18px}.rst-content table.docutils td p:last-child,.rst-content table.field-list td p:last-child,.wy-table td p:last-child{margin-bottom:0}.rst-content table.docutils .wy-table-cell-min,.rst-content table.field-list .wy-table-cell-min,.wy-table .wy-table-cell-min{width:1%;padding-right:0}.rst-content table.docutils .wy-table-cell-min input[type=checkbox],.rst-content table.field-list .wy-table-cell-min input[type=checkbox],.wy-table .wy-table-cell-min input[type=checkbox]{margin:0}.wy-table-secondary{color:grey;font-size:90%}.wy-table-tertiary{color:grey;font-size:80%}.rst-content table.docutils:not(.field-list) tr:nth-child(2n-1) td,.wy-table-backed,.wy-table-odd td,.wy-table-striped tr:nth-child(2n-1) td{background-color:#f3f6f6}.rst-content table.docutils,.wy-table-bordered-all{border:1px solid #e1e4e5}.rst-content table.docutils td,.wy-table-bordered-all td{border-bottom:1px solid #e1e4e5;border-left:1px solid #e1e4e5}.rst-content table.docutils tbody>tr:last-child td,.wy-table-bordered-all tbody>tr:last-child td{border-bottom-width:0}.wy-table-bordered{border:1px solid #e1e4e5}.wy-table-bordered-rows td{border-bottom:1px solid #e1e4e5}.wy-table-bordered-rows tbody>tr:last-child td{border-bottom-width:0}.wy-table-horizontal td,.wy-table-horizontal th{border-width:0 0 1px;border-bottom:1px solid #e1e4e5}.wy-table-horizontal tbody>tr:last-child td{border-bottom-width:0}.wy-table-responsive{margin-bottom:24px;max-width:100%;overflow:auto}.wy-table-responsive table{margin-bottom:0!important}.wy-table-responsive table td,.wy-table-responsive table th{white-space:nowrap}a{color:#2980b9;text-decoration:none;cursor:pointer}a:hover{color:#3091d1}a:visited{color:#9b59b6}html{height:100%}body,html{overflow-x:hidden}body{font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;font-weight:400;color:#404040;min-height:100%;background:#edf0f2}.wy-text-left{text-align:left}.wy-text-center{text-align:center}.wy-text-right{text-align:right}.wy-text-large{font-size:120%}.wy-text-normal{font-size:100%}.wy-text-small,small{font-size:80%}.wy-text-strike{text-decoration:line-through}.wy-text-warning{color:#e67e22!important}a.wy-text-warning:hover{color:#eb9950!important}.wy-text-info{color:#2980b9!important}a.wy-text-info:hover{color:#409ad5!important}.wy-text-success{color:#27ae60!important}a.wy-text-success:hover{color:#36d278!important}.wy-text-danger{color:#e74c3c!important}a.wy-text-danger:hover{color:#ed7669!important}.wy-text-neutral{color:#404040!important}a.wy-text-neutral:hover{color:#595959!important}.rst-content .toctree-wrapper>p.caption,h1,h2,h3,h4,h5,h6,legend{margin-top:0;font-weight:700;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif}p{line-height:24px;font-size:16px;margin:0 0 24px}h1{font-size:175%}.rst-content .toctree-wrapper>p.caption,h2{font-size:150%}h3{font-size:125%}h4{font-size:115%}h5{font-size:110%}h6{font-size:100%}hr{display:block;height:1px;border:0;border-top:1px solid #e1e4e5;margin:24px 0;padding:0}.rst-content code,.rst-content tt,code{white-space:nowrap;max-width:100%;background:#fff;border:1px solid #e1e4e5;font-size:75%;padding:0 5px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#e74c3c;overflow-x:auto}.rst-content tt.code-large,code.code-large{font-size:90%}.rst-content .section ul,.rst-content .toctree-wrapper ul,.rst-content section ul,.wy-plain-list-disc,article ul{list-style:disc;line-height:24px;margin-bottom:24px}.rst-content .section ul li,.rst-content .toctree-wrapper ul li,.rst-content section ul li,.wy-plain-list-disc li,article ul li{list-style:disc;margin-left:24px}.rst-content .section ul li p:last-child,.rst-content .section ul li ul,.rst-content .toctree-wrapper ul li p:last-child,.rst-content .toctree-wrapper ul li ul,.rst-content section ul li p:last-child,.rst-content section ul li ul,.wy-plain-list-disc li p:last-child,.wy-plain-list-disc li ul,article ul li p:last-child,article ul li ul{margin-bottom:0}.rst-content .section ul li li,.rst-content .toctree-wrapper ul li li,.rst-content section ul li li,.wy-plain-list-disc li li,article ul li li{list-style:circle}.rst-content .section ul li li li,.rst-content .toctree-wrapper ul li li li,.rst-content section ul li li li,.wy-plain-list-disc li li li,article ul li li li{list-style:square}.rst-content .section ul li ol li,.rst-content .toctree-wrapper ul li ol li,.rst-content section ul li ol li,.wy-plain-list-disc li ol li,article ul li ol li{list-style:decimal}.rst-content .section ol,.rst-content .section ol.arabic,.rst-content .toctree-wrapper ol,.rst-content .toctree-wrapper ol.arabic,.rst-content section ol,.rst-content section ol.arabic,.wy-plain-list-decimal,article ol{list-style:decimal;line-height:24px;margin-bottom:24px}.rst-content .section ol.arabic li,.rst-content .section ol li,.rst-content .toctree-wrapper ol.arabic li,.rst-content .toctree-wrapper ol li,.rst-content section ol.arabic li,.rst-content section ol li,.wy-plain-list-decimal li,article ol li{list-style:decimal;margin-left:24px}.rst-content .section ol.arabic li ul,.rst-content .section ol li p:last-child,.rst-content .section ol li ul,.rst-content .toctree-wrapper ol.arabic li ul,.rst-content .toctree-wrapper ol li p:last-child,.rst-content .toctree-wrapper ol li ul,.rst-content section ol.arabic li ul,.rst-content section ol li p:last-child,.rst-content section ol li ul,.wy-plain-list-decimal li p:last-child,.wy-plain-list-decimal li ul,article ol li p:last-child,article ol li ul{margin-bottom:0}.rst-content .section ol.arabic li ul li,.rst-content .section ol li ul li,.rst-content .toctree-wrapper ol.arabic li ul li,.rst-content .toctree-wrapper ol li ul li,.rst-content section ol.arabic li ul li,.rst-content section ol li ul li,.wy-plain-list-decimal li ul li,article ol li ul li{list-style:disc}.wy-breadcrumbs{*zoom:1}.wy-breadcrumbs:after,.wy-breadcrumbs:before{display:table;content:""}.wy-breadcrumbs:after{clear:both}.wy-breadcrumbs>li{display:inline-block;padding-top:5px}.wy-breadcrumbs>li.wy-breadcrumbs-aside{float:right}.rst-content .wy-breadcrumbs>li code,.rst-content .wy-breadcrumbs>li tt,.wy-breadcrumbs>li .rst-content tt,.wy-breadcrumbs>li code{all:inherit;color:inherit}.breadcrumb-item:before{content:"/";color:#bbb;font-size:13px;padding:0 6px 0 3px}.wy-breadcrumbs-extra{margin-bottom:0;color:#b3b3b3;font-size:80%;display:inline-block}@media screen and (max-width:480px){.wy-breadcrumbs-extra,.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}@media print{.wy-breadcrumbs li.wy-breadcrumbs-aside{display:none}}html{font-size:16px}.wy-affix{position:fixed;top:1.618em}.wy-menu a:hover{text-decoration:none}.wy-menu-horiz{*zoom:1}.wy-menu-horiz:after,.wy-menu-horiz:before{display:table;content:""}.wy-menu-horiz:after{clear:both}.wy-menu-horiz li,.wy-menu-horiz ul{display:inline-block}.wy-menu-horiz li:hover{background:hsla(0,0%,100%,.1)}.wy-menu-horiz li.divide-left{border-left:1px solid #404040}.wy-menu-horiz li.divide-right{border-right:1px solid #404040}.wy-menu-horiz a{height:32px;display:inline-block;line-height:32px;padding:0 16px}.wy-menu-vertical{width:300px}.wy-menu-vertical header,.wy-menu-vertical p.caption{color:#55a5d9;height:32px;line-height:32px;padding:0 1.618em;margin:12px 0 0;display:block;font-weight:700;text-transform:uppercase;font-size:85%;white-space:nowrap}.wy-menu-vertical ul{margin-bottom:0}.wy-menu-vertical li.divide-top{border-top:1px solid #404040}.wy-menu-vertical li.divide-bottom{border-bottom:1px solid #404040}.wy-menu-vertical li.current{background:#e3e3e3}.wy-menu-vertical li.current a{color:grey;border-right:1px solid #c9c9c9;padding:.4045em 2.427em}.wy-menu-vertical li.current a:hover{background:#d6d6d6}.rst-content .wy-menu-vertical li tt,.wy-menu-vertical li .rst-content tt,.wy-menu-vertical li code{border:none;background:inherit;color:inherit;padding-left:0;padding-right:0}.wy-menu-vertical li button.toctree-expand{display:block;float:left;margin-left:-1.2em;line-height:18px;color:#4d4d4d;border:none;background:none;padding:0}.wy-menu-vertical li.current>a,.wy-menu-vertical li.on a{color:#404040;font-weight:700;position:relative;background:#fcfcfc;border:none;padding:.4045em 1.618em}.wy-menu-vertical li.current>a:hover,.wy-menu-vertical li.on a:hover{background:#fcfcfc}.wy-menu-vertical li.current>a:hover button.toctree-expand,.wy-menu-vertical li.on a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.current>a button.toctree-expand,.wy-menu-vertical li.on a button.toctree-expand{display:block;line-height:18px;color:#333}.wy-menu-vertical li.toctree-l1.current>a{border-bottom:1px solid #c9c9c9;border-top:1px solid #c9c9c9}.wy-menu-vertical .toctree-l1.current .toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .toctree-l11>ul{display:none}.wy-menu-vertical .toctree-l1.current .current.toctree-l2>ul,.wy-menu-vertical .toctree-l2.current .current.toctree-l3>ul,.wy-menu-vertical .toctree-l3.current .current.toctree-l4>ul,.wy-menu-vertical .toctree-l4.current .current.toctree-l5>ul,.wy-menu-vertical .toctree-l5.current .current.toctree-l6>ul,.wy-menu-vertical .toctree-l6.current .current.toctree-l7>ul,.wy-menu-vertical .toctree-l7.current .current.toctree-l8>ul,.wy-menu-vertical .toctree-l8.current .current.toctree-l9>ul,.wy-menu-vertical .toctree-l9.current .current.toctree-l10>ul,.wy-menu-vertical .toctree-l10.current .current.toctree-l11>ul{display:block}.wy-menu-vertical li.toctree-l3,.wy-menu-vertical li.toctree-l4{font-size:.9em}.wy-menu-vertical li.toctree-l2 a,.wy-menu-vertical li.toctree-l3 a,.wy-menu-vertical li.toctree-l4 a,.wy-menu-vertical li.toctree-l5 a,.wy-menu-vertical li.toctree-l6 a,.wy-menu-vertical li.toctree-l7 a,.wy-menu-vertical li.toctree-l8 a,.wy-menu-vertical li.toctree-l9 a,.wy-menu-vertical li.toctree-l10 a{color:#404040}.wy-menu-vertical li.toctree-l2 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l3 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l4 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l5 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l6 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l7 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l8 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l9 a:hover button.toctree-expand,.wy-menu-vertical li.toctree-l10 a:hover button.toctree-expand{color:grey}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a,.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a,.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a,.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a,.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a,.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a,.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a,.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{display:block}.wy-menu-vertical li.toctree-l2.current>a{padding:.4045em 2.427em}.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{padding:.4045em 1.618em .4045em 4.045em}.wy-menu-vertical li.toctree-l3.current>a{padding:.4045em 4.045em}.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{padding:.4045em 1.618em .4045em 5.663em}.wy-menu-vertical li.toctree-l4.current>a{padding:.4045em 5.663em}.wy-menu-vertical li.toctree-l4.current li.toctree-l5>a{padding:.4045em 1.618em .4045em 7.281em}.wy-menu-vertical li.toctree-l5.current>a{padding:.4045em 7.281em}.wy-menu-vertical li.toctree-l5.current li.toctree-l6>a{padding:.4045em 1.618em .4045em 8.899em}.wy-menu-vertical li.toctree-l6.current>a{padding:.4045em 8.899em}.wy-menu-vertical li.toctree-l6.current li.toctree-l7>a{padding:.4045em 1.618em .4045em 10.517em}.wy-menu-vertical li.toctree-l7.current>a{padding:.4045em 10.517em}.wy-menu-vertical li.toctree-l7.current li.toctree-l8>a{padding:.4045em 1.618em .4045em 12.135em}.wy-menu-vertical li.toctree-l8.current>a{padding:.4045em 12.135em}.wy-menu-vertical li.toctree-l8.current li.toctree-l9>a{padding:.4045em 1.618em .4045em 13.753em}.wy-menu-vertical li.toctree-l9.current>a{padding:.4045em 13.753em}.wy-menu-vertical li.toctree-l9.current li.toctree-l10>a{padding:.4045em 1.618em .4045em 15.371em}.wy-menu-vertical li.toctree-l10.current>a{padding:.4045em 15.371em}.wy-menu-vertical li.toctree-l10.current li.toctree-l11>a{padding:.4045em 1.618em .4045em 16.989em}.wy-menu-vertical li.toctree-l2.current>a,.wy-menu-vertical li.toctree-l2.current li.toctree-l3>a{background:#c9c9c9}.wy-menu-vertical li.toctree-l2 button.toctree-expand{color:#a3a3a3}.wy-menu-vertical li.toctree-l3.current>a,.wy-menu-vertical li.toctree-l3.current li.toctree-l4>a{background:#bdbdbd}.wy-menu-vertical li.toctree-l3 button.toctree-expand{color:#969696}.wy-menu-vertical li.current ul{display:block}.wy-menu-vertical li ul{margin-bottom:0;display:none}.wy-menu-vertical li ul li a{margin-bottom:0;color:#d9d9d9;font-weight:400}.wy-menu-vertical a{line-height:18px;padding:.4045em 1.618em;display:block;position:relative;font-size:90%;color:#d9d9d9}.wy-menu-vertical a:hover{background-color:#4e4a4a;cursor:pointer}.wy-menu-vertical a:hover button.toctree-expand{color:#d9d9d9}.wy-menu-vertical a:active{background-color:#2980b9;cursor:pointer;color:#fff}.wy-menu-vertical a:active button.toctree-expand{color:#fff}.wy-side-nav-search{display:block;width:300px;padding:.809em;margin-bottom:.809em;z-index:200;background-color:#2980b9;text-align:center;color:#fcfcfc}.wy-side-nav-search input[type=text]{width:100%;border-radius:50px;padding:6px 12px;border-color:#2472a4}.wy-side-nav-search img{display:block;margin:auto auto .809em;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-side-nav-search .wy-dropdown>a,.wy-side-nav-search>a{color:#fcfcfc;font-size:100%;font-weight:700;display:inline-block;padding:4px 6px;margin-bottom:.809em;max-width:100%}.wy-side-nav-search .wy-dropdown>a:hover,.wy-side-nav-search>a:hover{background:hsla(0,0%,100%,.1)}.wy-side-nav-search .wy-dropdown>a img.logo,.wy-side-nav-search>a img.logo{display:block;margin:0 auto;height:auto;width:auto;border-radius:0;max-width:100%;background:transparent}.wy-side-nav-search .wy-dropdown>a.icon img.logo,.wy-side-nav-search>a.icon img.logo{margin-top:.85em}.wy-side-nav-search>div.version{margin-top:-.4045em;margin-bottom:.809em;font-weight:400;color:hsla(0,0%,100%,.3)}.wy-nav .wy-menu-vertical header{color:#2980b9}.wy-nav .wy-menu-vertical a{color:#b3b3b3}.wy-nav .wy-menu-vertical a:hover{background-color:#2980b9;color:#fff}[data-menu-wrap]{-webkit-transition:all .2s ease-in;-moz-transition:all .2s ease-in;transition:all .2s ease-in;position:absolute;opacity:1;width:100%;opacity:0}[data-menu-wrap].move-center{left:0;right:auto;opacity:1}[data-menu-wrap].move-left{right:auto;left:-100%;opacity:0}[data-menu-wrap].move-right{right:-100%;left:auto;opacity:0}.wy-body-for-nav{background:#fcfcfc}.wy-grid-for-nav{position:absolute;width:100%;height:100%}.wy-nav-side{position:fixed;top:0;bottom:0;left:0;padding-bottom:2em;width:300px;overflow-x:hidden;overflow-y:hidden;min-height:100%;color:#9b9b9b;background:#343131;z-index:200}.wy-side-scroll{width:320px;position:relative;overflow-x:hidden;overflow-y:scroll;height:100%}.wy-nav-top{display:none;background:#2980b9;color:#fff;padding:.4045em .809em;position:relative;line-height:50px;text-align:center;font-size:100%;*zoom:1}.wy-nav-top:after,.wy-nav-top:before{display:table;content:""}.wy-nav-top:after{clear:both}.wy-nav-top a{color:#fff;font-weight:700}.wy-nav-top img{margin-right:12px;height:45px;width:45px;background-color:#2980b9;padding:5px;border-radius:100%}.wy-nav-top i{font-size:30px;float:left;cursor:pointer;padding-top:inherit}.wy-nav-content-wrap{margin-left:300px;background:#fcfcfc;min-height:100%}.wy-nav-content{padding:1.618em 3.236em;height:100%;max-width:800px;margin:auto}.wy-body-mask{position:fixed;width:100%;height:100%;background:rgba(0,0,0,.2);display:none;z-index:499}.wy-body-mask.on{display:block}footer{color:grey}footer p{margin-bottom:12px}.rst-content footer span.commit tt,footer span.commit .rst-content tt,footer span.commit code{padding:0;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:1em;background:none;border:none;color:grey}.rst-footer-buttons{*zoom:1}.rst-footer-buttons:after,.rst-footer-buttons:before{width:100%;display:table;content:""}.rst-footer-buttons:after{clear:both}.rst-breadcrumbs-buttons{margin-top:12px;*zoom:1}.rst-breadcrumbs-buttons:after,.rst-breadcrumbs-buttons:before{display:table;content:""}.rst-breadcrumbs-buttons:after{clear:both}#search-results .search li{margin-bottom:24px;border-bottom:1px solid #e1e4e5;padding-bottom:24px}#search-results .search li:first-child{border-top:1px solid #e1e4e5;padding-top:24px}#search-results .search li a{font-size:120%;margin-bottom:12px;display:inline-block}#search-results .context{color:grey;font-size:90%}.genindextable li>ul{margin-left:24px}@media screen and (max-width:768px){.wy-body-for-nav{background:#fcfcfc}.wy-nav-top{display:block}.wy-nav-side{left:-300px}.wy-nav-side.shift{width:85%;left:0}.wy-menu.wy-menu-vertical,.wy-side-nav-search,.wy-side-scroll{width:auto}.wy-nav-content-wrap{margin-left:0}.wy-nav-content-wrap .wy-nav-content{padding:1.618em}.wy-nav-content-wrap.shift{position:fixed;min-width:100%;left:85%;top:0;height:100%;overflow:hidden}}@media screen and (min-width:1100px){.wy-nav-content-wrap{background:rgba(0,0,0,.05)}.wy-nav-content{margin:0;background:#fcfcfc}}@media print{.rst-versions,.wy-nav-side,footer{display:none}.wy-nav-content-wrap{margin-left:0}}.rst-versions{position:fixed;bottom:0;left:0;width:300px;color:#fcfcfc;background:#1f1d1d;font-family:Lato,proxima-nova,Helvetica Neue,Arial,sans-serif;z-index:400}.rst-versions a{color:#2980b9;text-decoration:none}.rst-versions .rst-badge-small{display:none}.rst-versions .rst-current-version{padding:12px;background-color:#272525;display:block;text-align:right;font-size:90%;cursor:pointer;color:#27ae60;*zoom:1}.rst-versions .rst-current-version:after,.rst-versions .rst-current-version:before{display:table;content:""}.rst-versions .rst-current-version:after{clear:both}.rst-content .code-block-caption .rst-versions .rst-current-version .headerlink,.rst-content .eqno .rst-versions .rst-current-version .headerlink,.rst-content .rst-versions .rst-current-version .admonition-title,.rst-content code.download .rst-versions .rst-current-version span:first-child,.rst-content dl dt .rst-versions .rst-current-version .headerlink,.rst-content h1 .rst-versions .rst-current-version .headerlink,.rst-content h2 .rst-versions .rst-current-version .headerlink,.rst-content h3 .rst-versions .rst-current-version .headerlink,.rst-content h4 .rst-versions .rst-current-version .headerlink,.rst-content h5 .rst-versions .rst-current-version .headerlink,.rst-content h6 .rst-versions .rst-current-version .headerlink,.rst-content p .rst-versions .rst-current-version .headerlink,.rst-content table>caption .rst-versions .rst-current-version .headerlink,.rst-content tt.download .rst-versions .rst-current-version span:first-child,.rst-versions .rst-current-version .fa,.rst-versions .rst-current-version .icon,.rst-versions .rst-current-version .rst-content .admonition-title,.rst-versions .rst-current-version .rst-content .code-block-caption .headerlink,.rst-versions .rst-current-version .rst-content .eqno .headerlink,.rst-versions .rst-current-version .rst-content code.download span:first-child,.rst-versions .rst-current-version .rst-content dl dt .headerlink,.rst-versions .rst-current-version .rst-content h1 .headerlink,.rst-versions .rst-current-version .rst-content h2 .headerlink,.rst-versions .rst-current-version .rst-content h3 .headerlink,.rst-versions .rst-current-version .rst-content h4 .headerlink,.rst-versions .rst-current-version .rst-content h5 .headerlink,.rst-versions .rst-current-version .rst-content h6 .headerlink,.rst-versions .rst-current-version .rst-content p .headerlink,.rst-versions .rst-current-version .rst-content table>caption .headerlink,.rst-versions .rst-current-version .rst-content tt.download span:first-child,.rst-versions .rst-current-version .wy-menu-vertical li button.toctree-expand,.wy-menu-vertical li .rst-versions .rst-current-version button.toctree-expand{color:#fcfcfc}.rst-versions .rst-current-version .fa-book,.rst-versions .rst-current-version .icon-book{float:left}.rst-versions .rst-current-version.rst-out-of-date{background-color:#e74c3c;color:#fff}.rst-versions .rst-current-version.rst-active-old-version{background-color:#f1c40f;color:#000}.rst-versions.shift-up{height:auto;max-height:100%;overflow-y:scroll}.rst-versions.shift-up .rst-other-versions{display:block}.rst-versions .rst-other-versions{font-size:90%;padding:12px;color:grey;display:none}.rst-versions .rst-other-versions hr{display:block;height:1px;border:0;margin:20px 0;padding:0;border-top:1px solid #413d3d}.rst-versions .rst-other-versions dd{display:inline-block;margin:0}.rst-versions .rst-other-versions dd a{display:inline-block;padding:6px;color:#fcfcfc}.rst-versions.rst-badge{width:auto;bottom:20px;right:20px;left:auto;border:none;max-width:300px;max-height:90%}.rst-versions.rst-badge .fa-book,.rst-versions.rst-badge .icon-book{float:none;line-height:30px}.rst-versions.rst-badge.shift-up .rst-current-version{text-align:right}.rst-versions.rst-badge.shift-up .rst-current-version .fa-book,.rst-versions.rst-badge.shift-up .rst-current-version .icon-book{float:left}.rst-versions.rst-badge>.rst-current-version{width:auto;height:30px;line-height:30px;padding:0 6px;display:block;text-align:center}@media screen and (max-width:768px){.rst-versions{width:85%;display:none}.rst-versions.shift{display:block}}.rst-content .toctree-wrapper>p.caption,.rst-content h1,.rst-content h2,.rst-content h3,.rst-content h4,.rst-content h5,.rst-content h6{margin-bottom:24px}.rst-content img{max-width:100%;height:auto}.rst-content div.figure,.rst-content figure{margin-bottom:24px}.rst-content div.figure .caption-text,.rst-content figure .caption-text{font-style:italic}.rst-content div.figure p:last-child.caption,.rst-content figure p:last-child.caption{margin-bottom:0}.rst-content div.figure.align-center,.rst-content figure.align-center{text-align:center}.rst-content .section>a>img,.rst-content .section>img,.rst-content section>a>img,.rst-content section>img{margin-bottom:24px}.rst-content abbr[title]{text-decoration:none}.rst-content.style-external-links a.reference.external:after{font-family:FontAwesome;content:"\f08e";color:#b3b3b3;vertical-align:super;font-size:60%;margin:0 .2em}.rst-content blockquote{margin-left:24px;line-height:24px;margin-bottom:24px}.rst-content pre.literal-block{white-space:pre;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;display:block;overflow:auto}.rst-content div[class^=highlight],.rst-content pre.literal-block{border:1px solid #e1e4e5;overflow-x:auto;margin:1px 0 24px}.rst-content div[class^=highlight] div[class^=highlight],.rst-content pre.literal-block div[class^=highlight]{padding:0;border:none;margin:0}.rst-content div[class^=highlight] td.code{width:100%}.rst-content .linenodiv pre{border-right:1px solid #e6e9ea;margin:0;padding:12px;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;user-select:none;pointer-events:none}.rst-content div[class^=highlight] pre{white-space:pre;margin:0;padding:12px;display:block;overflow:auto}.rst-content div[class^=highlight] pre .hll{display:block;margin:0 -12px;padding:0 12px}.rst-content .linenodiv pre,.rst-content div[class^=highlight] pre,.rst-content pre.literal-block{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;font-size:12px;line-height:1.4}.rst-content div.highlight .gp,.rst-content div.highlight span.linenos{user-select:none;pointer-events:none}.rst-content div.highlight span.linenos{display:inline-block;padding-left:0;padding-right:12px;margin-right:12px;border-right:1px solid #e6e9ea}.rst-content .code-block-caption{font-style:italic;font-size:85%;line-height:1;padding:1em 0;text-align:center}@media print{.rst-content .codeblock,.rst-content div[class^=highlight],.rst-content div[class^=highlight] pre{white-space:pre-wrap}}.rst-content .admonition,.rst-content .admonition-todo,.rst-content .attention,.rst-content .caution,.rst-content .danger,.rst-content .error,.rst-content .hint,.rst-content .important,.rst-content .note,.rst-content .seealso,.rst-content .tip,.rst-content .warning{clear:both}.rst-content .admonition-todo .last,.rst-content .admonition-todo>:last-child,.rst-content .admonition .last,.rst-content .admonition>:last-child,.rst-content .attention .last,.rst-content .attention>:last-child,.rst-content .caution .last,.rst-content .caution>:last-child,.rst-content .danger .last,.rst-content .danger>:last-child,.rst-content .error .last,.rst-content .error>:last-child,.rst-content .hint .last,.rst-content .hint>:last-child,.rst-content .important .last,.rst-content .important>:last-child,.rst-content .note .last,.rst-content .note>:last-child,.rst-content .seealso .last,.rst-content .seealso>:last-child,.rst-content .tip .last,.rst-content .tip>:last-child,.rst-content .warning .last,.rst-content .warning>:last-child{margin-bottom:0}.rst-content .admonition-title:before{margin-right:4px}.rst-content .admonition table{border-color:rgba(0,0,0,.1)}.rst-content .admonition table td,.rst-content .admonition table th{background:transparent!important;border-color:rgba(0,0,0,.1)!important}.rst-content .section ol.loweralpha,.rst-content .section ol.loweralpha>li,.rst-content .toctree-wrapper ol.loweralpha,.rst-content .toctree-wrapper ol.loweralpha>li,.rst-content section ol.loweralpha,.rst-content section ol.loweralpha>li{list-style:lower-alpha}.rst-content .section ol.upperalpha,.rst-content .section ol.upperalpha>li,.rst-content .toctree-wrapper ol.upperalpha,.rst-content .toctree-wrapper ol.upperalpha>li,.rst-content section ol.upperalpha,.rst-content section ol.upperalpha>li{list-style:upper-alpha}.rst-content .section ol li>*,.rst-content .section ul li>*,.rst-content .toctree-wrapper ol li>*,.rst-content .toctree-wrapper ul li>*,.rst-content section ol li>*,.rst-content section ul li>*{margin-top:12px;margin-bottom:12px}.rst-content .section ol li>:first-child,.rst-content .section ul li>:first-child,.rst-content .toctree-wrapper ol li>:first-child,.rst-content .toctree-wrapper ul li>:first-child,.rst-content section ol li>:first-child,.rst-content section ul li>:first-child{margin-top:0}.rst-content .section ol li>p,.rst-content .section ol li>p:last-child,.rst-content .section ul li>p,.rst-content .section ul li>p:last-child,.rst-content .toctree-wrapper ol li>p,.rst-content .toctree-wrapper ol li>p:last-child,.rst-content .toctree-wrapper ul li>p,.rst-content .toctree-wrapper ul li>p:last-child,.rst-content section ol li>p,.rst-content section ol li>p:last-child,.rst-content section ul li>p,.rst-content section ul li>p:last-child{margin-bottom:12px}.rst-content .section ol li>p:only-child,.rst-content .section ol li>p:only-child:last-child,.rst-content .section ul li>p:only-child,.rst-content .section ul li>p:only-child:last-child,.rst-content .toctree-wrapper ol li>p:only-child,.rst-content .toctree-wrapper ol li>p:only-child:last-child,.rst-content .toctree-wrapper ul li>p:only-child,.rst-content .toctree-wrapper ul li>p:only-child:last-child,.rst-content section ol li>p:only-child,.rst-content section ol li>p:only-child:last-child,.rst-content section ul li>p:only-child,.rst-content section ul li>p:only-child:last-child{margin-bottom:0}.rst-content .section ol li>ol,.rst-content .section ol li>ul,.rst-content .section ul li>ol,.rst-content .section ul li>ul,.rst-content .toctree-wrapper ol li>ol,.rst-content .toctree-wrapper ol li>ul,.rst-content .toctree-wrapper ul li>ol,.rst-content .toctree-wrapper ul li>ul,.rst-content section ol li>ol,.rst-content section ol li>ul,.rst-content section ul li>ol,.rst-content section ul li>ul{margin-bottom:12px}.rst-content .section ol.simple li>*,.rst-content .section ol.simple li ol,.rst-content .section ol.simple li ul,.rst-content .section ul.simple li>*,.rst-content .section ul.simple li ol,.rst-content .section ul.simple li ul,.rst-content .toctree-wrapper ol.simple li>*,.rst-content .toctree-wrapper ol.simple li ol,.rst-content .toctree-wrapper ol.simple li ul,.rst-content .toctree-wrapper ul.simple li>*,.rst-content .toctree-wrapper ul.simple li ol,.rst-content .toctree-wrapper ul.simple li ul,.rst-content section ol.simple li>*,.rst-content section ol.simple li ol,.rst-content section ol.simple li ul,.rst-content section ul.simple li>*,.rst-content section ul.simple li ol,.rst-content section ul.simple li ul{margin-top:0;margin-bottom:0}.rst-content .line-block{margin-left:0;margin-bottom:24px;line-height:24px}.rst-content .line-block .line-block{margin-left:24px;margin-bottom:0}.rst-content .topic-title{font-weight:700;margin-bottom:12px}.rst-content .toc-backref{color:#404040}.rst-content .align-right{float:right;margin:0 0 24px 24px}.rst-content .align-left{float:left;margin:0 24px 24px 0}.rst-content .align-center{margin:auto}.rst-content .align-center:not(table){display:block}.rst-content .code-block-caption .headerlink,.rst-content .eqno .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink,.rst-content dl dt .headerlink,.rst-content h1 .headerlink,.rst-content h2 .headerlink,.rst-content h3 .headerlink,.rst-content h4 .headerlink,.rst-content h5 .headerlink,.rst-content h6 .headerlink,.rst-content p.caption .headerlink,.rst-content p .headerlink,.rst-content table>caption .headerlink{opacity:0;font-size:14px;font-family:FontAwesome;margin-left:.5em}.rst-content .code-block-caption .headerlink:focus,.rst-content .code-block-caption:hover .headerlink,.rst-content .eqno .headerlink:focus,.rst-content .eqno:hover .headerlink,.rst-content .toctree-wrapper>p.caption .headerlink:focus,.rst-content .toctree-wrapper>p.caption:hover .headerlink,.rst-content dl dt .headerlink:focus,.rst-content dl dt:hover .headerlink,.rst-content h1 .headerlink:focus,.rst-content h1:hover .headerlink,.rst-content h2 .headerlink:focus,.rst-content h2:hover .headerlink,.rst-content h3 .headerlink:focus,.rst-content h3:hover .headerlink,.rst-content h4 .headerlink:focus,.rst-content h4:hover .headerlink,.rst-content h5 .headerlink:focus,.rst-content h5:hover .headerlink,.rst-content h6 .headerlink:focus,.rst-content h6:hover .headerlink,.rst-content p.caption .headerlink:focus,.rst-content p.caption:hover .headerlink,.rst-content p .headerlink:focus,.rst-content p:hover .headerlink,.rst-content table>caption .headerlink:focus,.rst-content table>caption:hover .headerlink{opacity:1}.rst-content p a{overflow-wrap:anywhere}.rst-content .wy-table td p,.rst-content .wy-table td ul,.rst-content .wy-table th p,.rst-content .wy-table th ul,.rst-content table.docutils td p,.rst-content table.docutils td ul,.rst-content table.docutils th p,.rst-content table.docutils th ul,.rst-content table.field-list td p,.rst-content table.field-list td ul,.rst-content table.field-list th p,.rst-content table.field-list th ul{font-size:inherit}.rst-content .btn:focus{outline:2px solid}.rst-content table>caption .headerlink:after{font-size:12px}.rst-content .centered{text-align:center}.rst-content .sidebar{float:right;width:40%;display:block;margin:0 0 24px 24px;padding:24px;background:#f3f6f6;border:1px solid #e1e4e5}.rst-content .sidebar dl,.rst-content .sidebar p,.rst-content .sidebar ul{font-size:90%}.rst-content .sidebar .last,.rst-content .sidebar>:last-child{margin-bottom:0}.rst-content .sidebar .sidebar-title{display:block;font-family:Roboto Slab,ff-tisa-web-pro,Georgia,Arial,sans-serif;font-weight:700;background:#e1e4e5;padding:6px 12px;margin:-24px -24px 24px;font-size:100%}.rst-content .highlighted{background:#f1c40f;box-shadow:0 0 0 2px #f1c40f;display:inline;font-weight:700}.rst-content .citation-reference,.rst-content .footnote-reference{vertical-align:baseline;position:relative;top:-.4em;line-height:0;font-size:90%}.rst-content .citation-reference>span.fn-bracket,.rst-content .footnote-reference>span.fn-bracket{display:none}.rst-content .hlist{width:100%}.rst-content dl dt span.classifier:before{content:" : "}.rst-content dl dt span.classifier-delimiter{display:none!important}html.writer-html4 .rst-content table.docutils.citation,html.writer-html4 .rst-content table.docutils.footnote{background:none;border:none}html.writer-html4 .rst-content table.docutils.citation td,html.writer-html4 .rst-content table.docutils.citation tr,html.writer-html4 .rst-content table.docutils.footnote td,html.writer-html4 .rst-content table.docutils.footnote tr{border:none;background-color:transparent!important;white-space:normal}html.writer-html4 .rst-content table.docutils.citation td.label,html.writer-html4 .rst-content table.docutils.footnote td.label{padding-left:0;padding-right:0;vertical-align:top}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{display:grid;grid-template-columns:auto minmax(80%,95%)}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{display:inline-grid;grid-template-columns:max-content auto}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{display:grid;grid-template-columns:auto auto minmax(.65rem,auto) minmax(40%,95%)}html.writer-html5 .rst-content aside.citation>span.label,html.writer-html5 .rst-content aside.footnote>span.label,html.writer-html5 .rst-content div.citation>span.label{grid-column-start:1;grid-column-end:2}html.writer-html5 .rst-content aside.citation>span.backrefs,html.writer-html5 .rst-content aside.footnote>span.backrefs,html.writer-html5 .rst-content div.citation>span.backrefs{grid-column-start:2;grid-column-end:3;grid-row-start:1;grid-row-end:3}html.writer-html5 .rst-content aside.citation>p,html.writer-html5 .rst-content aside.footnote>p,html.writer-html5 .rst-content div.citation>p{grid-column-start:4;grid-column-end:5}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.field-list,html.writer-html5 .rst-content dl.footnote{margin-bottom:24px}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dt{padding-left:1rem}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.field-list>dd,html.writer-html5 .rst-content dl.field-list>dt,html.writer-html5 .rst-content dl.footnote>dd,html.writer-html5 .rst-content dl.footnote>dt{margin-bottom:0}html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{font-size:.9rem}html.writer-html5 .rst-content dl.citation>dt,html.writer-html5 .rst-content dl.footnote>dt{margin:0 .5rem .5rem 0;line-height:1.2rem;word-break:break-all;font-weight:400}html.writer-html5 .rst-content dl.citation>dt>span.brackets:before,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:before{content:"["}html.writer-html5 .rst-content dl.citation>dt>span.brackets:after,html.writer-html5 .rst-content dl.footnote>dt>span.brackets:after{content:"]"}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a{word-break:keep-all}html.writer-html5 .rst-content dl.citation>dt>span.fn-backref>a:not(:first-child):before,html.writer-html5 .rst-content dl.footnote>dt>span.fn-backref>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content dl.citation>dd,html.writer-html5 .rst-content dl.footnote>dd{margin:0 0 .5rem;line-height:1.2rem}html.writer-html5 .rst-content dl.citation>dd p,html.writer-html5 .rst-content dl.footnote>dd p{font-size:.9rem}html.writer-html5 .rst-content aside.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content div.citation{padding-left:1rem;padding-right:1rem;font-size:.9rem;line-height:1.2rem}html.writer-html5 .rst-content aside.citation p,html.writer-html5 .rst-content aside.footnote p,html.writer-html5 .rst-content div.citation p{font-size:.9rem;line-height:1.2rem;margin-bottom:12px}html.writer-html5 .rst-content aside.citation span.backrefs,html.writer-html5 .rst-content aside.footnote span.backrefs,html.writer-html5 .rst-content div.citation span.backrefs{text-align:left;font-style:italic;margin-left:.65rem;word-break:break-word;word-spacing:-.1rem;max-width:5rem}html.writer-html5 .rst-content aside.citation span.backrefs>a,html.writer-html5 .rst-content aside.footnote span.backrefs>a,html.writer-html5 .rst-content div.citation span.backrefs>a{word-break:keep-all}html.writer-html5 .rst-content aside.citation span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content aside.footnote span.backrefs>a:not(:first-child):before,html.writer-html5 .rst-content div.citation span.backrefs>a:not(:first-child):before{content:" "}html.writer-html5 .rst-content aside.citation span.label,html.writer-html5 .rst-content aside.footnote span.label,html.writer-html5 .rst-content div.citation span.label{line-height:1.2rem}html.writer-html5 .rst-content aside.citation-list,html.writer-html5 .rst-content aside.footnote-list,html.writer-html5 .rst-content div.citation-list{margin-bottom:24px}html.writer-html5 .rst-content dl.option-list kbd{font-size:.9rem}.rst-content table.docutils.footnote,html.writer-html4 .rst-content table.docutils.citation,html.writer-html5 .rst-content aside.footnote,html.writer-html5 .rst-content aside.footnote-list aside.footnote,html.writer-html5 .rst-content div.citation-list>div.citation,html.writer-html5 .rst-content dl.citation,html.writer-html5 .rst-content dl.footnote{color:grey}.rst-content table.docutils.footnote code,.rst-content table.docutils.footnote tt,html.writer-html4 .rst-content table.docutils.citation code,html.writer-html4 .rst-content table.docutils.citation tt,html.writer-html5 .rst-content aside.footnote-list aside.footnote code,html.writer-html5 .rst-content aside.footnote-list aside.footnote tt,html.writer-html5 .rst-content aside.footnote code,html.writer-html5 .rst-content aside.footnote tt,html.writer-html5 .rst-content div.citation-list>div.citation code,html.writer-html5 .rst-content div.citation-list>div.citation tt,html.writer-html5 .rst-content dl.citation code,html.writer-html5 .rst-content dl.citation tt,html.writer-html5 .rst-content dl.footnote code,html.writer-html5 .rst-content dl.footnote tt{color:#555}.rst-content .wy-table-responsive.citation,.rst-content .wy-table-responsive.footnote{margin-bottom:0}.rst-content .wy-table-responsive.citation+:not(.citation),.rst-content .wy-table-responsive.footnote+:not(.footnote){margin-top:24px}.rst-content .wy-table-responsive.citation:last-child,.rst-content .wy-table-responsive.footnote:last-child{margin-bottom:24px}.rst-content table.docutils th{border-color:#e1e4e5}html.writer-html5 .rst-content table.docutils th{border:1px solid #e1e4e5}html.writer-html5 .rst-content table.docutils td>p,html.writer-html5 .rst-content table.docutils th>p{line-height:1rem;margin-bottom:0;font-size:.9rem}.rst-content table.docutils td .last,.rst-content table.docutils td .last>:last-child{margin-bottom:0}.rst-content table.field-list,.rst-content table.field-list td{border:none}.rst-content table.field-list td p{line-height:inherit}.rst-content table.field-list td>strong{display:inline-block}.rst-content table.field-list .field-name{padding-right:10px;text-align:left;white-space:nowrap}.rst-content table.field-list .field-body{text-align:left}.rst-content code,.rst-content tt{color:#000;font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;padding:2px 5px}.rst-content code big,.rst-content code em,.rst-content tt big,.rst-content tt em{font-size:100%!important;line-height:normal}.rst-content code.literal,.rst-content tt.literal{color:#e74c3c;white-space:normal}.rst-content code.xref,.rst-content tt.xref,a .rst-content code,a .rst-content tt{font-weight:700;color:#404040;overflow-wrap:normal}.rst-content kbd,.rst-content pre,.rst-content samp{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace}.rst-content a code,.rst-content a tt{color:#2980b9}.rst-content dl{margin-bottom:24px}.rst-content dl dt{font-weight:700;margin-bottom:12px}.rst-content dl ol,.rst-content dl p,.rst-content dl table,.rst-content dl ul{margin-bottom:12px}.rst-content dl dd{margin:0 0 12px 24px;line-height:24px}.rst-content dl dd>ol:last-child,.rst-content dl dd>p:last-child,.rst-content dl dd>table:last-child,.rst-content dl dd>ul:last-child{margin-bottom:0}html.writer-html4 .rst-content dl:not(.docutils),html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple){margin-bottom:24px}html.writer-html4 .rst-content dl:not(.docutils)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{display:table;margin:6px 0;font-size:90%;line-height:normal;background:#e7f2fa;color:#2980b9;border-top:3px solid #6ab0de;padding:6px;position:relative}html.writer-html4 .rst-content dl:not(.docutils)>dt:before,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:before{color:#6ab0de}html.writer-html4 .rst-content dl:not(.docutils)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt{margin-bottom:6px;border:none;border-left:3px solid #ccc;background:#f0f0f0;color:#555}html.writer-html4 .rst-content dl:not(.docutils) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) dl:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt .headerlink{color:#404040;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils)>dt:first-child,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple)>dt:first-child{margin-top:0}html.writer-html4 .rst-content dl:not(.docutils) code.descclassname,html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descclassname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{background-color:transparent;border:none;padding:0;font-size:100%!important}html.writer-html4 .rst-content dl:not(.docutils) code.descname,html.writer-html4 .rst-content dl:not(.docutils) tt.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) code.descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) tt.descname{font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .optional,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .optional{display:inline-block;padding:0 4px;color:#000;font-weight:700}html.writer-html4 .rst-content dl:not(.docutils) .property,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .property{display:inline-block;padding-right:8px;max-width:100%}html.writer-html4 .rst-content dl:not(.docutils) .k,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .k{font-style:italic}html.writer-html4 .rst-content dl:not(.docutils) .descclassname,html.writer-html4 .rst-content dl:not(.docutils) .descname,html.writer-html4 .rst-content dl:not(.docutils) .sig-name,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descclassname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .descname,html.writer-html5 .rst-content dl[class]:not(.option-list):not(.field-list):not(.footnote):not(.citation):not(.glossary):not(.simple) .sig-name{font-family:SFMono-Regular,Menlo,Monaco,Consolas,Liberation Mono,Courier New,Courier,monospace;color:#000}.rst-content .viewcode-back,.rst-content .viewcode-link{display:inline-block;color:#27ae60;font-size:80%;padding-left:24px}.rst-content .viewcode-back{display:block;float:right}.rst-content p.rubric{margin-bottom:12px;font-weight:700}.rst-content code.download,.rst-content tt.download{background:inherit;padding:inherit;font-weight:400;font-family:inherit;font-size:inherit;color:inherit;border:inherit;white-space:inherit}.rst-content code.download span:first-child,.rst-content tt.download span:first-child{-webkit-font-smoothing:subpixel-antialiased}.rst-content code.download span:first-child:before,.rst-content tt.download span:first-child:before{margin-right:4px}.rst-content .guilabel,.rst-content .menuselection{font-size:80%;font-weight:700;border-radius:4px;padding:2.4px 6px;margin:auto 2px}.rst-content .guilabel,.rst-content .menuselection{border:1px solid #7fbbe3;background:#e7f2fa}.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>.kbd,.rst-content :not(dl.option-list)>:not(dt):not(kbd):not(.kbd)>kbd{color:inherit;font-size:80%;background-color:#fff;border:1px solid #a6a6a6;border-radius:4px;box-shadow:0 2px grey;padding:2.4px 6px;margin:auto 0}.rst-content .versionmodified{font-style:italic}@media screen and (max-width:480px){.rst-content .sidebar{width:100%}}span[id*=MathJax-Span]{color:#404040}.math{text-align:center}@font-face{font-family:Lato;src:url(fonts/lato-normal.woff2?bd03a2cc277bbbc338d464e679fe9942) format("woff2"),url(fonts/lato-normal.woff?27bd77b9162d388cb8d4c4217c7c5e2a) format("woff");font-weight:400;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold.woff2?cccb897485813c7c256901dbca54ecf2) format("woff2"),url(fonts/lato-bold.woff?d878b6c29b10beca227e9eef4246111b) format("woff");font-weight:700;font-style:normal;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-bold-italic.woff2?0b6bb6725576b072c5d0b02ecdd1900d) format("woff2"),url(fonts/lato-bold-italic.woff?9c7e4e9eb485b4a121c760e61bc3707c) format("woff");font-weight:700;font-style:italic;font-display:block}@font-face{font-family:Lato;src:url(fonts/lato-normal-italic.woff2?4eb103b4d12be57cb1d040ed5e162e9d) format("woff2"),url(fonts/lato-normal-italic.woff?f28f2d6482446544ef1ea1ccc6dd5892) format("woff");font-weight:400;font-style:italic;font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:400;src:url(fonts/Roboto-Slab-Regular.woff2?7abf5b8d04d26a2cafea937019bca958) format("woff2"),url(fonts/Roboto-Slab-Regular.woff?c1be9284088d487c5e3ff0a10a92e58c) format("woff");font-display:block}@font-face{font-family:Roboto Slab;font-style:normal;font-weight:700;src:url(fonts/Roboto-Slab-Bold.woff2?9984f4a9bda09be08e83f2506954adbe) format("woff2"),url(fonts/Roboto-Slab-Bold.woff?bed5564a116b05148e3b3bea6fb1162a) format("woff");font-display:block} \ No newline at end of file diff --git a/_static/design-tabs.js b/_static/design-tabs.js new file mode 100644 index 00000000..b25bd6a4 --- /dev/null +++ b/_static/design-tabs.js @@ -0,0 +1,101 @@ +// @ts-check + +// Extra JS capability for selected tabs to be synced +// The selection is stored in local storage so that it persists across page loads. + +/** + * @type {Record} + */ +let sd_id_to_elements = {}; +const storageKeyPrefix = "sphinx-design-tab-id-"; + +/** + * Create a key for a tab element. + * @param {HTMLElement} el - The tab element. + * @returns {[string, string, string] | null} - The key. + * + */ +function create_key(el) { + let syncId = el.getAttribute("data-sync-id"); + let syncGroup = el.getAttribute("data-sync-group"); + if (!syncId || !syncGroup) return null; + return [syncGroup, syncId, syncGroup + "--" + syncId]; +} + +/** + * Initialize the tab selection. + * + */ +function ready() { + // Find all tabs with sync data + + /** @type {string[]} */ + let groups = []; + + document.querySelectorAll(".sd-tab-label").forEach((label) => { + if (label instanceof HTMLElement) { + let data = create_key(label); + if (data) { + let [group, id, key] = data; + + // add click event listener + // @ts-ignore + label.onclick = onSDLabelClick; + + // store map of key to elements + if (!sd_id_to_elements[key]) { + sd_id_to_elements[key] = []; + } + sd_id_to_elements[key].push(label); + + if (groups.indexOf(group) === -1) { + groups.push(group); + // Check if a specific tab has been selected via URL parameter + const tabParam = new URLSearchParams(window.location.search).get( + group + ); + if (tabParam) { + console.log( + "sphinx-design: Selecting tab id for group '" + + group + + "' from URL parameter: " + + tabParam + ); + window.sessionStorage.setItem(storageKeyPrefix + group, tabParam); + } + } + + // Check is a specific tab has been selected previously + let previousId = window.sessionStorage.getItem( + storageKeyPrefix + group + ); + if (previousId === id) { + // console.log( + // "sphinx-design: Selecting tab from session storage: " + id + // ); + // @ts-ignore + label.previousElementSibling.checked = true; + } + } + } + }); +} + +/** + * Activate other tabs with the same sync id. + * + * @this {HTMLElement} - The element that was clicked. + */ +function onSDLabelClick() { + let data = create_key(this); + if (!data) return; + let [group, id, key] = data; + for (const label of sd_id_to_elements[key]) { + if (label === this) continue; + // @ts-ignore + label.previousElementSibling.checked = true; + } + window.sessionStorage.setItem(storageKeyPrefix + group, id); +} + +document.addEventListener("DOMContentLoaded", ready, false); diff --git a/_static/doctools.js b/_static/doctools.js new file mode 100644 index 00000000..4d67807d --- /dev/null +++ b/_static/doctools.js @@ -0,0 +1,156 @@ +/* + * doctools.js + * ~~~~~~~~~~~ + * + * Base JavaScript utilities for all Sphinx HTML documentation. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +const BLACKLISTED_KEY_CONTROL_ELEMENTS = new Set([ + "TEXTAREA", + "INPUT", + "SELECT", + "BUTTON", +]); + +const _ready = (callback) => { + if (document.readyState !== "loading") { + callback(); + } else { + document.addEventListener("DOMContentLoaded", callback); + } +}; + +/** + * Small JavaScript module for the documentation. + */ +const Documentation = { + init: () => { + Documentation.initDomainIndexTable(); + Documentation.initOnKeyListeners(); + }, + + /** + * i18n support + */ + TRANSLATIONS: {}, + PLURAL_EXPR: (n) => (n === 1 ? 0 : 1), + LOCALE: "unknown", + + // gettext and ngettext don't access this so that the functions + // can safely bound to a different name (_ = Documentation.gettext) + gettext: (string) => { + const translated = Documentation.TRANSLATIONS[string]; + switch (typeof translated) { + case "undefined": + return string; // no translation + case "string": + return translated; // translation exists + default: + return translated[0]; // (singular, plural) translation tuple exists + } + }, + + ngettext: (singular, plural, n) => { + const translated = Documentation.TRANSLATIONS[singular]; + if (typeof translated !== "undefined") + return translated[Documentation.PLURAL_EXPR(n)]; + return n === 1 ? singular : plural; + }, + + addTranslations: (catalog) => { + Object.assign(Documentation.TRANSLATIONS, catalog.messages); + Documentation.PLURAL_EXPR = new Function( + "n", + `return (${catalog.plural_expr})` + ); + Documentation.LOCALE = catalog.locale; + }, + + /** + * helper function to focus on search bar + */ + focusSearchBar: () => { + document.querySelectorAll("input[name=q]")[0]?.focus(); + }, + + /** + * Initialise the domain index toggle buttons + */ + initDomainIndexTable: () => { + const toggler = (el) => { + const idNumber = el.id.substr(7); + const toggledRows = document.querySelectorAll(`tr.cg-${idNumber}`); + if (el.src.substr(-9) === "minus.png") { + el.src = `${el.src.substr(0, el.src.length - 9)}plus.png`; + toggledRows.forEach((el) => (el.style.display = "none")); + } else { + el.src = `${el.src.substr(0, el.src.length - 8)}minus.png`; + toggledRows.forEach((el) => (el.style.display = "")); + } + }; + + const togglerElements = document.querySelectorAll("img.toggler"); + togglerElements.forEach((el) => + el.addEventListener("click", (event) => toggler(event.currentTarget)) + ); + togglerElements.forEach((el) => (el.style.display = "")); + if (DOCUMENTATION_OPTIONS.COLLAPSE_INDEX) togglerElements.forEach(toggler); + }, + + initOnKeyListeners: () => { + // only install a listener if it is really needed + if ( + !DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS && + !DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS + ) + return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.altKey || event.ctrlKey || event.metaKey) return; + + if (!event.shiftKey) { + switch (event.key) { + case "ArrowLeft": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const prevLink = document.querySelector('link[rel="prev"]'); + if (prevLink && prevLink.href) { + window.location.href = prevLink.href; + event.preventDefault(); + } + break; + case "ArrowRight": + if (!DOCUMENTATION_OPTIONS.NAVIGATION_WITH_KEYS) break; + + const nextLink = document.querySelector('link[rel="next"]'); + if (nextLink && nextLink.href) { + window.location.href = nextLink.href; + event.preventDefault(); + } + break; + } + } + + // some keyboard layouts may need Shift to get / + switch (event.key) { + case "/": + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) break; + Documentation.focusSearchBar(); + event.preventDefault(); + } + }); + }, +}; + +// quick alias for translations +const _ = Documentation.gettext; + +_ready(Documentation.init); diff --git a/_static/documentation_options.js b/_static/documentation_options.js new file mode 100644 index 00000000..7e4c114f --- /dev/null +++ b/_static/documentation_options.js @@ -0,0 +1,13 @@ +const DOCUMENTATION_OPTIONS = { + VERSION: '', + LANGUAGE: 'en', + COLLAPSE_INDEX: false, + BUILDER: 'html', + FILE_SUFFIX: '.html', + LINK_SUFFIX: '.html', + HAS_SOURCE: true, + SOURCELINK_SUFFIX: '.txt', + NAVIGATION_WITH_KEYS: false, + SHOW_SEARCH_SUMMARY: true, + ENABLE_SEARCH_SHORTCUTS: true, +}; \ No newline at end of file diff --git a/_static/file.png b/_static/file.png new file mode 100644 index 00000000..a858a410 Binary files /dev/null and b/_static/file.png differ diff --git a/_static/jquery.js b/_static/jquery.js new file mode 100644 index 00000000..c4c6022f --- /dev/null +++ b/_static/jquery.js @@ -0,0 +1,2 @@ +/*! jQuery v3.6.0 | (c) OpenJS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],r=Object.getPrototypeOf,s=t.slice,g=t.flat?function(e){return t.flat.call(e)}:function(e){return t.concat.apply([],e)},u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType&&"function"!=typeof e.item},x=function(e){return null!=e&&e===e.window},E=C.document,c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.6.0",S=function(e,t){return new S.fn.init(e,t)};function p(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp(F),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+F),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\[\\da-fA-F]{1,6}"+M+"?|\\\\([^\\r\\n\\f])","g"),ne=function(e,t){var n="0x"+e.slice(1)-65536;return t||(n<0?String.fromCharCode(n+65536):String.fromCharCode(n>>10|55296,1023&n|56320))},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(p.childNodes),p.childNodes),t[p.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&(T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!N[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&(U.test(t)||z.test(t))){(f=ee.test(t)&&ye(e.parentNode)||e)===e&&d.scope||((s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=S)),o=(l=h(t)).length;while(o--)l[o]=(s?"#"+s:":scope")+" "+xe(l[o]);c=l.join(",")}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){N(t,!0)}finally{s===S&&e.removeAttribute("id")}}}return g(t.replace($,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[S]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e&&e.namespaceURI,n=e&&(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:p;return r!=C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),p!=C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.scope=ce(function(e){return a.appendChild(e).appendChild(C.createElement("div")),"undefined"!=typeof e.querySelectorAll&&!e.querySelectorAll(":scope fieldset div").length}),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=S,!C.getElementsByName||!C.getElementsByName(S).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){var t;a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+S+"-]").length||v.push("~="),(t=C.createElement("input")).setAttribute("name",""),e.appendChild(t),e.querySelectorAll("[name='']").length||v.push("\\["+M+"*name"+M+"*="+M+"*(?:''|\"\")"),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+S+"+*").length||v.push(".#.+[+~]"),e.querySelectorAll("\\\f"),v.push("[\\r\\n\\f]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",F)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},j=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)==(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e==C||e.ownerDocument==p&&y(p,e)?-1:t==C||t.ownerDocument==p&&y(p,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e==C?-1:t==C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]==p?-1:s[r]==p?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if(T(e),d.matchesSelector&&E&&!N[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){N(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=m[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&m(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?S.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?S.grep(e,function(e){return e===n!==r}):"string"!=typeof n?S.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(S.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||D,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:q.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof S?t[0]:t,S.merge(this,S.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),N.test(r[1])&&S.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(S):S.makeArray(e,this)}).prototype=S.fn,D=S(E);var L=/^(?:parents|prev(?:Until|All))/,H={children:!0,contents:!0,next:!0,prev:!0};function O(e,t){while((e=e[t])&&1!==e.nodeType);return e}S.fn.extend({has:function(e){var t=S(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i;ce=E.createDocumentFragment().appendChild(E.createElement("div")),(fe=E.createElement("input")).setAttribute("type","radio"),fe.setAttribute("checked","checked"),fe.setAttribute("name","t"),ce.appendChild(fe),y.checkClone=ce.cloneNode(!0).cloneNode(!0).lastChild.checked,ce.innerHTML="",y.noCloneChecked=!!ce.cloneNode(!0).lastChild.defaultValue,ce.innerHTML="",y.option=!!ce.lastChild;var ge={thead:[1,"","
"],col:[2,"","
"],tr:[2,"","
"],td:[3,"","
"],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?S.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;n",""]);var me=/<|&#?\w+;/;function xe(e,t,n,r,i){for(var o,a,s,u,l,c,f=t.createDocumentFragment(),p=[],d=0,h=e.length;d\s*$/g;function je(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&S(e).children("tbody")[0]||e}function De(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function qe(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Le(e,t){var n,r,i,o,a,s;if(1===t.nodeType){if(Y.hasData(e)&&(s=Y.get(e).events))for(i in Y.remove(t,"handle events"),s)for(n=0,r=s[i].length;n").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var _t,zt=[],Ut=/(=)\?(?=&|$)|\?\?/;S.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=zt.pop()||S.expando+"_"+wt.guid++;return this[e]=!0,e}}),S.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Ut.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Ut.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Ut,"$1"+r):!1!==e.jsonp&&(e.url+=(Tt.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||S.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?S(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,zt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((_t=E.implementation.createHTMLDocument("").body).innerHTML="
",2===_t.childNodes.length),S.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=N.exec(e))?[t.createElement(i[1])]:(i=xe([e],t,o),o&&o.length&&S(o).remove(),S.merge([],i.childNodes)));var r,i,o},S.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(S.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},S.expr.pseudos.animated=function(t){return S.grep(S.timers,function(e){return t===e.elem}).length},S.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=S.css(e,"position"),c=S(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=S.css(e,"top"),u=S.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,S.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},S.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){S.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===S.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===S.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=S(e).offset()).top+=S.css(e,"borderTopWidth",!0),i.left+=S.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-S.css(r,"marginTop",!0),left:t.left-i.left-S.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===S.css(e,"position"))e=e.offsetParent;return e||re})}}),S.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;S.fn[t]=function(e){return $(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),S.each(["top","left"],function(e,n){S.cssHooks[n]=Fe(y.pixelPosition,function(e,t){if(t)return t=We(e,n),Pe.test(t)?S(e).position()[n]+"px":t})}),S.each({Height:"height",Width:"width"},function(a,s){S.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){S.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return $(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?S.css(e,t,i):S.style(e,t,n,i)},s,n?e:void 0,n)}})}),S.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){S.fn[t]=function(e){return this.on(t,e)}}),S.fn.extend({bind:function(e,t,n){return this.on(e,null,t,n)},unbind:function(e,t){return this.off(e,null,t)},delegate:function(e,t,n,r){return this.on(t,e,n,r)},undelegate:function(e,t,n){return 1===arguments.length?this.off(e,"**"):this.off(t,e||"**",n)},hover:function(e,t){return this.mouseenter(e).mouseleave(t||e)}}),S.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){S.fn[n]=function(e,t){return 0",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=y.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=y.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),y.elements=c+" "+a,j(b)}function f(a){var b=x[a[v]];return b||(b={},w++,a[v]=w,x[w]=b),b}function g(a,c,d){if(c||(c=b),q)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():u.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||t.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),q)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return y.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(y,b.frag)}function j(a){a||(a=b);var d=f(a);return!y.shivCSS||p||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),q||i(a,d),a}function k(a){for(var b,c=a.getElementsByTagName("*"),e=c.length,f=RegExp("^(?:"+d().join("|")+")$","i"),g=[];e--;)b=c[e],f.test(b.nodeName)&&g.push(b.applyElement(l(b)));return g}function l(a){for(var b,c=a.attributes,d=c.length,e=a.ownerDocument.createElement(A+":"+a.nodeName);d--;)b=c[d],b.specified&&e.setAttribute(b.nodeName,b.nodeValue);return e.style.cssText=a.style.cssText,e}function m(a){for(var b,c=a.split("{"),e=c.length,f=RegExp("(^|[\\s,>+~])("+d().join("|")+")(?=[[\\s,>+~#.:]|$)","gi"),g="$1"+A+"\\:$2";e--;)b=c[e]=c[e].split("}"),b[b.length-1]=b[b.length-1].replace(f,g),c[e]=b.join("}");return c.join("{")}function n(a){for(var b=a.length;b--;)a[b].removeNode()}function o(a){function b(){clearTimeout(g._removeSheetTimer),d&&d.removeNode(!0),d=null}var d,e,g=f(a),h=a.namespaces,i=a.parentWindow;return!B||a.printShived?a:("undefined"==typeof h[A]&&h.add(A),i.attachEvent("onbeforeprint",function(){b();for(var f,g,h,i=a.styleSheets,j=[],l=i.length,n=Array(l);l--;)n[l]=i[l];for(;h=n.pop();)if(!h.disabled&&z.test(h.media)){try{f=h.imports,g=f.length}catch(o){g=0}for(l=0;g>l;l++)n.push(f[l]);try{j.push(h.cssText)}catch(o){}}j=m(j.reverse().join("")),e=k(a),d=c(a,j)}),i.attachEvent("onafterprint",function(){n(e),clearTimeout(g._removeSheetTimer),g._removeSheetTimer=setTimeout(b,500)}),a.printShived=!0,a)}var p,q,r="3.7.3",s=a.html5||{},t=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,u=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,v="_html5shiv",w=0,x={};!function(){try{var a=b.createElement("a");a.innerHTML="",p="hidden"in a,q=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){p=!0,q=!0}}();var y={elements:s.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:r,shivCSS:s.shivCSS!==!1,supportsUnknownElements:q,shivMethods:s.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=y,j(b);var z=/^$|\b(?:all|print)\b/,A="html5shiv",B=!q&&function(){var c=b.documentElement;return!("undefined"==typeof b.namespaces||"undefined"==typeof b.parentWindow||"undefined"==typeof c.applyElement||"undefined"==typeof c.removeNode||"undefined"==typeof a.attachEvent)}();y.type+=" print",y.shivPrint=o,o(b),"object"==typeof module&&module.exports&&(module.exports=y)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/html5shiv.min.js b/_static/js/html5shiv.min.js new file mode 100644 index 00000000..cd1c674f --- /dev/null +++ b/_static/js/html5shiv.min.js @@ -0,0 +1,4 @@ +/** +* @preserve HTML5 Shiv 3.7.3 | @afarkas @jdalton @jon_neal @rem | MIT/GPL2 Licensed +*/ +!function(a,b){function c(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x",d.insertBefore(c.lastChild,d.firstChild)}function d(){var a=t.elements;return"string"==typeof a?a.split(" "):a}function e(a,b){var c=t.elements;"string"!=typeof c&&(c=c.join(" ")),"string"!=typeof a&&(a=a.join(" ")),t.elements=c+" "+a,j(b)}function f(a){var b=s[a[q]];return b||(b={},r++,a[q]=r,s[r]=b),b}function g(a,c,d){if(c||(c=b),l)return c.createElement(a);d||(d=f(c));var e;return e=d.cache[a]?d.cache[a].cloneNode():p.test(a)?(d.cache[a]=d.createElem(a)).cloneNode():d.createElem(a),!e.canHaveChildren||o.test(a)||e.tagUrn?e:d.frag.appendChild(e)}function h(a,c){if(a||(a=b),l)return a.createDocumentFragment();c=c||f(a);for(var e=c.frag.cloneNode(),g=0,h=d(),i=h.length;i>g;g++)e.createElement(h[g]);return e}function i(a,b){b.cache||(b.cache={},b.createElem=a.createElement,b.createFrag=a.createDocumentFragment,b.frag=b.createFrag()),a.createElement=function(c){return t.shivMethods?g(c,a,b):b.createElem(c)},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+d().join().replace(/[\w\-:]+/g,function(a){return b.createElem(a),b.frag.createElement(a),'c("'+a+'")'})+");return n}")(t,b.frag)}function j(a){a||(a=b);var d=f(a);return!t.shivCSS||k||d.hasCSS||(d.hasCSS=!!c(a,"article,aside,dialog,figcaption,figure,footer,header,hgroup,main,nav,section{display:block}mark{background:#FF0;color:#000}template{display:none}")),l||i(a,d),a}var k,l,m="3.7.3-pre",n=a.html5||{},o=/^<|^(?:button|map|select|textarea|object|iframe|option|optgroup)$/i,p=/^(?:a|b|code|div|fieldset|h1|h2|h3|h4|h5|h6|i|label|li|ol|p|q|span|strong|style|table|tbody|td|th|tr|ul)$/i,q="_html5shiv",r=0,s={};!function(){try{var a=b.createElement("a");a.innerHTML="",k="hidden"in a,l=1==a.childNodes.length||function(){b.createElement("a");var a=b.createDocumentFragment();return"undefined"==typeof a.cloneNode||"undefined"==typeof a.createDocumentFragment||"undefined"==typeof a.createElement}()}catch(c){k=!0,l=!0}}();var t={elements:n.elements||"abbr article aside audio bdi canvas data datalist details dialog figcaption figure footer header hgroup main mark meter nav output picture progress section summary template time video",version:m,shivCSS:n.shivCSS!==!1,supportsUnknownElements:l,shivMethods:n.shivMethods!==!1,type:"default",shivDocument:j,createElement:g,createDocumentFragment:h,addElements:e};a.html5=t,j(b),"object"==typeof module&&module.exports&&(module.exports=t)}("undefined"!=typeof window?window:this,document); \ No newline at end of file diff --git a/_static/js/theme.js b/_static/js/theme.js new file mode 100644 index 00000000..1fddb6ee --- /dev/null +++ b/_static/js/theme.js @@ -0,0 +1 @@ +!function(n){var e={};function t(i){if(e[i])return e[i].exports;var o=e[i]={i:i,l:!1,exports:{}};return n[i].call(o.exports,o,o.exports,t),o.l=!0,o.exports}t.m=n,t.c=e,t.d=function(n,e,i){t.o(n,e)||Object.defineProperty(n,e,{enumerable:!0,get:i})},t.r=function(n){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(n,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(n,"__esModule",{value:!0})},t.t=function(n,e){if(1&e&&(n=t(n)),8&e)return n;if(4&e&&"object"==typeof n&&n&&n.__esModule)return n;var i=Object.create(null);if(t.r(i),Object.defineProperty(i,"default",{enumerable:!0,value:n}),2&e&&"string"!=typeof n)for(var o in n)t.d(i,o,function(e){return n[e]}.bind(null,o));return i},t.n=function(n){var e=n&&n.__esModule?function(){return n.default}:function(){return n};return t.d(e,"a",e),e},t.o=function(n,e){return Object.prototype.hasOwnProperty.call(n,e)},t.p="",t(t.s=0)}([function(n,e,t){t(1),n.exports=t(3)},function(n,e,t){(function(){var e="undefined"!=typeof window?window.jQuery:t(2);n.exports.ThemeNav={navBar:null,win:null,winScroll:!1,winResize:!1,linkScroll:!1,winPosition:0,winHeight:null,docHeight:null,isRunning:!1,enable:function(n){var t=this;void 0===n&&(n=!0),t.isRunning||(t.isRunning=!0,e((function(e){t.init(e),t.reset(),t.win.on("hashchange",t.reset),n&&t.win.on("scroll",(function(){t.linkScroll||t.winScroll||(t.winScroll=!0,requestAnimationFrame((function(){t.onScroll()})))})),t.win.on("resize",(function(){t.winResize||(t.winResize=!0,requestAnimationFrame((function(){t.onResize()})))})),t.onResize()})))},enableSticky:function(){this.enable(!0)},init:function(n){n(document);var e=this;this.navBar=n("div.wy-side-scroll:first"),this.win=n(window),n(document).on("click","[data-toggle='wy-nav-top']",(function(){n("[data-toggle='wy-nav-shift']").toggleClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift")})).on("click",".wy-menu-vertical .current ul li a",(function(){var t=n(this);n("[data-toggle='wy-nav-shift']").removeClass("shift"),n("[data-toggle='rst-versions']").toggleClass("shift"),e.toggleCurrent(t),e.hashChange()})).on("click","[data-toggle='rst-current-version']",(function(){n("[data-toggle='rst-versions']").toggleClass("shift-up")})),n("table.docutils:not(.field-list,.footnote,.citation)").wrap("
"),n("table.docutils.footnote").wrap("
"),n("table.docutils.citation").wrap("
"),n(".wy-menu-vertical ul").not(".simple").siblings("a").each((function(){var t=n(this);expand=n(''),expand.on("click",(function(n){return e.toggleCurrent(t),n.stopPropagation(),!1})),t.prepend(expand)}))},reset:function(){var n=encodeURI(window.location.hash)||"#";try{var e=$(".wy-menu-vertical"),t=e.find('[href="'+n+'"]');if(0===t.length){var i=$('.document [id="'+n.substring(1)+'"]').closest("div.section");0===(t=e.find('[href="#'+i.attr("id")+'"]')).length&&(t=e.find('[href="#"]'))}if(t.length>0){$(".wy-menu-vertical .current").removeClass("current").attr("aria-expanded","false"),t.addClass("current").attr("aria-expanded","true"),t.closest("li.toctree-l1").parent().addClass("current").attr("aria-expanded","true");for(let n=1;n<=10;n++)t.closest("li.toctree-l"+n).addClass("current").attr("aria-expanded","true");t[0].scrollIntoView()}}catch(n){console.log("Error expanding nav for anchor",n)}},onScroll:function(){this.winScroll=!1;var n=this.win.scrollTop(),e=n+this.winHeight,t=this.navBar.scrollTop()+(n-this.winPosition);n<0||e>this.docHeight||(this.navBar.scrollTop(t),this.winPosition=n)},onResize:function(){this.winResize=!1,this.winHeight=this.win.height(),this.docHeight=$(document).height()},hashChange:function(){this.linkScroll=!0,this.win.one("hashchange",(function(){this.linkScroll=!1}))},toggleCurrent:function(n){var e=n.closest("li");e.siblings("li.current").removeClass("current").attr("aria-expanded","false"),e.siblings().find("li.current").removeClass("current").attr("aria-expanded","false");var t=e.find("> ul li");t.length&&(t.removeClass("current").attr("aria-expanded","false"),e.toggleClass("current").attr("aria-expanded",(function(n,e){return"true"==e?"false":"true"})))}},"undefined"!=typeof window&&(window.SphinxRtdTheme={Navigation:n.exports.ThemeNav,StickyNav:n.exports.ThemeNav}),function(){for(var n=0,e=["ms","moz","webkit","o"],t=0;t0 + var meq1 = "^(" + C + ")?" + V + C + "(" + V + ")?$"; // [C]VC[V] is m=1 + var mgr1 = "^(" + C + ")?" + V + C + V + C; // [C]VCVC... is m>1 + var s_v = "^(" + C + ")?" + v; // vowel in stem + + this.stemWord = function (w) { + var stem; + var suffix; + var firstch; + var origword = w; + + if (w.length < 3) + return w; + + var re; + var re2; + var re3; + var re4; + + firstch = w.substr(0,1); + if (firstch == "y") + w = firstch.toUpperCase() + w.substr(1); + + // Step 1a + re = /^(.+?)(ss|i)es$/; + re2 = /^(.+?)([^s])s$/; + + if (re.test(w)) + w = w.replace(re,"$1$2"); + else if (re2.test(w)) + w = w.replace(re2,"$1$2"); + + // Step 1b + re = /^(.+?)eed$/; + re2 = /^(.+?)(ed|ing)$/; + if (re.test(w)) { + var fp = re.exec(w); + re = new RegExp(mgr0); + if (re.test(fp[1])) { + re = /.$/; + w = w.replace(re,""); + } + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1]; + re2 = new RegExp(s_v); + if (re2.test(stem)) { + w = stem; + re2 = /(at|bl|iz)$/; + re3 = new RegExp("([^aeiouylsz])\\1$"); + re4 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re2.test(w)) + w = w + "e"; + else if (re3.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + else if (re4.test(w)) + w = w + "e"; + } + } + + // Step 1c + re = /^(.+?)y$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(s_v); + if (re.test(stem)) + w = stem + "i"; + } + + // Step 2 + re = /^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step2list[suffix]; + } + + // Step 3 + re = /^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + suffix = fp[2]; + re = new RegExp(mgr0); + if (re.test(stem)) + w = stem + step3list[suffix]; + } + + // Step 4 + re = /^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/; + re2 = /^(.+?)(s|t)(ion)$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + if (re.test(stem)) + w = stem; + } + else if (re2.test(w)) { + var fp = re2.exec(w); + stem = fp[1] + fp[2]; + re2 = new RegExp(mgr1); + if (re2.test(stem)) + w = stem; + } + + // Step 5 + re = /^(.+?)e$/; + if (re.test(w)) { + var fp = re.exec(w); + stem = fp[1]; + re = new RegExp(mgr1); + re2 = new RegExp(meq1); + re3 = new RegExp("^" + C + v + "[^aeiouwxy]$"); + if (re.test(stem) || (re2.test(stem) && !(re3.test(stem)))) + w = stem; + } + re = /ll$/; + re2 = new RegExp(mgr1); + if (re.test(w) && re2.test(w)) { + re = /.$/; + w = w.replace(re,""); + } + + // and turn initial Y back to y + if (firstch == "y") + w = firstch.toLowerCase() + w.substr(1); + return w; + } +} + diff --git a/docs/_static/license_logo.png b/_static/license_logo.png similarity index 100% rename from docs/_static/license_logo.png rename to _static/license_logo.png diff --git a/docs/_static/license_logo.png.license b/_static/license_logo.png.license similarity index 100% rename from docs/_static/license_logo.png.license rename to _static/license_logo.png.license diff --git a/_static/minus.png b/_static/minus.png new file mode 100644 index 00000000..d96755fd Binary files /dev/null and b/_static/minus.png differ diff --git a/_static/nc-table-styles.css b/_static/nc-table-styles.css new file mode 100644 index 00000000..99ae7711 --- /dev/null +++ b/_static/nc-table-styles.css @@ -0,0 +1,16 @@ +.nc-attr-table { + table-layout: fixed; + width: 100%; +} + +.nc-attr-description { + white-space: break-spaces !important; +} + +.nc-attr-example { + white-space: break-spaces !important; +} + +.nc-attr-example ul.simple { + overflow: auto; +} \ No newline at end of file diff --git a/_static/orcid.png b/_static/orcid.png new file mode 100644 index 00000000..ef109145 Binary files /dev/null and b/_static/orcid.png differ diff --git a/_static/orcid.svg b/_static/orcid.svg new file mode 100644 index 00000000..6bd8373d --- /dev/null +++ b/_static/orcid.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/_static/plus.png b/_static/plus.png new file mode 100644 index 00000000..7107cec9 Binary files /dev/null and b/_static/plus.png differ diff --git a/_static/pygments.css b/_static/pygments.css new file mode 100644 index 00000000..84ab3030 --- /dev/null +++ b/_static/pygments.css @@ -0,0 +1,75 @@ +pre { line-height: 125%; } +td.linenos .normal { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +span.linenos { color: inherit; background-color: transparent; padding-left: 5px; padding-right: 5px; } +td.linenos .special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +span.linenos.special { color: #000000; background-color: #ffffc0; padding-left: 5px; padding-right: 5px; } +.highlight .hll { background-color: #ffffcc } +.highlight { background: #f8f8f8; } +.highlight .c { color: #3D7B7B; font-style: italic } /* Comment */ +.highlight .err { border: 1px solid #FF0000 } /* Error */ +.highlight .k { color: #008000; font-weight: bold } /* Keyword */ +.highlight .o { color: #666666 } /* Operator */ +.highlight .ch { color: #3D7B7B; font-style: italic } /* Comment.Hashbang */ +.highlight .cm { color: #3D7B7B; font-style: italic } /* Comment.Multiline */ +.highlight .cp { color: #9C6500 } /* Comment.Preproc */ +.highlight .cpf { color: #3D7B7B; font-style: italic } /* Comment.PreprocFile */ +.highlight .c1 { color: #3D7B7B; font-style: italic } /* Comment.Single */ +.highlight .cs { color: #3D7B7B; font-style: italic } /* Comment.Special */ +.highlight .gd { color: #A00000 } /* Generic.Deleted */ +.highlight .ge { font-style: italic } /* Generic.Emph */ +.highlight .ges { font-weight: bold; font-style: italic } /* Generic.EmphStrong */ +.highlight .gr { color: #E40000 } /* Generic.Error */ +.highlight .gh { color: #000080; font-weight: bold } /* Generic.Heading */ +.highlight .gi { color: #008400 } /* Generic.Inserted */ +.highlight .go { color: #717171 } /* Generic.Output */ +.highlight .gp { color: #000080; font-weight: bold } /* Generic.Prompt */ +.highlight .gs { font-weight: bold } /* Generic.Strong */ +.highlight .gu { color: #800080; font-weight: bold } /* Generic.Subheading */ +.highlight .gt { color: #0044DD } /* Generic.Traceback */ +.highlight .kc { color: #008000; font-weight: bold } /* Keyword.Constant */ +.highlight .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */ +.highlight .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */ +.highlight .kp { color: #008000 } /* Keyword.Pseudo */ +.highlight .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */ +.highlight .kt { color: #B00040 } /* Keyword.Type */ +.highlight .m { color: #666666 } /* Literal.Number */ +.highlight .s { color: #BA2121 } /* Literal.String */ +.highlight .na { color: #687822 } /* Name.Attribute */ +.highlight .nb { color: #008000 } /* Name.Builtin */ +.highlight .nc { color: #0000FF; font-weight: bold } /* Name.Class */ +.highlight .no { color: #880000 } /* Name.Constant */ +.highlight .nd { color: #AA22FF } /* Name.Decorator */ +.highlight .ni { color: #717171; font-weight: bold } /* Name.Entity */ +.highlight .ne { color: #CB3F38; font-weight: bold } /* Name.Exception */ +.highlight .nf { color: #0000FF } /* Name.Function */ +.highlight .nl { color: #767600 } /* Name.Label */ +.highlight .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */ +.highlight .nt { color: #008000; font-weight: bold } /* Name.Tag */ +.highlight .nv { color: #19177C } /* Name.Variable */ +.highlight .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */ +.highlight .w { color: #bbbbbb } /* Text.Whitespace */ +.highlight .mb { color: #666666 } /* Literal.Number.Bin */ +.highlight .mf { color: #666666 } /* Literal.Number.Float */ +.highlight .mh { color: #666666 } /* Literal.Number.Hex */ +.highlight .mi { color: #666666 } /* Literal.Number.Integer */ +.highlight .mo { color: #666666 } /* Literal.Number.Oct */ +.highlight .sa { color: #BA2121 } /* Literal.String.Affix */ +.highlight .sb { color: #BA2121 } /* Literal.String.Backtick */ +.highlight .sc { color: #BA2121 } /* Literal.String.Char */ +.highlight .dl { color: #BA2121 } /* Literal.String.Delimiter */ +.highlight .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */ +.highlight .s2 { color: #BA2121 } /* Literal.String.Double */ +.highlight .se { color: #AA5D1F; font-weight: bold } /* Literal.String.Escape */ +.highlight .sh { color: #BA2121 } /* Literal.String.Heredoc */ +.highlight .si { color: #A45A77; font-weight: bold } /* Literal.String.Interpol */ +.highlight .sx { color: #008000 } /* Literal.String.Other */ +.highlight .sr { color: #A45A77 } /* Literal.String.Regex */ +.highlight .s1 { color: #BA2121 } /* Literal.String.Single */ +.highlight .ss { color: #19177C } /* Literal.String.Symbol */ +.highlight .bp { color: #008000 } /* Name.Builtin.Pseudo */ +.highlight .fm { color: #0000FF } /* Name.Function.Magic */ +.highlight .vc { color: #19177C } /* Name.Variable.Class */ +.highlight .vg { color: #19177C } /* Name.Variable.Global */ +.highlight .vi { color: #19177C } /* Name.Variable.Instance */ +.highlight .vm { color: #19177C } /* Name.Variable.Magic */ +.highlight .il { color: #666666 } /* Literal.Number.Integer.Long */ \ No newline at end of file diff --git a/_static/searchtools.js b/_static/searchtools.js new file mode 100644 index 00000000..b08d58c9 --- /dev/null +++ b/_static/searchtools.js @@ -0,0 +1,620 @@ +/* + * searchtools.js + * ~~~~~~~~~~~~~~~~ + * + * Sphinx JavaScript utilities for the full-text search. + * + * :copyright: Copyright 2007-2024 by the Sphinx team, see AUTHORS. + * :license: BSD, see LICENSE for details. + * + */ +"use strict"; + +/** + * Simple result scoring code. + */ +if (typeof Scorer === "undefined") { + var Scorer = { + // Implement the following function to further tweak the score for each result + // The function takes a result array [docname, title, anchor, descr, score, filename] + // and returns the new score. + /* + score: result => { + const [docname, title, anchor, descr, score, filename] = result + return score + }, + */ + + // query matches the full name of an object + objNameMatch: 11, + // or matches in the last dotted part of the object name + objPartialMatch: 6, + // Additive scores depending on the priority of the object + objPrio: { + 0: 15, // used to be importantResults + 1: 5, // used to be objectResults + 2: -5, // used to be unimportantResults + }, + // Used when the priority is not in the mapping. + objPrioDefault: 0, + + // query found in title + title: 15, + partialTitle: 7, + // query found in terms + term: 5, + partialTerm: 2, + }; +} + +const _removeChildren = (element) => { + while (element && element.lastChild) element.removeChild(element.lastChild); +}; + +/** + * See https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions#escaping + */ +const _escapeRegExp = (string) => + string.replace(/[.*+\-?^${}()|[\]\\]/g, "\\$&"); // $& means the whole matched string + +const _displayItem = (item, searchTerms, highlightTerms) => { + const docBuilder = DOCUMENTATION_OPTIONS.BUILDER; + const docFileSuffix = DOCUMENTATION_OPTIONS.FILE_SUFFIX; + const docLinkSuffix = DOCUMENTATION_OPTIONS.LINK_SUFFIX; + const showSearchSummary = DOCUMENTATION_OPTIONS.SHOW_SEARCH_SUMMARY; + const contentRoot = document.documentElement.dataset.content_root; + + const [docName, title, anchor, descr, score, _filename] = item; + + let listItem = document.createElement("li"); + let requestUrl; + let linkUrl; + if (docBuilder === "dirhtml") { + // dirhtml builder + let dirname = docName + "/"; + if (dirname.match(/\/index\/$/)) + dirname = dirname.substring(0, dirname.length - 6); + else if (dirname === "index/") dirname = ""; + requestUrl = contentRoot + dirname; + linkUrl = requestUrl; + } else { + // normal html builders + requestUrl = contentRoot + docName + docFileSuffix; + linkUrl = docName + docLinkSuffix; + } + let linkEl = listItem.appendChild(document.createElement("a")); + linkEl.href = linkUrl + anchor; + linkEl.dataset.score = score; + linkEl.innerHTML = title; + if (descr) { + listItem.appendChild(document.createElement("span")).innerHTML = + " (" + descr + ")"; + // highlight search terms in the description + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + } + else if (showSearchSummary) + fetch(requestUrl) + .then((responseData) => responseData.text()) + .then((data) => { + if (data) + listItem.appendChild( + Search.makeSearchSummary(data, searchTerms, anchor) + ); + // highlight search terms in the summary + if (SPHINX_HIGHLIGHT_ENABLED) // set in sphinx_highlight.js + highlightTerms.forEach((term) => _highlightText(listItem, term, "highlighted")); + }); + Search.output.appendChild(listItem); +}; +const _finishSearch = (resultCount) => { + Search.stopPulse(); + Search.title.innerText = _("Search Results"); + if (!resultCount) + Search.status.innerText = Documentation.gettext( + "Your search did not match any documents. Please make sure that all words are spelled correctly and that you've selected enough categories." + ); + else + Search.status.innerText = _( + "Search finished, found ${resultCount} page(s) matching the search query." + ).replace('${resultCount}', resultCount); +}; +const _displayNextItem = ( + results, + resultCount, + searchTerms, + highlightTerms, +) => { + // results left, load the summary and display it + // this is intended to be dynamic (don't sub resultsCount) + if (results.length) { + _displayItem(results.pop(), searchTerms, highlightTerms); + setTimeout( + () => _displayNextItem(results, resultCount, searchTerms, highlightTerms), + 5 + ); + } + // search finished, update title and status message + else _finishSearch(resultCount); +}; +// Helper function used by query() to order search results. +// Each input is an array of [docname, title, anchor, descr, score, filename]. +// Order the results by score (in opposite order of appearance, since the +// `_displayNextItem` function uses pop() to retrieve items) and then alphabetically. +const _orderResultsByScoreThenName = (a, b) => { + const leftScore = a[4]; + const rightScore = b[4]; + if (leftScore === rightScore) { + // same score: sort alphabetically + const leftTitle = a[1].toLowerCase(); + const rightTitle = b[1].toLowerCase(); + if (leftTitle === rightTitle) return 0; + return leftTitle > rightTitle ? -1 : 1; // inverted is intentional + } + return leftScore > rightScore ? 1 : -1; +}; + +/** + * Default splitQuery function. Can be overridden in ``sphinx.search`` with a + * custom function per language. + * + * The regular expression works by splitting the string on consecutive characters + * that are not Unicode letters, numbers, underscores, or emoji characters. + * This is the same as ``\W+`` in Python, preserving the surrogate pair area. + */ +if (typeof splitQuery === "undefined") { + var splitQuery = (query) => query + .split(/[^\p{Letter}\p{Number}_\p{Emoji_Presentation}]+/gu) + .filter(term => term) // remove remaining empty strings +} + +/** + * Search Module + */ +const Search = { + _index: null, + _queued_query: null, + _pulse_status: -1, + + htmlToText: (htmlString, anchor) => { + const htmlElement = new DOMParser().parseFromString(htmlString, 'text/html'); + for (const removalQuery of [".headerlink", "script", "style"]) { + htmlElement.querySelectorAll(removalQuery).forEach((el) => { el.remove() }); + } + if (anchor) { + const anchorContent = htmlElement.querySelector(`[role="main"] ${anchor}`); + if (anchorContent) return anchorContent.textContent; + + console.warn( + `Anchored content block not found. Sphinx search tries to obtain it via DOM query '[role=main] ${anchor}'. Check your theme or template.` + ); + } + + // if anchor not specified or not found, fall back to main content + const docContent = htmlElement.querySelector('[role="main"]'); + if (docContent) return docContent.textContent; + + console.warn( + "Content block not found. Sphinx search tries to obtain it via DOM query '[role=main]'. Check your theme or template." + ); + return ""; + }, + + init: () => { + const query = new URLSearchParams(window.location.search).get("q"); + document + .querySelectorAll('input[name="q"]') + .forEach((el) => (el.value = query)); + if (query) Search.performSearch(query); + }, + + loadIndex: (url) => + (document.body.appendChild(document.createElement("script")).src = url), + + setIndex: (index) => { + Search._index = index; + if (Search._queued_query !== null) { + const query = Search._queued_query; + Search._queued_query = null; + Search.query(query); + } + }, + + hasIndex: () => Search._index !== null, + + deferQuery: (query) => (Search._queued_query = query), + + stopPulse: () => (Search._pulse_status = -1), + + startPulse: () => { + if (Search._pulse_status >= 0) return; + + const pulse = () => { + Search._pulse_status = (Search._pulse_status + 1) % 4; + Search.dots.innerText = ".".repeat(Search._pulse_status); + if (Search._pulse_status >= 0) window.setTimeout(pulse, 500); + }; + pulse(); + }, + + /** + * perform a search for something (or wait until index is loaded) + */ + performSearch: (query) => { + // create the required interface elements + const searchText = document.createElement("h2"); + searchText.textContent = _("Searching"); + const searchSummary = document.createElement("p"); + searchSummary.classList.add("search-summary"); + searchSummary.innerText = ""; + const searchList = document.createElement("ul"); + searchList.classList.add("search"); + + const out = document.getElementById("search-results"); + Search.title = out.appendChild(searchText); + Search.dots = Search.title.appendChild(document.createElement("span")); + Search.status = out.appendChild(searchSummary); + Search.output = out.appendChild(searchList); + + const searchProgress = document.getElementById("search-progress"); + // Some themes don't use the search progress node + if (searchProgress) { + searchProgress.innerText = _("Preparing search..."); + } + Search.startPulse(); + + // index already loaded, the browser was quick! + if (Search.hasIndex()) Search.query(query); + else Search.deferQuery(query); + }, + + _parseQuery: (query) => { + // stem the search terms and add them to the correct list + const stemmer = new Stemmer(); + const searchTerms = new Set(); + const excludedTerms = new Set(); + const highlightTerms = new Set(); + const objectTerms = new Set(splitQuery(query.toLowerCase().trim())); + splitQuery(query.trim()).forEach((queryTerm) => { + const queryTermLower = queryTerm.toLowerCase(); + + // maybe skip this "word" + // stopwords array is from language_data.js + if ( + stopwords.indexOf(queryTermLower) !== -1 || + queryTerm.match(/^\d+$/) + ) + return; + + // stem the word + let word = stemmer.stemWord(queryTermLower); + // select the correct list + if (word[0] === "-") excludedTerms.add(word.substr(1)); + else { + searchTerms.add(word); + highlightTerms.add(queryTermLower); + } + }); + + if (SPHINX_HIGHLIGHT_ENABLED) { // set in sphinx_highlight.js + localStorage.setItem("sphinx_highlight_terms", [...highlightTerms].join(" ")) + } + + // console.debug("SEARCH: searching for:"); + // console.info("required: ", [...searchTerms]); + // console.info("excluded: ", [...excludedTerms]); + + return [query, searchTerms, excludedTerms, highlightTerms, objectTerms]; + }, + + /** + * execute search (requires search index to be loaded) + */ + _performSearch: (query, searchTerms, excludedTerms, highlightTerms, objectTerms) => { + 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; + + // Collect multiple result groups to be sorted separately and then ordered. + // Each is an array of [docname, title, anchor, descr, score, filename]. + const normalResults = []; + const nonMainIndexResults = []; + + _removeChildren(document.getElementById("search-progress")); + + const queryLower = query.toLowerCase().trim(); + for (const [title, foundTitles] of Object.entries(allTitles)) { + if (title.toLowerCase().trim().includes(queryLower) && (queryLower.length >= title.length/2)) { + for (const [file, id] of foundTitles) { + const score = Math.round(Scorer.title * queryLower.length / title.length); + const boost = titles[file] === title ? 1 : 0; // add a boost for document titles + normalResults.push([ + docNames[file], + titles[file] !== title ? `${titles[file]} > ${title}` : title, + id !== null ? "#" + id : "", + null, + score + boost, + 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, isMain] of foundEntries) { + const score = Math.round(100 * queryLower.length / entry.length); + const result = [ + docNames[file], + titles[file], + id ? "#" + id : "", + null, + score, + filenames[file], + ]; + if (isMain) { + normalResults.push(result); + } else { + nonMainIndexResults.push(result); + } + } + } + } + + // lookup as object + objectTerms.forEach((term) => + normalResults.push(...Search.performObjectSearch(term, objectTerms)) + ); + + // lookup as search terms in fulltext + normalResults.push(...Search.performTermsSearch(searchTerms, excludedTerms)); + + // let the scorer override scores with a custom scoring function + if (Scorer.score) { + normalResults.forEach((item) => (item[4] = Scorer.score(item))); + nonMainIndexResults.forEach((item) => (item[4] = Scorer.score(item))); + } + + // Sort each group of results by score and then alphabetically by name. + normalResults.sort(_orderResultsByScoreThenName); + nonMainIndexResults.sort(_orderResultsByScoreThenName); + + // Combine the result groups in (reverse) order. + // Non-main index entries are typically arbitrary cross-references, + // so display them after other results. + let results = [...nonMainIndexResults, ...normalResults]; + + // remove duplicate search results + // note the reversing of results, so that in the case of duplicates, the highest-scoring entry is kept + let seen = new Set(); + results = results.reverse().reduce((acc, result) => { + let resultStr = result.slice(0, 4).concat([result[5]]).map(v => String(v)).join(','); + if (!seen.has(resultStr)) { + acc.push(result); + seen.add(resultStr); + } + return acc; + }, []); + + return results.reverse(); + }, + + query: (query) => { + const [searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms] = Search._parseQuery(query); + const results = Search._performSearch(searchQuery, searchTerms, excludedTerms, highlightTerms, objectTerms); + + // for debugging + //Search.lastresults = results.slice(); // a copy + // console.info("search results:", Search.lastresults); + + // print the results + _displayNextItem(results, results.length, searchTerms, highlightTerms); + }, + + /** + * search for object names + */ + performObjectSearch: (object, objectTerms) => { + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const objects = Search._index.objects; + const objNames = Search._index.objnames; + const titles = Search._index.titles; + + const results = []; + + const objectSearchCallback = (prefix, match) => { + const name = match[4] + const fullname = (prefix ? prefix + "." : "") + name; + const fullnameLower = fullname.toLowerCase(); + if (fullnameLower.indexOf(object) < 0) return; + + let score = 0; + const parts = fullnameLower.split("."); + + // check for different match types: exact matches of full name or + // "last name" (i.e. last dotted part) + if (fullnameLower === object || parts.slice(-1)[0] === object) + score += Scorer.objNameMatch; + else if (parts.slice(-1)[0].indexOf(object) > -1) + score += Scorer.objPartialMatch; // matches in last name + + const objName = objNames[match[1]][2]; + const title = titles[match[0]]; + + // If more than one term searched for, we require other words to be + // found in the name/title/description + const otherTerms = new Set(objectTerms); + otherTerms.delete(object); + if (otherTerms.size > 0) { + const haystack = `${prefix} ${name} ${objName} ${title}`.toLowerCase(); + if ( + [...otherTerms].some((otherTerm) => haystack.indexOf(otherTerm) < 0) + ) + return; + } + + let anchor = match[3]; + if (anchor === "") anchor = fullname; + else if (anchor === "-") anchor = objNames[match[1]][1] + "-" + fullname; + + const descr = objName + _(", in ") + title; + + // add custom score for some objects according to scorer + if (Scorer.objPrio.hasOwnProperty(match[2])) + score += Scorer.objPrio[match[2]]; + else score += Scorer.objPrioDefault; + + results.push([ + docNames[match[0]], + fullname, + "#" + anchor, + descr, + score, + filenames[match[0]], + ]); + }; + Object.keys(objects).forEach((prefix) => + objects[prefix].forEach((array) => + objectSearchCallback(prefix, array) + ) + ); + return results; + }, + + /** + * search for full-text terms in the index + */ + performTermsSearch: (searchTerms, excludedTerms) => { + // prepare search + const terms = Search._index.terms; + const titleTerms = Search._index.titleterms; + const filenames = Search._index.filenames; + const docNames = Search._index.docnames; + const titles = Search._index.titles; + + const scoreMap = new Map(); + const fileMap = new Map(); + + // perform the search on the required terms + searchTerms.forEach((word) => { + const files = []; + const arr = [ + { files: terms[word], score: Scorer.term }, + { files: titleTerms[word], score: Scorer.title }, + ]; + // add support for partial matches + if (word.length > 2) { + const escapedWord = _escapeRegExp(word); + if (!terms.hasOwnProperty(word)) { + Object.keys(terms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: terms[term], score: Scorer.partialTerm }); + }); + } + if (!titleTerms.hasOwnProperty(word)) { + Object.keys(titleTerms).forEach((term) => { + if (term.match(escapedWord)) + arr.push({ files: titleTerms[term], score: Scorer.partialTitle }); + }); + } + } + + // no match but word was a required one + if (arr.every((record) => record.files === undefined)) return; + + // found search word in contents + arr.forEach((record) => { + if (record.files === undefined) return; + + let recordFiles = record.files; + if (recordFiles.length === undefined) recordFiles = [recordFiles]; + files.push(...recordFiles); + + // set score for the word in each file + recordFiles.forEach((file) => { + if (!scoreMap.has(file)) scoreMap.set(file, {}); + scoreMap.get(file)[word] = record.score; + }); + }); + + // create the mapping + files.forEach((file) => { + if (!fileMap.has(file)) fileMap.set(file, [word]); + else if (fileMap.get(file).indexOf(word) === -1) fileMap.get(file).push(word); + }); + }); + + // now check if the files don't contain excluded terms + const results = []; + for (const [file, wordList] of fileMap) { + // check if all requirements are matched + + // as search terms with length < 3 are discarded + const filteredTermCount = [...searchTerms].filter( + (term) => term.length > 2 + ).length; + if ( + wordList.length !== searchTerms.size && + wordList.length !== filteredTermCount + ) + continue; + + // ensure that none of the excluded terms is in the search result + if ( + [...excludedTerms].some( + (term) => + terms[term] === file || + titleTerms[term] === file || + (terms[term] || []).includes(file) || + (titleTerms[term] || []).includes(file) + ) + ) + break; + + // select one (max) score for the file. + const score = Math.max(...wordList.map((w) => scoreMap.get(file)[w])); + // add result to the result list + results.push([ + docNames[file], + titles[file], + "", + null, + score, + filenames[file], + ]); + } + return results; + }, + + /** + * helper function to return a node containing the + * search summary for a given text. keywords is a list + * of stemmed words. + */ + makeSearchSummary: (htmlText, keywords, anchor) => { + const text = Search.htmlToText(htmlText, anchor); + if (text === "") return null; + + const textLower = text.toLowerCase(); + const actualStartPosition = [...keywords] + .map((k) => textLower.indexOf(k.toLowerCase())) + .filter((i) => i > -1) + .slice(-1)[0]; + const startWithContext = Math.max(actualStartPosition - 120, 0); + + const top = startWithContext === 0 ? "" : "..."; + const tail = startWithContext + 240 < text.length ? "..." : ""; + + let summary = document.createElement("p"); + summary.classList.add("context"); + summary.textContent = top + text.substr(startWithContext, 240).trim() + tail; + + return summary; + }, +}; + +_ready(Search.init); diff --git a/_static/sphinx-design.min.css b/_static/sphinx-design.min.css new file mode 100644 index 00000000..a325746f --- /dev/null +++ b/_static/sphinx-design.min.css @@ -0,0 +1 @@ +.sd-bg-primary{background-color:var(--sd-color-primary) !important}.sd-bg-text-primary{color:var(--sd-color-primary-text) !important}button.sd-bg-primary:focus,button.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}a.sd-bg-primary:focus,a.sd-bg-primary:hover{background-color:var(--sd-color-primary-highlight) !important}.sd-bg-secondary{background-color:var(--sd-color-secondary) !important}.sd-bg-text-secondary{color:var(--sd-color-secondary-text) !important}button.sd-bg-secondary:focus,button.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}a.sd-bg-secondary:focus,a.sd-bg-secondary:hover{background-color:var(--sd-color-secondary-highlight) !important}.sd-bg-success{background-color:var(--sd-color-success) !important}.sd-bg-text-success{color:var(--sd-color-success-text) !important}button.sd-bg-success:focus,button.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}a.sd-bg-success:focus,a.sd-bg-success:hover{background-color:var(--sd-color-success-highlight) !important}.sd-bg-info{background-color:var(--sd-color-info) !important}.sd-bg-text-info{color:var(--sd-color-info-text) !important}button.sd-bg-info:focus,button.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}a.sd-bg-info:focus,a.sd-bg-info:hover{background-color:var(--sd-color-info-highlight) !important}.sd-bg-warning{background-color:var(--sd-color-warning) !important}.sd-bg-text-warning{color:var(--sd-color-warning-text) !important}button.sd-bg-warning:focus,button.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}a.sd-bg-warning:focus,a.sd-bg-warning:hover{background-color:var(--sd-color-warning-highlight) !important}.sd-bg-danger{background-color:var(--sd-color-danger) !important}.sd-bg-text-danger{color:var(--sd-color-danger-text) !important}button.sd-bg-danger:focus,button.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}a.sd-bg-danger:focus,a.sd-bg-danger:hover{background-color:var(--sd-color-danger-highlight) !important}.sd-bg-light{background-color:var(--sd-color-light) !important}.sd-bg-text-light{color:var(--sd-color-light-text) !important}button.sd-bg-light:focus,button.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}a.sd-bg-light:focus,a.sd-bg-light:hover{background-color:var(--sd-color-light-highlight) !important}.sd-bg-muted{background-color:var(--sd-color-muted) !important}.sd-bg-text-muted{color:var(--sd-color-muted-text) !important}button.sd-bg-muted:focus,button.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}a.sd-bg-muted:focus,a.sd-bg-muted:hover{background-color:var(--sd-color-muted-highlight) !important}.sd-bg-dark{background-color:var(--sd-color-dark) !important}.sd-bg-text-dark{color:var(--sd-color-dark-text) !important}button.sd-bg-dark:focus,button.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}a.sd-bg-dark:focus,a.sd-bg-dark:hover{background-color:var(--sd-color-dark-highlight) !important}.sd-bg-black{background-color:var(--sd-color-black) !important}.sd-bg-text-black{color:var(--sd-color-black-text) !important}button.sd-bg-black:focus,button.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}a.sd-bg-black:focus,a.sd-bg-black:hover{background-color:var(--sd-color-black-highlight) !important}.sd-bg-white{background-color:var(--sd-color-white) !important}.sd-bg-text-white{color:var(--sd-color-white-text) !important}button.sd-bg-white:focus,button.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}a.sd-bg-white:focus,a.sd-bg-white:hover{background-color:var(--sd-color-white-highlight) !important}.sd-text-primary,.sd-text-primary>p{color:var(--sd-color-primary) !important}a.sd-text-primary:focus,a.sd-text-primary:hover{color:var(--sd-color-primary-highlight) !important}.sd-text-secondary,.sd-text-secondary>p{color:var(--sd-color-secondary) !important}a.sd-text-secondary:focus,a.sd-text-secondary:hover{color:var(--sd-color-secondary-highlight) !important}.sd-text-success,.sd-text-success>p{color:var(--sd-color-success) !important}a.sd-text-success:focus,a.sd-text-success:hover{color:var(--sd-color-success-highlight) !important}.sd-text-info,.sd-text-info>p{color:var(--sd-color-info) !important}a.sd-text-info:focus,a.sd-text-info:hover{color:var(--sd-color-info-highlight) !important}.sd-text-warning,.sd-text-warning>p{color:var(--sd-color-warning) !important}a.sd-text-warning:focus,a.sd-text-warning:hover{color:var(--sd-color-warning-highlight) !important}.sd-text-danger,.sd-text-danger>p{color:var(--sd-color-danger) !important}a.sd-text-danger:focus,a.sd-text-danger:hover{color:var(--sd-color-danger-highlight) !important}.sd-text-light,.sd-text-light>p{color:var(--sd-color-light) !important}a.sd-text-light:focus,a.sd-text-light:hover{color:var(--sd-color-light-highlight) !important}.sd-text-muted,.sd-text-muted>p{color:var(--sd-color-muted) !important}a.sd-text-muted:focus,a.sd-text-muted:hover{color:var(--sd-color-muted-highlight) !important}.sd-text-dark,.sd-text-dark>p{color:var(--sd-color-dark) !important}a.sd-text-dark:focus,a.sd-text-dark:hover{color:var(--sd-color-dark-highlight) !important}.sd-text-black,.sd-text-black>p{color:var(--sd-color-black) !important}a.sd-text-black:focus,a.sd-text-black:hover{color:var(--sd-color-black-highlight) !important}.sd-text-white,.sd-text-white>p{color:var(--sd-color-white) !important}a.sd-text-white:focus,a.sd-text-white:hover{color:var(--sd-color-white-highlight) !important}.sd-outline-primary{border-color:var(--sd-color-primary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-primary:focus,a.sd-outline-primary:hover{border-color:var(--sd-color-primary-highlight) !important}.sd-outline-secondary{border-color:var(--sd-color-secondary) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-secondary:focus,a.sd-outline-secondary:hover{border-color:var(--sd-color-secondary-highlight) !important}.sd-outline-success{border-color:var(--sd-color-success) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-success:focus,a.sd-outline-success:hover{border-color:var(--sd-color-success-highlight) !important}.sd-outline-info{border-color:var(--sd-color-info) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-info:focus,a.sd-outline-info:hover{border-color:var(--sd-color-info-highlight) !important}.sd-outline-warning{border-color:var(--sd-color-warning) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-warning:focus,a.sd-outline-warning:hover{border-color:var(--sd-color-warning-highlight) !important}.sd-outline-danger{border-color:var(--sd-color-danger) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-danger:focus,a.sd-outline-danger:hover{border-color:var(--sd-color-danger-highlight) !important}.sd-outline-light{border-color:var(--sd-color-light) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-light:focus,a.sd-outline-light:hover{border-color:var(--sd-color-light-highlight) !important}.sd-outline-muted{border-color:var(--sd-color-muted) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-muted:focus,a.sd-outline-muted:hover{border-color:var(--sd-color-muted-highlight) !important}.sd-outline-dark{border-color:var(--sd-color-dark) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-dark:focus,a.sd-outline-dark:hover{border-color:var(--sd-color-dark-highlight) !important}.sd-outline-black{border-color:var(--sd-color-black) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-black:focus,a.sd-outline-black:hover{border-color:var(--sd-color-black-highlight) !important}.sd-outline-white{border-color:var(--sd-color-white) !important;border-style:solid !important;border-width:1px !important}a.sd-outline-white:focus,a.sd-outline-white:hover{border-color:var(--sd-color-white-highlight) !important}.sd-bg-transparent{background-color:transparent !important}.sd-outline-transparent{border-color:transparent !important}.sd-text-transparent{color:transparent !important}.sd-p-0{padding:0 !important}.sd-pt-0,.sd-py-0{padding-top:0 !important}.sd-pr-0,.sd-px-0{padding-right:0 !important}.sd-pb-0,.sd-py-0{padding-bottom:0 !important}.sd-pl-0,.sd-px-0{padding-left:0 !important}.sd-p-1{padding:.25rem !important}.sd-pt-1,.sd-py-1{padding-top:.25rem !important}.sd-pr-1,.sd-px-1{padding-right:.25rem !important}.sd-pb-1,.sd-py-1{padding-bottom:.25rem !important}.sd-pl-1,.sd-px-1{padding-left:.25rem !important}.sd-p-2{padding:.5rem !important}.sd-pt-2,.sd-py-2{padding-top:.5rem !important}.sd-pr-2,.sd-px-2{padding-right:.5rem !important}.sd-pb-2,.sd-py-2{padding-bottom:.5rem !important}.sd-pl-2,.sd-px-2{padding-left:.5rem !important}.sd-p-3{padding:1rem !important}.sd-pt-3,.sd-py-3{padding-top:1rem !important}.sd-pr-3,.sd-px-3{padding-right:1rem !important}.sd-pb-3,.sd-py-3{padding-bottom:1rem !important}.sd-pl-3,.sd-px-3{padding-left:1rem !important}.sd-p-4{padding:1.5rem !important}.sd-pt-4,.sd-py-4{padding-top:1.5rem !important}.sd-pr-4,.sd-px-4{padding-right:1.5rem !important}.sd-pb-4,.sd-py-4{padding-bottom:1.5rem !important}.sd-pl-4,.sd-px-4{padding-left:1.5rem !important}.sd-p-5{padding:3rem !important}.sd-pt-5,.sd-py-5{padding-top:3rem !important}.sd-pr-5,.sd-px-5{padding-right:3rem !important}.sd-pb-5,.sd-py-5{padding-bottom:3rem !important}.sd-pl-5,.sd-px-5{padding-left:3rem !important}.sd-m-auto{margin:auto !important}.sd-mt-auto,.sd-my-auto{margin-top:auto !important}.sd-mr-auto,.sd-mx-auto{margin-right:auto !important}.sd-mb-auto,.sd-my-auto{margin-bottom:auto !important}.sd-ml-auto,.sd-mx-auto{margin-left:auto !important}.sd-m-0{margin:0 !important}.sd-mt-0,.sd-my-0{margin-top:0 !important}.sd-mr-0,.sd-mx-0{margin-right:0 !important}.sd-mb-0,.sd-my-0{margin-bottom:0 !important}.sd-ml-0,.sd-mx-0{margin-left:0 !important}.sd-m-1{margin:.25rem !important}.sd-mt-1,.sd-my-1{margin-top:.25rem !important}.sd-mr-1,.sd-mx-1{margin-right:.25rem !important}.sd-mb-1,.sd-my-1{margin-bottom:.25rem !important}.sd-ml-1,.sd-mx-1{margin-left:.25rem !important}.sd-m-2{margin:.5rem !important}.sd-mt-2,.sd-my-2{margin-top:.5rem !important}.sd-mr-2,.sd-mx-2{margin-right:.5rem !important}.sd-mb-2,.sd-my-2{margin-bottom:.5rem !important}.sd-ml-2,.sd-mx-2{margin-left:.5rem !important}.sd-m-3{margin:1rem !important}.sd-mt-3,.sd-my-3{margin-top:1rem !important}.sd-mr-3,.sd-mx-3{margin-right:1rem !important}.sd-mb-3,.sd-my-3{margin-bottom:1rem !important}.sd-ml-3,.sd-mx-3{margin-left:1rem !important}.sd-m-4{margin:1.5rem !important}.sd-mt-4,.sd-my-4{margin-top:1.5rem !important}.sd-mr-4,.sd-mx-4{margin-right:1.5rem !important}.sd-mb-4,.sd-my-4{margin-bottom:1.5rem !important}.sd-ml-4,.sd-mx-4{margin-left:1.5rem !important}.sd-m-5{margin:3rem !important}.sd-mt-5,.sd-my-5{margin-top:3rem !important}.sd-mr-5,.sd-mx-5{margin-right:3rem !important}.sd-mb-5,.sd-my-5{margin-bottom:3rem !important}.sd-ml-5,.sd-mx-5{margin-left:3rem !important}.sd-w-25{width:25% !important}.sd-w-50{width:50% !important}.sd-w-75{width:75% !important}.sd-w-100{width:100% !important}.sd-w-auto{width:auto !important}.sd-h-25{height:25% !important}.sd-h-50{height:50% !important}.sd-h-75{height:75% !important}.sd-h-100{height:100% !important}.sd-h-auto{height:auto !important}.sd-d-none{display:none !important}.sd-d-inline{display:inline !important}.sd-d-inline-block{display:inline-block !important}.sd-d-block{display:block !important}.sd-d-grid{display:grid !important}.sd-d-flex-row{display:-ms-flexbox !important;display:flex !important;flex-direction:row !important}.sd-d-flex-column{display:-ms-flexbox !important;display:flex !important;flex-direction:column !important}.sd-d-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}@media(min-width: 576px){.sd-d-sm-none{display:none !important}.sd-d-sm-inline{display:inline !important}.sd-d-sm-inline-block{display:inline-block !important}.sd-d-sm-block{display:block !important}.sd-d-sm-grid{display:grid !important}.sd-d-sm-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-sm-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 768px){.sd-d-md-none{display:none !important}.sd-d-md-inline{display:inline !important}.sd-d-md-inline-block{display:inline-block !important}.sd-d-md-block{display:block !important}.sd-d-md-grid{display:grid !important}.sd-d-md-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-md-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 992px){.sd-d-lg-none{display:none !important}.sd-d-lg-inline{display:inline !important}.sd-d-lg-inline-block{display:inline-block !important}.sd-d-lg-block{display:block !important}.sd-d-lg-grid{display:grid !important}.sd-d-lg-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-lg-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}@media(min-width: 1200px){.sd-d-xl-none{display:none !important}.sd-d-xl-inline{display:inline !important}.sd-d-xl-inline-block{display:inline-block !important}.sd-d-xl-block{display:block !important}.sd-d-xl-grid{display:grid !important}.sd-d-xl-flex{display:-ms-flexbox !important;display:flex !important}.sd-d-xl-inline-flex{display:-ms-inline-flexbox !important;display:inline-flex !important}}.sd-align-major-start{justify-content:flex-start !important}.sd-align-major-end{justify-content:flex-end !important}.sd-align-major-center{justify-content:center !important}.sd-align-major-justify{justify-content:space-between !important}.sd-align-major-spaced{justify-content:space-evenly !important}.sd-align-minor-start{align-items:flex-start !important}.sd-align-minor-end{align-items:flex-end !important}.sd-align-minor-center{align-items:center !important}.sd-align-minor-stretch{align-items:stretch !important}.sd-text-justify{text-align:justify !important}.sd-text-left{text-align:left !important}.sd-text-right{text-align:right !important}.sd-text-center{text-align:center !important}.sd-font-weight-light{font-weight:300 !important}.sd-font-weight-lighter{font-weight:lighter !important}.sd-font-weight-normal{font-weight:400 !important}.sd-font-weight-bold{font-weight:700 !important}.sd-font-weight-bolder{font-weight:bolder !important}.sd-font-italic{font-style:italic !important}.sd-text-decoration-none{text-decoration:none !important}.sd-text-lowercase{text-transform:lowercase !important}.sd-text-uppercase{text-transform:uppercase !important}.sd-text-capitalize{text-transform:capitalize !important}.sd-text-wrap{white-space:normal !important}.sd-text-nowrap{white-space:nowrap !important}.sd-text-truncate{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.sd-fs-1,.sd-fs-1>p{font-size:calc(1.375rem + 1.5vw) !important;line-height:unset !important}.sd-fs-2,.sd-fs-2>p{font-size:calc(1.325rem + 0.9vw) !important;line-height:unset !important}.sd-fs-3,.sd-fs-3>p{font-size:calc(1.3rem + 0.6vw) !important;line-height:unset !important}.sd-fs-4,.sd-fs-4>p{font-size:calc(1.275rem + 0.3vw) !important;line-height:unset !important}.sd-fs-5,.sd-fs-5>p{font-size:1.25rem !important;line-height:unset !important}.sd-fs-6,.sd-fs-6>p{font-size:1rem !important;line-height:unset !important}.sd-border-0{border:0 solid !important}.sd-border-top-0{border-top:0 solid !important}.sd-border-bottom-0{border-bottom:0 solid !important}.sd-border-right-0{border-right:0 solid !important}.sd-border-left-0{border-left:0 solid !important}.sd-border-1{border:1px solid !important}.sd-border-top-1{border-top:1px solid !important}.sd-border-bottom-1{border-bottom:1px solid !important}.sd-border-right-1{border-right:1px solid !important}.sd-border-left-1{border-left:1px solid !important}.sd-border-2{border:2px solid !important}.sd-border-top-2{border-top:2px solid !important}.sd-border-bottom-2{border-bottom:2px solid !important}.sd-border-right-2{border-right:2px solid !important}.sd-border-left-2{border-left:2px solid !important}.sd-border-3{border:3px solid !important}.sd-border-top-3{border-top:3px solid !important}.sd-border-bottom-3{border-bottom:3px solid !important}.sd-border-right-3{border-right:3px solid !important}.sd-border-left-3{border-left:3px solid !important}.sd-border-4{border:4px solid !important}.sd-border-top-4{border-top:4px solid !important}.sd-border-bottom-4{border-bottom:4px solid !important}.sd-border-right-4{border-right:4px solid !important}.sd-border-left-4{border-left:4px solid !important}.sd-border-5{border:5px solid !important}.sd-border-top-5{border-top:5px solid !important}.sd-border-bottom-5{border-bottom:5px solid !important}.sd-border-right-5{border-right:5px solid !important}.sd-border-left-5{border-left:5px solid !important}.sd-rounded-0{border-radius:0 !important}.sd-rounded-1{border-radius:.2rem !important}.sd-rounded-2{border-radius:.3rem !important}.sd-rounded-3{border-radius:.5rem !important}.sd-rounded-pill{border-radius:50rem !important}.sd-rounded-circle{border-radius:50% !important}.shadow-none{box-shadow:none !important}.sd-shadow-sm{box-shadow:0 .125rem .25rem var(--sd-color-shadow) !important}.sd-shadow-md{box-shadow:0 .5rem 1rem var(--sd-color-shadow) !important}.sd-shadow-lg{box-shadow:0 1rem 3rem var(--sd-color-shadow) !important}@keyframes sd-slide-from-left{0%{transform:translateX(-100%)}100%{transform:translateX(0)}}@keyframes sd-slide-from-right{0%{transform:translateX(200%)}100%{transform:translateX(0)}}@keyframes sd-grow100{0%{transform:scale(0);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50{0%{transform:scale(0.5);opacity:.5}100%{transform:scale(1);opacity:1}}@keyframes sd-grow50-rot20{0%{transform:scale(0.5) rotateZ(-20deg);opacity:.5}75%{transform:scale(1) rotateZ(5deg);opacity:1}95%{transform:scale(1) rotateZ(-1deg);opacity:1}100%{transform:scale(1) rotateZ(0);opacity:1}}.sd-animate-slide-from-left{animation:1s ease-out 0s 1 normal none running sd-slide-from-left}.sd-animate-slide-from-right{animation:1s ease-out 0s 1 normal none running sd-slide-from-right}.sd-animate-grow100{animation:1s ease-out 0s 1 normal none running sd-grow100}.sd-animate-grow50{animation:1s ease-out 0s 1 normal none running sd-grow50}.sd-animate-grow50-rot20{animation:1s ease-out 0s 1 normal none running sd-grow50-rot20}.sd-badge{display:inline-block;padding:.35em .65em;font-size:.75em;font-weight:700;line-height:1;text-align:center;white-space:nowrap;vertical-align:baseline;border-radius:.25rem}.sd-badge:empty{display:none}a.sd-badge{text-decoration:none}.sd-btn .sd-badge{position:relative;top:-1px}.sd-btn{background-color:transparent;border:1px solid transparent;border-radius:.25rem;cursor:pointer;display:inline-block;font-weight:400;font-size:1rem;line-height:1.5;padding:.375rem .75rem;text-align:center;text-decoration:none;transition:color .15s ease-in-out,background-color .15s ease-in-out,border-color .15s ease-in-out,box-shadow .15s ease-in-out;vertical-align:middle;user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none}.sd-btn:hover{text-decoration:none}@media(prefers-reduced-motion: reduce){.sd-btn{transition:none}}.sd-btn-primary,.sd-btn-outline-primary:hover,.sd-btn-outline-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-primary:hover,.sd-btn-primary:focus{color:var(--sd-color-primary-text) !important;background-color:var(--sd-color-primary-highlight) !important;border-color:var(--sd-color-primary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-primary{color:var(--sd-color-primary) !important;border-color:var(--sd-color-primary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary,.sd-btn-outline-secondary:hover,.sd-btn-outline-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-secondary:hover,.sd-btn-secondary:focus{color:var(--sd-color-secondary-text) !important;background-color:var(--sd-color-secondary-highlight) !important;border-color:var(--sd-color-secondary-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-secondary{color:var(--sd-color-secondary) !important;border-color:var(--sd-color-secondary) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success,.sd-btn-outline-success:hover,.sd-btn-outline-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-success:hover,.sd-btn-success:focus{color:var(--sd-color-success-text) !important;background-color:var(--sd-color-success-highlight) !important;border-color:var(--sd-color-success-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-success{color:var(--sd-color-success) !important;border-color:var(--sd-color-success) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info,.sd-btn-outline-info:hover,.sd-btn-outline-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-info:hover,.sd-btn-info:focus{color:var(--sd-color-info-text) !important;background-color:var(--sd-color-info-highlight) !important;border-color:var(--sd-color-info-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-info{color:var(--sd-color-info) !important;border-color:var(--sd-color-info) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning,.sd-btn-outline-warning:hover,.sd-btn-outline-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-warning:hover,.sd-btn-warning:focus{color:var(--sd-color-warning-text) !important;background-color:var(--sd-color-warning-highlight) !important;border-color:var(--sd-color-warning-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-warning{color:var(--sd-color-warning) !important;border-color:var(--sd-color-warning) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger,.sd-btn-outline-danger:hover,.sd-btn-outline-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-danger:hover,.sd-btn-danger:focus{color:var(--sd-color-danger-text) !important;background-color:var(--sd-color-danger-highlight) !important;border-color:var(--sd-color-danger-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-danger{color:var(--sd-color-danger) !important;border-color:var(--sd-color-danger) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light,.sd-btn-outline-light:hover,.sd-btn-outline-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-light:hover,.sd-btn-light:focus{color:var(--sd-color-light-text) !important;background-color:var(--sd-color-light-highlight) !important;border-color:var(--sd-color-light-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-light{color:var(--sd-color-light) !important;border-color:var(--sd-color-light) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted,.sd-btn-outline-muted:hover,.sd-btn-outline-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-muted:hover,.sd-btn-muted:focus{color:var(--sd-color-muted-text) !important;background-color:var(--sd-color-muted-highlight) !important;border-color:var(--sd-color-muted-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-muted{color:var(--sd-color-muted) !important;border-color:var(--sd-color-muted) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark,.sd-btn-outline-dark:hover,.sd-btn-outline-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-dark:hover,.sd-btn-dark:focus{color:var(--sd-color-dark-text) !important;background-color:var(--sd-color-dark-highlight) !important;border-color:var(--sd-color-dark-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-dark{color:var(--sd-color-dark) !important;border-color:var(--sd-color-dark) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black,.sd-btn-outline-black:hover,.sd-btn-outline-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-black:hover,.sd-btn-black:focus{color:var(--sd-color-black-text) !important;background-color:var(--sd-color-black-highlight) !important;border-color:var(--sd-color-black-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-black{color:var(--sd-color-black) !important;border-color:var(--sd-color-black) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white,.sd-btn-outline-white:hover,.sd-btn-outline-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-btn-white:hover,.sd-btn-white:focus{color:var(--sd-color-white-text) !important;background-color:var(--sd-color-white-highlight) !important;border-color:var(--sd-color-white-highlight) !important;border-width:1px !important;border-style:solid !important}.sd-btn-outline-white{color:var(--sd-color-white) !important;border-color:var(--sd-color-white) !important;border-width:1px !important;border-style:solid !important}.sd-stretched-link::after{position:absolute;top:0;right:0;bottom:0;left:0;z-index:1;content:""}.sd-hide-link-text{font-size:0}.sd-octicon,.sd-material-icon{display:inline-block;fill:currentColor;vertical-align:middle}.sd-avatar-xs{border-radius:50%;object-fit:cover;object-position:center;width:1rem;height:1rem}.sd-avatar-sm{border-radius:50%;object-fit:cover;object-position:center;width:3rem;height:3rem}.sd-avatar-md{border-radius:50%;object-fit:cover;object-position:center;width:5rem;height:5rem}.sd-avatar-lg{border-radius:50%;object-fit:cover;object-position:center;width:7rem;height:7rem}.sd-avatar-xl{border-radius:50%;object-fit:cover;object-position:center;width:10rem;height:10rem}.sd-avatar-inherit{border-radius:50%;object-fit:cover;object-position:center;width:inherit;height:inherit}.sd-avatar-initial{border-radius:50%;object-fit:cover;object-position:center;width:initial;height:initial}.sd-card{background-clip:border-box;background-color:var(--sd-color-card-background);border:1px solid var(--sd-color-card-border);border-radius:.25rem;color:var(--sd-color-card-text);display:-ms-flexbox;display:flex;-ms-flex-direction:column;flex-direction:column;min-width:0;position:relative;word-wrap:break-word}.sd-card>hr{margin-left:0;margin-right:0}.sd-card-hover:hover{border-color:var(--sd-color-card-border-hover);transform:scale(1.01)}.sd-card-body{-ms-flex:1 1 auto;flex:1 1 auto;padding:1rem 1rem}.sd-card-title{margin-bottom:.5rem}.sd-card-subtitle{margin-top:-0.25rem;margin-bottom:0}.sd-card-text:last-child{margin-bottom:0}.sd-card-link:hover{text-decoration:none}.sd-card-link+.card-link{margin-left:1rem}.sd-card-header{padding:.5rem 1rem;margin-bottom:0;background-color:var(--sd-color-card-header);border-bottom:1px solid var(--sd-color-card-border)}.sd-card-header:first-child{border-radius:calc(0.25rem - 1px) calc(0.25rem - 1px) 0 0}.sd-card-footer{padding:.5rem 1rem;background-color:var(--sd-color-card-footer);border-top:1px solid var(--sd-color-card-border)}.sd-card-footer:last-child{border-radius:0 0 calc(0.25rem - 1px) calc(0.25rem - 1px)}.sd-card-header-tabs{margin-right:-0.5rem;margin-bottom:-0.5rem;margin-left:-0.5rem;border-bottom:0}.sd-card-header-pills{margin-right:-0.5rem;margin-left:-0.5rem}.sd-card-img-overlay{position:absolute;top:0;right:0;bottom:0;left:0;padding:1rem;border-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom,.sd-card-img-top{width:100%}.sd-card-img,.sd-card-img-top{border-top-left-radius:calc(0.25rem - 1px);border-top-right-radius:calc(0.25rem - 1px)}.sd-card-img,.sd-card-img-bottom{border-bottom-left-radius:calc(0.25rem - 1px);border-bottom-right-radius:calc(0.25rem - 1px)}.sd-cards-carousel{width:100%;display:flex;flex-wrap:nowrap;-ms-flex-direction:row;flex-direction:row;overflow-x:hidden;scroll-snap-type:x mandatory}.sd-cards-carousel.sd-show-scrollbar{overflow-x:auto}.sd-cards-carousel:hover,.sd-cards-carousel:focus{overflow-x:auto}.sd-cards-carousel>.sd-card{flex-shrink:0;scroll-snap-align:start}.sd-cards-carousel>.sd-card:not(:last-child){margin-right:3px}.sd-card-cols-1>.sd-card{width:90%}.sd-card-cols-2>.sd-card{width:45%}.sd-card-cols-3>.sd-card{width:30%}.sd-card-cols-4>.sd-card{width:22.5%}.sd-card-cols-5>.sd-card{width:18%}.sd-card-cols-6>.sd-card{width:15%}.sd-card-cols-7>.sd-card{width:12.8571428571%}.sd-card-cols-8>.sd-card{width:11.25%}.sd-card-cols-9>.sd-card{width:10%}.sd-card-cols-10>.sd-card{width:9%}.sd-card-cols-11>.sd-card{width:8.1818181818%}.sd-card-cols-12>.sd-card{width:7.5%}.sd-container,.sd-container-fluid,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container-xl{margin-left:auto;margin-right:auto;padding-left:var(--sd-gutter-x, 0.75rem);padding-right:var(--sd-gutter-x, 0.75rem);width:100%}@media(min-width: 576px){.sd-container-sm,.sd-container{max-width:540px}}@media(min-width: 768px){.sd-container-md,.sd-container-sm,.sd-container{max-width:720px}}@media(min-width: 992px){.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:960px}}@media(min-width: 1200px){.sd-container-xl,.sd-container-lg,.sd-container-md,.sd-container-sm,.sd-container{max-width:1140px}}.sd-row{--sd-gutter-x: 1.5rem;--sd-gutter-y: 0;display:-ms-flexbox;display:flex;-ms-flex-wrap:wrap;flex-wrap:wrap;margin-top:calc(var(--sd-gutter-y) * -1);margin-right:calc(var(--sd-gutter-x) * -0.5);margin-left:calc(var(--sd-gutter-x) * -0.5)}.sd-row>*{box-sizing:border-box;flex-shrink:0;width:100%;max-width:100%;padding-right:calc(var(--sd-gutter-x) * 0.5);padding-left:calc(var(--sd-gutter-x) * 0.5);margin-top:var(--sd-gutter-y)}.sd-col{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-auto>*{flex:0 0 auto;width:auto}.sd-row-cols-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}@media(min-width: 576px){.sd-col-sm{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-sm-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-sm-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-sm-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-sm-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-sm-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-sm-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-sm-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-sm-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-sm-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-sm-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-sm-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-sm-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-sm-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 768px){.sd-col-md{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-md-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-md-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-md-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-md-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-md-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-md-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-md-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-md-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-md-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-md-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-md-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-md-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-md-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 992px){.sd-col-lg{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-lg-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-lg-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-lg-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-lg-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-lg-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-lg-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-lg-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-lg-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-lg-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-lg-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-lg-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-lg-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-lg-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}@media(min-width: 1200px){.sd-col-xl{flex:1 0 0%;-ms-flex:1 0 0%}.sd-row-cols-xl-auto{flex:1 0 auto;-ms-flex:1 0 auto;width:100%}.sd-row-cols-xl-1>*{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-row-cols-xl-2>*{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-row-cols-xl-3>*{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-row-cols-xl-4>*{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-row-cols-xl-5>*{flex:0 0 auto;-ms-flex:0 0 auto;width:20%}.sd-row-cols-xl-6>*{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-row-cols-xl-7>*{flex:0 0 auto;-ms-flex:0 0 auto;width:14.2857142857%}.sd-row-cols-xl-8>*{flex:0 0 auto;-ms-flex:0 0 auto;width:12.5%}.sd-row-cols-xl-9>*{flex:0 0 auto;-ms-flex:0 0 auto;width:11.1111111111%}.sd-row-cols-xl-10>*{flex:0 0 auto;-ms-flex:0 0 auto;width:10%}.sd-row-cols-xl-11>*{flex:0 0 auto;-ms-flex:0 0 auto;width:9.0909090909%}.sd-row-cols-xl-12>*{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}}.sd-col-auto{flex:0 0 auto;-ms-flex:0 0 auto;width:auto}.sd-col-1{flex:0 0 auto;-ms-flex:0 0 auto;width:8.3333333333%}.sd-col-2{flex:0 0 auto;-ms-flex:0 0 auto;width:16.6666666667%}.sd-col-3{flex:0 0 auto;-ms-flex:0 0 auto;width:25%}.sd-col-4{flex:0 0 auto;-ms-flex:0 0 auto;width:33.3333333333%}.sd-col-5{flex:0 0 auto;-ms-flex:0 0 auto;width:41.6666666667%}.sd-col-6{flex:0 0 auto;-ms-flex:0 0 auto;width:50%}.sd-col-7{flex:0 0 auto;-ms-flex:0 0 auto;width:58.3333333333%}.sd-col-8{flex:0 0 auto;-ms-flex:0 0 auto;width:66.6666666667%}.sd-col-9{flex:0 0 auto;-ms-flex:0 0 auto;width:75%}.sd-col-10{flex:0 0 auto;-ms-flex:0 0 auto;width:83.3333333333%}.sd-col-11{flex:0 0 auto;-ms-flex:0 0 auto;width:91.6666666667%}.sd-col-12{flex:0 0 auto;-ms-flex:0 0 auto;width:100%}.sd-g-0,.sd-gy-0{--sd-gutter-y: 0}.sd-g-0,.sd-gx-0{--sd-gutter-x: 0}.sd-g-1,.sd-gy-1{--sd-gutter-y: 0.25rem}.sd-g-1,.sd-gx-1{--sd-gutter-x: 0.25rem}.sd-g-2,.sd-gy-2{--sd-gutter-y: 0.5rem}.sd-g-2,.sd-gx-2{--sd-gutter-x: 0.5rem}.sd-g-3,.sd-gy-3{--sd-gutter-y: 1rem}.sd-g-3,.sd-gx-3{--sd-gutter-x: 1rem}.sd-g-4,.sd-gy-4{--sd-gutter-y: 1.5rem}.sd-g-4,.sd-gx-4{--sd-gutter-x: 1.5rem}.sd-g-5,.sd-gy-5{--sd-gutter-y: 3rem}.sd-g-5,.sd-gx-5{--sd-gutter-x: 3rem}@media(min-width: 576px){.sd-col-sm-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-sm-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-sm-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-sm-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-sm-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-sm-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-sm-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-sm-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-sm-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-sm-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-sm-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-sm-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-sm-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-sm-0,.sd-gy-sm-0{--sd-gutter-y: 0}.sd-g-sm-0,.sd-gx-sm-0{--sd-gutter-x: 0}.sd-g-sm-1,.sd-gy-sm-1{--sd-gutter-y: 0.25rem}.sd-g-sm-1,.sd-gx-sm-1{--sd-gutter-x: 0.25rem}.sd-g-sm-2,.sd-gy-sm-2{--sd-gutter-y: 0.5rem}.sd-g-sm-2,.sd-gx-sm-2{--sd-gutter-x: 0.5rem}.sd-g-sm-3,.sd-gy-sm-3{--sd-gutter-y: 1rem}.sd-g-sm-3,.sd-gx-sm-3{--sd-gutter-x: 1rem}.sd-g-sm-4,.sd-gy-sm-4{--sd-gutter-y: 1.5rem}.sd-g-sm-4,.sd-gx-sm-4{--sd-gutter-x: 1.5rem}.sd-g-sm-5,.sd-gy-sm-5{--sd-gutter-y: 3rem}.sd-g-sm-5,.sd-gx-sm-5{--sd-gutter-x: 3rem}}@media(min-width: 768px){.sd-col-md-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-md-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-md-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-md-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-md-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-md-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-md-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-md-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-md-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-md-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-md-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-md-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-md-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-md-0,.sd-gy-md-0{--sd-gutter-y: 0}.sd-g-md-0,.sd-gx-md-0{--sd-gutter-x: 0}.sd-g-md-1,.sd-gy-md-1{--sd-gutter-y: 0.25rem}.sd-g-md-1,.sd-gx-md-1{--sd-gutter-x: 0.25rem}.sd-g-md-2,.sd-gy-md-2{--sd-gutter-y: 0.5rem}.sd-g-md-2,.sd-gx-md-2{--sd-gutter-x: 0.5rem}.sd-g-md-3,.sd-gy-md-3{--sd-gutter-y: 1rem}.sd-g-md-3,.sd-gx-md-3{--sd-gutter-x: 1rem}.sd-g-md-4,.sd-gy-md-4{--sd-gutter-y: 1.5rem}.sd-g-md-4,.sd-gx-md-4{--sd-gutter-x: 1.5rem}.sd-g-md-5,.sd-gy-md-5{--sd-gutter-y: 3rem}.sd-g-md-5,.sd-gx-md-5{--sd-gutter-x: 3rem}}@media(min-width: 992px){.sd-col-lg-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-lg-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-lg-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-lg-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-lg-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-lg-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-lg-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-lg-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-lg-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-lg-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-lg-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-lg-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-lg-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-lg-0,.sd-gy-lg-0{--sd-gutter-y: 0}.sd-g-lg-0,.sd-gx-lg-0{--sd-gutter-x: 0}.sd-g-lg-1,.sd-gy-lg-1{--sd-gutter-y: 0.25rem}.sd-g-lg-1,.sd-gx-lg-1{--sd-gutter-x: 0.25rem}.sd-g-lg-2,.sd-gy-lg-2{--sd-gutter-y: 0.5rem}.sd-g-lg-2,.sd-gx-lg-2{--sd-gutter-x: 0.5rem}.sd-g-lg-3,.sd-gy-lg-3{--sd-gutter-y: 1rem}.sd-g-lg-3,.sd-gx-lg-3{--sd-gutter-x: 1rem}.sd-g-lg-4,.sd-gy-lg-4{--sd-gutter-y: 1.5rem}.sd-g-lg-4,.sd-gx-lg-4{--sd-gutter-x: 1.5rem}.sd-g-lg-5,.sd-gy-lg-5{--sd-gutter-y: 3rem}.sd-g-lg-5,.sd-gx-lg-5{--sd-gutter-x: 3rem}}@media(min-width: 1200px){.sd-col-xl-auto{-ms-flex:0 0 auto;flex:0 0 auto;width:auto}.sd-col-xl-1{-ms-flex:0 0 auto;flex:0 0 auto;width:8.3333333333%}.sd-col-xl-2{-ms-flex:0 0 auto;flex:0 0 auto;width:16.6666666667%}.sd-col-xl-3{-ms-flex:0 0 auto;flex:0 0 auto;width:25%}.sd-col-xl-4{-ms-flex:0 0 auto;flex:0 0 auto;width:33.3333333333%}.sd-col-xl-5{-ms-flex:0 0 auto;flex:0 0 auto;width:41.6666666667%}.sd-col-xl-6{-ms-flex:0 0 auto;flex:0 0 auto;width:50%}.sd-col-xl-7{-ms-flex:0 0 auto;flex:0 0 auto;width:58.3333333333%}.sd-col-xl-8{-ms-flex:0 0 auto;flex:0 0 auto;width:66.6666666667%}.sd-col-xl-9{-ms-flex:0 0 auto;flex:0 0 auto;width:75%}.sd-col-xl-10{-ms-flex:0 0 auto;flex:0 0 auto;width:83.3333333333%}.sd-col-xl-11{-ms-flex:0 0 auto;flex:0 0 auto;width:91.6666666667%}.sd-col-xl-12{-ms-flex:0 0 auto;flex:0 0 auto;width:100%}.sd-g-xl-0,.sd-gy-xl-0{--sd-gutter-y: 0}.sd-g-xl-0,.sd-gx-xl-0{--sd-gutter-x: 0}.sd-g-xl-1,.sd-gy-xl-1{--sd-gutter-y: 0.25rem}.sd-g-xl-1,.sd-gx-xl-1{--sd-gutter-x: 0.25rem}.sd-g-xl-2,.sd-gy-xl-2{--sd-gutter-y: 0.5rem}.sd-g-xl-2,.sd-gx-xl-2{--sd-gutter-x: 0.5rem}.sd-g-xl-3,.sd-gy-xl-3{--sd-gutter-y: 1rem}.sd-g-xl-3,.sd-gx-xl-3{--sd-gutter-x: 1rem}.sd-g-xl-4,.sd-gy-xl-4{--sd-gutter-y: 1.5rem}.sd-g-xl-4,.sd-gx-xl-4{--sd-gutter-x: 1.5rem}.sd-g-xl-5,.sd-gy-xl-5{--sd-gutter-y: 3rem}.sd-g-xl-5,.sd-gx-xl-5{--sd-gutter-x: 3rem}}.sd-flex-row-reverse{flex-direction:row-reverse !important}details.sd-dropdown{position:relative;font-size:var(--sd-fontsize-dropdown)}details.sd-dropdown:hover{cursor:pointer}details.sd-dropdown .sd-summary-content{cursor:default}details.sd-dropdown summary.sd-summary-title{padding:.5em 1em;font-size:var(--sd-fontsize-dropdown-title);font-weight:var(--sd-fontweight-dropdown-title);user-select:none;-moz-user-select:none;-ms-user-select:none;-webkit-user-select:none;list-style:none;display:inline-flex;justify-content:space-between}details.sd-dropdown summary.sd-summary-title::-webkit-details-marker{display:none}details.sd-dropdown summary.sd-summary-title:focus{outline:none}details.sd-dropdown summary.sd-summary-title .sd-summary-icon{margin-right:.6em;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-icon svg{opacity:.8}details.sd-dropdown summary.sd-summary-title .sd-summary-text{flex-grow:1;line-height:1.5;padding-right:.5rem}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker{pointer-events:none;display:inline-flex;align-items:center}details.sd-dropdown summary.sd-summary-title .sd-summary-state-marker svg{opacity:.6}details.sd-dropdown summary.sd-summary-title:hover .sd-summary-state-marker svg{opacity:1;transform:scale(1.1)}details.sd-dropdown[open] summary .sd-octicon.no-title{visibility:hidden}details.sd-dropdown .sd-summary-chevron-right{transition:.25s}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-right{transform:rotate(90deg)}details.sd-dropdown[open]>.sd-summary-title .sd-summary-chevron-down{transform:rotate(180deg)}details.sd-dropdown:not([open]).sd-card{border:none}details.sd-dropdown:not([open])>.sd-card-header{border:1px solid var(--sd-color-card-border);border-radius:.25rem}details.sd-dropdown.sd-fade-in[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out;animation:sd-fade-in .5s ease-in-out}details.sd-dropdown.sd-fade-in-slide-down[open] summary~*{-moz-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;-webkit-animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out;animation:sd-fade-in .5s ease-in-out,sd-slide-down .5s ease-in-out}.sd-col>.sd-dropdown{width:100%}.sd-summary-content>.sd-tab-set:first-child{margin-top:0}@keyframes sd-fade-in{0%{opacity:0}100%{opacity:1}}@keyframes sd-slide-down{0%{transform:translate(0, -10px)}100%{transform:translate(0, 0)}}.sd-tab-set{border-radius:.125rem;display:flex;flex-wrap:wrap;margin:1em 0;position:relative}.sd-tab-set>input{opacity:0;position:absolute}.sd-tab-set>input:checked+label{border-color:var(--sd-color-tabs-underline-active);color:var(--sd-color-tabs-label-active)}.sd-tab-set>input:checked+label+.sd-tab-content{display:block}.sd-tab-set>input:not(:checked)+label:hover{color:var(--sd-color-tabs-label-hover);border-color:var(--sd-color-tabs-underline-hover)}.sd-tab-set>input:focus+label{outline-style:auto}.sd-tab-set>input:not(.focus-visible)+label{outline:none;-webkit-tap-highlight-color:transparent}.sd-tab-set>label{border-bottom:.125rem solid transparent;margin-bottom:0;color:var(--sd-color-tabs-label-inactive);border-color:var(--sd-color-tabs-underline-inactive);cursor:pointer;font-size:var(--sd-fontsize-tabs-label);font-weight:700;padding:1em 1.25em .5em;transition:color 250ms;width:auto;z-index:1}html .sd-tab-set>label:hover{color:var(--sd-color-tabs-label-active)}.sd-col>.sd-tab-set{width:100%}.sd-tab-content{box-shadow:0 -0.0625rem var(--sd-color-tabs-overline),0 .0625rem var(--sd-color-tabs-underline);display:none;order:99;padding-bottom:.75rem;padding-top:.75rem;width:100%}.sd-tab-content>:first-child{margin-top:0 !important}.sd-tab-content>:last-child{margin-bottom:0 !important}.sd-tab-content>.sd-tab-set{margin:0}.sd-sphinx-override,.sd-sphinx-override *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.sd-sphinx-override p{margin-top:0}:root{--sd-color-primary: #0071bc;--sd-color-secondary: #6c757d;--sd-color-success: #28a745;--sd-color-info: #17a2b8;--sd-color-warning: #f0b37e;--sd-color-danger: #dc3545;--sd-color-light: #f8f9fa;--sd-color-muted: #6c757d;--sd-color-dark: #212529;--sd-color-black: black;--sd-color-white: white;--sd-color-primary-highlight: #0060a0;--sd-color-secondary-highlight: #5c636a;--sd-color-success-highlight: #228e3b;--sd-color-info-highlight: #148a9c;--sd-color-warning-highlight: #cc986b;--sd-color-danger-highlight: #bb2d3b;--sd-color-light-highlight: #d3d4d5;--sd-color-muted-highlight: #5c636a;--sd-color-dark-highlight: #1c1f23;--sd-color-black-highlight: black;--sd-color-white-highlight: #d9d9d9;--sd-color-primary-bg: rgba(0, 113, 188, 0.2);--sd-color-secondary-bg: rgba(108, 117, 125, 0.2);--sd-color-success-bg: rgba(40, 167, 69, 0.2);--sd-color-info-bg: rgba(23, 162, 184, 0.2);--sd-color-warning-bg: rgba(240, 179, 126, 0.2);--sd-color-danger-bg: rgba(220, 53, 69, 0.2);--sd-color-light-bg: rgba(248, 249, 250, 0.2);--sd-color-muted-bg: rgba(108, 117, 125, 0.2);--sd-color-dark-bg: rgba(33, 37, 41, 0.2);--sd-color-black-bg: rgba(0, 0, 0, 0.2);--sd-color-white-bg: rgba(255, 255, 255, 0.2);--sd-color-primary-text: #fff;--sd-color-secondary-text: #fff;--sd-color-success-text: #fff;--sd-color-info-text: #fff;--sd-color-warning-text: #212529;--sd-color-danger-text: #fff;--sd-color-light-text: #212529;--sd-color-muted-text: #fff;--sd-color-dark-text: #fff;--sd-color-black-text: #fff;--sd-color-white-text: #212529;--sd-color-shadow: rgba(0, 0, 0, 0.15);--sd-color-card-border: rgba(0, 0, 0, 0.125);--sd-color-card-border-hover: hsla(231, 99%, 66%, 1);--sd-color-card-background: transparent;--sd-color-card-text: inherit;--sd-color-card-header: transparent;--sd-color-card-footer: transparent;--sd-color-tabs-label-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-hover: hsla(231, 99%, 66%, 1);--sd-color-tabs-label-inactive: hsl(0, 0%, 66%);--sd-color-tabs-underline-active: hsla(231, 99%, 66%, 1);--sd-color-tabs-underline-hover: rgba(178, 206, 245, 0.62);--sd-color-tabs-underline-inactive: transparent;--sd-color-tabs-overline: rgb(222, 222, 222);--sd-color-tabs-underline: rgb(222, 222, 222);--sd-fontsize-tabs-label: 1rem;--sd-fontsize-dropdown: inherit;--sd-fontsize-dropdown-title: 1rem;--sd-fontweight-dropdown-title: 700} diff --git a/_static/sphinx_highlight.js b/_static/sphinx_highlight.js new file mode 100644 index 00000000..8a96c69a --- /dev/null +++ b/_static/sphinx_highlight.js @@ -0,0 +1,154 @@ +/* Highlighting utilities for Sphinx HTML documentation. */ +"use strict"; + +const SPHINX_HIGHLIGHT_ENABLED = true + +/** + * highlight a given string on a node by wrapping it in + * span elements with the given class name. + */ +const _highlight = (node, addItems, text, className) => { + if (node.nodeType === Node.TEXT_NODE) { + const val = node.nodeValue; + const parent = node.parentNode; + const pos = val.toLowerCase().indexOf(text); + if ( + pos >= 0 && + !parent.classList.contains(className) && + !parent.classList.contains("nohighlight") + ) { + let span; + + const closestNode = parent.closest("body, svg, foreignObject"); + const isInSVG = closestNode && closestNode.matches("svg"); + if (isInSVG) { + span = document.createElementNS("http://www.w3.org/2000/svg", "tspan"); + } else { + span = document.createElement("span"); + span.classList.add(className); + } + + span.appendChild(document.createTextNode(val.substr(pos, text.length))); + const rest = document.createTextNode(val.substr(pos + text.length)); + parent.insertBefore( + span, + parent.insertBefore( + rest, + node.nextSibling + ) + ); + node.nodeValue = val.substr(0, pos); + /* There may be more occurrences of search term in this node. So call this + * function recursively on the remaining fragment. + */ + _highlight(rest, addItems, text, className); + + if (isInSVG) { + const rect = document.createElementNS( + "http://www.w3.org/2000/svg", + "rect" + ); + const bbox = parent.getBBox(); + rect.x.baseVal.value = bbox.x; + rect.y.baseVal.value = bbox.y; + rect.width.baseVal.value = bbox.width; + rect.height.baseVal.value = bbox.height; + rect.setAttribute("class", className); + addItems.push({ parent: parent, target: rect }); + } + } + } else if (node.matches && !node.matches("button, select, textarea")) { + node.childNodes.forEach((el) => _highlight(el, addItems, text, className)); + } +}; +const _highlightText = (thisNode, text, className) => { + let addItems = []; + _highlight(thisNode, addItems, text, className); + addItems.forEach((obj) => + obj.parent.insertAdjacentElement("beforebegin", obj.target) + ); +}; + +/** + * Small JavaScript module for the documentation. + */ +const SphinxHighlight = { + + /** + * highlight the search words provided in localstorage in the text + */ + highlightSearchWords: () => { + if (!SPHINX_HIGHLIGHT_ENABLED) return; // bail if no highlight + + // get and clear terms from localstorage + const url = new URL(window.location); + const highlight = + localStorage.getItem("sphinx_highlight_terms") + || url.searchParams.get("highlight") + || ""; + localStorage.removeItem("sphinx_highlight_terms") + url.searchParams.delete("highlight"); + window.history.replaceState({}, "", url); + + // get individual terms from highlight string + const terms = highlight.toLowerCase().split(/\s+/).filter(x => x); + if (terms.length === 0) return; // nothing to do + + // There should never be more than one element matching "div.body" + const divBody = document.querySelectorAll("div.body"); + const body = divBody.length ? divBody[0] : document.querySelector("body"); + window.setTimeout(() => { + terms.forEach((term) => _highlightText(body, term, "highlighted")); + }, 10); + + const searchBox = document.getElementById("searchbox"); + if (searchBox === null) return; + searchBox.appendChild( + document + .createRange() + .createContextualFragment( + '" + ) + ); + }, + + /** + * helper function to hide the search marks again + */ + hideSearchWords: () => { + document + .querySelectorAll("#searchbox .highlight-link") + .forEach((el) => el.remove()); + document + .querySelectorAll("span.highlighted") + .forEach((el) => el.classList.remove("highlighted")); + localStorage.removeItem("sphinx_highlight_terms") + }, + + initEscapeListener: () => { + // only install a listener if it is really needed + if (!DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS) return; + + document.addEventListener("keydown", (event) => { + // bail for input elements + if (BLACKLISTED_KEY_CONTROL_ELEMENTS.has(document.activeElement.tagName)) return; + // bail with special keys + if (event.shiftKey || event.altKey || event.ctrlKey || event.metaKey) return; + if (DOCUMENTATION_OPTIONS.ENABLE_SEARCH_SHORTCUTS && (event.key === "Escape")) { + SphinxHighlight.hideSearchWords(); + event.preventDefault(); + } + }); + }, +}; + +_ready(() => { + /* Do not call highlightSearchWords() when we are on the search page. + * It will highlight words from the *previous* search query. + */ + if (typeof Search === "undefined") SphinxHighlight.highlightSearchWords(); + SphinxHighlight.initEscapeListener(); +}); diff --git a/api.html b/api.html new file mode 100644 index 00000000..b3648994 --- /dev/null +++ b/api.html @@ -0,0 +1,2005 @@ + + + + + + + API Reference — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

API Reference

+
+ +
+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.base.html b/api/psy_simple.base.html new file mode 100644 index 00000000..b4312b62 --- /dev/null +++ b/api/psy_simple.base.html @@ -0,0 +1,2167 @@ + + + + + + + Possible types — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Base formatoptions for psy-simple.

+

This module defines several formatoptions that are the basis for many +matplotlib figures, such as axes title, figure title, etc.

+

Classes:

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

BackgroundColor(key[, plotter, ...])

The background color for the matplotlib axes.

BasePlotter([data, ax, auto_update, ...])

Base class with formatoptions for plotting on an matplotlib axes

Figtitle(key[, plotter, index_in_list, ...])

Plot a figure title

Mask(key[, plotter, index_in_list, ...])

Mask the data where a certain condition is True

MaskBetween(key[, plotter, index_in_list, ...])

Mask data points between two numbers

MaskGeq(key[, plotter, index_in_list, ...])

Mask data points greater than or equal to a number

MaskGreater(key[, plotter, index_in_list, ...])

Mask data points greater than a number

MaskLeq(key[, plotter, index_in_list, ...])

Mask data points smaller than or equal to a number

MaskLess(key[, plotter, index_in_list, ...])

Mask data points smaller than a number

Text(*args, **kwargs)

Add text anywhere on the plot

TextBase()

Abstract base class for formatoptions that provides a replace method

Tight(key[, plotter, index_in_list, ...])

Automatically adjust the plots.

Title(key[, plotter, index_in_list, ...])

Show the title

TitlesPlotter([data, ax, auto_update, ...])

Plotter class for labels

ValueMaskBase(key[, plotter, index_in_list, ...])

Base class for masking formatoptions

+

Functions:

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

label_props(base[, label_name, children, ...])

Function that returns a Formatoption class for modifying the fontsite

label_size(base[, label_name, children, ...])

Function that returns a Formatoption class for modifying the fontsite

label_weight(base[, label_name, children, ...])

Function that returns a Formatoption class for modifying the fontweight

+
+
+class psy_simple.base.BackgroundColor(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

The background color for the matplotlib axes.

+
+

Possible types

+
+
‘rc’

to use matplotlibs rc params

+
+
None

to use a transparent color

+
+
color

Any possible matplotlib color

+
+
+

Methods:

+ + + + + + + + + +

get_fmt_widget(parent, project)

Get a widget to update the formatoption in the GUI

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

+ + + + + + + + + +

group

str.

name

str.

+
+
+get_fmt_widget(parent, project)
+

Get a widget to update the formatoption in the GUI

+

This method should return a QWidget that is loaded by the psyplot-gui +when the formatoption is selected in the +psyplot_gui.main.Mainwindow.fmt_widget. It should call the +insert_text() method +when the update text for the formatoption should be changed.

+
+
Parameters:
+
    +
  • parent (psyplot_gui.fmt_widget.FormatoptionWidget) – The parent widget that contains the returned QWidget

  • +
  • project (psyplot.project.Project) – The current subproject (see psyplot.project.gcp())

  • +
+
+
Returns:
+

The widget to control the formatoption

+
+
Return type:
+

PyQt5.QtWidgets.QWidget

+
+
+
+ +
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Background color of the plot'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.BasePlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: TitlesPlotter

+

Base class with formatoptions for plotting on an matplotlib axes

+

Attributes:

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

background

The background color for the matplotlib axes.

mask

Mask the data where a certain condition is True

maskbetween

Mask data points between two numbers

maskgeq

Mask data points greater than or equal to a number

maskgreater

Mask data points greater than a number

maskleq

Mask data points smaller than or equal to a number

maskless

Mask data points smaller than a number

tight

Automatically adjust the plots.

+
+
+background
+

The background color for the matplotlib axes.

+
+

Possible types

+
+
‘rc’

to use matplotlibs rc params

+
+
None

to use a transparent color

+
+
color

Any possible matplotlib color

+
+
+
+
+ +
+
+mask
+

Mask the data where a certain condition is True

+

This formatoption can be used to mask the plotting data based on another +array. This array can be the name of a variable in the base dataset, +or it can be a numeric array. Note that the data needs to be on exactly +the same coordinates as the data shown here

+
+

Possible types

+
+
None

Apply no mask

+
+
str

The name of a variable in the base dataset to use.

+
    +
  • dimensions that are in the given mask but not in the visualized +base variable will be aggregated using numpy.any()

  • +
  • if the given mask misses dimensions that are in the visualized +data (i.e. the data of this plotter), we broadcast the mask to +match the shape of the data

  • +
  • dimensions that are in mask and the base variable, but not in the +visualized data will be matched against each other

  • +
+
+
str

The path to a netCDF file that shall be loaded

+
+
xr.DataArray or np.ndarray

An array that can be broadcasted to the shape of the data

+
+
+
+
+ +
+
+maskbetween
+

Mask data points between two numbers

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgeq
+

Mask data points greater than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgreater
+

Mask data points greater than a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskleq
+

Mask data points smaller than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+
+maskless
+

Mask data points smaller than a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+
+tight
+

Automatically adjust the plots.

+

If set to True, the plots are automatically adjusted to fit to the figure +limitations via the matplotlib.pyplot.tight_layout() function.

+
+

Possible types

+
+
bool

True for automatic adjustment

+
+
+
+

Warning

+

There is no update method to undo what happend after this formatoption is +set to True!

+
+
+
+ +
+ +
+
+class psy_simple.base.Figtitle(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TextBase, Formatoption

+

Plot a figure title

+

Set the title of the figure. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the suptitle() function

+
+
+

Notes

+
    +
  • If the plotter is part of a psyplot.project.Project and multiple +plotters of this project are on the same figure, the replacement +attributes (see above) are joined by a delimiter. If the +delimiter attribute of this Figtitle instance is not +None, it will be used. Otherwise the rcParams[‘texts.delimiter’] item is +used.

  • +
  • This is the title of the whole figure! For the title of this specific +subplot, see the title formatoption.

  • +
+
+

See also

+

title, figtitlesize, figtitleweight, figtitleprops

+
+

Methods:

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

clear_other_texts([remove])

Make sure that no other text is a the same position as this one

initialize_plot(s)

Method that is called when the plot is made the first time

update(s)

Method that is call to update the formatoption on the axes

+

Attributes:

+ + + + + + + + + +

enhanced_attrs

The enhanced attributes of the array

name

str.

+
+
+clear_other_texts(remove=False)
+

Make sure that no other text is a the same position as this one

+

This method clears all text instances in the figure that are at the +same position as the _text attribute

+
+
Parameters:
+

remove (bool) – If True, the Text instances are permanently deleted from the +figure, otherwise there text is simply set to ‘’

+
+
+
+ +
+
+property enhanced_attrs
+

The enhanced attributes of the array

+
+ +
+
+initialize_plot(s)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'Figure title'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(s)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.Mask(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Mask the data where a certain condition is True

+

This formatoption can be used to mask the plotting data based on another +array. This array can be the name of a variable in the base dataset, +or it can be a numeric array. Note that the data needs to be on exactly +the same coordinates as the data shown here

+
+

Possible types

+
+
None

Apply no mask

+
+
str

The name of a variable in the base dataset to use.

+
    +
  • dimensions that are in the given mask but not in the visualized +base variable will be aggregated using numpy.any()

  • +
  • if the given mask misses dimensions that are in the visualized +data (i.e. the data of this plotter), we broadcast the mask to +match the shape of the data

  • +
  • dimensions that are in mask and the base variable, but not in the +visualized data will be matched against each other

  • +
+
+
str

The path to a netCDF file that shall be loaded

+
+
xr.DataArray or np.ndarray

An array that can be broadcasted to the shape of the data

+
+
+

Methods:

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

diff(value)

Checks whether the given value differs from what is currently set

load_mask(data, value)

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

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

group

str.

name

str.

priority

int.

+
+
+diff(value)
+

Checks whether the given value differs from what is currently set

+
+
Parameters:
+

value – A possible value to set (make sure that it has been validate via +the validate attribute before)

+
+
Returns:
+

True if the value differs from what is currently set

+
+
Return type:
+

bool

+
+
+
+ +
+
+group = 'masking'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+load_mask(data, value)
+
+ +
+
+name = 'Apply a mask'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.MaskBetween(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: ValueMaskBase

+

Mask data points between two numbers

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+
+

See also

+

maskless, maskleq, maskgreater, maskgeq

+
+

Methods:

+ + + + + + +

mask_func(data, value)

The masking function that is called

+

Attributes:

+ + + + + + +

name

str.

+
+
+mask_func(data, value)
+

The masking function that is called

+
+ +
+
+name = 'Mask between two values'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.base.MaskGeq(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: ValueMaskBase

+

Mask data points greater than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+
+

See also

+

maskless, maskleq, maskgreater, maskbetween

+
+

Methods:

+ + + + + + +

mask_func(data, value)

The masking function that is called

+

Attributes:

+ + + + + + +

name

str.

+
+
+mask_func(data, value)
+

The masking function that is called

+
+ +
+
+name = 'Mask greater than or equal'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.base.MaskGreater(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: ValueMaskBase

+

Mask data points greater than a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+
+

See also

+

maskless, maskleq, maskgeq, maskbetween

+
+

Methods:

+ + + + + + +

mask_func(data, value)

The masking function that is called

+

Attributes:

+ + + + + + +

name

str.

+
+
+mask_func(data, value)
+

The masking function that is called

+
+ +
+
+name = 'Mask greater'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.base.MaskLeq(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: ValueMaskBase

+

Mask data points smaller than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+
+

See also

+

maskless, maskgreater, maskgeq, maskbetween

+
+

Methods:

+ + + + + + +

mask_func(data, value)

The masking function that is called

+

Attributes:

+ + + + + + +

name

str.

+
+
+mask_func(data, value)
+

The masking function that is called

+
+ +
+
+name = 'Mask lesser than or equal'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.base.MaskLess(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: ValueMaskBase

+

Mask data points smaller than a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+
+

See also

+

maskleq, maskgreater, maskgeq, maskbetween

+
+

Methods:

+ + + + + + +

mask_func(data, value)

The masking function that is called

+

Attributes:

+ + + + + + +

name

str.

+
+
+mask_func(data, value)
+

The masking function that is called

+
+ +
+
+name = 'Mask less'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.base.Text(*args, **kwargs)
+

Bases: TextBase, Formatoption

+

Add text anywhere on the plot

+

This formatoption draws a text on the specified position on the figure. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

If string s: this will be used as (1., 1., s, {‘ha’: ‘right’}) (i.e. a +string in the upper right corner of the axes).

+
+
tuple or list of tuples (x,y,s[,coord.-system][,options]])

Each tuple defines a text instance on the plot. 0<=x, y<=1 are the +coordinates. The coord.-system can be either the data coordinates +(default, 'data') or the axes coordinates ('axes') or the +figure coordinates (‘fig’). The string s finally is the text. options +may be a dictionary to specify format the appearence (e.g. 'color', +'fontweight', 'fontsize', etc., see +matplotlib.text.Text for possible keys). +To remove one single text from the plot, set (x,y,’’[, coord.-system]) +for the text at position (x,y)

+
+
empty list

remove all texts from the plot

+
+
+
+

See also

+

title, figtitle

+
+

Methods:

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

diff(value)

Checks whether the given value differs from what is currently set

finish_update()

Clears the _texts_to_remove set

remove()

Method to remove the effects of this formatoption

set_value(value[, validate, todefault])

Set (and validate) the value in the plotter.

share(fmto, **kwargs)

Share the settings of this formatoption with other data objects

update(value[, texts_to_remove])

Method that is call to update the formatoption on the axes

+

Attributes:

+ + + + + + + + + +

name

str.

transform

Dictionary containing the relevant transformations

+
+
+diff(value)
+

Checks whether the given value differs from what is currently set

+
+
Parameters:
+

value – A possible value to set (make sure that it has been validate via +the validate attribute before)

+
+
Returns:
+

True if the value differs from what is currently set

+
+
Return type:
+

bool

+
+
+
+ +
+
+finish_update()
+

Clears the _texts_to_remove set

+
+ +
+
+name = 'Arbitrary text on the plot'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+set_value(value, validate=True, todefault=False)
+

Set (and validate) the value in the plotter. This method is called by +the plotter when it attempts to change the value of the formatoption.

+
+
Parameters:
+
    +
  • value – Value to set

  • +
  • validate (bool) – if True, validate the value before it is set

  • +
  • todefault (bool) – True if the value is updated to the default value

  • +
+
+
+
+ +
+
+share(fmto, **kwargs)
+

Share the settings of this formatoption with other data objects

+
+
Parameters:
+
    +
  • fmto (Formatoption) – The Formatoption instance to share the attributes with

  • +
  • **kwargs – Any other keyword argument that shall be passed to the update +method of fmto

  • +
+
+
+

Notes

+

The Text formatoption sets the ‘texts_to_remove’ keyword to the +_texts_to_remove attribute of this instance (if not already +specified in **kwargs

+
+ +
+
+property transform
+

Dictionary containing the relevant transformations

+
+ +
+
+update(value, texts_to_remove=None)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.TextBase
+

Bases: object

+

Abstract base class for formatoptions that provides a replace method

+

Attributes:

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

data_dependent

delimiter

enhanced_attrs

The enhanced attributes of the array

group

rc

SubDict of rcParams 'texts' key

+

Methods:

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

get_enhanced_attrs(*args, **kwargs)

get_fig_data_attrs([delimiter])

Join the data attributes with other plotters in the project

get_fmt_widget(parent, project)

Create a combobox with the attributes

replace(s, data[, attrs])

Replace the attributes of the plotter data in a string

+
+
+data_dependent = True
+
+ +
+
+delimiter = None
+
+ +
+
+property enhanced_attrs
+

The enhanced attributes of the array

+
+ +
+
+get_enhanced_attrs(*args, **kwargs)
+
+ +
+
+get_fig_data_attrs(delimiter=None)
+

Join the data attributes with other plotters in the project

+

This method joins the attributes of the +InteractiveBase instances in the project that +draw on the same figure as this instance does.

+
+
Parameters:
+

delimiter (str) – Specifies the delimiter with what the attributes are joined. If +None, the delimiter attribute of this instance or (if the +latter is also None), the rcParams[‘texts.delimiter’] item is used.

+
+
Returns:
+

A dictionary with all the meta attributes joined by the specified +delimiter

+
+
Return type:
+

dict

+
+
+
+ +
+
+get_fmt_widget(parent, project)
+

Create a combobox with the attributes

+
+ +
+
+group = 'labels'
+
+ +
+
+property rc
+

SubDict of rcParams ‘texts’ key

+
+ +
+
+replace(s, data, attrs=None)
+

Replace the attributes of the plotter data in a string

+

You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+
Parameters:
+
    +
  • s (str) – String where the replacements shall be made

  • +
  • data (InteractiveBase) – Data object from which to use the coordinates and insert the +coordinate and attribute informations

  • +
  • attrs (dict) – Meta attributes that shall be used for replacements. If None, it +will be gained from data.attrs

  • +
+
+
Returns:
+

s with inserted informations

+
+
Return type:
+

str

+
+
+
+ +
+ +
+
+class psy_simple.base.Tight(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Automatically adjust the plots.

+

If set to True, the plots are automatically adjusted to fit to the figure +limitations via the matplotlib.pyplot.tight_layout() function.

+
+

Possible types

+
+
bool

True for automatic adjustment

+
+
+
+

Warning

+

There is no update method to undo what happend after this formatoption is +set to True!

+
+

Attributes:

+ + + + + + + + + +

group

str.

name

str.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Tight layout'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.Title(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TextBase, Formatoption

+

Show the title

+

Set the title of the plot. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the title() function.

+
+
+

Notes

+

This is the title of this specific subplot! For the title of the whole +figure, see the figtitle formatoption.

+
+

See also

+

figtitle, titlesize, titleweight, titleprops

+
+

Methods:

+ + + + + + + + + +

initialize_plot(value)

Method that is called when the plot is made the first time

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

+ + + + + + +

name

str.

+
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'Axes title'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.base.TitlesPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Plotter

+

Plotter class for labels

+

Attributes:

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

figtitle

Plot a figure title

figtitleprops

Properties of the figure title

figtitlesize

Set the size of the figure title

figtitleweight

Set the fontweight of the figure title

text

Add text anywhere on the plot

title

Show the title

titleprops

Properties of the title

titlesize

Set the size of the title

titleweight

Set the fontweight of the title

+
+
+figtitle
+

Plot a figure title

+

Set the title of the figure. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the suptitle() function

+
+
+

Notes

+
    +
  • If the plotter is part of a psyplot.project.Project and multiple +plotters of this project are on the same figure, the replacement +attributes (see above) are joined by a delimiter. If the +delimiter attribute of this Figtitle instance is not +None, it will be used. Otherwise the rcParams[‘texts.delimiter’] item is +used.

  • +
  • This is the title of the whole figure! For the title of this specific +subplot, see the title formatoption.

  • +
+ +
+
+ +
+
+figtitleprops
+

Properties of the figure title

+

Specify the font properties of the figure title manually.

+
+

Possible types

+
+
dict

Items may be any valid text property

+
+
+ +
+
+ +
+
+figtitlesize
+

Set the size of the figure title

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+ +
+
+ +
+
+figtitleweight
+

Set the fontweight of the figure title

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+ +
+
+ +
+
+text
+

Add text anywhere on the plot

+

This formatoption draws a text on the specified position on the figure. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

If string s: this will be used as (1., 1., s, {‘ha’: ‘right’}) (i.e. a +string in the upper right corner of the axes).

+
+
tuple or list of tuples (x,y,s[,coord.-system][,options]])

Each tuple defines a text instance on the plot. 0<=x, y<=1 are the +coordinates. The coord.-system can be either the data coordinates +(default, 'data') or the axes coordinates ('axes') or the +figure coordinates (‘fig’). The string s finally is the text. options +may be a dictionary to specify format the appearence (e.g. 'color', +'fontweight', 'fontsize', etc., see +matplotlib.text.Text for possible keys). +To remove one single text from the plot, set (x,y,’’[, coord.-system]) +for the text at position (x,y)

+
+
empty list

remove all texts from the plot

+
+
+
+

See also

+

title, figtitle

+
+
+
+ +
+
+title
+

Show the title

+

Set the title of the plot. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the title() function.

+
+
+

Notes

+

This is the title of this specific subplot! For the title of the whole +figure, see the figtitle formatoption.

+ +
+
+ +
+
+titleprops
+

Properties of the title

+

Specify the font properties of the figure title manually.

+
+

Possible types

+
+
dict

Items may be any valid text property

+
+
+
+

See also

+

title, titlesize, titleweight

+
+
+
+ +
+
+titlesize
+

Set the size of the title

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

title, titleweight, titleprops

+
+
+
+ +
+
+titleweight
+

Set the fontweight of the title

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

title, titlesize, titleprops

+
+
+
+ +
+ +
+
+class psy_simple.base.ValueMaskBase(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Base class for masking formatoptions

+

Attributes:

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

data_dependent

bool or a callable.

group

str.

priority

int.

+

Methods:

+ + + + + + + + + +

mask_func()

The masking function that is called

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'masking'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+abstract mask_func()
+

The masking function that is called

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+ +
+
+psy_simple.base.label_props(base, label_name=None, children=[], parents=[], dependencies=[])
+

Function that returns a Formatoption class for modifying the fontsite

+

This function returns a Formatoption instance +that modifies the size of the given base formatoption

+
+
Parameters:
+
    +
  • base (Formatoption) – The base formatoption instance that is used in the +psyplot.Plotter subclass to create the label. The instance +must have a texts attribute which stores all the +matplotlib.text.Text instances.

  • +
  • label_name (str) – The name of the label to use in the documentation. If None, +it will be key, where key is the +psyplot.plotter.Formatoption.key` attribute of base

  • +
  • children (list of str) – The childrens of the resulting formatoption class (besides the base +formatoption which is included anyway)

  • +
  • parents (list of str) – The parents of the resulting formatoption class (besides the base +the properties formatoption from base (see label_props()))

  • +
  • dependencies (list of str) – The dependencies of the formatoption

  • +
  • children – The childrens of the resulting formatoption class (besides the base +formatoption, the base.key + 'size' and base.key + 'weight' +keys, which are included anyway (see label_size(), +label_weight()))

  • +
  • parents – The parents of the resulting formatoption class

  • +
+
+
Returns:
+

The formatoption instance that modifies the fontsize of base

+
+
Return type:
+

Formatoption

+
+
+ +
+ +
+
+psy_simple.base.label_size(base, label_name=None, children=[], parents=[], dependencies=[])
+

Function that returns a Formatoption class for modifying the fontsite

+

This function returns a Formatoption instance +that modifies the size of the given base formatoption

+
+
Parameters:
+
    +
  • base (Formatoption) – The base formatoption instance that is used in the +psyplot.Plotter subclass to create the label. The instance +must have a texts attribute which stores all the +matplotlib.text.Text instances.

  • +
  • label_name (str) – The name of the label to use in the documentation. If None, +it will be key, where key is the +psyplot.plotter.Formatoption.key` attribute of base

  • +
  • children (list of str) – The childrens of the resulting formatoption class (besides the base +formatoption which is included anyway)

  • +
  • parents (list of str) – The parents of the resulting formatoption class (besides the base +the properties formatoption from base (see label_props()))

  • +
  • dependencies (list of str) – The dependencies of the formatoption

  • +
+
+
Returns:
+

The formatoption instance that modifies the fontsize of base

+
+
Return type:
+

Formatoption

+
+
+ +
+ +
+
+psy_simple.base.label_weight(base, label_name=None, children=[], parents=[], dependencies=[])
+

Function that returns a Formatoption class for modifying the fontweight

+

This function returns a Formatoption instance +that modifies the weight of the given base formatoption

+
+
Parameters:
+
    +
  • base (Formatoption) – The base formatoption instance that is used in the +psyplot.Plotter subclass to create the label. The instance +must have a texts attribute which stores all the +matplotlib.text.Text instances.

  • +
  • label_name (str) – The name of the label to use in the documentation. If None, +it will be key, where key is the +psyplot.plotter.Formatoption.key` attribute of base

  • +
  • children (list of str) – The childrens of the resulting formatoption class (besides the base +formatoption which is included anyway)

  • +
  • parents (list of str) – The parents of the resulting formatoption class (besides the base +the properties formatoption from base (see label_props()))

  • +
  • dependencies (list of str) – The dependencies of the formatoption

  • +
+
+
Returns:
+

The formatoption instance that modifies the fontweight of base

+
+
Return type:
+

Formatoption

+
+
+ +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.colors.html b/api/psy_simple.colors.html new file mode 100644 index 00000000..7fee454b --- /dev/null +++ b/api/psy_simple.colors.html @@ -0,0 +1,568 @@ + + + + + + + <no title> — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

colors module of the psyplot package.

+

This module contains some additional color maps and the show_colormaps +function to visualize available colormaps.

+

Classes:

+ + + + + + + + + +

FixedBoundaryNorm(boundaries, ncolors[, ...])

Bug fixing Norm with same functionality as matplotlibs BoundaryNorm

FixedColorMap(name, segmentdata[, N, gamma])

Bug fixing colormap with same functionality as matplotlibs colormap

+

Functions:

+ + + + + + + + + +

get_cmap(name[, lut])

Returns the specified colormap.

show_colormaps([names, N, show, use_qt])

Function to show standard colormaps from pyplot

+
+
+class psy_simple.colors.FixedBoundaryNorm(boundaries, ncolors, clip=False, *, extend='neither')
+

Bases: BoundaryNorm

+

Bug fixing Norm with same functionality as matplotlibs BoundaryNorm

+

This class fixes a bug in the +cartopy.mpl.geoaxes.GeoAxes.streamplot() for matplotlib version 1.5

+

Notes

+

To reproduce the error type:

+
>>> import cartopy.crs as ccrs
+>>> import matplotlib.pyplot as plt
+>>> import psyplot.project as psy
+>>> import matplotlib.colors as mcol
+>>> maps = psy.plot.mapvector(
+...     "test-t2m-u-v.nc",
+...     name=[["u", "v"]],
+...     plot="stream",
+...     lonlatbox="Europe",
+...     color="absolute",
+... )
+>>> plotter = maps[0].plotter
+>>> x, y, u, v = plotter.plot._get_data()
+>>> maps.close(True, True)
+>>> ax = plt.axes(projection=ccrs.PlateCarree())
+>>> ax.set_extent(plotter.lonlatbox.lonlatbox, crs=ccrs.PlateCarree())
+>>> m = ax.streamplot(
+...     x,
+...     y,
+...     u,
+...     v,
+...     color=plotter.plot._kwargs["color"],
+...     norm=mcol.BoundaryNorm(
+...         plotter.bounds.norm.boundaries,
+...         plotter.bounds.norm.Ncmap,
+...         plotter.bounds.norm.clip,
+...     ),
+...     density=[1.0, 1.0],
+... )
+
+
+

This raises in matplotlib.colors, line 1316, in +matplotlib.colors.BoundaryNorm.__call__():

+
``ret = int(ret[0])  # assume python scalar``
+MaskError: Cannot convert masked element to a Python int.
+
+
+
+ +
+
+class psy_simple.colors.FixedColorMap(name, segmentdata, N=256, gamma=1.0)
+

Bases: LinearSegmentedColormap

+

Bug fixing colormap with same functionality as matplotlibs colormap

+

This class fixes a bug in the +cartopy.mpl.geoaxes.GeoAxes.streamplot() method in python 3.4

+

Notes

+

To reproduce the error type in python 3.4:

+
>>> import cartopy.crs as ccrs
+>>> import matplotlib.pyplot as plt
+>>> import psyplot.project as psy
+>>> maps = psy.plot.mapvector(
+...     "test-t2m-u-v.nc",
+...     name=[["u", "v"]],
+...     plot="stream",
+...     lonlatbox="Europe",
+...     color="absolute",
+... )
+>>> plotter = maps[0].plotter
+>>> x, y, u, v = plotter.plot._get_data()
+>>> maps.close(True, True)
+>>> ax = plt.axes(projection=ccrs.PlateCarree())
+>>> ax.set_extent(plotter.lonlatbox.lonlatbox, crs=ccrs.PlateCarree())
+>>> m = ax.streamplot(
+...     x,
+...     y,
+...     u,
+...     v,
+...     density=[1.0, 1.0],
+...     color=plotter.plot._kwargs["color"],
+...     norm=plotter.plot._kwargs["norm"],
+... )
+
+
+

This raises in matplotlib.colors, line 557, in +matplotlib.colors.Colormap.__call__():

+
``xa = np.array([X])``
+ValueError: setting an array element with a sequence.
+
+
+

Methods:

+ + + + + + +

from_list(*args, **kwargs)

Create a LinearSegmentedColormap from a list of colors.

+
+
+static from_list(*args, **kwargs)
+

Create a LinearSegmentedColormap from a list of colors.

+
+
Parameters:
+
    +
  • name (str) – The name of the colormap.

  • +
  • colors (list of :mpltype:`color` or list of (value, color)) – If only colors are given, they are equidistantly mapped from the +range \([0, 1]\); i.e. 0 maps to colors[0] and 1 maps to +colors[-1]. +If (value, color) pairs are given, the mapping is from value +to color. This can be used to divide the range unevenly.

  • +
  • N (int) – The number of RGB quantization levels.

  • +
  • gamma (float)

  • +
+
+
+
+ +
+ +
+
+psy_simple.colors.get_cmap(name, lut=None)
+

Returns the specified colormap.

+
+
Parameters:
+
    +
  • name (str or matplotlib.colors.Colormap) –

    If a colormap, it returned unchanged.

    +
    +

    Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

    +
    +

  • +
  • lut (int) – An integer giving the number of entries desired in the lookup table

  • +
+
+
Returns:
+

The colormap specified by name

+
+
Return type:
+

matplotlib.colors.Colormap

+
+
+
+

See also

+
+
show_colormaps

A function to display all available colormaps

+
+
+
+

Notes

+

Different from the :func::matpltolib.pyplot.get_cmap function, this +function changes the number of colors if name is a +matplotlib.colors.Colormap instance to match the given lut.

+
+ +
+
+psy_simple.colors.show_colormaps(names=[], N=10, show=True, use_qt=None)
+

Function to show standard colormaps from pyplot

+
+
Parameters:
+
    +
  • *args (str or matplotlib.colors.Colormap) –

    If a colormap, it returned unchanged.

    +
    +

    Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

    +
    +

  • +
  • N (int, optional) – Default: 11. The number of increments in the colormap.

  • +
  • show (bool, optional) – Default: True. If True, show the created figure at the end with +pyplot.show(block=False)

  • +
  • use_qt (bool) – If True, use the +psy_simple.widgets.color.ColormapDialog.show_colormaps, if +False use a matplotlib implementation based on [1]. If None, use +the Qt implementation if it is running in the psyplot GUI.

  • +
+
+
Returns:
+

Depending on use_qt, either an instance of the +psy_simple.widgets.color.ColormapDialog or the +matplotlib.figure.Figure

+
+
Return type:
+

psy_simple.widgets.color.ColormapDialog or matplitlib.figure.Figure

+
+
+

References

+ +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.html b/api/psy_simple.html new file mode 100644 index 00000000..9d028c1d --- /dev/null +++ b/api/psy_simple.html @@ -0,0 +1,2009 @@ + + + + + + + psy_simple package — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psy_simple package

+

psy-simple

+

Psyplot plugin for simple visualization tasks

+
+

Subpackages

+
+ +
+
+
+

Submodules

+
+ +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.plotters.html b/api/psy_simple.plotters.html new file mode 100644 index 00000000..4719c914 --- /dev/null +++ b/api/psy_simple.plotters.html @@ -0,0 +1,19788 @@ + + + + + + + Possible types — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

Plotters and formatoptions for the psy-simple plugin.

+

Classes:

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

AlternativeXCoord(key[, plotter, ...])

Use an alternative variable as x-coordinate

AlternativeXCoordPost(key[, plotter, ...])

Use an alternative variable as x-coordinate

ArrowSize(key[, plotter, index_in_list, ...])

Change the size of the arrows

ArrowStyle(key[, plotter, index_in_list, ...])

Change the style of the arrows

AxisColor(key[, plotter, index_in_list, ...])

Color the x- and y-axes

BarAlpha(key[, plotter, index_in_list, ...])

Specify the transparency (alpha)

BarPlot(*args, **kwargs)

Choose how to make the bar plot

BarPlotter([data, ax, auto_update, project, ...])

Plotter for making bar plots

BarWidths(key[, plotter, index_in_list, ...])

Specify the widths of the bars

BarXTickLabels(*args, **kwargs)

Modify the x-axis ticklabels

BarXTicks(*args, **kwargs)

Modify the x-axis ticks

BarXlabel(key[, plotter, index_in_list, ...])

Set the x-axis label

BarXlim(*args, **kwargs)

Set the x-axis limits

BarYTickLabels(*args, **kwargs)

Modify the y-axis ticklabels

BarYTicks(*args, **kwargs)

Modify the y-axis ticks

BarYlabel(key[, plotter, index_in_list, ...])

Set the y-axis label

BarYlim(*args, **kwargs)

Set the y-axis limits

Base2D([data, ax, auto_update, project, ...])

Base plotter for 2-dimensional plots

BaseVectorPlotter([data, ax, auto_update, ...])

Base plotter for vector plots

Bounds(*args, **kwargs)

Specify the boundaries of the colorbar

CLabel(key[, plotter, index_in_list, ...])

Show the colorbar label

CMap(key[, plotter, index_in_list, ...])

Specify the color map

CTickLabels(*args, **kwargs)

Specify the colorbar ticklabels

CTickProps(key[, plotter, index_in_list, ...])

Specify the font properties of the colorbar ticklabels

CTickSize(key[, plotter, index_in_list, ...])

Specify the font size of the colorbar ticklabels

CTickWeight(key[, plotter, index_in_list, ...])

Specify the fontweight of the colorbar ticklabels

CTicks(*args, **kwargs)

Specify the tick locations of the colorbar

CategoricalBars(key[, plotter, ...])

The location of each bar

Cbar(*args, **kwargs)

Specify the position of the colorbars

CbarOptions(key[, plotter, index_in_list, ...])

Base class for colorbar formatoptions

CbarSpacing(key[, plotter, index_in_list, ...])

Specify the spacing of the bounds in the colorbar

CombinedBase([data, ax, auto_update, ...])

Base plotter for combined 2-dimensional scalar and vector plot

CombinedSimplePlotter([data, ax, ...])

Combined 2D plotter and vector plotter

CombinedVectorPlot(*args, **kwargs)

Choose the vector plot type

ContourLevels(*args, **kwargs)

The levels for the contour plot

DataGrid(*args, **kwargs)

Show the grid of the data

DataPrecision(key[, plotter, index_in_list, ...])

Set the precision of the data

DataTicksCalculator(*args, **kwargs)

Abstract base formatoption to calculate ticks and bounds from the data

Density(*args, **kwargs)

Change the density of the arrows

DensityPlotter([data, ax, auto_update, ...])

A plotter to visualize the density of points in a 2-dimensional grid

DtTicksBase(*args, **kwargs)

Abstract base class for x- and y-tick formatoptions

ErrorAlpha(key[, plotter, index_in_list, ...])

Set the alpha value for the error range

ErrorCalculator(key[, plotter, ...])

Calculation of the error

ErrorPlot(*args, **kwargs)

Visualize the error range

Extend(key[, plotter, index_in_list, ...])

Draw arrows at the side of the colorbar

FldmeanPlotter([data, ax, auto_update, ...])

Grid(key[, plotter, index_in_list, ...])

Display the grid

Hist2DXRange(*args, **kwargs)

Specify the range of the histogram for the x-dimension

Hist2DYRange(*args, **kwargs)

Specify the range of the histogram for the x-dimension

HistBins(key[, plotter, index_in_list, ...])

Specify the bins of the 2D-Histogramm

InterpolateBounds(key[, plotter, ...])

Interpolate grid cell boundaries for 2D plots

LabelOptions(key[, plotter, index_in_list, ...])

Base formatoption class for label sizes

LabelProps(key[, plotter, index_in_list, ...])

Set the font properties of both, x- and y-label

LabelSize(key[, plotter, index_in_list, ...])

Set the size of both, x- and y-label

LabelWeight(key[, plotter, index_in_list, ...])

Set the font size of both, x- and y-label

Legend(key[, plotter, index_in_list, ...])

Draw a legend

LegendLabels(key[, plotter, index_in_list, ...])

Set the labels of the arrays in the legend

LimitBase(*args, **kwargs)

Base class for x- and y-limits

LineColors(*args, **kwargs)

Set the color coding

LinePlot(*args, **kwargs)

Choose the line style of the plot

LinePlotter([data, ax, auto_update, ...])

Plotter for simple one-dimensional line plots

LineWidth(key[, plotter, index_in_list, ...])

Choose the width of the lines

Marker(key[, plotter, index_in_list, ...])

Choose the marker for points

MarkerSize(key[, plotter, index_in_list, ...])

Choose the size of the markers for points

MaskDataGrid(key[, plotter, index_in_list, ...])

Mask the datagrid where the array is NaN

MeanCalculator(key[, plotter, ...])

Determine how the error is visualized

MissColor(key[, plotter, index_in_list, ...])

Set the color for missing values

NormedHist2D(key[, plotter, index_in_list, ...])

Specify the normalization of the histogram

Plot2D(*args, **kwargs)

Choose how to visualize a 2-dimensional scalar data field

PointDensity(key[, plotter, index_in_list, ...])

Specify the method to calculate the density

ScalarCombinedBase([data, ax, auto_update, ...])

Base plotter for combined 2-dimensional scalar field with any other plotter

Simple2DBase([data, ax, auto_update, ...])

Base class for Simple2DPlotter and psyplot.plotter.maps.FieldPlotter that defines the data management

Simple2DPlotter([data, ax, auto_update, ...])

Plotter for visualizing 2-dimensional data.

SimplePlot2D(*args, **kwargs)

Specify the plotting method

SimplePlotterBase([data, ax, auto_update, ...])

Base class for all simple plotters

SimpleVectorPlot(*args, **kwargs)

Choose the vector plot type

SimpleVectorPlotter([data, ax, auto_update, ...])

Plotter for visualizing 2-dimensional vector data

SymmetricLimits(key[, plotter, ...])

Make x- and y-axis symmetric

TickLabels(*args, **kwargs)

TickLabelsBase(*args, **kwargs)

Abstract base class for ticklabels

TickPropsBase(key[, plotter, index_in_list, ...])

Abstract base class for tick parameters

TickSize(key[, plotter, index_in_list, ...])

Change the ticksize of the ticklabels

TickSizeBase(key[, plotter, index_in_list, ...])

Abstract base class for modifying tick sizes

TickWeight(key[, plotter, index_in_list, ...])

Change the fontweight of the ticks

TickWeightBase(key[, plotter, ...])

Abstract base class for modifying font weight of ticks

TicksBase(*args, **kwargs)

Abstract base class for calculating ticks

TicksManager(key[, plotter, index_in_list, ...])

Abstract base class for ticks formatoptions controlling major and minor ticks

TicksManagerBase(key[, plotter, ...])

Abstract base class for formatoptions handling ticks

TicksOptions(key[, plotter, index_in_list, ...])

Base class for ticklabels options that apply for x- and y-axis

Transpose(*args, **kwargs)

Switch x- and y-axes

VCLabel(key[, plotter, index_in_list, ...])

Show the colorbar label of the vector plot

VectorBounds(*args, **kwargs)

Specify the boundaries of the vector colorbar

VectorCTicks(*args, **kwargs)

Specify the tick locations of the vector colorbar

VectorCalculator(*args, **kwargs)

Abstract formatoption that provides calculation functions for speed, etc.

VectorCbar(*args, **kwargs)

Specify the position of the vector plot colorbars

VectorColor(*args, **kwargs)

Set the color for the arrows

VectorDataGrid(*args, **kwargs)

VectorLineWidth(*args, **kwargs)

Change the linewidth of the arrows

VectorPlot(*args, **kwargs)

Choose the vector plot type

ViolinPlot(*args, **kwargs)

Choose how to make the violin plot

ViolinPlotter([data, ax, auto_update, ...])

Plotter for making violin plots

ViolinXTickLabels(*args, **kwargs)

Modify the x-axis ticklabels

ViolinXTicks(*args, **kwargs)

Modify the x-axis ticks

ViolinXlim(*args, **kwargs)

Set the x-axis limits

ViolinYTickLabels(*args, **kwargs)

Modify the x-axis ticklabels

ViolinYTicks(*args, **kwargs)

Modify the y-axis ticks

ViolinYlim(*args, **kwargs)

Set the y-axis limits

XRotation(key[, plotter, index_in_list, ...])

Rotate the x-axis ticks

XTickLabels(*args, **kwargs)

Modify the x-axis ticklabels

XTickProps(key[, plotter, index_in_list, ...])

Specify the x-axis tick parameters

XTicks(*args, **kwargs)

Modify the x-axis ticks

XTicks2D(*args, **kwargs)

Modify the x-axis ticks

XYTickPlotter([data, ax, auto_update, ...])

Plotter class for x- and y-ticks and x- and y- ticklabels

Xlabel(key[, plotter, index_in_list, ...])

Set the x-axis label

Xlim(*args, **kwargs)

Set the x-axis limits

Xlim2D(*args, **kwargs)

Set the x-axis limits

YRotation(key[, plotter, index_in_list, ...])

Rotate the y-axis ticks

YTickLabels(*args, **kwargs)

Modify the y-axis ticklabels

YTickProps(key[, plotter, index_in_list, ...])

Specify the y-axis tick parameters

YTicks(*args, **kwargs)

Modify the y-axis ticks

YTicks2D(*args, **kwargs)

Modify the y-axis ticks

Ylabel(key[, plotter, index_in_list, ...])

Set the y-axis label

Ylim(*args, **kwargs)

Set the y-axis limits

Ylim2D(*args, **kwargs)

Set the y-axis limits

+

Functions:

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

convert_radian(coord, *variables)

Convert the given coordinate from radian to degree

format_coord_func(ax, ref)

Create a function that can replace the matplotlib.axes.Axes.format_coord()

round_to_05(n[, exp, mode])

Round to the next 0.5-value.

+
+
+class psy_simple.plotters.AlternativeXCoord(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+

Attributes:

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

data_dependent

bool or a callable.

data_iterator

group

str.

name

str.

priority

int.

use_raw_data

Bool.

+

Methods:

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

diff(value)

Checks whether the given value differs from what is currently set

get_alternative_coord(da, i)

replace_coord(i)

Replace the coordinate for the data array at the given position

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property data_iterator
+
+ +
+
+diff(value)
+

Checks whether the given value differs from what is currently set

+
+
Parameters:
+

value – A possible value to set (make sure that it has been validate via +the validate attribute before)

+
+
Returns:
+

True if the value differs from what is currently set

+
+
Return type:
+

bool

+
+
+
+ +
+
+get_alternative_coord(da, i)
+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Alternative X-Variable'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+replace_coord(i)
+

Replace the coordinate for the data array at the given position

+
+
Parameters:
+
    +
  • i (int) – The number of the data array in the raw data (if the raw data is +not an interactive list, use 0)

  • +
  • Returns

  • +
  • xarray.DataArray – The data array with the replaced coordinate

  • +
+
+
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+use_raw_data = True
+

Bool. If True, this Formatoption directly uses the raw_data, otherwise +use the normal data

+
+ +
+
+ +
+
+class psy_simple.plotters.AlternativeXCoordPost(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: AlternativeXCoord

+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+

Attributes:

+ + + + + + +

use_raw_data

Bool.

+
+
+use_raw_data = False
+

Bool. If True, this Formatoption directly uses the raw_data, otherwise +use the normal data

+
+ +
+
+ +
+
+class psy_simple.plotters.ArrowSize(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Change the size of the arrows

+
+

Possible types

+
+
None

make no scaling

+
+
float

Factor scaling the size of the arrows

+
+
+
+

See also

+

arrowstyle, linewidth, density, color

+
+

Attributes:

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

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+dependencies = ['plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'vector'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Size of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ArrowStyle(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Change the style of the arrows

+
+

Possible types

+
+
str

Any arrow style string (see +FancyArrowPatch)

+
+
+

Notes

+

This formatoption only has an effect for stream plots

+
+

See also

+

arrowsize, linewidth, density, color

+
+

Attributes:

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

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+dependencies = ['plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'vector'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Style of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.AxisColor(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: DictFormatoption

+

Color the x- and y-axes

+

This formatoption colors the left, right, bottom and top axis bar.

+
+

Possible types

+
+
dict

Keys may be one of {‘right’, ‘left’, ‘bottom’, ‘top’}, the values can +be any valid color or None.

+
+
+

Notes

+

The following color abbreviations are supported:

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

character

color

‘b’

blue

‘g’

green

‘r’

red

‘c’

cyan

‘m’

magenta

‘y’

yellow

‘k’

black

‘w’

white

+

In addition, you can specify colors in many weird and wonderful ways, +including full names ('green'), hex strings ('#008000'), RGB or +RGBA tuples ((0,1,0,1)) or grayscale intensities as a string +('0.8').

+

Attributes:

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

group

str.

name

str.

value2pickle

Return the current axis colors

+

Methods:

+ + + + + + + + + +

initialize_plot(value)

Method that is called when the plot is made the first time

update(value)

Method that is call to update the formatoption on the axes

+
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'Color of x- and y-axes'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property value2pickle
+

Return the current axis colors

+
+ +
+
+ +
+
+class psy_simple.plotters.BarAlpha(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the transparency (alpha)

+
+

Possible types

+
+
float

A value between 0 (opaque) and 1 invisible

+
+
+

Attributes:

+ + + + + + + + + +

name

str.

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+name = 'Transparency of the bars'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.BarPlot(*args, **kwargs)
+

Bases: Formatoption

+

Choose how to make the bar plot

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘bar’

Create a usual bar plot with the bars side-by-side

+
+
‘stacked’

Create stacked plot

+
+
+

Attributes:

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

alpha

alpha Formatoption instance in the plotter

categorical

categorical Formatoption instance in the plotter

children

list of str.

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

plot_fmt

bool.

plotted_data

The data that is shown to the user

priority

int.

transpose

transpose Formatoption instance in the plotter

widths

widths Formatoption instance in the plotter

+

Methods:

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

get_xys(arr)

make_plot()

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+property alpha
+

alpha Formatoption instance in the plotter

+
+ +
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+children = ['color', 'transpose', 'alpha']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['widths', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+get_xys(arr)
+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+make_plot()
+
+ +
+
+name = 'Bar plot type'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+property plotted_data
+

The data that is shown to the user

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property widths
+

widths Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: SimplePlotterBase

+

Plotter for making bar plots

+

Attributes:

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

alpha

Specify the transparency (alpha)

categorical

The location of each bar

coord

Use an alternative variable as x-coordinate

plot

Choose how to make the bar plot

widths

Specify the widths of the bars

xlabel

Set the x-axis label

xlim

Set the x-axis limits

xticklabels

Modify the x-axis ticklabels

xticks

Modify the x-axis ticks

ylabel

Set the y-axis label

ylim

Set the y-axis limits

yticklabels

Modify the y-axis ticklabels

yticks

Modify the y-axis ticks

+
+
+alpha
+

Specify the transparency (alpha)

+
+

Possible types

+
+
float

A value between 0 (opaque) and 1 invisible

+
+
+
+
+ +
+
+categorical
+

The location of each bar

+
+

Possible types

+
+
None

If None, use a categorical plotting if the widths are 'equal', +otherwise, not

+
+
bool

If True, use a categorical plotting

+
+
+
+

See also

+

widths

+
+
+
+ +
+
+coord
+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+
+
+ +
+
+plot
+

Choose how to make the bar plot

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘bar’

Create a usual bar plot with the bars side-by-side

+
+
‘stacked’

Create stacked plot

+
+
+
+
+ +
+
+widths
+

Specify the widths of the bars

+
+

Possible types

+
+
‘equal’

Each bar will have the same width (the default)

+
+
‘data’

Each bar will have the width as specified by the boundaries

+
+
float

The width for each bar

+
+
+
+

See also

+

categorical

+
+
+
+ +
+
+xlabel
+

Set the x-axis label

+

Set the label for the x-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the xlabel() function.

+
+
+
+

See also

+

xlabelsize, xlabelweight, xlabelprops

+
+
+
+ +
+
+xlim
+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+
+
+ +
+
+xticklabels
+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+
+
+ +
+
+xticks
+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+
+
+ +
+
+ylabel
+

Set the y-axis label

+

Set the label for the y-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the ylabel() function.

+
+
+
+

See also

+

ylabelsize, ylabelweight, ylabelprops

+
+
+
+ +
+
+ylim
+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+
+
+ +
+
+yticklabels
+

Modify the y-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

yticks, ticksize, tickweight, ytickprops, xticklabels

+
+
+
+ +
+
+yticks
+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.BarWidths(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the widths of the bars

+
+

Possible types

+
+
‘equal’

Each bar will have the same width (the default)

+
+
‘data’

Each bar will have the width as specified by the boundaries

+
+
float

The width for each bar

+
+
+
+

See also

+

categorical

+
+

Attributes:

+ + + + + + + + + +

name

str.

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+name = 'Width of the bars'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.BarXTickLabels(*args, **kwargs)
+

Bases: XTickLabels

+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+

Attributes:

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

categorical

categorical Formatoption instance in the plotter

dependencies

list of str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

yticklabels

yticklabels Formatoption instance in the plotter

+

Methods:

+ + + + + + +

set_stringformatter(s)

+
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+dependencies = ['transpose', 'xticks', 'yticklabels', 'plot', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_stringformatter(s)
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property yticklabels
+

yticklabels Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarXTicks(*args, **kwargs)
+

Bases: XTicks

+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+

Attributes:

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

array

The numpy array of the data

categorical

categorical Formatoption instance in the plotter

connections

list of str.

dependencies

list of str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xlim

xlim Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

set_default_locators()

Sets the default locator that is used for updating to None or int

update(value)

Method that is call to update the formatoption on the axes

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+connections = ['xlim']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+dependencies = ['transpose', 'plot', 'plot', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_default_locators()
+

Sets the default locator that is used for updating to None or int

+
+
Parameters:
+

which ({None, 'minor', 'major'}) – Specify which locator shall be set

+
+
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarXlabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Xlabel

+

Set the x-axis label

+

Set the label for the x-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the xlabel() function.

+
+
+
+

See also

+

xlabelsize, xlabelweight, xlabelprops

+
+

Attributes:

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

transpose

transpose Formatoption instance in the plotter

update_after_plot

Xlabel is modified by the pandas plot routine, therefore we update it after each plot

ylabel

ylabel Formatoption instance in the plotter

+
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_after_plot = True
+

Xlabel is modified by the pandas plot routine, therefore we update it +after each plot

+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarXlim(*args, **kwargs)
+

Bases: ViolinXlim

+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+

Attributes:

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

array

The numpy array of the data

categorical

categorical Formatoption instance in the plotter

dependencies

list of str.

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+dependencies = ['xticks', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarYTickLabels(*args, **kwargs)
+

Bases: YTickLabels

+

Modify the y-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

yticks, ticksize, tickweight, ytickprops, xticklabels

+
+

Attributes:

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

categorical

categorical Formatoption instance in the plotter

dependencies

list of str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+

Methods:

+ + + + + + +

set_stringformatter(s)

+
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+dependencies = ['transpose', 'yticks', 'plot', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_stringformatter(s)
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarYTicks(*args, **kwargs)
+

Bases: YTicks

+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+

Attributes:

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

array

The numpy array of the data

categorical

categorical Formatoption instance in the plotter

connections

list of str.

dependencies

list of str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

set_default_locators()

Sets the default locator that is used for updating to None or int

update(value)

Method that is call to update the formatoption on the axes

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+connections = ['ylim']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+dependencies = ['transpose', 'plot', 'plot', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_default_locators()
+

Sets the default locator that is used for updating to None or int

+
+
Parameters:
+

which ({None, 'minor', 'major'}) – Specify which locator shall be set

+
+
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.BarYlabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Ylabel

+

Set the y-axis label

+

Set the label for the y-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the ylabel() function.

+
+
+
+

See also

+

ylabelsize, ylabelweight, ylabelprops

+
+

Attributes:

+ + + + + + + + + +

transpose

transpose Formatoption instance in the plotter

update_after_plot

Ylabel is modified by the pandas plot routine, therefore we update it after each plot

+
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_after_plot = True
+

Ylabel is modified by the pandas plot routine, therefore we update it +after each plot

+
+ +
+
+ +
+
+class psy_simple.plotters.BarYlim(*args, **kwargs)
+

Bases: ViolinYlim

+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+

Attributes:

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

array

The numpy array of the data

categorical

categorical Formatoption instance in the plotter

dependencies

list of str.

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xlim

xlim Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property categorical
+

categorical Formatoption instance in the plotter

+
+ +
+
+dependencies = ['yticks', 'categorical']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Base2D(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Plotter

+

Base plotter for 2-dimensional plots

+

Attributes:

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

bounds

Specify the boundaries of the colorbar

cbar

Specify the position of the colorbars

cbarspacing

Specify the spacing of the bounds in the colorbar

clabel

Show the colorbar label

clabelprops

Properties of the Colorbar label

clabelsize

Set the size of the Colorbar label

clabelweight

Set the fontweight of the Colorbar label

cmap

Specify the color map

cticklabels

Specify the colorbar ticklabels

ctickprops

Specify the font properties of the colorbar ticklabels

cticks

Specify the tick locations of the colorbar

cticksize

Specify the font size of the colorbar ticklabels

ctickweight

Specify the fontweight of the colorbar ticklabels

datagrid

Show the grid of the data

extend

Draw arrows at the side of the colorbar

mask_datagrid

Mask the datagrid where the array is NaN

plot

+
+
+bounds
+

Specify the boundaries of the colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+
+
+ +
+
+cbar
+

Specify the position of the colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+

Examples

+

Draw a colorbar at the bottom and left of the axes:

+
>>> plotter.update(cbar='bl')
+
+
+
+
+ +
+
+cbarspacing
+

Specify the spacing of the bounds in the colorbar

+
+

Possible types

+
+
str {‘uniform’, ‘proportional’}

if 'uniform', every color has exactly the same width in the +colorbar, if 'proportional', the size is chosen according to the +data

+
+
+
+
+ +
+
+clabel
+

Show the colorbar label

+

Set the label of the colorbar. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the set_label() +method.

+
+
+ +
+
+ +
+
+clabelprops
+

Properties of the Colorbar label

+

Specify the font properties of the figure title manually.

+
+

Possible types

+
+
dict

Items may be any valid text property

+
+
+ +
+
+ +
+
+clabelsize
+

Set the size of the Colorbar label

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+ +
+
+ +
+
+clabelweight
+

Set the fontweight of the Colorbar label

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

clabel, clabelsize, clabelprops

+
+
+
+ +
+
+cmap
+

Specify the color map

+

This formatoption specifies the color coding of the data via a +matplotlib.colors.Colormap

+
+

Possible types

+

str

+
+

Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

+
+
+
matplotlib.colors.Colormap

The colormap instance to use

+
+
+
+

See also

+
+
bounds

specifies the boundaries of the colormap

+
+
+
+
+
+ +
+
+cticklabels
+

Specify the colorbar ticklabels

+
+

Possible types

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

cticks, cticksize, ctickweight, ctickprops, vcticks, vcticksize, vctickweight, vctickprops

+
+
+
+ +
+
+ctickprops
+

Specify the font properties of the colorbar ticklabels

+
+

Possible types

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+
+

See also

+

cticksize, ctickweight, cticklabels, cticks, vcticksize, vctickweight, vcticklabels, vcticks

+
+
+
+ +
+
+cticks
+

Specify the tick locations of the colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels

+
+
+
+ +
+
+cticksize
+

Specify the font size of the colorbar ticklabels

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

ctickweight, ctickprops, cticklabels, cticks, vctickweight, vctickprops, vcticklabels, vcticks

+
+
+
+ +
+
+ctickweight
+

Specify the fontweight of the colorbar ticklabels

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

cticksize, ctickprops, cticklabels, cticks, vcticksize, vctickprops, vcticklabels, vcticks

+
+
+
+ +
+
+datagrid
+

Show the grid of the data

+

This formatoption shows the grid of the data (without labels)

+
+

Possible types

+
+
None

Don’t show the data grid

+
+
str

A linestyle in the form 'k-', where 'k' is the color and +'-' the linestyle.

+
+
dict

any keyword arguments that are passed to the plotting function ( +matplotlib.pyplot.triplot() for unstructured grids and +matplotlib.pyplot.hlines() for rectilinear grids)

+
+
+
+

See also

+
+
mask_datagrid

To display cells with NaN

+
+
+
+
+
+ +
+
+extend
+

Draw arrows at the side of the colorbar

+
+

Possible types

+
+
str {‘neither’, ‘both’, ‘min’ or ‘max’}

If not ‘neither’, make pointed end(s) for out-of-range values

+
+
+
+
+ +
+
+mask_datagrid
+

Mask the datagrid where the array is NaN

+

This boolean formatoption enables to mask the grid of the datagrid +formatoption where the data is NaN

+
+

Possible types

+
+
bool

Either True, to not display the data grid for cells with NaN, or False

+
+
+
+

See also

+

datagrid

+
+
+
+ +
+
+plot = None
+
+ +
+ +
+
+class psy_simple.plotters.BaseVectorPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Base2D

+

Base plotter for vector plots

+

Attributes:

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

allowed_dims

arrowsize

Change the size of the arrows

arrowstyle

Change the style of the arrows

bounds

Specify the boundaries of the vector colorbar

cbar

Specify the position of the vector plot colorbars

color

Set the color for the arrows

cticks

Specify the tick locations of the vector colorbar

datagrid

density

Change the density of the arrows

linewidth

Change the linewidth of the arrows

+

Methods:

+ + + + + + +

check_data(name, dims, is_unstructured)

A validation method for the data shape

+
+
+allowed_dims = 3
+
+ +
+
+arrowsize
+

Change the size of the arrows

+
+

Possible types

+
+
None

make no scaling

+
+
float

Factor scaling the size of the arrows

+
+
+ +
+
+ +
+
+arrowstyle
+

Change the style of the arrows

+
+

Possible types

+
+
str

Any arrow style string (see +FancyArrowPatch)

+
+
+

Notes

+

This formatoption only has an effect for stream plots

+
+

See also

+

arrowsize, linewidth, density, color

+
+
+
+ +
+
+bounds
+

Specify the boundaries of the vector colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+
+
+ +
+
+cbar
+

Specify the position of the vector plot colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+
+
+ +
+
+classmethod check_data(name, dims, is_unstructured)
+

A validation method for the data shape

+
+
Parameters:
+
    +
  • name (str or list of str) – The variable names (two variables for the array or one if the dims +are one greater)

  • +
  • dims (list with length 1 or list of lists with length 1) – The dimension of the arrays. Only 2D-Arrays are allowed (or 1-D if +the array is unstructured)

  • +
  • is_unstructured (bool or list of bool) – True if the corresponding array is unstructured.

  • +
+
+
Returns:
+

    +
  • list of bool or None – True, if everything is okay, False in case of a serious error, +None if it is intermediate. Each object in this list corresponds to +one in the given name

  • +
  • list of str – The message giving more information on the reason. Each object in +this list corresponds to one in the given name

  • +
+

+
+
+
+ +
+
+color
+

Set the color for the arrows

+

This formatoption can be used to set a single color for the vectors or +define the color coding

+
+

Possible types

+
+
float

Determines the greyness

+
+
color

Defines the same color for all arrows. The string can be either a html +hex string (e.g. ‘#eeefff’), a single letter (e.g. ‘b’: blue, +‘g’: green, ‘r’: red, ‘c’: cyan, ‘m’: magenta, ‘y’: yellow, ‘k’: black, +‘w’: white) or any other color

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
2D-array

The values determine the color for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+ +
+
+ +
+
+cticks
+

Specify the tick locations of the vector colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels, vcticklabels

+
+
+
+ +
+
+datagrid
+
+ +
+
+density
+

Change the density of the arrows

+
+

Possible types

+
+
float

Scales the density of the arrows in x- and y-direction (1.0 means +no scaling)

+
+
tuple (x, y)

Defines the scaling in x- and y-direction manually

+
+
+

Notes

+

quiver plots do not support density scaling

+
+
+ +
+
+linewidth
+

Change the linewidth of the arrows

+
+

Possible types

+
+
float

give the linewidth explicitly

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
tuple (string, float)

string may be one of the above strings, float may be a scaling +factor

+
+
2D-array

The values determine the linewidth for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+ +
+
+ +
+ +
+
+class psy_simple.plotters.Bounds(*args, **kwargs)
+

Bases: DataTicksCalculator

+

Specify the boundaries of the colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

connections

list of str.

group

str.

name

str.

priority

int.

value2share

The normalization instance

+

Methods:

+ + + + + + + + + +

get_fmt_widget(parent, project)

Open a psy_simple.widget.CMapFmtWidget

update(value)

Method that is call to update the formatoption on the axes

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+connections = ['cmap', 'cbar']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+get_fmt_widget(parent, project)
+

Open a psy_simple.widget.CMapFmtWidget

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Boundaries of the color map'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property value2share
+

The normalization instance

+
+ +
+
+ +
+
+class psy_simple.plotters.CLabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TextBase, Formatoption

+

Show the colorbar label

+

Set the label of the colorbar. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the set_label() +method.

+
+
+
+

See also

+

clabelsize, clabelweight, clabelprops

+
+

Attributes:

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

axis_locations

cbar

cbar Formatoption instance in the plotter

children

list of str.

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+axis_locations = {'b': 'x', 'fb': 'x', 'fl': 'y', 'fr': 'y', 'ft': 'x', 'l': 'y', 'r': 'y', 'sh': 'x', 'sv': 'y', 't': 'x'}
+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+children = ['plot']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['cbar']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'labels'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Colorbar label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.CMap(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the color map

+

This formatoption specifies the color coding of the data via a +matplotlib.colors.Colormap

+
+

Possible types

+

str

+
+

Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

+
+
+
matplotlib.colors.Colormap

The colormap instance to use

+
+
+
+

See also

+
+
bounds

specifies the boundaries of the colormap

+
+
+
+

Attributes:

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

bounds

bounds Formatoption instance in the plotter

cbar

cbar Formatoption instance in the plotter

connections

list of str.

group

str.

name

str.

priority

int.

+

Methods:

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

get_cmap([arr, cmap, N])

Get the matplotlib.colors.Colormap for plotting

get_fmt_widget(parent, project)

Open a psy_simple.widget.CMapFmtWidget

update(value)

Method that is call to update the formatoption on the axes

+
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+connections = ['bounds', 'cbar']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+get_cmap(arr=None, cmap=None, N=None)
+

Get the matplotlib.colors.Colormap for plotting

+
+
Parameters:
+
    +
  • arr (np.ndarray) – The array to plot

  • +
  • cmap (str or matplotlib.colors.Colormap) – The colormap to use. If None, the value of this +formatoption is used

  • +
  • N (int) – The number of colors in the colormap. If None, the norm of the +bounds formatoption is used and, if necessary, the +given array arr

  • +
+
+
Returns:
+

The colormap returned by psy_simple.colors.get_cmap()

+
+
Return type:
+

matplotlib.colors.Colormap

+
+
+
+ +
+
+get_fmt_widget(parent, project)
+

Open a psy_simple.widget.CMapFmtWidget

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Colormap'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.CTickLabels(*args, **kwargs)
+

Bases: CbarOptions, TickLabelsBase

+

Specify the colorbar ticklabels

+
+

Possible types

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

cticks, cticksize, ctickweight, ctickprops, vcticks, vcticksize, vctickweight, vctickprops

+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

default_formatters

Default locator of the axis of the colorbars

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

set_default_formatters()

Sets the default formatters that is used for updating to None

set_formatter(formatter)

Sets a given formatter

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property default_formatters
+

Default locator of the axis of the colorbars

+
+ +
+
+name = 'Colorbar ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_default_formatters()
+

Sets the default formatters that is used for updating to None

+
+ +
+
+set_formatter(formatter)
+

Sets a given formatter

+
+ +
+
+ +
+
+class psy_simple.plotters.CTickProps(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: CbarOptions, TickPropsBase

+

Specify the font properties of the colorbar ticklabels

+
+

Possible types

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+
+

See also

+

cticksize, ctickweight, cticklabels, cticks, vcticksize, vctickweight, vcticklabels, vcticks

+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

children

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+children = ['plot']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Font properties of the colorbar ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+update_axis(value)
+
+ +
+
+ +
+
+class psy_simple.plotters.CTickSize(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: CbarOptions, TickSizeBase

+

Specify the font size of the colorbar ticklabels

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

ctickweight, ctickprops, cticklabels, cticks, vctickweight, vctickprops, vcticklabels, vcticks

+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

ctickprops

ctickprops Formatoption instance in the plotter

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property ctickprops
+

ctickprops Formatoption instance in the plotter

+
+ +
+
+dependencies = ['cbar', 'ctickprops']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Font size of the colorbar ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.CTickWeight(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: CbarOptions, TickWeightBase

+

Specify the fontweight of the colorbar ticklabels

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

cticksize, ctickprops, cticklabels, cticks, vcticksize, vctickprops, vcticklabels, vcticks

+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

ctickprops

ctickprops Formatoption instance in the plotter

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property ctickprops
+

ctickprops Formatoption instance in the plotter

+
+ +
+
+dependencies = ['cbar', 'ctickprops']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Font weight of the colorbar ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.CTicks(*args, **kwargs)
+

Bases: CbarOptions, TicksBase

+

Specify the tick locations of the colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels

+
+

Attributes:

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

bounds

bounds Formatoption instance in the plotter

cbar

cbar Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

connections

list of str.

default_locator

Default locator of the axis of the colorbars

dependencies

list of str.

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

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

get_fmt_widget(parent, project)

Open a psy_simple.widget.CMapFmtWidget

set_default_locators(*args, **kwargs)

Sets the default locator that is used for updating to None or int

set_ticks(value)

update(value)

Method that is call to update the formatoption on the axes

update_axis(value)

+
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+connections = ['cmap']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+property default_locator
+

Default locator of the axis of the colorbars

+
+ +
+
+dependencies = ['cbar', 'bounds']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+get_fmt_widget(parent, project)
+

Open a psy_simple.widget.CMapFmtWidget

+
+ +
+
+name = 'Colorbar ticks'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_default_locators(*args, **kwargs)
+

Sets the default locator that is used for updating to None or int

+
+
Parameters:
+

which ({None, 'minor', 'major'}) – Specify which locator shall be set

+
+
+
+ +
+
+set_ticks(value)
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+update_axis(value)
+
+ +
+
+ +
+
+class psy_simple.plotters.CategoricalBars(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

The location of each bar

+
+

Possible types

+
+
None

If None, use a categorical plotting if the widths are 'equal', +otherwise, not

+
+
bool

If True, use a categorical plotting

+
+
+
+

See also

+

widths

+
+

Attributes:

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

dependencies

list of str.

name

str.

priority

int.

widths

widths Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+dependencies = ['widths']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Categorical or non-categorical plotting'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property widths
+

widths Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Cbar(*args, **kwargs)
+

Bases: Formatoption

+

Specify the position of the colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+

Examples

+

Draw a colorbar at the bottom and left of the axes:

+
>>> plotter.update(cbar='bl')
+
+
+

Attributes:

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

bounds

bounds Formatoption instance in the plotter

cbarspacing

cbarspacing Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

dependencies

list of str.

extend

extend Formatoption instance in the plotter

figure_positions

group

str.

init_kwargs

dict key word arguments that are passed to the initialization of a new instance when accessed from the descriptor

levels

levels Formatoption instance in the plotter

name

str.

original_position

plot

plot Formatoption instance in the plotter

priority

int.

value2share

Those colorbar positions that are directly at the axes

+

Methods:

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

draw_colorbar(pos)

finish_update()

Finish the update, initialization and sharing process

initialize_plot(value)

Method that is called when the plot is made the first time

remove([positions])

Method to remove the effects of this formatoption

set_label_pos(pos)

update(value)

Updates the colorbar

update_colorbar(pos)

+
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cbarspacing
+

cbarspacing Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+dependencies = ['plot', 'cmap', 'bounds', 'extend', 'cbarspacing', 'levels']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+draw_colorbar(pos)
+
+ +
+
+property extend
+

extend Formatoption instance in the plotter

+
+ +
+
+figure_positions = {'b', 'fb', 'fl', 'fr', 'ft', 'l', 'r', 't'}
+
+ +
+
+finish_update()
+

Finish the update, initialization and sharing process

+

This function is called at the end of the Plotter.start_update(), +Plotter.initialize_plot() or the Plotter.share() methods.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property init_kwargs
+

dict key word arguments that are passed to the +initialization of a new instance when accessed from the descriptor

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+property levels
+

levels Formatoption instance in the plotter

+
+ +
+
+name = 'Position of the colorbar'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+original_position = None
+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 10.1
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove(positions='all')
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+set_label_pos(pos)
+
+ +
+
+update(value)
+

Updates the colorbar

+
+
Parameters:
+
    +
  • value – The value to update (see possible types)

  • +
  • no_fig_cbars – Does not update the colorbars that are not in the axes of this +plot

  • +
+
+
+
+ +
+
+update_colorbar(pos)
+
+ +
+
+property value2share
+

Those colorbar positions that are directly at the axes

+
+ +
+
+ +
+
+class psy_simple.plotters.CbarOptions(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Base class for colorbar formatoptions

+

Attributes:

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

axis

axis of the colorbar with the ticks.

axis_locations

axisname

cbar

cbar Formatoption instance in the plotter

children

list of str.

colorbar

data

The data that is plotted

dependencies

list of str.

plot

plot Formatoption instance in the plotter

which

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property axis
+

axis of the colorbar with the ticks. Will be overwritten during +update process.

+
+ +
+
+axis_locations = {'b': 'x', 'fb': 'x', 'fl': 'y', 'fr': 'y', 'ft': 'x', 'l': 'y', 'r': 'y', 'sh': 'x', 'sv': 'y', 't': 'x'}
+
+ +
+
+property axisname
+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+children = ['plot']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property colorbar
+
+ +
+
+property data
+

The data that is plotted

+
+ +
+
+dependencies = ['cbar']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+which = 'major'
+
+ +
+ +
+
+class psy_simple.plotters.CbarSpacing(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the spacing of the bounds in the colorbar

+
+

Possible types

+
+
str {‘uniform’, ‘proportional’}

if 'uniform', every color has exactly the same width in the +colorbar, if 'proportional', the size is chosen according to the +data

+
+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

connections

list of str.

group

str.

name

str.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+connections = ['cbar']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Spacing of the colorbar'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.CombinedBase(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: ScalarCombinedBase

+

Base plotter for combined 2-dimensional scalar and vector plot

+

Attributes:

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

arrowsize

Change the size of the arrows

arrowstyle

Change the style of the arrows

color

Set the color for the arrows

linewidth

Change the linewidth of the arrows

vbounds

Specify the boundaries of the vector colorbar

vcbar

Specify the position of the vector plot colorbars

vcbarspacing

Specify the spacing of the bounds in the colorbar

vclabel

Show the colorbar label of the vector plot

vclabelprops

Properties of the Vector colorbar label

vclabelsize

Set the size of the Vector colorbar label

vclabelweight

Set the fontweight of the Vector colorbar label

vcmap

Specify the color map

vcticklabels

Specify the colorbar ticklabels

vctickprops

Specify the font properties of the colorbar ticklabels

vcticks

Specify the tick locations of the vector colorbar

vcticksize

Specify the font size of the colorbar ticklabels

vctickweight

Specify the fontweight of the colorbar ticklabels

+

Methods:

+ + + + + + +

check_data(name, dims, is_unstructured)

A validation method for the data shape

+
+
+arrowsize
+

Change the size of the arrows

+
+

Possible types

+
+
None

make no scaling

+
+
float

Factor scaling the size of the arrows

+
+
+
+

See also

+

arrowstyle, linewidth, density, color

+
+
+
+ +
+
+arrowstyle
+

Change the style of the arrows

+
+

Possible types

+
+
str

Any arrow style string (see +FancyArrowPatch)

+
+
+

Notes

+

This formatoption only has an effect for stream plots

+
+

See also

+

arrowsize, linewidth, density, color

+
+
+
+ +
+
+classmethod check_data(name, dims, is_unstructured)
+

A validation method for the data shape

+
+
Parameters:
+
    +
  • name (list of str with length 2) – The variable names (one for the first, two for the second array)

  • +
  • dims (list with length 2 of lists with length 1) – The dimension of the arrays. Only 2D-Arrays are allowed (or 1-D if +an array is unstructured)

  • +
  • is_unstructured (bool or list of bool) – True if the corresponding array is unstructured.

  • +
+
+
Returns:
+

    +
  • list of bool or None – True, if everything is okay, False in case of a serious error, +None if it is intermediate. Each object in this list corresponds to +one in the given name

  • +
  • list of str – The message giving more information on the reason. Each object in +this list corresponds to one in the given name

  • +
+

+
+
+
+ +
+
+color
+

Set the color for the arrows

+

This formatoption can be used to set a single color for the vectors or +define the color coding

+
+

Possible types

+
+
float

Determines the greyness

+
+
color

Defines the same color for all arrows. The string can be either a html +hex string (e.g. ‘#eeefff’), a single letter (e.g. ‘b’: blue, +‘g’: green, ‘r’: red, ‘c’: cyan, ‘m’: magenta, ‘y’: yellow, ‘k’: black, +‘w’: white) or any other color

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
2D-array

The values determine the color for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+
+

See also

+

arrowsize, arrowstyle, density, linewidth

+
+
+
+ +
+
+linewidth
+

Change the linewidth of the arrows

+
+

Possible types

+
+
float

give the linewidth explicitly

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
tuple (string, float)

string may be one of the above strings, float may be a scaling +factor

+
+
2D-array

The values determine the linewidth for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+
+

See also

+

arrowsize, arrowstyle, density, color

+
+
+
+ +
+
+vbounds
+

Specify the boundaries of the vector colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+
+
+ +
+
+vcbar
+

Specify the position of the vector plot colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+
+
+ +
+
+vcbarspacing
+

Specify the spacing of the bounds in the colorbar

+
+

Possible types

+
+
str {‘uniform’, ‘proportional’}

if 'uniform', every color has exactly the same width in the +colorbar, if 'proportional', the size is chosen according to the +data

+
+
+
+
+ +
+
+vclabel
+

Show the colorbar label of the vector plot

+

Set the label of the colorbar. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the set_label() +method.

+
+
+ +
+
+ +
+
+vclabelprops
+

Properties of the Vector colorbar label

+

Specify the font properties of the figure title manually.

+
+

Possible types

+
+
dict

Items may be any valid text property

+
+
+ +
+
+ +
+
+vclabelsize
+

Set the size of the Vector colorbar label

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+ +
+
+ +
+
+vclabelweight
+

Set the fontweight of the Vector colorbar label

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+ +
+
+ +
+
+vcmap
+

Specify the color map

+

This formatoption specifies the color coding of the data via a +matplotlib.colors.Colormap

+
+

Possible types

+

str

+
+

Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

+
+
+
matplotlib.colors.Colormap

The colormap instance to use

+
+
+
+

See also

+
+
bounds

specifies the boundaries of the colormap

+
+
+
+
+
+ +
+
+vcticklabels
+

Specify the colorbar ticklabels

+
+

Possible types

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

cticks, cticksize, ctickweight, ctickprops, vcticks, vcticksize, vctickweight, vctickprops

+
+
+
+ +
+
+vctickprops
+

Specify the font properties of the colorbar ticklabels

+
+

Possible types

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+
+

See also

+

cticksize, ctickweight, cticklabels, cticks, vcticksize, vctickweight, vcticklabels, vcticks

+
+
+
+ +
+
+vcticks
+

Specify the tick locations of the vector colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels, vcticklabels

+
+
+
+ +
+
+vcticksize
+

Specify the font size of the colorbar ticklabels

+
+

Possible types

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

ctickweight, ctickprops, cticklabels, cticks, vctickweight, vctickprops, vcticklabels, vcticks

+
+
+
+ +
+
+vctickweight
+

Specify the fontweight of the colorbar ticklabels

+
+

Possible types

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

cticksize, ctickprops, cticklabels, cticks, vcticksize, vctickprops, vcticklabels, vcticks

+
+
+
+ +
+ +
+
+class psy_simple.plotters.CombinedSimplePlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: CombinedBase, Simple2DPlotter, SimpleVectorPlotter

+

Combined 2D plotter and vector plotter

+
+

See also

+
+
psyplot.plotter.maps.CombinedPlotter

for visualizing the data on a map

+
+
+
+

Attributes:

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

density

Change the density of the arrows

plot

Choose how to visualize a 2-dimensional scalar data field

vplot

Choose the vector plot type

+
+
+density
+

Change the density of the arrows

+
+

Possible types

+
+
float

Scales the density of the arrows in x- and y-direction (1.0 means +no scaling)

+
+
tuple (x, y)

Defines the scaling in x- and y-direction manually

+
+
+

Notes

+

quiver plots do not support density scaling

+
+
+ +
+
+plot
+

Choose how to visualize a 2-dimensional scalar data field

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘mesh’

Use the matplotlib.pyplot.pcolormesh() function to make the plot +or the matplotlib.pyplot.tripcolor() for an unstructered grid

+
+
‘poly’

Draw each polygon indivually. This method is used by default for +unstructured grids. If there are no grid cell boundaries in the +dataset, we will interpolate them

+
+
‘contourf’

Make a filled contour plot using the matplotlib.pyplot.contourf() +function. The levels for the contour plot are controlled by the +levels formatoption

+
+
‘contour’

Same a 'contourf', but does not make a filled contour plot, only +lines.

+
+
+
+
+ +
+
+vplot
+

Choose the vector plot type

+
+

Possible types

+
+
str

Plot types can be either

+
+
quiver

to make a quiver plot

+
+
stream

to make a stream plot

+
+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.CombinedVectorPlot(*args, **kwargs)
+

Bases: VectorPlot

+

Choose the vector plot type

+
+

Possible types

+
+
str

Plot types can be either

+
+
quiver

to make a quiver plot

+
+
stream

to make a stream plot

+
+
+
+
+

Attributes:

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

arrowsize

arrowsize Formatoption instance in the plotter

arrowstyle

arrowstyle Formatoption instance in the plotter

bounds

bounds Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

density

density Formatoption instance in the plotter

linewidth

linewidth Formatoption instance in the plotter

transform

transform Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(*args, **kwargs)

Method that is call to update the formatoption on the axes

+
+
+property arrowsize
+

arrowsize Formatoption instance in the plotter

+
+ +
+
+property arrowstyle
+

arrowstyle Formatoption instance in the plotter

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property density
+

density Formatoption instance in the plotter

+
+ +
+
+property linewidth
+

linewidth Formatoption instance in the plotter

+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(*args, **kwargs)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ContourLevels(*args, **kwargs)
+

Bases: Bounds

+

The levels for the contour plot

+

This formatoption sets the levels for the filled contour plot and only has +an effect if the plot Formatoption is set to 'contourf'

+
+

Possible types

+
+
None

Use the settings from the bounds formatoption and if this +does not specify boundaries, use 11

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
+

Attributes:

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

cbar

cbar Formatoption instance in the plotter

cbounds

cbounds Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

dependencies

list of str.

name

str.

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property cbounds
+

cbounds Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+dependencies = ['cbounds']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Levels for the filled contour plot'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.DataGrid(*args, **kwargs)
+

Bases: Formatoption

+

Show the grid of the data

+

This formatoption shows the grid of the data (without labels)

+
+

Possible types

+
+
None

Don’t show the data grid

+
+
str

A linestyle in the form 'k-', where 'k' is the color and +'-' the linestyle.

+
+
dict

any keyword arguments that are passed to the plotting function ( +matplotlib.pyplot.triplot() for unstructured grids and +matplotlib.pyplot.hlines() for rectilinear grids)

+
+
+
+

See also

+
+
mask_datagrid

To display cells with NaN

+
+
+
+

Attributes:

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

cell_nodes_x

The unstructured x-boundaries with shape (N, m) where m > 2

cell_nodes_y

The unstructured y-boundaries with shape (N, m) where m > 2

children

list of str.

connections

list of str.

data_dependent

bool or a callable.

dependencies

list of str.

mask_datagrid

mask_datagrid Formatoption instance in the plotter

name

str.

plot

plot Formatoption instance in the plotter

transform

transform Formatoption instance in the plotter

xbounds

Boundaries of the x-coordinate

xcoord

The x coordinate xarray.Variable

ybounds

Boundaries of the y-coordinate

ycoord

The y coordinate xarray.Variable

+

Methods:

+ + + + + + + + + +

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+property cell_nodes_x
+

The unstructured x-boundaries with shape (N, m) where m > 2

+
+ +
+
+property cell_nodes_y
+

The unstructured y-boundaries with shape (N, m) where m > 2

+
+ +
+
+children = ['transform']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+connections = ['plot']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['mask_datagrid']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property mask_datagrid
+

mask_datagrid Formatoption instance in the plotter

+
+ +
+
+name = 'Grid of the data'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xbounds
+

Boundaries of the x-coordinate

+
+ +
+
+property xcoord
+

The x coordinate xarray.Variable

+
+ +
+
+property ybounds
+

Boundaries of the y-coordinate

+
+ +
+
+property ycoord
+

The y coordinate xarray.Variable

+
+ +
+
+ +
+
+class psy_simple.plotters.DataPrecision(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Set the precision of the data

+

This formatoption can be used to specify the precision of the data which +then will be the minimal bin width of the 2D histogram or the bandwith of +the kernel size (if the density formatoption is set to 'kde')

+
+

Possible types

+
+
float

If 0, this formatoption has no effect at all. Otherwise it is assumed +to be the precision of the data

+
+
str

One of {'scott' | 'silverman'}. This uses the statsmodels package +to estimate the bandwidth of the data that is then used in the +histogram or KDE plot

+
+
+

Attributes:

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

connections

list of str.

data_dependent

bool or a callable.

density

density Formatoption instance in the plotter

dependencies

list of str.

group

str.

name

str.

priority

int.

xrange

xrange Formatoption instance in the plotter

yrange

yrange Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

estimate_bw(method, values[, data_range])

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['density']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property density
+

density Formatoption instance in the plotter

+
+ +
+
+dependencies = ['xrange', 'yrange']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+estimate_bw(method, values, data_range=None)
+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Precision of the visualized data'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xrange
+

xrange Formatoption instance in the plotter

+
+ +
+
+property yrange
+

yrange Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.DataTicksCalculator(*args, **kwargs)
+

Bases: Formatoption

+

Abstract base formatoption to calculate ticks and bounds from the data

+
+

Possible types

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
+

Attributes:

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

array

The numpy array of the data

data_dependent

bool or a callable.

full_array

The full array of this and the shared data

+
+
+property array
+

The numpy array of the data

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property full_array
+

The full array of this and the shared data

+
+ +
+
+ +
+
+class psy_simple.plotters.Density(*args, **kwargs)
+

Bases: Formatoption

+

Change the density of the arrows

+
+

Possible types

+
+
float

Scales the density of the arrows in x- and y-direction (1.0 means +no scaling)

+
+
tuple (x, y)

Defines the scaling in x- and y-direction manually

+
+
+

Notes

+

quiver plots do not support density scaling

+

Attributes:

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

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + + + + +

remove([plot_type])

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'vector'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Density of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove(plot_type=None)
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.DensityPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Simple2DPlotter

+

A plotter to visualize the density of points in a 2-dimensional grid

+

Attributes:

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

allowed_dims

The number of allowed dimensions in the for the visualization.

allowed_vars

The number variables that one data array visualized by this plotter might have.

bins

Specify the bins of the 2D-Histogramm

coord

Use an alternative variable as x-coordinate

density

Specify the method to calculate the density

normed

Specify the normalization of the histogram

precision

Set the precision of the data

xrange

Specify the range of the histogram for the x-dimension

yrange

Specify the range of the histogram for the x-dimension

+
+
+allowed_dims = 1
+

The number of allowed dimensions in the for the visualization. If +the array is unstructured, one dimension will be subtracted

+
+ +
+
+allowed_vars = 1
+

The number variables that one data array visualized by this plotter +might have.

+
+ +
+
+bins
+

Specify the bins of the 2D-Histogramm

+

This formatoption can be used to specify, how many bins to use. In other +words, it determines the grid size of the resulting histogram or kde plot. +If however you also set the precision formatoption keyword then the +minimum of precision and the bins specified here will be used.

+
+

Possible types

+
+
int

If 0, only use the bins specified by the precision keyword +(raises an error if the precision is also set to 0), +otherwise the number of bins to use

+
+
tuple (x, y) of int

The bins for x and y explicitly

+
+
+
+
+ +
+
+coord
+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+
+
+ +
+
+density
+

Specify the method to calculate the density

+
+

Possible types

+
+
str

One of the following strings are possible

+
+
hist

Make a 2D-histogram. The normalization is controlled by the +normed formatoption

+
+
kde

Fit a bivariate kernel density estimate to the data. Note that +this choice requires pythons [statsmodels] module to be +installed

+
+
+
+
+

References

+
+
+[statsmodels] +

https://www.statsmodels.org

+
+
+
+
+ +
+
+normed
+

Specify the normalization of the histogram

+

This formatoption can be used to normalize the histogram. It has no effect +if the density formatoption is set to 'kde'

+
+

Possible types

+
+
None

Do not make any normalization

+
+
str

One of

+
+
counts

To make the normalization based on the total number counts

+
+
area

To make the normalization basen on the total number of counts and +area (the default behaviour of numpy.histogram2d())

+
+
x, col, column or columns

To normalize every column

+
+
y, row or rows

To normalize every row

+
+
+
+
+
+

See also

+

density

+
+
+
+ +
+
+precision
+

Set the precision of the data

+

This formatoption can be used to specify the precision of the data which +then will be the minimal bin width of the 2D histogram or the bandwith of +the kernel size (if the density formatoption is set to 'kde')

+
+

Possible types

+
+
float

If 0, this formatoption has no effect at all. Otherwise it is assumed +to be the precision of the data

+
+
str

One of {'scott' | 'silverman'}. This uses the statsmodels package +to estimate the bandwidth of the data that is then used in the +histogram or KDE plot

+
+
+
+
+ +
+
+xrange
+

Specify the range of the histogram for the x-dimension

+

This formatoption specifies the minimum and maximum of the histogram +in the x-dimension

+
+

Possible types

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+

Notes

+

This formatoption always acts on the coordinate, no matter what the +value of the transpose formatoption is

+
+

See also

+

yrange

+
+
+
+ +
+
+yrange
+

Specify the range of the histogram for the x-dimension

+

This formatoption specifies the minimum and maximum of the histogram +in the x-dimension

+
+

Possible types

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+

Notes

+

This formatoption always acts on the DataArray, no matter what the +value of the transpose formatoption is

+
+

See also

+

xrange

+
+
+
+ +
+ +
+
+class psy_simple.plotters.DtTicksBase(*args, **kwargs)
+

Bases: TicksBase, TicksManager

+

Abstract base class for x- and y-tick formatoptions

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Attributes:

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

dtdata

The np.unique data as datetime objects

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property dtdata
+

The np.unique data as datetime objects

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ErrorAlpha(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Set the alpha value for the error range

+

This formatoption can be used to set the alpha value (opacity) for the +error formatoption

+
+

Possible types

+
+
float

A float between 0 and 1

+
+
+
+

See also

+

error

+
+

Attributes:

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

connections

list of str.

error

error Formatoption instance in the plotter

group

str.

name

str.

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['error']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+property error
+

error Formatoption instance in the plotter

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Alpha value of the error range'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ErrorCalculator(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Calculation of the error

+

This formatoption is used to calculate the error range.

+
+

Possible types

+
+
None

Do not calculate any error range

+
+
float

A float between 0 and 50. This will represent the distance from the +median (i.e. the 50th percentile). A value of 45 will hence correspond +to the 5th and 95th percentile

+
+
list of 2 floats between 0 and 100

Two floats where the first corresponds to the minimum and the second +to the maximum percentile

+
+
str

A string with ‘std’ in it. Then we will use the standard deviation. Any +number in this string, e.g. ‘3.5std’ will serve as a multiplier +(in this case 3.5 times the standard deviation).

+
+
+
+

See also

+
+
mean

Determines how the line is calculated

+
+
+
+

Attributes:

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

children

list of str.

data_dependent

bool or a callable.

group

str.

mean

mean Formatoption instance in the plotter

name

str.

priority

int.

requires_replot

Boolean that is True if an update of the formatoption requires a replot

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['mean']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property mean
+

mean Formatoption instance in the plotter

+
+ +
+
+name = 'Mean calculation'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+requires_replot = True
+

Boolean that is True if an update of the formatoption requires a replot

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ErrorPlot(*args, **kwargs)
+

Bases: Formatoption

+

Visualize the error range

+

This formatoption visualizes the error range. For this, you must provide a +two-dimensional data array as input. The first dimension might be either of +length

+
    +
  • 2 to provide the deviation from minimum and maximum error range from +the data

  • +
  • 3 to provide the minimum and maximum error range explicitly

  • +
+
+

Possible types

+
+
None

No errors are visualized

+
+
‘fill’

The area between min- and max-error is filled with the same color as +the line and the alpha is determined by the fillalpha attribute

+
+
+

Examples

+

Assume you have the standard deviation stored in the 'std'-variable and +the data in the 'data' variable. Then you can visualize the standard +deviation simply via:

+
>>> psy.plot.lineplot(input_ds, name=[['data', 'std']])
+
+
+

On the other hand, assume you want to visualize the area between the 25th +and 75th percentile (stored in the variables 'p25' and 'p75'):

+
>>> psy.plot.lineplot(input_ds, name=[['data', 'p25', 'p75']])
+
+
+
+

See also

+

erroralpha

+
+

Attributes:

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

children

list of str.

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

plot_fmt

bool.

priority

int.

transpose

transpose Formatoption instance in the plotter

+

Methods:

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

make_plot()

plot_fill(index, min_range, max_range, c, ...)

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['color', 'transpose', 'plot']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+make_plot()
+
+ +
+
+name = 'Error plot type'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+plot_fill(index, min_range, max_range, c, **kwargs)
+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.Extend(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Draw arrows at the side of the colorbar

+
+

Possible types

+
+
str {‘neither’, ‘both’, ‘min’ or ‘max’}

If not ‘neither’, make pointed end(s) for out-of-range values

+
+
+

Attributes:

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

connections

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['plot']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Ends of the colorbar'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.FldmeanPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: LinePlotter

+

Attributes:

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

allowed_dims

The number of allowed dimensions in the for the visualization.

coord

Use an alternative variable as x-coordinate

err_calc

Calculation of the error

mask

Mask the data where a certain condition is True

maskbetween

Mask data points between two numbers

maskgeq

Mask data points greater than or equal to a number

maskgreater

Mask data points greater than a number

maskleq

Mask data points smaller than or equal to a number

maskless

Mask data points smaller than a number

mean

Determine how the error is visualized

+
+
+allowed_dims = 3
+

The number of allowed dimensions in the for the visualization. If +the array is unstructured, one dimension will be subtracted

+
+ +
+
+coord
+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+
+
+ +
+
+err_calc
+

Calculation of the error

+

This formatoption is used to calculate the error range.

+
+

Possible types

+
+
None

Do not calculate any error range

+
+
float

A float between 0 and 50. This will represent the distance from the +median (i.e. the 50th percentile). A value of 45 will hence correspond +to the 5th and 95th percentile

+
+
list of 2 floats between 0 and 100

Two floats where the first corresponds to the minimum and the second +to the maximum percentile

+
+
str

A string with ‘std’ in it. Then we will use the standard deviation. Any +number in this string, e.g. ‘3.5std’ will serve as a multiplier +(in this case 3.5 times the standard deviation).

+
+
+
+

See also

+
+
mean

Determines how the line is calculated

+
+
+
+
+
+ +
+
+mask
+

Mask the data where a certain condition is True

+

This formatoption can be used to mask the plotting data based on another +array. This array can be the name of a variable in the base dataset, +or it can be a numeric array. Note that the data needs to be on exactly +the same coordinates as the data shown here

+
+

Possible types

+
+
None

Apply no mask

+
+
str

The name of a variable in the base dataset to use.

+
    +
  • dimensions that are in the given mask but not in the visualized +base variable will be aggregated using numpy.any()

  • +
  • if the given mask misses dimensions that are in the visualized +data (i.e. the data of this plotter), we broadcast the mask to +match the shape of the data

  • +
  • dimensions that are in mask and the base variable, but not in the +visualized data will be matched against each other

  • +
+
+
str

The path to a netCDF file that shall be loaded

+
+
xr.DataArray or np.ndarray

An array that can be broadcasted to the shape of the data

+
+
+
+
+ +
+
+maskbetween
+

Mask data points between two numbers

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgeq
+

Mask data points greater than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgreater
+

Mask data points greater than a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskleq
+

Mask data points smaller than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+
+maskless
+

Mask data points smaller than a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+
+mean
+

Determine how the error is visualized

+
+

Possible types

+
+
‘mean’

Calculate the weighted mean

+
+
‘median’

Calculate the weighted median (i.e. the 50th percentile)

+
+
float between 0 and 100

Calculate the given quantile

+
+
+
+

See also

+
+
err_calc

Determines how to calculate the error

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.Grid(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Display the grid

+

Show the grid on the plot with the specified color.

+
+

Possible types

+
+
None

If the grid is currently shown, it will not be displayed any longer. If +the grid is not shown, it will be drawn

+
+
bool

If True, the grid is displayed with the automatic settings (usually +black)

+
+
string, tuple.

Defines the color of the grid.

+
+
+

Notes

+

The following color abbreviations are supported:

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

character

color

‘b’

blue

‘g’

green

‘r’

red

‘c’

cyan

‘m’

magenta

‘y’

yellow

‘k’

black

‘w’

white

+

In addition, you can specify colors in many weird and wonderful ways, +including full names ('green'), hex strings ('#008000'), RGB or +RGBA tuples ((0,1,0,1)) or grayscale intensities as a string +('0.8').

+

Attributes:

+ + + + + + + + + +

group

str.

name

str.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Grid lines'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.Hist2DXRange(*args, **kwargs)
+

Bases: LimitBase

+

Specify the range of the histogram for the x-dimension

+

This formatoption specifies the minimum and maximum of the histogram +in the x-dimension

+
+

Possible types

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+

Notes

+

This formatoption always acts on the coordinate, no matter what the +value of the transpose formatoption is

+
+

See also

+

yrange

+
+

Attributes:

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

array

The numpy array of the data

coord

coord Formatoption instance in the plotter

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

priority

int.

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

set_limit(*args)

The method to set the minimum and maximum limit

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property coord
+

coord Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['coord']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Range of the histogram in x-direction'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+set_limit(*args)
+

The method to set the minimum and maximum limit

+
+
Parameters:
+
    +
  • min_val (float) – The value for the lower limit

  • +
  • max_val (float) – The value for the upper limit

  • +
+
+
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Hist2DYRange(*args, **kwargs)
+

Bases: Hist2DXRange

+

Specify the range of the histogram for the x-dimension

+

This formatoption specifies the minimum and maximum of the histogram +in the x-dimension

+
+

Possible types

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+

Notes

+

This formatoption always acts on the DataArray, no matter what the +value of the transpose formatoption is

+
+

See also

+

xrange

+
+

Attributes:

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

array

The numpy array of the data

coord

coord Formatoption instance in the plotter

data_dependent

bool or a callable.

name

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property coord
+

coord Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+name = 'Range of the histogram in y-direction'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.HistBins(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the bins of the 2D-Histogramm

+

This formatoption can be used to specify, how many bins to use. In other +words, it determines the grid size of the resulting histogram or kde plot. +If however you also set the precision formatoption keyword then the +minimum of precision and the bins specified here will be used.

+
+

Possible types

+
+
int

If 0, only use the bins specified by the precision keyword +(raises an error if the precision is also set to 0), +otherwise the number of bins to use

+
+
tuple (x, y) of int

The bins for x and y explicitly

+
+
+

Attributes:

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

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

precision

precision Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['precision']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Number of bins of the histogram'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property precision
+

precision Formatoption instance in the plotter

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.InterpolateBounds(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Interpolate grid cell boundaries for 2D plots

+

This formatoption can be used to tell enable and disable the interpolation +of grid cell boundaries. Usually, netCDF files only contain the centered +coordinates. In this case, we interpolate the boundaries between the +grid cell centers.

+
+

Possible types

+
+
None

Interpolate the boundaries, except for circumpolar grids

+
+
bool

If True (the default), the grid cell boundaries are inter- and +extrapolated. Otherwise, if False, the coordinate centers are used and +the default behaviour of matplotlib cuts of the most outer row and +column of the 2D-data. Note that this results in a slight shift of the +data

+
+
+

Attributes:

+ + + + + + +

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.LabelOptions(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: DictFormatoption

+

Base formatoption class for label sizes

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
+

Attributes:

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

children

list of str.

xlabel

xlabel Formatoption instance in the plotter

ylabel

ylabel Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

update(value)

Method that is call to update the formatoption on the axes

update_axis(value)

+
+
+children = ['xlabel', 'ylabel']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+abstract update_axis(value)
+
+ +
+
+property xlabel
+

xlabel Formatoption instance in the plotter

+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.LabelProps(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: LabelOptions

+

Set the font properties of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
dict

Items may be any valid text property

+
+
+ +

Attributes:

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

children

list of str.

group

str.

labelsize

labelsize Formatoption instance in the plotter

labelweight

labelweight Formatoption instance in the plotter

name

str.

xlabel

xlabel Formatoption instance in the plotter

ylabel

ylabel Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(fontprops)

+
+
+children = ['xlabel', 'ylabel', 'labelsize', 'labelweight']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+group = 'labels'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property labelsize
+

labelsize Formatoption instance in the plotter

+
+ +
+
+property labelweight
+

labelweight Formatoption instance in the plotter

+
+ +
+
+name = 'font properties of x- and y-axis label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update_axis(fontprops)
+
+ +
+
+property xlabel
+

xlabel Formatoption instance in the plotter

+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.LabelSize(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: LabelOptions

+

Set the size of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

xlabel, ylabel, labelweight, labelprops

+
+

Attributes:

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

group

str.

labelprops

labelprops Formatoption instance in the plotter

name

str.

parents

list of str.

xlabel

xlabel Formatoption instance in the plotter

ylabel

ylabel Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+group = 'labels'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property labelprops
+

labelprops Formatoption instance in the plotter

+
+ +
+
+name = 'font size of x- and y-axis label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+parents = ['labelprops']
+

list of str. List of formatoptions that, if included in the update, +prevent the update of this formatoption.

+
+ +
+
+update_axis(value)
+
+ +
+
+property xlabel
+

xlabel Formatoption instance in the plotter

+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.LabelWeight(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: LabelOptions

+

Set the font size of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

xlabel, ylabel, labelsize, labelprops

+
+

Attributes:

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

group

str.

labelprops

labelprops Formatoption instance in the plotter

name

str.

parents

list of str.

xlabel

xlabel Formatoption instance in the plotter

ylabel

ylabel Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+group = 'labels'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property labelprops
+

labelprops Formatoption instance in the plotter

+
+ +
+
+name = 'font weight of x- and y-axis label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+parents = ['labelprops']
+

list of str. List of formatoptions that, if included in the update, +prevent the update of this formatoption.

+
+ +
+
+update_axis(value)
+
+ +
+
+property xlabel
+

xlabel Formatoption instance in the plotter

+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Legend(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: DictFormatoption

+

Draw a legend

+

This formatoption determines where and if to draw the legend. It uses the +labels formatoption to determine the labels.

+
+

Possible types

+
+
bool

Draw a legend or not

+
+
str or int

Specifies where to plot the legend (i.e. the location)

+
+
dict

Give the keywords for the matplotlib.pyplot.legend() function

+
+
+
+

See also

+

labels

+
+

Attributes:

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

color

color Formatoption instance in the plotter

dependencies

list of str.

legendlabels

legendlabels Formatoption instance in the plotter

marker

marker Formatoption instance in the plotter

name

str.

plot

plot Formatoption instance in the plotter

+

Methods:

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

get_artists_and_labels()

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+dependencies = ['legendlabels', 'plot', 'color', 'marker']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+get_artists_and_labels()
+
+ +
+
+property legendlabels
+

legendlabels Formatoption instance in the plotter

+
+ +
+
+property marker
+

marker Formatoption instance in the plotter

+
+ +
+
+name = 'Properties of the legend'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.LegendLabels(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption, TextBase

+

Set the labels of the arrays in the legend

+

This formatoption specifies the labels for each array in the legend. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str:

A single string that shall be used for all arrays.

+
+
list of str:

Same as a single string but specified for each array

+
+
+
+

See also

+

legend

+
+

Attributes:

+ + + + + + + + + +

data_dependent

bool or a callable.

name

str.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+name = 'Labels in the legend'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.LimitBase(*args, **kwargs)
+

Bases: DataTicksCalculator

+

Base class for x- and y-limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+

Attributes:

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

children

list of str.

connections

list of str.

group

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

value2share

The value that is passed to shared formatoptions (by default, the value attribute)

+

Methods:

+ + + + + + + + + +

set_limit(min_val, max_val)

The method to set the minimum and maximum limit

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['transpose']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+connections = ['plot']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+abstract set_limit(min_val, max_val)
+

The method to set the minimum and maximum limit

+
+
Parameters:
+
    +
  • min_val (float) – The value for the lower limit

  • +
  • max_val (float) – The value for the upper limit

  • +
+
+
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property value2share
+

The value that is passed to shared formatoptions (by default, the +value attribute)

+
+ +
+
+ +
+
+class psy_simple.plotters.LineColors(*args, **kwargs)
+

Bases: Formatoption

+

Set the color coding

+

This formatoptions sets the color of the lines, bars, etc.

+
+

Possible types

+
+
None

to use the axes color_cycle

+
+
iterable

(e.g. list) to specify the colors manually

+
+
+

str

+
+

Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

+
+
+
matplotlib.colors.ColorMap

to automatically choose the colors according to the number of lines, +etc. from the given colormap

+
+
+

Attributes:

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

extended_colors

group

str.

name

str.

priority

int.

value2pickle

The value that can be used when pickling the information of the project

value2share

The value that is passed to shared formatoptions (by default, the value attribute)

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property extended_colors
+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Color cycle'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property value2pickle
+

The value that can be used when pickling the information of the project

+
+ +
+
+property value2share
+

The value that is passed to shared formatoptions (by default, the +value attribute)

+
+ +
+
+ +
+
+class psy_simple.plotters.LinePlot(*args, **kwargs)
+

Bases: Formatoption

+

Choose the line style of the plot

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
'area'

To make an area plot (filled between y=0 and y), see +matplotlib.pyplot.fill_between()

+
+
'areax'

To make a transposed area plot (filled between x=0 and x), see +matplotlib.pyplot.fill_betweenx()

+
+
'stacked'

Make a stacked plot

+
+
str or list of str

The line style string to use ([‘solid’ | ‘dashed’, ‘dashdot’, ‘dotted’ +| (offset, on-off-dash-seq) | ‘-’ | ‘–’ | ‘-.’ | ‘:’ | ‘None’ | ‘ ‘ | +‘’]).

+
+
+

Attributes:

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

children

list of str.

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

group

str.

marker

marker Formatoption instance in the plotter

name

str.

plot_fmt

bool.

plotted_data

The data that is shown to the user

priority

int.

transpose

transpose Formatoption instance in the plotter

+

Methods:

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

make_plot()

plot_arr(arr, c, ls, m)

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['color', 'transpose', 'marker']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+make_plot()
+
+ +
+
+property marker
+

marker Formatoption instance in the plotter

+
+ +
+
+name = 'Line plot type'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+plot_arr(arr, c, ls, m)
+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+property plotted_data
+

The data that is shown to the user

+
+ +
+
+priority = 20.1
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.LinePlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: SimplePlotterBase

+

Plotter for simple one-dimensional line plots

+

Attributes:

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

allowed_vars

The number variables that one data array visualized by this plotter might have.

coord

Use an alternative variable as x-coordinate

error

Visualize the error range

erroralpha

Set the alpha value for the error range

linewidth

Choose the width of the lines

marker

Choose the marker for points

markersize

Choose the size of the markers for points

plot

Choose the line style of the plot

+
+
+allowed_vars = 3
+

The number variables that one data array visualized by this plotter +might have. We allow up to 3 variableswhere the second and third +variable might be the errors (see the error formatoption)

+
+ +
+
+coord
+

Use an alternative variable as x-coordinate

+

This formatoption let’s you specify another variable in the base dataset +of the data array in case you want to use this as the x-coordinate instead +of the raw data

+
+

Possible types

+
+
None

Use the default

+
+
str

The name of the variable to use in the base dataset

+
+
xarray.DataArray

An alternative variable with the same shape as the displayed array

+
+
+

Examples

+

To see the difference, we create a simple test dataset:

+
>>> import xarray as xr
+
+>>> import numpy as np
+
+>>> import psyplot.project as psy
+
+>>> ds = xr.Dataset({
+...     'temp': xr.Variable(('time', ), np.arange(5)),
+...     'std': xr.Variable(('time', ), np.arange(5, 10))})
+>>> ds
+<xarray.Dataset>
+Dimensions:  (time: 5)
+Coordinates:
+  * time     (time) int64 0 1 2 3 4
+Data variables:
+    temp     (time) int64 0 1 2 3 4
+    std      (time) int64 5 6 7 8 9
+
+
+

If we create a plot with it, we get the 'time' dimension on the +x-axis:

+
>>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0]
+
+>>> plotter.plot_data[0].dims
+('time',)
+
+
+

If we however set the 'coord' keyword, we get:

+
>>> plotter = psy.plot.lineplot(
+...     ds, name=['temp'], coord='std').plotters[0]
+
+>>> plotter.plot_data[0].dims
+('std',)
+
+
+

and 'std' is plotted on the x-axis.

+
+
+ +
+
+error
+

Visualize the error range

+

This formatoption visualizes the error range. For this, you must provide a +two-dimensional data array as input. The first dimension might be either of +length

+
    +
  • 2 to provide the deviation from minimum and maximum error range from +the data

  • +
  • 3 to provide the minimum and maximum error range explicitly

  • +
+
+

Possible types

+
+
None

No errors are visualized

+
+
‘fill’

The area between min- and max-error is filled with the same color as +the line and the alpha is determined by the fillalpha attribute

+
+
+

Examples

+

Assume you have the standard deviation stored in the 'std'-variable and +the data in the 'data' variable. Then you can visualize the standard +deviation simply via:

+
>>> psy.plot.lineplot(input_ds, name=[['data', 'std']])
+
+
+

On the other hand, assume you want to visualize the area between the 25th +and 75th percentile (stored in the variables 'p25' and 'p75'):

+
>>> psy.plot.lineplot(input_ds, name=[['data', 'p25', 'p75']])
+
+
+
+

See also

+

erroralpha

+
+
+
+ +
+
+erroralpha
+

Set the alpha value for the error range

+

This formatoption can be used to set the alpha value (opacity) for the +error formatoption

+
+

Possible types

+
+
float

A float between 0 and 1

+
+
+
+

See also

+

error

+
+
+
+ +
+
+linewidth
+

Choose the width of the lines

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
float

The width of the lines

+
+
+
+
+ +
+
+marker
+

Choose the marker for points

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
str

A valid symbol for the matplotlib markers (see +matplotlib.markers)

+
+
+
+
+ +
+
+markersize
+

Choose the size of the markers for points

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
float

The size of the marker

+
+
+
+
+ +
+
+plot
+

Choose the line style of the plot

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
'area'

To make an area plot (filled between y=0 and y), see +matplotlib.pyplot.fill_between()

+
+
'areax'

To make a transposed area plot (filled between x=0 and x), see +matplotlib.pyplot.fill_betweenx()

+
+
'stacked'

Make a stacked plot

+
+
str or list of str

The line style string to use ([‘solid’ | ‘dashed’, ‘dashdot’, ‘dotted’ +| (offset, on-off-dash-seq) | ‘-’ | ‘–’ | ‘-.’ | ‘:’ | ‘None’ | ‘ ‘ | +‘’]).

+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.LineWidth(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Choose the width of the lines

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
float

The width of the lines

+
+
+

Attributes:

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

connections

list of str.

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['plot']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.Marker(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Choose the marker for points

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
str

A valid symbol for the matplotlib markers (see +matplotlib.markers)

+
+
+

Attributes:

+ + + + + + +

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.MarkerSize(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Choose the size of the markers for points

+
+

Possible types

+
+
None

Use the default from matplotlibs rcParams

+
+
float

The size of the marker

+
+
+

Attributes:

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

connections

list of str.

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['plot']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.MaskDataGrid(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Mask the datagrid where the array is NaN

+

This boolean formatoption enables to mask the grid of the datagrid +formatoption where the data is NaN

+
+

Possible types

+
+
bool

Either True, to not display the data grid for cells with NaN, or False

+
+
+
+

See also

+

datagrid

+
+

Methods:

+ + + + + + +

update(value)

dummy, since this fmt is considered in the :class:`DataGrid ` fmt

+
+
+update(value)
+

dummy, since this fmt is considered in the :class:`DataGrid ` fmt

+
+ +
+
+ +
+
+class psy_simple.plotters.MeanCalculator(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Determine how the error is visualized

+
+

Possible types

+
+
‘mean’

Calculate the weighted mean

+
+
‘median’

Calculate the weighted median (i.e. the 50th percentile)

+
+
float between 0 and 100

Calculate the given quantile

+
+
+
+

See also

+
+
err_calc

Determines how to calculate the error

+
+
+
+

Attributes:

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

data_dependent

bool or a callable.

group

str.

name

str.

priority

int.

requires_replot

Boolean that is True if an update of the formatoption requires a replot

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Mean calculation'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+requires_replot = True
+

Boolean that is True if an update of the formatoption requires a replot

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.MissColor(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Set the color for missing values

+
+

Possible types

+
+
None

Use the default from the colormap

+
+
string, tuple.

Defines the color of the grid.

+
+
+

Attributes:

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

connections

list of str.

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

priority

int.

transform

transform Formatoption instance in the plotter

update_after_plot

bool.

+

Methods:

+ + + + + + + + + +

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+connections = ['transform']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+dependencies = ['plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Color of missing values'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 10
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+update_after_plot = True
+

bool. True if this formatoption needs an update after the plot +has changed

+
+ +
+
+ +
+
+class psy_simple.plotters.NormedHist2D(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the normalization of the histogram

+

This formatoption can be used to normalize the histogram. It has no effect +if the density formatoption is set to 'kde'

+
+

Possible types

+
+
None

Do not make any normalization

+
+
str

One of

+
+
counts

To make the normalization based on the total number counts

+
+
area

To make the normalization basen on the total number of counts and +area (the default behaviour of numpy.histogram2d())

+
+
x, col, column or columns

To normalize every column

+
+
y, row or rows

To normalize every row

+
+
+
+
+
+

See also

+

density

+
+

Attributes:

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

data_dependent

bool or a callable.

group

str.

name

str.

priority

int.

+

Methods:

+ + + + + + + + + +

hist2d(da, **kwargs)

Make the two dimensional histogram

update(value)

Method that is call to update the formatoption on the axes

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+hist2d(da, **kwargs)
+

Make the two dimensional histogram

+
+
Parameters:
+

da (xarray.DataArray) – The data source

+
+
+
+ +
+
+name = 'Normalize the histogram'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.Plot2D(*args, **kwargs)
+

Bases: Formatoption

+

Choose how to visualize a 2-dimensional scalar data field

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘mesh’

Use the matplotlib.pyplot.pcolormesh() function to make the plot +or the matplotlib.pyplot.tripcolor() for an unstructered grid

+
+
‘poly’

Draw each polygon indivually. This method is used by default for +unstructured grids. If there are no grid cell boundaries in the +dataset, we will interpolate them

+
+
‘contourf’

Make a filled contour plot using the matplotlib.pyplot.contourf() +function. The levels for the contour plot are controlled by the +levels formatoption

+
+
‘contour’

Same a 'contourf', but does not make a filled contour plot, only +lines.

+
+
+

Methods:

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

add2format_coord(x, y)

Additional information for the format_coord()

get_xyz_1d(xcoord, x, ycoord, y, data)

Get closest x, y and z for the given x and y in data for 1d coords

get_xyz_2d(xcoord, x, ycoord, y, data)

Get closest x, y and z for the given x and y in data for 2d coords

get_xyz_tri(xcoord, x, ycoord, y, data)

Get closest x, y and z for the given x and y in data for 1d coords

make_plot()

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

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

array

The (masked) data array that is plotted

bounds

bounds Formatoption instance in the plotter

cell_nodes_x

The unstructured x-boundaries with shape (N, m) where m > 2

cell_nodes_y

The unstructured y-boundaries with shape (N, m) where m > 2

children

list of str.

cmap

cmap Formatoption instance in the plotter

data_dependent

bool or a callable.

dependencies

list of str.

format_coord

The function that can replace the axes.format_coord method

group

str.

interp_bounds

interp_bounds Formatoption instance in the plotter

levels

levels Formatoption instance in the plotter

mappable

Returns the mappable that can be used for colorbars

name

str.

notnull_array

The data array that is plotted

plot_fmt

bool.

priority

int.

xbounds

Boundaries of the x-coordinate

xcoord

The x coordinate xarray.Variable

ybounds

Boundaries of the y-coordinate

ycoord

The y coordinate xarray.Variable

+
+
+add2format_coord(x, y)
+

Additional information for the format_coord()

+
+ +
+
+property array
+

The (masked) data array that is plotted

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cell_nodes_x
+

The unstructured x-boundaries with shape (N, m) where m > 2

+
+ +
+
+property cell_nodes_y
+

The unstructured y-boundaries with shape (N, m) where m > 2

+
+ +
+
+children = ['cmap', 'bounds']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['levels', 'interp_bounds']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property format_coord
+

The function that can replace the axes.format_coord method

+
+ +
+
+get_xyz_1d(xcoord, x, ycoord, y, data)
+

Get closest x, y and z for the given x and y in data for +1d coords

+
+ +
+
+get_xyz_2d(xcoord, x, ycoord, y, data)
+

Get closest x, y and z for the given x and y in data for +2d coords

+
+ +
+
+get_xyz_tri(xcoord, x, ycoord, y, data)
+

Get closest x, y and z for the given x and y in data for +1d coords

+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property interp_bounds
+

interp_bounds Formatoption instance in the plotter

+
+ +
+
+property levels
+

levels Formatoption instance in the plotter

+
+ +
+
+make_plot()
+
+ +
+
+property mappable
+

Returns the mappable that can be used for colorbars

+
+ +
+
+name = '2D plot type'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property notnull_array
+

The data array that is plotted

+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xbounds
+

Boundaries of the x-coordinate

+
+ +
+
+property xcoord
+

The x coordinate xarray.Variable

+
+ +
+
+property ybounds
+

Boundaries of the y-coordinate

+
+ +
+
+property ycoord
+

The y coordinate xarray.Variable

+
+ +
+
+ +
+
+class psy_simple.plotters.PointDensity(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Specify the method to calculate the density

+
+

Possible types

+
+
str

One of the following strings are possible

+
+
hist

Make a 2D-histogram. The normalization is controlled by the +normed formatoption

+
+
kde

Fit a bivariate kernel density estimate to the data. Note that +this choice requires pythons [statsmodels] module to be +installed

+
+
+
+
+

References

+
+
+[statsmodels] +

https://www.statsmodels.org

+
+
+

Attributes:

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

bins

bins Formatoption instance in the plotter

coord

coord Formatoption instance in the plotter

data_dependent

bool or a callable.

dependencies

list of str.

group

str.

name

str.

normed

normed Formatoption instance in the plotter

precision

precision Formatoption instance in the plotter

priority

int.

xrange

xrange Formatoption instance in the plotter

yrange

yrange Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property bins
+

bins Formatoption instance in the plotter

+
+ +
+
+property coord
+

coord Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['normed', 'bins', 'xrange', 'yrange', 'precision', 'coord']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'data'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Calculation of the point density'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property normed
+

normed Formatoption instance in the plotter

+
+ +
+
+property precision
+

precision Formatoption instance in the plotter

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xrange
+

xrange Formatoption instance in the plotter

+
+ +
+
+property yrange
+

yrange Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ScalarCombinedBase(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Plotter

+

Base plotter for combined 2-dimensional scalar field with any other +plotter

+

Attributes:

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

bounds

Specify the boundaries of the colorbar

cbar

Specify the position of the colorbars

cticks

Specify the tick locations of the colorbar

maskbetween

Mask data points between two numbers

maskgeq

Mask data points greater than or equal to a number

maskgreater

Mask data points greater than a number

maskleq

Mask data points smaller than or equal to a number

maskless

Mask data points smaller than a number

+
+
+bounds
+

Specify the boundaries of the colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+
+
+ +
+
+cbar
+

Specify the position of the colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+

Examples

+

Draw a colorbar at the bottom and left of the axes:

+
>>> plotter.update(cbar='bl')
+
+
+
+
+ +
+
+cticks
+

Specify the tick locations of the colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels

+
+
+
+ +
+
+maskbetween
+

Mask data points between two numbers

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgeq
+

Mask data points greater than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskgreater
+

Mask data points greater than a number

+
+

Possible types

+
+
float

The floating number to mask above

+
+
+ +
+
+ +
+
+maskleq
+

Mask data points smaller than or equal to a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+
+maskless
+

Mask data points smaller than a number

+
+

Possible types

+
+
float

The floating number to mask below

+
+
+ +
+
+ +
+ +
+
+class psy_simple.plotters.Simple2DBase(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Base2D

+

Base class for Simple2DPlotter and +psyplot.plotter.maps.FieldPlotter that defines the data +management

+

Attributes:

+ + + + + + + + + +

allowed_dims

The number of allowed dimensions in the for the visualization.

miss_color

Set the color for missing values

+

Methods:

+ + + + + + +

check_data(name, dims, is_unstructured)

A validation method for the data shape

+
+
+allowed_dims = 2
+

The number of allowed dimensions in the for the visualization. If +the array is unstructured, one dimension will be subtracted

+
+ +
+
+classmethod check_data(name, dims, is_unstructured)
+

A validation method for the data shape

+
+
Parameters:
+
    +
  • name (str or list of str) – The variable names (one variable per array)

  • +
  • dims (list with length 1 or list of lists with length 1) – The dimension of the arrays. Only 1D-Arrays are allowed

  • +
  • is_unstructured (bool or list of bool) – True if the corresponding array is unstructured.

  • +
+
+
Returns:
+

    +
  • list of bool or None – True, if everything is okay, False in case of a serious error, +None if it is intermediate. Each object in this list corresponds to +one in the given name

  • +
  • list of str – The message giving more information on the reason. Each object in +this list corresponds to one in the given name

  • +
+

+
+
+
+ +
+
+miss_color
+

Set the color for missing values

+
+

Possible types

+
+
None

Use the default from the colormap

+
+
string, tuple.

Defines the color of the grid.

+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.Simple2DPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Simple2DBase, SimplePlotterBase

+

Plotter for visualizing 2-dimensional data.

+
+

See also

+

psyplot.plotter.maps.FieldPlotter

+
+

Attributes:

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

color

interp_bounds

Interpolate grid cell boundaries for 2D plots

legend

legendlabels

levels

The levels for the contour plot

plot

Specify the plotting method

transpose

Switch x- and y-axes

xlim

Set the x-axis limits

xticks

Modify the x-axis ticks

ylim

Set the y-axis limits

yticks

Modify the y-axis ticks

+
+
+color = None
+
+ +
+
+interp_bounds
+

Interpolate grid cell boundaries for 2D plots

+

This formatoption can be used to tell enable and disable the interpolation +of grid cell boundaries. Usually, netCDF files only contain the centered +coordinates. In this case, we interpolate the boundaries between the +grid cell centers.

+
+

Possible types

+
+
None

Interpolate the boundaries, except for circumpolar grids

+
+
bool

If True (the default), the grid cell boundaries are inter- and +extrapolated. Otherwise, if False, the coordinate centers are used and +the default behaviour of matplotlib cuts of the most outer row and +column of the 2D-data. Note that this results in a slight shift of the +data

+
+
+
+
+ +
+
+legend = None
+
+ +
+
+legendlabels = None
+
+ +
+
+levels
+

The levels for the contour plot

+

This formatoption sets the levels for the filled contour plot and only has +an effect if the plot Formatoption is set to 'contourf'

+
+

Possible types

+
+
None

Use the settings from the bounds formatoption and if this +does not specify boundaries, use 11

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
+
+
+ +
+
+plot
+

Specify the plotting method

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘mesh’

Use the matplotlib.pyplot.pcolormesh() function to make the plot

+
+
+
+
+ +
+
+transpose
+

Switch x- and y-axes

+

By default, one-dimensional arrays have the dimension on the x-axis and two +dimensional arrays have the first dimension on the y and the second on the +x-axis. You can set this formatoption to True to change this behaviour

+
+

Possible types

+
+
bool

If True, axes are switched

+
+
+
+
+ +
+
+xlim
+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+
+
+ +
+
+xticks
+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+
+
+ +
+
+ylim
+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+
+
+ +
+
+yticks
+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.SimplePlot2D(*args, **kwargs)
+

Bases: Plot2D

+

Specify the plotting method

+
+

Possible types

+
+
None

Don’t make any plotting

+
+
‘mesh’

Use the matplotlib.pyplot.pcolormesh() function to make the plot

+
+
+

Attributes:

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

array

The (masked) data array that is plotted

bounds

bounds Formatoption instance in the plotter

cell_nodes_x

The unstructured x-boundaries with shape (N, m) where m > 2

cell_nodes_y

The unstructured y-boundaries with shape (N, m) where m > 2

cmap

cmap Formatoption instance in the plotter

data_dependent

bool or a callable.

dependencies

list of str.

interp_bounds

interp_bounds Formatoption instance in the plotter

levels

levels Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xbounds

Boundaries of the x-coordinate

xcoord

The x coordinate xarray.Variable

ybounds

Boundaries of the y-coordinate

ycoord

The y coordinate xarray.Variable

+
+
+property array
+

The (masked) data array that is plotted

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cell_nodes_x
+

The unstructured x-boundaries with shape (N, m) where m > 2

+
+ +
+
+property cell_nodes_y
+

The unstructured y-boundaries with shape (N, m) where m > 2

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['levels', 'interp_bounds', 'transpose']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property interp_bounds
+

interp_bounds Formatoption instance in the plotter

+
+ +
+
+property levels
+

levels Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xbounds
+

Boundaries of the x-coordinate

+
+ +
+
+property xcoord
+

The x coordinate xarray.Variable

+
+ +
+
+property ybounds
+

Boundaries of the y-coordinate

+
+ +
+
+property ycoord
+

The y coordinate xarray.Variable

+
+ +
+
+ +
+
+class psy_simple.plotters.SimplePlotterBase(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: BasePlotter, XYTickPlotter

+

Base class for all simple plotters

+

Attributes:

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

allowed_dims

The number of allowed dimensions in the for the visualization.

allowed_vars

The number variables that one data array visualized by this plotter might have.

axiscolor

Color the x- and y-axes

color

Set the color coding

grid

Display the grid

legend

Draw a legend

legendlabels

Set the labels of the arrays in the legend

sym_lims

Make x- and y-axis symmetric

transpose

Switch x- and y-axes

xlim

Set the x-axis limits

ylim

Set the y-axis limits

+

Methods:

+ + + + + + +

check_data(name, dims[, is_unstructured])

A validation method for the data shape

+
+
+allowed_dims = 1
+

The number of allowed dimensions in the for the visualization. If +the array is unstructured, one dimension will be subtracted

+
+ +
+
+allowed_vars = 1
+

The number variables that one data array visualized by this plotter +might have.

+
+ +
+
+axiscolor
+

Color the x- and y-axes

+

This formatoption colors the left, right, bottom and top axis bar.

+
+

Possible types

+
+
dict

Keys may be one of {‘right’, ‘left’, ‘bottom’, ‘top’}, the values can +be any valid color or None.

+
+
+

Notes

+

The following color abbreviations are supported:

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

character

color

‘b’

blue

‘g’

green

‘r’

red

‘c’

cyan

‘m’

magenta

‘y’

yellow

‘k’

black

‘w’

white

+

In addition, you can specify colors in many weird and wonderful ways, +including full names ('green'), hex strings ('#008000'), RGB or +RGBA tuples ((0,1,0,1)) or grayscale intensities as a string +('0.8').

+
+
+ +
+
+classmethod check_data(name, dims, is_unstructured=None)
+

A validation method for the data shape

+
+
Parameters:
+
    +
  • name (str or list of str) – The variable names (at maximum allowed_vars variables per +array)

  • +
  • dims (list with length 1 or list of lists with length 1) – The dimension of the arrays. Only 1D-Arrays are allowed

  • +
  • is_unstructured (bool or list of bool, optional) – True if the corresponding array is unstructured. This keyword is +ignored

  • +
+
+
Returns:
+

    +
  • list of bool or None – True, if everything is okay, False in case of a serious error, +None if it is intermediate. Each object in this list corresponds to +one in the given name

  • +
  • list of str – The message giving more information on the reason. Each object in +this list corresponds to one in the given name

  • +
+

+
+
+
+ +
+
+color
+

Set the color coding

+

This formatoptions sets the color of the lines, bars, etc.

+
+

Possible types

+
+
None

to use the axes color_cycle

+
+
iterable

(e.g. list) to specify the colors manually

+
+
+

str

+
+

Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

+
+
+
matplotlib.colors.ColorMap

to automatically choose the colors according to the number of lines, +etc. from the given colormap

+
+
+
+
+ +
+
+grid
+

Display the grid

+

Show the grid on the plot with the specified color.

+
+

Possible types

+
+
None

If the grid is currently shown, it will not be displayed any longer. If +the grid is not shown, it will be drawn

+
+
bool

If True, the grid is displayed with the automatic settings (usually +black)

+
+
string, tuple.

Defines the color of the grid.

+
+
+

Notes

+

The following color abbreviations are supported:

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

character

color

‘b’

blue

‘g’

green

‘r’

red

‘c’

cyan

‘m’

magenta

‘y’

yellow

‘k’

black

‘w’

white

+

In addition, you can specify colors in many weird and wonderful ways, +including full names ('green'), hex strings ('#008000'), RGB or +RGBA tuples ((0,1,0,1)) or grayscale intensities as a string +('0.8').

+
+
+ +
+
+legend
+

Draw a legend

+

This formatoption determines where and if to draw the legend. It uses the +labels formatoption to determine the labels.

+
+

Possible types

+
+
bool

Draw a legend or not

+
+
str or int

Specifies where to plot the legend (i.e. the location)

+
+
dict

Give the keywords for the matplotlib.pyplot.legend() function

+
+
+
+

See also

+

labels

+
+
+
+ +
+
+legendlabels
+

Set the labels of the arrays in the legend

+

This formatoption specifies the labels for each array in the legend. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str:

A single string that shall be used for all arrays.

+
+
list of str:

Same as a single string but specified for each array

+
+
+
+

See also

+

legend

+
+
+
+ +
+
+sym_lims
+

Make x- and y-axis symmetric

+
+

Possible types

+
+
None

No symmetric type

+
+
‘min’

Use the minimum of x- and y-limits

+
+
‘max’

Use the maximum of x- and y-limits

+
+
[str, str]

A combination, None, 'min' and 'max' specific for minimum +and maximum limit

+
+
+
+
+ +
+
+transpose
+

Switch x- and y-axes

+

By default, one-dimensional arrays have the dimension on the x-axis and two +dimensional arrays have the first dimension on the y and the second on the +x-axis. You can set this formatoption to True to change this behaviour

+
+

Possible types

+
+
bool

If True, axes are switched

+
+
+
+
+ +
+
+xlim
+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+
+
+ +
+
+ylim
+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+
+
+ +
+ +
+
+class psy_simple.plotters.SimpleVectorPlot(*args, **kwargs)
+

Bases: VectorPlot

+

Choose the vector plot type

+
+

Possible types

+
+
str

Plot types can be either

+
+
quiver

to make a quiver plot

+
+
stream

to make a stream plot

+
+
+
+
+

Attributes:

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

arrowsize

arrowsize Formatoption instance in the plotter

arrowstyle

arrowstyle Formatoption instance in the plotter

bounds

bounds Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

density

density Formatoption instance in the plotter

linewidth

linewidth Formatoption instance in the plotter

transform

transform Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

set_value(value, *args, **kwargs)

Set (and validate) the value in the plotter.

+
+
+property arrowsize
+

arrowsize Formatoption instance in the plotter

+
+ +
+
+property arrowstyle
+

arrowstyle Formatoption instance in the plotter

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property density
+

density Formatoption instance in the plotter

+
+ +
+
+property linewidth
+

linewidth Formatoption instance in the plotter

+
+ +
+
+set_value(value, *args, **kwargs)
+

Set (and validate) the value in the plotter. This method is called by +the plotter when it attempts to change the value of the formatoption.

+
+
Parameters:
+
    +
  • value – Value to set

  • +
  • validate (bool) – if True, validate the value before it is set

  • +
  • todefault (bool) – True if the value is updated to the default value

  • +
+
+
+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.SimpleVectorPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: BaseVectorPlotter, SimplePlotterBase

+

Plotter for visualizing 2-dimensional vector data

+
+

See also

+

psyplot.plotter.maps.VectorPlotter

+
+

Attributes:

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

legend

legendlabels

plot

Choose the vector plot type

xlim

Set the x-axis limits

xticks

Modify the x-axis ticks

ylim

Set the y-axis limits

yticks

Modify the y-axis ticks

+
+
+legend = None
+
+ +
+
+legendlabels = None
+
+ +
+
+plot
+

Choose the vector plot type

+
+

Possible types

+
+
str

Plot types can be either

+
+
quiver

to make a quiver plot

+
+
stream

to make a stream plot

+
+
+
+
+
+
+ +
+
+xlim
+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+
+
+ +
+
+xticks
+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+
+
+ +
+
+ylim
+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+
+
+ +
+
+yticks
+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.SymmetricLimits(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Make x- and y-axis symmetric

+
+

Possible types

+
+
None

No symmetric type

+
+
‘min’

Use the minimum of x- and y-limits

+
+
‘max’

Use the maximum of x- and y-limits

+
+
[str, str]

A combination, None, 'min' and 'max' specific for minimum +and maximum limit

+
+
+

Attributes:

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

dependencies

list of str.

name

str.

xlim

xlim Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+dependencies = ['xlim', 'ylim']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Symmetric x- and y-axis limits'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.TickLabels(*args, **kwargs)
+

Bases: TickLabelsBase, TicksManager

+

Methods:

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

set_default_formatters([which])

Sets the default formatters that is used for updating to None

set_formatter(formatter[, which])

Sets a given formatter

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

+ + + + + + +

transpose

transpose Formatoption instance in the plotter

+
+
+set_default_formatters(which=None)
+

Sets the default formatters that is used for updating to None

+
+
Parameters:
+

which ({None, 'minor', 'major'}) – Specify which locator shall be set

+
+
+
+ +
+
+set_formatter(formatter, which=None)
+

Sets a given formatter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+ +
+
+class psy_simple.plotters.TickLabelsBase(*args, **kwargs)
+

Bases: TicksManagerBase

+

Abstract base class for ticklabels

+
+

Possible types

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+

Attributes:

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

axis

The axis on the axes to modify the ticks of

dependencies

list of str.

group

str.

transpose

transpose Formatoption instance in the plotter

+

Methods:

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

initialize_plot(value)

Method that is called when the plot is made the first time

set_default_formatters()

Sets the default formatters that is used for updating to None

set_formatter(formatter)

Sets a given formatter

set_stringformatter(s)

set_ticklabels(labels)

Sets the given tick labels

update_axis(value)

+
+
+abstract property axis
+

The axis on the axes to modify the ticks of

+
+ +
+
+dependencies = ['transpose']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'ticks'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+abstract set_default_formatters()
+

Sets the default formatters that is used for updating to None

+
+ +
+
+abstract set_formatter(formatter)
+

Sets a given formatter

+
+ +
+
+set_stringformatter(s)
+
+ +
+
+set_ticklabels(labels)
+

Sets the given tick labels

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_axis(value)
+
+ +
+
+ +
+
+class psy_simple.plotters.TickPropsBase(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TicksManagerBase

+

Abstract base class for tick parameters

+
+

Possible types

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+

Attributes:

+ + + + + + +

axisname

The name of the axis (either 'x' or 'y')

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+abstract property axisname
+

The name of the axis (either ‘x’ or ‘y’)

+
+ +
+
+update_axis(value)
+
+ +
+
+ +
+
+class psy_simple.plotters.TickSize(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TickSizeBase, TicksOptions, DictFormatoption

+

Change the ticksize of the ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+
+

See also

+

tickweight, xtickprops, ytickprops

+
+

Attributes:

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

dependencies

list of str.

name

str.

xtickprops

xtickprops Formatoption instance in the plotter

ytickprops

ytickprops Formatoption instance in the plotter

+
+
+dependencies = ['xtickprops', 'ytickprops']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Font size of the ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property xtickprops
+

xtickprops Formatoption instance in the plotter

+
+ +
+
+property ytickprops
+

ytickprops Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.TickSizeBase(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TicksOptions

+

Abstract base class for modifying tick sizes

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+update_axis(value)
+
+ +
+ +
+
+class psy_simple.plotters.TickWeight(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TickWeightBase, TicksOptions, DictFormatoption

+

Change the fontweight of the ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+
+

See also

+

ticksize, xtickprops, ytickprops

+
+

Attributes:

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

dependencies

list of str.

name

str.

xtickprops

xtickprops Formatoption instance in the plotter

ytickprops

ytickprops Formatoption instance in the plotter

+
+
+dependencies = ['xtickprops', 'ytickprops']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Font weight of the ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property xtickprops
+

xtickprops Formatoption instance in the plotter

+
+ +
+
+property ytickprops
+

ytickprops Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.TickWeightBase(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TicksOptions

+

Abstract base class for modifying font weight of ticks

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+update_axis(value)
+
+ +
+ +
+
+class psy_simple.plotters.TicksBase(*args, **kwargs)
+

Bases: TicksManagerBase, DataTicksCalculator

+

Abstract base class for calculating ticks

+
+

Possible types

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
+

Attributes:

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

axis

dependencies

list of str.

group

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

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

get_locator()

initialize_plot(value)

Method that is called when the plot is made the first time

set_default_locators([which])

Sets the default locator that is used for updating to None or int

set_locator(locator)

Sets the locator corresponding of the axis

set_ticks(value)

update_axis(value)

+
+
+abstract property axis
+
+ +
+
+dependencies = ['transpose', 'plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+get_locator()
+
+ +
+
+group = 'ticks'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_default_locators(which=None)
+

Sets the default locator that is used for updating to None or int

+
+
Parameters:
+

which ({None, 'minor', 'major'}) – Specify which locator shall be set

+
+
+
+ +
+
+set_locator(locator)
+

Sets the locator corresponding of the axis

+
+
Parameters:
+
    +
  • locator (matplotlib.ticker.Locator) – The locator to set

  • +
  • which ({None, 'minor', 'major'}) – Specify which locator shall be set. If None, it will be taken from +the which attribute

  • +
+
+
+
+ +
+
+set_ticks(value)
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_axis(value)
+
+ +
+
+ +
+
+class psy_simple.plotters.TicksManager(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TicksManagerBase, DictFormatoption

+

Abstract base class for ticks formatoptions controlling major and minor +ticks

+

This formatoption simply serves as a base that allows the simultaneous +managment of major and minor ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
+

Attributes:

+ + + + + + +

group

str.

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+group = 'ticks'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.TicksManagerBase(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Abstract base class for formatoptions handling ticks

+

Methods:

+ + + + + + +

update_axis(val)

+
+
+abstract update_axis(val)
+
+ +
+ +
+
+class psy_simple.plotters.TicksOptions(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TicksManagerBase

+

Base class for ticklabels options that apply for x- and y-axis

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+ +
+
+class psy_simple.plotters.Transpose(*args, **kwargs)
+

Bases: Formatoption

+

Switch x- and y-axes

+

By default, one-dimensional arrays have the dimension on the x-axis and two +dimensional arrays have the first dimension on the y and the second on the +x-axis. You can set this formatoption to True to change this behaviour

+
+

Possible types

+
+
bool

If True, axes are switched

+
+
+

Methods:

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

get_x(arr)

get_y(arr)

initialize_plot(value)

Method that is called when the plot is made the first time

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

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

group

str.

name

str.

priority

int.

+
+
+get_x(arr)
+
+ +
+
+get_y(arr)
+
+ +
+
+group = 'axes'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'Switch x- and y-axes'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+priority = 30
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.VCLabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: CLabel

+

Show the colorbar label of the vector plot

+

Set the label of the colorbar. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The title for the set_label() +method.

+
+
+
+

See also

+

vclabelsize, vclabelweight, vclabelprops

+
+

Attributes:

+ + + + + + + + + +

cbar

cbar Formatoption instance in the plotter

plot

plot Formatoption instance in the plotter

+
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.VectorBounds(*args, **kwargs)
+

Bases: Bounds

+

Specify the boundaries of the vector colorbar

+
+

Possible types

+
+
None

make no normalization

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'rounded' option. I.e. if +integer i, then this is the same as ['rounded', i].

+
+
matplotlib.colors.Normalize

A matplotlib normalization instance

+
+
+

Examples

+
    +
  • Plot 11 bounds over the whole data range:

    +
    >>> plotter.update(bounds='rounded')
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded'})
    +
    +
    +
  • +
  • Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

    +
    >>> plotter.update(bounds=['minmax', 7])
    +
    +
    +

    which is equivaluent to:

    +
    >>> plotter.update(bounds={'method': 'minmax', 'N': 7})
    +
    +
    +
  • +
  • chop the first and last five percentiles:

    +
    >>> plotter.update(bounds=['rounded', None, 5, 95])
    +
    +
    +

    which is equivalent to:

    +
    >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5,
    +...                        'percmax': 95})
    +
    +
    +
  • +
  • Plot 3 bounds per power of ten:

    +
    >>> plotter.update(bounds=['log', 3])
    +
    +
    +
  • +
  • Plot continuous logarithmic bounds:

    +
    >>> from matplotlib.colors import LogNorm
    +>>> plotter.update(bounds=LogNorm())
    +
    +
    +
  • +
+
+

See also

+
+
cmap

Specifies the colormap

+
+
+
+

Attributes:

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

array

The numpy array of the data

cbar

cbar Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

parents

list of str.

+

Methods:

+ + + + + + +

update(*args, **kwargs)

Method that is call to update the formatoption on the axes

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+parents = ['color']
+

list of str. List of formatoptions that, if included in the update, +prevent the update of this formatoption.

+
+ +
+
+update(*args, **kwargs)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.VectorCTicks(*args, **kwargs)
+

Bases: CTicks

+

Specify the tick locations of the vector colorbar

+
+

Possible types

+
+
None

use the default ticks

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
bounds

let the bounds keyword determine the ticks. An +additional integer i may be specified to only use every i-th +bound as a tick (see also int below)

+
+
midbounds

Same as bounds but in the middle between two bounds

+
+
+
+
+
+
int

Specifies how many ticks to use with the 'bounds' option. I.e. if +integer i, then this is the same as ['bounds', i].

+
+
+
+

See also

+

cticklabels, vcticklabels

+
+

Attributes:

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

array

The numpy array of the data

bounds

bounds Formatoption instance in the plotter

cbar

cbar Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

dependencies

list of str.

plot

plot Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cbar
+

cbar Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+dependencies = ['cbar', 'bounds', 'color']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.VectorCalculator(*args, **kwargs)
+

Bases: Formatoption

+

Abstract formatoption that provides calculation functions for speed, etc.

+
+

Possible types

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
+

Attributes:

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

data_dependent

bool or a callable.

dependencies

list of str.

plot

plot Formatoption instance in the plotter

priority

int.

transpose

transpose Formatoption instance in the plotter

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+dependencies = ['plot', 'transpose']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.VectorCbar(*args, **kwargs)
+

Bases: Cbar

+

Specify the position of the vector plot colorbars

+
+

Possible types

+
+
bool

True: defaults to ‘b’ +False: Don’t draw any colorbar

+
+
str

The string can be a combination of one of the following strings: +{‘fr’, ‘fb’, ‘fl’, ‘ft’, ‘b’, ‘r’, ‘sv’, ‘sh’}

+
    +
  • ‘b’, ‘r’ stand for bottom and right of the axes

  • +
  • ‘fr’, ‘fb’, ‘fl’, ‘ft’ stand for bottom, right, left and top of the +figure

  • +
  • ‘sv’ and ‘sh’ stand for a vertical or horizontal colorbar in a +separate figure

  • +
+
+
list

A containing one of the above positions

+
+
+

Attributes:

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

bounds

bounds Formatoption instance in the plotter

cbarspacing

cbarspacing Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

dependencies

list of str.

extend

extend Formatoption instance in the plotter

levels

levels Formatoption instance in the plotter

plot

plot Formatoption instance in the plotter

priority

int.

+

Methods:

+ + + + + + +

update(*args, **kwargs)

Updates the colorbar

+
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cbarspacing
+

cbarspacing Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+dependencies = ['plot', 'cmap', 'bounds', 'extend', 'cbarspacing', 'levels', 'color']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+property extend
+

extend Formatoption instance in the plotter

+
+ +
+
+property levels
+

levels Formatoption instance in the plotter

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+priority = 10
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+update(*args, **kwargs)
+

Updates the colorbar

+
+
Parameters:
+
    +
  • value – The value to update (see possible types)

  • +
  • no_fig_cbars – Does not update the colorbars that are not in the axes of this +plot

  • +
+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.VectorColor(*args, **kwargs)
+

Bases: VectorCalculator

+

Set the color for the arrows

+

This formatoption can be used to set a single color for the vectors or +define the color coding

+
+

Possible types

+
+
float

Determines the greyness

+
+
color

Defines the same color for all arrows. The string can be either a html +hex string (e.g. ‘#eeefff’), a single letter (e.g. ‘b’: blue, +‘g’: green, ‘r’: red, ‘c’: cyan, ‘m’: magenta, ‘y’: yellow, ‘k’: black, +‘w’: white) or any other color

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
2D-array

The values determine the color for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+
+

See also

+

arrowsize, arrowstyle, density, linewidth

+
+

Attributes:

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

bounds

bounds Formatoption instance in the plotter

cmap

cmap Formatoption instance in the plotter

dependencies

list of str.

group

str.

name

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+dependencies = ['plot', 'transpose', 'cmap', 'bounds']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+group = 'colors'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Color of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.VectorDataGrid(*args, **kwargs)
+

Bases: DataGrid

+

Attributes:

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

data

The data that is plotted

mask_datagrid

mask_datagrid Formatoption instance in the plotter

plot

plot Formatoption instance in the plotter

transform

transform Formatoption instance in the plotter

+
+
+property data
+

The data that is plotted

+
+ +
+
+property mask_datagrid
+

mask_datagrid Formatoption instance in the plotter

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+ +
+
+class psy_simple.plotters.VectorLineWidth(*args, **kwargs)
+

Bases: VectorCalculator

+

Change the linewidth of the arrows

+
+

Possible types

+
+
float

give the linewidth explicitly

+
+
string {‘absolute’, ‘u’, ‘v’}

Strings may define how the formatoption is calculated. Possible strings +are

+
    +
  • absolute: for the absolute wind speed

  • +
  • u: for the u component

  • +
  • v: for the v component

  • +
+
+
tuple (string, float)

string may be one of the above strings, float may be a scaling +factor

+
+
2D-array

The values determine the linewidth for each plotted arrow. Note that +the shape has to match the one of u and v.

+
+
+
+

See also

+

arrowsize, arrowstyle, density, color

+
+

Attributes:

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

name

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+name = 'Linewidth of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.VectorPlot(*args, **kwargs)
+

Bases: Formatoption

+

Choose the vector plot type

+
+

Possible types

+
+
str

Plot types can be either

+
+
quiver

to make a quiver plot

+
+
stream

to make a stream plot

+
+
+
+
+

Methods:

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

add2format_coord(x, y)

Additional information for the format_coord()

get_xyz_1d(xcoord, x, ycoord, y, u, v)

Get closest x, y and z for the given x and y in data for 1d coords

get_xyz_2d(xcoord, x, ycoord, y, u, v)

Get closest x, y and z for the given x and y in data for 2d coords

get_xyz_tri(xcoord, x, ycoord, y, u, v)

Get closest x, y and z for the given x and y in data for 1d coords

make_plot()

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+

Attributes:

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

array

arrowsize

arrowsize Formatoption instance in the plotter

arrowstyle

arrowstyle Formatoption instance in the plotter

bounds

bounds Formatoption instance in the plotter

children

list of str.

cmap

cmap Formatoption instance in the plotter

color

color Formatoption instance in the plotter

connections

list of str.

data_dependent

bool or a callable.

density

density Formatoption instance in the plotter

format_coord

The function that can replace the axes.format_coord method

group

str.

linewidth

linewidth Formatoption instance in the plotter

mappable

The mappable, i.e. the container of the plot.

name

str.

plot_fmt

bool.

priority

int.

transform

transform Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xcoord

The x coordinate xarray.Variable

ycoord

The y coordinate xarray.Variable

+
+
+add2format_coord(x, y)
+

Additional information for the format_coord()

+
+ +
+
+property array
+
+ +
+
+property arrowsize
+

arrowsize Formatoption instance in the plotter

+
+ +
+
+property arrowstyle
+

arrowstyle Formatoption instance in the plotter

+
+ +
+
+property bounds
+

bounds Formatoption instance in the plotter

+
+ +
+
+children = ['cmap', 'bounds']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property cmap
+

cmap Formatoption instance in the plotter

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+connections = ['transpose', 'transform', 'arrowsize', 'arrowstyle', 'density', 'linewidth', 'color']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property density
+

density Formatoption instance in the plotter

+
+ +
+
+property format_coord
+

The function that can replace the axes.format_coord method

+
+ +
+
+get_xyz_1d(xcoord, x, ycoord, y, u, v)
+

Get closest x, y and z for the given x and y in data for +1d coords

+
+ +
+
+get_xyz_2d(xcoord, x, ycoord, y, u, v)
+

Get closest x, y and z for the given x and y in data for +2d coords

+
+ +
+
+get_xyz_tri(xcoord, x, ycoord, y, u, v)
+

Get closest x, y and z for the given x and y in data for +1d coords

+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+property linewidth
+

linewidth Formatoption instance in the plotter

+
+ +
+
+make_plot()
+
+ +
+
+property mappable
+

The mappable, i.e. the container of the plot

+
+ +
+
+name = 'Plot type of the arrows'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transform
+

transform Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property xcoord
+

The x coordinate xarray.Variable

+
+ +
+
+property ycoord
+

The y coordinate xarray.Variable

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinPlot(*args, **kwargs)
+

Bases: Formatoption

+

Choose how to make the violin plot

+
+

Possible types

+
+
None or False

Don’t make any plotting

+
+
bool

If True, visualize the violins

+
+
+

Attributes:

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

children

list of str.

color

color Formatoption instance in the plotter

data_dependent

bool or a callable.

group

str.

name

str.

plot_fmt

bool.

priority

int.

transpose

transpose Formatoption instance in the plotter

+

Methods:

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

make_plot()

remove()

Method to remove the effects of this formatoption

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['color', 'transpose']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property color
+

color Formatoption instance in the plotter

+
+ +
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+group = 'plotting'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+make_plot()
+
+ +
+
+name = 'Violin plot type'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+plot_fmt = True
+

bool. Has to be True if the formatoption has a make_plot +method to make the plot.

+
+ +
+
+priority = 20
+

int. Priority value of the the formatoption determining when +the formatoption is updated.

+
    +
  • 10: at the end (for labels, etc.)

  • +
  • 20: before the plotting (e.g. for colormaps, etc.)

  • +
  • 30: before loading the data (e.g. for lonlatbox)

  • +
+
+ +
+
+remove()
+

Method to remove the effects of this formatoption

+

This method is called when the axes is cleared due to a +formatoption with requires_clearing set to True. You don’t +necessarily have to implement this formatoption if your plot results +are removed by the usual matplotlib.axes.Axes.clear() method.

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: SimplePlotterBase

+

Plotter for making violin plots

+

Attributes:

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

plot

Choose how to make the violin plot

xlim

Set the x-axis limits

xticklabels

Modify the x-axis ticklabels

xticks

Modify the x-axis ticks

ylim

Set the y-axis limits

yticklabels

Modify the x-axis ticklabels

yticks

Modify the y-axis ticks

+
+
+plot
+

Choose how to make the violin plot

+
+

Possible types

+
+
None or False

Don’t make any plotting

+
+
bool

If True, visualize the violins

+
+
+
+
+ +
+
+xlim
+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+
+
+ +
+
+xticklabels
+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+
+
+ +
+
+xticks
+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+
+
+ +
+
+ylim
+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+
+
+ +
+
+yticklabels
+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+
+
+ +
+
+yticks
+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.ViolinXTickLabels(*args, **kwargs)
+

Bases: XTickLabels, TextBase

+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+

Attributes:

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

data_dependent

bool or a callable.

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

yticklabels

yticklabels Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_axis(value)
+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property yticklabels
+

yticklabels Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinXTicks(*args, **kwargs)
+

Bases: XTicks

+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinXlim(*args, **kwargs)
+

Bases: Xlim

+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinYTickLabels(*args, **kwargs)
+

Bases: YTickLabels, TextBase

+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+

Attributes:

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

data_dependent

bool or a callable.

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update_axis(value)

+
+
+data_dependent = True
+

bool or a callable. This attribute indicates whether this +Formatoption depends on the data and should be updated if the +data changes. If it is a callable, it must accept one argument: the +new data. (Note: This is automatically set to True for plot +formatoptions)

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update_axis(value)
+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinYTicks(*args, **kwargs)
+

Bases: YTicks

+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.ViolinYlim(*args, **kwargs)
+

Bases: Ylim

+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xlim

xlim Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.XRotation(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Rotate the x-axis ticks

+
+

Possible types

+
+
float

The rotation angle in degrees

+
+
+
+

See also

+

yrotation

+
+

Attributes:

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

children

list of str.

group

str.

name

str.

yticklabels

yticklabels Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['yticklabels']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+group = 'ticks'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Rotate x-ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property yticklabels
+

yticklabels Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.XTickLabels(*args, **kwargs)
+

Bases: TickLabels

+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

xticks, ticksize, tickweight, xtickprops, yticklabels

+
+

Attributes:

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

axis

The axis on the axes to modify the ticks of

dependencies

list of str.

name

str.

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

yticklabels

yticklabels Formatoption instance in the plotter

+

Methods:

+ + + + + + +

initialize_plot(*args, **kwargs)

Method that is called when the plot is made the first time

+
+
+property axis
+

The axis on the axes to modify the ticks of

+
+ +
+
+dependencies = ['transpose', 'xticks', 'yticklabels']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+initialize_plot(*args, **kwargs)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'x-xxis Ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property yticklabels
+

yticklabels Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.XTickProps(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TickPropsBase, TicksManager, DictFormatoption

+

Specify the x-axis tick parameters

+

This formatoption can be used to make a detailed change of the ticks +parameters on the x-axis.

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+
+

See also

+

xticks, yticks, ticksize, tickweight, ytickprops

+
+

Attributes:

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

axis

axisname

name

str.

+
+
+property axis
+
+ +
+
+axisname = 'x'
+
+ +
+
+name = 'Font properties of the x-ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.plotters.XTicks(*args, **kwargs)
+

Bases: DtTicksBase

+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+

Attributes:

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

axis

children

list of str.

data

The data that is plotted

dependencies

list of str.

name

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+

Methods:

+ + + + + + +

initialize_plot(*args, **kwargs)

Method that is called when the plot is made the first time

+
+
+property axis
+
+ +
+
+children = ['yticks']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property data
+

The data that is plotted

+
+ +
+
+dependencies = ['transpose', 'plot', 'plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+initialize_plot(*args, **kwargs)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'Location of the x-Axis ticks'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.XTicks2D(*args, **kwargs)
+

Bases: XTicks

+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+
+

See also

+

xticklabels, ticksize, tickweight, xtickprops, yticks

+
+

Attributes:

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

data

The data that is plotted

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property data
+

The data that is plotted

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.XYTickPlotter(data=None, ax=None, auto_update=None, project=None, draw=False, make_plot=True, clear=False, enable_post=False, **kwargs)
+

Bases: Plotter

+

Plotter class for x- and y-ticks and x- and y- ticklabels

+

Attributes:

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

labelprops

Set the font properties of both, x- and y-label

labelsize

Set the size of both, x- and y-label

labelweight

Set the font size of both, x- and y-label

ticksize

Change the ticksize of the ticklabels

tickweight

Change the fontweight of the ticks

transpose

Switch x- and y-axes

xlabel

Set the x-axis label

xrotation

Rotate the x-axis ticks

xticklabels

Modify the x-axis ticklabels

xtickprops

Specify the x-axis tick parameters

xticks

Modify the x-axis ticks

ylabel

Set the y-axis label

yrotation

Rotate the y-axis ticks

yticklabels

Modify the y-axis ticklabels

ytickprops

Specify the y-axis tick parameters

yticks

Modify the y-axis ticks

+
+
+labelprops
+

Set the font properties of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
dict

Items may be any valid text property

+
+
+ +
+
+ +
+
+labelsize
+

Set the size of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+ +
+
+ +
+
+labelweight
+

Set the font size of both, x- and y-label

+
+

Possible types

+
+
dict

A dictionary with the keys 'x' and (or) 'y' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is used for the x- and y-axis. +The values in the dictionary can be one types below.

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+ +
+
+ +
+
+ticksize
+

Change the ticksize of the ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
float

The absolute font size in points (e.g., 12)

+
+
string

Strings might be ‘xx-small’, ‘x-small’, ‘small’, ‘medium’, ‘large’, +‘x-large’, ‘xx-large’.

+
+
+ +
+
+ +
+
+tickweight
+

Change the fontweight of the ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
float

a float between 0 and 1000

+
+
string

Possible strings are one of ‘ultralight’, ‘light’, ‘normal’, +‘regular’, ‘book’, ‘medium’, ‘roman’, ‘semibold’, ‘demibold’, +‘demi’, ‘bold’, ‘heavy’, ‘extra bold’, ‘black’.

+
+
+ +
+
+ +
+
+transpose
+

Switch x- and y-axes

+

By default, one-dimensional arrays have the dimension on the x-axis and two +dimensional arrays have the first dimension on the y and the second on the +x-axis. You can set this formatoption to True to change this behaviour

+
+

Possible types

+
+
bool

If True, axes are switched

+
+
+
+
+ +
+
+xlabel
+

Set the x-axis label

+

Set the label for the x-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the xlabel() function.

+
+
+
+

See also

+

xlabelsize, xlabelweight, xlabelprops

+
+
+
+ +
+
+xrotation
+

Rotate the x-axis ticks

+
+

Possible types

+
+
float

The rotation angle in degrees

+
+
+
+

See also

+

yrotation

+
+
+
+ +
+
+xticklabels
+

Modify the x-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+ +
+
+ +
+
+xtickprops
+

Specify the x-axis tick parameters

+

This formatoption can be used to make a detailed change of the ticks +parameters on the x-axis.

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+ +
+
+ +
+
+xticks
+

Modify the x-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+

Examples

+

Plot 11 ticks over the whole data range:

+
>>> plotter.update(xticks='rounded')
+
+
+

Plot 7 ticks over the whole data range where the maximal and minimal +tick matches the data maximum and minimum:

+
>>> plotter.update(xticks=['minmax', 7])
+
+
+

Plot ticks every year and minor ticks every month:

+
>>> plotter.update(xticks={'major': 'year', 'minor': 'month'})
+
+
+ +
+
+ +
+
+ylabel
+

Set the y-axis label

+

Set the label for the y-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the ylabel() function.

+
+
+
+

See also

+

ylabelsize, ylabelweight, ylabelprops

+
+
+
+ +
+
+yrotation
+

Rotate the y-axis ticks

+
+

Possible types

+
+
float

The rotation angle in degrees

+
+
+
+

See also

+

xrotation

+
+
+
+ +
+
+yticklabels
+

Modify the y-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+ +
+
+ +
+
+ytickprops
+

Specify the y-axis tick parameters

+

This formatoption can be used to make a detailed change of the ticks +parameters of the y-axis.

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+ +
+
+ +
+
+yticks
+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+
+
+ +
+ +
+
+class psy_simple.plotters.Xlabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TextBase, Formatoption

+

Set the x-axis label

+

Set the label for the x-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the xlabel() function.

+
+
+
+

See also

+

xlabelsize, xlabelweight, xlabelprops

+
+

Attributes:

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

children

list of str.

enhanced_attrs

The enhanced attributes of the array

name

str.

transpose

transpose Formatoption instance in the plotter

ylabel

ylabel Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

initialize_plot(value)

Method that is called when the plot is made the first time

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['transpose', 'ylabel']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property enhanced_attrs
+

The enhanced attributes of the array

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'x-axis label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property ylabel
+

ylabel Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Xlim(*args, **kwargs)
+

Bases: LimitBase

+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+

Attributes:

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

array

The numpy array of the data

axisname

children

list of str.

connections

list of str.

dependencies

list of str.

name

str.

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

initialize_plot(value)

Method that is called when the plot is made the first time

set_limit(*args)

The method to set the minimum and maximum limit

+
+
+property array
+

The numpy array of the data

+
+ +
+
+axisname = 'x'
+
+ +
+
+children = ['transpose', 'ylim']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+connections = ['plot', 'sym_lims']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+dependencies = ['xticks']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'x-axis limits'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_limit(*args)
+

The method to set the minimum and maximum limit

+
+
Parameters:
+
    +
  • min_val (float) – The value for the lower limit

  • +
  • max_val (float) – The value for the upper limit

  • +
+
+
+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Xlim2D(*args, **kwargs)
+

Bases: Xlim

+

Set the x-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

ylim

+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xticks

xticks Formatoption instance in the plotter

ylim

ylim Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xticks
+

xticks Formatoption instance in the plotter

+
+ +
+
+property ylim
+

ylim Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.YRotation(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: Formatoption

+

Rotate the y-axis ticks

+
+

Possible types

+
+
float

The rotation angle in degrees

+
+
+
+

See also

+

xrotation

+
+

Attributes:

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

children

list of str.

group

str.

name

str.

yticklabels

yticklabels Formatoption instance in the plotter

+

Methods:

+ + + + + + +

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['yticklabels']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+group = 'ticks'
+

str. Key of the group name in groups of this +formatoption keyword

+
+ +
+
+name = 'Rotate y-ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+property yticklabels
+

yticklabels Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.YTickLabels(*args, **kwargs)
+

Bases: TickLabels

+

Modify the y-axis ticklabels

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
str

A formatstring like '%Y' for plotting the year (in the case that +time is shown on the axis) or ‘%i’ for integers

+
+
array

An array of strings to use for the ticklabels

+
+
+
+

See also

+

yticks, ticksize, tickweight, ytickprops, xticklabels

+
+

Attributes:

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

axis

The axis on the axes to modify the ticks of

dependencies

list of str.

name

str.

transpose

transpose Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property axis
+

The axis on the axes to modify the ticks of

+
+ +
+
+dependencies = ['transpose', 'yticks']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'y-xxis ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.YTickProps(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: XTickProps

+

Specify the y-axis tick parameters

+

This formatoption can be used to make a detailed change of the ticks +parameters of the y-axis.

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
dict

Items may be anything of the matplotlib.pyplot.tick_params() +function

+
+
+
+

See also

+

xticks, yticks, ticksize, tickweight, xtickprops

+
+

Attributes:

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

axis

axisname

name

str.

+
+
+property axis
+
+ +
+
+axisname = 'y'
+
+ +
+
+name = 'Font properties of the y-ticklabels'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+ +
+
+class psy_simple.plotters.YTicks(*args, **kwargs)
+

Bases: DtTicksBase

+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+

Attributes:

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

axis

data

The data that is plotted

dependencies

list of str.

name

str.

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+
+
+property axis
+
+ +
+
+property data
+

The data that is plotted

+
+ +
+
+dependencies = ['transpose', 'plot', 'plot']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'Location of the y-Axis ticks'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.YTicks2D(*args, **kwargs)
+

Bases: YTicks

+

Modify the y-axis ticks

+
+

Possible types

+
+
dict

A dictionary with the keys 'minor' and (or) 'major' to specify +which ticks are managed. If the given value is not a dictionary with +those keys, it is put into a dictionary with the key determined by the +rcParams 'ticks.which' key (usually 'major'). +The values in the dictionary can be one types below.

+
+
None

use the default ticks

+
+
int

for an integer i, only every i-th tick of the default ticks are +used

+
+
numeric array

specifies the ticks manually

+
+
str or list [str, …]

A list of the below mentioned values of the mapping like +[method, N, percmin, percmax, vmin, vmax], where only the first +one is absolutely necessary

+
+
dict

Automatically determine the ticks corresponding to the data. The +mapping can have the following keys, but only method is not optional.

+
+
N

An integer describing the number of boundaries (or ticks per +power of ten, see log and symlog above)

+
+
percmin

The percentile to use for the minimum (by default, 0, i.e. the +minimum of the array)

+
+
percmax

The percentile to use for the maximum (by default, 100, i.e. the +maximum of the array)

+
+
vmin

The minimum to use (in which case it is not calculated from the +specified method)

+
+
vmax

The maximum to use (in which case it is not calculated from the +specified method)

+
+
method

A string that defines how minimum and maximum shall be set. This +argument is not optional and can be one of the following:

+
+
data

plot the ticks exactly where the data is.

+
+
mid

plot the ticks in the middle of the data.

+
+
rounded

Sets the minimum and maximum of the ticks to the rounded data +minimum or maximum. Ticks are rounded to the next 0.5 value +with to the difference between data max- and minimum. The +minimal tick will always be lower or equal than the data +minimum, the maximal tick will always be higher or equal than +the data maximum.

+
+
roundedsym

Same as rounded above but the ticks are chose such that they +are symmetric around zero

+
+
minmax

Uses the minimum as minimal tick and maximum as maximal tick

+
+
sym

Same as minmax but symmetric around zero

+
+
log

Use logarithmic bounds. In this case, the given number N +determines the number of bounds per power of tenth (i.e. +N == 2 results in something like 1.0, 5.0, 10.0, 50.0, +etc., If this second number is None, then it will be chosen +such that we have around 11 boundaries but at least one per +power of ten.

+
+
symlog

The same as log but symmetric around 0. If the number N +is None, then we have around 12 boundaries but at least one +per power of ten

+
+
hour

draw ticks every hour

+
+
day

draw ticks every day

+
+
week

draw ticks every week

+
+
month, monthend, monthbegin

draw ticks in the middle, at the end or at the beginning of each +month

+
+
year, yearend, yearbegin

draw ticks in the middle, at the end or at the beginning of each +year

+
+
+
+
+

For data, mid, hour, day, week, month, etc., the optional second value +can be an integer i determining that every i-th data point shall be +used (by default, it is set to 1). For rounded, roundedsym, minmax and +sym, the second value determines the total number of ticks (defaults to +11).

+
+
+
+

See also

+

yticklabels, ticksize, tickweight, ytickprops

+
+
xticks

for possible examples

+
+
+
+

Attributes:

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

data

The data that is plotted

plot

plot Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

+
+
+property data
+

The data that is plotted

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Ylabel(key, plotter=None, index_in_list=None, additional_children=[], additional_dependencies=[], **kwargs)
+

Bases: TextBase, Formatoption

+

Set the y-axis label

+

Set the label for the y-axis. +You can insert any meta key from the xarray.DataArray.attrs via a +string like '%(key)s'. Furthermore there are some special cases:

+
    +
  • Strings like '%Y', '%b', etc. will be replaced using the +datetime.datetime.strftime() method as long as the data has a time +coordinate and this can be converted to a datetime +object.

  • +
  • '%(x)s', '%(y)s', '%(z)s', '%(t)s' will be replaced +by the value of the x-, y-, z- or time coordinate (as long as this +coordinate is one-dimensional in the data)

  • +
  • any attribute of one of the above coordinates is inserted via +axis + key (e.g. the name of the x-coordinate can be inserted via +'%(xname)s').

  • +
  • Labels defined in the psyplot.rcParams 'texts.labels' key +are also replaced when enclosed by ‘{}’. The standard labels are

    +
      +
    • tinfo: %H:%M

    • +
    • dtinfo: %B %d, %Y. %H:%M

    • +
    • dinfo: %B %d, %Y

    • +
    • desc: %(long_name)s [%(units)s]

    • +
    • sdesc: %(name)s [%(units)s]

    • +
    +
  • +
+
+

Possible types

+
+
str

The text for the ylabel() function.

+
+
+
+

See also

+

ylabelsize, ylabelweight, ylabelprops

+
+

Attributes:

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

children

list of str.

enhanced_attrs

The enhanced attributes of the array

name

str.

transpose

transpose Formatoption instance in the plotter

+

Methods:

+ + + + + + + + + +

initialize_plot(value)

Method that is called when the plot is made the first time

update(value)

Method that is call to update the formatoption on the axes

+
+
+children = ['transpose']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+property enhanced_attrs
+

The enhanced attributes of the array

+
+ +
+
+initialize_plot(value)
+

Method that is called when the plot is made the first time

+
+
Parameters:
+

value – The value to use for the initialization

+
+
+
+ +
+
+name = 'y-axis label'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+update(value)
+

Method that is call to update the formatoption on the axes

+
+
Parameters:
+

value – Value to update

+
+
+
+ +
+
+ +
+
+class psy_simple.plotters.Ylim(*args, **kwargs)
+

Bases: LimitBase

+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+

Attributes:

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

array

The numpy array of the data

axisname

children

list of str.

connections

list of str.

dependencies

list of str.

name

str.

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xlim

xlim Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+

Methods:

+ + + + + + +

set_limit(*args)

The method to set the minimum and maximum limit

+
+
+property array
+

The numpy array of the data

+
+ +
+
+axisname = 'y'
+
+ +
+
+children = ['transpose', 'xlim']
+

list of str. List of formatoptions that have to be updated before this +one is updated. Those formatoptions are only updated if they exist in +the update parameters.

+
+ +
+
+connections = ['plot', 'sym_lims']
+

list of str. Connections to other formatoptions that are (different +from dependencies and children) not important for the +update process

+
+ +
+
+dependencies = ['yticks']
+

list of str. List of formatoptions that force an update of this +formatoption if they are updated.

+
+ +
+
+name = 'y-axis limits'
+

str. A bit more verbose name than the formatoption key to be +included in the gui. If None, the key is used in the gui

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+set_limit(*args)
+

The method to set the minimum and maximum limit

+
+
Parameters:
+
    +
  • min_val (float) – The value for the lower limit

  • +
  • max_val (float) – The value for the upper limit

  • +
+
+
+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+class psy_simple.plotters.Ylim2D(*args, **kwargs)
+

Bases: Ylim

+

Set the y-axis limits

+
+

Possible types

+
+
None

To not change the current limits

+
+
str or list [str, str] or [[str, float], [str, float]]

Automatically determine the ticks corresponding to the data. The given +string determines how the limits are calculated. The float determines +the percentile to use +A string can be one of the following:

+
+
rounded

Sets the minimum and maximum of the limits to the rounded data +minimum or maximum. Limits are rounded to the next 0.5 value with +to the difference between data max- and minimum. The minimum +will always be lower or equal than the data minimum, the maximum +will always be higher or equal than the data maximum.

+
+
roundedsym

Same as rounded above but the limits are chosen such that they +are symmetric around zero

+
+
minmax

Uses the minimum and maximum

+
+
sym

Same as minmax but symmetric around zero

+
+
+
+
tuple (xmin, xmax)

xmin is the smaller value, xmax the larger. Any of those values can +be None or one of the strings (or lists) above to use the corresponding +value here

+
+
+
+

See also

+

xlim

+
+

Attributes:

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

array

The numpy array of the data

plot

plot Formatoption instance in the plotter

sym_lims

sym_lims Formatoption instance in the plotter

transpose

transpose Formatoption instance in the plotter

xlim

xlim Formatoption instance in the plotter

yticks

yticks Formatoption instance in the plotter

+
+
+property array
+

The numpy array of the data

+
+ +
+
+property plot
+

plot Formatoption instance in the plotter

+
+ +
+
+property sym_lims
+

sym_lims Formatoption instance in the plotter

+
+ +
+
+property transpose
+

transpose Formatoption instance in the plotter

+
+ +
+
+property xlim
+

xlim Formatoption instance in the plotter

+
+ +
+
+property yticks
+

yticks Formatoption instance in the plotter

+
+ +
+
+ +
+
+psy_simple.plotters.convert_radian(coord, *variables)
+

Convert the given coordinate from radian to degree

+
+
Parameters:
+
    +
  • coord (xr.Variable) – The variable to transform

  • +
  • *variables – The variables that are on the same unit.

  • +
+
+
Returns:
+

The transformed variable if one of the given variables has units in +radian

+
+
Return type:
+

xr.Variable

+
+
+
+ +
+
+psy_simple.plotters.format_coord_func(ax, ref)
+

Create a function that can replace the +matplotlib.axes.Axes.format_coord()

+
+
Parameters:
+
    +
  • ax (matplotlib.axes.Axes) – The axes instance

  • +
  • ref (weakref.weakref) – The reference to the Formatoption instance

  • +
+
+
Returns:
+

The function that can be used to replace ax.format_coord

+
+
Return type:
+

function

+
+
+
+ +
+
+psy_simple.plotters.round_to_05(n, exp=None, mode='s')
+

Round to the next 0.5-value.

+

This function applies the round function func to round n to the +next 0.5-value with respect to its exponent with base 10 (i.e. +1.3e-4 will be rounded to 1.5e-4) if exp is None or with respect +to the given exponent in exp.

+
+
Parameters:
+
    +
  • n (numpy.ndarray) – number to round

  • +
  • exp (int or numpy.ndarray) – Exponent for rounding. If None, it will be computed from n to be the +exponents for base 10.

  • +
  • mode ({'s', 'l'}) – rounding mode. If ‘s’, it will be rounded to value whose absolute +value is below n, if ‘l’ it will rounded to the value whose absolute +value is above n.

  • +
+
+
Returns:
+

rounded n

+
+
Return type:
+

numpy.ndarray

+
+
+

Examples

+

The effects of the different parameters are show in the example below:

+
>>> from psyplot.plotter.simple import round_to_05
+>>> a = [-100.3, 40.6, 8.7, -0.00023]
+>>>round_to_05(a, mode='s')
+array([ -1.00000000e+02,   4.00000000e+01,   8.50000000e+00,
+        -2.00000000e-04])
+
+>>> round_to_05(a, mode='l')
+array([ -1.50000000e+02,   4.50000000e+01,   9.00000000e+00,
+        -2.50000000e-04])
+
+
+
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.plugin.html b/api/psy_simple.plugin.html new file mode 100644 index 00000000..9248f693 --- /dev/null +++ b/api/psy_simple.plugin.html @@ -0,0 +1,1200 @@ + + + + + + + <no title> — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +

psy-simple psyplot plugin

+

This module defines the rcParams for the psy-simple plugin.

+

Classes:

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

BoundsMethod(value)

An enumeration.

BoundsType(method[, N, percmin, percmax, ...])

BoundsValidator(type[, default, ...])

CTicksMethod(value)

An enumeration.

CTicksType(method[, N, percmin, percmax, ...])

DictValValidator(key, valid, validators, default)

A validation class for formatoptions that expect dictionaries as values

LineWidthValidator(key, valid[, ignorecase, ...])

TicksMethod(value)

An enumeration.

TicksType(method[, N, percmin, percmax, ...])

TicksValidator(key, valid[, ignorecase, ...])

ValidateList([dtype, length, listtype])

Validate a list of the specified dtype

strEnum(value)

An enumeration.

+

Functions:

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

get_versions([requirements])

patch_prior_1_0(plotter_d, versions)

Patch psy_simple plotters for versions smaller than 1.0

try_and_error(*funcs)

Apply multiple validation functions

validate_alpha(val)

Validate an alpha value between 0 and 1

validate_axiscolor(value)

Validate a dictionary containing axiscolor definitions

validate_bool_maybe_none(value)

validate_cbarpos(value)

Validate a colorbar position

validate_cmap(val)

Validate a colormap

validate_cmaps(cmaps)

Validate a dictionary of color lists

validate_dataarray(val)

validate_err_calc(val)

Validation function for the psy_simple.plotter.FldmeanPlotter.err_calc formatoption

validate_float(s)

convert s to float or raise

validate_fontweight(value)

validate_iter(value)

Validate that the given value is an iterable

validate_legend(value)

validate_limits(value)

validate_lineplot(value)

Validate the value for the LinePlotter.plot formatoption

validate_marker(val)

Does not really make a validation because markers can be quite of different types

validate_none(b)

Validate that None is given

validate_plot(val)

validate_str(s)

Validate a string

validate_sym_lims(val)

validate_text(value)

Validate a text formatoption

validate_ticklabels(value)

+

Data:

+ + + + + + +

patches

patches to apply when loading a project

+
+
+class psy_simple.plugin.BoundsMethod(value)
+

Bases: strEnum

+

An enumeration.

+

Attributes:

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

data

log

mid

minmax

rounded

roundedsym

sym

symlog

+
+
+data = 'data'
+
+ +
+
+log = 'log'
+
+ +
+
+mid = 'mid'
+
+ +
+
+minmax = 'minmax'
+
+ +
+
+rounded = 'rounded'
+
+ +
+
+roundedsym = 'roundedsym'
+
+ +
+
+sym = 'sym'
+
+ +
+
+symlog = 'symlog'
+
+ +
+ +
+
+class psy_simple.plugin.BoundsType(method: psy_simple.plugin.BoundsMethod, N: int = None, percmin: float = 0, percmax: float = 100, vmin: float = None, vmax: float = None)
+

Bases: object

+

Attributes:

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

N

method

percmax

percmin

vmax

vmin

+
+
+N: int = None
+
+ +
+
+method: BoundsMethod
+
+ +
+
+percmax: float = 100
+
+ +
+
+percmin: float = 0
+
+ +
+
+vmax: float = None
+
+ +
+
+vmin: float = None
+
+ +
+ +
+
+class psy_simple.plugin.BoundsValidator(type, default='rounded', possible_instances=None)
+

Bases: object

+

Methods:

+ + + + + + +

instance_check(val)

+
+
+instance_check(val)
+
+ +
+ +
+
+class psy_simple.plugin.CTicksMethod(value)
+

Bases: strEnum

+

An enumeration.

+

Attributes:

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

bounds

data

log

mid

midbounds

minmax

rounded

roundedsym

sym

symlog

+
+
+bounds = 'bounds'
+
+ +
+
+data = 'data'
+
+ +
+
+log = 'log'
+
+ +
+
+mid = 'mid'
+
+ +
+
+midbounds = 'midbounds'
+
+ +
+
+minmax = 'minmax'
+
+ +
+
+rounded = 'rounded'
+
+ +
+
+roundedsym = 'roundedsym'
+
+ +
+
+sym = 'sym'
+
+ +
+
+symlog = 'symlog'
+
+ +
+ +
+
+class psy_simple.plugin.CTicksType(method: psy_simple.plugin.CTicksMethod, N: int = None, percmin: float = 0, percmax: float = 100, vmin: float = None, vmax: float = None)
+

Bases: BoundsType

+

Attributes:

+ + + + + + +

method

+
+
+method: CTicksMethod
+
+ +
+ +
+
+class psy_simple.plugin.DictValValidator(key, valid, validators, default, ignorecase=False)
+

Bases: object

+

A validation class for formatoptions that expect dictionaries as values

+
+ +
+
+class psy_simple.plugin.LineWidthValidator(key, valid, ignorecase=False, *, _deprecated_since=None)
+

Bases: ValidateInStrings

+
+ +
+
+class psy_simple.plugin.TicksMethod(value)
+

Bases: strEnum

+

An enumeration.

+

Attributes:

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

data

day

hour

log

mid

minmax

month

monthbegin

monthend

rounded

roundedsym

sym

symlog

week

year

yearbegin

yearend

+
+
+data = 'data'
+
+ +
+
+day = 'day'
+
+ +
+
+hour = 'hour'
+
+ +
+
+log = 'log'
+
+ +
+
+mid = 'mid'
+
+ +
+
+minmax = 'minmax'
+
+ +
+
+month = 'month'
+
+ +
+
+monthbegin = 'monthbegin'
+
+ +
+
+monthend = 'monthend'
+
+ +
+
+rounded = 'rounded'
+
+ +
+
+roundedsym = 'roundedsym'
+
+ +
+
+sym = 'sym'
+
+ +
+
+symlog = 'symlog'
+
+ +
+
+week = 'week'
+
+ +
+
+year = 'year'
+
+ +
+
+yearbegin = 'yearbegin'
+
+ +
+
+yearend = 'yearend'
+
+ +
+ +
+
+class psy_simple.plugin.TicksType(method: psy_simple.plugin.TicksMethod, N: int = None, percmin: float = 0, percmax: float = 100, vmin: float = None, vmax: float = None)
+

Bases: BoundsType

+

Attributes:

+ + + + + + +

method

+
+
+method: TicksMethod
+
+ +
+ +
+
+class psy_simple.plugin.TicksValidator(key, valid, ignorecase=False, *, _deprecated_since=None)
+

Bases: ValidateInStrings

+
+ +
+
+class psy_simple.plugin.ValidateList(dtype=None, length=None, listtype=<class 'list'>)
+

Bases: object

+

Validate a list of the specified dtype

+

Attributes:

+ + + + + + +

dtype

data type (e.g. float) used for the conversion.

+
+
+dtype
+

data type (e.g. float) used for the conversion

+
+ +
+ +
+
+psy_simple.plugin.get_versions(requirements=True)
+
+ +
+
+psy_simple.plugin.patch_prior_1_0(plotter_d, versions)
+

Patch psy_simple plotters for versions smaller than 1.0

+

Before psyplot 1.0.0, the plotters in the psy_simple package where part of +the psyplot.plotter.simple module. This has to be corrected

+
+ +
+
+psy_simple.plugin.patches = {('psyplot.plotter.simple', 'BarPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'CombinedSimplePlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'DensityPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'DensityRegPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'LinRegPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'LinePlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'Simple2DPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'SimplePlotterBase'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'SimpleVectorPlotter'): <function patch_prior_1_0>, ('psyplot.plotter.simple', 'ViolinPlotter'): <function patch_prior_1_0>}
+

patches to apply when loading a project

+
+ +
+
+psy_simple.plugin.rcParams = {'colors.cmaps': {}, 'plotter.bar.alpha': 1.0, 'plotter.bar.categorical': None, 'plotter.bar.coord': None, 'plotter.bar.plot': 'bar', 'plotter.bar.widths': 'equal', 'plotter.baseplotter.background': 'rc', 'plotter.baseplotter.figtitle': '', 'plotter.baseplotter.figtitleprops': {}, 'plotter.baseplotter.figtitlesize': 12.0, 'plotter.baseplotter.figtitleweight': None, 'plotter.baseplotter.mask': None, 'plotter.baseplotter.maskbetween': None, 'plotter.baseplotter.maskgeq': None, 'plotter.baseplotter.maskgreater': None, 'plotter.baseplotter.maskleq': None, 'plotter.baseplotter.maskless': None, 'plotter.baseplotter.text': [], 'plotter.baseplotter.tight': False, 'plotter.baseplotter.title': '', 'plotter.baseplotter.titleprops': {}, 'plotter.baseplotter.titlesize': 'large', 'plotter.baseplotter.titleweight': None, 'plotter.combinedsimple.plot': 'mesh', 'plotter.combinedsimple.vbounds': [BoundsMethod.rounded, None, 0.0, 100.0, None, None], 'plotter.combinedsimple.vcbar': {'b'}, 'plotter.combinedsimple.vcbarspacing': 'uniform', 'plotter.combinedsimple.vclabel': '', 'plotter.combinedsimple.vclabelprops': {}, 'plotter.combinedsimple.vclabelsize': 'medium', 'plotter.combinedsimple.vclabelweight': None, 'plotter.combinedsimple.vcmap': 'white_blue_red', 'plotter.combinedsimple.vcticklabels': None, 'plotter.combinedsimple.vctickprops': {}, 'plotter.combinedsimple.vcticks': None, 'plotter.combinedsimple.vcticksize': 'medium', 'plotter.combinedsimple.vctickweight': None, 'plotter.combinedsimple.vplot': 'quiver', 'plotter.density.bins': 10, 'plotter.density.coord': None, 'plotter.density.density': 'hist', 'plotter.density.normed': None, 'plotter.density.precision': 0.0, 'plotter.density.xrange': ('minmax', 'minmax'), 'plotter.density.yrange': ('minmax', 'minmax'), 'plotter.fldmean.err_calc': 'std', 'plotter.fldmean.mean': 'mean', 'plotter.line.coord': None, 'plotter.line.error': 'fill', 'plotter.line.erroralpha': 0.15, 'plotter.line.linewidth': None, 'plotter.line.marker': None, 'plotter.line.markersize': None, 'plotter.line.plot': '-', 'plotter.plot2d.bounds': [BoundsMethod.rounded, None, 0.0, 100.0, None, None], 'plotter.plot2d.cbar': {'b'}, 'plotter.plot2d.cbarspacing': 'uniform', 'plotter.plot2d.clabel': '', 'plotter.plot2d.clabelprops': {}, 'plotter.plot2d.clabelsize': 'medium', 'plotter.plot2d.clabelweight': None, 'plotter.plot2d.cmap': 'white_blue_red', 'plotter.plot2d.cticklabels': None, 'plotter.plot2d.ctickprops': {}, 'plotter.plot2d.cticks': None, 'plotter.plot2d.cticksize': 'medium', 'plotter.plot2d.ctickweight': None, 'plotter.plot2d.datagrid': None, 'plotter.plot2d.extend': 'neither', 'plotter.plot2d.interp_bounds': None, 'plotter.plot2d.levels': None, 'plotter.plot2d.mask_datagrid': True, 'plotter.plot2d.miss_color': None, 'plotter.plot2d.plot': 'mesh', 'plotter.plot2d.plot.min_circle_ratio': 0.05, 'plotter.simple.axiscolor': {'bottom': None, 'left': None, 'right': None, 'top': None}, 'plotter.simple.color': None, 'plotter.simple.grid': False, 'plotter.simple.labelprops': {'x': {}, 'y': {}}, 'plotter.simple.labelsize': {'x': 'medium', 'y': 'medium'}, 'plotter.simple.labelweight': {'x': None, 'y': None}, 'plotter.simple.legend': {'loc': 1}, 'plotter.simple.legendlabels': '%(arr_name)s', 'plotter.simple.sym_lims': [None, None], 'plotter.simple.ticksize': {'major': 'medium'}, 'plotter.simple.tickweight': {'major': None}, 'plotter.simple.transpose': False, 'plotter.simple.xlabel': '', 'plotter.simple.xlim': ('rounded', 'rounded'), 'plotter.simple.xrotation': 0.0, 'plotter.simple.xticklabels': {'major': None}, 'plotter.simple.xtickprops': {'major': {}, 'minor': {}}, 'plotter.simple.xticks': {'major': None, 'minor': None}, 'plotter.simple.ylabel': '', 'plotter.simple.ylim': ('rounded', 'rounded'), 'plotter.simple.yrotation': 0.0, 'plotter.simple.yticklabels': {'major': None}, 'plotter.simple.ytickprops': {'major': {}, 'minor': {}}, 'plotter.simple.yticks': {'major': None, 'minor': None}, 'plotter.vector.arrowsize': None, 'plotter.vector.arrowstyle': '-|>', 'plotter.vector.color': 'k', 'plotter.vector.density': 1.0, 'plotter.vector.linewidth': None, 'plotter.vector.plot': 'quiver', 'plotter.violin.plot': True, 'project.plotters': {'barplot': {'default_slice': None, 'module': 'psy_simple.plotters', 'plotter_name': 'BarPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': True, 'summary': 'Make a bar plot of one-dimensional data'}, 'combined': {'default_dims': {'x': slice(None, None, None), 'y': slice(None, None, None)}, 'default_slice': 0, 'example_call': "filename, name=[['my_variable', ['u_var', 'v_var']]], ...", 'module': 'psy_simple.plotters', 'plotter_name': 'CombinedSimplePlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': True, 'summary': 'Plot a 2D scalar field with an overlying vector field'}, 'density': {'default_slice': None, 'module': 'psy_simple.plotters', 'plotter_name': 'DensityPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': False, 'summary': 'Make a density plot of point data'}, 'fldmean': {'default_slice': None, 'module': 'psy_simple.plotters', 'plotter_name': 'FldmeanPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': True, 'summary': 'Calculate and plot the mean over x- and y-dimensions'}, 'lineplot': {'default_slice': None, 'module': 'psy_simple.plotters', 'plotter_name': 'LinePlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': True, 'summary': 'Make a line plot of one-dimensional data'}, 'plot2d': {'default_dims': {'x': slice(None, None, None), 'y': slice(None, None, None)}, 'default_slice': 0, 'module': 'psy_simple.plotters', 'plotter_name': 'Simple2DPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': False, 'summary': 'Make a simple plot of a 2D scalar field'}, 'simple': {'module': 'psy_simple.plotters', 'plot_func': False, 'plotter_name': 'SimplePlotterBase', 'plugin': 'psy_simple.plugin', 'summary': 'All plotters that are visualized by the psy-simple package'}, 'vector': {'default_dims': {'x': slice(None, None, None), 'y': slice(None, None, None)}, 'default_slice': 0, 'example_call': "filename, name=[['u_var', 'v_var']], ...", 'module': 'psy_simple.plotters', 'plotter_name': 'SimpleVectorPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': False, 'summary': 'Make a simple plot of a 2D vector field'}, 'violinplot': {'default_slice': None, 'module': 'psy_simple.plotters', 'plotter_name': 'ViolinPlotter', 'plugin': 'psy_simple.plugin', 'prefer_list': True, 'summary': 'Make a violin plot of your data'}}, 'texts.default_position': [1.0, 1.0], 'texts.delimiter': ', ', 'texts.labels': {'desc': '%(long_name)s [%(units)s]', 'dinfo': '%B %d, %Y', 'dtinfo': '%B %d, %Y. %H:%M', 'sdesc': '%(name)s [%(units)s]', 'tinfo': '%H:%M'}, 'ticks.which': 'major', 'widgets.colors.cmaps': ['viridis', 'Reds', 'Blues', 'Greens', 'binary', 'RdBu', 'coolwarm', 'red_white_blue', 'winter', 'jet', 'white_blue_red', 'gist_ncar', 'gist_earth', 'Paired', 'gnuplot', 'gnuplot2']}
+

the RcParams for the psy-simple plugin

+
+ +
+
+class psy_simple.plugin.strEnum(value)
+

Bases: str, Enum

+

An enumeration.

+
+ +
+
+psy_simple.plugin.try_and_error(*funcs)
+

Apply multiple validation functions

+
+
Parameters:
+

*funcs – Validation functions to test

+
+
Return type:
+

function

+
+
+
+ +
+
+psy_simple.plugin.validate_alpha(val)
+

Validate an alpha value between 0 and 1

+
+ +
+
+psy_simple.plugin.validate_axiscolor(value)
+

Validate a dictionary containing axiscolor definitions

+
+
Parameters:
+

value (dict) – see psyplot.plotter.baseplotter.axiscolor

+
+
Return type:
+

dict

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_bool_maybe_none(value)
+
+ +
+
+psy_simple.plugin.validate_cbarpos(value)
+

Validate a colorbar position

+
+
Parameters:
+

value (bool or str) – A string can be a combination of ‘sh|sv|fl|fr|ft|fb|b|r’

+
+
Returns:
+

list of strings with possible colorbar positions

+
+
Return type:
+

list

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_cmap(val)
+

Validate a colormap

+
+
Parameters:
+

val (str or mpl.colors.Colormap)

+
+
Return type:
+

str or mpl.colors.Colormap

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_cmaps(cmaps)
+

Validate a dictionary of color lists

+
+
Parameters:
+

cmaps (dict) – a mapping from a colormap name to a list of colors

+
+
Raises:
+

ValueError – If one of the values in cmaps is not a color list

+
+
+

Notes

+

For all items (listname, list) in cmaps, the reversed list is +automatically inserted with the listname + '_r' key.

+
+ +
+
+psy_simple.plugin.validate_dataarray(val)
+
+ +
+
+psy_simple.plugin.validate_err_calc(val)
+

Validation function for the +psy_simple.plotter.FldmeanPlotter.err_calc formatoption

+
+ +
+
+psy_simple.plugin.validate_float(s)
+

convert s to float or raise

+
+
Returns:
+

s converted to a float

+
+
Return type:
+

float

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_fontweight(value)
+
+ +
+
+psy_simple.plugin.validate_iter(value)
+

Validate that the given value is an iterable

+
+ +
+
+psy_simple.plugin.validate_legend(value)
+
+ +
+
+psy_simple.plugin.validate_limits(value)
+
+ +
+
+psy_simple.plugin.validate_lineplot(value)
+

Validate the value for the LinePlotter.plot formatoption

+
+
Parameters:
+

value (None, str or list with mixture of both) – The value to validate

+
+
+
+ +
+
+psy_simple.plugin.validate_marker(val)
+

Does not really make a validation because markers can be quite of +different types

+
+ +
+
+psy_simple.plugin.validate_none(b)
+

Validate that None is given

+
+
Parameters:
+

b ({None, 'none'}) – None or string (the case is ignored)

+
+
Return type:
+

None

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_plot(val)
+
+ +
+
+psy_simple.plugin.validate_str(s)
+

Validate a string

+
+
Parameters:
+

s (str)

+
+
Return type:
+

str

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_sym_lims(val)
+
+ +
+
+psy_simple.plugin.validate_text(value)
+

Validate a text formatoption

+
+
Parameters:
+

value (see psyplot.plotter.labelplotter.text)

+
+
Raises:
+

ValueError

+
+
+
+ +
+
+psy_simple.plugin.validate_ticklabels(value)
+
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.widgets.colors.html b/api/psy_simple.widgets.colors.html new file mode 100644 index 00000000..741827ff --- /dev/null +++ b/api/psy_simple.widgets.colors.html @@ -0,0 +1,1204 @@ + + + + + + + <no title> — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +

Module for color specific widgets

+

This module corresponds to the psy_simple.colors module as a version for +the usage in the psyplot GUI.

+

Classes:

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

ArrayFmtWidget(parent[, array])

Fmt widget for psy_simple.plotters.DataTicksCalculator

BackGroundColorWidget(parent, fmto, project)

The widget to select the axes background color

BoundsFmtWidget(parent, fmto, project[, ...])

The widget for modifying the psy_simple.plotters.Bounds fmt

CMapFmtWidget(parent, fmto, project[, ...])

The widget for modifying the psy_simple.plotters.CMap fmt

CTicksFmtWidget(parent, fmto, project[, ...])

The formatoptions widget for the colorbar ticks.

CmapButton([cmaps, current])

A button with a dropdown menu to select colormaps

ColorLabel([color])

A QTableWidget with one cell and no headers to just display a color

ColormapDialog([names, N, editable])

A widget for selecting a colormap

ColormapModel([names, N])

A model for displaying colormaps

ColormapTable([names, N, editable])

A table for displaying colormaps

DataTicksCalculatorFmtWidget(parent[, ...])

Fmt widget for psy_simple.plotters.DataTicksCalculator

HighlightWidget

NormalizationWidget(parent, norm)

A simple widget representing a boundary norm

+

Functions:

+ + + + + + +

create_cmap_thumb(cmap[, output])

+
+
+class psy_simple.widgets.colors.ArrayFmtWidget(parent, array=None)
+

Bases: QWidget

+

Fmt widget for psy_simple.plotters.DataTicksCalculator

+

This formatoption widgets contains 3 line edits, one for the minimum, one +for the maximum and one for the step size. And a spin box for the number +of increments

+

Methods:

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

get_decimals(vmin, vmax)

set_array(*args, **kwargs)

set_obj()

toggle_txt_step(s)

+
+
+static get_decimals(vmin, vmax)
+
+ +
+
+set_array(*args, **kwargs)
+
+ +
+
+set_obj()
+
+ +
+
+toggle_txt_step(s)
+
+ +
+ +
+
+class psy_simple.widgets.colors.BackGroundColorWidget(parent, fmto, project)
+

Bases: QWidget

+

The widget to select the axes background color

+

Methods:

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

set_color(color)

set_transparent()

toggle_color_button()

+
+
+set_color(color)
+
+ +
+
+set_transparent()
+
+ +
+
+toggle_color_button()
+
+ +
+ +
+
+class psy_simple.widgets.colors.BoundsFmtWidget(parent, fmto, project, properties=True)
+

Bases: QWidget

+

The widget for modifying the psy_simple.plotters.Bounds fmt

+

Methods:

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

block_widgets(*widgets)

get_auto_discrete_array_widget()

get_discrete_array_widget()

get_norm_widget(norm)

refresh_current_widget()

refresh_methods(text)

set_obj(obj)

set_value(value)

+

Attributes:

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

current_widget

default_args

default_kws

methods

norm_map

+

Classes:

+ + + + + + +

methods_type

alias of BoundsType

+
+
+block_widgets(*widgets)
+
+ +
+
+current_widget = None
+
+ +
+
+default_args = {'power-law': [1.0], 'symlog': [0.001]}
+
+ +
+
+default_kws = {'symlog': {'base': 10}}
+
+ +
+
+get_auto_discrete_array_widget()
+
+ +
+
+get_discrete_array_widget()
+
+ +
+
+get_norm_widget(norm)
+
+ +
+
+methods = ['Discrete', 'Continuous']
+
+ +
+
+methods_type
+

alias of BoundsType +Attributes:

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

N

method

percmax

percmin

vmax

vmin

+
+ +
+
+norm_map = {'No normalization': <class 'matplotlib.colors.Normalize'>, 'log': <class 'matplotlib.colors.LogNorm'>, 'power-law': <class 'matplotlib.colors.PowerNorm'>, 'symlog': <class 'matplotlib.colors.SymLogNorm'>}
+
+ +
+
+refresh_current_widget()
+
+ +
+
+refresh_methods(text)
+
+ +
+
+set_obj(obj)
+
+ +
+
+set_value(value)
+
+ +
+ +
+
+class psy_simple.widgets.colors.CMapFmtWidget(parent, fmto, project, properties=True)
+

Bases: QWidget

+

The widget for modifying the psy_simple.plotters.CMap fmt

+

Methods:

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

choose_cmap([cmap])

edit_cmap()

invert_cmap()

refresh_cb_invert(obj)

set_obj(obj)

+
+
+choose_cmap(cmap=None)
+
+ +
+
+edit_cmap()
+
+ +
+
+invert_cmap()
+
+ +
+
+refresh_cb_invert(obj)
+
+ +
+
+set_obj(obj)
+
+ +
+ +
+
+class psy_simple.widgets.colors.CTicksFmtWidget(parent, fmto, project, properties=True)
+

Bases: BoundsFmtWidget

+

The formatoptions widget for the colorbar ticks.

+

Attributes:

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

auto_val

methods

norm_map

+

Classes:

+ + + + + + +

methods_type

alias of CTicksType

+

Methods:

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

refresh_current_widget()

refresh_methods(text)

set_value(value)

+
+
+auto_val = None
+
+ +
+
+methods = ['Discrete', 'Auto']
+
+ +
+
+methods_type
+

alias of CTicksType +Attributes:

+ + + + + + +

method

+
+ +
+
+norm_map = {}
+
+ +
+
+refresh_current_widget()
+
+ +
+
+refresh_methods(text)
+
+ +
+
+set_value(value)
+
+ +
+ +
+
+class psy_simple.widgets.colors.CmapButton(cmaps=None, current=None, *args, **kwargs)
+

Bases: QToolButton

+

A button with a dropdown menu to select colormaps

+

Attributes:

+ + + + + + +

colormap_changed(*args, **kwargs)

+

Methods:

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

open_cmap_dialog([N])

set_cmap(cmap)

setup_cmap_menu()

+
+
+colormap_changed(*args, **kwargs)
+
+ +
+
+open_cmap_dialog(N=10)
+
+ +
+
+set_cmap(cmap)
+
+ +
+
+setup_cmap_menu()
+
+ +
+ +
+
+class psy_simple.widgets.colors.ColorLabel(color='w', *args, **kwargs)
+

Bases: QTableWidget

+

A QTableWidget with one cell and no headers to just display a color

+

Methods:

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

adjust_height()

Adjust the height to match the row height

select_color(*args)

Select a color using PyQt5.QtWidgets.QColorDialog.getColor()

setEnabled(self, a0)

set_color(color)

Set the color of the label

sizeHint()

Reimplemented to use the rowHeight as height

+

Attributes:

+ + + + + + + + + +

color

QtCore.QColor.

color_changed(*args, **kwargs)

a signal that is emitted with an rgba color if the chosen color changes

+
+
+adjust_height()
+

Adjust the height to match the row height

+
+ +
+
+color = None
+

QtCore.QColor. The current color that is displayed

+
+ +
+
+color_changed(*args, **kwargs)
+

a signal that is emitted with an rgba color if the chosen color changes

+
+ +
+
+select_color(*args)
+

Select a color using PyQt5.QtWidgets.QColorDialog.getColor()

+
+ +
+
+setEnabled(self, a0: bool)
+
+ +
+
+set_color(color)
+

Set the color of the label

+

This method sets the given color as background color for the cell +and emits the color_changed signal

+
+
Parameters:
+

color (object) – Either a QtGui.QColor object or a color that can be converted +to RGBA using the matplotlib.colors.to_rgba() function

+
+
+
+ +
+
+sizeHint()
+

Reimplemented to use the rowHeight as height

+
+ +
+ +
+
+class psy_simple.widgets.colors.ColormapDialog(names=[], N=10, editable=True, *args, **kwargs)
+

Bases: QDialog

+

A widget for selecting a colormap

+

Methods:

+ + + + + + + + + +

get_colormap([names, N])

Open a ColormapDialog and get a colormap

show_colormap([names, N, show])

Show a colormap dialog

+
+
+classmethod get_colormap(names=[], N=10, *args, **kwargs)
+

Open a ColormapDialog and get a colormap

+
+
Parameters:
+
    +
  • ``*args

    Anything else that is passed to the ColormapDialog

    +

  • +
  • **kwargs`` – Anything else that is passed to the ColormapDialog

  • +
+
+
Returns:
+

Either the name of a standard colormap available via +psy_simple.colors.get_cmap() or a colormap

+
+
Return type:
+

str or matplotlib.colors.Colormap

+
+
+
+ +
+
+classmethod show_colormap(names=[], N=10, show=True, *args, **kwargs)
+

Show a colormap dialog

+
+
Parameters:
+
    +
  • *args (str or matplotlib.colors.Colormap) –

    If a colormap, it returned unchanged.

    +
    +

    Strings may be any valid colormap name suitable for the +matplotlib.cm.get_cmap() function or one of the color lists +defined in the ‘colors.cmaps’ key of the psyplot.rcParams +dictionary (including their reversed color maps given via the ‘_r’ +extension).

    +
    +

  • +
  • N (int, optional) – Default: 11. The number of increments in the colormap.

  • +
  • show (bool, optional) – Default: True. If True, show the created figure at the end with +pyplot.show(block=False)

  • +
+
+
+
+ +
+ +
+
+class psy_simple.widgets.colors.ColormapModel(names=[], N=10, *args, **kwargs)
+

Bases: QAbstractTableModel

+

A model for displaying colormaps

+

Methods:

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

columnCount(self[, parent])

data(index[, role])

Cell content

headerData(section, orientation[, role])

Set header data

reset()

rowCount(self[, parent])

set_colors([N, names])

+
+
+columnCount(self, parent: QModelIndex = QModelIndex()) int
+
+ +
+
+data(index, role=0)
+

Cell content

+
+ +
+
+headerData(section, orientation, role=0)
+

Set header data

+
+ +
+
+reset()
+
+ +
+
+rowCount(self, parent: QModelIndex = QModelIndex()) int
+
+ +
+
+set_colors(N=None, names=None)
+
+ +
+ +
+
+class psy_simple.widgets.colors.ColormapTable(names=[], N=10, editable=True, *args, **kwargs)
+

Bases: QTableView

+

A table for displaying colormaps

+

Methods:

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

change_color(index)

columnCount()

rowCount()

setModel(self, model)

+

Attributes:

+ + + + + + +

chosen_colormap

+
+
+change_color(index)
+
+ +
+
+property chosen_colormap
+
+ +
+
+columnCount()
+
+ +
+
+rowCount()
+
+ +
+
+setModel(self, model: QAbstractItemModel | None)
+
+ +
+ +
+
+class psy_simple.widgets.colors.DataTicksCalculatorFmtWidget(parent, method=None, methods_type=<class 'psy_simple.plugin.BoundsType'>)
+

Bases: QWidget

+

Fmt widget for psy_simple.plotters.DataTicksCalculator

+

This widget contains a combo box with the different options from the +psy_simple.plotters.DataTicksCalculator.calc_funcs, a spin box +for the number of increments and two text widgets for minimum and maximum +percentile

+

Methods:

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

get_decimals(vmin, vmax)

refresh(method, fmto)

set_obj()

+
+
+static get_decimals(vmin, vmax)
+
+ +
+
+refresh(method, fmto)
+
+ +
+
+set_obj()
+
+ +
+ +
+
+class psy_simple.widgets.colors.HighlightWidget
+

Bases: QWidget

+

Methods:

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

enterEvent(self, a0)

leaveEvent(self, a0)

set_highlighted(b)

+
+
+enterEvent(self, a0: QEvent | None)
+
+ +
+
+leaveEvent(self, a0: QEvent | None)
+
+ +
+
+set_highlighted(b)
+
+ +
+ +
+
+class psy_simple.widgets.colors.NormalizationWidget(parent, norm)
+

Bases: QWidget

+

A simple widget representing a boundary norm

+

Methods:

+ + + + + + + + + +

fill_from_norm()

set_obj()

+
+
+fill_from_norm()
+
+ +
+
+set_obj()
+
+ +
+ +
+
+psy_simple.widgets.colors.create_cmap_thumb(cmap, output=None)
+
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.widgets.html b/api/psy_simple.widgets.html new file mode 100644 index 00000000..4dca2c17 --- /dev/null +++ b/api/psy_simple.widgets.html @@ -0,0 +1,512 @@ + + + + + + + psy_simple.widgets package — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psy_simple.widgets package

+

Module for PyQt4/PyQt5 widgets for modifying the formatoptions

+

This module contains widgets that are inserted in the psyplot GUI. Submodules +are

+ +

Classes:

+ + + + + + +

Switch2FmtButton(parent, *fmtos)

A button that contains a menu to switch to other formatoptions

+

Functions:

+ + + + + + +

get_icon(fname[, ending])

+
+
+class psy_simple.widgets.Switch2FmtButton(parent, *fmtos)
+

Bases: QToolButton

+

A button that contains a menu to switch to other formatoptions

+
+ +
+
+psy_simple.widgets.get_icon(fname, ending='.png')
+
+ +
+

Submodules

+
+ +
+
+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/api/psy_simple.widgets.texts.html b/api/psy_simple.widgets.texts.html new file mode 100644 index 00000000..855cdb80 --- /dev/null +++ b/api/psy_simple.widgets.texts.html @@ -0,0 +1,558 @@ + + + + + + + <no title> — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+ +
+
+ +

Psyplot GUI widgets for modifying label formatoptions

+

This module contains PyQt widgets that can be used to modify label +formatoptions (e.g. title, xlabel, titleprops, etc.) in the psyplot GUI.

+

Classes:

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

DictCombo(attrs, fmt_widget[, modulo_style])

A combobox that inserts keys into the formatoption

FontPropertiesWidget(parent, fmto[, artist, ...])

A widget for modifying the font properties or a label

FontSizeWidget(parent, fmto[, artist, base])

A widget for modifying the fontsize of a label

FontWeightWidget(parent, fmto[, artist, base])

A widget for modifying the fontweight of a label

LabelWidget(parent, fmto, project[, properties])

A widget to modify a text label (title, xlabel, etc.)

+

Functions:

+ + + + + + +

mpl_weight2qt(weight)

Convert a weight from matplotlib definition to a Qt weight

+
+
+class psy_simple.widgets.texts.DictCombo(attrs, fmt_widget, modulo_style=True)
+

Bases: QComboBox

+

A combobox that inserts keys into the formatoption

+

Methods:

+ + + + + + + + + +

insert_bracketed(s)

insert_modulo(s)

+
+
+insert_bracketed(s)
+
+ +
+
+insert_modulo(s)
+
+ +
+ +
+
+class psy_simple.widgets.texts.FontPropertiesWidget(parent, fmto, artist=None, base=None)
+

Bases: QWidget

+

A widget for modifying the font properties or a label

+

Methods:

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

artist_to_qfont(artist)

Convert a matplotlib.text.Text artist to a QFont object

choose_color([color])

choose_font([font])

Choose a font for the label through a dialog

load_properties()

modify_size(val)

qfont_to_artist_props(font)

refresh()

Refresh the widgets from the current font

toggle_bold()

toggle_italic()

+

Attributes:

+ + + + + + +

current_font

The current QFont of the artist

+
+
+static artist_to_qfont(artist)
+

Convert a matplotlib.text.Text artist to a QFont object

+
+
Parameters:
+

artist (matplotlib.text.Text) – The text artist, e.g. an axes title

+
+
Returns:
+

The QFont object

+
+
Return type:
+

PyQt5.QtGui.QFont

+
+
+
+ +
+
+choose_color(color=None)
+
+ +
+
+choose_font(font=None)
+

Choose a font for the label through a dialog

+
+ +
+
+current_font = None
+

The current QFont of the artist

+
+ +
+
+load_properties()
+
+ +
+
+modify_size(val)
+
+ +
+
+static qfont_to_artist_props(font)
+
+ +
+
+refresh()
+

Refresh the widgets from the current font

+
+ +
+
+toggle_bold()
+
+ +
+
+toggle_italic()
+
+ +
+ +
+
+class psy_simple.widgets.texts.FontSizeWidget(parent, fmto, artist=None, base=None)
+

Bases: QWidget

+

A widget for modifying the fontsize of a label

+
+ +
+
+class psy_simple.widgets.texts.FontWeightWidget(parent, fmto, artist=None, base=None)
+

Bases: QWidget

+

A widget for modifying the fontweight of a label

+
+ +
+
+class psy_simple.widgets.texts.LabelWidget(parent, fmto, project, properties=True)
+

Bases: QWidget

+

A widget to modify a text label (title, xlabel, etc.)

+

This widget contains one combobox for the 'labels' key in the +psyplot.rcParams dictionary, and a second combobox for the +enhanced attributes of the corresponding formatoption object fmto.

+

Additionally, it provides buttons to switch to the formatoption options +of the corresponding fontsize, fontweight and fontproperties of this +label

+
+ +
+
+psy_simple.widgets.texts.mpl_weight2qt(weight)
+

Convert a weight from matplotlib definition to a Qt weight

+
+
Parameters:
+

weight (int or string) – Either an integer between 1 and 1000 or a string out of +weights_mpl2qt

+
+
Returns:
+

One type of the PyQt5.QtGui.QFont.Weight

+
+
Return type:
+

int

+
+
+
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/changelog.html b/changelog.html new file mode 100644 index 00000000..449d9500 --- /dev/null +++ b/changelog.html @@ -0,0 +1,531 @@ + + + + + + + Changelog — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Changelog

+
+

v1.5.1

+

regular update for matplotlib 3.9

+
+

Added

+
    +
  • add tests for mpl 3.9, see !43

  • +
+
+
+

Known issues

+
    +
  • the colorbar tests as updating the colorbar is currently broken with matplotlib 3.9, see #35

  • +
+
+
+
+

v1.5.0

+

Compatibility fixes and code formatting

+
+

Changed

+
    +
  • migrate to psyplot-plugin-template, see !36

  • +
  • Update psyplot min version, see !41

  • +
+
+
+

Fixed

+
    +
  • fixed compatiblity with latest matplotlib version, see !38

  • +
  • fix image comparison and add reference and test images as CI artifacts, see !37

  • +
+
+
+
+

v1.4.1

+

Compatibility fixes

+
+

Changed

+
    +
  • We now use the new convert_coordinate method that has been introduced +with psyplot v1.4.1 (see +psyplot/psyplot#39 and +#30)

  • +
+
+
+

Fixed

+
    +
  • psy-simple is now compatible with matplotlib 3.5 (see +#31)

  • +
+
+
+
+

v1.4.0

+

Compatibility fixes and LGPL license

+

As with psyplot 1.4.0, psy-simple is now continuously tested and deployed with +CircleCI.

+
+

Fixed

+
    +
  • Compatibility fixes for matplotlib>=3.3

  • +
+
+
+

Added

+ +
+
+

Changed

+
    +
  • psy-simple is now officially licensed under LGPL-3.0-only, +see #28

  • +
  • We use CicleCI now for a standardized CI/CD pipeline to build and test +the code and docs all at one place, see #27

  • +
+
+
+
+

v1.3.1

+

Patch for plotting the polygons with 3D bounds

+
+

Changed

+
    +
  • the values 'tri', 'tricontour' and 'tricontourf' for the plot +formatoptions have been depreceated and should be replaced by 'poly', +'contour' and 'contourf' respectively, see +#23

  • +
+
+
+

Fixed

+
    +
  • A bug was fixed with the extend formatoption if plot=None, see +#20

  • +
  • variables with 3D bounds are now interpreted correctly, see +#24

  • +
+
+
+
+

v1.3.0

+

New background and mask formatoptions and more options for colorbar bounds

+
+

Added

+
    +
  • a new background formatoption has been implemented that allows to set the +facecolor of the axes (i.e. the background color for the plot)

  • +
  • a new mask formatoption has been implemented that allows to mask the +data based on a mask that can either be in the dataset or in a separate +file (see #15)

  • +
  • the bounds and other ticks (e.g. xticks, yticks, cticks) +formatoptions have gained multiple new values (all backwards-compatible, see +#13):

    +
      +
    • they now support discrete logarithmic and symmetric bounds/ticks via +bounds='log' and bounds='symlog'.

    • +
    • The bounds and other tick formatoptions (xticks, cticks, yticks, etc.) now +support a dictionary as a value, e.g.:

      +
      plotter.update(bounds={'method': 'rounded', 'percmin': 5})
      +
      +
      +
    • +
    • You can specify vmin and vmax for color bounds and ticks which +prevents their automatic estimation, e.g. via:

      +
      plotter.update(bounds={'method': 'rounded', 'vmin': 50, 'vmax': 75})
      +# or
      +plotter.update(bounds=['rounded', None, None, None, 50, 75])
      +
      +
      +
    • +
    +
  • +
+
+
+

Changed

+
    +
  • values in the statusbar are only shown, if the drawn artist contains the +cursor position, see #18

  • +
  • psy-simple now requires matplotlib greater or equal than 2.0

  • +
  • psy-simple has been moved from https://github.com/Chilipp/psy-simple to https://github.com/psyplot/psy-simple, +see #7

  • +
  • The color handling of the color formatoption has been changed to allow +appending of new data. The colors attribute can be extended by the +color_cycle using the extended_colors attribute (see +#10)

  • +
+
+
+

Fixed

+
    +
  • Fixed a bug to calculate color bounds for uniform data, +see #9

  • +
  • An issue has been fixed with the setting of colorbar ticks after updating +the colorbar bounds (see #13)

  • +
+
+
+
+

v1.2.0

+
+

Added

+
    +
  • The plot2d plotmethod now also supports unstructured data of any shape +(see issue#6)

  • +
  • Added a categorical formatoption to the barplot plot method to allow +a switch between categorical and non-categorical plots

  • +
  • The lineplot method now also support 'stacked' plots

  • +
+
+
+
+

v1.1.0

+
+

Added

+
    +
  • Changelog

  • +
  • interp_bounds formatoption for the plot2d plot method (see the +docs)

  • +
  • Added the fldmean plot method that can be used to directly calculate and +plot the mean over the x- and y-dimensions

  • +
+
+
+

Changed

+
    +
  • The xlim and ylim formatoptions now consider inverted x- and y-axes

  • +
+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/ci/matrix/default/Pipfile b/ci/matrix/default/Pipfile deleted file mode 100644 index 537e1a68..00000000 --- a/ci/matrix/default/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} - - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.9" diff --git a/ci/matrix/mpl_35_py39/Pipfile b/ci/matrix/mpl_35_py39/Pipfile deleted file mode 100644 index 12be59a9..00000000 --- a/ci/matrix/mpl_35_py39/Pipfile +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.5.*" -numpy = "<2.0.0" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.9" diff --git a/ci/matrix/mpl_35_py39/Pipfile.lock b/ci/matrix/mpl_35_py39/Pipfile.lock deleted file mode 100644 index 93a160bf..00000000 --- a/ci/matrix/mpl_35_py39/Pipfile.lock +++ /dev/null @@ -1,2006 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "e18d0d9fced76abde4cc45210a8113dc9dcde21c406ff4b105dfd25984ce40d6" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.9" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "exceptiongroup": { - "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" - ], - "markers": "python_version < '3.11'", - "version": "==1.2.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.10'", - "version": "==8.0.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", - "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397" - ], - "markers": "python_version >= '3.9'", - "version": "==8.18.1" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:0bcdfcb0f976e1bac6721d7d457c17be23cf7501f977b6a38f9d38a3762841f7", - "sha256:1e64ac9be9da6bfff0a732e62116484b93b02a0b4d4b19934fb4f8e7ad26ad6a", - "sha256:22227c976ad4dc8c5a5057540421f0d8708c6560744ad2ad638d48e2984e1dbc", - "sha256:2886cc009f40e2984c083687251821f305d811d38e3df8ded414265e4583f0c5", - "sha256:2e6d184ebe291b9e8f7e78bbab7987d269c38ea3e062eace1fe7d898042ef804", - "sha256:3211ba82b9f1518d346f6309df137b50c3dc4421b4ed4815d1d7eadc617f45a1", - "sha256:339cac48b80ddbc8bfd05daae0a3a73414651a8596904c2a881cfd1edb65f26c", - "sha256:35a8ad4dddebd51f94c5d24bec689ec0ec66173bf614374a1244c6241c1595e0", - "sha256:3b4fa56159dc3c7f9250df88f653f085068bcd32dcd38e479bba58909254af7f", - "sha256:43e9d3fa077bf0cc95ded13d331d2156f9973dce17c6f0c8b49ccd57af94dbd9", - "sha256:57f1b4e69f438a99bb64d7f2c340db1b096b41ebaa515cf61ea72624279220ce", - "sha256:5c096363b206a3caf43773abebdbb5a23ea13faef71d701b21a9c27fdcef72f4", - "sha256:6bb93a0492d68461bd458eba878f52fdc8ac7bdb6c4acdfe43dba684787838c2", - "sha256:6ea6aef5c4338e58d8d376068e28f80a24f54e69f09479d1c90b7172bad9f25b", - "sha256:6fe807e8a22620b4cd95cfbc795ba310dc80151d43b037257250faf0bfcd82bc", - "sha256:73dd93dc35c85dece610cca8358003bf0760d7986f70b223e2306b4ea6d1406b", - "sha256:839d47b8ead7ad9669aaacdbc03f29656dc21f0d41a6fea2d473d856c39c8b1c", - "sha256:874df7505ba820e0400e7091199decf3ff1fde0583652120c50cd60d5820ca9a", - "sha256:879c7e5fce4939c6aa04581dfe08d57eb6102a71f2e202e3314d5fbc072fd5a0", - "sha256:94ff86af56a3869a4ae26a9637a849effd7643858a1a04dd5ee50e9ab75069a7", - "sha256:99482b83ebf4eb6d5fc6813d7aacdefdd480f0d9c0b52dcf9f1cc3b2c4b3361a", - "sha256:9ab29589cef03bc88acfa3a1490359000c18186fc30374d8aa77d33cc4a51a4a", - "sha256:9befa5954cdbc085e37d974ff6053da269474177921dd61facdad8023c4aeb51", - "sha256:a206a1b762b39398efea838f528b3a6d60cdb26fe9d58b48265787e29cd1d693", - "sha256:ab8d26f07fe64f6f6736d635cce7bfd7f625320490ed5bfc347f2cdb4fae0e56", - "sha256:b28de401d928890187c589036857a270a032961411934bdac4cf12dde3d43094", - "sha256:b428076a55fb1c084c76cb93e68006f27d247169f056412607c5c88828d08f88", - "sha256:bf618a825deb6205f015df6dfe6167a5d9b351203b03fab82043ae1d30f16511", - "sha256:c995f7d9568f18b5db131ab124c64e51b6820a92d10246d4f2b3f3a66698a15b", - "sha256:cd45a6f3e93a780185f70f05cf2a383daed13c3489233faad83e81720f7ede24", - "sha256:d2484b350bf3d32cae43f85dcfc89b3ed7bd2bcd781ef351f93eb6fb2cc483f9", - "sha256:d62880e1f60e5a30a2a8484432bcb3a5056969dc97258d7326ad465feb7ae069", - "sha256:dacddf5bfcec60e3f26ec5c0ae3d0274853a258b6c3fc5ef2f06a8eb23e042be", - "sha256:f3840c280ebc87a48488a46f760ea1c0c0c83fcf7abbe2e6baf99d033fd35fd8", - "sha256:f814504e459c68118bf2246a530ed953ebd18213dc20e3da524174d84ed010b2" - ], - "index": "pypi", - "markers": "python_version >= '3.7'", - "version": "==3.5.3" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", - "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", - "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", - "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", - "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", - "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", - "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", - "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", - "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", - "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", - "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", - "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", - "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", - "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", - "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", - "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", - "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", - "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", - "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", - "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", - "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", - "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", - "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", - "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", - "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", - "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", - "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", - "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", - "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", - "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", - "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", - "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", - "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", - "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", - "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", - "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.26.4" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", - "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", - "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", - "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", - "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", - "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", - "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", - "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", - "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", - "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", - "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", - "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", - "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", - "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", - "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", - "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", - "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", - "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", - "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", - "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", - "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", - "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", - "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", - "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", - "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.13.1" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version < '3.10'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version >= '3.8'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_35_py39/Pipfile.lock.license b/ci/matrix/mpl_35_py39/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_35_py39/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_36_py310/Pipfile b/ci/matrix/mpl_36_py310/Pipfile deleted file mode 100644 index 7cd7c6da..00000000 --- a/ci/matrix/mpl_36_py310/Pipfile +++ /dev/null @@ -1,25 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.6.*" -numpy = "<2.0.0" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.10" diff --git a/ci/matrix/mpl_36_py310/Pipfile.lock b/ci/matrix/mpl_36_py310/Pipfile.lock deleted file mode 100644 index 70f369e2..00000000 --- a/ci/matrix/mpl_36_py310/Pipfile.lock +++ /dev/null @@ -1,2062 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "85611386fdfbada74a584fa37f229346e9ec8834755f80b32bf8dd41957bb502" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "exceptiongroup": { - "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" - ], - "markers": "python_version < '3.11'", - "version": "==1.2.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.12'", - "version": "==8.0.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:01b7f521a9a73c383825813af255f8c4485d1706e4f3e2ed5ae771e4403a40ab", - "sha256:11011c97d62c1db7bc20509572557842dbb8c2a2ddd3dd7f20501aa1cde3e54e", - "sha256:1183877d008c752d7d535396096c910f4663e4b74a18313adee1213328388e1e", - "sha256:12f999661589981e74d793ee2f41b924b3b87d65fd929f6153bf0f30675c59b1", - "sha256:1c235bf9be052347373f589e018988cad177abb3f997ab1a2e2210c41562cc0c", - "sha256:1f4d69707b1677560cd952544ee4962f68ff07952fb9069ff8c12b56353cb8c9", - "sha256:1fcc4cad498533d3c393a160975acc9b36ffa224d15a6b90ae579eacee5d8579", - "sha256:2787a16df07370dcba385fe20cdd0cc3cfaabd3c873ddabca78c10514c799721", - "sha256:29f17b7f2e068dc346687cbdf80b430580bab42346625821c2d3abf3a1ec5417", - "sha256:38d38cb1ea1d80ee0f6351b65c6f76cad6060bbbead015720ba001348ae90f0c", - "sha256:3f56a7252eee8f3438447f75f5e1148a1896a2756a92285fe5d73bed6deebff4", - "sha256:5223affa21050fb6118353c1380c15e23aedfb436bf3e162c26dc950617a7519", - "sha256:57ad1aee29043163374bfa8990e1a2a10ff72c9a1bfaa92e9c46f6ea59269121", - "sha256:59400cc9451094b7f08cc3f321972e6e1db4cd37a978d4e8a12824bf7fd2f03b", - "sha256:68d94a436f62b8a861bf3ace82067a71bafb724b4e4f9133521e4d8012420dd7", - "sha256:6adc441b5b2098a4b904bbf9d9e92fb816fef50c55aa2ea6a823fc89b94bb838", - "sha256:6d81b11ede69e3a751424b98dc869c96c10256b2206bfdf41f9c720eee86844c", - "sha256:73b93af33634ed919e72811c9703e1105185cd3fb46d76f30b7f4cfbbd063f89", - "sha256:77b384cee7ab8cf75ffccbfea351a09b97564fc62d149827a5e864bec81526e5", - "sha256:79e501eb847f4a489eb7065bb8d3187117f65a4c02d12ea3a19d6c5bef173bcc", - "sha256:809119d1cba3ece3c9742eb01827fe7a0e781ea3c5d89534655a75e07979344f", - "sha256:80c166a0e28512e26755f69040e6bf2f946a02ffdb7c00bf6158cca3d2b146e6", - "sha256:81b409b2790cf8d7c1ef35920f01676d2ae7afa8241844e7aa5484fdf493a9a0", - "sha256:994637e2995b0342699b396a320698b07cd148bbcf2dd2fa2daba73f34dd19f2", - "sha256:9ceebaf73f1a3444fa11014f38b9da37ff7ea328d6efa1652241fe3777bfdab9", - "sha256:9fb8fb19d03abf3c5dab89a8677e62c4023632f919a62b6dd1d6d2dbf42cd9f5", - "sha256:acc3b1a4bddbf56fe461e36fb9ef94c2cb607fc90d24ccc650040bfcc7610de4", - "sha256:bbddfeb1495484351fb5b30cf5bdf06b3de0bc4626a707d29e43dfd61af2a780", - "sha256:bbf269e1d24bc25247095d71c7a969813f7080e2a7c6fa28931a603f747ab012", - "sha256:bebcff4c3ed02c6399d47329f3554193abd824d3d53b5ca02cf583bcd94470e2", - "sha256:c3f08df2ac4636249b8bc7a85b8b82c983bef1441595936f62c2918370ca7e1d", - "sha256:ca94f0362f6b6f424b555b956971dcb94b12d0368a6c3e07dc7a40d32d6d873d", - "sha256:d00c248ab6b92bea3f8148714837937053a083ff03b4c5e30ed37e28fc0e7e56", - "sha256:d2cfaa7fd62294d945b8843ea24228a27c8e7c5b48fa634f3c168153b825a21b", - "sha256:d5f18430f5cfa5571ab8f4c72c89af52aa0618e864c60028f11a857d62200cba", - "sha256:debeab8e2ab07e5e3dac33e12456da79c7e104270d2b2d1df92b9e40347cca75", - "sha256:dfba7057609ca9567b9704626756f0142e97ec8c5ba2c70c6e7bd1c25ef99f06", - "sha256:e0a64d7cc336b52e90f59e6d638ae847b966f68582a7af041e063d568e814740", - "sha256:eb9421c403ffd387fbe729de6d9a03005bf42faba5e8432f4e51e703215b49fc", - "sha256:faff486b36530a836a6b4395850322e74211cd81fc17f28b4904e1bd53668e3e", - "sha256:ff2aa84e74f80891e6bcf292ebb1dd57714ffbe13177642d65fee25384a30894" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.6.3" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", - "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", - "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", - "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", - "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", - "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", - "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", - "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", - "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", - "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", - "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", - "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", - "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", - "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", - "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", - "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", - "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", - "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", - "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", - "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", - "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", - "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", - "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", - "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", - "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", - "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", - "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", - "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", - "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", - "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", - "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", - "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", - "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", - "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", - "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", - "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==1.26.4" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version >= '3.8'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_36_py310/Pipfile.lock.license b/ci/matrix/mpl_36_py310/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_36_py310/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_37_py311/Pipfile b/ci/matrix/mpl_37_py311/Pipfile deleted file mode 100644 index 542a24f5..00000000 --- a/ci/matrix/mpl_37_py311/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.7.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.11" diff --git a/ci/matrix/mpl_37_py311/Pipfile.lock b/ci/matrix/mpl_37_py311/Pipfile.lock deleted file mode 100644 index b34d9ecf..00000000 --- a/ci/matrix/mpl_37_py311/Pipfile.lock +++ /dev/null @@ -1,2051 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "08e9040b3747d0a4e08f2da3cb6041edd08d0a8255ea49e181007a349a1469d8" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.11" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.12'", - "version": "==8.0.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:039ad54683a814002ff37bf7981aa1faa40b91f4ff84149beb53d1eb64617980", - "sha256:068ebcc59c072781d9dcdb82f0d3f1458271c2de7ca9c78f5bd672141091e9e1", - "sha256:084f1f0f2f1010868c6f1f50b4e1c6f2fb201c58475494f1e5b66fed66093647", - "sha256:090964d0afaff9c90e4d8de7836757e72ecfb252fb02884016d809239f715651", - "sha256:0ccb830fc29442360d91be48527809f23a5dcaee8da5f4d9b2d5b867c1b087b8", - "sha256:1210b7919b4ed94b5573870f316bca26de3e3b07ffdb563e79327dc0e6bba515", - "sha256:167200ccfefd1674b60e957186dfd9baf58b324562ad1a28e5d0a6b3bea77905", - "sha256:1dbcca4508bca7847fe2d64a05b237a3dcaec1f959aedb756d5b1c67b770c5ee", - "sha256:1e4e9a868e8163abaaa8259842d85f949a919e1ead17644fb77a60427c90473c", - "sha256:1e5c971558ebc811aa07f54c7b7c677d78aa518ef4c390e14673a09e0860184a", - "sha256:20da7924a08306a861b3f2d1da0d1aa9a6678e480cf8eacffe18b565af2813e7", - "sha256:29b058738c104d0ca8806395f1c9089dfe4d4f0f78ea765c6c704469f3fffc81", - "sha256:2a9a3f4d6a7f88a62a6a18c7e6a84aedcaf4faf0708b4ca46d87b19f1b526f88", - "sha256:2b6aa62adb6c268fc87d80f963aca39c64615c31830b02697743c95590ce3fbb", - "sha256:34bceb9d8ddb142055ff27cd7135f539f2f01be2ce0bafbace4117abe58f8fe4", - "sha256:3785bfd83b05fc0e0c2ae4c4a90034fe693ef96c679634756c50fe6efcc09856", - "sha256:3b15c4c2d374f249f324f46e883340d494c01768dd5287f8bc00b65b625ab56c", - "sha256:3d028555421912307845e59e3de328260b26d055c5dac9b182cc9783854e98fb", - "sha256:4a87b69cb1cb20943010f63feb0b2901c17a3b435f75349fd9865713bfa63925", - "sha256:4cdf4ef46c2a1609a50411b66940b31778db1e4b73d4ecc2eaa40bd588979b13", - "sha256:4d742ccd1b09e863b4ca58291728db645b51dab343eebb08d5d4b31b308296ce", - "sha256:4ddf7fc0e0dc553891a117aa083039088d8a07686d4c93fb8a810adca68810af", - "sha256:53e64522934df6e1818b25fd48cf3b645b11740d78e6ef765fbb5fa5ce080d02", - "sha256:5e7cc3078b019bb863752b8b60e8b269423000f1603cb2299608231996bd9d54", - "sha256:6738c89a635ced486c8a20e20111d33f6398a9cbebce1ced59c211e12cd61455", - "sha256:6b641b48c6819726ed47c55835cdd330e53747d4efff574109fd79b2d8a13748", - "sha256:743b1c488ca6a2bc7f56079d282e44d236bf375968bfd1b7ba701fd4d0fa32d6", - "sha256:9fc6fcfbc55cd719bc0bfa60bde248eb68cf43876d4c22864603bdd23962ba25", - "sha256:a99866267da1e561c7776fe12bf4442174b79aac1a47bd7e627c7e4d077ebd83", - "sha256:b45c9798ea6bb920cb77eb7306409756a7fab9db9b463e462618e0559aecb30e", - "sha256:b9b3fd853d4a7f008a938df909b96db0b454225f935d3917520305b90680579c", - "sha256:c5a2134162273eb8cdfd320ae907bf84d171de948e62180fa372a3ca7cf0f433", - "sha256:cfff9b838531698ee40e40ea1a8a9dc2c01edb400b27d38de6ba44c1f9a8e3d2", - "sha256:d3ce45010fefb028359accebb852ca0c21bd77ec0f281952831d235228f15810", - "sha256:d3e3bc79b2d7d615067bd010caff9243ead1fc95cf735c16e4b2583173f717eb", - "sha256:e530ab6a0afd082d2e9c17eb1eb064a63c5b09bb607b2b74fa41adbe3e162286", - "sha256:ec0e1adc0ad70ba8227e957551e25a9d2995e319c29f94a97575bb90fa1d4469", - "sha256:efc6bb28178e844d1f408dd4d6341ee8a2e906fc9e0fa3dae497da4e0cab775d", - "sha256:f098ffbaab9df1e3ef04e5a5586a1e6b1791380698e84938d8640961c79b1fc0", - "sha256:f0ad550da9f160737d7890217c5eeed4337d07e83ca1b2ca6535078f354e7675", - "sha256:f0b60993ed3488b4532ec6b697059897891927cbfc2b8d458a891b60ec03d9d7", - "sha256:f65342c147572673f02a4abec2d5a23ad9c3898167df9b47c149f32ce61ca078", - "sha256:fa7ebc995a7d747dacf0a717d0eb3aa0f0c6a0e9ea88b0194d3a3cd241a1500f", - "sha256:fbea1e762b28400393d71be1a02144aa16692a3c4c676ba0178ce83fc2928fdd", - "sha256:fbf730fca3e1f23713bc1fae0a57db386e39dc81ea57dc305c67f628c1d7a342", - "sha256:fd4028d570fa4b31b7b165d4a685942ae9cdc669f33741e388c01857d9723eab", - "sha256:fe184b4625b4052fa88ef350b815559dd90cc6cc8e97b62f966e1ca84074aafa" - ], - "index": "pypi", - "markers": "python_version >= '3.8'", - "version": "==3.7.5" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:03a8c78d01d9781b28a6989f6fa1bb2c4f2d51201cf99d3dd875df6fbd96b23b", - "sha256:08beddf13648eb95f8d867350f6a018a4be2e5ad54c8d8caed89ebca558b2818", - "sha256:1af303d6b2210eb850fcf03064d364652b7120803a0b872f5211f5234b399f20", - "sha256:1dda2e7b4ec9dd512f84935c5f126c8bd8b9f2fc001e9f54af255e8c5f16b0e0", - "sha256:2a02aba9ed12e4ac4eb3ea9421c420301a0c6460d9830d74a9df87efa4912010", - "sha256:2e4ee3380d6de9c9ec04745830fd9e2eccb3e6cf790d39d7b98ffd19b0dd754a", - "sha256:3373d5d70a5fe74a2c1bb6d2cfd9609ecf686d47a2d7b1d37a8f3b6bf6003aea", - "sha256:47711010ad8555514b434df65f7d7b076bb8261df1ca9bb78f53d3b2db02e95c", - "sha256:4c66707fabe114439db9068ee468c26bbdf909cac0fb58686a42a24de1760c71", - "sha256:50193e430acfc1346175fcbdaa28ffec49947a06918b7b92130744e81e640110", - "sha256:52b8b60467cd7dd1e9ed082188b4e6bb35aa5cdd01777621a1658910745b90be", - "sha256:60dedbb91afcbfdc9bc0b1f3f402804070deed7392c23eb7a7f07fa857868e8a", - "sha256:62b8e4b1e28009ef2846b4c7852046736bab361f7aeadeb6a5b89ebec3c7055a", - "sha256:666dbfb6ec68962c033a450943ded891bed2d54e6755e35e5835d63f4f6931d5", - "sha256:675d61ffbfa78604709862923189bad94014bef562cc35cf61d3a07bba02a7ed", - "sha256:679b0076f67ecc0138fd2ede3a8fd196dddc2ad3254069bcb9faf9a79b1cebcd", - "sha256:7349ab0fa0c429c82442a27a9673fc802ffdb7c7775fad780226cb234965e53c", - "sha256:7ab55401287bfec946ced39700c053796e7cc0e3acbef09993a9ad2adba6ca6e", - "sha256:7e50d0a0cc3189f9cb0aeb3a6a6af18c16f59f004b866cd2be1c14b36134a4a0", - "sha256:95a7476c59002f2f6c590b9b7b998306fba6a5aa646b1e22ddfeaf8f78c3a29c", - "sha256:96ff0b2ad353d8f990b63294c8986f1ec3cb19d749234014f4e7eb0112ceba5a", - "sha256:9fad7dcb1aac3c7f0584a5a8133e3a43eeb2fe127f47e3632d43d677c66c102b", - "sha256:9ff0f4f29c51e2803569d7a51c2304de5554655a60c5d776e35b4a41413830d0", - "sha256:a354325ee03388678242a4d7ebcd08b5c727033fcff3b2f536aea978e15ee9e6", - "sha256:a4abb4f9001ad2858e7ac189089c42178fcce737e4169dc61321660f1a96c7d2", - "sha256:ab47dbe5cc8210f55aa58e4805fe224dac469cde56b9f731a4c098b91917159a", - "sha256:afedb719a9dcfc7eaf2287b839d8198e06dcd4cb5d276a3df279231138e83d30", - "sha256:b3ce300f3644fb06443ee2222c2201dd3a89ea6040541412b8fa189341847218", - "sha256:b97fe8060236edf3662adfc2c633f56a08ae30560c56310562cb4f95500022d5", - "sha256:bfe25acf8b437eb2a8b2d49d443800a5f18508cd811fea3181723922a8a82b07", - "sha256:cd25bcecc4974d09257ffcd1f098ee778f7834c3ad767fe5db785be9a4aa9cb2", - "sha256:d209d8969599b27ad20994c8e41936ee0964e6da07478d6c35016bc386b66ad4", - "sha256:d5241e0a80d808d70546c697135da2c613f30e28251ff8307eb72ba696945764", - "sha256:edd8b5fe47dab091176d21bb6de568acdd906d1887a4584a15a9a96a1dca06ef", - "sha256:f870204a840a60da0b12273ef34f7051e98c3b5961b61b0c2c1be6dfd64fbcd3", - "sha256:ffa75af20b44f8dba823498024771d5ac50620e6915abac414251bd971b4529f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.26.4" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version >= '3.8'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_37_py311/Pipfile.lock.license b/ci/matrix/mpl_37_py311/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_37_py311/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_38_py310/Pipfile b/ci/matrix/mpl_38_py310/Pipfile deleted file mode 100644 index 387d495c..00000000 --- a/ci/matrix/mpl_38_py310/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.8.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.10" diff --git a/ci/matrix/mpl_38_py310/Pipfile.lock b/ci/matrix/mpl_38_py310/Pipfile.lock deleted file mode 100644 index 1e0b9900..00000000 --- a/ci/matrix/mpl_38_py310/Pipfile.lock +++ /dev/null @@ -1,2057 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "30a708daad441fb50aa9148c9b5bf642db6610e2e8bcfe04dc387f3a6d9ea69f" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.10" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "exceptiongroup": { - "hashes": [ - "sha256:3111b9d131c238bec2f8f516e123e14ba243563fb135d3fe885990585aa7795b", - "sha256:47c2edf7c6738fafb49fd34290706d1a1a2f4d1c6df275526b62cbb4aa5393cc" - ], - "markers": "python_version < '3.11'", - "version": "==1.2.2" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.12'", - "version": "==8.0.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67", - "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", - "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94", - "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", - "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9", - "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0", - "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", - "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", - "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", - "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", - "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", - "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6", - "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", - "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", - "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", - "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54", - "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f", - "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", - "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", - "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", - "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", - "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35", - "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", - "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", - "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", - "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", - "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", - "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.8.4" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0b718a362f4392430903bbb2a4b9bbff9841a16a52f0cfdd5b5bbd9d11457980", - "sha256:0c1c727ede7fdc464a1fe2e46109ba836509b2d7187a46fdeae443148ce51d1c", - "sha256:0cd21c3215e3c47fdd5fa7a2dc3dd1e07a7230b0626e905a7217925068c788b9", - "sha256:13f0c6a78e781255863e3e160304648efaf62276b7102741af637b63a6e96930", - "sha256:24a1d4937332bf0a38dd95bb2ce4d89723df449f6e912b52ef0e107e11fefac1", - "sha256:2575f428de584a12009fd29d00c89df16ed101a3b38beba818dfdcbc4a10709c", - "sha256:749f7a3ffd6e3d2d5db65ed92c95cbd14490631595c61f0c0672c9238bfb17de", - "sha256:7f88c85702dce80ac2e1a162054f688ed394811d6dd03a5574b3fa8111b0a6db", - "sha256:83d247cdc43ef224410b14c97413067ea26356dfa39e9ed0fe702a31e25710b0", - "sha256:852b75cf208825602480e95ab63314108f872d0da251e9ad3deaaff5a183a6f5", - "sha256:855563d4d3b59ce7438bbf2dd32fed2707787defa40f3efe94f204a19ef92b25", - "sha256:91b9538458a3a23e033c213bc879ce64f3d0a33d5a49cbd03e1e584efe307a35", - "sha256:97f2d6e8d9b7b3d3e795d576d7f56e6257f524221f6383b33ded7287763e9f06", - "sha256:b4adc529fa4ec05728e14ea55194d907cc51f18d6f2ac5cc9f6eb52ac038aa0f", - "sha256:b58eeedc9b2a3037b136bf96915196c391a33be470ed1c0723d7163ef0b727a2", - "sha256:c0c543d604116af26694a8a5ba90f510551ff9124d503ae5ee14bb73a61363a3", - "sha256:c85be433fbafcb3d417581c0e1b67c8198d23858166e4f938e971c2262c13cdb", - "sha256:d23fdfcf363b5cedd9d39f8a9c5710e7d52804f5b08a58e91c638b36eafcb702", - "sha256:dd241de9c569c07bbba62bff1049996e5b52478164f61f430073a87bf6d26d33", - "sha256:ed5221c6241981bd98d39504823efb9cbe36841bf8917288f8fe8fc1d5569a41", - "sha256:f600ae6f03e4bff91153c0dc7ebe52f90bd2b6afda58fd580e6990b3b951adc0" - ], - "markers": "python_version >= '3.8'", - "version": "==12.15.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:4bcce443b66139eb9556117ba881246269edce396e7f939e22c5ed85186bfd5b", - "sha256:8385520a28dc129ebf8b5fccfa1beb71215fd4455c6d10fa418e08c3c7a2ff9c" - ], - "markers": "python_version >= '3.9'", - "version": "==7.4.0" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version >= '3.8'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_38_py310/Pipfile.lock.license b/ci/matrix/mpl_38_py310/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_38_py310/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_38_py311/Pipfile b/ci/matrix/mpl_38_py311/Pipfile deleted file mode 100644 index c2182eff..00000000 --- a/ci/matrix/mpl_38_py311/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.8.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.11" diff --git a/ci/matrix/mpl_38_py311/Pipfile.lock b/ci/matrix/mpl_38_py311/Pipfile.lock deleted file mode 100644 index c11d9cb0..00000000 --- a/ci/matrix/mpl_38_py311/Pipfile.lock +++ /dev/null @@ -1,2041 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "1f1b512608d7952481afac60e23077ed1ad7a41e5c94488f1967864c929d8bb0" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.11" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.12'", - "version": "==8.0.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67", - "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", - "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94", - "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", - "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9", - "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0", - "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", - "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", - "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", - "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", - "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", - "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6", - "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", - "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", - "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", - "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54", - "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f", - "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", - "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", - "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", - "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", - "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35", - "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", - "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", - "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", - "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", - "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", - "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.8.4" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version >= '3.8'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_38_py311/Pipfile.lock.license b/ci/matrix/mpl_38_py311/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_38_py311/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_38_py312/Pipfile b/ci/matrix/mpl_38_py312/Pipfile deleted file mode 100644 index dce70ddd..00000000 --- a/ci/matrix/mpl_38_py312/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.8.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.12" diff --git a/ci/matrix/mpl_38_py312/Pipfile.lock b/ci/matrix/mpl_38_py312/Pipfile.lock deleted file mode 100644 index 3149a2d2..00000000 --- a/ci/matrix/mpl_38_py312/Pipfile.lock +++ /dev/null @@ -1,2025 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "32e586b14f94dd88843313ca7adfe2a5fd576e685c6a0755bd778d187a6b589b" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.12" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67", - "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", - "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94", - "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", - "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9", - "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0", - "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", - "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", - "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", - "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", - "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", - "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6", - "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", - "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", - "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", - "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54", - "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f", - "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", - "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", - "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", - "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", - "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35", - "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", - "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", - "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", - "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", - "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", - "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.8.4" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_38_py312/Pipfile.lock.license b/ci/matrix/mpl_38_py312/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_38_py312/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_38_py39/Pipfile b/ci/matrix/mpl_38_py39/Pipfile deleted file mode 100644 index 9f3a1ca0..00000000 --- a/ci/matrix/mpl_38_py39/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.8.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.9" diff --git a/ci/matrix/mpl_38_py39/Pipfile.lock b/ci/matrix/mpl_38_py39/Pipfile.lock deleted file mode 100644 index a3865944..00000000 --- a/ci/matrix/mpl_38_py39/Pipfile.lock +++ /dev/null @@ -1,2065 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "837428c52c33ecbfd0fb7222ed4f5ffe3663c6d51d0eda2366eda7fba6321fca" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.9" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "exceptiongroup": { - "hashes": [ - "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad", - "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16" - ], - "markers": "python_version < '3.11'", - "version": "==1.2.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "importlib-metadata": { - "hashes": [ - "sha256:15584cf2b1bf449d98ff8a6ff1abef57bf20f3ac6454f431736cd3e660921b2f", - "sha256:188bd24e4c346d3f0a933f275c2fec67050326a856b9a359881d7c2a697e8812" - ], - "markers": "python_version < '3.10'", - "version": "==8.0.0" - }, - "importlib-resources": { - "hashes": [ - "sha256:50d10f043df931902d4194ea07ec57960f66a80449ff867bfe782b4c486ba78c", - "sha256:cdb2b453b8046ca4e3798eb1d84f3cce1446a0e8e7b5ef4efb600f19fc398145" - ], - "markers": "python_version < '3.10'", - "version": "==6.4.0" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:ca6f079bb33457c66e233e4580ebfc4128855b4cf6370dddd73842a9563e8a27", - "sha256:e8267419d72d81955ec1177f8a29aaa90ac80ad647499201119e2f05e99aa397" - ], - "markers": "python_version >= '3.9'", - "version": "==8.18.1" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:1c13f041a7178f9780fb61cc3a2b10423d5e125480e4be51beaf62b172413b67", - "sha256:232ce322bfd020a434caaffbd9a95333f7c2491e59cfc014041d95e38ab90d1c", - "sha256:493e9f6aa5819156b58fce42b296ea31969f2aab71c5b680b4ea7a3cb5c07d94", - "sha256:50bac6e4d77e4262c4340d7a985c30912054745ec99756ce213bfbc3cb3808eb", - "sha256:606e3b90897554c989b1e38a258c626d46c873523de432b1462f295db13de6f9", - "sha256:6209e5c9aaccc056e63b547a8152661324404dd92340a6e479b3a7f24b42a5d0", - "sha256:6485ac1f2e84676cff22e693eaa4fbed50ef5dc37173ce1f023daef4687df616", - "sha256:6addbd5b488aedb7f9bc19f91cd87ea476206f45d7116fcfe3d31416702a82fa", - "sha256:72f9322712e4562e792b2961971891b9fbbb0e525011e09ea0d1f416c4645661", - "sha256:7a6769f58ce51791b4cb8b4d7642489df347697cd3e23d88266aaaee93b41d9a", - "sha256:8080d5081a86e690d7688ffa542532e87f224c38a6ed71f8fbed34dd1d9fedae", - "sha256:843cbde2f0946dadd8c5c11c6d91847abd18ec76859dc319362a0964493f0ba6", - "sha256:8aac397d5e9ec158960e31c381c5ffc52ddd52bd9a47717e2a694038167dffea", - "sha256:8f65c9f002d281a6e904976007b2d46a1ee2bcea3a68a8c12dda24709ddc9106", - "sha256:90df07db7b599fe7035d2f74ab7e438b656528c68ba6bb59b7dc46af39ee48ef", - "sha256:9bb0189011785ea794ee827b68777db3ca3f93f3e339ea4d920315a0e5a78d54", - "sha256:a0e47eda4eb2614300fc7bb4657fced3e83d6334d03da2173b09e447418d499f", - "sha256:abc9d838f93583650c35eca41cfcec65b2e7cb50fd486da6f0c49b5e1ed23014", - "sha256:ac24233e8f2939ac4fd2919eed1e9c0871eac8057666070e94cbf0b33dd9c338", - "sha256:b12ba985837e4899b762b81f5b2845bd1a28f4fdd1a126d9ace64e9c4eb2fb25", - "sha256:b7a2a253d3b36d90c8993b4620183b55665a429da8357a4f621e78cd48b2b30b", - "sha256:c7064120a59ce6f64103c9cefba8ffe6fba87f2c61d67c401186423c9a20fd35", - "sha256:c89ee9314ef48c72fe92ce55c4e95f2f39d70208f9f1d9db4e64079420d8d732", - "sha256:cc4ccdc64e3039fc303defd119658148f2349239871db72cd74e2eeaa9b80b71", - "sha256:ce1edd9f5383b504dbc26eeea404ed0a00656c526638129028b758fd43fc5f10", - "sha256:ecd79298550cba13a43c340581a3ec9c707bd895a6a061a78fa2524660482fc0", - "sha256:f51c4c869d4b60d769f7b4406eec39596648d9d70246428745a681c327a8ad30", - "sha256:fb44f53af0a62dc80bba4443d9b27f2fde6acfdac281d95bc872dc148a6509cc" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.8.4" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0f85fb633a522f04e48008de49dce1ff1d947011b48885b8428838973fbca412", - "sha256:108a15f603e1886988c4b0d9d41cb74c9f9815bf05cefc843d559e8c298a10ce", - "sha256:1c8371682f77852256f1f2d38c41e2e684029f43330f0635870895ab01c02f6c", - "sha256:205cd449d08a2b024a468fb6100cd7ed03e946b4f49706f508944006f955ae1a", - "sha256:29fa9cc964517c9fc3f94f072b9a2aeef4e7a2eda1879cb835d9e06971161cdf", - "sha256:3188a06956aef86f604fb0d14421a110fad70d2a9e943dbacbfc3303f651dade", - "sha256:3a4498f3b1b15f43f5d12963accdce0fd652b0bcaae6baf8008663365827444c", - "sha256:5338773bbaedaa4f16a73c142fb23cc18c327be6c338813af70260b756c7bc92", - "sha256:6e4ac714252370ca037c7d609da92388057165edd4f94e63354f6d65c3ed9d53", - "sha256:773731b1b5ab1a7cf5621249f2379c95e3d2905e9bd96ff3611b119586daa876", - "sha256:7f321daf84b9c9dbca61b80e1ef37bdaffc0e93312edae2cd7da25b953971d91", - "sha256:7fe3375b508c5bc657d73b9896bba8a768791f1f426c68053311b046bcebdddf", - "sha256:96414c93f3d33963887cf562d50d88b955121fbfd73f937c8eca46643e77bf61", - "sha256:9a8cdd6cb66adcbe5c941723ed1544eba05cf19b6c961851b58ccdae1c894afb", - "sha256:9b984c2620a7a7eaf049221b09ae50a345317add2624c706c7d2e9e6632a9587", - "sha256:a7e3623b2c743753625c4650ec7696362a37fb36433b61824cf257f6d3d43cca", - "sha256:bbc7cd498bf19e0862097be1ad2243e824dea56726f00c11cff1b547c2d31d01", - "sha256:d5032da3fff62da055104926ffe76fd6044c1221f8ad35bb60804bcb422fe866", - "sha256:db228cd737f5cbfc66a3c3e50042140cb80b30b52edc5756dbbaa2346ec73137", - "sha256:ec60162e034c42fb99859206d62b83b74f987d58937b3a82bdc07b5c3d190dec", - "sha256:fb4a5271fa3f6bc2feb303269a837a95a6d8dd16be553aa40e530de7fb81bfdf" - ], - "markers": "python_version >= '3.7'", - "version": "==12.13.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:017367484ce5498445aade74b1d5ab377acdc65e27095155e448c88497755a5d", - "sha256:095a87a0312b08dfd6a6155cbbd310a8c51800fc931b8c0b84003014b874ed3c", - "sha256:20335853b85e9a49ff7572ab453794298bcf0354d8068c5f6775a0eabf350aca", - "sha256:27e52b09c0d3a1d5b63e1105f24177e544a222b43611aaf5bc44d4a0979e32f9", - "sha256:2831f0dc9c5ea9edd6e51e6e769b655f08ec6db6e2e10f86ef39bd32eb11da54", - "sha256:2ac65fb503dad64218c228e2dc2d0a0193f7904747db43014645ae139c8fad16", - "sha256:392e4ec766654852c25ebad4f64e4e584cf19820b980bc04960bca0b0cd6eaa2", - "sha256:436bbb42a94a8aeef855d755ce5a465479c721e9d684de76bf61a62e7c2b81d5", - "sha256:45484bee6d65633752c490404513b9ef02475b4284c4cfab0ef946def50b3f59", - "sha256:54f430b00f0133e2224c3ba42b805bfd0086fe488835effa33fa291561932326", - "sha256:5713f62f781eebd8d597eb3f88b8bf9274e79eeabf63afb4a737abc6c84ad37b", - "sha256:5d72782f39716b2b3509cd7c33cdc08c96f2f4d2b06d51e52fb45a19ca0c86a1", - "sha256:637e98dcf185ba7f8e663e122ebf908c4702420477ae52a04f9908707456ba4d", - "sha256:8335549ebbca860c52bf3d02f80784e91a004b71b059e3eea9678ba994796a24", - "sha256:949ae67db5fa78a86e8fa644b9a6b07252f449dcf74247108c50e1d20d2b4627", - "sha256:a014c2b3697bde71724244f63de2476925596c24285c7a637364761f8710891c", - "sha256:a78b4b3345f1b6f68a763c6e25c0c9a23a9fd0f39f5f3d200efe8feda560a5fa", - "sha256:cdd7dacfb95fea358916410ec61bbc20440f7860333aee6d882bb8046264e949", - "sha256:cfa31f1def5c819b19ecc3a8b52d28ffdcc7ed52bb20c9a7589669dd3c250989", - "sha256:d533654b7d221a6a97304ab63c41c96473ff04459e404b83275b60aa8f4b7004", - "sha256:d605e9c23906d1994f55ace80e0125c587f96c020037ea6aa98d01b4bd2e222f", - "sha256:de3ade0e53bc1f21358aa74ff4830235d716211d7d077e340c7349bc3542e884", - "sha256:e89369d27f9e7b0884ae559a3a956e77c02114cc60a6058b4e5011572eea9299", - "sha256:eccfa1906eacc02de42d70ef4aecea45415f5be17e72b61bafcfd329bdc52e94", - "sha256:f26264b282b9da0952a024ae34710c2aff7d27480ee91a2e82b7b7073c24722f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.13.1" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3", - "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc" - ], - "markers": "python_version >= '3.9'", - "version": "==7.3.7" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomli": { - "hashes": [ - "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc", - "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f" - ], - "markers": "python_version < '3.11'", - "version": "==2.0.1" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version < '3.10'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - }, - "zipp": { - "hashes": [ - "sha256:bf1dcf6450f873a13e952a29504887c89e6de7506209e5b1bcc3460135d4de19", - "sha256:f091755f667055f2d02b32c53771a7a6c8b47e1fdbc4b72a8b9072b3eef8015c" - ], - "markers": "python_version < '3.10'", - "version": "==3.19.2" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_38_py39/Pipfile.lock.license b/ci/matrix/mpl_38_py39/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_38_py39/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/ci/matrix/mpl_39_py312/Pipfile b/ci/matrix/mpl_39_py312/Pipfile deleted file mode 100644 index 00522e4d..00000000 --- a/ci/matrix/mpl_39_py312/Pipfile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[[source]] -url = "https://pypi.org/simple" -verify_ssl = true -name = "pypi" - -[packages] -psy-simple = {extras = ["testsite"], file = "../../.."} -psyplot = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git"} -psyplot-gui = {ref = "develop", git = "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git"} -PyQt5 = {version="*"} -PyQtWebEngine = {version="*"} -matplotlib = "3.9.*" - -[dev-packages] - -[pipenv] -allow_prereleases = true - -[requires] -python_version = "3.12" diff --git a/ci/matrix/mpl_39_py312/Pipfile.lock b/ci/matrix/mpl_39_py312/Pipfile.lock deleted file mode 100644 index dd6c9b6e..00000000 --- a/ci/matrix/mpl_39_py312/Pipfile.lock +++ /dev/null @@ -1,2026 +0,0 @@ -{ - "_meta": { - "hash": { - "sha256": "1fab1c59f235c6580f01e93968b44a8f076593ff2dec61c568c48bca1844beee" - }, - "pipfile-spec": 6, - "requires": { - "python_version": "3.12" - }, - "sources": [ - { - "name": "pypi", - "url": "https://pypi.org/simple", - "verify_ssl": true - } - ] - }, - "default": { - "alabaster": { - "hashes": [ - "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65", - "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92" - ], - "markers": "python_version >= '3.9'", - "version": "==0.7.16" - }, - "asttokens": { - "hashes": [ - "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24", - "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0" - ], - "version": "==2.4.1" - }, - "attrs": { - "hashes": [ - "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30", - "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1" - ], - "markers": "python_version >= '3.7'", - "version": "==23.2.0" - }, - "babel": { - "hashes": [ - "sha256:08706bdad8d0a3413266ab61bd6c34d0c28d6e1e7badf40a2cebe67644e2e1fb", - "sha256:8daf0e265d05768bc6c7a314cf1321e9a123afc328cc635c18622a2f30a04413" - ], - "markers": "python_version >= '3.8'", - "version": "==2.15.0" - }, - "binaryornot": { - "hashes": [ - "sha256:359501dfc9d40632edc9fac890e19542db1a287bbcfa58175b66658392018061", - "sha256:b8b71173c917bddcd2c16070412e369c3ed7f0528926f70cac18a6c97fd563e4" - ], - "version": "==0.4.4" - }, - "black": { - "hashes": [ - "sha256:0052dba51dec07ed029ed61b18183942043e00008ec65d5028814afaab9a22fd", - "sha256:0680d4380db3719ebcfb2613f34e86c8e6d15ffeabcf8ec59355c5e7b85bb555", - "sha256:121ca7f10b4a01fd99951234abdbd97728e1240be89fde18480ffac16503d481", - "sha256:162e37d49e93bd6eb6f1afc3e17a3d23a823042530c37c3c42eeeaf026f38468", - "sha256:2a951cc83ab535d248c89f300eccbd625e80ab880fbcfb5ac8afb5f01a258ac9", - "sha256:2bf649fda611c8550ca9d7592b69f0637218c2369b7744694c5e4902873b2f3a", - "sha256:382998821f58e5c8238d3166c492139573325287820963d2f7de4d518bd76958", - "sha256:49f7b39e30f326a34b5c9a4213213a6b221d7ae9d58ec70df1c4a307cf2a1580", - "sha256:57c18c5165c1dbe291d5306e53fb3988122890e57bd9b3dcb75f967f13411a26", - "sha256:7a0f701d314cfa0896b9001df70a530eb2472babb76086344e688829efd97d32", - "sha256:8178318cb74f98bc571eef19068f6ab5613b3e59d4f47771582f04e175570ed8", - "sha256:8b70eb40a78dfac24842458476135f9b99ab952dd3f2dab738c1881a9b38b753", - "sha256:9880d7d419bb7e709b37e28deb5e68a49227713b623c72b2b931028ea65f619b", - "sha256:9afd3f493666a0cd8f8df9a0200c6359ac53940cbde049dcb1a7eb6ee2dd7074", - "sha256:a29650759a6a0944e7cca036674655c2f0f63806ddecc45ed40b7b8aa314b651", - "sha256:a436e7881d33acaf2536c46a454bb964a50eff59b21b51c6ccf5a40601fbef24", - "sha256:a59db0a2094d2259c554676403fa2fac3473ccf1354c1c63eccf7ae65aac8ab6", - "sha256:a8471939da5e824b891b25751955be52ee7f8a30a916d570a5ba8e0f2eb2ecad", - "sha256:b0bd97bea8903f5a2ba7219257a44e3f1f9d00073d6cc1add68f0beec69692ac", - "sha256:b6a92a41ee34b883b359998f0c8e6eb8e99803aa8bf3123bf2b2e6fec505a221", - "sha256:bb460c8561c8c1bec7824ecbc3ce085eb50005883a6203dcfb0122e95797ee06", - "sha256:bfffba28dc52a58f04492181392ee380e95262af14ee01d4bc7bb1b1c6ca8d27", - "sha256:c1c476bc7b7d021321e7d93dc2cbd78ce103b84d5a4cf97ed535fbc0d6660648", - "sha256:c91dfc2c2a4e50df0026f88d2215e166616e0c80e86004d0003ece0488db2739", - "sha256:e6663f91b6feca5d06f2ccd49a10f254f9298cc1f7f49c46e498a0771b507104" - ], - "version": "==23.1.0" - }, - "boolean.py": { - "hashes": [ - "sha256:17b9a181630e43dde1851d42bef546d616d5d9b4480357514597e78b203d06e4", - "sha256:2876f2051d7d6394a531d82dc6eb407faa0b01a0a0b3083817ccd7323b8d96bd" - ], - "version": "==4.0" - }, - "cachetools": { - "hashes": [ - "sha256:0abad1021d3f8325b2fc1d2e9c8b9c9d57b04c3932657a72465447332c24d945", - "sha256:ba29e2dfa0b8b556606f097407ed1aa62080ee108ab0dc5ec9d6a723a007d105" - ], - "markers": "python_version >= '3.7'", - "version": "==5.3.3" - }, - "certifi": { - "hashes": [ - "sha256:5a1e7645bc0ec61a09e26c36f6106dd4cf40c6db3a1fb6352b0244e7fb057c7b", - "sha256:c198e21b1289c2ab85ee4e67bb4b4ef3ead0892059901a8d5b622f24a1101e90" - ], - "markers": "python_version >= '3.6'", - "version": "==2024.7.4" - }, - "cffconvert": { - "hashes": [ - "sha256:573c825e4e16173d99396dc956bd22ff5d4f84215cc16b6ab05299124f5373bb", - "sha256:b4379ee415c6637dc9e3e7ba196605cb3cedcea24613e4ea242c607d9e98eb50" - ], - "version": "==2.0.0" - }, - "cfgv": { - "hashes": [ - "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9", - "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560" - ], - "markers": "python_version >= '3.8'", - "version": "==3.4.0" - }, - "cftime": { - "hashes": [ - "sha256:03494e7b66a2fbb6b04e364ab67185130dee0ced660abac5c1559070571d143d", - "sha256:0b47bf25195fb3889bbae34df0e80957eb69c48f66902f5d538c7a8ec34253f6", - "sha256:0edeb1cb019d8155b2513cffb96749c0d7d459370e69bdf03077e0bee214aed8", - "sha256:1289e08617be350a6b26c6e4352a0cb088625ac33d25e95110df549c26d6ab8e", - "sha256:18b132d9225b4a109929866200846c72302316db9069e2de3ec8d8ec377f567f", - "sha256:25f043703e785de0bd7cd8222c0a53317e9aeb3dfc062588b05e6f3ebb007468", - "sha256:3c349a91fa7ac9ec50118b04a8746bdea967bd2fc525d87c776003040b8d3392", - "sha256:4dcb2a01d4e614437582af33b36db4fb441b7666758482864827a1f037d2b639", - "sha256:567574df94d0de1101bb5da76e7fbc6eabfddeeb2eb8cf83286b3599a136bbf7", - "sha256:588d073400798adc24ece759cd1cb24ef730f55d1f70e31a898e7686f9d763d8", - "sha256:5b5ad7559a16bedadb66af8e417b6805f758acb57aa38d2730844dfc63a1e667", - "sha256:6e07b91b488570573bbeb6f815656a8974d13d15b2279c82de2927f4f692bbcd", - "sha256:6fc82928cbf477bebf233f41914e64bff7b9e894c7f0c34170784a48250f8da7", - "sha256:76b8f1e5d1e424accdf760a43e0a1793a7b640bab83cb067273d5c9dbb336c44", - "sha256:90609b3c1a31a756a68ecdbc961a4ce0b22c1620f166c8dabfa3a4c337ac8b9e", - "sha256:a8f05d5d6bb4137f9783fa61ad330030fcea8dcc6946dea69a27774edbe480e7", - "sha256:b32ac1278a2a111b066d5a1e6e5ce6f38c4c505993a6a3130873b56f99d7b56f", - "sha256:bbe11ad73b2a0ddc79995da21459fc2a3fd6b1593ca73f00a60e4d81c3e230f3", - "sha256:c05a71389f53d6340cb365b60f028c08268c72401660b9ef76108dee9f1cb5b2", - "sha256:c072fe9e09925af66a9473edf5752ca1890ba752e7c1935d1f0245ad48f0977c", - "sha256:c1558d9b477bd29626cd8bfc89e736635f72887d1a993e2834ab579bba7abb8c", - "sha256:c20f03e12af39534c3450bba376272803bfb850b5ce6433c839bfaa99f8d835a", - "sha256:ca1a264570e68fbb611bba251641b8efd0cf88c0ad2dcab5fa784df264232b75", - "sha256:d4f2cc0d5c6ffba9c5b0fd1ecd0c7c1c426d0be7b8de1480e2a9fb857c1905e9", - "sha256:e325406193758a7ed67308deb52e727782a19e384e183378e7ff62098be0aedc", - "sha256:e5456fd58d4cc6b8d7b4932b749617ee142b62a52bc5d8e3c282ce69ce3a20ba", - "sha256:e8467b6fbf8dbfe0be8c04d61180765fdd3b9ab0fe51313a0bbf87e63634a3d8", - "sha256:ee70074df4bae0d9ee98f201cf5f11fd302791cf1cdeb73c34f685d6b632e17d", - "sha256:f92f2e405eeda47b30ab6231d8b7d136a55f21034d394f93ade322d356948654", - "sha256:f9acc272df1022f24fe7dbe9de43fa5d8271985161df14549e4d8d28c90dc9ea" - ], - "markers": "python_version >= '3.8'", - "version": "==1.6.4" - }, - "chardet": { - "hashes": [ - "sha256:1b3b6ff479a8c414bc3fa2c0852995695c4a026dcd6d0633b2dd092ca39c1cf7", - "sha256:e1cf59446890a00105fe7b7912492ea04b6e6f06d4b742b2c788469e34c82970" - ], - "markers": "python_version >= '3.7'", - "version": "==5.2.0" - }, - "charset-normalizer": { - "hashes": [ - "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027", - "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087", - "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786", - "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8", - "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09", - "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185", - "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574", - "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e", - "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519", - "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898", - "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269", - "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3", - "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f", - "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6", - "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8", - "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a", - "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73", - "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc", - "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714", - "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2", - "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc", - "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce", - "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d", - "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e", - "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6", - "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269", - "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96", - "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d", - "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a", - "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4", - "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77", - "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d", - "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0", - "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed", - "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068", - "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac", - "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25", - "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8", - "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab", - "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26", - "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2", - "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db", - "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f", - "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5", - "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99", - "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c", - "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d", - "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811", - "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa", - "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a", - "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03", - "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b", - "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04", - "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c", - "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001", - "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458", - "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389", - "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99", - "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985", - "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537", - "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238", - "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f", - "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d", - "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796", - "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a", - "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143", - "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8", - "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c", - "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5", - "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5", - "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711", - "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4", - "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6", - "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c", - "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7", - "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4", - "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b", - "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae", - "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12", - "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c", - "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae", - "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8", - "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887", - "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b", - "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4", - "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f", - "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5", - "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33", - "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519", - "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.3.2" - }, - "click": { - "hashes": [ - "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28", - "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de" - ], - "markers": "python_version >= '3.7'", - "version": "==8.1.7" - }, - "cloudpickle": { - "hashes": [ - "sha256:246ee7d0c295602a036e86369c77fecda4ab17b506496730f2f576d9016fd9c7", - "sha256:996d9a482c6fb4f33c1a35335cf8afd065d2a56e973270364840712d9131a882" - ], - "markers": "python_version >= '3.8'", - "version": "==3.0.0" - }, - "colorama": { - "hashes": [ - "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", - "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==0.4.6" - }, - "comm": { - "hashes": [ - "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e", - "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3" - ], - "markers": "python_version >= '3.8'", - "version": "==0.2.2" - }, - "contourpy": { - "hashes": [ - "sha256:00e5388f71c1a0610e6fe56b5c44ab7ba14165cdd6d695429c5cd94021e390b2", - "sha256:10a37ae557aabf2509c79715cd20b62e4c7c28b8cd62dd7d99e5ed3ce28c3fd9", - "sha256:11959f0ce4a6f7b76ec578576a0b61a28bdc0696194b6347ba3f1c53827178b9", - "sha256:187fa1d4c6acc06adb0fae5544c59898ad781409e61a926ac7e84b8f276dcef4", - "sha256:1a07fc092a4088ee952ddae19a2b2a85757b923217b7eed584fdf25f53a6e7ce", - "sha256:1cac0a8f71a041aa587410424ad46dfa6a11f6149ceb219ce7dd48f6b02b87a7", - "sha256:1d59e739ab0e3520e62a26c60707cc3ab0365d2f8fecea74bfe4de72dc56388f", - "sha256:2855c8b0b55958265e8b5888d6a615ba02883b225f2227461aa9127c578a4922", - "sha256:2e785e0f2ef0d567099b9ff92cbfb958d71c2d5b9259981cd9bee81bd194c9a4", - "sha256:309be79c0a354afff9ff7da4aaed7c3257e77edf6c1b448a779329431ee79d7e", - "sha256:39f3ecaf76cd98e802f094e0d4fbc6dc9c45a8d0c4d185f0f6c2234e14e5f75b", - "sha256:457499c79fa84593f22454bbd27670227874cd2ff5d6c84e60575c8b50a69619", - "sha256:49e70d111fee47284d9dd867c9bb9a7058a3c617274900780c43e38d90fe1205", - "sha256:4c75507d0a55378240f781599c30e7776674dbaf883a46d1c90f37e563453480", - "sha256:4c863140fafc615c14a4bf4efd0f4425c02230eb8ef02784c9a156461e62c965", - "sha256:4d8908b3bee1c889e547867ca4cdc54e5ab6be6d3e078556814a22457f49423c", - "sha256:5b9eb0ca724a241683c9685a484da9d35c872fd42756574a7cfbf58af26677fd", - "sha256:6022cecf8f44e36af10bd9118ca71f371078b4c168b6e0fab43d4a889985dbb5", - "sha256:6150ffa5c767bc6332df27157d95442c379b7dce3a38dff89c0f39b63275696f", - "sha256:62828cada4a2b850dbef89c81f5a33741898b305db244904de418cc957ff05dc", - "sha256:7b4182299f251060996af5249c286bae9361fa8c6a9cda5efc29fe8bfd6062ec", - "sha256:94b34f32646ca0414237168d68a9157cb3889f06b096612afdd296003fdd32fd", - "sha256:9ce6889abac9a42afd07a562c2d6d4b2b7134f83f18571d859b25624a331c90b", - "sha256:9cffe0f850e89d7c0012a1fb8730f75edd4320a0a731ed0c183904fe6ecfc3a9", - "sha256:a12a813949e5066148712a0626895c26b2578874e4cc63160bb007e6df3436fe", - "sha256:a1eea9aecf761c661d096d39ed9026574de8adb2ae1c5bd7b33558af884fb2ce", - "sha256:a31f94983fecbac95e58388210427d68cd30fe8a36927980fab9c20062645609", - "sha256:ac58bdee53cbeba2ecad824fa8159493f0bf3b8ea4e93feb06c9a465d6c87da8", - "sha256:af3f4485884750dddd9c25cb7e3915d83c2db92488b38ccb77dd594eac84c4a0", - "sha256:b33d2bc4f69caedcd0a275329eb2198f560b325605810895627be5d4b876bf7f", - "sha256:b59c0ffceff8d4d3996a45f2bb6f4c207f94684a96bf3d9728dbb77428dd8cb8", - "sha256:bb6834cbd983b19f06908b45bfc2dad6ac9479ae04abe923a275b5f48f1a186b", - "sha256:bd3db01f59fdcbce5b22afad19e390260d6d0222f35a1023d9adc5690a889364", - "sha256:bd7c23df857d488f418439686d3b10ae2fbf9bc256cd045b37a8c16575ea1040", - "sha256:c2528d60e398c7c4c799d56f907664673a807635b857df18f7ae64d3e6ce2d9f", - "sha256:d31a63bc6e6d87f77d71e1abbd7387ab817a66733734883d1fc0021ed9bfa083", - "sha256:d4492d82b3bc7fbb7e3610747b159869468079fe149ec5c4d771fa1f614a14df", - "sha256:ddcb8581510311e13421b1f544403c16e901c4e8f09083c881fab2be80ee31ba", - "sha256:e1d59258c3c67c865435d8fbeb35f8c59b8bef3d6f46c1f29f6123556af28445", - "sha256:eb3315a8a236ee19b6df481fc5f997436e8ade24a9f03dfdc6bd490fea20c6da", - "sha256:ef2b055471c0eb466033760a521efb9d8a32b99ab907fc8358481a1dd29e3bd3", - "sha256:ef5adb9a3b1d0c645ff694f9bca7702ec2c70f4d734f9922ea34de02294fdf72", - "sha256:f32c38afb74bd98ce26de7cc74a67b40afb7b05aae7b42924ea990d51e4dac02", - "sha256:fe0ccca550bb8e5abc22f530ec0466136379c01321fd94f30a22231e8a48d985" - ], - "markers": "python_version >= '3.9'", - "version": "==1.2.1" - }, - "coverage": { - "extras": [ - "toml" - ], - "hashes": [ - "sha256:0086cd4fc71b7d485ac93ca4239c8f75732c2ae3ba83f6be1c9be59d9e2c6382", - "sha256:01c322ef2bbe15057bc4bf132b525b7e3f7206f071799eb8aa6ad1940bcf5fb1", - "sha256:03cafe82c1b32b770a29fd6de923625ccac3185a54a5e66606da26d105f37dac", - "sha256:044a0985a4f25b335882b0966625270a8d9db3d3409ddc49a4eb00b0ef5e8cee", - "sha256:07ed352205574aad067482e53dd606926afebcb5590653121063fbf4e2175166", - "sha256:0d1b923fc4a40c5832be4f35a5dab0e5ff89cddf83bb4174499e02ea089daf57", - "sha256:0e7b27d04131c46e6894f23a4ae186a6a2207209a05df5b6ad4caee6d54a222c", - "sha256:1fad32ee9b27350687035cb5fdf9145bc9cf0a094a9577d43e909948ebcfa27b", - "sha256:289cc803fa1dc901f84701ac10c9ee873619320f2f9aff38794db4a4a0268d51", - "sha256:3c59105f8d58ce500f348c5b56163a4113a440dad6daa2294b5052a10db866da", - "sha256:46c3d091059ad0b9c59d1034de74a7f36dcfa7f6d3bde782c49deb42438f2450", - "sha256:482855914928c8175735a2a59c8dc5806cf7d8f032e4820d52e845d1f731dca2", - "sha256:49c76cdfa13015c4560702574bad67f0e15ca5a2872c6a125f6327ead2b731dd", - "sha256:4b03741e70fb811d1a9a1d75355cf391f274ed85847f4b78e35459899f57af4d", - "sha256:4bea27c4269234e06f621f3fac3925f56ff34bc14521484b8f66a580aacc2e7d", - "sha256:4d5fae0a22dc86259dee66f2cc6c1d3e490c4a1214d7daa2a93d07491c5c04b6", - "sha256:543ef9179bc55edfd895154a51792b01c017c87af0ebaae092720152e19e42ca", - "sha256:54dece71673b3187c86226c3ca793c5f891f9fc3d8aa183f2e3653da18566169", - "sha256:6379688fb4cfa921ae349c76eb1a9ab26b65f32b03d46bb0eed841fd4cb6afb1", - "sha256:65fa405b837060db569a61ec368b74688f429b32fa47a8929a7a2f9b47183713", - "sha256:6616d1c9bf1e3faea78711ee42a8b972367d82ceae233ec0ac61cc7fec09fa6b", - "sha256:6fe885135c8a479d3e37a7aae61cbd3a0fb2deccb4dda3c25f92a49189f766d6", - "sha256:7221f9ac9dad9492cecab6f676b3eaf9185141539d5c9689d13fd6b0d7de840c", - "sha256:76d5f82213aa78098b9b964ea89de4617e70e0d43e97900c2778a50856dac605", - "sha256:7792f0ab20df8071d669d929c75c97fecfa6bcab82c10ee4adb91c7a54055463", - "sha256:831b476d79408ab6ccfadaaf199906c833f02fdb32c9ab907b1d4aa0713cfa3b", - "sha256:9146579352d7b5f6412735d0f203bbd8d00113a680b66565e205bc605ef81bc6", - "sha256:9cc44bf0315268e253bf563f3560e6c004efe38f76db03a1558274a6e04bf5d5", - "sha256:a73d18625f6a8a1cbb11eadc1d03929f9510f4131879288e3f7922097a429f63", - "sha256:a8659fd33ee9e6ca03950cfdcdf271d645cf681609153f218826dd9805ab585c", - "sha256:a94925102c89247530ae1dab7dc02c690942566f22e189cbd53579b0693c0783", - "sha256:ad4567d6c334c46046d1c4c20024de2a1c3abc626817ae21ae3da600f5779b44", - "sha256:b2e16f4cd2bc4d88ba30ca2d3bbf2f21f00f382cf4e1ce3b1ddc96c634bc48ca", - "sha256:bbdf9a72403110a3bdae77948b8011f644571311c2fb35ee15f0f10a8fc082e8", - "sha256:beb08e8508e53a568811016e59f3234d29c2583f6b6e28572f0954a6b4f7e03d", - "sha256:c4cbe651f3904e28f3a55d6f371203049034b4ddbce65a54527a3f189ca3b390", - "sha256:c7b525ab52ce18c57ae232ba6f7010297a87ced82a2383b1afd238849c1ff933", - "sha256:ca5d79cfdae420a1d52bf177de4bc2289c321d6c961ae321503b2ca59c17ae67", - "sha256:cdab02a0a941af190df8782aafc591ef3ad08824f97850b015c8c6a8b3877b0b", - "sha256:d17c6a415d68cfe1091d3296ba5749d3d8696e42c37fca5d4860c5bf7b729f03", - "sha256:d39bd10f0ae453554798b125d2f39884290c480f56e8a02ba7a6ed552005243b", - "sha256:d4b3cd1ca7cd73d229487fa5caca9e4bc1f0bca96526b922d61053ea751fe791", - "sha256:d50a252b23b9b4dfeefc1f663c568a221092cbaded20a05a11665d0dbec9b8fb", - "sha256:da8549d17489cd52f85a9829d0e1d91059359b3c54a26f28bec2c5d369524807", - "sha256:dcd070b5b585b50e6617e8972f3fbbee786afca71b1936ac06257f7e178f00f6", - "sha256:ddaaa91bfc4477d2871442bbf30a125e8fe6b05da8a0015507bfbf4718228ab2", - "sha256:df423f351b162a702c053d5dddc0fc0ef9a9e27ea3f449781ace5f906b664428", - "sha256:dff044f661f59dace805eedb4a7404c573b6ff0cdba4a524141bc63d7be5c7fd", - "sha256:e7e128f85c0b419907d1f38e616c4f1e9f1d1b37a7949f44df9a73d5da5cd53c", - "sha256:ed8d1d1821ba5fc88d4a4f45387b65de52382fa3ef1f0115a4f7a20cdfab0e94", - "sha256:f2501d60d7497fd55e391f423f965bbe9e650e9ffc3c627d5f0ac516026000b8", - "sha256:f7db0b6ae1f96ae41afe626095149ecd1b212b424626175a6633c2999eaad45b" - ], - "markers": "python_version >= '3.8'", - "version": "==7.6.0" - }, - "cycler": { - "hashes": [ - "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", - "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "dask": { - "hashes": [ - "sha256:0060bae9a58b5b3ce7e0d97040e903b4d3db09ba49222101cfc40f9834a8a6bc", - "sha256:0f30f218a1fe1c8e9a6ba8add1207088ba9ff049098d4ea4ce045fd5ff7ca914" - ], - "version": "==2024.7.0" - }, - "debugpy": { - "hashes": [ - "sha256:0600faef1d0b8d0e85c816b8bb0cb90ed94fc611f308d5fde28cb8b3d2ff0fe3", - "sha256:1523bc551e28e15147815d1397afc150ac99dbd3a8e64641d53425dba57b0ff9", - "sha256:15bc2f4b0f5e99bf86c162c91a74c0631dbd9cef3c6a1d1329c946586255e859", - "sha256:16c8dcab02617b75697a0a925a62943e26a0330da076e2a10437edd9f0bf3755", - "sha256:16e16df3a98a35c63c3ab1e4d19be4cbc7fdda92d9ddc059294f18910928e0ca", - "sha256:2cbd4d9a2fc5e7f583ff9bf11f3b7d78dfda8401e8bb6856ad1ed190be4281ad", - "sha256:3f8c3f7c53130a070f0fc845a0f2cee8ed88d220d6b04595897b66605df1edd6", - "sha256:40f062d6877d2e45b112c0bbade9a17aac507445fd638922b1a5434df34aed02", - "sha256:5a019d4574afedc6ead1daa22736c530712465c0c4cd44f820d803d937531b2d", - "sha256:5d3ccd39e4021f2eb86b8d748a96c766058b39443c1f18b2dc52c10ac2757835", - "sha256:62658aefe289598680193ff655ff3940e2a601765259b123dc7f89c0239b8cd3", - "sha256:7ee2e1afbf44b138c005e4380097d92532e1001580853a7cb40ed84e0ef1c3d2", - "sha256:7f8d57a98c5a486c5c7824bc0b9f2f11189d08d73635c326abef268f83950326", - "sha256:8a13417ccd5978a642e91fb79b871baded925d4fadd4dfafec1928196292aa0a", - "sha256:95378ed08ed2089221896b9b3a8d021e642c24edc8fef20e5d4342ca8be65c00", - "sha256:acdf39855f65c48ac9667b2801234fc64d46778021efac2de7e50907ab90c634", - "sha256:bd11fe35d6fd3431f1546d94121322c0ac572e1bfb1f6be0e9b8655fb4ea941e", - "sha256:c78ba1680f1015c0ca7115671fe347b28b446081dada3fedf54138f44e4ba031", - "sha256:cf327316ae0c0e7dd81eb92d24ba8b5e88bb4d1b585b5c0d32929274a66a5210", - "sha256:d3408fddd76414034c02880e891ea434e9a9cf3a69842098ef92f6e809d09afa", - "sha256:e24ccb0cd6f8bfaec68d577cb49e9c680621c336f347479b3fce060ba7c09ec1", - "sha256:f179af1e1bd4c88b0b9f0fa153569b24f6b6f3de33f94703336363ae62f4bf47" - ], - "markers": "python_version >= '3.8'", - "version": "==1.8.2" - }, - "decorator": { - "hashes": [ - "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330", - "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186" - ], - "markers": "python_version >= '3.5'", - "version": "==5.1.1" - }, - "distlib": { - "hashes": [ - "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784", - "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64" - ], - "version": "==0.3.8" - }, - "docopt": { - "hashes": [ - "sha256:49b3a825280bd66b3aa83585ef59c4a8c82f2c8a522dbe754a8bc8d08c85c491" - ], - "version": "==0.6.2" - }, - "docrep": { - "hashes": [ - "sha256:ed8a17e201abd829ef8da78a0b6f4d51fb99a4cbd0554adbed3309297f964314" - ], - "version": "==0.3.2" - }, - "docutils": { - "hashes": [ - "sha256:96f387a2c5562db4476f09f13bbab2192e764cac08ebbf3a34a95d9b1e4a59d6", - "sha256:f08a4e276c3a1583a86dce3e34aba3fe04d02bba2dd51ed16106244e8a923e3b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.20.1" - }, - "execnet": { - "hashes": [ - "sha256:26dee51f1b80cebd6d0ca8e74dd8745419761d3bef34163928cbebbdc4749fdc", - "sha256:5189b52c6121c24feae288166ab41b32549c7e2348652736540b9e6e7d4e72e3" - ], - "markers": "python_version >= '3.8'", - "version": "==2.1.1" - }, - "executing": { - "hashes": [ - "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147", - "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc" - ], - "markers": "python_version >= '3.5'", - "version": "==2.0.1" - }, - "fasteners": { - "hashes": [ - "sha256:758819cb5d94cdedf4e836988b74de396ceacb8e2794d21f82d131fd9ee77237", - "sha256:b4f37c3ac52d8a445af3a66bce57b33b5e90b97c696b7b984f530cf8f0ded09c" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19" - }, - "filelock": { - "hashes": [ - "sha256:2207938cbc1844345cb01a5a95524dae30f0ce089eba5b00378295a17e3e90cb", - "sha256:6ca1fffae96225dab4c6eaf1c4f4f28cd2568d3ec2a44e15a08520504de468e7" - ], - "markers": "python_version >= '3.8'", - "version": "==3.15.4" - }, - "flake8": { - "hashes": [ - "sha256:3833794e27ff64ea4e9cf5d410082a8b97ff1a06c16aa3d2027339cd0f1195c7", - "sha256:c61007e76655af75e6785a931f452915b371dc48f56efd765247c8fe68f2b181" - ], - "version": "==6.0.0" - }, - "fonttools": { - "hashes": [ - "sha256:02569e9a810f9d11f4ae82c391ebc6fb5730d95a0657d24d754ed7763fb2d122", - "sha256:0679a30b59d74b6242909945429dbddb08496935b82f91ea9bf6ad240ec23397", - "sha256:10f5e6c3510b79ea27bb1ebfcc67048cde9ec67afa87c7dd7efa5c700491ac7f", - "sha256:2af40ae9cdcb204fc1d8f26b190aa16534fcd4f0df756268df674a270eab575d", - "sha256:32f029c095ad66c425b0ee85553d0dc326d45d7059dbc227330fc29b43e8ba60", - "sha256:35250099b0cfb32d799fb5d6c651220a642fe2e3c7d2560490e6f1d3f9ae9169", - "sha256:3b3c8ebafbee8d9002bd8f1195d09ed2bd9ff134ddec37ee8f6a6375e6a4f0e8", - "sha256:4824c198f714ab5559c5be10fd1adf876712aa7989882a4ec887bf1ef3e00e31", - "sha256:5ff7e5e9bad94e3a70c5cd2fa27f20b9bb9385e10cddab567b85ce5d306ea923", - "sha256:651390c3b26b0c7d1f4407cad281ee7a5a85a31a110cbac5269de72a51551ba2", - "sha256:6e08f572625a1ee682115223eabebc4c6a2035a6917eac6f60350aba297ccadb", - "sha256:6ed170b5e17da0264b9f6fae86073be3db15fa1bd74061c8331022bca6d09bab", - "sha256:73379d3ffdeecb376640cd8ed03e9d2d0e568c9d1a4e9b16504a834ebadc2dfb", - "sha256:75a157d8d26c06e64ace9df037ee93a4938a4606a38cb7ffaf6635e60e253b7a", - "sha256:791b31ebbc05197d7aa096bbc7bd76d591f05905d2fd908bf103af4488e60670", - "sha256:7b6b35e52ddc8fb0db562133894e6ef5b4e54e1283dff606fda3eed938c36fc8", - "sha256:84ec3fb43befb54be490147b4a922b5314e16372a643004f182babee9f9c3407", - "sha256:8959a59de5af6d2bec27489e98ef25a397cfa1774b375d5787509c06659b3671", - "sha256:9dfdae43b7996af46ff9da520998a32b105c7f098aeea06b2226b30e74fbba88", - "sha256:9e6ceba2a01b448e36754983d376064730690401da1dd104ddb543519470a15f", - "sha256:9efd176f874cb6402e607e4cc9b4a9cd584d82fc34a4b0c811970b32ba62501f", - "sha256:a1c7c5aa18dd3b17995898b4a9b5929d69ef6ae2af5b96d585ff4005033d82f0", - "sha256:aae7bd54187e8bf7fd69f8ab87b2885253d3575163ad4d669a262fe97f0136cb", - "sha256:b21952c092ffd827504de7e66b62aba26fdb5f9d1e435c52477e6486e9d128b2", - "sha256:b96cd370a61f4d083c9c0053bf634279b094308d52fdc2dd9a22d8372fdd590d", - "sha256:becc5d7cb89c7b7afa8321b6bb3dbee0eec2b57855c90b3e9bf5fb816671fa7c", - "sha256:bee32ea8765e859670c4447b0817514ca79054463b6b79784b08a8df3a4d78e3", - "sha256:c6e7170d675d12eac12ad1a981d90f118c06cf680b42a2d74c6c931e54b50719", - "sha256:c818c058404eb2bba05e728d38049438afd649e3c409796723dfc17cd3f08749", - "sha256:c8696544c964500aa9439efb6761947393b70b17ef4e82d73277413f291260a4", - "sha256:c9cd19cf4fe0595ebdd1d4915882b9440c3a6d30b008f3cc7587c1da7b95be5f", - "sha256:d4d0096cb1ac7a77b3b41cd78c9b6bc4a400550e21dc7a92f2b5ab53ed74eb02", - "sha256:d92d3c2a1b39631a6131c2fa25b5406855f97969b068e7e08413325bc0afba58", - "sha256:da33440b1413bad53a8674393c5d29ce64d8c1a15ef8a77c642ffd900d07bfe1", - "sha256:e013aae589c1c12505da64a7d8d023e584987e51e62006e1bb30d72f26522c41", - "sha256:e128778a8e9bc11159ce5447f76766cefbd876f44bd79aff030287254e4752c4", - "sha256:e54f1bba2f655924c1138bbc7fa91abd61f45c68bd65ab5ed985942712864bbb", - "sha256:e5b708073ea3d684235648786f5f6153a48dc8762cdfe5563c57e80787c29fbb", - "sha256:e8bf06b94694251861ba7fdeea15c8ec0967f84c3d4143ae9daf42bbc7717fe3", - "sha256:f08df60fbd8d289152079a65da4e66a447efc1d5d5a4d3f299cdd39e3b2e4a7d", - "sha256:f1f8758a2ad110bd6432203a344269f445a2907dc24ef6bccfd0ac4e14e0d71d", - "sha256:f677ce218976496a587ab17140da141557beb91d2a5c1a14212c994093f2eae2" - ], - "markers": "python_version >= '3.8'", - "version": "==4.53.1" - }, - "fsspec": { - "hashes": [ - "sha256:3cb443f8bcd2efb31295a5b9fdb02aee81d8452c80d28f97a6d0959e6cee101e", - "sha256:fad7d7e209dd4c1208e3bbfda706620e0da5142bebbd9c384afb95b07e798e49" - ], - "markers": "python_version >= '3.8'", - "version": "==2024.6.1" - }, - "funcargparse": { - "hashes": [ - "sha256:f33d0d2ad4b865e7726c4de3bf8c3e4d36313acf6cf0cff945cead396ec80fea" - ], - "version": "==0.2.5" - }, - "identify": { - "hashes": [ - "sha256:cb171c685bdc31bcc4c1734698736a7d5b6c8bf2e0c15117f4d469c8640ae5cf", - "sha256:e79ae4406387a9d300332b5fd366d8994f1525e8414984e1a59e058b2eda2dd0" - ], - "markers": "python_version >= '3.8'", - "version": "==2.6.0" - }, - "idna": { - "hashes": [ - "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc", - "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0" - ], - "markers": "python_version >= '3.5'", - "version": "==3.7" - }, - "imagesize": { - "hashes": [ - "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b", - "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.4.1" - }, - "iniconfig": { - "hashes": [ - "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3", - "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374" - ], - "markers": "python_version >= '3.7'", - "version": "==2.0.0" - }, - "ipykernel": { - "hashes": [ - "sha256:afdb66ba5aa354b09b91379bac28ae4afebbb30e8b39510c9690afb7a10421b5", - "sha256:f093a22c4a40f8828f8e330a9c297cb93dcab13bd9678ded6de8e5cf81c56215" - ], - "markers": "python_version >= '3.8'", - "version": "==6.29.5" - }, - "ipython": { - "hashes": [ - "sha256:1cec0fbba8404af13facebe83d04436a7434c7400e59f47acf467c64abd0956c", - "sha256:e6b347c27bdf9c32ee9d31ae85defc525755a1869f14057e900675b9e8d6e6ff" - ], - "markers": "python_version >= '3.10'", - "version": "==8.26.0" - }, - "isort": { - "hashes": [ - "sha256:8bef7dde241278824a6d83f44a544709b065191b95b6e50894bdc722fcba0504", - "sha256:f84c2818376e66cf843d497486ea8fed8700b340f308f076c6fb1229dff318b6" - ], - "version": "==5.12.0" - }, - "jedi": { - "hashes": [ - "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd", - "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0" - ], - "markers": "python_version >= '3.6'", - "version": "==0.19.1" - }, - "jinja2": { - "hashes": [ - "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369", - "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d" - ], - "markers": "python_version >= '3.7'", - "version": "==3.1.4" - }, - "jsonschema": { - "hashes": [ - "sha256:4e5b3cf8216f577bee9ce139cbe72eca3ea4f292ec60928ff24758ce626cd163", - "sha256:c8a85b28d377cc7737e46e2d9f2b4f44ee3c0e1deac6bf46ddefc7187d30797a" - ], - "version": "==3.2.0" - }, - "jupyter-client": { - "hashes": [ - "sha256:2bda14d55ee5ba58552a8c53ae43d215ad9868853489213f37da060ced54d8df", - "sha256:50cbc5c66fd1b8f65ecb66bc490ab73217993632809b6e505687de18e9dea39f" - ], - "markers": "python_version >= '3.8'", - "version": "==8.6.2" - }, - "jupyter-core": { - "hashes": [ - "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409", - "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9" - ], - "markers": "python_version >= '3.8'", - "version": "==5.7.2" - }, - "kiwisolver": { - "hashes": [ - "sha256:00bd361b903dc4bbf4eb165f24d1acbee754fce22ded24c3d56eec268658a5cf", - "sha256:040c1aebeda72197ef477a906782b5ab0d387642e93bda547336b8957c61022e", - "sha256:05703cf211d585109fcd72207a31bb170a0f22144d68298dc5e61b3c946518af", - "sha256:06f54715b7737c2fecdbf140d1afb11a33d59508a47bf11bb38ecf21dc9ab79f", - "sha256:0dc9db8e79f0036e8173c466d21ef18e1befc02de8bf8aa8dc0813a6dc8a7046", - "sha256:0f114aa76dc1b8f636d077979c0ac22e7cd8f3493abbab152f20eb8d3cda71f3", - "sha256:11863aa14a51fd6ec28688d76f1735f8f69ab1fabf388851a595d0721af042f5", - "sha256:11c7de8f692fc99816e8ac50d1d1aef4f75126eefc33ac79aac02c099fd3db71", - "sha256:11d011a7574eb3b82bcc9c1a1d35c1d7075677fdd15de527d91b46bd35e935ee", - "sha256:146d14bebb7f1dc4d5fbf74f8a6cb15ac42baadee8912eb84ac0b3b2a3dc6ac3", - "sha256:15568384086b6df3c65353820a4473575dbad192e35010f622c6ce3eebd57af9", - "sha256:19df6e621f6d8b4b9c4d45f40a66839294ff2bb235e64d2178f7522d9170ac5b", - "sha256:1b04139c4236a0f3aff534479b58f6f849a8b351e1314826c2d230849ed48985", - "sha256:210ef2c3a1f03272649aff1ef992df2e724748918c4bc2d5a90352849eb40bea", - "sha256:2270953c0d8cdab5d422bee7d2007f043473f9d2999631c86a223c9db56cbd16", - "sha256:2400873bccc260b6ae184b2b8a4fec0e4082d30648eadb7c3d9a13405d861e89", - "sha256:2a40773c71d7ccdd3798f6489aaac9eee213d566850a9533f8d26332d626b82c", - "sha256:2c5674c4e74d939b9d91dda0fae10597ac7521768fec9e399c70a1f27e2ea2d9", - "sha256:3195782b26fc03aa9c6913d5bad5aeb864bdc372924c093b0f1cebad603dd712", - "sha256:31a82d498054cac9f6d0b53d02bb85811185bcb477d4b60144f915f3b3126342", - "sha256:32d5cf40c4f7c7b3ca500f8985eb3fb3a7dfc023215e876f207956b5ea26632a", - "sha256:346f5343b9e3f00b8db8ba359350eb124b98c99efd0b408728ac6ebf38173958", - "sha256:378a214a1e3bbf5ac4a8708304318b4f890da88c9e6a07699c4ae7174c09a68d", - "sha256:39b42c68602539407884cf70d6a480a469b93b81b7701378ba5e2328660c847a", - "sha256:3a2b053a0ab7a3960c98725cfb0bf5b48ba82f64ec95fe06f1d06c99b552e130", - "sha256:3aba7311af82e335dd1e36ffff68aaca609ca6290c2cb6d821a39aa075d8e3ff", - "sha256:3cd32d6c13807e5c66a7cbb79f90b553642f296ae4518a60d8d76243b0ad2898", - "sha256:3edd2fa14e68c9be82c5b16689e8d63d89fe927e56debd6e1dbce7a26a17f81b", - "sha256:4c380469bd3f970ef677bf2bcba2b6b0b4d5c75e7a020fb863ef75084efad66f", - "sha256:4e66e81a5779b65ac21764c295087de82235597a2293d18d943f8e9e32746265", - "sha256:53abb58632235cd154176ced1ae8f0d29a6657aa1aa9decf50b899b755bc2b93", - "sha256:5794cf59533bc3f1b1c821f7206a3617999db9fbefc345360aafe2e067514929", - "sha256:59415f46a37f7f2efeec758353dd2eae1b07640d8ca0f0c42548ec4125492635", - "sha256:59ec7b7c7e1a61061850d53aaf8e93db63dce0c936db1fda2658b70e4a1be709", - "sha256:59edc41b24031bc25108e210c0def6f6c2191210492a972d585a06ff246bb79b", - "sha256:5a580c91d686376f0f7c295357595c5a026e6cbc3d77b7c36e290201e7c11ecb", - "sha256:5b94529f9b2591b7af5f3e0e730a4e0a41ea174af35a4fd067775f9bdfeee01a", - "sha256:5c7b3b3a728dc6faf3fc372ef24f21d1e3cee2ac3e9596691d746e5a536de920", - "sha256:5c90ae8c8d32e472be041e76f9d2f2dbff4d0b0be8bd4041770eddb18cf49a4e", - "sha256:5e7139af55d1688f8b960ee9ad5adafc4ac17c1c473fe07133ac092310d76544", - "sha256:5ff5cf3571589b6d13bfbfd6bcd7a3f659e42f96b5fd1c4830c4cf21d4f5ef45", - "sha256:620ced262a86244e2be10a676b646f29c34537d0d9cc8eb26c08f53d98013390", - "sha256:6512cb89e334e4700febbffaaa52761b65b4f5a3cf33f960213d5656cea36a77", - "sha256:6c08e1312a9cf1074d17b17728d3dfce2a5125b2d791527f33ffbe805200a355", - "sha256:6c3bd3cde54cafb87d74d8db50b909705c62b17c2099b8f2e25b461882e544ff", - "sha256:6ef7afcd2d281494c0a9101d5c571970708ad911d028137cd558f02b851c08b4", - "sha256:7269d9e5f1084a653d575c7ec012ff57f0c042258bf5db0954bf551c158466e7", - "sha256:72d40b33e834371fd330fb1472ca19d9b8327acb79a5821d4008391db8e29f20", - "sha256:74d1b44c6cfc897df648cc9fdaa09bc3e7679926e6f96df05775d4fb3946571c", - "sha256:74db36e14a7d1ce0986fa104f7d5637aea5c82ca6326ed0ec5694280942d1162", - "sha256:763773d53f07244148ccac5b084da5adb90bfaee39c197554f01b286cf869228", - "sha256:76c6a5964640638cdeaa0c359382e5703e9293030fe730018ca06bc2010c4437", - "sha256:76d9289ed3f7501012e05abb8358bbb129149dbd173f1f57a1bf1c22d19ab7cc", - "sha256:7931d8f1f67c4be9ba1dd9c451fb0eeca1a25b89e4d3f89e828fe12a519b782a", - "sha256:7b8b454bac16428b22560d0a1cf0a09875339cab69df61d7805bf48919415901", - "sha256:7e5bab140c309cb3a6ce373a9e71eb7e4873c70c2dda01df6820474f9889d6d4", - "sha256:83d78376d0d4fd884e2c114d0621624b73d2aba4e2788182d286309ebdeed770", - "sha256:852542f9481f4a62dbb5dd99e8ab7aedfeb8fb6342349a181d4036877410f525", - "sha256:85267bd1aa8880a9c88a8cb71e18d3d64d2751a790e6ca6c27b8ccc724bcd5ad", - "sha256:88a2df29d4724b9237fc0c6eaf2a1adae0cdc0b3e9f4d8e7dc54b16812d2d81a", - "sha256:88b9f257ca61b838b6f8094a62418421f87ac2a1069f7e896c36a7d86b5d4c29", - "sha256:8ab3919a9997ab7ef2fbbed0cc99bb28d3c13e6d4b1ad36e97e482558a91be90", - "sha256:92dea1ffe3714fa8eb6a314d2b3c773208d865a0e0d35e713ec54eea08a66250", - "sha256:9407b6a5f0d675e8a827ad8742e1d6b49d9c1a1da5d952a67d50ef5f4170b18d", - "sha256:9408acf3270c4b6baad483865191e3e582b638b1654a007c62e3efe96f09a9a3", - "sha256:955e8513d07a283056b1396e9a57ceddbd272d9252c14f154d450d227606eb54", - "sha256:9db8ea4c388fdb0f780fe91346fd438657ea602d58348753d9fb265ce1bca67f", - "sha256:9eaa8b117dc8337728e834b9c6e2611f10c79e38f65157c4c38e9400286f5cb1", - "sha256:a51a263952b1429e429ff236d2f5a21c5125437861baeed77f5e1cc2d2c7c6da", - "sha256:a6aa6315319a052b4ee378aa171959c898a6183f15c1e541821c5c59beaa0238", - "sha256:aa12042de0171fad672b6c59df69106d20d5596e4f87b5e8f76df757a7c399aa", - "sha256:aaf7be1207676ac608a50cd08f102f6742dbfc70e8d60c4db1c6897f62f71523", - "sha256:b0157420efcb803e71d1b28e2c287518b8808b7cf1ab8af36718fd0a2c453eb0", - "sha256:b3f7e75f3015df442238cca659f8baa5f42ce2a8582727981cbfa15fee0ee205", - "sha256:b9098e0049e88c6a24ff64545cdfc50807818ba6c1b739cae221bbbcbc58aad3", - "sha256:ba55dce0a9b8ff59495ddd050a0225d58bd0983d09f87cfe2b6aec4f2c1234e4", - "sha256:bb86433b1cfe686da83ce32a9d3a8dd308e85c76b60896d58f082136f10bffac", - "sha256:bbea0db94288e29afcc4c28afbf3a7ccaf2d7e027489c449cf7e8f83c6346eb9", - "sha256:bbf1d63eef84b2e8c89011b7f2235b1e0bf7dacc11cac9431fc6468e99ac77fb", - "sha256:c7940c1dc63eb37a67721b10d703247552416f719c4188c54e04334321351ced", - "sha256:c9bf3325c47b11b2e51bca0824ea217c7cd84491d8ac4eefd1e409705ef092bd", - "sha256:cdc8a402aaee9a798b50d8b827d7ecf75edc5fb35ea0f91f213ff927c15f4ff0", - "sha256:ceec1a6bc6cab1d6ff5d06592a91a692f90ec7505d6463a88a52cc0eb58545da", - "sha256:cfe6ab8da05c01ba6fbea630377b5da2cd9bcbc6338510116b01c1bc939a2c18", - "sha256:d099e745a512f7e3bbe7249ca835f4d357c586d78d79ae8f1dcd4d8adeb9bda9", - "sha256:d0ef46024e6a3d79c01ff13801cb19d0cad7fd859b15037aec74315540acc276", - "sha256:d2e5a98f0ec99beb3c10e13b387f8db39106d53993f498b295f0c914328b1333", - "sha256:da4cfb373035def307905d05041c1d06d8936452fe89d464743ae7fb8371078b", - "sha256:da802a19d6e15dffe4b0c24b38b3af68e6c1a68e6e1d8f30148c83864f3881db", - "sha256:dced8146011d2bc2e883f9bd68618b8247387f4bbec46d7392b3c3b032640126", - "sha256:dfdd7c0b105af050eb3d64997809dc21da247cf44e63dc73ff0fd20b96be55a9", - "sha256:e368f200bbc2e4f905b8e71eb38b3c04333bddaa6a2464a6355487b02bb7fb09", - "sha256:e391b1f0a8a5a10ab3b9bb6afcfd74f2175f24f8975fb87ecae700d1503cdee0", - "sha256:e57e563a57fb22a142da34f38acc2fc1a5c864bc29ca1517a88abc963e60d6ec", - "sha256:e5d706eba36b4c4d5bc6c6377bb6568098765e990cfc21ee16d13963fab7b3e7", - "sha256:ec20916e7b4cbfb1f12380e46486ec4bcbaa91a9c448b97023fde0d5bbf9e4ff", - "sha256:f1d072c2eb0ad60d4c183f3fb44ac6f73fb7a8f16a2694a91f988275cbf352f9", - "sha256:f846c260f483d1fd217fe5ed7c173fb109efa6b1fc8381c8b7552c5781756192", - "sha256:f91de7223d4c7b793867797bacd1ee53bfe7359bd70d27b7b58a04efbb9436c8", - "sha256:faae4860798c31530dd184046a900e652c95513796ef51a12bc086710c2eec4d", - "sha256:fc579bf0f502e54926519451b920e875f433aceb4624a3646b3252b5caa9e0b6", - "sha256:fcc700eadbbccbf6bc1bcb9dbe0786b4b1cb91ca0dcda336eef5c2beed37b797", - "sha256:fd32ea360bcbb92d28933fc05ed09bffcb1704ba3fc7942e81db0fd4f81a7892", - "sha256:fdb7adb641a0d13bdcd4ef48e062363d8a9ad4a182ac7647ec88f695e719ae9f" - ], - "markers": "python_version >= '3.7'", - "version": "==1.4.5" - }, - "license-expression": { - "hashes": [ - "sha256:1295406f736b4f395ff069aec1cebfad53c0fcb3cf57df0f5ec58fc7b905aea5", - "sha256:ae0ba9a829d6909c785dc2f0131f13d10d68318e4a5f28af5ef152d6b52f9b41" - ], - "markers": "python_version >= '3.8'", - "version": "==30.3.0" - }, - "locket": { - "hashes": [ - "sha256:5c0d4c052a8bbbf750e056a8e65ccd309086f4f0f18a2eac306a8dfa4112a632", - "sha256:b6c819a722f7b6bd955b80781788e4a66a55628b858d347536b7e81325a3a5e3" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3'", - "version": "==1.0.0" - }, - "markupsafe": { - "hashes": [ - "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf", - "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff", - "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f", - "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3", - "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532", - "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f", - "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617", - "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df", - "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4", - "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906", - "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f", - "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4", - "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8", - "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371", - "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2", - "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465", - "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52", - "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6", - "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169", - "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad", - "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2", - "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0", - "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029", - "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f", - "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a", - "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced", - "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5", - "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c", - "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf", - "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9", - "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb", - "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad", - "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3", - "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1", - "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46", - "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc", - "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a", - "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee", - "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900", - "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5", - "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea", - "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f", - "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5", - "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e", - "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a", - "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f", - "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50", - "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a", - "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b", - "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4", - "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff", - "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2", - "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46", - "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b", - "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf", - "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5", - "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5", - "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab", - "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd", - "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68" - ], - "markers": "python_version >= '3.7'", - "version": "==2.1.5" - }, - "matplotlib": { - "hashes": [ - "sha256:0000354e32efcfd86bda75729716b92f5c2edd5b947200be9881f0a671565c33", - "sha256:0c584210c755ae921283d21d01f03a49ef46d1afa184134dd0f95b0202ee6f03", - "sha256:0e835c6988edc3d2d08794f73c323cc62483e13df0194719ecb0723b564e0b5c", - "sha256:0fc001516ffcf1a221beb51198b194d9230199d6842c540108e4ce109ac05cc0", - "sha256:11fed08f34fa682c2b792942f8902e7aefeed400da71f9e5816bea40a7ce28fe", - "sha256:208cbce658b72bf6a8e675058fbbf59f67814057ae78165d8a2f87c45b48d0ff", - "sha256:2315837485ca6188a4b632c5199900e28d33b481eb083663f6a44cfc8987ded3", - "sha256:26040c8f5121cd1ad712abffcd4b5222a8aec3a0fe40bc8542c94331deb8780d", - "sha256:3fda72d4d472e2ccd1be0e9ccb6bf0d2eaf635e7f8f51d737ed7e465ac020cb3", - "sha256:421851f4f57350bcf0811edd754a708d2275533e84f52f6760b740766c6747a7", - "sha256:44a21d922f78ce40435cb35b43dd7d573cf2a30138d5c4b709d19f00e3907fd7", - "sha256:4db17fea0ae3aceb8e9ac69c7e3051bae0b3d083bfec932240f9bf5d0197a049", - "sha256:565d572efea2b94f264dd86ef27919515aa6d629252a169b42ce5f570db7f37b", - "sha256:591d3a88903a30a6d23b040c1e44d1afdd0d778758d07110eb7596f811f31842", - "sha256:6d397fd8ccc64af2ec0af1f0efc3bacd745ebfb9d507f3f552e8adb689ed730a", - "sha256:7ccd6270066feb9a9d8e0705aa027f1ff39f354c72a87efe8fa07632f30fc6bb", - "sha256:82cd5acf8f3ef43f7532c2f230249720f5dc5dd40ecafaf1c60ac8200d46d7eb", - "sha256:83c6a792f1465d174c86d06f3ae85a8fe36e6f5964633ae8106312ec0921fdf5", - "sha256:84b3ba8429935a444f1fdc80ed930babbe06725bcf09fbeb5c8757a2cd74af04", - "sha256:a0c977c5c382f6696caf0bd277ef4f936da7e2aa202ff66cad5f0ac1428ee15b", - "sha256:a973c53ad0668c53e0ed76b27d2eeeae8799836fd0d0caaa4ecc66bf4e6676c0", - "sha256:ab38a4f3772523179b2f772103d8030215b318fef6360cb40558f585bf3d017f", - "sha256:b3fce58971b465e01b5c538f9d44915640c20ec5ff31346e963c9e1cd66fa812", - "sha256:b918770bf3e07845408716e5bbda17eadfc3fcbd9307dc67f37d6cf834bb3d98", - "sha256:d12cb1837cffaac087ad6b44399d5e22b78c729de3cdae4629e252067b705e2b", - "sha256:dc23f48ab630474264276be156d0d7710ac6c5a09648ccdf49fef9200d8cbe80", - "sha256:dd2a59ff4b83d33bca3b5ec58203cc65985367812cb8c257f3e101632be86d92", - "sha256:de06b19b8db95dd33d0dc17c926c7c9ebed9f572074b6fac4f65068a6814d010", - "sha256:f1f2e5d29e9435c97ad4c36fb6668e89aee13d48c75893e25cef064675038ac9" - ], - "index": "pypi", - "markers": "python_version >= '3.9'", - "version": "==3.9.1" - }, - "matplotlib-inline": { - "hashes": [ - "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90", - "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca" - ], - "markers": "python_version >= '3.8'", - "version": "==0.1.7" - }, - "mccabe": { - "hashes": [ - "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325", - "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e" - ], - "markers": "python_version >= '3.6'", - "version": "==0.7.0" - }, - "mypy": { - "hashes": [ - "sha256:0cd62192a4a32b77ceb31272d9e74d23cd88c8060c34d1d3622db3267679a5d9", - "sha256:1b3a2ffce52cc4dbaeee4df762f20a2905aa171ef157b82192f2e2f368eec05d", - "sha256:1f8f492d7db9e3593ef42d4f115f04e556130f2819ad33ab84551403e97dd4c0", - "sha256:2189ff1e39db399f08205e22a797383613ce1cb0cb3b13d8bcf0170e45b96cc3", - "sha256:378c03f53f10bbdd55ca94e46ec3ba255279706a6aacaecac52ad248f98205d3", - "sha256:37fd87cab83f09842653f08de066ee68f1182b9b5282e4634cdb4b407266bade", - "sha256:3c4c2992f6ea46ff7fce0072642cfb62af7a2484efe69017ed8b095f7b39ef31", - "sha256:51a46974340baaa4145363b9e051812a2446cf583dfaeba124af966fa44593f7", - "sha256:5bb9cd11c01c8606a9d0b83ffa91d0b236a0e91bc4126d9ba9ce62906ada868e", - "sha256:5cc3ca0a244eb9a5249c7c583ad9a7e881aa5d7b73c35652296ddcdb33b2b9c7", - "sha256:604282c886497645ffb87b8f35a57ec773a4a2721161e709a4422c1636ddde5c", - "sha256:6166a88b15f1759f94a46fa474c7b1b05d134b1b61fca627dd7335454cc9aa6b", - "sha256:6bacf8f3a3d7d849f40ca6caea5c055122efe70e81480c8328ad29c55c69e93e", - "sha256:6be84c06e6abd72f960ba9a71561c14137a583093ffcf9bbfaf5e613d63fa531", - "sha256:701b5f71413f1e9855566a34d6e9d12624e9e0a8818a5704d74d6b0402e66c04", - "sha256:71d8ac0b906354ebda8ef1673e5fde785936ac1f29ff6987c7483cfbd5a4235a", - "sha256:8addf6313777dbb92e9564c5d32ec122bf2c6c39d683ea64de6a1fd98b90fe37", - "sha256:901c89c2d67bba57aaaca91ccdb659aa3a312de67f23b9dfb059727cce2e2e0a", - "sha256:97a131ee36ac37ce9581f4220311247ab6cba896b4395b9c87af0675a13a755f", - "sha256:a1bbb3a6f5ff319d2b9d40b4080d46cd639abe3516d5a62c070cf0114a457d84", - "sha256:a2cbc68cb9e943ac0814c13e2452d2046c2f2b23ff0278e26599224cf164e78d", - "sha256:b8edd4e9bbbc9d7b79502eb9592cab808585516ae1bcc1446eb9122656c6066f", - "sha256:bd6f629b67bb43dc0d9211ee98b96d8dabc97b1ad38b9b25f5e4c4d7569a0c6a", - "sha256:c2ae450d60d7d020d67ab440c6e3fae375809988119817214440033f26ddf7bf", - "sha256:d8681909f7b44d0b7b86e653ca152d6dff0eb5eb41694e163c6092124f8246d7", - "sha256:e36f229acfe250dc660790840916eb49726c928e8ce10fbdf90715090fe4ae02", - "sha256:fe85ed6836165d52ae8b88f99527d3d1b2362e0cb90b005409b8bed90e9059b3" - ], - "version": "==1.10.1" - }, - "mypy-extensions": { - "hashes": [ - "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d", - "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.0" - }, - "nest-asyncio": { - "hashes": [ - "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", - "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c" - ], - "markers": "python_version >= '3.5'", - "version": "==1.6.0" - }, - "netcdf4": { - "hashes": [ - "sha256:0fed0eb65a7751a99a0cee08c6df383737d46d17c73cabae81d113f1b4fa3643", - "sha256:115160fc8e09333754542c33d721d42625a7bd62381a74f2f759297e3e38810b", - "sha256:1a09da245f4784421fb4d5740dae0367cdbb270d0a931a33474ec17a9433314d", - "sha256:30ac99e03d6e28419b206444fd6dc80a5e21d0ae8e53ff37d756fbc16c5d3775", - "sha256:33f5d66ee9cedf43d3932d0e5447eb471f9c53332f93476133b4bfc6b682f790", - "sha256:3a9ba8dc93f3d9019db921e42d40fa6791e7e244f3bb3a874bf2bfb96aea7380", - "sha256:5abdc8ab27bcb11325547841311717a0ba8f5b73a5fc5e93b933bc23285d0c03", - "sha256:75bba24ef0354fb6913bc3acdcb3790534e86bf329bbeaaf54122b18e5fd05ea", - "sha256:797f0b25d87827fc6821e415d9e15a2068604b18c3be62563e72682bcba76548", - "sha256:7a10da9b60d3358876d53a0cd691d2c900c2b39903bf25ad5235fd321d59eb2f", - "sha256:860222bc57bbc714e55705f263162be2c935129dcb700a944bda61aee785ff03", - "sha256:8fb3ed3541fa1b5b46e9d92d7e803734a1a3f37d8f5adf5fdf7957c7750cb20e", - "sha256:988c45f9122337a12267fb158953c0609e3ea50a557335a3105f104416a4821a", - "sha256:a4d05cc4c3628a7b88d623cb1a02908100a4938335a0289fa79c19016c21d7f9", - "sha256:a8d3209516aa8c58d70863ab1059af4ec82ef8ecb1c6b8cb4842d7825a6f64da", - "sha256:ac4e30a0d5a8e227d6a890502cfa201388acf606c0c73a5a7594232f3a74e67e", - "sha256:ce7f89b98dbb3acd9582db30e6478ce7a7003b2cb70dc20d85fe9506e65ab001", - "sha256:d5420155ca6c768c070922d80acd9f4088a913afd25a9fd2f429e7af626374eb", - "sha256:d649fad9d1f63e25a191576c7de158c8c3afa8d4b4001e8683e20da90b49b939", - "sha256:daa6169fe6617a4612cb75a8ef61ee14011a012633ad1ace1b629a1ff87bf5cf", - "sha256:dcad21e965978cc5530131bd7e73dcabe7dda1f681f9e4ebf940a65a176d25fe", - "sha256:e15f3afa4e6910fc158a318ea73fdc6f9e41058c71bf98a99fd63994334d16b0", - "sha256:f24027ae19b68cc1274aad8b00d6d81879d506ddca011a080dff2117014398b9", - "sha256:fbbca82a822ba74b605254f7a267d258f13d67f8a4156a09e26322bfa002a82d", - "sha256:fdcec3a3150f9248e76301ad723f51955efc770edf015dfb61a6480cc7c04a70" - ], - "version": "==1.7.1.post1" - }, - "nodeenv": { - "hashes": [ - "sha256:6ec12890a2dab7946721edbfbcd91f3319c6ccc9aec47be7c7e6b7011ee6645f", - "sha256:ba11c9782d29c27c70ffbdda2d7415098754709be8a7056d79a737cd901155c9" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6'", - "version": "==1.9.1" - }, - "numpy": { - "hashes": [ - "sha256:04494f6ec467ccb5369d1808570ae55f6ed9b5809d7f035059000a37b8d7e86f", - "sha256:0a43f0974d501842866cc83471bdb0116ba0dffdbaac33ec05e6afed5b615238", - "sha256:0e50842b2295ba8414c8c1d9d957083d5dfe9e16828b37de883f51fc53c4016f", - "sha256:0ec84b9ba0654f3b962802edc91424331f423dcf5d5f926676e0150789cb3d95", - "sha256:17067d097ed036636fa79f6a869ac26df7db1ba22039d962422506640314933a", - "sha256:1cde1753efe513705a0c6d28f5884e22bdc30438bf0085c5c486cdaff40cd67a", - "sha256:1e72728e7501a450288fc8e1f9ebc73d90cfd4671ebbd631f3e7857c39bd16f2", - "sha256:2635dbd200c2d6faf2ef9a0d04f0ecc6b13b3cad54f7c67c61155138835515d2", - "sha256:2ce46fd0b8a0c947ae047d222f7136fc4d55538741373107574271bc00e20e8f", - "sha256:34f003cb88b1ba38cb9a9a4a3161c1604973d7f9d5552c38bc2f04f829536609", - "sha256:354f373279768fa5a584bac997de6a6c9bc535c482592d7a813bb0c09be6c76f", - "sha256:38ecb5b0582cd125f67a629072fed6f83562d9dd04d7e03256c9829bdec027ad", - "sha256:3e8e01233d57639b2e30966c63d36fcea099d17c53bf424d77f088b0f4babd86", - "sha256:3f6bed7f840d44c08ebdb73b1825282b801799e325bcbdfa6bc5c370e5aecc65", - "sha256:4554eb96f0fd263041baf16cf0881b3f5dafae7a59b1049acb9540c4d57bc8cb", - "sha256:46e161722e0f619749d1cd892167039015b2c2817296104487cd03ed4a955995", - "sha256:49d9f7d256fbc804391a7f72d4a617302b1afac1112fac19b6c6cec63fe7fe8a", - "sha256:4d2f62e55a4cd9c58c1d9a1c9edaedcd857a73cb6fda875bf79093f9d9086f85", - "sha256:5f64641b42b2429f56ee08b4f427a4d2daf916ec59686061de751a55aafa22e4", - "sha256:63b92c512d9dbcc37f9d81b123dec99fdb318ba38c8059afc78086fe73820275", - "sha256:6d7696c615765091cc5093f76fd1fa069870304beaccfd58b5dcc69e55ef49c1", - "sha256:79e843d186c8fb1b102bef3e2bc35ef81160ffef3194646a7fdd6a73c6b97196", - "sha256:821eedb7165ead9eebdb569986968b541f9908979c2da8a4967ecac4439bae3d", - "sha256:84554fc53daa8f6abf8e8a66e076aff6ece62de68523d9f665f32d2fc50fd66e", - "sha256:8d83bb187fb647643bd56e1ae43f273c7f4dbcdf94550d7938cfc32566756514", - "sha256:903703372d46bce88b6920a0cd86c3ad82dae2dbef157b5fc01b70ea1cfc430f", - "sha256:9416a5c2e92ace094e9f0082c5fd473502c91651fb896bc17690d6fc475128d6", - "sha256:9a1712c015831da583b21c5bfe15e8684137097969c6d22e8316ba66b5baabe4", - "sha256:9c27f0946a3536403efb0e1c28def1ae6730a72cd0d5878db38824855e3afc44", - "sha256:a356364941fb0593bb899a1076b92dfa2029f6f5b8ba88a14fd0984aaf76d0df", - "sha256:a7039a136017eaa92c1848152827e1424701532ca8e8967fe480fe1569dae581", - "sha256:acd3a644e4807e73b4e1867b769fbf1ce8c5d80e7caaef0d90dcdc640dfc9787", - "sha256:ad0c86f3455fbd0de6c31a3056eb822fc939f81b1618f10ff3406971893b62a5", - "sha256:b4c76e3d4c56f145d41b7b6751255feefae92edbc9a61e1758a98204200f30fc", - "sha256:b6f6a8f45d0313db07d6d1d37bd0b112f887e1369758a5419c0370ba915b3871", - "sha256:c5a59996dc61835133b56a32ebe4ef3740ea5bc19b3983ac60cc32be5a665d54", - "sha256:c73aafd1afca80afecb22718f8700b40ac7cab927b8abab3c3e337d70e10e5a2", - "sha256:cee6cc0584f71adefe2c908856ccc98702baf95ff80092e4ca46061538a2ba98", - "sha256:cef04d068f5fb0518a77857953193b6bb94809a806bd0a14983a8f12ada060c9", - "sha256:cf5d1c9e6837f8af9f92b6bd3e86d513cdc11f60fd62185cc49ec7d1aba34864", - "sha256:e61155fae27570692ad1d327e81c6cf27d535a5d7ef97648a17d922224b216de", - "sha256:e7f387600d424f91576af20518334df3d97bc76a300a755f9a8d6e4f5cadd289", - "sha256:ed08d2703b5972ec736451b818c2eb9da80d66c3e84aed1deeb0c345fefe461b", - "sha256:fbd6acc766814ea6443628f4e6751d0da6593dae29c08c0b2606164db026970c", - "sha256:feff59f27338135776f6d4e2ec7aeeac5d5f7a08a83e80869121ef8164b74af9" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.0" - }, - "packaging": { - "hashes": [ - "sha256:026ed72c8ed3fcce5bf8950572258698927fd1dbda10a5e981cdf0ac37f4f002", - "sha256:5b8f2217dbdbd2f7f384c41c628544e6d52f2d0f53c6d0c3ea61aa5d1d7ff124" - ], - "markers": "python_version >= '3.8'", - "version": "==24.1" - }, - "pandas": { - "hashes": [ - "sha256:001910ad31abc7bf06f49dcc903755d2f7f3a9186c0c040b827e522e9cef0863", - "sha256:0ca6377b8fca51815f382bd0b697a0814c8bda55115678cbc94c30aacbb6eff2", - "sha256:0cace394b6ea70c01ca1595f839cf193df35d1575986e484ad35c4aeae7266c1", - "sha256:1cb51fe389360f3b5a4d57dbd2848a5f033350336ca3b340d1c53a1fad33bcad", - "sha256:2925720037f06e89af896c70bca73459d7e6a4be96f9de79e2d440bd499fe0db", - "sha256:3e374f59e440d4ab45ca2fffde54b81ac3834cf5ae2cdfa69c90bc03bde04d76", - "sha256:40ae1dffb3967a52203105a077415a86044a2bea011b5f321c6aa64b379a3f51", - "sha256:43498c0bdb43d55cb162cdc8c06fac328ccb5d2eabe3cadeb3529ae6f0517c32", - "sha256:4abfe0be0d7221be4f12552995e58723c7422c80a659da13ca382697de830c08", - "sha256:58b84b91b0b9f4bafac2a0ac55002280c094dfc6402402332c0913a59654ab2b", - "sha256:640cef9aa381b60e296db324337a554aeeb883ead99dc8f6c18e81a93942f5f4", - "sha256:66b479b0bd07204e37583c191535505410daa8df638fd8e75ae1b383851fe921", - "sha256:696039430f7a562b74fa45f540aca068ea85fa34c244d0deee539cb6d70aa288", - "sha256:6d2123dc9ad6a814bcdea0f099885276b31b24f7edf40f6cdbc0912672e22eee", - "sha256:8635c16bf3d99040fdf3ca3db669a7250ddf49c55dc4aa8fe0ae0fa8d6dcc1f0", - "sha256:873d13d177501a28b2756375d59816c365e42ed8417b41665f346289adc68d24", - "sha256:8e5a0b00e1e56a842f922e7fae8ae4077aee4af0acb5ae3622bd4b4c30aedf99", - "sha256:8e90497254aacacbc4ea6ae5e7a8cd75629d6ad2b30025a4a8b09aa4faf55151", - "sha256:9057e6aa78a584bc93a13f0a9bf7e753a5e9770a30b4d758b8d5f2a62a9433cd", - "sha256:90c6fca2acf139569e74e8781709dccb6fe25940488755716d1d354d6bc58bce", - "sha256:92fd6b027924a7e178ac202cfbe25e53368db90d56872d20ffae94b96c7acc57", - "sha256:9dfde2a0ddef507a631dc9dc4af6a9489d5e2e740e226ad426a05cabfbd7c8ef", - "sha256:9e79019aba43cb4fda9e4d983f8e88ca0373adbb697ae9c6c43093218de28b54", - "sha256:a77e9d1c386196879aa5eb712e77461aaee433e54c68cf253053a73b7e49c33a", - "sha256:c7adfc142dac335d8c1e0dcbd37eb8617eac386596eb9e1a1b77791cf2498238", - "sha256:d187d355ecec3629624fccb01d104da7d7f391db0311145817525281e2804d23", - "sha256:ddf818e4e6c7c6f4f7c8a12709696d193976b591cc7dc50588d3d1a6b5dc8772", - "sha256:e9b79011ff7a0f4b1d6da6a61aa1aa604fb312d6647de5bad20013682d1429ce", - "sha256:eee3a87076c0756de40b05c5e9a6069c035ba43e8dd71c379e68cab2c20f16ad" - ], - "markers": "python_version >= '3.9'", - "version": "==2.2.2" - }, - "parso": { - "hashes": [ - "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18", - "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d" - ], - "markers": "python_version >= '3.6'", - "version": "==0.8.4" - }, - "partd": { - "hashes": [ - "sha256:978e4ac767ec4ba5b86c6eaa52e5a2a3bc748a2ca839e8cc798f1cc6ce6efb0f", - "sha256:d022c33afbdc8405c226621b015e8067888173d85f7f5ecebb3cafed9a20f02c" - ], - "markers": "python_version >= '3.9'", - "version": "==1.4.2" - }, - "pathspec": { - "hashes": [ - "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08", - "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712" - ], - "markers": "python_version >= '3.8'", - "version": "==0.12.1" - }, - "patsy": { - "hashes": [ - "sha256:19056886fd8fa71863fa32f0eb090267f21fb74be00f19f5c70b2e9d76c883c6", - "sha256:95c6d47a7222535f84bff7f63d7303f2e297747a598db89cf5c67f0c0c7d2cdb" - ], - "version": "==0.5.6" - }, - "pexpect": { - "hashes": [ - "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", - "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f" - ], - "markers": "sys_platform != 'win32' and sys_platform != 'emscripten'", - "version": "==4.9.0" - }, - "pillow": { - "hashes": [ - "sha256:02a2be69f9c9b8c1e97cf2713e789d4e398c751ecfd9967c18d0ce304efbf885", - "sha256:030abdbe43ee02e0de642aee345efa443740aa4d828bfe8e2eb11922ea6a21ea", - "sha256:06b2f7898047ae93fad74467ec3d28fe84f7831370e3c258afa533f81ef7f3df", - "sha256:0755ffd4a0c6f267cccbae2e9903d95477ca2f77c4fcf3a3a09570001856c8a5", - "sha256:0a9ec697746f268507404647e531e92889890a087e03681a3606d9b920fbee3c", - "sha256:0ae24a547e8b711ccaaf99c9ae3cd975470e1a30caa80a6aaee9a2f19c05701d", - "sha256:134ace6dc392116566980ee7436477d844520a26a4b1bd4053f6f47d096997fd", - "sha256:166c1cd4d24309b30d61f79f4a9114b7b2313d7450912277855ff5dfd7cd4a06", - "sha256:1b5dea9831a90e9d0721ec417a80d4cbd7022093ac38a568db2dd78363b00908", - "sha256:1d846aea995ad352d4bdcc847535bd56e0fd88d36829d2c90be880ef1ee4668a", - "sha256:1ef61f5dd14c300786318482456481463b9d6b91ebe5ef12f405afbba77ed0be", - "sha256:297e388da6e248c98bc4a02e018966af0c5f92dfacf5a5ca22fa01cb3179bca0", - "sha256:298478fe4f77a4408895605f3482b6cc6222c018b2ce565c2b6b9c354ac3229b", - "sha256:29dbdc4207642ea6aad70fbde1a9338753d33fb23ed6956e706936706f52dd80", - "sha256:2db98790afc70118bd0255c2eeb465e9767ecf1f3c25f9a1abb8ffc8cfd1fe0a", - "sha256:32cda9e3d601a52baccb2856b8ea1fc213c90b340c542dcef77140dfa3278a9e", - "sha256:37fb69d905be665f68f28a8bba3c6d3223c8efe1edf14cc4cfa06c241f8c81d9", - "sha256:416d3a5d0e8cfe4f27f574362435bc9bae57f679a7158e0096ad2beb427b8696", - "sha256:43efea75eb06b95d1631cb784aa40156177bf9dd5b4b03ff38979e048258bc6b", - "sha256:4b35b21b819ac1dbd1233317adeecd63495f6babf21b7b2512d244ff6c6ce309", - "sha256:4d9667937cfa347525b319ae34375c37b9ee6b525440f3ef48542fcf66f2731e", - "sha256:5161eef006d335e46895297f642341111945e2c1c899eb406882a6c61a4357ab", - "sha256:543f3dc61c18dafb755773efc89aae60d06b6596a63914107f75459cf984164d", - "sha256:551d3fd6e9dc15e4c1eb6fc4ba2b39c0c7933fa113b220057a34f4bb3268a060", - "sha256:59291fb29317122398786c2d44427bbd1a6d7ff54017075b22be9d21aa59bd8d", - "sha256:5b001114dd152cfd6b23befeb28d7aee43553e2402c9f159807bf55f33af8a8d", - "sha256:5b4815f2e65b30f5fbae9dfffa8636d992d49705723fe86a3661806e069352d4", - "sha256:5dc6761a6efc781e6a1544206f22c80c3af4c8cf461206d46a1e6006e4429ff3", - "sha256:5e84b6cc6a4a3d76c153a6b19270b3526a5a8ed6b09501d3af891daa2a9de7d6", - "sha256:6209bb41dc692ddfee4942517c19ee81b86c864b626dbfca272ec0f7cff5d9fb", - "sha256:673655af3eadf4df6b5457033f086e90299fdd7a47983a13827acf7459c15d94", - "sha256:6c762a5b0997f5659a5ef2266abc1d8851ad7749ad9a6a5506eb23d314e4f46b", - "sha256:7086cc1d5eebb91ad24ded9f58bec6c688e9f0ed7eb3dbbf1e4800280a896496", - "sha256:73664fe514b34c8f02452ffb73b7a92c6774e39a647087f83d67f010eb9a0cf0", - "sha256:76a911dfe51a36041f2e756b00f96ed84677cdeb75d25c767f296c1c1eda1319", - "sha256:780c072c2e11c9b2c7ca37f9a2ee8ba66f44367ac3e5c7832afcfe5104fd6d1b", - "sha256:7928ecbf1ece13956b95d9cbcfc77137652b02763ba384d9ab508099a2eca856", - "sha256:7970285ab628a3779aecc35823296a7869f889b8329c16ad5a71e4901a3dc4ef", - "sha256:7a8d4bade9952ea9a77d0c3e49cbd8b2890a399422258a77f357b9cc9be8d680", - "sha256:7c1ee6f42250df403c5f103cbd2768a28fe1a0ea1f0f03fe151c8741e1469c8b", - "sha256:7dfecdbad5c301d7b5bde160150b4db4c659cee2b69589705b6f8a0c509d9f42", - "sha256:812f7342b0eee081eaec84d91423d1b4650bb9828eb53d8511bcef8ce5aecf1e", - "sha256:866b6942a92f56300012f5fbac71f2d610312ee65e22f1aa2609e491284e5597", - "sha256:86dcb5a1eb778d8b25659d5e4341269e8590ad6b4e8b44d9f4b07f8d136c414a", - "sha256:87dd88ded2e6d74d31e1e0a99a726a6765cda32d00ba72dc37f0651f306daaa8", - "sha256:8bc1a764ed8c957a2e9cacf97c8b2b053b70307cf2996aafd70e91a082e70df3", - "sha256:8d4d5063501b6dd4024b8ac2f04962d661222d120381272deea52e3fc52d3736", - "sha256:8f0aef4ef59694b12cadee839e2ba6afeab89c0f39a3adc02ed51d109117b8da", - "sha256:930044bb7679ab003b14023138b50181899da3f25de50e9dbee23b61b4de2126", - "sha256:950be4d8ba92aca4b2bb0741285a46bfae3ca699ef913ec8416c1b78eadd64cd", - "sha256:961a7293b2457b405967af9c77dcaa43cc1a8cd50d23c532e62d48ab6cdd56f5", - "sha256:9b885f89040bb8c4a1573566bbb2f44f5c505ef6e74cec7ab9068c900047f04b", - "sha256:9f4727572e2918acaa9077c919cbbeb73bd2b3ebcfe033b72f858fc9fbef0026", - "sha256:a02364621fe369e06200d4a16558e056fe2805d3468350df3aef21e00d26214b", - "sha256:a985e028fc183bf12a77a8bbf36318db4238a3ded7fa9df1b9a133f1cb79f8fc", - "sha256:ac1452d2fbe4978c2eec89fb5a23b8387aba707ac72810d9490118817d9c0b46", - "sha256:b15e02e9bb4c21e39876698abf233c8c579127986f8207200bc8a8f6bb27acf2", - "sha256:b2724fdb354a868ddf9a880cb84d102da914e99119211ef7ecbdc613b8c96b3c", - "sha256:bbc527b519bd3aa9d7f429d152fea69f9ad37c95f0b02aebddff592688998abe", - "sha256:bcd5e41a859bf2e84fdc42f4edb7d9aba0a13d29a2abadccafad99de3feff984", - "sha256:bd2880a07482090a3bcb01f4265f1936a903d70bc740bfcb1fd4e8a2ffe5cf5a", - "sha256:bee197b30783295d2eb680b311af15a20a8b24024a19c3a26431ff83eb8d1f70", - "sha256:bf2342ac639c4cf38799a44950bbc2dfcb685f052b9e262f446482afaf4bffca", - "sha256:c76e5786951e72ed3686e122d14c5d7012f16c8303a674d18cdcd6d89557fc5b", - "sha256:cbed61494057c0f83b83eb3a310f0bf774b09513307c434d4366ed64f4128a91", - "sha256:cfdd747216947628af7b259d274771d84db2268ca062dd5faf373639d00113a3", - "sha256:d7480af14364494365e89d6fddc510a13e5a2c3584cb19ef65415ca57252fb84", - "sha256:dbc6ae66518ab3c5847659e9988c3b60dc94ffb48ef9168656e0019a93dbf8a1", - "sha256:dc3e2db6ba09ffd7d02ae9141cfa0ae23393ee7687248d46a7507b75d610f4f5", - "sha256:dfe91cb65544a1321e631e696759491ae04a2ea11d36715eca01ce07284738be", - "sha256:e4d49b85c4348ea0b31ea63bc75a9f3857869174e2bf17e7aba02945cd218e6f", - "sha256:e4db64794ccdf6cb83a59d73405f63adbe2a1887012e308828596100a0b2f6cc", - "sha256:e553cad5179a66ba15bb18b353a19020e73a7921296a7979c4a2b7f6a5cd57f9", - "sha256:e88d5e6ad0d026fba7bdab8c3f225a69f063f116462c49892b0149e21b6c0a0e", - "sha256:ecd85a8d3e79cd7158dec1c9e5808e821feea088e2f69a974db5edf84dc53141", - "sha256:f5b92f4d70791b4a67157321c4e8225d60b119c5cc9aee8ecf153aace4aad4ef", - "sha256:f5f0c3e969c8f12dd2bb7e0b15d5c468b51e5017e01e2e867335c81903046a22", - "sha256:f7baece4ce06bade126fb84b8af1c33439a76d8a6fd818970215e0560ca28c27", - "sha256:ff25afb18123cea58a591ea0244b92eb1e61a1fd497bf6d6384f09bc3262ec3e", - "sha256:ff337c552345e95702c5fde3158acb0625111017d0e5f24bf3acdb9cc16b90d1" - ], - "markers": "python_version >= '3.8'", - "version": "==10.4.0" - }, - "platformdirs": { - "hashes": [ - "sha256:2d7a1657e36a80ea911db832a8a6ece5ee53d8de21edd5cc5879af6530b1bfee", - "sha256:38b7b51f512eed9e84a22788b4bce1de17c0adb134d6becb09836e37d8654cd3" - ], - "markers": "python_version >= '3.8'", - "version": "==4.2.2" - }, - "pluggy": { - "hashes": [ - "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1", - "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669" - ], - "markers": "python_version >= '3.8'", - "version": "==1.5.0" - }, - "pre-commit": { - "hashes": [ - "sha256:8ca3ad567bc78a4972a3f1a477e94a79d4597e8140a6e0b651c5e33899c3654a", - "sha256:fae36fd1d7ad7d6a5a1c0b0d5adb2ed1a3bda5a21bf6c3e5372073d7a11cd4c5" - ], - "version": "==3.7.1" - }, - "prompt-toolkit": { - "hashes": [ - "sha256:0d7bfa67001d5e39d02c224b663abc33687405033a8c422d0d675a5a13361d10", - "sha256:1e1b29cb58080b1e69f207c893a1a7bf16d127a5c30c9d17a25a5d77792e5360" - ], - "markers": "python_full_version >= '3.7.0'", - "version": "==3.0.47" - }, - "psutil": { - "hashes": [ - "sha256:02b69001f44cc73c1c5279d02b30a817e339ceb258ad75997325e0e6169d8b35", - "sha256:1287c2b95f1c0a364d23bc6f2ea2365a8d4d9b726a3be7294296ff7ba97c17f0", - "sha256:1e7c870afcb7d91fdea2b37c24aeb08f98b6d67257a5cb0a8bc3ac68d0f1a68c", - "sha256:21f1fb635deccd510f69f485b87433460a603919b45e2a324ad65b0cc74f8fb1", - "sha256:33ea5e1c975250a720b3a6609c490db40dae5d83a4eb315170c4fe0d8b1f34b3", - "sha256:34859b8d8f423b86e4385ff3665d3f4d94be3cdf48221fbe476e883514fdb71c", - "sha256:5fd9a97c8e94059b0ef54a7d4baf13b405011176c3b6ff257c247cae0d560ecd", - "sha256:6ec7588fb3ddaec7344a825afe298db83fe01bfaaab39155fa84cf1c0d6b13c3", - "sha256:6ed2440ada7ef7d0d608f20ad89a04ec47d2d3ab7190896cd62ca5fc4fe08bf0", - "sha256:8faae4f310b6d969fa26ca0545338b21f73c6b15db7c4a8d934a5482faa818f2", - "sha256:a021da3e881cd935e64a3d0a20983bda0bb4cf80e4f74fa9bfcb1bc5785360c6", - "sha256:a495580d6bae27291324fe60cea0b5a7c23fa36a7cd35035a16d93bdcf076b9d", - "sha256:a9a3dbfb4de4f18174528d87cc352d1f788b7496991cca33c6996f40c9e3c92c", - "sha256:c588a7e9b1173b6e866756dde596fd4cad94f9399daf99ad8c3258b3cb2b47a0", - "sha256:e2e8d0054fc88153ca0544f5c4d554d42e33df2e009c4ff42284ac9ebdef4132", - "sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14", - "sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2, 3.3, 3.4, 3.5'", - "version": "==6.0.0" - }, - "psy-simple": { - "extras": [ - "testsite" - ], - "file": "../../.." - }, - "psyplot": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot.git", - "markers": "python_version >= '3.9'", - "ref": "ad4b5dab210c8d4a98a6e771a605b62397e0dcb6" - }, - "psyplot-gui": { - "git": "git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git", - "markers": "python_version >= '3.9'", - "ref": "4e42b2fa5623918e1db055b044e966899a92ebb3" - }, - "ptyprocess": { - "hashes": [ - "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", - "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220" - ], - "version": "==0.7.0" - }, - "pure-eval": { - "hashes": [ - "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350", - "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3" - ], - "version": "==0.2.2" - }, - "pycodestyle": { - "hashes": [ - "sha256:347187bdb476329d98f695c213d7295a846d1152ff4fe9bacb8a9590b8ee7053", - "sha256:8a4eaf0d0495c7395bdab3589ac2db602797d76207242c17d470186815706610" - ], - "markers": "python_version >= '3.6'", - "version": "==2.10.0" - }, - "pyflakes": { - "hashes": [ - "sha256:ec55bf7fe21fff7f1ad2f7da62363d749e2a470500eab1b555334b67aa1ef8cf", - "sha256:ec8b276a6b60bd80defed25add7e439881c19e64850afd9b346283d4165fd0fd" - ], - "markers": "python_version >= '3.6'", - "version": "==3.0.1" - }, - "pygments": { - "hashes": [ - "sha256:786ff802f32e91311bff3889f6e9a86e81505fe99f2735bb6d60ae0c5004f199", - "sha256:b8e6aca0523f3ab76fee51799c488e38782ac06eafcf95e7ba832985c8e7b13a" - ], - "markers": "python_version >= '3.8'", - "version": "==2.18.0" - }, - "pykwalify": { - "hashes": [ - "sha256:731dfa87338cca9f559d1fca2bdea37299116e3139b73f78ca90a543722d6651", - "sha256:796b2ad3ed4cb99b88308b533fb2f559c30fa6efb4fa9fda11347f483d245884" - ], - "version": "==1.8.0" - }, - "pyparsing": { - "hashes": [ - "sha256:a1bac0ce561155ecc3ed78ca94d3c9378656ad4c94c1270de543f621420f94ad", - "sha256:f9db75911801ed778fe61bb643079ff86601aca99fcae6345aa67292038fb742" - ], - "markers": "python_full_version >= '3.6.8'", - "version": "==3.1.2" - }, - "pyproject-api": { - "hashes": [ - "sha256:2dc1654062c2b27733d8fd4cdda672b22fe8741ef1dde8e3a998a9547b071eeb", - "sha256:7ebc6cd10710f89f4cf2a2731710a98abce37ebff19427116ff2174c9236a827" - ], - "markers": "python_version >= '3.8'", - "version": "==1.7.1" - }, - "pyqt5": { - "hashes": [ - "sha256:501355f327e9a2c38db0428e1a236d25ebcb99304cd6e668c05d1188d514adec", - "sha256:862cea3be95b4b0a2b9678003b3a18edf7bd5eafd673860f58820f246d4bf616", - "sha256:93288d62ebd47b1933d80c27f5d43c7c435307b84d480af689cef2474e87e4c8", - "sha256:b89478d16d4118664ff58ed609e0a804d002703c9420118de7e4e70fa1cb5486", - "sha256:d46b7804b1b10a4ff91753f8113e5b5580d2b4462f3226288e2d84497334898a", - "sha256:ff99b4f91aa8eb60510d5889faad07116d3340041916e46c07d519f7cad344e1" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.10" - }, - "pyqt5-qt5": { - "hashes": [ - "sha256:730da7e6a97f6bad1b6df21082fe625647730418bc83e20cbc2ff6401ed0a8be", - "sha256:aa3911276b1a1aa9b5b9cba687ef905faddd706980d34e234312591c3d3cbef8", - "sha256:c89b35b2aaf24d2805cc76fe31880c77b7f7557db8aafb26f1015f1bba7031d6" - ], - "version": "==5.15.14" - }, - "pyqt5-sip": { - "hashes": [ - "sha256:0b718a362f4392430903bbb2a4b9bbff9841a16a52f0cfdd5b5bbd9d11457980", - "sha256:0c1c727ede7fdc464a1fe2e46109ba836509b2d7187a46fdeae443148ce51d1c", - "sha256:0cd21c3215e3c47fdd5fa7a2dc3dd1e07a7230b0626e905a7217925068c788b9", - "sha256:13f0c6a78e781255863e3e160304648efaf62276b7102741af637b63a6e96930", - "sha256:24a1d4937332bf0a38dd95bb2ce4d89723df449f6e912b52ef0e107e11fefac1", - "sha256:2575f428de584a12009fd29d00c89df16ed101a3b38beba818dfdcbc4a10709c", - "sha256:749f7a3ffd6e3d2d5db65ed92c95cbd14490631595c61f0c0672c9238bfb17de", - "sha256:7f88c85702dce80ac2e1a162054f688ed394811d6dd03a5574b3fa8111b0a6db", - "sha256:83d247cdc43ef224410b14c97413067ea26356dfa39e9ed0fe702a31e25710b0", - "sha256:852b75cf208825602480e95ab63314108f872d0da251e9ad3deaaff5a183a6f5", - "sha256:855563d4d3b59ce7438bbf2dd32fed2707787defa40f3efe94f204a19ef92b25", - "sha256:91b9538458a3a23e033c213bc879ce64f3d0a33d5a49cbd03e1e584efe307a35", - "sha256:97f2d6e8d9b7b3d3e795d576d7f56e6257f524221f6383b33ded7287763e9f06", - "sha256:b4adc529fa4ec05728e14ea55194d907cc51f18d6f2ac5cc9f6eb52ac038aa0f", - "sha256:b58eeedc9b2a3037b136bf96915196c391a33be470ed1c0723d7163ef0b727a2", - "sha256:c0c543d604116af26694a8a5ba90f510551ff9124d503ae5ee14bb73a61363a3", - "sha256:c85be433fbafcb3d417581c0e1b67c8198d23858166e4f938e971c2262c13cdb", - "sha256:d23fdfcf363b5cedd9d39f8a9c5710e7d52804f5b08a58e91c638b36eafcb702", - "sha256:dd241de9c569c07bbba62bff1049996e5b52478164f61f430073a87bf6d26d33", - "sha256:ed5221c6241981bd98d39504823efb9cbe36841bf8917288f8fe8fc1d5569a41", - "sha256:f600ae6f03e4bff91153c0dc7ebe52f90bd2b6afda58fd580e6990b3b951adc0" - ], - "markers": "python_version >= '3.8'", - "version": "==12.15.0" - }, - "pyqtwebengine": { - "hashes": [ - "sha256:61d0ceb20025ba4d2d1ce3c2b3a7a43e240069c4203dfc4a8dddfb00923b1d3c", - "sha256:67110bc9d5b7e633dcc242b8228cc54b1532abc039fdf534b383ac40a60b7ba3", - "sha256:8c2fce2458e7b781d2cc3070b336f67d39a717c5eef2f823cae501d5d9f200de", - "sha256:a90c945606683a53c9b264a7509943fd835d50366d535c22ddde952f23d35748", - "sha256:ae241ef2a61c782939c58b52c2aea53ad99b30f3934c8358d5e0a6ebb3fd0721", - "sha256:dbd1a768877040050d3159270f5ab95758af4954c4cb4e54195bd3cad519d5b6" - ], - "markers": "python_version >= '3.7'", - "version": "==5.15.6" - }, - "pyqtwebengine-qt5": { - "hashes": [ - "sha256:28f83cd41f0aa87605c33880d6051d83e8ca64218cfbddd302fa13965b4504a6", - "sha256:2bc1fb0576802da609204d41df43787635216a310fadb6c81c89cf992bc63c52", - "sha256:763b11fff44f9af07b0ed7450cddf1c59fa6735820f86f42f6773ec48e4d18b6" - ], - "version": "==5.15.14" - }, - "pyrsistent": { - "hashes": [ - "sha256:0724c506cd8b63c69c7f883cc233aac948c1ea946ea95996ad8b1380c25e1d3f", - "sha256:09848306523a3aba463c4b49493a760e7a6ca52e4826aa100ee99d8d39b7ad1e", - "sha256:0f3b1bcaa1f0629c978b355a7c37acd58907390149b7311b5db1b37648eb6958", - "sha256:21cc459636983764e692b9eba7144cdd54fdec23ccdb1e8ba392a63666c60c34", - "sha256:2e14c95c16211d166f59c6611533d0dacce2e25de0f76e4c140fde250997b3ca", - "sha256:2e2c116cc804d9b09ce9814d17df5edf1df0c624aba3b43bc1ad90411487036d", - "sha256:4021a7f963d88ccd15b523787d18ed5e5269ce57aa4037146a2377ff607ae87d", - "sha256:4c48f78f62ab596c679086084d0dd13254ae4f3d6c72a83ffdf5ebdef8f265a4", - "sha256:4f5c2d012671b7391803263419e31b5c7c21e7c95c8760d7fc35602353dee714", - "sha256:58b8f6366e152092194ae68fefe18b9f0b4f89227dfd86a07770c3d86097aebf", - "sha256:59a89bccd615551391f3237e00006a26bcf98a4d18623a19909a2c48b8e986ee", - "sha256:5cdd7ef1ea7a491ae70d826b6cc64868de09a1d5ff9ef8d574250d0940e275b8", - "sha256:6288b3fa6622ad8a91e6eb759cfc48ff3089e7c17fb1d4c59a919769314af224", - "sha256:6d270ec9dd33cdb13f4d62c95c1a5a50e6b7cdd86302b494217137f760495b9d", - "sha256:79ed12ba79935adaac1664fd7e0e585a22caa539dfc9b7c7c6d5ebf91fb89054", - "sha256:7d29c23bdf6e5438c755b941cef867ec2a4a172ceb9f50553b6ed70d50dfd656", - "sha256:8441cf9616d642c475684d6cf2520dd24812e996ba9af15e606df5f6fd9d04a7", - "sha256:881bbea27bbd32d37eb24dd320a5e745a2a5b092a17f6debc1349252fac85423", - "sha256:8c3aba3e01235221e5b229a6c05f585f344734bd1ad42a8ac51493d74722bbce", - "sha256:a14798c3005ec892bbada26485c2eea3b54109cb2533713e355c806891f63c5e", - "sha256:b14decb628fac50db5e02ee5a35a9c0772d20277824cfe845c8a8b717c15daa3", - "sha256:b318ca24db0f0518630e8b6f3831e9cba78f099ed5c1d65ffe3e023003043ba0", - "sha256:c1beb78af5423b879edaf23c5591ff292cf7c33979734c99aa66d5914ead880f", - "sha256:c55acc4733aad6560a7f5f818466631f07efc001fd023f34a6c203f8b6df0f0b", - "sha256:ca52d1ceae015859d16aded12584c59eb3825f7b50c6cfd621d4231a6cc624ce", - "sha256:cae40a9e3ce178415040a0383f00e8d68b569e97f31928a3a8ad37e3fde6df6a", - "sha256:e78d0c7c1e99a4a45c99143900ea0546025e41bb59ebc10182e947cf1ece9174", - "sha256:ef3992833fbd686ee783590639f4b8343a57f1f75de8633749d984dc0eb16c86", - "sha256:f058a615031eea4ef94ead6456f5ec2026c19fb5bd6bfe86e9665c4158cf802f", - "sha256:f5ac696f02b3fc01a710427585c855f65cd9c640e14f52abe52020722bb4906b", - "sha256:f920385a11207dc372a028b3f1e1038bb244b3ec38d448e6d8e43c6b3ba20e98", - "sha256:fed2c3216a605dc9a6ea50c7e84c82906e3684c4e80d2908208f662a6cbf9022" - ], - "markers": "python_version >= '3.8'", - "version": "==0.20.0" - }, - "pytest": { - "hashes": [ - "sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343", - "sha256:de4bb8104e201939ccdc688b27a89a7be2079b22e2bd2b07f806b6ba71117977" - ], - "markers": "python_version >= '3.8'", - "version": "==8.2.2" - }, - "pytest-cov": { - "hashes": [ - "sha256:4f0764a1219df53214206bf1feea4633c3b558a2925c8b59f144f682861ce652", - "sha256:5837b58e9f6ebd335b0f8060eecce69b662415b16dc503883a02f45dfeb14857" - ], - "version": "==5.0.0" - }, - "pytest-xdist": { - "hashes": [ - "sha256:9ed4adfb68a016610848639bb7e02c9352d5d9f03d04809919e2dafc3be4cca7", - "sha256:ead156a4db231eec769737f57668ef58a2084a34b2e55c4a8fa20d861107300d" - ], - "version": "==3.6.1" - }, - "python-dateutil": { - "hashes": [ - "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", - "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==2.9.0.post0" - }, - "python-debian": { - "hashes": [ - "sha256:880f3bc52e31599f2a9b432bd7691844286825087fccdcf2f6ffd5cd79a26f9f", - "sha256:8cf677a30dbcb4be7a99536c17e11308a827a4d22028dc59a67f6c6dd3f0f58c", - "sha256:bb943755de23ae448102f334ae74417085a7fe1c6d673d8e5608e67d13c9109f" - ], - "markers": "python_version >= '3.5'", - "version": "==0.1.49" - }, - "pytz": { - "hashes": [ - "sha256:2a29735ea9c18baf14b448846bde5a48030ed267578472d8955cd0e7443a9812", - "sha256:328171f4e3623139da4983451950b28e95ac706e13f3f2630a879749e7a8b319" - ], - "version": "==2024.1" - }, - "pyyaml": { - "hashes": [ - "sha256:0101357af42f5c9fc7e9acc5c5ab8c3049f50db7425de175b6c7a5959cb6023d", - "sha256:0ae563b7e3ed5e918cd0184060e28b48b7e672b975bf7c6f4a892cee9d886ada", - "sha256:0fe2c1c5401a3a98f06337fed48f57340cf652a685484834b44f5ceeadb772ba", - "sha256:1eb00dd3344da80264261ab126c95481824669ed9e5ecc82fb2d88b1fce668ee", - "sha256:2086b30215c433c1e480c08c1db8b43c1edd36c59cf43d36b424e6f35fcaf1ad", - "sha256:29b4a67915232f79506211e69943e3102e211c616181ceff0adf34e21b469357", - "sha256:2e9bc8a34797f0621f56160b961d47a088644370f79d34bedc934fb89e3f47dd", - "sha256:30ec6b9afc17353a9abcff109880edf6e8d5b924eb1eeed7fe9376febc1f9800", - "sha256:31573d7e161d2f905311f036b12e65c058389b474dbd35740f4880b91e2ca2be", - "sha256:36d7bf63558843ea2a81de9d0c3e9c56c353b1df8e6c1faaec86df5adedf2e02", - "sha256:3af6b36bc195d741cd5b511810246cad143b99c953b4591e679e194a820d7b7c", - "sha256:414629800a1ddccd7303471650843fc801801cc579a195d2fe617b5b455409e3", - "sha256:459113f2b9cd68881201a3bd1a858ece3281dc0e92ece6e917d23b128f0fcb31", - "sha256:46e4fae38d00b40a62d32d60f1baa1b9ef33aff28c2aafd96b05d5cc770f1583", - "sha256:4bf821ccd51e8d5bc1a4021b8bd85a92b498832ac1cd1a53b399f0eb7c1c4258", - "sha256:50bd6560a6df3de59336b9a9086cbdea5aa9eee5361661448ee45c21eeb0da68", - "sha256:53056b51f111223e603bed1db5367f54596d44cacfa50f07e082a11929612957", - "sha256:53c5f0749a93e3296078262c9acf632de246241ff2f22bbedfe49d4b55e9bbdd", - "sha256:54c754cee6937bb9b72d6a16163160dec80b93a43020ac6fc9f13729c030c30b", - "sha256:58cc18ccbade0c48fb55102aa971a5b4e571e2b22187d083dda33f8708fa4ee7", - "sha256:5921fd128fbf27ab7c7ad1a566d2cd9557b84ade130743a7c110a55e7dec3b3c", - "sha256:5c758cc29713c9166750a30156ca3d90ac2515d5dea3c874377ae8829cf03087", - "sha256:60bf91e73354c96754220a9c04a9502c2ad063231cd754b59f8e4511157e32e2", - "sha256:6f0f728a88c6eb58a3b762726b965bb6acf12d97f8ea2cb4fecf856a727f9bdc", - "sha256:6f31c5935310da69ea0efe996a962d488f080312f0eb43beff1717acb5fe9bed", - "sha256:728b447d0cedec409ea1a3f0ad1a6cc3cec0a8d086611b45f038a9230a2242f3", - "sha256:72ffbc5c0cc71877104387548a450f2b7b7c4926b40dc9443e7598fe92aa13d9", - "sha256:73d8b233309ecd45c33c51cd55aa1be1dcab1799a9e54f6c753d8cab054b8c34", - "sha256:765029d1cf96e9e761329ee1c20f1ca2de8644e7350a151b198260698b96e30f", - "sha256:7ee3d180d886a3bc50f753b76340f1c314f9e8c507f5b107212112214c3a66fd", - "sha256:826fb4d5ac2c48b9d6e71423def2669d4646c93b6c13612a71b3ac7bb345304b", - "sha256:84c39ceec517cd8f01cb144efb08904a32050be51c55b7a59bc7958c8091568d", - "sha256:88bfe675bb19ae12a9c77c52322a28a8e2a8d3d213fbcfcded5c3f5ca3ead352", - "sha256:8e0a1ebd5c5842595365bf90db3ef7e9a8d6a79c9aedb1d05b675c81c7267fd3", - "sha256:9426067a10b369474396bf57fdf895b899045a25d1848798844693780b147436", - "sha256:9c5c0de7ec50d4df88b62f4b019ab7b3bb2883c826a1044268e9afb344c57b17", - "sha256:ad0c172fe15beffc32e3a8260f18e6708eb0e15ae82c9b3f80fbe04de0ef5729", - "sha256:ad206c7f5f08d393b872d3399f597246fdc6ebebff09c5ae5268ac45aebf4f8d", - "sha256:b0a163f4f84d1e0fe6a07ccad3b02e9b243790b8370ff0408ae5932c50c4d96d", - "sha256:b0dd9c7497d60126445e79e542ff01351c6b6dc121299d89787f5685b382c626", - "sha256:b1de10c488d6f02e498eb6956b89081bea31abf3133223c17749e7137734da75", - "sha256:b408f36eeb4e2be6f802f1be82daf1b578f3de5a51917c6e467aedb46187d827", - "sha256:bae077a01367e4bf5fddf00fd6c8b743e676385911c7c615e29e1c45ace8813b", - "sha256:bc3c3600fec6c2a719106381d6282061d8c108369cdec58b6f280610eba41e09", - "sha256:c16522bf91daa4ea9dedc1243b56b5a226357ab98b3133089ca627ef99baae6f", - "sha256:ca5136a77e2d64b4cf5106fb940376650ae232c74c09a8ff29dbb1e262495b31", - "sha256:d6e0f7ee5f8d851b1d91149a3e5074dbf5aacbb63e4b771fcce16508339a856f", - "sha256:e7930a0612e74fcca37019ca851b50d73b5f0c3dab7f3085a7c15d2026118315", - "sha256:e8e6dd230a158a836cda3cc521fcbedea16f22b16b8cfa8054d0c6cea5d0a531", - "sha256:eee36bf4bc11e39e3f17c171f25cdedff3d7c73b148aedc8820257ce2aa56d3b", - "sha256:f07adc282d51aaa528f3141ac1922d16d32fe89413ee59bfb8a73ed689ad3d23", - "sha256:f09816c047fdb588dddba53d321f1cb8081e38ad2a40ea6a7560a88b7a2f0ea8", - "sha256:fea4c4310061cd70ef73b39801231b9dc3dc638bb8858e38364b144fbd335a1a" - ], - "markers": "python_version >= '3.6'", - "version": "==6.0.2rc1" - }, - "pyzmq": { - "hashes": [ - "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa", - "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4", - "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09", - "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753", - "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c", - "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537", - "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5", - "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620", - "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920", - "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77", - "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450", - "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a", - "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc", - "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0", - "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de", - "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18", - "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606", - "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500", - "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972", - "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6", - "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad", - "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee", - "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a", - "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59", - "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7", - "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709", - "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625", - "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d", - "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527", - "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5", - "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987", - "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d", - "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b", - "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de", - "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12", - "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798", - "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be", - "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2", - "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20", - "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67", - "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4", - "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd", - "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a", - "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1", - "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4", - "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381", - "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd", - "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02", - "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35", - "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7", - "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce", - "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5", - "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf", - "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf", - "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84", - "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c", - "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5", - "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32", - "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a", - "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90", - "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97", - "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8", - "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5", - "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94", - "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf", - "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f", - "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2", - "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17", - "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879", - "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81", - "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223", - "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a", - "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b", - "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab", - "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7", - "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6", - "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2", - "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480", - "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8", - "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67", - "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad", - "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b", - "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3", - "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9", - "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47", - "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83", - "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad", - "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc" - ], - "markers": "python_version >= '3.7'", - "version": "==26.0.3" - }, - "qtconsole": { - "hashes": [ - "sha256:42d745f3d05d36240244a04e1e1ec2a86d5d9b6edb16dbdef582ccb629e87e0b", - "sha256:6b5fb11274b297463706af84dcbbd5c92273b1f619e6d25d08874b0a88516989" - ], - "markers": "python_version >= '3.8'", - "version": "==5.5.2" - }, - "qtpy": { - "hashes": [ - "sha256:1c1d8c4fa2c884ae742b069151b0abe15b3f70491f3972698c683b8e38de839b", - "sha256:a5a15ffd519550a1361bdc56ffc07fda56a6af7292f17c7b395d4083af632987" - ], - "markers": "python_version >= '3.7'", - "version": "==2.4.1" - }, - "requests": { - "hashes": [ - "sha256:55365417734eb18255590a9ff9eb97e9e1da868d4ccd6402399eaf68af20a760", - "sha256:70761cfe03c773ceb22aa2f671b4757976145175cdfca038c02654d061d6dcc6" - ], - "markers": "python_version >= '3.8'", - "version": "==2.32.3" - }, - "reuse": { - "hashes": [ - "sha256:4f2c3e1213ec644e5febc50d8322d18982e4e1102af8a51d9493bfc2164a0eac", - "sha256:b33e26ec1d105cfcfc2e904d103faec0d758994278feb95a4f4290a864562243" - ], - "version": "==4.0.3" - }, - "ruamel.yaml": { - "hashes": [ - "sha256:57b53ba33def16c4f3d807c0ccbc00f8a6081827e81ba2491691b76882d0c636", - "sha256:8b27e6a217e786c6fbe5634d8f3f11bc63e0f80f6a5890f28863d9c45aac311b" - ], - "markers": "python_version >= '3.7'", - "version": "==0.18.6" - }, - "ruamel.yaml.clib": { - "hashes": [ - "sha256:024cfe1fc7c7f4e1aff4a81e718109e13409767e4f871443cbff3dba3578203d", - "sha256:03d1162b6d1df1caa3a4bd27aa51ce17c9afc2046c31b0ad60a0a96ec22f8001", - "sha256:07238db9cbdf8fc1e9de2489a4f68474e70dffcb32232db7c08fa61ca0c7c462", - "sha256:09b055c05697b38ecacb7ac50bdab2240bfca1a0c4872b0fd309bb07dc9aa3a9", - "sha256:1707814f0d9791df063f8c19bb51b0d1278b8e9a2353abbb676c2f685dee6afe", - "sha256:1758ce7d8e1a29d23de54a16ae867abd370f01b5a69e1a3ba75223eaa3ca1a1b", - "sha256:184565012b60405d93838167f425713180b949e9d8dd0bbc7b49f074407c5a8b", - "sha256:1b617618914cb00bf5c34d4357c37aa15183fa229b24767259657746c9077615", - "sha256:1dc67314e7e1086c9fdf2680b7b6c2be1c0d8e3a8279f2e993ca2a7545fecf62", - "sha256:25ac8c08322002b06fa1d49d1646181f0b2c72f5cbc15a85e80b4c30a544bb15", - "sha256:25c515e350e5b739842fc3228d662413ef28f295791af5e5110b543cf0b57d9b", - "sha256:305889baa4043a09e5b76f8e2a51d4ffba44259f6b4c72dec8ca56207d9c6fe1", - "sha256:3213ece08ea033eb159ac52ae052a4899b56ecc124bb80020d9bbceeb50258e9", - "sha256:3f215c5daf6a9d7bbed4a0a4f760f3113b10e82ff4c5c44bec20a68c8014f675", - "sha256:46d378daaac94f454b3a0e3d8d78cafd78a026b1d71443f4966c696b48a6d899", - "sha256:4ecbf9c3e19f9562c7fdd462e8d18dd902a47ca046a2e64dba80699f0b6c09b7", - "sha256:53a300ed9cea38cf5a2a9b069058137c2ca1ce658a874b79baceb8f892f915a7", - "sha256:56f4252222c067b4ce51ae12cbac231bce32aee1d33fbfc9d17e5b8d6966c312", - "sha256:5c365d91c88390c8d0a8545df0b5857172824b1c604e867161e6b3d59a827eaa", - "sha256:700e4ebb569e59e16a976857c8798aee258dceac7c7d6b50cab63e080058df91", - "sha256:75e1ed13e1f9de23c5607fe6bd1aeaae21e523b32d83bb33918245361e9cc51b", - "sha256:77159f5d5b5c14f7c34073862a6b7d34944075d9f93e681638f6d753606c6ce6", - "sha256:7f67a1ee819dc4562d444bbafb135832b0b909f81cc90f7aa00260968c9ca1b3", - "sha256:840f0c7f194986a63d2c2465ca63af8ccbbc90ab1c6001b1978f05119b5e7334", - "sha256:84b554931e932c46f94ab306913ad7e11bba988104c5cff26d90d03f68258cd5", - "sha256:87ea5ff66d8064301a154b3933ae406b0863402a799b16e4a1d24d9fbbcbe0d3", - "sha256:955eae71ac26c1ab35924203fda6220f84dce57d6d7884f189743e2abe3a9fbe", - "sha256:a1a45e0bb052edf6a1d3a93baef85319733a888363938e1fc9924cb00c8df24c", - "sha256:a5aa27bad2bb83670b71683aae140a1f52b0857a2deff56ad3f6c13a017a26ed", - "sha256:a6a9ffd280b71ad062eae53ac1659ad86a17f59a0fdc7699fd9be40525153337", - "sha256:a75879bacf2c987c003368cf14bed0ffe99e8e85acfa6c0bfffc21a090f16880", - "sha256:aa2267c6a303eb483de8d02db2871afb5c5fc15618d894300b88958f729ad74f", - "sha256:aab7fd643f71d7946f2ee58cc88c9b7bfc97debd71dcc93e03e2d174628e7e2d", - "sha256:b16420e621d26fdfa949a8b4b47ade8810c56002f5389970db4ddda51dbff248", - "sha256:b42169467c42b692c19cf539c38d4602069d8c1505e97b86387fcf7afb766e1d", - "sha256:bba64af9fa9cebe325a62fa398760f5c7206b215201b0ec825005f1b18b9bccf", - "sha256:beb2e0404003de9a4cab9753a8805a8fe9320ee6673136ed7f04255fe60bb512", - "sha256:bef08cd86169d9eafb3ccb0a39edb11d8e25f3dae2b28f5c52fd997521133069", - "sha256:c2a72e9109ea74e511e29032f3b670835f8a59bbdc9ce692c5b4ed91ccf1eedb", - "sha256:c58ecd827313af6864893e7af0a3bb85fd529f862b6adbefe14643947cfe2942", - "sha256:c69212f63169ec1cfc9bb44723bf2917cbbd8f6191a00ef3410f5a7fe300722d", - "sha256:cabddb8d8ead485e255fe80429f833172b4cadf99274db39abc080e068cbcc31", - "sha256:d176b57452ab5b7028ac47e7b3cf644bcfdc8cacfecf7e71759f7f51a59e5c92", - "sha256:da09ad1c359a728e112d60116f626cc9f29730ff3e0e7db72b9a2dbc2e4beed5", - "sha256:e2b4c44b60eadec492926a7270abb100ef9f72798e18743939bdbf037aab8c28", - "sha256:e79e5db08739731b0ce4850bed599235d601701d5694c36570a99a0c5ca41a9d", - "sha256:ebc06178e8821efc9692ea7544aa5644217358490145629914d8020042c24aa1", - "sha256:edaef1c1200c4b4cb914583150dcaa3bc30e592e907c01117c08b13a07255ec2", - "sha256:f481f16baec5290e45aebdc2a5168ebc6d35189ae6fea7a58787613a25f6e875", - "sha256:fff3573c2db359f091e1589c3d7c5fc2f86f5bdb6f24252c2d8e539d4e45f412" - ], - "markers": "platform_python_implementation == 'CPython' and python_version < '3.13'", - "version": "==0.2.8" - }, - "scipy": { - "hashes": [ - "sha256:076c27284c768b84a45dcf2e914d4000aac537da74236a0d45d82c6fa4b7b3c0", - "sha256:07e179dc0205a50721022344fb85074f772eadbda1e1b3eecdc483f8033709b7", - "sha256:176c6f0d0470a32f1b2efaf40c3d37a24876cebf447498a4cefb947a79c21e9d", - "sha256:42470ea0195336df319741e230626b6225a740fd9dce9642ca13e98f667047c0", - "sha256:4c4161597c75043f7154238ef419c29a64ac4a7c889d588ea77690ac4d0d9b20", - "sha256:5b083c8940028bb7e0b4172acafda6df762da1927b9091f9611b0bcd8676f2bc", - "sha256:64b2ff514a98cf2bb734a9f90d32dc89dc6ad4a4a36a312cd0d6327170339eb0", - "sha256:65df4da3c12a2bb9ad52b86b4dcf46813e869afb006e58be0f516bc370165159", - "sha256:687af0a35462402dd851726295c1a5ae5f987bd6e9026f52e9505994e2f84ef6", - "sha256:6a9c9a9b226d9a21e0a208bdb024c3982932e43811b62d202aaf1bb59af264b1", - "sha256:6d056a8709ccda6cf36cdd2eac597d13bc03dba38360f418560a93050c76a16e", - "sha256:7d3da42fbbbb860211a811782504f38ae7aaec9de8764a9bef6b262de7a2b50f", - "sha256:7e911933d54ead4d557c02402710c2396529540b81dd554fc1ba270eb7308484", - "sha256:94c164a9e2498e68308e6e148646e486d979f7fcdb8b4cf34b5441894bdb9caf", - "sha256:9e3154691b9f7ed73778d746da2df67a19d046a6c8087c8b385bc4cdb2cfca74", - "sha256:9eee2989868e274aae26125345584254d97c56194c072ed96cb433f32f692ed8", - "sha256:a01cc03bcdc777c9da3cfdcc74b5a75caffb48a6c39c8450a9a05f82c4250a14", - "sha256:a7d46c3e0aea5c064e734c3eac5cf9eb1f8c4ceee756262f2c7327c4c2691c86", - "sha256:ad36af9626d27a4326c8e884917b7ec321d8a1841cd6dacc67d2a9e90c2f0359", - "sha256:b5923f48cb840380f9854339176ef21763118a7300a88203ccd0bdd26e58527b", - "sha256:bbc0471b5f22c11c389075d091d3885693fd3f5e9a54ce051b46308bc787e5d4", - "sha256:bff2438ea1330e06e53c424893ec0072640dac00f29c6a43a575cbae4c99b2b9", - "sha256:c40003d880f39c11c1edbae8144e3813904b10514cd3d3d00c277ae996488cdb", - "sha256:d91db2c41dd6c20646af280355d41dfa1ec7eead235642178bd57635a3f82209", - "sha256:f0a50da861a7ec4573b7c716b2ebdcdf142b66b756a0d392c236ae568b3a93fb" - ], - "markers": "python_version >= '3.10'", - "version": "==1.14.0" - }, - "seaborn": { - "hashes": [ - "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", - "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7" - ], - "version": "==0.13.2" - }, - "setuptools": { - "hashes": [ - "sha256:f171bab1dfbc86b132997f26a119f6056a57950d058587841a0082e8830f9dc5", - "sha256:fe384da74336c398e0d956d1cae0669bc02eed936cdb1d49b57de1990dc11ffc" - ], - "markers": "python_version >= '3.8'", - "version": "==70.3.0" - }, - "six": { - "hashes": [ - "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926", - "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254" - ], - "markers": "python_version >= '2.7' and python_version not in '3.0, 3.1, 3.2'", - "version": "==1.16.0" - }, - "snowballstemmer": { - "hashes": [ - "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1", - "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a" - ], - "version": "==2.2.0" - }, - "sphinx": { - "hashes": [ - "sha256:4bcce443b66139eb9556117ba881246269edce396e7f939e22c5ed85186bfd5b", - "sha256:8385520a28dc129ebf8b5fccfa1beb71215fd4455c6d10fa418e08c3c7a2ff9c" - ], - "markers": "python_version >= '3.9'", - "version": "==7.4.0" - }, - "sphinx-rtd-theme": { - "hashes": [ - "sha256:bd5d7b80622406762073a04ef8fadc5f9151261563d47027de09910ce03afe6b", - "sha256:ec93d0856dc280cf3aee9a4c9807c60e027c7f7b461b77aeffed682e68f0e586" - ], - "markers": "python_version >= '3.6'", - "version": "==2.0.0" - }, - "sphinxcontrib-applehelp": { - "hashes": [ - "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619", - "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.8" - }, - "sphinxcontrib-devhelp": { - "hashes": [ - "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f", - "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.6" - }, - "sphinxcontrib-htmlhelp": { - "hashes": [ - "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015", - "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04" - ], - "markers": "python_version >= '3.9'", - "version": "==2.0.5" - }, - "sphinxcontrib-jquery": { - "hashes": [ - "sha256:1620739f04e36a2c779f1a131a2dfd49b2fd07351bf1968ced074365933abc7a", - "sha256:f936030d7d0147dd026a4f2b5a57343d233f1fc7b363f68b3d4f1cb0993878ae" - ], - "markers": "python_version >= '2.7'", - "version": "==4.1" - }, - "sphinxcontrib-jsmath": { - "hashes": [ - "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178", - "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8" - ], - "markers": "python_version >= '3.5'", - "version": "==1.0.1" - }, - "sphinxcontrib-qthelp": { - "hashes": [ - "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6", - "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182" - ], - "markers": "python_version >= '3.9'", - "version": "==1.0.7" - }, - "sphinxcontrib-serializinghtml": { - "hashes": [ - "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7", - "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f" - ], - "markers": "python_version >= '3.9'", - "version": "==1.1.10" - }, - "stack-data": { - "hashes": [ - "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", - "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695" - ], - "version": "==0.6.3" - }, - "statsmodels": { - "hashes": [ - "sha256:0e46e9d59293c1af4cc1f4e5248f17e7e7bc596bfce44d327c789ac27f09111b", - "sha256:10f2b7611a61adb7d596a6d239abdf1a4d5492b931b00d5ed23d32844d40e48e", - "sha256:201c3d00929c4a67cda1fe05b098c8dcf1b1eeefa88e80a8f963a844801ed59f", - "sha256:29c78a7601fdae1aa32104c5ebff2e0b72c26f33e870e2f94ab1bcfd927ece9b", - "sha256:4864a1c4615c5ea5f2e3b078a75bdedc90dd9da210a37e0738e064b419eccee2", - "sha256:50fcb633987779e795142f51ba49fb27648d46e8a1382b32ebe8e503aaabaa9e", - "sha256:55d1742778400ae67acb04b50a2c7f5804182f8a874bd09ca397d69ed159a751", - "sha256:5827a12e3ede2b98a784476d61d6bec43011fedb64aa815f2098e0573bece257", - "sha256:7a91f6c4943de13e3ce2e20ee3b5d26d02bd42300616a421becd53756f5deb37", - "sha256:876794068abfaeed41df71b7887000031ecf44fbfa6b50d53ccb12ebb4ab747a", - "sha256:8875823bdd41806dc853333cc4e1b7ef9481bad2380a999e66ea42382cf2178d", - "sha256:890550147ad3a81cda24f0ba1a5c4021adc1601080bd00e191ae7cd6feecd6ad", - "sha256:8e004cfad0e46ce73fe3f3812010c746f0d4cfd48e307b45c14e9e360f3d2510", - "sha256:90fd2f0110b73fc3fa5a2f21c3ca99b0e22285cccf38e56b5b8fd8ce28791b0f", - "sha256:9edefa4ce08e40bc1d67d2f79bc686ee5e238e801312b5a029ee7786448c389a", - "sha256:a87ef21fadb445b650f327340dde703f13aec1540f3d497afb66324499dea97a", - "sha256:ac780ad9ff552773798829a0b9c46820b0faa10e6454891f5e49a845123758ab", - "sha256:afbd92410e0df06f3d8c4e7c0e2e71f63f4969531f280fb66059e2ecdb6e0415", - "sha256:c254c66142f1167b4c7d031cf8db55294cc62ff3280e090fc45bd10a7f5fd029", - "sha256:df5d6f95c46f0341da6c79ee7617e025bf2b371e190a8e60af1ae9cabbdb7a97", - "sha256:eb0ba1ad3627705f5ae20af6b2982f500546d43892543b36c7bca3e2f87105e7", - "sha256:f36494df7c03d63168fccee5038a62f469469ed6a4dd6eaeb9338abedcd0d5f5", - "sha256:f450fcbae214aae66bd9d2b9af48e0f8ba1cb0e8596c6ebb34e6e3f0fec6542c", - "sha256:f870d14a587ea58a3b596aa994c2ed889cc051f9e450e887d2c83656fc6a64bf" - ], - "version": "==0.14.2" - }, - "tomlkit": { - "hashes": [ - "sha256:08ad192699734149f5b97b45f1f18dad7eb1b6d16bc72ad0c2335772650d7b72", - "sha256:7075d3042d03b80f603482d69bf0c8f345c2b30e41699fd8883227f89972b264" - ], - "markers": "python_version >= '3.8'", - "version": "==0.13.0" - }, - "toolz": { - "hashes": [ - "sha256:d22731364c07d72eea0a0ad45bafb2c2937ab6fd38a3507bf55eae8744aa7d85", - "sha256:ecca342664893f177a13dac0e6b41cbd8ac25a358e5f215316d43e2100224f4d" - ], - "markers": "python_version >= '3.7'", - "version": "==0.12.1" - }, - "tornado": { - "hashes": [ - "sha256:163b0aafc8e23d8cdc3c9dfb24c5368af84a81e3364745ccb4427669bf84aec8", - "sha256:25486eb223babe3eed4b8aecbac33b37e3dd6d776bc730ca14e1bf93888b979f", - "sha256:454db8a7ecfcf2ff6042dde58404164d969b6f5d58b926da15e6b23817950fc4", - "sha256:613bf4ddf5c7a95509218b149b555621497a6cc0d46ac341b30bd9ec19eac7f3", - "sha256:6d5ce3437e18a2b66fbadb183c1d3364fb03f2be71299e7d10dbeeb69f4b2a14", - "sha256:8ae50a504a740365267b2a8d1a90c9fbc86b780a39170feca9bcc1787ff80842", - "sha256:92d3ab53183d8c50f8204a51e6f91d18a15d5ef261e84d452800d4ff6fc504e9", - "sha256:a02a08cc7a9314b006f653ce40483b9b3c12cda222d6a46d4ac63bb6c9057698", - "sha256:b24b8982ed444378d7f21d563f4180a2de31ced9d8d84443907a0a64da2072e7", - "sha256:d9a566c40b89757c9aa8e6f032bcdb8ca8795d7c1a9762910c722b1635c9de4d", - "sha256:e2e20b9113cd7293f164dc46fffb13535266e713cdb87bd2d15ddb336e96cfc4" - ], - "markers": "python_version >= '3.8'", - "version": "==6.4.1" - }, - "tox": { - "hashes": [ - "sha256:43499656f9949edb681c0f907f86fbfee98677af9919d8b11ae5ad77cb800748", - "sha256:61e101061b977b46cf00093d4319438055290ad0009f84497a07bf2d2d7a06d0" - ], - "version": "==4.16.0" - }, - "traitlets": { - "hashes": [ - "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", - "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f" - ], - "markers": "python_version >= '3.8'", - "version": "==5.14.3" - }, - "typing-extensions": { - "hashes": [ - "sha256:04e5ca0351e0f3f85c6853954072df659d0d13fac324d0072316b67d7794700d", - "sha256:1a7ead55c7e559dd4dee8856e3a88b41225abfe1ce8df57b7c13915fe121ffb8" - ], - "markers": "python_version >= '3.8'", - "version": "==4.12.2" - }, - "tzdata": { - "hashes": [ - "sha256:2674120f8d891909751c38abcdfd386ac0a5a1127954fbc332af6b5ceae07efd", - "sha256:9068bc196136463f5245e51efda838afa15aaeca9903f49050dfa2679db4d252" - ], - "markers": "python_version >= '2'", - "version": "==2024.1" - }, - "urllib3": { - "hashes": [ - "sha256:a448b2f64d686155468037e1ace9f2d2199776e17f0a46610480d311f73e3472", - "sha256:dd505485549a7a552833da5e6063639d0d177c04f23bc3864e41e5dc5f612168" - ], - "markers": "python_version >= '3.8'", - "version": "==2.2.2" - }, - "virtualenv": { - "hashes": [ - "sha256:4c43a2a236279d9ea36a0d76f98d84bd6ca94ac4e0f4a3b9d46d05e10fea542a", - "sha256:8cc4a31139e796e9a7de2cd5cf2489de1217193116a8fd42328f1bd65f434589" - ], - "markers": "python_version >= '3.7'", - "version": "==20.26.3" - }, - "wcwidth": { - "hashes": [ - "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859", - "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5" - ], - "version": "==0.2.13" - }, - "xarray": { - "hashes": [ - "sha256:0b91e0bc4dc0296947947640fe31ec6e867ce258d2f7cbc10bedf4a6d68340c7", - "sha256:721a7394e8ec3d592b2d8ebe21eed074ac077dc1bb1bd777ce00e41700b4866c" - ], - "markers": "python_version >= '3.9'", - "version": "==2024.6.0" - } - }, - "develop": {} -} diff --git a/ci/matrix/mpl_39_py312/Pipfile.lock.license b/ci/matrix/mpl_39_py312/Pipfile.lock.license deleted file mode 100644 index 919c9c1e..00000000 --- a/ci/matrix/mpl_39_py312/Pipfile.lock.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/contributing.html b/contributing.html new file mode 100644 index 00000000..fbc9b3a5 --- /dev/null +++ b/contributing.html @@ -0,0 +1,341 @@ + + + + + + + Contribution and development hints — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Contribution and development hints

+

See psyplots contribution guidelines.

+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index b1567a16..00000000 --- a/docs/Makefile +++ /dev/null @@ -1,24 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line, and also -# from the environment for the first two. -SPHINXOPTS ?= -SPHINXBUILD ?= sphinx-build -SOURCEDIR = . -BUILDDIR = _build - -# Put it first so that "make" without argument is like "make help". -help: - @$(SPHINXBUILD) -M help "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) - -.PHONY: help Makefile - -# Catch-all target: route all unknown targets to Sphinx using the new -# "make mode" option. $(O) is meant as a shortcut for $(SPHINXOPTS). -%: Makefile - @$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O) diff --git a/docs/_templates/footer.html b/docs/_templates/footer.html deleted file mode 100644 index 3e570797..00000000 --- a/docs/_templates/footer.html +++ /dev/null @@ -1,22 +0,0 @@ - - -{% extends "!footer.html" %} -{% block extrafooter %} - - - -{% endblock %} diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100644 index 69537524..00000000 --- a/docs/conf.py +++ /dev/null @@ -1,115 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: LGPL-3.0-only - -# Configuration file for the Sphinx documentation builder. -# -# This file only contains a selection of the most common options. For a full -# list see the documentation: -# https://www.sphinx-doc.org/en/master/usage/configuration.html - -# -- Path setup -------------------------------------------------------------- - -# If extensions (or modules to document with autodoc) are in another directory, -# add these directories to sys.path here. If the directory is relative to the -# documentation root, use os.path.abspath to make it absolute, like shown here. -# -import os -import sys -from pathlib import Path - -from sphinx.ext import apidoc - -sys.path.insert(0, os.path.abspath("..")) - -if not os.path.exists("_static"): - os.makedirs("_static") - -# isort: off - -import psy_simple - -# isort: on - - -def generate_apidoc(app): - appdir = Path(app.__file__).parent - apidoc.main( - ["-fMEeTo", str(api), str(appdir), str(appdir / "migrations" / "*")] - ) - - -api = Path("api") - -if not api.exists(): - generate_apidoc(psy_simple) - -# -- Project information ----------------------------------------------------- - -project = "psy-simple" -copyright = "2021-2024 Helmholtz-Zentrum hereon GmbH" -author = "Philipp S. Sommer" - - -linkcheck_ignore = [ - # we do not check link of the psy-simple as the - # badges might not yet work everywhere. Once psy-simple - # is settled, the following link should be removed - r"https://.*psy-simple" -] - - -# -- General configuration --------------------------------------------------- - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom -# ones. -extensions = [ - "hereon_nc_sphinxext", - "sphinx.ext.intersphinx", - "sphinx_design", - "sphinx.ext.napoleon", - "sphinx.ext.todo", - "autodocsumm", - "sphinx.ext.autodoc", - "sphinx.ext.autosummary", -] - - -# Add any paths that contain templates here, relative to this directory. -templates_path = ["_templates"] - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This pattern also affects html_static_path and html_extra_path. -exclude_patterns = ["_build", "Thumbs.db", ".DS_Store"] - - -autodoc_default_options = { - "show_inheritance": True, - "members": True, - "autosummary": True, -} - - -# -- Options for HTML output ------------------------------------------------- - -# The theme to use for HTML and HTML Help pages. See the documentation for -# a list of builtin themes. -html_theme = "sphinx_rtd_theme" - -html_theme_options = { - "collapse_navigation": False, - "includehidden": False, -} - -# 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"] - - -intersphinx_mapping = { - "python": ("https://docs.python.org/3/", None), - "django": ("https://django.readthedocs.io/en/stable/", None), -} diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 2e7d9b07..00000000 --- a/docs/make.bat +++ /dev/null @@ -1,39 +0,0 @@ -REM SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -REM -REM SPDX-License-Identifier: CC0-1.0 - -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=sphinx-build -) -set SOURCEDIR=. -set BUILDDIR=_build - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The 'sphinx-build' command was not found. Make sure you have Sphinx - echo.installed, then set the SPHINXBUILD environment variable to point - echo.to the full path of the 'sphinx-build' executable. Alternatively you - echo.may add the Sphinx directory to PATH. - echo. - echo.If you don't have Sphinx installed, grab it from - echo.http://sphinx-doc.org/ - exit /b 1 -) - -%SPHINXBUILD% -M %1 %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% %O% - -:end -popd diff --git a/docs/requirements.txt b/docs/requirements.txt deleted file mode 100644 index 9fc11ca7..00000000 --- a/docs/requirements.txt +++ /dev/null @@ -1,8 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -sphinx-design -git+https://codebase.helmholtz.cloud/hcdc/hereon-netcdf/sphinxext.git -git+https://codebase.helmholtz.cloud/psyplot/psyplot.git@develop -git+https://codebase.helmholtz.cloud/psyplot/psyplot-gui.git@develop diff --git a/generated/psyplot.project.plot.barplot.html b/generated/psyplot.project.plot.barplot.html new file mode 100644 index 00000000..12914c4d --- /dev/null +++ b/generated/psyplot.project.plot.barplot.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.barplot — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.barplot

+
+
+plot.barplot(*args, **kwargs)
+

Make a bar plot of one-dimensional data

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.BarPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.barplot(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.barplot.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.barplot.summaries('title')
+
+# show the full documentation
+>>> psy.plot.barplot.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.barplot.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.combined.html b/generated/psyplot.project.plot.combined.html new file mode 100644 index 00000000..7c2a6b7e --- /dev/null +++ b/generated/psyplot.project.plot.combined.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.combined — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.combined

+
+
+plot.combined(*args, **kwargs)
+

Plot a 2D scalar field with an overlying vector field

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.CombinedSimplePlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.combined(filename, name=[['my_variable', ['u_var', 'v_var']]], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.combined.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.combined.summaries('title')
+
+# show the full documentation
+>>> psy.plot.combined.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.combined.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.density.html b/generated/psyplot.project.plot.density.html new file mode 100644 index 00000000..4c99e222 --- /dev/null +++ b/generated/psyplot.project.plot.density.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.density — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.density

+
+
+plot.density(*args, **kwargs)
+

Make a density plot of point data

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.DensityPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.density(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.density.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.density.summaries('title')
+
+# show the full documentation
+>>> psy.plot.density.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.density.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.fldmean.html b/generated/psyplot.project.plot.fldmean.html new file mode 100644 index 00000000..545f80ec --- /dev/null +++ b/generated/psyplot.project.plot.fldmean.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.fldmean — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.fldmean

+
+
+plot.fldmean(*args, **kwargs)
+

Calculate and plot the mean over x- and y-dimensions

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.FldmeanPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.fldmean(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.fldmean.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.fldmean.summaries('title')
+
+# show the full documentation
+>>> psy.plot.fldmean.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.fldmean.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.lineplot.html b/generated/psyplot.project.plot.lineplot.html new file mode 100644 index 00000000..2415bd11 --- /dev/null +++ b/generated/psyplot.project.plot.lineplot.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.lineplot — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.lineplot

+
+
+plot.lineplot(*args, **kwargs)
+

Make a line plot of one-dimensional data

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.LinePlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.lineplot(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.lineplot.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.lineplot.summaries('title')
+
+# show the full documentation
+>>> psy.plot.lineplot.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.lineplot.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.plot2d.html b/generated/psyplot.project.plot.plot2d.html new file mode 100644 index 00000000..13805f53 --- /dev/null +++ b/generated/psyplot.project.plot.plot2d.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.plot2d — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.plot2d

+
+
+plot.plot2d(*args, **kwargs)
+

Make a simple plot of a 2D scalar field

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.Simple2DPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.plot2d(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.plot2d.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.plot2d.summaries('title')
+
+# show the full documentation
+>>> psy.plot.plot2d.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.plot2d.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.vector.html b/generated/psyplot.project.plot.vector.html new file mode 100644 index 00000000..70066f01 --- /dev/null +++ b/generated/psyplot.project.plot.vector.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.vector — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.vector

+
+
+plot.vector(*args, **kwargs)
+

Make a simple plot of a 2D vector field

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.SimpleVectorPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.vector(filename, name=[['u_var', 'v_var']], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.vector.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.vector.summaries('title')
+
+# show the full documentation
+>>> psy.plot.vector.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.vector.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/generated/psyplot.project.plot.violinplot.html b/generated/psyplot.project.plot.violinplot.html new file mode 100644 index 00000000..cc36055d --- /dev/null +++ b/generated/psyplot.project.plot.violinplot.html @@ -0,0 +1,369 @@ + + + + + + + psyplot.project.plot.violinplot — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot.project.plot.violinplot

+
+
+plot.violinplot(*args, **kwargs)
+

Make a violin plot of your data

+

This plotting method adds data arrays and plots them via +psy_simple.plotters.ViolinPlotter plotters

+

To plot data from a netCDF file type:

+
>>> psy.plot.violinplot(filename, name=['my_variable'], ...)
+
+
+

Examples

+

To explore the formatoptions and their documentations, use the +keys, summaries and docs methods. For example:

+
>>> import psyplot.project as psy
+
+# show the keys corresponding to a group or multiple
+# formatopions
+>>> psy.plot.violinplot.keys('labels')
+
+# show the summaries of a group of formatoptions or of a
+# formatoption
+>>> psy.plot.violinplot.summaries('title')
+
+# show the full documentation
+>>> psy.plot.violinplot.docs('plot')
+
+# or access the documentation via the attribute
+>>> psy.plot.violinplot.plot
+
+
+
+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/genindex.html b/genindex.html new file mode 100644 index 00000000..20da4e08 --- /dev/null +++ b/genindex.html @@ -0,0 +1,3518 @@ + + + + + + Index — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Index

+ +
+ A + | B + | C + | D + | E + | F + | G + | H + | I + | L + | M + | N + | O + | P + | Q + | R + | S + | T + | U + | V + | W + | X + | Y + +
+

A

+ + + +
+ +

B

+ + + +
+ +

C

+ + + +
+ +

D

+ + + +
+ +

E

+ + + +
+ +

F

+ + + +
+ +

G

+ + +
+ +

H

+ + + +
+ +

I

+ + + +
+ +

L

+ + + +
+ +

M

+ + + +
+ +

N

+ + + +
+ +

O

+ + + +
+ +

P

+ + + +
+ +

Q

+ + +
+ +

R

+ + + +
+ +

S

+ + + +
+ +

T

+ + + +
+ +

U

+ + + +
+ +

V

+ + + +
+ +

W

+ + + +
+ +

X

+ + + +
+ +

Y

+ + + +
+ + + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 00000000..f1c1247f --- /dev/null +++ b/index.html @@ -0,0 +1,528 @@ + + + + + + + Welcome to psy-simple’s documentation! — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Welcome to psy-simple’s documentation!

+

CI +Code coverage +Latest Release +PyPI version +Code style: black +Imports: isort +PEP8 +REUSE status

+

Psyplot plugin for simple visualization tasks

+
+

Warning

+

This page has been automatically generated as has not yet been reviewed by +the authors of psy-simple! +Stay tuned for updates and discuss with us at +https://codebase.helmholtz.cloud/psyplot/psy-simple

+
+ +
+

How to cite this software

+
+
+
+Please do cite this software!
+
+ +
+

Sommer P.S. psy-simple: A psyplot plugin for simple visualization tasks DOI: 10.5281/zenodo.845643 URL: https://github.com/psyplot/psyplot
+
+
+

+
+ +
+

@misc{YourReferenceHere,
+author = {Sommer, Philipp S.},
+doi = {10.5281/zenodo.845643},
+title = {psy-simple: A psyplot plugin for simple visualization tasks},
+url = {https://github.com/psyplot/psyplot}
+}
+
+
+

+
+ +
+

TY  - GEN
+AU  - Sommer, Philipp S.
+DO  - 10.5281/zenodo.845643
+KW  - psyplot
+KW  - python
+KW  - visualization
+KW  - xarray
+KW  - matplotlib
+KW  - netcdf4
+KW  - climate models
+KW  - unstructured
+KW  - earth-sciences
+KW  - raster
+TI  - psy-simple: A psyplot plugin for simple visualization tasks
+UR  - https://github.com/psyplot/psyplot
+ER
+
+
+

+
+ +
+

%0 Generic
+%A Sommer, Philipp S.
+%K psyplot
+%K python
+%K visualization
+%K xarray
+%K matplotlib
+%K netcdf4
+%K climate models
+%K unstructured
+%K earth-sciences
+%K raster
+%R 10.5281/zenodo.845643
+%T psy-simple: A psyplot plugin for simple visualization tasks
+%U https://github.com/psyplot/psyplot
+
+
+

+
+ +
+

# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH
+#
+# SPDX-License-Identifier: CC0-1.0
+
+# YAML 1.2
+---
+cff-version: "1.2.0"
+message: "If you use this software, please cite both the article from preferred-citation and the software itself."
+title: "psy-simple: A psyplot plugin for simple visualization tasks"
+authors:
+  - family-names: Sommer
+    given-names: "Philipp S."
+    affiliation: "Helmholtz-Zentrum Hereon"
+    orcid: "https://orcid.org/0000-0001-6171-7716"
+    website: "https://www.philipp-s-sommer.de"
+    post-code: 21502
+    city: Geesthacht
+    country: DE
+    email: philipp.sommer@hereon.de
+doi: "10.5281/zenodo.845643"
+contact:
+  - email: psyplot@hereon.de
+    name: "Psyplot developers at hereon"
+license: "LGPL-3.0-only"
+repository-code: https://github.com/psyplot/psyplot
+type: software
+keywords:
+  - psyplot
+  - python
+  - visualization
+  - xarray
+  - matplotlib
+  - netcdf4
+  - climate models
+  - unstructured
+  - earth-sciences
+  - raster
+preferred-citation:
+  title: "The psyplot interactive visualization framework"
+  authors:
+    - family-names: Sommer
+      given-names: "Philipp S."
+      affiliation: "Helmholtz-Zentrum Hereon"
+      orcid: "https://orcid.org/0000-0001-6171-7716"
+  year: 2017
+  type: article
+  doi: "10.21105/joss.00363"
+  date-published: 2017-08-22
+  journal: Journal of Open Source Software
+  volume: 2
+  number: 16
+  pages: 363
+  publisher:
+    name: The Open Journal
+  license: CC-BY-4.0
+...
+
+
+

+
+
+
+
+
+
+

License information

+

Copyright © 2021-2024 Helmholtz-Zentrum hereon GmbH

+

The source code of psy-simple is licensed under +LGPL-3.0-only.

+

If not stated otherwise, the contents of this documentation is licensed under +CC-BY-4.0.

+
+
+
+

Indices and tables

+ +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/installation.html b/installation.html new file mode 100644 index 00000000..a40077b1 --- /dev/null +++ b/installation.html @@ -0,0 +1,369 @@ + + + + + + + Installation — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

Installation

+
+

Installation using conda

+

We highly recommend to use conda for installing psy-simple. After downloading +the miniconda installer, you can install psy-simple simply via:

+
$ conda install -c conda-forge psy-simple
+
+
+
+
+

Installation using pip

+

To install the psy-simple package on Linux, we recommend that +you install it from PyPi via:

+
pip install psy-simple
+
+
+

Or install it directly from the source code repository on Gitlab via:

+
pip install git+https://codebase.helmholtz.cloud/psyplot/psy-simple.git
+
+
+

The latter should however only be done if you want to access the development +versions.

+
+

Installation for development

+

Please head over to our contributing guide for +installation instruction for development.

+
+
+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/objects.inv b/objects.inv new file mode 100644 index 00000000..b126da7d Binary files /dev/null and b/objects.inv differ diff --git a/plot_methods.html b/plot_methods.html new file mode 100644 index 00000000..b9c72dd0 --- /dev/null +++ b/plot_methods.html @@ -0,0 +1,368 @@ + + + + + + + psyplot plot methods — psy-simple documentation + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+ +
+
+
+
+ +
+

psyplot plot methods

+

This plugin defines the following new plot methods for the +psyplot.project.ProjectPlotter class. They can, for example, be +accessed through

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

lineplot(*args, **kwargs)

Make a line plot of one-dimensional data

vector(*args, **kwargs)

Make a simple plot of a 2D vector field

violinplot(*args, **kwargs)

Make a violin plot of your data

plot2d(*args, **kwargs)

Make a simple plot of a 2D scalar field

combined(*args, **kwargs)

Plot a 2D scalar field with an overlying vector field

density(*args, **kwargs)

Make a density plot of point data

barplot(*args, **kwargs)

Make a bar plot of one-dimensional data

fldmean(*args, **kwargs)

Calculate and plot the mean over x- and y-dimensions

+
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/psy_simple/__init__.py b/psy_simple/__init__.py deleted file mode 100644 index 4f8a93a1..00000000 --- a/psy_simple/__init__.py +++ /dev/null @@ -1,32 +0,0 @@ -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: LGPL-3.0-only - -"""psy-simple - -Psyplot plugin for simple visualization tasks -""" - -from __future__ import annotations - -from . import _version - -__version__ = _version.get_versions()["version"] - -__author__ = "Philipp S. Sommer" -__copyright__ = """ -2016-2024 University of Lausanne -2020-2021 Helmholtz-Zentrum Geesthacht -2021-2024 Helmholtz-Zentrum hereon GmbH -""" -__credits__ = [ - "Philipp S. Sommer", -] -__license__ = "LGPL-3.0-only" - -__maintainer__ = "Philipp S. Sommer" -__email__ = "philipp.sommer@hereon.de" - -__status__ = "Pre-Alpha" diff --git a/psy_simple/_version.py b/psy_simple/_version.py deleted file mode 100644 index c2da1c0a..00000000 --- a/psy_simple/_version.py +++ /dev/null @@ -1,698 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: LGPL-3.0-only - -# This file helps to compute a version number in source trees obtained from -# git-archive tarball (such as those provided by githubs download-from-tag -# feature). Distribution tarballs (built by setup.py sdist) and build -# directories (produced by setup.py build) will contain a much shorter file -# that just contains the computed version number. - -# This file is released into the public domain. Generated by -# versioneer-0.21 (https://github.com/python-versioneer/python-versioneer) - -"""Git implementation of _version.py.""" - -import errno -import os -import re -import subprocess -import sys -from typing import Callable, Dict - - -def get_keywords(): - """Get the keywords needed to look up the version information.""" - # these strings will be replaced by git during git-archive. - # setup.py/versioneer.py will grep for the variable names, so they must - # each be defined on a line of their own. _version.py will just call - # get_keywords(). - git_refnames = "$Format:%d$" - git_full = "$Format:%H$" - git_date = "$Format:%ci$" - keywords = {"refnames": git_refnames, "full": git_full, "date": git_date} - return keywords - - -class VersioneerConfig: - """Container for Versioneer configuration parameters.""" - - -def get_config(): - """Create, populate and return the VersioneerConfig() object.""" - # these strings are filled in when 'setup.py versioneer' creates - # _version.py - cfg = VersioneerConfig() - cfg.VCS = "git" - cfg.style = "pep440" - cfg.tag_prefix = "v" - cfg.parentdir_prefix = "psy-simple-" - cfg.versionfile_source = "psy_simple/_version.py" - cfg.verbose = False - return cfg - - -class NotThisMethod(Exception): - """Exception raised if a method is not valid for the current scenario.""" - - -LONG_VERSION_PY: Dict[str, str] = {} -HANDLERS: Dict[str, Dict[str, Callable]] = {} - - -def register_vcs_handler(vcs, method): # decorator - """Create decorator to mark a method as the handler of a VCS.""" - - def decorate(f): - """Store f in HANDLERS[vcs][method].""" - if vcs not in HANDLERS: - HANDLERS[vcs] = {} - HANDLERS[vcs][method] = f - return f - - return decorate - - -def run_command( - commands, args, cwd=None, verbose=False, hide_stderr=False, env=None -): - """Call the given command(s).""" - assert isinstance(commands, list) - process = None - for command in commands: - try: - dispcmd = str([command] + args) - # remember shell=False, so use git.cmd on windows, not just git - process = subprocess.Popen( - [command] + args, - cwd=cwd, - env=env, - stdout=subprocess.PIPE, - stderr=(subprocess.PIPE if hide_stderr else None), - ) - break - except OSError: - e = sys.exc_info()[1] - if e.errno == errno.ENOENT: - continue - if verbose: - print("unable to run %s" % dispcmd) - print(e) - return None, None - else: - if verbose: - print("unable to find command, tried %s" % (commands,)) - return None, None - stdout = process.communicate()[0].strip().decode() - if process.returncode != 0: - if verbose: - print("unable to run %s (error)" % dispcmd) - print("stdout was %s" % stdout) - return None, process.returncode - return stdout, process.returncode - - -def versions_from_parentdir(parentdir_prefix, root, verbose): - """Try to determine the version from the parent directory name. - - Source tarballs conventionally unpack into a directory that includes both - the project name and a version string. We will also support searching up - two directory levels for an appropriately named parent directory - """ - rootdirs = [] - - for _ in range(3): - dirname = os.path.basename(root) - if dirname.startswith(parentdir_prefix): - return { - "version": dirname[len(parentdir_prefix) :], - "full-revisionid": None, - "dirty": False, - "error": None, - "date": None, - } - rootdirs.append(root) - root = os.path.dirname(root) # up a level - - if verbose: - print( - "Tried directories %s but none started with prefix %s" - % (str(rootdirs), parentdir_prefix) - ) - raise NotThisMethod("rootdir doesn't start with parentdir_prefix") - - -@register_vcs_handler("git", "get_keywords") -def git_get_keywords(versionfile_abs): - """Extract version information from the given file.""" - # the code embedded in _version.py can just fetch the value of these - # keywords. When used from setup.py, we don't want to import _version.py, - # so we do it with a regexp instead. This function is not used from - # _version.py. - keywords = {} - try: - with open(versionfile_abs, "r") as fobj: - for line in fobj: - if line.strip().startswith("git_refnames ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["refnames"] = mo.group(1) - if line.strip().startswith("git_full ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["full"] = mo.group(1) - if line.strip().startswith("git_date ="): - mo = re.search(r'=\s*"(.*)"', line) - if mo: - keywords["date"] = mo.group(1) - except OSError: - pass - return keywords - - -@register_vcs_handler("git", "keywords") -def git_versions_from_keywords(keywords, tag_prefix, verbose): - """Get version information from git keywords.""" - if "refnames" not in keywords: - raise NotThisMethod("Short version file found") - date = keywords.get("date") - if date is not None: - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - - # git-2.2.0 added "%cI", which expands to an ISO-8601 -compliant - # datestamp. However we prefer "%ci" (which expands to an "ISO-8601 - # -like" string, which we must then edit to make compliant), because - # it's been around since git-1.5.3, and it's too difficult to - # discover which version we're using, or to work around using an - # older one. - date = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - refnames = keywords["refnames"].strip() - if refnames.startswith("$Format"): - if verbose: - print("keywords are unexpanded, not using") - raise NotThisMethod("unexpanded keywords, not a git-archive tarball") - refs = {r.strip() for r in refnames.strip("()").split(",")} - # starting in git-1.8.3, tags are listed as "tag: foo-1.0" instead of - # just "foo-1.0". If we see a "tag: " prefix, prefer those. - TAG = "tag: " - tags = {r[len(TAG) :] for r in refs if r.startswith(TAG)} - if not tags: - # Either we're using git < 1.8.3, or there really are no tags. We use - # a heuristic: assume all version tags have a digit. The old git %d - # expansion behaves like git log --decorate=short and strips out the - # refs/heads/ and refs/tags/ prefixes that would let us distinguish - # between branches and tags. By ignoring refnames without digits, we - # filter out many common branch names like "release" and - # "stabilization", as well as "HEAD" and "master". - tags = {r for r in refs if re.search(r"\d", r)} - if verbose: - print("discarding '%s', no digits" % ",".join(refs - tags)) - if verbose: - print("likely tags: %s" % ",".join(sorted(tags))) - for ref in sorted(tags): - # sorting will prefer e.g. "2.0" over "2.0rc1" - if ref.startswith(tag_prefix): - r = ref[len(tag_prefix) :] - # Filter out refs that exactly match prefix or that don't start - # with a number once the prefix is stripped (mostly a concern - # when prefix is '') - if not re.match(r"\d", r): - continue - if verbose: - print("picking %s" % r) - return { - "version": r, - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": None, - "date": date, - } - # no suitable tags, so version is "0+unknown", but full hex is still there - if verbose: - print("no suitable tags, using unknown + full revision id") - return { - "version": "0+unknown", - "full-revisionid": keywords["full"].strip(), - "dirty": False, - "error": "no suitable tags", - "date": None, - } - - -@register_vcs_handler("git", "pieces_from_vcs") -def git_pieces_from_vcs(tag_prefix, root, verbose, runner=run_command): - """Get version from 'git describe' in the root of the source tree. - - This only gets called if the git-archive 'subst' keywords were *not* - expanded, and _version.py hasn't already been rewritten with a short - version string, meaning we're inside a checked out source tree. - """ - GITS = ["git"] - TAG_PREFIX_REGEX = "*" - if sys.platform == "win32": - GITS = ["git.cmd", "git.exe"] - TAG_PREFIX_REGEX = r"\*" - - _, rc = runner( - GITS, ["rev-parse", "--git-dir"], cwd=root, hide_stderr=True - ) - if rc != 0: - if verbose: - print("Directory %s not under git control" % root) - raise NotThisMethod("'git rev-parse --git-dir' returned error") - - # if there is a tag matching tag_prefix, this yields TAG-NUM-gHEX[-dirty] - # if there isn't one, this yields HEX[-dirty] (no NUM) - describe_out, rc = runner( - GITS, - [ - "describe", - "--tags", - "--dirty", - "--always", - "--long", - "--match", - "%s%s" % (tag_prefix, TAG_PREFIX_REGEX), - ], - cwd=root, - ) - # --long was added in git-1.5.5 - if describe_out is None: - raise NotThisMethod("'git describe' failed") - describe_out = describe_out.strip() - full_out, rc = runner(GITS, ["rev-parse", "HEAD"], cwd=root) - if full_out is None: - raise NotThisMethod("'git rev-parse' failed") - full_out = full_out.strip() - - pieces = {} - pieces["long"] = full_out - pieces["short"] = full_out[:7] # maybe improved later - pieces["error"] = None - - branch_name, rc = runner( - GITS, ["rev-parse", "--abbrev-ref", "HEAD"], cwd=root - ) - # --abbrev-ref was added in git-1.6.3 - if rc != 0 or branch_name is None: - raise NotThisMethod("'git rev-parse --abbrev-ref' returned error") - branch_name = branch_name.strip() - - if branch_name == "HEAD": - # If we aren't exactly on a branch, pick a branch which represents - # the current commit. If all else fails, we are on a branchless - # commit. - branches, rc = runner(GITS, ["branch", "--contains"], cwd=root) - # --contains was added in git-1.5.4 - if rc != 0 or branches is None: - raise NotThisMethod("'git branch --contains' returned error") - branches = branches.split("\n") - - # Remove the first line if we're running detached - if "(" in branches[0]: - branches.pop(0) - - # Strip off the leading "* " from the list of branches. - branches = [branch[2:] for branch in branches] - if "master" in branches: - branch_name = "master" - elif not branches: - branch_name = None - else: - # Pick the first branch that is returned. Good or bad. - branch_name = branches[0] - - pieces["branch"] = branch_name - - # parse describe_out. It will be like TAG-NUM-gHEX[-dirty] or HEX[-dirty] - # TAG might have hyphens. - git_describe = describe_out - - # look for -dirty suffix - dirty = git_describe.endswith("-dirty") - pieces["dirty"] = dirty - if dirty: - git_describe = git_describe[: git_describe.rindex("-dirty")] - - # now we have TAG-NUM-gHEX or HEX - - if "-" in git_describe: - # TAG-NUM-gHEX - mo = re.search(r"^(.+)-(\d+)-g([0-9a-f]+)$", git_describe) - if not mo: - # unparsable. Maybe git-describe is misbehaving? - pieces["error"] = ( - "unable to parse git-describe output: '%s'" % describe_out - ) - return pieces - - # tag - full_tag = mo.group(1) - if not full_tag.startswith(tag_prefix): - if verbose: - fmt = "tag '%s' doesn't start with prefix '%s'" - print(fmt % (full_tag, tag_prefix)) - pieces["error"] = "tag '%s' doesn't start with prefix '%s'" % ( - full_tag, - tag_prefix, - ) - return pieces - pieces["closest-tag"] = full_tag[len(tag_prefix) :] - - # distance: number of commits since tag - pieces["distance"] = int(mo.group(2)) - - # commit: short hex revision ID - pieces["short"] = mo.group(3) - - else: - # HEX: no tags - pieces["closest-tag"] = None - count_out, rc = runner(GITS, ["rev-list", "HEAD", "--count"], cwd=root) - pieces["distance"] = int(count_out) # total number of commits - - # commit date: see ISO-8601 comment in git_versions_from_keywords() - date = runner(GITS, ["show", "-s", "--format=%ci", "HEAD"], cwd=root)[ - 0 - ].strip() - # Use only the last line. Previous lines may contain GPG signature - # information. - date = date.splitlines()[-1] - pieces["date"] = date.strip().replace(" ", "T", 1).replace(" ", "", 1) - - return pieces - - -def plus_or_dot(pieces): - """Return a + if we don't already have one, else return a .""" - if "+" in pieces.get("closest-tag", ""): - return "." - return "+" - - -def render_pep440(pieces): - """Build up version string, with post-release "local version identifier". - - Our goal: TAG[+DISTANCE.gHEX[.dirty]] . Note that if you - get a tagged build and then dirty it, you'll get TAG+0.gHEX.dirty - - Exceptions: - 1: no tags. git_describe was just HEX. 0+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_branch(pieces): - """TAG[[.dev0]+DISTANCE.gHEX[.dirty]] . - - The ".dev0" means not master branch. Note that .dev0 sorts backwards - (a feature branch will appear "older" than the master branch). - - Exceptions: - 1: no tags. 0[.dev0]+untagged.DISTANCE.gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0" - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+untagged.%d.g%s" % (pieces["distance"], pieces["short"]) - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def pep440_split_post(ver): - """Split pep440 version string at the post-release segment. - - Returns the release segments before the post-release and the - post-release version number (or -1 if no post-release segment is present). - """ - vc = str.split(ver, ".post") - return vc[0], int(vc[1] or 0) if len(vc) == 2 else None - - -def render_pep440_pre(pieces): - """TAG[.postN.devDISTANCE] -- No -dirty. - - Exceptions: - 1: no tags. 0.post0.devDISTANCE - """ - if pieces["closest-tag"]: - if pieces["distance"]: - # update the post release segment - tag_version, post_version = pep440_split_post( - pieces["closest-tag"] - ) - rendered = tag_version - if post_version is not None: - rendered += ".post%d.dev%d" % ( - post_version + 1, - pieces["distance"], - ) - else: - rendered += ".post0.dev%d" % (pieces["distance"]) - else: - # no commits, use the tag as the version - rendered = pieces["closest-tag"] - else: - # exception #1 - rendered = "0.post0.dev%d" % pieces["distance"] - return rendered - - -def render_pep440_post(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX] . - - The ".dev0" means dirty. Note that .dev0 sorts backwards - (a dirty tree will appear "older" than the corresponding clean one), - but you shouldn't be releasing software with -dirty anyways. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - return rendered - - -def render_pep440_post_branch(pieces): - """TAG[.postDISTANCE[.dev0]+gHEX[.dirty]] . - - The ".dev0" means not master branch. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0]+gHEX[.dirty] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += plus_or_dot(pieces) - rendered += "g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["branch"] != "master": - rendered += ".dev0" - rendered += "+g%s" % pieces["short"] - if pieces["dirty"]: - rendered += ".dirty" - return rendered - - -def render_pep440_old(pieces): - """TAG[.postDISTANCE[.dev0]] . - - The ".dev0" means dirty. - - Exceptions: - 1: no tags. 0.postDISTANCE[.dev0] - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"] or pieces["dirty"]: - rendered += ".post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - else: - # exception #1 - rendered = "0.post%d" % pieces["distance"] - if pieces["dirty"]: - rendered += ".dev0" - return rendered - - -def render_git_describe(pieces): - """TAG[-DISTANCE-gHEX][-dirty]. - - Like 'git describe --tags --dirty --always'. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - if pieces["distance"]: - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render_git_describe_long(pieces): - """TAG-DISTANCE-gHEX[-dirty]. - - Like 'git describe --tags --dirty --always -long'. - The distance/hash is unconditional. - - Exceptions: - 1: no tags. HEX[-dirty] (note: no 'g' prefix) - """ - if pieces["closest-tag"]: - rendered = pieces["closest-tag"] - rendered += "-%d-g%s" % (pieces["distance"], pieces["short"]) - else: - # exception #1 - rendered = pieces["short"] - if pieces["dirty"]: - rendered += "-dirty" - return rendered - - -def render(pieces, style): - """Render the given version pieces into the requested style.""" - if pieces["error"]: - return { - "version": "unknown", - "full-revisionid": pieces.get("long"), - "dirty": None, - "error": pieces["error"], - "date": None, - } - - if not style or style == "default": - style = "pep440" # the default - - if style == "pep440": - rendered = render_pep440(pieces) - elif style == "pep440-branch": - rendered = render_pep440_branch(pieces) - elif style == "pep440-pre": - rendered = render_pep440_pre(pieces) - elif style == "pep440-post": - rendered = render_pep440_post(pieces) - elif style == "pep440-post-branch": - rendered = render_pep440_post_branch(pieces) - elif style == "pep440-old": - rendered = render_pep440_old(pieces) - elif style == "git-describe": - rendered = render_git_describe(pieces) - elif style == "git-describe-long": - rendered = render_git_describe_long(pieces) - else: - raise ValueError("unknown style '%s'" % style) - - return { - "version": rendered, - "full-revisionid": pieces["long"], - "dirty": pieces["dirty"], - "error": None, - "date": pieces.get("date"), - } - - -def get_versions(): - """Get version information or return default if unable to do so.""" - # I am in _version.py, which lives at ROOT/VERSIONFILE_SOURCE. If we have - # __file__, we can work backwards from there to the root. Some - # py2exe/bbfreeze/non-CPython implementations don't do __file__, in which - # case we can only use expanded keywords. - - cfg = get_config() - verbose = cfg.verbose - - try: - return git_versions_from_keywords( - get_keywords(), cfg.tag_prefix, verbose - ) - except NotThisMethod: - pass - - try: - root = os.path.realpath(__file__) - # versionfile_source is the relative path from the top of the source - # tree (where the .git directory might live) to this file. Invert - # this to find the root from __file__. - for _ in cfg.versionfile_source.split("/"): - root = os.path.dirname(root) - except NameError: - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to find root of source tree", - "date": None, - } - - try: - pieces = git_pieces_from_vcs(cfg.tag_prefix, root, verbose) - return render(pieces, cfg.style) - except NotThisMethod: - pass - - try: - if cfg.parentdir_prefix: - return versions_from_parentdir(cfg.parentdir_prefix, root, verbose) - except NotThisMethod: - pass - - return { - "version": "0+unknown", - "full-revisionid": None, - "dirty": None, - "error": "unable to compute version", - "date": None, - } diff --git a/psy_simple/base.py b/psy_simple/base.py deleted file mode 100644 index f128c382..00000000 --- a/psy_simple/base.py +++ /dev/null @@ -1,1111 +0,0 @@ -"""Base formatoptions for psy-simple. - -This module defines several formatoptions that are the basis for many -matplotlib figures, such as axes title, figure title, etc. -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import inspect -from abc import abstractmethod -from collections import defaultdict -from itertools import chain - -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -import six -from psyplot.data import InteractiveList, open_dataset -from psyplot.docstring import dedent, docstrings, safe_modulo -from psyplot.plotter import START, Formatoption, Plotter, rcParams - -docstrings.params["replace_note"] = inspect.cleandoc( - """ - You can insert any meta key from the :attr:`xarray.DataArray.attrs` via a - string like ``'%%(key)s'``. Furthermore there are some special cases: - - - Strings like ``'%%Y'``, ``'%%b'``, etc. will be replaced using the - :meth:`datetime.datetime.strftime` method as long as the data has a time - coordinate and this can be converted to a :class:`~datetime.datetime` - object. - - ``'%%(x)s'``, ``'%%(y)s'``, ``'%%(z)s'``, ``'%%(t)s'`` will be replaced - by the value of the x-, y-, z- or time coordinate (as long as this - coordinate is one-dimensional in the data) - - any attribute of one of the above coordinates is inserted via - ``axis + key`` (e.g. the name of the x-coordinate can be inserted via - ``'%%(xname)s'``). - - Labels defined in the :class:`psyplot.rcParams` ``'texts.labels'`` key - are also replaced when enclosed by '{}'. The standard labels are - - - %s""" - % "\n - ".join( - "%s: ``%s``" % tuple(item) - for item in six.iteritems(rcParams["texts.labels"]) - ) -) - -docstrings.params["colors"] = inspect.cleandoc( - """ - The following color abbreviations are supported: - - ========== ======== - character color - ========== ======== - 'b' blue - 'g' green - 'r' red - 'c' cyan - 'm' magenta - 'y' yellow - 'k' black - 'w' white - ========== ======== - - In addition, you can specify colors in many weird and wonderful ways, - including full names (``'green'``), hex strings (``'#008000'``), RGB or - RGBA tuples (``(0,1,0,1)``) or grayscale intensities as a string - (``'0.8'``).""" -) - -docstrings.params["fontsizes"] = inspect.cleandoc( - """ - float - The absolute font size in points (e.g., 12) - string - Strings might be 'xx-small', 'x-small', 'small', 'medium', 'large', - 'x-large', 'xx-large'.""" -) - - -class TextBase(object): - """Abstract base class for formatoptions that provides a replace method""" - - delimiter = None - - group = "labels" - - @property - def enhanced_attrs(self): - """The enhanced attributes of the array""" - arr = self.data - return self.get_enhanced_attrs(arr) - - @property - def rc(self): - """:class:`~psyplot.config.rcsetup.SubDict` of rcParams 'texts' key""" - try: - return self._rc - except AttributeError: - return rcParams.find_and_replace(base_str=["texts."]) - - data_dependent = True - - @docstrings.dedent - def replace(self, s, data, attrs=None): - """ - Replace the attributes of the plotter data in a string - - %(replace_note)s - - Parameters - ---------- - s: str - String where the replacements shall be made - data: InteractiveBase - Data object from which to use the coordinates and insert the - coordinate and attribute informations - attrs: dict - Meta attributes that shall be used for replacements. If None, it - will be gained from `data.attrs` - - Returns - ------- - str - `s` with inserted informations""" - # insert labels - s = s.format(**self.rc["labels"]) - # replace attributes - attrs = attrs or data.attrs - if hasattr(getattr(data, "psy", None), "arr_name"): - attrs = attrs.copy() - attrs["arr_name"] = data.psy.arr_name - s = safe_modulo(s, attrs) - # replace datetime.datetime like time informations - if isinstance(data, InteractiveList): - data = data[0] - tname = self.any_decoder.get_tname( - next(self.plotter.iter_base_variables), data.coords - ) - if tname is not None and tname in data.coords: - time = data.coords[tname] - if not time.values.ndim: - try: # assume a valid datetime.datetime instance - s = pd.to_datetime(str(time.values[()])).strftime(s) - except ValueError: - pass - if six.PY2: - return s.decode("utf-8") - return s - - def get_fig_data_attrs(self, delimiter=None): - """Join the data attributes with other plotters in the project - - This method joins the attributes of the - :class:`~psyplot.InteractiveBase` instances in the project that - draw on the same figure as this instance does. - - Parameters - ---------- - delimiter: str - Specifies the delimiter with what the attributes are joined. If - None, the :attr:`delimiter` attribute of this instance or (if the - latter is also None), the rcParams['texts.delimiter'] item is used. - - Returns - ------- - dict - A dictionary with all the meta attributes joined by the specified - `delimiter`""" - if self.project is not None: - delimiter = next( - filter( - lambda d: d is not None, - [delimiter, self.delimiter, self.rc["delimiter"]], - ) - ) - figs = self.project.figs - fig = self.ax.get_figure() - if self.plotter._initialized and fig in figs: - ret = figs[fig].joined_attrs( - delimiter=delimiter, plot_data=True - ) - else: - ret = self.get_enhanced_attrs(self.plotter.plot_data) - self.logger.debug( - "Can not get the figure attributes because plot has not " - "yet been initialized!" - ) - return ret - else: - return self.get_enhanced_attrs(self.plotter.plot_data) - - def get_enhanced_attrs(self, *args, **kwargs): - replot = kwargs.pop("replot", False) - if hasattr(self, "_enhanced_attrs") and not ( - self.plotter.replot or replot - ): - return self._enhanced_attrs - self._enhanced_attrs = self.plotter.get_enhanced_attrs(*args, **kwargs) - return self._enhanced_attrs - - def get_fmt_widget(self, parent, project): - """Create a combobox with the attributes""" - from psy_simple.widgets.texts import LabelWidget - - return LabelWidget(parent, self, project) - - -docstrings.params["fontweights"] = inspect.cleandoc( - """ - float - a float between 0 and 1000 - string - Possible strings are one of 'ultralight', 'light', 'normal', - 'regular', 'book', 'medium', 'roman', 'semibold', 'demibold', - 'demi', 'bold', 'heavy', 'extra bold', 'black'.""" -) - - -@docstrings.get_sections(base="label_weight") -@dedent -def label_weight( - base, label_name=None, children=[], parents=[], dependencies=[] -): - """ - Function that returns a Formatoption class for modifying the fontweight - - This function returns a :class:`~psyplot.plotter.Formatoption` instance - that modifies the weight of the given `base` formatoption - - Parameters - ---------- - base: Formatoption - The base formatoption instance that is used in the - :class:`psyplot.Plotter` subclass to create the label. The instance - must have a ``texts`` attribute which stores all the - :class:`matplotlib.text.Text` instances. - label_name: str - The name of the label to use in the documentation. If None, - it will be ``key``, where ``key`` is the - :attr:`psyplot.plotter.Formatoption.key`` attribute of `base` - children: list of str - The childrens of the resulting formatoption class (besides the `base` - formatoption which is included anyway) - parents: list of str - The parents of the resulting formatoption class (besides the `base` - the properties formatoption from `base` (see :func:`label_props`)) - dependencies: list of str - The dependencies of the formatoption - - Returns - ------- - Formatoption - The formatoption instance that modifies the fontweight of `base` - - See Also - -------- - label_size, label_props, Figtitle, Title""" - label_name = label_name or base.key - cl_children = children - cl_parents = parents - cl_dependencies = dependencies - - class LabelWeight(Formatoption): - __doc__ = """ - Set the fontweight of the %s - - Possible types - -------------- - %%(fontweights)s - - See Also - -------- - %s, %s, %s""" % ( - label_name, - base.key, - base.key + "size", - base.key + "props", - ) - children = [base.key] + cl_children - parent = [base.key + "props"] + cl_parents - dependencies = cl_dependencies - - group = "labels" - - name = "Font weight of " + (base.name or base.key) - - def update(self, value): - for text in getattr(self, base.key).texts: - text.set_weight(value) - - def get_fmt_widget(self, parent, project): - """Get a widget with the different font weights""" - from psy_simple.widgets.texts import FontWeightWidget - - return FontWeightWidget( - parent, - self, - next(iter(getattr(self, base.key).texts), None), - base, - ) - - return LabelWeight(base.key + "weight") - - -@docstrings.dedent -def label_size( - base, label_name=None, children=[], parents=[], dependencies=[] -): - """ - Function that returns a Formatoption class for modifying the fontsite - - This function returns a :class:`~psyplot.plotter.Formatoption` instance - that modifies the size of the given `base` formatoption - - Parameters - ---------- - %(label_weight.parameters)s - - Returns - ------- - Formatoption - The formatoption instance that modifies the fontsize of `base` - - See Also - -------- - label_weight, label_props, Figtitle, Title""" - label_name = label_name or base.key - cl_children = children - cl_parents = parents - cl_dependencies = dependencies - - class LabelSize(Formatoption): - __doc__ = """ - Set the size of the %s - - Possible types - -------------- - %%(fontsizes)s - - See Also - -------- - %s, %s, %s""" % ( - label_name, - base.key, - base.key + "weight", - base.key + "props", - ) - children = [base.key] + cl_children - parent = [base.key + "props"] + cl_parents - dependencies = cl_dependencies - - group = "labels" - - name = "Font size of " + (base.name or base.key) - - def update(self, value): - for text in getattr(self, base.key).texts: - text.set_size(value) - - def get_fmt_widget(self, parent, project): - """Get a widget with the different font weights""" - from psy_simple.widgets.texts import FontSizeWidget - - return FontSizeWidget( - parent, - self, - next(iter(getattr(self, base.key).texts), None), - base, - ) - - return LabelSize(base.key + "size") - - -docstrings.keep_params("label_weight.parameters", "base", "label_name") - - -@docstrings.dedent -def label_props( - base, label_name=None, children=[], parents=[], dependencies=[] -): - """ - Function that returns a Formatoption class for modifying the fontsite - - This function returns a :class:`~psyplot.plotter.Formatoption` instance - that modifies the size of the given `base` formatoption - - Parameters - ---------- - %(label_weight.parameters)s - children: list of str - The childrens of the resulting formatoption class (besides the `base` - formatoption, the ``base.key + 'size'`` and ``base.key + 'weight'`` - keys, which are included anyway (see :func:`label_size`, - :func:`label_weight`)) - parents: list of str - The parents of the resulting formatoption class - - Returns - ------- - Formatoption - The formatoption instance that modifies the fontsize of `base` - - See Also - -------- - label_weight, label_props, Figtitle, Title""" - label_name = label_name or base.key - cl_children = children - cl_parents = parents - cl_dependencies = dependencies - - class LabelProps(Formatoption): - __doc__ = """ - Properties of the %s - - Specify the font properties of the figure title manually. - - Possible types - -------------- - dict - Items may be any valid text property - - See Also - -------- - %s, %s, %s""" % ( - label_name, - base.key, - base.key + "size", - base.key + "weight", - ) - children = cl_children - parents = cl_parents - dependencies = [ - base.key, - base.key + "size", - base.key + "weight", - ] + cl_dependencies - - group = "labels" - - name = "Font properties of " + (base.name or base.key) - - def __init__(self, *args, **kwargs): - super(LabelProps, self).__init__(*args, **kwargs) - self.default_props = {} - self._todefault = False - - def set_value(self, value, validate=True, todefault=False): - self._todefault = todefault - super(LabelProps, self).set_value(value, validate, todefault) - - def update(self, fontprops): - fontprops = fontprops.copy() - # store default font properties - try: - text = next(iter(getattr(self, base.key).texts)) - except StopIteration: - return - # TODO: This handling of the default management is not really - # satisfying because you run into troubles when using alternate - # property names (e.g. if you use 'ha' and 'horizontalalignment' - # at the same time) - if not self._todefault: - for key in fontprops: - if key == "bbox": - default = dict(facecolor="none", edgecolor="none") - else: - default = getattr(text, "get_" + key)() - self.default_props.setdefault(key, default) - else: - fontprops = self.default_props.copy() - self.default_props.clear() - if "size" not in fontprops and "fontsize" not in fontprops: - fontprops["size"] = getattr(self, base.key + "size").value - if "weight" not in fontprops and "fontweight" not in fontprops: - fontprops["weight"] = getattr(self, base.key + "weight").value - for text in getattr(self, base.key).texts: - text.update(fontprops) - self._todefault = False - - def get_fmt_widget(self, parent, project): - """Get a widget with the different font weights""" - from psy_simple.widgets.texts import FontPropertiesWidget - - return FontPropertiesWidget( - parent, - self, - next(iter(getattr(self, base.key).texts), None), - base, - ) - - return LabelProps(base.key + "props") - - -class Title(TextBase, Formatoption): - """ - Show the title - - Set the title of the plot. - %(replace_note)s - - Possible types - -------------- - str - The title for the :func:`~matplotlib.pyplot.title` function. - - Notes - ----- - This is the title of this specific subplot! For the title of the whole - figure, see the :attr:`figtitle` formatoption. - - See Also - -------- - figtitle, titlesize, titleweight, titleprops""" - - name = "Axes title" - - def initialize_plot(self, value): - arr = self.data - self.texts = [ - self.ax.set_title( - self.replace(value, arr, attrs=self.enhanced_attrs) - ) - ] - - def update(self, value): - arr = self.data - self.texts[0].set_text( - self.replace(value, arr, attrs=self.enhanced_attrs) - ) - - -class Figtitle(TextBase, Formatoption): - """ - Plot a figure title - - Set the title of the figure. - %(replace_note)s - - Possible types - -------------- - str - The title for the :func:`~matplotlib.pyplot.suptitle` function - - Notes - ----- - - If the plotter is part of a :class:`psyplot.project.Project` and multiple - plotters of this project are on the same figure, the replacement - attributes (see above) are joined by a delimiter. If the - :attr:`delimiter` attribute of this :class:`Figtitle` instance is not - None, it will be used. Otherwise the rcParams['texts.delimiter'] item is - used. - - This is the title of the whole figure! For the title of this specific - subplot, see the :attr:`title` formatoption. - - See Also - -------- - title, figtitlesize, figtitleweight, figtitleprops""" - - name = "Figure title" - - @property - def enhanced_attrs(self): - return self.get_fig_data_attrs() - - def initialize_plot(self, s): - if s: - self.texts = [ - self.ax.get_figure().suptitle( - self.replace(s, self.plotter.data, self.enhanced_attrs) - ) - ] - self.clear_other_texts() - else: - self.texts = [self.ax.get_figure().suptitle("")] - - def update(self, s): - if s: - self.texts[0].set_text( - self.replace(s, self.plotter.data, self.enhanced_attrs) - ) - self.clear_other_texts() - else: - self.texts[0].set_text("") - - def clear_other_texts(self, remove=False): - """Make sure that no other text is a the same position as this one - - This method clears all text instances in the figure that are at the - same position as the :attr:`_text` attribute - - Parameters - ---------- - remove: bool - If True, the Text instances are permanently deleted from the - figure, otherwise there text is simply set to ''""" - fig = self.ax.get_figure() - # don't do anything if our figtitle is the only Text instance - if len(fig.texts) == 1: - return - for i, text in enumerate(fig.texts): - if text == self._text: - continue - if text.get_position() == self._text.get_position(): - if not remove: - text.set_text("") - else: - del fig[i] - - -class Text(TextBase, Formatoption): - """ - Add text anywhere on the plot - - This formatoption draws a text on the specified position on the figure. - %(replace_note)s - - Possible types - -------------- - str - If string s: this will be used as (1., 1., s, {'ha': 'right'}) (i.e. a - string in the upper right corner of the axes). - tuple or list of tuples (x,y,s[,coord.-system][,options]]) - Each tuple defines a text instance on the plot. 0<=x, y<=1 are the - coordinates. The coord.-system can be either the data coordinates - (default, ``'data'``) or the axes coordinates (``'axes'``) or the - figure coordinates ('fig'). The string s finally is the text. options - may be a dictionary to specify format the appearence (e.g. ``'color'``, - ``'fontweight'``, ``'fontsize'``, etc., see - :class:`matplotlib.text.Text` for possible keys). - To remove one single text from the plot, set (x,y,''[, coord.-system]) - for the text at position (x,y) - empty list - remove all texts from the plot - - See Also - -------- - title, figtitle""" - - name = "Arbitrary text on the plot" - - @property - def transform(self): - """Dictionary containing the relevant transformations""" - ax = self.ax - return { - "axes": ax.transAxes, - "fig": ax.get_figure().transFigure, - "data": ax.transData, - } - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - #: texts that shall be removed when updating - self._texts_to_remove = set() - #: :class:`matplotlib.texts.Text` instances on the figure - self._texts = defaultdict(set) - - def _remove_texttuple(self, pos): - """Remove a texttuple from the value in the plotter - - Parameters - ---------- - pos: tuple (x, y, cs) - x and y are the x- and y-positions and cs the coordinate system""" - for i, (old_x, old_y, s, old_cs, d) in enumerate(self.value): - if (old_x, old_y, old_cs) == pos: - self.value.pop(i) - return - raise ValueError("{0} not found!".format(pos)) - - def _update_texttuple(self, x, y, s, cs, d): - """Update the text tuple at `x` and `y` with the given `s` and `d`""" - pos = (x, y, cs) - for i, (old_x, old_y, old_s, old_cs, old_d) in enumerate(self.value): - if (old_x, old_y, old_cs) == pos: - self.value[i] = (old_x, old_y, s, old_cs, d) - return - raise ValueError("No text tuple found at {0}!".format(pos)) - - def set_value(self, value, validate=True, todefault=False): - value = self.validate(value) if validate else value - # mark all texts for removing if value is empty - if not value or todefault: - with self.plotter.no_validation: - self.plotter[self.key] = [] - for cs, texts in self._texts.items(): - for t in texts: - pos = t.get_position() - self._texts_to_remove.add((pos[0], pos[1], cs)) - - # loop through texttuples to see whether one changed or has to be - # removed. x: x-coord, y: y-coord, s: string, cs: coord.-system, - # d: text params dictionary - for x, y, s, cs, d in value: - if not s: - try: - self._remove_texttuple((x, y, cs)) - self._texts_to_remove.add((x, y, cs)) - except ValueError: - pass - else: - try: - self._update_texttuple(x, y, s, cs, d) - except ValueError: - self.value.append((x, y, s, cs, d)) - - def update(self, value, texts_to_remove=None): - # remove texts - for x, y, cs in texts_to_remove or self._texts_to_remove: - for t in self._texts[cs]: - if (x, y) == t.get_position(): - self._texts[cs].remove(t) - t.remove() - break - if self.plotter.replot: - value = self.value + value - # now update the old texts or create new ones - for x, y, s, cs, d in value: - if cs == "fig": - s = self.replace( - s, - self.plotter.data, - self.get_fig_data_attrs(d.pop("delimiter", None)), - ) - else: - s = self.replace(s, self.plotter.data, self.enhanced_attrs) - found = False - for t in self._texts[cs]: - if (x, y) == t.get_position(): - t.set_text(s) - t.update(d.copy()) - found = True - break - if not found: - self._texts[cs].add( - self.ax.text( - x, y, s, d.copy(), transform=self.transform[cs] - ) - ) - - def share(self, fmto, **kwargs): - """Share the settings of this formatoption with other data objects - - Parameters - ---------- - fmto: Formatoption - The :class:`Formatoption` instance to share the attributes with - ``**kwargs`` - Any other keyword argument that shall be passed to the update - method of `fmto` - - Notes - ----- - The Text formatoption sets the 'texts_to_remove' keyword to the - :attr:`_texts_to_remove` attribute of this instance (if not already - specified in ``**kwargs``""" - kwargs.setdefault("texts_to_remove", self._texts_to_remove) - super(Text, self).share(fmto, **kwargs) - - def diff(self, value): - my_value = self.value - return (not len(value) and len(my_value)) or any( - val not in my_value for val in value - ) - - def finish_update(self): - """Clears the :attr:`_texts_to_remove` set""" - self._texts_to_remove.clear() - - def remove(self): - for t in chain.from_iterable(six.itervalues(self._texts)): - t.remove() - self._texts.clear() - - -class Tight(Formatoption): - """ - Automatically adjust the plots. - - If set to True, the plots are automatically adjusted to fit to the figure - limitations via the :func:`matplotlib.pyplot.tight_layout()` function. - - Possible types - -------------- - bool - True for automatic adjustment - - Warnings - -------- - There is no update method to undo what happend after this formatoption is - set to True!""" - - group = "axes" - - name = "Tight layout" - - def update(self, value): - if value: - plt.sca(self.ax) - plt.tight_layout() - - -class BackgroundColor(Formatoption): - """The background color for the matplotlib axes. - - Possible types - -------------- - 'rc' - to use matplotlibs rc params - None - to use a transparent color - color - Any possible matplotlib color - """ - - group = "axes" - - name = "Background color of the plot" - - def update(self, value): - if value == "rc": - self.ax.patch.set_facecolor(plt.rcParams["axes.facecolor"]) - self.ax.set_facecolor(plt.rcParams["axes.facecolor"]) - elif value is None: - self.ax.patch.set_facecolor("none") - self.ax.set_facecolor("none") - else: - self.ax.patch.set_facecolor(value) - self.ax.set_facecolor(value) - - def get_fmt_widget(self, parent, project): - from psy_simple.widgets.colors import BackGroundColorWidget - - return BackGroundColorWidget(parent, self, project) - - -class ValueMaskBase(Formatoption): - """Base class for masking formatoptions""" - - priority = START - - group = "masking" - - data_dependent = True - - @abstractmethod - def mask_func(self): - """The masking function that is called""" - return - - def update(self, value): - if value is None: - pass - else: - for i, data in enumerate(self.iter_data): - self.set_data(self._mask_data(data, value), i) - - def _mask_data(self, data, value): - data = data.copy(data=np.copy(data.values)) - data.values[~np.isnan(data.values)] = self.mask_func( - data.values[~np.isnan(data.values)], value - ) - return data - - -class MaskLess(ValueMaskBase): - """ - Mask data points smaller than a number - - Possible types - -------------- - float - The floating number to mask below - - See Also - -------- - maskleq, maskgreater, maskgeq, maskbetween - """ - - name = "Mask less" - - def mask_func(self, data, value): - data[data < value] = np.nan - return data - - -class MaskLeq(ValueMaskBase): - """ - Mask data points smaller than or equal to a number - - Possible types - -------------- - float - The floating number to mask below - - See Also - -------- - maskless, maskgreater, maskgeq, maskbetween - """ - - name = "Mask lesser than or equal" - - def mask_func(self, data, value): - data[data <= value] = np.nan - return data - - -class MaskGreater(ValueMaskBase): - """ - Mask data points greater than a number - - Possible types - -------------- - float - The floating number to mask above - - See Also - -------- - maskless, maskleq, maskgeq, maskbetween - """ - - name = "Mask greater" - - def mask_func(self, data, value): - data[data > value] = np.nan - return data - - -class MaskGeq(ValueMaskBase): - """ - Mask data points greater than or equal to a number - - Possible types - -------------- - float - The floating number to mask above - - See Also - -------- - maskless, maskleq, maskgreater, maskbetween - """ - - name = "Mask greater than or equal" - - def mask_func(self, data, value): - data[data >= value] = np.nan - return data - - -class MaskBetween(ValueMaskBase): - """ - Mask data points between two numbers - - Possible types - -------------- - float - The floating number to mask above - - See Also - -------- - maskless, maskleq, maskgreater, maskgeq - """ - - name = "Mask between two values" - - def mask_func(self, data, value): - data[np.all([data >= value[0], data <= value[1]], axis=0)] = np.nan - return data - - -class Mask(Formatoption): - """Mask the data where a certain condition is True - - This formatoption can be used to mask the plotting data based on another - array. This array can be the name of a variable in the base dataset, - or it can be a numeric array. Note that the data needs to be on exactly - the same coordinates as the data shown here - - Possible types - -------------- - None - Apply no mask - str - The name of a variable in the base dataset to use. - - - dimensions that are in the given `mask` but not in the visualized - base variable will be aggregated using :func:`numpy.any` - - if the given `mask` misses dimensions that are in the visualized - data (i.e. the data of this plotter), we broadcast the `mask` to - match the shape of the data - - dimensions that are in `mask` and the base variable, but not in the - visualized data will be matched against each other - str - The path to a netCDF file that shall be loaded - xr.DataArray or np.ndarray - An array that can be broadcasted to the shape of the data - """ - - priority = START - - group = "masking" - - name = "Apply a mask" - - def update(self, value): - if value is None: - return - for i, data in enumerate(self.iter_data): - mask = self.load_mask(data, value) - new_data = data.where(mask.astype(bool)) - new_data.psy.base = data.psy.base - new_data.psy.idims = data.psy.idims - self.set_data(new_data, i) - - def diff(self, value): - try: - return bool(self.value != value) - except ValueError: - if hasattr(value, "shape") and hasattr(self.value, "shape"): - return (value.shape != self.value.shape) | ( - value != self.value - ).any() - else: - return True - - def load_mask(self, data, value): - if isinstance(value, str) and value in data.psy.base: - mask = data.psy.base[value] - if not set(mask.dims).intersection(data.dims): - raise ValueError( - "No intersection between dimensions of mask " - f"{value}: {mask.dims}, and the data: " - f"{data.dims}" - ) - elif isinstance(value, str): - try: - mask = open_dataset(value) - except Exception: - raise ValueError( - f"{value} is not in the base dataset of " - f"{data.psy.arr_name} and could not be loaded with " - f"psy.open_dataset({repr(value)})" - ) - else: - available_vars = [ - v - for v in mask - if set(mask[v].dims).intersection(data.dims) - ] - if not available_vars: - raise ValueError( - f"No variable in {value} has an overlap " - f"with the data dimensions {data.dims}" - ) - else: - mask = mask[available_vars[0]] - else: - mask = value - base_var = next(data.psy.iter_base_variables) - - # aggregate mask over dimensions that are not in the base variable - dims2agg = set(mask.dims).difference(set(base_var.dims)) - if dims2agg: - mask = mask.any(list(dims2agg)) - - # select idims of mask - idims = { - d: sl - for d, sl in data.psy.idims.items() - if d in mask.dims and d not in data.dims - } - if idims: - mask = mask.isel(**idims) - - return mask - - -class TitlesPlotter(Plotter): - """Plotter class for labels""" - - _rcparams_string = ["plotter.baseplotter."] - title = Title("title") - titlesize = label_size(title) - titleweight = label_weight(title) - titleprops = label_props(title) - figtitle = Figtitle("figtitle") - figtitlesize = label_size(figtitle, "figure title") - figtitleweight = label_weight(figtitle, "figure title") - figtitleprops = label_props(figtitle, "figure title") - text = Text("text") - - -class BasePlotter(TitlesPlotter): - """Base class with formatoptions for plotting on an matplotlib axes""" - - _rcparams_string = ["plotter.baseplotter."] - - tight = Tight("tight") - background = BackgroundColor("background") - maskless = MaskLess("maskless") - maskleq = MaskLeq("maskleq") - maskgreater = MaskGreater("maskgreater") - maskgeq = MaskGeq("maskgeq") - maskbetween = MaskBetween("maskbetween") - mask = Mask("mask") diff --git a/psy_simple/colors.py b/psy_simple/colors.py deleted file mode 100644 index 7e9c2362..00000000 --- a/psy_simple/colors.py +++ /dev/null @@ -1,362 +0,0 @@ -# -*- coding: utf-8 -*- -"""colors module of the psyplot package. - -This module contains some additional color maps and the show_colormaps -function to visualize available colormaps. -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -from difflib import get_close_matches -from itertools import chain -from warnings import warn - -import matplotlib as mpl -import numpy as np -import psyplot -import six -from matplotlib.cm import get_cmap as mpl_get_cmap -from matplotlib.colors import BoundaryNorm, Colormap, LinearSegmentedColormap -from psyplot import rcParams -from psyplot.data import safe_list -from psyplot.docstring import docstrings -from psyplot.utils import isstring - -_cmapnames = { # names of self defined colormaps (see get_cmap function below) - "red_white_blue": [ # symmetric water fluxes - (1, 0, 0), - (1, 0.5, 0), - (1, 1, 0), - (1, 1.0, 1), - (0, 1, 1), - (0, 0.5, 1), - (0, 0, 1), - ], - "blue_white_red": [ # symmetric temperature - (0, 0, 1), - (0, 0.5, 1), - (0, 1, 1), - (1, 1.0, 1), - (1, 1, 0), - (1, 0.5, 0), - (1, 0, 0), - ], - "white_blue_red": [ # temperature - (1, 1.0, 1), - (0, 0, 1), - (0, 1, 1), - (1, 1, 0), - (1, 0, 0), - ], - "white_red_blue": [ # water fluxes - (1, 1.0, 1), - (1, 0, 0), - (1, 1, 0), - (0, 1, 1), - (0, 0, 1), - ], - "rwb": [(1, 0, 0), (1, 1.0, 1), (0, 0, 1)], - "wrb": [(1, 1.0, 1), (1, 0, 0), (0, 0, 1)], - "wbr": [(1, 1.0, 1), (0, 0, 1), (1, 0, 0)], -} -for key, val in list(_cmapnames.items()): - _cmapnames[key + "_r"] = val[::-1] - -_color_array = np.linspace(0, 1, 256, endpoint=True) - -_cmapnames["w_RdBu"] = np.append( - [[1.0, 1.0, 1.0, 1.0]], mpl_get_cmap("RdBu")(_color_array), axis=0 -) -_cmapnames["w_RdBu_r"] = np.append( - [[1.0, 1.0, 1.0, 1.0]], mpl_get_cmap("RdBu_r")(_color_array), axis=0 -) - -_cmapnames["w_Reds"] = np.append( - [[1.0, 1.0, 1.0, 1.0]], mpl_get_cmap("Reds")(_color_array), axis=0 -) - -_cmapnames["w_Blues"] = np.append( - [[1.0, 1.0, 1.0, 1.0]], mpl_get_cmap("Blues")(_color_array), axis=0 -) - -_cmapnames["w_Greens"] = np.append( - [[1.0, 1.0, 1.0, 1.0]], mpl_get_cmap("Greens")(_color_array), axis=0 -) - - -docstrings.params[ - "cmap_note" -] = """ - Strings may be any valid colormap name suitable for the - :func:`matplotlib.cm.get_cmap` function or one of the color lists - defined in the 'colors.cmaps' key of the :attr:`psyplot.rcParams` - dictionary (including their reversed color maps given via the '_r' - extension).""" - - -class FixedColorMap(LinearSegmentedColormap): - """Bug fixing colormap with same functionality as matplotlibs colormap - - This class fixes a bug in the - :meth:`cartopy.mpl.geoaxes.GeoAxes.streamplot` method in python 3.4 - - Notes - ----- - To reproduce the error type in python 3.4:: - - >>> import cartopy.crs as ccrs - >>> import matplotlib.pyplot as plt - >>> import psyplot.project as psy - >>> maps = psy.plot.mapvector( - ... "test-t2m-u-v.nc", - ... name=[["u", "v"]], - ... plot="stream", - ... lonlatbox="Europe", - ... color="absolute", - ... ) - >>> plotter = maps[0].plotter - >>> x, y, u, v = plotter.plot._get_data() - >>> maps.close(True, True) - >>> ax = plt.axes(projection=ccrs.PlateCarree()) - >>> ax.set_extent(plotter.lonlatbox.lonlatbox, crs=ccrs.PlateCarree()) - >>> m = ax.streamplot( - ... x, - ... y, - ... u, - ... v, - ... density=[1.0, 1.0], - ... color=plotter.plot._kwargs["color"], - ... norm=plotter.plot._kwargs["norm"], - ... ) - - This raises in matplotlib.colors, line 557, in - :meth:`matplotlib.colors.Colormap.__call__`:: - - ``xa = np.array([X])`` - ValueError: setting an array element with a sequence. - """ - - if six.PY3: - - def __call__(self, X, *args, **kwargs): - if isinstance(X, np.ma.core.MaskedArray) and X.ndim == 0: - X = np.array(np.nan) - return super(FixedColorMap, self).__call__(X, *args, **kwargs) - - @staticmethod - def from_list(*args, **kwargs): - cmap = LinearSegmentedColormap.from_list(*args, **kwargs) - return FixedColorMap( - cmap.name, cmap._segmentdata, cmap.N, cmap._gamma - ) - - -class FixedBoundaryNorm(BoundaryNorm): - """Bug fixing Norm with same functionality as matplotlibs BoundaryNorm - - This class fixes a bug in the - :meth:`cartopy.mpl.geoaxes.GeoAxes.streamplot` for matplotlib version 1.5 - - Notes - ----- - To reproduce the error type:: - - >>> import cartopy.crs as ccrs - >>> import matplotlib.pyplot as plt - >>> import psyplot.project as psy - >>> import matplotlib.colors as mcol - >>> maps = psy.plot.mapvector( - ... "test-t2m-u-v.nc", - ... name=[["u", "v"]], - ... plot="stream", - ... lonlatbox="Europe", - ... color="absolute", - ... ) - >>> plotter = maps[0].plotter - >>> x, y, u, v = plotter.plot._get_data() - >>> maps.close(True, True) - >>> ax = plt.axes(projection=ccrs.PlateCarree()) - >>> ax.set_extent(plotter.lonlatbox.lonlatbox, crs=ccrs.PlateCarree()) - >>> m = ax.streamplot( - ... x, - ... y, - ... u, - ... v, - ... color=plotter.plot._kwargs["color"], - ... norm=mcol.BoundaryNorm( - ... plotter.bounds.norm.boundaries, - ... plotter.bounds.norm.Ncmap, - ... plotter.bounds.norm.clip, - ... ), - ... density=[1.0, 1.0], - ... ) - - This raises in matplotlib.colors, line 1316, in - :meth:`matplotlib.colors.BoundaryNorm.__call__`:: - - ``ret = int(ret[0]) # assume python scalar`` - MaskError: Cannot convert masked element to a Python int. - """ - - if mpl.__version__ > "1.4": - - def __call__(self, value, clip=None): - if isinstance(value, np.ma.core.MaskedConstant): - return value - return super(FixedBoundaryNorm, self).__call__(value, clip=clip) - - -@docstrings.dedent -def get_cmap(name, lut=None): - """ - Returns the specified colormap. - - Parameters - ---------- - name: str or :class:`matplotlib.colors.Colormap` - If a colormap, it returned unchanged. - %(cmap_note)s - lut: int - An integer giving the number of entries desired in the lookup table - - Returns - ------- - matplotlib.colors.Colormap - The colormap specified by `name` - - See Also - -------- - show_colormaps: A function to display all available colormaps - - Notes - ----- - Different from the :func::`matpltolib.pyplot.get_cmap` function, this - function changes the number of colors if `name` is a - :class:`matplotlib.colors.Colormap` instance to match the given `lut`.""" - if isstring(name) and name in rcParams["colors.cmaps"]: - colors = rcParams["colors.cmaps"][name] - lut = lut or len(colors) - return FixedColorMap.from_list(name=name, colors=colors, N=lut) - elif isstring(name) and name in _cmapnames: - colors = _cmapnames[name] - lut = lut or len(colors) - return FixedColorMap.from_list(name=name, colors=colors, N=lut) - else: - cmap = mpl_get_cmap(name) - # Note: we could include the `lut` in the call of mpl_get_cmap, but - # this raises a ValueError for colormaps like 'viridis' in mpl version - # 1.5. Besides the mpl_get_cmap function does not modify the lut if - # it does not match - if lut is not None and cmap.N != lut: - cmap = FixedColorMap.from_list( - name=cmap.name, colors=cmap(np.linspace(0, 1, lut)), N=lut - ) - return cmap - - -def _get_cmaps(names): - """Filter the given `names` for colormaps""" - import matplotlib.pyplot as plt - - try: - builtin_cmaps = mpl.colormaps - except AttributeError: # matplotlib <3.6 - builtin_cmaps = plt.cm.cmap_d - available_cmaps = list( - chain(builtin_cmaps, _cmapnames, rcParams["colors.cmaps"]) - ) - names = safe_list(names) - wrongs = [] - for arg in ( - arg - for arg in names - if (not isinstance(arg, Colormap) and arg not in available_cmaps) - ): - if isinstance(arg, str): - similarkeys = get_close_matches(arg, available_cmaps) - if similarkeys != []: - warn( - "Colormap %s not found in standard colormaps.\n" - "Similar colormaps are %s." % (arg, ", ".join(similarkeys)) - ) - else: - warn( - "Colormap %s not found in standard colormaps.\n" - "Run function without arguments to see all colormaps" % arg - ) - names.remove(arg) - wrongs.append(arg) - if not names and not wrongs: - names = sorted(m for m in available_cmaps if not m.endswith("_r")) - return names - - -@docstrings.get_sections(base="show_colormaps") -@docstrings.dedent -def show_colormaps(names=[], N=10, show=True, use_qt=None): - """Function to show standard colormaps from pyplot - - Parameters - ---------- - ``*args``: str or :class:`matplotlib.colors.Colormap` - If a colormap, it returned unchanged. - %(cmap_note)s - N: int, optional - Default: 11. The number of increments in the colormap. - show: bool, optional - Default: True. If True, show the created figure at the end with - pyplot.show(block=False) - use_qt: bool - If True, use the - :class:`psy_simple.widgets.color.ColormapDialog.show_colormaps`, if - False use a matplotlib implementation based on [1]_. If None, use - the Qt implementation if it is running in the psyplot GUI. - - Returns - ------- - psy_simple.widgets.color.ColormapDialog or matplitlib.figure.Figure - Depending on `use_qt`, either an instance of the - :class:`psy_simple.widgets.color.ColormapDialog` or the - :class:`matplotlib.figure.Figure` - - References - ---------- - .. [1] http://matplotlib.org/1.2.1/examples/pylab_examples/show_colormaps.html - """ - names = safe_list(names) - if use_qt or (use_qt is None and psyplot.with_gui): - from psyplot_gui.main import mainwindow - - from psy_simple.widgets.colors import ColormapDialog - - return ColormapDialog.show_colormap(names, N, show, parent=mainwindow) - import matplotlib.pyplot as plt - - # This example comes from the Cookbook on www.scipy.org. According to the - # history, Andrew Straw did the conversion from an old page, but it is - # unclear who the original author is. - a = np.vstack((np.linspace(0, 1, 256).reshape(1, -1))) - # Get a list of the colormaps in matplotlib. Ignore the ones that end with - # '_r' because these are simply reversed versions of ones that don't end - # with '_r' - cmaps = _get_cmaps(names) - nargs = len(cmaps) + 1 - fig = plt.figure(figsize=(5, 10)) - fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) - for i, m in enumerate(cmaps): - ax = plt.subplot(nargs, 1, i + 1) - plt.axis("off") - plt.pcolormesh(a, cmap=get_cmap(m, N + 1)) - pos = list(ax.get_position().bounds) - fig.text( - pos[0] - 0.01, pos[1], m, fontsize=10, horizontalalignment="right" - ) - if show: - plt.show(block=False) - return fig diff --git a/psy_simple/plotters.py b/psy_simple/plotters.py deleted file mode 100644 index 44d34c5c..00000000 --- a/psy_simple/plotters.py +++ /dev/null @@ -1,6600 +0,0 @@ -"""Plotters and formatoptions for the psy-simple plugin.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - -import re -import weakref -from abc import abstractmethod, abstractproperty -from functools import partial -from itertools import chain, cycle, islice, repeat, starmap -from warnings import warn - -import matplotlib as mpl -import numpy as np -import six -import xarray as xr -from matplotlib.dates import AutoDateFormatter, DateFormatter -from matplotlib.ticker import FixedFormatter, FixedLocator, FormatStrFormatter -from pandas import ( - DatetimeIndex, - MultiIndex, - date_range, - to_datetime, - to_timedelta, -) -from pandas.tseries import offsets -from psyplot.data import ( - CFDecoder, - InteractiveList, - _infer_interval_breaks, - isstring, -) -from psyplot.docstring import dedent, docstrings -from psyplot.plotter import ( - BEFOREPLOTTING, - END, - START, - DictFormatoption, - Formatoption, - Plotter, -) -from psyplot.utils import is_iterable -from psyplot.warning import PsyPlotRuntimeWarning - -from psy_simple.base import ( - BasePlotter, - Mask, - MaskBetween, - MaskGeq, - MaskGreater, - MaskLeq, - MaskLess, - TextBase, - label_props, - label_size, - label_weight, -) -from psy_simple.colors import get_cmap -from psy_simple.plugin import safe_list as slist -from psy_simple.plugin import validate_color, validate_float - - -def _get_index_vals(index): - if isinstance(index, MultiIndex) and len(index.names) == 1: - return index.get_level_values(0).values - else: - return index.values - - -mpl_version = float(".".join(mpl.__version__.split(".")[:2])) - - -def round_to_05(n, exp=None, mode="s"): - """ - Round to the next 0.5-value. - - This function applies the round function `func` to round `n` to the - next 0.5-value with respect to its exponent with base 10 (i.e. - 1.3e-4 will be rounded to 1.5e-4) if `exp` is None or with respect - to the given exponent in `exp`. - - Parameters - ---------- - n: numpy.ndarray - number to round - exp: int or numpy.ndarray - Exponent for rounding. If None, it will be computed from `n` to be the - exponents for base 10. - mode: {'s', 'l'} - rounding mode. If 's', it will be rounded to value whose absolute - value is below `n`, if 'l' it will rounded to the value whose absolute - value is above `n`. - - Returns - ------- - numpy.ndarray - rounded `n` - - Examples - -------- - The effects of the different parameters are show in the example below:: - - >>> from psyplot.plotter.simple import round_to_05 - >>> a = [-100.3, 40.6, 8.7, -0.00023] - >>>round_to_05(a, mode='s') - array([ -1.00000000e+02, 4.00000000e+01, 8.50000000e+00, - -2.00000000e-04]) - - >>> round_to_05(a, mode='l') - array([ -1.50000000e+02, 4.50000000e+01, 9.00000000e+00, - -2.50000000e-04]) - """ - n = np.asarray(n) - if exp is None: - exp = np.floor(np.log10(np.abs(n))) # exponent for base 10 - ntmp = np.abs(n) / 10.0**exp # mantissa for base 10 - if mode == "s": - n1 = ntmp - s = 1.0 - n2 = nret = np.floor(ntmp) - else: - n1 = nret = np.ceil(ntmp) - s = -1.0 - n2 = ntmp - return np.where( - n1 - n2 > 0.5, - np.sign(n) * (nret + s * 0.5) * 10.0**exp, - np.sign(n) * nret * 10.0**exp, - ) - - -def convert_radian(coord, *variables): - """Convert the given coordinate from radian to degree - - Parameters - ---------- - coord: xr.Variable - The variable to transform - ``*variables`` - The variables that are on the same unit. - - Returns - ------- - xr.Variable - The transformed variable if one of the given `variables` has units in - radian""" - warn( - "The psy_simple.plotters.convert_radian method has been deprecated." - "Please use the `plotter.convert_coordinate` instead.", - DeprecationWarning, - ) - if any(v.attrs.get("units", "").startswith("radian") for v in variables): - return coord * 180.0 / np.pi - return coord - - -class AlternativeXCoord(Formatoption): - """ - Use an alternative variable as x-coordinate - - This formatoption let's you specify another variable in the base dataset - of the data array in case you want to use this as the x-coordinate instead - of the raw data - - Possible types - -------------- - None - Use the default - str - The name of the variable to use in the base dataset - xarray.DataArray - An alternative variable with the same shape as the displayed array - - Examples - -------- - To see the difference, we create a simple test dataset:: - - >>> import xarray as xr - - >>> import numpy as np - - >>> import psyplot.project as psy - - >>> ds = xr.Dataset({ - ... 'temp': xr.Variable(('time', ), np.arange(5)), - ... 'std': xr.Variable(('time', ), np.arange(5, 10))}) - >>> ds - - Dimensions: (time: 5) - Coordinates: - * time (time) int64 0 1 2 3 4 - Data variables: - temp (time) int64 0 1 2 3 4 - std (time) int64 5 6 7 8 9 - - If we create a plot with it, we get the ``'time'`` dimension on the - x-axis:: - - >>> plotter = psy.plot.lineplot(ds, name=['temp']).plotters[0] - - >>> plotter.plot_data[0].dims - ('time',) - - If we however set the ``'coord'`` keyword, we get:: - - >>> plotter = psy.plot.lineplot( - ... ds, name=['temp'], coord='std').plotters[0] - - >>> plotter.plot_data[0].dims - ('std',) - - and ``'std'`` is plotted on the x-axis. - """ - - name = "Alternative X-Variable" - - group = "data" - - priority = START - - data_dependent = True - - #: Bool. If True, this Formatoption directly uses the raw_data, otherwise - #: use the normal data - use_raw_data = True - - @property - def data_iterator(self): - return self.iter_raw_data if self.use_raw_data else self.iter_data - - def update(self, value): - if value is not None: - for i, da in enumerate(self.data_iterator): - self.set_data(self.replace_coord(i), i) - - def diff(self, value): - try: - return not ( - (np.shape(value) == np.shape(self.value)) - and np.all(value == self.value) - ) - except TypeError: - return True - - def replace_coord(self, i): - """Replace the coordinate for the data array at the given position - - Parameters - ---------- - i: int - The number of the data array in the raw data (if the raw data is - not an interactive list, use 0) - - Returns - xarray.DataArray - The data array with the replaced coordinate""" - da = next(islice(self.data_iterator, i, i + 1)) - name, coord = self.get_alternative_coord(da, i) - other_coords = { - key: da.coords[key] for key in set(da.coords).difference(da.dims) - } - ret = ( - da.rename({da.dims[-1]: name}) - .assign_coords(**{name: coord}) - .assign_coords(**other_coords) - ) - return ret - - def get_alternative_coord(self, da, i): - if isinstance(self.value, xr.DataArray): - return self.value.name, self.value.variable - alternative_name = next(islice(cycle(slist(self.value)), i, i + 1)) - coord_da = InteractiveList.from_dataset( - da.psy.base, name=alternative_name, dims=da.psy.idims - )[0] - coord = xr.Variable((coord_da.name,), coord_da, coord_da.attrs) - return coord_da.name, coord - - -class AlternativeXCoordPost(AlternativeXCoord): - # The same as the :class:`AlternativeXCoord, but it uses the - # :attr:`psyplot.plotter.Formatoption.data` attribute as a src, not the - # :attr:`psyplot.plotter.Formatoption.raw_data` - - __doc__ = AlternativeXCoord.__doc__ - - use_raw_data = False - - -class Grid(Formatoption): - """ - Display the grid - - Show the grid on the plot with the specified color. - - - Possible types - -------------- - None - If the grid is currently shown, it will not be displayed any longer. If - the grid is not shown, it will be drawn - bool - If True, the grid is displayed with the automatic settings (usually - black) - string, tuple. - Defines the color of the grid. - - Notes - ----- - %(colors)s""" - - group = "axes" - - name = "Grid lines" - - def update(self, value): - if self.plotter._initialized and mpl_version == 3.3: - warn("Updating grids is known to malfunction for matplotlib 3.3!") - try: - value = validate_color(value) - self.ax.grid(color=value) - except (ValueError, TypeError, AttributeError): - self.ax.grid(value) - - -class AxisColor(DictFormatoption): - """ - Color the x- and y-axes - - This formatoption colors the left, right, bottom and top axis bar. - - Possible types - -------------- - dict - Keys may be one of {'right', 'left', 'bottom', 'top'}, the values can - be any valid color or None. - - Notes - ----- - %(colors)s""" - - group = "axes" - - name = "Color of x- and y-axes" - - @property - def value2pickle(self): - """Return the current axis colors""" - return {key: s.get_edgecolor() for key, s in self.ax.spines.items()} - - def initialize_plot(self, value): - positions = ["right", "left", "bottom", "top"] - #: :class:`dict` storing the default linewidths - self.default_lw = dict( - zip( - positions, - map( - lambda pos: self.ax.spines[pos].get_linewidth(), positions - ), - ) - ) - self.update(value) - - def update(self, value): - for pos, color in six.iteritems(value): - spine = self.ax.spines[pos] - spine.set_color(color) - if color is not None and spine.get_linewidth() == 0.0: - spine.set_linewidth(1.0) - elif color is None: - spine.set_color(mpl.rcParams["axes.edgecolor"]) - spine.set_linewidth(self.default_lw[pos]) - - -class TicksManagerBase(Formatoption): - """ - Abstract base class for formatoptions handling ticks""" - - @abstractmethod - def update_axis(self, val): - pass - - -@docstrings.get_sections(base="TicksManager") -class TicksManager(TicksManagerBase, DictFormatoption): - """ - Abstract base class for ticks formatoptions controlling major and minor - ticks - - This formatoption simply serves as a base that allows the simultaneous - managment of major and minor ticks - - Possible types - -------------- - dict - A dictionary with the keys ``'minor'`` and (or) ``'major'`` to specify - which ticks are managed. If the given value is not a dictionary with - those keys, it is put into a dictionary with the key determined by the - rcParams ``'ticks.which'`` key (usually ``'major'``). - The values in the dictionary can be one types below.""" - - group = "ticks" - - def update(self, value): - for which, val in six.iteritems(value): - self.which = which - self.update_axis(val) - - -@docstrings.get_sections(base="DataTicksCalculator") -class DataTicksCalculator(Formatoption): - """ - Abstract base formatoption to calculate ticks and bounds from the data - - Possible types - -------------- - numeric array - specifies the ticks manually - str or list [str, ...] - A list of the below mentioned values of the mapping like - ``[method, N, percmin, percmax, vmin, vmax]``, where only the first - one is absolutely necessary - dict - Automatically determine the ticks corresponding to the data. The - mapping can have the following keys, but only `method` is not optional. - - N - An integer describing the number of boundaries (or ticks per - power of ten, see `log` and `symlog` above) - percmin - The percentile to use for the minimum (by default, 0, i.e. the - minimum of the array) - percmax - The percentile to use for the maximum (by default, 100, i.e. the - maximum of the array) - vmin - The minimum to use (in which case it is not calculated from the - specified `method`) - vmax - The maximum to use (in which case it is not calculated from the - specified `method`) - method - A string that defines how minimum and maximum shall be set. This - argument is **not optional** and can be one of the following: - - data - plot the ticks exactly where the data is. - mid - plot the ticks in the middle of the data. - rounded - Sets the minimum and maximum of the ticks to the rounded data - minimum or maximum. Ticks are rounded to the next 0.5 value - with to the difference between data max- and minimum. The - minimal tick will always be lower or equal than the data - minimum, the maximal tick will always be higher or equal than - the data maximum. - roundedsym - Same as `rounded` above but the ticks are chose such that they - are symmetric around zero - minmax - Uses the minimum as minimal tick and maximum as maximal tick - sym - Same as minmax but symmetric around zero - log - Use logarithmic bounds. In this case, the given number `N` - determines the number of bounds per power of tenth (i.e. - ``N == 2`` results in something like ``1.0, 5.0, 10.0, 50.0``, - etc., If this second number is None, then it will be chosen - such that we have around 11 boundaries but at least one per - power of ten. - symlog - The same as ``log`` but symmetric around 0. If the number `N` - is None, then we have around 12 boundaries but at least one - per power of ten""" - - data_dependent = True - - @property - def full_array(self): - """The full array of this and the shared data""" - return np.concatenate( - [self.array] + [fmto.array for fmto in self.shared] - ) - - @property - def array(self): - """The numpy array of the data""" - data = self.data - if not hasattr(data, "notnull"): - data = data.to_series() - mask = np.asarray(data.notnull()) - return data.values[mask] - - def _data_ticks(self, step=None, *args, **kwargs): - step = step or 1 - """Array of ticks that match exactly the data""" - return np.unique(self.array)[::step] - - def _mid_data_ticks(self, step=None, *args, **kwargs): - step = step or 1 - """Array of ticks in the middle between the data points""" - arr = np.unique(self.array) - return ((arr[:-1] + arr[1:]) / 2.0)[::step] - - def _collect_array(self, percmin=None, percmax=None): - """Collect the data from the shared formatoptions (if necessary).""" - - def nanmin(arr): - try: - return np.nanmin(arr) - except TypeError: - return arr.min() - - def nanmax(arr): - try: - return np.nanmax(arr) - except TypeError: - return arr.max() - - def minmax(arr): - return [nanmin(arr), nanmax(arr)] - - def shared_arrays(): - for fmto in self.shared: - fmto._lock_children() - # do not lock the fmto itself, because this breaks the plotter - # update procedure. But make sure, that the dependencies are - # locked - arr = fmto.array - yield arr - # release the locks - fmto._release_children() - - if not self.shared: - arr = self.array - else: - # np.concatenate all arrays if any of the percentiles are required - if percmin is not None or percmax is not None: - arr = np.concatenate( - tuple(chain([self.array], shared_arrays())) - ) - # np.concatenate only min and max-values instead of the full arrays - else: - arr = np.concatenate( - tuple(map(minmax, chain([self.array], shared_arrays()))) - ) - return arr - - def _calc_vmin_vmax( - self, percmin=None, percmax=None, vmin=None, vmax=None - ): - def nanmin(arr): - try: - return np.nanmin(arr) - except TypeError: - return arr.min() - - def nanmax(arr): - try: - return np.nanmax(arr) - except TypeError: - return arr.max() - - if vmin is not None and vmax is not None: - return vmin, vmax - - percentiles = [] - arr = self._collect_array(percmin, percmax) - try: - if vmin is not None: - pass - elif not percmin: - vmin = nanmin(arr) - else: - percentiles.append(percmin) - if vmax is not None: - pass - elif percmax is None or percmax == 100: - vmax = nanmax(arr) - else: - percentiles.append(percmax) - except ValueError: - self.logger.warn( - "Cannot calculate minimum and maximum of the data!", - exc_info=True, - ) - return 0, 1 - if percentiles: - percentiles = iter(np.percentile(arr, percentiles)) - if percmin: - vmin = next(percentiles) - if percmax and percmax < 100: - vmax = next(percentiles) - return vmin, vmax - - @staticmethod - def _round_min_max(vmin, vmax): - if vmin == vmax: - return vmin, vmax - exp = np.floor(np.log10(abs(vmax - vmin))) - larger = round_to_05([vmin, vmax], exp, mode="l") - smaller = round_to_05([vmin, vmax], exp, mode="s") - return min([larger[0], smaller[0]]), max([larger[1], smaller[1]]) - - def _rounded_ticks(self, N=None, *args, **kwargs): - N = N or 11 - vmin, vmax = self._round_min_max( - *self._calc_vmin_vmax(*args, **kwargs) - ) - return np.linspace(vmin, vmax, N, endpoint=True) - - def _log_bounds(self, expmin, expmax, N): - bounds = [] - for i in range(int(expmax - expmin)): - new_vals = np.linspace( - 1 * 10 ** (expmin + i), 9 * 10 ** (expmin + i), N + 1 - )[:-1] - bounds.extend(new_vals) - return bounds - - def _log_ticks(self, symmetric=False, N=None, *args, **kwargs): - vmin, vmax = self._calc_vmin_vmax(*args, **kwargs) - larger = round_to_05([vmin, vmax], mode="l") - smaller = round_to_05([vmin, vmax], mode="s") - vmin, vmax = min([larger[0], smaller[0]]), max([larger[1], smaller[1]]) - - if symmetric and np.sign(vmin) == np.sign(vmax): - if vmin < 0: # make vmax positive - vmax = -vmax - else: # make vmin negative - vmin = -vmin - elif symmetric: - vmax = np.max([-vmin, vmax]) - vmin = -vmax - - if vmin == vmax: - return vmin, vmax - - signs = np.sign([vmin, vmax]) - crossing0 = vmin != 0 and vmax != 0 and signs[0] != signs[1] - if not crossing0: - vmin, vmax = np.sort(np.abs([vmin, vmax])) - vmin0 = vmax - vmax0 = vmin - - expmin, expmax = np.floor(np.log10(np.abs([vmin, vmax]))) - - dexp = int(expmax - expmin) - expmax0 = np.inf - else: # vmin < 0, vmax > 0 - arr = self._collect_array() - less0 = arr < 0 - greater0 = arr > 0 - if not less0.size: - vmin0 = round_to_05(arr[arr > 0].min(), mode="s") - vmax0 = -vmin0 - elif not greater0.size: - vmax0 = round_to_05(arr[arr < 0].max(), mode="l") - vmin0 = -vmax0 - else: - vmin0 = round_to_05(arr[arr > 0].min(), mode="s") - vmax0 = round_to_05(arr[arr < 0].max(), mode="l") - if symmetric: - vmin0 = min(-vmax0, vmin0) - vmax0 = -vmin0 - - expmin, expmax0 = np.floor(np.log10(np.abs([vmax0, vmin]))) - expmin0, expmax = np.floor(np.log10(np.abs([vmin0, vmax]))) - - dexp_neg = int(expmax0 - expmin) - dexp_pos = int(expmax - expmin0) - - dexp = int(dexp_neg + dexp_pos) - - if dexp == 0 or (dexp == 1 and vmax == 1 * 10**expmax): - # effectively only one factor of 10 (e.g. vmin = 1, vmax = 10) - N = N or (11 if not symmetric else 12) - return np.linspace(vmin, vmax, N, endpoint=True) - else: - if N is None: - # we go close to 11 bounds in total - N = int(max(np.floor((11 if not symmetric else 12) / dexp), 1)) - if not crossing0: - bounds = self._log_bounds(expmin, expmax, N) - bounds += [1 * 10**expmax] - if signs[0] == -1 and signs[1] == -1: - bounds = -np.array(bounds) - else: - bounds_neg = -np.array(self._log_bounds(expmin, expmax0, N)) - bounds_pos = self._log_bounds(expmin0, expmax, N) - bounds = np.unique( - np.r_[ - bounds_neg, - bounds_pos, - -1 * 10**expmin, - -1 * 10**expmax0, - 1 * 10**expmin0, - 1 * 10**expmax, - ] - ) - bounds = bounds[(bounds <= vmax0) | (bounds >= vmin0)] - - return np.unique(bounds) - - def _roundedsym_ticks(self, N=None, *args, **kwargs): - N = N or 10 - vmax = max( - map( - abs, - self._round_min_max(*self._calc_vmin_vmax(*args, **kwargs)), - ) - ) - vmin = -vmax - return np.linspace(vmin, vmax, N, endpoint=True) - - def _data_minmax_ticks(self, N=None, *args, **kwargs): - N = N or 11 - vmin, vmax = self._calc_vmin_vmax(*args, **kwargs) - return np.linspace(vmin, vmax, N, endpoint=True) - - def _data_symminmax_ticks(self, N=None, *args, **kwargs): - N = N or 10 - vmax = max(map(abs, self._calc_vmin_vmax(*args, **kwargs))) - vmin = -vmax - return np.linspace(vmin, vmax, N, endpoint=True) - - def __init__(self, *args, **kwargs): - super(DataTicksCalculator, self).__init__(*args, **kwargs) - self.calc_funcs = { - "data": self._data_ticks, - "mid": self._mid_data_ticks, - "rounded": self._rounded_ticks, - "roundedsym": self._roundedsym_ticks, - "minmax": self._data_minmax_ticks, - "sym": self._data_symminmax_ticks, - "log": partial(self._log_ticks, False), - "symlog": partial(self._log_ticks, True), - } - - -@docstrings.get_sections(base="TicksBase") -class TicksBase(TicksManagerBase, DataTicksCalculator): - """ - Abstract base class for calculating ticks - - Possible types - -------------- - None - use the default ticks - int - for an integer *i*, only every *i-th* tick of the default ticks are - used""" - - dependencies = ["transpose", "plot"] - - group = "ticks" - - @abstractproperty - def axis(self): - pass - - def __init__(self, *args, **kwargs): - super(TicksBase, self).__init__(*args, **kwargs) - self.default_locators = {} - - def initialize_plot(self, value): - self.set_default_locators() - self.update(value) - - def update_axis(self, value): - which = self.which - if value is None: - self.set_locator(self.default_locators[which]) - elif isinstance(value, int): - return self._reduce_ticks(value) - elif len(value) and isinstance(value[0], six.string_types): - return self.set_ticks(self.calc_funcs[value[0]](*value[1:])) - elif isinstance(value, tuple): - steps = 11 if len(value) == 2 else value[3] - self.set_ticks( - np.linspace(value[0], value[1], steps, endpoint=True) - ) - else: - self.set_ticks(value) - - def set_ticks(self, value): - self.axis.set_ticks(value, minor=self.which == "minor") - - def get_locator(self): - return getattr(self.axis, "get_%s_locator" % self.which)() - - def set_locator(self, locator): - """Sets the locator corresponding of the axis - - Parameters - ---------- - locator: matplotlib.ticker.Locator - The locator to set - which: {None, 'minor', 'major'} - Specify which locator shall be set. If None, it will be taken from - the :attr:`which` attribute""" - getattr(self.axis, "set_%s_locator" % self.which)(locator) - - def set_default_locators(self, which=None): - """Sets the default locator that is used for updating to None or int - - Parameters - ---------- - which: {None, 'minor', 'major'} - Specify which locator shall be set""" - if which is None or which == "minor": - self.default_locators["minor"] = self.axis.get_minor_locator() - if which is None or which == "major": - self.default_locators["major"] = self.axis.get_major_locator() - - def _reduce_ticks(self, i): - loc = self.default_locators[self.which] - self.set_locator(FixedLocator(loc()[::i])) - - -@docstrings.get_sections(base="DtTicksBase") -class DtTicksBase(TicksBase, TicksManager): - """ - Abstract base class for x- and y-tick formatoptions - - Possible types - -------------- - %(TicksManager.possible_types)s - %(TicksBase.possible_types)s - %(DataTicksCalculator.possible_types)s - hour - draw ticks every hour - day - draw ticks every day - week - draw ticks every week - month, monthend, monthbegin - draw ticks in the middle, at the end or at the beginning of each - month - year, yearend, yearbegin - draw ticks in the middle, at the end or at the beginning of each - year - - For data, mid, hour, day, week, month, etc., the optional second value - can be an integer i determining that every i-th data point shall be - used (by default, it is set to 1). For rounded, roundedsym, minmax and - sym, the second value determines the total number of ticks (defaults to - 11).""" - - def __init__(self, *args, **kwargs): - super(DtTicksBase, self).__init__(*args, **kwargs) - self.calc_funcs.update( - { - "hour": self._frequent_ticks("H"), - "day": self._frequent_ticks("D"), - "week": self._frequent_ticks(offsets.Week()), - "month": self._mid_dt_ticks("M"), - "monthend": self._frequent_ticks( - offsets.MonthEnd(), onset=offsets.MonthBegin() - ), - "monthbegin": self._frequent_ticks( - offsets.MonthBegin(), - onset=offsets.MonthBegin(), - offset=offsets.MonthBegin(), - ), - "year": self._mid_dt_ticks(offsets.YearBegin()), - "yearend": self._frequent_ticks( - offsets.YearEnd(), onset=offsets.YearBegin() - ), - "yearbegin": self._frequent_ticks( - offsets.YearBegin(), - onset=offsets.YearBegin(), - offset=offsets.YearBegin(), - ), - } - ) - - def update(self, value): - value = value or {"minor": None, "major": None} - super(DtTicksBase, self).update(value) - - @property - def dtdata(self): - """The np.unique :attr:`data` as datetime objects""" - data = self.data - # do nothing if the data is a pandas.Index without time informations - # or not a pandas.Index - if not isinstance(data, DatetimeIndex): - warn( - "[%s] - Could not convert time informations for %s ticks " - "with object %r." % (self.logger.name, self.key, type(data)) - ) - return None - else: - return data - - def _frequent_ticks(self, freq, onset=None, offset=None): - def func(N=None, *args, **kwargs): - step = N or 1 - data = self.dtdata - if data is None: - return - mindata = data.min() if onset is None else data.min() - onset - maxdata = data.max() if offset is None else data.max() + offset - return date_range(mindata, maxdata, freq=freq)[ - ::step - ].to_pydatetime() - - return func - - def _mid_dt_ticks(self, freq): - def func(N=None, *args, **kwargs): - step = N or 1 - data = self.dtdata - if data is None: - return - data = date_range( - data.min(), data.max(), freq=freq - ).to_pydatetime() - data[:-1] += (data[1:] - data[:-1]) / 2 - return data[:-1:step] - - return func - - -class XTicks(DtTicksBase): - """ - Modify the x-axis ticks - - Possible types - -------------- - %(DtTicksBase.possible_types)s - - Examples - -------- - Plot 11 ticks over the whole data range:: - - >>> plotter.update(xticks='rounded') - - Plot 7 ticks over the whole data range where the maximal and minimal - tick matches the data maximum and minimum:: - - >>> plotter.update(xticks=['minmax', 7]) - - Plot ticks every year and minor ticks every month:: - - >>> plotter.update(xticks={'major': 'year', 'minor': 'month'}) - - See Also - -------- - xticklabels, ticksize, tickweight, xtickprops, yticks - """ - - children = TicksBase.children + ["yticks"] - - dependencies = DtTicksBase.dependencies + ["plot"] - - name = "Location of the x-Axis ticks" - - @property - def axis(self): - return self.ax.xaxis - - @property - def data(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - data = getattr(self.plot, "plotted_data", super(XTicks, self).data) - if not len(data): - data = super(XTicks, self).data - if isinstance(data, InteractiveList): - df = InteractiveList(map(select_array, data)).to_dataframe() - else: - df = data.to_series() - if self.transpose.value: - return df - else: - if isinstance(df.index, MultiIndex) and len(df.index.names) == 1: - return df.index.get_level_values(0) - else: - return df.index - - def initialize_plot(self, *args, **kwargs): - super(XTicks, self).initialize_plot(*args, **kwargs) - self.transpose.swap_funcs["ticks"] = self._swap_ticks - - def _swap_ticks(self): - xticks = self - yticks = self.yticks - old_xlocators = xticks.default_locators - xticks.default_locators = yticks.default_locators - yticks.default_locators = old_xlocators - old_xval = self.value - with self.plotter.no_validation: - self.plotter[self.key] = self.yticks.value - self.plotter[self.yticks.key] = old_xval - - -class YTicks(DtTicksBase): - """ - Modify the y-axis ticks - - Possible types - -------------- - %(DtTicksBase.possible_types)s - - See Also - -------- - yticklabels, ticksize, tickweight, ytickprops - xticks: for possible examples""" - - dependencies = DtTicksBase.dependencies + ["plot"] - - name = "Location of the y-Axis ticks" - - @property - def axis(self): - return self.ax.yaxis - - @property - def data(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - data = getattr(self.plot, "plotted_data", super(XTicks, self).data) - if not len(data): - data = super(XTicks, self).data - if isinstance(data, InteractiveList): - df = InteractiveList(map(select_array, data)).to_dataframe() - else: - df = data.to_series() - if self.transpose.value: - if isinstance(df.index, MultiIndex) and len(df.index.names) == 1: - return df.index.get_level_values(0) - else: - return df.index - else: - return df - - -@docstrings.get_sections(base="TickLabelsBase") -class TickLabelsBase(TicksManagerBase): - """ - Abstract base class for ticklabels - - Possible types - -------------- - str - A formatstring like ``'%%Y'`` for plotting the year (in the case that - time is shown on the axis) or '%%i' for integers - array - An array of strings to use for the ticklabels""" - - dependencies = ["transpose"] - - group = "ticks" - - @abstractproperty - def axis(self): - """The axis on the axes to modify the ticks of""" - pass - - def __init__(self, *args, **kwargs): - super(TickLabelsBase, self).__init__(*args, **kwargs) - self.default_formatters = {} - - def initialize_plot(self, value): - self.set_default_formatters() - self.update(value) - - def update_axis(self, value): - if value is None: - self.set_formatter(self.default_formatters["major"]) - elif isinstance(value, six.string_types): - self.set_stringformatter(value) - else: - ticks = self.axis.get_ticklocs(minor=self.which == "minor") - if len(ticks) != len(value): - warn( - "[%s] - Length of ticks (%i) and ticklabels (%i)" - "do not match!" % (self.key, len(ticks), len(value)) - ) - self.set_ticklabels(value) - - def set_stringformatter(self, s): - default_formatter = self.default_formatters["major"] - if isinstance(default_formatter, AutoDateFormatter): - self.set_formatter(DateFormatter(s)) - else: - self.set_formatter(FormatStrFormatter(s)) - - def set_ticklabels(self, labels): - """Sets the given tick labels""" - self.set_formatter(FixedFormatter(labels)) - - @abstractmethod - def set_formatter(self, formatter): - """Sets a given formatter""" - pass - - @abstractmethod - def set_default_formatters(self): - """Sets the default formatters that is used for updating to None""" - pass - - -class TickLabels(TickLabelsBase, TicksManager): - def update(self, value): - if ( - getattr(self, self.key.replace("label", "")).value.get("minor") - is not None - and "minor" not in self.value - ): - items = chain(six.iteritems(value), [("minor", None)]) - else: - items = six.iteritems(value) - super(TickLabels, self).update(dict(items)) - - def set_default_formatters(self, which=None): - """Sets the default formatters that is used for updating to None - - Parameters - ---------- - which: {None, 'minor', 'major'} - Specify which locator shall be set""" - if which is None or which == "minor": - self.default_formatters["minor"] = self.axis.get_minor_formatter() - if which is None or which == "major": - self.default_formatters["major"] = self.axis.get_major_formatter() - - def set_formatter(self, formatter, which=None): - which = which or self.which - getattr(self.axis, "set_%s_formatter" % which)(formatter) - - -class XTickLabels(TickLabels): - """ - Modify the x-axis ticklabels - - Possible types - -------------- - %(TicksManager.possible_types)s - %(TickLabelsBase.possible_types)s - - See Also - -------- - xticks, ticksize, tickweight, xtickprops, yticklabels""" - - dependencies = TickLabelsBase.dependencies + ["xticks", "yticklabels"] - - name = "x-xxis Ticklabels" - - @property - def axis(self): - return self.ax.xaxis - - def initialize_plot(self, *args, **kwargs): - super(XTickLabels, self).initialize_plot(*args, **kwargs) - self.transpose.swap_funcs["ticklabels"] = self._swap_ticklabels - - def _swap_ticklabels(self): - xticklabels = self - yticklabels = self.yticklabels - old_xformatters = xticklabels.default_formatters - xticklabels.default_formatters = yticklabels.default_formatters - yticklabels.default_formatters = old_xformatters - old_xval = self.value - with self.plotter.no_validation: - self.plotter[self.key] = self.yticklabels.value - self.plotter[self.yticklabels.key] = old_xval - - -class YTickLabels(TickLabels): - """ - Modify the y-axis ticklabels - - Possible types - -------------- - %(TicksManager.possible_types)s - %(TickLabelsBase.possible_types)s - - See Also - -------- - yticks, ticksize, tickweight, ytickprops, xticklabels""" - - dependencies = TickLabelsBase.dependencies + ["yticks"] - - name = "y-xxis ticklabels" - - @property - def axis(self): - return self.ax.yaxis - - -class BarXTicks(XTicks): - __doc__ = XTicks.__doc__ - - connections = XTicks.connections + ["xlim"] - - dependencies = XTicks.dependencies + ["categorical"] - - def update(self, value): - import matplotlib.ticker as mtick - - if self.categorical.is_categorical and not self.transpose.value: - self.default_locators["major"] = mtick.FixedLocator( - np.unique(self.array) - ) - self.default_locators["minor"] = mtick.NullLocator() - else: - self.default_locators = self._orig_default_locators.copy() - return super(BarXTicks, self).update(value) - - def set_default_locators(self): - super(BarXTicks, self).set_default_locators() - self._orig_default_locators = self.default_locators.copy() - - @property - def array(self): - if self.transpose.value and "stacked" in slist(self.plot.value): - df = self.data.to_dataframe() - return np.concatenate( - [[min([0, df.values.min()])], df.sum(axis=1).values] - ) - elif self.transpose.value: - return np.concatenate( - [self.plot.get_xys(arr)[1] for arr in self.plot.iter_data] - ) - else: - return np.concatenate( - [self.plot.get_xys(arr)[0] for arr in self.plot.iter_data] - ) - - -class BarYTicks(YTicks): - __doc__ = YTicks.__doc__ - - connections = YTicks.connections + ["ylim"] - - dependencies = YTicks.dependencies + ["categorical"] - - def update(self, value): - import matplotlib.ticker as mtick - - if self.categorical.is_categorical and self.transpose.value: - self.default_locators["major"] = mtick.FixedLocator( - np.unique(self.array) - ) - self.default_locators["minor"] = mtick.NullLocator() - else: - self.default_locators = self._orig_default_locators.copy() - return super(BarYTicks, self).update(value) - - def set_default_locators(self): - super(BarYTicks, self).set_default_locators() - self._orig_default_locators = self.default_locators.copy() - - @property - def array(self): - if not self.transpose.value and "stacked" in slist(self.plot.value): - df = self.data.to_dataframe() - return np.concatenate( - [[min([0, df.values.min()])], df.sum(axis=1).values] - ) - elif self.transpose.value: - return np.concatenate( - [self.plot.get_xys(arr)[0] for arr in self.plot.iter_data] - ) - else: - return np.concatenate( - [self.plot.get_xys(arr)[1] for arr in self.plot.iter_data] - ) - - -class BarXTickLabels(XTickLabels): - __doc__ = XTickLabels.__doc__ - - dependencies = XTickLabels.dependencies + ["plot", "categorical"] - - def set_stringformatter(self, s): - if not self.transpose.value and self.plot.value is not None: - index = self.data.to_dataframe().index - if isinstance(index, DatetimeIndex): - if self.categorical.is_categorical: - xticks = self.ax.get_xticks(minor=self.which == "minor") - arr = list( - map( - lambda t: t.toordinal(), - to_datetime(index[xticks.astype(int)]), - ) - ) - self.ax.set_xticklabels(list(map(DateFormatter(s), arr))) - else: - self.set_formatter(DateFormatter(s)) - return - super(BarXTickLabels, self).set_stringformatter(s) - - -class BarYTickLabels(YTickLabels): - __doc__ = YTickLabels.__doc__ - - dependencies = YTickLabels.dependencies + ["plot", "categorical"] - - def set_stringformatter(self, s): - if self.transpose.value and self.plot.value is not None: - index = self.data.to_dataframe().index - if isinstance(index, DatetimeIndex): - if self.categorical.is_categorical: - yticks = self.ax.get_yticks(self.which == "minor") - arr = list( - map( - lambda t: t.toordinal(), - to_datetime(index[yticks.astype(int)]), - ) - ) - self.ax.set_yticklabels(list(map(DateFormatter(s), arr))) - else: - self.set_formatter(DateFormatter(s)) - return - super(BarYTickLabels, self).set_stringformatter(s) - - -class TicksOptions(TicksManagerBase): - """Base class for ticklabels options that apply for x- and y-axis""" - - def update(self, value): - for which, val in six.iteritems(value): - for axis, axisname in zip([self.ax.xaxis, self.ax.yaxis], "xy"): - self.which = which - self.axis = axis - self.axisname = axisname - self.update_axis(val) - - -class TickSizeBase(TicksOptions): - """Abstract base class for modifying tick sizes""" - - def update_axis(self, value): - for t in self.axis.get_ticklabels(which=self.which): - t.set_size(value) - - -class TickSize(TickSizeBase, TicksOptions, DictFormatoption): - """ - Change the ticksize of the ticklabels - - Possible types - -------------- - %(TicksManager.possible_types)s - %(fontsizes)s - - See Also - -------- - tickweight, xtickprops, ytickprops""" - - dependencies = TicksOptions.dependencies + ["xtickprops", "ytickprops"] - - name = "Font size of the ticklabels" - - -class TickWeightBase(TicksOptions): - """Abstract base class for modifying font weight of ticks""" - - def update_axis(self, value): - for t in self.axis.get_ticklabels(which=self.which): - t.set_weight(value) - - -class TickWeight(TickWeightBase, TicksOptions, DictFormatoption): - """ - Change the fontweight of the ticks - - Possible types - -------------- - %(TicksManager.possible_types)s - %(fontweights)s - - See Also - -------- - ticksize, xtickprops, ytickprops""" - - dependencies = TicksOptions.dependencies + ["xtickprops", "ytickprops"] - - name = "Font weight of the ticklabels" - - -@docstrings.get_sections(base="TickPropsBase") -class TickPropsBase(TicksManagerBase): - """ - Abstract base class for tick parameters - - Possible types - -------------- - dict - Items may be anything of the :func:`matplotlib.pyplot.tick_params` - function""" - - @abstractproperty - def axisname(self): - """The name of the axis (either 'x' or 'y')""" - pass - - def update_axis(self, value): - value = value.copy() - if float(".".join(mpl.__version__.split(".")[:2])) >= 1.5: - value.pop("visible", None) - self.ax.tick_params( - self.axisname, which=self.which, reset=True, **value - ) - - -@docstrings.get_sections(base="XTickProps") -class XTickProps(TickPropsBase, TicksManager, DictFormatoption): - """ - Specify the x-axis tick parameters - - This formatoption can be used to make a detailed change of the ticks - parameters on the x-axis. - - Possible types - -------------- - %(TicksManager.possible_types)s - %(TickPropsBase.possible_types)s - - See Also - -------- - xticks, yticks, ticksize, tickweight, ytickprops""" - - axisname = "x" - - name = "Font properties of the x-ticklabels" - - @property - def axis(self): - return self.ax.xaxis - - -class YTickProps(XTickProps): - """ - Specify the y-axis tick parameters - - This formatoption can be used to make a detailed change of the ticks - parameters of the y-axis. - - Possible types - -------------- - %(XTickProps.possible_types)s - - See Also - -------- - xticks, yticks, ticksize, tickweight, xtickprops""" - - axisname = "y" - - name = "Font properties of the y-ticklabels" - - @property - def axis(self): - return self.ax.xaxis - - -@docstrings.get_sections(base="Xlabel") -class Xlabel(TextBase, Formatoption): - """ - Set the x-axis label - - Set the label for the x-axis. - %(replace_note)s - - Possible types - -------------- - str - The text for the :func:`~matplotlib.pyplot.xlabel` function. - - See Also - -------- - xlabelsize, xlabelweight, xlabelprops""" - - children = ["transpose", "ylabel"] - - name = "x-axis label" - - @property - def enhanced_attrs(self): - arr = self.transpose.get_x(self.data) - replot = self.plotter.replot or not hasattr(self, "_enhanced_attrs") - attrs = self.get_enhanced_attrs(arr, replot=replot) - arr_attrs = self.get_enhanced_attrs(self.data, replot=replot) - for attr, val in arr_attrs.items(): - attrs.setdefault(attr, val) - self._enhanced_attrs = attrs - return attrs - - def initialize_plot(self, value): - self.transpose.swap_funcs["labels"] = self._swap_labels - self._texts = [ - self.ax.set_xlabel( - self.replace(value, self.data, self.enhanced_attrs) - ) - ] - - def update(self, value): - self._texts[0].set_text( - self.replace(value, self.data, self.enhanced_attrs) - ) - - def _swap_labels(self): - plotter = self.plotter - self.transpose._swap_labels() - old_xlabel = self.value - with plotter.no_validation: - plotter[self.key] = self.ylabel.value - plotter[self.ylabel.key] = old_xlabel - - -class BarXlabel(Xlabel): - """ - Set the x-axis label - - Set the label for the x-axis. - %(replace_note)s - - Possible types - -------------- - %(Xlabel.possible_types)s - - See Also - -------- - xlabelsize, xlabelweight, xlabelprops""" - - #: Xlabel is modified by the pandas plot routine, therefore we update it - #: after each plot - update_after_plot = True - - -@docstrings.get_sections(base="Ylabel") -class Ylabel(TextBase, Formatoption): - """ - Set the y-axis label - - Set the label for the y-axis. - %(replace_note)s - - Possible types - -------------- - str - The text for the :func:`~matplotlib.pyplot.ylabel` function. - - See Also - -------- - ylabelsize, ylabelweight, ylabelprops""" - - children = ["transpose"] - - name = "y-axis label" - - @property - def enhanced_attrs(self): - arr = self.transpose.get_y(self.data) - replot = self.plotter.replot or not hasattr(self, "_enhanced_attrs") - attrs = self.get_enhanced_attrs(arr, replot=replot) - arr_attrs = self.get_enhanced_attrs(self.data, replot=replot) - for attr, val in arr_attrs.items(): - attrs.setdefault(attr, val) - self._enhanced_attrs = attrs - return attrs - - def initialize_plot(self, value): - self._texts = [ - self.ax.set_ylabel( - self.replace(value, self.data, self.enhanced_attrs) - ) - ] - - def update(self, value): - self._texts[0].set_text( - self.replace(value, self.data, self.enhanced_attrs) - ) - - -class BarYlabel(Ylabel): - """ - Set the y-axis label - - Set the label for the y-axis. - %(replace_note)s - - Possible types - -------------- - %(Ylabel.possible_types)s - - See Also - -------- - ylabelsize, ylabelweight, ylabelprops""" - - #: Ylabel is modified by the pandas plot routine, therefore we update it - #: after each plot - update_after_plot = True - - -@docstrings.get_sections(base="LabelOptions") -class LabelOptions(DictFormatoption): - """ - Base formatoption class for label sizes - - Possible types - -------------- - dict - A dictionary with the keys ``'x'`` and (or) ``'y'`` to specify - which ticks are managed. If the given value is not a dictionary with - those keys, it is used for the x- and y-axis. - The values in the dictionary can be one types below. - """ - - children = ["xlabel", "ylabel"] - - def update(self, value): - for axis, val in value.items(): - self._text = getattr(self, axis + "label")._texts[0] - self.axis_str = axis - self.update_axis(val) - - @abstractmethod - def update_axis(self, value): - pass - - -class LabelSize(LabelOptions): - """ - Set the size of both, x- and y-label - - Possible types - -------------- - %(LabelOptions.possible_types)s - %(fontsizes)s - - See Also - -------- - xlabel, ylabel, labelweight, labelprops""" - - group = "labels" - - parents = ["labelprops"] - - name = "font size of x- and y-axis label" - - def update_axis(self, value): - self._text.set_size(value) - - -class LabelWeight(LabelOptions): - """ - Set the font size of both, x- and y-label - - Possible types - -------------- - %(LabelOptions.possible_types)s - %(fontweights)s - - See Also - -------- - xlabel, ylabel, labelsize, labelprops""" - - group = "labels" - - parents = ["labelprops"] - - name = "font weight of x- and y-axis label" - - def update_axis(self, value): - self._text.set_weight(value) - - -class LabelProps(LabelOptions): - """ - Set the font properties of both, x- and y-label - - Possible types - -------------- - %(LabelOptions.possible_types)s - dict - Items may be any valid text property - - See Also - -------- - xlabel, ylabel, labelsize, labelweight""" - - group = "labels" - - children = ["xlabel", "ylabel", "labelsize", "labelweight"] - - name = "font properties of x- and y-axis label" - - def update_axis(self, fontprops): - fontprops = fontprops.copy() - if "size" not in fontprops and "fontsize" not in fontprops: - fontprops["size"] = self.labelsize.value[self.axis_str] - if "weight" not in fontprops and "fontweight" not in fontprops: - fontprops["weight"] = self.labelweight.value[self.axis_str] - self._text.update(fontprops) - - -class Transpose(Formatoption): - """ - Switch x- and y-axes - - By default, one-dimensional arrays have the dimension on the x-axis and two - dimensional arrays have the first dimension on the y and the second on the - x-axis. You can set this formatoption to True to change this behaviour - - Possible types - -------------- - bool - If True, axes are switched""" - - group = "axes" - - name = "Switch x- and y-axes" - - priority = START - - def __init__(self, *args, **kwargs): - super(Transpose, self).__init__(*args, **kwargs) - self.swap_funcs = { - "ticks": self._swap_ticks, - "ticklabels": self._swap_ticklabels, - "limits": self._swap_limits, - "labels": self._swap_labels, - } - - def initialize_plot(self, value): - pass - - def update(self, value): - for func in six.itervalues(self.swap_funcs): - func() - - def _swap_ticks(self): - xaxis = self.ax.xaxis - yaxis = self.ax.yaxis - # swap major ticks - old_xlocator = xaxis.get_major_locator() - xaxis.set_major_locator(yaxis.get_major_locator()) - yaxis.set_major_locator(old_xlocator) - # swap minor ticks - old_xlocator = xaxis.get_minor_locator() - xaxis.set_minor_locator(yaxis.get_minor_locator()) - yaxis.set_minor_locator(old_xlocator) - - def _swap_ticklabels(self): - xaxis = self.ax.xaxis - yaxis = self.ax.yaxis - # swap major ticklabels - old_xformatter = xaxis.get_major_formatter() - xaxis.set_major_formatter(yaxis.get_major_formatter()) - yaxis.set_major_formatter(old_xformatter) - # swap minor ticklabels - old_xformatter = xaxis.get_minor_formatter() - xaxis.set_minor_formatter(yaxis.get_minor_formatter()) - yaxis.set_minor_formatter(old_xformatter) - - def _swap_limits(self): - old_xlim = list(self.ax.get_xlim()) - self.ax.set_xlim(*self.ax.get_ylim()) - self.ax.set_ylim(*old_xlim) - - def _swap_labels(self): - old_xlabel = self.ax.get_xlabel() - self.ax.set_xlabel(self.ax.get_ylabel()) - self.ax.set_ylabel(old_xlabel) - - def get_x(self, arr): - if not hasattr(arr, "ndim"): # if the data object is an array list - arr = arr[0] - if arr.dims[0] == "variable" and arr.ndim > 1: - arr = arr.psy[0] - is_unstructured = arr.psy.decoder.is_unstructured(arr) - if not is_unstructured and arr.ndim == 1: - if self.value: - return arr - else: - #: The x-coordinate name of the variable as stored in the - #: dataset (might differ from the one in this array because - #: this could also be time, z, y, etc.) - ds_coord = arr.psy.get_dim("x", True) - xname = arr.dims[0] - else: - if self.value: - ds_coord = arr.psy.get_dim("y", True) - xname = arr.dims[-2 if not is_unstructured else -1] - else: - ds_coord = arr.psy.get_dim("x", True) - xname = arr.dims[-1] - if xname == ds_coord: - if self.value: - return arr.psy.get_coord("y", True) - return arr.psy.get_coord("x", True) - else: - return arr.coords[xname] - - def get_y(self, arr): - if not hasattr(arr, "ndim"): # if the data object is an array list - arr = arr[0] - elif arr.dims[0] == "variable" and arr.ndim > 1: - arr = arr.psy[0] - is_unstructured = arr.psy.decoder.is_unstructured(arr) - if not is_unstructured and arr.ndim == 1: - if not self.value: - return arr - else: - #: The x-coordinate name of the variable as stored in the - #: dataset (might differ from the one in this array because - #: this could also be time, z, y, etc.) - ds_coord = arr.psy.get_dim("x", True) - yname = arr.dims[0] - else: - if not self.value: - ds_coord = arr.psy.get_dim("y", True) - yname = arr.dims[-2 if not is_unstructured else -1] - else: - ds_coord = arr.psy.get_dim("x", True) - yname = arr.dims[-1] - if yname == ds_coord: - if self.value: - return arr.psy.get_coord("x", True) - return arr.psy.get_coord("y", True) - else: - return arr.coords[yname] - - -@docstrings.get_sections(base="LineColors") -class LineColors(Formatoption): - """ - Set the color coding - - This formatoptions sets the color of the lines, bars, etc. - - Possible types - -------------- - None - to use the axes color_cycle - iterable - (e.g. list) to specify the colors manually - str - %(cmap_note)s - matplotlib.colors.ColorMap - to automatically choose the colors according to the number of lines, - etc. from the given colormap""" - - group = "colors" - - priority = BEFOREPLOTTING - - name = "Color cycle" - - @property - def value2pickle(self): - return self.colors - - @property - def value2share(self): - return self.extended_colors - - def __init__(self, *args, **kwargs): - super(LineColors, self).__init__(*args, **kwargs) - self.colors = [] - - @property - def extended_colors(self): - for c in self.colors: - yield c - while True: - c = next(self.color_cycle) - self.colors.append(c) - yield c - - def update(self, value): - changed = self.plotter.has_changed(self.key) - if value is None: - prop_cycler = mpl.rcParams["axes.prop_cycle"] - self.color_cycle = cycle((props["color"] for props in prop_cycler)) - prop_cycler._keys # this should make a copy - else: - try: - self.color_cycle = cycle( - get_cmap(value)( - np.linspace( - 0.0, 1.0, len(list(self.iter_data)), endpoint=True - ) - ) - ) - except (ValueError, TypeError, KeyError): - try: - # do not use safe_list, because it might be a generator - validate_color(value) - except (ValueError, TypeError, AttributeError): - pass - else: - value = [value] - self.color_cycle = cycle(iter(value)) - if changed: - self.colors.clear() - - -class Marker(Formatoption): - """ - Choose the marker for points - - Possible types - -------------- - None - Use the default from matplotlibs rcParams - str - A valid symbol for the matplotlib markers (see - :mod:`matplotlib.markers`) - """ - - priority = BEFOREPLOTTING - - def update(self, value): - if value is None: - self.markers = repeat(mpl.rcParams["lines.marker"]) - else: - self.markers = cycle(value) - - -class MarkerSize(Formatoption): - """ - Choose the size of the markers for points - - Possible types - -------------- - None - Use the default from matplotlibs rcParams - float - The size of the marker - """ - - connections = ["plot"] - - priority = BEFOREPLOTTING - - def update(self, value): - if value is None: - self.plot._kwargs.pop("markersize", None) - else: - self.plot._kwargs["markersize"] = value - - -class LineWidth(Formatoption): - """ - Choose the width of the lines - - Possible types - -------------- - None - Use the default from matplotlibs rcParams - float - The width of the lines - """ - - connections = ["plot"] - - priority = BEFOREPLOTTING - - def update(self, value): - if value is None: - self.plot._kwargs.pop("linewidth", None) - else: - self.plot._kwargs["linewidth"] = value - - -class LinePlot(Formatoption): - """ - Choose the line style of the plot - - Possible types - -------------- - None - Don't make any plotting - ``'area'`` - To make an area plot (filled between y=0 and y), see - :func:`matplotlib.pyplot.fill_between` - ``'areax'`` - To make a transposed area plot (filled between x=0 and x), see - :func:`matplotlib.pyplot.fill_betweenx` - ``'stacked'`` - Make a stacked plot - str or list of str - The line style string to use (['solid' | 'dashed', 'dashdot', 'dotted' - | (offset, on-off-dash-seq) | '-' | '--' | '-.' | ':' | 'None' | ' ' | - '']). - """ - - plot_fmt = True - - group = "plotting" - - priority = BEFOREPLOTTING + 0.1 - - children = ["color", "transpose", "marker"] - - name = "Line plot type" - - @property - def plotted_data(self): - """The data that is shown to the user""" - return InteractiveList( - [ - arr - for arr, val in zip(self.iter_data, cycle(slist(self.value))) - if val is not None - ] - ) - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._kwargs = {} - - def update(self, value): - # the real plot making is done by make_plot - pass - - def make_plot(self): - if hasattr(self, "_plot"): - self.remove() - value = self.value - if value is not None: - if "stacked" in value: - self._stacked_plot() - else: - try: - markers = self.marker.markers - except AttributeError: - markers = repeat(None) - self._plot = list( - filter( - None, - chain.from_iterable( - starmap( - self.plot_arr, - zip( - self.iter_data, - self.color.extended_colors, - cycle(slist(self.value)), - markers, - ), - ) - ), - ) - ) - - def _stacked_plot(self): - transpose = self.transpose.value - data = self.data - if isinstance(data, InteractiveList): - data = InteractiveList( - [arr[0] if arr.ndim == 2 else arr for arr in data] - ) - df = data.to_dataframe() - else: - df = data.to_series().to_frame() - index = self._get_index(df) - if not isinstance(index, DatetimeIndex): - try: - x = np.asarray(index.values).astype(float) - except ValueError: - x = np.arange(index.values.size) - else: - x = index.to_pydatetime() - base = np.zeros_like(df.iloc[:, 0]) - self._plot = [] - for (col, s), c, val in zip( - df.items(), self.color.extended_colors, cycle(slist(self.value)) - ): - if val is None: - continue - pm = self.ax.fill_betweenx if transpose else self.ax.fill_between - y = np.where(s.isnull(), 0, s.values) - self._plot.append(pm(x, base, base + y, facecolor=c)) - base += y - - def _get_index(self, df): - if isinstance(df.index, MultiIndex) and len(df.index.names) == 1: - index = df.index.get_level_values(0) - else: - index = df.index - return index - - def plot_arr(self, arr, c, ls, m): - if ls is None: - return [None] - # since date time objects are covered better by pandas, - # we convert to a series - if arr.ndim == 2: # contains also error information - arr = arr[0] - df = arr.to_series() - try: - y = np.asarray(df.values).astype(float) - except ValueError: - y = np.arange(df.values.size) - index = self._get_index(df) - if not isinstance(index, DatetimeIndex): - try: - x = np.asarray(index.values).astype(float) - except ValueError: - x = np.arange(index.values.size) - else: - x = index.to_pydatetime() - - if self.transpose.value: - x, y = y, x - if ls in ["area", "areay"]: - ymin = np.vstack([y, np.zeros_like(y)]).min(axis=0) - ymax = np.vstack([y, np.zeros_like(y)]).max(axis=0) - return [self.ax.fill_between(x, ymin, ymax, color=c)] - elif ls == "areax": - xmin = np.vstack([x, np.zeros_like(x)]).min(axis=0) - xmax = np.vstack([x, np.zeros_like(x)]).max(axis=0) - return [self.ax.fill_betweenx(y, xmin, xmax, color=c)] - else: - return self.ax.plot( - x, y, color=c, linestyle=ls, marker=m, **self._kwargs - ) - - def remove(self): - for artist in self._plot: - artist.remove() - del self._plot - - -class ErrorPlot(Formatoption): - """ - Visualize the error range - - This formatoption visualizes the error range. For this, you must provide a - two-dimensional data array as input. The first dimension might be either of - length - - - 2 to provide the deviation from minimum and maximum error range from - the data - - 3 to provide the minimum and maximum error range explicitly - - Possible types - -------------- - None - No errors are visualized - 'fill' - The area between min- and max-error is filled with the same color as - the line and the alpha is determined by the :attr:`fillalpha` attribute - - Examples - -------- - Assume you have the standard deviation stored in the ``'std'``-variable and - the data in the ``'data'`` variable. Then you can visualize the standard - deviation simply via:: - - >>> psy.plot.lineplot(input_ds, name=[['data', 'std']]) - - On the other hand, assume you want to visualize the area between the 25th - and 75th percentile (stored in the variables ``'p25'`` and ``'p75'``):: - - >>> psy.plot.lineplot(input_ds, name=[['data', 'p25', 'p75']]) - - See Also - -------- - erroralpha - """ - - plot_fmt = True - - group = "plotting" - - priority = BEFOREPLOTTING - - children = ["color", "transpose", "plot"] - - name = "Error plot type" - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._kwargs = {} - - def update(self, value): - pass # the work is done in make_plot - - def make_plot(self): - if hasattr(self, "_plot"): - self.remove() - if self.value is not None: - self._plot = [] - colors = self.color.extended_colors - for da, line in zip(self.iter_data, self.plot._plot): - if da.ndim == 2 and da.shape[0] > 1: - data = da[0].to_series() - error = da[1:, :] - if error.shape[0] == 1: - min_range = data.values - error[0] - max_range = data.values + error[0] - else: - min_range = error[0] - max_range = error[1] - if self.value == "fill": - vals = self._get_x_values(data) - self.plot_fill( - vals, - min_range, - max_range, - next(colors), - zorder=line.zorder, - ) - else: - next(colors) - - def _get_x_values(self, df): - if isinstance(df.index, MultiIndex) and len(df.index.names) == 1: - index = df.index.get_level_values(0) - else: - index = df.index - if not isinstance(index, DatetimeIndex): - try: - x = np.asarray(index.values).astype(float) - except ValueError: - x = np.arange(index.values.size) - else: - x = index.to_pydatetime() - return x - - def plot_fill(self, index, min_range, max_range, c, **kwargs): - if self.transpose.value: - plot_method = self.ax.fill_betweenx - else: - plot_method = self.ax.fill_between - self._plot.append( - plot_method( - index, - min_range, - max_range, - facecolor=c, - **dict(chain(*map(six.iteritems, [self._kwargs, kwargs]))), - ) - ) - - def remove(self): - for artist in self._plot: - artist.remove() - del self._plot - - -class ErrorAlpha(Formatoption): - """ - Set the alpha value for the error range - - This formatoption can be used to set the alpha value (opacity) for the - :attr:`error` formatoption - - Possible types - -------------- - float - A float between 0 and 1 - - See Also - -------- - error""" - - priority = BEFOREPLOTTING - - name = "Alpha value of the error range" - - group = "colors" - - connections = ["error"] - - def update(self, value): - self.error._kwargs["alpha"] = value - - -class BarWidths(Formatoption): - """ - Specify the widths of the bars - - Possible types - -------------- - 'equal' - Each bar will have the same width (the default) - 'data' - Each bar will have the width as specified by the boundaries - float - The width for each bar - - See Also - -------- - categorical - """ - - priority = BEFOREPLOTTING - - name = "Width of the bars" - - def update(self, value): - # Does nothing, the work is done in the :class:`BarPlot` formatoption - pass - - -class CategoricalBars(Formatoption): - """ - The location of each bar - - Possible types - -------------- - None - If None, use a categorical plotting if the widths are ``'equal'``, - otherwise, not - bool - If True, use a categorical plotting - - See Also - -------- - widths - """ - - priority = BEFOREPLOTTING - - name = "Categorical or non-categorical plotting" - - dependencies = ["widths"] - - def update(self, value): - widths = self.widths.value - self.is_categorical = (value is None and widths == "equal") or value - - -class BarAlpha(Formatoption): - """ - Specify the transparency (alpha) - - Possible types - -------------- - float - A value between 0 (opaque) and 1 invisible""" - - priority = BEFOREPLOTTING - - name = "Transparency of the bars" - - def update(self, value): - pass - - -class BarPlot(Formatoption): - """ - Choose how to make the bar plot - - Possible types - -------------- - None - Don't make any plotting - 'bar' - Create a usual bar plot with the bars side-by-side - 'stacked' - Create stacked plot - """ - - plot_fmt = True - - group = "plotting" - - priority = BEFOREPLOTTING - - children = ["color", "transpose", "alpha"] - - dependencies = ["widths", "categorical"] - - name = "Bar plot type" - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._kwargs = {} - - def update(self, value): - # the real plot making is done by make_plot - pass - - def remove(self): - for artist in self._plot: - artist.remove() - del self._plot - - @property - def plotted_data(self): - """The data that is shown to the user""" - return InteractiveList( - [ - arr - for arr, val in zip(self.iter_data, cycle(slist(self.value))) - if val is not None - ] - ) - - def make_plot(self): - if hasattr(self, "_plot"): - self.remove() - if self.value is not None: - ax = self.ax - # for a transposed plot, we use the barh plot method of the axes - pm = ax.barh if self.transpose.value else ax.bar - alpha = self.alpha.value - if "stacked" not in slist(self.value): - self._plot = [ - pm( - *self.get_xys(arr), - facecolor=c, - alpha=alpha, - align="edge", - ) - for arr, c in zip( - self.iter_data, self.color.extended_colors - ) - ] - if self._set_date: - if self.transpose.value: - ax.yaxis_date() - else: - ax.xaxis_date() - else: # make a stacked plot - if isinstance(self.data, InteractiveList): - df = self.data.to_dataframe() - else: - df = self.data.to_series().to_frame() - try: - df.index = df.index.get_level_values(0) - except AttributeError: - pass - x, y, s = self.get_xys(df.iloc[:, 0].to_xarray()) - self._plot = containers = [] - base = np.zeros_like(y) - for i, (col, c, plot) in enumerate( - zip( - df.columns, - self.color.extended_colors, - cycle(slist(self.value)), - ) - ): - if not plot: - continue - y = df.iloc[:, i].values - y = np.where(np.isnan(y), 0, y) - if not i: - containers.append( - pm(x, y, s, facecolor=c, alpha=alpha) - ) - elif self.transpose.value: - containers.append( - pm(x, y, s, facecolor=c, alpha=alpha, left=base) - ) - else: - containers.append( - pm(x, y, s, facecolor=c, alpha=alpha, bottom=base) - ) - base += y - - def get_xys(self, arr): - width = self.widths.value - y = arr.values - self._set_date = False - if self.categorical.is_categorical: - x = np.arange(len(y)) - if width == "data": - self.logger.warn( - "Cannot use 'data'-based bar width for categorical plots!" - ) - width = 0.5 - elif width == "equal": - width = 0.5 # pandas default value - elif width == "data": - x = _infer_interval_breaks(arr.coords[arr.dims[0]].values) - is_datelike = isinstance(arr.indexes[arr.dims[0]], DatetimeIndex) - s = x[1:] - x[:-1] - if is_datelike: - # convert to datetime - x = to_datetime(x) - # calculate widths in days - s = to_timedelta(s).total_seconds() / 86400.0 - self._set_date = True - x = x[:-1] - width = s - else: - if width == "equal": - # Use half of the smalles step - x = _infer_interval_breaks(arr.coords[arr.dims[0]].values) - width = np.abs(np.diff(x)).min() / 2 - x = arr.coords[arr.dims[0]].values - return x, y, width - - -class ViolinXTicks(XTicks): - __doc__ = XTicks.__doc__ - - @property - def array(self): - if not self.transpose.value: - return np.array(list(range(len(self.data)))) - return super(ViolinXTicks, self).array - - -class ViolinYTicks(YTicks): - __doc__ = YTicks.__doc__ - - @property - def array(self): - if self.transpose.value: - return np.array(list(range(len(self.data)))) - return super(ViolinYTicks, self).array - - -class ViolinXTickLabels(XTickLabels, TextBase): - __doc__ = XTickLabels.__doc__ - - data_dependent = True - - def update_axis(self, value): - if self.transpose.value or value is None: - return super(ViolinXTickLabels, self).update_axis(value) - if isinstance(value, six.string_types): - self.set_ticklabels( - [ - self.replace( - value, arr, self.get_enhanced_attrs(arr, replot=True) - ) - for arr in self.data - ] - ) - else: - self.set_ticklabels( - [ - self.replace( - val, arr, self.get_enhanced_attrs(arr, replot=True) - ) - for val, arr in zip(value, self.data) - ] - ) - - -class ViolinYTickLabels(YTickLabels, TextBase): - __doc__ = XTickLabels.__doc__ - - data_dependent = True - - def update_axis(self, value): - if self.transpose.value or value is None: - return super(ViolinYTickLabels, self).update_axis(value) - if isinstance(value, six.string_types): - self.set_ticklabels( - [ - self.replace( - value, arr, self.get_enhanced_attrs(arr, replot=True) - ) - for arr in self.data - ] - ) - else: - self.set_ticklabels( - [ - self.replace( - val, arr, self.get_enhanced_attrs(arr, replot=True) - ) - for val, arr in zip(value, self.data) - ] - ) - - -class ViolinPlot(Formatoption): - """ - Choose how to make the violin plot - - Possible types - -------------- - None or False - Don't make any plotting - bool - If True, visualize the violins - """ - - plot_fmt = True - - group = "plotting" - - priority = BEFOREPLOTTING - - children = ["color", "transpose"] - - name = "Violin plot type" - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._kwargs = {} - - def update(self, value): - # the real plot making is done by make_plot - pass - - def remove(self): - for artist in self._plot: - artist.remove() - del self._plot - - def make_plot(self): - if hasattr(self, "_plot"): - self.remove() - if self.value: - from seaborn import violinplot - - if isinstance(self.data, InteractiveList): - df = self.data.to_dataframe() - else: - df = self.data.to_series().to_frame() - old_artists = ( - self.ax.containers[:] - + self.ax.lines[:] - + self.ax.collections[:] - ) - palette = list(islice(self.color.extended_colors, df.shape[1])) - violinplot( - data=df, - palette=palette, - ax=self.ax, - orient="h" if self.transpose.value else "v", - **self._kwargs, - ) - artists = self.ax.containers + self.ax.lines + self.ax.collections - self._plot = [ - artist for artist in artists if artist not in old_artists - ] - - -@docstrings.get_sections(base="LimitBase") -@dedent -class LimitBase(DataTicksCalculator): - """ - Base class for x- and y-limits - - Possible types - -------------- - None - To not change the current limits - str or list [str, str] or [[str, float], [str, float]] - Automatically determine the ticks corresponding to the data. The given - string determines how the limits are calculated. The float determines - the percentile to use - A string can be one of the following: - - rounded - Sets the minimum and maximum of the limits to the rounded data - minimum or maximum. Limits are rounded to the next 0.5 value with - to the difference between data max- and minimum. The minimum - will always be lower or equal than the data minimum, the maximum - will always be higher or equal than the data maximum. - roundedsym - Same as `rounded` above but the limits are chosen such that they - are symmetric around zero - minmax - Uses the minimum and maximum - sym - Same as minmax but symmetric around zero - tuple (xmin, xmax) - `xmin` is the smaller value, `xmax` the larger. Any of those values can - be None or one of the strings (or lists) above to use the corresponding - value here - """ - - group = "axes" - - children = ["transpose"] - - connections = ["plot"] - - @property - def value2share(self): - return self.range - - @abstractmethod - def set_limit(self, min_val, max_val): - """The method to set the minimum and maximum limit - - Parameters - ---------- - min_val: float - The value for the lower limit - max_val: float - The value for the upper limit""" - pass - - def __init__(self, *args, **kwargs): - super(LimitBase, self).__init__(*args, **kwargs) - self._calc_funcs = { - "rounded": self._round_min_max, - "roundedsym": self._roundedsym_min_max, - "minmax": self._min_max, - "sym": self._sym_min_max, - } - - def _round_min_max(self, vmin, vmax): - try: - exp = np.floor(np.log10(abs(vmax - vmin))) - larger = round_to_05([vmin, vmax], exp, mode="l") - smaller = round_to_05([vmin, vmax], exp, mode="s") - except TypeError: - self.logger.debug( - "Failed to calculate rounded limits!", exc_info=True - ) - return vmin, vmax - return min([larger[0], smaller[0]]), max([larger[1], smaller[1]]) - - def _min_max(self, vmin, vmax): - return vmin, vmax - - def _roundedsym_min_max(self, vmin, vmax): - vmax = max(map(abs, self._round_min_max(vmin, vmax))) - return -vmax, vmax - - def _sym_min_max(self, vmin, vmax): - vmax = max(abs(vmin), abs(vmax)) - return -vmax, vmax - - def update(self, value): - value = list(value) - value_lists = list(map(slist, value)) - kwargs = {} - for kw, l in zip(["percmin", "percmax"], value_lists): - if len(l) == 2: - kwargs[kw] = l[1] - vmin, vmax = self._calc_vmin_vmax(**kwargs) - if vmin == vmax: - vmax = vmax + 1 - vmin = vmin - 1 - for key, func in self._calc_funcs.items(): - if key in value_lists[0] or key in value_lists[1]: - minmax = func(vmin, vmax) - for i, val in enumerate(value_lists): - if key in val: - value[i] = minmax[i] - self.range = value - self.logger.debug("Setting %s with %s", self.key, value) - self.set_limit(*value) - - -class Xlim(LimitBase): - """ - Set the x-axis limits - - Possible types - -------------- - %(LimitBase.possible_types)s - - See Also - -------- - ylim - """ - - children = LimitBase.children + ["ylim"] - - dependencies = ["xticks"] - - connections = LimitBase.connections + ["sym_lims"] - - axisname = "x" - - name = "x-axis limits" - - @property - def array(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - data = ( - list(getattr(self.plot, "plotted_data", self.iter_data)) - or self.iter_data - ) - df = InteractiveList(map(select_array, data)).to_dataframe() - if self.transpose.value and "stacked" in slist(self.plot.value): - summed = df.sum(axis=1).values - arr = np.concatenate( - [[min(summed.min(), 0)], df.sum(axis=1).values] - ) - elif self.transpose.value: - arr = df.values[df.notnull().values] - else: - arr = _get_index_vals(df.index) - try: - arr.astype(float) - except (ValueError, TypeError): - arr = np.arange(len(arr)) - return arr - - def set_limit(self, *args): - if self.ax.xaxis_inverted(): - args = reversed(args) - try: - self.ax.set_xlim(*args) - except (AttributeError, TypeError): # np.datetime64 - self.ax.set_xlim(*to_datetime(args)) - - def initialize_plot(self, value): - super(Xlim, self).initialize_plot(value) - self.transpose.swap_funcs["limits"] = self._swap_limits - - def _swap_limits(self): - self.transpose._swap_limits() - old_xlim = self.value - with self.plotter.no_validation: - self.plotter[self.key] = self.ylim.value - self.plotter[self.ylim.key] = old_xlim - - -class Ylim(LimitBase): - """ - Set the y-axis limits - - Possible types - -------------- - %(LimitBase.possible_types)s - - See Also - -------- - xlim - """ - - children = LimitBase.children + ["xlim"] - - dependencies = ["yticks"] - - connections = LimitBase.connections + ["sym_lims"] - - axisname = "y" - - name = "y-axis limits" - - @property - def array(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - data = ( - list(getattr(self.plot, "plotted_data", self.iter_data)) - or self.iter_data - ) - df = InteractiveList(map(select_array, data)).to_dataframe() - if not self.transpose.value and "stacked" in slist(self.plot.value): - summed = df.sum(axis=1).values - arr = np.concatenate( - [[min(summed.min(), 0)], df.sum(axis=1).values] - ) - elif self.transpose.value: - arr = _get_index_vals(df.index) - else: - arr = df.values[df.notnull().values] - try: - arr.astype(float) - except ValueError: - return np.arange(len(arr)) - return arr - - def set_limit(self, *args): - if self.ax.yaxis_inverted(): - args = reversed(args) - try: - self.ax.set_ylim(*args) - except (AttributeError, TypeError): # np.datetime64 - self.ax.set_ylim(*to_datetime(args)) - - -class SymmetricLimits(Formatoption): - """ - Make x- and y-axis symmetric - - Possible types - -------------- - None - No symmetric type - 'min' - Use the minimum of x- and y-limits - 'max' - Use the maximum of x- and y-limits - [str, str] - A combination, ``None``, ``'min'`` and ``'max'`` specific for minimum - and maximum limit - """ - - dependencies = ["xlim", "ylim"] - - name = "Symmetric x- and y-axis limits" - - def update(self, value): - if all(v is None for v in value): - return - xlim = self.xlim.range[:] - ylim = self.ylim.range[:] - for i, v in enumerate(value): - if v == "min": - xlim[i] = ylim[i] = min(xlim[i], ylim[i]) - elif v == "max": - xlim[i] = ylim[i] = max(xlim[i], ylim[i]) - self.xlim.set_limit(*xlim) - self.ylim.set_limit(*ylim) - - -class ViolinXlim(Xlim): - # xlim class for ViolinPlotter - __doc__ = Xlim.__doc__ - - @property - def array(self): - if not self.transpose.value: - return np.array([-0.5, len(list(self.iter_data)) - 0.5]) - return super(ViolinXlim, self).array - - def _round_min_max(self, *args, **kwargs): - if not self.transpose.value: - return self.array - return super(ViolinXlim, self)._round_min_max(*args, **kwargs) - - -class BarXlim(ViolinXlim): - # xlim class for bar plotter - __doc__ = Xlim.__doc__ - - dependencies = ViolinXlim.dependencies + ["categorical"] - - @property - def array(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - categorical = self.categorical.is_categorical - if self.transpose.value and "stacked" in slist(self.plot.value): - data = ( - list(getattr(self.plot, "plotted_data", self.iter_data)) - or self.iter_data - ) - df = InteractiveList(map(select_array, data)).to_dataframe() - summed = df.sum(axis=1).values - return np.concatenate( - [[min(summed.min(), 0)], df.sum(axis=1).values] - ) - elif categorical and not self.transpose.value: - return np.array([-0.5, len(self.data.to_dataframe().index) - 0.5]) - elif not categorical: - return _infer_interval_breaks(Xlim.array.fget(self)) - return super(BarXlim, self).array - - def _round_min_max(self, *args, **kwargs): - if not self.categorical.is_categorical: - return Xlim._round_min_max(self, *args, **kwargs) - else: - return super(BarXlim, self)._round_min_max(*args, **kwargs) - - -class Xlim2D(Xlim): - __doc__ = Xlim.__doc__ - - @property - def array(self): - xcoord = self.transpose.get_x(self.data) - func = "get_x" if not self.transpose.value else "get_y" - data = next(self.iter_data) - decoder_coord = getattr(self.decoder, func)(data) - if decoder_coord is not None and xcoord.name == decoder_coord.name: - bounds = self.decoder.get_cell_node_coord( - data, axis="x", coords=data.coords - ) - if bounds is None: - bounds = xcoord - bounds = self.convert_coordinate(bounds, xcoord) - return bounds.values.ravel() - return self.decoder.get_plotbounds(xcoord) - - -class Ylim2D(Ylim): - __doc__ = Ylim.__doc__ - - @property - def array(self): - ycoord = self.transpose.get_y(self.data) - func = "get_x" if self.transpose.value else "get_y" - data = next(self.iter_data) - decoder_coord = getattr(self.decoder, func)(data) - if decoder_coord is not None and ycoord.name == decoder_coord.name: - bounds = self.decoder.get_cell_node_coord( - data, axis="y", coords=data.coords - ) - if bounds is None: - bounds = ycoord - bounds = self.convert_coordinate(bounds, ycoord) - return bounds.values.ravel() - return self.decoder.get_plotbounds(self.transpose.get_y(self.data)) - - -class ViolinYlim(Ylim): - # Ylim class for ViolinPlotter - __doc__ = Ylim.__doc__ - - @property - def array(self): - if self.transpose.value: - return np.array([-0.5, len(list(self.iter_data)) - 0.5]) - return super(ViolinYlim, self).array - - def _round_min_max(self, *args, **kwargs): - if self.transpose.value: - return self.array - return super(ViolinYlim, self)._round_min_max(*args, **kwargs) - - -class BarYlim(ViolinYlim): - # ylim class for bar plotter - __doc__ = Ylim.__doc__ - - dependencies = ViolinYlim.dependencies + ["categorical"] - - @property - def array(self): - def select_array(arr): - if arr.ndim > 1: - return arr.psy[0] - return arr - - categorical = self.categorical.is_categorical - if not self.transpose.value and "stacked" in slist(self.plot.value): - data = ( - list(getattr(self.plot, "plotted_data", self.iter_data)) - or self.iter_data - ) - df = InteractiveList(map(select_array, data)).to_dataframe() - summed = df.sum(axis=1).values - return np.concatenate( - [[min(summed.min(), 0)], df.sum(axis=1).values] - ) - elif categorical and self.transpose.value: - return np.array([-0.5, len(self.data.to_dataframe().index) - 0.5]) - elif not categorical and self.transpose.value: - return _infer_interval_breaks(Ylim.array.fget(self)) - elif not categorical: - return Ylim.array.fget(self) - return super(BarYlim, self).array - - def _round_min_max(self, *args, **kwargs): - if not self.categorical.is_categorical: - return Ylim._round_min_max(self, *args, **kwargs) - else: - return super(BarYlim, self)._round_min_max(*args, **kwargs) - - -class XRotation(Formatoption): - """ - Rotate the x-axis ticks - - Possible types - -------------- - float - The rotation angle in degrees - - See Also - -------- - yrotation""" - - group = "ticks" - - children = ["yticklabels"] - - name = "Rotate x-ticklabels" - - def update(self, value): - for text in self.ax.get_xticklabels(which="both"): - text.set_rotation(value) - - -class YRotation(Formatoption): - """ - Rotate the y-axis ticks - - Possible types - -------------- - float - The rotation angle in degrees - - See Also - -------- - xrotation""" - - group = "ticks" - - children = ["yticklabels"] - - name = "Rotate y-ticklabels" - - def update(self, value): - for text in self.ax.get_yticklabels(which="both"): - text.set_rotation(value) - - -class CMap(Formatoption): - """ - Specify the color map - - This formatoption specifies the color coding of the data via a - :class:`matplotlib.colors.Colormap` - - Possible types - -------------- - str - %(cmap_note)s - matplotlib.colors.Colormap - The colormap instance to use - - See Also - -------- - bounds: specifies the boundaries of the colormap""" - - group = "colors" - - priority = BEFOREPLOTTING - - name = "Colormap" - - connections = ["bounds", "cbar"] # necessary for get_fmt_widget - - def get_cmap(self, arr=None, cmap=None, N=None): - """Get the :class:`matplotlib.colors.Colormap` for plotting - - Parameters - ---------- - arr: np.ndarray - The array to plot - cmap: str or matplotlib.colors.Colormap - The colormap to use. If None, the :attr:`value` of this - formatoption is used - N: int - The number of colors in the colormap. If None, the norm of the - :attr:`bounds` formatoption is used and, if necessary, the - given array `arr` - - Returns - ------- - matplotlib.colors.Colormap - The colormap returned by :func:`psy_simple.colors.get_cmap`""" - N = N or None - if cmap is None: - cmap = self.value - if N is None: - try: - N = self.bounds.norm.Ncmap - except AttributeError: - if arr is not None and self.bounds.norm is not None: - N = len(np.unique(self.bounds.norm(arr.ravel()))) - if N is not None: - return get_cmap(cmap, N) - return get_cmap(cmap) - - def update(self, value): - pass # the colormap is set when plotting - - def get_fmt_widget(self, parent, project): - """Open a :class:`psy_simple.widget.CMapFmtWidget`""" - from psy_simple.widgets.colors import CMapFmtWidget - - return CMapFmtWidget(parent, self, project) - - -class MissColor(Formatoption): - """ - Set the color for missing values - - Possible types - -------------- - None - Use the default from the colormap - string, tuple. - Defines the color of the grid.""" - - group = "colors" - - priority = END - - dependencies = ["plot"] - - connections = ["transform"] - - name = "Color of missing values" - - update_after_plot = True - - def update(self, value): - if self.plotter.replot: - self.remove() - if self.plot.value is None: - return - elif value is not None and self.plot.value == "contourf": - warn( - "[%s] - The miss_color formatoption is not supported for " - "filled contour plots!" % self.logger.name - ) - mappable = self.plot.mappable - if value is not None: - mappable.get_cmap().set_bad(value) - else: - mappable.get_cmap().set_bad(alpha=0) - mappable.changed() - - def remove(self): - if hasattr(self, "_miss_color_plot"): - try: - self._miss_color_plot.remove() - del self._miss_color_plot - except ValueError: - pass - - -@docstrings.get_sections( - base="Bounds", sections=["Possible types", "Examples", "See Also"] -) -class Bounds(DataTicksCalculator): - """ - Specify the boundaries of the colorbar - - Possible types - -------------- - None - make no normalization - %(DataTicksCalculator.possible_types)s - int - Specifies how many ticks to use with the ``'rounded'`` option. I.e. if - integer ``i``, then this is the same as ``['rounded', i]``. - matplotlib.colors.Normalize - A matplotlib normalization instance - - Examples - -------- - - Plot 11 bounds over the whole data range:: - - >>> plotter.update(bounds='rounded') - - which is equivalent to:: - - >>> plotter.update(bounds={'method': 'rounded'}) - - - Plot 7 ticks over the whole data range where the maximal and minimal - tick matches the data maximum and minimum:: - - >>> plotter.update(bounds=['minmax', 7]) - - which is equivaluent to:: - - >>> plotter.update(bounds={'method': 'minmax', 'N': 7}) - - - chop the first and last five percentiles:: - - >>> plotter.update(bounds=['rounded', None, 5, 95]) - - which is equivalent to:: - - >>> plotter.update(bounds={'method': 'rounded', 'percmin': 5, - ... 'percmax': 95}) - - - Plot 3 bounds per power of ten:: - - >>> plotter.update(bounds=['log', 3]) - - - Plot continuous logarithmic bounds:: - - >>> from matplotlib.colors import LogNorm - >>> plotter.update(bounds=LogNorm()) - - - See Also - -------- - cmap: Specifies the colormap""" - - group = "colors" - - priority = BEFOREPLOTTING - - name = "Boundaries of the color map" - - connections = ["cmap", "cbar"] # necessary for get_fmt_widget - - @property - def value2share(self): - """The normalization instance""" - if len(self.bounds) > 1: - return list(self.bounds) - return self.norm - - def update(self, value): - if value is None or isinstance(value, mpl.colors.Normalize): - self.norm = value - self.bounds = [0] - else: - if isinstance(value[0], six.string_types): - value = self.calc_funcs[value[0]](*value[1:]) - if value[0] == value[-1]: - # make sure we have a small difference between the values - value[-1] += value[-1] * 0.5 - self.bounds = value - self.norm = mpl.colors.BoundaryNorm(value, len(value) - 1) - - def get_fmt_widget(self, parent, project): - """Open a :class:`psy_simple.widget.CMapFmtWidget`""" - from psy_simple.widgets.colors import BoundsFmtWidget - - return BoundsFmtWidget(parent, self, project) - - -def format_coord_func(ax, ref): - """Create a function that can replace the - :func:`matplotlib.axes.Axes.format_coord` - - Parameters - ---------- - ax: matplotlib.axes.Axes - The axes instance - ref: weakref.weakref - The reference to the :class:`~psyplot.plotter.Formatoption` instance - - Returns - ------- - function - The function that can be used to replace `ax.format_coord` - """ - orig_format_coord = ax.format_coord - - def func(x, y): - orig_s = orig_format_coord(x, y) - fmto = ref() - if fmto is None: - return orig_s - try: - orig_s += fmto.add2format_coord(x, y) - except Exception: - fmto.logger.debug( - "Failed to get plot informations for status bar!", exc_info=1 - ) - return orig_s - - return func - - -class InterpolateBounds(Formatoption): - """ - Interpolate grid cell boundaries for 2D plots - - This formatoption can be used to tell enable and disable the interpolation - of grid cell boundaries. Usually, netCDF files only contain the centered - coordinates. In this case, we interpolate the boundaries between the - grid cell centers. - - Possible types - -------------- - None - Interpolate the boundaries, except for circumpolar grids - bool - If True (the default), the grid cell boundaries are inter- and - extrapolated. Otherwise, if False, the coordinate centers are used and - the default behaviour of matplotlib cuts of the most outer row and - column of the 2D-data. Note that this results in a slight shift of the - data - """ - - priority = BEFOREPLOTTING - - def update(self, value): - pass - - -@docstrings.get_sections(base="Plot2D") -class Plot2D(Formatoption): - """ - Choose how to visualize a 2-dimensional scalar data field - - Possible types - -------------- - None - Don't make any plotting - 'mesh' - Use the :func:`matplotlib.pyplot.pcolormesh` function to make the plot - or the :func:`matplotlib.pyplot.tripcolor` for an unstructered grid - 'poly' - Draw each polygon indivually. This method is used by default for - unstructured grids. If there are no grid cell boundaries in the - dataset, we will interpolate them - 'contourf' - Make a filled contour plot using the :func:`matplotlib.pyplot.contourf` - function. The levels for the contour plot are controlled by the - :attr:`levels` formatoption - 'contour' - Same a ``'contourf'``, but does not make a filled contour plot, only - lines. - """ - - plot_fmt = True - - group = "plotting" - - priority = BEFOREPLOTTING - - name = "2D plot type" - - children = ["cmap", "bounds"] - - dependencies = ["levels", "interp_bounds"] - - @property - def array(self): - """The (masked) data array that is plotted""" - arr = self.data.values - return np.ma.masked_array(arr, mask=np.isnan(arr)) - - @property - def notnull_array(self): - """The data array that is plotted""" - arr = self.data.values - return arr[~np.isnan(arr)] - - @property - def xbounds(self): - """Boundaries of the x-coordinate""" - data = self.data - coord = self.decoder.get_x(data, coords=data.coords) - return self.decoder.get_plotbounds(coord) - - @property - def ybounds(self): - """Boundaries of the y-coordinate""" - data = self.data - coord = self.decoder.get_y(data, coords=data.coords) - return self.decoder.get_plotbounds(coord) - - @property - def xcoord(self): - """The x coordinate :class:`xarray.Variable`""" - return self.decoder.get_x(self.data, coords=self.data.coords) - - @property - def ycoord(self): - """The y coordinate :class:`xarray.Variable`""" - return self.decoder.get_y(self.data, coords=self.data.coords) - - @property - def mappable(self): - """Returns the mappable that can be used for colorbars""" - return self._plot - - @property - def format_coord(self): - """The function that can replace the axes.format_coord method""" - return format_coord_func(self.ax, weakref.ref(self)) - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._plot_funcs = { - "mesh": self._pcolormesh, - "contourf": self._contourf, - "contour": self._contourf, - "poly": self._polycolor, - } - self._orig_format_coord = None - self._kwargs = {} - - def update(self, value): - # the real plot making is done by make_plot - pass - - def make_plot(self): - # remove the plot if it shall be replotted or any of the dependencies - # changed - if self.plotter.replot or any( - self.plotter.has_changed(key) - for key in chain(self.connections, self.dependencies, [self.key]) - ): - self.remove() - if self.value is not None: - if self.value == "tri": - warn( - "The 'tri' value is depreceated and will be removed " - "in the future. Use 'poly' instead!", - DeprecationWarning, - ) - self._plot_funcs[self.value]() - if self._orig_format_coord is None: - self._orig_format_coord = self.ax.format_coord - self.ax.format_coord = self.format_coord - - def _pcolormesh(self): - if self.decoder.is_unstructured(self.raw_data): - return self._polycolor() - arr = self.array - cmap = self.cmap.get_cmap(arr) - if hasattr(self, "_plot"): - self._plot.update(dict(cmap=cmap, norm=self.bounds.norm)) - # for cartopy, we have to consider the wrapped collection if the - # data has to be transformed - try: - coll = self._plot._wrapped_collection_fix - except AttributeError: - pass - else: - coll.update(dict(cmap=cmap, norm=self.bounds.norm)) - else: - x, y = self._get_xy_pcolormesh() - self._plot = self.ax.pcolormesh( - x, - y, - arr, - norm=self.bounds.norm, - cmap=cmap, - rasterized=True, - **self._kwargs, - ) - - def _get_xy_pcolormesh(self): - interp_bounds = self.interp_bounds.value - if interp_bounds is None and not self.decoder.is_circumpolar( - self.raw_data - ): - interp_bounds = True - if interp_bounds: - return self.xbounds, self.ybounds - else: - return self.xcoord.values, self.ycoord.values - - def _contourf(self): - if hasattr(self, "_plot") and self.plotter.has_changed( - self.levels.key - ): - self.remove() - arr = self.array - cmap = self.cmap.get_cmap(arr) - filled = self.value != "contour" - if hasattr(self, "_plot"): - self._plot.set_cmap(cmap) - self._plot.set_norm(self.bounds.norm) - else: - levels = self.levels.norm.boundaries - xcoord = self.convert_coordinate(self.xcoord) - ycoord = self.convert_coordinate(self.ycoord) - if self.decoder.is_unstructured(self.raw_data): - pm = self.ax.tricontourf if filled else self.ax.tricontour - mask = ~np.isnan(arr) - x = xcoord.values[mask] - y = ycoord.values[mask] - arr = arr[mask] - else: - pm = self.ax.contourf if filled else self.ax.contour - x = xcoord.values - y = ycoord.values - self._plot = pm( - x, - y, - arr, - levels, - norm=self.bounds.norm, - cmap=cmap, - **self._kwargs, - ) - - @property - def cell_nodes_x(self): - """The unstructured x-boundaries with shape (N, m) where m > 2""" - decoder = self.decoder - xcoord = self.xcoord - data = self.data - xbounds = decoder.get_cell_node_coord( - data, coords=data.coords, axis="x" - ) - xbounds = self.convert_coordinate(xbounds, xcoord) - return xbounds.values - - @property - def cell_nodes_y(self): - """The unstructured y-boundaries with shape (N, m) where m > 2""" - decoder = self.decoder - ycoord = self.ycoord - data = self.data - ybounds = decoder.get_cell_node_coord( - data, coords=data.coords, axis="y" - ) - ybounds = self.convert_coordinate(ybounds, ycoord) - return ybounds.values - - def _polycolor(self): - from matplotlib.collections import PolyCollection - - self.logger.debug("Retrieving bounds") - xbounds = self.cell_nodes_x - ybounds = self.cell_nodes_y - self.logger.debug("Retrieving data") - arr = self.array - cmap = self.cmap.get_cmap(arr) - if hasattr(self, "_plot"): - self.logger.debug("Updating plot") - self._plot.update(dict(cmap=cmap, norm=self.bounds.norm)) - else: - self.logger.debug("Making plot with %i cells", arr.size) - if xbounds.ndim > 2: - xbounds = xbounds.reshape((-1, xbounds.shape[-1])) - ybounds = ybounds.reshape((-1, ybounds.shape[-1])) - self._plot = PolyCollection( - np.dstack([xbounds, ybounds]), - array=arr.ravel(), - norm=self.bounds.norm, - rasterized=True, - cmap=cmap, - edgecolors="none", - antialiaseds=False, - **self._kwargs, - ) - self.logger.debug("Adding collection to axes") - self.ax.add_collection(self._plot, autolim=False) - self.logger.debug("Done.") - - def remove(self): - if hasattr(self, "_plot"): - try: - self._plot.remove() - except AttributeError: # contour plot - for artist in self._plot.collections[:]: - try: - artist.remove() - except ValueError: - pass - del self._plot - - def add2format_coord(self, x, y): - """Additional information for the :meth:`format_coord`""" - if self.value is None: - return "" - data = self.data - xcoord = self.xcoord - ycoord = self.ycoord - if self.decoder.is_unstructured(self.raw_data): - x, y, z = self.get_xyz_tri(xcoord, x, ycoord, y, data) - elif xcoord.ndim == 1: - x, y, z = self.get_xyz_1d(xcoord, x, ycoord, y, data) - elif xcoord.ndim == 2: - x, y, z = self.get_xyz_2d(xcoord, x, ycoord, y, data) - if z is None: - return "" - xunit = xcoord.attrs.get("units", "") - if xunit: - xunit = " " + xunit - yunit = ycoord.attrs.get("units", "") - if yunit: - yunit = " " + yunit - zunit = data.attrs.get("units", "") - if zunit: - zunit = " " + zunit - return ", data: %s: %.4g%s, %s: %.4g%s, %s: %.4g%s" % ( - xcoord.name, - x, - xunit, - ycoord.name, - y, - yunit, - data.name, - z, - zunit, - ) - - def get_xyz_tri(self, xcoord, x, ycoord, y, data): - """Get closest x, y and z for the given `x` and `y` in `data` for - 1d coords""" - return self.get_xyz_2d(xcoord, x, ycoord, y, data) - - def get_xyz_1d(self, xcoord, x, ycoord, y, data): - """Get closest x, y and z for the given `x` and `y` in `data` for - 1d coords""" - x_idx = xcoord.indexes[xcoord.name] - y_idx = ycoord.indexes[ycoord.name] - xclose = x_idx.get_loc(x, method="nearest") - yclose = y_idx.get_loc(y, method="nearest") - dx_max = np.diff(x_idx.sort_values()).max() - dy_max = np.diff(y_idx.sort_values()).max() - - x_data = xcoord[xclose].values - y_data = ycoord[yclose].values - if abs(x_data - x) > dx_max or abs(y_data - y) > dy_max: - val = None - else: - val = data[yclose, xclose].values - return x_data, y_data, val - - def get_xyz_2d(self, xcoord, x, ycoord, y, data): - """Get closest x, y and z for the given `x` and `y` in `data` for - 2d coords""" - xy = xcoord.values.ravel() + 1j * ycoord.values.ravel() - dist = np.abs(xy - (x + 1j * y)) - imin = np.nanargmin(dist) - xy_min = xy[imin] - - xb = self.decoder.get_cell_node_coord( - data, {xcoord.name: xcoord, ycoord.name: ycoord}, axis="x" - ) - yb = self.decoder.get_cell_node_coord( - data, {xcoord.name: xcoord, ycoord.name: ycoord}, axis="y" - ) - - dx_max = np.diff(xb).max() - dy_max = np.diff(yb).max() - - x_data = xy_min.real - y_data = xy_min.imag - - if abs(x_data - x) > dx_max or abs(y_data - y) > dy_max: - val = None - else: - val = data.values.ravel()[imin] - - return x_data, y_data, val - - -docstrings.delete_types( - "Bounds.possible_types", - "no_norm|None", - "None", - "matplotlib.colors.Normalize", -) - - -class ContourLevels(Bounds): - """ - The levels for the contour plot - - This formatoption sets the levels for the filled contour plot and only has - an effect if the :attr:`plot` Formatoption is set to ``'contourf'`` - - Possible types - -------------- - None - Use the settings from the :attr:`bounds` formatoption and if this - does not specify boundaries, use 11 - %(Bounds.possible_types.no_norm|None)s - """ - - dependencies = ["cbounds"] - - priority = BEFOREPLOTTING - - name = "Levels for the filled contour plot" - - def update(self, value): - if value is None: - try: - value = self.cbounds.norm.boundaries - except AttributeError: - value = ["rounded", 11] - super(ContourLevels, self).update(value) - - -class MaskDataGrid(Formatoption): - """Mask the datagrid where the array is NaN - - This boolean formatoption enables to mask the grid of the :attr:`datagrid` - formatoption where the data is NaN - - Possible types - -------------- - bool - Either True, to not display the data grid for cells with NaN, or False - - See Also - -------- - datagrid""" - - def update(self, value): - """dummy, since this fmt is considered in the :class:`DataGrid ` fmt""" - pass - - -class DataGrid(Formatoption): - """ - Show the grid of the data - - This formatoption shows the grid of the data (without labels) - - Possible types - -------------- - None - Don't show the data grid - str - A linestyle in the form ``'k-'``, where ``'k'`` is the color and - ``'-'`` the linestyle. - dict - any keyword arguments that are passed to the plotting function ( - :func:`matplotlib.pyplot.triplot` for unstructured grids and - :func:`matplotlib.pyplot.hlines` for rectilinear grids) - - See Also - -------- - mask_datagrid: To display cells with NaN""" - - children = ["transform"] - - dependencies = ["mask_datagrid"] - - connections = ["plot"] - - name = "Grid of the data" - - data_dependent = True - - @property - def xcoord(self): - """The x coordinate :class:`xarray.Variable`""" - return self.decoder.get_x(self.data, coords=self.data.coords) - - @property - def ycoord(self): - """The y coordinate :class:`xarray.Variable`""" - return self.decoder.get_y(self.data, coords=self.data.coords) - - @property - def xbounds(self): - """Boundaries of the x-coordinate""" - return self.decoder.get_plotbounds(self.xcoord) - - @property - def ybounds(self): - """Boundaries of the y-coordinate""" - return self.decoder.get_plotbounds(self.ycoord) - - @property - def cell_nodes_x(self): - """The unstructured x-boundaries with shape (N, m) where m > 2""" - decoder = self.decoder - xcoord = self.xcoord - data = self.data - xbounds = decoder.get_cell_node_coord( - data, - coords=data.coords, - axis="x", - nans="skip" if self.mask_datagrid.value else None, - ) - xbounds = self.convert_coordinate(xbounds, xcoord) - return xbounds.values - - @property - def cell_nodes_y(self): - """The unstructured y-boundaries with shape (N, m) where m > 2""" - decoder = self.decoder - ycoord = self.ycoord - data = self.data - ybounds = decoder.get_cell_node_coord( - data, - coords=data.coords, - axis="y", - nans="skip" if self.mask_datagrid.value else None, - ) - ybounds = self.convert_coordinate(ybounds, ycoord, ybounds) - return ybounds.values - - def __init__(self, *args, **kwargs): - """ - Parameters - ---------- - %(Formatoption.parameters)s""" - super(DataGrid, self).__init__(*args, **kwargs) - self._kwargs = {} - - def update(self, value): - self.remove() - if value is not None: - xb = self.cell_nodes_x - yb = self.cell_nodes_y - if xb.ndim > 2: - xb = xb.reshape((-1, xb.shape[-1])) - yb = yb.reshape((-1, yb.shape[-1])) - n = len(xb) - xb = np.c_[xb, xb[:, :1], [[np.nan]] * n].ravel() - yb = np.c_[yb, yb[:, :1], [[np.nan]] * n].ravel() - if isinstance(value, dict): - self._artists = self.ax.plot(xb, yb, **value) - else: - self._artists = self.ax.plot(xb, yb, value) - - def remove(self): - if not hasattr(self, "_artists"): - return - for artist in self._artists: - artist.remove() - del self._artists - - -class VectorDataGrid(DataGrid): - @property - def data(self): - return super().data[0] - - -class SimplePlot2D(Plot2D): - """ - Specify the plotting method - - Possible types - -------------- - None - Don't make any plotting - 'mesh' - Use the :func:`matplotlib.pyplot.pcolormesh` function to make the plot - """ - - dependencies = Plot2D.dependencies + ["transpose"] - - @property - def array(self): - if self.transpose.value: - return super(SimplePlot2D, self).array.T - else: - return super(SimplePlot2D, self).array - - @property - def xbounds(self): - return self.decoder.get_plotbounds(self.transpose.get_x(self.data)) - - @property - def ybounds(self): - return self.decoder.get_plotbounds(self.transpose.get_y(self.data)) - - @property - def xcoord(self): - if self.transpose.value: - return super(SimplePlot2D, self).ycoord - return super(SimplePlot2D, self).xcoord - - @property - def ycoord(self): - if self.transpose.value: - return super(SimplePlot2D, self).xcoord - return super(SimplePlot2D, self).ycoord - - @property - def cell_nodes_x(self): - if self.transpose.value: - return super(SimplePlot2D, self).cell_nodes_y - return super(SimplePlot2D, self).cell_nodes_x - - @property - def cell_nodes_y(self): - if self.transpose.value: - return super(SimplePlot2D, self).cell_nodes_x - return super(SimplePlot2D, self).cell_nodes_y - - -class XTicks2D(XTicks): - __doc__ = XTicks.__doc__ - - @property - def data(self): - data = [] - plot_data = super(XTicks, self).data - if not isinstance(plot_data, InteractiveList): - plot_data = [plot_data] - for da in plot_data: - data.append(self.transpose.get_x(da)) - if len(data) == 1: - return data[0] - try: - return xr.concat(data) - except Exception: - self.logger.debug( - "Failed to concatenate the data, returning first object!", - exc_info=True, - ) - return data[0] - - -class YTicks2D(YTicks): - __doc__ = YTicks.__doc__ - - @property - def data(self): - data = [] - plot_data = super(YTicks, self).data - if not isinstance(plot_data, InteractiveList): - plot_data = [plot_data] - for da in plot_data: - for da in plot_data: - data.append(self.transpose.get_y(da)) - if len(data) == 1: - return data[0] - try: - return xr.concat(data) - except Exception: - self.logger.debug( - "Failed to concatenate the data, returning first object!", - exc_info=True, - ) - return data[0] - - -class Extend(Formatoption): - """ - Draw arrows at the side of the colorbar - - Possible types - -------------- - str {'neither', 'both', 'min' or 'max'} - If not 'neither', make pointed end(s) for out-of-range values - """ - - group = "colors" - - name = "Ends of the colorbar" - - connections = ["plot"] - - def update(self, value): - # nothing to do here because the extend is set by the Cbar formatoption - if self.plot.value == "contourf" and value != "neither": - warn( - "[%s] - Extend keyword is not implemented for contour " - "plots" % self.logger.name - ) - else: - if self.plot.value is not None: - self.plot.mappable.norm.extend = value - - -class CbarSpacing(Formatoption): - """ - Specify the spacing of the bounds in the colorbar - - Possible types - -------------- - str {'uniform', 'proportional'} - if ``'uniform'``, every color has exactly the same width in the - colorbar, if ``'proportional'``, the size is chosen according to the - data""" - - group = "colors" - - connections = ["cbar"] - - name = "Spacing of the colorbar" - - def update(self, value): - self.cbar._kwargs["spacing"] = value - - -@docstrings.get_sections(base="Cbar") -class Cbar(Formatoption): - """ - Specify the position of the colorbars - - Possible types - -------------- - bool - True: defaults to 'b' - False: Don't draw any colorbar - str - The string can be a combination of one of the following strings: - {'fr', 'fb', 'fl', 'ft', 'b', 'r', 'sv', 'sh'} - - - 'b', 'r' stand for bottom and right of the axes - - 'fr', 'fb', 'fl', 'ft' stand for bottom, right, left and top of the - figure - - 'sv' and 'sh' stand for a vertical or horizontal colorbar in a - separate figure - list - A containing one of the above positions - - Examples - -------- - Draw a colorbar at the bottom and left of the axes:: - - >>> plotter.update(cbar='bl')""" - - dependencies = [ - "plot", - "cmap", - "bounds", - "extend", - "cbarspacing", - "levels", - ] - - group = "colors" - - name = "Position of the colorbar" - - priority = END + 0.1 - - figure_positions = {"fr", "fb", "fl", "ft", "b", "r", "l", "t"} - - original_position = None - - @property - def init_kwargs(self): - return dict( - chain( - six.iteritems(super(Cbar, self).init_kwargs), - [("other_cbars", self.other_cbars)], - ) - ) - - @docstrings.dedent - def __init__(self, *args, **kwargs): - """ - Parameters - ---------- - %(Formatoption.parameters)s - other_cbars: list of str - List of other colorbar formatoption keys (necessary for a - sufficient resizing of the axes)""" - self.other_cbars = kwargs.pop("other_cbars", []) - super(Cbar, self).__init__(*args, **kwargs) - self._kwargs = {} - self._just_drawn = set() - - def initialize_plot(self, value): - self._set_original_position() - self.cbars = {} - super(Cbar, self).initialize_plot(value) - - def _set_original_position(self): - """Gets and sets the original position of the axes without colorbar""" - # this is somewhat a hack to make sure that we get the right position - # although the figure has not been drawn so far - for key in self.other_cbars: - fmto = getattr(self.plotter, key, None) - if fmto is not None and fmto.original_position: - self.original_position = fmto.original_position - return - ax = self.ax - if ax._adjustable in ["box", "box-forced"]: - figW, figH = ax.get_figure().get_size_inches() - fig_aspect = figH / figW - position = ax.get_position(True) - pb = position.frozen() - box_aspect = ax.get_data_ratio() - pb1 = pb.shrunk_to_aspect(box_aspect, pb, fig_aspect) - self.original_position = pb1.anchored(ax.get_anchor(), pb) - else: - self.original_position = ax.get_position(True) - - @property - def value2share(self): - """Those colorbar positions that are directly at the axes""" - return self.value.intersection(["r", "b", "l", "t"]) - - def update(self, value): - """ - Updates the colorbar - - Parameters - ---------- - value - The value to update (see possible types) - no_fig_cbars - Does not update the colorbars that are not in the axes of this - plot""" - plotter = self.plotter - if plotter.replot or any( - plotter.has_changed(key, False) - for key in self.dependencies - if getattr(self, key, None) is not None - and key - not in [self._child_mapping["cmap"], self._child_mapping["bounds"]] - ): - cbars2delete = set(self.cbars) - else: - changed_bounds = plotter.has_changed(self.bounds.key) - if changed_bounds and ( - type(changed_bounds[0]) - is not type(changed_bounds[1]) # noqa: E721 - ): - cbars2delete = set(self.cbars) - else: - cbars2delete = set(self.cbars).difference(value) - if cbars2delete: - # if the colorbars are in the figure of the axes, we have to first - # remove all the colorbars and then redraw it in order to make - # sure that the axes gets the right position - if cbars2delete & self.figure_positions: - cbars2delete.update(self.figure_positions) - self.remove(positions=cbars2delete) - # remove other cbars - for key in self.other_cbars: - fmto = getattr(plotter, key) - fmto.remove(self.figure_positions) - # redraw other cbars - for key in self.other_cbars: - fmto = getattr(plotter, key) - fmto.update(fmto.value) - else: - self.remove(positions=cbars2delete) - for pos in value.intersection(self.cbars): - if self.plot.value is not None: - self.update_colorbar(pos) - for pos in sorted(value.difference(self.cbars)): - if self.plot.value is not None: - self.draw_colorbar(pos) - plotter._figs2draw.update( - map(lambda cbar: cbar.ax.get_figure(), six.itervalues(self.cbars)) - ) - - def update_colorbar(self, pos): - cbar = self.cbars[pos] - mappable = self.plot.mappable - if mpl.__version__ < "3.1": - cbar.set_norm(self.plot.mappable.norm) - cbar.set_cmap(self.plot.mappable.cmap) - else: # change the colorbar and reconnect signals - old = cbar.mappable - cbar.update_normal(mappable) - if not getattr(mappable, "colorbar_cid", False): - if getattr(old, "colorbar_cid", False): - old.callbacksSM.disconnect(old.colorbar_cid) - old.colorbar = None - old.colorbar_cid = None - if mpl.__version__ < "3.3": - cid = mappable.callbacksSM.connect( - "changed", cbar.on_mappable_changed - ) - elif mpl.__version__ < "3.5": - cid = mappable.callbacksSM.connect( - "changed", cbar.update_normal - ) - else: - cid = mappable.callbacks.connect( - "changed", cbar.update_normal - ) - mappable.colorbar = cbar - mappable.colorbar_cid = cid - cbar.update_normal(cbar.mappable) - if mpl_version <= 3.5: - cbar.draw_all() - - def remove(self, positions="all"): - import matplotlib.pyplot as plt - - def try2remove(cbar): - try: - cbar.remove() - except KeyError: - # the colorbar has been removed already from some other - # Cbar instance - pass - - if positions == "all": - positions = self.cbars.keys() - positions = set(positions).intersection(self.cbars.keys()) - if not positions: - return - adjustment = {} - to_adjust = {"fr": "right", "fl": "left", "ft": "top", "fb": "bottom"} - for pos in positions: - cbar = self.cbars.pop(pos) - if pos in ["sh", "sv"]: - plt.close(cbar.ax.get_figure()) - else: - # set the axes for the mappable if this has been removed - mappable = cbar.mappable - delaxes = not hasattr(mappable, "axes") - if getattr(mappable, "axes", None) is None: - mappable.axes = self.plotter.ax - try2remove(cbar) - if delaxes: - del mappable.axes - else: - mappable.axes = None - else: - try2remove(cbar) - if pos in to_adjust: - adjustment[to_adjust[pos]] = mpl.rcParams[ - "figure.subplot." + to_adjust[pos] - ] - if adjustment: - self.ax.get_figure().subplots_adjust(**adjustment) - if self.figure_positions.intersection(positions): - self.ax.set_position(self.original_position) - return - - def draw_colorbar(self, pos): - import matplotlib.pyplot as plt - - # TODO: Manage to draw colorbars left and top (gridspec does not work) - orientations = { - # 'b': 'bottom', 'r': 'right', 'l': 'left', 't': 'top', - "b": "horizontal", - "r": "vertical", - "fr": "vertical", - "fl": "vertical", - "sv": "vertical", - "ft": "horizontal", - "fb": "horizontal", - "sh": "horizontal", - } - - orientation = orientations[pos] - kwargs = self._kwargs.copy() - if pos in ["b", "r", "l", "t"]: - fig = self.ax.get_figure() - # kwargs = {'ax': self.ax, 'location': orientation} - kwargs.update({"ax": self.ax, "orientation": orientation}) - elif pos == "sh": - fig = plt.figure(figsize=(8, 1)) - kwargs.update({"cax": fig.add_axes([0.05, 0.5, 0.9, 0.3])}) - self.plotter._figs2draw.add(fig) # add figure for drawing - elif pos == "sv": - fig = plt.figure(figsize=(1, 8)) - kwargs.update({"cax": fig.add_axes([0.3, 0.05, 0.3, 0.9])}) - self.plotter._figs2draw.add(fig) # add figure for drawing - else: - fig = self.ax.get_figure() - if pos == "fb": - fig.subplots_adjust(bottom=0.2) - kwargs["cax"] = fig.add_axes( - [0.125, 0.135, 0.775, 0.05], - label=self.raw_data.psy.arr_name + "_fb", - ) - elif pos == "fr": - fig.subplots_adjust(right=0.8) - kwargs["cax"] = fig.add_axes( - [0.825, 0.25, 0.035, 0.6], - label=self.raw_data.psy.arr_name + "_fr", - ) - elif pos == "fl": - fig.subplots_adjust(left=0.225) - kwargs["cax"] = fig.add_axes( - [0.075, 0.25, 0.035, 0.6], - label=self.raw_data.psy.arr_name + "_fl", - ) - elif pos == "ft": - fig.subplots_adjust(top=0.75) - kwargs["cax"] = fig.add_axes( - [0.125, 0.825, 0.775, 0.05], - label=self.raw_data.psy.arr_name + "_ft", - ) - if float(".".join(mpl.__version__.split(".")[:2])) <= 3.2: - kwargs["extend"] = self.extend.value - if "location" not in kwargs: - kwargs["orientation"] = orientation - if mpl.__version__.startswith("3.5.0"): - from matplotlib.contour import ContourSet - - if kwargs.get("orientation") == "horizontal" and isinstance( - self.plot.mappable, ContourSet - ): - warn( - "Horizontal colorbars are not possible for contour plots " - "with matplotlib 3.5.0, see " - "https://github.com/matplotlib/matplotlib/issues/21683" - ) - kwargs.pop("orientation") - self.cbars[pos] = cbar = fig.colorbar(self.plot.mappable, **kwargs) - self._just_drawn.add(cbar) - self.set_label_pos(pos) - - def set_label_pos(self, pos): - ax = self.cbars[pos].ax - if pos == "fl": - # draw tick labels left - ax.tick_params("y", labelleft=True, labelright=False) - ax.yaxis.set_label_position("left") - ax.yaxis.tick_left() - elif pos == "ft": - # draw ticklabels at the top - ax.tick_params("x", labeltop=True, labelbottom=False) - ax.xaxis.set_label_position("top") - ax.xaxis.tick_top() - elif pos == "r": - # draw ticklabels on the right - ax.tick_params("y", labelleft=False, labelright=True) - ax.yaxis.set_label_position("right") - ax.yaxis.tick_right() - - def finish_update(self): - # Set the label position again in case this has been changed - for pos, cbar in self.cbars.items(): - self.set_label_pos(pos) - self._just_drawn.clear() - - -class CLabel(TextBase, Formatoption): - """ - Show the colorbar label - - Set the label of the colorbar. - %(replace_note)s - - Possible types - -------------- - str - The title for the :meth:`~matplotlib.colorbar.Colorbar.set_label` - method. - - See Also - -------- - clabelsize, clabelweight, clabelprops""" - - children = ["plot"] - - dependencies = ["cbar"] - - name = "Colorbar label" - - data_dependent = True - - group = "labels" - - axis_locations = { - "b": "x", - "r": "y", - "l": "y", - "t": "x", # axes locations - "fr": "y", - "fl": "y", - "sv": "y", # vertical figure cbars - "ft": "x", - "fb": "x", - "sh": "x", - } # horizontal figure cbars - - def update(self, value): - arr = self.plot.data - self.texts = [] - for pos, cbar in six.iteritems(self.cbar.cbars): - cbar.set_label( - self.replace(value, arr, attrs=self.get_enhanced_attrs(arr)) - ) - self.texts.append( - getattr(cbar.ax, self.axis_locations[pos] + "axis").get_label() - ) - - -class VCLabel(CLabel): - """ - Show the colorbar label of the vector plot - - Set the label of the colorbar. - %(replace_note)s - - Possible types - -------------- - str - The title for the :meth:`~matplotlib.colorbar.Colorbar.set_label` - method. - - See Also - -------- - vclabelsize, vclabelweight, vclabelprops""" - - pass - - -class CbarOptions(Formatoption): - """Base class for colorbar formatoptions""" - - which = "major" - - children = ["plot"] - - dependencies = ["cbar"] - - @property - def colorbar(self): - try: - return self._colorbar - except AttributeError: - try: - pos, cbar = next(six.iteritems(self.cbar.cbars)) - except StopIteration: - raise AttributeError("No colorbar set") - self.position = pos - self.colorbar = cbar - return self.colorbar - - @colorbar.setter - def colorbar(self, cbar): - self._colorbar = cbar - - @property - def axis(self): - """axis of the colorbar with the ticks. Will be overwritten during - update process.""" - return getattr( - self.colorbar.ax, self.axis_locations[self.position] + "axis" - ) - - @property - def axisname(self): - return self.axis_locations[self.position] - - @property - def data(self): - try: - return self.plot.data - except AttributeError: - return super().data - - axis_locations = CLabel.axis_locations - - def update(self, value): - for pos, cbar in six.iteritems(self.cbar.cbars): - self.colorbar = cbar - self.position = pos - self.update_axis(value) - - -@docstrings.get_sections(base="CTicks") -class CTicks(CbarOptions, TicksBase): - """ - Specify the tick locations of the colorbar - - Possible types - -------------- - None - use the default ticks - %(DataTicksCalculator.possible_types)s - bounds - let the :attr:`bounds` keyword determine the ticks. An - additional integer `i` may be specified to only use every i-th - bound as a tick (see also `int` below) - midbounds - Same as `bounds` but in the middle between two bounds - int - Specifies how many ticks to use with the ``'bounds'`` option. I.e. if - integer ``i``, then this is the same as ``['bounds', i]``. - - See Also - -------- - cticklabels - """ - - dependencies = CbarOptions.dependencies + ["bounds"] - - connections = CbarOptions.connections + ["cmap"] - - name = "Colorbar ticks" - - _default_locator = None - - @property - def default_locator(self): - """Default locator of the axis of the colorbars""" - if self._default_locator is None: - self.set_default_locators() - return self._default_locator - - @default_locator.setter - def default_locator(self, locator): - self._default_locator = locator - - def __init__(self, *args, **kwargs): - super(CTicks, self).__init__(*args, **kwargs) - self.calc_funcs["bounds"] = self._bounds_ticks - self.calc_funcs["midbounds"] = self._mid_bounds_ticks - - def set_ticks(self, value): - self.ticks = value - self.colorbar.set_ticks(value) - - def _bounds_ticks(self, step=None, *args, **kwargs): - step = step or 1 - return self.bounds.bounds[::step] - - def _mid_bounds_ticks(self, step=None, *args, **kwargs): - step = step or 1 - ret = 0.5 * (self.bounds.bounds[1:] + self.bounds.bounds[:-1]) - return ret[::step] - - def update(self, value): - # reset the locators if the colorbar has been drawn from scratch - if self.cbar._just_drawn or ( - not self.plotter.has_changed(self.key) and self.value is None - ): - if self.cbar.cbars: - try: - del self._colorbar - except AttributeError: - pass - self.set_default_locators() - super(CTicks, self).update(value) - - def update_axis(self, value): - cbar = self.colorbar - if value is None: - cbar.locator = self.default_locator - cbar.formatter = self.default_formatter - cbar.update_ticks() - else: - TicksBase.update_axis(self, value) - - def set_default_locators(self, *args, **kwargs): - try: - cbar = self.colorbar - except AttributeError: - pass - else: - self.default_locator = cbar.locator - self.default_formatter = cbar.formatter - - def get_fmt_widget(self, parent, project): - """Open a :class:`psy_simple.widget.CMapFmtWidget`""" - from psy_simple.widgets.colors import CTicksFmtWidget - - return CTicksFmtWidget(parent, self, project) - - -class VectorCTicks(CTicks): - """ - Specify the tick locations of the vector colorbar - - Possible types - -------------- - %(CTicks.possible_types)s - - See Also - -------- - cticklabels, vcticklabels - """ - - dependencies = CTicks.dependencies + ["color"] - - @property - def array(self): - arr = self.color._color_array - return arr[~np.isnan(arr)] - - -class CTickLabels(CbarOptions, TickLabelsBase): - """ - Specify the colorbar ticklabels - - Possible types - -------------- - %(TickLabelsBase.possible_types)s - - See Also - -------- - cticks, cticksize, ctickweight, ctickprops - vcticks, vcticksize, vctickweight, vctickprops - """ - - name = "Colorbar ticklabels" - - @property - def default_formatters(self): - """Default locator of the axis of the colorbars""" - if self._default_formatters: - return self._default_formatters - else: - self.set_default_formatters() - return self._default_formatters - - @default_formatters.setter - def default_formatters(self, d): # d is expected to be a dictionary - self._default_formatters = d - - def set_default_formatters(self): - if self.cbar.cbars: - self.default_formatters = {self.which: self.colorbar.formatter} - - def set_formatter(self, formatter): - cbar = self.colorbar - cbar.formatter = formatter - cbar.update_ticks() - - -class CTickSize(CbarOptions, TickSizeBase): - """ - Specify the font size of the colorbar ticklabels - - Possible types - -------------- - %(fontsizes)s - - See Also - -------- - ctickweight, ctickprops, cticklabels, cticks - vctickweight, vctickprops, vcticklabels, vcticks""" - - group = "colors" - - name = "Font size of the colorbar ticklabels" - - dependencies = CbarOptions.dependencies + ["ctickprops"] - - -class CTickWeight(CbarOptions, TickWeightBase): - """ - Specify the fontweight of the colorbar ticklabels - - Possible types - -------------- - %(fontweights)s - - See Also - -------- - cticksize, ctickprops, cticklabels, cticks - vcticksize, vctickprops, vcticklabels, vcticks""" - - group = "colors" - - name = "Font weight of the colorbar ticklabels" - - dependencies = CbarOptions.dependencies + ["ctickprops"] - - -class CTickProps(CbarOptions, TickPropsBase): - """ - Specify the font properties of the colorbar ticklabels - - Possible types - -------------- - %(TickPropsBase.possible_types)s - - See Also - -------- - cticksize, ctickweight, cticklabels, cticks - vcticksize, vctickweight, vcticklabels, vcticks""" - - children = CbarOptions.children + TickPropsBase.children - - group = "colors" - - name = "Font properties of the colorbar ticklabels" - - def update_axis(self, value): - value = value.copy() - default = self.default - if "major" in default or "minor" in default: - default = default.get(self.which, {}) - for key, val in chain( - default.items(), - mpl.rcParams.find_all( - self.axisname + r"tick\.%s\.\w" % self.which - ).items(), - ): - value.setdefault(key.split(".")[-1], val) - - if float(".".join(mpl.__version__.split(".")[:2])) >= 1.5: - value.pop("visible", None) - posnames = ( - ["top", "bottom"] if self.axisname == "x" else ["left", "right"] - ) - label_positions = dict( - zip( - map("label{}".format, posnames), - ( - [True, False] - if self.position in ["t", "ft", "l", "fl"] - else [False, True] - ), - ) - ) - label_positions.update(**value) - self.colorbar.ax.tick_params( - self.axisname, which=self.which, reset=True, **label_positions - ) - - -class ArrowSize(Formatoption): - """ - Change the size of the arrows - - Possible types - -------------- - None - make no scaling - float - Factor scaling the size of the arrows - - See Also - -------- - arrowstyle, linewidth, density, color""" - - group = "vector" - - priority = BEFOREPLOTTING - - dependencies = ["plot"] - - name = "Size of the arrows" - - def update(self, value): - kwargs = self.plot._kwargs - if self.plot.value == "stream": - kwargs.pop("scale", None) - kwargs["arrowsize"] = value or 1.0 - else: - kwargs.pop("arrowsize", None) - kwargs["scale"] = value - - -class ArrowStyle(Formatoption): - """Change the style of the arrows - - Possible types - -------------- - str - Any arrow style string (see - :class:`~matplotlib.patches.FancyArrowPatch`) - - Notes - ----- - This formatoption only has an effect for stream plots - - See Also - -------- - arrowsize, linewidth, density, color""" - - group = "vector" - - priority = BEFOREPLOTTING - - dependencies = ["plot"] - - name = "Style of the arrows" - - def update(self, value): - if self.plot.value == "stream": - self.plot._kwargs["arrowstyle"] = value - else: - self.plot._kwargs.pop("arrowstyle", None) - - -@docstrings.get_sections(base="WindCalculator") -class VectorCalculator(Formatoption): - """ - Abstract formatoption that provides calculation functions for speed, etc. - - Possible types - -------------- - string {'absolute', 'u', 'v'} - Strings may define how the formatoption is calculated. Possible strings - are - - - **absolute**: for the absolute wind speed - - **u**: for the u component - - **v**: for the v component - """ - - dependencies = ["plot", "transpose"] - - priority = BEFOREPLOTTING - - data_dependent = True - - def __init__(self, *args, **kwargs): - super(VectorCalculator, self).__init__(*args, **kwargs) - self._calc_funcs = { - "absolute": self._calc_speed, - "u": self._get_u, - "v": self._get_v, - } - - def _maybe_ravel(self, arr): - if ( - getattr(self, "transpose", None) is not None - and self.transpose.value - ): - arr = arr.T - if self.plot.value == "quiver": - return np.ravel(arr) - return np.asarray(arr) - - def _calc_speed(self, scale=1.0): - data = self.plot.data - return ( - self._maybe_ravel( - np.sqrt(data[0].values ** 2 + data[1].values ** 2) - ) - * scale - ) - - def _get_u(self, scale=1.0): - return self._maybe_ravel(self.plot.data[0].values) * scale - - def _get_v(self, scale=1.0): - return self._maybe_ravel(self.plot.data[1].values) * scale - - -class VectorLineWidth(VectorCalculator): - """ - Change the linewidth of the arrows - - Possible types - -------------- - float - give the linewidth explicitly - %(WindCalculator.possible_types)s - tuple (string, float) - `string` may be one of the above strings, `float` may be a scaling - factor - 2D-array - The values determine the linewidth for each plotted arrow. Note that - the shape has to match the one of u and v. - - See Also - -------- - arrowsize, arrowstyle, density, color""" - - name = "Linewidth of the arrows" - - def update(self, value): - if value is None: - self.plot._kwargs["linewidth"] = ( - 0 if self.plot.value == "quiver" else None - ) - elif np.asarray(value).ndim and isinstance(value[0], six.string_types): - self.plot._kwargs["linewidth"] = self._calc_funcs[value[0]]( - *value[1:] - ) - else: - self.plot._kwargs["linewidth"] = self._maybe_ravel(value) - - -class VectorColor(VectorCalculator): - """ - Set the color for the arrows - - This formatoption can be used to set a single color for the vectors or - define the color coding - - Possible types - -------------- - float - Determines the greyness - color - Defines the same color for all arrows. The string can be either a html - hex string (e.g. '#eeefff'), a single letter (e.g. 'b': blue, - 'g': green, 'r': red, 'c': cyan, 'm': magenta, 'y': yellow, 'k': black, - 'w': white) or any other color - %(WindCalculator.possible_types)s - 2D-array - The values determine the color for each plotted arrow. Note that - the shape has to match the one of u and v. - - See Also - -------- - arrowsize, arrowstyle, density, linewidth""" - - dependencies = VectorCalculator.dependencies + ["cmap", "bounds"] - - group = "colors" - - name = "Color of the arrows" - - def update(self, value): - try: - value = validate_color(value) - self.colored = False - except ValueError: - if ( - isinstance(value, six.string_types) - and value in self._calc_funcs - ): - value = self._calc_funcs[value]() - self.colored = True - self._color_array = value - else: - try: - value = validate_float(value) - self.colored = False - except ValueError: - value = self._maybe_ravel(value) - self.colored = True - self._color_array = value - if self.plot.value == "quiver" and self.colored: - self.plot._args = [value] - self.plot._kwargs.pop("color", None) - else: - self.plot._args = [] - self.plot._kwargs["color"] = value - if self.colored: - self._set_cmap() - else: - self._delete_cmap() - - def _set_cmap(self): - if self.plotter.has_changed(self.key) or self.plotter._initializing: - self.bounds.update(self.bounds.value) - self.plot._kwargs["cmap"] = get_cmap( - self.cmap.value, len(self.bounds.bounds) - 1 or None - ) - self.plot._kwargs["norm"] = self.bounds.norm - - def _delete_cmap(self): - self.plot._kwargs.pop("cmap", None) - self.plot._kwargs.pop("norm", None) - - -@docstrings.get_sections(base="Density") -class Density(Formatoption): - """ - Change the density of the arrows - - Possible types - -------------- - float - Scales the density of the arrows in x- and y-direction (1.0 means - no scaling) - tuple (x, y) - Defines the scaling in x- and y-direction manually - - Notes - ----- - quiver plots do not support density scaling - """ - - dependencies = ["plot"] - - group = "vector" - - name = "Density of the arrows" - - priority = BEFOREPLOTTING - - data_dependent = True - - def __init__(self, *args, **kwargs): - super(Density, self).__init__(*args, **kwargs) - self._density_funcs = { - "stream": self._set_stream_density, - "quiver": self._set_quiver_density, - } - self._remove_funcs = { - "stream": self._unset_stream_density, - "quiver": self._unset_quiver_density, - } - - def update(self, value): - has_changed = self.plotter.has_changed(self.plot.key) - if has_changed: - self.remove(has_changed[0]) - try: - value = tuple(value) - except TypeError: - value = [value, value] - if self.plot.value: - self._density_funcs[self.plot.value](value) - - def _set_stream_density(self, value): - return - self.plot._kwargs["density"] = value - - def _set_quiver_density(self, value): - if any(val != 1.0 for val in value): - warn( - "[%s] - Quiver plot does not support the density " - "keyword!" % self.logger.name, - RuntimeWarning, - ) - - def _unset_stream_density(self): - self.plot._kwargs.pop("density", None) - - def _unset_quiver_density(self): - pass - - def remove(self, plot_type=None): - plot_type = plot_type or self.plot.value - self._remove_funcs[plot_type]() - - -class VectorPlot(Formatoption): - """ - Choose the vector plot type - - Possible types - -------------- - str - Plot types can be either - - quiver - to make a quiver plot - stream - to make a stream plot""" - - plot_fmt = True - - group = "plotting" - - name = "Plot type of the arrows" - - priority = BEFOREPLOTTING - - children = ["cmap", "bounds"] - - connections = [ - "transpose", - "transform", - "arrowsize", - "arrowstyle", - "density", - "linewidth", - "color", - ] - - @property - def format_coord(self): - """The function that can replace the axes.format_coord method""" - return format_coord_func(self.ax, weakref.ref(self)) - - @property - def mappable(self): - """The mappable, i.e. the container of the plot""" - if self.value == "stream": - return self._plot.lines - else: - return self._plot - - @property - def xcoord(self): - """The x coordinate :class:`xarray.Variable`""" - v = next(self.raw_data.psy.iter_base_variables) - return self.decoder.get_x(v, coords=self.data.coords) - - @property - def ycoord(self): - """The y coordinate :class:`xarray.Variable`""" - v = next(self.raw_data.psy.iter_base_variables) - return self.decoder.get_y(v, coords=self.data.coords) - - def __init__(self, *args, **kwargs): - Formatoption.__init__(self, *args, **kwargs) - self._plot_funcs = { - "quiver": self._quiver_plot, - "stream": self._stream_plot, - } - self._orig_format_coord = None - self._args = [] - self._kwargs = {} - - @property - def array(self): - return self.data.values - - def update(self, value): - pass - # the real plot making is done by make_plot but we store the value here - # in case it is shared - - def make_plot(self): - # remove the plot if it shall be replotted or any of the dependencies - # changed. Otherwise there is nothing to change - if hasattr(self, "_plot") and ( - self.plotter.replot - or any( - self.plotter.has_changed(key) - for key in chain( - self.connections, self.dependencies, [self.key] - ) - ) - ): - self.remove() - if not hasattr(self, "_plot") and self.value is not None: - self._plot_funcs[self.value]() - if self._orig_format_coord is None: - self._orig_format_coord = self.ax.format_coord - self.ax.format_coord = self.format_coord - - def _quiver_plot(self): - x, y, u, v = self._get_data() - self._plot = self.ax.quiver( - x, y, u, v, *self._args, rasterized=True, **self._kwargs - ) - - def _stream_plot(self): - x, y, u, v = self._get_data() - dx = (x[-1] - x[0]) / (len(x) - 1) - dy = (y[-1] - y[0]) / (len(y) - 1) - if not np.allclose(np.diff(x), dx): - warn("Rescaling x to be equally spaced!", PsyPlotRuntimeWarning) - x = x[0] + np.zeros_like(x) + (np.arange(len(x)) * dx) - if not np.allclose(np.diff(y), dy): - warn("Rescaling y to be equally spaced!", PsyPlotRuntimeWarning) - y = y[0] + np.zeros_like(y) + (np.arange(len(y)) * dy) - if not (np.diff(y) > 0).all(): - assert u.shape == v.shape == (y.size, x.size) - y = y[::-1] - u = u[::-1] - v = v[::-1] - if not (np.diff(x) > 0).all(): - assert u.shape == v.shape == (y.size, x.size) - x = x[::-1] - u = u[..., ::-1] - v = v[..., ::-1] - self._plot = self.ax.streamplot(x, y, u, v, **self._kwargs) - - def _get_data(self): - data = self.data - if self.transpose.value: - u = data[0].T.values - v = data[1].T.values - else: - u, v = data.values - x = self.transpose.get_x(data) - y = self.transpose.get_y(data) - return np.asarray(x), np.asarray(y), u, v - - def remove(self): - def keep(x): - return not isinstance(x, mpl.patches.FancyArrowPatch) - - if not hasattr(self, "_plot"): - return - if isinstance(self._plot, mpl.streamplot.StreamplotSet): - try: - self._plot.lines.remove() - except ValueError: - pass - # remove arrows - for patch in list(self.ax.patches): - if not keep(patch): - patch.remove() - else: - try: - self._plot.remove() - except ValueError: # the artist has already been removed - pass - del self._plot - - def add2format_coord(self, x, y): - """Additional information for the :meth:`format_coord`""" - u, v = self.data - uname, vname = self.data.coords["variable"].values - xcoord = self.xcoord - ycoord = self.ycoord - if self.decoder.is_unstructured(self.raw_data[0]): - x, y, z1, z2 = self.get_xyz_tri(xcoord, x, ycoord, y, u, v) - elif xcoord.ndim == 1: - x, y, z1, z2 = self.get_xyz_1d(xcoord, x, ycoord, y, u, v) - elif xcoord.ndim == 2: - x, y, z1, z2 = self.get_xyz_2d(xcoord, x, ycoord, y, u, v) - speed = (z1**2 + z2**2) ** 0.5 - xunit = xcoord.attrs.get("units", "") - if xunit: - xunit = " " + xunit - yunit = ycoord.attrs.get("units", "") - if yunit: - yunit = " " + yunit - zunit = u.attrs.get("units", "") - if zunit: - zunit = " " + zunit - return ( - ", vector data: %s: %.4g%s, %s: %.4g%s, %s: %.4g%s, " - "%s: %.4g%s, absolute: %.4g%s" - ) % ( - xcoord.name, - x, - xunit, - ycoord.name, - y, - yunit, - uname, - z1, - zunit, - vname, - z2, - zunit, - speed, - zunit, - ) - - def get_xyz_tri(self, xcoord, x, ycoord, y, u, v): - """Get closest x, y and z for the given `x` and `y` in `data` for - 1d coords""" - return self.get_xyz_2d(xcoord, x, ycoord, y, u, v) - - def get_xyz_1d(self, xcoord, x, ycoord, y, u, v): - """Get closest x, y and z for the given `x` and `y` in `data` for - 1d coords""" - xclose = xcoord.indexes[xcoord.name].get_loc(x, method="nearest") - yclose = ycoord.indexes[ycoord.name].get_loc(y, method="nearest") - uval = u[yclose, xclose].values - vval = v[yclose, xclose].values - return xcoord[xclose].values, ycoord[yclose].values, uval, vval - - def get_xyz_2d(self, xcoord, x, ycoord, y, u, v): - """Get closest x, y and z for the given `x` and `y` in `data` for - 2d coords""" - xy = xcoord.values.ravel() + 1j * ycoord.values.ravel() - dist = np.abs(xy - (x + 1j * y)) - imin = np.nanargmin(dist) - xy_min = xy[imin] - return ( - xy_min.real, - xy_min.imag, - u.values.ravel()[imin], - v.values.ravel()[imin], - ) - - -class SimpleVectorPlot(VectorPlot): - # disable the stream plot for unstructured grids because it is not supported - # for 1d arrays and for circumpolar grids because 2d coordinates are not - # supported - - __doc__ = VectorPlot.__doc__ - - def set_value(self, value, *args, **kwargs): - if value == "stream" and self.raw_data is not None: - u = self.raw_data[0] - if u.psy.decoder.is_unstructured(u): - warn( - "[%s] - Streamplot is not supported for unstructured " - "grids!" % self.logger.name - ) - value = "quiver" - elif u.psy.decoder.is_circumpolar(u): - warn( - "[%s] - Streamplot is not supported for circumpolar " - "grids!" % self.logger.name - ) - value = "quiver" - super(SimpleVectorPlot, self).set_value(value, *args, **kwargs) - - -class CombinedVectorPlot(VectorPlot): - __doc__ = VectorPlot.__doc__ - - def update(self, *args, **kwargs): - self._kwargs["zorder"] = 2 - super(CombinedVectorPlot, self).update(*args, **kwargs) - - -class VectorCbar(Cbar): - """ - Specify the position of the vector plot colorbars - - Possible types - -------------- - %(Cbar.possible_types)s - """ - - dependencies = Cbar.dependencies + ["color"] - - priority = END - - def update(self, *args, **kwargs): - if self.color.colored: - super(VectorCbar, self).update(*args, **kwargs) - else: - self.remove() - - -class VectorBounds(Bounds): - """ - Specify the boundaries of the vector colorbar - - Possible types - -------------- - %(Bounds.possible_types)s - - Examples - -------- - %(Bounds.examples)s - - See Also - -------- - %(Bounds.see_also)s""" - - parents = ["color"] - - @property - def array(self): - arr = self.color._color_array - return arr[~np.isnan(arr)] - - def update(self, *args, **kwargs): - if not self.color.colored: - return - return super(VectorBounds, self).update(*args, **kwargs) - - -class LegendLabels(Formatoption, TextBase): - """ - Set the labels of the arrays in the legend - - This formatoption specifies the labels for each array in the legend. - %(replace_note)s - - Possible types - -------------- - str: - A single string that shall be used for all arrays. - list of str: - Same as a single string but specified for each array - - See Also - -------- - legend""" - - data_dependent = True - - name = "Labels in the legend" - - def update(self, value): - def get1d(arr): - if arr.ndim > 1: - return arr[0] - return arr - - if isinstance(value, six.string_types): - self.labels = [ - self.replace( - value, - arr, - self.get_enhanced_attrs(get1d(arr), replot=True), - ) - for arr in self.iter_data - ] - else: - self.labels = [ - self.replace( - val, arr, self.get_enhanced_attrs(get1d(arr), replot=True) - ) - for val, arr in zip(value, self.iter_data) - ] - - -class Legend(DictFormatoption): - """ - Draw a legend - - This formatoption determines where and if to draw the legend. It uses the - :attr:`labels` formatoption to determine the labels. - - Possible types - -------------- - bool - Draw a legend or not - str or int - Specifies where to plot the legend (i.e. the location) - dict - Give the keywords for the :func:`matplotlib.pyplot.legend` function - - See Also - -------- - labels""" - - dependencies = ["legendlabels", "plot", "color", "marker"] - - name = "Properties of the legend" - - def update(self, value): - self.remove() - shared_by = self.shared_by - if shared_by is not None: - # update the legend of the other formatoption instead of this one - if not shared_by.plotter._updating: - shared_by.update(shared_by.value) - return - if not value.get("loc"): - return - artists = [] - labels = [] - for fmto in self.shared.union([self]): - if hasattr(fmto.plot, "_plot"): - this_artists, this_labels = fmto.get_artists_and_labels() - artists.extend(this_artists) - labels.extend(this_labels) - self.legend = self.ax.legend(artists, labels, **value) - - def get_artists_and_labels(self): - return self.plot._plot, [ - label - for label, ls in zip( - self.legendlabels.labels, cycle(slist(self.plot.value)) - ) - if ls is not None - ] - - def remove(self): - if hasattr(self, "legend"): - self.legend.remove() - - -class MeanCalculator(Formatoption): - """ - Determine how the error is visualized - - Possible types - -------------- - 'mean' - Calculate the weighted mean - 'median' - Calculate the weighted median (i.e. the 50th percentile) - float between 0 and 100 - Calculate the given quantile - - See Also - -------- - err_calc: Determines how to calculate the error - """ - - priority = START - - name = "Mean calculation" - - group = "data" - - data_dependent = True - - requires_replot = True - - def update(self, value): - for i, arr in enumerate(self.iter_data): - if value == "mean": - data = arr.psy.fldmean() - elif value == "median": - data = arr.psy.fldpctl(50) - else: - data = arr.psy.fldpctl(value) - data.psy.arr_name = arr.psy.arr_name - self.set_data(data, i) - - -class ErrorCalculator(Formatoption): - """ - Calculation of the error - - This formatoption is used to calculate the error range. - - Possible types - -------------- - None - Do not calculate any error range - float - A float between 0 and 50. This will represent the distance from the - median (i.e. the 50th percentile). A value of 45 will hence correspond - to the 5th and 95th percentile - list of 2 floats between 0 and 100 - Two floats where the first corresponds to the minimum and the second - to the maximum percentile - str - A string with 'std' in it. Then we will use the standard deviation. Any - number in this string, e.g. '3.5std' will serve as a multiplier - (in this case 3.5 times the standard deviation). - - See Also - -------- - mean: Determines how the line is calculated - """ - - priority = START - - name = "Mean calculation" - - group = "data" - - children = ["mean"] - - data_dependent = True - - requires_replot = True - - def update(self, value): - if value is None: - return - if isstring(value): - use_std = True - m = re.search(r"\d+\.?\d*", value) - if m: - multiplier = float(m.group()) - else: - multiplier = 1 - else: - use_std = False - for i, (arr, mean) in enumerate( - zip(self.iter_raw_data, self.iter_data) - ): - mean = mean.to_dataset() - if use_std: - err = multiplier * arr.psy.fldstd() - mean[value] = err.variable - data = mean[[arr.name, value]].psy.to_array() - else: - err = arr.psy.fldpctl(value) - names = list(map("pctl{:1.3g}".format, value)) - mean[names[0]] = err.variable[0] - mean[names[1]] = err.variable[1] - data = mean[[arr.name] + names].psy.to_array() - data.psy.arr_name = arr.psy.arr_name - data.attrs.update(arr.attrs) - data.name = arr.name - self.set_data(data, i) - - -docstrings.delete_types("LimitBase.possible_types", "no_None", "None") - - -class Hist2DXRange(LimitBase): - """ - Specify the range of the histogram for the x-dimension - - This formatoption specifies the minimum and maximum of the histogram - in the x-dimension - - Possible types - -------------- - %(LimitBase.possible_types.no_None)s - - Notes - ----- - This formatoption always acts on the coordinate, no matter what the - value of the :attr:`transpose` formatoption is - - See also - -------- - yrange""" - - priority = START - - group = "data" - - name = "Range of the histogram in x-direction" - - data_dependent = True - - dependencies = ["coord"] - - @property - def array(self): - # We don't use the :attr:`data` attribute because this fails if the - # formatoption is shared and the ``coord`` formatoption is not None - if self.coord.value is not None: - coord = self.coord.get_alternative_coord( - self.raw_data, self.index_in_list or 0 - )[1].values - else: - da = self.raw_data - coord = da.coords[da.dims[0]].values - ret = coord[~np.isnan(coord)] - return ret - - def set_limit(self, *args): - self.range = args - - -class Hist2DYRange(Hist2DXRange): - """ - Specify the range of the histogram for the x-dimension - - This formatoption specifies the minimum and maximum of the histogram - in the x-dimension - - Possible types - -------------- - %(LimitBase.possible_types.no_None)s - - Notes - ----- - This formatoption always acts on the DataArray, no matter what the - value of the :attr:`transpose` formatoption is - - See Also - -------- - xrange""" - - name = "Range of the histogram in y-direction" - - data_dependent = True - - @property - def array(self): - return np.asarray(self.raw_data)[np.asarray(self.raw_data.notnull())] - - -class DataPrecision(Formatoption): - """ - Set the precision of the data - - This formatoption can be used to specify the precision of the data which - then will be the minimal bin width of the 2D histogram or the bandwith of - the kernel size (if the :attr:`density` formatoption is set to ``'kde'``) - - Possible types - -------------- - float - If 0, this formatoption has no effect at all. Otherwise it is assumed - to be the precision of the data - str - One of ``{'scott' | 'silverman'}``. This uses the statsmodels package - to estimate the bandwidth of the data that is then used in the - histogram or KDE plot""" - - priority = START - - dependencies = ["xrange", "yrange"] - - connections = ["density"] - - group = "data" - - name = "Precision of the visualized data" - - data_dependent = True - - def estimate_bw(self, method, values, data_range=None): - import statsmodels.nonparametric.api as smnp - - bw_func = getattr(smnp.bandwidths, "bw_" + method) - if data_range is not None: - vmin, vmax = sorted(data_range) - values = values[(values >= vmin) & (values <= vmax)] - if not len(values): - raise ValueError( - "No values found within the given range of " f"{data_range}!" - ) - return bw_func(values) - - def update(self, value): - self.bins = [0, 0] - value = slist(value) - if len(value) == 1: - value = [value[0], value[0]] - self.prec = value - for i, prec in enumerate(value): - if prec == 0: - continue - da = self.data - if i == 0: - data = da.coords[da.dims[0]].values - data = data[~np.isnan(data)] - r = self.xrange.range - else: - data = da[da.notnull()].values - r = self.yrange.range - if isstring(prec): - prec = self.prec[i] = self.estimate_bw(prec, data, r) - if r is not None: - dmin, dmax = r - else: - dmax = np.ceil(data.max().values / prec) * prec - dmin = data.min().values - self.bins[i] = max(int((dmax - dmin) / prec), 1) - - -class HistBins(Formatoption): - """ - Specify the bins of the 2D-Histogramm - - This formatoption can be used to specify, how many bins to use. In other - words, it determines the grid size of the resulting histogram or kde plot. - If however you also set the :attr:`precision` formatoption keyword then the - minimum of precision and the bins specified here will be used. - - Possible types - -------------- - int - If 0, only use the bins specified by the :attr:`precision` keyword - (raises an error if the :attr:`precision` is also set to 0), - otherwise the number of bins to use - tuple (x, y) of int - The bins for x and y explicitly - """ - - priority = START - - dependencies = ["precision"] - - group = "data" - - name = "Number of bins of the histogram" - - data_dependent = True - - def update(self, value): - self.bins = [0, 0] - try: - value = tuple(value) - except TypeError: - value = [value, value] - for i, (bins, bins_prec) in enumerate(zip(value, self.precision.bins)): - if bins == 0 and bins_prec == 0: - raise ValueError("precision and bins must not both be 0!") - elif bins == 0: - self.bins[i] = bins_prec - elif bins_prec == 0: - self.bins[i] = bins - else: - self.bins[i] = min(bins, bins_prec) - - -class NormedHist2D(Formatoption): - """ - Specify the normalization of the histogram - - This formatoption can be used to normalize the histogram. It has no effect - if the :attr:`density` formatoption is set to ``'kde'`` - - Possible types - -------------- - None - Do not make any normalization - str - One of - - counts - To make the normalization based on the total number counts - area - To make the normalization basen on the total number of counts and - area (the default behaviour of :func:`numpy.histogram2d`) - x, col, column or columns - To normalize every column - y, row or rows - To normalize every row - - See Also - -------- - density - """ - - priority = START - - name = "Specify how to normalize the histogram" - - group = "data" - - name = "Normalize the histogram" - - data_dependent = True - - def update(self, value): - pass # nothing to do here - - def hist2d(self, da, **kwargs): - """Make the two dimensional histogram - - Parameters - ---------- - da: xarray.DataArray - The data source""" - if self.value is None or self.value == "counts": - normed = False - else: - normed = True - y = da.values - x = da.coords[da.dims[0]].values - if mpl_version < 3.3: - kwargs["normed"] = normed - else: - kwargs["density"] = normed - counts, xedges, yedges = np.histogram2d(x, y, **kwargs) - if self.value == "counts": # normalize such that all values sum to one - counts = counts / counts.sum().astype(float) - elif self.value in ["x", "col", "column", "columns"]: - # normalize such that every column sums to one - counts = counts / counts.sum(axis=1, keepdims=True).astype(float) - elif self.value in ["y", "row", "rows"]: - # normalize such that every row sums to one - counts = counts / counts.sum(axis=1, keepdims=True).astype(float) - return counts, xedges, yedges - - -class PointDensity(Formatoption): - """ - Specify the method to calculate the density - - Possible types - -------------- - str - One of the following strings are possible - - hist - Make a 2D-histogram. The normalization is controlled by the - :attr:`normed` formatoption - kde - Fit a bivariate kernel density estimate to the data. Note that - this choice requires pythons [statsmodels]_ module to be - installed - - References - ---------- - .. [statsmodels] https://www.statsmodels.org - """ - - priority = START - - name = "Type of the density plot" - - dependencies = ["normed", "bins", "xrange", "yrange", "precision", "coord"] - - group = "data" - - name = "Calculation of the point density" - - data_dependent = True - - def update(self, value): - if value == "hist": - self._hist() - else: - self._kde() - - def _kde(self): - if self.coord.value is None: - raw_da = self.raw_data - else: - raw_da = self.coord.replace_coord(0) - xyranges = [self.xrange.range, self.yrange.range] - bws = self.precision.prec - grid = self.bins.bins - for i, bw in enumerate(bws): - if bw == 0: - bws[i] = "scott" - coord = raw_da.coords[raw_da.dims[0]] - xname = coord.name - yname = raw_da.name - x, y, z = self._statsmodels_bivariate_kde( - raw_da.coords[raw_da.dims[0]].values, - raw_da.values, - bws, - grid[0], - grid[1], - xyranges, - ) - xcent = xr.Variable((xname,), x, attrs=coord.attrs.copy()) - ycent = xr.Variable((yname,), y, attrs=raw_da.attrs.copy()) - var = xr.Variable( - (yname, xname), z, attrs=raw_da.psy.base.attrs.copy() - ) - ds = xr.Dataset({"counts": var}, {xname: xcent, yname: ycent}) - ds = ds.assign_coords(**self._get_other_coords(raw_da)) - self.decoder = CFDecoder(ds) - arr = ds.counts - arr.psy.init_accessor(base=ds, decoder=self.decoder) - self.data = arr - - def _statsmodels_bivariate_kde(self, x, y, bws, xsize, ysize, xyranges): - """Compute a bivariate kde using statsmodels. - This function is mainly motivated through - seaborn.distributions._statsmodels_bivariate_kde""" - import statsmodels.nonparametric.api as smnp - - for i, (coord, bw) in enumerate(zip([x, y], bws)): - if isinstance(bw, six.string_types): - bw_func = getattr(smnp.bandwidths, "bw_" + bw) - bws[i] = bw_func(coord) - kde = smnp.KDEMultivariate([x, y], "cc", bws) - x_support = np.linspace(xyranges[0][0], xyranges[0][1], xsize) - y_support = np.linspace(xyranges[1][0], xyranges[1][1], ysize) - xx, yy = np.meshgrid(x_support, y_support) - z = kde.pdf([xx.ravel(), yy.ravel()]).reshape(xx.shape) - return x_support, y_support, z - - def _hist(self): - if self.coord.value is None: - raw_da = self.raw_data - else: - raw_da = self.coord.replace_coord(0) - bins = self.bins.bins - range_ = [self.xrange.range, self.yrange.range] - z, x, y = self.normed.hist2d(raw_da, bins=bins, range=range_) - coord = raw_da.coords[raw_da.dims[0]] - xname = coord.name - yname = raw_da.name - # calculate the centers - xcent = xr.Variable( - (xname,), - np.c_[[x[:-1], x[1:]]].mean(axis=0), - attrs=coord.attrs.copy(), - ) - ycent = xr.Variable( - (yname,), - np.c_[[y[:-1], y[1:]]].mean(axis=0), - attrs=raw_da.attrs.copy(), - ) - xbounds = xr.Variable((xname, "bnds"), np.c_[[x[:-1], x[1:]]].T) - ybounds = xr.Variable((yname, "bnds"), np.c_[[y[:-1], y[1:]]].T) - xcent.attrs["bounds"] = xname + "_bnds" - ycent.attrs["bounds"] = yname + "_bnds" - var = xr.Variable( - (yname, xname), z.T, attrs=raw_da.psy.base.attrs.copy() - ) - variables = {"counts": var} - coords = { - xname: xcent, - yname: ycent, - xname + "_bnds": xbounds, - yname + "_bnds": ybounds, - } - ds = xr.Dataset(variables, coords) - ds = ds.assign_coords(**self._get_other_coords(raw_da)) - self.decoder = CFDecoder(ds) - arr = ds.counts - arr.psy.init_accessor(base=ds, decoder=self.decoder) - self.data = arr - - def _get_other_coords(self, raw_da): - return { - key: raw_da.coords[key] - for key in set(raw_da.coords).difference(raw_da.dims) - } - - -class XYTickPlotter(Plotter): - """Plotter class for x- and y-ticks and x- and y- ticklabels""" - - _rcparams_string = ["plotter.simple."] - - transpose = Transpose("transpose") - xticks = XTicks("xticks") - xticklabels = XTickLabels("xticklabels") - yticks = YTicks("yticks") - yticklabels = YTickLabels("yticklabels") - ticksize = TickSize("ticksize") - tickweight = TickWeight("tickweight") - xtickprops = XTickProps("xtickprops") - ytickprops = YTickProps("ytickprops") - xlabel = Xlabel("xlabel") - ylabel = Ylabel("ylabel") - labelsize = LabelSize("labelsize") - labelweight = LabelWeight("labelweight") - labelprops = LabelProps("labelprops") - xrotation = XRotation("xrotation") - yrotation = YRotation("yrotation") - - -class Base2D(Plotter): - """Base plotter for 2-dimensional plots""" - - _rcparams_string = ["plotter.plot2d."] - - cmap = CMap("cmap") - bounds = Bounds("bounds") - extend = Extend("extend") - cbar = Cbar("cbar") - plot = None - clabel = CLabel("clabel") - clabelsize = label_size(clabel, "Colorbar label", dependencies=["clabel"]) - clabelweight = label_weight( - clabel, "Colorbar label", dependencies=["clabel"] - ) - cbarspacing = CbarSpacing("cbarspacing") - clabelprops = label_props( - clabel, "Colorbar label", dependencies=["clabel"] - ) - cticks = CTicks("cticks") - cticklabels = CTickLabels("cticklabels") - cticksize = CTickSize("cticksize") - ctickweight = CTickWeight("ctickweight") - ctickprops = CTickProps("ctickprops") - mask_datagrid = MaskDataGrid("mask_datagrid") - datagrid = DataGrid("datagrid", index_in_list=0) - - -class SimplePlotterBase(BasePlotter, XYTickPlotter): - """Base class for all simple plotters""" - - #: The number variables that one data array visualized by this plotter - #: might have. - allowed_vars = 1 - - #: The number of allowed dimensions in the for the visualization. If - #: the array is unstructured, one dimension will be subtracted - allowed_dims = 1 - - transpose = Transpose("transpose") - axiscolor = AxisColor("axiscolor") - grid = Grid("grid") - color = LineColors("color") - xlim = Xlim("xlim") - ylim = Ylim("ylim") - sym_lims = SymmetricLimits("sym_lims") - legendlabels = LegendLabels("legendlabels") - legend = Legend("legend") - - @classmethod - @docstrings.dedent - def check_data(cls, name, dims, is_unstructured=None): - """ - A validation method for the data shape - - Parameters - ---------- - name: str or list of str - The variable names (at maximum :attr:`allowed_vars` variables per - array) - dims: list with length 1 or list of lists with length 1 - The dimension of the arrays. Only 1D-Arrays are allowed - is_unstructured: bool or list of bool, optional - True if the corresponding array is unstructured. This keyword is - ignored - - Returns - ------- - %(Plotter.check_data.returns)s - """ - if isinstance(name, six.string_types) or not is_iterable(name): - name = [name] - dims = [dims] - N = len(name) - if len(dims) != N: - return [False] * N, [ - "Number of provided names (%i) and dimensions " - "(%i) are not the same" % (N, len(dims)) - ] * N - checks = [True] * N - messages = [""] * N - for i, (n, d) in enumerate(zip(name, dims)): - if n != 0 and not n: - checks[i] = False - messages[i] = "At least one variable name is required!" - elif ( - not isstring(n) - and is_iterable(n) - and len(n) > cls.allowed_vars - ) and len(d) != (cls.allowed_dims - len(slist(n))): - checks[i] = False - messages[i] = "Only %i names are allowed per array!" % ( - cls.allowed_vars - ) - elif len(d) != cls.allowed_dims: - checks[i] = False - messages[i] = "Only %i-dimensional arrays are allowed!" % ( - cls.allowed_dims - ) - return checks, messages - - -class LinePlotter(SimplePlotterBase): - """Plotter for simple one-dimensional line plots""" - - _rcparams_string = ["plotter.line."] - - #: The number variables that one data array visualized by this plotter - #: might have. We allow up to 3 variableswhere the second and third - #: variable might be the errors (see the :attr:`error` formatoption) - allowed_vars = 3 - - coord = AlternativeXCoord("coord") - marker = Marker("marker") - markersize = MarkerSize("markersize") - linewidth = LineWidth("linewidth") - plot = LinePlot("plot") - error = ErrorPlot("error") - erroralpha = ErrorAlpha("erroralpha") - - -class ViolinPlotter(SimplePlotterBase): - """Plotter for making violin plots""" - - _rcparams_string = ["plotter.violin."] - - plot = ViolinPlot("plot") - xlim = ViolinXlim("xlim") - ylim = ViolinYlim("ylim") - xticks = ViolinXTicks("xticks") - xticklabels = ViolinXTickLabels("xticklabels") - yticks = ViolinYTicks("yticks") - yticklabels = ViolinYTickLabels("yticklabels") - - -class BarPlotter(SimplePlotterBase): - """Plotter for making bar plots""" - - _rcparams_string = ["plotter.bar."] - - coord = AlternativeXCoord("coord") - widths = BarWidths("widths") - alpha = BarAlpha("alpha") - categorical = CategoricalBars("categorical") - plot = BarPlot("plot") - xlim = BarXlim("xlim") - ylim = BarYlim("ylim") - xticks = BarXTicks("xticks") - yticks = BarYTicks("yticks") - xticklabels = BarXTickLabels("xticklabels") - yticklabels = BarYTickLabels("yticklabels") - xlabel = BarXlabel("xlabel") - ylabel = BarYlabel("ylabel") - - -class Simple2DBase(Base2D): - """Base class for :class:`Simple2DPlotter` and - :class:`psyplot.plotter.maps.FieldPlotter` that defines the data - management""" - - #: The number of allowed dimensions in the for the visualization. If - #: the array is unstructured, one dimension will be subtracted - allowed_dims = 2 - - miss_color = MissColor("miss_color", index_in_list=0) - - @classmethod - @docstrings.dedent - def check_data(cls, name, dims, is_unstructured): - """ - A validation method for the data shape - - Parameters - ---------- - name: str or list of str - The variable names (one variable per array) - dims: list with length 1 or list of lists with length 1 - The dimension of the arrays. Only 1D-Arrays are allowed - is_unstructured: bool or list of bool - True if the corresponding array is unstructured. - - Returns - ------- - %(Plotter.check_data.returns)s - """ - if isinstance(name, six.string_types) or not is_iterable(name): - name = [name] - dims = [dims] - is_unstructured = [is_unstructured] - N = len(name) - if N != 1: - return [False] * N, [ - "Number of provided names (%i) must equal 1!" % (N) - ] * N - elif len(dims) != 1: - return [False], [ - "Number of provided dimension lists (%i) must equal 1!" - % (len(dims)) - ] - elif len(is_unstructured) != 1: - return [False], [ - ( - "Number of provided unstructured information (%i) must " - "equal 1!" - ) - % (len(is_unstructured)) - ] - if name[0] != 0 and not name[0]: - return [False], ["At least one variable name must be provided!"] - # unstructured arrays have only 1 dimension - dimlen = cls.allowed_dims - if is_unstructured[0]: - dimlen -= 1 - # Check that the array is two-dimensional - # - # if more than one array name is provided, the dimensions should be - # one les than dimlen to have a 2D array - if ( - not isstring(name[0]) - and not is_iterable(name[0]) - and len(name[0]) != 1 - and len(dims[0]) != dimlen - 1 - ): - return [False], ["Only one name is allowed per array!"] - # otherwise the number of dimensions must equal dimlen - if len(dims[0]) != dimlen: - return [False], [ - "An array with dimension %i is required, not %i" - % (dimlen, len(dims[0])) - ] - return [True], [""] - - def _set_data(self, *args, **kwargs): - Plotter._set_data(self, *args, **kwargs) - if isinstance(self.data, InteractiveList): - data = self.data[0] - else: - data = self.data - ndims = self.allowed_dims - if data.psy.decoder.is_unstructured(data): - ndims -= 1 - if data.ndim != ndims: - raise ValueError( - f"Can only plot {self.allowed_dims}-dimensional " "data!" - ) - - -class Simple2DPlotter(Simple2DBase, SimplePlotterBase): - """Plotter for visualizing 2-dimensional data. - - See Also - -------- - psyplot.plotter.maps.FieldPlotter""" - - transpose = Transpose("transpose") - interp_bounds = InterpolateBounds("interp_bounds") - plot = SimplePlot2D("plot") - xticks = XTicks2D("xticks") - yticks = YTicks2D("yticks") - xlim = Xlim2D("xlim") - ylim = Ylim2D("ylim") - levels = ContourLevels("levels", cbounds="bounds") - legend = None - legendlabels = None - color = None # no need for this formatoption - - -class DensityPlotter(Simple2DPlotter): - """A plotter to visualize the density of points in a 2-dimensional grid""" - - allowed_vars = 1 - - allowed_dims = 1 - - _rcparams_string = ["plotter.density."] - - coord = AlternativeXCoord("coord") - xrange = Hist2DXRange("xrange") - yrange = Hist2DYRange("yrange") - precision = DataPrecision("precision") - bins = HistBins("bins") - normed = NormedHist2D("normed") - density = PointDensity("density") - - -class BaseVectorPlotter(Base2D): - """Base plotter for vector plots""" - - _rcparams_string = ["plotter.vector."] - - allowed_dims = 3 - - arrowsize = ArrowSize("arrowsize") - arrowstyle = ArrowStyle("arrowstyle") - density = Density("density") - color = VectorColor("color") - linewidth = VectorLineWidth("linewidth") - cbar = VectorCbar("cbar") - bounds = VectorBounds("bounds") - cticks = VectorCTicks("cticks") - datagrid = VectorDataGrid("datagrid") - - @classmethod - @docstrings.dedent - def check_data(cls, name, dims, is_unstructured): - """ - A validation method for the data shape - - Parameters - ---------- - name: str or list of str - The variable names (two variables for the array or one if the dims - are one greater) - dims: list with length 1 or list of lists with length 1 - The dimension of the arrays. Only 2D-Arrays are allowed (or 1-D if - the array is unstructured) - is_unstructured: bool or list of bool - True if the corresponding array is unstructured. - - Returns - ------- - %(Plotter.check_data.returns)s - """ - if isinstance(name, six.string_types) or not is_iterable(name): - name = [name] - dims = [dims] - is_unstructured = [is_unstructured] - N = len(name) - if N != 1: - return [False] * N, [ - "Number of provided names (%i) must equal 1!" % (N) - ] * N - elif len(dims) != 1: - return [False], [ - "Number of provided dimension lists (%i) must equal 1!" - % (len(dims)) - ] - elif len(is_unstructured) != 1: - return [False], [ - ( - "Number of provided unstructured information (%i) must " - "equal 1!" - ) - % (len(is_unstructured)) - ] - if name[0] != 0 and not name[0]: - return [False], ["Two variable names must be provided!"] - # unstructured arrays have only 1 dimension - dimlen = 1 if is_unstructured[0] else 2 - # Check that the array is two-dimensional - # - # if more than one array name is provided, the dimensions should be - # one les than dimlen to have a 2D array - if ( - ( - isstring(name[0] or not is_iterable(name[0])) - or len(name[0]) == 1 - ) - and len(dims[0]) != dimlen + 1 - ) or len(name[0]) > 2: - return [False], [ - ( - "Two variables (one for x- and one for y-direction) are " - "required!" - ) - ] - elif (isstring(name[0]) or len(name[0]) == 1) and len( - dims[0] - ) == dimlen + 1: - dimlen += 1 - # otherwise the number of dimensions must equal dimlen - if len(dims[0]) != dimlen: - return [False], [ - "An array with dimension %i is required, not %i" - % (dimlen, len(dims[0])) - ] - return [True], [""] - - def _set_data(self, *args, **kwargs): - Plotter._set_data(self, *args, **kwargs) - if isinstance(self.data, InteractiveList): - data = self.data[0] - else: - data = self.data - ndims = self.allowed_dims - if data.psy.decoder.is_unstructured(data): - ndims -= 1 - if data.ndim != ndims: - raise ValueError( - f"Can only plot {self.allowed_dims}-dimensional " "data!" - ) - - -class SimpleVectorPlotter(BaseVectorPlotter, SimplePlotterBase): - """Plotter for visualizing 2-dimensional vector data - - See Also - -------- - psyplot.plotter.maps.VectorPlotter""" - - plot = SimpleVectorPlot("plot") - xticks = XTicks2D("xticks") - yticks = YTicks2D("yticks") - xlim = Xlim2D("xlim") - ylim = Ylim2D("ylim") - legend = None - legendlabels = None - - -class ScalarCombinedBase(Plotter): - """Base plotter for combined 2-dimensional scalar field with any other - plotter""" - - _rcparams_string = ["plotter.combinedsimple."] - - # scalar plot formatoptions - cbar = Cbar("cbar", other_cbars=["vcbar"]) - cticks = CTicks("cticks") - bounds = Bounds("bounds", index_in_list=0) - - # make sure that masking options only affect the scalar field - maskless = MaskLess("maskless", index_in_list=0) - maskleq = MaskLeq("maskleq", index_in_list=0) - maskgreater = MaskGreater("maskgreater", index_in_list=0) - maskgeq = MaskGeq("maskgeq", index_in_list=0) - maskbetween = MaskBetween("maskbetween", index_in_list=0) - - -class CombinedBase(ScalarCombinedBase): - """Base plotter for combined 2-dimensional scalar and vector plot""" - - # vector plot formatoptions - color = VectorColor( - "color", plot="vplot", cmap="vcmap", bounds="vbounds", index_in_list=1 - ) - linewidth = VectorLineWidth("linewidth", plot="vplot", index_in_list=1) - arrowsize = ArrowSize("arrowsize", plot="vplot", index_in_list=1) - arrowstyle = ArrowStyle("arrowstyle", plot="vplot", index_in_list=1) - vcbar = VectorCbar( - "vcbar", - plot="vplot", - cmap="vcmap", - bounds="vbounds", - cbarspacing="vcbarspacing", - other_cbars=["cbar"], - index_in_list=1, - ) - vcbarspacing = CbarSpacing("vcbarspacing", cbar="vcbar", index_in_list=1) - vclabel = VCLabel("vclabel", plot="vplot", cbar="vcbar", index_in_list=1) - vclabelsize = label_size( - vclabel, "Vector colorbar label", dependencies=["vclabel"] - ) - vclabelweight = label_weight( - vclabel, "Vector colorbar label", dependencies=["vclabel"] - ) - vclabelprops = label_props( - vclabel, "Vector colorbar label", dependencies=["vclabel"] - ) - vcmap = CMap("vcmap", index_in_list=1, bounds="vbounds", cbar="vcbar") - vbounds = VectorBounds( - "vbounds", index_in_list=1, cmap="vcmap", cbar="vcbar" - ) - vcticks = VectorCTicks( - "vcticks", - cbar="vcbar", - plot="vplot", - bounds="vbounds", - index_in_list=1, - ) - vcticklabels = CTickLabels("vcticklabels", cbar="vcbar", index_in_list=1) - vcticksize = CTickSize( - "vcticksize", cbar="vcbar", index_in_list=1, ctickprops="vctickprops" - ) - vctickweight = CTickWeight("vctickweight", cbar="vcbar", index_in_list=1) - vctickprops = CTickProps("vctickprops", cbar="vcbar", index_in_list=1) - - @classmethod - @docstrings.dedent - def check_data(cls, name, dims, is_unstructured): - """ - A validation method for the data shape - - Parameters - ---------- - name: list of str with length 2 - The variable names (one for the first, two for the second array) - dims: list with length 2 of lists with length 1 - The dimension of the arrays. Only 2D-Arrays are allowed (or 1-D if - an array is unstructured) - is_unstructured: bool or list of bool - True if the corresponding array is unstructured. - - Returns - ------- - %(Plotter.check_data.returns)s - """ - if isinstance(name, six.string_types) or not is_iterable(name): - name = [name] - dims = [dims] - is_unstructured = [is_unstructured] - msg = ( - "Two arrays are required (one for the scalar and " - "one for the vector field)" - ) - if len(name) < 2: - return [None], [msg] - elif len(name) > 2: - return [False], [msg] - valid1, msg1 = Simple2DBase.check_data( - name[:1], dims[0:1], is_unstructured[:1] - ) - valid2, msg2 = BaseVectorPlotter.check_data( - name[1:], dims[1:], is_unstructured[1:] - ) - return valid1 + valid2, msg1 + msg2 - - def _set_data(self, *args, **kwargs): - super(CombinedBase, self)._set_data(*args, **kwargs) - # implement 2 simple checks to make sure that we get the right data - if not isinstance(self.plot_data, InteractiveList): - raise ValueError( - "Combined plots must be lists of one scalar field and a" - "vector field. Got one %s instead" % str(type(self.plot_data)) - ) - elif len(self.plot_data) < 2: - raise ValueError( - "Combined plots must be lists of one scalar field and a" - "vector field. Got a list of length %i instead!" - % len(self.plot_data) - ) - - -class CombinedSimplePlotter( - CombinedBase, Simple2DPlotter, SimpleVectorPlotter -): - """Combined 2D plotter and vector plotter - - See Also - -------- - psyplot.plotter.maps.CombinedPlotter: for visualizing the data on a map""" - - plot = Plot2D("plot", index_in_list=0) - vplot = CombinedVectorPlot( - "vplot", index_in_list=1, cmap="vcmap", bounds="vbounds" - ) - density = Density("density", plot="vplot", index_in_list=1) - - -class FldmeanPlotter(LinePlotter): - _rcparams_string = ["plotter.fldmean."] - - allowed_dims = 3 - - err_calc = ErrorCalculator("err_calc") - mean = MeanCalculator("mean") - - # We reimplement the masking formatoption to make sure, that they are - # called after the mean calculation - maskgeq = MaskGeq("maskgeq", additional_children=["err_calc"]) - maskleq = MaskLeq("maskleq", additional_children=["err_calc"]) - maskgreater = MaskGreater("maskgreater", additional_children=["err_calc"]) - maskless = MaskLess("maskless", additional_children=["err_calc"]) - maskbetween = MaskBetween("maskbetween", additional_children=["err_calc"]) - mask = Mask("mask", additional_children=["err_calc"]) - coord = AlternativeXCoordPost("coord", additional_children=["err_calc"]) diff --git a/psy_simple/plugin.py b/psy_simple/plugin.py deleted file mode 100644 index 142a0a0b..00000000 --- a/psy_simple/plugin.py +++ /dev/null @@ -1,1547 +0,0 @@ -"""psy-simple psyplot plugin - -This module defines the rcParams for the psy-simple plugin. -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import dataclasses -import enum -import re -from itertools import repeat -from warnings import warn - -import matplotlib as mpl -import numpy as np -import six -import xarray as xr -from matplotlib.patches import ArrowStyle -from matplotlib.rcsetup import ( - ValidateInStrings, - validate_bool, - validate_color, - validate_colorlist, - validate_fontsize, - validate_int, -) -from psyplot.config.rcsetup import ( - RcParams, - SubDict, - safe_list, - validate_dict, - validate_stringlist, - validate_stringset, -) - -from psy_simple import __version__ as plugin_version - - -def get_versions(requirements=True): - return {"version": plugin_version} - - -def patch_prior_1_0(plotter_d, versions): - """Patch psy_simple plotters for versions smaller than 1.0 - - Before psyplot 1.0.0, the plotters in the psy_simple package where part of - the psyplot.plotter.simple module. This has to be corrected""" - plotter_d["cls"] = ("psy_simple.plotters", plotter_d["cls"][1]) - - -#: patches to apply when loading a project -patches = { - ("psyplot.plotter.simple", "LinRegPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "DensityRegPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "ViolinPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "Simple2DPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "SimpleVectorPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "BarPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "CombinedSimplePlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "DensityPlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "LinePlotter"): patch_prior_1_0, - ("psyplot.plotter.simple", "SimplePlotterBase"): patch_prior_1_0, -} - - -bound_strings = [ - "data", - "mid", - "rounded", - "roundedsym", - "minmax", - "sym", - "log", - "symlog", -] - -tick_strings = bound_strings + [ - "hour", - "day", - "week", - "month", - "monthend", - "monthbegin", - "year", - "yearend", - "yearbegin", -] - - -class strEnum(str, enum.Enum): - pass - - -BoundsMethod = strEnum( - "BoundsMethod", zip(bound_strings, bound_strings), module=__name__ -) - - -cticks_strings = bound_strings + ["bounds", "midbounds"] - - -CTicksMethod = strEnum( - "CTicksMethod", zip(cticks_strings, cticks_strings), module=__name__ -) - -TicksMethod = strEnum( - "TicksMethod", zip(tick_strings, tick_strings), module=__name__ -) - - -@dataclasses.dataclass -class BoundsType: - method: BoundsMethod - N: int = None - percmin: float = 0 - percmax: float = 100 - vmin: float = None - vmax: float = None - - def __post_init__(self): - for field, val in zip(dataclasses.fields(self), self): - if val is not None or field.name == "method": - val = field.type(val) - setattr(self, field.name, val) - - def __iter__(self): - return iter(dataclasses.astuple(self)) - - -@dataclasses.dataclass -class CTicksType(BoundsType): - method: CTicksMethod - - -@dataclasses.dataclass -class TicksType(BoundsType): - method: TicksMethod - - -def try_and_error(*funcs): - """Apply multiple validation functions - - Parameters - ---------- - ``*funcs`` - Validation functions to test - - Returns - ------- - function""" - - def validate(value): - exc = None - for func in funcs: - try: - return func(value) - except (ValueError, TypeError) as e: - exc = e - raise exc - - return validate - - -# ----------------------------------------------------------------------------- -# ------------------------- validation functions ------------------------------ -# ----------------------------------------------------------------------------- - - -def validate_str(s): - """Validate a string - - Parameters - ---------- - s: str - - Returns - ------- - str - - Raises - ------ - ValueError""" - if not isinstance(s, six.string_types): - raise ValueError("Did not found string!") - return six.text_type(s) - - -def validate_float(s): - """convert `s` to float or raise - - Returns - ------- - s converted to a float: float - - Raises - ------ - ValueError""" - try: - return float(s) - except (ValueError, TypeError): - raise ValueError('Could not convert "%s" to float' % str(s)) - - -def validate_text(value): - """Validate a text formatoption - - Parameters - ---------- - value: see :attr:`psyplot.plotter.labelplotter.text` - - Raises - ------ - ValueError""" - possible_transform = ["axes", "fig", "data"] - validate_transform = ValidateInStrings( - "transform", possible_transform, True - ) - tests = [ - validate_float, - validate_float, - validate_str, - validate_transform, - dict, - ] - if isinstance(value, six.string_types): - xpos, ypos = rcParams["texts.default_position"] - return [(xpos, ypos, value, "axes", {"ha": "right"})] - elif isinstance(value, tuple): - value = [value] - try: - value = list(value)[:] - except TypeError: - raise ValueError("Value must be string or list of tuples!") - for i, val in enumerate(value): - try: - val = tuple(val) - except TypeError: - raise ValueError( - "Text must be an iterable of the form " - "(x, y, s[, trans, params])!" - ) - if len(val) < 3: - raise ValueError( - "Text tuple must at least be like [x, y, s], with floats x, " - "y and string s!" - ) - elif len(val) == 3 or isinstance(val[3], dict): - val = list(val) - val.insert(3, "data") - if len(val) == 4: - val += [{}] - val = tuple(val) - if len(val) > 5: - raise ValueError( - "Text tuple must not be longer then length 5. It can be " - "like (x, y, s[, trans, params])!" - ) - value[i] = (validate(x) for validate, x in zip(tests, val)) - return value - - -def validate_fontweight(value): - if value is None: - return None - elif isinstance(value, six.string_types): - return six.text_type(value) - elif mpl.__version__ >= "1.5": - return validate_float(value) - raise ValueError("Font weights must be None or a string!") - - -def validate_limits(value): - if value is None or isinstance(value, six.string_types): - return (value, value) - if not len(value) == 2: - raise ValueError("Limits must have length 2!") - ret = tuple(value) - if all(isinstance(v, float) for v in ret): - # make sure, we do not have numpy floats in here because this can - # easily break the diff of the formatoption - ret = tuple(float(v) for v in ret) - return ret - - -def validate_none(b): - """Validate that None is given - - Parameters - ---------- - b: {None, 'none'} - None or string (the case is ignored) - - Returns - ------- - None - - Raises - ------ - ValueError""" - if isinstance(b, six.string_types): - b = b.lower() - if b is None or b == "none": - return None - else: - raise ValueError('Could not convert "%s" to None' % b) - - -validate_bool_maybe_none = try_and_error(validate_none, validate_bool) - - -def validate_axiscolor(value): - """Validate a dictionary containing axiscolor definitions - - Parameters - ---------- - value: dict - see :attr:`psyplot.plotter.baseplotter.axiscolor` - - Returns - ------- - dict - - Raises - ------ - ValueError""" - validate = try_and_error(validate_none, validate_color) - possible_keys = {"right", "left", "top", "bottom"} - try: - value = dict(value) - false_keys = set(value) - possible_keys - if false_keys: - raise ValueError("Wrong keys (%s)!" % (", ".join(false_keys))) - for key, val in value.items(): - value[key] = validate(val) - except Exception: - value = dict(zip(possible_keys, repeat(validate(value)))) - return value - - -def validate_dataarray(val): - if not isinstance(val, xr.DataArray): - raise ValueError("Require xarray.DataArray, not %r" % type(val)) - return val - - -def validate_marker(val): - """Does not really make a validation because markers can be quite of - different types""" - if val is None: - return None - else: - return safe_list(val) - - -def validate_alpha(val): - """Validate an alpha value between 0 and 1""" - val = validate_float(val) - if val < 0 or val > 1: - raise ValueError("Alpha values must lay between 0 and 1!") - return val - - -def validate_iter(value): - """Validate that the given value is an iterable""" - try: - iter(value) - except TypeError: - raise ValueError("%s is not an iterable!" % repr(value)) - else: - return value - - -def validate_cbarpos(value): - """Validate a colorbar position - - Parameters - ---------- - value: bool or str - A string can be a combination of 'sh|sv|fl|fr|ft|fb|b|r' - - Returns - ------- - list - list of strings with possible colorbar positions - - Raises - ------ - ValueError""" - patt = "sh|sv|fl|fr|ft|fb|b|r" - if value is True: - value = {"b"} - elif not value: - value = set() - elif isinstance(value, six.string_types): - for s in re.finditer("[^%s]+" % patt, value): - warn("Unknown colorbar position %s!" % s.group(), RuntimeWarning) - value = set(re.findall(patt, value)) - else: - value = validate_stringset(value) - for s in (s for s in value if not re.match(patt, s)): - warn("Unknown colorbar position %s!" % s) - value.remove(s) - return value - - -def validate_cmap(val): - """Validate a colormap - - Parameters - ---------- - val: str or :class:`mpl.colors.Colormap` - - Returns - ------- - str or :class:`mpl.colors.Colormap` - - Raises - ------ - ValueError""" - from matplotlib.colors import Colormap - - try: - return validate_str(val) - except ValueError: - if not isinstance(val, Colormap): - raise ValueError("Could not find a valid colormap!") - return val - - -def validate_cmaps(cmaps): - """Validate a dictionary of color lists - - Parameters - ---------- - cmaps: dict - a mapping from a colormap name to a list of colors - - Raises - ------ - ValueError - If one of the values in `cmaps` is not a color list - - Notes - ----- - For all items (listname, list) in `cmaps`, the reversed list is - automatically inserted with the ``listname + '_r'`` key.""" - cmaps = {validate_str(key): validate_colorlist(val) for key, val in cmaps} - for key, val in six.iteritems(cmaps): - cmaps.setdefault(key + "_r", val[::-1]) - return cmaps - - -def validate_sym_lims(val): - validator = try_and_error( - validate_none, ValidateInStrings("sym_links", ["min", "max"], True) - ) - val = safe_list(val) - if len(val) != 2: - val = val + val - if not len(val) == 2: - raise ValueError( - "Need two values for the symmetric limits, not %i" % (len(val)) - ) - return list(map(validator, val)) - - -valid_legend_locs = [ - "best", - "upper right", - "upper left", - "lower left", - "lower right", - "right", - "center left", - "center right", - "lower center", - "upper center", - "center", -] - -validate_legend_loc = ValidateInStrings("legend_loc", valid_legend_locs, True) - - -def validate_legend(value): - if isinstance(value, dict): - return value - try: - return {"loc": validate_int(value)} - except (ValueError, TypeError): - pass - try: - return {"loc": validate_legend_loc(value)} - except (ValueError, TypeError): - pass - value = validate_bool(value) - return {"loc": "best" if value else False} - - -def validate_lineplot(value): - """Validate the value for the LinePlotter.plot formatoption - - Parameters - ---------- - value: None, str or list with mixture of both - The value to validate""" - if value is None: - return value - elif isinstance(value, six.string_types): - return six.text_type(value) - else: - value = list(value) - for i, v in enumerate(value): - if v is None: - pass - elif isinstance(v, six.string_types): - value[i] = six.text_type(v) - else: - raise ValueError("Expected None or string, found %s" % (v,)) - return value - - -validate_ticklabels = try_and_error( - validate_none, validate_str, validate_stringlist -) - -validate_extend = ValidateInStrings( - "extend", ["neither", "both", "min", "max"] -) - - -class ValidateList(object): - """Validate a list of the specified `dtype`""" - - def __init__(self, dtype=None, length=None, listtype=list): - """ - Parameters - ---------- - dtype: object - A datatype (e.g. :class:`float`) that shall be used for the - conversion - length: int - The expected length of the list - listtype: type - The type to use for creating the list. Should accept any iterable - """ - #: data type (e.g. :class:`float`) used for the conversion - self.dtype = dtype - self.length = length - self.listtype = list - - def __call__(self, sequence): - """Validate whether `l` is a list with contents of :attr:`dtype` - - Parameters - ---------- - l: list-like - - Returns - ------- - list - list with values of dtype :attr:`dtype` - - Raises - ------ - ValueError""" - try: - if self.dtype is None: - validated = self.listtype(sequence) - else: - try: - len(self.dtype) - except TypeError: - validated = self.listtype(map(self.dtype, sequence)) - else: - validated = self.listtype() - for val in sequence: - valid = False - for dtype in self.dtype: - try: - validated.append(dtype(val)) - except (TypeError, ValueError): - pass - else: - valid = True - break - if not valid: - raise ValueError( - f"{val} cannot be converted to any of the " - f"given data types: {self.dtype}!" - ) - - except TypeError: - if self.dtype is None: - raise ValueError("Could not convert to list!") - else: - raise ValueError( - "Could not convert to list of type %s!" % str(self.dtype) - ) - if self.length is not None and len(validated) != self.length: - raise ValueError( - "List with length %i is required! Not %i!" - % (self.length, len(validated)) - ) - return validated - - -def validate_err_calc(val): - """Validation function for the - :attr:`psy_simple.plotter.FldmeanPlotter.err_calc` formatoption""" - try: - val = validate_float(val) - except (ValueError, TypeError): - pass - else: - if val <= 100 and val >= 0: - return val - raise ValueError( - "Percentiles for the error calculation must lie " - "between 0 and 100, not %s" % val - ) - try: - val = ValidateList(float, 2)(val) - except (ValueError, TypeError): - pass - else: - if all((v <= 100 and v >= 0) for v in val): - return val - raise ValueError( - "Percentiles for the error calculation must lie " - "between 0 and 100, not %s" % val - ) - try: - val = validate_str(val) - except ValueError: - pass - else: - if "std" not in val: - raise ValueError( - "A string for the error calculation must contain std!" - ) - return val - - -class DictValValidator(object): - """A validation class for formatoptions that expect dictionaries as values""" - - def __init__(self, key, valid, validators, default, ignorecase=False): - """ - Parameters - ---------- - key: str - The name of the formatoption (will be used for error handling) - valid: list of str - The valid keys for the dictionary - validators: func - The validation function for the values of the dictionary - default: object - The default value to use if a key from `valid` is given in the - provided value - ignorecase: bool - Whether the case of the keys should be ignored - """ - self.key = key - self.valid = valid - self.key_validator = ValidateInStrings(key, valid, ignorecase) - self.default = default - self.validate = validators - - def __call__(self, value): - if ( - isinstance(value, dict) - and value - and all(isinstance(key, six.string_types) for key in value) - ): - failed_key = False - for key, val in list(six.iteritems(value)): - try: - new_key = self.key_validator(key) - except ValueError: - failed_key = True - break - else: - value[new_key] = self.validate(value.pop(key)) - if failed_key: - if self.default is None: - value = self.validate(value) - value = dict(zip(self.valid, repeat(value))) - else: - value = {self.default: self.validate(value)} - elif self.default is None: - value = self.validate(value) - value = dict(zip(self.valid, repeat(value))) - else: - value = {self.default: self.validate(value)} - return value - - -class TicksValidator(ValidateInStrings): - def __call__(self, val): - # validate the ticks - # if None, int or tuple (defining min- and max-range), pass - if ( - val is None - or isinstance(val, int) - or (isinstance(val, tuple) and len(val) <= 3) - ): - return val - # strings must be in the given list - elif isinstance(val, six.string_types): - return list(TicksType(val)) - elif isinstance(val, dict): - return list(TicksType(**val)) - elif len(val) and isinstance(val[0], six.string_types): - return list(TicksType(*val)) - # otherwise we assume an array - else: - return ValidateList()(val) - - -class BoundsValidator: - def __init__(self, type, default="rounded", possible_instances=None): - """ - For parameter description see - :class:`matplotlib.rcsetup.ValidateInStrings`. - - Other Parameters - ---------------- - inis: tuple - Tuple of object types that may pass the check - default: str - The default string to use for an integer (Default: 'rounded')""" - self.type = type - self.possible_instances = possible_instances - self.default = default - - def instance_check(self, val): - if self.possible_instances: - return isinstance(val, self.possible_instances) - return False - - def __call__(self, val): - if val is None or self.instance_check(val): - return val - elif isinstance(val, dict): - return list(self.type(**val)) - elif isinstance(val, int): - return list(self.type(self.default, val)) - elif isinstance(val, six.string_types): - return list(self.type(val)) - elif isinstance(val[0], six.string_types): - return list(self.type(*val)) - # otherwise we assume an array - else: - return ValidateList(float)(val) - - -class LineWidthValidator(ValidateInStrings): - def __call__(self, val): - if val is None: - return val - elif isinstance(val, six.string_types): - return [ValidateInStrings.__call__(self, val), 1.0] - elif np.asarray(val).ndim and isinstance(val[0], six.string_types): - return [ValidateInStrings.__call__(self, val[0])] + list(val[1:]) - # otherwise we assume an array - else: - return np.asarray(val, float) - - -def validate_plot(val): - validator = ValidateInStrings( - "2d plot", ["mesh", "contourf", "contour", "poly"], True - ) - - val = validator(val) - return val - - -# ----------------------------------------------------------------------------- -# ------------------------------ rcParams ------------------------------------- -# ----------------------------------------------------------------------------- - - -#: the :class:`~psyplot.config.rcsetup.RcParams` for the psy-simple plugin -rcParams = RcParams( - defaultParams={ - # ------------------------------------------------------------------------- - # ----------------------- Registered plotters ----------------------------- - # ------------------------------------------------------------------------- - "project.plotters": [ - { - "simple": { - "module": "psy_simple.plotters", - "plotter_name": "SimplePlotterBase", - "plot_func": False, - "summary": ( - "All plotters that are visualized by the psy-simple " - "package" - ), - }, - "lineplot": { - "module": "psy_simple.plotters", - "plotter_name": "LinePlotter", - "prefer_list": True, - "default_slice": None, - "summary": "Make a line plot of one-dimensional data", - }, - "fldmean": { - "module": "psy_simple.plotters", - "plotter_name": "FldmeanPlotter", - "prefer_list": True, - "default_slice": None, - "summary": "Calculate and plot the mean over x- and y-dimensions", - }, - "density": { - "module": "psy_simple.plotters", - "plotter_name": "DensityPlotter", - "prefer_list": False, - "default_slice": None, - "summary": "Make a density plot of point data", - }, - "barplot": { - "module": "psy_simple.plotters", - "plotter_name": "BarPlotter", - "prefer_list": True, - "default_slice": None, - "summary": "Make a bar plot of one-dimensional data", - }, - "violinplot": { - "module": "psy_simple.plotters", - "plotter_name": "ViolinPlotter", - "prefer_list": True, - "default_slice": None, - "summary": "Make a violin plot of your data", - }, - "plot2d": { - "module": "psy_simple.plotters", - "plotter_name": "Simple2DPlotter", - "prefer_list": False, - "default_slice": 0, - "default_dims": {"x": slice(None), "y": slice(None)}, - "summary": "Make a simple plot of a 2D scalar field", - }, - "vector": { - "module": "psy_simple.plotters", - "plotter_name": "SimpleVectorPlotter", - "prefer_list": False, - "default_slice": 0, - "default_dims": {"x": slice(None), "y": slice(None)}, - "summary": "Make a simple plot of a 2D vector field", - "example_call": "filename, name=[['u_var', 'v_var']], ...", - }, - "combined": { - "module": "psy_simple.plotters", - "plotter_name": "CombinedSimplePlotter", - "prefer_list": True, - "default_slice": 0, - "default_dims": {"x": slice(None), "y": slice(None)}, - "summary": ( - "Plot a 2D scalar field with an overlying vector " - "field" - ), - "example_call": ( - "filename, name=[['my_variable', ['u_var', 'v_var']]], ..." - ), - }, - }, - validate_dict, - ], - # ------------------------------------------------------------------------- - # --------------------- Default formatoptions ----------------------------- - # ------------------------------------------------------------------------- - "plotter.baseplotter.tight": [ - False, - validate_bool, - "fmt key for tight layout of the plots", - ], - "plotter.simple.grid": [ - False, - try_and_error(validate_bool_maybe_none, validate_color), - "fmt key to visualize the grid on simple plots (i.e. without " - "projection)", - ], - # labels - "plotter.baseplotter.title": [ - "", - six.text_type, - "fmt key to control the title of the axes", - ], - "plotter.baseplotter.figtitle": [ - "", - six.text_type, - "fmt key to control the title of the axes", - ], - "plotter.baseplotter.text": [ - [], - validate_text, - "fmt key to show text anywhere on the plot", - ], - "plotter.simple.ylabel": [ - "", - six.text_type, - "fmt key to modify the y-axis label for simple" - "plot (i.e. plots withouth projection)", - ], - "plotter.simple.xlabel": [ - "", - six.text_type, - "fmt key to modify the y-axis label for simple" - "plot (i.e. plots withouth projection)", - ], - "plotter.plot2d.clabel": [ - "", - six.text_type, - "fmt key to modify the colorbar label for 2D" "plots", - ], - # text sizes - "plotter.baseplotter.titlesize": [ - "large", - validate_fontsize, - "fmt key for the fontsize of the axes title", - ], - "plotter.baseplotter.figtitlesize": [ - 12, - validate_fontsize, - "fmt key for the fontsize of the figure title", - ], - "plotter.simple.labelsize": [ - "medium", - DictValValidator( - "labelsize", ["x", "y"], validate_fontsize, None, True - ), - "fmt key for the fontsize of the x- and y-l abel of simple plots " - "(i.e. without projection)", - ], - "plotter.simple.ticksize": [ - "medium", - DictValValidator( - "ticksize", - ["major", "minor"], - validate_fontsize, - "major", - True, - ), - "fmt key for the fontsize of the ticklabels of x- and y-axis of " - "simple plots (i.e. without projection)", - ], - "plotter.plot2d.cticksize": [ - "medium", - validate_fontsize, - "fmt key for the fontsize of the ticklabels of the colorbar of 2D " - "plots", - ], - "plotter.plot2d.clabelsize": [ - "medium", - validate_fontsize, - "fmt key for the fontsize of the colorbar label", - ], - # text weights - "plotter.baseplotter.titleweight": [ - None, - validate_fontweight, - "fmt key for the fontweight of the axes title", - ], - "plotter.baseplotter.figtitleweight": [ - None, - validate_fontweight, - "fmt key for the fontweight of the figure title", - ], - "plotter.simple.labelweight": [ - None, - DictValValidator( - "labelweight", ["x", "y"], validate_fontweight, None, True - ), - "fmt key for the fontweight of the x- and y-l abel of simple plots " - "(i.e. without projection)", - ], - "plotter.simple.tickweight": [ - None, - DictValValidator( - "tickweight", - ["major", "minor"], - validate_fontweight, - "major", - True, - ), - "fmt key for the fontweight of the ticklabels of x- and y-axis of " - "simple plots (i.e. without projection)", - ], - "plotter.plot2d.ctickweight": [ - None, - validate_fontweight, - "fmt key for the fontweight of the ticklabels of the colorbar of 2D " - "plots", - ], - "plotter.plot2d.clabelweight": [ - None, - validate_fontweight, - "fmt key for the fontweight of the colorbar label", - ], - # text properties - "plotter.baseplotter.titleprops": [ - {}, - validate_dict, - "fmt key for the additional properties of the title", - ], - "plotter.baseplotter.figtitleprops": [ - {}, - validate_dict, - "fmt key for the additional properties of the figure title", - ], - "plotter.simple.labelprops": [ - {}, - DictValValidator( - "labelprops", ["x", "y"], validate_dict, None, True - ), - "fmt key for the additional properties of the x- and y-label", - ], - "plotter.simple.xtickprops": [ - {"major": {}, "minor": {}}, - DictValValidator( - "xtickprops", ["major", "minor"], validate_dict, "major", True - ), - "fmt key for the additional properties of the ticklabels of x-axis", - ], - "plotter.simple.ytickprops": [ - {"major": {}, "minor": {}}, - DictValValidator( - "ytickprops", ["major", "minor"], validate_dict, "major", True - ), - "fmt key for the additional properties of the ticklabels of y-axis", - ], - "plotter.plot2d.clabelprops": [ - {}, - validate_dict, - "fmt key for the additional properties of the colorbar label", - ], - "plotter.plot2d.ctickprops": [ - {}, - validate_dict, - "fmt key for the additional properties of the colorbar ticklabels", - ], - # mask formatoptions - "plotter.baseplotter.background": [ - "rc", - try_and_error( - ValidateInStrings("background", ["rc"]), - validate_none, - validate_color, - ), - "The background color for the plot", - ], - "plotter.baseplotter.mask": [ - None, - try_and_error(validate_none, validate_str, validate_dataarray), - ], - "plotter.baseplotter.maskleq": [ - None, - try_and_error(validate_none, validate_float), - "fmt key to mask values less or equal than a certain threshold", - ], - "plotter.baseplotter.maskless": [ - None, - try_and_error(validate_none, validate_float), - "fmt key to mask values less than a certain threshold", - ], - "plotter.baseplotter.maskgreater": [ - None, - try_and_error(validate_none, validate_float), - "fmt key to mask values greater than a certain threshold", - ], - "plotter.baseplotter.maskgeq": [ - None, - try_and_error(validate_none, validate_float), - "fmt key to mask values greater than or equal to a certain threshold", - ], - "plotter.baseplotter.maskbetween": [ - None, - try_and_error(validate_none, ValidateList(float, 2)), - "fmt key to mask values between a certain range", - ], - # density plotter - "plotter.density.coord": [ - None, - try_and_error( - validate_none, - validate_dataarray, - validate_str, - validate_stringlist, - ), - "Alternative x-coordinate to use for DensityPlotter", - ], - "plotter.density.xrange": [ - "minmax", - validate_limits, - "The histogram limits of the density plot", - ], - "plotter.density.yrange": [ - "minmax", - validate_limits, - "The histogram limits of the density plot", - ], - "plotter.density.precision": [ - 0, - try_and_error( - validate_float, ValidateList((float, str), 2), validate_str - ), - "The precision of the data to make sure that the bin width is not " - "below this value", - ], - "plotter.density.bins": [ - 10, - try_and_error(validate_int, ValidateList(int, 2)), - "The bins in x- and y-direction of the density plot", - ], - "plotter.density.normed": [ - None, - try_and_error( - validate_none, - ValidateInStrings( - "normed", - [ - "area", - "counts", - "x", - "y", - "col", - "column", - "columns", - "row", - "rows", - ], - True, - ), - ), - "The normalization of the density histogram", - ], - "plotter.density.density": [ - "hist", - ValidateInStrings("density", ["hist", "kde"], True), - ], - # axis color - "plotter.simple.axiscolor": [ - None, - validate_axiscolor, - "fmt key to modify the color of the spines", - ], - # SimplePlot - "plotter.line.coord": [ - None, - try_and_error( - validate_none, - validate_dataarray, - validate_str, - validate_stringlist, - ), - "Alternative x-coordinate to use for LinePlotter", - ], - "plotter.line.plot": [ - "-", - validate_lineplot, - "fmt key to modify the line style", - ], - "plotter.line.error": [ - "fill", - try_and_error( - ValidateInStrings("error", ["fill"], True), validate_none - ), - "The visualization type of the errors for line plots", - ], - "plotter.line.marker": [ - None, - validate_marker, - "The symbol of the marker", - ], - "plotter.line.markersize": [ - None, - try_and_error(validate_none, validate_float), - "The size of the marker", - ], - "plotter.line.linewidth": [ - None, - try_and_error(validate_none, validate_float), - "The widths of the lines", - ], - "plotter.line.erroralpha": [ - 0.15, - validate_alpha, - "The alpha value of the error range", - ], - "plotter.bar.coord": [ - None, - try_and_error( - validate_none, - validate_dataarray, - validate_str, - validate_stringlist, - ), - "Alternative x-coordinate to use for BarPlotter", - ], - "plotter.bar.widths": [ - "equal", - try_and_error( - validate_float, - ValidateInStrings("widths", ["equal", "data"], True), - ), - "fmt key to change between equal and data given width of the bars", - ], - "plotter.bar.categorical": [ - None, - validate_bool_maybe_none, - "fmt key to change between categorical and non-categorical plotting", - ], - "plotter.bar.alpha": [ - 1.0, - validate_float, - "fmt key to control the transparency for the bar plots", - ], - "plotter.bar.plot": [ - "bar", - validate_lineplot, - "fmt key to modify whether bar plots shall be stacked or not", - ], - "plotter.violin.plot": [ - True, - validate_bool_maybe_none, - "fmt key to modify whether violin plots shall be drawn", - ], - "plotter.simple.transpose": [ - False, - validate_bool, - "fmt key to switch x- and y-axis", - ], - "plotter.simple.color": [ - None, - try_and_error(validate_none, validate_cmap, validate_iter), - "fmt key to modify the color cycle simple plots", - ], - "plotter.simple.ylim": [ - "rounded", - validate_limits, - "fmt key to specify the y-axis limits", - ], - "plotter.simple.xlim": [ - "rounded", - validate_limits, - "fmt key to specify the x-axis limits", - ], - "plotter.simple.sym_lims": [ - None, - validate_sym_lims, - "fmt key to make symmetric x- and y-axis limits", - ], - "plotter.simple.xticks": [ - {"major": None, "minor": None}, - DictValValidator( - "xticks", - ["major", "minor"], - TicksValidator("xticks", tick_strings, True), - "major", - True, - ), - "fmt key to modify the x-axis ticks", - ], - "plotter.simple.yticks": [ - {"major": None, "minor": None}, - DictValValidator( - "yticks", - ["major", "minor"], - TicksValidator("yticks", tick_strings, True), - "major", - True, - ), - "fmt key to modify the y-axis ticks", - ], - "plotter.simple.xticklabels": [ - None, - DictValValidator( - "xticklabels", - ["major", "minor"], - validate_ticklabels, - "major", - True, - ), - "fmt key to modify the x-axis ticklabels", - ], - "plotter.simple.yticklabels": [ - None, - DictValValidator( - "yticklabels", - ["major", "minor"], - validate_ticklabels, - "major", - True, - ), - "fmt key to modify the y-axis ticklabels", - ], - "plotter.simple.xrotation": [ - 0, - validate_float, - "fmt key to modify the rotation of the x-axis ticklabels", - ], - "plotter.simple.yrotation": [ - 0, - validate_float, - "fmt key to modify the rotation of the x-axis ticklabels", - ], - "plotter.simple.legendlabels": [ - "%(arr_name)s", - try_and_error(validate_str, ValidateList(six.text_type)), - "fmt key to modify the legend labels", - ], - "plotter.simple.legend": [ - True, - validate_legend, - "fmt key to draw a legend", - ], - # FldmeanPlotter - "plotter.fldmean.mean": [ - "mean", - try_and_error( - ValidateInStrings("mean", ["mean", "median"], True), - validate_float, - ), - "The calculation result, either the 'mean', 'median' or a percentile", - ], - "plotter.fldmean.err_calc": [ - "std", - validate_err_calc, - "The error calculation method, either the 'std' or a minimum " - "and maximum percentile", - ], - # Plot2D - "plotter.plot2d.interp_bounds": [ - None, - validate_bool_maybe_none, - "Switch to interpolate the bounds for 2D plots", - ], - "plotter.plot2d.plot": [ - "mesh", - try_and_error(validate_none, validate_plot), - "fmt key to specify the plot type of 2D scalar plots", - ], - "plotter.plot2d.plot.min_circle_ratio": [ - 0.05, - validate_float, - "fmt key to specify the min_circle_ratio that is used to mask very " - " flat triangles in a triangular plot", - ], - "plotter.plot2d.cbar": [ - ["b"], - validate_cbarpos, - "fmt key to specify the position of the colorbar", - ], - "plotter.plot2d.cbarspacing": [ - "uniform", - validate_str, - "fmt key to specify the spacing of the colorbar", - ], - "plotter.plot2d.miss_color": [ - None, - try_and_error(validate_none, validate_color), - "fmt key to specify the color of missing values", - ], - "plotter.plot2d.cmap": [ - "white_blue_red", - validate_cmap, - "fmt key to specify the colormap", - ], - "plotter.plot2d.cticks": [ - None, - try_and_error( - validate_none, BoundsValidator(CTicksType, default="bounds") - ), - "fmt key to specify the ticks of the colorbar", - ], - "plotter.plot2d.cticklabels": [ - None, - validate_ticklabels, - "fmt key to specify the ticklabels of the colorbar", - ], - "plotter.plot2d.extend": [ - "neither", - validate_extend, - "fmt key to specify the style of the colorbar on minimum and maximum", - ], - "plotter.plot2d.bounds": [ - "rounded", - BoundsValidator(BoundsType, "bounds", mpl.colors.Normalize), - "fmt key to specify bounds and norm of the colorbar", - ], - "plotter.plot2d.levels": [ - None, - BoundsValidator(BoundsType), - "fmt key to specify the levels for a contour plot", - ], - # TODO: Implement opacity - # 'plotter.plot2d.opacity': [None, try_and_error(validate_none, - # validate_opacity)], - "plotter.plot2d.datagrid": [ - None, - try_and_error(validate_none, validate_dict, validate_str), - "fmt key to plot the lines of the data grid", - ], - "plotter.plot2d.mask_datagrid": [ - True, - validate_bool, - "fmt key to mask cells with NaN when plotting the data grid", - ], - # VectorPlot - "plotter.vector.plot": [ - "quiver", - try_and_error( - validate_none, - ValidateInStrings("2d plot", ["quiver", "stream"], True), - ), - "fmt key for the plot type of vector plots", - ], - "plotter.vector.arrowsize": [ - None, - try_and_error(validate_none, validate_float), - "fmt key for the size of the arrows on vector plots", - ], - "plotter.vector.arrowstyle": [ - "-|>", - ValidateInStrings("arrowstyle", ArrowStyle._style_list), - "fmt key for the style of the arrows on stream plots", - ], - "plotter.vector.density": [ - 1.0, - try_and_error(validate_float, ValidateList(float, 2)), - "fmt key for the density of arrows on a vector plot", - ], - "plotter.vector.linewidth": [ - None, - LineWidthValidator("linewidth", ["absolute", "u", "v"], True), - "fmt key for the linewidths of the arrows", - ], - "plotter.vector.color": [ - "k", - try_and_error( - validate_float, - validate_color, - ValidateInStrings("color", ["absolute", "u", "v"], True), - ), - "fmt key for the colors of the arrows", - ], - # default texts - "texts.labels": [ - { - "tinfo": "%H:%M", - "dtinfo": "%B %d, %Y. %H:%M", - "dinfo": "%B %d, %Y", - "desc": "%(long_name)s [%(units)s]", - "sdesc": "%(name)s [%(units)s]", - }, - validate_dict, - "labels that shall be replaced in TextBase formatoptions", - " (e.g. the title formatoption) when inserted within " - "curly braces ({}))", - ], - "texts.default_position": [ - (1.0, 1.0), - ValidateList(float, 2), - "default position for the text fmt key", - ], - "texts.delimiter": [ - ", ", - validate_str, - "default delimiter to separate netCDF meta attributes " - "when displayed on the plot", - ], - # ------------------------------------------------------------------------- - # ---------------------------- Miscallaneous ------------------------------ - # ------------------------------------------------------------------------- - # color lists for user-defined colormaps (see for example - # psy_simple.colors._cmapnames) - "colors.cmaps": [ - {}, - validate_cmaps, - "User defined color lists that shall be accessible through the " - ":meth:`psyplot.plotter.colors.get_cmap` function", - ], - "widgets.colors.cmaps": [ - [ - "viridis", - "Reds", - "Blues", - "Greens", - "binary", - "RdBu", - "coolwarm", - "red_white_blue", - "winter", - "jet", - "white_blue_red", - "gist_ncar", - "gist_earth", - "Paired", - "gnuplot", - "gnuplot2", - ], - validate_stringlist, - "Colormaps that should be listed in the context menu of the cmap " - "button", - ], - "ticks.which": [ - "major", - ValidateInStrings("ticks.which", ["major", "minor"], True), - "default tick that is used when using a x- or y-tick formatoption", - ], - } -) - - -# add combinedplotter strings for vectorplot -_subd = SubDict(rcParams.defaultParams, ["plotter.vector.", "plotter.plot2d."]) -for _key in [ - "plot", - "cbar", - "cmap", - "bounds", - "cticksize", - "cbarspacing", - "ctickweight", - "ctickprops", - "clabel", - "cticks", - "cticklabels", - "clabelsize", - "clabelprops", - "clabelweight", -]: - rcParams.defaultParams["plotter.combinedsimple.v%s" % _key] = _subd[_key] -rcParams.defaultParams["plotter.combinedsimple.plot"] = rcParams.defaultParams[ - "plotter.plot2d.plot" -] -del _key, _subd - - -rcParams.update_from_defaultParams() diff --git a/psy_simple/widgets/__init__.py b/psy_simple/widgets/__init__.py deleted file mode 100644 index 9047707f..00000000 --- a/psy_simple/widgets/__init__.py +++ /dev/null @@ -1,47 +0,0 @@ -"""Module for PyQt4/PyQt5 widgets for modifying the formatoptions - -This module contains widgets that are inserted in the psyplot GUI. Submodules -are - -* :mod:`psy_simple.widgets.texts`: A module for the modification of labels -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os.path as osp -from functools import partial - -from PyQt5 import QtWidgets - - -def get_icon(fname, ending=".png"): - return osp.join(osp.dirname(__file__), "icons", fname + ending) - - -class Switch2FmtButton(QtWidgets.QToolButton): - """A button that contains a menu to switch to other formatoptions""" - - def __init__(self, parent, *fmtos): - """ - Parameters - ---------- - parent: psyplot_gui.fmt_widget.FormatoptionWidget - The formatoption widget that contains the button - ``*fmtos`` - Instances of the :class:`psyplot.plotter.Formatoption` for which - the links should be created - """ - super().__init__(parent=parent) - self.setText("fmt") - self.setPopupMode(QtWidgets.QToolButton.InstantPopup) - menu = QtWidgets.QMenu() - for fmto in fmtos: - name = parent.get_name(fmto) - menu.addAction(name, partial(parent.set_fmto, name)) - self.setMenu(menu) diff --git a/psy_simple/widgets/colors.py b/psy_simple/widgets/colors.py deleted file mode 100644 index 90eece88..00000000 --- a/psy_simple/widgets/colors.py +++ /dev/null @@ -1,1121 +0,0 @@ -"""Module for color specific widgets - -This module corresponds to the :mod:`psy_simple.colors` module as a version for -the usage in the psyplot GUI. -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import contextlib -import os.path as osp -from functools import partial -from itertools import chain - -import matplotlib as mpl -import matplotlib.colors as mcol -import numpy as np -import six -import xarray as xr -from psyplot.data import rcParams, safe_list -from psyplot.docstring import docstrings -from PyQt5 import QtCore, QtGui, QtWidgets -from PyQt5.QtCore import Qt - -import psy_simple.colors as psc -from psy_simple.plugin import BoundsType, CTicksType -from psy_simple.widgets import Switch2FmtButton, get_icon - -mpl_version = tuple(map(int, mpl.__version__.split(".")[:2])) - - -docstrings.delete_params("show_colormaps.parameters", "show", "use_qt") - - -class ColormapModel(QtCore.QAbstractTableModel): - """A model for displaying colormaps""" - - @docstrings.get_sections(base="ColormapModel") - @docstrings.with_indent(8) - def __init__(self, names=[], N=10, *args, **kwargs): - """ - Parameters - ---------- - %(show_colormaps.parameters.no_show|use_qt)s - - Other Parameters - ---------------- - ``*args, **kwargs`` - Anything else that is passed to the QAbstractTableModel - """ - super(ColormapModel, self).__init__(*args, **kwargs) - names = psc._get_cmaps(names) - self.set_colors(N, names) - - def set_colors(self, N=None, names=None): - self.names = names = names or self.names - self.N = N = N or self.N - - colors = np.zeros((len(names), N, 4)) - a = np.linspace(0, 1, N) - for i, cmap in enumerate( - map(lambda name: psc.get_cmap(name, N), names) - ): - colors[i, :, :] = cmap(a) - - self.color_da = xr.DataArray( - colors, - coords={"cmap": list(map(str, names))}, - dims=("cmap", "color", "rgba"), - ) - - def rowCount(self, index=QtCore.QModelIndex()): - return self.color_da.shape[0] - - def columnCount(self, index=QtCore.QModelIndex()): - return self.color_da.shape[1] - - def data(self, index, role=Qt.DisplayRole): - """Cell content""" - if not index.isValid(): - return None - if role == Qt.DisplayRole or role == Qt.EditRole: - return " " - if role == Qt.BackgroundColorRole: - color = self.color_da[index.row(), index.column()].values - return QtGui.QColor.fromRgbF(*color) - return None - - def headerData(self, section, orientation, role=Qt.DisplayRole): - """Set header data""" - if role != Qt.DisplayRole: - return None - if orientation == Qt.Vertical: - return six.text_type(self.color_da.cmap[section].values) - return super(ColormapModel, self).headerData( - section, orientation, role - ) - - def reset(self): - self.beginResetModel() - self.endResetModel() - - -class ColormapTable(QtWidgets.QTableView): - """A table for displaying colormaps""" - - @docstrings.with_indent(8) - def __init__(self, names=[], N=10, editable=True, *args, **kwargs): - """ - Parameters - ---------- - %(ColormapModel.parameters)s - - Other Parameters - ---------------- - ``*args, **kwargs`` - Anything else that is passed to the QtWidgets.QTableView - """ - super(ColormapTable, self).__init__(*args, **kwargs) - self.setModel(ColormapModel(names, N)) - if editable: - self.doubleClicked.connect(self.change_color) - self.setSelectionMode(QtWidgets.QTableView.SingleSelection) - self.setSelectionBehavior(QtWidgets.QTableView.SelectRows) - - def setModel(self, model): - super(ColormapTable, self).setModel(model) - self.orig_color_da = model.color_da.copy(True) - - def change_color(self, index): - model = self.model() - current = model.data(index, Qt.BackgroundColorRole) - if current is None: - return - color = QtWidgets.QColorDialog.getColor(current, parent=self) - if not color.isValid(): - return - model.color_da[index.row(), index.column(), :] = list(color.getRgbF()) - indices = self.selectedIndexes() - model.reset() - self.selectRow(indices[0].row()) - - def rowCount(self): - return self.model().rowCount() - - def columnCount(self): - return self.model().columnCount() - - @property - def chosen_colormap(self): - indexes = self.selectedIndexes() - if not indexes: - return - row = indexes[0].row() - model = self.model() - name = six.text_type(self.orig_color_da.cmap[row].values) - colors = model.color_da[row].values - orig_colors = self.orig_color_da[row].values - if np.allclose(colors, orig_colors): - return model.names[row] - return mcol.LinearSegmentedColormap.from_list( - name, colors, N=self.columnCount() - ) - - -class ColormapDialog(QtWidgets.QDialog): - """A widget for selecting a colormap""" - - @docstrings.with_indent(8) - def __init__(self, names=[], N=10, editable=True, *args, **kwargs): - """ - Parameters - ---------- - %(ColormapModel.parameters)s - - Other Parameters - ---------------- - ``*args, **kwargs`` - Anything else that is passed to the ColormapDialog - """ - super(QtWidgets.QDialog, self).__init__(*args, **kwargs) - vbox = QtWidgets.QVBoxLayout() - self.table = ColormapTable(names=names, N=N, editable=editable) - if editable: - vbox.addWidget(QtWidgets.QLabel("Double-click a color to edit")) - vbox.addWidget(self.table) - self.setLayout(vbox) - col_width = self.table.columnWidth(0) - header_width = self.table.verticalHeader().width() - row_height = self.table.rowHeight(0) - available = QtWidgets.QDesktopWidget().availableGeometry() - height = int( - min( - row_height * (self.table.rowCount() + 1), - 2.0 * available.height() / 3.0, - ) - ) - width = int( - min( - header_width + col_width * N + 0.5 * col_width, - 2.0 * available.width() / 3.0, - ) - ) - self.resize(QtCore.QSize(width, height)) - - @classmethod - @docstrings.with_indent(8) - def get_colormap(cls, names=[], N=10, *args, **kwargs): - """Open a :class:`ColormapDialog` and get a colormap - - Parameters - ---------- - %(ColormapModel.parameters)s - - Other Parameters - ---------------- - ``*args, **kwargs`` - Anything else that is passed to the ColormapDialog - - Returns - ------- - str or matplotlib.colors.Colormap - Either the name of a standard colormap available via - :func:`psy_simple.colors.get_cmap` or a colormap - """ - names = safe_list(names) - obj = cls(names, N, *args, **kwargs) - vbox = obj.layout() - buttons = QtWidgets.QDialogButtonBox( - QtWidgets.QDialogButtonBox.Ok | QtWidgets.QDialogButtonBox.Cancel, - parent=obj, - ) - buttons.button(QtWidgets.QDialogButtonBox.Ok).setEnabled(False) - vbox.addWidget(buttons) - buttons.accepted.connect(obj.accept) - buttons.rejected.connect(obj.reject) - - obj.table.selectionModel().selectionChanged.connect( - lambda indices: buttons.button( - QtWidgets.QDialogButtonBox.Ok - ).setEnabled(bool(indices)) - ) - accepted = obj.exec_() - if accepted: - return obj.table.chosen_colormap - - docstrings.delete_params("show_colormaps.parameters", "use_qt") - - @classmethod - @docstrings.with_indent(8) - def show_colormap(cls, names=[], N=10, show=True, *args, **kwargs): - """Show a colormap dialog - - Parameters - ---------- - %(show_colormaps.parameters.no_use_qt)s""" - names = safe_list(names) - obj = cls(names, N, *args, **kwargs) - vbox = obj.layout() - buttons = QtWidgets.QDialogButtonBox( - QtWidgets.QDialogButtonBox.Close, parent=obj - ) - buttons.rejected.connect(obj.close) - vbox.addWidget(buttons) - if show: - obj.show() - return obj - - -def create_cmap_thumb(cmap, output=None): - from matplotlib.cm import ScalarMappable - from matplotlib.figure import Figure - - fig = Figure(figsize=(4.0, 0.2)) - cax = fig.add_axes([0, 0, 1, 1]) - _cmap = psc.get_cmap(cmap) - mappable = ScalarMappable(cmap=_cmap) - mappable.set_array([]) - fig.colorbar(mappable, cmap=_cmap, cax=cax, orientation="horizontal") - if output: - fig.savefig(output, dpi=72) - return fig - - -class HighlightWidget(QtWidgets.QWidget): - def set_highlighted(self, b): - self.setBackgroundRole( - QtGui.QPalette.Highlight if b else QtGui.QPalette.Window - ) - self.setAutoFillBackground(b) - - def enterEvent(self, event): - self.set_highlighted(True) - - def leaveEvent(self, event): - self.set_highlighted(False) - - -class CmapButton(QtWidgets.QToolButton): - """A button with a dropdown menu to select colormaps""" - - # a signal that is triggered if the colormap has been changed - colormap_changed = QtCore.pyqtSignal([str], [mcol.Colormap]) - - def __init__(self, cmaps=None, current=None, *args, **kwargs): - super().__init__(*args, **kwargs) - - if cmaps is None: - cmaps = list(rcParams["widgets.colors.cmaps"]) - - self.cmaps = cmaps - - self.setText(current or cmaps[0]) - self.cmap_menu = self.setup_cmap_menu() - self.setMenu(self.cmap_menu) - - max_width = max(map(self.fontMetrics().width, cmaps)) * 2 - self.setMinimumWidth(max_width) - self.setPopupMode(QtWidgets.QToolButton.InstantPopup) - - def setup_cmap_menu(self): - menu = QtWidgets.QMenu() - for cmap in self.cmaps: - icon = get_icon(osp.join("cmaps", cmap)) - if osp.exists(icon): - action = QtWidgets.QWidgetAction(menu) - w = HighlightWidget() - hbox = QtWidgets.QVBoxLayout() - label = QtWidgets.QLabel() - label.setPixmap(QtGui.QPixmap(icon)) - hbox.addWidget(label) - cmap_label = QtWidgets.QLabel(cmap) - hbox.addWidget(cmap_label) - w.setLayout(hbox) - action.setDefaultWidget(w) - action.triggered.connect(partial(self.set_cmap, cmap)) - menu.addAction(action) - else: - menu.addAction(cmap, partial(self.set_cmap, cmap)) - return menu - - def set_cmap(self, cmap): - if isinstance(cmap, str): - self.setText(str(cmap)) - self.colormap_changed[str].emit(cmap) - else: - self.setText("Custom") - self.colormap_changed[mcol.Colormap].emit(cmap) - - def open_cmap_dialog(self, N=10): - cmap = ColormapDialog.get_colormap(N=N) - if cmap is not None: - self.set_cmap(cmap) - - -class ColorLabel(QtWidgets.QTableWidget): - """A QTableWidget with one cell and no headers to just display a color""" - - #: a signal that is emitted with an rgba color if the chosen color changes - color_changed = QtCore.pyqtSignal(QtGui.QColor) - - #: QtCore.QColor. The current color that is displayed - color = None - - def __init__(self, color="w", *args, **kwargs): - """The color to display - - Parameters - ---------- - color: object - Either a QtGui.QColor object or a color that can be converted - to RGBA using the :func:`matplotlib.colors.to_rgba` function""" - super(ColorLabel, self).__init__(*args, **kwargs) - self.setColumnCount(1) - self.setRowCount(1) - self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff) - self.horizontalHeader().setHidden(True) - self.horizontalHeader().setSectionResizeMode( - QtWidgets.QHeaderView.Stretch - ) - self.verticalHeader().setHidden(True) - self.verticalHeader().setSectionResizeMode( - QtWidgets.QHeaderView.Stretch - ) - self.setEditTriggers(QtWidgets.QTableWidget.NoEditTriggers) - self.setSelectionMode(QtWidgets.QTableWidget.NoSelection) - self.itemClicked.connect(self.select_color) - self.color_item = QtWidgets.QTableWidgetItem() - self.setItem(0, 0, self.color_item) - self.adjust_height() - self.set_color(color) - self.orig_color = self.color - - self.setMaximumWidth(80) - - def select_color(self, *args): - """Select a color using :meth:`PyQt5.QtWidgets.QColorDialog.getColor`""" - color = QtWidgets.QColorDialog.getColor( - self.color_item.background().color() - ) - if color.isValid(): - self.set_color(color) - - def set_color(self, color): - """Set the color of the label - - This method sets the given `color` as background color for the cell - and emits the :attr:`color_changed` signal - - Parameters - ---------- - color: object - Either a QtGui.QColor object or a color that can be converted - to RGBA using the :func:`matplotlib.colors.to_rgba` function""" - color = self._set_color(color) - self.color_changed.emit(color) - - def setEnabled(self, b): - if not b: - orig_color = self.color - self._set_color("0.75") - self.color = orig_color - else: - self._set_color(self.color) - super().setEnabled(b) - - def _set_color(self, color): - if not isinstance(color, QtGui.QColor): - color = QtGui.QColor( - *map(int, np.round(np.array(mcol.to_rgba(color)) * 255)) - ) - self.color_item.setBackground(color) - self.color = color - return color - - def adjust_height(self): - """Adjust the height to match the row height""" - h = self.rowHeight(0) * self.rowCount() - self.setMaximumHeight(h) - self.setMinimumHeight(h) - - def sizeHint(self): - """Reimplemented to use the rowHeight as height""" - s = super(ColorLabel, self).sizeHint() - return QtCore.QSize(s.width(), self.rowHeight(0) * self.rowCount()) - - -class BackGroundColorWidget(QtWidgets.QWidget): - """The widget to select the axes background color""" - - def __init__(self, parent, fmto, project): - super().__init__() - ax = fmto.ax - self.cb_enable = QtWidgets.QCheckBox("transparent") - self.color_label = ColorLabel(ax.patch.get_facecolor()) - self.editor = parent - - self.cb_enable.setChecked(fmto.value is None) - - self.toggle_color_button() - - self.color_label.color_changed.connect(self.set_color) - - self.cb_enable.stateChanged.connect(self.toggle_color_button) - self.cb_enable.stateChanged.connect(self.set_transparent) - - layout = QtWidgets.QHBoxLayout() - layout.addWidget(QtWidgets.QLabel("Select color:")) - layout.addWidget(self.color_label) - layout.addWidget(self.cb_enable) - layout.addStretch(0) - self.setLayout(layout) - - def set_transparent(self): - if self.cb_enable.isChecked(): - self.editor.set_obj(None) - else: - self.set_color(self.color_label.color) - - def toggle_color_button(self): - self.color_label.setEnabled(not self.cb_enable.isChecked()) - - def set_color(self, color): - if isinstance(color, QtGui.QColor): - color = list(color.getRgbF()) - self.editor.set_obj(color) - - -class CMapFmtWidget(QtWidgets.QWidget): - """The widget for modifying the :class:`psy_simple.plotters.CMap` fmt""" - - def __init__(self, parent, fmto, project, properties=True): - QtWidgets.QWidget.__init__(self, parent) - hbox = QtWidgets.QHBoxLayout() - - self.editor = parent - - # add a select colormap button - self.btn_choose = button = CmapButton() - button.colormap_changed.connect(self.set_obj) - button.colormap_changed[mcol.Colormap].connect(self.set_obj) - self.btn_choose.cmap_menu.addSeparator() - self.btn_choose.cmap_menu.addAction( - "More...", partial(self.choose_cmap, None) - ) - - if isinstance(fmto.value, str): - self.btn_choose.setText(fmto.value) - else: - self.btn_choose.setText("Custom") - - hbox.addWidget(button) - - # add a show colormap button - self.btn_show = button = QtWidgets.QPushButton("Edit...") - button.clicked.connect(self.edit_cmap) - hbox.addWidget(button) - - # add a checkbox to invert the colormap - self.cb_invert = QtWidgets.QCheckBox("Inverted") - self.cb_invert.setEnabled(isinstance(fmto.value, str)) - if isinstance(fmto.value, str): - self.cb_invert.setChecked(fmto.value.endswith("_r")) - self.cb_invert.stateChanged.connect(self.invert_cmap) - hbox.addWidget(self.cb_invert) - - hbox.addStretch(0) - - if properties: - hbox.addWidget(Switch2FmtButton(parent, fmto.bounds, fmto.cbar)) - - self.setLayout(hbox) - - def set_obj(self, obj): - self.editor.set_obj(obj) - self.invert_cmap() - - def invert_cmap(self): - try: - value = self.editor.get_obj() - except Exception: - return - if isinstance(value, str): - self.cb_invert.setEnabled(True) - if self.cb_invert.isChecked() and not value.endswith("_r"): - self.editor.set_obj(value + "_r") - elif value.endswith("_r"): - self.editor.set_obj(value[:-2]) - else: - self.refresh_cb_invert(value) - - def refresh_cb_invert(self, obj): - try: - self.cb_invert.blockSignals(True) - if isinstance(obj, str): - self.cb_invert.setEnabled(True) - self.cb_invert.setChecked(obj.endswith("_r")) - else: - self.cb_invert.setEnabled(False) - self.cb_invert.setChecked(False) - finally: - self.cb_invert.blockSignals(False) - - def choose_cmap(self, cmap=None): - if cmap is None: - editor = self.editor - N = getattr(editor.fmto.bounds.norm, "Ncmap", 10) - self.btn_choose.open_cmap_dialog(N) - else: - self.set_obj(cmap) - - def edit_cmap(self): - editor = self.editor - cmap = editor.get_obj() - if cmap is not None: - cmap = ColormapDialog.get_colormap( - cmap, - N=getattr(editor.fmto.bounds.norm, "Ncmap", 10), - parent=self, - ) - if cmap is not None: - editor.set_obj(cmap) - - -class DataTicksCalculatorFmtWidget(QtWidgets.QWidget): - """Fmt widget for :class:`psy_simple.plotters.DataTicksCalculator` - - This widget contains a combo box with the different options from the - :attr:`psy_simple.plotters.DataTicksCalculator.calc_funcs`, a spin box - for the number of increments and two text widgets for minimum and maximum - percentile""" - - def __init__(self, parent, method=None, methods_type=BoundsType): - self.methods_type = methods_type - QtWidgets.QWidget.__init__(self, parent) - - self.method = method - - hbox = QtWidgets.QHBoxLayout() - - self.sb_N = QtWidgets.QSpinBox() - self.sb_N.setSpecialValueText("auto") - self.sb_N.setMinimum(0) - hbox.addWidget(self.sb_N) - - self.txt_min_pctl = QtWidgets.QLineEdit() - self.txt_min_pctl.setValidator(QtGui.QDoubleValidator(0.0, 100.0, 10)) - - hbox.addWidget(QtWidgets.QLabel("Min.:")) - - self.combo_min = QtWidgets.QComboBox() - self.combo_min.addItems(["absolute", "percentile"]) - hbox.addWidget(self.combo_min) - - hbox.addWidget(self.txt_min_pctl) - - self.txt_max_pctl = QtWidgets.QLineEdit() - self.txt_max_pctl.setValidator(QtGui.QDoubleValidator(0.0, 100.0, 10)) - hbox.addWidget(QtWidgets.QLabel("Max.:")) - - self.combo_max = QtWidgets.QComboBox() - self.combo_max.addItems(["absolute", "percentile"]) - hbox.addWidget(self.combo_max) - - hbox.addWidget(self.txt_max_pctl) - - self.sb_N.valueChanged.connect(self.set_obj) - self.combo_min.currentIndexChanged.connect(self.set_obj) - self.combo_max.currentIndexChanged.connect(self.set_obj) - self.txt_min_pctl.textChanged.connect(self.set_obj) - self.txt_max_pctl.textChanged.connect(self.set_obj) - - self.setLayout(hbox) - - def set_obj(self): - obj = { - "method": self.method, - "N": self.sb_N.value() or None, - } - if self.txt_min_pctl.text().strip(): - key = ( - "vmin" - if self.combo_min.currentText() == "absolute" - else "percmin" - ) - obj[key] = float(self.txt_min_pctl.text().strip()) - if self.txt_max_pctl.text().strip(): - key = ( - "vmax" - if self.combo_max.currentText() == "absolute" - else "percmax" - ) - obj[key] = float(self.txt_max_pctl.text().strip()) - val = list(self.methods_type(**obj)) - try: - val[0] = val[0].name - except AttributeError: - pass - self.parent().set_obj(val) - - def refresh(self, method, fmto): - value = fmto.value - if value is None: - value = self.methods_type(method) - try: - value = self.methods_type(*value) - except (ValueError, TypeError): - pass - else: - self.sb_N.setValue(value.N or 0) - - bounds_val = value.method.name in ["bounds", "midbounds"] - self.txt_min_pctl.setEnabled(not bounds_val) - self.txt_max_pctl.setEnabled(not bounds_val) - self.combo_min.setEnabled(not bounds_val) - self.combo_max.setEnabled(not bounds_val) - - decimals = None - if value.vmin is not None and value.vmax is not None: - decimals = self.get_decimals(value.vmin, value.vmax) - if value.vmin is not None: - if decimals is None: - decimals = -np.floor(np.log10(value.vmin)) + 4 - self.txt_min_pctl.setText(str(np.round(value.vmin, decimals))) - self.combo_min.setCurrentText("absolute") - elif value.percmin != 0: - self.txt_min_pctl.setText("%1.6g" % value.percmin) - self.combo_min.setCurrentText("percentile") - - if value.vmax is not None: - if decimals is None: - decimals = -np.floor(np.log10(value.vmax)) + 4 - self.txt_max_pctl.setText(str(np.round(value.vmax, decimals))) - self.combo_max.setCurrentText("absolute") - elif value.percmax != 100: - self.txt_max_pctl.setText("%1.6g" % value.percmax) - self.combo_max.setCurrentText("percentile") - - @staticmethod - def get_decimals(vmin, vmax): - if vmin == vmax: - decimals = 4 - else: - decimals = -np.floor(np.log10(abs(vmax - vmin))) + 4 - return int(decimals) - - -class ArrayFmtWidget(QtWidgets.QWidget): - """Fmt widget for :class:`psy_simple.plotters.DataTicksCalculator` - - This formatoption widgets contains 3 line edits, one for the minimum, one - for the maximum and one for the step size. And a spin box for the number - of increments""" - - def __init__(self, parent, array=None): - QtWidgets.QWidget.__init__(self, parent) - - self.txt_min = QtWidgets.QLineEdit() - self.txt_min.setValidator(QtGui.QDoubleValidator()) - self.txt_max = QtWidgets.QLineEdit() - self.txt_max.setValidator(QtGui.QDoubleValidator()) - self.txt_step = QtWidgets.QLineEdit() - self.txt_step.setValidator(QtGui.QDoubleValidator(1e-10, 1e10, 10)) - self.sb_nsteps = QtWidgets.QSpinBox() - self.step_inc_combo = combo = QtWidgets.QComboBox() - combo.addItems(["Step", "# Steps"]) - - if array is not None: - vmin, vmax = array.min(), array.max() - decimals = self.get_decimals(vmin, vmax) - - self.txt_min.setText(f"%1.{decimals}g" % vmin) - self.txt_max.setText(f"%1.{decimals}g" % vmax) - steps = np.diff(array) - if len(steps) == 1 or np.diff(steps).max() < 1e-5: - self.txt_step.setText(f"%1.{decimals}g" % steps[0]) - combo.setCurrentIndex(0) - else: - combo.setCurrentIndex(1) - self.sb_nsteps.setValue(len(array)) - - self.toggle_txt_step(combo.currentText()) - - hbox = QtWidgets.QHBoxLayout() - hbox.addWidget(QtWidgets.QLabel("Min.")) - hbox.addWidget(self.txt_min) - hbox.addWidget(QtWidgets.QLabel("Max.")) - hbox.addWidget(self.txt_max) - hbox.addWidget(combo) - hbox.addWidget(self.txt_step) - hbox.addWidget(self.sb_nsteps) - self.setLayout(hbox) - - for w in [self.txt_min, self.txt_max, self.txt_step]: - w.textChanged.connect(self.set_array) - self.sb_nsteps.valueChanged.connect(self.set_array) - - combo.currentTextChanged.connect(self.toggle_txt_step) - - def toggle_txt_step(self, s): - show_step = s == "Step" - self.txt_step.setVisible(show_step) - self.sb_nsteps.setVisible(not show_step) - self.txt_step.setEnabled(show_step) - self.sb_nsteps.setEnabled(not show_step) - self.set_array() - - @staticmethod - def get_decimals(vmin, vmax): - if vmin == vmax: - decimals = 4 - else: - decimals = -np.floor(np.log10(abs(vmax - vmin))) + 4 - return int(decimals) - - def set_array(self, *args, **kwargs): - try: - vmin = float(self.txt_min.text()) - except (ValueError, TypeError): - return - try: - vmax = float(self.txt_max.text()) - except (ValueError, TypeError): - return - if self.txt_step.isEnabled(): - try: - step = float(self.txt_step.text().strip()) - except (ValueError, TypeError): - return - arr = np.arange(vmin, vmax + 0.05 * step, step) - else: - arr = np.linspace(vmin, vmax, self.sb_nsteps.value()) - self.parent().set_obj( - np.round(arr, self.get_decimals(vmin, vmax)).tolist() - ) - - def set_obj(self): - self.set_array() - - -class NormalizationWidget(QtWidgets.QWidget): - """A simple widget representing a boundary norm""" - - def __init__(self, parent, norm): - QtWidgets.QWidget.__init__(self, parent) - self.norm = norm - - validator = QtGui.QDoubleValidator() - self.txt_min = QtWidgets.QLineEdit() - self.txt_min.setValidator(validator) - self.txt_max = QtWidgets.QLineEdit() - self.txt_max.setValidator(validator) - - self.lbl_linthresh = QtWidgets.QLabel("linthresh:") - self.txt_linthresh = QtWidgets.QLineEdit() # linthresh for SymLogNorm - self.txt_linthresh.setValidator(validator) - self.txt_linthresh.setToolTip( - "The threshold for linear scaling. Within this distance from 0, " - "the scaling will be linear, not logarithmic." - ) - - self.lbl_gamma = QtWidgets.QLabel("gamma:") - self.txt_gamma = QtWidgets.QLineEdit() # gamma for PowerNorm - self.txt_gamma.setValidator(validator) - self.txt_gamma.setToolTip("The power value for the PowerNorm") - - self.fill_from_norm() - - hbox = QtWidgets.QHBoxLayout() - hbox.addWidget(QtWidgets.QLabel("Min.:")) - hbox.addWidget(self.txt_min) - hbox.addWidget(QtWidgets.QLabel("Max.:")) - hbox.addWidget(self.txt_max) - hbox.addWidget(self.lbl_linthresh) - hbox.addWidget(self.txt_linthresh) - hbox.addWidget(self.lbl_gamma) - hbox.addWidget(self.txt_gamma) - self.setLayout(hbox) - - self.txt_min.textChanged.connect(self.set_obj) - self.txt_max.textChanged.connect(self.set_obj) - self.txt_linthresh.textChanged.connect(self.set_obj) - self.txt_gamma.textChanged.connect(self.set_obj) - - def fill_from_norm(self): - norm = self.norm - if norm.vmin is not None: - self.txt_min.setText("%1.6g" % norm.vmin) - if norm.vmax is not None: - self.txt_max.setText("%1.6g" % norm.vmax) - if isinstance(self.norm, mcol.SymLogNorm): - self.txt_linthresh.setVisible(True) - self.txt_linthresh.setEnabled(True) - self.lbl_linthresh.setVisible(True) - self.txt_linthresh.setText("%1.6g" % norm.linthresh) - else: - self.txt_linthresh.setVisible(False) - self.txt_linthresh.setEnabled(False) - self.lbl_linthresh.setVisible(False) - if isinstance(norm, mcol.PowerNorm): - self.txt_gamma.setVisible(True) - self.txt_gamma.setEnabled(True) - self.lbl_gamma.setVisible(True) - self.txt_gamma.setText("%1.6g" % norm.gamma) - else: - self.txt_gamma.setVisible(False) - self.txt_gamma.setEnabled(False) - self.lbl_gamma.setVisible(False) - - def set_obj(self): - cls = self.norm.__class__ - kws = {} - if issubclass(cls, mcol.PowerNorm): - args = [float(self.txt_gamma.text().strip() or 1.0)] - elif issubclass(cls, mcol.SymLogNorm): - args = [float(self.txt_linthresh.text().strip() or 1e-3)] - if mpl_version >= (3, 2): - kws["base"] = 10 - else: - args = [] - vmin = vmax = None - if self.txt_min.text().strip(): - vmin = float(self.txt_min.text().strip()) - if self.txt_max.text().strip(): - vmax = float(self.txt_max.text().strip()) - try: - norm = cls(*args, vmin=vmin, vmax=vmax, **kws) - except Exception: - pass - else: - self.parent().set_obj(norm) - - -class BoundsFmtWidget(QtWidgets.QWidget): - """The widget for modifying the :class:`psy_simple.plotters.Bounds` fmt""" - - _array_widget = None - - _auto_array_widget = None - - _norm_widget = None - - current_widget = None - - methods_type = BoundsType - - norm_map = { - "No normalization": mcol.Normalize, - "log": mcol.LogNorm, - "symlog": mcol.SymLogNorm, - "power-law": mcol.PowerNorm, - } - - default_args = {"symlog": [1e-3], "power-law": [1.0]} # linthresh # gamma - - default_kws = {"symlog": {"base": 10} if mpl_version >= (3, 2) else {}} - - methods = ["Discrete", "Continuous"] - - def __init__(self, parent, fmto, project, properties=True): - QtWidgets.QWidget.__init__(self, parent) - self._editor = parent - hbox = QtWidgets.QHBoxLayout() - - self.type_combo = QtWidgets.QComboBox(self) - self.type_combo.addItems(self.methods) - - self.method_combo = QtWidgets.QComboBox(self) - - self.discrete_items = sorted(fmto.calc_funcs) + ["Custom"] - - hbox.addWidget(self.type_combo) - hbox.addWidget(self.method_combo) - hbox.addStretch(0) - - self.type_combo.currentTextChanged.connect(self.refresh_methods) - self.method_combo.currentTextChanged.connect( - self.refresh_current_widget - ) - - # add a button to select other formatoptions - if properties: - hbox.addWidget(Switch2FmtButton(parent, fmto.cmap, fmto.cbar)) - self.setLayout(hbox) - - self.set_value(fmto.value) - - def set_value(self, value): - with self.block_widgets(self.method_combo, self.type_combo): - if value is None: - self.type_combo.setCurrentText("Continuous") - self.refresh_methods("Continuous") - self.method_combo.setCurrentText("No normalization") - elif isinstance(value, mcol.Normalize) and not hasattr( - value, "boundaries" - ): - self.type_combo.setCurrentText("Continuous") - self.refresh_methods("Continuous") - - if isinstance(value, mcol.LogNorm): - self.method_combo.setCurrentText("log") - elif isinstance(value, mcol.SymLogNorm): - self.method_combo.setCurrentText("symlog") - elif isinstance(value, mcol.PowerNorm): - self.method_combo.setCurrentText("power-law") - else: - self.method_combo.setCurrentText("Custom") - else: - self.type_combo.setCurrentText("Discrete") - self.refresh_methods("Discrete") - if not isinstance(value, mcol.Normalize) and isinstance( - value[0], six.string_types - ): - self.method_combo.setCurrentText(value[0]) - else: - self.method_combo.setCurrentText("Custom") - - self.refresh_methods(self.type_combo.currentText()) - - @contextlib.contextmanager - def block_widgets(self, *widgets): - for w in widgets: - w.blockSignals(True) - yield - for w in widgets: - w.blockSignals(False) - - def refresh_methods(self, text): - current = self.method_combo.currentText() - with self.block_widgets(self.method_combo): - self.method_combo.clear() - if text == "Discrete": - items = self.discrete_items - self.method_combo.addItems(items) - if current in items: - self.method_combo.setCurrentText(current) - elif current == "No normalization" and "rounded" in items: - self.method_combo.setCurrentText("rounded") - else: - self.method_combo.addItems(list(self.norm_map)) - if current in self.norm_map: - self.method_combo.setCurrentText(current) - else: - self.method_combo.setCurrentText("No normalization") - - self.refresh_current_widget() - - def refresh_current_widget(self): - if self.current_widget is not None: - self.current_widget.setVisible(False) - if self.type_combo.currentText() == "Continuous": - s = self.method_combo.currentText() - norm = self.norm_map[s]( - *self.default_args.get(s, []), **self.default_kws.get(s, {}) - ) - self.current_widget = self.get_norm_widget(norm) - else: - if self.method_combo.currentText() != "Custom": - self.current_widget = self.get_auto_discrete_array_widget() - else: - self.current_widget = self.get_discrete_array_widget() - if self.current_widget is not None: - self.current_widget.setVisible(True) - self.current_widget.set_obj() - - def get_auto_discrete_array_widget(self): - method = self.method_combo.currentText() - if self._auto_array_widget is not None: - self._auto_array_widget.method = method - else: - self._auto_array_widget = DataTicksCalculatorFmtWidget( - self._editor, method, self.methods_type - ) - self.layout().insertWidget(3, self._auto_array_widget) - - fmto = self._editor.fmto - self._auto_array_widget.refresh(self.method_combo.currentText(), fmto) - return self._auto_array_widget - - def get_discrete_array_widget(self): - if self._array_widget is not None: - return self._array_widget - fmto = self._editor.fmto - try: - arr = fmto.norm.boundaries - except AttributeError: - arr = fmto.calc_funcs["rounded"]() - self._array_widget = ArrayFmtWidget(self._editor, arr) - self.layout().insertWidget(3, self._array_widget) - return self._array_widget - - def get_norm_widget(self, norm): - if self._norm_widget is not None: - if norm.__class__ is not self._norm_widget.norm.__class__: - # don't use isinstance here because of mcol.Normalize - self._norm_widget.norm = norm - self._norm_widget.fill_from_norm() - return self._norm_widget - self._norm_widget = NormalizationWidget(self._editor, norm) - self.layout().insertWidget(3, self._norm_widget) - return self._norm_widget - - def set_obj(self, obj): - self._editor.set_obj(obj) - - -class CTicksFmtWidget(BoundsFmtWidget): - """The formatoptions widget for the colorbar ticks.""" - - methods = ["Discrete", "Auto"] - - norm_map = {} - - methods_type = CTicksType - - auto_val = None - - def set_value(self, value): - if value is self.auto_val: - with self.block_widgets(self.method_combo, self.type_combo): - self.type_combo.setCurrentText("Auto") - self.refresh_methods("Auto") - else: - super().set_value(value) - - def refresh_methods(self, text): - if text == "Auto": - with self.block_widgets(self.method_combo): - self.method_combo.clear() - self.set_obj(self.auto_val) - self.refresh_current_widget() - else: - super().refresh_methods(text) - - def refresh_current_widget(self): - w = self.current_widget - auto_ticks = self.type_combo.currentText() == "Auto" - if auto_ticks and w is not None: - w.setVisible(False) - self.current_widget = None - if not auto_ticks: - super().refresh_current_widget() - - -if __name__ == "__main__": - # build colormap thumbnails - import matplotlib.pyplot as plt - - available_cmaps = set( - chain(plt.cm.cmap_d, psc._cmapnames, rcParams["colors.cmaps"]) - ) - N = len(available_cmaps) - for i, cmap in enumerate(available_cmaps, 1): - print("%i of %i: Generating thumb %s" % (i, N, cmap)) - create_cmap_thumb(cmap, get_icon(osp.join("cmaps", cmap))) diff --git a/psy_simple/widgets/icons/bold.png b/psy_simple/widgets/icons/bold.png deleted file mode 100644 index d268bf89..00000000 Binary files a/psy_simple/widgets/icons/bold.png and /dev/null differ diff --git a/psy_simple/widgets/icons/bold.png.license b/psy_simple/widgets/icons/bold.png.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/bold.png.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/bold.svg b/psy_simple/widgets/icons/bold.svg deleted file mode 100644 index 9bf21ad4..00000000 --- a/psy_simple/widgets/icons/bold.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/psy_simple/widgets/icons/bold.svg.license b/psy_simple/widgets/icons/bold.svg.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/bold.svg.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Accent.png b/psy_simple/widgets/icons/cmaps/Accent.png deleted file mode 100644 index b58f05d0..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Accent.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Accent.png.license b/psy_simple/widgets/icons/cmaps/Accent.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Accent.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Accent_r.png b/psy_simple/widgets/icons/cmaps/Accent_r.png deleted file mode 100644 index f75cd0a8..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Accent_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Accent_r.png.license b/psy_simple/widgets/icons/cmaps/Accent_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Accent_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Blues.png b/psy_simple/widgets/icons/cmaps/Blues.png deleted file mode 100644 index 2c3e0511..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Blues.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Blues.png.license b/psy_simple/widgets/icons/cmaps/Blues.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Blues.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Blues_r.png b/psy_simple/widgets/icons/cmaps/Blues_r.png deleted file mode 100644 index 6ab33947..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Blues_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Blues_r.png.license b/psy_simple/widgets/icons/cmaps/Blues_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Blues_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BrBG.png b/psy_simple/widgets/icons/cmaps/BrBG.png deleted file mode 100644 index 4e54e6c2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BrBG.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BrBG.png.license b/psy_simple/widgets/icons/cmaps/BrBG.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BrBG.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BrBG_r.png b/psy_simple/widgets/icons/cmaps/BrBG_r.png deleted file mode 100644 index 61ab40f1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BrBG_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BrBG_r.png.license b/psy_simple/widgets/icons/cmaps/BrBG_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BrBG_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BuGn.png b/psy_simple/widgets/icons/cmaps/BuGn.png deleted file mode 100644 index 27ccebcf..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BuGn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BuGn.png.license b/psy_simple/widgets/icons/cmaps/BuGn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BuGn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BuGn_r.png b/psy_simple/widgets/icons/cmaps/BuGn_r.png deleted file mode 100644 index a21fbb5f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BuGn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BuGn_r.png.license b/psy_simple/widgets/icons/cmaps/BuGn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BuGn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BuPu.png b/psy_simple/widgets/icons/cmaps/BuPu.png deleted file mode 100644 index 0a7ec589..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BuPu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BuPu.png.license b/psy_simple/widgets/icons/cmaps/BuPu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BuPu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/BuPu_r.png b/psy_simple/widgets/icons/cmaps/BuPu_r.png deleted file mode 100644 index 58ecd876..00000000 Binary files a/psy_simple/widgets/icons/cmaps/BuPu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/BuPu_r.png.license b/psy_simple/widgets/icons/cmaps/BuPu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/BuPu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/CMRmap.png b/psy_simple/widgets/icons/cmaps/CMRmap.png deleted file mode 100644 index 135b47ae..00000000 Binary files a/psy_simple/widgets/icons/cmaps/CMRmap.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/CMRmap.png.license b/psy_simple/widgets/icons/cmaps/CMRmap.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/CMRmap.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/CMRmap_r.png b/psy_simple/widgets/icons/cmaps/CMRmap_r.png deleted file mode 100644 index adc9843d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/CMRmap_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/CMRmap_r.png.license b/psy_simple/widgets/icons/cmaps/CMRmap_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/CMRmap_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Dark2.png b/psy_simple/widgets/icons/cmaps/Dark2.png deleted file mode 100644 index b93379bd..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Dark2.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Dark2.png.license b/psy_simple/widgets/icons/cmaps/Dark2.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Dark2.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Dark2_r.png b/psy_simple/widgets/icons/cmaps/Dark2_r.png deleted file mode 100644 index cc73a5e1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Dark2_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Dark2_r.png.license b/psy_simple/widgets/icons/cmaps/Dark2_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Dark2_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/GnBu.png b/psy_simple/widgets/icons/cmaps/GnBu.png deleted file mode 100644 index 4db9c1fc..00000000 Binary files a/psy_simple/widgets/icons/cmaps/GnBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/GnBu.png.license b/psy_simple/widgets/icons/cmaps/GnBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/GnBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/GnBu_r.png b/psy_simple/widgets/icons/cmaps/GnBu_r.png deleted file mode 100644 index 67717164..00000000 Binary files a/psy_simple/widgets/icons/cmaps/GnBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/GnBu_r.png.license b/psy_simple/widgets/icons/cmaps/GnBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/GnBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Greens.png b/psy_simple/widgets/icons/cmaps/Greens.png deleted file mode 100644 index 81dd361c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Greens.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Greens.png.license b/psy_simple/widgets/icons/cmaps/Greens.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Greens.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Greens_r.png b/psy_simple/widgets/icons/cmaps/Greens_r.png deleted file mode 100644 index b86428cd..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Greens_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Greens_r.png.license b/psy_simple/widgets/icons/cmaps/Greens_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Greens_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Greys.png b/psy_simple/widgets/icons/cmaps/Greys.png deleted file mode 100644 index e3b91494..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Greys.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Greys.png.license b/psy_simple/widgets/icons/cmaps/Greys.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Greys.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Greys_r.png b/psy_simple/widgets/icons/cmaps/Greys_r.png deleted file mode 100644 index d4b5dcad..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Greys_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Greys_r.png.license b/psy_simple/widgets/icons/cmaps/Greys_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Greys_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/OrRd.png b/psy_simple/widgets/icons/cmaps/OrRd.png deleted file mode 100644 index b92473aa..00000000 Binary files a/psy_simple/widgets/icons/cmaps/OrRd.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/OrRd.png.license b/psy_simple/widgets/icons/cmaps/OrRd.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/OrRd.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/OrRd_r.png b/psy_simple/widgets/icons/cmaps/OrRd_r.png deleted file mode 100644 index 0770caf8..00000000 Binary files a/psy_simple/widgets/icons/cmaps/OrRd_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/OrRd_r.png.license b/psy_simple/widgets/icons/cmaps/OrRd_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/OrRd_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Oranges.png b/psy_simple/widgets/icons/cmaps/Oranges.png deleted file mode 100644 index ead1e973..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Oranges.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Oranges.png.license b/psy_simple/widgets/icons/cmaps/Oranges.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Oranges.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Oranges_r.png b/psy_simple/widgets/icons/cmaps/Oranges_r.png deleted file mode 100644 index 802c48b9..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Oranges_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Oranges_r.png.license b/psy_simple/widgets/icons/cmaps/Oranges_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Oranges_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PRGn.png b/psy_simple/widgets/icons/cmaps/PRGn.png deleted file mode 100644 index ad3bd9aa..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PRGn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PRGn.png.license b/psy_simple/widgets/icons/cmaps/PRGn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PRGn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PRGn_r.png b/psy_simple/widgets/icons/cmaps/PRGn_r.png deleted file mode 100644 index 3c334214..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PRGn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PRGn_r.png.license b/psy_simple/widgets/icons/cmaps/PRGn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PRGn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Paired.png b/psy_simple/widgets/icons/cmaps/Paired.png deleted file mode 100644 index ff1091fb..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Paired.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Paired.png.license b/psy_simple/widgets/icons/cmaps/Paired.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Paired.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Paired_r.png b/psy_simple/widgets/icons/cmaps/Paired_r.png deleted file mode 100644 index 9895a877..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Paired_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Paired_r.png.license b/psy_simple/widgets/icons/cmaps/Paired_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Paired_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Pastel1.png b/psy_simple/widgets/icons/cmaps/Pastel1.png deleted file mode 100644 index 8bc0e44f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Pastel1.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Pastel1.png.license b/psy_simple/widgets/icons/cmaps/Pastel1.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Pastel1.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Pastel1_r.png b/psy_simple/widgets/icons/cmaps/Pastel1_r.png deleted file mode 100644 index 31c5bb00..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Pastel1_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Pastel1_r.png.license b/psy_simple/widgets/icons/cmaps/Pastel1_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Pastel1_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Pastel2.png b/psy_simple/widgets/icons/cmaps/Pastel2.png deleted file mode 100644 index f2645104..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Pastel2.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Pastel2.png.license b/psy_simple/widgets/icons/cmaps/Pastel2.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Pastel2.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Pastel2_r.png b/psy_simple/widgets/icons/cmaps/Pastel2_r.png deleted file mode 100644 index 03f84985..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Pastel2_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Pastel2_r.png.license b/psy_simple/widgets/icons/cmaps/Pastel2_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Pastel2_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PiYG.png b/psy_simple/widgets/icons/cmaps/PiYG.png deleted file mode 100644 index 59cc545f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PiYG.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PiYG.png.license b/psy_simple/widgets/icons/cmaps/PiYG.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PiYG.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PiYG_r.png b/psy_simple/widgets/icons/cmaps/PiYG_r.png deleted file mode 100644 index 9f20504f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PiYG_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PiYG_r.png.license b/psy_simple/widgets/icons/cmaps/PiYG_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PiYG_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuBu.png b/psy_simple/widgets/icons/cmaps/PuBu.png deleted file mode 100644 index a75715ea..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuBu.png.license b/psy_simple/widgets/icons/cmaps/PuBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuBuGn.png b/psy_simple/widgets/icons/cmaps/PuBuGn.png deleted file mode 100644 index 9a2c4fd6..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuBuGn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuBuGn.png.license b/psy_simple/widgets/icons/cmaps/PuBuGn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuBuGn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuBuGn_r.png b/psy_simple/widgets/icons/cmaps/PuBuGn_r.png deleted file mode 100644 index b7fb3d55..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuBuGn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuBuGn_r.png.license b/psy_simple/widgets/icons/cmaps/PuBuGn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuBuGn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuBu_r.png b/psy_simple/widgets/icons/cmaps/PuBu_r.png deleted file mode 100644 index c00ad391..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuBu_r.png.license b/psy_simple/widgets/icons/cmaps/PuBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuOr.png b/psy_simple/widgets/icons/cmaps/PuOr.png deleted file mode 100644 index af6f28d5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuOr.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuOr.png.license b/psy_simple/widgets/icons/cmaps/PuOr.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuOr.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuOr_r.png b/psy_simple/widgets/icons/cmaps/PuOr_r.png deleted file mode 100644 index 1e80daad..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuOr_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuOr_r.png.license b/psy_simple/widgets/icons/cmaps/PuOr_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuOr_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuRd.png b/psy_simple/widgets/icons/cmaps/PuRd.png deleted file mode 100644 index e29f01d4..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuRd.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuRd.png.license b/psy_simple/widgets/icons/cmaps/PuRd.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuRd.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/PuRd_r.png b/psy_simple/widgets/icons/cmaps/PuRd_r.png deleted file mode 100644 index 0232e56c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/PuRd_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/PuRd_r.png.license b/psy_simple/widgets/icons/cmaps/PuRd_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/PuRd_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Purples.png b/psy_simple/widgets/icons/cmaps/Purples.png deleted file mode 100644 index 5fa19e9c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Purples.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Purples.png.license b/psy_simple/widgets/icons/cmaps/Purples.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Purples.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Purples_r.png b/psy_simple/widgets/icons/cmaps/Purples_r.png deleted file mode 100644 index 28801c5d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Purples_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Purples_r.png.license b/psy_simple/widgets/icons/cmaps/Purples_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Purples_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdBu.png b/psy_simple/widgets/icons/cmaps/RdBu.png deleted file mode 100644 index f0440a37..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdBu.png.license b/psy_simple/widgets/icons/cmaps/RdBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdBu_r.png b/psy_simple/widgets/icons/cmaps/RdBu_r.png deleted file mode 100644 index 1006ed51..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdBu_r.png.license b/psy_simple/widgets/icons/cmaps/RdBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdGy.png b/psy_simple/widgets/icons/cmaps/RdGy.png deleted file mode 100644 index 3976325e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdGy.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdGy.png.license b/psy_simple/widgets/icons/cmaps/RdGy.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdGy.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdGy_r.png b/psy_simple/widgets/icons/cmaps/RdGy_r.png deleted file mode 100644 index 9d1378ab..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdGy_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdGy_r.png.license b/psy_simple/widgets/icons/cmaps/RdGy_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdGy_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdPu.png b/psy_simple/widgets/icons/cmaps/RdPu.png deleted file mode 100644 index df6f259f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdPu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdPu.png.license b/psy_simple/widgets/icons/cmaps/RdPu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdPu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdPu_r.png b/psy_simple/widgets/icons/cmaps/RdPu_r.png deleted file mode 100644 index 64d801c9..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdPu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdPu_r.png.license b/psy_simple/widgets/icons/cmaps/RdPu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdPu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdYlBu.png b/psy_simple/widgets/icons/cmaps/RdYlBu.png deleted file mode 100644 index f6a2a52e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdYlBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdYlBu.png.license b/psy_simple/widgets/icons/cmaps/RdYlBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdYlBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdYlBu_r.png b/psy_simple/widgets/icons/cmaps/RdYlBu_r.png deleted file mode 100644 index 08a65c5e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdYlBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdYlBu_r.png.license b/psy_simple/widgets/icons/cmaps/RdYlBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdYlBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdYlGn.png b/psy_simple/widgets/icons/cmaps/RdYlGn.png deleted file mode 100644 index cb6d699f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdYlGn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdYlGn.png.license b/psy_simple/widgets/icons/cmaps/RdYlGn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdYlGn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/RdYlGn_r.png b/psy_simple/widgets/icons/cmaps/RdYlGn_r.png deleted file mode 100644 index c618e0cd..00000000 Binary files a/psy_simple/widgets/icons/cmaps/RdYlGn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/RdYlGn_r.png.license b/psy_simple/widgets/icons/cmaps/RdYlGn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/RdYlGn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Reds.png b/psy_simple/widgets/icons/cmaps/Reds.png deleted file mode 100644 index 43122e0b..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Reds.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Reds.png.license b/psy_simple/widgets/icons/cmaps/Reds.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Reds.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Reds_r.png b/psy_simple/widgets/icons/cmaps/Reds_r.png deleted file mode 100644 index 5416f57d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Reds_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Reds_r.png.license b/psy_simple/widgets/icons/cmaps/Reds_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Reds_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set1.png b/psy_simple/widgets/icons/cmaps/Set1.png deleted file mode 100644 index 67c1a723..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set1.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set1.png.license b/psy_simple/widgets/icons/cmaps/Set1.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set1.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set1_r.png b/psy_simple/widgets/icons/cmaps/Set1_r.png deleted file mode 100644 index 7bbc7c56..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set1_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set1_r.png.license b/psy_simple/widgets/icons/cmaps/Set1_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set1_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set2.png b/psy_simple/widgets/icons/cmaps/Set2.png deleted file mode 100644 index ff9eebad..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set2.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set2.png.license b/psy_simple/widgets/icons/cmaps/Set2.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set2.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set2_r.png b/psy_simple/widgets/icons/cmaps/Set2_r.png deleted file mode 100644 index 8839849f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set2_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set2_r.png.license b/psy_simple/widgets/icons/cmaps/Set2_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set2_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set3.png b/psy_simple/widgets/icons/cmaps/Set3.png deleted file mode 100644 index 604c5a1a..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set3.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set3.png.license b/psy_simple/widgets/icons/cmaps/Set3.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set3.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Set3_r.png b/psy_simple/widgets/icons/cmaps/Set3_r.png deleted file mode 100644 index e28a50d2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Set3_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Set3_r.png.license b/psy_simple/widgets/icons/cmaps/Set3_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Set3_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Spectral.png b/psy_simple/widgets/icons/cmaps/Spectral.png deleted file mode 100644 index 49dede85..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Spectral.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Spectral.png.license b/psy_simple/widgets/icons/cmaps/Spectral.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Spectral.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Spectral_r.png b/psy_simple/widgets/icons/cmaps/Spectral_r.png deleted file mode 100644 index bf3cd0ce..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Spectral_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Spectral_r.png.license b/psy_simple/widgets/icons/cmaps/Spectral_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Spectral_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Wistia.png b/psy_simple/widgets/icons/cmaps/Wistia.png deleted file mode 100644 index c54de851..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Wistia.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Wistia.png.license b/psy_simple/widgets/icons/cmaps/Wistia.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Wistia.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/Wistia_r.png b/psy_simple/widgets/icons/cmaps/Wistia_r.png deleted file mode 100644 index ff92c1a1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/Wistia_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/Wistia_r.png.license b/psy_simple/widgets/icons/cmaps/Wistia_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/Wistia_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlGn.png b/psy_simple/widgets/icons/cmaps/YlGn.png deleted file mode 100644 index da82617e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlGn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlGn.png.license b/psy_simple/widgets/icons/cmaps/YlGn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlGn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlGnBu.png b/psy_simple/widgets/icons/cmaps/YlGnBu.png deleted file mode 100644 index 7ca153e2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlGnBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlGnBu.png.license b/psy_simple/widgets/icons/cmaps/YlGnBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlGnBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlGnBu_r.png b/psy_simple/widgets/icons/cmaps/YlGnBu_r.png deleted file mode 100644 index 88d226bc..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlGnBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlGnBu_r.png.license b/psy_simple/widgets/icons/cmaps/YlGnBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlGnBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlGn_r.png b/psy_simple/widgets/icons/cmaps/YlGn_r.png deleted file mode 100644 index bc213892..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlGn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlGn_r.png.license b/psy_simple/widgets/icons/cmaps/YlGn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlGn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlOrBr.png b/psy_simple/widgets/icons/cmaps/YlOrBr.png deleted file mode 100644 index cbec203f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlOrBr.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlOrBr.png.license b/psy_simple/widgets/icons/cmaps/YlOrBr.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlOrBr.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlOrBr_r.png b/psy_simple/widgets/icons/cmaps/YlOrBr_r.png deleted file mode 100644 index f153be97..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlOrBr_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlOrBr_r.png.license b/psy_simple/widgets/icons/cmaps/YlOrBr_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlOrBr_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlOrRd.png b/psy_simple/widgets/icons/cmaps/YlOrRd.png deleted file mode 100644 index 1642ff13..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlOrRd.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlOrRd.png.license b/psy_simple/widgets/icons/cmaps/YlOrRd.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlOrRd.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/YlOrRd_r.png b/psy_simple/widgets/icons/cmaps/YlOrRd_r.png deleted file mode 100644 index 8830b059..00000000 Binary files a/psy_simple/widgets/icons/cmaps/YlOrRd_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/YlOrRd_r.png.license b/psy_simple/widgets/icons/cmaps/YlOrRd_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/YlOrRd_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/afmhot.png b/psy_simple/widgets/icons/cmaps/afmhot.png deleted file mode 100644 index 5f87976f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/afmhot.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/afmhot.png.license b/psy_simple/widgets/icons/cmaps/afmhot.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/afmhot.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/afmhot_r.png b/psy_simple/widgets/icons/cmaps/afmhot_r.png deleted file mode 100644 index 5d2bc4c1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/afmhot_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/afmhot_r.png.license b/psy_simple/widgets/icons/cmaps/afmhot_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/afmhot_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/autumn.png b/psy_simple/widgets/icons/cmaps/autumn.png deleted file mode 100644 index 0cba9e0f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/autumn.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/autumn.png.license b/psy_simple/widgets/icons/cmaps/autumn.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/autumn.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/autumn_r.png b/psy_simple/widgets/icons/cmaps/autumn_r.png deleted file mode 100644 index f1cfadd3..00000000 Binary files a/psy_simple/widgets/icons/cmaps/autumn_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/autumn_r.png.license b/psy_simple/widgets/icons/cmaps/autumn_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/autumn_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/binary.png b/psy_simple/widgets/icons/cmaps/binary.png deleted file mode 100644 index 16407008..00000000 Binary files a/psy_simple/widgets/icons/cmaps/binary.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/binary.png.license b/psy_simple/widgets/icons/cmaps/binary.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/binary.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/binary_r.png b/psy_simple/widgets/icons/cmaps/binary_r.png deleted file mode 100644 index 43f96856..00000000 Binary files a/psy_simple/widgets/icons/cmaps/binary_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/binary_r.png.license b/psy_simple/widgets/icons/cmaps/binary_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/binary_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/blue_white_red.png b/psy_simple/widgets/icons/cmaps/blue_white_red.png deleted file mode 100644 index 03b54cbf..00000000 Binary files a/psy_simple/widgets/icons/cmaps/blue_white_red.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/blue_white_red.png.license b/psy_simple/widgets/icons/cmaps/blue_white_red.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/blue_white_red.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/blue_white_red_r.png b/psy_simple/widgets/icons/cmaps/blue_white_red_r.png deleted file mode 100644 index 1de791e5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/blue_white_red_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/blue_white_red_r.png.license b/psy_simple/widgets/icons/cmaps/blue_white_red_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/blue_white_red_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/bone.png b/psy_simple/widgets/icons/cmaps/bone.png deleted file mode 100644 index 92a2adef..00000000 Binary files a/psy_simple/widgets/icons/cmaps/bone.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/bone.png.license b/psy_simple/widgets/icons/cmaps/bone.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/bone.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/bone_r.png b/psy_simple/widgets/icons/cmaps/bone_r.png deleted file mode 100644 index 53d458d1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/bone_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/bone_r.png.license b/psy_simple/widgets/icons/cmaps/bone_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/bone_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/brg.png b/psy_simple/widgets/icons/cmaps/brg.png deleted file mode 100644 index 55c7fecb..00000000 Binary files a/psy_simple/widgets/icons/cmaps/brg.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/brg.png.license b/psy_simple/widgets/icons/cmaps/brg.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/brg.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/brg_r.png b/psy_simple/widgets/icons/cmaps/brg_r.png deleted file mode 100644 index 86941929..00000000 Binary files a/psy_simple/widgets/icons/cmaps/brg_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/brg_r.png.license b/psy_simple/widgets/icons/cmaps/brg_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/brg_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/bwr.png b/psy_simple/widgets/icons/cmaps/bwr.png deleted file mode 100644 index 4b9b4ff1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/bwr.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/bwr.png.license b/psy_simple/widgets/icons/cmaps/bwr.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/bwr.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/bwr_r.png b/psy_simple/widgets/icons/cmaps/bwr_r.png deleted file mode 100644 index 9fa791d1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/bwr_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/bwr_r.png.license b/psy_simple/widgets/icons/cmaps/bwr_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/bwr_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cividis.png b/psy_simple/widgets/icons/cmaps/cividis.png deleted file mode 100644 index f63fe23c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cividis.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cividis.png.license b/psy_simple/widgets/icons/cmaps/cividis.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cividis.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cividis_r.png b/psy_simple/widgets/icons/cmaps/cividis_r.png deleted file mode 100644 index b9e46932..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cividis_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cividis_r.png.license b/psy_simple/widgets/icons/cmaps/cividis_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cividis_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cool.png b/psy_simple/widgets/icons/cmaps/cool.png deleted file mode 100644 index 6b5879a9..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cool.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cool.png.license b/psy_simple/widgets/icons/cmaps/cool.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cool.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cool_r.png b/psy_simple/widgets/icons/cmaps/cool_r.png deleted file mode 100644 index e45c6e4f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cool_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cool_r.png.license b/psy_simple/widgets/icons/cmaps/cool_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cool_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/coolwarm.png b/psy_simple/widgets/icons/cmaps/coolwarm.png deleted file mode 100644 index 1b7c710a..00000000 Binary files a/psy_simple/widgets/icons/cmaps/coolwarm.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/coolwarm.png.license b/psy_simple/widgets/icons/cmaps/coolwarm.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/coolwarm.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/coolwarm_r.png b/psy_simple/widgets/icons/cmaps/coolwarm_r.png deleted file mode 100644 index 903b8d67..00000000 Binary files a/psy_simple/widgets/icons/cmaps/coolwarm_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/coolwarm_r.png.license b/psy_simple/widgets/icons/cmaps/coolwarm_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/coolwarm_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/copper.png b/psy_simple/widgets/icons/cmaps/copper.png deleted file mode 100644 index dab4d650..00000000 Binary files a/psy_simple/widgets/icons/cmaps/copper.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/copper.png.license b/psy_simple/widgets/icons/cmaps/copper.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/copper.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/copper_r.png b/psy_simple/widgets/icons/cmaps/copper_r.png deleted file mode 100644 index 7a8972b6..00000000 Binary files a/psy_simple/widgets/icons/cmaps/copper_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/copper_r.png.license b/psy_simple/widgets/icons/cmaps/copper_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/copper_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cubehelix.png b/psy_simple/widgets/icons/cmaps/cubehelix.png deleted file mode 100644 index d0102d7d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cubehelix.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cubehelix.png.license b/psy_simple/widgets/icons/cmaps/cubehelix.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cubehelix.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/cubehelix_r.png b/psy_simple/widgets/icons/cmaps/cubehelix_r.png deleted file mode 100644 index 9139aa74..00000000 Binary files a/psy_simple/widgets/icons/cmaps/cubehelix_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/cubehelix_r.png.license b/psy_simple/widgets/icons/cmaps/cubehelix_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/cubehelix_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/flag.png b/psy_simple/widgets/icons/cmaps/flag.png deleted file mode 100644 index aa339f88..00000000 Binary files a/psy_simple/widgets/icons/cmaps/flag.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/flag.png.license b/psy_simple/widgets/icons/cmaps/flag.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/flag.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/flag_r.png b/psy_simple/widgets/icons/cmaps/flag_r.png deleted file mode 100644 index 9b76a37a..00000000 Binary files a/psy_simple/widgets/icons/cmaps/flag_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/flag_r.png.license b/psy_simple/widgets/icons/cmaps/flag_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/flag_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_earth.png b/psy_simple/widgets/icons/cmaps/gist_earth.png deleted file mode 100644 index fd0a18a2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_earth.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_earth.png.license b/psy_simple/widgets/icons/cmaps/gist_earth.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_earth.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_earth_r.png b/psy_simple/widgets/icons/cmaps/gist_earth_r.png deleted file mode 100644 index 90ca5099..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_earth_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_earth_r.png.license b/psy_simple/widgets/icons/cmaps/gist_earth_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_earth_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_gray.png b/psy_simple/widgets/icons/cmaps/gist_gray.png deleted file mode 100644 index 43f96856..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_gray.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_gray.png.license b/psy_simple/widgets/icons/cmaps/gist_gray.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_gray.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_gray_r.png b/psy_simple/widgets/icons/cmaps/gist_gray_r.png deleted file mode 100644 index 16407008..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_gray_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_gray_r.png.license b/psy_simple/widgets/icons/cmaps/gist_gray_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_gray_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_heat.png b/psy_simple/widgets/icons/cmaps/gist_heat.png deleted file mode 100644 index f740e567..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_heat.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_heat.png.license b/psy_simple/widgets/icons/cmaps/gist_heat.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_heat.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_heat_r.png b/psy_simple/widgets/icons/cmaps/gist_heat_r.png deleted file mode 100644 index 3b3f1ee2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_heat_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_heat_r.png.license b/psy_simple/widgets/icons/cmaps/gist_heat_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_heat_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_ncar.png b/psy_simple/widgets/icons/cmaps/gist_ncar.png deleted file mode 100644 index 80fada97..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_ncar.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_ncar.png.license b/psy_simple/widgets/icons/cmaps/gist_ncar.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_ncar.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_ncar_r.png b/psy_simple/widgets/icons/cmaps/gist_ncar_r.png deleted file mode 100644 index 1016f0b5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_ncar_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_ncar_r.png.license b/psy_simple/widgets/icons/cmaps/gist_ncar_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_ncar_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_rainbow.png b/psy_simple/widgets/icons/cmaps/gist_rainbow.png deleted file mode 100644 index 8633ab86..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_rainbow.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_rainbow.png.license b/psy_simple/widgets/icons/cmaps/gist_rainbow.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_rainbow.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png b/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png deleted file mode 100644 index 0e51440b..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png.license b/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_rainbow_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_stern.png b/psy_simple/widgets/icons/cmaps/gist_stern.png deleted file mode 100644 index f4ec86db..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_stern.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_stern.png.license b/psy_simple/widgets/icons/cmaps/gist_stern.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_stern.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_stern_r.png b/psy_simple/widgets/icons/cmaps/gist_stern_r.png deleted file mode 100644 index b2628e12..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_stern_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_stern_r.png.license b/psy_simple/widgets/icons/cmaps/gist_stern_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_stern_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_yarg.png b/psy_simple/widgets/icons/cmaps/gist_yarg.png deleted file mode 100644 index 16407008..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_yarg.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_yarg.png.license b/psy_simple/widgets/icons/cmaps/gist_yarg.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_yarg.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gist_yarg_r.png b/psy_simple/widgets/icons/cmaps/gist_yarg_r.png deleted file mode 100644 index 43f96856..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gist_yarg_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gist_yarg_r.png.license b/psy_simple/widgets/icons/cmaps/gist_yarg_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gist_yarg_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gnuplot.png b/psy_simple/widgets/icons/cmaps/gnuplot.png deleted file mode 100644 index 8529c3cc..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gnuplot.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gnuplot.png.license b/psy_simple/widgets/icons/cmaps/gnuplot.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gnuplot.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gnuplot2.png b/psy_simple/widgets/icons/cmaps/gnuplot2.png deleted file mode 100644 index 682dd631..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gnuplot2.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gnuplot2.png.license b/psy_simple/widgets/icons/cmaps/gnuplot2.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gnuplot2.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gnuplot2_r.png b/psy_simple/widgets/icons/cmaps/gnuplot2_r.png deleted file mode 100644 index 6897d82a..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gnuplot2_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gnuplot2_r.png.license b/psy_simple/widgets/icons/cmaps/gnuplot2_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gnuplot2_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gnuplot_r.png b/psy_simple/widgets/icons/cmaps/gnuplot_r.png deleted file mode 100644 index 06d9bf3f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gnuplot_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gnuplot_r.png.license b/psy_simple/widgets/icons/cmaps/gnuplot_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gnuplot_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gray.png b/psy_simple/widgets/icons/cmaps/gray.png deleted file mode 100644 index 43f96856..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gray.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gray.png.license b/psy_simple/widgets/icons/cmaps/gray.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gray.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/gray_r.png b/psy_simple/widgets/icons/cmaps/gray_r.png deleted file mode 100644 index 16407008..00000000 Binary files a/psy_simple/widgets/icons/cmaps/gray_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/gray_r.png.license b/psy_simple/widgets/icons/cmaps/gray_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/gray_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/hot.png b/psy_simple/widgets/icons/cmaps/hot.png deleted file mode 100644 index 9de19654..00000000 Binary files a/psy_simple/widgets/icons/cmaps/hot.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/hot.png.license b/psy_simple/widgets/icons/cmaps/hot.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/hot.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/hot_r.png b/psy_simple/widgets/icons/cmaps/hot_r.png deleted file mode 100644 index 81a7c782..00000000 Binary files a/psy_simple/widgets/icons/cmaps/hot_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/hot_r.png.license b/psy_simple/widgets/icons/cmaps/hot_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/hot_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/hsv.png b/psy_simple/widgets/icons/cmaps/hsv.png deleted file mode 100644 index c6867fa6..00000000 Binary files a/psy_simple/widgets/icons/cmaps/hsv.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/hsv.png.license b/psy_simple/widgets/icons/cmaps/hsv.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/hsv.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/hsv_r.png b/psy_simple/widgets/icons/cmaps/hsv_r.png deleted file mode 100644 index 90948ca2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/hsv_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/hsv_r.png.license b/psy_simple/widgets/icons/cmaps/hsv_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/hsv_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/inferno.png b/psy_simple/widgets/icons/cmaps/inferno.png deleted file mode 100644 index 3b6b40ce..00000000 Binary files a/psy_simple/widgets/icons/cmaps/inferno.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/inferno.png.license b/psy_simple/widgets/icons/cmaps/inferno.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/inferno.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/inferno_r.png b/psy_simple/widgets/icons/cmaps/inferno_r.png deleted file mode 100644 index 5217e263..00000000 Binary files a/psy_simple/widgets/icons/cmaps/inferno_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/inferno_r.png.license b/psy_simple/widgets/icons/cmaps/inferno_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/inferno_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/jet.png b/psy_simple/widgets/icons/cmaps/jet.png deleted file mode 100644 index d4a3ee2f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/jet.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/jet.png.license b/psy_simple/widgets/icons/cmaps/jet.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/jet.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/jet_r.png b/psy_simple/widgets/icons/cmaps/jet_r.png deleted file mode 100644 index 3bfdb17f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/jet_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/jet_r.png.license b/psy_simple/widgets/icons/cmaps/jet_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/jet_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/magma.png b/psy_simple/widgets/icons/cmaps/magma.png deleted file mode 100644 index ffaf5538..00000000 Binary files a/psy_simple/widgets/icons/cmaps/magma.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/magma.png.license b/psy_simple/widgets/icons/cmaps/magma.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/magma.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/magma_r.png b/psy_simple/widgets/icons/cmaps/magma_r.png deleted file mode 100644 index 369b219e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/magma_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/magma_r.png.license b/psy_simple/widgets/icons/cmaps/magma_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/magma_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/nipy_spectral.png b/psy_simple/widgets/icons/cmaps/nipy_spectral.png deleted file mode 100644 index fe267699..00000000 Binary files a/psy_simple/widgets/icons/cmaps/nipy_spectral.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/nipy_spectral.png.license b/psy_simple/widgets/icons/cmaps/nipy_spectral.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/nipy_spectral.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png b/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png deleted file mode 100644 index 2a1a0cf8..00000000 Binary files a/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png.license b/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/nipy_spectral_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/ocean.png b/psy_simple/widgets/icons/cmaps/ocean.png deleted file mode 100644 index 69d76a92..00000000 Binary files a/psy_simple/widgets/icons/cmaps/ocean.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/ocean.png.license b/psy_simple/widgets/icons/cmaps/ocean.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/ocean.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/ocean_r.png b/psy_simple/widgets/icons/cmaps/ocean_r.png deleted file mode 100644 index c78672b7..00000000 Binary files a/psy_simple/widgets/icons/cmaps/ocean_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/ocean_r.png.license b/psy_simple/widgets/icons/cmaps/ocean_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/ocean_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/pink.png b/psy_simple/widgets/icons/cmaps/pink.png deleted file mode 100644 index 3cfb3207..00000000 Binary files a/psy_simple/widgets/icons/cmaps/pink.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/pink.png.license b/psy_simple/widgets/icons/cmaps/pink.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/pink.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/pink_r.png b/psy_simple/widgets/icons/cmaps/pink_r.png deleted file mode 100644 index 9b55ae62..00000000 Binary files a/psy_simple/widgets/icons/cmaps/pink_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/pink_r.png.license b/psy_simple/widgets/icons/cmaps/pink_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/pink_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/plasma.png b/psy_simple/widgets/icons/cmaps/plasma.png deleted file mode 100644 index f48967a1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/plasma.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/plasma.png.license b/psy_simple/widgets/icons/cmaps/plasma.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/plasma.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/plasma_r.png b/psy_simple/widgets/icons/cmaps/plasma_r.png deleted file mode 100644 index 023255a7..00000000 Binary files a/psy_simple/widgets/icons/cmaps/plasma_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/plasma_r.png.license b/psy_simple/widgets/icons/cmaps/plasma_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/plasma_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/prism.png b/psy_simple/widgets/icons/cmaps/prism.png deleted file mode 100644 index a25b801f..00000000 Binary files a/psy_simple/widgets/icons/cmaps/prism.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/prism.png.license b/psy_simple/widgets/icons/cmaps/prism.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/prism.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/prism_r.png b/psy_simple/widgets/icons/cmaps/prism_r.png deleted file mode 100644 index d5745276..00000000 Binary files a/psy_simple/widgets/icons/cmaps/prism_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/prism_r.png.license b/psy_simple/widgets/icons/cmaps/prism_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/prism_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/rainbow.png b/psy_simple/widgets/icons/cmaps/rainbow.png deleted file mode 100644 index 3289cd0c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/rainbow.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/rainbow.png.license b/psy_simple/widgets/icons/cmaps/rainbow.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/rainbow.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/rainbow_r.png b/psy_simple/widgets/icons/cmaps/rainbow_r.png deleted file mode 100644 index d5e21a6c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/rainbow_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/rainbow_r.png.license b/psy_simple/widgets/icons/cmaps/rainbow_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/rainbow_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/red_white_blue.png b/psy_simple/widgets/icons/cmaps/red_white_blue.png deleted file mode 100644 index 1de791e5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/red_white_blue.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/red_white_blue.png.license b/psy_simple/widgets/icons/cmaps/red_white_blue.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/red_white_blue.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/red_white_blue_r.png b/psy_simple/widgets/icons/cmaps/red_white_blue_r.png deleted file mode 100644 index 03b54cbf..00000000 Binary files a/psy_simple/widgets/icons/cmaps/red_white_blue_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/red_white_blue_r.png.license b/psy_simple/widgets/icons/cmaps/red_white_blue_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/red_white_blue_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/rwb.png b/psy_simple/widgets/icons/cmaps/rwb.png deleted file mode 100644 index ce016a1b..00000000 Binary files a/psy_simple/widgets/icons/cmaps/rwb.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/rwb.png.license b/psy_simple/widgets/icons/cmaps/rwb.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/rwb.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/rwb_r.png b/psy_simple/widgets/icons/cmaps/rwb_r.png deleted file mode 100644 index 6962628d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/rwb_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/rwb_r.png.license b/psy_simple/widgets/icons/cmaps/rwb_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/rwb_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/seismic.png b/psy_simple/widgets/icons/cmaps/seismic.png deleted file mode 100644 index 2a694008..00000000 Binary files a/psy_simple/widgets/icons/cmaps/seismic.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/seismic.png.license b/psy_simple/widgets/icons/cmaps/seismic.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/seismic.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/seismic_r.png b/psy_simple/widgets/icons/cmaps/seismic_r.png deleted file mode 100644 index 71953d4a..00000000 Binary files a/psy_simple/widgets/icons/cmaps/seismic_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/seismic_r.png.license b/psy_simple/widgets/icons/cmaps/seismic_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/seismic_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/spring.png b/psy_simple/widgets/icons/cmaps/spring.png deleted file mode 100644 index 33fac3cc..00000000 Binary files a/psy_simple/widgets/icons/cmaps/spring.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/spring.png.license b/psy_simple/widgets/icons/cmaps/spring.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/spring.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/spring_r.png b/psy_simple/widgets/icons/cmaps/spring_r.png deleted file mode 100644 index 674cf182..00000000 Binary files a/psy_simple/widgets/icons/cmaps/spring_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/spring_r.png.license b/psy_simple/widgets/icons/cmaps/spring_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/spring_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/summer.png b/psy_simple/widgets/icons/cmaps/summer.png deleted file mode 100644 index 0f37ed75..00000000 Binary files a/psy_simple/widgets/icons/cmaps/summer.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/summer.png.license b/psy_simple/widgets/icons/cmaps/summer.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/summer.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/summer_r.png b/psy_simple/widgets/icons/cmaps/summer_r.png deleted file mode 100644 index f3ac4713..00000000 Binary files a/psy_simple/widgets/icons/cmaps/summer_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/summer_r.png.license b/psy_simple/widgets/icons/cmaps/summer_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/summer_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab10.png b/psy_simple/widgets/icons/cmaps/tab10.png deleted file mode 100644 index 642b55b8..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab10.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab10.png.license b/psy_simple/widgets/icons/cmaps/tab10.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab10.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab10_r.png b/psy_simple/widgets/icons/cmaps/tab10_r.png deleted file mode 100644 index ae00e6ba..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab10_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab10_r.png.license b/psy_simple/widgets/icons/cmaps/tab10_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab10_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20.png b/psy_simple/widgets/icons/cmaps/tab20.png deleted file mode 100644 index 28c03c8c..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20.png.license b/psy_simple/widgets/icons/cmaps/tab20.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20_r.png b/psy_simple/widgets/icons/cmaps/tab20_r.png deleted file mode 100644 index a5ff2992..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20_r.png.license b/psy_simple/widgets/icons/cmaps/tab20_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20b.png b/psy_simple/widgets/icons/cmaps/tab20b.png deleted file mode 100644 index 0e981390..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20b.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20b.png.license b/psy_simple/widgets/icons/cmaps/tab20b.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20b.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20b_r.png b/psy_simple/widgets/icons/cmaps/tab20b_r.png deleted file mode 100644 index 1a52c547..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20b_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20b_r.png.license b/psy_simple/widgets/icons/cmaps/tab20b_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20b_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20c.png b/psy_simple/widgets/icons/cmaps/tab20c.png deleted file mode 100644 index bff5b8be..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20c.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20c.png.license b/psy_simple/widgets/icons/cmaps/tab20c.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20c.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/tab20c_r.png b/psy_simple/widgets/icons/cmaps/tab20c_r.png deleted file mode 100644 index dcdeb709..00000000 Binary files a/psy_simple/widgets/icons/cmaps/tab20c_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/tab20c_r.png.license b/psy_simple/widgets/icons/cmaps/tab20c_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/tab20c_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/terrain.png b/psy_simple/widgets/icons/cmaps/terrain.png deleted file mode 100644 index 9a68f395..00000000 Binary files a/psy_simple/widgets/icons/cmaps/terrain.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/terrain.png.license b/psy_simple/widgets/icons/cmaps/terrain.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/terrain.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/terrain_r.png b/psy_simple/widgets/icons/cmaps/terrain_r.png deleted file mode 100644 index 6a1e4ca6..00000000 Binary files a/psy_simple/widgets/icons/cmaps/terrain_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/terrain_r.png.license b/psy_simple/widgets/icons/cmaps/terrain_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/terrain_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/twilight.png b/psy_simple/widgets/icons/cmaps/twilight.png deleted file mode 100644 index 803daf9e..00000000 Binary files a/psy_simple/widgets/icons/cmaps/twilight.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/twilight.png.license b/psy_simple/widgets/icons/cmaps/twilight.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/twilight.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/twilight_r.png b/psy_simple/widgets/icons/cmaps/twilight_r.png deleted file mode 100644 index 1b4911b2..00000000 Binary files a/psy_simple/widgets/icons/cmaps/twilight_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/twilight_r.png.license b/psy_simple/widgets/icons/cmaps/twilight_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/twilight_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/twilight_shifted.png b/psy_simple/widgets/icons/cmaps/twilight_shifted.png deleted file mode 100644 index ad2f7297..00000000 Binary files a/psy_simple/widgets/icons/cmaps/twilight_shifted.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/twilight_shifted.png.license b/psy_simple/widgets/icons/cmaps/twilight_shifted.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/twilight_shifted.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png b/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png deleted file mode 100644 index d3b11377..00000000 Binary files a/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png.license b/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/twilight_shifted_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/viridis.png b/psy_simple/widgets/icons/cmaps/viridis.png deleted file mode 100644 index 68b03fb9..00000000 Binary files a/psy_simple/widgets/icons/cmaps/viridis.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/viridis.png.license b/psy_simple/widgets/icons/cmaps/viridis.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/viridis.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/viridis_r.png b/psy_simple/widgets/icons/cmaps/viridis_r.png deleted file mode 100644 index 246f6f9d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/viridis_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/viridis_r.png.license b/psy_simple/widgets/icons/cmaps/viridis_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/viridis_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/w_Blues.png b/psy_simple/widgets/icons/cmaps/w_Blues.png deleted file mode 100644 index c6b01954..00000000 Binary files a/psy_simple/widgets/icons/cmaps/w_Blues.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/w_Blues.png.license b/psy_simple/widgets/icons/cmaps/w_Blues.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/w_Blues.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/w_Greens.png b/psy_simple/widgets/icons/cmaps/w_Greens.png deleted file mode 100644 index 3b818b35..00000000 Binary files a/psy_simple/widgets/icons/cmaps/w_Greens.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/w_Greens.png.license b/psy_simple/widgets/icons/cmaps/w_Greens.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/w_Greens.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/w_RdBu.png b/psy_simple/widgets/icons/cmaps/w_RdBu.png deleted file mode 100644 index 3a6ee898..00000000 Binary files a/psy_simple/widgets/icons/cmaps/w_RdBu.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/w_RdBu.png.license b/psy_simple/widgets/icons/cmaps/w_RdBu.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/w_RdBu.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/w_RdBu_r.png b/psy_simple/widgets/icons/cmaps/w_RdBu_r.png deleted file mode 100644 index 4cd01f61..00000000 Binary files a/psy_simple/widgets/icons/cmaps/w_RdBu_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/w_RdBu_r.png.license b/psy_simple/widgets/icons/cmaps/w_RdBu_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/w_RdBu_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/w_Reds.png b/psy_simple/widgets/icons/cmaps/w_Reds.png deleted file mode 100644 index 2d3a2c7d..00000000 Binary files a/psy_simple/widgets/icons/cmaps/w_Reds.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/w_Reds.png.license b/psy_simple/widgets/icons/cmaps/w_Reds.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/w_Reds.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/wbr.png b/psy_simple/widgets/icons/cmaps/wbr.png deleted file mode 100644 index 14cb8857..00000000 Binary files a/psy_simple/widgets/icons/cmaps/wbr.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/wbr.png.license b/psy_simple/widgets/icons/cmaps/wbr.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/wbr.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/wbr_r.png b/psy_simple/widgets/icons/cmaps/wbr_r.png deleted file mode 100644 index 6ed1d3e1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/wbr_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/wbr_r.png.license b/psy_simple/widgets/icons/cmaps/wbr_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/wbr_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/white_blue_red.png b/psy_simple/widgets/icons/cmaps/white_blue_red.png deleted file mode 100644 index fb779fce..00000000 Binary files a/psy_simple/widgets/icons/cmaps/white_blue_red.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/white_blue_red.png.license b/psy_simple/widgets/icons/cmaps/white_blue_red.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/white_blue_red.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/white_blue_red_r.png b/psy_simple/widgets/icons/cmaps/white_blue_red_r.png deleted file mode 100644 index 43ac2ee8..00000000 Binary files a/psy_simple/widgets/icons/cmaps/white_blue_red_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/white_blue_red_r.png.license b/psy_simple/widgets/icons/cmaps/white_blue_red_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/white_blue_red_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/white_red_blue.png b/psy_simple/widgets/icons/cmaps/white_red_blue.png deleted file mode 100644 index 2d4d7600..00000000 Binary files a/psy_simple/widgets/icons/cmaps/white_red_blue.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/white_red_blue.png.license b/psy_simple/widgets/icons/cmaps/white_red_blue.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/white_red_blue.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/white_red_blue_r.png b/psy_simple/widgets/icons/cmaps/white_red_blue_r.png deleted file mode 100644 index 41b9a4cf..00000000 Binary files a/psy_simple/widgets/icons/cmaps/white_red_blue_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/white_red_blue_r.png.license b/psy_simple/widgets/icons/cmaps/white_red_blue_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/white_red_blue_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/winter.png b/psy_simple/widgets/icons/cmaps/winter.png deleted file mode 100644 index 8da07ea5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/winter.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/winter.png.license b/psy_simple/widgets/icons/cmaps/winter.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/winter.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/winter_r.png b/psy_simple/widgets/icons/cmaps/winter_r.png deleted file mode 100644 index fe1b61eb..00000000 Binary files a/psy_simple/widgets/icons/cmaps/winter_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/winter_r.png.license b/psy_simple/widgets/icons/cmaps/winter_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/winter_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/wrb.png b/psy_simple/widgets/icons/cmaps/wrb.png deleted file mode 100644 index 63049da1..00000000 Binary files a/psy_simple/widgets/icons/cmaps/wrb.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/wrb.png.license b/psy_simple/widgets/icons/cmaps/wrb.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/wrb.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/cmaps/wrb_r.png b/psy_simple/widgets/icons/cmaps/wrb_r.png deleted file mode 100644 index 01b0b1f5..00000000 Binary files a/psy_simple/widgets/icons/cmaps/wrb_r.png and /dev/null differ diff --git a/psy_simple/widgets/icons/cmaps/wrb_r.png.license b/psy_simple/widgets/icons/cmaps/wrb_r.png.license deleted file mode 100644 index b21fae99..00000000 --- a/psy_simple/widgets/icons/cmaps/wrb_r.png.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/font_color.png b/psy_simple/widgets/icons/font_color.png deleted file mode 100644 index c709ec68..00000000 Binary files a/psy_simple/widgets/icons/font_color.png and /dev/null differ diff --git a/psy_simple/widgets/icons/font_color.png.license b/psy_simple/widgets/icons/font_color.png.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/font_color.png.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/font_color.svg b/psy_simple/widgets/icons/font_color.svg deleted file mode 100644 index d6053918..00000000 --- a/psy_simple/widgets/icons/font_color.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/psy_simple/widgets/icons/font_color.svg.license b/psy_simple/widgets/icons/font_color.svg.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/font_color.svg.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/italic.png b/psy_simple/widgets/icons/italic.png deleted file mode 100644 index 2df29400..00000000 Binary files a/psy_simple/widgets/icons/italic.png and /dev/null differ diff --git a/psy_simple/widgets/icons/italic.png.license b/psy_simple/widgets/icons/italic.png.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/italic.png.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/icons/italic.svg b/psy_simple/widgets/icons/italic.svg deleted file mode 100644 index b18ad2b4..00000000 --- a/psy_simple/widgets/icons/italic.svg +++ /dev/null @@ -1 +0,0 @@ - diff --git a/psy_simple/widgets/icons/italic.svg.license b/psy_simple/widgets/icons/italic.svg.license deleted file mode 100644 index a1caed9f..00000000 --- a/psy_simple/widgets/icons/italic.svg.license +++ /dev/null @@ -1,4 +0,0 @@ -SPDX-FileCopyrightText: 2024 Fonticons, Inc. -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC-BY-4.0 diff --git a/psy_simple/widgets/texts.py b/psy_simple/widgets/texts.py deleted file mode 100644 index 674e00df..00000000 --- a/psy_simple/widgets/texts.py +++ /dev/null @@ -1,501 +0,0 @@ -# -*- coding: utf-8 -*- -"""Psyplot GUI widgets for modifying label formatoptions - -This module contains PyQt widgets that can be used to modify label -formatoptions (e.g. title, xlabel, titleprops, etc.) in the psyplot GUI. -""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -from functools import partial -from warnings import warn - -import matplotlib as mpl -import matplotlib.colors as mcol -from psyplot import utils -from psyplot.docstring import docstrings -from psyplot_gui.compat.qtcompat import ( - QComboBox, - QHBoxLayout, - QIcon, - QLabel, - QPushButton, - Qt, - QtGui, - QToolButton, - QWidget, - with_qt5, -) - -from psy_simple.widgets import Switch2FmtButton, get_icon - -if with_qt5: - from PyQt5.QtWidgets import QColorDialog, QFontDialog, QSpinBox -else: - from PyQt4.QtGui import QColorDialog, QFontDialog, QSpinBox - - -if with_qt5: - weights_mpl2qt = dict( - [ - ("ultralight", QtGui.QFont.ExtraLight), - ("light", QtGui.QFont.Light), - ("normal", QtGui.QFont.Normal), - ("regular", QtGui.QFont.Normal), - ("book", QtGui.QFont.Normal), - ("medium", QtGui.QFont.Medium), - ("roman", QtGui.QFont.Medium), - ("semibold", QtGui.QFont.DemiBold), - ("demibold", QtGui.QFont.DemiBold), - ("demi", QtGui.QFont.DemiBold), - ("bold", QtGui.QFont.Bold), - ("heavy", QtGui.QFont.Bold), - ("extra bold", QtGui.QFont.ExtraBold), - ("black", QtGui.QFont.Black), - ] - ) -else: - weights_mpl2qt = dict( - [ - ("ultralight", QtGui.QFont.Light), - ("light", QtGui.QFont.Light), - ("normal", QtGui.QFont.Normal), - ("regular", QtGui.QFont.Normal), - ("book", QtGui.QFont.Normal), - ("medium", QtGui.QFont.Normal), - ("roman", QtGui.QFont.Normal), - ("semibold", QtGui.QFont.DemiBold), - ("demibold", QtGui.QFont.DemiBold), - ("demi", QtGui.QFont.DemiBold), - ("bold", QtGui.QFont.Bold), - ("heavy", QtGui.QFont.Bold), - ("extra bold", QtGui.QFont.Black), - ("black", QtGui.QFont.Black), - ] - ) - - -weights_qt2mpl = dict( - map( - reversed, - utils.unique_everseen(weights_mpl2qt.items(), key=lambda t: t[1]), - ) -) - - -def mpl_weight2qt(weight): - """Convert a weight from matplotlib definition to a Qt weight - - Parameters - ---------- - weight: int or string - Either an integer between 1 and 1000 or a string out of - :attr:`weights_mpl2qt` - - Returns - ------- - int - One type of the PyQt5.QtGui.QFont.Weight""" - try: - weight = weights_mpl2qt[weight] - except KeyError: - try: - weight = float(weight) / 10 - except (ValueError, TypeError): - weight = QtGui.QFont.Normal - else: - try: - weight = min( - filter(lambda w: w >= weight, weights_qt2mpl), - key=lambda w: abs(w - weight), - ) - except ValueError: - weight = QtGui.QFont.Normal - return weight - - -class DictCombo(QComboBox): - """A combobox that inserts keys into the formatoption""" - - def __init__(self, attrs, fmt_widget, modulo_style=True): - QComboBox.__init__(self) - self.fmt_widget = fmt_widget - self.addItems( - [""] + [(key + ": " + str(val))[:40] for key, val in attrs.items()] - ) - func = self.insert_modulo if modulo_style else self.insert_bracketed - self.currentTextChanged.connect(func) - - def insert_modulo(self, s): - self.fmt_widget.insert_obj( - ("%(" + s.split(":")[0] + ")s") if s else "" - ) - - def insert_bracketed(self, s): - self.fmt_widget.insert_obj(("{" + s.split(":")[0] + "}") if s else "") - - -class LabelWidget(QWidget): - """A widget to modify a text label (title, xlabel, etc.) - - This widget contains one combobox for the ``'labels'`` key in the - :attr:`psyplot.rcParams` dictionary, and a second combobox for the - enhanced attributes of the corresponding formatoption object `fmto`. - - Additionally, it provides buttons to switch to the formatoption options - of the corresponding fontsize, fontweight and fontproperties of this - label""" - - @docstrings.get_sections(base="LabelWidget") - def __init__(self, parent, fmto, project, properties=True): - """ - Parameters - ---------- - parent: psyplot_gui.fmt_widget.FormatoptionWidget - The formatoption widget where this widget is inserted - fmto: psyplot.plotter.Formatoption - The formatoption that is represented by this widget - project: psyplot.project.Project - The current psyplot subproject""" - QWidget.__init__(self, parent) - hbox = QHBoxLayout() - - # Create a combo box for the rcParams 'labels' key - label_combo = DictCombo(fmto.rc["labels"], parent, modulo_style=False) - hbox.addWidget(label_combo) - - # Create a combo for the :attr:`enhanced_attrs` - attrs = dict( - sorted( - utils.join_dicts( - [ - getattr(plotter, fmto.key).enhanced_attrs - for plotter in project.plotters - ], - delimiter=", ", - ).items() - ) - ) - attr_combo = DictCombo(attrs, parent) - hbox.addWidget(attr_combo) - - fmtos = [ - # add a button to change to the properties formatoption - getattr(fmto.plotter, fmto.key + "props", None), - getattr(fmto.plotter, fmto.key + "size", None), - getattr(fmto.plotter, fmto.key + "weight", None), - ] - fmtos = list(filter(None, fmtos)) - if fmtos and properties: - hbox.addWidget(Switch2FmtButton(parent, *fmtos)) - - self.setLayout(hbox) - - -docstrings.keep_params("LabelWidget.parameters", "parent", "fmto") - - -class FontWeightWidget(QWidget): - """A widget for modifying the fontweight of a label""" - - @docstrings.get_sections(base="FontWeightWidget") - @docstrings.with_indent(8) - def __init__(self, parent, fmto, artist=None, base=None): - """ - Parameters - ---------- - %(LabelWidget.parameters.parent|fmto)s - artist: matplotlib.text.Text - The text instance this formatoption is modifying - base: psyplot.plotter.Formatoption - The original formatoption of the label the given `fmto` belongs to - """ - QWidget.__init__(self, parent) - hbox = QHBoxLayout() - hbox.addWidget(QLabel("Font weights:")) - if artist is None: - weight = "normal" - else: - weight = artist.get_weight() - - self.spin_box = spin_box = QSpinBox(self) - spin_box.setRange(1, 1000) - try: - weight = int(weight) - except ValueError: - spin_box.setValue(mpl_weight2qt(weight) * 10) - else: - spin_box.setValue(weight) - spin_box.valueChanged.connect(parent.set_obj) - hbox.addWidget(spin_box) - - combo = QComboBox() - combo.addItems(list(weights_mpl2qt)) - if weight in weights_mpl2qt: - combo.setCurrentText(weight) - else: - combo.setCurrentText(weights_qt2mpl[mpl_weight2qt(weight)]) - combo.currentTextChanged.connect(parent.set_obj) - hbox.addWidget(combo) - - # add a button to change to the properties formatoption - if base is not None: - fmtos = [ - base, - getattr(fmto.plotter, base.key + "props", None), - getattr(fmto.plotter, base.key + "size", None), - ] - fmtos = list(filter(None, fmtos)) - hbox.addWidget(Switch2FmtButton(parent, *fmtos)) - - self.setLayout(hbox) - - -class FontSizeWidget(QWidget): - """A widget for modifying the fontsize of a label""" - - @docstrings.with_indent(8) - def __init__(self, parent, fmto, artist=None, base=None): - """ - Parameters - ---------- - %(FontWeightWidget.parameters)s - """ - QWidget.__init__(self, parent) - hbox = QHBoxLayout() - hbox.addWidget(QLabel("Font sizes:")) - - self.spin_box = spin_box = QSpinBox(self) - spin_box.setRange(1, int(1e9)) - if artist is not None: - spin_box.setValue(int(artist.get_size())) - - spin_box.valueChanged.connect(parent.set_obj) - hbox.addWidget(spin_box) - - combo = QComboBox() - combo.addItems( - [ - "xx-small", - "x-small", - "small", - "medium", - "large", - "x-large", - "xx-large", - ] - ) - combo.currentTextChanged.connect(parent.set_obj) - hbox.addWidget(combo) - - # add a button to change to the properties formatoption - if base is not None: - fmtos = [ - base, - getattr(fmto.plotter, base.key + "props", None), - getattr(fmto.plotter, base.key + "weight", None), - ] - fmtos = list(filter(None, fmtos)) - hbox.addWidget(Switch2FmtButton(parent, *fmtos)) - - self.setLayout(hbox) - - -class FontPropertiesWidget(QWidget): - """A widget for modifying the font properties or a label""" - - #: The current QFont of the artist - current_font = None - - @docstrings.with_indent(8) - def __init__(self, parent, fmto, artist=None, base=None): - """ - Parameters - ---------- - %(FontWeightWidget.parameters)s - """ - QWidget.__init__(self, parent) - hbox = QHBoxLayout() - if artist is not None: - self.current_font = self.artist_to_qfont(artist) - self.current_color = QtGui.QColor.fromRgbF( - *mcol.to_rgba(artist.get_color()) - ) - else: - self.current_color = QtGui.QColor(Qt.black) - self.fmto_name = fmto.name or fmto.key - - # choose font button - button = QPushButton("Choose font") - button.clicked.connect(partial(self.choose_font, None)) - hbox.addWidget(button) - - # font size spin box - self.spin_box = spin_box = QSpinBox(self) - spin_box.setRange(1, int(1e9)) - if artist is not None: - spin_box.setValue(int(artist.get_size())) - spin_box.valueChanged.connect(self.modify_size) - hbox.addWidget(spin_box) - - # font color button - self.btn_font_color = button = QToolButton(self) - button.setIcon(QIcon(get_icon("font_color"))) - button.clicked.connect(partial(self.choose_color, None)) - hbox.addWidget(button) - - # bold button - self.btn_bold = button = QToolButton(self) - button.setIcon(QIcon(get_icon("bold"))) - button.clicked.connect(self.toggle_bold) - button.setCheckable(True) - if artist is not None: - button.setChecked(self.current_font.weight() > 50) - hbox.addWidget(button) - - # italic button - self.btn_italic = button = QToolButton(self) - button.setIcon(QIcon(get_icon("italic"))) - button.clicked.connect(self.toggle_italic) - button.setCheckable(True) - if artist is not None: - button.setChecked(self.current_font.italic()) - hbox.addWidget(button) - - if base is not None: - # add a button to change to the base formatoption - fmtos = [ - base, - getattr(fmto.plotter, base.key + "size", None), - getattr(fmto.plotter, base.key + "weight", None), - ] - fmtos = list(filter(None, fmtos)) - hbox.addWidget(Switch2FmtButton(parent, *fmtos)) - - self.setLayout(hbox) - - @staticmethod - def artist_to_qfont(artist): - """Convert a :class:`matplotlib.text.Text` artist to a QFont object - - Parameters - ---------- - artist: matplotlib.text.Text - The text artist, e.g. an axes title - - Returns - ------- - PyQt5.QtGui.QFont - The QFont object""" - size = int(artist.get_size()) - weight = mpl_weight2qt(artist.get_weight()) - italic = artist.get_style() == "italic" - for family in artist.get_family(): - if family in ["sans-serif", "cursive", "monospace", "serif"]: - for name in mpl.rcParams["font." + family]: - font = QtGui.QFont(name, size, weight, italic) - if font.exactMatch(): - break - else: - font = QtGui.QFont(family, size, weight, italic) - return font - - @staticmethod - def qfont_to_artist_props(font): - properties = { - "family": font.family(), - "size": font.pointSize(), - "weight": weights_qt2mpl[font.weight()], - "style": "italic" if font.italic() else "normal", - } - if font.underline(): - warn( - "Underline is ignored! Use LaTeX syntax: $\\underline{text}$!" - ) - if font.strikeOut(): - warn("StrikeOut is ignored! Use LaTeX syntax: $\\sout{text}$!") - return properties - - def modify_size(self, val): - properties = self.load_properties() - properties["fontsize" if "fontsize" in properties else "size"] = val - self.current_font.setPointSize(val) - self.parent().set_obj(properties) - - def toggle_bold(self): - properties = self.load_properties() - bold = self.btn_bold.isChecked() - properties["weight"] = "bold" if bold else "normal" - self.current_font.setBold(bold) - self.parent().set_obj(properties) - - def toggle_italic(self): - properties = self.load_properties() - italic = self.btn_italic.isChecked() - properties["style"] = "italic" if italic else "normal" - self.current_font.setItalic(italic) - self.parent().set_obj(properties) - - def load_properties(self): - return dict(self.parent().get_obj() or {}) - - def choose_font(self, font=None): - """Choose a font for the label through a dialog""" - fmt_widget = self.parent() - if font is None: - if self.current_font: - font, ok = QFontDialog.getFont( - self.current_font, - fmt_widget, - "Select %s font" % self.fmto_name, - QFontDialog.DontUseNativeDialog, - ) - else: - font, ok = QFontDialog.getFont(fmt_widget) - if not ok: - return - self.current_font = font - properties = self.load_properties() - properties.update(self.qfont_to_artist_props(font)) - fmt_widget.set_obj(properties) - self.refresh() - - def refresh(self): - """Refresh the widgets from the current font""" - font = self.current_font - - # refresh btn_bold - self.btn_bold.blockSignals(True) - self.btn_bold.setChecked(font.weight() > 50) - self.btn_bold.blockSignals(False) - - # refresh btn_italic - self.btn_italic.blockSignals(True) - self.btn_italic.setChecked(font.italic()) - self.btn_italic.blockSignals(False) - - # refresh font size - self.spin_box.blockSignals(True) - self.spin_box.setValue(font.pointSize()) - self.spin_box.blockSignals(False) - - def choose_color(self, color=None): - fmt_widget = self.parent() - if color is None: - color = QColorDialog.getColor( - self.current_color, - fmt_widget, - "Select %s color" % self.fmto_name, - ) - if not color.isValid(): - return - self.current_color = color - properties = self.load_properties() - properties["color"] = color.getRgbF() - fmt_widget.set_obj(properties) diff --git a/py-modindex.html b/py-modindex.html new file mode 100644 index 00000000..bbdc9cb4 --- /dev/null +++ b/py-modindex.html @@ -0,0 +1,388 @@ + + + + + + Python Module Index — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + +

Python Module Index

+ +
+ p +
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + +
 
+ p
+ psy_simple +
    + psy_simple.base +
    + psy_simple.colors +
    + psy_simple.plotters +
    + psy_simple.plugin +
    + psy_simple.widgets +
    + psy_simple.widgets.colors +
    + psy_simple.widgets.texts +
+ + +
+
+ + + +
+
+
+
+ + + + \ No newline at end of file diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 4c9f1c7e..00000000 --- a/pyproject.toml +++ /dev/null @@ -1,154 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -[build-system] -build-backend = 'setuptools.build_meta' -requires = ['setuptools >= 61.0', 'versioneer[toml]'] - -[project] -name = "psy-simple" -dynamic = ["version"] -description = "Psyplot plugin for simple visualization tasks" - -readme = "README.rst" -keywords = [ - "visualization", - "psyplot", - "netcdf", - "matplotlib", - ] - -authors = [ - { name = 'Philipp S. Sommer', email = 'philipp.sommer@hereon.de' }, -] -maintainers = [ - { name = 'Philipp S. Sommer', email = 'philipp.sommer@hereon.de' }, -] -license = { text = 'LGPL-3.0-only' } - -classifiers = [ - "Development Status :: 5 - Production/Stable", - "Intended Audience :: Developers", - "Topic :: Scientific/Engineering :: Visualization", - "Topic :: Scientific/Engineering :: GIS", - "Topic :: Scientific/Engineering", - "License :: OSI Approved :: GNU Lesser General Public License v3 (LGPLv3)", - "Programming Language :: Python :: 3", - "Programming Language :: Python :: 3 :: Only", - "Programming Language :: Python :: 3.7", - "Programming Language :: Python :: 3.8", - "Programming Language :: Python :: 3.9", - "Programming Language :: Python :: 3.10", - "Programming Language :: Python :: 3.11", - "Programming Language :: Python :: 3.12", - "Operating System :: OS Independent", -] - -requires-python = '>= 3.9' -dependencies = [ - "psyplot>=1.5.0", - # add your dependencies here - "matplotlib>=2.0", -] - -[project.urls] -Homepage = 'https://codebase.helmholtz.cloud/psyplot/psy-simple' -Documentation = "https://psyplot.github.io/psy-simple" -Source = "https://codebase.helmholtz.cloud/psyplot/psy-simple" -Tracker = "https://codebase.helmholtz.cloud/psyplot/psy-simple/issues/" - - -[project.entry-points."psyplot"] -plugin = "psy_simple.plugin" -patches = "psy_simple.plugin:patches" - -[project.optional-dependencies] -testsite = [ - "tox", - "isort==5.12.0", - "black==23.1.0", - # "blackdoc==0.3.8", - "flake8==6.0.0", - "pre-commit", - "mypy", - "pytest-cov", - "reuse", - "cffconvert", - "pytest-xdist", - "dask", - "netCDF4", - "seaborn", - "statsmodels", - "psyplot_gui", -] - -gui = [ - "psyplot-gui", -] - -docs = [ - "psy-simple[gui]", - "autodocsumm", - "sphinx-rtd-theme", - "hereon-netcdf-sphinxext", - "sphinx-design", - "ipython", - "pickleshare", # required for IPythons savefig - "seaborn", - "dask", - "netCDF4", -] -dev = [ - "psy-simple[testsite]", - "psy-simple[docs]", - "PyYAML", - "types-PyYAML", -] - - -[tool.mypy] -ignore_missing_imports = true - -[tool.setuptools] -zip-safe = false -license-files = ["LICENSES/*"] - -[tool.setuptools.package-data] -psy_simple = [ - "psy_simple/widgets/icons/*.png", - "psy_simple/widgets/icons/cmaps/*.png", -] - -[tool.setuptools.packages.find] -namespaces = false -exclude = [ - 'docs', - 'tests*', - 'examples' -] - -[tool.pytest.ini_options] -addopts = '-v' - -[tool.versioneer] -VCS = 'git' -style = 'pep440' -versionfile_source = 'psy_simple/_version.py' -versionfile_build = 'psy_simple/_version.py' -tag_prefix = 'v' -parentdir_prefix = 'psy-simple-' - -[tool.isort] -profile = "black" -line_length = 79 -src_paths = ["psy_simple"] -float_to_top = true -known_first_party = "psy_simple" - -[tool.black] -line-length = 79 -target-version = ['py39'] - -[tool.coverage.run] -omit = ["psy_simple/_version.py"] diff --git a/search.html b/search.html new file mode 100644 index 00000000..57013256 --- /dev/null +++ b/search.html @@ -0,0 +1,353 @@ + + + + + + Search — psy-simple documentation + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ +
+
+
+
    +
  • + +
  • +
  • +
+
+
+
+
+ + + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + + + + + + \ No newline at end of file diff --git a/searchindex.js b/searchindex.js new file mode 100644 index 00000000..dba6ec7d --- /dev/null +++ b/searchindex.js @@ -0,0 +1 @@ +Search.setIndex({"alltitles": {"API Reference": [[0, null]], "Added": [[9, "added"], [9, "id5"], [9, "id9"], [9, "id12"], [9, "id13"]], "Changed": [[9, "changed"], [9, "id2"], [9, "id6"], [9, "id7"], [9, "id10"], [9, "id14"]], "Changelog": [[9, null]], "Contents:": [[19, null]], "Contribution and development hints": [[10, null]], "Fixed": [[9, "fixed"], [9, "id3"], [9, "id4"], [9, "id8"], [9, "id11"]], "How to cite this software": [[19, "how-to-cite-this-software"]], "Indices and tables": [[19, "indices-and-tables"]], "Installation": [[20, null]], "Installation for development": [[20, "installation-for-development"]], "Installation using conda": [[20, "installation-using-conda"]], "Installation using pip": [[20, "installation-using-pip"]], "Known issues": [[9, "known-issues"]], "License information": [[19, "license-information"]], "Possible types": [[2, null], [2, "id1"], [2, "id2"], [2, "id3"], [2, "id4"], [2, "id5"], [2, "id6"], [2, "id7"], [2, "id8"], [2, "id9"], [2, "id10"], [2, "id11"], [2, "id12"], [2, "id13"], [2, "id14"], [2, "id15"], [2, "id16"], [2, "id17"], [2, "id18"], [2, "id19"], [2, "id20"], [2, "id21"], [2, "id22"], [2, "id23"], [2, "id24"], [2, "id25"], [2, "id26"], [2, "id27"], [4, null], [4, "id1"], [4, "id2"], [4, "id3"], [4, "id4"], [4, "id5"], [4, "id6"], [4, "id7"], [4, "id8"], [4, "id9"], [4, "id10"], [4, "id11"], [4, "id12"], [4, "id13"], [4, "id14"], [4, "id15"], [4, "id16"], [4, "id17"], [4, "id18"], [4, "id19"], [4, "id20"], [4, "id21"], [4, "id22"], [4, "id23"], [4, "id24"], [4, "id25"], [4, "id26"], [4, "id27"], [4, "id28"], [4, "id29"], [4, "id30"], [4, "id31"], [4, "id32"], [4, "id33"], [4, "id34"], [4, "id35"], [4, "id36"], [4, "id37"], [4, "id38"], [4, "id39"], [4, "id40"], [4, "id41"], [4, "id42"], [4, "id43"], [4, "id44"], [4, "id45"], [4, "id46"], [4, "id47"], [4, "id48"], [4, "id49"], [4, "id50"], [4, "id51"], [4, "id52"], [4, "id53"], [4, "id54"], [4, "id55"], [4, "id56"], [4, "id57"], [4, "id58"], [4, "id59"], [4, "id60"], [4, "id61"], [4, "id62"], [4, "id63"], [4, "id64"], [4, "id65"], [4, "id66"], [4, "id67"], [4, "id68"], [4, "id69"], [4, "id70"], [4, "id71"], [4, "id72"], [4, "id73"], [4, "id74"], [4, "id75"], [4, "id76"], [4, "id77"], [4, "id78"], [4, "id79"], [4, "id80"], [4, "id81"], [4, "id82"], [4, "id83"], [4, "id84"], [4, "id85"], [4, "id86"], [4, "id87"], [4, "id88"], [4, "id89"], [4, "id90"], [4, "id91"], [4, "id92"], [4, "id94"], [4, "id95"], [4, "id96"], [4, "id97"], [4, "id98"], [4, "id99"], [4, "id100"], [4, "id101"], [4, "id102"], [4, "id103"], [4, "id104"], [4, "id105"], [4, "id106"], [4, "id107"], [4, "id108"], [4, "id109"], [4, "id110"], [4, "id111"], [4, "id112"], [4, "id113"], [4, "id114"], [4, "id115"], [4, "id116"], [4, "id117"], [4, "id118"], [4, "id119"], [4, "id120"], [4, "id121"], [4, "id122"], [4, "id123"], [4, "id124"], [4, "id125"], [4, "id126"], [4, "id127"], [4, "id128"], [4, "id129"], [4, "id130"], [4, "id131"], [4, "id132"], [4, "id133"], [4, "id134"], [4, "id135"], [4, "id136"], [4, "id141"], [4, "id142"], [4, "id143"], [4, "id144"], [4, "id145"], [4, "id148"], [4, "id149"], [4, "id150"], [4, "id151"], [4, "id152"], [4, "id153"], [4, "id154"], [4, "id155"], [4, "id156"], [4, "id157"], [4, "id158"], [4, "id159"], [4, "id160"], [4, "id161"], [4, "id162"], [4, "id163"], [4, "id164"], [4, "id165"], [4, "id166"], [4, "id167"], [4, "id168"], [4, "id169"], [4, "id170"], [4, "id171"], [4, "id172"], [4, "id173"], [4, "id174"], [4, "id175"], [4, "id176"], [4, "id177"], [4, "id178"], [4, "id179"], [4, "id180"], [4, "id181"], [4, "id182"], [4, "id183"], [4, "id184"], [4, "id185"], [4, "id186"], [4, "id187"], [4, "id188"], [4, "id189"], [4, "id190"], [4, "id191"], [4, "id192"], [4, "id193"], [4, "id194"], [4, "id195"], [4, "id196"], [4, "id197"], [4, "id198"], [4, "id199"], [4, "id200"], [4, "id201"], [4, "id202"], [4, "id203"], [4, "id204"], [4, "id205"], [4, "id206"], [4, "id207"], [4, "id208"], [4, "id209"], [4, "id210"], [4, "id211"], [4, "id212"], [4, "id213"], [4, "id214"], [4, "id215"], [4, "id216"], [4, "id217"], [4, "id218"], [4, "id219"], [4, "id220"], [4, "id221"], [4, "id222"], [4, "id223"], [4, "id224"], [4, "id225"], [4, "id226"], [4, "id227"], [4, "id228"], [4, "id229"], [4, "id230"], [4, "id231"], [4, "id232"], [4, "id233"], [4, "id234"], [4, "id235"], [4, "id236"], [4, "id237"], [4, "id238"], [4, "id239"], [4, "id240"], [4, "id241"], [4, "id242"]], "Submodules": [[1, "submodules"], [6, "submodules"]], "Subpackages": [[1, "subpackages"]], "Welcome to psy-simple\u2019s documentation!": [[19, null]], "psy_simple package": [[1, null]], "psy_simple.widgets package": [[6, null]], "psyplot plot methods": [[21, null]], "psyplot.project.plot.barplot": [[11, null]], "psyplot.project.plot.combined": [[12, null]], "psyplot.project.plot.density": [[13, null]], "psyplot.project.plot.fldmean": [[14, null]], "psyplot.project.plot.lineplot": [[15, null]], "psyplot.project.plot.plot2d": [[16, null]], "psyplot.project.plot.vector": [[17, null]], "psyplot.project.plot.violinplot": [[18, null]], "v1.1.0": [[9, "v1-1-0"]], "v1.2.0": [[9, "v1-2-0"]], "v1.3.0": [[9, "v1-3-0"]], "v1.3.1": [[9, "v1-3-1"]], "v1.4.0": [[9, "v1-4-0"]], "v1.4.1": [[9, "v1-4-1"]], "v1.5.0": [[9, "v1-5-0"]], "v1.5.1": [[9, "v1-5-1"]]}, "docnames": ["api", "api/psy_simple", "api/psy_simple.base", "api/psy_simple.colors", "api/psy_simple.plotters", "api/psy_simple.plugin", "api/psy_simple.widgets", "api/psy_simple.widgets.colors", "api/psy_simple.widgets.texts", "changelog", "contributing", "generated/psyplot.project.plot.barplot", "generated/psyplot.project.plot.combined", "generated/psyplot.project.plot.density", "generated/psyplot.project.plot.fldmean", "generated/psyplot.project.plot.lineplot", "generated/psyplot.project.plot.plot2d", "generated/psyplot.project.plot.vector", "generated/psyplot.project.plot.violinplot", "index", "installation", "plot_methods"], "envversion": {"sphinx": 62, "sphinx.domains.c": 3, "sphinx.domains.changeset": 1, "sphinx.domains.citation": 1, "sphinx.domains.cpp": 9, "sphinx.domains.index": 1, "sphinx.domains.javascript": 3, "sphinx.domains.math": 2, "sphinx.domains.python": 4, "sphinx.domains.rst": 2, "sphinx.domains.std": 2, "sphinx.ext.intersphinx": 1, "sphinx.ext.todo": 2}, "filenames": ["api.rst", "api/psy_simple.rst", "api/psy_simple.base.rst", "api/psy_simple.colors.rst", "api/psy_simple.plotters.rst", "api/psy_simple.plugin.rst", "api/psy_simple.widgets.rst", "api/psy_simple.widgets.colors.rst", "api/psy_simple.widgets.texts.rst", "changelog.rst", "contributing.rst", "generated/psyplot.project.plot.barplot.rst", "generated/psyplot.project.plot.combined.rst", "generated/psyplot.project.plot.density.rst", "generated/psyplot.project.plot.fldmean.rst", "generated/psyplot.project.plot.lineplot.rst", "generated/psyplot.project.plot.plot2d.rst", "generated/psyplot.project.plot.vector.rst", "generated/psyplot.project.plot.violinplot.rst", "index.rst", "installation.rst", "plot_methods.rst"], "indexentries": {"add2format_coord() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.add2format_coord", false]], "add2format_coord() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.add2format_coord", false]], "adjust_height() (psy_simple.widgets.colors.colorlabel method)": [[7, "psy_simple.widgets.colors.ColorLabel.adjust_height", false]], "allowed_dims (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.allowed_dims", false]], "allowed_dims (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.allowed_dims", false]], "allowed_dims (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.allowed_dims", false]], "allowed_dims (psy_simple.plotters.simple2dbase attribute)": [[4, "psy_simple.plotters.Simple2DBase.allowed_dims", false]], "allowed_dims (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.allowed_dims", false]], "allowed_vars (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.allowed_vars", false]], "allowed_vars (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.allowed_vars", false]], "allowed_vars (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.allowed_vars", false]], "alpha (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.alpha", false]], "alpha (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.alpha", false]], "alternativexcoord (class in psy_simple.plotters)": [[4, "psy_simple.plotters.AlternativeXCoord", false]], "alternativexcoordpost (class in psy_simple.plotters)": [[4, "psy_simple.plotters.AlternativeXCoordPost", false]], "array (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.array", false]], "array (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.array", false]], "array (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.array", false]], "array (psy_simple.plotters.baryticks property)": [[4, "psy_simple.plotters.BarYTicks.array", false]], "array (psy_simple.plotters.datatickscalculator property)": [[4, "psy_simple.plotters.DataTicksCalculator.array", false]], "array (psy_simple.plotters.hist2dxrange property)": [[4, "psy_simple.plotters.Hist2DXRange.array", false]], "array (psy_simple.plotters.hist2dyrange property)": [[4, "psy_simple.plotters.Hist2DYRange.array", false]], "array (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.array", false]], "array (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.array", false]], "array (psy_simple.plotters.vectorbounds property)": [[4, "psy_simple.plotters.VectorBounds.array", false]], "array (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.array", false]], "array (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.array", false]], "array (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.array", false]], "array (psy_simple.plotters.violinxticks property)": [[4, "psy_simple.plotters.ViolinXTicks.array", false]], "array (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.array", false]], "array (psy_simple.plotters.violinyticks property)": [[4, "psy_simple.plotters.ViolinYTicks.array", false]], "array (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.array", false]], "array (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.array", false]], "array (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.array", false]], "array (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.array", false]], "arrayfmtwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.ArrayFmtWidget", false]], "arrowsize (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ArrowSize", false]], "arrowsize (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.arrowsize", false]], "arrowsize (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.arrowsize", false]], "arrowsize (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.arrowsize", false]], "arrowsize (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.arrowsize", false]], "arrowsize (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.arrowsize", false]], "arrowstyle (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ArrowStyle", false]], "arrowstyle (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.arrowstyle", false]], "arrowstyle (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.arrowstyle", false]], "arrowstyle (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.arrowstyle", false]], "arrowstyle (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.arrowstyle", false]], "arrowstyle (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.arrowstyle", false]], "artist_to_qfont() (psy_simple.widgets.texts.fontpropertieswidget static method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.artist_to_qfont", false]], "auto_val (psy_simple.widgets.colors.cticksfmtwidget attribute)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.auto_val", false]], "axis (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.axis", false]], "axis (psy_simple.plotters.ticklabelsbase property)": [[4, "psy_simple.plotters.TickLabelsBase.axis", false]], "axis (psy_simple.plotters.ticksbase property)": [[4, "psy_simple.plotters.TicksBase.axis", false]], "axis (psy_simple.plotters.xticklabels property)": [[4, "psy_simple.plotters.XTickLabels.axis", false]], "axis (psy_simple.plotters.xtickprops property)": [[4, "psy_simple.plotters.XTickProps.axis", false]], "axis (psy_simple.plotters.xticks property)": [[4, "psy_simple.plotters.XTicks.axis", false]], "axis (psy_simple.plotters.yticklabels property)": [[4, "psy_simple.plotters.YTickLabels.axis", false]], "axis (psy_simple.plotters.ytickprops property)": [[4, "psy_simple.plotters.YTickProps.axis", false]], "axis (psy_simple.plotters.yticks property)": [[4, "psy_simple.plotters.YTicks.axis", false]], "axis_locations (psy_simple.plotters.cbaroptions attribute)": [[4, "psy_simple.plotters.CbarOptions.axis_locations", false]], "axis_locations (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.axis_locations", false]], "axiscolor (class in psy_simple.plotters)": [[4, "psy_simple.plotters.AxisColor", false]], "axiscolor (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.axiscolor", false]], "axisname (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.axisname", false]], "axisname (psy_simple.plotters.tickpropsbase property)": [[4, "psy_simple.plotters.TickPropsBase.axisname", false]], "axisname (psy_simple.plotters.xlim attribute)": [[4, "psy_simple.plotters.Xlim.axisname", false]], "axisname (psy_simple.plotters.xtickprops attribute)": [[4, "psy_simple.plotters.XTickProps.axisname", false]], "axisname (psy_simple.plotters.ylim attribute)": [[4, "psy_simple.plotters.Ylim.axisname", false]], "axisname (psy_simple.plotters.ytickprops attribute)": [[4, "psy_simple.plotters.YTickProps.axisname", false]], "background (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.background", false]], "backgroundcolor (class in psy_simple.base)": [[2, "psy_simple.base.BackgroundColor", false]], "backgroundcolorwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.BackGroundColorWidget", false]], "baralpha (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarAlpha", false]], "barplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarPlot", false]], "barplot (psyplot.project.plot attribute)": [[11, "psyplot.project.plot.barplot", false]], "barplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarPlotter", false]], "barwidths (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarWidths", false]], "barxlabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarXlabel", false]], "barxlim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarXlim", false]], "barxticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarXTickLabels", false]], "barxticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarXTicks", false]], "barylabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarYlabel", false]], "barylim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarYlim", false]], "baryticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarYTickLabels", false]], "baryticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BarYTicks", false]], "base2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Base2D", false]], "baseplotter (class in psy_simple.base)": [[2, "psy_simple.base.BasePlotter", false]], "basevectorplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.BaseVectorPlotter", false]], "bins (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.bins", false]], "bins (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.bins", false]], "block_widgets() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.block_widgets", false]], "bounds (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Bounds", false]], "bounds (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.bounds", false]], "bounds (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.bounds", false]], "bounds (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.bounds", false]], "bounds (psy_simple.plotters.cmap property)": [[4, "psy_simple.plotters.CMap.bounds", false]], "bounds (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.bounds", false]], "bounds (psy_simple.plotters.cticks property)": [[4, "psy_simple.plotters.CTicks.bounds", false]], "bounds (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.bounds", false]], "bounds (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.bounds", false]], "bounds (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.bounds", false]], "bounds (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.bounds", false]], "bounds (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.bounds", false]], "bounds (psy_simple.plotters.vectorcolor property)": [[4, "psy_simple.plotters.VectorColor.bounds", false]], "bounds (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.bounds", false]], "bounds (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.bounds", false]], "bounds (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.bounds", false]], "boundsfmtwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget", false]], "boundsmethod (class in psy_simple.plugin)": [[5, "psy_simple.plugin.BoundsMethod", false]], "boundstype (class in psy_simple.plugin)": [[5, "psy_simple.plugin.BoundsType", false]], "boundsvalidator (class in psy_simple.plugin)": [[5, "psy_simple.plugin.BoundsValidator", false]], "categorical (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.categorical", false]], "categorical (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.categorical", false]], "categorical (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.categorical", false]], "categorical (psy_simple.plotters.barxticklabels property)": [[4, "psy_simple.plotters.BarXTickLabels.categorical", false]], "categorical (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.categorical", false]], "categorical (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.categorical", false]], "categorical (psy_simple.plotters.baryticklabels property)": [[4, "psy_simple.plotters.BarYTickLabels.categorical", false]], "categorical (psy_simple.plotters.baryticks property)": [[4, "psy_simple.plotters.BarYTicks.categorical", false]], "categoricalbars (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CategoricalBars", false]], "cbar (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Cbar", false]], "cbar (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cbar", false]], "cbar (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.cbar", false]], "cbar (psy_simple.plotters.bounds property)": [[4, "psy_simple.plotters.Bounds.cbar", false]], "cbar (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.cbar", false]], "cbar (psy_simple.plotters.cbarspacing property)": [[4, "psy_simple.plotters.CbarSpacing.cbar", false]], "cbar (psy_simple.plotters.clabel property)": [[4, "psy_simple.plotters.CLabel.cbar", false]], "cbar (psy_simple.plotters.cmap property)": [[4, "psy_simple.plotters.CMap.cbar", false]], "cbar (psy_simple.plotters.contourlevels property)": [[4, "psy_simple.plotters.ContourLevels.cbar", false]], "cbar (psy_simple.plotters.cticklabels property)": [[4, "psy_simple.plotters.CTickLabels.cbar", false]], "cbar (psy_simple.plotters.ctickprops property)": [[4, "psy_simple.plotters.CTickProps.cbar", false]], "cbar (psy_simple.plotters.cticks property)": [[4, "psy_simple.plotters.CTicks.cbar", false]], "cbar (psy_simple.plotters.cticksize property)": [[4, "psy_simple.plotters.CTickSize.cbar", false]], "cbar (psy_simple.plotters.ctickweight property)": [[4, "psy_simple.plotters.CTickWeight.cbar", false]], "cbar (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.cbar", false]], "cbar (psy_simple.plotters.vclabel property)": [[4, "psy_simple.plotters.VCLabel.cbar", false]], "cbar (psy_simple.plotters.vectorbounds property)": [[4, "psy_simple.plotters.VectorBounds.cbar", false]], "cbar (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.cbar", false]], "cbaroptions (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CbarOptions", false]], "cbarspacing (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CbarSpacing", false]], "cbarspacing (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cbarspacing", false]], "cbarspacing (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.cbarspacing", false]], "cbarspacing (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.cbarspacing", false]], "cbounds (psy_simple.plotters.contourlevels property)": [[4, "psy_simple.plotters.ContourLevels.cbounds", false]], "cell_nodes_x (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.cell_nodes_x", false]], "cell_nodes_x (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.cell_nodes_x", false]], "cell_nodes_x (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.cell_nodes_x", false]], "cell_nodes_y (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.cell_nodes_y", false]], "cell_nodes_y (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.cell_nodes_y", false]], "cell_nodes_y (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.cell_nodes_y", false]], "change_color() (psy_simple.widgets.colors.colormaptable method)": [[7, "psy_simple.widgets.colors.ColormapTable.change_color", false]], "check_data() (psy_simple.plotters.basevectorplotter class method)": [[4, "psy_simple.plotters.BaseVectorPlotter.check_data", false]], "check_data() (psy_simple.plotters.combinedbase class method)": [[4, "psy_simple.plotters.CombinedBase.check_data", false]], "check_data() (psy_simple.plotters.simple2dbase class method)": [[4, "psy_simple.plotters.Simple2DBase.check_data", false]], "check_data() (psy_simple.plotters.simpleplotterbase class method)": [[4, "psy_simple.plotters.SimplePlotterBase.check_data", false]], "children (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.children", false]], "children (psy_simple.plotters.cbaroptions attribute)": [[4, "psy_simple.plotters.CbarOptions.children", false]], "children (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.children", false]], "children (psy_simple.plotters.ctickprops attribute)": [[4, "psy_simple.plotters.CTickProps.children", false]], "children (psy_simple.plotters.datagrid attribute)": [[4, "psy_simple.plotters.DataGrid.children", false]], "children (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.children", false]], "children (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.children", false]], "children (psy_simple.plotters.labeloptions attribute)": [[4, "psy_simple.plotters.LabelOptions.children", false]], "children (psy_simple.plotters.labelprops attribute)": [[4, "psy_simple.plotters.LabelProps.children", false]], "children (psy_simple.plotters.limitbase attribute)": [[4, "psy_simple.plotters.LimitBase.children", false]], "children (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.children", false]], "children (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.children", false]], "children (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.children", false]], "children (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.children", false]], "children (psy_simple.plotters.xlabel attribute)": [[4, "psy_simple.plotters.Xlabel.children", false]], "children (psy_simple.plotters.xlim attribute)": [[4, "psy_simple.plotters.Xlim.children", false]], "children (psy_simple.plotters.xrotation attribute)": [[4, "psy_simple.plotters.XRotation.children", false]], "children (psy_simple.plotters.xticks attribute)": [[4, "psy_simple.plotters.XTicks.children", false]], "children (psy_simple.plotters.ylabel attribute)": [[4, "psy_simple.plotters.Ylabel.children", false]], "children (psy_simple.plotters.ylim attribute)": [[4, "psy_simple.plotters.Ylim.children", false]], "children (psy_simple.plotters.yrotation attribute)": [[4, "psy_simple.plotters.YRotation.children", false]], "choose_cmap() (psy_simple.widgets.colors.cmapfmtwidget method)": [[7, "psy_simple.widgets.colors.CMapFmtWidget.choose_cmap", false]], "choose_color() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.choose_color", false]], "choose_font() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.choose_font", false]], "chosen_colormap (psy_simple.widgets.colors.colormaptable property)": [[7, "psy_simple.widgets.colors.ColormapTable.chosen_colormap", false]], "clabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CLabel", false]], "clabel (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.clabel", false]], "clabelprops (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.clabelprops", false]], "clabelsize (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.clabelsize", false]], "clabelweight (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.clabelweight", false]], "clear_other_texts() (psy_simple.base.figtitle method)": [[2, "psy_simple.base.Figtitle.clear_other_texts", false]], "cmap (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CMap", false]], "cmap (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cmap", false]], "cmap (psy_simple.plotters.bounds property)": [[4, "psy_simple.plotters.Bounds.cmap", false]], "cmap (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.cmap", false]], "cmap (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.cmap", false]], "cmap (psy_simple.plotters.contourlevels property)": [[4, "psy_simple.plotters.ContourLevels.cmap", false]], "cmap (psy_simple.plotters.cticks property)": [[4, "psy_simple.plotters.CTicks.cmap", false]], "cmap (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.cmap", false]], "cmap (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.cmap", false]], "cmap (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.cmap", false]], "cmap (psy_simple.plotters.vectorbounds property)": [[4, "psy_simple.plotters.VectorBounds.cmap", false]], "cmap (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.cmap", false]], "cmap (psy_simple.plotters.vectorcolor property)": [[4, "psy_simple.plotters.VectorColor.cmap", false]], "cmap (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.cmap", false]], "cmap (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.cmap", false]], "cmapbutton (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.CmapButton", false]], "cmapfmtwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.CMapFmtWidget", false]], "color (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.color", false]], "color (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.color", false]], "color (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.color", false]], "color (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.color", false]], "color (psy_simple.plotters.errorplot property)": [[4, "psy_simple.plotters.ErrorPlot.color", false]], "color (psy_simple.plotters.legend property)": [[4, "psy_simple.plotters.Legend.color", false]], "color (psy_simple.plotters.lineplot property)": [[4, "psy_simple.plotters.LinePlot.color", false]], "color (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.color", false]], "color (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.color", false]], "color (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.color", false]], "color (psy_simple.plotters.vectorbounds property)": [[4, "psy_simple.plotters.VectorBounds.color", false]], "color (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.color", false]], "color (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.color", false]], "color (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.color", false]], "color (psy_simple.plotters.violinplot property)": [[4, "psy_simple.plotters.ViolinPlot.color", false]], "color (psy_simple.widgets.colors.colorlabel attribute)": [[7, "psy_simple.widgets.colors.ColorLabel.color", false]], "color_changed (psy_simple.widgets.colors.colorlabel attribute)": [[7, "psy_simple.widgets.colors.ColorLabel.color_changed", false]], "colorbar (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.colorbar", false]], "colorlabel (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.ColorLabel", false]], "colormap_changed (psy_simple.widgets.colors.cmapbutton attribute)": [[7, "psy_simple.widgets.colors.CmapButton.colormap_changed", false]], "colormapdialog (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.ColormapDialog", false]], "colormapmodel (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.ColormapModel", false]], "colormaptable (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.ColormapTable", false]], "columncount() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.columnCount", false]], "columncount() (psy_simple.widgets.colors.colormaptable method)": [[7, "psy_simple.widgets.colors.ColormapTable.columnCount", false]], "combined (psyplot.project.plot attribute)": [[12, "psyplot.project.plot.combined", false]], "combinedbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CombinedBase", false]], "combinedsimpleplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CombinedSimplePlotter", false]], "combinedvectorplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CombinedVectorPlot", false]], "connections (psy_simple.plotters.barxticks attribute)": [[4, "psy_simple.plotters.BarXTicks.connections", false]], "connections (psy_simple.plotters.baryticks attribute)": [[4, "psy_simple.plotters.BarYTicks.connections", false]], "connections (psy_simple.plotters.bounds attribute)": [[4, "psy_simple.plotters.Bounds.connections", false]], "connections (psy_simple.plotters.cbarspacing attribute)": [[4, "psy_simple.plotters.CbarSpacing.connections", false]], "connections (psy_simple.plotters.cmap attribute)": [[4, "psy_simple.plotters.CMap.connections", false]], "connections (psy_simple.plotters.cticks attribute)": [[4, "psy_simple.plotters.CTicks.connections", false]], "connections (psy_simple.plotters.datagrid attribute)": [[4, "psy_simple.plotters.DataGrid.connections", false]], "connections (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.connections", false]], "connections (psy_simple.plotters.erroralpha attribute)": [[4, "psy_simple.plotters.ErrorAlpha.connections", false]], "connections (psy_simple.plotters.extend attribute)": [[4, "psy_simple.plotters.Extend.connections", false]], "connections (psy_simple.plotters.limitbase attribute)": [[4, "psy_simple.plotters.LimitBase.connections", false]], "connections (psy_simple.plotters.linewidth attribute)": [[4, "psy_simple.plotters.LineWidth.connections", false]], "connections (psy_simple.plotters.markersize attribute)": [[4, "psy_simple.plotters.MarkerSize.connections", false]], "connections (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.connections", false]], "connections (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.connections", false]], "connections (psy_simple.plotters.xlim attribute)": [[4, "psy_simple.plotters.Xlim.connections", false]], "connections (psy_simple.plotters.ylim attribute)": [[4, "psy_simple.plotters.Ylim.connections", false]], "contourlevels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ContourLevels", false]], "convert_radian() (in module psy_simple.plotters)": [[4, "psy_simple.plotters.convert_radian", false]], "coord (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.coord", false]], "coord (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.coord", false]], "coord (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.coord", false]], "coord (psy_simple.plotters.hist2dxrange property)": [[4, "psy_simple.plotters.Hist2DXRange.coord", false]], "coord (psy_simple.plotters.hist2dyrange property)": [[4, "psy_simple.plotters.Hist2DYRange.coord", false]], "coord (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.coord", false]], "coord (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.coord", false]], "create_cmap_thumb() (in module psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.create_cmap_thumb", false]], "cticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CTickLabels", false]], "cticklabels (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cticklabels", false]], "ctickprops (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CTickProps", false]], "ctickprops (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.ctickprops", false]], "ctickprops (psy_simple.plotters.cticksize property)": [[4, "psy_simple.plotters.CTickSize.ctickprops", false]], "ctickprops (psy_simple.plotters.ctickweight property)": [[4, "psy_simple.plotters.CTickWeight.ctickprops", false]], "cticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CTicks", false]], "cticks (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cticks", false]], "cticks (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.cticks", false]], "cticks (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.cticks", false]], "cticksfmtwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget", false]], "cticksize (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CTickSize", false]], "cticksize (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.cticksize", false]], "cticksmethod (class in psy_simple.plugin)": [[5, "psy_simple.plugin.CTicksMethod", false]], "ctickstype (class in psy_simple.plugin)": [[5, "psy_simple.plugin.CTicksType", false]], "ctickweight (class in psy_simple.plotters)": [[4, "psy_simple.plotters.CTickWeight", false]], "ctickweight (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.ctickweight", false]], "current_font (psy_simple.widgets.texts.fontpropertieswidget attribute)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.current_font", false]], "current_widget (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.current_widget", false]], "data (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.data", false]], "data (psy_simple.plotters.vectordatagrid property)": [[4, "psy_simple.plotters.VectorDataGrid.data", false]], "data (psy_simple.plotters.xticks property)": [[4, "psy_simple.plotters.XTicks.data", false]], "data (psy_simple.plotters.xticks2d property)": [[4, "psy_simple.plotters.XTicks2D.data", false]], "data (psy_simple.plotters.yticks property)": [[4, "psy_simple.plotters.YTicks.data", false]], "data (psy_simple.plotters.yticks2d property)": [[4, "psy_simple.plotters.YTicks2D.data", false]], "data (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.data", false]], "data (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.data", false]], "data (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.data", false]], "data() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.data", false]], "data_dependent (psy_simple.base.textbase attribute)": [[2, "psy_simple.base.TextBase.data_dependent", false]], "data_dependent (psy_simple.base.valuemaskbase attribute)": [[2, "psy_simple.base.ValueMaskBase.data_dependent", false]], "data_dependent (psy_simple.plotters.alternativexcoord attribute)": [[4, "psy_simple.plotters.AlternativeXCoord.data_dependent", false]], "data_dependent (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.data_dependent", false]], "data_dependent (psy_simple.plotters.combinedvectorplot attribute)": [[4, "psy_simple.plotters.CombinedVectorPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.datagrid attribute)": [[4, "psy_simple.plotters.DataGrid.data_dependent", false]], "data_dependent (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.data_dependent", false]], "data_dependent (psy_simple.plotters.datatickscalculator attribute)": [[4, "psy_simple.plotters.DataTicksCalculator.data_dependent", false]], "data_dependent (psy_simple.plotters.density attribute)": [[4, "psy_simple.plotters.Density.data_dependent", false]], "data_dependent (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.data_dependent", false]], "data_dependent (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.hist2dxrange attribute)": [[4, "psy_simple.plotters.Hist2DXRange.data_dependent", false]], "data_dependent (psy_simple.plotters.hist2dyrange attribute)": [[4, "psy_simple.plotters.Hist2DYRange.data_dependent", false]], "data_dependent (psy_simple.plotters.histbins attribute)": [[4, "psy_simple.plotters.HistBins.data_dependent", false]], "data_dependent (psy_simple.plotters.legendlabels attribute)": [[4, "psy_simple.plotters.LegendLabels.data_dependent", false]], "data_dependent (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.data_dependent", false]], "data_dependent (psy_simple.plotters.meancalculator attribute)": [[4, "psy_simple.plotters.MeanCalculator.data_dependent", false]], "data_dependent (psy_simple.plotters.normedhist2d attribute)": [[4, "psy_simple.plotters.NormedHist2D.data_dependent", false]], "data_dependent (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.data_dependent", false]], "data_dependent (psy_simple.plotters.pointdensity attribute)": [[4, "psy_simple.plotters.PointDensity.data_dependent", false]], "data_dependent (psy_simple.plotters.simpleplot2d attribute)": [[4, "psy_simple.plotters.SimplePlot2D.data_dependent", false]], "data_dependent (psy_simple.plotters.simplevectorplot attribute)": [[4, "psy_simple.plotters.SimpleVectorPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.vectorcalculator attribute)": [[4, "psy_simple.plotters.VectorCalculator.data_dependent", false]], "data_dependent (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.data_dependent", false]], "data_dependent (psy_simple.plotters.violinxticklabels attribute)": [[4, "psy_simple.plotters.ViolinXTickLabels.data_dependent", false]], "data_dependent (psy_simple.plotters.violinyticklabels attribute)": [[4, "psy_simple.plotters.ViolinYTickLabels.data_dependent", false]], "data_iterator (psy_simple.plotters.alternativexcoord property)": [[4, "psy_simple.plotters.AlternativeXCoord.data_iterator", false]], "datagrid (class in psy_simple.plotters)": [[4, "psy_simple.plotters.DataGrid", false]], "datagrid (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.datagrid", false]], "datagrid (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.datagrid", false]], "dataprecision (class in psy_simple.plotters)": [[4, "psy_simple.plotters.DataPrecision", false]], "datatickscalculator (class in psy_simple.plotters)": [[4, "psy_simple.plotters.DataTicksCalculator", false]], "datatickscalculatorfmtwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.DataTicksCalculatorFmtWidget", false]], "day (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.day", false]], "default_args (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.default_args", false]], "default_formatters (psy_simple.plotters.cticklabels property)": [[4, "psy_simple.plotters.CTickLabels.default_formatters", false]], "default_kws (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.default_kws", false]], "default_locator (psy_simple.plotters.cticks property)": [[4, "psy_simple.plotters.CTicks.default_locator", false]], "delimiter (psy_simple.base.textbase attribute)": [[2, "psy_simple.base.TextBase.delimiter", false]], "density (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Density", false]], "density (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.density", false]], "density (psy_simple.plotters.combinedsimpleplotter attribute)": [[4, "psy_simple.plotters.CombinedSimplePlotter.density", false]], "density (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.density", false]], "density (psy_simple.plotters.dataprecision property)": [[4, "psy_simple.plotters.DataPrecision.density", false]], "density (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.density", false]], "density (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.density", false]], "density (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.density", false]], "density (psyplot.project.plot attribute)": [[13, "psyplot.project.plot.density", false]], "densityplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.DensityPlotter", false]], "dependencies (psy_simple.plotters.arrowsize attribute)": [[4, "psy_simple.plotters.ArrowSize.dependencies", false]], "dependencies (psy_simple.plotters.arrowstyle attribute)": [[4, "psy_simple.plotters.ArrowStyle.dependencies", false]], "dependencies (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.dependencies", false]], "dependencies (psy_simple.plotters.barxlim attribute)": [[4, "psy_simple.plotters.BarXlim.dependencies", false]], "dependencies (psy_simple.plotters.barxticklabels attribute)": [[4, "psy_simple.plotters.BarXTickLabels.dependencies", false]], "dependencies (psy_simple.plotters.barxticks attribute)": [[4, "psy_simple.plotters.BarXTicks.dependencies", false]], "dependencies (psy_simple.plotters.barylim attribute)": [[4, "psy_simple.plotters.BarYlim.dependencies", false]], "dependencies (psy_simple.plotters.baryticklabels attribute)": [[4, "psy_simple.plotters.BarYTickLabels.dependencies", false]], "dependencies (psy_simple.plotters.baryticks attribute)": [[4, "psy_simple.plotters.BarYTicks.dependencies", false]], "dependencies (psy_simple.plotters.categoricalbars attribute)": [[4, "psy_simple.plotters.CategoricalBars.dependencies", false]], "dependencies (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.dependencies", false]], "dependencies (psy_simple.plotters.cbaroptions attribute)": [[4, "psy_simple.plotters.CbarOptions.dependencies", false]], "dependencies (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.dependencies", false]], "dependencies (psy_simple.plotters.contourlevels attribute)": [[4, "psy_simple.plotters.ContourLevels.dependencies", false]], "dependencies (psy_simple.plotters.cticks attribute)": [[4, "psy_simple.plotters.CTicks.dependencies", false]], "dependencies (psy_simple.plotters.cticksize attribute)": [[4, "psy_simple.plotters.CTickSize.dependencies", false]], "dependencies (psy_simple.plotters.ctickweight attribute)": [[4, "psy_simple.plotters.CTickWeight.dependencies", false]], "dependencies (psy_simple.plotters.datagrid attribute)": [[4, "psy_simple.plotters.DataGrid.dependencies", false]], "dependencies (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.dependencies", false]], "dependencies (psy_simple.plotters.density attribute)": [[4, "psy_simple.plotters.Density.dependencies", false]], "dependencies (psy_simple.plotters.hist2dxrange attribute)": [[4, "psy_simple.plotters.Hist2DXRange.dependencies", false]], "dependencies (psy_simple.plotters.histbins attribute)": [[4, "psy_simple.plotters.HistBins.dependencies", false]], "dependencies (psy_simple.plotters.legend attribute)": [[4, "psy_simple.plotters.Legend.dependencies", false]], "dependencies (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.dependencies", false]], "dependencies (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.dependencies", false]], "dependencies (psy_simple.plotters.pointdensity attribute)": [[4, "psy_simple.plotters.PointDensity.dependencies", false]], "dependencies (psy_simple.plotters.simpleplot2d attribute)": [[4, "psy_simple.plotters.SimplePlot2D.dependencies", false]], "dependencies (psy_simple.plotters.symmetriclimits attribute)": [[4, "psy_simple.plotters.SymmetricLimits.dependencies", false]], "dependencies (psy_simple.plotters.ticklabelsbase attribute)": [[4, "psy_simple.plotters.TickLabelsBase.dependencies", false]], "dependencies (psy_simple.plotters.ticksbase attribute)": [[4, "psy_simple.plotters.TicksBase.dependencies", false]], "dependencies (psy_simple.plotters.ticksize attribute)": [[4, "psy_simple.plotters.TickSize.dependencies", false]], "dependencies (psy_simple.plotters.tickweight attribute)": [[4, "psy_simple.plotters.TickWeight.dependencies", false]], "dependencies (psy_simple.plotters.vectorcalculator attribute)": [[4, "psy_simple.plotters.VectorCalculator.dependencies", false]], "dependencies (psy_simple.plotters.vectorcbar attribute)": [[4, "psy_simple.plotters.VectorCbar.dependencies", false]], "dependencies (psy_simple.plotters.vectorcolor attribute)": [[4, "psy_simple.plotters.VectorColor.dependencies", false]], "dependencies (psy_simple.plotters.vectorcticks attribute)": [[4, "psy_simple.plotters.VectorCTicks.dependencies", false]], "dependencies (psy_simple.plotters.xlim attribute)": [[4, "psy_simple.plotters.Xlim.dependencies", false]], "dependencies (psy_simple.plotters.xticklabels attribute)": [[4, "psy_simple.plotters.XTickLabels.dependencies", false]], "dependencies (psy_simple.plotters.xticks attribute)": [[4, "psy_simple.plotters.XTicks.dependencies", false]], "dependencies (psy_simple.plotters.ylim attribute)": [[4, "psy_simple.plotters.Ylim.dependencies", false]], "dependencies (psy_simple.plotters.yticklabels attribute)": [[4, "psy_simple.plotters.YTickLabels.dependencies", false]], "dependencies (psy_simple.plotters.yticks attribute)": [[4, "psy_simple.plotters.YTicks.dependencies", false]], "dictcombo (class in psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.DictCombo", false]], "dictvalvalidator (class in psy_simple.plugin)": [[5, "psy_simple.plugin.DictValValidator", false]], "diff() (psy_simple.base.mask method)": [[2, "psy_simple.base.Mask.diff", false]], "diff() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.diff", false]], "diff() (psy_simple.plotters.alternativexcoord method)": [[4, "psy_simple.plotters.AlternativeXCoord.diff", false]], "draw_colorbar() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.draw_colorbar", false]], "dtdata (psy_simple.plotters.dtticksbase property)": [[4, "psy_simple.plotters.DtTicksBase.dtdata", false]], "dtticksbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.DtTicksBase", false]], "dtype (psy_simple.plugin.validatelist attribute)": [[5, "psy_simple.plugin.ValidateList.dtype", false]], "edit_cmap() (psy_simple.widgets.colors.cmapfmtwidget method)": [[7, "psy_simple.widgets.colors.CMapFmtWidget.edit_cmap", false]], "enhanced_attrs (psy_simple.base.figtitle property)": [[2, "psy_simple.base.Figtitle.enhanced_attrs", false]], "enhanced_attrs (psy_simple.base.textbase property)": [[2, "psy_simple.base.TextBase.enhanced_attrs", false]], "enhanced_attrs (psy_simple.plotters.xlabel property)": [[4, "psy_simple.plotters.Xlabel.enhanced_attrs", false]], "enhanced_attrs (psy_simple.plotters.ylabel property)": [[4, "psy_simple.plotters.Ylabel.enhanced_attrs", false]], "enterevent() (psy_simple.widgets.colors.highlightwidget method)": [[7, "psy_simple.widgets.colors.HighlightWidget.enterEvent", false]], "err_calc (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.err_calc", false]], "error (psy_simple.plotters.erroralpha property)": [[4, "psy_simple.plotters.ErrorAlpha.error", false]], "error (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.error", false]], "erroralpha (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ErrorAlpha", false]], "erroralpha (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.erroralpha", false]], "errorcalculator (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ErrorCalculator", false]], "errorplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ErrorPlot", false]], "estimate_bw() (psy_simple.plotters.dataprecision method)": [[4, "psy_simple.plotters.DataPrecision.estimate_bw", false]], "extend (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Extend", false]], "extend (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.extend", false]], "extend (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.extend", false]], "extend (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.extend", false]], "extended_colors (psy_simple.plotters.linecolors property)": [[4, "psy_simple.plotters.LineColors.extended_colors", false]], "figtitle (class in psy_simple.base)": [[2, "psy_simple.base.Figtitle", false]], "figtitle (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.figtitle", false]], "figtitleprops (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.figtitleprops", false]], "figtitlesize (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.figtitlesize", false]], "figtitleweight (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.figtitleweight", false]], "figure_positions (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.figure_positions", false]], "fill_from_norm() (psy_simple.widgets.colors.normalizationwidget method)": [[7, "psy_simple.widgets.colors.NormalizationWidget.fill_from_norm", false]], "finish_update() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.finish_update", false]], "finish_update() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.finish_update", false]], "fixedboundarynorm (class in psy_simple.colors)": [[3, "psy_simple.colors.FixedBoundaryNorm", false]], "fixedcolormap (class in psy_simple.colors)": [[3, "psy_simple.colors.FixedColorMap", false]], "fldmean (psyplot.project.plot attribute)": [[14, "psyplot.project.plot.fldmean", false]], "fldmeanplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.FldmeanPlotter", false]], "fontpropertieswidget (class in psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget", false]], "fontsizewidget (class in psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.FontSizeWidget", false]], "fontweightwidget (class in psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.FontWeightWidget", false]], "format_coord (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.format_coord", false]], "format_coord (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.format_coord", false]], "format_coord_func() (in module psy_simple.plotters)": [[4, "psy_simple.plotters.format_coord_func", false]], "from_list() (psy_simple.colors.fixedcolormap static method)": [[3, "psy_simple.colors.FixedColorMap.from_list", false]], "full_array (psy_simple.plotters.datatickscalculator property)": [[4, "psy_simple.plotters.DataTicksCalculator.full_array", false]], "get_alternative_coord() (psy_simple.plotters.alternativexcoord method)": [[4, "psy_simple.plotters.AlternativeXCoord.get_alternative_coord", false]], "get_artists_and_labels() (psy_simple.plotters.legend method)": [[4, "psy_simple.plotters.Legend.get_artists_and_labels", false]], "get_auto_discrete_array_widget() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.get_auto_discrete_array_widget", false]], "get_cmap() (in module psy_simple.colors)": [[3, "psy_simple.colors.get_cmap", false]], "get_cmap() (psy_simple.plotters.cmap method)": [[4, "psy_simple.plotters.CMap.get_cmap", false]], "get_colormap() (psy_simple.widgets.colors.colormapdialog class method)": [[7, "psy_simple.widgets.colors.ColormapDialog.get_colormap", false]], "get_decimals() (psy_simple.widgets.colors.arrayfmtwidget static method)": [[7, "psy_simple.widgets.colors.ArrayFmtWidget.get_decimals", false]], "get_decimals() (psy_simple.widgets.colors.datatickscalculatorfmtwidget static method)": [[7, "psy_simple.widgets.colors.DataTicksCalculatorFmtWidget.get_decimals", false]], "get_discrete_array_widget() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.get_discrete_array_widget", false]], "get_enhanced_attrs() (psy_simple.base.textbase method)": [[2, "psy_simple.base.TextBase.get_enhanced_attrs", false]], "get_fig_data_attrs() (psy_simple.base.textbase method)": [[2, "psy_simple.base.TextBase.get_fig_data_attrs", false]], "get_fmt_widget() (psy_simple.base.backgroundcolor method)": [[2, "psy_simple.base.BackgroundColor.get_fmt_widget", false]], "get_fmt_widget() (psy_simple.base.textbase method)": [[2, "psy_simple.base.TextBase.get_fmt_widget", false]], "get_fmt_widget() (psy_simple.plotters.bounds method)": [[4, "psy_simple.plotters.Bounds.get_fmt_widget", false]], "get_fmt_widget() (psy_simple.plotters.cmap method)": [[4, "psy_simple.plotters.CMap.get_fmt_widget", false]], "get_fmt_widget() (psy_simple.plotters.cticks method)": [[4, "psy_simple.plotters.CTicks.get_fmt_widget", false]], "get_icon() (in module psy_simple.widgets)": [[6, "psy_simple.widgets.get_icon", false]], "get_locator() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.get_locator", false]], "get_norm_widget() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.get_norm_widget", false]], "get_versions() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.get_versions", false]], "get_x() (psy_simple.plotters.transpose method)": [[4, "psy_simple.plotters.Transpose.get_x", false]], "get_xys() (psy_simple.plotters.barplot method)": [[4, "psy_simple.plotters.BarPlot.get_xys", false]], "get_xyz_1d() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.get_xyz_1d", false]], "get_xyz_1d() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.get_xyz_1d", false]], "get_xyz_2d() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.get_xyz_2d", false]], "get_xyz_2d() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.get_xyz_2d", false]], "get_xyz_tri() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.get_xyz_tri", false]], "get_xyz_tri() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.get_xyz_tri", false]], "get_y() (psy_simple.plotters.transpose method)": [[4, "psy_simple.plotters.Transpose.get_y", false]], "grid (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Grid", false]], "grid (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.grid", false]], "group (psy_simple.base.backgroundcolor attribute)": [[2, "psy_simple.base.BackgroundColor.group", false]], "group (psy_simple.base.mask attribute)": [[2, "psy_simple.base.Mask.group", false]], "group (psy_simple.base.textbase attribute)": [[2, "psy_simple.base.TextBase.group", false]], "group (psy_simple.base.tight attribute)": [[2, "psy_simple.base.Tight.group", false]], "group (psy_simple.base.valuemaskbase attribute)": [[2, "psy_simple.base.ValueMaskBase.group", false]], "group (psy_simple.plotters.alternativexcoord attribute)": [[4, "psy_simple.plotters.AlternativeXCoord.group", false]], "group (psy_simple.plotters.arrowsize attribute)": [[4, "psy_simple.plotters.ArrowSize.group", false]], "group (psy_simple.plotters.arrowstyle attribute)": [[4, "psy_simple.plotters.ArrowStyle.group", false]], "group (psy_simple.plotters.axiscolor attribute)": [[4, "psy_simple.plotters.AxisColor.group", false]], "group (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.group", false]], "group (psy_simple.plotters.bounds attribute)": [[4, "psy_simple.plotters.Bounds.group", false]], "group (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.group", false]], "group (psy_simple.plotters.cbarspacing attribute)": [[4, "psy_simple.plotters.CbarSpacing.group", false]], "group (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.group", false]], "group (psy_simple.plotters.cmap attribute)": [[4, "psy_simple.plotters.CMap.group", false]], "group (psy_simple.plotters.ctickprops attribute)": [[4, "psy_simple.plotters.CTickProps.group", false]], "group (psy_simple.plotters.cticksize attribute)": [[4, "psy_simple.plotters.CTickSize.group", false]], "group (psy_simple.plotters.ctickweight attribute)": [[4, "psy_simple.plotters.CTickWeight.group", false]], "group (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.group", false]], "group (psy_simple.plotters.density attribute)": [[4, "psy_simple.plotters.Density.group", false]], "group (psy_simple.plotters.erroralpha attribute)": [[4, "psy_simple.plotters.ErrorAlpha.group", false]], "group (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.group", false]], "group (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.group", false]], "group (psy_simple.plotters.extend attribute)": [[4, "psy_simple.plotters.Extend.group", false]], "group (psy_simple.plotters.grid attribute)": [[4, "psy_simple.plotters.Grid.group", false]], "group (psy_simple.plotters.hist2dxrange attribute)": [[4, "psy_simple.plotters.Hist2DXRange.group", false]], "group (psy_simple.plotters.histbins attribute)": [[4, "psy_simple.plotters.HistBins.group", false]], "group (psy_simple.plotters.labelprops attribute)": [[4, "psy_simple.plotters.LabelProps.group", false]], "group (psy_simple.plotters.labelsize attribute)": [[4, "psy_simple.plotters.LabelSize.group", false]], "group (psy_simple.plotters.labelweight attribute)": [[4, "psy_simple.plotters.LabelWeight.group", false]], "group (psy_simple.plotters.limitbase attribute)": [[4, "psy_simple.plotters.LimitBase.group", false]], "group (psy_simple.plotters.linecolors attribute)": [[4, "psy_simple.plotters.LineColors.group", false]], "group (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.group", false]], "group (psy_simple.plotters.meancalculator attribute)": [[4, "psy_simple.plotters.MeanCalculator.group", false]], "group (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.group", false]], "group (psy_simple.plotters.normedhist2d attribute)": [[4, "psy_simple.plotters.NormedHist2D.group", false]], "group (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.group", false]], "group (psy_simple.plotters.pointdensity attribute)": [[4, "psy_simple.plotters.PointDensity.group", false]], "group (psy_simple.plotters.ticklabelsbase attribute)": [[4, "psy_simple.plotters.TickLabelsBase.group", false]], "group (psy_simple.plotters.ticksbase attribute)": [[4, "psy_simple.plotters.TicksBase.group", false]], "group (psy_simple.plotters.ticksmanager attribute)": [[4, "psy_simple.plotters.TicksManager.group", false]], "group (psy_simple.plotters.transpose attribute)": [[4, "psy_simple.plotters.Transpose.group", false]], "group (psy_simple.plotters.vectorcolor attribute)": [[4, "psy_simple.plotters.VectorColor.group", false]], "group (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.group", false]], "group (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.group", false]], "group (psy_simple.plotters.xrotation attribute)": [[4, "psy_simple.plotters.XRotation.group", false]], "group (psy_simple.plotters.yrotation attribute)": [[4, "psy_simple.plotters.YRotation.group", false]], "headerdata() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.headerData", false]], "highlightwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.HighlightWidget", false]], "hist2d() (psy_simple.plotters.normedhist2d method)": [[4, "psy_simple.plotters.NormedHist2D.hist2d", false]], "hist2dxrange (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Hist2DXRange", false]], "hist2dyrange (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Hist2DYRange", false]], "histbins (class in psy_simple.plotters)": [[4, "psy_simple.plotters.HistBins", false]], "hour (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.hour", false]], "init_kwargs (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.init_kwargs", false]], "initialize_plot() (psy_simple.base.figtitle method)": [[2, "psy_simple.base.Figtitle.initialize_plot", false]], "initialize_plot() (psy_simple.base.title method)": [[2, "psy_simple.base.Title.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.axiscolor method)": [[4, "psy_simple.plotters.AxisColor.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.transpose method)": [[4, "psy_simple.plotters.Transpose.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.xlabel method)": [[4, "psy_simple.plotters.Xlabel.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.xlim method)": [[4, "psy_simple.plotters.Xlim.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.xticklabels method)": [[4, "psy_simple.plotters.XTickLabels.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.xticks method)": [[4, "psy_simple.plotters.XTicks.initialize_plot", false]], "initialize_plot() (psy_simple.plotters.ylabel method)": [[4, "psy_simple.plotters.Ylabel.initialize_plot", false]], "insert_bracketed() (psy_simple.widgets.texts.dictcombo method)": [[8, "psy_simple.widgets.texts.DictCombo.insert_bracketed", false]], "insert_modulo() (psy_simple.widgets.texts.dictcombo method)": [[8, "psy_simple.widgets.texts.DictCombo.insert_modulo", false]], "instance_check() (psy_simple.plugin.boundsvalidator method)": [[5, "psy_simple.plugin.BoundsValidator.instance_check", false]], "interp_bounds (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.interp_bounds", false]], "interp_bounds (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.interp_bounds", false]], "interp_bounds (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.interp_bounds", false]], "interpolatebounds (class in psy_simple.plotters)": [[4, "psy_simple.plotters.InterpolateBounds", false]], "invert_cmap() (psy_simple.widgets.colors.cmapfmtwidget method)": [[7, "psy_simple.widgets.colors.CMapFmtWidget.invert_cmap", false]], "label_props() (in module psy_simple.base)": [[2, "psy_simple.base.label_props", false]], "label_size() (in module psy_simple.base)": [[2, "psy_simple.base.label_size", false]], "label_weight() (in module psy_simple.base)": [[2, "psy_simple.base.label_weight", false]], "labeloptions (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LabelOptions", false]], "labelprops (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LabelProps", false]], "labelprops (psy_simple.plotters.labelsize property)": [[4, "psy_simple.plotters.LabelSize.labelprops", false]], "labelprops (psy_simple.plotters.labelweight property)": [[4, "psy_simple.plotters.LabelWeight.labelprops", false]], "labelprops (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.labelprops", false]], "labelsize (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LabelSize", false]], "labelsize (psy_simple.plotters.labelprops property)": [[4, "psy_simple.plotters.LabelProps.labelsize", false]], "labelsize (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.labelsize", false]], "labelweight (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LabelWeight", false]], "labelweight (psy_simple.plotters.labelprops property)": [[4, "psy_simple.plotters.LabelProps.labelweight", false]], "labelweight (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.labelweight", false]], "labelwidget (class in psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.LabelWidget", false]], "leaveevent() (psy_simple.widgets.colors.highlightwidget method)": [[7, "psy_simple.widgets.colors.HighlightWidget.leaveEvent", false]], "legend (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Legend", false]], "legend (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.legend", false]], "legend (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.legend", false]], "legend (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.legend", false]], "legendlabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LegendLabels", false]], "legendlabels (psy_simple.plotters.legend property)": [[4, "psy_simple.plotters.Legend.legendlabels", false]], "legendlabels (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.legendlabels", false]], "legendlabels (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.legendlabels", false]], "legendlabels (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.legendlabels", false]], "levels (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.levels", false]], "levels (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.levels", false]], "levels (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.levels", false]], "levels (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.levels", false]], "levels (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.levels", false]], "limitbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LimitBase", false]], "linecolors (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LineColors", false]], "lineplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LinePlot", false]], "lineplot (psyplot.project.plot attribute)": [[15, "psyplot.project.plot.lineplot", false]], "lineplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LinePlotter", false]], "linewidth (class in psy_simple.plotters)": [[4, "psy_simple.plotters.LineWidth", false]], "linewidth (psy_simple.plotters.basevectorplotter attribute)": [[4, "psy_simple.plotters.BaseVectorPlotter.linewidth", false]], "linewidth (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.linewidth", false]], "linewidth (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.linewidth", false]], "linewidth (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.linewidth", false]], "linewidth (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.linewidth", false]], "linewidth (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.linewidth", false]], "linewidthvalidator (class in psy_simple.plugin)": [[5, "psy_simple.plugin.LineWidthValidator", false]], "load_mask() (psy_simple.base.mask method)": [[2, "psy_simple.base.Mask.load_mask", false]], "load_properties() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.load_properties", false]], "log (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.log", false]], "log (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.log", false]], "log (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.log", false]], "make_plot() (psy_simple.plotters.barplot method)": [[4, "psy_simple.plotters.BarPlot.make_plot", false]], "make_plot() (psy_simple.plotters.errorplot method)": [[4, "psy_simple.plotters.ErrorPlot.make_plot", false]], "make_plot() (psy_simple.plotters.lineplot method)": [[4, "psy_simple.plotters.LinePlot.make_plot", false]], "make_plot() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.make_plot", false]], "make_plot() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.make_plot", false]], "make_plot() (psy_simple.plotters.violinplot method)": [[4, "psy_simple.plotters.ViolinPlot.make_plot", false]], "mappable (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.mappable", false]], "mappable (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.mappable", false]], "marker (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Marker", false]], "marker (psy_simple.plotters.legend property)": [[4, "psy_simple.plotters.Legend.marker", false]], "marker (psy_simple.plotters.lineplot property)": [[4, "psy_simple.plotters.LinePlot.marker", false]], "marker (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.marker", false]], "markersize (class in psy_simple.plotters)": [[4, "psy_simple.plotters.MarkerSize", false]], "markersize (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.markersize", false]], "mask (class in psy_simple.base)": [[2, "psy_simple.base.Mask", false]], "mask (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.mask", false]], "mask (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.mask", false]], "mask_datagrid (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.mask_datagrid", false]], "mask_datagrid (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.mask_datagrid", false]], "mask_datagrid (psy_simple.plotters.vectordatagrid property)": [[4, "psy_simple.plotters.VectorDataGrid.mask_datagrid", false]], "mask_func() (psy_simple.base.maskbetween method)": [[2, "psy_simple.base.MaskBetween.mask_func", false]], "mask_func() (psy_simple.base.maskgeq method)": [[2, "psy_simple.base.MaskGeq.mask_func", false]], "mask_func() (psy_simple.base.maskgreater method)": [[2, "psy_simple.base.MaskGreater.mask_func", false]], "mask_func() (psy_simple.base.maskleq method)": [[2, "psy_simple.base.MaskLeq.mask_func", false]], "mask_func() (psy_simple.base.maskless method)": [[2, "psy_simple.base.MaskLess.mask_func", false]], "mask_func() (psy_simple.base.valuemaskbase method)": [[2, "psy_simple.base.ValueMaskBase.mask_func", false]], "maskbetween (class in psy_simple.base)": [[2, "psy_simple.base.MaskBetween", false]], "maskbetween (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.maskbetween", false]], "maskbetween (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.maskbetween", false]], "maskbetween (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.maskbetween", false]], "maskdatagrid (class in psy_simple.plotters)": [[4, "psy_simple.plotters.MaskDataGrid", false]], "maskgeq (class in psy_simple.base)": [[2, "psy_simple.base.MaskGeq", false]], "maskgeq (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.maskgeq", false]], "maskgeq (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.maskgeq", false]], "maskgeq (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.maskgeq", false]], "maskgreater (class in psy_simple.base)": [[2, "psy_simple.base.MaskGreater", false]], "maskgreater (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.maskgreater", false]], "maskgreater (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.maskgreater", false]], "maskgreater (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.maskgreater", false]], "maskleq (class in psy_simple.base)": [[2, "psy_simple.base.MaskLeq", false]], "maskleq (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.maskleq", false]], "maskleq (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.maskleq", false]], "maskleq (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.maskleq", false]], "maskless (class in psy_simple.base)": [[2, "psy_simple.base.MaskLess", false]], "maskless (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.maskless", false]], "maskless (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.maskless", false]], "maskless (psy_simple.plotters.scalarcombinedbase attribute)": [[4, "psy_simple.plotters.ScalarCombinedBase.maskless", false]], "mean (psy_simple.plotters.errorcalculator property)": [[4, "psy_simple.plotters.ErrorCalculator.mean", false]], "mean (psy_simple.plotters.fldmeanplotter attribute)": [[4, "psy_simple.plotters.FldmeanPlotter.mean", false]], "meancalculator (class in psy_simple.plotters)": [[4, "psy_simple.plotters.MeanCalculator", false]], "method (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.method", false]], "method (psy_simple.plugin.ctickstype attribute)": [[5, "psy_simple.plugin.CTicksType.method", false]], "method (psy_simple.plugin.tickstype attribute)": [[5, "psy_simple.plugin.TicksType.method", false]], "methods (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.methods", false]], "methods (psy_simple.widgets.colors.cticksfmtwidget attribute)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.methods", false]], "methods_type (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.methods_type", false]], "methods_type (psy_simple.widgets.colors.cticksfmtwidget attribute)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.methods_type", false]], "mid (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.mid", false]], "mid (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.mid", false]], "mid (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.mid", false]], "midbounds (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.midbounds", false]], "minmax (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.minmax", false]], "minmax (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.minmax", false]], "minmax (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.minmax", false]], "miss_color (psy_simple.plotters.simple2dbase attribute)": [[4, "psy_simple.plotters.Simple2DBase.miss_color", false]], "misscolor (class in psy_simple.plotters)": [[4, "psy_simple.plotters.MissColor", false]], "modify_size() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.modify_size", false]], "module": [[1, "module-psy_simple", false], [2, "module-psy_simple.base", false], [3, "module-psy_simple.colors", false], [4, "module-psy_simple.plotters", false], [5, "module-psy_simple.plugin", false], [6, "module-psy_simple.widgets", false], [7, "module-psy_simple.widgets.colors", false], [8, "module-psy_simple.widgets.texts", false]], "month (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.month", false]], "monthbegin (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.monthbegin", false]], "monthend (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.monthend", false]], "mpl_weight2qt() (in module psy_simple.widgets.texts)": [[8, "psy_simple.widgets.texts.mpl_weight2qt", false]], "n (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.N", false]], "name (psy_simple.base.backgroundcolor attribute)": [[2, "psy_simple.base.BackgroundColor.name", false]], "name (psy_simple.base.figtitle attribute)": [[2, "psy_simple.base.Figtitle.name", false]], "name (psy_simple.base.mask attribute)": [[2, "psy_simple.base.Mask.name", false]], "name (psy_simple.base.maskbetween attribute)": [[2, "psy_simple.base.MaskBetween.name", false]], "name (psy_simple.base.maskgeq attribute)": [[2, "psy_simple.base.MaskGeq.name", false]], "name (psy_simple.base.maskgreater attribute)": [[2, "psy_simple.base.MaskGreater.name", false]], "name (psy_simple.base.maskleq attribute)": [[2, "psy_simple.base.MaskLeq.name", false]], "name (psy_simple.base.maskless attribute)": [[2, "psy_simple.base.MaskLess.name", false]], "name (psy_simple.base.text attribute)": [[2, "psy_simple.base.Text.name", false]], "name (psy_simple.base.tight attribute)": [[2, "psy_simple.base.Tight.name", false]], "name (psy_simple.base.title attribute)": [[2, "psy_simple.base.Title.name", false]], "name (psy_simple.plotters.alternativexcoord attribute)": [[4, "psy_simple.plotters.AlternativeXCoord.name", false]], "name (psy_simple.plotters.arrowsize attribute)": [[4, "psy_simple.plotters.ArrowSize.name", false]], "name (psy_simple.plotters.arrowstyle attribute)": [[4, "psy_simple.plotters.ArrowStyle.name", false]], "name (psy_simple.plotters.axiscolor attribute)": [[4, "psy_simple.plotters.AxisColor.name", false]], "name (psy_simple.plotters.baralpha attribute)": [[4, "psy_simple.plotters.BarAlpha.name", false]], "name (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.name", false]], "name (psy_simple.plotters.barwidths attribute)": [[4, "psy_simple.plotters.BarWidths.name", false]], "name (psy_simple.plotters.bounds attribute)": [[4, "psy_simple.plotters.Bounds.name", false]], "name (psy_simple.plotters.categoricalbars attribute)": [[4, "psy_simple.plotters.CategoricalBars.name", false]], "name (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.name", false]], "name (psy_simple.plotters.cbarspacing attribute)": [[4, "psy_simple.plotters.CbarSpacing.name", false]], "name (psy_simple.plotters.clabel attribute)": [[4, "psy_simple.plotters.CLabel.name", false]], "name (psy_simple.plotters.cmap attribute)": [[4, "psy_simple.plotters.CMap.name", false]], "name (psy_simple.plotters.contourlevels attribute)": [[4, "psy_simple.plotters.ContourLevels.name", false]], "name (psy_simple.plotters.cticklabels attribute)": [[4, "psy_simple.plotters.CTickLabels.name", false]], "name (psy_simple.plotters.ctickprops attribute)": [[4, "psy_simple.plotters.CTickProps.name", false]], "name (psy_simple.plotters.cticks attribute)": [[4, "psy_simple.plotters.CTicks.name", false]], "name (psy_simple.plotters.cticksize attribute)": [[4, "psy_simple.plotters.CTickSize.name", false]], "name (psy_simple.plotters.ctickweight attribute)": [[4, "psy_simple.plotters.CTickWeight.name", false]], "name (psy_simple.plotters.datagrid attribute)": [[4, "psy_simple.plotters.DataGrid.name", false]], "name (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.name", false]], "name (psy_simple.plotters.density attribute)": [[4, "psy_simple.plotters.Density.name", false]], "name (psy_simple.plotters.erroralpha attribute)": [[4, "psy_simple.plotters.ErrorAlpha.name", false]], "name (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.name", false]], "name (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.name", false]], "name (psy_simple.plotters.extend attribute)": [[4, "psy_simple.plotters.Extend.name", false]], "name (psy_simple.plotters.grid attribute)": [[4, "psy_simple.plotters.Grid.name", false]], "name (psy_simple.plotters.hist2dxrange attribute)": [[4, "psy_simple.plotters.Hist2DXRange.name", false]], "name (psy_simple.plotters.hist2dyrange attribute)": [[4, "psy_simple.plotters.Hist2DYRange.name", false]], "name (psy_simple.plotters.histbins attribute)": [[4, "psy_simple.plotters.HistBins.name", false]], "name (psy_simple.plotters.labelprops attribute)": [[4, "psy_simple.plotters.LabelProps.name", false]], "name (psy_simple.plotters.labelsize attribute)": [[4, "psy_simple.plotters.LabelSize.name", false]], "name (psy_simple.plotters.labelweight attribute)": [[4, "psy_simple.plotters.LabelWeight.name", false]], "name (psy_simple.plotters.legend attribute)": [[4, "psy_simple.plotters.Legend.name", false]], "name (psy_simple.plotters.legendlabels attribute)": [[4, "psy_simple.plotters.LegendLabels.name", false]], "name (psy_simple.plotters.linecolors attribute)": [[4, "psy_simple.plotters.LineColors.name", false]], "name (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.name", false]], "name (psy_simple.plotters.meancalculator attribute)": [[4, "psy_simple.plotters.MeanCalculator.name", false]], "name (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.name", false]], "name (psy_simple.plotters.normedhist2d attribute)": [[4, "psy_simple.plotters.NormedHist2D.name", false]], "name (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.name", false]], "name (psy_simple.plotters.pointdensity attribute)": [[4, "psy_simple.plotters.PointDensity.name", false]], "name (psy_simple.plotters.symmetriclimits attribute)": [[4, "psy_simple.plotters.SymmetricLimits.name", false]], "name (psy_simple.plotters.ticksize attribute)": [[4, "psy_simple.plotters.TickSize.name", false]], "name (psy_simple.plotters.tickweight attribute)": [[4, "psy_simple.plotters.TickWeight.name", false]], "name (psy_simple.plotters.transpose attribute)": [[4, "psy_simple.plotters.Transpose.name", false]], "name (psy_simple.plotters.vectorcolor attribute)": [[4, "psy_simple.plotters.VectorColor.name", false]], "name (psy_simple.plotters.vectorlinewidth attribute)": [[4, "psy_simple.plotters.VectorLineWidth.name", false]], "name (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.name", false]], "name (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.name", false]], "name (psy_simple.plotters.xlabel attribute)": [[4, "psy_simple.plotters.Xlabel.name", false]], "name (psy_simple.plotters.xlim attribute)": [[4, "psy_simple.plotters.Xlim.name", false]], "name (psy_simple.plotters.xrotation attribute)": [[4, "psy_simple.plotters.XRotation.name", false]], "name (psy_simple.plotters.xticklabels attribute)": [[4, "psy_simple.plotters.XTickLabels.name", false]], "name (psy_simple.plotters.xtickprops attribute)": [[4, "psy_simple.plotters.XTickProps.name", false]], "name (psy_simple.plotters.xticks attribute)": [[4, "psy_simple.plotters.XTicks.name", false]], "name (psy_simple.plotters.ylabel attribute)": [[4, "psy_simple.plotters.Ylabel.name", false]], "name (psy_simple.plotters.ylim attribute)": [[4, "psy_simple.plotters.Ylim.name", false]], "name (psy_simple.plotters.yrotation attribute)": [[4, "psy_simple.plotters.YRotation.name", false]], "name (psy_simple.plotters.yticklabels attribute)": [[4, "psy_simple.plotters.YTickLabels.name", false]], "name (psy_simple.plotters.ytickprops attribute)": [[4, "psy_simple.plotters.YTickProps.name", false]], "name (psy_simple.plotters.yticks attribute)": [[4, "psy_simple.plotters.YTicks.name", false]], "norm_map (psy_simple.widgets.colors.boundsfmtwidget attribute)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.norm_map", false]], "norm_map (psy_simple.widgets.colors.cticksfmtwidget attribute)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.norm_map", false]], "normalizationwidget (class in psy_simple.widgets.colors)": [[7, "psy_simple.widgets.colors.NormalizationWidget", false]], "normed (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.normed", false]], "normed (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.normed", false]], "normedhist2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.NormedHist2D", false]], "notnull_array (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.notnull_array", false]], "open_cmap_dialog() (psy_simple.widgets.colors.cmapbutton method)": [[7, "psy_simple.widgets.colors.CmapButton.open_cmap_dialog", false]], "original_position (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.original_position", false]], "parents (psy_simple.plotters.labelsize attribute)": [[4, "psy_simple.plotters.LabelSize.parents", false]], "parents (psy_simple.plotters.labelweight attribute)": [[4, "psy_simple.plotters.LabelWeight.parents", false]], "parents (psy_simple.plotters.vectorbounds attribute)": [[4, "psy_simple.plotters.VectorBounds.parents", false]], "patch_prior_1_0() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.patch_prior_1_0", false]], "patches (in module psy_simple.plugin)": [[5, "psy_simple.plugin.patches", false]], "percmax (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.percmax", false]], "percmin (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.percmin", false]], "plot (psy_simple.plotters.arrowsize property)": [[4, "psy_simple.plotters.ArrowSize.plot", false]], "plot (psy_simple.plotters.arrowstyle property)": [[4, "psy_simple.plotters.ArrowStyle.plot", false]], "plot (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.plot", false]], "plot (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.plot", false]], "plot (psy_simple.plotters.barxticklabels property)": [[4, "psy_simple.plotters.BarXTickLabels.plot", false]], "plot (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.plot", false]], "plot (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.plot", false]], "plot (psy_simple.plotters.baryticklabels property)": [[4, "psy_simple.plotters.BarYTickLabels.plot", false]], "plot (psy_simple.plotters.baryticks property)": [[4, "psy_simple.plotters.BarYTicks.plot", false]], "plot (psy_simple.plotters.base2d attribute)": [[4, "psy_simple.plotters.Base2D.plot", false]], "plot (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.plot", false]], "plot (psy_simple.plotters.cbaroptions property)": [[4, "psy_simple.plotters.CbarOptions.plot", false]], "plot (psy_simple.plotters.clabel property)": [[4, "psy_simple.plotters.CLabel.plot", false]], "plot (psy_simple.plotters.combinedsimpleplotter attribute)": [[4, "psy_simple.plotters.CombinedSimplePlotter.plot", false]], "plot (psy_simple.plotters.cticklabels property)": [[4, "psy_simple.plotters.CTickLabels.plot", false]], "plot (psy_simple.plotters.ctickprops property)": [[4, "psy_simple.plotters.CTickProps.plot", false]], "plot (psy_simple.plotters.cticks property)": [[4, "psy_simple.plotters.CTicks.plot", false]], "plot (psy_simple.plotters.cticksize property)": [[4, "psy_simple.plotters.CTickSize.plot", false]], "plot (psy_simple.plotters.ctickweight property)": [[4, "psy_simple.plotters.CTickWeight.plot", false]], "plot (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.plot", false]], "plot (psy_simple.plotters.density property)": [[4, "psy_simple.plotters.Density.plot", false]], "plot (psy_simple.plotters.dtticksbase property)": [[4, "psy_simple.plotters.DtTicksBase.plot", false]], "plot (psy_simple.plotters.errorplot property)": [[4, "psy_simple.plotters.ErrorPlot.plot", false]], "plot (psy_simple.plotters.extend property)": [[4, "psy_simple.plotters.Extend.plot", false]], "plot (psy_simple.plotters.hist2dxrange property)": [[4, "psy_simple.plotters.Hist2DXRange.plot", false]], "plot (psy_simple.plotters.hist2dyrange property)": [[4, "psy_simple.plotters.Hist2DYRange.plot", false]], "plot (psy_simple.plotters.legend property)": [[4, "psy_simple.plotters.Legend.plot", false]], "plot (psy_simple.plotters.limitbase property)": [[4, "psy_simple.plotters.LimitBase.plot", false]], "plot (psy_simple.plotters.lineplotter attribute)": [[4, "psy_simple.plotters.LinePlotter.plot", false]], "plot (psy_simple.plotters.linewidth property)": [[4, "psy_simple.plotters.LineWidth.plot", false]], "plot (psy_simple.plotters.markersize property)": [[4, "psy_simple.plotters.MarkerSize.plot", false]], "plot (psy_simple.plotters.misscolor property)": [[4, "psy_simple.plotters.MissColor.plot", false]], "plot (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.plot", false]], "plot (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.plot", false]], "plot (psy_simple.plotters.ticksbase property)": [[4, "psy_simple.plotters.TicksBase.plot", false]], "plot (psy_simple.plotters.vclabel property)": [[4, "psy_simple.plotters.VCLabel.plot", false]], "plot (psy_simple.plotters.vectorcalculator property)": [[4, "psy_simple.plotters.VectorCalculator.plot", false]], "plot (psy_simple.plotters.vectorcbar property)": [[4, "psy_simple.plotters.VectorCbar.plot", false]], "plot (psy_simple.plotters.vectorcolor property)": [[4, "psy_simple.plotters.VectorColor.plot", false]], "plot (psy_simple.plotters.vectorcticks property)": [[4, "psy_simple.plotters.VectorCTicks.plot", false]], "plot (psy_simple.plotters.vectordatagrid property)": [[4, "psy_simple.plotters.VectorDataGrid.plot", false]], "plot (psy_simple.plotters.vectorlinewidth property)": [[4, "psy_simple.plotters.VectorLineWidth.plot", false]], "plot (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.plot", false]], "plot (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.plot", false]], "plot (psy_simple.plotters.violinxticks property)": [[4, "psy_simple.plotters.ViolinXTicks.plot", false]], "plot (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.plot", false]], "plot (psy_simple.plotters.violinyticks property)": [[4, "psy_simple.plotters.ViolinYTicks.plot", false]], "plot (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.plot", false]], "plot (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.plot", false]], "plot (psy_simple.plotters.xticks property)": [[4, "psy_simple.plotters.XTicks.plot", false]], "plot (psy_simple.plotters.xticks2d property)": [[4, "psy_simple.plotters.XTicks2D.plot", false]], "plot (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.plot", false]], "plot (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.plot", false]], "plot (psy_simple.plotters.yticks property)": [[4, "psy_simple.plotters.YTicks.plot", false]], "plot (psy_simple.plotters.yticks2d property)": [[4, "psy_simple.plotters.YTicks2D.plot", false]], "plot2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Plot2D", false]], "plot2d (psyplot.project.plot attribute)": [[16, "psyplot.project.plot.plot2d", false]], "plot_arr() (psy_simple.plotters.lineplot method)": [[4, "psy_simple.plotters.LinePlot.plot_arr", false]], "plot_fill() (psy_simple.plotters.errorplot method)": [[4, "psy_simple.plotters.ErrorPlot.plot_fill", false]], "plot_fmt (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.plot_fmt", false]], "plot_fmt (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.plot_fmt", false]], "plot_fmt (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.plot_fmt", false]], "plot_fmt (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.plot_fmt", false]], "plot_fmt (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.plot_fmt", false]], "plot_fmt (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.plot_fmt", false]], "plotted_data (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.plotted_data", false]], "plotted_data (psy_simple.plotters.lineplot property)": [[4, "psy_simple.plotters.LinePlot.plotted_data", false]], "pointdensity (class in psy_simple.plotters)": [[4, "psy_simple.plotters.PointDensity", false]], "precision (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.precision", false]], "precision (psy_simple.plotters.histbins property)": [[4, "psy_simple.plotters.HistBins.precision", false]], "precision (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.precision", false]], "priority (psy_simple.base.mask attribute)": [[2, "psy_simple.base.Mask.priority", false]], "priority (psy_simple.base.valuemaskbase attribute)": [[2, "psy_simple.base.ValueMaskBase.priority", false]], "priority (psy_simple.plotters.alternativexcoord attribute)": [[4, "psy_simple.plotters.AlternativeXCoord.priority", false]], "priority (psy_simple.plotters.arrowsize attribute)": [[4, "psy_simple.plotters.ArrowSize.priority", false]], "priority (psy_simple.plotters.arrowstyle attribute)": [[4, "psy_simple.plotters.ArrowStyle.priority", false]], "priority (psy_simple.plotters.baralpha attribute)": [[4, "psy_simple.plotters.BarAlpha.priority", false]], "priority (psy_simple.plotters.barplot attribute)": [[4, "psy_simple.plotters.BarPlot.priority", false]], "priority (psy_simple.plotters.barwidths attribute)": [[4, "psy_simple.plotters.BarWidths.priority", false]], "priority (psy_simple.plotters.bounds attribute)": [[4, "psy_simple.plotters.Bounds.priority", false]], "priority (psy_simple.plotters.categoricalbars attribute)": [[4, "psy_simple.plotters.CategoricalBars.priority", false]], "priority (psy_simple.plotters.cbar attribute)": [[4, "psy_simple.plotters.Cbar.priority", false]], "priority (psy_simple.plotters.cmap attribute)": [[4, "psy_simple.plotters.CMap.priority", false]], "priority (psy_simple.plotters.contourlevels attribute)": [[4, "psy_simple.plotters.ContourLevels.priority", false]], "priority (psy_simple.plotters.dataprecision attribute)": [[4, "psy_simple.plotters.DataPrecision.priority", false]], "priority (psy_simple.plotters.density attribute)": [[4, "psy_simple.plotters.Density.priority", false]], "priority (psy_simple.plotters.erroralpha attribute)": [[4, "psy_simple.plotters.ErrorAlpha.priority", false]], "priority (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.priority", false]], "priority (psy_simple.plotters.errorplot attribute)": [[4, "psy_simple.plotters.ErrorPlot.priority", false]], "priority (psy_simple.plotters.hist2dxrange attribute)": [[4, "psy_simple.plotters.Hist2DXRange.priority", false]], "priority (psy_simple.plotters.histbins attribute)": [[4, "psy_simple.plotters.HistBins.priority", false]], "priority (psy_simple.plotters.interpolatebounds attribute)": [[4, "psy_simple.plotters.InterpolateBounds.priority", false]], "priority (psy_simple.plotters.linecolors attribute)": [[4, "psy_simple.plotters.LineColors.priority", false]], "priority (psy_simple.plotters.lineplot attribute)": [[4, "psy_simple.plotters.LinePlot.priority", false]], "priority (psy_simple.plotters.linewidth attribute)": [[4, "psy_simple.plotters.LineWidth.priority", false]], "priority (psy_simple.plotters.marker attribute)": [[4, "psy_simple.plotters.Marker.priority", false]], "priority (psy_simple.plotters.markersize attribute)": [[4, "psy_simple.plotters.MarkerSize.priority", false]], "priority (psy_simple.plotters.meancalculator attribute)": [[4, "psy_simple.plotters.MeanCalculator.priority", false]], "priority (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.priority", false]], "priority (psy_simple.plotters.normedhist2d attribute)": [[4, "psy_simple.plotters.NormedHist2D.priority", false]], "priority (psy_simple.plotters.plot2d attribute)": [[4, "psy_simple.plotters.Plot2D.priority", false]], "priority (psy_simple.plotters.pointdensity attribute)": [[4, "psy_simple.plotters.PointDensity.priority", false]], "priority (psy_simple.plotters.transpose attribute)": [[4, "psy_simple.plotters.Transpose.priority", false]], "priority (psy_simple.plotters.vectorcalculator attribute)": [[4, "psy_simple.plotters.VectorCalculator.priority", false]], "priority (psy_simple.plotters.vectorcbar attribute)": [[4, "psy_simple.plotters.VectorCbar.priority", false]], "priority (psy_simple.plotters.vectorplot attribute)": [[4, "psy_simple.plotters.VectorPlot.priority", false]], "priority (psy_simple.plotters.violinplot attribute)": [[4, "psy_simple.plotters.ViolinPlot.priority", false]], "psy_simple": [[1, "module-psy_simple", false]], "psy_simple.base": [[2, "module-psy_simple.base", false]], "psy_simple.colors": [[3, "module-psy_simple.colors", false]], "psy_simple.plotters": [[4, "module-psy_simple.plotters", false]], "psy_simple.plugin": [[5, "module-psy_simple.plugin", false]], "psy_simple.widgets": [[6, "module-psy_simple.widgets", false]], "psy_simple.widgets.colors": [[7, "module-psy_simple.widgets.colors", false]], "psy_simple.widgets.texts": [[8, "module-psy_simple.widgets.texts", false]], "qfont_to_artist_props() (psy_simple.widgets.texts.fontpropertieswidget static method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.qfont_to_artist_props", false]], "rc (psy_simple.base.textbase property)": [[2, "psy_simple.base.TextBase.rc", false]], "rcparams (in module psy_simple.plugin)": [[5, "psy_simple.plugin.rcParams", false]], "refresh() (psy_simple.widgets.colors.datatickscalculatorfmtwidget method)": [[7, "psy_simple.widgets.colors.DataTicksCalculatorFmtWidget.refresh", false]], "refresh() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.refresh", false]], "refresh_cb_invert() (psy_simple.widgets.colors.cmapfmtwidget method)": [[7, "psy_simple.widgets.colors.CMapFmtWidget.refresh_cb_invert", false]], "refresh_current_widget() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.refresh_current_widget", false]], "refresh_current_widget() (psy_simple.widgets.colors.cticksfmtwidget method)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.refresh_current_widget", false]], "refresh_methods() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.refresh_methods", false]], "refresh_methods() (psy_simple.widgets.colors.cticksfmtwidget method)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.refresh_methods", false]], "remove() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.remove", false]], "remove() (psy_simple.plotters.barplot method)": [[4, "psy_simple.plotters.BarPlot.remove", false]], "remove() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.remove", false]], "remove() (psy_simple.plotters.datagrid method)": [[4, "psy_simple.plotters.DataGrid.remove", false]], "remove() (psy_simple.plotters.density method)": [[4, "psy_simple.plotters.Density.remove", false]], "remove() (psy_simple.plotters.errorplot method)": [[4, "psy_simple.plotters.ErrorPlot.remove", false]], "remove() (psy_simple.plotters.legend method)": [[4, "psy_simple.plotters.Legend.remove", false]], "remove() (psy_simple.plotters.lineplot method)": [[4, "psy_simple.plotters.LinePlot.remove", false]], "remove() (psy_simple.plotters.misscolor method)": [[4, "psy_simple.plotters.MissColor.remove", false]], "remove() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.remove", false]], "remove() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.remove", false]], "remove() (psy_simple.plotters.violinplot method)": [[4, "psy_simple.plotters.ViolinPlot.remove", false]], "replace() (psy_simple.base.textbase method)": [[2, "psy_simple.base.TextBase.replace", false]], "replace_coord() (psy_simple.plotters.alternativexcoord method)": [[4, "psy_simple.plotters.AlternativeXCoord.replace_coord", false]], "requires_replot (psy_simple.plotters.errorcalculator attribute)": [[4, "psy_simple.plotters.ErrorCalculator.requires_replot", false]], "requires_replot (psy_simple.plotters.meancalculator attribute)": [[4, "psy_simple.plotters.MeanCalculator.requires_replot", false]], "reset() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.reset", false]], "round_to_05() (in module psy_simple.plotters)": [[4, "psy_simple.plotters.round_to_05", false]], "rounded (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.rounded", false]], "rounded (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.rounded", false]], "rounded (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.rounded", false]], "roundedsym (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.roundedsym", false]], "roundedsym (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.roundedsym", false]], "roundedsym (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.roundedsym", false]], "rowcount() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.rowCount", false]], "rowcount() (psy_simple.widgets.colors.colormaptable method)": [[7, "psy_simple.widgets.colors.ColormapTable.rowCount", false]], "scalarcombinedbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ScalarCombinedBase", false]], "select_color() (psy_simple.widgets.colors.colorlabel method)": [[7, "psy_simple.widgets.colors.ColorLabel.select_color", false]], "set_array() (psy_simple.widgets.colors.arrayfmtwidget method)": [[7, "psy_simple.widgets.colors.ArrayFmtWidget.set_array", false]], "set_cmap() (psy_simple.widgets.colors.cmapbutton method)": [[7, "psy_simple.widgets.colors.CmapButton.set_cmap", false]], "set_color() (psy_simple.widgets.colors.backgroundcolorwidget method)": [[7, "psy_simple.widgets.colors.BackGroundColorWidget.set_color", false]], "set_color() (psy_simple.widgets.colors.colorlabel method)": [[7, "psy_simple.widgets.colors.ColorLabel.set_color", false]], "set_colors() (psy_simple.widgets.colors.colormapmodel method)": [[7, "psy_simple.widgets.colors.ColormapModel.set_colors", false]], "set_default_formatters() (psy_simple.plotters.cticklabels method)": [[4, "psy_simple.plotters.CTickLabels.set_default_formatters", false]], "set_default_formatters() (psy_simple.plotters.ticklabels method)": [[4, "psy_simple.plotters.TickLabels.set_default_formatters", false]], "set_default_formatters() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.set_default_formatters", false]], "set_default_locators() (psy_simple.plotters.barxticks method)": [[4, "psy_simple.plotters.BarXTicks.set_default_locators", false]], "set_default_locators() (psy_simple.plotters.baryticks method)": [[4, "psy_simple.plotters.BarYTicks.set_default_locators", false]], "set_default_locators() (psy_simple.plotters.cticks method)": [[4, "psy_simple.plotters.CTicks.set_default_locators", false]], "set_default_locators() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.set_default_locators", false]], "set_formatter() (psy_simple.plotters.cticklabels method)": [[4, "psy_simple.plotters.CTickLabels.set_formatter", false]], "set_formatter() (psy_simple.plotters.ticklabels method)": [[4, "psy_simple.plotters.TickLabels.set_formatter", false]], "set_formatter() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.set_formatter", false]], "set_highlighted() (psy_simple.widgets.colors.highlightwidget method)": [[7, "psy_simple.widgets.colors.HighlightWidget.set_highlighted", false]], "set_label_pos() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.set_label_pos", false]], "set_limit() (psy_simple.plotters.hist2dxrange method)": [[4, "psy_simple.plotters.Hist2DXRange.set_limit", false]], "set_limit() (psy_simple.plotters.limitbase method)": [[4, "psy_simple.plotters.LimitBase.set_limit", false]], "set_limit() (psy_simple.plotters.xlim method)": [[4, "psy_simple.plotters.Xlim.set_limit", false]], "set_limit() (psy_simple.plotters.ylim method)": [[4, "psy_simple.plotters.Ylim.set_limit", false]], "set_locator() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.set_locator", false]], "set_obj() (psy_simple.widgets.colors.arrayfmtwidget method)": [[7, "psy_simple.widgets.colors.ArrayFmtWidget.set_obj", false]], "set_obj() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.set_obj", false]], "set_obj() (psy_simple.widgets.colors.cmapfmtwidget method)": [[7, "psy_simple.widgets.colors.CMapFmtWidget.set_obj", false]], "set_obj() (psy_simple.widgets.colors.datatickscalculatorfmtwidget method)": [[7, "psy_simple.widgets.colors.DataTicksCalculatorFmtWidget.set_obj", false]], "set_obj() (psy_simple.widgets.colors.normalizationwidget method)": [[7, "psy_simple.widgets.colors.NormalizationWidget.set_obj", false]], "set_stringformatter() (psy_simple.plotters.barxticklabels method)": [[4, "psy_simple.plotters.BarXTickLabels.set_stringformatter", false]], "set_stringformatter() (psy_simple.plotters.baryticklabels method)": [[4, "psy_simple.plotters.BarYTickLabels.set_stringformatter", false]], "set_stringformatter() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.set_stringformatter", false]], "set_ticklabels() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.set_ticklabels", false]], "set_ticks() (psy_simple.plotters.cticks method)": [[4, "psy_simple.plotters.CTicks.set_ticks", false]], "set_ticks() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.set_ticks", false]], "set_transparent() (psy_simple.widgets.colors.backgroundcolorwidget method)": [[7, "psy_simple.widgets.colors.BackGroundColorWidget.set_transparent", false]], "set_value() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.set_value", false]], "set_value() (psy_simple.plotters.simplevectorplot method)": [[4, "psy_simple.plotters.SimpleVectorPlot.set_value", false]], "set_value() (psy_simple.widgets.colors.boundsfmtwidget method)": [[7, "psy_simple.widgets.colors.BoundsFmtWidget.set_value", false]], "set_value() (psy_simple.widgets.colors.cticksfmtwidget method)": [[7, "psy_simple.widgets.colors.CTicksFmtWidget.set_value", false]], "setenabled() (psy_simple.widgets.colors.colorlabel method)": [[7, "psy_simple.widgets.colors.ColorLabel.setEnabled", false]], "setmodel() (psy_simple.widgets.colors.colormaptable method)": [[7, "psy_simple.widgets.colors.ColormapTable.setModel", false]], "setup_cmap_menu() (psy_simple.widgets.colors.cmapbutton method)": [[7, "psy_simple.widgets.colors.CmapButton.setup_cmap_menu", false]], "share() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.share", false]], "show_colormap() (psy_simple.widgets.colors.colormapdialog class method)": [[7, "psy_simple.widgets.colors.ColormapDialog.show_colormap", false]], "show_colormaps() (in module psy_simple.colors)": [[3, "psy_simple.colors.show_colormaps", false]], "simple2dbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Simple2DBase", false]], "simple2dplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Simple2DPlotter", false]], "simpleplot2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.SimplePlot2D", false]], "simpleplotterbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.SimplePlotterBase", false]], "simplevectorplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.SimpleVectorPlot", false]], "simplevectorplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.SimpleVectorPlotter", false]], "sizehint() (psy_simple.widgets.colors.colorlabel method)": [[7, "psy_simple.widgets.colors.ColorLabel.sizeHint", false]], "strenum (class in psy_simple.plugin)": [[5, "psy_simple.plugin.strEnum", false]], "switch2fmtbutton (class in psy_simple.widgets)": [[6, "psy_simple.widgets.Switch2FmtButton", false]], "sym (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.sym", false]], "sym (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.sym", false]], "sym (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.sym", false]], "sym_lims (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.sym_lims", false]], "sym_lims (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.sym_lims", false]], "sym_lims (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.sym_lims", false]], "sym_lims (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.sym_lims", false]], "sym_lims (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.sym_lims", false]], "sym_lims (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.sym_lims", false]], "sym_lims (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.sym_lims", false]], "sym_lims (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.sym_lims", false]], "sym_lims (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.sym_lims", false]], "symlog (psy_simple.plugin.boundsmethod attribute)": [[5, "psy_simple.plugin.BoundsMethod.symlog", false]], "symlog (psy_simple.plugin.cticksmethod attribute)": [[5, "psy_simple.plugin.CTicksMethod.symlog", false]], "symlog (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.symlog", false]], "symmetriclimits (class in psy_simple.plotters)": [[4, "psy_simple.plotters.SymmetricLimits", false]], "text (class in psy_simple.base)": [[2, "psy_simple.base.Text", false]], "text (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.text", false]], "textbase (class in psy_simple.base)": [[2, "psy_simple.base.TextBase", false]], "ticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickLabels", false]], "ticklabelsbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickLabelsBase", false]], "tickpropsbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickPropsBase", false]], "ticksbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TicksBase", false]], "ticksize (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickSize", false]], "ticksize (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.ticksize", false]], "ticksizebase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickSizeBase", false]], "ticksmanager (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TicksManager", false]], "ticksmanagerbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TicksManagerBase", false]], "ticksmethod (class in psy_simple.plugin)": [[5, "psy_simple.plugin.TicksMethod", false]], "ticksoptions (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TicksOptions", false]], "tickstype (class in psy_simple.plugin)": [[5, "psy_simple.plugin.TicksType", false]], "ticksvalidator (class in psy_simple.plugin)": [[5, "psy_simple.plugin.TicksValidator", false]], "tickweight (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickWeight", false]], "tickweight (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.tickweight", false]], "tickweightbase (class in psy_simple.plotters)": [[4, "psy_simple.plotters.TickWeightBase", false]], "tight (class in psy_simple.base)": [[2, "psy_simple.base.Tight", false]], "tight (psy_simple.base.baseplotter attribute)": [[2, "psy_simple.base.BasePlotter.tight", false]], "title (class in psy_simple.base)": [[2, "psy_simple.base.Title", false]], "title (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.title", false]], "titleprops (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.titleprops", false]], "titlesize (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.titlesize", false]], "titlesplotter (class in psy_simple.base)": [[2, "psy_simple.base.TitlesPlotter", false]], "titleweight (psy_simple.base.titlesplotter attribute)": [[2, "psy_simple.base.TitlesPlotter.titleweight", false]], "toggle_bold() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.toggle_bold", false]], "toggle_color_button() (psy_simple.widgets.colors.backgroundcolorwidget method)": [[7, "psy_simple.widgets.colors.BackGroundColorWidget.toggle_color_button", false]], "toggle_italic() (psy_simple.widgets.texts.fontpropertieswidget method)": [[8, "psy_simple.widgets.texts.FontPropertiesWidget.toggle_italic", false]], "toggle_txt_step() (psy_simple.widgets.colors.arrayfmtwidget method)": [[7, "psy_simple.widgets.colors.ArrayFmtWidget.toggle_txt_step", false]], "transform (psy_simple.base.text property)": [[2, "psy_simple.base.Text.transform", false]], "transform (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.transform", false]], "transform (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.transform", false]], "transform (psy_simple.plotters.misscolor property)": [[4, "psy_simple.plotters.MissColor.transform", false]], "transform (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.transform", false]], "transform (psy_simple.plotters.vectordatagrid property)": [[4, "psy_simple.plotters.VectorDataGrid.transform", false]], "transform (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.transform", false]], "transpose (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Transpose", false]], "transpose (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.transpose", false]], "transpose (psy_simple.plotters.barxlabel property)": [[4, "psy_simple.plotters.BarXlabel.transpose", false]], "transpose (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.transpose", false]], "transpose (psy_simple.plotters.barxticklabels property)": [[4, "psy_simple.plotters.BarXTickLabels.transpose", false]], "transpose (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.transpose", false]], "transpose (psy_simple.plotters.barylabel property)": [[4, "psy_simple.plotters.BarYlabel.transpose", false]], "transpose (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.transpose", false]], "transpose (psy_simple.plotters.baryticklabels property)": [[4, "psy_simple.plotters.BarYTickLabels.transpose", false]], "transpose (psy_simple.plotters.baryticks property)": [[4, "psy_simple.plotters.BarYTicks.transpose", false]], "transpose (psy_simple.plotters.combinedvectorplot property)": [[4, "psy_simple.plotters.CombinedVectorPlot.transpose", false]], "transpose (psy_simple.plotters.dtticksbase property)": [[4, "psy_simple.plotters.DtTicksBase.transpose", false]], "transpose (psy_simple.plotters.errorplot property)": [[4, "psy_simple.plotters.ErrorPlot.transpose", false]], "transpose (psy_simple.plotters.hist2dxrange property)": [[4, "psy_simple.plotters.Hist2DXRange.transpose", false]], "transpose (psy_simple.plotters.hist2dyrange property)": [[4, "psy_simple.plotters.Hist2DYRange.transpose", false]], "transpose (psy_simple.plotters.limitbase property)": [[4, "psy_simple.plotters.LimitBase.transpose", false]], "transpose (psy_simple.plotters.lineplot property)": [[4, "psy_simple.plotters.LinePlot.transpose", false]], "transpose (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.transpose", false]], "transpose (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.transpose", false]], "transpose (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.transpose", false]], "transpose (psy_simple.plotters.simplevectorplot property)": [[4, "psy_simple.plotters.SimpleVectorPlot.transpose", false]], "transpose (psy_simple.plotters.ticklabels property)": [[4, "psy_simple.plotters.TickLabels.transpose", false]], "transpose (psy_simple.plotters.ticklabelsbase property)": [[4, "psy_simple.plotters.TickLabelsBase.transpose", false]], "transpose (psy_simple.plotters.ticksbase property)": [[4, "psy_simple.plotters.TicksBase.transpose", false]], "transpose (psy_simple.plotters.vectorcalculator property)": [[4, "psy_simple.plotters.VectorCalculator.transpose", false]], "transpose (psy_simple.plotters.vectorcolor property)": [[4, "psy_simple.plotters.VectorColor.transpose", false]], "transpose (psy_simple.plotters.vectorlinewidth property)": [[4, "psy_simple.plotters.VectorLineWidth.transpose", false]], "transpose (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.transpose", false]], "transpose (psy_simple.plotters.violinplot property)": [[4, "psy_simple.plotters.ViolinPlot.transpose", false]], "transpose (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.transpose", false]], "transpose (psy_simple.plotters.violinxticklabels property)": [[4, "psy_simple.plotters.ViolinXTickLabels.transpose", false]], "transpose (psy_simple.plotters.violinxticks property)": [[4, "psy_simple.plotters.ViolinXTicks.transpose", false]], "transpose (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.transpose", false]], "transpose (psy_simple.plotters.violinyticklabels property)": [[4, "psy_simple.plotters.ViolinYTickLabels.transpose", false]], "transpose (psy_simple.plotters.violinyticks property)": [[4, "psy_simple.plotters.ViolinYTicks.transpose", false]], "transpose (psy_simple.plotters.xlabel property)": [[4, "psy_simple.plotters.Xlabel.transpose", false]], "transpose (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.transpose", false]], "transpose (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.transpose", false]], "transpose (psy_simple.plotters.xticklabels property)": [[4, "psy_simple.plotters.XTickLabels.transpose", false]], "transpose (psy_simple.plotters.xticks property)": [[4, "psy_simple.plotters.XTicks.transpose", false]], "transpose (psy_simple.plotters.xticks2d property)": [[4, "psy_simple.plotters.XTicks2D.transpose", false]], "transpose (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.transpose", false]], "transpose (psy_simple.plotters.ylabel property)": [[4, "psy_simple.plotters.Ylabel.transpose", false]], "transpose (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.transpose", false]], "transpose (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.transpose", false]], "transpose (psy_simple.plotters.yticklabels property)": [[4, "psy_simple.plotters.YTickLabels.transpose", false]], "transpose (psy_simple.plotters.yticks property)": [[4, "psy_simple.plotters.YTicks.transpose", false]], "transpose (psy_simple.plotters.yticks2d property)": [[4, "psy_simple.plotters.YTicks2D.transpose", false]], "try_and_error() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.try_and_error", false]], "update() (psy_simple.base.backgroundcolor method)": [[2, "psy_simple.base.BackgroundColor.update", false]], "update() (psy_simple.base.figtitle method)": [[2, "psy_simple.base.Figtitle.update", false]], "update() (psy_simple.base.mask method)": [[2, "psy_simple.base.Mask.update", false]], "update() (psy_simple.base.text method)": [[2, "psy_simple.base.Text.update", false]], "update() (psy_simple.base.tight method)": [[2, "psy_simple.base.Tight.update", false]], "update() (psy_simple.base.title method)": [[2, "psy_simple.base.Title.update", false]], "update() (psy_simple.base.valuemaskbase method)": [[2, "psy_simple.base.ValueMaskBase.update", false]], "update() (psy_simple.plotters.alternativexcoord method)": [[4, "psy_simple.plotters.AlternativeXCoord.update", false]], "update() (psy_simple.plotters.arrowsize method)": [[4, "psy_simple.plotters.ArrowSize.update", false]], "update() (psy_simple.plotters.arrowstyle method)": [[4, "psy_simple.plotters.ArrowStyle.update", false]], "update() (psy_simple.plotters.axiscolor method)": [[4, "psy_simple.plotters.AxisColor.update", false]], "update() (psy_simple.plotters.baralpha method)": [[4, "psy_simple.plotters.BarAlpha.update", false]], "update() (psy_simple.plotters.barplot method)": [[4, "psy_simple.plotters.BarPlot.update", false]], "update() (psy_simple.plotters.barwidths method)": [[4, "psy_simple.plotters.BarWidths.update", false]], "update() (psy_simple.plotters.barxticks method)": [[4, "psy_simple.plotters.BarXTicks.update", false]], "update() (psy_simple.plotters.baryticks method)": [[4, "psy_simple.plotters.BarYTicks.update", false]], "update() (psy_simple.plotters.bounds method)": [[4, "psy_simple.plotters.Bounds.update", false]], "update() (psy_simple.plotters.categoricalbars method)": [[4, "psy_simple.plotters.CategoricalBars.update", false]], "update() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.update", false]], "update() (psy_simple.plotters.cbaroptions method)": [[4, "psy_simple.plotters.CbarOptions.update", false]], "update() (psy_simple.plotters.cbarspacing method)": [[4, "psy_simple.plotters.CbarSpacing.update", false]], "update() (psy_simple.plotters.clabel method)": [[4, "psy_simple.plotters.CLabel.update", false]], "update() (psy_simple.plotters.cmap method)": [[4, "psy_simple.plotters.CMap.update", false]], "update() (psy_simple.plotters.combinedvectorplot method)": [[4, "psy_simple.plotters.CombinedVectorPlot.update", false]], "update() (psy_simple.plotters.contourlevels method)": [[4, "psy_simple.plotters.ContourLevels.update", false]], "update() (psy_simple.plotters.cticks method)": [[4, "psy_simple.plotters.CTicks.update", false]], "update() (psy_simple.plotters.datagrid method)": [[4, "psy_simple.plotters.DataGrid.update", false]], "update() (psy_simple.plotters.dataprecision method)": [[4, "psy_simple.plotters.DataPrecision.update", false]], "update() (psy_simple.plotters.density method)": [[4, "psy_simple.plotters.Density.update", false]], "update() (psy_simple.plotters.dtticksbase method)": [[4, "psy_simple.plotters.DtTicksBase.update", false]], "update() (psy_simple.plotters.erroralpha method)": [[4, "psy_simple.plotters.ErrorAlpha.update", false]], "update() (psy_simple.plotters.errorcalculator method)": [[4, "psy_simple.plotters.ErrorCalculator.update", false]], "update() (psy_simple.plotters.errorplot method)": [[4, "psy_simple.plotters.ErrorPlot.update", false]], "update() (psy_simple.plotters.extend method)": [[4, "psy_simple.plotters.Extend.update", false]], "update() (psy_simple.plotters.grid method)": [[4, "psy_simple.plotters.Grid.update", false]], "update() (psy_simple.plotters.histbins method)": [[4, "psy_simple.plotters.HistBins.update", false]], "update() (psy_simple.plotters.interpolatebounds method)": [[4, "psy_simple.plotters.InterpolateBounds.update", false]], "update() (psy_simple.plotters.labeloptions method)": [[4, "psy_simple.plotters.LabelOptions.update", false]], "update() (psy_simple.plotters.legend method)": [[4, "psy_simple.plotters.Legend.update", false]], "update() (psy_simple.plotters.legendlabels method)": [[4, "psy_simple.plotters.LegendLabels.update", false]], "update() (psy_simple.plotters.limitbase method)": [[4, "psy_simple.plotters.LimitBase.update", false]], "update() (psy_simple.plotters.linecolors method)": [[4, "psy_simple.plotters.LineColors.update", false]], "update() (psy_simple.plotters.lineplot method)": [[4, "psy_simple.plotters.LinePlot.update", false]], "update() (psy_simple.plotters.linewidth method)": [[4, "psy_simple.plotters.LineWidth.update", false]], "update() (psy_simple.plotters.marker method)": [[4, "psy_simple.plotters.Marker.update", false]], "update() (psy_simple.plotters.markersize method)": [[4, "psy_simple.plotters.MarkerSize.update", false]], "update() (psy_simple.plotters.maskdatagrid method)": [[4, "psy_simple.plotters.MaskDataGrid.update", false]], "update() (psy_simple.plotters.meancalculator method)": [[4, "psy_simple.plotters.MeanCalculator.update", false]], "update() (psy_simple.plotters.misscolor method)": [[4, "psy_simple.plotters.MissColor.update", false]], "update() (psy_simple.plotters.normedhist2d method)": [[4, "psy_simple.plotters.NormedHist2D.update", false]], "update() (psy_simple.plotters.plot2d method)": [[4, "psy_simple.plotters.Plot2D.update", false]], "update() (psy_simple.plotters.pointdensity method)": [[4, "psy_simple.plotters.PointDensity.update", false]], "update() (psy_simple.plotters.symmetriclimits method)": [[4, "psy_simple.plotters.SymmetricLimits.update", false]], "update() (psy_simple.plotters.ticklabels method)": [[4, "psy_simple.plotters.TickLabels.update", false]], "update() (psy_simple.plotters.ticksmanager method)": [[4, "psy_simple.plotters.TicksManager.update", false]], "update() (psy_simple.plotters.ticksoptions method)": [[4, "psy_simple.plotters.TicksOptions.update", false]], "update() (psy_simple.plotters.transpose method)": [[4, "psy_simple.plotters.Transpose.update", false]], "update() (psy_simple.plotters.vectorbounds method)": [[4, "psy_simple.plotters.VectorBounds.update", false]], "update() (psy_simple.plotters.vectorcbar method)": [[4, "psy_simple.plotters.VectorCbar.update", false]], "update() (psy_simple.plotters.vectorcolor method)": [[4, "psy_simple.plotters.VectorColor.update", false]], "update() (psy_simple.plotters.vectorlinewidth method)": [[4, "psy_simple.plotters.VectorLineWidth.update", false]], "update() (psy_simple.plotters.vectorplot method)": [[4, "psy_simple.plotters.VectorPlot.update", false]], "update() (psy_simple.plotters.violinplot method)": [[4, "psy_simple.plotters.ViolinPlot.update", false]], "update() (psy_simple.plotters.xlabel method)": [[4, "psy_simple.plotters.Xlabel.update", false]], "update() (psy_simple.plotters.xrotation method)": [[4, "psy_simple.plotters.XRotation.update", false]], "update() (psy_simple.plotters.ylabel method)": [[4, "psy_simple.plotters.Ylabel.update", false]], "update() (psy_simple.plotters.yrotation method)": [[4, "psy_simple.plotters.YRotation.update", false]], "update_after_plot (psy_simple.plotters.barxlabel attribute)": [[4, "psy_simple.plotters.BarXlabel.update_after_plot", false]], "update_after_plot (psy_simple.plotters.barylabel attribute)": [[4, "psy_simple.plotters.BarYlabel.update_after_plot", false]], "update_after_plot (psy_simple.plotters.misscolor attribute)": [[4, "psy_simple.plotters.MissColor.update_after_plot", false]], "update_axis() (psy_simple.plotters.ctickprops method)": [[4, "psy_simple.plotters.CTickProps.update_axis", false]], "update_axis() (psy_simple.plotters.cticks method)": [[4, "psy_simple.plotters.CTicks.update_axis", false]], "update_axis() (psy_simple.plotters.labeloptions method)": [[4, "psy_simple.plotters.LabelOptions.update_axis", false]], "update_axis() (psy_simple.plotters.labelprops method)": [[4, "psy_simple.plotters.LabelProps.update_axis", false]], "update_axis() (psy_simple.plotters.labelsize method)": [[4, "psy_simple.plotters.LabelSize.update_axis", false]], "update_axis() (psy_simple.plotters.labelweight method)": [[4, "psy_simple.plotters.LabelWeight.update_axis", false]], "update_axis() (psy_simple.plotters.ticklabelsbase method)": [[4, "psy_simple.plotters.TickLabelsBase.update_axis", false]], "update_axis() (psy_simple.plotters.tickpropsbase method)": [[4, "psy_simple.plotters.TickPropsBase.update_axis", false]], "update_axis() (psy_simple.plotters.ticksbase method)": [[4, "psy_simple.plotters.TicksBase.update_axis", false]], "update_axis() (psy_simple.plotters.ticksizebase method)": [[4, "psy_simple.plotters.TickSizeBase.update_axis", false]], "update_axis() (psy_simple.plotters.ticksmanagerbase method)": [[4, "psy_simple.plotters.TicksManagerBase.update_axis", false]], "update_axis() (psy_simple.plotters.tickweightbase method)": [[4, "psy_simple.plotters.TickWeightBase.update_axis", false]], "update_axis() (psy_simple.plotters.violinxticklabels method)": [[4, "psy_simple.plotters.ViolinXTickLabels.update_axis", false]], "update_axis() (psy_simple.plotters.violinyticklabels method)": [[4, "psy_simple.plotters.ViolinYTickLabels.update_axis", false]], "update_colorbar() (psy_simple.plotters.cbar method)": [[4, "psy_simple.plotters.Cbar.update_colorbar", false]], "use_raw_data (psy_simple.plotters.alternativexcoord attribute)": [[4, "psy_simple.plotters.AlternativeXCoord.use_raw_data", false]], "use_raw_data (psy_simple.plotters.alternativexcoordpost attribute)": [[4, "psy_simple.plotters.AlternativeXCoordPost.use_raw_data", false]], "validate_alpha() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_alpha", false]], "validate_axiscolor() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_axiscolor", false]], "validate_bool_maybe_none() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_bool_maybe_none", false]], "validate_cbarpos() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_cbarpos", false]], "validate_cmap() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_cmap", false]], "validate_cmaps() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_cmaps", false]], "validate_dataarray() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_dataarray", false]], "validate_err_calc() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_err_calc", false]], "validate_float() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_float", false]], "validate_fontweight() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_fontweight", false]], "validate_iter() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_iter", false]], "validate_legend() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_legend", false]], "validate_limits() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_limits", false]], "validate_lineplot() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_lineplot", false]], "validate_marker() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_marker", false]], "validate_none() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_none", false]], "validate_plot() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_plot", false]], "validate_str() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_str", false]], "validate_sym_lims() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_sym_lims", false]], "validate_text() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_text", false]], "validate_ticklabels() (in module psy_simple.plugin)": [[5, "psy_simple.plugin.validate_ticklabels", false]], "validatelist (class in psy_simple.plugin)": [[5, "psy_simple.plugin.ValidateList", false]], "value2pickle (psy_simple.plotters.axiscolor property)": [[4, "psy_simple.plotters.AxisColor.value2pickle", false]], "value2pickle (psy_simple.plotters.linecolors property)": [[4, "psy_simple.plotters.LineColors.value2pickle", false]], "value2share (psy_simple.plotters.bounds property)": [[4, "psy_simple.plotters.Bounds.value2share", false]], "value2share (psy_simple.plotters.cbar property)": [[4, "psy_simple.plotters.Cbar.value2share", false]], "value2share (psy_simple.plotters.limitbase property)": [[4, "psy_simple.plotters.LimitBase.value2share", false]], "value2share (psy_simple.plotters.linecolors property)": [[4, "psy_simple.plotters.LineColors.value2share", false]], "valuemaskbase (class in psy_simple.base)": [[2, "psy_simple.base.ValueMaskBase", false]], "vbounds (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vbounds", false]], "vcbar (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcbar", false]], "vcbarspacing (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcbarspacing", false]], "vclabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VCLabel", false]], "vclabel (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vclabel", false]], "vclabelprops (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vclabelprops", false]], "vclabelsize (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vclabelsize", false]], "vclabelweight (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vclabelweight", false]], "vcmap (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcmap", false]], "vcticklabels (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcticklabels", false]], "vctickprops (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vctickprops", false]], "vcticks (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcticks", false]], "vcticksize (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vcticksize", false]], "vctickweight (psy_simple.plotters.combinedbase attribute)": [[4, "psy_simple.plotters.CombinedBase.vctickweight", false]], "vector (psyplot.project.plot attribute)": [[17, "psyplot.project.plot.vector", false]], "vectorbounds (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorBounds", false]], "vectorcalculator (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorCalculator", false]], "vectorcbar (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorCbar", false]], "vectorcolor (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorColor", false]], "vectorcticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorCTicks", false]], "vectordatagrid (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorDataGrid", false]], "vectorlinewidth (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorLineWidth", false]], "vectorplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.VectorPlot", false]], "violinplot (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinPlot", false]], "violinplot (psyplot.project.plot attribute)": [[18, "psyplot.project.plot.violinplot", false]], "violinplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinPlotter", false]], "violinxlim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinXlim", false]], "violinxticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinXTickLabels", false]], "violinxticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinXTicks", false]], "violinylim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinYlim", false]], "violinyticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinYTickLabels", false]], "violinyticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.ViolinYTicks", false]], "vmax (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.vmax", false]], "vmin (psy_simple.plugin.boundstype attribute)": [[5, "psy_simple.plugin.BoundsType.vmin", false]], "vplot (psy_simple.plotters.combinedsimpleplotter attribute)": [[4, "psy_simple.plotters.CombinedSimplePlotter.vplot", false]], "week (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.week", false]], "which (psy_simple.plotters.cbaroptions attribute)": [[4, "psy_simple.plotters.CbarOptions.which", false]], "widths (psy_simple.plotters.barplot property)": [[4, "psy_simple.plotters.BarPlot.widths", false]], "widths (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.widths", false]], "widths (psy_simple.plotters.categoricalbars property)": [[4, "psy_simple.plotters.CategoricalBars.widths", false]], "xbounds (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.xbounds", false]], "xbounds (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.xbounds", false]], "xbounds (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.xbounds", false]], "xcoord (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.xcoord", false]], "xcoord (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.xcoord", false]], "xcoord (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.xcoord", false]], "xcoord (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.xcoord", false]], "xlabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Xlabel", false]], "xlabel (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.xlabel", false]], "xlabel (psy_simple.plotters.labeloptions property)": [[4, "psy_simple.plotters.LabelOptions.xlabel", false]], "xlabel (psy_simple.plotters.labelprops property)": [[4, "psy_simple.plotters.LabelProps.xlabel", false]], "xlabel (psy_simple.plotters.labelsize property)": [[4, "psy_simple.plotters.LabelSize.xlabel", false]], "xlabel (psy_simple.plotters.labelweight property)": [[4, "psy_simple.plotters.LabelWeight.xlabel", false]], "xlabel (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.xlabel", false]], "xlim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Xlim", false]], "xlim (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.xlim", false]], "xlim (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.xlim", false]], "xlim (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.xlim", false]], "xlim (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.xlim", false]], "xlim (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.xlim", false]], "xlim (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.xlim", false]], "xlim (psy_simple.plotters.symmetriclimits property)": [[4, "psy_simple.plotters.SymmetricLimits.xlim", false]], "xlim (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.xlim", false]], "xlim (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.xlim", false]], "xlim (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.xlim", false]], "xlim (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.xlim", false]], "xlim2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Xlim2D", false]], "xrange (psy_simple.plotters.dataprecision property)": [[4, "psy_simple.plotters.DataPrecision.xrange", false]], "xrange (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.xrange", false]], "xrange (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.xrange", false]], "xrotation (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XRotation", false]], "xrotation (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.xrotation", false]], "xticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XTickLabels", false]], "xticklabels (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.xticklabels", false]], "xticklabels (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.xticklabels", false]], "xticklabels (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.xticklabels", false]], "xtickprops (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XTickProps", false]], "xtickprops (psy_simple.plotters.ticksize property)": [[4, "psy_simple.plotters.TickSize.xtickprops", false]], "xtickprops (psy_simple.plotters.tickweight property)": [[4, "psy_simple.plotters.TickWeight.xtickprops", false]], "xtickprops (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.xtickprops", false]], "xticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XTicks", false]], "xticks (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.xticks", false]], "xticks (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.xticks", false]], "xticks (psy_simple.plotters.barxticklabels property)": [[4, "psy_simple.plotters.BarXTickLabels.xticks", false]], "xticks (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.xticks", false]], "xticks (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.xticks", false]], "xticks (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.xticks", false]], "xticks (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.xticks", false]], "xticks (psy_simple.plotters.violinxticklabels property)": [[4, "psy_simple.plotters.ViolinXTickLabels.xticks", false]], "xticks (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.xticks", false]], "xticks (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.xticks", false]], "xticks (psy_simple.plotters.xticklabels property)": [[4, "psy_simple.plotters.XTickLabels.xticks", false]], "xticks (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.xticks", false]], "xticks2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XTicks2D", false]], "xytickplotter (class in psy_simple.plotters)": [[4, "psy_simple.plotters.XYTickPlotter", false]], "ybounds (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.ybounds", false]], "ybounds (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.ybounds", false]], "ybounds (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.ybounds", false]], "ycoord (psy_simple.plotters.datagrid property)": [[4, "psy_simple.plotters.DataGrid.ycoord", false]], "ycoord (psy_simple.plotters.plot2d property)": [[4, "psy_simple.plotters.Plot2D.ycoord", false]], "ycoord (psy_simple.plotters.simpleplot2d property)": [[4, "psy_simple.plotters.SimplePlot2D.ycoord", false]], "ycoord (psy_simple.plotters.vectorplot property)": [[4, "psy_simple.plotters.VectorPlot.ycoord", false]], "year (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.year", false]], "yearbegin (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.yearbegin", false]], "yearend (psy_simple.plugin.ticksmethod attribute)": [[5, "psy_simple.plugin.TicksMethod.yearend", false]], "ylabel (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Ylabel", false]], "ylabel (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.ylabel", false]], "ylabel (psy_simple.plotters.barxlabel property)": [[4, "psy_simple.plotters.BarXlabel.ylabel", false]], "ylabel (psy_simple.plotters.labeloptions property)": [[4, "psy_simple.plotters.LabelOptions.ylabel", false]], "ylabel (psy_simple.plotters.labelprops property)": [[4, "psy_simple.plotters.LabelProps.ylabel", false]], "ylabel (psy_simple.plotters.labelsize property)": [[4, "psy_simple.plotters.LabelSize.ylabel", false]], "ylabel (psy_simple.plotters.labelweight property)": [[4, "psy_simple.plotters.LabelWeight.ylabel", false]], "ylabel (psy_simple.plotters.xlabel property)": [[4, "psy_simple.plotters.Xlabel.ylabel", false]], "ylabel (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.ylabel", false]], "ylim (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Ylim", false]], "ylim (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.ylim", false]], "ylim (psy_simple.plotters.barxlim property)": [[4, "psy_simple.plotters.BarXlim.ylim", false]], "ylim (psy_simple.plotters.baryticks property)": [[4, "psy_simple.plotters.BarYTicks.ylim", false]], "ylim (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.ylim", false]], "ylim (psy_simple.plotters.simpleplotterbase attribute)": [[4, "psy_simple.plotters.SimplePlotterBase.ylim", false]], "ylim (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.ylim", false]], "ylim (psy_simple.plotters.symmetriclimits property)": [[4, "psy_simple.plotters.SymmetricLimits.ylim", false]], "ylim (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.ylim", false]], "ylim (psy_simple.plotters.violinxlim property)": [[4, "psy_simple.plotters.ViolinXlim.ylim", false]], "ylim (psy_simple.plotters.xlim property)": [[4, "psy_simple.plotters.Xlim.ylim", false]], "ylim (psy_simple.plotters.xlim2d property)": [[4, "psy_simple.plotters.Xlim2D.ylim", false]], "ylim2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.Ylim2D", false]], "yrange (psy_simple.plotters.dataprecision property)": [[4, "psy_simple.plotters.DataPrecision.yrange", false]], "yrange (psy_simple.plotters.densityplotter attribute)": [[4, "psy_simple.plotters.DensityPlotter.yrange", false]], "yrange (psy_simple.plotters.pointdensity property)": [[4, "psy_simple.plotters.PointDensity.yrange", false]], "yrotation (class in psy_simple.plotters)": [[4, "psy_simple.plotters.YRotation", false]], "yrotation (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.yrotation", false]], "yticklabels (class in psy_simple.plotters)": [[4, "psy_simple.plotters.YTickLabels", false]], "yticklabels (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.yticklabels", false]], "yticklabels (psy_simple.plotters.barxticklabels property)": [[4, "psy_simple.plotters.BarXTickLabels.yticklabels", false]], "yticklabels (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.yticklabels", false]], "yticklabels (psy_simple.plotters.violinxticklabels property)": [[4, "psy_simple.plotters.ViolinXTickLabels.yticklabels", false]], "yticklabels (psy_simple.plotters.xrotation property)": [[4, "psy_simple.plotters.XRotation.yticklabels", false]], "yticklabels (psy_simple.plotters.xticklabels property)": [[4, "psy_simple.plotters.XTickLabels.yticklabels", false]], "yticklabels (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.yticklabels", false]], "yticklabels (psy_simple.plotters.yrotation property)": [[4, "psy_simple.plotters.YRotation.yticklabels", false]], "ytickprops (class in psy_simple.plotters)": [[4, "psy_simple.plotters.YTickProps", false]], "ytickprops (psy_simple.plotters.ticksize property)": [[4, "psy_simple.plotters.TickSize.ytickprops", false]], "ytickprops (psy_simple.plotters.tickweight property)": [[4, "psy_simple.plotters.TickWeight.ytickprops", false]], "ytickprops (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.ytickprops", false]], "yticks (class in psy_simple.plotters)": [[4, "psy_simple.plotters.YTicks", false]], "yticks (psy_simple.plotters.barplotter attribute)": [[4, "psy_simple.plotters.BarPlotter.yticks", false]], "yticks (psy_simple.plotters.barxticks property)": [[4, "psy_simple.plotters.BarXTicks.yticks", false]], "yticks (psy_simple.plotters.barylim property)": [[4, "psy_simple.plotters.BarYlim.yticks", false]], "yticks (psy_simple.plotters.baryticklabels property)": [[4, "psy_simple.plotters.BarYTickLabels.yticks", false]], "yticks (psy_simple.plotters.simple2dplotter attribute)": [[4, "psy_simple.plotters.Simple2DPlotter.yticks", false]], "yticks (psy_simple.plotters.simplevectorplotter attribute)": [[4, "psy_simple.plotters.SimpleVectorPlotter.yticks", false]], "yticks (psy_simple.plotters.violinplotter attribute)": [[4, "psy_simple.plotters.ViolinPlotter.yticks", false]], "yticks (psy_simple.plotters.violinxticks property)": [[4, "psy_simple.plotters.ViolinXTicks.yticks", false]], "yticks (psy_simple.plotters.violinylim property)": [[4, "psy_simple.plotters.ViolinYlim.yticks", false]], "yticks (psy_simple.plotters.violinyticklabels property)": [[4, "psy_simple.plotters.ViolinYTickLabels.yticks", false]], "yticks (psy_simple.plotters.xticks property)": [[4, "psy_simple.plotters.XTicks.yticks", false]], "yticks (psy_simple.plotters.xticks2d property)": [[4, "psy_simple.plotters.XTicks2D.yticks", false]], "yticks (psy_simple.plotters.xytickplotter attribute)": [[4, "psy_simple.plotters.XYTickPlotter.yticks", false]], "yticks (psy_simple.plotters.ylim property)": [[4, "psy_simple.plotters.Ylim.yticks", false]], "yticks (psy_simple.plotters.ylim2d property)": [[4, "psy_simple.plotters.Ylim2D.yticks", false]], "yticks (psy_simple.plotters.yticklabels property)": [[4, "psy_simple.plotters.YTickLabels.yticks", false]], "yticks2d (class in psy_simple.plotters)": [[4, "psy_simple.plotters.YTicks2D", false]]}, "objects": {"": [[1, 0, 0, "-", "psy_simple"]], "psy_simple": [[2, 0, 0, "-", "base"], [3, 0, 0, "-", "colors"], [4, 0, 0, "-", "plotters"], [5, 0, 0, "-", "plugin"], [6, 0, 0, "-", "widgets"]], "psy_simple.base": [[2, 1, 1, "", "BackgroundColor"], [2, 1, 1, "", "BasePlotter"], [2, 1, 1, "", "Figtitle"], [2, 1, 1, "", "Mask"], [2, 1, 1, "", "MaskBetween"], [2, 1, 1, "", "MaskGeq"], [2, 1, 1, "", "MaskGreater"], [2, 1, 1, "", "MaskLeq"], [2, 1, 1, "", "MaskLess"], [2, 1, 1, "", "Text"], [2, 1, 1, "", "TextBase"], [2, 1, 1, "", "Tight"], [2, 1, 1, "", "Title"], [2, 1, 1, "", "TitlesPlotter"], [2, 1, 1, "", "ValueMaskBase"], [2, 5, 1, "", "label_props"], [2, 5, 1, "", "label_size"], [2, 5, 1, "", "label_weight"]], "psy_simple.base.BackgroundColor": [[2, 2, 1, "", "get_fmt_widget"], [2, 3, 1, "", "group"], [2, 3, 1, "", "name"], [2, 2, 1, "", "update"]], "psy_simple.base.BasePlotter": [[2, 3, 1, "", "background"], [2, 3, 1, "", "mask"], [2, 3, 1, "", "maskbetween"], [2, 3, 1, "", "maskgeq"], [2, 3, 1, "", "maskgreater"], [2, 3, 1, "", "maskleq"], [2, 3, 1, "", "maskless"], [2, 3, 1, "", "tight"]], "psy_simple.base.Figtitle": [[2, 2, 1, "", "clear_other_texts"], [2, 4, 1, "", "enhanced_attrs"], [2, 2, 1, "", "initialize_plot"], [2, 3, 1, "", "name"], [2, 2, 1, "", "update"]], "psy_simple.base.Mask": [[2, 2, 1, "", "diff"], [2, 3, 1, "", "group"], [2, 2, 1, "", "load_mask"], [2, 3, 1, "", "name"], [2, 3, 1, "", "priority"], [2, 2, 1, "", "update"]], "psy_simple.base.MaskBetween": [[2, 2, 1, "", "mask_func"], [2, 3, 1, "", "name"]], "psy_simple.base.MaskGeq": [[2, 2, 1, "", "mask_func"], [2, 3, 1, "", "name"]], "psy_simple.base.MaskGreater": [[2, 2, 1, "", "mask_func"], [2, 3, 1, "", "name"]], "psy_simple.base.MaskLeq": [[2, 2, 1, "", "mask_func"], [2, 3, 1, "", "name"]], "psy_simple.base.MaskLess": [[2, 2, 1, "", "mask_func"], [2, 3, 1, "", "name"]], "psy_simple.base.Text": [[2, 2, 1, "", "diff"], [2, 2, 1, "", "finish_update"], [2, 3, 1, "", "name"], [2, 2, 1, "", "remove"], [2, 2, 1, "", "set_value"], [2, 2, 1, "", "share"], [2, 4, 1, "", "transform"], [2, 2, 1, "", "update"]], "psy_simple.base.TextBase": [[2, 3, 1, "", "data_dependent"], [2, 3, 1, "", "delimiter"], [2, 4, 1, "", "enhanced_attrs"], [2, 2, 1, "", "get_enhanced_attrs"], [2, 2, 1, "", "get_fig_data_attrs"], [2, 2, 1, "", "get_fmt_widget"], [2, 3, 1, "", "group"], [2, 4, 1, "", "rc"], [2, 2, 1, "", "replace"]], "psy_simple.base.Tight": [[2, 3, 1, "", "group"], [2, 3, 1, "", "name"], [2, 2, 1, "", "update"]], "psy_simple.base.Title": [[2, 2, 1, "", "initialize_plot"], [2, 3, 1, "", "name"], [2, 2, 1, "", "update"]], "psy_simple.base.TitlesPlotter": [[2, 3, 1, "", "figtitle"], [2, 3, 1, "", "figtitleprops"], [2, 3, 1, "", "figtitlesize"], [2, 3, 1, "", "figtitleweight"], [2, 3, 1, "", "text"], [2, 3, 1, "", "title"], [2, 3, 1, "", "titleprops"], [2, 3, 1, "", "titlesize"], [2, 3, 1, "", "titleweight"]], "psy_simple.base.ValueMaskBase": [[2, 3, 1, "", "data_dependent"], [2, 3, 1, "", "group"], [2, 2, 1, "", "mask_func"], [2, 3, 1, "", "priority"], [2, 2, 1, "", "update"]], "psy_simple.colors": [[3, 1, 1, "", "FixedBoundaryNorm"], [3, 1, 1, "", "FixedColorMap"], [3, 5, 1, "", "get_cmap"], [3, 5, 1, "", "show_colormaps"]], "psy_simple.colors.FixedColorMap": [[3, 2, 1, "", "from_list"]], "psy_simple.plotters": [[4, 1, 1, "", "AlternativeXCoord"], [4, 1, 1, "", "AlternativeXCoordPost"], [4, 1, 1, "", "ArrowSize"], [4, 1, 1, "", "ArrowStyle"], [4, 1, 1, "", "AxisColor"], [4, 1, 1, "", "BarAlpha"], [4, 1, 1, "", "BarPlot"], [4, 1, 1, "", "BarPlotter"], [4, 1, 1, "", "BarWidths"], [4, 1, 1, "", "BarXTickLabels"], [4, 1, 1, "", "BarXTicks"], [4, 1, 1, "", "BarXlabel"], [4, 1, 1, "", "BarXlim"], [4, 1, 1, "", "BarYTickLabels"], [4, 1, 1, "", "BarYTicks"], [4, 1, 1, "", "BarYlabel"], [4, 1, 1, "", "BarYlim"], [4, 1, 1, "", "Base2D"], [4, 1, 1, "", "BaseVectorPlotter"], [4, 1, 1, "", "Bounds"], [4, 1, 1, "", "CLabel"], [4, 1, 1, "", "CMap"], [4, 1, 1, "", "CTickLabels"], [4, 1, 1, "", "CTickProps"], [4, 1, 1, "", "CTickSize"], [4, 1, 1, "", "CTickWeight"], [4, 1, 1, "", "CTicks"], [4, 1, 1, "", "CategoricalBars"], [4, 1, 1, "", "Cbar"], [4, 1, 1, "", "CbarOptions"], [4, 1, 1, "", "CbarSpacing"], [4, 1, 1, "", "CombinedBase"], [4, 1, 1, "", "CombinedSimplePlotter"], [4, 1, 1, "", "CombinedVectorPlot"], [4, 1, 1, "", "ContourLevels"], [4, 1, 1, "", "DataGrid"], [4, 1, 1, "", "DataPrecision"], [4, 1, 1, "", "DataTicksCalculator"], [4, 1, 1, "", "Density"], [4, 1, 1, "", "DensityPlotter"], [4, 1, 1, "", "DtTicksBase"], [4, 1, 1, "", "ErrorAlpha"], [4, 1, 1, "", "ErrorCalculator"], [4, 1, 1, "", "ErrorPlot"], [4, 1, 1, "", "Extend"], [4, 1, 1, "", "FldmeanPlotter"], [4, 1, 1, "", "Grid"], [4, 1, 1, "", "Hist2DXRange"], [4, 1, 1, "", "Hist2DYRange"], [4, 1, 1, "", "HistBins"], [4, 1, 1, "", "InterpolateBounds"], [4, 1, 1, "", "LabelOptions"], [4, 1, 1, "", "LabelProps"], [4, 1, 1, "", "LabelSize"], [4, 1, 1, "", "LabelWeight"], [4, 1, 1, "", "Legend"], [4, 1, 1, "", "LegendLabels"], [4, 1, 1, "", "LimitBase"], [4, 1, 1, "", "LineColors"], [4, 1, 1, "", "LinePlot"], [4, 1, 1, "", "LinePlotter"], [4, 1, 1, "", "LineWidth"], [4, 1, 1, "", "Marker"], [4, 1, 1, "", "MarkerSize"], [4, 1, 1, "", "MaskDataGrid"], [4, 1, 1, "", "MeanCalculator"], [4, 1, 1, "", "MissColor"], [4, 1, 1, "", "NormedHist2D"], [4, 1, 1, "", "Plot2D"], [4, 1, 1, "", "PointDensity"], [4, 1, 1, "", "ScalarCombinedBase"], [4, 1, 1, "", "Simple2DBase"], [4, 1, 1, "", "Simple2DPlotter"], [4, 1, 1, "", "SimplePlot2D"], [4, 1, 1, "", "SimplePlotterBase"], [4, 1, 1, "", "SimpleVectorPlot"], [4, 1, 1, "", "SimpleVectorPlotter"], [4, 1, 1, "", "SymmetricLimits"], [4, 1, 1, "", "TickLabels"], [4, 1, 1, "", "TickLabelsBase"], [4, 1, 1, "", "TickPropsBase"], [4, 1, 1, "", "TickSize"], [4, 1, 1, "", "TickSizeBase"], [4, 1, 1, "", "TickWeight"], [4, 1, 1, "", "TickWeightBase"], [4, 1, 1, "", "TicksBase"], [4, 1, 1, "", "TicksManager"], [4, 1, 1, "", "TicksManagerBase"], [4, 1, 1, "", "TicksOptions"], [4, 1, 1, "", "Transpose"], [4, 1, 1, "", "VCLabel"], [4, 1, 1, "", "VectorBounds"], [4, 1, 1, "", "VectorCTicks"], [4, 1, 1, "", "VectorCalculator"], [4, 1, 1, "", "VectorCbar"], [4, 1, 1, "", "VectorColor"], [4, 1, 1, "", "VectorDataGrid"], [4, 1, 1, "", "VectorLineWidth"], [4, 1, 1, "", "VectorPlot"], [4, 1, 1, "", "ViolinPlot"], [4, 1, 1, "", "ViolinPlotter"], [4, 1, 1, "", "ViolinXTickLabels"], [4, 1, 1, "", "ViolinXTicks"], [4, 1, 1, "", "ViolinXlim"], [4, 1, 1, "", "ViolinYTickLabels"], [4, 1, 1, "", "ViolinYTicks"], [4, 1, 1, "", "ViolinYlim"], [4, 1, 1, "", "XRotation"], [4, 1, 1, "", "XTickLabels"], [4, 1, 1, "", "XTickProps"], [4, 1, 1, "", "XTicks"], [4, 1, 1, "", "XTicks2D"], [4, 1, 1, "", "XYTickPlotter"], [4, 1, 1, "", "Xlabel"], [4, 1, 1, "", "Xlim"], [4, 1, 1, "", "Xlim2D"], [4, 1, 1, "", "YRotation"], [4, 1, 1, "", "YTickLabels"], [4, 1, 1, "", "YTickProps"], [4, 1, 1, "", "YTicks"], [4, 1, 1, "", "YTicks2D"], [4, 1, 1, "", "Ylabel"], [4, 1, 1, "", "Ylim"], [4, 1, 1, "", "Ylim2D"], [4, 5, 1, "", "convert_radian"], [4, 5, 1, "", "format_coord_func"], [4, 5, 1, "", "round_to_05"]], "psy_simple.plotters.AlternativeXCoord": [[4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "data_iterator"], [4, 2, 1, "", "diff"], [4, 2, 1, "", "get_alternative_coord"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "replace_coord"], [4, 2, 1, "", "update"], [4, 3, 1, "", "use_raw_data"]], "psy_simple.plotters.AlternativeXCoordPost": [[4, 3, 1, "", "use_raw_data"]], "psy_simple.plotters.ArrowSize": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ArrowStyle": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.AxisColor": [[4, 3, 1, "", "group"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"], [4, 4, 1, "", "value2pickle"]], "psy_simple.plotters.BarAlpha": [[4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.BarPlot": [[4, 4, 1, "", "alpha"], [4, 4, 1, "", "categorical"], [4, 3, 1, "", "children"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "get_xys"], [4, 3, 1, "", "group"], [4, 2, 1, "", "make_plot"], [4, 3, 1, "", "name"], [4, 3, 1, "", "plot_fmt"], [4, 4, 1, "", "plotted_data"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "widths"]], "psy_simple.plotters.BarPlotter": [[4, 3, 1, "", "alpha"], [4, 3, 1, "", "categorical"], [4, 3, 1, "", "coord"], [4, 3, 1, "", "plot"], [4, 3, 1, "", "widths"], [4, 3, 1, "", "xlabel"], [4, 3, 1, "", "xlim"], [4, 3, 1, "", "xticklabels"], [4, 3, 1, "", "xticks"], [4, 3, 1, "", "ylabel"], [4, 3, 1, "", "ylim"], [4, 3, 1, "", "yticklabels"], [4, 3, 1, "", "yticks"]], "psy_simple.plotters.BarWidths": [[4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.BarXTickLabels": [[4, 4, 1, "", "categorical"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_stringformatter"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "yticklabels"]], "psy_simple.plotters.BarXTicks": [[4, 4, 1, "", "array"], [4, 4, 1, "", "categorical"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_default_locators"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.BarXlabel": [[4, 4, 1, "", "transpose"], [4, 3, 1, "", "update_after_plot"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.BarXlim": [[4, 4, 1, "", "array"], [4, 4, 1, "", "categorical"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.BarYTickLabels": [[4, 4, 1, "", "categorical"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_stringformatter"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.BarYTicks": [[4, 4, 1, "", "array"], [4, 4, 1, "", "categorical"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_default_locators"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.BarYlabel": [[4, 4, 1, "", "transpose"], [4, 3, 1, "", "update_after_plot"]], "psy_simple.plotters.BarYlim": [[4, 4, 1, "", "array"], [4, 4, 1, "", "categorical"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.Base2D": [[4, 3, 1, "", "bounds"], [4, 3, 1, "", "cbar"], [4, 3, 1, "", "cbarspacing"], [4, 3, 1, "", "clabel"], [4, 3, 1, "", "clabelprops"], [4, 3, 1, "", "clabelsize"], [4, 3, 1, "", "clabelweight"], [4, 3, 1, "", "cmap"], [4, 3, 1, "", "cticklabels"], [4, 3, 1, "", "ctickprops"], [4, 3, 1, "", "cticks"], [4, 3, 1, "", "cticksize"], [4, 3, 1, "", "ctickweight"], [4, 3, 1, "", "datagrid"], [4, 3, 1, "", "extend"], [4, 3, 1, "", "mask_datagrid"], [4, 3, 1, "", "plot"]], "psy_simple.plotters.BaseVectorPlotter": [[4, 3, 1, "", "allowed_dims"], [4, 3, 1, "", "arrowsize"], [4, 3, 1, "", "arrowstyle"], [4, 3, 1, "", "bounds"], [4, 3, 1, "", "cbar"], [4, 2, 1, "", "check_data"], [4, 3, 1, "", "color"], [4, 3, 1, "", "cticks"], [4, 3, 1, "", "datagrid"], [4, 3, 1, "", "density"], [4, 3, 1, "", "linewidth"]], "psy_simple.plotters.Bounds": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "connections"], [4, 2, 1, "", "get_fmt_widget"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"], [4, 4, 1, "", "value2share"]], "psy_simple.plotters.CLabel": [[4, 3, 1, "", "axis_locations"], [4, 4, 1, "", "cbar"], [4, 3, 1, "", "children"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "update"]], "psy_simple.plotters.CMap": [[4, 4, 1, "", "bounds"], [4, 4, 1, "", "cbar"], [4, 3, 1, "", "connections"], [4, 2, 1, "", "get_cmap"], [4, 2, 1, "", "get_fmt_widget"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.CTickLabels": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "default_formatters"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_default_formatters"], [4, 2, 1, "", "set_formatter"]], "psy_simple.plotters.CTickProps": [[4, 4, 1, "", "cbar"], [4, 3, 1, "", "children"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "update_axis"]], "psy_simple.plotters.CTickSize": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "ctickprops"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"]], "psy_simple.plotters.CTickWeight": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "ctickprops"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"]], "psy_simple.plotters.CTicks": [[4, 4, 1, "", "bounds"], [4, 4, 1, "", "cbar"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "connections"], [4, 4, 1, "", "default_locator"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "get_fmt_widget"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_default_locators"], [4, 2, 1, "", "set_ticks"], [4, 2, 1, "", "update"], [4, 2, 1, "", "update_axis"]], "psy_simple.plotters.CategoricalBars": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"], [4, 4, 1, "", "widths"]], "psy_simple.plotters.Cbar": [[4, 4, 1, "", "bounds"], [4, 4, 1, "", "cbarspacing"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "draw_colorbar"], [4, 4, 1, "", "extend"], [4, 3, 1, "", "figure_positions"], [4, 2, 1, "", "finish_update"], [4, 3, 1, "", "group"], [4, 4, 1, "", "init_kwargs"], [4, 2, 1, "", "initialize_plot"], [4, 4, 1, "", "levels"], [4, 3, 1, "", "name"], [4, 3, 1, "", "original_position"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 2, 1, "", "set_label_pos"], [4, 2, 1, "", "update"], [4, 2, 1, "", "update_colorbar"], [4, 4, 1, "", "value2share"]], "psy_simple.plotters.CbarOptions": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "axis_locations"], [4, 4, 1, "", "axisname"], [4, 4, 1, "", "cbar"], [4, 3, 1, "", "children"], [4, 4, 1, "", "colorbar"], [4, 4, 1, "", "data"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "update"], [4, 3, 1, "", "which"]], "psy_simple.plotters.CbarSpacing": [[4, 4, 1, "", "cbar"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"]], "psy_simple.plotters.CombinedBase": [[4, 3, 1, "", "arrowsize"], [4, 3, 1, "", "arrowstyle"], [4, 2, 1, "", "check_data"], [4, 3, 1, "", "color"], [4, 3, 1, "", "linewidth"], [4, 3, 1, "", "vbounds"], [4, 3, 1, "", "vcbar"], [4, 3, 1, "", "vcbarspacing"], [4, 3, 1, "", "vclabel"], [4, 3, 1, "", "vclabelprops"], [4, 3, 1, "", "vclabelsize"], [4, 3, 1, "", "vclabelweight"], [4, 3, 1, "", "vcmap"], [4, 3, 1, "", "vcticklabels"], [4, 3, 1, "", "vctickprops"], [4, 3, 1, "", "vcticks"], [4, 3, 1, "", "vcticksize"], [4, 3, 1, "", "vctickweight"]], "psy_simple.plotters.CombinedSimplePlotter": [[4, 3, 1, "", "density"], [4, 3, 1, "", "plot"], [4, 3, 1, "", "vplot"]], "psy_simple.plotters.CombinedVectorPlot": [[4, 4, 1, "", "arrowsize"], [4, 4, 1, "", "arrowstyle"], [4, 4, 1, "", "bounds"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "density"], [4, 4, 1, "", "linewidth"], [4, 4, 1, "", "transform"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ContourLevels": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "cbounds"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.DataGrid": [[4, 4, 1, "", "cell_nodes_x"], [4, 4, 1, "", "cell_nodes_y"], [4, 3, 1, "", "children"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "mask_datagrid"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transform"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xbounds"], [4, 4, 1, "", "xcoord"], [4, 4, 1, "", "ybounds"], [4, 4, 1, "", "ycoord"]], "psy_simple.plotters.DataPrecision": [[4, 3, 1, "", "connections"], [4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "density"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "estimate_bw"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xrange"], [4, 4, 1, "", "yrange"]], "psy_simple.plotters.DataTicksCalculator": [[4, 4, 1, "", "array"], [4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "full_array"]], "psy_simple.plotters.Density": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 2, 1, "", "update"]], "psy_simple.plotters.DensityPlotter": [[4, 3, 1, "", "allowed_dims"], [4, 3, 1, "", "allowed_vars"], [4, 3, 1, "", "bins"], [4, 3, 1, "", "coord"], [4, 3, 1, "", "density"], [4, 3, 1, "", "normed"], [4, 3, 1, "", "precision"], [4, 3, 1, "", "xrange"], [4, 3, 1, "", "yrange"]], "psy_simple.plotters.DtTicksBase": [[4, 4, 1, "", "dtdata"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ErrorAlpha": [[4, 3, 1, "", "connections"], [4, 4, 1, "", "error"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ErrorCalculator": [[4, 3, 1, "", "children"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 4, 1, "", "mean"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 3, 1, "", "requires_replot"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ErrorPlot": [[4, 3, 1, "", "children"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 2, 1, "", "make_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "plot_fill"], [4, 3, 1, "", "plot_fmt"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.Extend": [[4, 3, 1, "", "connections"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "update"]], "psy_simple.plotters.FldmeanPlotter": [[4, 3, 1, "", "allowed_dims"], [4, 3, 1, "", "coord"], [4, 3, 1, "", "err_calc"], [4, 3, 1, "", "mask"], [4, 3, 1, "", "maskbetween"], [4, 3, 1, "", "maskgeq"], [4, 3, 1, "", "maskgreater"], [4, 3, 1, "", "maskleq"], [4, 3, 1, "", "maskless"], [4, 3, 1, "", "mean"]], "psy_simple.plotters.Grid": [[4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"]], "psy_simple.plotters.Hist2DXRange": [[4, 4, 1, "", "array"], [4, 4, 1, "", "coord"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "set_limit"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.Hist2DYRange": [[4, 4, 1, "", "array"], [4, 4, 1, "", "coord"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.HistBins": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "precision"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.InterpolateBounds": [[4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.LabelOptions": [[4, 3, 1, "", "children"], [4, 2, 1, "", "update"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "xlabel"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.LabelProps": [[4, 3, 1, "", "children"], [4, 3, 1, "", "group"], [4, 4, 1, "", "labelsize"], [4, 4, 1, "", "labelweight"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "xlabel"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.LabelSize": [[4, 3, 1, "", "group"], [4, 4, 1, "", "labelprops"], [4, 3, 1, "", "name"], [4, 3, 1, "", "parents"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "xlabel"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.LabelWeight": [[4, 3, 1, "", "group"], [4, 4, 1, "", "labelprops"], [4, 3, 1, "", "name"], [4, 3, 1, "", "parents"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "xlabel"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.Legend": [[4, 4, 1, "", "color"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "get_artists_and_labels"], [4, 4, 1, "", "legendlabels"], [4, 4, 1, "", "marker"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "remove"], [4, 2, 1, "", "update"]], "psy_simple.plotters.LegendLabels": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"]], "psy_simple.plotters.LimitBase": [[4, 3, 1, "", "children"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "group"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_limit"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "value2share"]], "psy_simple.plotters.LineColors": [[4, 4, 1, "", "extended_colors"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"], [4, 4, 1, "", "value2pickle"], [4, 4, 1, "", "value2share"]], "psy_simple.plotters.LinePlot": [[4, 3, 1, "", "children"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 2, 1, "", "make_plot"], [4, 4, 1, "", "marker"], [4, 3, 1, "", "name"], [4, 2, 1, "", "plot_arr"], [4, 3, 1, "", "plot_fmt"], [4, 4, 1, "", "plotted_data"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.LinePlotter": [[4, 3, 1, "", "allowed_vars"], [4, 3, 1, "", "coord"], [4, 3, 1, "", "error"], [4, 3, 1, "", "erroralpha"], [4, 3, 1, "", "linewidth"], [4, 3, 1, "", "marker"], [4, 3, 1, "", "markersize"], [4, 3, 1, "", "plot"]], "psy_simple.plotters.LineWidth": [[4, 3, 1, "", "connections"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.Marker": [[4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.MarkerSize": [[4, 3, 1, "", "connections"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.MaskDataGrid": [[4, 2, 1, "", "update"]], "psy_simple.plotters.MeanCalculator": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 3, 1, "", "requires_replot"], [4, 2, 1, "", "update"]], "psy_simple.plotters.MissColor": [[4, 3, 1, "", "connections"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transform"], [4, 2, 1, "", "update"], [4, 3, 1, "", "update_after_plot"]], "psy_simple.plotters.NormedHist2D": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 2, 1, "", "hist2d"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.Plot2D": [[4, 2, 1, "", "add2format_coord"], [4, 4, 1, "", "array"], [4, 4, 1, "", "bounds"], [4, 4, 1, "", "cell_nodes_x"], [4, 4, 1, "", "cell_nodes_y"], [4, 3, 1, "", "children"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "format_coord"], [4, 2, 1, "", "get_xyz_1d"], [4, 2, 1, "", "get_xyz_2d"], [4, 2, 1, "", "get_xyz_tri"], [4, 3, 1, "", "group"], [4, 4, 1, "", "interp_bounds"], [4, 4, 1, "", "levels"], [4, 2, 1, "", "make_plot"], [4, 4, 1, "", "mappable"], [4, 3, 1, "", "name"], [4, 4, 1, "", "notnull_array"], [4, 3, 1, "", "plot_fmt"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xbounds"], [4, 4, 1, "", "xcoord"], [4, 4, 1, "", "ybounds"], [4, 4, 1, "", "ycoord"]], "psy_simple.plotters.PointDensity": [[4, 4, 1, "", "bins"], [4, 4, 1, "", "coord"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "normed"], [4, 4, 1, "", "precision"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xrange"], [4, 4, 1, "", "yrange"]], "psy_simple.plotters.ScalarCombinedBase": [[4, 3, 1, "", "bounds"], [4, 3, 1, "", "cbar"], [4, 3, 1, "", "cticks"], [4, 3, 1, "", "maskbetween"], [4, 3, 1, "", "maskgeq"], [4, 3, 1, "", "maskgreater"], [4, 3, 1, "", "maskleq"], [4, 3, 1, "", "maskless"]], "psy_simple.plotters.Simple2DBase": [[4, 3, 1, "", "allowed_dims"], [4, 2, 1, "", "check_data"], [4, 3, 1, "", "miss_color"]], "psy_simple.plotters.Simple2DPlotter": [[4, 3, 1, "", "color"], [4, 3, 1, "", "interp_bounds"], [4, 3, 1, "", "legend"], [4, 3, 1, "", "legendlabels"], [4, 3, 1, "", "levels"], [4, 3, 1, "", "plot"], [4, 3, 1, "", "transpose"], [4, 3, 1, "", "xlim"], [4, 3, 1, "", "xticks"], [4, 3, 1, "", "ylim"], [4, 3, 1, "", "yticks"]], "psy_simple.plotters.SimplePlot2D": [[4, 4, 1, "", "array"], [4, 4, 1, "", "bounds"], [4, 4, 1, "", "cell_nodes_x"], [4, 4, 1, "", "cell_nodes_y"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "interp_bounds"], [4, 4, 1, "", "levels"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xbounds"], [4, 4, 1, "", "xcoord"], [4, 4, 1, "", "ybounds"], [4, 4, 1, "", "ycoord"]], "psy_simple.plotters.SimplePlotterBase": [[4, 3, 1, "", "allowed_dims"], [4, 3, 1, "", "allowed_vars"], [4, 3, 1, "", "axiscolor"], [4, 2, 1, "", "check_data"], [4, 3, 1, "", "color"], [4, 3, 1, "", "grid"], [4, 3, 1, "", "legend"], [4, 3, 1, "", "legendlabels"], [4, 3, 1, "", "sym_lims"], [4, 3, 1, "", "transpose"], [4, 3, 1, "", "xlim"], [4, 3, 1, "", "ylim"]], "psy_simple.plotters.SimpleVectorPlot": [[4, 4, 1, "", "arrowsize"], [4, 4, 1, "", "arrowstyle"], [4, 4, 1, "", "bounds"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "density"], [4, 4, 1, "", "linewidth"], [4, 2, 1, "", "set_value"], [4, 4, 1, "", "transform"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.SimpleVectorPlotter": [[4, 3, 1, "", "legend"], [4, 3, 1, "", "legendlabels"], [4, 3, 1, "", "plot"], [4, 3, 1, "", "xlim"], [4, 3, 1, "", "xticks"], [4, 3, 1, "", "ylim"], [4, 3, 1, "", "yticks"]], "psy_simple.plotters.SymmetricLimits": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.TickLabels": [[4, 2, 1, "", "set_default_formatters"], [4, 2, 1, "", "set_formatter"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.TickLabelsBase": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 2, 1, "", "initialize_plot"], [4, 2, 1, "", "set_default_formatters"], [4, 2, 1, "", "set_formatter"], [4, 2, 1, "", "set_stringformatter"], [4, 2, 1, "", "set_ticklabels"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TickPropsBase": [[4, 4, 1, "", "axisname"], [4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TickSize": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 4, 1, "", "xtickprops"], [4, 4, 1, "", "ytickprops"]], "psy_simple.plotters.TickSizeBase": [[4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TickWeight": [[4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 4, 1, "", "xtickprops"], [4, 4, 1, "", "ytickprops"]], "psy_simple.plotters.TickWeightBase": [[4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TicksBase": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "get_locator"], [4, 3, 1, "", "group"], [4, 2, 1, "", "initialize_plot"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_default_locators"], [4, 2, 1, "", "set_locator"], [4, 2, 1, "", "set_ticks"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TicksManager": [[4, 3, 1, "", "group"], [4, 2, 1, "", "update"]], "psy_simple.plotters.TicksManagerBase": [[4, 2, 1, "", "update_axis"]], "psy_simple.plotters.TicksOptions": [[4, 2, 1, "", "update"]], "psy_simple.plotters.Transpose": [[4, 2, 1, "", "get_x"], [4, 2, 1, "", "get_y"], [4, 3, 1, "", "group"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.VCLabel": [[4, 4, 1, "", "cbar"], [4, 4, 1, "", "plot"]], "psy_simple.plotters.VectorBounds": [[4, 4, 1, "", "array"], [4, 4, 1, "", "cbar"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "parents"], [4, 2, 1, "", "update"]], "psy_simple.plotters.VectorCTicks": [[4, 4, 1, "", "array"], [4, 4, 1, "", "bounds"], [4, 4, 1, "", "cbar"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"]], "psy_simple.plotters.VectorCalculator": [[4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.VectorCbar": [[4, 4, 1, "", "bounds"], [4, 4, 1, "", "cbarspacing"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "dependencies"], [4, 4, 1, "", "extend"], [4, 4, 1, "", "levels"], [4, 4, 1, "", "plot"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "update"]], "psy_simple.plotters.VectorColor": [[4, 4, 1, "", "bounds"], [4, 4, 1, "", "cmap"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.VectorDataGrid": [[4, 4, 1, "", "data"], [4, 4, 1, "", "mask_datagrid"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transform"]], "psy_simple.plotters.VectorLineWidth": [[4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.VectorPlot": [[4, 2, 1, "", "add2format_coord"], [4, 4, 1, "", "array"], [4, 4, 1, "", "arrowsize"], [4, 4, 1, "", "arrowstyle"], [4, 4, 1, "", "bounds"], [4, 3, 1, "", "children"], [4, 4, 1, "", "cmap"], [4, 4, 1, "", "color"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "density"], [4, 4, 1, "", "format_coord"], [4, 2, 1, "", "get_xyz_1d"], [4, 2, 1, "", "get_xyz_2d"], [4, 2, 1, "", "get_xyz_tri"], [4, 3, 1, "", "group"], [4, 4, 1, "", "linewidth"], [4, 2, 1, "", "make_plot"], [4, 4, 1, "", "mappable"], [4, 3, 1, "", "name"], [4, 3, 1, "", "plot_fmt"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transform"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "xcoord"], [4, 4, 1, "", "ycoord"]], "psy_simple.plotters.ViolinPlot": [[4, 3, 1, "", "children"], [4, 4, 1, "", "color"], [4, 3, 1, "", "data_dependent"], [4, 3, 1, "", "group"], [4, 2, 1, "", "make_plot"], [4, 3, 1, "", "name"], [4, 3, 1, "", "plot_fmt"], [4, 3, 1, "", "priority"], [4, 2, 1, "", "remove"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.ViolinPlotter": [[4, 3, 1, "", "plot"], [4, 3, 1, "", "xlim"], [4, 3, 1, "", "xticklabels"], [4, 3, 1, "", "xticks"], [4, 3, 1, "", "ylim"], [4, 3, 1, "", "yticklabels"], [4, 3, 1, "", "yticks"]], "psy_simple.plotters.ViolinXTickLabels": [[4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "yticklabels"]], "psy_simple.plotters.ViolinXTicks": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.ViolinXlim": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.ViolinYTickLabels": [[4, 3, 1, "", "data_dependent"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update_axis"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.ViolinYTicks": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.ViolinYlim": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.XRotation": [[4, 3, 1, "", "children"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"], [4, 4, 1, "", "yticklabels"]], "psy_simple.plotters.XTickLabels": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "yticklabels"]], "psy_simple.plotters.XTickProps": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "axisname"], [4, 3, 1, "", "name"]], "psy_simple.plotters.XTicks": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "children"], [4, 4, 1, "", "data"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.XTicks2D": [[4, 4, 1, "", "data"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.XYTickPlotter": [[4, 3, 1, "", "labelprops"], [4, 3, 1, "", "labelsize"], [4, 3, 1, "", "labelweight"], [4, 3, 1, "", "ticksize"], [4, 3, 1, "", "tickweight"], [4, 3, 1, "", "transpose"], [4, 3, 1, "", "xlabel"], [4, 3, 1, "", "xrotation"], [4, 3, 1, "", "xticklabels"], [4, 3, 1, "", "xtickprops"], [4, 3, 1, "", "xticks"], [4, 3, 1, "", "ylabel"], [4, 3, 1, "", "yrotation"], [4, 3, 1, "", "yticklabels"], [4, 3, 1, "", "ytickprops"], [4, 3, 1, "", "yticks"]], "psy_simple.plotters.Xlabel": [[4, 3, 1, "", "children"], [4, 4, 1, "", "enhanced_attrs"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"], [4, 4, 1, "", "ylabel"]], "psy_simple.plotters.Xlim": [[4, 4, 1, "", "array"], [4, 3, 1, "", "axisname"], [4, 3, 1, "", "children"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "dependencies"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_limit"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.Xlim2D": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xticks"], [4, 4, 1, "", "ylim"]], "psy_simple.plotters.YRotation": [[4, 3, 1, "", "children"], [4, 3, 1, "", "group"], [4, 3, 1, "", "name"], [4, 2, 1, "", "update"], [4, 4, 1, "", "yticklabels"]], "psy_simple.plotters.YTickLabels": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.YTickProps": [[4, 4, 1, "", "axis"], [4, 3, 1, "", "axisname"], [4, 3, 1, "", "name"]], "psy_simple.plotters.YTicks": [[4, 4, 1, "", "axis"], [4, 4, 1, "", "data"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.YTicks2D": [[4, 4, 1, "", "data"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "transpose"]], "psy_simple.plotters.Ylabel": [[4, 3, 1, "", "children"], [4, 4, 1, "", "enhanced_attrs"], [4, 2, 1, "", "initialize_plot"], [4, 3, 1, "", "name"], [4, 4, 1, "", "transpose"], [4, 2, 1, "", "update"]], "psy_simple.plotters.Ylim": [[4, 4, 1, "", "array"], [4, 3, 1, "", "axisname"], [4, 3, 1, "", "children"], [4, 3, 1, "", "connections"], [4, 3, 1, "", "dependencies"], [4, 3, 1, "", "name"], [4, 4, 1, "", "plot"], [4, 2, 1, "", "set_limit"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "yticks"]], "psy_simple.plotters.Ylim2D": [[4, 4, 1, "", "array"], [4, 4, 1, "", "plot"], [4, 4, 1, "", "sym_lims"], [4, 4, 1, "", "transpose"], [4, 4, 1, "", "xlim"], [4, 4, 1, "", "yticks"]], "psy_simple.plugin": [[5, 1, 1, "", "BoundsMethod"], [5, 1, 1, "", "BoundsType"], [5, 1, 1, "", "BoundsValidator"], [5, 1, 1, "", "CTicksMethod"], [5, 1, 1, "", "CTicksType"], [5, 1, 1, "", "DictValValidator"], [5, 1, 1, "", "LineWidthValidator"], [5, 1, 1, "", "TicksMethod"], [5, 1, 1, "", "TicksType"], [5, 1, 1, "", "TicksValidator"], [5, 1, 1, "", "ValidateList"], [5, 5, 1, "", "get_versions"], [5, 5, 1, "", "patch_prior_1_0"], [5, 6, 1, "", "patches"], [5, 6, 1, "", "rcParams"], [5, 1, 1, "", "strEnum"], [5, 5, 1, "", "try_and_error"], [5, 5, 1, "", "validate_alpha"], [5, 5, 1, "", "validate_axiscolor"], [5, 5, 1, "", "validate_bool_maybe_none"], [5, 5, 1, "", "validate_cbarpos"], [5, 5, 1, "", "validate_cmap"], [5, 5, 1, "", "validate_cmaps"], [5, 5, 1, "", "validate_dataarray"], [5, 5, 1, "", "validate_err_calc"], [5, 5, 1, "", "validate_float"], [5, 5, 1, "", "validate_fontweight"], [5, 5, 1, "", "validate_iter"], [5, 5, 1, "", "validate_legend"], [5, 5, 1, "", "validate_limits"], [5, 5, 1, "", "validate_lineplot"], [5, 5, 1, "", "validate_marker"], [5, 5, 1, "", "validate_none"], [5, 5, 1, "", "validate_plot"], [5, 5, 1, "", "validate_str"], [5, 5, 1, "", "validate_sym_lims"], [5, 5, 1, "", "validate_text"], [5, 5, 1, "", "validate_ticklabels"]], "psy_simple.plugin.BoundsMethod": [[5, 3, 1, "", "data"], [5, 3, 1, "", "log"], [5, 3, 1, "", "mid"], [5, 3, 1, "", "minmax"], [5, 3, 1, "", "rounded"], [5, 3, 1, "", "roundedsym"], [5, 3, 1, "", "sym"], [5, 3, 1, "", "symlog"]], "psy_simple.plugin.BoundsType": [[5, 3, 1, "", "N"], [5, 3, 1, "", "method"], [5, 3, 1, "", "percmax"], [5, 3, 1, "", "percmin"], [5, 3, 1, "", "vmax"], [5, 3, 1, "", "vmin"]], "psy_simple.plugin.BoundsValidator": [[5, 2, 1, "", "instance_check"]], "psy_simple.plugin.CTicksMethod": [[5, 3, 1, "", "bounds"], [5, 3, 1, "", "data"], [5, 3, 1, "", "log"], [5, 3, 1, "", "mid"], [5, 3, 1, "", "midbounds"], [5, 3, 1, "", "minmax"], [5, 3, 1, "", "rounded"], [5, 3, 1, "", "roundedsym"], [5, 3, 1, "", "sym"], [5, 3, 1, "", "symlog"]], "psy_simple.plugin.CTicksType": [[5, 3, 1, "", "method"]], "psy_simple.plugin.TicksMethod": [[5, 3, 1, "", "data"], [5, 3, 1, "", "day"], [5, 3, 1, "", "hour"], [5, 3, 1, "", "log"], [5, 3, 1, "", "mid"], [5, 3, 1, "", "minmax"], [5, 3, 1, "", "month"], [5, 3, 1, "", "monthbegin"], [5, 3, 1, "", "monthend"], [5, 3, 1, "", "rounded"], [5, 3, 1, "", "roundedsym"], [5, 3, 1, "", "sym"], [5, 3, 1, "", "symlog"], [5, 3, 1, "", "week"], [5, 3, 1, "", "year"], [5, 3, 1, "", "yearbegin"], [5, 3, 1, "", "yearend"]], "psy_simple.plugin.TicksType": [[5, 3, 1, "", "method"]], "psy_simple.plugin.ValidateList": [[5, 3, 1, "", "dtype"]], "psy_simple.widgets": [[6, 1, 1, "", "Switch2FmtButton"], [7, 0, 0, "-", "colors"], [6, 5, 1, "", "get_icon"], [8, 0, 0, "-", "texts"]], "psy_simple.widgets.colors": [[7, 1, 1, "", "ArrayFmtWidget"], [7, 1, 1, "", "BackGroundColorWidget"], [7, 1, 1, "", "BoundsFmtWidget"], [7, 1, 1, "", "CMapFmtWidget"], [7, 1, 1, "", "CTicksFmtWidget"], [7, 1, 1, "", "CmapButton"], [7, 1, 1, "", "ColorLabel"], [7, 1, 1, "", "ColormapDialog"], [7, 1, 1, "", "ColormapModel"], [7, 1, 1, "", "ColormapTable"], [7, 1, 1, "", "DataTicksCalculatorFmtWidget"], [7, 1, 1, "", "HighlightWidget"], [7, 1, 1, "", "NormalizationWidget"], [7, 5, 1, "", "create_cmap_thumb"]], "psy_simple.widgets.colors.ArrayFmtWidget": [[7, 2, 1, "", "get_decimals"], [7, 2, 1, "", "set_array"], [7, 2, 1, "", "set_obj"], [7, 2, 1, "", "toggle_txt_step"]], "psy_simple.widgets.colors.BackGroundColorWidget": [[7, 2, 1, "", "set_color"], [7, 2, 1, "", "set_transparent"], [7, 2, 1, "", "toggle_color_button"]], "psy_simple.widgets.colors.BoundsFmtWidget": [[7, 2, 1, "", "block_widgets"], [7, 3, 1, "", "current_widget"], [7, 3, 1, "", "default_args"], [7, 3, 1, "", "default_kws"], [7, 2, 1, "", "get_auto_discrete_array_widget"], [7, 2, 1, "", "get_discrete_array_widget"], [7, 2, 1, "", "get_norm_widget"], [7, 3, 1, "", "methods"], [7, 3, 1, "", "methods_type"], [7, 3, 1, "", "norm_map"], [7, 2, 1, "", "refresh_current_widget"], [7, 2, 1, "", "refresh_methods"], [7, 2, 1, "", "set_obj"], [7, 2, 1, "", "set_value"]], "psy_simple.widgets.colors.CMapFmtWidget": [[7, 2, 1, "", "choose_cmap"], [7, 2, 1, "", "edit_cmap"], [7, 2, 1, "", "invert_cmap"], [7, 2, 1, "", "refresh_cb_invert"], [7, 2, 1, "", "set_obj"]], "psy_simple.widgets.colors.CTicksFmtWidget": [[7, 3, 1, "", "auto_val"], [7, 3, 1, "", "methods"], [7, 3, 1, "", "methods_type"], [7, 3, 1, "", "norm_map"], [7, 2, 1, "", "refresh_current_widget"], [7, 2, 1, "", "refresh_methods"], [7, 2, 1, "", "set_value"]], "psy_simple.widgets.colors.CmapButton": [[7, 3, 1, "", "colormap_changed"], [7, 2, 1, "", "open_cmap_dialog"], [7, 2, 1, "", "set_cmap"], [7, 2, 1, "", "setup_cmap_menu"]], "psy_simple.widgets.colors.ColorLabel": [[7, 2, 1, "", "adjust_height"], [7, 3, 1, "", "color"], [7, 3, 1, "", "color_changed"], [7, 2, 1, "", "select_color"], [7, 2, 1, "", "setEnabled"], [7, 2, 1, "", "set_color"], [7, 2, 1, "", "sizeHint"]], "psy_simple.widgets.colors.ColormapDialog": [[7, 2, 1, "", "get_colormap"], [7, 2, 1, "", "show_colormap"]], "psy_simple.widgets.colors.ColormapModel": [[7, 2, 1, "", "columnCount"], [7, 2, 1, "", "data"], [7, 2, 1, "", "headerData"], [7, 2, 1, "", "reset"], [7, 2, 1, "", "rowCount"], [7, 2, 1, "", "set_colors"]], "psy_simple.widgets.colors.ColormapTable": [[7, 2, 1, "", "change_color"], [7, 4, 1, "", "chosen_colormap"], [7, 2, 1, "", "columnCount"], [7, 2, 1, "", "rowCount"], [7, 2, 1, "", "setModel"]], "psy_simple.widgets.colors.DataTicksCalculatorFmtWidget": [[7, 2, 1, "", "get_decimals"], [7, 2, 1, "", "refresh"], [7, 2, 1, "", "set_obj"]], "psy_simple.widgets.colors.HighlightWidget": [[7, 2, 1, "", "enterEvent"], [7, 2, 1, "", "leaveEvent"], [7, 2, 1, "", "set_highlighted"]], "psy_simple.widgets.colors.NormalizationWidget": [[7, 2, 1, "", "fill_from_norm"], [7, 2, 1, "", "set_obj"]], "psy_simple.widgets.texts": [[8, 1, 1, "", "DictCombo"], [8, 1, 1, "", "FontPropertiesWidget"], [8, 1, 1, "", "FontSizeWidget"], [8, 1, 1, "", "FontWeightWidget"], [8, 1, 1, "", "LabelWidget"], [8, 5, 1, "", "mpl_weight2qt"]], "psy_simple.widgets.texts.DictCombo": [[8, 2, 1, "", "insert_bracketed"], [8, 2, 1, "", "insert_modulo"]], "psy_simple.widgets.texts.FontPropertiesWidget": [[8, 2, 1, "", "artist_to_qfont"], [8, 2, 1, "", "choose_color"], [8, 2, 1, "", "choose_font"], [8, 3, 1, "", "current_font"], [8, 2, 1, "", "load_properties"], [8, 2, 1, "", "modify_size"], [8, 2, 1, "", "qfont_to_artist_props"], [8, 2, 1, "", "refresh"], [8, 2, 1, "", "toggle_bold"], [8, 2, 1, "", "toggle_italic"]], "psyplot.project.plot": [[11, 3, 1, "", "barplot"], [12, 3, 1, "", "combined"], [13, 3, 1, "", "density"], [14, 3, 1, "", "fldmean"], [15, 3, 1, "", "lineplot"], [16, 3, 1, "", "plot2d"], [17, 3, 1, "", "vector"], [18, 3, 1, "", "violinplot"]]}, "objnames": {"0": ["py", "module", "Python module"], "1": ["py", "class", "Python class"], "2": ["py", "method", "Python method"], "3": ["py", "attribute", "Python attribute"], "4": ["py", "property", "Python property"], "5": ["py", "function", "Python function"], "6": ["py", "data", "Python data"]}, "objtypes": {"0": "py:module", "1": "py:class", "2": "py:method", "3": "py:attribute", "4": "py:property", "5": "py:function", "6": "py:data"}, "terms": {"": [2, 4, 5, 7, 8], "0": [2, 3, 4, 5, 7, 19], "00": 4, "0000": 19, "00000000e": 4, "0001": 19, "00023": 4, "001": 7, "00363": 19, "008000": 4, "01": 4, "02": 4, "04": 4, "05": 5, "08": 19, "1": [2, 3, 4, 5, 7, 8, 19], "10": [2, 3, 4, 5, 7, 9, 19], "100": [4, 5], "1000": [2, 4, 8], "11": [3, 4, 7], "12": [2, 4, 5], "13": 9, "1316": 3, "15": [5, 9], "16": 19, "18": 9, "1d": 4, "2": [3, 4, 19], "20": [2, 4, 9], "2017": 19, "2021": 19, "2024": 19, "21105": 19, "21502": 19, "22": 19, "23": 9, "24": 9, "256": 3, "25th": 4, "27": 9, "28": 9, "2d": [4, 5, 12, 16, 17], "3": [3, 4, 7, 19], "30": [2, 4, 9], "31": 9, "35": 9, "36": 9, "363": 19, "37": 9, "38": 9, "39": 9, "3d": 9, "3e": 4, "4": [3, 4, 19], "40": 4, "41": 9, "43": 9, "45": 4, "5": [3, 4], "50": [4, 9], "50000000e": 4, "50th": 4, "5281": 19, "557": 3, "5e": 4, "5std": 4, "5th": 4, "6": [4, 9], "6171": 19, "7": [4, 9], "75": 9, "75th": 4, "7716": 19, "8": 4, "845643": 19, "9": [4, 9], "95": 4, "95th": 4, "A": [2, 3, 4, 5, 6, 7, 8, 9, 19], "And": 7, "As": 9, "BY": 19, "By": 4, "For": [2, 4, 5, 11, 12, 13, 14, 15, 16, 17, 18], "If": [2, 3, 4, 5, 7, 19], "In": 4, "It": [2, 4], "No": [4, 7], "On": 4, "One": [4, 8], "Or": 20, "The": [2, 3, 4, 5, 7, 8, 9, 19, 20], "Then": 4, "There": 2, "To": [2, 3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 20], "Will": 4, "__call__": 3, "_deprecated_sinc": 5, "_get_data": 3, "_kwarg": 3, "_r": [3, 4, 5, 7], "_text": 2, "_texts_to_remov": 2, "a0": 7, "abbrevi": 4, "abov": [2, 4], "absolut": [2, 3, 4], "abstract": [2, 4], "accept": [2, 4], "access": [4, 11, 12, 13, 14, 15, 16, 17, 18, 20, 21], "accord": 4, "act": 4, "add": [2, 9, 11, 12, 13, 14, 15, 16, 17, 18], "add2format_coord": [0, 1, 4], "addit": [3, 4], "addition": 8, "additional_children": [2, 4], "additional_depend": [2, 4], "adjust": [2, 7], "adjust_height": [0, 1, 6, 7], "affili": 19, "after": [2, 4, 9, 20], "against": [2, 4], "aggreg": [2, 4], "alia": 7, "all": [2, 3, 4, 5, 9], "allow": [4, 9], "allowed_dim": [0, 1, 4], "allowed_var": [0, 1, 4], "alpha": [0, 1, 4, 5], "alreadi": 2, "also": [2, 4, 9], "altern": 4, "alternativexcoord": [0, 1, 4], "alternativexcoordpost": [0, 1, 4], "alwai": 4, "an": [2, 3, 4, 5, 7, 8, 9, 12], "angl": 4, "ani": [2, 3, 4, 7, 9], "anoth": [2, 4], "anyth": [4, 7], "anywai": 2, "anywher": 2, "apa": 19, "api": 19, "appear": 2, "append": 9, "appli": [2, 4, 5], "ar": [2, 3, 4, 5, 6, 9], "arang": 4, "arbitrari": 2, "area": 4, "areax": 4, "arg": [2, 3, 4, 7, 11, 12, 13, 14, 15, 16, 17, 18], "argument": [2, 4], "around": 4, "arr": 4, "arr_nam": 5, "arrai": [0, 1, 2, 3, 4, 7, 11, 12, 13, 14, 15, 16, 17, 18], "arrayfmtwidget": [0, 1, 6, 7], "arrow": 4, "arrows": [0, 1, 4, 5], "arrowstyl": [0, 1, 4, 5], "articl": 19, "artifact": 9, "artist": [8, 9], "artist_to_qfont": [0, 1, 6, 8], "assum": [3, 4], "attempt": [2, 4], "attr": [2, 4, 8], "attribut": [2, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], "au": 19, "author": 19, "auto": 7, "auto_upd": [2, 4], "auto_v": [0, 1, 6, 7], "automat": [2, 4, 5, 9, 19], "avail": [3, 7], "ax": [2, 3, 4, 7, 8, 9], "axi": [0, 1, 2, 4], "axis_loc": [0, 1, 4], "axiscolor": [0, 1, 4, 5], "axisnam": [0, 1, 4], "b": [2, 4, 5, 7], "background": [0, 1, 2, 5, 7, 9], "backgroundcolor": [0, 1, 2], "backgroundcolorwidget": [0, 1, 6, 7], "backward": 9, "bandwidth": 4, "bandwith": 4, "bar": [4, 5, 11], "baralpha": [0, 1, 4], "barplot": [0, 1, 4, 5, 9], "barplott": [0, 1, 4, 5, 11], "barwidth": [0, 1, 4], "barxlabel": [0, 1, 4], "barxlim": [0, 1, 4], "barxtick": [0, 1, 4], "barxticklabel": [0, 1, 4], "barylabel": [0, 1, 4], "barylim": [0, 1, 4], "barytick": [0, 1, 4], "baryticklabel": [0, 1, 4], "base": [2, 3, 4, 5, 6, 7, 8, 9], "base2d": [0, 1, 4], "basen": 4, "baseplott": [0, 1, 2, 4, 5], "basevectorplott": [0, 1, 4], "basi": 2, "becaus": 5, "been": [2, 4, 9, 19], "befor": [2, 4, 5], "begin": 4, "behaviour": 4, "below": [2, 4], "besid": 2, "between": [2, 4, 5, 8, 9], "bibtex": 19, "bin": [0, 1, 4, 5], "binari": 5, "bit": [2, 4], "bivari": 4, "bl": 4, "black": [2, 4], "block": [3, 7], "block_widget": [0, 1, 6, 7], "blue": [4, 5], "bold": [2, 4], "book": [2, 4], "bool": [2, 3, 4, 5, 7], "boolean": 4, "both": [4, 5, 19], "bottom": [4, 5], "bound": [0, 1, 3, 4, 5, 7, 9], "boundari": [3, 4, 7], "boundarynorm": 3, "boundsfmtwidget": [0, 1, 6, 7], "boundsmethod": [0, 1, 5], "boundstyp": [0, 1, 5, 7], "boundsvalid": [0, 1, 5], "box": 7, "broadcast": [2, 4], "broken": 9, "bug": [3, 9], "build": 9, "button": [6, 7, 8], "c": [4, 20], "calc_func": 7, "calcul": [4, 5, 9, 14], "call": [2, 4], "callabl": [2, 4], "can": [2, 3, 4, 5, 7, 8, 9, 20, 21], "cannot": 3, "cartopi": 3, "case": [2, 4, 5], "categor": [0, 1, 4, 5, 9], "categoricalbar": [0, 1, 4], "cbar": [0, 1, 4, 5], "cbaropt": [0, 1, 4], "cbarspac": [0, 1, 4, 5], "cbound": [0, 1, 4], "cc": 19, "cc0": 19, "ccr": 3, "cd": 9, "cell": [4, 7], "cell_nodes_i": [0, 1, 4], "cell_nodes_x": [0, 1, 4], "center": 4, "certain": [2, 4], "cff": [9, 19], "chang": [2, 3, 4, 7], "change_color": [0, 1, 6, 7], "charact": 4, "check": [2, 4], "check_data": [0, 1, 4], "children": [0, 1, 2, 4], "chilipp": 9, "choic": 4, "choos": [4, 8], "choose_cmap": [0, 1, 6, 7], "choose_color": [0, 1, 6, 8], "choose_font": [0, 1, 6, 8], "chop": 4, "chose": 4, "chosen": [4, 7], "chosen_colormap": [0, 1, 6, 7], "ci": 9, "cicleci": 9, "circleci": 9, "circumpolar": 4, "citat": [9, 19], "citi": 19, "clabel": [0, 1, 4, 5], "clabelprop": [0, 1, 4, 5], "clabels": [0, 1, 4, 5], "clabelweight": [0, 1, 4, 5], "class": [2, 3, 4, 5, 6, 7, 8, 21], "classmethod": [4, 7], "clear": [2, 4], "clear_other_text": [0, 1, 2], "climat": 19, "clip": 3, "close": 3, "closest": 4, "cloud": [19, 20], "cm": [3, 4, 7], "cmap": [0, 1, 3, 4, 5, 7], "cmapbutton": [0, 1, 6, 7], "cmapfmtwidget": [0, 1, 4, 6, 7], "code": [4, 9, 19, 20], "codebas": [19, 20], "col": 4, "color": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9], "color_chang": [0, 1, 6, 7], "color_cycl": [4, 9], "colorbar": [0, 1, 4, 5, 7, 9], "colorlabel": [0, 1, 6, 7], "colormap": [2, 3, 4, 5, 7], "colormap_chang": [0, 1, 6, 7], "colormapdialog": [0, 1, 3, 6, 7], "colormapmodel": [0, 1, 6, 7], "colormapt": [0, 1, 6, 7], "column": 4, "columncount": [0, 1, 6, 7], "com": [9, 19], "combin": [4, 5], "combinedbas": [0, 1, 4], "combinedplott": 4, "combinedsimpl": 5, "combinedsimpleplott": [0, 1, 4, 5, 12], "combinedvectorplot": [0, 1, 4], "combo": 7, "combobox": [2, 8], "comparison": 9, "compat": 9, "compatibl": 9, "compon": 4, "comput": 4, "conda": 19, "condit": [2, 4], "connect": [0, 1, 4], "consid": [4, 9], "contact": 19, "contain": [2, 3, 4, 5, 6, 7, 8, 9], "content": 7, "continu": [4, 7, 9], "contour": [4, 9], "contourf": [4, 9], "contourlevel": [0, 1, 4], "contribut": [19, 20], "control": [2, 4], "convers": 5, "convert": [2, 3, 4, 5, 7, 8], "convert_coordin": 9, "convert_radian": [0, 1, 4], "coolwarm": 5, "coord": [0, 1, 2, 4, 5], "coordin": [2, 4], "copyright": 19, "corner": 2, "correct": 5, "correctli": 9, "correspond": [4, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18], "count": 4, "countri": 19, "cr": 3, "creat": [2, 3, 4, 7], "create_cmap_thumb": [0, 1, 6, 7], "ctick": [0, 1, 4, 5, 9], "cticklabel": [0, 1, 4, 5], "ctickprop": [0, 1, 4, 5], "cticksfmtwidget": [0, 1, 6, 7], "cticksiz": [0, 1, 4, 5], "cticksmethod": [0, 1, 5], "ctickstyp": [0, 1, 5, 7], "ctickweight": [0, 1, 4, 5], "current": [2, 4, 7, 8, 9], "current_font": [0, 1, 6, 8], "current_widget": [0, 1, 6, 7], "cursor": 9, "cut": 4, "cyan": 4, "cycl": 4, "d": [2, 4, 5], "da": 4, "dai": [0, 1, 4, 5], "dash": 4, "dashdot": 4, "data": [0, 1, 2, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18], "data_depend": [0, 1, 2, 4], "data_iter": [0, 1, 4], "data_rang": 4, "dataarrai": [2, 4], "datagrid": [0, 1, 4, 5], "dataprecis": [0, 1, 4], "dataset": [2, 4, 9], "datatickscalcul": [0, 1, 4, 7], "datatickscalculatorfmtwidget": [0, 1, 6, 7], "date": 19, "datetim": [2, 4], "de": 19, "default": [2, 3, 4, 5, 7], "default_arg": [0, 1, 6, 7], "default_dim": 5, "default_formatt": [0, 1, 4], "default_kw": [0, 1, 6, 7], "default_loc": [0, 1, 4], "default_posit": 5, "default_slic": 5, "defin": [2, 3, 4, 5, 7, 21], "definit": [5, 8], "degre": 4, "delet": 2, "delimit": [0, 1, 2, 5], "demi": [2, 4], "demibold": [2, 4], "densiti": [0, 1, 3, 4, 5], "densityplott": [0, 1, 4, 5, 13], "densityregplott": 5, "depend": [0, 1, 2, 3, 4], "deploi": 9, "deprec": 9, "desc": [2, 4, 5], "describ": 4, "descriptor": 4, "desir": 3, "detail": 4, "determin": [2, 4], "develop": 19, "deviat": 4, "dialog": [7, 8], "dict": [2, 4, 5], "dictcombo": [0, 1, 6, 8], "dictformatopt": 4, "dictionari": [2, 3, 4, 5, 7, 8, 9], "dictvalvalid": [0, 1, 5], "diff": [0, 1, 2, 4], "differ": [2, 3, 4, 5, 7], "dim": 4, "dimens": [2, 4, 5, 9, 14], "dimension": [2, 4, 5, 11, 15], "dinfo": [2, 4, 5], "direct": 4, "directli": [4, 9, 20], "disabl": 4, "discret": [7, 9], "discuss": 19, "displai": [3, 4, 7], "distanc": 4, "divid": 3, "do": [4, 19], "doc": [9, 11, 12, 13, 14, 15, 16, 17, 18], "document": [2, 11, 12, 13, 14, 15, 16, 17, 18], "doe": [2, 4, 5, 9], "doi": 19, "don": [2, 4], "done": 20, "dot": 4, "download": 20, "draw": [2, 4], "draw_colorbar": [0, 1, 4], "drawn": [4, 9], "dropdown": 7, "dtdata": [0, 1, 4], "dtinfo": [2, 4, 5], "dtticksbas": [0, 1, 4], "dtype": [0, 1, 5], "due": [2, 4], "dummi": 4, "dure": 4, "e": [2, 3, 4, 5, 8, 9], "each": [2, 4], "earth": 19, "edit": 7, "edit_cmap": [0, 1, 6, 7], "eeefff": 4, "effect": [2, 4], "either": [2, 3, 4, 7, 8, 9], "element": 3, "els": 7, "email": 19, "emit": 7, "empti": 2, "enabl": 4, "enable_post": [2, 4], "enclos": [2, 4], "end": [2, 3, 4, 6, 7], "endnot": 19, "enhanc": [2, 4, 8], "enhanced_attr": [0, 1, 2, 4], "enterev": [0, 1, 6, 7], "entri": 3, "enum": 5, "enumer": 5, "equal": [2, 4, 5, 9], "equidistantli": 3, "equival": 4, "equivalu": 4, "er": 19, "err_calc": [0, 1, 4, 5], "error": [0, 1, 3, 4, 5], "erroralpha": [0, 1, 4, 5], "errorcalcul": [0, 1, 4], "errorplot": [0, 1, 4], "estim": [4, 9], "estimate_bw": [0, 1, 4], "etc": [2, 4, 8, 9], "europ": 3, "everi": 4, "everyth": 4, "exactli": [2, 4], "exampl": [3, 4, 11, 12, 13, 14, 15, 16, 17, 18, 21], "example_cal": 5, "except": 4, "exist": 4, "exp": 4, "expect": 5, "explicitli": 4, "explor": [11, 12, 13, 14, 15, 16, 17, 18], "expon": 4, "extend": [0, 1, 3, 4, 5, 9], "extended_color": [0, 1, 4, 9], "extens": [3, 4, 7], "extra": [2, 4], "extrapol": 4, "facecolor": 9, "factor": 4, "fals": [2, 3, 4, 5, 7], "famili": 19, "fancyarrowpatch": 4, "fb": [4, 5], "field": [4, 5, 12, 16, 17], "fieldplott": 4, "fig": 2, "figtitl": [0, 1, 2, 5], "figtitleprop": [0, 1, 2, 5], "figtitles": [0, 1, 2, 5], "figtitleweight": [0, 1, 2, 5], "figur": [2, 3, 4, 7], "figure_posit": [0, 1, 4], "file": [2, 4, 9, 11, 12, 13, 14, 15, 16, 17, 18], "filecopyrighttext": 19, "filenam": [5, 11, 12, 13, 14, 15, 16, 17, 18], "fill": [4, 5], "fill_between": 4, "fill_betweenx": 4, "fill_from_norm": [0, 1, 6, 7], "fillalpha": 4, "final": 2, "finish": 4, "finish_upd": [0, 1, 2, 4], "first": [2, 4], "fit": [2, 4], "five": 4, "fix": 3, "fixedboundarynorm": [0, 1, 3], "fixedcolormap": [0, 1, 3], "fl": [4, 5], "fldmean": [5, 9], "fldmeanplott": [0, 1, 4, 5, 14], "float": [2, 3, 4, 5], "fmt": [4, 7], "fmt_widget": [2, 8], "fmto": [2, 6, 7, 8], "fname": 6, "follow": [4, 21], "font": [2, 4, 8], "fontprop": 4, "fontproperti": 8, "fontpropertieswidget": [0, 1, 6, 8], "fontsit": 2, "fontsiz": [2, 8], "fontsizewidget": [0, 1, 6, 8], "fontweight": [2, 4, 8], "fontweightwidget": [0, 1, 6, 8], "forc": 4, "forg": 20, "form": 4, "format": [2, 9], "format_coord": [0, 1, 4], "format_coord_func": [0, 1, 4], "formatopion": [11, 12, 13, 14, 15, 16, 17, 18], "formatopt": [2, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], "formatoptionwidget": 2, "formatstr": 4, "formatt": 4, "fr": [4, 5], "framework": 19, "from": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20], "from_list": [0, 1, 3], "ft": [4, 5], "full": [4, 11, 12, 13, 14, 15, 16, 17, 18], "full_arrai": [0, 1, 4], "func": [3, 4, 5], "function": [2, 3, 4, 5, 6, 7, 8], "furthermor": [2, 4], "g": [2, 4, 5, 8, 9], "gain": [2, 9], "gamma": 3, "gcp": 2, "geesthacht": 19, "gen": 19, "gener": 19, "geoax": 3, "get": [2, 4, 7], "get_alternative_coord": [0, 1, 4], "get_artists_and_label": [0, 1, 4], "get_auto_discrete_array_widget": [0, 1, 6, 7], "get_cmap": [0, 1, 3, 4, 7], "get_colormap": [0, 1, 6, 7], "get_decim": [0, 1, 6, 7], "get_discrete_array_widget": [0, 1, 6, 7], "get_enhanced_attr": [0, 1, 2], "get_fig_data_attr": [0, 1, 2], "get_fmt_widget": [0, 1, 2, 4], "get_i": [0, 1, 4], "get_icon": [0, 1, 6], "get_loc": [0, 1, 4], "get_norm_widget": [0, 1, 6, 7], "get_vers": [0, 1, 5], "get_x": [0, 1, 4], "get_xi": [0, 1, 4], "get_xyz_1d": [0, 1, 4], "get_xyz_2d": [0, 1, 4], "get_xyz_tri": [0, 1, 4], "getcolor": 7, "gist_earth": 5, "gist_ncar": 5, "git": 20, "github": [9, 19], "gitlab": 20, "give": [3, 4], "given": [2, 3, 4, 5, 7, 19], "gmbh": 19, "gnuplot": 5, "gnuplot2": 5, "grayscal": 4, "greater": [2, 4, 9], "green": [4, 5], "grey": 4, "grid": [0, 1, 4, 5], "group": [0, 1, 2, 4, 11, 12, 13, 14, 15, 16, 17, 18], "gui": [2, 3, 4, 6, 7, 8], "guid": 20, "guidelin": 10, "h": [2, 4, 5], "ha": [2, 4, 5, 9, 19], "hand": 4, "handl": [4, 9], "happend": 2, "have": [2, 4, 9], "head": 20, "header": 7, "headerdata": [0, 1, 6, 7], "heavi": [2, 4], "height": 7, "helmholtz": [19, 20], "henc": 4, "here": [2, 4], "hereon": 19, "hex": 4, "higher": 4, "highli": 20, "highlightwidget": [0, 1, 6, 7], "hint": 19, "hist": [4, 5], "hist2d": [0, 1, 4], "hist2dxrang": [0, 1, 4], "hist2dyrang": [0, 1, 4], "histbin": [0, 1, 4], "histogram": 4, "histogram2d": 4, "histogramm": 4, "hline": 4, "horizont": 4, "hour": [0, 1, 4, 5], "how": 4, "howev": [4, 20], "html": [3, 4], "http": [3, 4, 9, 19, 20], "i": [2, 3, 4, 5, 7, 9, 19], "identifi": 19, "ignor": [4, 5], "ignorecas": 5, "imag": 9, "implement": [2, 3, 4, 9], "import": [3, 4, 11, 12, 13, 14, 15, 16, 17, 18], "includ": [2, 3, 4, 7], "increment": [3, 7], "index": [4, 7, 19], "index_in_list": [2, 4], "indic": [2, 4], "indivu": 4, "inform": [2, 4], "init_kwarg": [0, 1, 4], "initi": [2, 4], "initialize_plot": [0, 1, 2, 4], "input": 4, "input_d": 4, "insert": [2, 4, 5, 6, 8], "insert_bracket": [0, 1, 6, 8], "insert_modulo": [0, 1, 6, 8], "insert_text": 2, "instal": [4, 19], "instanc": [2, 3, 4], "instance_check": [0, 1, 5], "instead": 4, "instruct": 20, "int": [2, 3, 4, 5, 7, 8], "int64": 4, "integ": [3, 4, 8], "intens": 4, "inter": 4, "interact": [4, 19], "interactivebas": 2, "intermedi": 4, "interp_bound": [0, 1, 4, 5, 9], "interpol": 4, "interpolatebound": [0, 1, 4], "interpret": 9, "introduc": 9, "invert": 9, "invert_cmap": [0, 1, 6, 7], "invis": 4, "io": 9, "is_unstructur": 4, "item": [2, 4, 5], "iter": [4, 5], "its": 4, "itself": 19, "jet": 5, "join": 2, "joss": 19, "journal": 19, "just": 7, "k": [4, 5, 19], "kde": 4, "kei": [2, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18], "kernel": 4, "keyword": [2, 4, 19], "kw": 19, "kwarg": [2, 3, 4, 7, 11, 12, 13, 14, 15, 16, 17, 18], "l": 4, "label": [2, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18], "label_nam": 2, "label_prop": [0, 1, 2], "label_s": [0, 1, 2], "label_weight": [0, 1, 2], "labelopt": [0, 1, 4], "labelplott": 5, "labelprop": [0, 1, 4, 5], "labels": [0, 1, 4, 5], "labelweight": [0, 1, 4, 5], "labelwidget": [0, 1, 6, 8], "larg": [2, 4, 5], "larger": 4, "last": 4, "latest": 9, "latter": [2, 20], "law": 7, "layout": 2, "least": 4, "leaveev": [0, 1, 6, 7], "left": [4, 5], "legend": [0, 1, 4, 5], "legendlabel": [0, 1, 4, 5], "length": [4, 5], "less": 2, "lesser": 2, "let": 4, "letter": 4, "level": [0, 1, 3, 4, 5], "lgpl": [9, 19], "licens": 9, "light": [2, 4], "like": [2, 4], "limit": [2, 4], "limitbas": [0, 1, 4], "line": [3, 4, 5, 7, 15], "linearsegmentedcolormap": 3, "linecolor": [0, 1, 4], "lineplot": [0, 1, 4, 5, 9], "lineplott": [0, 1, 4, 5, 15], "linestyl": 4, "linewidth": [0, 1, 4, 5], "linewidthvalid": [0, 1, 5], "linregplott": 5, "linux": 20, "list": [2, 3, 4, 5, 7], "listnam": 5, "listtyp": 5, "load": [2, 4, 5], "load_mask": [0, 1, 2], "load_properti": [0, 1, 6, 8], "loc": 5, "locat": 4, "log": [0, 1, 4, 5, 7, 9], "logarithm": [4, 9], "lognorm": [4, 7], "long": [2, 4], "long_nam": [2, 4, 5], "longer": 4, "lonlatbox": [2, 3, 4], "lookup": 3, "lower": 4, "lut": 3, "m": [2, 3, 4, 5], "made": [2, 4], "magenta": 4, "mai": [2, 3, 4, 7], "main": 2, "mainwindow": 2, "major": [4, 5], "make": [2, 4, 5, 11, 13, 15, 16, 17, 18], "make_plot": [0, 1, 2, 4], "manag": 4, "mani": [2, 4], "manual": [2, 4], "map": [3, 4, 5, 7], "mappabl": [0, 1, 4], "mapvector": 3, "marker": [0, 1, 4, 5], "markers": [0, 1, 4, 5], "mask": [0, 1, 2, 3, 4, 5, 9], "mask_datagrid": [0, 1, 4, 5], "mask_func": [0, 1, 2], "maskbetween": [0, 1, 2, 4, 5], "maskdatagrid": [0, 1, 4], "maskerror": 3, "maskgeq": [0, 1, 2, 4, 5], "maskgreat": [0, 1, 2, 4, 5], "maskleq": [0, 1, 2, 4, 5], "maskless": [0, 1, 2, 4, 5], "match": [2, 3, 4, 7], "matplitlib": 3, "matplotlib": [2, 3, 4, 7, 8, 9, 19], "matpltolib": 3, "matter": 4, "max": 4, "max_rang": 4, "max_val": 4, "maxim": 4, "maximum": [4, 7], "mcol": 3, "mean": [0, 1, 4, 5, 9, 14], "meancalcul": [0, 1, 4], "median": 4, "medium": [2, 4, 5], "mention": 4, "menu": [6, 7], "mesh": [4, 5], "messag": [4, 19], "meta": [2, 4], "method": [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18], "methods_typ": [0, 1, 6, 7], "mid": [0, 1, 4, 5], "midbound": [0, 1, 4, 5], "middl": 4, "might": [2, 4], "migrat": 9, "min": [4, 9], "min_circle_ratio": 5, "min_rang": 4, "min_val": 4, "miniconda": 20, "minim": 4, "minimum": [4, 7], "minmax": [0, 1, 4, 5], "minor": [4, 5], "misc": 19, "miss": [2, 4], "miss_color": [0, 1, 4, 5], "misscolor": [0, 1, 4], "mixtur": 5, "mode": 4, "model": [7, 19], "modif": 6, "modifi": [2, 4, 6, 7, 8], "modify_s": [0, 1, 6, 8], "modul": [2, 3, 4, 5, 6, 7, 8, 19], "modulo_styl": 8, "month": [0, 1, 4, 5], "monthbegin": [0, 1, 4, 5], "monthend": [0, 1, 4, 5], "more": [2, 4, 9], "most": 4, "move": 9, "mpl": [3, 5, 9], "mpl_weight2qt": [0, 1, 6, 8], "mpltype": 3, "multipl": [2, 5, 9, 11, 12, 13, 14, 15, 16, 17, 18], "multipli": 4, "must": [2, 4], "my_vari": [5, 11, 12, 13, 14, 15, 16, 18], "n": [0, 1, 3, 4, 5, 7], "name": [0, 1, 2, 3, 4, 5, 7, 11, 12, 13, 14, 15, 16, 17, 18, 19], "nan": 4, "nc": 3, "ncmap": 3, "ncolor": 3, "ndarrai": [2, 4], "necessari": 4, "necessarili": [2, 4], "need": [2, 4], "neither": [3, 4, 5], "netcdf": [2, 4, 11, 12, 13, 14, 15, 16, 17, 18], "netcdf4": 19, "new": [2, 4, 9, 21], "next": 4, "no_fig_cbar": 4, "non": [4, 9], "none": [2, 3, 4, 5, 7, 8, 9], "norm": [0, 1, 3, 4, 5, 7], "norm_map": [0, 1, 6, 7], "normal": [2, 4, 7], "normalizationwidget": [0, 1, 6, 7], "normedhist2d": [0, 1, 4], "note": [2, 3, 4, 5], "notnull_arrai": [0, 1, 4], "now": 9, "np": [2, 3, 4], "number": [2, 3, 4, 7, 19], "numer": [2, 4], "numpi": [2, 4], "obj": 7, "object": [2, 4, 5, 7, 8], "off": 4, "offici": 9, "offset": 4, "okai": 4, "one": [2, 3, 4, 5, 7, 8, 9, 11, 15], "onli": [3, 4, 9, 19, 20], "opac": 4, "opaqu": 4, "open": [4, 7, 19], "open_cmap_dialog": [0, 1, 6, 7], "option": [2, 3, 4, 7, 8, 9], "orcid": 19, "org": [3, 4, 19], "orient": 7, "original_posit": [0, 1, 4], "other": [2, 4, 6, 9], "otherwis": [2, 4, 19], "our": 20, "out": [4, 8], "outer": 4, "output": 7, "over": [4, 5, 9, 14, 20], "overli": [5, 12], "overwritten": 4, "p": 19, "p25": 4, "p75": 4, "packag": [0, 3, 4, 5, 19, 20], "page": 19, "pair": [3, 5], "panda": 4, "param": 2, "paramet": [2, 3, 4, 5, 7, 8], "parent": [0, 1, 2, 4, 6, 7, 8], "part": [2, 5], "pass": [2, 4, 7], "patch": [0, 1, 5, 9], "patch_prior_1_0": [0, 1, 5], "path": [2, 4], "pcolormesh": 4, "per": 4, "percentil": [4, 7], "percmax": [0, 1, 4, 5], "percmin": [0, 1, 4, 5, 9], "perman": 2, "philipp": 19, "pickl": 4, "pip": 19, "pipelin": 9, "place": 9, "platecarre": 3, "pleas": [19, 20], "plot": [0, 1, 2, 3, 4, 5, 9], "plot2d": [0, 1, 4, 5, 9], "plot_arr": [0, 1, 4], "plot_data": 4, "plot_fil": [0, 1, 4], "plot_fmt": [0, 1, 4], "plot_func": 5, "plot_typ": 4, "plotmethod": 9, "plotted_data": [0, 1, 4], "plotter": [2, 3, 4, 5, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18], "plotter_d": 5, "plotter_nam": 5, "plt": 3, "plugin": [1, 4, 5, 7, 9, 19, 21], "png": 6, "po": 4, "point": [2, 4, 5, 13], "pointdens": [0, 1, 4], "poli": [4, 9], "polygon": [4, 9], "posit": [2, 4, 5, 9], "possibl": 5, "possible_inst": 5, "post": 19, "power": [4, 7], "powernorm": 7, "precis": [0, 1, 4, 5], "prefer": 19, "prefer_list": 5, "prevent": [4, 9], "prioriti": [0, 1, 2, 4], "process": 4, "project": [2, 3, 4, 5, 7, 8, 21], "projectplott": 21, "properti": [2, 4, 7, 8], "proport": 4, "provid": [2, 4, 8], "psy": [1, 2, 3, 4, 5, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20], "psy_simpl": [0, 2, 3, 4, 5, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19], "psyplot": [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 19, 20], "psyplot_gui": 2, "publish": 19, "put": 4, "pylab_exampl": 3, "pypi": 20, "pyplot": [2, 3, 4, 7], "pyqt": 8, "pyqt4": 6, "pyqt5": [2, 6, 7, 8], "python": [3, 4, 19], "qabstractitemmodel": 7, "qabstracttablemodel": 7, "qcolor": 7, "qcolordialog": 7, "qcombobox": 8, "qdialog": 7, "qevent": 7, "qfont": 8, "qfont_to_artist_prop": [0, 1, 6, 8], "qmodelindex": 7, "qt": [3, 8], "qtableview": 7, "qtablewidget": 7, "qtcore": 7, "qtgui": [7, 8], "qtoolbutton": [6, 7], "qtwidget": [2, 7], "quantil": 4, "quantiz": 3, "quit": 5, "quiver": [4, 5], "qwidget": [2, 7, 8], "r": [4, 5, 19], "radian": 4, "rais": [3, 4, 5], "rang": [3, 4], "raster": 19, "raw": 4, "raw_data": 4, "rc": [0, 1, 2, 5], "rcparam": [0, 1, 2, 3, 4, 5, 7, 8], "rdbu": 5, "realli": 5, "reason": 4, "recommend": 20, "rectilinear": 4, "red": [4, 5], "red_white_blu": 5, "ref": 4, "refer": [3, 4, 9, 19], "refresh": [0, 1, 6, 7, 8], "refresh_cb_invert": [0, 1, 6, 7], "refresh_current_widget": [0, 1, 6, 7], "refresh_method": [0, 1, 6, 7], "regular": [2, 4, 9], "reimplement": 7, "relev": 2, "remov": [0, 1, 2, 4], "replac": [0, 1, 2, 4, 9], "replace_coord": [0, 1, 4], "replot": 4, "repositori": [19, 20], "repres": [4, 7], "reproduc": 3, "requir": [4, 5, 9], "requires_clear": [2, 4], "requires_replot": [0, 1, 4], "reset": [0, 1, 6, 7], "respect": [4, 9], "result": [2, 4], "ret": 3, "return": [2, 3, 4, 5, 7, 8], "revers": [3, 4, 5, 7], "review": 19, "rgb": [3, 4], "rgba": [4, 7], "ri": 19, "right": [2, 4, 5], "role": 7, "roman": [2, 4], "rotat": 4, "round": [0, 1, 4, 5, 9], "round_to_05": [0, 1, 4], "roundedsym": [0, 1, 4, 5], "routin": 4, "row": [4, 7], "rowcount": [0, 1, 6, 7], "rowheight": 7, "run": 3, "same": [2, 3, 4], "scalar": [3, 4, 5, 12, 16], "scalarcombinedbas": [0, 1, 4], "scale": 4, "scienc": 19, "scott": 4, "sdesc": [2, 4, 5], "search": 19, "second": [4, 8], "section": 7, "see": [2, 4, 5, 9, 10], "segmentdata": 3, "select": [2, 7], "select_color": [0, 1, 6, 7], "self": 7, "semibold": [2, 4], "separ": [4, 9], "seq": 4, "sequenc": 3, "seriou": 4, "serv": 4, "set": [2, 3, 4, 7, 9], "set_arrai": [0, 1, 6, 7], "set_cmap": [0, 1, 6, 7], "set_color": [0, 1, 6, 7], "set_default_formatt": [0, 1, 4], "set_default_loc": [0, 1, 4], "set_ext": 3, "set_formatt": [0, 1, 4], "set_highlight": [0, 1, 6, 7], "set_label": 4, "set_label_po": [0, 1, 4], "set_limit": [0, 1, 4], "set_loc": [0, 1, 4], "set_obj": [0, 1, 6, 7], "set_stringformatt": [0, 1, 4], "set_tick": [0, 1, 4], "set_ticklabel": [0, 1, 4], "set_transpar": [0, 1, 6, 7], "set_valu": [0, 1, 2, 4, 6, 7], "seten": [0, 1, 6, 7], "setmodel": [0, 1, 6, 7], "setup_cmap_menu": [0, 1, 6, 7], "sever": 2, "sh": [4, 5], "shall": [2, 4], "shape": [2, 4, 9], "share": [0, 1, 2, 4], "shift": 4, "should": [2, 4, 9, 20], "show": [2, 3, 4, 7, 11, 12, 13, 14, 15, 16, 17, 18], "show_colormap": [0, 1, 3, 6, 7], "shown": [2, 4, 9], "side": 4, "signal": 7, "silverman": 4, "simpl": [1, 2, 4, 5, 7, 9, 16, 17, 20], "simple2dbas": [0, 1, 4], "simple2dplott": [0, 1, 4, 5, 16], "simpleplot2d": [0, 1, 4], "simpleplotterbas": [0, 1, 4, 5], "simplevectorplot": [0, 1, 4], "simplevectorplott": [0, 1, 4, 5, 17], "simpli": [2, 4, 20], "simultan": 4, "sinc": 4, "singl": [2, 4], "size": [2, 4, 7], "sizehint": [0, 1, 6, 7], "slice": 5, "slight": 4, "small": [2, 4], "smaller": [2, 4, 5], "solid": 4, "some": [2, 3, 4], "someth": 4, "sommer": 19, "sourc": [4, 19, 20], "space": 4, "spdx": 19, "special": [2, 4], "specif": [2, 4, 7], "specifi": [2, 3, 4, 5, 9], "speed": 4, "spin": 7, "stack": [4, 9], "stai": 19, "stand": 4, "standard": [2, 3, 4, 7, 9], "start_upd": 4, "state": 19, "static": [3, 7, 8], "statsmodel": 4, "statusbar": 9, "std": [4, 5], "step": 7, "store": [2, 4], "str": [2, 3, 4, 5, 7], "stream": [3, 4], "streamplot": 3, "strenum": [0, 1, 5], "strftime": [2, 4], "string": [2, 3, 4, 5, 7, 8], "style": 4, "subclass": 2, "subdict": 2, "submodul": 0, "subpackag": 0, "subplot": 2, "subproject": 2, "subtract": 4, "suitabl": [3, 4, 7], "summari": [5, 11, 12, 13, 14, 15, 16, 17, 18], "support": [4, 9], "suptitl": 2, "sure": [2, 4], "sv": [4, 5], "switch": [4, 6, 8, 9], "switch2fmtbutton": [0, 1, 6], "sym": [0, 1, 4, 5], "sym_lim": [0, 1, 4, 5], "symbol": 4, "symlog": [0, 1, 4, 5, 7, 9], "symlognorm": 7, "symmetr": [4, 9], "symmetriclimit": [0, 1, 4], "system": 2, "t": [2, 4, 19], "t2m": 3, "tabl": [3, 7], "taken": 4, "task": [1, 19], "tell": 4, "temp": 4, "templat": 9, "ten": 4, "tenth": 4, "test": [3, 4, 5, 9], "text": [0, 1, 2, 4, 5, 6, 7, 8], "textbas": [0, 1, 2, 4], "texts_to_remov": 2, "th": 4, "than": [2, 4, 5, 9], "thei": [3, 4, 9, 21], "them": [4, 11, 12, 13, 14, 15, 16, 17, 18], "therefor": 4, "thi": [2, 3, 4, 5, 6, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 21], "third": 4, "those": 4, "through": [8, 21], "ti": 19, "tick": [4, 5, 7, 9], "tick_param": 4, "ticker": 4, "ticklabel": [0, 1, 4], "ticklabelsbas": [0, 1, 4], "tickpropsbas": [0, 1, 4], "ticksbas": [0, 1, 4], "ticksiz": [0, 1, 4, 5], "ticksizebas": [0, 1, 4], "ticksmanag": [0, 1, 4], "ticksmanagerbas": [0, 1, 4], "ticksmethod": [0, 1, 5], "ticksopt": [0, 1, 4], "tickstyp": [0, 1, 5], "ticksvalid": [0, 1, 5], "tickweight": [0, 1, 4, 5], "tickweightbas": [0, 1, 4], "tight": [0, 1, 2, 5], "tight_layout": 2, "time": [2, 4], "tinfo": [2, 4, 5], "titl": [0, 1, 2, 4, 5, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19], "titleprop": [0, 1, 2, 5, 8], "titles": [0, 1, 2, 5], "titlesplott": [0, 1, 2], "titleweight": [0, 1, 2, 5], "to_rgba": 7, "todefault": [2, 4], "toggle_bold": [0, 1, 6, 8], "toggle_color_button": [0, 1, 6, 7], "toggle_ital": [0, 1, 6, 8], "toggle_txt_step": [0, 1, 6, 7], "top": [4, 5], "total": 4, "transform": [0, 1, 2, 4], "transpar": [2, 4], "transpos": [0, 1, 4, 5], "tri": 9, "tricontour": 9, "tricontourf": 9, "tripcolor": 4, "triplot": 4, "true": [2, 3, 4, 5, 7, 8], "try_and_error": [0, 1, 5], "tune": 19, "tupl": [2, 4], "two": [2, 4, 7], "ty": 19, "type": [3, 5, 7, 8, 11, 12, 13, 14, 15, 16, 17, 18, 19], "u": [3, 4, 19], "u_var": [5, 12, 17], "ultralight": [2, 4], "unchang": [3, 7], "under": [9, 19], "undo": 2, "unevenli": 3, "uniform": [4, 5, 9], "uniqu": 4, "unit": [2, 4, 5], "unstruct": 4, "unstructur": [4, 9, 19], "up": 4, "updat": [0, 1, 2, 4, 9, 19], "update_after_plot": [0, 1, 4], "update_axi": [0, 1, 4], "update_colorbar": [0, 1, 4], "upper": [2, 4], "ur": 19, "url": 19, "us": [2, 3, 4, 5, 7, 8, 9, 11, 12, 13, 14, 15, 16, 17, 18, 19], "usag": 7, "use_qt": 3, "use_raw_data": [0, 1, 4], "user": 4, "usual": [2, 4], "v": [3, 4], "v_var": [5, 12, 17], "val": [4, 5, 8], "valid": [2, 3, 4, 5, 7], "validate_alpha": [0, 1, 5], "validate_axiscolor": [0, 1, 5], "validate_bool_maybe_non": [0, 1, 5], "validate_cbarpo": [0, 1, 5], "validate_cmap": [0, 1, 5], "validate_dataarrai": [0, 1, 5], "validate_err_calc": [0, 1, 5], "validate_float": [0, 1, 5], "validate_fontweight": [0, 1, 5], "validate_it": [0, 1, 5], "validate_legend": [0, 1, 5], "validate_limit": [0, 1, 5], "validate_lineplot": [0, 1, 5], "validate_mark": [0, 1, 5], "validate_non": [0, 1, 5], "validate_plot": [0, 1, 5], "validate_str": [0, 1, 5], "validate_sym_lim": [0, 1, 5], "validate_text": [0, 1, 5], "validate_ticklabel": [0, 1, 5], "validateinstr": 5, "validatelist": [0, 1, 5], "valu": [2, 3, 4, 5, 7, 9], "value2pickl": [0, 1, 4], "value2shar": [0, 1, 4], "valueerror": [3, 5], "valuemaskbas": [0, 1, 2], "variabl": [2, 4, 9], "variableswher": 4, "vbound": [0, 1, 4, 5], "vcbar": [0, 1, 4, 5], "vcbarspac": [0, 1, 4, 5], "vclabel": [0, 1, 4, 5], "vclabelprop": [0, 1, 4, 5], "vclabels": [0, 1, 4, 5], "vclabelweight": [0, 1, 4, 5], "vcmap": [0, 1, 4, 5], "vctick": [0, 1, 4, 5], "vcticklabel": [0, 1, 4, 5], "vctickprop": [0, 1, 4, 5], "vcticksiz": [0, 1, 4, 5], "vctickweight": [0, 1, 4, 5], "vector": [4, 5, 12], "vectorbound": [0, 1, 4], "vectorcalcul": [0, 1, 4], "vectorcbar": [0, 1, 4], "vectorcolor": [0, 1, 4], "vectorctick": [0, 1, 4], "vectordatagrid": [0, 1, 4], "vectorlinewidth": [0, 1, 4], "vectorplot": [0, 1, 4], "vectorplott": 4, "verbos": [2, 4], "version": [3, 5, 7, 9, 19, 20], "vertic": 4, "via": [2, 3, 4, 7, 9, 11, 12, 13, 14, 15, 16, 17, 18, 20], "violin": [4, 5, 18], "violinplot": [0, 1, 4, 5], "violinplott": [0, 1, 4, 5, 18], "violinxlim": [0, 1, 4], "violinxtick": [0, 1, 4], "violinxticklabel": [0, 1, 4], "violinylim": [0, 1, 4], "violinytick": [0, 1, 4], "violinyticklabel": [0, 1, 4], "viridi": 5, "visual": [1, 2, 3, 4, 5, 19], "vmax": [0, 1, 4, 5, 7, 9], "vmin": [0, 1, 4, 5, 7, 9], "volum": 19, "vplot": [0, 1, 4, 5], "w": [4, 7], "wa": 9, "wai": 4, "want": [4, 20], "we": [2, 4, 9, 20], "weakref": 4, "websit": 19, "week": [0, 1, 4, 5], "weight": [2, 4, 8], "weights_mpl2qt": 8, "weird": 4, "what": [2, 4], "when": [2, 4, 5], "where": [2, 4, 5], "whether": [2, 4], "which": [0, 1, 2, 4, 5, 9], "white": 4, "white_blue_r": 5, "whole": [2, 4], "whose": 4, "widget": [0, 1, 2, 3, 4, 5, 7, 8], "width": [0, 1, 4, 5], "wind": 4, "winter": 5, "without": 4, "wonder": 4, "word": 4, "www": [4, 19], "x": [2, 3, 4, 5, 9, 14], "xa": 3, "xarrai": [2, 4, 19], "xbound": [0, 1, 4], "xcoord": [0, 1, 4], "xlabel": [0, 1, 4, 5, 8], "xlabelprop": 4, "xlabels": 4, "xlabelweight": 4, "xlim": [0, 1, 4, 5, 9], "xlim2d": [0, 1, 4], "xmax": 4, "xmin": 4, "xname": [2, 4], "xr": [2, 4], "xrang": [0, 1, 4, 5], "xrotat": [0, 1, 4, 5], "xtick": [0, 1, 4, 5, 9], "xticklabel": [0, 1, 4, 5], "xtickprop": [0, 1, 4, 5], "xticks2d": [0, 1, 4], "xx": [2, 4], "xxi": 4, "xytickplott": [0, 1, 4], "y": [2, 3, 4, 5, 9, 14], "yaml": 19, "ybound": [0, 1, 4], "ycoord": [0, 1, 4], "year": [0, 1, 4, 5, 19], "yearbegin": [0, 1, 4, 5], "yearend": [0, 1, 4, 5], "yellow": 4, "yet": 19, "ylabel": [0, 1, 4, 5], "ylabelprop": 4, "ylabels": 4, "ylabelweight": 4, "ylim": [0, 1, 4, 5, 9], "ylim2d": [0, 1, 4], "you": [2, 4, 9, 19, 20], "your": [2, 4, 5, 18], "yourreferenceher": 19, "yrang": [0, 1, 4, 5], "yrotat": [0, 1, 4, 5], "ytick": [0, 1, 4, 5, 9], "yticklabel": [0, 1, 4, 5], "ytickprop": [0, 1, 4, 5], "yticks2d": [0, 1, 4], "z": [2, 4], "zenodo": 19, "zentrum": 19, "zero": 4}, "titles": ["API Reference", "psy_simple package", "Possible types", "<no title>", "Possible types", "<no title>", "psy_simple.widgets package", "<no title>", "<no title>", "Changelog", "Contribution and development hints", "psyplot.project.plot.barplot", "psyplot.project.plot.combined", "psyplot.project.plot.density", "psyplot.project.plot.fldmean", "psyplot.project.plot.lineplot", "psyplot.project.plot.plot2d", "psyplot.project.plot.vector", "psyplot.project.plot.violinplot", "Welcome to psy-simple\u2019s documentation!", "Installation", "psyplot plot methods"], "titleterms": {"": 19, "0": 9, "1": 9, "2": 9, "3": 9, "4": 9, "5": 9, "ad": 9, "api": 0, "barplot": 11, "chang": 9, "changelog": 9, "cite": 19, "combin": 12, "conda": 20, "content": 19, "contribut": 10, "densiti": 13, "develop": [10, 20], "document": 19, "fix": 9, "fldmean": 14, "hint": 10, "how": 19, "indic": 19, "inform": 19, "instal": 20, "issu": 9, "known": 9, "licens": 19, "lineplot": 15, "method": 21, "packag": [1, 6], "pip": 20, "plot": [11, 12, 13, 14, 15, 16, 17, 18, 21], "plot2d": 16, "possibl": [2, 4], "project": [11, 12, 13, 14, 15, 16, 17, 18], "psy": 19, "psy_simpl": [1, 6], "psyplot": [11, 12, 13, 14, 15, 16, 17, 18, 21], "refer": 0, "simpl": 19, "softwar": 19, "submodul": [1, 6], "subpackag": 1, "tabl": 19, "thi": 19, "type": [2, 4], "us": 20, "v1": 9, "vector": 17, "violinplot": 18, "welcom": 19, "widget": 6}}) \ No newline at end of file diff --git a/setup.py b/setup.py deleted file mode 100644 index 45bdb4cc..00000000 --- a/setup.py +++ /dev/null @@ -1,12 +0,0 @@ -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -# -# SPDX-License-Identifier: CC0-1.0 - -"""Setup script for the psy-simple package.""" -import versioneer -from setuptools import setup - -setup( - version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), -) diff --git a/tests/_base_testing.py b/tests/_base_testing.py deleted file mode 100644 index 3a7cd9f5..00000000 --- a/tests/_base_testing.py +++ /dev/null @@ -1,152 +0,0 @@ -"""Base test setup for the psy-simple test suite.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import subprocess as spr -import sys -import time -from unittest import TestCase - -import numpy as np - -test_dir = os.path.dirname(__file__) - -ref_dir = os.getenv( - "PSYPLOT_REFERENCES", os.path.join(test_dir, "reference_figures") -) -output_dir = os.getenv( - "PSYPLOT_TESTFIGURES", os.path.join(test_dir, "test_figures") -) - -# check if the seaborn version is smaller than 0.8 (without actually importing -# it), due to https://github.com/mwaskom/seaborn/issues/966 -# If so, disable the import of it when import psyplot.project -try: - sns_version = spr.check_output( - [sys.executable, "-c", "import seaborn; print(seaborn.__version__)"] - ) -except spr.CalledProcessError: # seaborn is not installed - sns_version = None -else: - sns_version = sns_version.decode("utf-8") - - -class PsyPlotTestCase(TestCase): - """Base class for testing the psyplot package. It only provides some - useful methods to compare figures""" - - longMessage = True - - plot_type = None - - grid_type = None - - ncfile = os.path.join(test_dir, "test-t2m-u-v.nc") - - @classmethod - def tearDownClass(cls): - import psyplot - from psyplot.config.rcsetup import defaultParams - - psyplot.rcParams.update( - **{key: val[0] for key, val in defaultParams.items()} - ) - - @classmethod - def create_dirs(cls): - if not os.path.exists(ref_dir): - os.makedirs(ref_dir) - if not os.path.exists(output_dir): - os.makedirs(output_dir) - cls.odir = output_dir - - def get_ref_file(self, identifier): - """ - Gives the name of the reference file for a test - - This staticmethod gives combines the given `plot_type`, `identifier` - and `grid_type` to form the name of a reference figure - - Parameters - ---------- - identifier: str - The unique identifier for the plot (usually the formatoption name) - - Returns - ------- - str - The basename of the reference file""" - identifiers = ["test"] - if self.plot_type is not None: - identifiers.append(self.plot_type) - identifiers.append(identifier) - if self.grid_type is not None: - identifiers.append(self.grid_type) - return "_".join(identifiers) + ".png" - - def compare_figures(self, fname, tol=5, **kwargs): - """Saves and compares the figure to the reference figure with the same - name""" - import matplotlib.pyplot as plt - from matplotlib.testing.compare import compare_images - - plt.savefig(os.path.join(self.odir, fname), **kwargs) - try: - results = compare_images( - os.path.join(ref_dir, fname), - os.path.join(self.odir, fname), - tol=tol, - ) - except Exception: - # output file might be empty because not yet written, so just try - # again - time.sleep(3) - results = compare_images( - os.path.join(ref_dir, fname), - os.path.join(self.odir, fname), - tol=tol, - ) - self.assertIsNone(results, msg=results) - - def assertAlmostArrayEqual( - self, actual, desired, rtol=1e-07, atol=0, msg=None, **kwargs - ): - """Asserts that the two given arrays are almost the same - - This method uses the :func:`numpy.testing.assert_allclose` function - to compare the two given arrays. - - Parameters - ---------- - actual : array_like - Array obtained. - desired : array_like - Array desired. - rtol : float, optional - Relative tolerance. - atol : float, optional - Absolute tolerance. - equal_nan : bool, optional. - If True, NaNs will compare equal. - err_msg : str, optional - The error message to be printed in case of failure. - verbose : bool, optional - If True, the conflicting values are appended to the error message. - """ - try: - np.testing.assert_allclose( - actual, - desired, - rtol=rtol, - atol=atol, - err_msg=msg or "", - **kwargs, - ) - except AssertionError as e: - self.fail(str(e)) diff --git a/tests/circumpolar_test.nc b/tests/circumpolar_test.nc deleted file mode 100644 index 158aee5d..00000000 Binary files a/tests/circumpolar_test.nc and /dev/null differ diff --git a/tests/circumpolar_test.nc.license b/tests/circumpolar_test.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/circumpolar_test.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/conftest.py b/tests/conftest.py deleted file mode 100644 index 7551df3d..00000000 --- a/tests/conftest.py +++ /dev/null @@ -1,29 +0,0 @@ -"""pytest configuration module for psy-simple.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -def pytest_addoption(parser): - group = parser.getgroup("psyplot", "psyplot specific options") - group.addoption( - "--ref", - help="Create reference figures instead of running the tests", - action="store_true", - ) - - -def pytest_configure(config): - from PIL import ImageFile - - if config.getoption("ref"): - import unittest - - unittest.TestLoader.testMethodPrefix = "ref" - - # make PIL load truncated images to avoid OSErrors in a parallelized - # setup - ImageFile.LOAD_TRUNCATED_IMAGES = True diff --git a/tests/icon_edge_test.nc b/tests/icon_edge_test.nc deleted file mode 100644 index d946e040..00000000 Binary files a/tests/icon_edge_test.nc and /dev/null differ diff --git a/tests/icon_edge_test.nc.license b/tests/icon_edge_test.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/icon_edge_test.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/icon_test.nc b/tests/icon_test.nc deleted file mode 100644 index f1f7e060..00000000 Binary files a/tests/icon_test.nc and /dev/null differ diff --git a/tests/icon_test.nc.license b/tests/icon_test.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/icon_test.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/rotated-pole-test.nc b/tests/rotated-pole-test.nc deleted file mode 100644 index 0b0ff18f..00000000 Binary files a/tests/rotated-pole-test.nc and /dev/null differ diff --git a/tests/rotated-pole-test.nc.license b/tests/rotated-pole-test.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/rotated-pole-test.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/simple_triangular_grid_si0.nc b/tests/simple_triangular_grid_si0.nc deleted file mode 100644 index 6614f1a5..00000000 Binary files a/tests/simple_triangular_grid_si0.nc and /dev/null differ diff --git a/tests/simple_triangular_grid_si0.nc.license b/tests/simple_triangular_grid_si0.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/simple_triangular_grid_si0.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/test-t2m-u-v.nc b/tests/test-t2m-u-v.nc deleted file mode 100644 index 7594fafc..00000000 Binary files a/tests/test-t2m-u-v.nc and /dev/null differ diff --git a/tests/test-t2m-u-v.nc.license b/tests/test-t2m-u-v.nc.license deleted file mode 100644 index 919c9c1e..00000000 --- a/tests/test-t2m-u-v.nc.license +++ /dev/null @@ -1,3 +0,0 @@ -SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH - -SPDX-License-Identifier: CC0-1.0 diff --git a/tests/test_barplot.py b/tests/test_barplot.py deleted file mode 100755 index 042be337..00000000 --- a/tests/test_barplot.py +++ /dev/null @@ -1,157 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import unittest - -import _base_testing as bt -import matplotlib.colors as mcol -import numpy as np -import psyplot.project as psy -import test_lineplot as tl -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import BarPlotter - - -class BarPlotterTest(tl.LinePlotterTest): - """Test class for :class:`psy_simple.plotters.BarPlotter`""" - - plot_type = "bar" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=[0, 1], z=0, t=0, name=cls.var, auto_update=True - ) - cls.plotter = BarPlotter(cls.data) - cls.create_dirs() - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.barplot( - self.ncfile, name=name, t=0, z=0, y=[0, 1], **kwargs - ) - - @unittest.skip("No need for figure creation") - def ref_xticks(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_area(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_areax(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked_transposed(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def test_plot_area(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_areax(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked_transposed(self, close=True): - pass - - def ref_plot(self, close=True): - """Create the reference figure for the stacked plot""" - sp = self.plot(plot="stacked") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("stacked"))) - sp2 = self.plot(plot="stacked", transpose=True) - sp2.export( - os.path.join(bt.ref_dir, self.get_ref_file("stacked_transposed")) - ) - if close: - sp.close(True, True, True) - sp2.close(True, True, True) - - def test_plot(self, *args): - """Test the stacked plot""" - self.update(plot="stacked") - self.compare_figures(next(iter(args), self.get_ref_file("stacked"))) - self.update(plot="stacked", transpose=True) - self.compare_figures( - next(iter(args), self.get_ref_file("stacked_transposed")) - ) - - def test_xticks(self, *args): - self._test_DtTicksBase() - - def _test_DtTicksBase(self, *args): - data = InteractiveList.from_dataset( - self.data[0].psy.base, - y=[0, 1], - z=0, - x=0, - name=self.var, - auto_update=True, - ) - plotter = self.plotter.__class__(data) - ax = plotter.ax - plotter.update(xticklabels="%m") - self.assertListEqual( - ax.get_xticks().astype(int).tolist(), list(range(5)) - ) - - def test_color(self): - colors = ["y", "g"][: len(self.data)] - current_colors = [ - c[0].get_facecolor() for c in self.plotter.ax.containers - ] - self.update(color=colors) - - self.assertEqual( - [c[0].get_facecolor() for c in self.plotter.ax.containers], - list(map(mcol.colorConverter.to_rgba, colors)), - ) - self.update(color=None) - self.assertEqual( - [c[0].get_facecolor() for c in self.plotter.ax.containers], - current_colors, - ) - - def test_ylim(self): - """Test ylim formatoption""" - curr_lim = self.plotter.ax.get_ylim() - self.update(ylim=(-1, 300)) - self.assertEqual(self.plotter.ax.get_ylim(), (-1, 300)) - self.update(ylim=(-1, "rounded")) - self.assertEqual(self.plotter.ax.get_ylim(), (-1, curr_lim[1])) - self.update(ylim=(0, ["minmax", 75])) - data = self.data.to_dataframe() - arr = data[data.notnull()].values - self.assertAlmostArrayEqual( - self.plotter.ax.get_ylim(), [0, np.percentile(arr, 75)] - ) diff --git a/tests/test_barplot_data.py b/tests/test_barplot_data.py deleted file mode 100755 index d585ab09..00000000 --- a/tests/test_barplot_data.py +++ /dev/null @@ -1,58 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os - -import _base_testing as bt -import psyplot.project as psy -import test_barplot as tb -import test_lineplot as tl -from psyplot import rcParams - -from psy_simple.plotters import BarPlotter - - -class BarPlotterDataTest(tb.BarPlotterTest): - """TestCase of :class:`psy_simple.plotters.BarPlotter` with widhts=='data'""" - - plot_type = "bar_data" - - @classmethod - def setUpClass(cls): - plotter = BarPlotter() - rcParams[plotter.widths.default_key] = "data" - super().setUpClass() - - def test_ylim(self): - """Test ylim formatoption""" - tl.LinePlotterTest.test_ylim(self) - - def _test_DtTicksBase(self, *args): - tl.LinePlotterTest._test_DtTicksBase(self, *args) - - def ref_xticks(self, close=True): - """Create reference file for xticks formatoption - - Create reference file for - :attr:`~psy_simple.plotters.BarPlotter.xticks` - formatoption""" - sp = psy.plot.barplot( - self.ncfile, - name=self.var, - lon=0, - lev=0, - lat=[0, 1], - xticklabels={"major": "%m", "minor": "%d"}, - xtickprops={"pad": 7.0}, - xticks={"minor": "week", "major": "month"}, - ) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("xticks"))) - if close: - sp.close(True, True) diff --git a/tests/test_barplot_single.py b/tests/test_barplot_single.py deleted file mode 100755 index cf686a5e..00000000 --- a/tests/test_barplot_single.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import psyplot.project as psy -import test_barplot as tb -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import BarPlotter - - -class SingleBarPlotterTest(tb.BarPlotterTest): - """Test of :class:`psy_simple.plotters.ViolinPlotter` with a single array - instead of an InteractiveList""" - - plot_type = "singlebar" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=0, z=0, t=0, name=cls.var, auto_update=True - ) - cls.data[0].psy.arr_name = "arr0" - cls.data.psy.arr_name = "arr0" - cls.plotter = BarPlotter(cls.data[0]) - cls.create_dirs() - - @classmethod - def tearDown(cls): - cls.data[0].psy.update(t=0, todefault=True, replot=True) - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.barplot( - self.ncfile, name=name, t=0, z=0, y=0, **kwargs - ) - - @unittest.skip("""Not possible for single array""") - def test_plot(self, *args): - pass - - @unittest.skip("Appending not possible for single line") - def test_append_data(self): - pass diff --git a/tests/test_base.py b/tests/test_base.py deleted file mode 100755 index d4c0d0d1..00000000 --- a/tests/test_base.py +++ /dev/null @@ -1,198 +0,0 @@ -"""Test module of the :mod:`psyplot.plotter.baseplotter` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest -from itertools import chain - -import _base_testing as bt -import matplotlib as mpl -import matplotlib.colors as mcol -import matplotlib.pyplot as plt -import numpy as np -import psyplot -from psyplot import InteractiveList, open_dataset - -from psy_simple.base import BasePlotter - -if mpl.__version__ >= "1.5" and mpl.__version__ < "2.1": - from matplotlib.font_manager import weight_dict - - bold = weight_dict["bold"] -else: - bold = "bold" - - -class BasePlotterTest(bt.PsyPlotTestCase): - """Test :class:`psyplot.plotter.baseplotter.BasePlotter` class""" - - var = "t2m" - - masking_val = 250 - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=[0, 1], z=0, t=0, name=cls.var, auto_update=True - ) - cls.plotter = BasePlotter(cls.data) - - @classmethod - def tearDownClass(cls): - super(BasePlotterTest, cls).tearDownClass() - cls.ds.close() - plt.close(cls.plotter.ax.get_figure().number) - - def tearDown(self): - self.data.psy.update(t=0, todefault=True, replot=True) - - def update(self, *args, **kwargs): - """Update the plotter of this instance""" - self.plotter.update(*args, **kwargs) - - def _label_test(self, key, label_func, has_time=True): - kwargs = { - key: "Test plot at %Y-%m-%d, {tinfo} o'clock of %(long_name)s" - } - self.update(**kwargs) - t_str = "1979-01-31, 18:00" if has_time else "%Y-%m-%d, %H:%M" - self.assertEqual( - "Test plot at %s o'clock of %s" - % (t_str, self.data.attrs.get("long_name", "Temperature")), - label_func().get_text(), - ) - self.data.psy.update(t=1) - t_str = "1979-02-28, 18:00" if has_time else "%Y-%m-%d, %H:%M" - self.assertEqual( - "Test plot at %s o'clock of %s" - % (t_str, self.data.attrs.get("long_name", "Temperature")), - label_func().get_text(), - ) - self.data.psy.update(t=0) - - def test_title(self): - """Test title, titlesize, titleweight, titleprops formatoptions""" - - def get_title(): - return self.plotter.ax.title - - self._label_test("title", get_title) - self.update( - titlesize=22, titleweight="bold", titleprops={"ha": "left"} - ) - self.assertEqual(get_title().get_size(), 22) - self.assertEqual(get_title().get_weight(), bold) - self.assertEqual(get_title().get_ha(), "left") - - def test_background(self): - self.update(background="0.5") - bc = mcol.to_rgba(self.plotter.ax.patch.get_facecolor()) - self.assertEqual(bc, (0.5, 0.5, 0.5, 1.0)) - - def test_figtitle(self): - """Test figtitle, figtitlesize, figtitleweight, figtitleprops - formatoptions""" - - def get_figtitle(): - fig = plt.gcf() - for text in fig.texts: - if text.get_position() == (0.5, 0.98): - return text - - self._label_test("figtitle", get_figtitle) - self.update( - figtitlesize=22, - figtitleweight="bold", - figtitleprops={"ha": "left"}, - ) - self.assertEqual(get_figtitle().get_size(), 22) - self.assertEqual(get_figtitle().get_weight(), bold) - self.assertEqual(get_figtitle().get_ha(), "left") - - def test_text(self): - """Test text formatoption""" - - def get_default_text(): - for text in chain(*self.plotter.text._texts.values()): - if text.get_position() == tuple( - psyplot.rcParams["texts.default_position"] - ): - return text - - self._label_test("text", get_default_text) - self.update(text=(0.5, 0.5, "%(name)s", "fig", {"fontsize": 16})) - for t in self.plotter.text._texts["fig"]: - if t.get_position() == (0.5, 0.5): - text = t - break - else: - text = False - self.assertTrue(text is not False) - if not text: - return - self.assertEqual(text.get_text(), getattr(self.data, "name", self.var)) - self.assertEqual(text.get_fontsize(), 16) - - def test_maskgreater(self): - """Test maskgreater formatoption""" - self.update(maskgreater=self.masking_val) - for arr in self.plotter.maskgreater.iter_data: - self.assertLessEqual(arr.max().values, self.masking_val) - - def test_maskgeq(self): - """Test maskgeq formatoption""" - self.update(maskgeq=self.masking_val) - for arr in self.plotter.maskgeq.iter_data: - self.assertLessEqual(arr.max().values, self.masking_val) - - def test_maskless(self): - """Test maskless formatoption""" - self.update(maskless=self.masking_val) - for arr in self.plotter.maskless.iter_data: - self.assertGreaterEqual(arr.min().values, self.masking_val) - - def test_maskleq(self): - """Test maskleq formatoption""" - self.update(maskleq=self.masking_val) - for arr in self.plotter.maskleq.iter_data: - self.assertGreaterEqual(arr.min().values, self.masking_val) - - def test_maskbetween(self): - """Test maskbetween formatoption""" - self.update(maskbetween=[self.masking_val, self.masking_val + 1]) - for arr in self.plotter.maskbetween.iter_data: - data = arr.values[~np.isnan(arr.values)] - self.assertLessEqual( - data[data < self.masking_val + 1].max(), self.masking_val - ) - self.assertGreaterEqual( - data[data > self.masking_val].max(), self.masking_val + 1 - ) - - -class TestBase2D(object): - """Test :class:`psyplot.plotter.baseplotter.BasePlotter` class without time - and vertical dimension""" - - def _label_test(self, key, label_func, has_time=False): - return super(TestBase2D, self)._label_test( - key, label_func, has_time=has_time - ) - - -class BasePlotterTest2D(TestBase2D, BasePlotterTest): - """Test :class:`psyplot.plotter.baseplotter.BasePlotter` class without time - and vertical dimension""" - - var = "t2m_2d" - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_colors.py b/tests/test_colors.py deleted file mode 100644 index df7f92d6..00000000 --- a/tests/test_colors.py +++ /dev/null @@ -1,70 +0,0 @@ -"""Test the :mod:`psy_simple.colors` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import _base_testing as bt -import matplotlib.pyplot as plt -import six - -import psy_simple.colors as psyc - - -class TestShowColormaps(unittest.TestCase): - """Test the :func:`psy_simple.colors.show_colormaps` function""" - - def setUp(self): - plt.close("all") - - def tearDown(self): - plt.close("all") - - def test_all(self): - """Test the display of all colormaps""" - fig = psyc.show_colormaps(use_qt=False) - self.assertEqual(fig.number, 1) - self.assertGreater(len(fig.axes), 15) - - def test_some(self): - """Test the display of a selection of colormaps""" - cmap = plt.get_cmap("Reds") - fig = psyc.show_colormaps( - ["jet", cmap, "red_white_blue"], use_qt=False - ) - self.assertEqual(fig.number, 1) - self.assertEqual(len(fig.axes), 3) - - @unittest.skipIf( - six.PY2 or (bt.sns_version is not None and bt.sns_version < "0.8"), - "Not implemented TestCase method" if six.PY2 else "Crashed by seaborn", - ) - def test_warning_similar(self): - """Test the display of a warning of a slightly misspelled cmap""" - with self.assertWarnsRegex(UserWarning, "Similar colormaps"): - fig = psyc.show_colormaps("jett", use_qt=False) - self.assertEqual(fig.number, 1) - self.assertEqual(len(fig.axes), 0) - - @unittest.skipIf( - six.PY2 or (bt.sns_version is not None and bt.sns_version < "0.8"), - "Not implemented TestCase method" if six.PY2 else "Crashed by seaborn", - ) - def test_warning_unknown(self): - """Test the display of a warning of a completely unknown cmap""" - with self.assertWarnsRegex( - UserWarning, "Run function without arguments" - ): - fig = psyc.show_colormaps("asdfkj", use_qt=False) - self.assertEqual(fig.number, 1) - self.assertEqual(len(fig.axes), 0) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_combined.py b/tests/test_combined.py deleted file mode 100644 index 3c8017f9..00000000 --- a/tests/test_combined.py +++ /dev/null @@ -1,423 +0,0 @@ -"""Test module for the CombinedSimplePlotter.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import re -import unittest -from functools import wraps -from itertools import chain - -import _base_testing as bt -import numpy as np -import psyplot.project as psy -import six -import test_base as tb -import test_plot2d as t2d -import test_vector as tv -from psyplot import ArrayList, open_dataset, rcParams -from psyplot.utils import _TempBool - -from psy_simple.plotters import CombinedSimplePlotter, mpl_version - -bold = tb.bold - - -def _do_from_both(func): - """Call the given `func` only from :class:`t2d.Simple2DPlotterTest` and - :class:`tv.SimpleVectorPlotterTest`""" - func.__doc__ = getattr(tv.SimpleVectorPlotterTest, func.__name__).__doc__ - - @wraps(func) - def wrapper(self, *args, **kwargs): - getattr(t2d.Simple2DPlotterTest, func.__name__)(self, *args, **kwargs) - if hasattr(self, "plotter"): - self.plotter.update(todefault=True) - with self.vector_mode: - getattr(tv.SimpleVectorPlotterTest, func.__name__)( - self, *args, **kwargs - ) - - return wrapper - - -def _in_vector_mode(func): - """Call the given `func` only from :class:`tv.SimpleVectorPlotterTest`""" - func.__doc__ = getattr(tv.SimpleVectorPlotterTest, func.__name__).__doc__ - - @wraps(func) - def wrapper(self, *args, **kwargs): - with self.vector_mode: - getattr(tv.SimpleVectorPlotterTest, func.__name__)( - self, *args, **kwargs - ) - - return wrapper - - -class _CombinedPlotterData(object): - """Descriptor that returns the data""" - - # Note: We choose to use a descriptor rather than a usual property because - # it shall also work for class objects and not only instances - - def __get__(self, instance, owner): - if instance is None: - return owner._data - if instance.vector_mode: - return instance._data[1] - return instance._data[0] - - def __set__(self, instance, value): - instance._data = value - - -class CombinedSimplePlotterTest(tv.SimpleVectorPlotterTest): - """Test case for vector plot of - :class:`psy_simple.plotters.CombinedSimplePlotter`""" - - plot_type = "simplecombined" - - data = _CombinedPlotterData() - - var = ["t2m", ["u", "v"]] - - @property - def vector_mode(self): - """:class:`bool` indicating whether a vector specific formatoption is - tested or not""" - try: - return self._vector_mode - except AttributeError: - self._vector_mode = _TempBool(False) - return self._vector_mode - - @vector_mode.setter - def vector_mode(self, value): - self.vector_mode.value = bool(value) - - def compare_figures(self, fname, **kwargs): - kwargs.setdefault("tol", 10) - return super(CombinedSimplePlotterTest, self).compare_figures( - fname, **kwargs - ) - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - plotter = CombinedSimplePlotter() - rcParams[plotter.vcmap.default_key] = "winter" - cls._data = ArrayList.from_dataset( - cls.ds, - t=0, - z=0, - name=[cls.var], - auto_update=True, - prefer_list=True, - )[0] - for i in range(len(cls.data)): - cls._data[i] = cls._data[i].psy.sel( - lon=slice(0, 69.0), lat=slice(81.0, 34.0) - ) - cls._data.attrs["long_name"] = "Temperature" - cls._data.attrs["name"] = "t2m" - cls.plotter = CombinedSimplePlotter(cls.data) - cls.create_dirs() - cls._color_fmts = cls.plotter.fmt_groups["colors"] - - # there is an issue with the colorbar that the size of the axes changes - # slightly after replotting. Therefore we force a replot here - cls.plotter.update(color="absolute") - cls.plotter.update(todefault=True, replot=True) - - def tearDown(self): - self._data.psy.update(t=0, todefault=True, replot=True) - - def plot(self, **kwargs): - color_fmts = psy.plot.vector.plotter_cls().fmt_groups["colors"] - fix_colorbar = not color_fmts.intersection(kwargs) - ds = psy.open_dataset(self.ncfile) - kwargs.setdefault("t", ds.time.values[0]) - kwargs.setdefault("z", ds.lev.values[0]) - kwargs.setdefault("x", slice(0, 69.0)) - kwargs.setdefault("y", slice(81.0, 34.0)) - kwargs.setdefault("method", "sel") - kwargs.setdefault("color", "absolute") - if self.vector_mode: - kwargs = self._rename_fmts(kwargs) - sp = psy.plot.combined(ds, name=[self.var], **kwargs) - if not self.vector_mode or fix_colorbar: - # if we have no color formatoptions, we have to consider that - # the position of the plot may have slighty changed - sp.update( - todefault=True, - replot=True, - **dict(item for item in kwargs.items() if item[0] != "color"), - ) - return sp - - def _rename_fmts(self, kwargs): - def check_key(key): - if not any(re.match("v" + key, fmt) for fmt in vcolor_fmts): - return key - else: - return "v" + key - - vcolor_fmts = { - fmt - for fmt in chain( - psy.plot.combined.plotter_cls().fmt_groups["colors"], - ["ctick|clabel"], - ) - if fmt.startswith("v") - } - return {check_key(key): val for key, val in kwargs.items()} - - def update(self, *args, **kwargs): - if self.vector_mode and ( - self._color_fmts.intersection(kwargs) - or any(re.match("ctick|clabel", fmt) for fmt in kwargs) - ): - kwargs.setdefault("color", "absolute") - kwargs = self._rename_fmts(kwargs) - super(tv.SimpleVectorPlotterTest, self).update(*args, **kwargs) - - def get_ref_file(self, identifier): - if self.vector_mode: - identifier += "_vector" - return super(CombinedSimplePlotterTest, self).get_ref_file(identifier) - - @property - def _minmax_cticks(self): - if not self.vector_mode: - return np.round( - np.linspace( - self.plotter.plot_data[0].values.min(), - self.plotter.plot_data[0].values.max(), - 11, - endpoint=True, - ), - decimals=2, - ).tolist() - speed = ( - self.plotter.plot_data[1].values[0] ** 2 - + self.plotter.plot_data[1].values[1] ** 2 - ) ** 0.5 - return np.round( - np.linspace(speed.min(), speed.max(), 11, endpoint=True), - decimals=2, - ).tolist() - - @_do_from_both - def ref_cbar(self, close=True): - pass - - def ref_cbarspacing(self, close=True): - """Create reference file for cbarspacing formatoption""" - kwargs = dict( - bounds=list(range(245, 255)) - + np.linspace(255, 280, 6, endpoint=True).tolist() - + list(range(281, 290)) - ) - sp = self.plot(cbarspacing="proportional", cticks="rounded", **kwargs) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("cbarspacing"))) - with self.vector_mode: - tv.SimpleVectorPlotterTest.ref_cbarspacing(self, close=close) - if close: - sp.close(True, True) - - @_do_from_both - def ref_cmap(self, close=True): - pass - - def ref_miss_color(self, close=True): - t2d.Simple2DPlotterTest.ref_miss_color(self, close) - - @_in_vector_mode - def ref_arrowsize(self, *args, **kwargs): - pass - - def _label_test(self, key, label_func, has_time=True): - kwargs = { - key: "Test plot at %Y-%m-%d, {tinfo} o'clock of %(long_name)s" - } - self.update(**kwargs) - t_str = "1979-01-31, 18:00" if has_time else "%Y-%m-%d, %H:%M" - self.assertEqual( - "Test plot at %s o'clock of %s" - % (t_str, self.data.attrs.get("long_name", "Temperature")), - label_func().get_text(), - ) - self._data.psy.update(t=1) - t_str = "1979-02-28, 18:00" if has_time else "%Y-%m-%d, %H:%M" - self.assertEqual( - "Test plot at %s o'clock of %s" - % (t_str, self.data.attrs.get("long_name", "Temperature")), - label_func().get_text(), - ) - self._data.psy.update(t=0) - - def test_miss_color(self, *args, **kwargs): - t2d.Simple2DPlotterTest.test_miss_color(self, *args, **kwargs) - - @_do_from_both - def test_cbar(self, *args, **kwargs): - pass - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_cbarspacing(self, *args, **kwargs): - """Test cbarspacing formatoption""" - self.update( - cbarspacing="proportional", - cticks="rounded", - bounds=list(range(245, 255)) - + np.linspace(255, 280, 6, endpoint=True).tolist() - + list(range(281, 290)), - ) - self.compare_figures( - next(iter(args), self.get_ref_file("cbarspacing")) - ) - self.plotter.update(todefault=True) - with self.vector_mode: - tv.SimpleVectorPlotterTest.test_cbarspacing(self, *args, **kwargs) - - @_do_from_both - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_cmap(self, *args, **kwargs): - pass - - @unittest.skipIf( - six.PY34, "The axes size changes using the arrowsize formatoption" - ) - @_in_vector_mode - def test_arrowsize(self): - pass - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_bounds(self): - """Test bounds formatoption""" - # test bounds of scalar field - self.assertEqual( - np.round(self.plotter.bounds.norm.boundaries, 2).tolist(), - np.linspace(250, 290, 11, endpoint=True).tolist(), - ) - self.update(bounds="minmax") - bounds = [ - 251.73, - 255.54, - 259.35, - 263.16, - 266.97, - 270.78, - 274.59, - 278.4, - 282.22, - 286.03, - 289.84, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(250, 290, 5, endpoint=True), - atol=1e-2, - ) - - # test vector bounds - self.update(color="absolute") - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, - np.linspace(0, 15, 11, endpoint=True), - atol=1e-2, - ) - self.update(vbounds="minmax") - bounds = [ - 0.36, - 1.4, - 2.45, - 3.49, - 4.54, - 5.59, - 6.63, - 7.68, - 8.72, - 9.77, - 10.81, - ] - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(vbounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, - np.linspace(1.0, 8.5, 5, endpoint=True), - atol=1e-3, - ) - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_clabel(self): - def get_clabel(): - return self.plotter.vcbar.cbars["b"].ax.xaxis.get_label() - - t2d.Simple2DPlotterTest.test_clabel(self) - with self.vector_mode: - self.update(color="absolute") - self._label_test("vclabel", get_clabel) - label = get_clabel() - self.update( - vclabelsize=22, - vclabelweight="bold", - vclabelprops={"ha": "left"}, - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - -class CombinedSimplePlotterTest2D(tb.TestBase2D, CombinedSimplePlotterTest): - """Test :class:`psy_simple.plotters.CombinedSimplePlotter` class without - time and vertical dimension""" - - var = ["t2m", ["u_2d", "v_2d"]] - - def _label_test(self, key, label_func, has_time=None): - if has_time is None: - has_time = not bool(self.vector_mode) - CombinedSimplePlotterTest._label_test( - self, key, label_func, has_time=has_time - ) - - -# skip the reference creation functions of the 2D Plotter tests -skip_msg = ( - "Reference figures for this class are created by the " - "CombinedSimplePlotterTest" -) - -for funcname in filter( - lambda s: s.startswith("ref"), dir(CombinedSimplePlotterTest2D) -): - setattr( - CombinedSimplePlotterTest2D, - funcname, - unittest.skip(skip_msg)(lambda self: None), - ) diff --git a/tests/test_combined_icon.py b/tests/test_combined_icon.py deleted file mode 100644 index a24aa1ea..00000000 --- a/tests/test_combined_icon.py +++ /dev/null @@ -1,169 +0,0 @@ -"""Test module for the combined simple plotter for the icon grid.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import unittest - -import _base_testing as bt -import numpy as np -import psyplot.project as psy -import test_combined as tc -from psyplot import ArrayList, open_dataset, rcParams -from test_plot2d_icon import IconTestMixin - -from psy_simple.plotters import CombinedSimplePlotter, mpl_version - - -class IconCombinedSimplePlotterTest( - IconTestMixin, tc.CombinedSimplePlotterTest -): - """Test :class:`psy_simple.plotters.CombinedSimplePlotter` class for icon - grid - """ - - grid_type = "icon" - - ncfile = os.path.join(bt.test_dir, "icon_test.nc") - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - plotter = CombinedSimplePlotter() - rcParams[plotter.vcmap.default_key] = "winter" - cls._data = ArrayList.from_dataset( - cls.ds, - t=0, - z=0, - name=[cls.var], - auto_update=True, - prefer_list=True, - )[0] - cls._data.attrs["long_name"] = "Temperature" - cls._data.attrs["name"] = "t2m" - cls.plotter = CombinedSimplePlotter(cls.data) - cls.create_dirs() - cls._color_fmts = cls.plotter.fmt_groups["colors"] - - # there is an issue with the colorbar that the size of the axes changes - # slightly after replotting. Therefore we force a replot here - cls.plotter.update(color="absolute") - cls.plotter.update(todefault=True, replot=True) - - def plot(self, **kwargs): - color_fmts = psy.plot.vector.plotter_cls().fmt_groups["colors"] - fix_colorbar = not color_fmts.intersection(kwargs) - ds = psy.open_dataset(self.ncfile) - kwargs.setdefault("color", "absolute") - if self.vector_mode: - kwargs = self._rename_fmts(kwargs) - sp = psy.plot.combined(ds, name=[self.var], **kwargs) - if not self.vector_mode or fix_colorbar: - # if we have no color formatoptions, we have to consider that - # the position of the plot may have slighty changed - sp.update( - todefault=True, - replot=True, - **dict(item for item in kwargs.items() if item[0] != "color"), - ) - return sp - - @unittest.skip( - "Density for quiver plots of unstructered data is not " "supported!" - ) - def ref_density(self): - pass - - @unittest.skip( - "Density for quiver plots of unstructered data is not " "supported!" - ) - def test_density(self): - pass - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_bounds(self): - """Test bounds formatoption""" - # test bounds of scalar field - self.assertEqual( - np.round(self.plotter.bounds.norm.boundaries, 2).tolist(), - np.linspace(240, 310, 11, endpoint=True).tolist(), - ) - self.update(bounds="minmax") - bounds = [ - 243.76, - 250.04, - 256.31, - 262.58, - 268.85, - 275.12, - 281.39, - 287.66, - 293.94, - 300.21, - 306.48, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(255, 305, 5, endpoint=True), - atol=1e-2, - ) - - # test vector bounds - self.update(color="absolute") - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, - np.linspace(0, 15, 11, endpoint=True), - atol=1e-2, - ) - self.update(vbounds="minmax") - bounds = [ - 0.08, - 1.18, - 2.28, - 3.38, - 4.48, - 5.59, - 6.69, - 7.79, - 8.89, - 9.99, - 11.09, - ] - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(vbounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.vbounds.norm.boundaries, - np.linspace(0.5, 9.0, 5, endpoint=True), - atol=1e-2, - ) - - @property - def _minmax_cticks(self): - if not self.vector_mode: - arr = self.plotter.plot_data[0].values - arr = arr[~np.isnan(arr)] - return np.round( - np.linspace(arr.min(), arr.max(), 11, endpoint=True), - decimals=2, - ).tolist() - arr = self.plotter.plot_data[1].values - speed = (arr[0] ** 2 + arr[1] ** 2) ** 0.5 - speed = speed[~np.isnan(speed)] - return np.round( - np.linspace(speed.min(), speed.max(), 11, endpoint=True), - decimals=2, - ).tolist() diff --git a/tests/test_density.py b/tests/test_density.py deleted file mode 100644 index 3a63cb9a..00000000 --- a/tests/test_density.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Test module for the density plotter.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import _base_testing as bt -import matplotlib.pyplot as plt -import numpy as np -import pandas as pd -import xarray as xr - -from psy_simple.plotters import DensityPlotter - - -class DensityPlotterTest(bt.PsyPlotTestCase): - """Test of the :class:`psy_simple.plotters.DensityPlotter` class""" - - @classmethod - def setUpClass(cls): - cls.data = cls.define_data() - cls.plotter = DensityPlotter(cls.data) - - @classmethod - def tearDownClass(cls): - super(DensityPlotterTest, cls).tearDownClass() - del cls.data - plt.close(cls.plotter.ax.get_figure().number) - - def tearDown(self): - self.plotter.update(todefault=True) - - @classmethod - def update(cls, **kwargs): - """Update the plotter of this test case""" - cls.plotter.update(**kwargs) - - @property - def plot_data(self): - return self.plotter.plot_data - - @classmethod - def define_data(cls, mean=[0, 0], cov=[[10, 0], [0, 10]]): - x, y = np.random.multivariate_normal(mean, cov, 5000).T - df = pd.DataFrame(y, columns=["y"], index=pd.Index(x, name="x")) - ds = xr.Dataset.from_dataframe(df) - ds["v"] = xr.Variable(("x",), x) - ret = xr.DataArray(ds.y) - ret.psy.init_accessor(base=ds) - return ret - - def test_bins(self): - """Test the bins formatoption""" - bins = [100, 10] - self.update(bins=bins) - self.assertEqual(len(self.plot_data.x), 100) - self.assertEqual(len(self.plot_data.y), 10) - - def test_xrange(self): - """Test the xrange formatoption""" - data = self.data - xrange = np.percentile(data.x.values, [25, 75]) - self.update(xrange=xrange) - self.assertGreaterEqual(self.plot_data.x.min(), xrange[0]) - self.assertLessEqual(self.plot_data.x.max(), xrange[1]) - - # now update to use the quantiles explicitely - self.update(xrange=(["minmax", 25], ["minmax", 75])) - self.assertGreaterEqual(self.plot_data.x.min(), xrange[0]) - self.assertLessEqual(self.plot_data.x.max(), xrange[1]) - - def test_yrange(self): - """Test the yrange formatoption""" - data = self.data - yrange = np.percentile(data.values, [25, 75]) - self.update(yrange=yrange) - self.assertGreaterEqual(self.plot_data.y.min(), yrange[0]) - self.assertLessEqual(self.plot_data.y.max(), yrange[1]) - - # now update to use the quantiles explicitely - self.update(yrange=(["minmax", 25], ["minmax", 75])) - self.assertGreaterEqual(self.plot_data.y.min(), yrange[0]) - self.assertLessEqual(self.plot_data.y.max(), yrange[1]) - - def test_normed(self): - """Test the normed formatoption""" - self.update(normed="counts") - data = self.plot_data - self.assertAlmostEqual(data.values.sum(), 1.0) - - self.update(normed="area") - data = self.plot_data - a0, a1 = data.x.values[:2] - b0, b1 = data.y.values[:2] - area = (a1 - a0) * (b1 - b0) - self.assertAlmostEqual((self.plot_data.values * area).sum(), 1.0) - - def test_coord(self): - """Test whether we can use an alternative coordinate""" - self.update(coord="v", xlabel="%(name)s") - self.assertEqual( - self.plotter.ax.get_xlabel(), - "v", - msg="Did not update to the right coordinate!", - ) diff --git a/tests/test_density_kde.py b/tests/test_density_kde.py deleted file mode 100644 index 65a29ccc..00000000 --- a/tests/test_density_kde.py +++ /dev/null @@ -1,31 +0,0 @@ -"""Test module for the density plotter.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import test_density as td -from psyplot import rcParams - -from psy_simple.plotters import DensityPlotter - - -class DensityPlotterTestKDE(td.DensityPlotterTest): - """Test of the :class:`psy_simple.plotters.DensityPlotter` class - with kde plot""" - - @classmethod - def setUpClass(cls): - plotter = DensityPlotter() - rcParams[plotter.density.default_key] = "kde" - super().setUpClass() - - @unittest.skip("Not implemented for KDE plots!") - def test_normed(self): - pass diff --git a/tests/test_fldmean.py b/tests/test_fldmean.py deleted file mode 100644 index 74c3f25f..00000000 --- a/tests/test_fldmean.py +++ /dev/null @@ -1,174 +0,0 @@ -"""Test module for the fldmean plotter.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest -from itertools import chain - -import matplotlib.pyplot as plt -import numpy as np -import psyplot.project as psy -import test_base as tb -import test_lineplot as tl -import xarray as xr -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import FldmeanPlotter - -bold = tb.bold - - -class FldmeanPlotterTest(tl.LinePlotterTest): - """Test of the :class:`psy_simple.plotters.FldmeanPlotter` class""" - - plot_type = "fldmean" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, t=[0, 1], name=cls.var, auto_update=True - ) - cls.plotter = FldmeanPlotter(cls.data) - cls.create_dirs() - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.fldmean(self.ncfile, name=name, t=[0, 1], **kwargs) - - @classmethod - def tearDown(cls): - cls.data.psy.update(todefault=True, replot=True) - - def test_coord(self): - """Test whether we can use an alternative coordinate""" - coord = xr.DataArray( - np.arange(len(self.data[0])), name="test", dims=("test",) - ) - self.update(coord=coord, xlabel="%(name)s") - self.assertEqual( - self.plotter.ax.get_xlabel(), - "test", - msg="Did not update to the right coordinate!", - ) - - def _label_test(self, key, label_func, has_time=False): - kwargs = {key: "Test plot for %(name)s"} - self.update(**kwargs) - self.assertEqual(label_func().get_text(), "Test plot for " + self.var) - - def test_legend(self, *args): - """Test legend and legendlabels formatoption""" - args = iter(args) - self.update(legend=False) - self.assertIsNone(self.plotter.ax.legend_) - self.update( - legend={ - "loc": "upper center", - "bbox_to_anchor": (0.5, -0.05), - "ncol": 2, - } - ) - self.compare_figures(next(args, self.get_ref_file("legend"))) - self.update(legendlabels="%m") - self.assertAlmostArrayEqual( - [float(t.get_text()) for t in plt.gca().legend_.get_texts()], - [ - da.expand_dims("time").time.to_index().month[0] - for da in self.data - ], - ) - - def test_xticks(self): - """Test xticks, xticklabels, xtickprops formatoptions""" - self.update(xticks=["data", 2]) - ax = plt.gca() - if isinstance(self.data, InteractiveList): - data = self.data[0] - else: - data = self.data - - lev = data.lev.values[::-1] - - self.assertEqual(list(ax.get_xticks()), list(lev[::2])) - self.update(xticks=["mid", 2]) - - self.assertEqual( - list(ax.get_xticks()), list((lev[:-1] + lev[1:]) / 2.0)[::2] - ) - self.update(xticks="rounded") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(20000.0, 100000.0, 11, endpoint=True).tolist(), - ) - self.update(xticks="roundedsym") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-100000, 100000, 10, endpoint=True).tolist(), - ) - self.update(xticks="minmax") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(lev.min(), lev.max(), 11, endpoint=True).tolist(), - ) - self.update(xticks="sym") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-lev.max(), lev.max(), 10, endpoint=True).tolist(), - ) - - def test_ticksize(self): - """Tests ticksize formatoption""" - self.update(ticksize=24) - ax = self.plotter.ax - self.assertTrue( - all( - t.get_size() == 24 - for t in chain(ax.get_xticklabels(), ax.get_yticklabels()) - ) - ) - self.update( - ticksize={"major": 12, "minor": 10}, xtickprops={"pad": 7.0} - ) - self.assertTrue( - all( - t.get_size() == 12 - for t in chain(ax.get_xticklabels(), ax.get_yticklabels()) - ) - ) - self.assertTrue( - all(t.get_size() == 10 for t in ax.get_xticklabels(minor=True)) - ) - - def test_xlabel(self): - """Test xlabel formatoption""" - self.update(xlabel="{desc}") - label = self.plotter.ax.xaxis.get_label() - self.assertEqual(label.get_text(), "pressure [Pa]") - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_ylim(self, test_pctls=False): - super(FldmeanPlotterTest, self).test_ylim(test_pctls) - - @unittest.skip("nan not supported for icon contour") - def test_mask_01_var(self): - pass - - @unittest.skip("nan not supported for icon contour") - def test_mask_02_da(self): - pass - - @unittest.skip("nan not supported for icon contour") - def test_mask_03_fname(self): - pass diff --git a/tests/test_fldmean_icon.py b/tests/test_fldmean_icon.py deleted file mode 100644 index 8532a995..00000000 --- a/tests/test_fldmean_icon.py +++ /dev/null @@ -1,69 +0,0 @@ -"""Test module for the fldmean plotter for icon grids.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import unittest - -import _base_testing as bt -import matplotlib.pyplot as plt -import psyplot.project as psy -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import FldmeanPlotter - -try: - from cdo import Cdo - - Cdo() -except Exception: - with_cdo = False -else: - with_cdo = True - - -@unittest.skipIf(not with_cdo, "CDOs are required for unstructured grids.") -class IconFldmeanPlotterTest(bt.PsyPlotTestCase): - plot_type = "fldmean" - - grid_type = "icon" - - ncfile = os.path.join(bt.test_dir, "icon_test.nc") - - var = "t2m" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, z=[0, 1], name=cls.var, auto_update=True - ) - cls.plotter = FldmeanPlotter(cls.data) - cls.create_dirs() - - def ref_plot(self, close=True): - """Basic reference plot""" - sp = psy.plot.fldmean(self.ncfile, name=self.var, z=[0, 1]) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("basic"))) - if close: - sp.close(True, True) - - @classmethod - def tearDown(cls): - cls.data.psy.update(todefault=True, replot=True) - - @classmethod - def tearDownClass(cls): - super(IconFldmeanPlotterTest, cls).tearDownClass() - cls.ds.close() - plt.close(cls.plotter.ax.get_figure().number) - - def test_plot(self): - """Test whether it can be plotted""" - self.compare_figures(self.get_ref_file("basic")) diff --git a/tests/test_lineplot.py b/tests/test_lineplot.py deleted file mode 100755 index ffd2776f..00000000 --- a/tests/test_lineplot.py +++ /dev/null @@ -1,681 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import sys -import tempfile -import unittest -from itertools import chain - -import _base_testing as bt -import matplotlib as mpl -import matplotlib.colors as mcol -import matplotlib.pyplot as plt -import numpy as np -import psyplot.project as psy -import test_base as tb -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import LinePlotter, mpl_version - -bold = tb.bold - - -class LinePlotterTest(tb.BasePlotterTest): - """Test class for :class:`psy_simple.plotters.LinePlotter`""" - - plot_type = "line" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=[0, 1], z=0, t=0, name=cls.var, auto_update=True - ) - cls.plotter = LinePlotter(cls.data) - cls.create_dirs() - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.lineplot( - self.ncfile, name=name, t=0, z=0, y=[0, 1], **kwargs - ) - - @unittest.skipIf( - mpl_version == 3.3, - "Updating grids is known to malfunction for matplotlib 3.3!", - ) - def ref_grid(self, close=True): - """Create reference file for grid formatoption - - Create reference file for - :attr:`~psy_simple.plotters.LinePlotter.grid` - formatoption""" - sp = self.plot() - sp.update(grid=True) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("grid1"))) - sp.update(grid="b") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("grid2"))) - if close: - sp.close(True, True) - - def ref_transpose(self, close=True): - """Create reference file for transpose formatoption - - Create reference file for - :attr:`~psy_simple.plotters.LinePlotter.transpose` - formatoption""" - sp = self.plot() - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("transpose1"))) - sp.update(transpose=True) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("transpose2"))) - if close: - sp.close(True, True) - - def ref_legend(self, close=True): - """Create reference file for legend formatoption - - Create reference file for - :attr:`~psy_simple.plotters.LinePlotter.legend` - formatoption""" - sp = self.plot( - legend={ - "loc": "upper center", - "bbox_to_anchor": (0.5, -0.05), - "ncol": 2, - } - ) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("legend"))) - if close: - sp.close(True, True) - - def ref_xticks(self, close=True): - """Create reference file for xticks formatoption - - Create reference file for - :attr:`~psy_simple.plotters.LinePlotter.xticks` - formatoption""" - sp = psy.plot.lineplot( - self.ncfile, - name=self.var, - lon=0, - lev=0, - lat=[0, 1], - xticklabels={"major": "%m", "minor": "%d"}, - xtickprops={"pad": 7.0}, - xticks={"minor": "week", "major": "month"}, - ) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("xticks"))) - if close: - sp.close(True, True) - - def ref_plot_area(self, close=True): - """Create reference file for plot formatoption with ``'area'``""" - sp = self.plot(plot="area") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("plot_area"))) - if close: - sp.close(True, True) - - def ref_plot_areax(self, close=True): - """Create reference file for plot formatoption with ``'areax'``""" - sp = self.plot(plot="areax", transpose=True) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("plot_areax"))) - if close: - sp.close(True, True) - - def ref_plot_None(self, close=True): - sp = self.plot(plot=["--", None]) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("plot_None"))) - if close: - sp.close(True, True) - - def ref_plot_stacked(self, close=True): - """Create reference file for plot formatoption with ``'areax'``""" - sp = self.plot(plot="stacked") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("plot_stacked"))) - if close: - sp.close(True, True) - - def ref_plot_stacked_transposed(self, close=True): - """Create reference file for plot formatoption with ``'areax'``""" - sp = self.plot(plot="stacked", transpose=True) - sp.export( - os.path.join( - bt.ref_dir, self.get_ref_file("plot_stacked_transposed") - ) - ) - if close: - sp.close(True, True) - - def test_plot_area(self, *args): - """Test plot formatoption with ``'areax'``""" - self.update(plot="area") - self.compare_figures(next(iter(args), self.get_ref_file("plot_area"))) - - def test_plot_areax(self, *args): - """Test plot formatoption with ``'areax'``""" - self.update(plot="areax", transpose=True) - self.compare_figures(next(iter(args), self.get_ref_file("plot_areax"))) - - def test_plot_None(self, *args): - """Test excluding one specific line""" - self.update(plot=["--", None]) - self.compare_figures(next(iter(args), self.get_ref_file("plot_None"))) - - def test_plot_stacked(self, *args): - """Test plot formatoption with ``'areax'``""" - self.update(plot="stacked") - self.compare_figures( - next(iter(args), self.get_ref_file("plot_stacked")) - ) - - def test_mask_01_var(self): - def get_data(data): - if isinstance(data, InteractiveList): - return data[0] - else: - return data - - data = get_data(self.data) - mask = data.copy(data=np.ones_like(data, dtype=bool)) - mask[..., 3] = False - data.psy.base["mask"] = mask - try: - self.update(mask="mask") - self.assertTrue( - np.all(get_data(self.plotter.plot_data).isnull()[..., 3]) - ) - finally: - del data.psy.base["mask"] - - def test_mask_02_da(self): - def get_data(data): - if isinstance(data, InteractiveList): - return data[0] - else: - return data - - data = get_data(self.data) - mask = data.copy(data=np.ones_like(data, dtype=bool)) - mask[..., 3] = False - self.update(mask=mask) - self.assertTrue( - np.all(get_data(self.plotter.plot_data).isnull()[..., 3]) - ) - - @unittest.skipIf(sys.platform == "win32", "Skipped due to tempfile issue.") - def test_mask_03_fname(self): - def get_data(data): - if isinstance(data, InteractiveList): - return data[0] - else: - return data - - data = get_data(self.data) - mask = data.copy(data=np.ones_like(data, dtype=bool)) - mask[..., 3] = False - with tempfile.TemporaryDirectory(prefix="psyplot_") as tmpdir: - maskfile = os.path.join(tmpdir, "mask.nc") - mask.drop_vars(set(mask.coords) - set(mask.dims)).to_netcdf( - maskfile - ) - self.update(mask=maskfile) - self.assertTrue( - np.all(get_data(self.plotter.plot_data).isnull()[..., 3]) - ) - - def test_append_data(self): - """Test appending new data to the list""" - - def get_color(artist): - try: - ret = artist.get_color() - except AttributeError: - try: - ret = artist.get_facecolor() - except AttributeError: - ret = artist[0].get_facecolor() - return mcol.to_rgba(ret) - - data = self.data - n = len(data) - self.assertEqual(len(self.plotter.plot_data), n) - old_c = mcol.to_rgba(self.plotter.color.colors[-1]) - self.assertEqual(get_color(self.plotter.plot._plot[-1]), old_c) - - try: - # append data - new = data[-1].psy.copy() - data.append(new, new_name=True) - self.assertEqual(len(data), n + 1) - self.plotter.update(replot=True) - self.assertEqual(len(self.plotter.plot_data), n + 1) - c = mcol.to_rgba(self.plotter.color.colors[-1]) - self.assertNotEqual(c, old_c) - self.assertEqual(get_color(self.plotter.plot._plot[-1]), c) - - # remove data again - data.pop(-1) - self.plotter.update(replot=True) - self.assertEqual(len(self.plotter.plot_data), n) - self.assertEqual(get_color(self.plotter.plot._plot[-1]), old_c) - - # append data again - data.append(new, new_name=True) - self.plotter.update(replot=True) - self.assertEqual(len(self.plotter.plot_data), n + 1) - self.assertEqual(get_color(self.plotter.plot._plot[-1]), c) - finally: - if len(data) > n: - data.pop(-1) - - def test_plot_stacked_transposed(self, *args): - """Test plot formatoption with ``'areax'``""" - self.update(plot="stacked", transpose=True) - self.compare_figures( - next(iter(args), self.get_ref_file("plot_stacked_transposed")) - ) - - def test_coord(self): - """Test whether we can use an alternative coordinate""" - self.update(coord="v", xlabel="%(name)s") - self.assertEqual( - self.plotter.ax.get_xlabel(), - "v", - msg="Did not update to the right coordinate!", - ) - - @unittest.skipIf( - mpl_version == 3.3, - "Updating grids is known to malfunction for matplotlib 3.3!", - ) - def test_grid(self, *args): - """Test grid formatoption""" - args = iter(args) - self.update(grid=True) - self.compare_figures(next(args, self.get_ref_file("grid1"))) - self.update(grid="b") - self.compare_figures(next(args, self.get_ref_file("grid2"))) - - def test_xlabel(self): - """Test xlabel formatoption""" - self.update(xlabel="{desc}") - label = self.plotter.ax.xaxis.get_label() - self.assertEqual(label.get_text(), "longitude [degrees_east]") - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_ylabel(self): - """Test ylabel formatoption""" - self.update(ylabel="{desc}") - label = self.plotter.ax.yaxis.get_label() - self.assertEqual(label.get_text(), "Temperature [K]") - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_xlim(self): - """Test xlim formatoption""" - curr_lim = self.plotter.ax.get_xlim() - self.update(xlim=(-1, 300)) - self.assertEqual(self.plotter.ax.get_xlim(), (-1, 300)) - self.update(xlim=(-1, "rounded")) - self.assertEqual(self.plotter.ax.get_xlim(), (-1, curr_lim[1])) - - def test_ylim(self, test_pctls=True): - """Test ylim formatoption""" - curr_lim = self.plotter.ax.get_ylim() - self.update(ylim=(-1, 300)) - self.assertEqual(self.plotter.ax.get_ylim(), (-1, 300)) - self.update(ylim=(-1, "rounded")) - self.assertEqual(self.plotter.ax.get_ylim(), (-1, curr_lim[1])) - if test_pctls: - self.update(ylim=(["minmax", 25], ["minmax", 75])) - data = self.data.to_dataframe() - arr = data[data.notnull()].values - self.assertAlmostArrayEqual( - self.plotter.ax.get_ylim(), - np.percentile(arr, [25, 75]).tolist(), - ) - - def test_sym_lims(self): - ax = self.plotter.ax - xrange = ax.get_xlim() - yrange = ax.get_ylim() - mins = [min(xrange[0], yrange[0]), min(xrange[1], yrange[1])] - maxs = [max(xrange[0], yrange[0]), max(xrange[1], yrange[1])] - - self.update(sym_lims="min") - self.assertEqual(ax.get_xlim()[0], mins[0]) - self.assertEqual(ax.get_xlim()[1], mins[1]) - self.assertEqual(ax.get_ylim()[0], mins[0]) - self.assertEqual(ax.get_ylim()[1], mins[1]) - - self.update(sym_lims="max") - self.assertEqual(ax.get_xlim()[0], maxs[0]) - self.assertEqual(ax.get_xlim()[1], maxs[1]) - self.assertEqual(ax.get_ylim()[0], maxs[0]) - self.assertEqual(ax.get_ylim()[1], maxs[1]) - - self.update(sym_lims=["min", "max"]) - self.assertEqual(ax.get_xlim()[0], mins[0]) - self.assertEqual(ax.get_xlim()[1], maxs[1]) - self.assertEqual(ax.get_ylim()[0], mins[0]) - self.assertEqual(ax.get_ylim()[1], maxs[1]) - - self.update(sym_lims=[None, "max"]) - self.assertEqual(ax.get_xlim()[0], xrange[0]) - self.assertEqual(ax.get_xlim()[1], maxs[1]) - self.assertEqual(ax.get_ylim()[0], yrange[0]) - self.assertEqual(ax.get_ylim()[1], maxs[1]) - - def test_color(self): - colors = ["y", "g"][: len(self.data)] - current_colors = [line.get_color() for line in self.plotter.ax.lines] - self.update(color=colors) - self.assertEqual( - [line.get_color() for line in self.plotter.ax.lines], colors - ) - self.update(color=None) - self.assertEqual( - [line.get_color() for line in self.plotter.ax.lines], - current_colors, - ) - - def test_transpose(self, *args): - """Test transpose formatoption""" - args = iter(args) - self.compare_figures(next(args, self.get_ref_file("transpose1"))) - self.update(transpose=True) - self.compare_figures(next(args, self.get_ref_file("transpose2"))) - - def test_legend(self, *args): - """Test legend and legendlabels formatoption""" - args = iter(args) - self.update(legend=False) - self.assertIsNone(self.plotter.ax.legend_) - self.update( - legend={ - "loc": "upper center", - "bbox_to_anchor": (0.5, -0.05), - "ncol": 2, - } - ) - self.compare_figures(next(args, self.get_ref_file("legend"))) - self.update(legendlabels="%(lat)s") - self.assertAlmostArrayEqual( - [float(t.get_text()) for t in plt.gca().legend_.get_texts()], - [da.lat.values for da in self.data], - ) - - def test_xticks(self, *args): - """Test xticks, xticklabels, xtickprops formatoptions""" - self._test_DataTicksCalculator() - self._test_DtTicksBase(*args) - - _max_rounded_ref = 400 - - def _test_DataTicksCalculator(self): - # testing of psy_simple.plotters.DataTicksCalculator - self.update(xticks=["data", 2]) - ax = plt.gca() - if isinstance(self.data, InteractiveList): - data = self.data[0] - else: - data = self.data - - lon = data.lon.values - - self.assertEqual(list(ax.get_xticks()), list(lon[::2])) - self.update(xticks=["mid", 2]) - - self.assertEqual( - list(ax.get_xticks()), list((lon[:-1] + lon[1:]) / 2.0)[::2] - ) - self.update(xticks="rounded") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(0, self._max_rounded_ref, 11, endpoint=True).tolist(), - ) - self.update(xticks="roundedsym") - self.assertEqual( - list(ax.get_xticks()), - np.linspace( - -self._max_rounded_ref, - self._max_rounded_ref, - 10, - endpoint=True, - ).tolist(), - ) - self.update(xticks="minmax") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(lon.min(), lon.max(), 11, endpoint=True).tolist(), - ) - self.update(xticks="sym") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-lon.max(), lon.max(), 10, endpoint=True).tolist(), - ) - - # apparently matplotlib changed how they numerically represent the - # date ticks. Therefore we enable multiple options. - ref_dt_vals = { - "month": [ - {3361.25, 3331.75, 3422.25, 3391.75}, - {722494.75, 722524.25, 722554.75, 722585.25}, - ], - "monthbegin": [ - {722450.75, 722481.75, 722509.75, 722540.75, 722570.75, 722601.75}, - {3438.75, 3407.75, 3377.75, 3346.75, 3318.75, 3287.75}, - ], - "monthend": [ - {722480.75, 722508.75, 722539.75, 722569.75, 722600.75}, - {3437.75, 3406.75, 3376.75, 3345.75, 3317.75}, - ], - "week": { - 722487.75, - 722494.75, - 722501.75, - 722508.75, - 722515.75, - 722522.75, - 722529.75, - 722536.75, - 722543.75, - 722550.75, - 722557.75, - 722564.75, - 722571.75, - 722578.75, - 722585.75, - 722592.75, - 722599.75, - }, - } - - def _test_DtTicksBase(self, *args): - # testing of psy_simple.plotters.DtTicksBase - args = iter(args) - data = InteractiveList.from_dataset( - self.data[0].psy.base, - y=[0, 1], - z=0, - x=0, - name=self.var, - auto_update=True, - ) - plotter = self.plotter.__class__(data) - ax = plotter.ax - xticks = {"major": ax.get_xticks(), "minor": ax.get_xticks(minor=True)} - plotter.update(xticks="month") - self.assertIn(set(ax.get_xticks()), self.ref_dt_vals["month"]) - plotter.update(xticks="monthbegin") - self.assertIn(set(ax.get_xticks()), self.ref_dt_vals["monthbegin"]) - plotter.update(xticks="monthend") - self.assertIn(set(ax.get_xticks()), self.ref_dt_vals["monthend"]) - plotter.update(xticks="month", xticklabels="%m") - # sometimes the labels are only set after drawing - if ax.get_xticklabels()[0].get_text(): - self.assertEqual( - [int(t.get_text()) for t in ax.get_xticklabels()[:]], - list(range(2, 6)), - ) - plotter.update( - xticks={"minor": "week"}, - xticklabels={"minor": "%d"}, - xtickprops={"pad": 7.0}, - ) - ticks = np.asarray(ax.get_xticks(minor=True)) - self.assertLessEqual( - set(ticks[(ticks >= 722487.75) & (ticks <= 722599.75)].tolist()), - self.ref_dt_vals["week"], - ) - self.compare_figures(next(args, self.get_ref_file("xticks"))) - plotter.update(xticks={"major": None, "minor": None}) - self.assertEqual(list(ax.get_xticks()), list(xticks["major"])) - self.assertEqual( - list(ax.get_xticks(minor=True)), list(xticks["minor"]) - ) - - def test_tick_rotation(self): - """Test xrotation and yrotation formatoption""" - self.update(xrotation=90, yrotation=90) - self.assertTrue( - all( - t.get_rotation() == 90 - for t in self.plotter.ax.get_xticklabels() - ) - ) - self.assertTrue( - all( - t.get_rotation() == 90 - for t in self.plotter.ax.get_yticklabels() - ) - ) - - def test_ticksize(self): - """Tests ticksize formatoption""" - self.update(ticksize=24) - ax = self.plotter.ax - self.assertTrue( - all( - t.get_size() == 24 - for t in chain(ax.get_xticklabels(), ax.get_yticklabels()) - ) - ) - self.update( - xticks={"major": ["data", 40], "minor": ["data", 10]}, - ticksize={"major": 12, "minor": 10}, - xtickprops={"pad": 7.0}, - ) - self.assertTrue( - all( - t.get_size() == 12 - for t in chain(ax.get_xticklabels(), ax.get_yticklabels()) - ) - ) - self.assertTrue( - all(t.get_size() == 10 for t in ax.get_xticklabels(minor=True)) - ) - - def test_axiscolor(self): - """Test axiscolor formatoption""" - ax = self.plotter.ax - positions = ["top", "right", "left", "bottom"] - # test updating all to red - self.update(axiscolor="red") - self.assertEqual( - ["red"] * 4, - list(self.plotter["axiscolor"].values()), - "Edgecolors are not red but " - + ", ".join(self.plotter["axiscolor"].values()), - ) - # test updating all to the default setup - self.update(axiscolor=None) - for pos in positions: - error = "Edgecolor ({0}) is not the default color ({1})!".format( - ax.spines[pos].get_edgecolor(), mpl.rcParams["axes.edgecolor"] - ) - self.assertEqual( - mpl.colors.colorConverter.to_rgba( - mpl.rcParams["axes.edgecolor"] - ), - ax.spines[pos].get_edgecolor(), - msg=error, - ) - error = "Linewidth ({0}) is not the default width ({1})!".format( - ax.spines[pos].get_linewidth(), mpl.rcParams["axes.linewidth"] - ) - self.assertEqual( - mpl.rcParams["axes.linewidth"], - ax.spines[pos].get_linewidth(), - msg=error, - ) - # test updating only one spine - self.update(axiscolor={"top": "red"}) - self.assertEqual( - (1.0, 0.0, 0.0, 1.0), - ax.spines["top"].get_edgecolor(), - msg="Axiscolor ({0}) has not been updated".format( - ax.spines["top"].get_edgecolor() - ), - ) - self.assertGreater( - ax.spines["top"].get_linewidth(), 0.0, "Line width of axis is 0!" - ) - for pos in positions[1:]: - error = "Edgecolor ({0}) is not the default color ({1})!".format( - ax.spines[pos].get_edgecolor(), mpl.rcParams["axes.edgecolor"] - ) - self.assertEqual( - mpl.colors.colorConverter.to_rgba( - mpl.rcParams["axes.edgecolor"] - ), - ax.spines[pos].get_edgecolor(), - msg=error, - ) - - -class LinePlotterTest2D(tb.TestBase2D, LinePlotterTest): - """Test :class:`psy_simple.plotters.LinePlotter` class without - time and vertical dimension""" - - var = "t2m_2d" - - def test_xticks(self, *args): - """Test xticks, xticklabels, xtickprops formatoptions""" - self._test_DataTicksCalculator() - - def test_coord(self): - """Test whether we can use an alternative coordinate""" - self.update(coord="v_2d", xlabel="%(name)s") - self.assertEqual( - self.plotter.ax.get_xlabel(), - "v_2d", - msg="Did not update to the right coordinate!", - ) - - -# skip the reference creation functions of the 2D Plotter tests -skip_msg = ( - "Reference figures for this class are created by the " "LinePlotterTest" -) -for funcname in filter(lambda s: s.startswith("ref"), dir(LinePlotterTest2D)): - setattr( - LinePlotterTest2D, funcname, unittest.skip(skip_msg)(lambda self: None) - ) diff --git a/tests/test_lineplot_single.py b/tests/test_lineplot_single.py deleted file mode 100755 index 679ca3b9..00000000 --- a/tests/test_lineplot_single.py +++ /dev/null @@ -1,57 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import psyplot.project as psy -import test_lineplot as tl -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import LinePlotter - - -class SingleLinePlotterTest(tl.LinePlotterTest): - """Test of :class:`psy_simple.plotters.LinePlotter` with a single array - instead of an InteractiveList""" - - plot_type = "singleline" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=0, z=0, t=0, name=cls.var, auto_update=True - ) - cls.data[0].psy.arr_name = "arr0" - cls.data.psy.arr_name = "arr0" - cls.plotter = LinePlotter(cls.data[0]) - cls.create_dirs() - - @classmethod - def tearDown(cls): - cls.data[0].psy.update(t=0, todefault=True, replot=True) - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.lineplot( - self.ncfile, name=name, t=0, z=0, y=0, **kwargs - ) - - @unittest.skip("No need for figure creation") - def ref_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_None(self, *args): - pass - - @unittest.skip("Appending not possible for single line") - def test_append_data(self): - pass diff --git a/tests/test_plot2d.py b/tests/test_plot2d.py deleted file mode 100644 index 3c0b7fff..00000000 --- a/tests/test_plot2d.py +++ /dev/null @@ -1,444 +0,0 @@ -"""Test module for 2D plots.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import unittest - -import _base_testing as bt -import matplotlib.pyplot as plt -import numpy as np -import psyplot.project as psy -import pytest -import test_base as tb -import test_lineplot as tl -import xarray as xr -from psyplot import ArrayList, open_dataset - -from psy_simple.plotters import Simple2DPlotter, mpl_version - -bold = tb.bold - - -class References2D(object): - """abstract base class that defines reference methods for 2D plotter""" - - def ref_datagrid(self, close=True): - """Create reference file for datagrid formatoption - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.datagrid` - formatoption""" - kwargs = dict(xlim=(0, 40), ylim=(0, 40)) - sp = self.plot(**kwargs) - sp.update(datagrid="k-") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("datagrid"))) - if close: - sp.close(True, True) - - def ref_cmap(self, close=True): - """Create reference file for cmap formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.cmap` - formatoption""" - sp = self.plot(cmap="RdBu") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("cmap"))) - if close: - sp.close(True, True) - - def ref_cbar(self, close=True): - """Create reference file for cbar formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.cbar` - formatoption""" - sp = self.plot(cbar=["fb", "fr", "fl", "ft", "b", "r"]) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("cbar"))) - if close: - sp.close(True, True) - - def ref_miss_color(self, close=True): - """Create reference file for miss_color formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.miss_color` - formatoption""" - if self.plot_type[:3] == "map": - kwargs = {"projection": "ortho", "grid_labels": False} - else: - kwargs = {} - sp = self.plot(maskless=280, miss_color="0.9", **kwargs) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("miss_color"))) - if close: - sp.close(True, True) - - def ref_cbarspacing(self, close=True): - """Create reference file for cbarspacing formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.cbarspacing` - formatoption""" - if self.plot_type.endswith("vector") or getattr( - self, "vector_mode", False - ): - kwargs = dict( - bounds=np.arange(0, 1.45, 0.1).tolist() - + np.linspace(1.5, 13.5, 7, endpoint=True).tolist() - + np.arange(13.6, 15.05, 0.1).tolist(), - color="absolute", - ) - else: - kwargs = dict( - bounds=list(range(235, 250)) - + np.linspace(250, 295, 7, endpoint=True).tolist() - + list(range(296, 310)) - ) - sp = self.plot(cbarspacing="proportional", cticks="rounded", **kwargs) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("cbarspacing"))) - if close: - sp.close(True, True) - - -class Simple2DPlotterTest(tl.LinePlotterTest, References2D): - """Test :class:`psyplot.plotter.maps.Simple2DPlotter` class""" - - plot_type = "simple2D" - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.plot2d(self.ncfile, name=name, **kwargs) - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = ArrayList.from_dataset( - cls.ds, t=0, z=0, name=cls.var, auto_update=True - )[0] - cls.plotter = Simple2DPlotter(cls.data) - cls.create_dirs() - - @unittest.skip("legend formatoption not implemented for 2D-Plotter") - def ref_legend(self, *args, **kwargs): - pass - - @unittest.skip("no need for xticks formatoption reference for 2D-Plotter") - def ref_xticks(self, *args, **kwargs): - pass - - @unittest.skip("color formatoption not implemented for 2D-Plotter") - def test_color(self): - pass - - @unittest.skip("Not implemented for 2D-Plotter") - def test_coord(self): - pass - - @unittest.skip("Not implemented for 2D-Plotter") - def ref_plot_area(self, close=True): - pass - - @unittest.skip("Not implemented for 2D-Plotter") - def ref_plot_areax(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked_transposed(self, close=True): - pass - - @unittest.skip("Not implemented for 2D-Plotter") - def test_plot_area(self, *args): - pass - - @unittest.skip("Not implemented for 2D-Plotter") - def test_plot_areax(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_None(self, *args): - pass - - @unittest.skip("Appending not possible for plot2d") - def test_append_data(self): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked_transposed(self, close=True): - pass - - def test_ylabel(self): - """Test ylabel formatoption""" - self.update(ylabel="{desc}") - label = self.plotter.ax.yaxis.get_label() - self.assertEqual(label.get_text(), "latitude [degrees_north]") - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_xticks(self): - """Test xticks formatoption""" - self._test_DataTicksCalculator() - - def test_extend(self): - """Test extend formatoption""" - self.update(extend="both") - self.assertEqual(self.plotter.cbar.cbars["b"].extend, "both") - self.update(extend="min") - self.assertEqual(self.plotter.cbar.cbars["b"].extend, "min") - self.update(extend="neither") - self.assertEqual(self.plotter.cbar.cbars["b"].extend, "neither") - - def test_legend(self): - pass - - def test_cticks(self): - """Test cticks, cticksize, ctickweight, ctickprops formatoptions""" - cticks = self._minmax_cticks - self.update(cticks="minmax") - cbar = self.plotter.cbar.cbars["b"] - self.assertAlmostArrayEqual( - list( - map(lambda t: float(t.get_text()), cbar.ax.get_xticklabels()) - ), - cticks, - atol=1e-2, - ) - self.update(cticklabels="%3.1f") - cticks = np.round(cticks, decimals=1).tolist() - self.assertAlmostArrayEqual( - list( - map(lambda t: float(t.get_text()), cbar.ax.get_xticklabels()) - ), - cticks, - atol=0.1, - ) - self.update( - cticksize=20, ctickweight=bold, ctickprops={"labelcolor": "r"} - ) - texts = cbar.ax.get_xticklabels() - n = len(texts) - self.assertEqual([t.get_weight() for t in texts], [bold] * n) - self.assertEqual([t.get_size() for t in texts], [20] * n) - self.assertEqual([t.get_color() for t in texts], ["r"] * n) - - @property - def _minmax_cticks(self): - return np.round( - np.linspace( - self.data.values.min(), - self.data.values.max(), - 11, - endpoint=True, - ), - decimals=2, - ).tolist() - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_clabel(self): - """Test clabel, clabelsize, clabelweight, clabelprops formatoptions""" - - def get_clabel(): - return self.plotter.cbar.cbars["b"].ax.xaxis.get_label() - - self._label_test("clabel", get_clabel) - label = get_clabel() - self.update( - clabelsize=22, clabelweight="bold", clabelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_datagrid(self, *args): - """Test datagrid formatoption""" - self.update(xlim=(0, 40), ylim=(0, 40), datagrid="k-") - self.compare_figures(next(iter(args), self.get_ref_file("datagrid"))) - - def test_cmap(self, *args): - """Test colormap (cmap) formatoption""" - self.update(cmap="RdBu") - fname = next(iter(args), self.get_ref_file("cmap")) - self.compare_figures(fname) - self.update(cmap=plt.get_cmap("RdBu")) - self.compare_figures(fname) - - @unittest.skipIf( - mpl_version == 3.9, - "Colorbars are messed up in mpl 3.9", - ) - def test_cbar(self, *args): - """Test colorbar (cbar) formatoption""" - self.update(cbar=["fb", "fr", "fl", "ft", "b", "r"]) - self.compare_figures(next(iter(args), self.get_ref_file("cbar"))) - - def test_bounds(self): - """Test bounds formatoption""" - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(235, 310, 11, endpoint=True), - atol=1e-2, - ) - self.update(bounds="minmax") - bounds = [ - 239.91, - 246.89, - 253.88, - 260.87, - 267.86, - 274.84, - 281.83, - 288.82, - 295.81, - 302.79, - 309.78, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(245, 300, 5, endpoint=True), - atol=1e-2, - ) - - def test_miss_color(self, *args): - """Test miss_color formatoption""" - self.update(maskless=280, miss_color="0.9") - self.compare_figures(next(iter(args), self.get_ref_file("miss_color"))) - - def test_cbarspacing(self, *args): - """Test cbarspacing formatoption""" - self.update( - cbarspacing="proportional", - cticks="rounded", - bounds=list(range(235, 250)) - + np.linspace(250, 295, 7, endpoint=True).tolist() - + list(range(296, 310)), - ) - self.compare_figures( - next(iter(args), self.get_ref_file("cbarspacing")) - ) - - def test_ylim(self): - """Test ylim formatoption""" - super(Simple2DPlotterTest, self).test_ylim(test_pctls=False) - - -@pytest.mark.parametrize("vmin,vmax", [(1, int(1e2)), (int(-10), int(1e2))]) -def test_log_bounds(vmin, vmax): - ds = xr.Dataset() - ds["test"] = (("y", "x"), np.random.randint(vmin, vmax, (40, 50)) * 1e-3) - vmin *= 10e-3 - vmax *= 10e-3 - ds["x"] = ("x", np.arange(50)) - ds["y"] = ("y", np.arange(40)) - - sp = ds.psy.plot.plot2d(bounds="log") - plotter = sp.plotters[0] - - assert len(plotter.bounds.norm.boundaries) in [10, 11, 12] - assert np.isclose( - plotter.bounds.norm.boundaries[0], [vmin, vmin * 0.1, vmin * 10] - ).any() - assert np.isclose( - plotter.bounds.norm.boundaries[-1], [vmax, vmax * 0.1, vmax * 10] - ).any() - - -def test_symlog_bounds(): - vmin = -1 - vmax = 100 - ds = xr.Dataset() - ds["test"] = (("y", "x"), np.random.randint(vmin, vmax, (40, 50)) * 1e-3) - vmin *= 10e-3 - vmax *= 10e-3 - ds["x"] = ("x", np.arange(50)) - ds["y"] = ("y", np.arange(40)) - - sp = ds.psy.plot.plot2d(bounds="symlog") - plotter = sp.plotters[0] - - assert len(plotter.bounds.norm.boundaries) in [12, 13, 14] - assert plotter.bounds.norm.boundaries[0] == pytest.approx(-0.1) - assert plotter.bounds.norm.boundaries[-1] == pytest.approx(0.1) - - -class Simple2DPlotterTestArtificial(unittest.TestCase): - """A test case for artifial data""" - - def test_single_level(self): - """Test the case when all the data contains exactly one value""" - ds = xr.Dataset() - ds["test"] = (("y", "x"), np.ones((4, 5))) - sp = ds.psy.plot.plot2d(cmap="Reds", bounds=["rounded", 3]) - self.assertEqual(list(sp.plotters[0].bounds.bounds), [1.0, 1.0, 1.5]) - - -def test_plot_poly_3D_bounds(): - """Test plotting the polygons with 3D bounds.""" - fname = os.path.join(bt.test_dir, "rotated-pole-test.nc") - with psy.plot.plot2d(fname, plot="poly") as sp: - assert sp[0].ndim == 2 - plotter = sp.plotters[0] - xmin, xmax = plotter.ax.get_xlim() - ymin, ymax = plotter.ax.get_ylim() - assert xmax - xmin > 100 - assert ymax - ymin > 50 - - -def test_datagrid_3D_bounds(): - """Test plotting the datagrid with 3D bounds.""" - fname = os.path.join(bt.test_dir, "rotated-pole-test.nc") - with psy.plot.plot2d(fname, datagrid="k-") as sp: - assert sp[0].ndim == 2 - plotter = sp.plotters[0] - xmin, xmax = plotter.ax.get_xlim() - ymin, ymax = plotter.ax.get_ylim() - assert xmax - xmin > 100 - assert ymax - ymin > 50 - - -class Simple2DPlotterTest2D(tb.TestBase2D, Simple2DPlotterTest): - """Test :class:`psy_simple.plotters.Simple2DPlotter` class without - time and vertical dimension""" - - var = "t2m_2d" - - -# skip the reference creation functions of the 2D Plotter tests -skip_msg = ( - "Reference figures for this class are created by the " - "Simple2DPlotterTest" -) -for funcname in filter( - lambda s: s.startswith("ref"), dir(Simple2DPlotterTest2D) -): - setattr( - Simple2DPlotterTest2D, - funcname, - unittest.skip(skip_msg)(lambda self: None), - ) diff --git a/tests/test_plot2d_contour.py b/tests/test_plot2d_contour.py deleted file mode 100644 index 9176eb74..00000000 --- a/tests/test_plot2d_contour.py +++ /dev/null @@ -1,38 +0,0 @@ -"""Test module for the simple contour plot.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import test_plot2d as t2d -from psyplot import rcParams - -from psy_simple.plotters import Simple2DPlotter - - -class Simple2DPlotterContourTest(t2d.Simple2DPlotterTest): - plot_type = "simple2D_contour" - - @classmethod - def setUpClass(cls): - plotter = Simple2DPlotter() - rcParams[plotter.plot.default_key] = "contourf" - super(Simple2DPlotterContourTest, cls).setUpClass() - - @unittest.skip("Extend keyword not implemented") - def test_extend(self): - pass - - @unittest.skip("miss_color keyword not implemented") - def test_miss_color(self): - pass - - @unittest.skip("miss_color keyword not implemented") - def ref_miss_color(self): - pass diff --git a/tests/test_plot2d_icon.py b/tests/test_plot2d_icon.py deleted file mode 100644 index 17500d32..00000000 --- a/tests/test_plot2d_icon.py +++ /dev/null @@ -1,141 +0,0 @@ -"""Test module for the 2D plot of icon files.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os - -import _base_testing as bt -import matplotlib.pyplot as plt -import numpy as np -import test_base as tb -import test_plot2d as t2d -from psyplot import InteractiveList - -bold = tb.bold - - -class IconTestMixin(object): - """A mixin class for changed test methods for icon""" - - def ref_datagrid(self, close=True): - """Create reference file for datagrid formatoption - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.datagrid` - formatoption""" - sp = self.plot() - sp.update(datagrid="k-") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("datagrid"))) - if close: - sp.close(True, True) - - def test_datagrid(self, *args): - """Test datagrid formatoption""" - self.update(datagrid="k-") - self.compare_figures(next(iter(args), self.get_ref_file("datagrid"))) - - def test_xlabel(self): - """Test xlabel formatoption""" - self.update(xlabel="{desc}") - label = self.plotter.ax.xaxis.get_label() - self.assertIn("longitude [radian]", label.get_text()) - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def test_ylabel(self): - """Test ylabel formatoption""" - self.update(ylabel="{desc}") - label = self.plotter.ax.yaxis.get_label() - self.assertIn("latitude [radian]", label.get_text()) - self.update( - labelsize=22, labelweight="bold", labelprops={"ha": "left"} - ) - self.assertEqual(label.get_size(), 22) - self.assertEqual(label.get_weight(), bold) - self.assertEqual(label.get_ha(), "left") - - def _test_DataTicksCalculator(self): - # testing of psy_simple.plotters.DataTicksCalculator - - ax = plt.gca() - if isinstance(self.data, InteractiveList): - data = self.data[0] - else: - data = self.data - - try: - lon = data.clon.values - except AttributeError: - lon = data.elon.values - - self.update(xticks="rounded") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-3, 3.5, 11, endpoint=True).tolist(), - ) - self.update(xticks="roundedsym") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-3.5, 3.5, 10, endpoint=True).tolist(), - ) - self.update(xticks="minmax") - self.assertEqual( - list(ax.get_xticks()), - np.linspace(lon.min(), lon.max(), 11, endpoint=True).tolist(), - ) - self.update(xticks="sym") - vmax = np.abs(lon).max() - self.assertEqual( - list(ax.get_xticks()), - np.linspace(-vmax, vmax, 10, endpoint=True).tolist(), - ) - - -class IconSimplePlotterTest(IconTestMixin, t2d.Simple2DPlotterTest): - """Test :class:`psy_simple.plotters.Simple2DPlotter` class for icon grid""" - - grid_type = "icon" - - masking_val = 280 - - ncfile = os.path.join(bt.test_dir, "icon_test.nc") - - def test_bounds(self): - """Test bounds formatoption""" - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(240, 310, 11, endpoint=True), - atol=1e-2, - ) - self.update(bounds="minmax") - bounds = [ - 243.76, - 250.04, - 256.31, - 262.58, - 268.85, - 275.12, - 281.39, - 287.66, - 293.94, - 300.21, - 306.48, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(255, 305, 5, endpoint=True).tolist(), - atol=1e-2, - ) diff --git a/tests/test_plot2d_icon_contour.py b/tests/test_plot2d_icon_contour.py deleted file mode 100644 index 0058c3b1..00000000 --- a/tests/test_plot2d_icon_contour.py +++ /dev/null @@ -1,50 +0,0 @@ -"""Test module for the contour plot for icon grids.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import test_plot2d_icon as t2di -from psyplot import rcParams - -from psy_simple.plotters import Simple2DPlotter - - -class IconSimplePlotterContourTest(t2di.IconSimplePlotterTest): - plot_type = "icon_contour" - - @classmethod - def setUpClass(cls): - plotter = Simple2DPlotter() - rcParams[plotter.plot.default_key] = "contourf" - super(IconSimplePlotterContourTest, cls).setUpClass() - - @unittest.skip("Extend keyword not implemented") - def test_extend(self): - pass - - @unittest.skip("miss_color keyword not implemented") - def test_miss_color(self): - pass - - @unittest.skip("miss_color keyword not implemented") - def ref_miss_color(self): - pass - - @unittest.skip("nan not supported for icon contour") - def test_mask_01_var(self): - pass - - @unittest.skip("nan not supported for icon contour") - def test_mask_02_da(self): - pass - - @unittest.skip("nan not supported for icon contour") - def test_mask_03_fname(self): - pass diff --git a/tests/test_plot2d_icon_edge.py b/tests/test_plot2d_icon_edge.py deleted file mode 100644 index a2d565a9..00000000 --- a/tests/test_plot2d_icon_edge.py +++ /dev/null @@ -1,56 +0,0 @@ -"""Test module for the contour plot for the icon edge grid.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os - -import _base_testing as bt -import numpy as np -import test_plot2d as t2d -from test_plot2d_icon import IconTestMixin - - -class IconEdgeSimplePlotterTest(IconTestMixin, t2d.Simple2DPlotterTest): - """Icon edge grid test :class:`psy_simple.plotters.Simple2DPlotter` class""" - - grid_type = "icon_edge" - - masking_val = 280 - - ncfile = os.path.join(bt.test_dir, "icon_edge_test.nc") - - def test_bounds(self): - """Test bounds formatoption""" - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(240, 310, 11, endpoint=True), - atol=1e-2, - ) - self.update(bounds="minmax") - bounds = [ - 242.48, - 249.06, - 255.64, - 262.21, - 268.79, - 275.37, - 281.94, - 288.52, - 295.1, - 301.67, - 308.25, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(255, 305, 5, endpoint=True), - atol=1e-2, - ) diff --git a/tests/test_vector.py b/tests/test_vector.py deleted file mode 100644 index 88a06efd..00000000 --- a/tests/test_vector.py +++ /dev/null @@ -1,179 +0,0 @@ -"""Test module for vector (quiver) plots.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import unittest - -import _base_testing as bt -import numpy as np -import psyplot.project as psy -import test_plot2d as t2d -from psyplot import ArrayList, open_dataset, rcParams - -from psy_simple.plotters import SimpleVectorPlotter - - -class SimpleVectorPlotterTest(t2d.Simple2DPlotterTest): - """Test :class:`psyplot.plotter.maps.SimpleVectorPlotter` class""" - - plot_type = "simplevector" - - var = ["u", "v"] - - def plot(self, **kwargs): - kwargs.setdefault("color", "absolute") - ds = psy.open_dataset(self.ncfile) - kwargs.setdefault("t", ds.time.values[0]) - kwargs.setdefault("z", ds.lev.values[0]) - kwargs.setdefault("x", slice(0, 69.0)) - kwargs.setdefault("y", slice(81.0, 34.0)) - kwargs.setdefault("method", "sel") - sp = psy.plot.vector(ds, name=[self.var], **kwargs) - return sp - - @unittest.skip("miss_color formatoption not implemented") - def ref_miss_color(self, close=True): - pass - - def ref_arrowsize(self, close=True): - """Create reference file for arrowsize formatoption. - - Create reference file for - :attr:`~psyplot.plotter.maps.VectorPlotter.arrowsize` (and others) - formatoption""" - sp = self.plot(arrowsize=100.0) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("arrowsize"))) - if close: - sp.close(True, True) - - def ref_datagrid(self, close=True): - """Create reference file for datagrid formatoption - - Create reference file for - :attr:`~psy_simple.plotters.Simple2DPlotter.datagrid` - formatoption""" - sp = self.plot() - sp.update(datagrid="k-") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("datagrid"))) - if close: - sp.close(True, True) - - def test_datagrid(self, *args): - """Test datagrid formatoption""" - self.update(datagrid="k-") - self.compare_figures(next(iter(args), self.get_ref_file("datagrid"))) - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = ArrayList.from_dataset( - cls.ds, t=0, z=0, name=[cls.var], auto_update=True - )[0] - cls.data = cls.data.psy.sel(lon=slice(0, 69.0), lat=slice(81.0, 34.0)) - cls.data.attrs["long_name"] = "absolute wind speed" - cls.data.name = "wind" - plotter = SimpleVectorPlotter() - rcParams[plotter.color.default_key] = "absolute" - cls.plotter = SimpleVectorPlotter(cls.data) - cls.create_dirs() - cls._color_fmts = cls.plotter.fmt_groups["colors"] - - def update(self, *args, **kwargs): - kwargs.setdefault("color", "absolute") - super(SimpleVectorPlotterTest, self).update(*args, **kwargs) - - @unittest.skip("Not supported") - def test_maskless(self): - pass - - @unittest.skip("Not supported") - def test_maskgreater(self): - pass - - @unittest.skip("Not supported") - def test_maskleq(self): - pass - - @unittest.skip("Not supported") - def test_maskgeq(self): - pass - - @unittest.skip("Not supported") - def test_maskbetween(self): - pass - - @unittest.skip("Not supported") - def test_miss_color(self): - pass - - def test_cbarspacing(self, *args): - """Test cbarspacing formatoption""" - self.update( - cbarspacing="proportional", - cticks="rounded", - color="absolute", - bounds=np.arange(0, 1.45, 0.1).tolist() - + np.linspace(1.5, 13.5, 7, endpoint=True).tolist() - + np.arange(13.6, 15.05, 0.1).tolist(), - ) - self.compare_figures( - next(iter(args), self.get_ref_file("cbarspacing")) - ) - - def test_arrowsize(self, *args): - """Test arrowsize formatoption""" - self.update(arrowsize=100.0) - self.compare_figures(next(iter(args), self.get_ref_file("arrowsize"))) - - _max_rounded_ref = 70 - - @property - def _minmax_cticks(self): - speed = ( - self.plotter.plot_data.values[0] ** 2 - + self.plotter.plot_data.values[1] ** 2 - ) ** 0.5 - speed = speed[~np.isnan(speed)] - return np.round( - np.linspace(speed.min(), speed.max(), 11, endpoint=True), - decimals=2, - ).tolist() - - def test_bounds(self): - """Test bounds formatoption""" - self.update(color="absolute") - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(0, 15, 11, endpoint=True), - atol=1e-2, - ) - self.update(bounds="minmax") - bounds = [ - 0.36, - 1.4, - 2.45, - 3.49, - 4.54, - 5.59, - 6.63, - 7.68, - 8.72, - 9.77, - 10.81, - ] - - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(1.0, 8.5, 5, endpoint=True), - atol=1e-3, - ) diff --git a/tests/test_vector_icon.py b/tests/test_vector_icon.py deleted file mode 100644 index 45bae2a4..00000000 --- a/tests/test_vector_icon.py +++ /dev/null @@ -1,81 +0,0 @@ -"""Test module for vector (quiver) plots with icon data.""" - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os - -import _base_testing as bt -import numpy as np -import psyplot.project as psy -import test_vector as tv -from psyplot import ArrayList, open_dataset, rcParams -from test_plot2d_icon import IconTestMixin - -from psy_simple.plotters import SimpleVectorPlotter - - -class IconSimpleVectorPlotterTest(IconTestMixin, tv.SimpleVectorPlotterTest): - """ - Test :class:`psy_simple.plotters.SimpleVectorPlotter` class for icon grid - """ - - grid_type = "icon" - - ncfile = os.path.join(bt.test_dir, "icon_test.nc") - - @classmethod - def setUpClass(cls): - plotter = SimpleVectorPlotter() - rcParams[plotter.color.default_key] = "absolute" - cls.ds = open_dataset(cls.ncfile) - cls.data = ArrayList.from_dataset( - cls.ds, t=0, z=0, name=[cls.var], auto_update=True - )[0] - cls.data.attrs["long_name"] = "absolute wind speed" - cls.data.name = "wind" - cls.plotter = SimpleVectorPlotter(cls.data) - cls.create_dirs() - cls._color_fmts = cls.plotter.fmt_groups["colors"] - - def plot(self, **kwargs): - kwargs.setdefault("color", "absolute") - ds = psy.open_dataset(self.ncfile) - sp = psy.plot.vector(ds, name=[self.var], **kwargs) - return sp - - def test_bounds(self): - """Test bounds formatoption""" - self.update(color="absolute") - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(0, 15, 11, endpoint=True), - atol=1e-2, - ) - self.update(bounds="minmax") - bounds = [ - 0.08, - 1.18, - 2.28, - 3.38, - 4.48, - 5.59, - 6.69, - 7.79, - 8.89, - 9.99, - 11.09, - ] - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, bounds, atol=1e-2 - ) - self.update(bounds=["rounded", 5, 5, 95]) - self.assertAlmostArrayEqual( - self.plotter.bounds.norm.boundaries, - np.linspace(0.5, 9.0, 5, endpoint=True), - atol=1e-2, - ) diff --git a/tests/test_vector_stream.py b/tests/test_vector_stream.py deleted file mode 100644 index c705b06a..00000000 --- a/tests/test_vector_stream.py +++ /dev/null @@ -1,76 +0,0 @@ -"""Test module for streamplots.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os - -import _base_testing as bt -import test_vector as tv -from psyplot import rcParams - -from psy_simple.plotters import SimpleVectorPlotter - - -class SimpleStreamVectorPlotterTest(tv.SimpleVectorPlotterTest): - """Test case for stream plot of - :class:`psy_simple.plotters.SimpleVectorPlotter` - """ - - @classmethod - def setUpClass(cls): - plotter = SimpleVectorPlotter() - rcParams[plotter.plot.default_key] = "stream" - return super(SimpleStreamVectorPlotterTest, cls).setUpClass() - - def get_ref_file(self, identifier): - return super(SimpleStreamVectorPlotterTest, self).get_ref_file( - identifier + "_stream" - ) - - def ref_arrowsize(self, *args): - """Create reference file for arrowsize formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.SimpleVectorPlotter.arrowsize` (and others) - formatoption""" - sp = self.plot(arrowsize=2.0) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("arrowsize"))) - - def ref_arrowstyle(self, *args): - """Create reference file for arrowstyle formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.SimpleVectorPlotter.arrowstyle` (and - others) formatoption""" - sp = self.plot(arrowsize=2.0, arrowstyle="fancy") - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("arrowstyle"))) - - def test_arrowsize(self, *args): - """Test arrowsize formatoption""" - self.update(arrowsize=2.0) - self.compare_figures(next(iter(args), self.get_ref_file("arrowsize"))) - - def test_arrowstyle(self, *args): - """Test arrowstyle formatoption""" - self.update(arrowsize=2.0, arrowstyle="fancy") - self.compare_figures(next(iter(args), self.get_ref_file("arrowstyle"))) - - def ref_density(self, *args): - """Create reference file for density formatoption. - - Create reference file for - :attr:`~psy_simple.plotters.SimpleVectorPlotter.density` (and others) - formatoption""" - sp = self.plot(density=0.5) - sp.export(os.path.join(bt.ref_dir, self.get_ref_file("density"))) - - def test_density(self, *args): - """Test density formatoption""" - self.update(density=0.5) - self.compare_figures(next(iter(args), self.get_ref_file("density"))) diff --git a/tests/test_violin.py b/tests/test_violin.py deleted file mode 100755 index 943ae8df..00000000 --- a/tests/test_violin.py +++ /dev/null @@ -1,102 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import unittest - -import psyplot.project as psy -import test_lineplot as tl -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import ViolinPlotter - - -class ViolinPlotterTest(tl.LinePlotterTest): - """Test class for :class:`psy_simple.plotters.BarPlotter`""" - - plot_type = "violin" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=[0, 1], z=0, t=0, name=cls.var, auto_update=True - ) - cls.plotter = ViolinPlotter(cls.data) - cls.create_dirs() - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.violinplot( - self.ncfile, name=name, t=0, z=0, y=[0, 1], **kwargs - ) - - @unittest.skip("No need for figure creation") - def ref_xticks(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_area(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_areax(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def ref_plot_stacked_transposed(self, close=True): - pass - - @unittest.skip("seaborn changes colors") - def test_append_data(self): - pass - - @unittest.skip("Test needs to be implemented") - def test_xticks(self, *args): - """ - .. todo:: - - Implement this test""" - # TODO: implement this test - pass - - @unittest.skip("No need for figure creation") - def test_plot_area(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_areax(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_None(self, *args): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked(self, close=True): - pass - - @unittest.skip("No need for figure creation") - def test_plot_stacked_transposed(self, close=True): - pass - - def test_color(self): - pass - - @unittest.skip("Not implemented for ViolinPlotter") - def test_coord(self): - pass diff --git a/tests/test_violin_single.py b/tests/test_violin_single.py deleted file mode 100755 index be6ff7c2..00000000 --- a/tests/test_violin_single.py +++ /dev/null @@ -1,43 +0,0 @@ -"""Test module of the :mod:`psy_simple.plotters` module.""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import psyplot.project as psy -import test_violin as tv -from psyplot import InteractiveList, open_dataset - -from psy_simple.plotters import ViolinPlotter - - -class SingleViolinPlotterTest(tv.ViolinPlotterTest): - """Test of :class:`psy_simple.plotters.ViolinPlotter` with a single array - instead of an InteractiveList""" - - plot_type = "singleviolin" - - @classmethod - def setUpClass(cls): - cls.ds = open_dataset(cls.ncfile) - cls.data = InteractiveList.from_dataset( - cls.ds, y=0, z=0, t=0, name=cls.var, auto_update=True - ) - cls.data[0].psy.arr_name = "arr0" - cls.data.psy.arr_name = "arr0" - cls.plotter = ViolinPlotter(cls.data[0]) - cls.create_dirs() - - @classmethod - def tearDown(cls): - cls.data[0].psy.update(t=0, todefault=True, replot=True) - - def plot(self, **kwargs): - name = kwargs.pop("name", self.var) - return psy.plot.violinplot( - self.ncfile, name=name, t=0, z=0, y=0, **kwargs - ) diff --git a/tests/widgets/_widgets_base_testing.py b/tests/widgets/_widgets_base_testing.py deleted file mode 100644 index 071bb227..00000000 --- a/tests/widgets/_widgets_base_testing.py +++ /dev/null @@ -1,149 +0,0 @@ -# -*- coding: utf-8 -*- -"""Module defining the base class for the gui test""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os -import os.path as osp -import unittest - -import numpy as np -import six -from psyplot import rcParams as psy_rcParams -from psyplot_gui import rcParams -from psyplot_gui.compat.qtcompat import QApplication - -os.environ["PSYPLOT_PLUGINS"] = "yes:psy_simple.plugin" - - -def is_running_in_gui(): - from psyplot_gui.main import mainwindow - - return mainwindow is not None - - -running_in_gui = is_running_in_gui() - - -on_travis = os.environ.get("TRAVIS") - - -def setup_rcparams(): - rcParams.defaultParams["console.start_channels"][0] = False - rcParams.defaultParams["main.listen_to_port"][0] = False - rcParams.defaultParams["help_explorer.render_docs_parallel"][0] = False - rcParams.defaultParams["help_explorer.use_intersphinx"][0] = False - rcParams.defaultParams["plugins.include"][0] = [] - rcParams.defaultParams["plugins.exclude"][0] = "all" - rcParams.update_from_defaultParams() - - -class PsyPlotGuiTestCase(unittest.TestCase): - """A base class for testing the psyplot_gui module - - At the initializzation of the TestCase, a new - :class:`psyplot_gui.main.MainWindow` widget is created which is closed at - the end of all the tests""" - - @classmethod - def setUpClass(cls): - from psyplot_gui.main import mainwindow - - cls._close_app = mainwindow is None - cls._app = QApplication.instance() - if not running_in_gui: - if cls._app is None: - cls._app = QApplication([]) - cls._app.setQuitOnLastWindowClosed(False) - - @classmethod - def tearDownClass(cls): - if not running_in_gui: - cls._app.quit() - del cls._app - - def setUp(self): - import psyplot_gui.main as main - - if not running_in_gui: - setup_rcparams() - self.window = main.MainWindow.run(show=False) - else: - self.window = main.mainwindow - - def tearDown(self): - import matplotlib.pyplot as plt - import psyplot.project as psy - - if not running_in_gui: - import psyplot_gui.main as main - - self.window.close() - rcParams.update_from_defaultParams() - psy_rcParams.update_from_defaultParams() - rcParams.disconnect() - psy_rcParams.disconnect() - main._set_mainwindow(None) - del self.window - psy.close("all") - plt.close("all") - - def get_file(self, fname): - """Get the path to the file `fname` - - Parameters - ---------- - fname: str - The path of the file name (relative to the test directory) - - Returns - ------- - str - The complete path to the given file""" - return osp.join(osp.dirname(__file__), fname) - - def assertAlmostArrayEqual( - self, actual, desired, rtol=1e-07, atol=0, msg=None, **kwargs - ): - """Asserts that the two given arrays are almost the same - - This method uses the :func:`numpy.testing.assert_allclose` function - to compare the two given arrays. - - Parameters - ---------- - actual : array_like - Array obtained. - desired : array_like - Array desired. - rtol : float, optional - Relative tolerance. - atol : float, optional - Absolute tolerance. - equal_nan : bool, optional. - If True, NaNs will compare equal. - msg : str, optional - The error message to be printed in case of failure. - verbose : bool, optional - If True, the conflicting values are appended to the error message. - """ - try: - np.testing.assert_allclose( - actual, - desired, - rtol=rtol, - atol=atol, - err_msg=msg or "", - **kwargs, - ) - except AssertionError as e: - if six.PY2: - self.fail(e.message) - else: - self.fail(str(e)) diff --git a/tests/widgets/test_color_widgets.py b/tests/widgets/test_color_widgets.py deleted file mode 100644 index 467b62d1..00000000 --- a/tests/widgets/test_color_widgets.py +++ /dev/null @@ -1,271 +0,0 @@ -"""Test module for the :mod:`psy_simple.widgets.colors` module""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - - -import os.path as osp -import unittest - -import _widgets_base_testing as bt -import matplotlib as mpl -import matplotlib.colors as mcol -import numpy as np -from psyplot.data import isstring -from psyplot_gui.compat.qtcompat import QtGui - -import psy_simple.widgets.colors as pswc -from psy_simple.colors import get_cmap - -mpl_version = tuple(map(int, mpl.__version__.split(".")[:2])) - - -class CMapWidgetTest(bt.PsyPlotGuiTestCase): - """Test case for the :class:`psy_simple.widgets.colors.CMapFmtWidget`""" - - @property - def fmt_widget(self): - return self.window.fmt_widget - - @property - def plotter(self): - return self.project.plotters[0] - - def setUp(self): - import psyplot.project as psy - - super(CMapWidgetTest, self).setUp() - self.project = psy.plot.plot2d( - self.get_file(osp.join("..", "test-t2m-u-v.nc")), name="t2m" - ) - self.fmt_widget.fmto = self.plotter.cmap - - def assertColormapEqual(self, cmap, reference, force_string=False): - """Test whether two colormaps are the same - - Parameters - ---------- - cmap: str or :class:`matplotlib.colors.Colormap` - The colormap to test - reference: str or :class:`matplotlib.colors.Colormap` - The reference colormap""" - if force_string or (isstring(cmap) and isstring(reference)): - self.assertEqual(cmap, reference) - if isstring(cmap): - cmap = get_cmap(cmap) - if isstring(reference): - reference = get_cmap(reference) - colors = np.linspace(0, 1, 4) - self.assertAlmostArrayEqual(cmap(colors), reference(colors)) - - def test_instance(self): - """Test changes""" - self.assertIsInstance(self.fmt_widget.fmt_widget, pswc.CMapFmtWidget) - - def test_choose_cmap(self): - fmt_w = self.fmt_widget - fmt_w.fmt_widget.choose_cmap("Blues") - self.assertColormapEqual(fmt_w.get_obj(), "Blues", True) - cmap = get_cmap("Blues") - fmt_w.fmt_widget.choose_cmap(cmap) - chosen = fmt_w.get_obj() - self.assertIsInstance(chosen, mcol.Colormap) - self.assertColormapEqual(chosen, cmap) - - def test_edit_colormap_01_standard(self): - dialog = pswc.ColormapDialog("Blues") - self.assertIsInstance(dialog, pswc.ColormapDialog) - self.assertEqual(dialog.table.rowCount(), 1) - dialog.table.selectRow(0) - self.assertColormapEqual(dialog.table.chosen_colormap, "Blues", True) - dialog.close() - - def test_edit_colormap_02_custom(self): - cmap = get_cmap("Blues") - dialog = pswc.ColormapDialog(cmap) - self.assertEqual(dialog.table.rowCount(), 1) - dialog.table.selectRow(0) - self.assertIsInstance(dialog.table.chosen_colormap, mcol.Colormap) - self.assertColormapEqual(dialog.table.chosen_colormap, "Blues") - dialog.close() - - -class BoundsWidgetTest(bt.PsyPlotGuiTestCase): - """Test case for the :class:`psy_simple.widgets.colors.BoundsFmtWidget`""" - - @property - def fmt_widget(self): - return self.window.fmt_widget - - @property - def plotter(self): - return self.project.plotters[0] - - def setUp(self): - import psyplot.project as psy - - super(BoundsWidgetTest, self).setUp() - self.project = psy.plot.plot2d( - self.get_file(osp.join("..", "test-t2m-u-v.nc")), name="t2m" - ) - self.fmt_widget.fmto = self.plotter.bounds - - def test_instance(self): - """Test changes""" - self.assertIsInstance(self.fmt_widget.fmt_widget, pswc.BoundsFmtWidget) - - def test_minmax(self): - self.project.update(bounds=["minmax", 14, 5, 95]) - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertIs(w, fmt_w.fmt_widget._auto_array_widget) - self.assertEqual(fmt_w.fmt_widget.method_combo.currentText(), "minmax") - self.assertEqual(w.sb_N.value(), 14) - self.assertEqual(float(w.txt_min_pctl.text()), 5) - self.assertEqual(float(w.txt_max_pctl.text()), 95) - - w.txt_min_pctl.setText("10") - self.assertEqual(fmt_w.get_obj(), ["minmax", 14, 10, 95, None, None]) - - def test_powernorm(self): - """Test a :class:`matplotlib.colors.PowerNorm`""" - self.project.update(bounds=mcol.PowerNorm(1.0, 280, 290)) - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertIs(w, fmt_w.fmt_widget._norm_widget) - w.txt_gamma.setText("2.0") - self.assertIsInstance(fmt_w.get_obj(), mcol.PowerNorm) - - def test_symlognorm(self): - """Test a :class:`matplotlib.colors.SymLogNorm`""" - if mpl_version <= (3, 1): - kws = {} - else: - kws = {"base": 10} - self.project.update(bounds=mcol.SymLogNorm(1.0, **kws)) - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertIs(w, fmt_w.fmt_widget._norm_widget) - w.txt_linthresh.setText("2.0") - self.assertIsInstance(fmt_w.get_obj(), mcol.SymLogNorm) - - def test_array(self): - bounds = np.arange(280.0, 290.1, 1) - self.project.update(bounds=bounds) - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertEqual(float(w.txt_min.text()), 280) - self.assertEqual(float(w.txt_max.text()), 290) - self.assertEqual(float(w.txt_step.text()), 1) - self.assertEqual(w.sb_nsteps.value(), 11) - self.assertIs(w, fmt_w.fmt_widget._array_widget) - self.assertEqual(fmt_w.get_obj(), bounds.tolist()) - self.assertTrue(w.txt_step.isEnabled()) - self.assertFalse(w.sb_nsteps.isEnabled()) - w.txt_step.setText("0.5") - self.assertAlmostArrayEqual( - fmt_w.get_obj(), np.arange(280, 290.1, 0.5) - ) - - w.step_inc_combo.setCurrentText("# Steps") - self.assertFalse(w.txt_step.isEnabled()) - self.assertTrue(w.sb_nsteps.isEnabled()) - w.sb_nsteps.setValue(12) - w.set_array() - self.assertAlmostArrayEqual( - fmt_w.get_obj(), np.round(np.linspace(280, 290, 12), 3) - ) - - -class BackgroundColorWidgetTest(bt.PsyPlotGuiTestCase): - """Test case for the :class:`BackGroundColorWidget`""" - - @property - def fmt_widget(self): - return self.window.fmt_widget - - @property - def plotter(self): - return self.project.plotters[0] - - def setUp(self): - import psyplot.project as psy - - super().setUp() - self.project = psy.plot.plot2d( - self.get_file(osp.join("..", "test-t2m-u-v.nc")), name="t2m" - ) - self.fmt_widget.fmto = self.plotter.background - - def test_transparent(self): - w = self.fmt_widget.fmt_widget - w.cb_enable.setChecked(True) - self.assertIsNone(self.fmt_widget.get_obj()) - self.assertFalse(w.color_label.isEnabled()) - - def test_color_change(self): - w = self.fmt_widget.fmt_widget - w.color_label.set_color(QtGui.QColor(51, 51, 51, 255)) - obj = self.fmt_widget.get_obj() - self.assertEqual(list(obj), [0.2, 0.2, 0.2, 1.0]) - - -class CTicksWidgetTest(bt.PsyPlotGuiTestCase): - """Test case for the :class:`psy_simple.widgets.colors.BoundsFmtWidget`""" - - @property - def fmt_widget(self): - return self.window.fmt_widget - - @property - def plotter(self): - return self.project.plotters[0] - - def setUp(self): - import psyplot.project as psy - - super(CTicksWidgetTest, self).setUp() - self.project = psy.plot.plot2d( - self.get_file(osp.join("..", "test-t2m-u-v.nc")), name="t2m" - ) - self.fmt_widget.fmto = self.plotter.cticks - - def test_instance(self): - """Test changes""" - self.assertIsInstance(self.fmt_widget.fmt_widget, pswc.CTicksFmtWidget) - - def test_minmax(self): - self.project.update(cticks=["minmax", 14, 5, 95]) - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertIs(w, fmt_w.fmt_widget._auto_array_widget) - self.assertEqual(fmt_w.fmt_widget.method_combo.currentText(), "minmax") - self.assertEqual(w.sb_N.value(), 14) - self.assertEqual(float(w.txt_min_pctl.text()), 5) - self.assertEqual(float(w.txt_max_pctl.text()), 95) - - w.txt_min_pctl.setText("10") - self.assertEqual(fmt_w.get_obj(), ["minmax", 14, 10, 95, None, None]) - - def test_bounds(self): - self.project.update(cticks=["bounds", 3]) - - fmt_w = self.fmt_widget - fmt_w.reset_fmt_widget() - w = fmt_w.fmt_widget.current_widget - self.assertIs(w, fmt_w.fmt_widget._auto_array_widget) - self.assertEqual(fmt_w.fmt_widget.method_combo.currentText(), "bounds") - self.assertEqual(w.sb_N.value(), 3) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/widgets/test_texts.py b/tests/widgets/test_texts.py deleted file mode 100644 index d075fbdf..00000000 --- a/tests/widgets/test_texts.py +++ /dev/null @@ -1,109 +0,0 @@ -"""Test module for the :mod:`psy_simple.widgets.texts` module""" - - -# SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum Hereon -# SPDX-FileCopyrightText: 2020-2021 Helmholtz-Zentrum Geesthacht -# SPDX-FileCopyrightText: 2016-2024 University of Lausanne -# -# SPDX-License-Identifier: LGPL-3.0-only - -import os.path as osp -import unittest - -import _widgets_base_testing as bt -from psyplot_gui.compat.qtcompat import Qt, QTest, QtGui - -import psy_simple.widgets.texts as pswt - - -class TitleFmtWidgetTest(bt.PsyPlotGuiTestCase): - """Test case for the LabelWidget""" - - @property - def fmt_widget(self): - return self.window.fmt_widget - - @property - def plotter(self): - return self.project.plotters[0] - - def setUp(self): - import psyplot.project as psy - - super(TitleFmtWidgetTest, self).setUp() - self.project = psy.plot.lineplot( - self.get_file(osp.join("..", "test-t2m-u-v.nc")), - name="t2m", - x=0, - y=0, - z=0, - ) - - def test_instance(self): - """Test changes""" - self.fmt_widget.fmto = self.plotter.title - self.assertIsInstance(self.fmt_widget.fmt_widget, pswt.LabelWidget) - self.fmt_widget.fmto = self.plotter.titleprops - self.assertIsInstance( - self.fmt_widget.fmt_widget, pswt.FontPropertiesWidget - ) - self.fmt_widget.fmto = self.plotter.titleweight - self.assertIsInstance( - self.fmt_widget.fmt_widget, pswt.FontWeightWidget - ) - self.fmt_widget.fmto = self.plotter.titlesize - self.assertIsInstance(self.fmt_widget.fmt_widget, pswt.FontSizeWidget) - - def test_choose_font(self): - self.fmt_widget.fmto = self.plotter.titleprops - fmto_widget = self.fmt_widget.fmt_widget - font = QtGui.QFont("Arial", 24, QtGui.QFont.Bold, True) - fmto_widget.choose_font(font) - properties = self.fmt_widget.get_obj() - self.assertEqual( - properties, - dict(family="Arial", size=24, weight="bold", style="italic"), - ) - self.assertTrue(fmto_widget.btn_bold.isChecked()) - self.assertTrue(fmto_widget.btn_italic.isChecked()) - self.assertEqual(fmto_widget.spin_box.value(), 24) - - def test_btn_bold(self): - self.test_choose_font() - fmto_widget = self.fmt_widget.fmt_widget - QTest.mouseClick(fmto_widget.btn_bold, Qt.LeftButton) - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["weight"], "normal") - QTest.mouseClick(fmto_widget.btn_bold, Qt.LeftButton) - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["weight"], "bold") - - def test_btn_italic(self): - self.test_choose_font() - fmto_widget = self.fmt_widget.fmt_widget - QTest.mouseClick(fmto_widget.btn_italic, Qt.LeftButton) - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["style"], "normal") - QTest.mouseClick(fmto_widget.btn_italic, Qt.LeftButton) - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["style"], "italic") - - def test_modify_size(self): - self.test_choose_font() - fmto_widget = self.fmt_widget.fmt_widget - fmto_widget.spin_box.setValue(28) - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["size"], 28) - - def test_choose_color(self): - """Test choosing the color""" - self.fmt_widget.fmto = self.plotter.titleprops - fmto_widget = self.fmt_widget.fmt_widget - fmto_widget.choose_color(QtGui.QColor(Qt.red)) - - properties = self.fmt_widget.get_obj() - self.assertEqual(properties["color"], (1.0, 0.0, 0.0, 1.0)) - - -if __name__ == "__main__": - unittest.main() diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 989beb4a..00000000 --- a/tox.ini +++ /dev/null @@ -1,27 +0,0 @@ -; SPDX-FileCopyrightText: 2021-2024 Helmholtz-Zentrum hereon GmbH -; -; SPDX-License-Identifier: CC0-1.0 - -[tox] - -[testenv] -extras = - testsite - -passenv = - NPROCS - -commands = - mypy psy_simple - isort --check psy_simple - black --line-length 79 --check psy_simple - ; blackdoc --check psy_simple - flake8 psy_simple - pytest -v --cov=psy_simple -x --ref - pytest -v --cov=psy_simple -x -n {env:NPROCS:1} - reuse lint - cffconvert --validate - -[pytest] -python_files = tests.py test_*.py *_tests.py -norecursedirs = .* build dist *.egg venv docs