From 907cd0239d163b0dab1f5cb5af45f4d6a143723b Mon Sep 17 00:00:00 2001 From: Ivan Ogasawara Date: Tue, 16 Jan 2024 22:32:22 -0400 Subject: [PATCH] feat: Update structure (#6) --- .editorconfig | 12 +- .github/ISSUE_TEMPLATE.md | 6 +- .github/workflows/main.yaml | 135 ++ .github/workflows/release.yaml | 69 + .makim.yaml | 95 + .pre-commit-config.yaml | 107 +- .releaserc.json | 79 + .travis.yml | 19 - .vscode/settings.json | 3 + CONTRIBUTING.rst | 131 -- CONTRIBUTORS.rst | 13 - HISTORY.rst | 8 - MANIFEST.in | 11 - Makefile | 88 - README.md | 16 + README.rst | 49 - conda/dev.yaml | 11 + docs/Makefile | 20 - docs/api/references.md | 3 + docs/api/references.rst | 8 + docs/changelog.md | 20 + docs/conf.py | 162 -- docs/contributing.md | 164 ++ docs/contributing.rst | 1 - docs/contributors.rst | 1 - docs/example.ipynb | 56 + docs/history.rst | 1 - docs/images/favicon.ico | Bin 0 -> 72342 bytes docs/images/logo.png | Bin 0 -> 20402 bytes docs/index.md | 8 + docs/index.rst | 20 - docs/installation.md | 41 + docs/installation.rst | 51 - docs/make.bat | 36 - docs/mkdocs.yaml | 150 ++ docs/readme.rst | 1 - docs/uml/class_graph | 10 + docs/uml/class_graph.png | Bin 0 -> 92708 bytes docs/usage.rst | 7 - poetry.lock | 3227 ++++++++++++++++++++++++++++++++ pyproject.toml | 111 +- pyuml/__init__.py | 7 - pyuml/class_graph.py | 192 -- pyuml/pyuml.py | 53 - requirements_dev.txt | 12 - setup.cfg | 34 - setup.py | 55 - src/pyuml/__init__.py | 19 + src/pyuml/__main__.py | 5 + src/pyuml/class_graph.py | 304 +++ src/pyuml/cli.py | 62 + src/pyuml/py.typed | 0 tests/notebooks/test.ipynb | 88 + tests/notebooks/test_pyuml.py | 8 + tox.ini | 27 - 55 files changed, 4785 insertions(+), 1031 deletions(-) create mode 100644 .github/workflows/main.yaml create mode 100644 .github/workflows/release.yaml create mode 100644 .makim.yaml create mode 100644 .releaserc.json delete mode 100644 .travis.yml create mode 100644 .vscode/settings.json delete mode 100644 CONTRIBUTING.rst delete mode 100644 CONTRIBUTORS.rst delete mode 100644 HISTORY.rst delete mode 100644 MANIFEST.in delete mode 100644 Makefile create mode 100644 README.md delete mode 100644 README.rst create mode 100644 conda/dev.yaml delete mode 100644 docs/Makefile create mode 100644 docs/api/references.md create mode 100644 docs/api/references.rst create mode 100644 docs/changelog.md delete mode 100755 docs/conf.py create mode 100644 docs/contributing.md delete mode 100644 docs/contributing.rst delete mode 100644 docs/contributors.rst create mode 100644 docs/example.ipynb delete mode 100644 docs/history.rst create mode 100644 docs/images/favicon.ico create mode 100644 docs/images/logo.png create mode 100644 docs/index.md delete mode 100644 docs/index.rst create mode 100644 docs/installation.md delete mode 100644 docs/installation.rst delete mode 100644 docs/make.bat create mode 100644 docs/mkdocs.yaml delete mode 100644 docs/readme.rst create mode 100644 docs/uml/class_graph create mode 100644 docs/uml/class_graph.png delete mode 100644 docs/usage.rst create mode 100644 poetry.lock delete mode 100644 pyuml/__init__.py delete mode 100644 pyuml/class_graph.py delete mode 100644 pyuml/pyuml.py delete mode 100644 requirements_dev.txt delete mode 100644 setup.cfg delete mode 100644 setup.py create mode 100644 src/pyuml/__init__.py create mode 100644 src/pyuml/__main__.py create mode 100644 src/pyuml/class_graph.py create mode 100644 src/pyuml/cli.py create mode 100644 src/pyuml/py.typed create mode 100644 tests/notebooks/test.ipynb create mode 100644 tests/notebooks/test_pyuml.py delete mode 100644 tox.ini diff --git a/.editorconfig b/.editorconfig index d4a2c44..ea48846 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,21 +1,19 @@ -# http://editorconfig.org - root = true [*] indent_style = space -indent_size = 4 +indent_size = 2 trim_trailing_whitespace = true insert_final_newline = true charset = utf-8 end_of_line = lf -[*.bat] -indent_style = tab -end_of_line = crlf +[*.py] +indent_style = space +indent_size = 4 [LICENSE] -insert_final_newline = false +insert_final_newline = true [Makefile] indent_style = tab diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md index 2759f32..7000770 100644 --- a/.github/ISSUE_TEMPLATE.md +++ b/.github/ISSUE_TEMPLATE.md @@ -1,6 +1,6 @@ -* PyUML version: -* Python version: -* Operating System: +- PyUML version: +- Python version: +- Operating System: ### Description diff --git a/.github/workflows/main.yaml b/.github/workflows/main.yaml new file mode 100644 index 0000000..3828027 --- /dev/null +++ b/.github/workflows/main.yaml @@ -0,0 +1,135 @@ +name: build + +on: + push: + branches: [main] + pull_request: + branches: [main] + +jobs: + check-branch: + runs-on: ubuntu-latest + + timeout-minutes: 2 + concurrency: + group: ci-check-branch-${{ github.ref }} + cancel-in-progress: true + + steps: + - uses: actions/checkout@v3 + if: ${{ github.event_name == 'pull_request' }} + with: + fetch-depth: 0 + + - name: Check if the PR's branch is updated + if: ${{ github.event_name == 'pull_request' }} + uses: osl-incubator/gh-check-pr-is-updated@1.0.0 + with: + remote_branch: origin/main + pr_sha: ${{ github.event.pull_request.head.sha }} + + build: + needs: check-branch + strategy: + matrix: + python_version: + - "3.8.1" + - "3.9" + - "3.10" + - "3.11" + - "3.12" + + os: + - "ubuntu" + # - "macos" + # - 'windows' # note: makim doesn't have support for windows yet + + runs-on: ${{ matrix.os }}-latest + + timeout-minutes: 10 + concurrency: + group: ci-tests-${{ matrix.os }}-${{ matrix.python_version }}-${{ github.ref }} + cancel-in-progress: true + + defaults: + run: + shell: bash -l {0} + + steps: + - uses: actions/checkout@v3 + + - name: Install MacOS extra tools and add extra setup + if: ${{ matrix.os == 'macos' }} + run: | + sudo mkdir -p /tmp + sudo chmod 777 /tmp + + brew install gnu-sed + echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"' >> ~/.bashrc + echo 'export PATH="/usr/local/opt/gnu-sed/libexec/gnubin:$PATH"' >> ~/.bash_profile + + - name: Prepare conda environment (windows) + if: ${{ matrix.os == 'windows' }} + run: | + $env:Path += ";C:\Program Files\Git\usr\bin" + sed -i s/python\ 3\.8/python\ ${{ matrix.python_version }}/ conda/dev.yaml + cat conda/dev.yaml + + - name: Prepare conda environment + if: ${{ matrix.os != 'windows' }} + run: | + sed -i s/python\ 3\.8\.1/python\ ${{ matrix.python_version }}/ conda/dev.yaml + cat conda/dev.yaml + + - uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + environment-file: conda/dev.yaml + channels: conda-forge,nodefaults + channel-priority: true + activate-environment: pyuml + auto-update-conda: true + conda-solver: libmamba + + - name: Install dependencies + run: poetry install + + - name: Run tests + run: makim tests.unit + + linter-and-docs: + needs: check-branch + runs-on: ubuntu-latest + timeout-minutes: 10 + + defaults: + run: + shell: bash -l {0} + + concurrency: + group: ci-linter-docs-${{ github.ref }} + cancel-in-progress: true + + steps: + - uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + environment-file: conda/dev.yaml + channels: conda-forge,nodefaults + activate-environment: pyuml + auto-update-conda: true + conda-solver: libmamba + + - name: Install dependencies + run: | + poetry config virtualenvs.create false + poetry install + + - name: Test documentation generation + run: makim docs.build + + - name: Run style checks + if: success() || failure() + run: makim tests.linter diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml new file mode 100644 index 0000000..95f8f6c --- /dev/null +++ b/.github/workflows/release.yaml @@ -0,0 +1,69 @@ +name: Release + +on: + workflow_dispatch: + push: + branches: [main] + pull_request: + branches: [main] + +permissions: + contents: write + issues: write + pull-requests: write + +jobs: + release: + name: Release + runs-on: ubuntu-latest + timeout-minutes: 10 + + defaults: + run: + shell: bash -l {0} + + steps: + - uses: actions/checkout@v3 + + - uses: conda-incubator/setup-miniconda@v3 + with: + miniconda-version: "latest" + environment-file: conda/dev.yaml + channels: conda-forge,nodefaults + channel-priority: true + activate-environment: pyuml + auto-update-conda: true + conda-solver: libmamba + + - name: Install deps + run: | + poetry install + + - name: Run semantic release (for tests) + if: ${{ github.event_name != 'workflow_dispatch' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + makim release.dry + + - name: Release command + if: ${{ github.event_name == 'workflow_dispatch' }} + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + PYPI_TOKEN: ${{ secrets.PYPI_TOKEN }} + run: | + poetry config pypi-token.pypi ${PYPI_TOKEN} + makim release.ci + + - name: Generate documentation with changes from semantic-release + if: ${{ github.event_name == 'workflow_dispatch' }} + run: | + makim docs.build + + - name: GitHub Pages action + if: ${{ github.event_name == 'workflow_dispatch' }} + uses: peaceiris/actions-gh-pages@v3.5.9 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: >- + build/ diff --git a/.makim.yaml b/.makim.yaml new file mode 100644 index 0000000..ffc983e --- /dev/null +++ b/.makim.yaml @@ -0,0 +1,95 @@ +version: 1.0 +groups: + clean: + targets: + all: + help: Clean unnecessary temporary files + shell: bash + run: | + rm -fr build/ + rm -fr dist/ + rm -fr .eggs/ + find . -name '*.egg-info' -exec rm -fr {} + + find . -name '*.egg' -exec rm -f {} + + find . -name '*.pyc' -exec rm -f {} + + find . -name '*.pyo' -exec rm -f {} + + find . -name '__pycache__' -exec rm -fr {} + + find . -name '*~' -exec rm -f {} + + rm -f .coverage + rm -fr htmlcov/ + rm -fr .pytest_cache + rm -fr .mypy_cache + rm -fr .ruff_cache + + docs: + targets: + build: + help: Build documentation + run: | + mkdocs build --config-file docs/mkdocs.yaml + + preview: + help: Preview documentation page locally + dependencies: + - target: docs.build + run: | + mkdocs build --config-file docs/mkdocs.yaml + + tests: + targets: + linter: + help: Run linter tools + run: | + pre-commit install + pre-commit run --all-files --verbose + + unit: + help: run tests + args: + path: + help: Specify the location of the tests + type: string + default: "" + params: + help: Specify parameters to be used for tests + type: string + default: "-vv" + run: | + pytest {{ args.path }} {{ args.params }} + + ci: + help: run the sames tests executed on CI + dependencies: + - target: tests.unit + - target: tests.linter + + package: + targets: + build: + help: "Build the package" + run: | + poetry build + + release: + vars: + app: | + npx --yes \ + -p semantic-release \ + -p conventional-changelog-conventionalcommits \ + -p "@semantic-release/commit-analyzer" \ + -p "@semantic-release/release-notes-generator" \ + -p "@semantic-release/changelog" \ + -p "@semantic-release/exec" \ + -p "@semantic-release/github" \ + -p "@semantic-release/git" \ + -p "semantic-release-replace-plugin" \ + semantic-release + + targets: + ci: + help: run semantic release on CI + run: {{ vars.app }} --ci + + dry: + help: run semantic release in dry-run mode + run: {{ vars.app }} --dry-run diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index 55ee730..3429f32 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -1,26 +1,95 @@ +default_stages: + - commit repos: - - repo: https://github.com/asottile/seed-isort-config - rev: v1.9.2 + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.1.0 hooks: - - id: seed-isort-config - - repo: https://github.com/timothycrosley/isort - rev: 18ad293fc9d1852776afe35015a932b68d26fb14 - hooks: - - id: isort - - repo: https://github.com/psf/black - rev: 19.10b0 + - id: end-of-file-fixer + + - repo: https://github.com/pre-commit/mirrors-prettier + rev: "v3.0.2" hooks: - - id: black - exclude: (ibis/_version|versioneer).py - - repo: git://github.com/pre-commit/pre-commit-hooks - rev: v2.1.0 + - id: prettier + exclude: ".makim.yaml" + + - repo: local hooks: - - id: flake8 + - id: ruff-format + name: ruff-format + entry: ruff format + exclude: | + (?x)( + docs + ) + language: system + pass_filenames: true + types: + - python + + - id: ruff-linter + name: ruff-linter + entry: ruff check + language: system + exclude: | + (?x)( + docs| + tests + ) + pass_filenames: true + types: + - python + + - id: mypy + name: mypy + entry: mypy + language: system + files: "./" + pass_filenames: true + exclude: | + (?x)( + docs| + tests + ) types: - python - - repo: https://github.com/pre-commit/mirrors-mypy - rev: 'master' - hooks: - - id: mypy - files: pyuml/ + - id: shellcheck + name: shellcheck + entry: shellcheck + language: system + types_or: + - sh + - shell + - ash + - bash + - bats + - dash + - ksh + + - id: bandit + name: bandit + entry: bandit + language: system + args: ["--configfile", "pyproject.toml", "-iii", "-lll"] + pass_filenames: true + types: + - python + + - id: vulture + name: vulture + entry: vulture --min-confidence 80 + language: system + files: "src/pyuml" + description: Find unused Python code. + pass_filenames: true + types: + - python + + - id: mccabe + name: mccabe + entry: python -m mccabe --min 10 + language: system + files: "src/pyuml" + pass_filenames: true + types: + - python diff --git a/.releaserc.json b/.releaserc.json new file mode 100644 index 0000000..d3fe3cf --- /dev/null +++ b/.releaserc.json @@ -0,0 +1,79 @@ +{ + "branches": ["main"], + "tagFormat": "${version}", + "plugins": [ + [ + "@semantic-release/commit-analyzer", + { + "preset": "conventionalcommits" + } + ], + [ + "semantic-release-replace-plugin", + { + "replacements": [ + { + "files": ["src/pyuml/__init__.py"], + "from": "return \".*\" # semantic-release", + "to": "return \"${nextRelease.version}\" # semantic-release", + "results": [ + { + "file": "src/pyuml/__init__.py", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + }, + { + "files": ["pyproject.toml"], + "from": "version = \".*\" # semantic-release", + "to": "version = \"${nextRelease.version}\" # semantic-release", + "results": [ + { + "file": "pyproject.toml", + "hasChanged": true, + "numMatches": 1, + "numReplacements": 1 + } + ], + "countMatches": true + } + ] + } + ], + "@semantic-release/release-notes-generator", + [ + "@semantic-release/changelog", + { + "changelogTitle": "# Release Notes\n---", + "changelogFile": "docs/changelog.md" + } + ], + [ + "@semantic-release/exec", + { + "prepareCmd": "poetry build", + "publishCmd": "poetry publish" + } + ], + [ + "@semantic-release/github", + { + "assets": ["dist/*.whl", "dist/*.tar.gz"] + } + ], + [ + "@semantic-release/git", + { + "assets": [ + "pyproject.toml", + "docs/changelog.md", + "src/pyuml/__init__.py" + ], + "message": "chore(release): ${nextRelease.version}" + } + ] + ] +} diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index f00cf7c..0000000 --- a/.travis.yml +++ /dev/null @@ -1,19 +0,0 @@ -# Config file for automatic testing at travis-ci.org - -language: python -python: - - 3.6 - - 3.5 - - 3.4 - - 2.7 - -# Command to install dependencies, e.g. pip install -r requirements.txt --use-mirrors -install: pip install -U tox-travis codecov - -# Command to run tests, e.g. python setup.py test -script: tox - -# Codecov after success -after_success: codecov - - diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..3bc9f31 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,3 @@ +{ + "esbonio.sphinx.confDir": "" +} diff --git a/CONTRIBUTING.rst b/CONTRIBUTING.rst deleted file mode 100644 index d0bc69b..0000000 --- a/CONTRIBUTING.rst +++ /dev/null @@ -1,131 +0,0 @@ -.. highlight:: shell - -============ -Contributing -============ - -Contributions are welcome, and they are greatly appreciated! Every little bit -helps, and credit will always be given. - -You can contribute in many ways: - -Types of Contributions ----------------------- - -Report Bugs -~~~~~~~~~~~ - -Report bugs at https://github.com/xmnlab/pyuml/issues. - -If you are reporting a bug, please include: - -* Your operating system name and version. -* Any details about your local setup that might be helpful in troubleshooting. -* Detailed steps to reproduce the bug. - -Fix Bugs -~~~~~~~~ - -Look through the GitHub issues for bugs. Anything tagged with "bug" and "help -wanted" is open to whoever wants to implement it. - -Implement Features -~~~~~~~~~~~~~~~~~~ - -Look through the GitHub issues for features. Anything tagged with "enhancement" -and "help wanted" is open to whoever wants to implement it. - -Write Documentation -~~~~~~~~~~~~~~~~~~~ - -PyUML could always use more documentation, whether as part of the -official PyUML docs, in docstrings, or even on the web in blog posts, -articles, and such. - -Submit Feedback -~~~~~~~~~~~~~~~ - -The best way to send feedback is to file an issue at https://github.com/xmnlab/pyuml/issues. - -If you are proposing a feature: - -* Explain in detail how it would work. -* Keep the scope as narrow as possible, to make it easier to implement. -* Remember that this is a volunteer-driven project, and that contributions - are welcome :) - -Get Started! ------------- - -Ready to contribute? Here's how to set up `pyuml` for local development. - -1. Fork the `pyuml` repo on GitHub. -2. Clone your fork locally:: - - $ git clone git@github.com:your_name_here/pyuml.git - -3. Install your local copy into a virtualenv. Assuming you have virtualenvwrapper installed, this is how you set up your fork for local development:: - - $ mkvirtualenv pyuml - $ cd pyuml/ - $ python setup.py develop - -4. Create a branch for local development:: - - $ git checkout -b name-of-your-bugfix-or-feature - - Now you can make your changes locally. - -5. When you're done making changes, check that your changes pass flake8 and the - tests, including testing other Python versions with tox:: - - $ flake8 pyuml tests - $ python setup.py test or py.test - $ tox - - To get flake8 and tox, just pip install them into your virtualenv. - -6. Commit your changes and push your branch to GitHub:: - - $ git add . - $ git commit -m "Your detailed description of your changes." - $ git push origin name-of-your-bugfix-or-feature - -7. Submit a pull request through the GitHub website. - -Pull Request Guidelines ------------------------ - -Before you submit a pull request, check that it meets these guidelines: - -1. The pull request should include tests. -2. If the pull request adds functionality, the docs should be updated. Put - your new functionality into a function with a docstring, and add the - feature to the list in README.rst. -3. The pull request should work for Python 2.7, 3.4, 3.5 and 3.6, and for PyPy. Check - https://travis-ci.org/xmnlab/pyuml/pull_requests - and make sure that the tests pass for all supported Python versions. - -Tips ----- - -To run a subset of tests:: - - $ py.test tests.test_pyuml - -Deploying ---------- - -A reminder for the maintainers on how to deploy. -Make sure all your changes are committed (including an entry in HISTORY.rst). -Then run:: - -$ bumpversion patch # possible: major / minor / patch -$ git push -$ git push --tags - -Travis will then deploy to PyPI if tests pass. - -Code of Conduct ---------------- -Please note that the PyUML project is released with a Contributor Code of Conduct. By contributing to this project you agree to abide by its terms. diff --git a/CONTRIBUTORS.rst b/CONTRIBUTORS.rst deleted file mode 100644 index 53974e2..0000000 --- a/CONTRIBUTORS.rst +++ /dev/null @@ -1,13 +0,0 @@ -======= -Credits -======= - -Development Lead ----------------- - -* Ivan Ogasawara - -Contributors ------------- - -None yet. Why not be the first? diff --git a/HISTORY.rst b/HISTORY.rst deleted file mode 100644 index 79f7074..0000000 --- a/HISTORY.rst +++ /dev/null @@ -1,8 +0,0 @@ -======= -History -======= - -0.1.0 (2019-11-30) ------------------- - -* First release on PyPI. diff --git a/MANIFEST.in b/MANIFEST.in deleted file mode 100644 index 3eec5ae..0000000 --- a/MANIFEST.in +++ /dev/null @@ -1,11 +0,0 @@ -include CONTRIBUTORS.rst -include CONTRIBUTING.rst -include HISTORY.rst -include LICENSE -include README.rst - -recursive-include tests * -recursive-exclude * __pycache__ -recursive-exclude * *.py[co] - -recursive-include docs *.rst conf.py Makefile make.bat *.jpg *.png *.gif diff --git a/Makefile b/Makefile deleted file mode 100644 index b977c09..0000000 --- a/Makefile +++ /dev/null @@ -1,88 +0,0 @@ -.PHONY: clean clean-test clean-pyc clean-build docs help -.DEFAULT_GOAL := help - -define BROWSER_PYSCRIPT -import os, webbrowser, sys - -try: - from urllib import pathname2url -except: - 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" - -help: - @python -c "$$PRINT_HELP_PYSCRIPT" < $(MAKEFILE_LIST) - -clean: clean-build clean-pyc clean-test ## remove all build, 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 - -lint: ## check style with flake8 - flake8 pyuml tests - -test: ## run tests quickly with the default Python - py.test - -test-all: ## run tests on every Python version with tox - tox - -coverage: ## check code coverage quickly with the default Python - coverage run --source pyuml -m pytest - coverage report -m - coverage html - $(BROWSER) htmlcov/index.html - -docs: ## generate Sphinx HTML documentation, including API docs - rm -f docs/pyuml.rst - rm -f docs/modules.rst - sphinx-apidoc -o docs/ pyuml - $(MAKE) -C docs clean - $(MAKE) -C docs html - $(BROWSER) docs/_build/html/index.html - -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 setup.py sdist - python setup.py bdist_wheel - ls -l dist - -install: clean ## install the package to the active Python's site-packages - python setup.py install diff --git a/README.md b/README.md new file mode 100644 index 0000000..55ba6fc --- /dev/null +++ b/README.md @@ -0,0 +1,16 @@ +# PyUML + +Python tools for UML + +- LICENSE: BSD 3 Clause +- Documentation: https://osl-incubator.github.io/pyuml + +## Features + +TBD + +## Class Diagram + +```bash +$ pyuml class --source ./src/pyuml --target ./docs/uml/class_graph --verbose +``` diff --git a/README.rst b/README.rst deleted file mode 100644 index 7f8ffdc..0000000 --- a/README.rst +++ /dev/null @@ -1,49 +0,0 @@ -===== -PyUML -===== - - -.. image:: https://img.shields.io/pypi/v/pyuml.svg - :target: https://pypi.python.org/pypi/pyuml - -.. image:: https://img.shields.io/travis/xmnlab/pyuml.svg - :target: https://travis-ci.org/xmnlab/pyuml - -.. image:: https://codecov.io/gh/xmnlab/pyuml/branch/master/graph/badge.svg - :target: https://codecov.io/gh/xmnlab/pyuml - -.. image:: https://readthedocs.org/projects/pyuml/badge/?version=latest - :target: https://pyuml.readthedocs.io/en/latest/?badge=latest - :alt: Documentation Status - - - - -Python tools for UML - - -* Free software: Apache Software License 2.0 -* Documentation: https://pyuml.readthedocs.io. - - -Features --------- - -* TODO - -Class Diagram -------------- - -.. code: - - pyuml --class-diagram --source $(pwd)/streamserver/daq --target $(pwd)/docs/uml/class_graph --verbose - - -Credits -------- - -This package was created with Cookiecutter_ and the `pyOpenSci/cookiecutter-pyopensci`_ project template, based off `audreyr/cookiecutter-pypackage`_. - -.. _Cookiecutter: https://github.com/audreyr/cookiecutter -.. _`pyOpenSci/cookiecutter-pyopensci`: https://github.com/pyOpenSci/cookiecutter-pyopensci -.. _`audreyr/cookiecutter-pypackage`: https://github.com/audreyr/cookiecutter-pypackage diff --git a/conda/dev.yaml b/conda/dev.yaml new file mode 100644 index 0000000..129845a --- /dev/null +++ b/conda/dev.yaml @@ -0,0 +1,11 @@ +name: pyuml +channels: + - nodefaults + - conda-forge +dependencies: + - graphviz + - python >=3.8 + - pip + - poetry >= 1.5 + - nodejs # used by semantic-release + - shellcheck diff --git a/docs/Makefile b/docs/Makefile deleted file mode 100644 index 5e7f988..0000000 --- a/docs/Makefile +++ /dev/null @@ -1,20 +0,0 @@ -# Minimal makefile for Sphinx documentation -# - -# You can set these variables from the command line. -SPHINXOPTS = -SPHINXBUILD = python -msphinx -SPHINXPROJ = pyuml -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/api/references.md b/docs/api/references.md new file mode 100644 index 0000000..6d55dad --- /dev/null +++ b/docs/api/references.md @@ -0,0 +1,3 @@ +# Api references + +::: pyuml diff --git a/docs/api/references.rst b/docs/api/references.rst new file mode 100644 index 0000000..fb95784 --- /dev/null +++ b/docs/api/references.rst @@ -0,0 +1,8 @@ +API references +============== + +.. automodule:: pyuml + :members: + +.. automodule:: pyuml.pyuml + :members: diff --git a/docs/changelog.md b/docs/changelog.md new file mode 100644 index 0000000..3c11948 --- /dev/null +++ b/docs/changelog.md @@ -0,0 +1,20 @@ +# Release Notes + +--- + +# [0.3.0](https://github.com/osl-incubator/pyuml/compare/0.2.0...0.3.0) (2023-12-22) + +### Features + +- Separate data.lock per profile and fix small issues ([#8](https://github.com/osl-incubator/pyuml/issues/8)) ([91a8b3d](https://github.com/osl-incubator/pyuml/commit/91a8b3d8b0fa2900fc35e3149352a77d0fd40b2b)) + +# [0.2.0](https://github.com/osl-incubator/pyuml/compare/0.1.0...0.2.0) (2023-12-15) + +### Bug Fixes + +- Fix release workflow ([#5](https://github.com/osl-incubator/pyuml/issues/5)) ([8ba1407](https://github.com/osl-incubator/pyuml/commit/8ba1407ea27fb6e1a8712608f7f8af4ee1850475)) +- Fix release workflow ([#6](https://github.com/osl-incubator/pyuml/issues/6)) ([38e9d7c](https://github.com/osl-incubator/pyuml/commit/38e9d7c5ce45a83f6d50bdc9e98fcb76b6a34caf)) + +### Features + +- Implement option for passing password as a stdin ([#4](https://github.com/osl-incubator/pyuml/issues/4)) ([4ab5ba8](https://github.com/osl-incubator/pyuml/commit/4ab5ba8ee54e98b6f580dbd3f7659af77e9a72c3)) diff --git a/docs/conf.py b/docs/conf.py deleted file mode 100755 index 9f6b927..0000000 --- a/docs/conf.py +++ /dev/null @@ -1,162 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- -# -# pyuml documentation build configuration file, created by -# sphinx-quickstart on Fri Jun 9 13:47:02 2017. -# -# This file is execfile()d with the current directory set to its -# containing dir. -# -# Note that not all possible configuration values are present in this -# autogenerated file. -# -# All configuration values have a default; values that are commented out -# serve to show the default. - -# 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 - -import pyuml - -sys.path.insert(0, os.path.abspath('..')) - - -# -- General configuration --------------------------------------------- - -# If your documentation needs a minimal Sphinx version, state it here. -# -# needs_sphinx = '1.0' - -# Add any Sphinx extension module names here, as strings. They can be -# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom ones. -extensions = ['sphinx.ext.autodoc', 'sphinx.ext.viewcode'] - -# Add any paths that contain templates here, relative to this directory. -templates_path = ['_templates'] - -# The suffix(es) of source filenames. -# You can specify multiple suffix as a list of string: -# -# source_suffix = ['.rst', '.md'] -source_suffix = '.rst' - -# The master toctree document. -master_doc = 'index' - -# General information about the project. -project = u'PyUML' -copyright = u"2019, Ivan Ogasawara" -author = u"Ivan Ogasawara" - -# The version info for the project you're documenting, acts as replacement -# for |version| and |release|, also used in various other places throughout -# the built documents. -# -# The short X.Y version. -version = pyuml.__version__ -# The full version, including alpha/beta/rc tags. -release = pyuml.__version__ - -# The language for content autogenerated by Sphinx. Refer to documentation -# for a list of supported languages. -# -# This is also used if you do content translation via gettext catalogs. -# Usually you set "language" from the command line for these cases. -language = None - -# List of patterns, relative to source directory, that match files and -# directories to ignore when looking for source files. -# This patterns also effect to html_static_path and html_extra_path -exclude_patterns = ['_build', 'Thumbs.db', '.DS_Store'] - -# The name of the Pygments (syntax highlighting) style to use. -pygments_style = 'sphinx' - -# If true, `todo` and `todoList` produce output, else they produce nothing. -todo_include_todos = False - - -# -- 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 = 'alabaster' - -# Theme options are theme-specific and customize the look and feel of a -# theme further. For a list of options available for each theme, see the -# documentation. -# -# html_theme_options = {} - -# 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'] - - -# -- Options for HTMLHelp output --------------------------------------- - -# Output file base name for HTML help builder. -htmlhelp_basename = 'pyumldoc' - - -# -- Options for LaTeX output ------------------------------------------ - -latex_elements = { - # The paper size ('letterpaper' or 'a4paper'). - # - # 'papersize': 'letterpaper', - # The font size ('10pt', '11pt' or '12pt'). - # - # 'pointsize': '10pt', - # Additional stuff for the LaTeX preamble. - # - # 'preamble': '', - # Latex figure (float) alignment - # - # 'figure_align': 'htbp', -} - -# Grouping the document tree into LaTeX files. List of tuples -# (source start file, target name, title, author, documentclass -# [howto, manual, or own class]). -latex_documents = [ - ( - master_doc, - 'pyuml.tex', - u'PyUML Documentation', - u'Ivan Ogasawara', - 'manual', - ), -] - - -# -- Options for manual page output ------------------------------------ - -# One entry per manual page. List of tuples -# (source start file, name, description, authors, manual section). -man_pages = [(master_doc, 'pyuml', u'PyUML Documentation', [author], 1)] - - -# -- Options for Texinfo output ---------------------------------------- - -# Grouping the document tree into Texinfo files. List of tuples -# (source start file, target name, title, author, -# dir menu entry, description, category) -texinfo_documents = [ - ( - master_doc, - 'pyuml', - u'PyUML Documentation', - author, - 'pyuml', - 'One line description of project.', - 'Miscellaneous', - ), -] diff --git a/docs/contributing.md b/docs/contributing.md new file mode 100644 index 0000000..2063c2a --- /dev/null +++ b/docs/contributing.md @@ -0,0 +1,164 @@ +# Contributing + +In order to be able to contribute, it is important that you understand +the project layout. +This project uses the _src layout_, which means that the package code is located +at `./src/pyuml`. + +For my information, check the official documentation: +https://packaging.python.org/en/latest/discussions/src-layout-vs-flat-layout/ + +In addition, you should know that to build our package we use +[Poetry](https://python-poetry.org/), it's a Python package management tool that +simplifies the process of building and publishing Python packages. It allows us +to easily manage dependencies, virtual environments and package versions. Poetry +also includes features such as dependency resolution, lock files and publishing +to PyPI. Overall, Poetry streamlines the process of managing Python packages, +making it easier for us to create and share our code with others. + +Contributions are welcome, and they are greatly appreciated! Every little bit +helps, and credit will always be given. + +You can contribute in many ways: + +## Types of Contributions + +### Report Bugs + +Report bugs at https://github.com/osl-incubator/pyuml/issues. + +If you are reporting a bug, please include: + +- Your operating system name and version. +- Any details about your local setup that might be helpful in + troubleshooting. +- Detailed steps to reproduce the bug. + +### Fix Bugs + +Look through the GitHub issues for bugs. Anything tagged with “bug” and +“help wanted” is open to whoever wants to implement it. + +### Implement Features + +Look through the GitHub issues for features. Anything tagged with +“enhancement” and “help wanted” is open to whoever wants to implement +it. + +### Write Documentation + +PyUML could always use more documentation, +whether as part of the official PyUML docs, +in docstrings, or even on the web in blog posts, articles, and such. + +### Submit Feedback + +The best way to send feedback is to file an issue at +https://github.com/osl-incubator/pyuml/issues. + +If you are proposing a feature: + +- Explain in detail how it would work. +- Keep the scope as narrow as possible, to make it easier to + implement. +- Remember that this is a volunteer-driven project, and that + contributions are welcome :) + +## Get Started! + +Ready to contribute? Here’s how to set up `pyuml` for local development. + +1. Fork the `pyuml` repo on GitHub. + +2. Clone your fork locally:: + + $ git clone git@github.com:your_name_here/pyuml.git + +3. Install your local copy into a virtualenv. Assuming you have + virtualenvwrapper installed, this is how you set up your fork for + local development:: + + $ mkvirtualenv pyuml + $ cd pyuml/ + $ python setup.py develop + +4. Create a branch for local development:: + + $ git checkout -b name-of-your-bugfix-or-feature + + Now you can make your changes locally. + +5. When you’re done making changes, check that your changes pass flake8 + and the tests, including testing other Python versions with tox:: + + $ make lint + $ make test + + To get flake8 and tox, just pip install them into your virtualenv. + +6. Commit your changes and push your branch to GitHub:: + + $ git add . $ git commit -m “Your detailed description of your + changes.” $ git push origin name-of-your-bugfix-or-feature + +7. Submit a pull request through the GitHub website. + +## Pull Request Guidelines + +Before you submit a pull request, check that it meets these guidelines: + +1. The pull request should include tests. +2. If the pull request adds functionality, the docs should be updated. + Put your new functionality into a function with a docstring, and add + the feature to the list in README.rst. +3. The pull request should work for Python >= 3.8. + +## Tips + +To run a subset of tests:: + +``` +$ pytest tests.test_pyuml +``` + +## Release + +This project uses semantic-release in order to cut a new release +based on the commit-message. + +### Commit message format + +**semantic-release** uses the commit messages to determine the consumer +impact of changes in the codebase. Following formalized conventions for +commit messages, **semantic-release** automatically determines the next +[semantic version](https://semver.org) number, generates a changelog and +publishes the release. + +By default, **semantic-release** uses [Angular Commit Message +Conventions](https://github.com/angular/angular/blob/master/CONTRIBUTING.md#-commit-message-format). +The commit message format can be changed with the `preset` or `config` +options\_ of the +[@semantic-release/commit-analyzer](https://github.com/semantic-release/commit-analyzer#options) +and +[@semantic-release/release-notes-generator](https://github.com/semantic-release/release-notes-generator#options) +plugins. + +Tools such as [commitizen](https://github.com/commitizen/cz-cli) or +[commitlint](https://github.com/conventional-changelog/commitlint) can +be used to help contributors and enforce valid commit messages. + +The table below shows which commit message gets you which release type +when `semantic-release` runs (using the default configuration): + +| Commit message | Release type | +| -------------------------------------------------------------- | ---------------- | +| `fix(pencil): stop graphite breaking when pressure is applied` | Fix Release | +| `feat(pencil): add 'graphiteWidth' option` | Feature Release | +| `perf(pencil): remove graphiteWidth option` | Chore | +| `BREAKING CHANGE: The graphiteWidth option has been removed` | Breaking Release | + +source: + + +As this project uses the `squash and merge` strategy, ensure to apply +the commit message format to the PR's title. diff --git a/docs/contributing.rst b/docs/contributing.rst deleted file mode 100644 index e582053..0000000 --- a/docs/contributing.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CONTRIBUTING.rst diff --git a/docs/contributors.rst b/docs/contributors.rst deleted file mode 100644 index 9020480..0000000 --- a/docs/contributors.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../CONTRIBUTORS.rst diff --git a/docs/example.ipynb b/docs/example.ipynb new file mode 100644 index 0000000..e5b5271 --- /dev/null +++ b/docs/example.ipynb @@ -0,0 +1,56 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "metadata": {}, + "source": [ + "# PyUML\n", + "\n", + "PyUML is Python library that aims to do ...\n", + "\n", + "## Getting Started\n", + "\n", + "First, check our documentation about the [installation](/installation).\n", + "\n", + "Now, let's import our library:" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [ + "import pyuml" + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3 (ipykernel)", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.10.11" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/docs/history.rst b/docs/history.rst deleted file mode 100644 index 2506499..0000000 --- a/docs/history.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../HISTORY.rst diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..c2648358c2e87b6cf126d43993cd30f0cb52c60d GIT binary patch literal 72342 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..faba0cc --- /dev/null +++ b/docs/index.md @@ -0,0 +1,8 @@ +![LOGO](/images/logo.png) + +# PyUML + +PyUML is a tool for creating UML diagrams from python source code. + +- License: BSD 3 Clause +- Documentation: https://osl-incubator.github.io/pyuml diff --git a/docs/index.rst b/docs/index.rst deleted file mode 100644 index b34c2ad..0000000 --- a/docs/index.rst +++ /dev/null @@ -1,20 +0,0 @@ -Welcome to PyUML's documentation! -====================================== - -.. toctree:: - :maxdepth: 2 - :caption: Contents: - - readme - installation - usage - modules - contributing - contributors - history - -Indices and tables -================== -* :ref:`genindex` -* :ref:`modindex` -* :ref:`search` diff --git a/docs/installation.md b/docs/installation.md new file mode 100644 index 0000000..22ed6dc --- /dev/null +++ b/docs/installation.md @@ -0,0 +1,41 @@ +# Installation + +## Stable release + +To install PyUML, run this command in your +terminal: + +```bash +$ pip install pyuml +``` + +This is the preferred method to install PyUML, +as it will always install the most recent stable release. + +If you don't have [pip](https://pip.pypa.io) installed, this +[Python installation guide](http://docs.python-guide.org/en/latest/starting/installation/) +can guide you through the process. + +## From sources + +The sources for PyUML can be downloaded from +the [Github repo](https://github.com/osl-incubator/pyuml). + +You can either clone the public repository: + +```bash +$ git clone https://github.com/osl-incubator/pyuml +``` + +Or download the +[tarball](https://github.com/osl-incubator/pyuml/tarball/main): + +```bash +$ curl -OJL https://github.com/osl-incubator/pyuml/tarball/main +``` + +Once you have a copy of the source, you can install it with: + +```bash +$ poetry install +``` diff --git a/docs/installation.rst b/docs/installation.rst deleted file mode 100644 index 9ba5e07..0000000 --- a/docs/installation.rst +++ /dev/null @@ -1,51 +0,0 @@ -.. highlight:: shell - -============ -Installation -============ - - -Stable release --------------- - -To install PyUML, run this command in your terminal: - -.. code-block:: console - - $ pip install pyuml - -This is the preferred method to install PyUML, as it will always install the most recent stable release. - -If you don't have `pip`_ installed, this `Python installation guide`_ can guide -you through the process. - -.. _pip: https://pip.pypa.io -.. _Python installation guide: http://docs.python-guide.org/en/latest/starting/installation/ - - -From sources ------------- - -The sources for PyUML can be downloaded from the `Github repo`_. - -You can either clone the public repository: - -.. code-block:: console - - $ git clone git://github.com/xmnlab/pyuml - -Or download the `tarball`_: - -.. code-block:: console - - $ curl -OL https://github.com/xmnlab/pyuml/tarball/master - -Once you have a copy of the source, you can install it with: - -.. code-block:: console - - $ python setup.py install - - -.. _Github repo: https://github.com/xmnlab/pyuml -.. _tarball: https://github.com/xmnlab/pyuml/tarball/master diff --git a/docs/make.bat b/docs/make.bat deleted file mode 100644 index 17227c6..0000000 --- a/docs/make.bat +++ /dev/null @@ -1,36 +0,0 @@ -@ECHO OFF - -pushd %~dp0 - -REM Command file for Sphinx documentation - -if "%SPHINXBUILD%" == "" ( - set SPHINXBUILD=python -msphinx -) -set SOURCEDIR=. -set BUILDDIR=_build -set SPHINXPROJ=pyuml - -if "%1" == "" goto help - -%SPHINXBUILD% >NUL 2>NUL -if errorlevel 9009 ( - echo. - echo.The Sphinx module was not found. Make sure you have Sphinx installed, - echo.then set the SPHINXBUILD environment variable to point to the full - echo.path of the 'sphinx-build' executable. Alternatively you may add the - echo.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% -goto end - -:help -%SPHINXBUILD% -M help %SOURCEDIR% %BUILDDIR% %SPHINXOPTS% - -:end -popd diff --git a/docs/mkdocs.yaml b/docs/mkdocs.yaml new file mode 100644 index 0000000..d916ff1 --- /dev/null +++ b/docs/mkdocs.yaml @@ -0,0 +1,150 @@ +site_name: PyUML +site_url: https://osl-incubator.github.io/pyuml +repo_url: https://github.com/osl-incubator/pyuml +docs_dir: ./ +site_dir: ../build +# extra_css: +# - stylesheets/extra.css +# Page tree +nav: + - index.md + - Installation: installation.md + - Changelog: changelog.md + - Contributing: contributing.md + - API: api/references.md + - Notebook page: example.ipynb +theme: + name: material + features: + - content.code.annotate + - content.tabs.link + - header.autohide + - navigation.indexes + - navigation.instant + - search.highlight + - search.share + - search.suggest + icon: + repo: fontawesome/brands/github + logo: /images/logo.png + favicon: /images/favicon.png + palette: + scheme: slate + primary: white + accent: lime + # custom_dir: docs/overrides +plugins: + - search + - macros + # - autorefs + # - exclude: + # glob: + # - backends/template.md + - mkdocstrings: + enable_inventory: true + handlers: + python: + paths: [../src] + + import: + - https://docs.python.org/3/objects.inv + options: + docstring_style: numpy + filters: + - "!^Bounds" + - "!^__class__" + - "!^_filter_with_like" + - "!^_find_backends" + - "!^_key$" + - "!^_literal_value_hash_key" + - "!^_log" + - "!^_nbytes" + - "!^_safe_name$" + - "!^_schema_from_csv" + - "!^_to_geodataframe" + - "!^_tuplize" + - "!^ast_schema" + - "!^backend_table_type" + - "!^bounds$" + - "!^column$" + - "!^compiler$" + - "!^context_class" + - "!^database_class" + - "!^do_connect" + - "!^fetch_from_cursor" + - "!^get_schema" + - "!^largest$" + - "!^reconnect" + - "!^select_builder_class" + - "!^select_class" + - "!^table_class$" + - "!^table_expr_class" + - "!^translator_class" + - "!^Options$" + show_category_heading: true + show_root_full_path: false + show_root_heading: true + show_root_toc_entry: true + show_source: false + show_modules: true + - mkdocs-jupyter: + execute: true + ignore: + - "*.py" + # execute_ignore: "tutorial/*Geospatial*.ipynb" + include_source: true + theme: dark + - literate-nav +markdown_extensions: + - admonition + - attr_list + - codehilite + - def_list + - footnotes + - md_in_html + - meta + - pymdownx.emoji: + emoji_index: !!python/name:materialx.emoji.twemoji + emoji_generator: !!python/name:materialx.emoji.to_svg + options: + custom_icons: + - docs/static/icons + - pymdownx.details + - pymdownx.highlight + - pymdownx.inlinehilite + - pymdownx.magiclink: + provider: github + repo_url_shortener: true + - pymdownx.saneheaders + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - tables + - toc +extra: + project_name: "PyUML" + team: + - name: "Active maintainers" + members: + - xmnlab + - name: "Former maintainers" + members: + - xmnlab + social: + - icon: fontawesome/brands/twitter + link: https://twitter.com/xmnlab + - icon: fontawesome/brands/github + link: https://github.com/osl-incubator/pyuml + support_levels: + supported: + icon: :material-check-decagram:{ .verified } + description: Tested in CI. If this doesn't work for you, please [file an issue](https://github.com/osl-incubator/pyuml/issues/new). + bug: + icon: :material-bug:{ .bug } + description: Should work but doesn't because upstream is broken. Supported on a best-effort basis. + unsupported: + icon: :material-cancel:{ .cancel } + description: Unlikely to ever be supported or no upstream support. + +copyright: "Copyright © 2022, PyUML Team" diff --git a/docs/readme.rst b/docs/readme.rst deleted file mode 100644 index 72a3355..0000000 --- a/docs/readme.rst +++ /dev/null @@ -1 +0,0 @@ -.. include:: ../README.rst diff --git a/docs/uml/class_graph b/docs/uml/class_graph new file mode 100644 index 0000000..e91fa6f --- /dev/null +++ b/docs/uml/class_graph @@ -0,0 +1,10 @@ +// Graph +digraph { + node [rankdir=BT shape=record] + "typing.Annotated" [label="{Annotated|\l|+ _class_getitem_inner()\l}"] + "typer.models.Context" [label="{Context|\l|\l}"] + "pathlib.Path" [label="{Path : pathlib.PurePath|+ cwd: object\l+ home: object\l|+ stat()\l+ lstat()\l+ exists()\l+ is_dir()\l+ is_file()\l+ is_mount()\l+ is_symlink()\l+ is_junction()\l+ is_block_device()\l+ is_char_device()\l+ is_fifo()\l+ is_socket()\l+ samefile()\l+ open()\l+ read_bytes()\l+ read_text()\l+ write_bytes()\l+ write_text()\l+ iterdir()\l+ _scandir()\l+ _make_child_relpath()\l+ glob()\l+ rglob()\l+ walk()\l+ absolute()\l+ resolve()\l+ owner()\l+ group()\l+ readlink()\l+ touch()\l+ mkdir()\l+ chmod()\l+ lchmod()\l+ unlink()\l+ rmdir()\l+ rename()\l+ replace()\l+ symlink_to()\l+ hardlink_to()\l+ expanduser()\l}"] + "typing.Any" [label="{Any|\l|\l}"] + "pathlib.Path" [label="{Path : pathlib.PurePath|+ cwd: object\l+ home: object\l|+ stat()\l+ lstat()\l+ exists()\l+ is_dir()\l+ is_file()\l+ is_mount()\l+ is_symlink()\l+ is_junction()\l+ is_block_device()\l+ is_char_device()\l+ is_fifo()\l+ is_socket()\l+ samefile()\l+ open()\l+ read_bytes()\l+ read_text()\l+ write_bytes()\l+ write_text()\l+ iterdir()\l+ _scandir()\l+ _make_child_relpath()\l+ glob()\l+ rglob()\l+ walk()\l+ absolute()\l+ resolve()\l+ owner()\l+ group()\l+ readlink()\l+ touch()\l+ mkdir()\l+ chmod()\l+ lchmod()\l+ unlink()\l+ rmdir()\l+ rename()\l+ replace()\l+ symlink_to()\l+ hardlink_to()\l+ expanduser()\l}"] + "pathlib.PurePath" -> "pathlib.Path" +} diff --git a/docs/uml/class_graph.png b/docs/uml/class_graph.png new file mode 100644 index 0000000000000000000000000000000000000000..36f68da2dbfe86be93da3bdb891d00d296381409 GIT binary patch literal 92708 zcmd43d035Y+c$g`l7v>#Jgy8$sFVEdN;#PY?+ILW_mgVI7`a^Nc z7T%JQl8Kt!4c#?~i`CWDvxHc*3th$s#WbU~CH6_P?Xa-;&Th`f8JnIiJw7o}^6J$C zmCJO=s_E(J4@Dkxt_Qqa-P}I^_z||zt@m+OiI`IIH>qy;^rlr1qe%;TdX;t3o>FKH?AH`q2 zdUaRX!@bb%x7`}e$l^~%9)VXDE~CrKk3>zyULNXvxp;hhyd%`ez2xCvDICj}&!?U` z4hReHa1QxCwV0j#&2OdOPmJhQ&+&H4dQOk2d!04;TlQJq43>Mx|ntke%w8KxmE!(zr z{(i6g{`Z)@wYB8Qx8b*w+`d^9F@{fndw(xDY?FnxV!-xWU3P&t@_9BMkGVM1DPfo+ z#Vw`h+3qoSEM;i^f(0g3A!~VMOc{lzZ-sHLQY&s~7=Jz)GtI@v=Z_omW#aeuEw1Cz zO*ytHhv(ia&&BKw7RKA`j_&{T@grAkY^+n0h5P6MMjj81cFALQV&Tr6JD;BWzO<+I zL44o!HUSGSxh&I{YyrYM_>J5~R?JTSKDga&Qa4peMuujXW3w|!GfLWh`eLNAhp>p- zFiq`_lz)F~f%xXlhvPT@==}0!sMWDO)*#zjLO*lm&%VA4i}%7*ab3!h>Owb{7cXC$ zyt=sxE99=MIh&`#CZ)rN50e+ZdHYu8LXWQBzMN*P@#4C=6R4Q@sM~gE-wD0FVv5%&8}#M zMMOk|myeIEjIf;jYHF9$(l$OmR^apE1!H=wXzu0Z1&aqeO6F0;xUAaQfuwsUuLT6? zR^d;FjmCR|)v%4}91u=DI$**ohE@7JH4o1Nj^bdo(tc*oUE7VpT` zUbs}S7(YvQ960{SAX_bdGj;vW9iP*!`JeIBpPu>5jAa?5c3U#m;(c^Op_?MV!s&qT z@9&j;_`t!nTHVv{&r)xD?jmFQg7r<5BG3DK$`ym3%Va!eT?MzDmw0X4+1c6A-Oaji z;lk|~2Pr)2l6O&xGByp;<~H*dE`1Tb!{to(2Qe=%ua4m#A1{vn)W1~7k`Sio*kAnq z{W3h@y#sB}pV)lLwKHmHZk|Wsa+a=Jx6Y<9a{*cZA!`pATUq&E`o2zGH_y$`EB&FMQG2xwF)JaU+)Yf{m+Jv%HVqaV0Tvl@B}L z<&oY`WLsF<)~6XQ!=ButsQ9J$(mdX+XIE}8Dhyb$?r_ZRYutWUud3SENF7c!Sa9&* z!D;ML>t>_;^NWh+W)(R(IoVDd|Khf@vwM}Gm$cp>Yv1f-@5U}Ce6<98MNR>Ml==>#8c%LU zMoQJ!*ULKnI+6JEbD6KseRaME#|mFsC}s|vR$cf{khhhsJt%5tgS%Gr}v{!*A)gc7=^Qwr?xr|TSiwzza1L-9H6!I=B-=y zO0rsp_Zi_NlSO=Gsw=tt(VY_WB7Q#NL0J6diHE)xowV3BlD(Bn{*%PX+Kbq zm*0);HH3Y6^trSAN4=?$Uf&NNv{tTMX^i4D{`1NE5SbHQl{dr(M@N0s5_N=oKcy|C z<}X}W_WJeW)vH%qHfAPf28M<4N&fXP#Qa{ujvt5KhZibMjrQ$Ar(;>dpAZrj5n)#9 zwdkqK*aqC9OZH#NOX};nPo6w!S(D&j^A5ZH#*G{Lqt9K&POn_Gs-(HuFsxs*NXNFl z(2epu{@mH*+ncb#-@nTo+ueNe5R4~>f8+@((7MtR5>}2+O~wC}a+vbOC&idm1nCvJ zZbjX_?O@xS^Da%#=Lz$DuII{MQi{dort z9B6s&!h`a-kn-Dir%#+tm&Pjh+vl?vmrmp4jJtDP`}5(<6Z#CF|yTz&E+v|={)XQr;@6%JGqmSndq;_-|clY+D+?Ka#;J~U)&(8j0hrm-o@V7W6z~s(v)s8&(zGUu6~r4pC7P+`S|hU*0xV3pHa0%!S~g}E{~62l+w?f zPj!6xGS9-oB3bvLtKj}U&#a{c=$BU=xFaeh#g5i-C`CZgLF(`$Jtk#kWq_BjKiuEG zeM?)u+-uFj=onN_wY*E0n5YI;FK?|mc(&z8n5_Ak!H%7b zy?e`EyjZ!*4eQf>plwG&Vxs+}^R(-;pPIZE^T=7>n~hyAEc|%1P*y=<;b75NOTj)3 zjon9&3c61ZRoG1V2M7D&gWkM(BYmbr1yA(%C_BS@pMe2CHse(#x5?z&&5ezpyQ|~% z(v6w0Il_7eSWlfgb^b@q0^IzHv38GT8#iu5~%seSv5XC-+^ZI-2c@ zyz%be-bN&CUKeur?p>2R66@D5S-W;Ef9{XE6dq57CyI02f`aU*&vMqatW=E7gWAkf zctbh6wxfM%wkkX3dAJCm6L@)h#~ujXFgP|=flWZ;=fB$c#6le1h_rrAF0RkLy%C>z z(XvlSi1z_OaPiAodSWAX;>sIyo;#07hHtiIqqdys@H8Mzm5CDZn3nNW7RS)H7nO}jtDK6RVgj13l>^}gpfbLDv0P+x94T~d;bYmFuYeMLL(Y?rIRUWc7l z`7!&FNJ-ZzbafgU9li7Q>sR&>U;OTFHx{lj+KwUk+&+q8d zGdqWehZEdqCOP@|9%x5k^I0`zJqVHfOAQ@-wY|N4rdh>O85x-y*oJFm?uLc!_gyOV zb?8e)rcI;lkJf@*@=|osHGo}JrL_Y^bH|@OdnViZ4eip@#6*m$6^>GLypxqBm*+N> z!z&_*)o9j1M9bltmHf=h@UG{^%Jo9A@osOQ)!^Oq*;Amc^ptAe+ zU2eEmT>ma%Wp^nwPMs$wHP#vxKJ)VRU1z%|Sa|*0aQRyyA~zJL4!i{3=FDfrp7jg`1n3)rXi% zXPK%29OipII#zJliid+klsW;d#5ZZ#_AHOOj#qzon*Nb#DD{>hv3O3Ct*x;10OLhv zrNpjZg9E;(kw4pult0;4g>KwPr-KN|0*;Vx7qa1)fuNAk%l3Ao^*$(u`|+R?&V7H! zxnjjCu$`J@ZSl2+Igi+dw&_MIxk)Y&*c<{vQiaO1sdW$IYsr;`HNYt{va+1$3ijvD z-RkbPG*`y04GmVB+;^2{tnDTrNQvwEMk>@i(lE-~7T;$oGI?Ccek zsh!SSC06}H_ebGX0N5Vw6z?&(&}8w&ex zL`O$c*Kq-_@#W3YBjNxVsTYln`s6}U0;_J*7jsLY`{Cy)Ge)Gl0~yn3eA33A)b)YF zDNX-Gqat@^6)epYA7Xai3=a>tD%xs7XXLL|E-aXto=z|+^C5`C$bBO5X#V;AsY=_o zAN5%#vH_i%^1FTe_HbYGk#IRHG~v=xRV>J_A7Xb^eZP^Hm)9hsOs7X|w!I0y_O(}} zu5p#BByGe=5-=Cl@`PfS2E#5{R}v_rtg&&c(d5|Rpl5LK`-LL~N(;omGz0nNRkgG@ z9;K#c3oX?yd>uT{zr$s;V|wCu)$c;LsfWk5PNFifD{MvQd)(w)HaXH8ual@&<;_PK zo0}(&hBo;C0zYo)!B^mJLe|X(aigQd`#+YFDl9@ zlhBEakIxojzHxZ)3H==QUcIdp+c+gsPKdt#$^ zg1f2dpFc0hz43U!-MhSrKk=+Uat#Y#8t7V`4S3L9^~>ifgP}VD8qCC`r2N`o;{tQ6v@X5HhU^4v_;5SaYAnx9I6m0d--xf=!Rpe zz>y!Y@dCeuDcA`E2Znr?yv>$)AaoBF4i@1;-DIuLGc1q1dC$58Jh1!{z(Lcd-3SlA z3cANcfod)SLkL-SWJ9ySdVjemqrsl6?SQ(b5bzOqYRI(&glqQ(BMoWCHj$ zvAm5?c<&H_u44v-%2%bKt}bog$v}}Vd-H}J4aO@k&*`z*27JK@q8S8aEj$6xhvxaJUY1&Lr(HBp*JiUY+VT!d(nwS#c zQP$~JgVfd=;(O0b{4!s@?l8NMqJyscrnf+y=f1t!>CLvHFMba?wyg5G2Rtw6p|ypH)uZ9l6P+5-1P5dM~@vt zyT4XjtIN(SO;Lltx(@to$>YLDdq+hHZM)EuV9#DySZMj_@v%Z7Gs*ldSfe4q{cX>$ z;qk=mzqMMgz+wGr^}C+&dxK4zb8N@E8@b~51gc)VxCNcn=e|Y+ zxiS0H)ftwS65vIdE$>l7hX8B{M(A$NO}lyG#7Q(uwVP+AMs2h6L3&GY zA>RFwA3JRO(L(#`igiAGn@);Cp(=13cqg;e!^49BcY*@Hln2tdxmgqx6z~*wChEk3 z#-^s1wd41gkfjGLCpTAN`}XZ*&p|?CqEHEv z?AaGMp(b|li_znliQ30*4unK`;^vnY7gMg434wK+hHS3yC6!P%RK*cZ5=Y#F0$C9K-BXAk9BlXyUU>sCHUDrJBTpS!vi2nYzs zS$c`|AM9d?ai1Y*y}7=!Yqd|QbHM(Bi`D^t$(}3M ztV!8XbfK4TMX-NBF=rJ=XQ-n{+lYQ zqdI;s9v1W9YWs*y7E1*M1w$faqqo>IL)uJg+Wg~{hGx=L5R5A>WBqGiy@7OM|NEOp z%QGh~T*Y2p-Q~c(-Vjw%Y(Et^+Tp30LUpvPf5f+1Gtv+59go5V`P92y=IeKv`*Eb> zYcl~ovu``!?Flrtl+*=u!=*$C5bH+L_Q zX9^tvP_Pt4eGn|J3`Gl~$i?Aq8p~2aKP+F<&KLgUXeb;jR(NCgl~hzLB#_Y)`=9(C zbiEASiJ|}%8wwmZQbZeo*rNLJzJ?6?Q!(2%-UM1HpME7MVvuP`HAx zGmj!I1EuIo?Sn&MK}D!I7hwhDI}QXvq%i5NPfa!|Qi7b2ak_OIJHH$&siB>cDY#3YWZV_Q65_m1VZ*cSo7{00TzUZ*IWXfo z<@OI?aG<+o?d>9?qobD1IqNm=DFwo|AbkgNO)0*cv5CngfWlahx!J+t;TI?Zb)zQM z)(=;1Esl6u2`y4LnrGc%sa^V$swa*dIfC`G1RBW;NQ=^_uU%{@=ZRz|y!~R#(Z0l_ zBwt*B)%hN19rnrkPgX;oWdXBAvjxVjEymI^F*ok5y!SAQr59ESgcENp z7xA@g7eQJ1i(Bm!|1NhlwkF+Q_0OV%gO?pWdUQ+c-UO!GY73wXLR9>IU`|+AcyMT_ z1Zw}U#JOdE{q1~sp&fKpJ$goPEM@2ZRQC`men--TM}Icn`aY!fIkde!b-MrE@y!(# zp-JVqZz>QXlP!y{K&meL z^oa*mWH-8?HlQdmkXA_Q76Tq<3kjoqrqe@NcLQl-Up)1gD>QI|Xt~MuUPy=+#I#67 zMm2hV6zu4*V5l=={l{QJJ*aDk4oKe2z`)>f#f(Gb z4^>sw>yeS{6pB$P?!+dWr2PV-QyIsK+=bx9`2__X)~qYU72H~_aoN{*A(%mJQ`+(8 z{ABL}37=KgqSGbwzpigcUMzdjNDM<upyR8B zq8xtLOR{N-dY(U#cxWEloomSR3WK9CX81T8dL@-M906$x+3mq5Bk3wSAsAU(_~g;V{C zfz2?+%$n0puE1G=^6xVGsG+HejcUxlkTN~|@u1GLi}wBj0dM5`gM<{-Uf)?SFP!AZ zN&%q0tJ|FSxxaq{u)~|&S!G>7Qf8IQmoH}tU48dzV2&#!Z)~Q2_JjF3SJyU08r#yP zcZiY|45L&H+`6_3@3$HN-z`|oPd#eeU*QUN8??2xq0*oKp~ECPH}T$svGO;g5_cZ# zVD}$5Yhz>cqNYYCbr#zdT0ev=(9FX(qki_tWms0zt3Q1T1@yk^R|%^j5uKF?R#xqW z&xy$h!oCtV*bS^&8Z8WUh~j`wi{C0bKBlgtSNZ!@qKPHqBAHe8OUs^GLvI}2;Wl~x zZ}7To*)pe@$!x!8`yW!3Pwl^~q|;GYU;@tfv}w-K_>y74{T)8ki#Ko7sY*1OkQdgV zb~@N({@1R3OxDmei-2HLQvt1D6<|i;c;{jOUmA2*Frrto{UYw;JE=+cX^2BDy>eg6?e6p#bnVsduG)^n@DINGg5 zptik;+kGt^DrZ;79#jqc>2dpp#zynJs3%W0{gLBglP3R_!cA5rMQ~7QS(*LM2ASGa zLmu<0kP@)k09>hsVbTLIsyN_U%i3fbMVQt&m<~ZxxKCoR!ir`_1t9aB>3p$>(rQ8j zf4r_O!L>K~;u2+P1dhl@!}ocSFZvZJ`(KmNpZ2qQ)wGb@~(=L{cqb#%mJ zy;paxxhbSE`R>uZVa7oFsmsG7BTOo`tv6Q7_O=tPG7Nj%U~X%6^$D9*Y9SN_g+lYe zvc-$9_??Jg+}UU(OvxTQht48$pKibF!pdKBI>SQqFA zdu`PbO3*$@my6vmdw+lX#LP!(qHeB0ICuEvr#a2&wmXF#N>6r=pqHCSavll%3p|WU zx2%q1S6Jc-NB4d++Ce<_8S$RoXGV_HCTs6XRRWJe>m+^@1k|BMi+cotpiRHa(L98e z2$Z@6&aodVAsu7|%&eIB6I8N6wxp**Qa~FwjTSrPE_>^q+o|S)p!IG!5(O^n6F<$k ztoHZwQ?l7@x+fWZIQeiYKLLYy!e&I^`0L?v&B!fGu-mb9Boqz>1P3pqpl2=u9w9!_ z28R|Vbxda<)2rg||WhHCqMx$~x2?BT5KH-65vTxr$6;;*CI(L*bDZVE7dfyuy zCx_IET!qKmAH6EF z&7ON~JogWigf$&~^?b^QC))kB~&7ycgAZ_Ks32NuCfbpigY+Ialgb)-Nl zf$8UaV#QaY%XOiJn8FMv9xe2tO2GJ+_4SA0J5P@`+nt3W`amxu4hoG5d=W9?ApmPs zU7ELWrIM1;>unku(cAUc*Lx@dLeUelHdi7Z_^E?Q4p6%dE|z-kB_AN62UE6ME?iO3oD-)`DAnrwg4Ww_4KwYM*>%xsMe%co!8Z!x;0ys*VN4=2bW?7!Vj}kJS#H869sapvly;9BHq8x$sP+Nb$%eoaIfjb=73(&yXIUgoGGvQ*!j6dKENYi5hPSrb$eYkv`zL4L}9LdaEm*RPU+>I79t4^R5^{cE`uFRL_P$fPkGxx zqgDGJOu3f$rL*%4T7zKoUyt-?&|(&FXphPTD!}fADuGSnnUb;>1!$Q6&9yFnar| zGf!T{#U(#K9tJs!d8vp}030ehP(ECQQZ%QI{{HB`x7_}I-DL@NjBW%+_*X5!jRY5c zGv|5sdc;M5vujvNpHXq)Y*G)8qy@nvG=Z5jA!4bt);jIT;hy@`Yq+5%NE2QB^>q;n zO=3$_IC6W}4s*qVcy^#&HnEExIV&)L9sGME?|KRRGY29XTh*+z_1y^`QZ5hl@=sgg zKiQkSDz@?hzJ)aN&$zMw%3oL}qV$IN3x1)TTvqq8v*m#&9`#9I6+}IP3>K>%Cfl^s zJ6VP3aCpv5OXEL0MDFEI#okqPo#G+*Ckv5#KrBJv-Me>qd+`6re|V;moKZ%9HZ03Ba?C@86RS=Uf~z)lD_Xj!_k_fdvScW(^Aq%ize!TP^p= zVXH_bHv^~R*oUik>RJ+kpZ5F~w%50Yawvk2A3vTDVXs#Fa}x#+{X~_18T;K@Mw0$k8ZtxN*yu|h zBZ()f00Y>eTtH3gC-qlO5PbsRL;p_e=cL4Nx-{r!evckjlW`t%rh zmMD4_$s|3T46kRcL5$Qrc}iA!)d zWASceS(-^YO?_L&VC+`;XTOylMc}BaWLwvf=xeMzbOu{r ztz<|Nar9Jd()661dIw&HH@C&*%!+@x=l-?N_um(G!f#8f_#vbdO=yU*rn&&Q#OroG})ycs? z=T>m{;W-^!tN15TfiC}D|B+LlTjy!SpMYjoH*bcnyqr3V@_4l34o}+aDaopVK+uM( z1qCjJBStSK2ClH9EB10Cy`wjvLae<&0|GOhRnm~34#8WKBWKFr8cDCL`MLq+UErSxUX+#xd9 z_ch6PO%zS3?cZO5c6SEoMX+MQ*XjKE^XE$>rP9U4nJ5LjHr=Y4gS(lEkq5#KyM%1T z(PtO6Z8xu0QWC~p*$u?_*z7~O%ava&C>C)xq{#lQkQ2Irl(4adg>SI(EHB&wc!*nJ zDlMcMp4yAQi{7!AYREKS4A+4$Mi}js9j7PwTr3QK%hr5(XwKLBc#eY$!v6e#XD-zY zJ8U5umn!!58F=TelRuJpw_lWoXV&rcE5e%dDT(x_&^Khjl4~F7bAg*3s`@y!4T>}f zm@f)d97%|6IU|bla@Jj}?bpC3^LLS3$Du1!!;vM+iy~z(WC3nMuRUpY@DWW=t_TQs z4|Bsav}{NhD-RO72L4`LQnGXZLplH0n0A2>-z-J(-N-io`cm6~3Rb7-;pg|WwcrS~ z4`wFuzF3wCOI_%x{hRRfDZ4+Tu0x)==C@Bp#go!foU!k3*~%n}1lp~^!80_Pezx^( z>N@t91>ZpfgK$6-10+D7*!=dG8}rb4?u?)sA{jTYUl*m*A;54^zsi;=OPIY*dx|*g zgGhd`sxVNkgCx~s{`!tu1c<>QsuK5b)%x`s3l4?bJ6T%3UwXi;WeDdm*wSqC}OlhgsOzp__Cs6uS0*!T4J^(Cri+1TVYQj*mf-< z!tk-FMCI6?(}T5oIj&Fj!u`6}11qXRz(wfX3)0^%7+?^OfsesO(}{0F8@IP9})wje|No31q6A zyZ9*pYE4L&S|^U$SHf=}smJO5D7?d-sw>Z)JD-bP$k`2|N?E zXIo!tT_0FdrAUf?+b>v(j|_8(7&+c~Z6iqu%AIcEr8;_gt^zCCG-WM9P22-}m-;$c zB?3*4x|sA))ozoF%quMf^kj&G4LcdBT*<+w2X0Gx*VfhwPMt#H%^iRf1Vb1Ae>GORP(i}t&oy@9 zTCj;u8lW`pAh-x@W*iK|9vUZ1;K8V|RrG;pw)r0K^`;GBPEgPGbFyvge`M-x2+dWD z&Y$Z0s{ex15fIURnwmZl5dsK}OdOY4UOvXs6>tsdsh=LzH)h948u&GX|IAUWn#7c9wea;iu88i`*Whyhednb8poR1xbbLWeiWVL*( zXyaawq0R+_+{Etk{pQkwLdsWuL%*@vjg&@`F85l*6_SaxpBSFm$02itT{qng`r0dc zV0==ZzrVjnZsus?So6$SclA85somIN8P;`@Kbv!xL37-N{=X^m>^gNU0fFuEdl=gW zfKEv;9Yk*lMR>N-)Xz;I=gHZdWMwZSn@!@_kU_wHK4XD1Q6x@42zb&xcedMV-q=i{ zxKq#xD-a5xC>Zy?z_P^5gAOr|+HBk8g&)KLE%9|;4Gi?YeR~B$%Jxuu1S@1*Ms1+J z^OJu~lrlW$PG1psl?OVBzgG3*pLT$7ur6A3NiDGynZ!#3z@zI`9kjA(NN0kgK@2tR z2Rf^;yBFfOR~|fA3pvUkH_sGtJ2fc;kjmkA6HPPFh=)S3cM-M-v3^6O^f^h`1s)F7 zf$vg^1d&#bjs72b$=J*+Ug~}{vg<_g0zz;Fr$wASqbcv)8W1O43Dix;VGJB>&k~wX z(>}eM!7#>7hawY@$^GpZlJl&1M&ADZi%{b^goT4JAJBp1!ut>P)zvf;6B80Tb{^{w z#NGb_Qb;63h;LV9&8tYPl~{%F5D_W&h58S|Of--Ww`jHj=+_X3ng%oW`EoSW~d zU{sE`1N&4#!O9F!Mu-9=|0UXn{cyK7#B%napddX&sMSI@MA_M|S-skn_=no@ETl=` zB4eSqfHg7DA+%APNrI@ckq`W>0yOJ73=2SvPDJ6xku8)quUc--l6d0PO+^1+qFHDI zEggNn0X}1TZf*rMk>;+X^+~t1PLH8Gf5F0q>q2D=$xM@AY7?3- zv0(uUOWwWHZ2qhzW@c_q+{-g<;)nilAl(;~~Y5d}J$ zj@}27&boBzA81;SwVy4d8cU$|)hwtJmWuP^RNo@C-YmA<8pSMm-#(V(X{NrF?i&`0t%A%bIKWjpGkIk<&#;zUu?u=ln5nLBhcYvv9d_CpP0+g%_NdC373HE zX8N~wd^iUwmR*1)A;12Su%bNSr(raPmE_ZqVUqp%5h4*_!)~n1vjH1duAGn9#~w8` zHr$?tP?{4T!_KHGLLw#z#i6veb~*C%636nhbR4mCF)+ch%ZFXNw;AFoBIVMXH~T== zmOT9E?w1VcpenFg27fkgA_Fr7oyP3EqJ>H?SfLuyPNGx^VziRGGG@{j2aUHo{hE*4 z$N-kJM;4t7E9GXowN+4IK*O3q+@iVe4CHykR;7|@PHBTu(I^9PnO zLx9wJ%57#+9&8kE-63d3(wDHxF5@wGUS=_|)XvH6uNUQ)xzbHx$2?fCJ)rKtf=AN>M$IJ*1va8H6Wz6rJ zLD?aN7sZ_gWQHhS#StHk&|Aw;hSCvSo`w^$#d%l)rVA4VJLE6J17;^qc!80`<3=|I z*`srj0SXew!*ge*h>r`YxcJ?>r5Jy^T||;DSQJz;VxF5% zx3FU9i1I`WBSUjY9-9jwX+a@f8?2LqFYB;8P#hy%e5k3VX_Xoi#MJyCsrR-PNYcendgd7KLm-4Kv+~?{p z!7n5bSL%m~dcy}sEc%WQaZxaONWu*W_dJ$bsi|V1g6Qc46Hvx*ts4M3pu5B- zjeU#HMfHN1s7!J%XqM}mlh(*WXslvJxW&#q_UvJzj3G4kAaxBesor9RRc$lqG zl(~c=xYEv%fn<#+R^ObYuC6yGnitwlc+knq;(%Az7i3k>KqtI3jqVWiU$SX z{6MNLgW&~op-1fl1~C8GkRfYaOfiW9I>?%pv-@AY%1I%OUuW~>fQH5jB!-wofwymh zSMLWhdD+@}%k3&BiGUAcCRmT!M0pCj}R&_xmEO!GVw2S2c2whHC@2;bb7S?8I z`cLj7LUt(L>~~MyIxVYh*4dS zBIqSjE~LVj@gfT91tB^H^uSudP>Br>8c_5KV?c&pNzHkF~UoKyEA z!<4QQU7>&&aCX?02h~DEAV?y-uR+)SJCwLyB!2BtY`y=0LZvKhD^Jx{8U3 zIW?`({-dH=bs$z;zHpVk&3|M8@IAAH_FVb_2@{J+&YIwv?avpFpp6ZIu7B0{U^ISS zvclg_P8Z3Iu6BeB5E_HzKOZmGN;Qzr&cO$4!4x-;81b2q3s`#rW+d@|fwH`zvlxS{ zkl;8;?xEc#&s=V?HUH|nevUc8VPA%ok%G-MQ7aO>Imuw{y|;>G9< z&zv@)sQEx;?u6S7zv&9xI>d?>VZT9OppjWHSh*QUIFn!_;LPDkO%08g07tNCg0O(d zh&JR3G6GI@0A(OjPy+UFPH?Y-{cJNlNNEs3vdh4YeG#|?FdoG0f0k`CHwn!Fw95x+ zGo(+x;bj-z&I@~}1b3nu!?S{by1*-5w{O?EJXd1mVGaJL04f^TbWhPy6N8F%!YC|N zS~*j58IE%%+J`6R#_vfm%S`j~Y0)%Prq}Op>2qRU9B3t&*Vq#h z8hWY+^3-CAkh4ytAn3BPIur-Q7w+}z*Bg9U#LCJsGBTpdDn@h_u^andAXFl6I|BsC zgQ$3TJ8r^qPJhPqNSa4oNMGA?!|AE^x&B}7EgLk&y!IVD$V0t=CoTVpq^B?f=a05p z{o#YC(s;)_6HM13N1N;zfY0Va6^M(C-N`EU0{vkDg7LGqL{=k))BW36&s2-t?t%_J$$EP^rIkZUJG^oAqHofd?Jg;`o#*C>`F%L~nD)%BFQST3j7(!w>-=~xxL zk>_Ck;Jch;>DJ83&fdv-X|IUea@3+d*Pi6%@xc_ngjul?nfkgqCTeyJ602s}njY<= zQW}heBtwf+r+2Kmv5)9_uD{@}Qy-;cZW$;)ltY>M{`KSd%cU%R?KXMZ|AZ}8p-1FBSCW?xRuW;r=Il|&t@ zDl!-p9?q|RSDFbGmBZo!(vwB0{iGzTjf*TwaSC zn`zo(yp#2MduNA&J-XfcfQ?^(i_E8pI16C5da2O1mDm#!lpm})Kfvg#;P%(>S&Jx) znP@$m>`5V$t>L*2Bz%XZJD&o}rEj)tlOkEbq1r_6PX;;d6;uz+ZpXPya5P$MnUxj$^cDm%cb>1ARFeOYd`3Tt^!juO1x>MY8xynA7>FLGz zKE#2DjftU_DNjpBJALER5CTK_*_3_2;&-WG>jq7VSK63b&bEMb`LEx<$0JD&no|xz z-oF7Qz7!*^a*N+5>a0cL=n~@YW}wO2BL3nWS-DAUT;+~m zzcNM-crk7ZX1-=M(at?ov6O`5)+c=jjkcTIB|0;ZKeVttNhr02+nkoz*?1=&^zS<%i@-{Qmh)U{QX4|L$Y{@k0gOmGquOECrf?z%{T+!MeIS zjA@awl~G1_jv?2oe&^mjqu`t)dU}4a*v9rnb#|JPiBZ%BM0cK^|H0|%>Z)aE*nH?S zCyi|Ik-NBREZn|rAkvUVkla#*e7}-&5f~H;06ToF7>xg{DO)XTMK0PIsbhYmK0b7mCEEMFeeeZ8@X&)J%+)fMgf^`+OvH~Ijo44w~=9ZQg5{3kLBOcMk zpBWV$KYld+7{Le4qc9xLgmhUk%mF3}Kq9Ih`1I1PTZfXqgRZbsIB=j&@ie_hkPLne zhupk*88{AEzIkLQ3!7Y5@~@;%kO{uj9Wf%2QxYIVGpD+Ly_L;2Xze<_6MdP|I(E#> zH(oR@f~@wMTS&%|4f^Pj6pX9S*v{MR99pH|5g54+Ens6~!{vVHQa`8&(G?xwyz?xS zIf{bCP_|HovF%SU*}oxl9(D44^pZp!e;jxfiQ{D`xl`Uv7A|PY8AuOqpZfXa`l}NL zeOX55P6<(G939D?+7>1M@Zm#d3Te{JB%j?UYRDelcMu)p!i5VLzXU26pE{MI&%T7h zieE?}62ebvQ`PI&)tLD>VPPSTi70r{#i;32i{7ST2=-s9_lnd#JfyA71iVhTh{U>e zS5i_^G}%#W{>=NdUZHXA7$?+d_3P{2HB`EB3G?=$7hEKX2?d=zwZWZ$3=20lS7g0-|OJ8nVFgSLru+P(7Vd6vt+%-YQ;cQE?;`1`%(#tTHNu< zva)#qOA>3>R{y*j6&jlKn}wft;m?4f^I8BrxQk}KJBL-s^f031e-CG$$RtmncH`CG zp^eo=#jyneT;$;g(N+1@2US(65seWG{0jE!xpPmdO~sr!NcQDc7cB6x?5?gZ zVo%^0B{E3fdn^ri1_z}mNIZVmvz&*AlsJqpkk$s#7)Oy@0ouIMv?gxu&#ay=I(|%M zCMOz&R&F(^)z^^mI-PJCePsc4>0Kh7{sIR>@ zf1>i$tLnAau3nW*Zp8{K!4MGAei-Ljo^!hO;igmPpZuSdy~>ydf4_E^F@cKIoT!EguX8EDKDMYb?JapI0pDmV-$=>mjO1TAWR zOaNNVqtp%@7%-mCxF1Lsee3oA!>YIBz=7AA?+>ixq*N|k7!eA(TzQ_+9IJv@#5PEjz*e3p4uz98=* zi>qC1U}z{`)OB_%WsKgbC3&0lGE`-z>F-OPj5bCCQzD$f^ImD{(YsUQeVu zQoFd-j0zl<0157PbKB9=(?eDjS*;jXxY+5x2ALH?K1y)b5*Q&16~HUQ4ANVUeH)Ba z)#osa=n`mXB%x(h2N-HQ-95HgMGqKsabt@VJD8R|! z79RQ`)79*)Q&E1&JQ9+UrSL#5J<@0`Cue}2uwng zeR-@e2?Y#^FT!lKj~xqyzO$jo^x%oBf48ak@84Ux<$4_bO9a93h9ZxmoqagG>|fT! zUAtB}$B?y|Uja_!g|V6*x0ydh@t5n~|FI@EM|o)stB^`wdkw(T1R@|y9XV2|pg<83 zp5(s@?Z4~+)I-SR!J1tw^V9z9fMNvZhQ2G$@sYZLyc0PEN^Cyblrc#5R{VbuXC7F) zZ#2kaRb`b}&V~cO%%C%bZ?3bJ$Ao~`Z8aK_`G5^5s|iU-;y65pBIg%?3yLW!7JTew zB3|@=U`5ma6)PU>=h3z!SNMh={K0X{F0j6Rtj}us9eB~lwByWp3w40 zXdOdlCb$M5>=z3~Ts<>0WpP#Fn>KObWgoL5Fm4BlTvu1u7)FjB>{>4l)@92o(6X5* z6blYjW0d%)rq!`C%|{hPu*A2S z8Lks&Neuj;(!@#t@vmpM0uB!L7YvkERk49fkAt0PA3AhpZsOit3G^Qsq=}x5)Eh$Q z^+x0x)dGX_v331e=N+A$#I6hAmuG|S(sx$o!jVtk|A|EN2@*YH7R5;;kBOAy1!7+H zIBFv0(4Fw`CM&Wv5&x@Jiv&v#MgTwl{(TlI9id#}FT(31s%V?jccCZ;kf<#8g1kIj z9}~2zEf;#0gQy~t@l5kechBU_o19UjcAMd#QYvVq-xaP^dXeT{v+LZsO+CH68Rx!h zMt$AS$^`uQHrwv`2saS-;9G@uXbC^E>XL#-jh+ML-repbi(lk45JVar^bX$Zt+T!m z>at+}-<3Oi=a)6kTI9>rkP`?Yq!Tl6L)s}TtDP9J%*@OLtPMo2ynXb-g?~}n$7{x% z|AAl)a@}li1_o+`%Fx2tNUp#+937I3aPu6$$n^5%OGrj9z^s9EVx1PR1IQ#sJDCr{ z2p#dR@g?pYRs=q`w6(39zVo_^@+6V72fCz@L+qG8crTF0u5E8}N^k2wO8uD7eNt@qy5P41HbQZvh48kD8F8Ym*8+(OIAf|)qsH!r95z5=y?7%r8q(d3nJ@*Fw z<s@f*FOIw>p86y|qIC7lUx)I3c#w#6(z%i)1 z#AG#lV=kIP=znVp$1zg)59s{S;BISe?R->d*lA))N^O3$n&)zV>jxOsebo>HUn?8eR?*VHgaFF>%>OswocxK5gICY{ufX{s zfHTz4lRrQBIjT%8_GKNc!(=-qGJXi(kGA>k}~cIv77YJ6_8`lh|n+8X9Uw5)HYzzK~q%-yGaKbNI-SFVDx? z%76ee;M0S(Kyv*Io96}QqtbDf3#wH2usFI0H#a$|%>Fq?^<40u55)TB5EKkRKRH_9 zpm8YrUzBs_+!UP$gV4cLSuY_Y$9KjQXy6#fpxJ)uzra@vZnZU^iZ$BS$Hgr)FED_3TD*!6xBU$bU!l9Z(6!?H=RjpT<9 zF_rCmc;demY(WZK=Prl#wVMgUUF0Phd=cXeH8b{8U94yblDk{iJR^F~hsIQI~YBhpPzr*j`qTLmF4C4D<)Uw-}|##{|Br+ zV*MHuSVVF}CaKj#R##uY(W+Y`4?h|HYqxE&fA z|MV&Es#UAPU+n&W7(4U0ob#{$f3h#3tkIN;v5hSfN=Y^LeM$BuOO~>wC?#7$StiEP z6cs{}D5vUNy1K5<`+d%NZ6{#34tG7% z=?O;bA4wzGVennAxVH#k_3E$-lvbs zt5>fg8jmB;^(>eGf>zHhTe?qQ>(I$t%eXOm0&v7Gj&0&nCzoGvQ;9(JW**0qVY>sd z;yK0@8ri-Zy$+S=cXw3iCQm~5Zu9f=Mj06q5uwAi!raQU%)KC)Q{fgZpLdf!*P#i~ zDE()rKcBFrc!+vIwXb^Z5PEIx8C`yxll%*ikNIzCkgPGuBJ^Ok`xFiBaRg_jTlntSsQ+>$7S8KkePSg?pzl z+8Z>>&1$S_y?4clqsm#y67*R?YeXZKS_WM{}rzWfHhIB1c)ZHy{hsRI$T=Oljk+q z)>g)>R-`V~GOrN|K0P+LeYb9rzy6O_TYJO1JMl(=!`mF6ak+lzjC^Ehq6e5ecP^GH}~!O^1P0oJb5#G$oB2qA5_pnsT($L?z?<>PwFf945WCF zlW(0mbwsO5lJm-s(X*B$Z7z*j_EJxJXl%2}>nWljEaLSh(p9gXc+N!f~fFj?J!4^GaCFO5dJsriL zSA8qzt-CZaUk1KkHM(71;me!wCn{zq+Xe<0Wwt&P6mR5mrbuY`>=mzvtbf87%CxhJ zoYorjXX9%h_uaGSIO$|U&n|=2%hz!ZeBWG94ef=J@yG9liYDTUXsNhu;C@^D*muSX z0YaP;f6L5lVQj2P0+%hr8JrVy?&2j&0*1Gdm`a=V{bv}IBPO+x*z7+!uPAhVP|zcj zO&7m{pij_AJN0Y6=zHg_LVi8%$isdj+~S6=&t-)4vtD%m++ctEs;3T!C+L#GTM%^; zu;{cG!<~143`np6hQNMHmv*Cs$9{NjGGc)s;9bV?{Wy)je)a0n^(~@%OI0Mw!sw6x z=%Vk`7*W5eM|o598D?o_tQuq;z4*Yj*{1&uv!t%D{P|E+Ia(gI13e)c*r(esUc8u; zm8B(HM%rcLSmTC86yXqN-ZG}e|L<))>cGgHHT6uzZ6YwLh)FyuvKtEV2_a-@1PCER zq(wcGwWRtnsSOSBu0TGL=$#xL9d~t`*VwJ}S!<=cc3EV>^fF3DB?a=$U?xl+jqEwF z+Rm`F;!Ht!k7>R-2H9>?j?-86`=Wy06N5`A2|h+<=dOnEgU~_ZFrik0ctZ$Ff2lYIN}7l|&`TzYsn7l@=9&z~SwDT6O z_^N)CxVDN(mtK5;?Wg!VDgA~H-8^(0Gs60!Ns}gx7&E3S-Aw4Ke`D+=)1M>3`>w}A zMd^&0P!=^XbkTJw3TOqj?=11Ku(y&VwP;cJ!T57qhfP7hbSNwgXd~!aPd?>Cx94(uX5ZGh z^)-A{q!l^Lp_AZJ-vs{m#b^?82a8`;tsorOB z9|Dk9Rm5i{wS9i08YbHq6_7r%99J2W(jP%{?QNZ+Er2p`x*|pZajEK zmDS+xqsbdmJTdRO+}w-AK#8a;VAY303ptJYJd(h}vh8K^%ZjlcwItU?Mi>vhQgEjTeGl;MC z_4Tzz(z)!}ft?W<{`xi^%lIuKulT#<_e{NWrxhAY`A;k-PW(m9+>_KTW~q(>!sNUq zg>3EMRt@k7IxR~-+?up25e%KXJME2?%hk0vmL%1NO5K0xPz`RNeninjAkKcVaIh6O ziV*40s*z7)___%+WNC!OiWO(nTkNkOE&6vI)PH>Ot5lK>vcj1RgHD}l%!wHP2N%@B zrAvRrv%O8P#mz0z;gxkL>O1+)PMkcc&fxL$&yC>=%sTFD(Y<>UGzPOfwG6!PA@h*a zSp;AXj-l~I^w9>6yG%gb|73X|`~_CoZ>sp)G#}nt=S;r;v&gD`QM^bU`Zk~O1+y}A z)W~YJHj%7cao`5~I}gnLCBSC%;nCI!ZYJQx0t3fAA8lndokVeoAmIu_LQ!Yq-b2A( zxL~J#MH#)#oO}NOya{MQU%5#ZG(9<^YjclP6%=e~lG2O*qbOSym~L>c_16?N;@11$ zw(438A2;ssyEeHgs#-Q|FEV}idxN-RV-AnTn%9p&!s*ke>ul?P9B+uQ=Pg@WzP{}e z=pylu+iK<>9#XH!?%R~`LG2Ce`14#Ud9bc=E0n$koHgAG+T=L+}y zKbdFq0!QPJy#$5}^SvrK3p9=X2UlTVojZvSEPsplJ5n)x7yd|P+ zcagMsf6>x0*;E_4hc<26+-O-H@6TDPZMQ|`J|~nd0dvx5ClrVH5BA7h0QfVL9db1? z-(x1bxqaM(36e z8Om6rCroK%Od5y&u&uwMpnY>L>33_ATsbjk`B+;I{l(16sxhL?g?tTu-2-DrWitka zoq1JD_7|b(YPfv)a=&BY&+34M7k=jZct1Cco;-NqP8{UW+*4tL=I%|^i)kVSw5hPX z&?I}Z0iqO6f+n`0N)M6)bGi6y=oyS0GPsomX&>Q9I^sqIB<(1m(Z3N?30zPG z-&D{vNdl3{orAbZ6kF3#)8;$bctsrnV8fHIz4F7N(PPK9(AN+DwNqMytPV2ai@uAR zZvXM=oME=}=B2GT|7P+J?c0m9Vd)hYXRq!*d;<^d_j*W|K$mj8MYSG4AzPw;`=~O? zhS~aiNT`S_`N-typ*S*?*8?T+SdIxGxi>Q~~Kz*sjpGWg_ z9aQIWVJ0g-p5cU4a>v2>)4>%ePZ0`QA?Nf2U#^7}5#?^cSYL@_IVk(%YU!>;yxUk# zuVTsJq!C7KqpqdZLGk204o1WJk7_kL~f^+0vdIrLCNN6n%f^5ul)!rh3{)7C8vf}7y@YKll#g{`#IOFdfD z)1|n*GF8G|ex34hwa5h+sqx74BBMn5r=|vdqbJq{)ey$=?p<+i5RxNt7@7;t1UU8j zio*L;PT|GQ+wN&E+gb-pmdaYS@$19F!iJ6m*WH;%c*>kIM-22x0oY!+h@Ffe?ae-{ zxEE~bJ0ax^X}QSqtYR2oNRyx3rb zP?ra#@64GqqcRv|`v58PST8;HnjJ<=qpq%TlWlkaCgnG3`MJ1PyExb(SjzCyHQ!Jk zTQ*%o4~P;#8d947vdx+7%y5SznKkWA3Pl!vy&7jCE_1GE@>aZWVGP)8T>Iyzb){eG zV)ou9*zwOz1y+xXX=c}gf+F2cZ)B@A=_w3#+TLgRX7$8GG7TveTDq7bOuQduCUn=e>rJxG~ z)277oTq%hd{fnZ9SemSsVZtBTvRnbkWkltj=$)b#6cjXK^5nW)HWeyMhmgG#;>wCR ztV>IsQA^<)sjR4JX?csVlV?Y9C!j+V9(&T?Xa369eVnKm5gb!P!3bK))4RU+2ifVm z4u=TmsGicpwbVe06pwM;i;_u{!~zN~d|E`=AWIgG7e^byA6w3luw}GGMZ|jp^<~tYtWqO0K>zd{VM%GluuV-i{zBvF@|4t2Zya~4 z-a5r|{5Gli$9-dd{y#?Whm`BDMsQqq;1=oDhxI@H^Hwb#HL3x(i5ej< zs2*DMefyv(YY)*m6S^`3csVF;g+X7-88dipmi@l1pO;p$NjMSu(7Sqsa)tEL*H=dp zfSst@$Qd(^$O*`@VJKO+c=0))ip{THE&h=Gsci4#B~9uXVP6w{JJNFLo;gtxErTvc zfI?cHZjPQarkB4$RT3g@{uUWi#><#<-3e2cfJO%w*vC~Ujx~&bcS-(g>VNy^)PJeU z?s9&hdTRODZywg_&#_w+~dCVB3Fg(&R+#U zezPpo?0VKG-$vh-OlD{oY;tZ=&Y00|sF5jkw}o9u$o8?iB5>8;qT;(A-G#*ESB z54g!RSZ;K!cf6KKUF2i3J5_*9!tsz<<&c|nGv*+I2mWjEj=QT=mT3jig5%wT<^eY{ zR9yI8oVSRSjOk|$AQN5~qhBI>a*2Gzh$&$|vbUJ-T4${p>j|wA(1j_ovt{V0;;4kO z(4_Y(WAz0>L---Azm;VYO}Cp*~HK53pww1j>yR zODn6NAIHFvZIC1%H&JB#cWc2FfwQ1C5WBbsZ_SNlTvSue)6ccXJ6 z3or1zbguAey*> zeha$dq{ic4%VvG*guH1GjwRn)GzgHbipuG{)Q|OSXG@#&QP-dD4v}8y;}Sq#9mj(E zp(Q;s8Uz48+g@R#;acQXvi#MmclXxjlz{0U-o6}f_s8SM^kXCd;339sVA;RF=i?QF z25q9C>=z$|nz^yM5!o3KL_hP}ry3VKB9T6K`SJi*&M~9z_-~D9ZO$$=b=H?|voe7r zkp1FZ;|ZTW#==`PCgm(W=JBVpgioz0g544p#PJJ1$}4rnjmV6c=P+NsNJZykZo3X*gn8;=NH;VjdS@_`D6=GD?X;1He(E@x+m}-AvE(ud~z6~2S3IM5paz?F^ zgug?NMO-1y=nD@4M{$;tD=U6dmNQZDOyr)q`4LR~9HI(Y$4UuZF#IUYE|0@S@PTPK zlG?J|{ASEh@Ng1m#&1ddNv-2SZk$Uth)T7rCNV2NcQ1SV9sebUrJgR0ZBA3k$Sz**CliMZse>XY^3K_aiaskD zqY@5PFSKu&#bd^fUH|;~T>KUq-#roO8sB_JpAB&6wAeOW!A2W`)ha>PEA}lzl;eQu zN+MYSYU~-leJ77uutFN!?li~<$QCXqic4%sx zmGA}P`7w9Vj)@(sE0V56qr&~ugOJ*&Qrc0m%z%X(zexX!oRL)#Dc#I#NVpMbnl?ne z#HW=nOh#Ewe=J|7B(E?lL16u~9vzA72a~oD1NlNy+~aJP5-W}~xsW!*X_so`^*e0% zXoQ*RV(m_6+>t17)yj?;asD{B_`%Syv6x?w{dr&1b{QNT=UcGG)aJ~jgbLBx#>X8_ zOo;4#P?M8*zhrHG*OG;O2)N%8oxZ@krtW#Z^iREu^G(_vd3~?>TPHo0b8Wo3>O45` zM;C-88|t*5XW3Kd`yU3R8r<(=(_h_Ab;fanIqNr>51oEM^VxrYM-S93EEk27a~s_kHH3r9yom3?@c{Xxe2 zF+9A15NAUyViml7Tadn8x_R@&q>ePN(_)vQ68QbW12eFvtZOUB+O!O`e_wX}(}!V| zrtV7b=UQ}oY!!Fj;}HKXXFa+Pa@w%BnT?mp?$SWD=QX|irsc0Z*v#7lyVO8j|G($t z^wHbqNk4QyNDqdKFZKZFn-7Aap2o&LgIfh*2hwvctnyn>*^%3G_4G<<(vb7My@Ae>7X8GHC2)lU{vV5~-5rR_2z1a*WjJL@jnNX+wqb~}DT z507_m#L%I28H+uBUmP89NmTmpN=tv@H}-Dc+n*fX!+Z>rjxrmjVS1Q)>&|ZldabtsB1cL{&?_qt&}4-_@}iKfV?yKVnY^ z^$Yi&9dB(7>refHld+9xDtH-HzRPY^io>j{g)c>Qgr>oge4pr1O}!Q`+oERU6|QTC z=Mg)V*}#DtN4StzMSsD7V|VcCU9;nzoho_hC-3Ts;6S%ir+PF!GFvhi!xaIW!{>KK zFS#W6QmJ}a4gF;6-ZZ^koHtDAw>~Z|E;{YS&9u(dMh!SHl3TwIjS?F+Dy>p*hLA!z z-mpjEM&3Zt8j=f^1Q*`*_t1aCOn;Uz&lJCEnp4l{o!5}}x2d*nGXGF#+(dqYhRys- z56wO0A1oR-G56BHQ<*m<@`LL8!?0aUqeFUVPj&!MpDo7N*g`$|i5~05xG-Hf^dcnQ&axrg>XFzf_;A{D$}1Ms#Ht z#ggEuCvZ=qWfLN#Z=Ptu5qKl-xVpWmW_$V3`VG|7$pnx^xA?v_G9t%!V3gLWzkza6 z2@+Vm>TMjE5y0j|_%D7H4!g(D;L1wS7Izec5^{#5iCsLu1WXD`w;`fX)=97*O586P z%PYMtF>S$JZ_O$;8qe__sOZ)=x0Z!Ci+7QG0`kSZzfTBNezyPkVmf z4Hu?oV4;~4Ii7!|r$jKQbKDWO)KugSln{lOB~R+cz0Z%W;@)xM>8Y2d0Zlo)eE1_T z+BlA~1K{4t5siRA6FmgcMUF_Kd+_`^QFJh&&S6C^%?Hj6JI_O zy+GR2N@mQZTAMp`@4izR?&cPM`BS{VB|Ui{`kN)e`qnd-=$_Yb(JP8j%ZPV1R(V=% z`+o2I+51NxPW^P0l@QNR*>?NjiZg{poO>@nT9y}?F5!G02{7+-80aHtW%Wv(bR$rh zCG~`%tCDzQ7z{NLMwbfT6OGhYITR7Go!zFdU)NN=Z{6DWm$AN#;)@q9+=ui?gEd`0 zoiewDNRB}46qHLk8(LA~9!0;j*wOJINMuvL*W9h!n1Sl7>}?d4l`_Ps?Ao4gn=JK4 z1lz) zXhsa9j5I(i7uaDi_{w2OBogl~Ff7!u;{wHKKCi^Klqi(hZ)fueDv899C5_etA^wT@1X%Xr%OE*Oni z!uYZUi4>WX_*0?JRF*9?E}*^%@}he!Y011R_Z-sc+VU4~88aap8N11zCdCdpa(y{J z$T2Zi#5pS)UGWbSn$@p={~89(ya$9+XY0gG-U7Zd`496?D?52j4!h`55Vsx&)H&YE z@s)@2O75Hf(P&i$OIg-FXE!TCUa(?##D&pA0PaLP>Hh)q)6K)CBvayBx?e7pa<<% z5O_|)hd(+QnmQgBZtVq_>sacNxiJGhS?pCmldOuHQz{I@PR;^wTSfXlurdK# znK*r>k7J`1a9_DV3^o&K5x@HfC@%UpMZKy00#cr{7f#BIT>uuhFYVb@RGL^2wCZm- z-^ML-g2>dZq- zUT}WqvCHaR4{f_7ZBhaQCtC(QrfF;6cJ#I91pW2Z4#w=T0U;mn&0-oAQs{Y97Um(h z19?DU@LF9QOc*8FFcB)&Y|u(VAv?vt)f29ik2r@lPb!KeHh^2{=!qj*DPIG?!zPd- zZU8aX1qSL#D1PFa9lro~-zz-r0`j}%;xF5`SK--V(NqqKWHB{RPgN8cXc5kf4Rp>N zamJHoVAiJLbow)*AG*hM`-2!&dKrmj#Xg+xXdk;rbCuZ*y99cn8_ygB@n1Nf(Wu;5 zSF&vK-BB|Vi)VICwr>7>)5Rw)=0T|uF6RaZrQSgI*S2d{AI4wkh*ak10YRy6+7zRy zAx&WuMdUL7L-)49vyHCq*+U6a%ASw)=$D$gnLw=JG)z5>jBcXpZp*C?Te-nfkL5)N zqq5yH7aqeJkg`iZ=%Ni`hi|r7Jtt8NJU#K&{D>_`u4`mJ!FUAcQuUkU@|?XnTfO-% zgQ!UFP+47FBo_u$B(mFMIwpyyHFK#cbv})h5*E)K< zpe%LcLhMh-9mEGP{Jmpg*RGi?f3<&rtHg2P!l1$8hY=CbO%QNIf5A4>Uko_A_wH0L zlWnCB8)ypP)~2EBFXOJeq6nemsJ4CJ%=J@d7UV^5xoK;F*DhH?3@B|D?|}dUQf&({ zGd6YgSZ$*9wt?oPhr{M~PTmz=#(1eHWD=N~l#HNNCZ4ZrJK|;Ot-$km6#H$l=~BG^ zkzCt@%`Ewm)@PRKa|zklB7Y-XU`_v)=3L!eQ#e)^jJzr;fGU;Rj{`31j4zFUW)o>d zZpg_cU`(|Yj#479xo+c4Ko^@t!9!+Xmp4oQxY9@tH1kv5E42-l1aSOFGhNVRx*%h<`=vq}wj{e_wWk-$TiqS)urW_c zhIZ;)npt6Ivc?5YrCl${*0h|iKfMleUAoqDtDj#TQp$shX?>@HrNO>eS7-8YYPx`| z4aJ?i^WvaA;jL9GMu#n?V|IL_1P@7gb9)=*otkPMoEG_hNV^?!d$SO3d}w1R5Wi&g zTI&>d#*HG=Y03U(GCth30a#0>LT~l;tqpyPYv@qcsBvWj+BZ%j3fR`h!Iw6wG2|re zvf8E##Mj#gFUly^LpyOMd-2Tqoy*4>=Y2$!V9)TV2(Z9}DFGH_u`sl{G<*$QT*=*W z*nE?WvHhOZs!~Z})Wmgyz|*eB7SDw=t4Vf70Dc(Ag3`S2Q4$n)O3a%!PRafb@;-NM zpaC0UWmOH53wl&V^1}#E-h>k0HgY^V+QjVa?B93c}oJ1orb7Dg{Zf|d|HElN^-lEO+@XG!>(dl3h2Nch-%cSIB2deB} z+h&c**LS<$PyJiojdO{LPMbP^_=86OYi6dTov7%w#0Ct+K0n`JaA2zKRuqMDpy(sZ z?hO0eoE-IjRx_J5P0R0sA3AqFJ~q8(mDQ%#_OFzNf#!nkOlPoZ@^2}lJZc|0_!CI7kXPAP3^#Z(k~-ObjZ83}W& z=THZDSF5#7BFX?IgcnKbH?67W)$;cqY(3>n8&;TPUAlJ7K3%&(gUUSiqWwMO`sdAk z(WWHDdgcG`&As?u{;{xcUd|giFtWr#!d1l7ibgUZ?U@ph;2k`?jn{qqxN^vrr~^?W zipl^71wfgO9v466x=M-!D^dp}#1a01Xrp?}j+x#dJG!uCj7n#wc-C<)Kc6)jrI^t* zU8^ET|HmbNFsai;r-LE6Fy;?(b89n#rK+%*ZL1M!Q_)_FT z(>q6i){G41kNfdtZvh)o)i-5dd`D#SB zqL3-mNax{EkO(sIE(A>v9YWj!W*E`JBlSwWbEmPQ#@+>4(*xzo-z72znf3+J`|i!T zFUbfSEV-id3!SheDD{d*>l^MWzncCwVsZg?d_>%#Mp<5ki>m#kn1V#j(4qdz%GG=e9%>CJr1=B$xOMBBs&Nc7_{!oJ8E>TE{)mI>i)}<-}d$u5`q>7 zWI${wL|`$gClvbK+}E9>zK7~{D_&v@8f;PdG>D$b4)h=de^M{jQ+3UH)M1AZ$*HISg6~vD|7zcqpH1@ zIp@(xSx4BaBUaVN3nWZ|_3^1H$XDMun~3_7`^Vi=wdzeyR5+BkWOVVV8_qvfO?&=) zQ?xduFw3y^)WHa^qU_;uj=O(+_OqNJ4=P5yzQLMFxzC>~A`0*P=a+KTk|tGx?8b*C zO9)l3yHig7d(3sX7~u4qZ17(@iKrv$`0c#x(e#+EG z%OHHpUnM!`G!u-9g0d|Con=?Ut#q>fX6<%tRM3Ys+xpRp*i)WB~tx!w-ba{rQCBD&bVBZIab;)h=HQZI()4A|m zZR%Lde~e~+x^3~1ix;PTdxH$i`{a*sD2U4gv+FwRk|M%rp-`ta+Sc@P&IFl%oM-+Q z0It#1Z(VeQshouw46GJ7-qGa?s|WIhoD3Zb_o(a_csz7lxPAFJRaCik>tM$Pp>A(z z&$~PA*+TCqLfyHM8HL69^bn@+?*3p?dDU1s+0EJYwaa*&N(<}`w1Z26&sv9-W8(kk zP}hUbK}oMY;1ttj)wNT1&a*EZ1^LDv8Wf1SHmWaw^fjm~Lwzdz$coaFO#Mi^+(t zNl08QOnJGw`i43cwLTFLot^6u5ig4G-9Pi9Gm!-xPwVjM>qflCU%!t`K%9Kq7iY}x z{GfbJ+kbm5K_u0-^192HaHn_8$=c+?*1~>U z2mDK)#AgY55<;5v0JIL?PyAi#ipHHg)$UfwH>y3w!%Rm_-oD~awKLaI(_t8+JWC)O zdQz|Hky-7!es8Kwj9y$7_PY;bPi!tH4R{OH*VXsy?l#yUY)98r#4^yfTd1%r;N-y= zy#uTz0}V|-_k!3L#p}WQlP>(@`-D%LD@)V%O7@Vb@7W4{R^pNfuNBXi>?h%(V$c@( z0&!_J#9(;1jcM0NtkA&ABL89O3r})ozIu3B6+Ls(M3jAq?kv}$Q<+9fE!R8ucKRQu zV>Z_NdSpCv|F4m8%HXaxPwhNge$fI{-pKEBck7K}t)uI=0LDbk+vMf-!XWwI&A@c) zNlbaGkTMhdUj=xO$Jab8UA&$B$pu5rq$p?_P_xzMQ2}gGl-Z8|U|nhET`h5qiFrX>i8iUzHBqOD1I9h)&Tn0>zsc_% z9Y~;A*U{q+0$gJlvD?i2OM4g&oRWB+sGAbfM z<6|+Aui^?O9)|v@PjDLRFsd+sd9;qqn7sAvQ=bW7qJ6`S=H_;cXXay_(KL-;gGfdw zug^~%@-;M%%8jAlK;U`=!<6Y8b0aNZ$f zuZ*?k0RaW@B-?<1pdwRoP`B;YZ3o47gD1JoSDqRvqY14z78(;1Gszdi!qAN>z{axS z&d$#3U+ei??yt9P>(Job>(6G#89)LK?BBn$Q?oT=1R{+b`VENGFL?4-T(rtRxah4* zXI0c;T^xidepjY$Pl^(bcj>(UEX6LpK4{BKoAuw7IKrh#eVbvmWP;Y8RUd!=h#U|; z$v1{}+@(l;Y;v{Q6@Q3Bbv0HGU*kH-rK&PS|BF`sG9m-)Y`x%npsCG^nqvu2!)g2B zVUvVJf<{oCrvH)tu&K=_0c68${nV#z#zo?RP1_5p?GDUpR9XjW94Pnqepbh8uz7jt;QM7UT8!OnBDPuXdL zFtQkD+QF+DE{n_0nF)A{L?T-NGBE&!#T7SW-%S-oq&X5;OJX?ahz=;S-nJU3h{TvO z;uq9kHguvi@vC@>>esJtW+^-YpsmPjgw&OtDWluTBAY_+a*bmNU$L@1|72yGI>*JY zY`r$T^>;Ea%nIbJ;0QX0mxkX5b6}!GXV8@+N^67)fsU8K<|1RK2#Iq~`b};iQ z3X$lty?VupUSh1GmzMpMsEqECzktbCkS&9A4dLRwg4xzp)%75A^k(#OyL980I~ zJGef)bpyV@2C&8I%E-f`TlpoxPFA{+7tVH>p*Ca*_yh+BkC;HjlFB~HO?~xLFr1o7 zqsEP!T{|2W)>^bLbP4L}LJ(s(wr_ax_U#=Y?*w3Q+^e`Fe^gEQVaLEqW_)Dd>jhFO zIg8H?(h=9FE6%{uLw0KyH}vI2zHixbm$CQRcD~a3S(tM=JTE;Z0m(KU*WaC-BFnWj z&-5ToBd_o7T3zhQZf>TYHE3(9mOCCimT-O5gsYNO#YTR0X)A=bH`D3-9oEhtD+Flz zXap3|=IcsCks@HCvd=1n`TEAQWpJbAvt_|EX5al47j=bCzlDR*q}Xht2N(yDHov^u zRqNC2rC^APJMx%6sm0DhE#?~}Cq<06+gVTx4!j%$-QA_vXASADIyE{CZagO3oz$oiFXIuBS^M-S-TVgd}qU&Gn7V}IhMY4bZ5 zJ4gd-I3u!AlY>7EJb*y1CD@k)UC8?eJQ4>)hTX);jJZrBIdnZdYdH&6zSng7_Ezo-G z%quY1%U59H*Erdup~})z$F6ADtg)Umr!6D`kwtP>ED5%e?Sn#f;0!Twd%0=Kn|V{{ z$%Gun@swIE7j&58hs+;G{F`}o=NI}CD~itcuKn$wRFuWbeqORSsB~1b?cIGb%7B4+lHu_ACR&pYZ(P$0xdSV7M_p1|-&kx@Z`Q2VDzm9QP&z1z zCTWBK7@NkVl+%zT1-Dhl6>e5mN9vIBsS zkWE*UG_%#7g?KO=jgx_v#7YEv_m*enIMjy4w(Z-ttwMg$LPuv`(u%SVABK+^vyR;q zZ=A1s6*c=G#gQqofiiIDP{X-<(GA#T$7dZ%`BM8tVZ|3S<82;h>=p`+&ViPeVD+Ne zWc1Yk#b?KkAC;&4Vb?h;EG=OdtGJ`7P_;wQDdJH9jPwGrSiLGN)PXAtnl}Xr)n`em ziObK*a14%@ZP*lefUTdm3NxwAwy-XimIm|gv}Z||-(y$eQ!AOl_we^-9{j)S>l|6q zridTjJEKvps^kjTIk-Gy6oVKQi<~UI!p4(>6B<7d*&glPt4|48U}p!>UrnMO$jQ-| z?(E`Ha``lpaY^|ghooZQH*4h+fEGZqT@*mXsW6RfBzbBu)XB!7JSU_*F-jXHvztVK!brM&VI)nPcKv)^dwejm6#8iptTs^kc}hd((6H_^y}pGYE6a|rWCA#n z_7(+V;u=?LuQ~?hO{)H1lb)Y{12SF3=LW7OZmD+8;H@eOU0!a~cLZOM)?SZ8YH>}h zQA7QEVOJfx4+bu+%-HUUQ}@0SG0IwCj98(?|$(+S4ddi%QE1Pvhu0PZJgUT@VW6Z;-mp6=seqe28eR z>%Q*Tp+i;C;b-n&)a6cawZ-!cQR43KH|x zo3R>-@TrkR8vXYaiX66uULeAdUuY=NYmuAToQd@Y>_z{MJJS#x47v9DTRQCIy4T0F z+tILo{hP<)A|rR)cYAMlA~N!O;+t=3MEz6FJrs?%rzh@}%jeFmW`Z!jYSGGPo28zv z-_Y5wdhCAo_HcN|nYBGj3$>mjZ87^NOx#)on3I>~R6XNRG3eH< z51fB1A0n3zX1~_h*lL)+;8A+|`l0f8FS5se% zX#9AnJ9lj&-S$OEN09_6S+z%tVyNSq`JdwIYVGSKYhMt(kKv`B7#rd)9S;i1o4I9D zINAA-$*@JI{kOUI>n3OZ);YGei3q13Pyx}8EeTEwCE7`{^AS|8CIoGA zSa+v^Uc0@@0l!8X8n*cjjkfREQww4b)%lyZ*Ptk+qd6(Huiq=e*G48```UauX@R)&14ugtUO$qWbcP#|0aUQSCbv|fiaQaQ$-O8UX@Cc=Nogi1JBaayjx7g zVgatRGJ%{RzvQ^DChcg?uUeAuv)AW0kDu)oei6d9hH`lHk;xaC9y`Cg_iZ(DFn8r* zC#PUU5pv?&EvdAf;PXu?fX-=lO&@zGm>)axU7s0X*O9w zih_<<_PYaJO{4P_LB3=j(ge_}(o_-<^^o+8Y7%3NZbe?22{jp+J{|QU%;bvXat7R< zE6f54^oN4l62^YF^`rcD-I+{fa)BO|)hgn3t4+CC3r1!*|E@a)-=SF)>I|ThYuB!6 zeat7%NkP`%f3Me?@Q>%RF`d+@$*hyN@fRo*<~kpn2-mv~aNB+J7|yA7)^W~DW9KpW z%EBTg5u#9rf}|EN8Dbzfq_q(3c+fc(hh+YKCg$cOd*){hVurE;kxue| zLp~4j1(H~+;Ib_-U7lP`5$tN$hANf%#2V5geBNwhc`F}*5k+Ph@UTpd#FDgNbCqId zc^cae?JLg}w-^-AZ5KcAQwM5IH*^sDkyaK`omra5VUUoccWB6G)%^EJMh@M#g zX?V{tw?7%dVx?p@ZXu-dQzB=p6i$u2^j)+{J*$J#3KO0LxLg|{U~X}$(-)!d`*QI$ zINRx5Z((Zzk(-EO;%F^TqyloM2199B>|8`R(?XENq1odY zk*X`=xV-$X>#VvJ#~!7y>Xryt0?o3YQO~mPh&ZbxEZVe05G8BSOu*563p{RQiy)6& zzSRh{5nC+8aE1(g8Z(mOjsggyT=xF&=nHE;IQ!@o_YI4E^SgA{GpD_zPoara6zS|G zHIhm&l^KYQtIs>zvsVlmGDD-$)dS2Pl8E%eA7-WUf(Ls?4G%Om@{VpiL3H=ZIZooqbCjpR_fOFBFEbKeO}aMyk#@GjEjo4%ZRw#`5^I|dU{EZ zitH{jx&+sK^z+W0J}8qx^HJeav}hSC|6VEc)u)wn7j51rZh%KuHtZky(8(Wv(9+~+JJiuNHC^N$|ak2EVSq&C@)v+q4V%FgF z^o}0&^e0O_{a$}0-}UhjIPX8jvwz~sS6iYfAZxQ#PMTClqLB>@-puLkwRCNH&+0=;lZNT<8Lis3J)G7lrX=}KB;ZW^wPCc=tZ3rX zm8Av4+nh)7&MuqPmH?g*EV-sS~nBAx91+usx>QWbHKr59ldKn4Gnkq7#2#g4~-%wt-TL z0)oNUInE!Gp31(2Ph|xjOFB(FZ3gfV41D-ckI;C8j)*5JnK89_qGUhgZK3xH&hH3DQ!rWh80!#DCkiKFU)T^XwO|CTK_p>*I+x#+*%E_w1zMX9w1ZHho^$)1N#x}lnM^$BXwV2OG)`&*}ix0 zf>+k#T)wWx|1=SCmyQY6r*Y)+9kFcL=>U=2RB@Ns0nH3U`+NN{3URya-8)Qa)3ayv zq+W+dXV~c)pmoEA6q~w~@0cpi63Go8C)L=oeY=MDOoF`-!SP>lF^M-*tTpNJZ*C59 z;5VN9gaz*NMo*k{df_T)f_|2k0493d`rn#!ABnV{@&@R0PcN%G+D*(SU3rXnBV1P( zwTI;l2NYlt^SHQk4Lopm0xx>9EF=fmS5elPs{q6X#dU>#^Wf7^G)z5=h)#EWNen|w z$^;Y~ELrXwb?DgSxQ+BYIBH64>uPHaGBcAscd0jTR$67Ipdi63ETToxR0NaBe#gdqJr~HR5w&-F_G$^_9_z(kQ(MK1AiS`Pm#v*-v<=r5tt&Ub1P3XJ3>3!+ zzWTrl@_snA(dFuM(XC8dRu z2ul5u(8uENSA)Jy6_;6*>y}9)Er;w)?(}GyTT43SJCy}hKwygPhevV~t<0I?jCmq1 zN8~0j71phy0aGeEfWBlM?mh29{C*>LNC1=1ep=w?bpI@~Hy>$DKvX>)od@BsmVD7d zt3LkD`imCei!S<7;o4o+?F}1F(~5Q~&{n3R0gG#@ZPTj47-h@-AT&9{?HX|y0ISR8 z2-1t#b5ajuW6f)JF7<};WykgqGC0pJq~Dtx4W?1MBs=M!dae)Q{s%c#J)GaP5e08X z`q6PBRF|&_03jxIqt${}KL28?tA1e#{7hA749Z&u^RK=~Im)=JH#2)rr^Qg*qwYJ` zMjl<6*ml(?kxuCE=}>-TY!7rcF6Z{^!HIdcqz1w(nLu0F?LkK?eAIR?$J(;UE(Y+yCZ>$5YbUiOY_8a9>p(;gAFiToJX@5bn~$HiD(5VVMRjcsF`UaL&5*m4Eyq9&3g)h6;$N4Tp5o8@=w{I4`I` z@!BJY55HUaBFn{k%$SdFUv{74uCws>hglxJ8wbwm{@r@>Iy2_q9Pxwt`9T|O?mB(f zaK#J9;r&1S+^vP_=JW+YyLUBN*v0$mn>OFiT=V0e)qUQM(T#3Xqs_v?8YkRVzJ0X9 zM8$b{!yVUimlwZI%y0=U`)$+m7hPE_X0<88X2F8%%xe?&hx!8TNOJ7>Zq-r^FMDoP zBXT99{eZP=`G?e51N2(*51xjD>gy6eVjeNB%ee71bjM$&GY7(WAe2nraQjVMtvr+| z4TkkP3kb%h2t$_%YP$Iio2u96zd=bDs@_k|EjAnA7|A zA=;VIA{bHb1sk=8R{iDYh6-7cJY-yMhl!_;U(UL_;DX=$sG~j3}p`) zc=7K*D|FCauhzZ%y`CP#Ua!q?RxSYFhuR?X*lo1*$bfesZv%!6n+>MeL3`8ZzuP%! zP^Y*V6GO)Zr7Aa0&K~A7=9iNvP7J=n)FCz%N}Q~^1(F22r6l(YPE-HxyQ}ya#Mdwt z$X}6OkZ&K#UPXkP(!?YudqCxjGW%pdC;Nk0O!+=f@CfH1#P0I(xy8V_9&?=fO zc)L2&Q*8}M+TXy~p;|3z$j9&3+D;2S^)gP){N8E^@~Vftyu5tvp@*_x%wzlV4y%wc z?xnB<+eZ#;s#>j4)24@&rB83@K8l1T9>X&)DzGc`{wj!o2D2k(uu0LaQFE_sZ+nH9 z8I`&8qRGz8jeeDGac6kXB!_$ys+i}*o*g-HVkDpVaFw~wZXTF*@%}wWe%@^e(e3b@ ziya(BleBq+Z3j#|gISUn0v=`fo2*Z1v=6aLGw+$?C)XN|8@`LN+oE~Q@4=|lZe&cm z7g~R&W&awft!@=eTbjobviNEbbQx5( zD9({)1v$T1?nya)wPodpHGCqSS+FP=C62v4^SiTy%e$`yFl957f5o$+aB zSIdh&efnN!d%vL*;AH8(=sZk6eu(s;1JHHU27A9&Co|>p<>>q+ zOAGF6xicl-cX(kQ(NYd$VAF$xcbg+Y<`-9x2yRC;vV`v&Wajeq>%l8OeN4_>`F{C_ zNbO}0N69L3|9t0Ik&w(y_2r8`~27wCtk(OtNL3; zMkR*dcfK1ZdH&pL1DAlo8ekMI=K0z2ey}vSxD){^DFVzHE06}jwVk>Y$D}H_Lj2@; zZ6BWkQcA+ICPI0>j@C>t9(&`Bjf_T)8FTyhcl1~)H<%zESMPY=3_e|w7C zyYIz7ORK=k{h}D^gJ}{sXoS(&Q^aE1@(Krr_(u1wn$K`Gm3Qq7{ok` z_N%Y8^{(HhOwO7gOTYP$0`ZXA8xLoylT~|fk<9XNwG8d8NImTfnMM0h50>4r@{u^2oKfo@bcYNxi`G;G0sE!!e7WLY!_F=uzg^ea)YY&D7tlVQkx{@7Hhu(&H zMpd`tc~)!`I`G}V{auakJU#{7x4>&2UHrhdGe4Y(|F|qSG^!ana+iIMP!s3UvUn%g z=bAx1vmK~d&i3!G-{lUB82;SwXmm$1FUQTA)r!j!`n2=ZME5&&`%NTS?H5K@Cf`0j zHFL|pEl5}19$dxe)F`B&1ruW zML_IaDMBpMoOeOg3}rH*%S7G$0YBBKscYGlM?CZNwz+W(BZkqLrJ({*6Qg%{oW8+< z|6MD!PN|hNl)L3&R69UncM>pqHCs}{YzFDzuM+AlrM^6Ieu^9p-G7NII2va$8+b(X%Z zei&3+cWqNarR&yx%*(23_tJ1@hDnQcTEM=jbCfhml3cj-+6}}c?@$CSe-VBW__;NS z;3QzVl@*PJLLR~xgz|G17lR}sAQat<`p@63bdLYBhc(^a{n3QDjHbQaJ}k8nr`4YM zopg0q5i>wrp8d2ddIsX>t}~<-+^w=uH{Y-eO^a=V=OwW*#gIc&)|_A{=$jiG69ZSp zYL_Q<3c4{`lc(}4DFNP46Sz_Fyvb&qkKh45V3)F=k|RW1O?^$xLBNb0RAjL5&oPB} zZMNWG3d~LB!{HTg*ct%;ho<(3J9EZ8WXa~WwjuJ6M%1LHwmC4k?#h*)s?9`U7H@Bi z?x6dbokN3dFg>@bc?Xmccq}j?;?`;PxzO_7OA+8oD?>0N4Q$h2tJi7fkfhOUUOi~q zCowNcy{o83g}c|Do>JZtrW7VtPX9DJZE9x}jAvoaG+T}v*cL!Xv+PY7b(k`{XNPT> zp~pef17U2|gQ33c$h5I4CjW2#WOLOSr;4!v7M|hJv+7Yv8*L_ z#$cvz@-lZ4uV}DGm9Wb0O)YHlRIu8VmxA;j?LL=+$0ldgN_6EYoEyxy3PeUH)(m^q(2d4CT&P|R%zFw#iPyl z_~ZtwwCXo*oLthQNEjK5owQw-E;pCC&YgRtS+8ZN!B30?m$w3V8$}g)PA*v2J5Cjq zKtK9A-npYlcy`dZ@g$Fex<0}Q8yIr?2+ekP&m2nSoD*?08b>%WAs~|7O9xXYq(yvI zRGOJK=i#v%VN-fXPCdK&PTfcLJ8T1P*;zN4TtnCXBySv-1xpIJ>S^z<{Xf>;Jg(-v z|NlQR$llnM&>*tQ5+WoSNfAXFSt3b`l%k}JQkHBb60#*ENh?X#Op-K7+R0W?)=H9o z_t%LTGZ)wA`rdB8Kd!l5({MWHectca^Z9&i&w2g6IqRo@=KbTW?_(3obJDh5J1t#Z z-Q`{@)pT~vHsc)cW`Y%;907Qo>&HY~Kf^kcM83|>rgly{b_aXP6=^&}m4cC;I>KWC zXDrKXj1&UL7Z*M&N2yu*sm1h_O6B(SD;OnN>}K}c!WzmPanI3?7Mf9`rPW}>Wqg_+ z8ts!Ss*@i0|8a_cJLibQ^}6fnix>Ap-Va^zaJ=B|`*$P0gFC@0GN%`GEuT zZW?bm?0K|((H&pW-kLW8%W{;B%_lnr={mhy)RpreTbiYcjh*0E#3BHqZMb?>6WN3w z@Y2+c{jMvDlAxJ)lepG2JmNWr){4<5b*?RLo&PrPaE3c=70-rU(2KnD?*?R&#CA15 z{{WBpKELqa&hMf*!A)sDwXAviK5;yFcOcy)nWE0P0XQ#~@IsJUjtM$&fM^agqMwce z9|)UWf@y2_D+?ANG=5*2*&MEo`~D_VfP^hcEQ3BM)3CAF@dAwK&DttFau+c%DGxz+ zG!%m;*c=inujD_r8#FthHyP(Y4(Wyue^3HefIY$4ji-8SSep6QAQUjDXSuPo%r)Qa z<8vcBJK*=<8-SmW6=rZh1Bply{Pd``+X9A4R2mUh*{b4HM++dK9UxkXgMA`HJ60pn z(lMxq8UMpI5wlhd10E<6_|*oAyO9JHO06 z5#P){u?|6)dnxwofy3#to`UP|u`_tf30nQQTiqX=Y+I=lqBnN^_Y7RgqFWw^R>jpbxbxj<1ryY;NpZ` zZ4puFg)C36LD|ak`Y~b)m#A)L+s7u660D1|4&H0X6di^keMiTbH&r|?5?W_)u=8*1 zs{m^s);;@3hP=WHT*aNjPog}b!m{e98Su;F;UqCz%7qZIn%onla;fBFW!dtT^B@!{ zXwx)ox%M(5fYLWh)=tg$XAlaD2{erhDPycf58&|IPhKCbB5C}robebWd6aUp_T^IpTU z&Ox@G+14kz9Zd*W{=PBu>*j`2wFWrqE0xy|dW{G;lO%0ZoQgjba9^bVUjt(#9gTT0 zm3D?xi~>hbGj1?pHM|N0W|8m?@*j?+e*F3H$75ozXOewIc&xyx9UP7^Yhw#Il)kt) zC;bGMogXV$Kc7pFw|}h5{Z7|x0rw?$L-e~1b)M`Uzg=2ve`l%{@cp=PLEJx&f3gsa zDBolnH##P!);RFSR6p_kP+h%{s6{rUu&m|y*|R(7uz8dvzbQV-h9Bafmhh|Hk(xXX zd0nxD3NEO?4OfJba1>YxM6uYwE_R^NMhMM3V;!smAv#Di!``&5;iU9^-n2yvt?(@0 zz`)$%cSPJZ80=7dw?p|9rE6wKaBfJmMuHUEQ;-BS1AV_5Opbz0_9bbid+4{JGnW2sliEt70SHi>JrT} zs~x1Ks%ii*tdd~r7U(=H?-V~gNpl?K*vTnWt9kIgPOsW&ddJWC*C6%$QirZx?=b5C zkRM9!iJjS!s=jIK)}E|IZ{MR`Rz{+m8#-X`O`DdLO)uA;^43z9=;2iZOfT*g<4Aww zMFw5TyhqK71jHuz50AK2=eALByk9Uiet(Wqgo|HZCg&NqOtiIf=EeN$2E!9>F82oM ztRDCF{rjE+1_(p=Q8w((mvURxT>9f54o_dpZd?-- zwBii!N`@$9<$bf*>@bLGuU#1JQ)zbwk+ZpW;xUP(!yld;Gg zS>RUZDrzv;XzGOmHW;{LdPTDED{3?NC!4n){~FLNwp@1^`z*;J5^<0~B<_A%m+~V> z^Rd+nY4LR#Pas(xy}pTh3sG@K*cMpbk7fiJVe>2pd7oHC$yryI^23KyQxUC~7Ay zxm#5F^^@-HvRjveo;jJtceLX@5LA#%;7_p7ucAFVdU^oEg+3VfIhWpU-I@$WcwG`eX*sfKm3! zD9SG{ew<0jr!YYwm17^{<;?SHe@&g{f0o+@$(*@#M1Hr*d%NaZKXy^_h-(C*-E2DlP|L?B=GI*M*ggEMer!}|FpJc09bMg7d}Dpt3?pMn zC=IqH!&66&Xu6`=YBn8_*5La=>P}}$^Ug<(UiT?(G&^OS={fi-yD#7yFwi+kpWbgg z)}ubbexnK3a)ui5<6@fHW6gj1=+R*`^M@cFGm%WSKg5`5S!vJs(vR{IjZ@l?MSa|3 zr=^DyFCo%0+aKbb4biB5KXVnHtO^q5r^%GktD$Y4`4={mA ztTS8-$b3@TX7lCF#L=R*sYKf?6j)JD#*z}6RFik2(9ggU0J7P1OuarDFBnJKA95_q zSz=V!CwLY(itcA8W!;`S97S=xhpYW8A_^MVtiD%w^RqeHxIW{)&Xa@S1^eVaCmJ|!GKu3b@*F?rg7(S|A&Zgmsp$J!itvyUp*=mZ<*I;C(D z+wPTx5%0r39C1m_j9rVC*!*(L&j1YEz@2A$sES(1xOEB{u7I%>uS; zNmok(evjw ziO|{zcvxebx%WkdiJsn_RnOb}1$MvIxH?94GLzigyV38)?@Rf%QyURrZy$yXRY1^F7CtegO76N*xu{Norde8X{I zXWCUU$A~?xfwi%!vt1MDYJjizUA%+yGH&!Bov0R4Fl?Y8@kJmgab{N$h3(UoBUeo< zG|i4$=9}C*o0gFC4YbA~V+e3bI>nt4%Gu=p{qsh(Cya4^TQ93Ks(BncWg1tNZ<#on zy|uBH1OMvz#;u$+?p7ZgDU_D}d+B^1@&s}4u@thU#`80E ztyj7(5=;ZBsc$MOmH^|x*xp(lhU^Xr>_fu+i1}7XFiitr2QVA@Vrmcgb$Z-UY?xQvtdnb`kehMhQB%K!~*C` zu)sny(&1@o;8!ic%z5)%uO%AR%4S9<`;Dr7R$hJwj5e@~@mEYGtE}}x4JmWsiKH&V z>6NL3`x5qI0`PK|F*FZcf62D4V|7Tz8u$4_53q51y7k;BL@DUP2SSqwePi6{MQ`c3 zXk5CQ<$`fo7~BE0B;Q)fid^8dhfW_R4l(UI5kF(=^g zN;?d5$>$X+CYue(bb)9YWmohQBn#9JlKp1T1FNqkW&6iv3=Vphp3rMkv48{KX_`# z$9tAkAaM?(PM{CY@vNUvZ}TG~b?tKc29nSjVuRTPGr>uv~t z!=6F~KiFeYSIF(zjTM*iW)?aQ?tv*4#px57WL8mD6p}vXED!IT>+q!~9#uHY4IQVN z{LI?f%fZEOUAxB4RO6Fi#-WVk$q$}Yd^Vyp7bN4fAdPw1xw)bEg(E*&^J1mn5)vBA z7cV{rUT;9?&&$N%wZk3fZR((t|K#>SrnE_1%+)R~zB_kbahGX0SG|i}H`a_bXD(ig z&wdPh51c-I1}sGs^S6m`xtF7qch2Qa=W>VJG|lIaR>gPa6nNaxp{R1F7?lN? zFZw*F#nfHm_j<@#`-{PkD<@?;ygMB66G?JkdhEUP1`%FOUz!m*dl0wR?Nc-VL2Ok1 z+*Wf~&%YY$^hyB7fRT2;aEztqoOi|QD?E_ch>}jfz?#C>PDZE~29@b^=KR6rKHqSI=-$_LS z174bUNB|3qG|oaXL-Sa$;BX=u!CeOr+WgjHy6nQP(nF~;C(kWZ3?-0w92Y(VS1(<- zF#S+}J|nCKAaq1*>{5ElPbAeQy{iaZ4jv+OtjzeunW1~8EVBOwvZ}<^z^MKU`>>uh zZ<^jhdR+qq$pC?oG_mzq7XA&SSoH+Djmx}7{Za^q| zvyQIfKzmbF)td}rDj^RyCgNqPmq@N@xPs6L;cyvQMe;}|BfH+s6j zi%a=RFdIBV$u{Na_*N7te`xlz`TTV+(Eo?*5FXlpMHWYvv(KezO#o z8K3SX0+mFHk^b0QpjI$CgX~y&8 z2lc&Ue$|%p7~B}o-Ri2`xWRpse_Gz8NfQB_N_Y-Mj0?x@ezF1GCvE9Kwg9-Ra6dkx zKjlLipnKado6jkPmO!Rp?Yn8P3=l?(KvKrMze`SLQUke8oxDxMd#kC%rhgC_OsvQ% zE-M3r?;*Vh`XA8CI{iW<&V5pSF}LF&(P0;0#(4SV)iLwLu)jh*N}EA790^buyKI^w|EIzR5JU7C+-#a)pPl zDM(HAL62b+HunZa#%Igm22?2ltBS=se89UGo3uUBQVKKfbc?OGn~}E!02Rp{oYSEbH z=f=3tZ(57puT)@LmoBuA_(&qzdRMUKxgu>L^vuiL*zG`$BdRO*$sMti9yXmvJC)z& zgK#!=geMAt<-uE{3f(AHZ82ArsCU=`Oixb*w$^F(ZKCrYPP4A;t7X#LUV6VUGz&pZ zm}27z}02(^Mxq^A)+Ue1> zcIZ0VV4#QeT`)M$>H##R^hP;NIxQ zJLnT;nwqYQJlx!_P*5(gQU9+61H#ir*+Hq?MZAmaiYtdU?@F|B_URWCe)80p(r73@ zh3V}H^*4O^{b4l)no*7FuQaaDG_jDXveKOX4Njj2-#B7XBS~(o?QLMPze2hs3@{hZnA~2=R#~iy+O%NgHwUod;(X% z9rEsK^FgoY*Hwu9Tp%ee#JOm;aNz_-P*f|nQK@9xHBPDs;GF%(65}e zjxSzhk%1fxUHpd}m81H7hQ17x@I!!P6f0`Z-QZezfXEPYOL5#RS0y9fk+o*+!QZmF zGA1sc4nkRA!9udySN~LLaaz13+991D2T*n+Wn1J+uP)ludv*Ew=VD!m&{;=KLtaOm zI-icC60q(Xr>fZ5D<1FUXe<{*F{CHBI0=@Bge{OxneKl}wi33pAVva?b}8UY+oDVL zwNPX>sw`P4-hLkwoLs)vh>siIg_-wViGo;&Xx>hmgF*yBpzXNI@q#@)9bEEBQupRf%@Z0QZy@Ot3 zpH;}YbGtazM3RUEh2Mn0_I8-cxi$ zMQrFi4vMJUHr$Oo1nGeI|9^3Mz>aNEoGhj~ZIP=QBfV+;!Ov>uh8Zo_9m70b%|_J) zW7JT;YtL7Qi5>!x10$dnZkj;Q`$KRw*e#)r2j>~ZH_41ZG)oclF5=A(X>Om*_J8Uk zCnxr6oL~Ls7moiv+s9UR0x=V14Pa9O47Cheh#bnwoeLc?U&909%nR>5zFs>DV_EQGe-+HKtDnBEg4{GQ_g=op6f z`f*A?pS-Z3y|Jzh! z^pB}VBG^HQ`qdvEd1Vv1Zd?XQ*j8R%2e%FCoDEl2s9)<)bm^DB=9k}Oy zg4-qFNr;N}K|n?3VC4Irr1_KM#(~#eCrYWqUOX?y2%BIGH#7c12Be z6YQwPQmNY=+Y~jfKR(!~BOhkeTzGP2FC)N$lln=-;c{BbyuQ(Kz6f}syZHedzt7c{ z>mXeG{2A8vJq&lN?f1=)^8#{l#`Njp*|L2a;TiWza2rBlRqzjm6@khUz}nQtf%L;}9dJMT-&AelYiWXp_8EHd{`>4skV|v zn})?!_uv`0fK9u18~Uzdm5L00__dK@TF{o(7jyB~Kt4#cF=Ocp*fKWdBwmMzJ0@QC z7YsKY$Mh?PW@t!KW*4D2GB51cy}NtYvCgmAvRud>vdv-?AN2+1JnaHjEOzUyZmX|C z84#yXx-P377t$}Rg#eMp$IYGFhNq2zhgm6UjXD}GkStUT)s2I$&sYCt7UE990#|*! z(H=RAFy1mGBTw;#w(1-%<^@iwY1{gLA+Uq|*H|c(&lF#j*3fAIs-9qYcTdjj&GXdc zGUgl}^KN2aj%n86iA|7qX@SQO$d76$V&S#MLYu%Qw0>++QtI8?3y&<6`?Pu)gAD0F zyGi?i)6!zFLE&}U?nW_I1bT9;;yy`x0|J^}=GM1087FHuZii5Nn6r&0@D$apb{mGX zcPL5}QiLj4duyjFVyjjENT3_H&(GaPI+b@p7ereo2uNfX0wX#Za`2zyQYUC>yRPYc zmg%A^|3skNi9ly5t$}<&+kl*sZec%JTJG+fo`lrLpEUpFFdVTTL+-}&K<=Nq3XU>@ORSRto1JISz zm7W%%^=hjb->(`bDymB5ic-$Fs?QHALg(j$nkwy6mR6?L@BTjTOS3uehq*j9Qp%|p zZMp1ctV8CwylgPc&;RXDk$&^d@t-Y$O+vUtTJ6@{m92xtM(bWk_Lq{)5|ejS<=-Po zdQEe?cmW_;M1uCuJsrjZlGjYk1gHmeSpF{dZ!{~($2hP@j~++U+eg^;1a;^61~)-F z)tHNiI43XeRe)TTs`R*SB*K3Iuk!D^ynmVPi%o{YX>;l`T}5iapGQr9jA)4grEdqN z@(%SMs04AB;`y}H{{C^$dh}y~^9BLVK*Sx_J78&WiM&oBj6UX!GKu`LH`;(&Q1TmCM+;;DnkbR009I;>C)GIu3qXpl7*pL$2Ixs zrv>%ZMJyPR0HY?I!zxM`rMMCj3@AhW8~z8^yWZ|z@i#Tal_OiEID+xPZHluaP3@&GIPFlrdO;|nx<&cGb$o;Swt?7KM=3<3^@AQjjw2Ehgo!~ycQ@^RL`+OlVPO!nsL&YM z+nb?qVtdfeZf>7;(hcloY0V)&@^*I8-0i#9ZG=@PbgJfD`DuC%F;P)g?=Ptx$tc-7 z%KrG2UshwMg;_v+#b&}Ls1}r8fCqlj9Ghz9h1K5}_?&neg)xQsM{DxrhIy~2_J?%k z4Imj_L~M79&Z-^+z`TQw04wMOy}@e+A34$>!L;zuCGZc9I^d_M;z<69cQ>hV@*#s} zd?!%o5$DcXo@+@jA)#OvF0yNC7b2BXnD6_ij4MlVz zfq&+`dvIFIKh<)(3@ZpVWfj+oRg)|}Bo0bFwLoOa zkfS_N@E;xa>MGVWLb5JJjEX{Zrm^v|{q8LV%ZyMI#_};xyukT*lo@7xe8bZIfm2?N zyIh27;pB-E<3ln!n*|PE-a(*TT*`h=i}YqN8nwRl#~;((`A3{tm9CDC!MqC&GicLiaV(+3 zo`_#|IQ9-h1A`-e1_bq8GT?6;f*GIUDMF2HU^r`5r(BU`kHW*3bXl!x&4zGcTMC;!EcU0R|(H|oT{)n?}lE->3Q z0>BkCM2{XD(DX(*j;sm;!WZl}zrv@v_SMYUwxG1E^J>$+edgw$H!IL^j-%mCnlWkN zFH=n6Z9FXg1Upt4G-xRgq4HC-Is$z}{AsjV*V{k+i)p9o{}!9|k~R)S7Z|puOr6@J zcki2VnpM0FTg!K|zc?)9iZ+6AkPts_xfkrH6psDB$*lOj2Aes6+O%tTeQ4Sk``q$> zuva)Pt>bz6+DZ>WBbJpe_gXO#D}XrBXh>ODveu;h2LkSD>+?Zh{%X;{`}Ha=ABE7E zD7+*z_n=Bjh>bW{M79nRJP1e_@qGW9W_GcnO;jqEiCzBY>i1o$u}?2)<_)Mn|Guc< zipt7TG0>nbrz}Sj#VmnNzD=4YDS3wx`Szc4*8StyFz$^2jtiVK;DI|19=s!{XY1$B zp3x?5C3pZU!Pc&0_c4lRKl#k|m!u#fbKnvOccuAk{E#zzuzzhuxLd-)-^7>?NyFhV ze6^{M_O)YEd;?y1xB03C@ZPe;w_39vcGKMZNN}5>nY#i4lHqJH=$J$D2x|=^GUoC$ z#6cWgs4C9(hZHD)a@jxS`B%RB#~lW6k-Kcb}P7n@vaKQ@HPi0cH96|1I*R>?3VxZ1=9XLWUrGSYhO1@2L{yQO&Y9faOgG6 zI?zT9bW~^;JEQ)c;_^4qmNIhXdz020AG(WmJVKC&PFLnK^Dz1)=sp{x-%zQt%41md z#fmae&bN&d`dv?uI;#g~M89(=r51lRm>$y+2GbtjRbFeOfWaeT9%6yb@ubgO~2q6HtR`4K8_FNIRmQ9z2HhdA} zCLXo+)NdBq%Ij|37}`UFfD0ZAwd^xoDgx;MDE2Xwv&1$@q%B20#=!i~vOCSR$Mpm~ zF=Y>)S-WpEIHmGaZW=5F8<0H)K*2KMF*Wrdoo2%occaio!ft>iZYVkWBIk>KSZr~D zQd>)oLsF%mL6>ps_S64#O0l%Gl+Ww902=}Tu2?_S)#YV``HiQbhe9p0w$`ZbRv2DX zwR98Byf26>2B&kRok@^aOuK^*TMi|USkni>jTv^#+dq1+bz}k7Dg0c2RnsX9sYnHz zEMS)+w5E35tE__M9bRO*Bvus!2Ol_SkMc+CYWi?~kG{9f)Mk7y z*EqyR#18M&0-mFx_4aGAg}*nDZQ4|P5RSIHUp#+g7)Vog#V+|Zj9pDzw|>4S@l!9z z?oVlTpIYCI=}=6U0l+g9P>LZ>IDYF0qZc#?&)%3%udi|Kk!xIomuLLjYG}i0`jmMB zl|g3T&t_{F3W{F7yj{oxqn9=cY$wbp1p>wTlAdOs?fzM_?T-L)_>ewNnej+oyomMV zm3q%F1!uirIO&eGph?#ciFG4vEG%ea0PUBrS-LZBoKKfgySN)n%sYARZV@09)J_Uf5qa=4MYo`HtP(gm6dr8D7Z z`q@=4j5zKB)SU*R1E|!SAsfF_lb3MjFcM!H_SQ>=YdOg1A|nY-QeUF%Q9DJ6HywKz zzF({rz%cv%{bG7Cv=q(U1qY5ZqA9%>-WHkF#fQE658+>!H%=Ep>mYgFNE()i#==Xu zUQYzaU32nK|a2BH&yE@{DFvImkOs>G8eCP(@n#XC20 za|1#6cJA7xX=e6#-ldhA4*JrI=fe>D2h%ZmE=6!ToqV);51rI(x}cI=!ekErE74#> zrv&K1KN7NN!OXAE2uom}8q4H$!IJ1@_6GNEw1$-f;T#9ftkY)lFn9Io)(rf=NvG zi;a!lylq=d)F_n74eqh=eCejJxzRe@D=NW$Iq^>64TzfFx5RDTx=Ri2!Sm7hrtTj# zleNm}r4Nu`86|$WF^C_MOWAikvfeq-m~SsqU(4U_hZ+x-RCta1bU0;1(Pv?P-wne0 zYS@KP2l32|6ic%WZdszBcp;Y?wQOcc?QR1O>9$?EShWvAha>=lp+nmSw}ZeTH#d+5 z|1Qx`?&%gi2M^wX4Q^^86e*e*Nip56pn3djA#p^MtZ@RhF4tB_(DkF|38fEUl zChmv_&hn%SDIz-LQDl_D6Gpvvd$``DPQ`{uP7rHGG>1NUeg;haVyWn|LI?qqOZ|Q& zs|3_$&5P#UwOaQYG^?Gatb+I>Y``(@1UD*8WLu-&g5~k^qJC=;sFjy(PkN- zT>{V?U>Dr3xBkJ!&~`>;5JXGFFF~Ghx%r@r?vS~#w)_&YT?wO1f9u>WJ1b3=xj)U< zAW>(0?vZCAVtBUc8c$#`GA*kq>?Fq=r(jL2aU?TF?8yk874qD0#taz&th)WV>Sw(3 z;$V7Ufh!%3;b(%<7{w8l^kN)kJuTC^oi{ zFE(@T+?OQOe4MQNj9oo z%7|f$(f(5>PeyDW%d>ncA|m~*Ix(`PC!@jlPY9b)-%6Uoe!+ey@n;a@I766wMXCc3 z=u8eoqcW^`_ZZX%Jl^By*9U3D?tS}mmTlvr30LpOj~|0vmT9T=()YoWmrwSEpo4SOsg3WDrV=`9%C zNf2Td!{*)}-1L#Rs0>P7FbwuU?-rST8#Mqt!Y^uS9id`h-SarxufFzi-)6^H2PS05 z9WmM2S*lbV*Q8d4_CU-Qv8M^O#o!bVEmntkAjNB z9!#S>#TQrO^6I&~pq}VQiq`|ik=-j|4UOIqgChbA=)A?%$loF!emez`Ucf9~k{de+ z&7#quK1j_MW2r(-DN0R?#tj*%1>q#YDo-TFCgd&rMA%e8HDs(~OBiywK1Fx{6z*0= z+^eL()Cl^5?ej{USRxmPOd)Do=P|1X^Q^``5z9Woq4e0e;q@sYAt3;;j=p}_h!F)h z`t`bAJ3+kpv*|4FP7^bNTivU=8FS~};vlBnM7QfFxa;qg2|+`Hrh!`uo*$w+f(fAPsZ(N& zA~XokX%luEjBlE&A*<}3Jf)VUvu$gLu zC?G5;@Y}jXpQ^a61Z!VK4R~3DLmX=Ub7=6IwrnX>I(%5O5rL@x%ifMbpe;L|i@e9$ zV@13A-h%evT4HT(;+v3hwVRMKzC*P5nkld?LOs2Zh8)}{CnkQkB3a*hw7$vcy2x5i z%!Z`wwiMJu^_lKI+6|+^mbJN>F72*HaFmHe9aK%Pg>)`-e(h#(84*DQ!g*z2P4#z* z&&9Cc{0xi|A?|+XYO=?J3blfVU|@|Y8`UK2kjx!@TyE^ni$b()1=lBnxUQ4-3XSIn@RH!l_ILJlmBUF)hjczlP?xIPT)H%h6o;h>p&sf&ZoV}#j#M)Co z9;vM$pT&ajM^Bz;L1$8(dg+|hTY7?_RU#ED&XXuPcbA?x3W`|L+}OQCy~wg$zp6&_ zDOFUc8WF-qmd3-apjh>$G-2oF0NjN=VdBJwTz?7mp}|?Ro2@A9L*#wPN>X%3L?O0$ z%uRBk`4S@r#O5b<0f<^I!cNdGi+vR&GI0NYnRVjqJ5Khl@e?P9*OFoKwxPAiYx?W| zmj4n6UZgofQfz@;ksz-Sqs;(o4r~e-M)M#*Y;uT22P*bzEi`^`I->+9?lVE9i+TUV z32#K6LqygUDn_x)BxNv-l9)19&naf=pkvik9ZXk$`pHhlI-N}L#6!_-=Z)$o34E` zDReb*oDWY2xlLi5Nc@-?UhdqLZA?aWxw{QRjo9*#%7qFm;@oGvb28Ry`p80BDHJ%~ z-_=$XzT>HAdNiH9(?)Dn+|P=Vy3eobp7DIVdVMEIJ?!MkO;}kEmBkcP1mw1DoPtK90c zY;F$f(V{X{}(rafmWtab-Lz(mu&DW(sQwVxvH-bb0hCm^}8O^%zPf4fBs77n> z7Fu_WXXGN4VqhV_=REr#_DhObE&tHg;jN+RQdSVKR-5&U{8+ zI;go&%C2{%gPmh$&X z`lqGFUiLF!phLkVJP#5eukX#3A`kUwhTWkudqu`@e`_upl8ue1F4`(8<}0;^t)z{Z ztfRB}bjLPTV?|4Hweb&zx6Z!F*ZCc2G!NBFw_YQG5!-Qj^-joqyNp@A19OxJxg&n> zGD7_IF(%WYG$*Uvz`mc&W>Frni%T>(iGcP66G+J`w>lRnAeQVB-h4Vk1H|n&!hb1~b@!(B)r##-w|-SA z%5C|JXRM3}ov0h0<&;wgO$&qG(47JzB4LnJVijj>J;V7UnqiSah4NC4T*uwXQ0+7$n=%79dJ zgz@oX${8oox`8`FT*nLZy=y${hjS`?N{=$^c}6uP@U3TB!E`hkETydkihM1 zFVZ$O?TWy=Nsjq?Y{|@u{aEp|n5dO5>W+x9>WC&N0_vWvrO@j9H`SbO8 zoI|pXo;@q)4yv4Ya%z7M*FKofTZ7Cr>f@X2puepOgPqEF8M5J~vQ_rJrJJ7KHu<6E zTSds9yy{}_xtNv-{e{I45f_bHbUM`4xmam8q=l}sF93@X54;i23_y+uq^3~$@ur)# zY-tEpVu`c&)`Gz&7)*?}{}Y_8E+Ogjg4IE%`E*p0&-HTJrW=Sp(Of0;_I5I{@RNml|u8EBYd&yom%yaDyhuBYmYG`;J3 z2wWsjY{zk^o>UqC6c+9gt5sr7S`%_d6@@^-$hblK=t63_0Kqv0Q}z^l%30TUO4hkC zKFlTYU2?OsvW`1Kg7E|mMkW~g0q++cf~7=5I`tTY;8snyy~Y$+ePIIH8Wb zt;pN*fJriQI?NER7}kyi1=2GC7DOZ#Z0NfEhET4!)>7yvZ6DKB_o#85-6ZX+Y7w zSm{=CduM!njlRZ4xv@Ud10AVA?}v5f3qVcwj$YN5i{$TludGJ@;Fx4uEccirvN`5f zIm3qylUUojb9XPKRtV_~lU4J`Y+b6TSd>n~q@^;6!A8P#;Xfp&u<1SW;E@AJ5b2b@ z9XpvLQtHoMYT8uExs|j*)8@`^^bkl+FcMg-MSwliE?fY-^NNa6Lxwh1Z^2MEbw`FG zfn}HgTL+9n-`7xh427tkK*tr1jzr&$#s1xniYpQ*1txFzxG}q|BoCpkfT9okof}iT z>V5GHnxakK-iIz-I>>XV_ij-C{y&L5cTQ#UP3;PWsHK}~fNrzt%DyEB6(ggg4HJ;) z-^$3CiO^(j5wyWNpVx=Mni2MGUzyzmPb_7P$LU4h2?R4)z0)*??f_ts&$d!!-oIvYs1 zh=_O-^RapQOzAT&hO??CBgM!EM@S!FQj5mJ>&k+MzgTOJx#fEhPLR-XU+EH~7yyX1{LvrMb7!75uhb+#lPgfv^~1?QLthpq)}@WM z`R%tZ9N%JdQr}BRs!=Zy1NJUWp4RI?ed`4jCsfWU&IhosiJTRzL&hQpC^Z$#VF*7! zy?>2JW>$MfysyhLG1fl%Gmm#l%(_}<>G;VL{TlX@w!~=YI2{$fFkF#Hb$)jLUkJLJ ze-U)QyzumxSU(uP#&R0K$_igN84*{^GLc)tIzZnn;$w~3`e_~+fGYki!;df87N+G3 zT?PTfQm4BDEwH~^nBRmDk))hH!6QlDKy$nVA&LLLW~|HP5BczAVr3+Hf)IcysBB4> zQYI9`-@gNEE=H#+5iTj>PT>F4T_QZ9m1N`J67Z!@&e#yuRx#74veRIA7BzNpj&Fd?)H_&t|Q?3Sw zj=A9McZp3|>|=Erg%3m~=YHp=k4}iT$J?b3B4QCQkDpegjF=RaMe5Qt#GBoG`{s?< zCOfa(cK*_P8lk;BdPqqJt9$E0L)mWHX1QDIwA6^o)%Nz0Ppha+{mX>;2|5?J{28W% z@h0i2jECsx{#-U>mZ_=D?whG*vCmi7x9E;*0%gHrztZ<>zv7W$dM4gor%3_&32f)& zplv|-t{2R{pMn3)+;?x^o(K(XC?0GfleE25E&Rh2fl(yF1>5pBKqig>pb;&4?d`_r zw1M=Mf6&tiV1pB0Y%s8JQF#n*A$Uf<5>7J_S;^b)bsA*d%Q^NFIuJ3S!?;7@YSIXsyC z9jI<`b!C9uw(;Wa#5EKEjK=2=W(;f-7(#+vD~-KY|CfQHW0_}hiS)@*zs?*{pyF@} z<(=Z9?~fBzea9-j)RF$CmfVq8S{3nw30xI5DZp!!vmZ~CaFaHbmA!oJ+6K}?4_SA3 z2A&&xI!kylg-Izt{{Zyv-MljF1cB~?>0i3TWV=!)O!Hqvvr@1{t^!J2ER$y@u2XEmd&XP7LL>{c)_J9~8Q)BJt z>gRZi&#~=0C61_s#XQ1H!*&2j6gC=JmWym--fdug<38!1Gj#0GV`H~Z;phx|i#Y6P zaIhy1J-xJ{-_(q?jXaCji7#TLN2RS*{zZ_ERo-Me54{|R0bAoU~2l=_hY|c$%|E5u_9s>x!BzMJ@R!! zGG@%4eREu0wLUfH?a?hU%u`Z0twz9Ul{P(VTS|hyV^J0vuW&6eA)lSA_=>h$#FGO0|aFL8u|T+I&N$k=`Sf4aPN}J;U2Z`y27naTn)2 z-or^^eV&$TJm7Bu4( z96=^eKM-r6azHPHuSDb<3KIdMRD;GFCL9>+V)V_}Q!> zwV&SHbQ%&Gqzs!!;QQ%`7k@Yi37w+jA4cBsQWP+*Wo*s42?)aC{gTs&<*jQK@m=BK zGnd^5<*K%dv(8Qd&|>s;2Ic?_*U_91Vl4{meP+&|-+DpCgbZ5KHY9B$_k-UYpWFYo zh=MZ?w|{t9My%wa%@^CA&z}!~qvQu9rn$09tr=&Q(ak|vs@SlIM-iecV1%_iInC!R zg=#`LsemcCV}BVsG{ds)TM1*@w-b`qb}6*@sf94?C-)8#pttBjp%BGdWajX&96~{l zrdtTAh_^y6hbN?!Kj&fEMO<~_VTbo!2^1n?6~%HC%mshYC=L!x6|0Pd4h$@c5@Xi6 zirPxox)CmvQ_w5j;ur)r9JgKNOXEXf59C>3ucIO$JGyyc*f(4UI8Mtd#pBj&{2Pz+ z3O^)QDO9Y2ewz9>{Zx2A4nOPTfTah;_5&2BuSrfJO?o=)mrbS(vQd9yNb^1ty@O+> zz&v7Nky$|95I~WSwwcN?j!Y6f;^O1ml0rrRBZr5-9nrT4Qh1W6Jz~=ozXHk18=SZe z5v1tOo2Q6ZXbFAtn92ucZ2kMQZz4zo;+;3|-o1D~2GwONsmuMvN7?lJ9{_k(Ha5>t zCXf02;j#Z-)b0FY#jaCdWrS>hS}2r?{)cwxBbx+yVm(sdU-dbDtv@OOr42zc*Bz&HAmxNcJ5V%!XdE1p8A;<{s> zbyO}pE2fu;@D{iy|B7GLkQn1>d4qLHSl~YuA1Pz9L~oe?be+(VBq&VrKBy%cy$_q< z6a~@+jyEFFq*#wJ>q=^B*tM$`?)9R@lC1D<5=O9^^a$K!=nyNjLn{ONeyPPpBS68@ z0p+6dkIVm`g)qs&t($($$XH8z`_p3!3ex^5U$pi!_@W|tNZ<_n+{AM5kQ>u$tZ)Dc z#P8f~gW6EY9qBHnj8$!l)+q^;{XsGJ?`5kIGl7+z3SFBBWSE(Sna>NXmTh#mp#3MH zZGs=i`_fP%5(euhx!&QzLeI1)jzbA$*?&aY_E@BIG!RWL^W_K#n(Qy1V0U98nL()V zIYLtk{&oua>W2@nN1G-QOQV1+MK22QD7=hpVh||uMfJ6Yo@a-O zsB|UYX{D7DPiZ{t(&Qw8^L}Xw9?E_|UQz?hlNGeiEU#b8ZL*iJ}p< zNZu!DSMGP!js<<|5S0B|;xPJYQPB~gOhaw$jq<}RcBpo0QOdPCb?lhdD0TJFd-v|? zrHvyYnVMoaf4hNiQo_9^NRulIx?}V{n*QL?0d39qKS@WqtC}GhJNNAI%C?HR=%cQt zRuwaDM8E5`ngSBkoC8AWA9Bm1xa5DMh{~0M+cEMl;@y6tLPq4M)#HE0fj3bkifvTF z_d&CI?YPFj3uEkV)HzZR+^c=puItjauiu*xRYENp(_LB=P@zG-Eg z5FAlT5E0}D8Q>zu&UNC`0c)0`@eDTnVV@ zNTe$CB$P*yMPT$ee{FMJ6;IULq~7q{GnPx~ml6 znP^dGb3fID7-6ryrs1!m62Fi@n^{Ku7Rj3NI?>FCDetzwlXMMDsq_6+r1Zv3fxhx@ zw1tnZdJ?EI1aDwU)lDMuq+l2bz?V5N7}7{}*XT@&zUo_GY{sjC2t2JfT;mqe902GAft_v1c+iulq*PRy4p~sN{s46%h=1R~N30TJ7R8l%+oqmx~j2$kmOj2ROc`R^vn!5v?mx z5As<2K`T>D?#!G^Ye%tUQ)x?w0l*mcaGDx*pX_N&Au@cHHl2@;Z|Lyh zR6K=&(^wJ}6SE8dDxDt7LC!{zAnD*`R`c;=j^CDStMa>*=J04g9U@dBWrXI)Hq!4w zd*0YfpJ7GH^h=OxA^f^Ep!uFN+tLjO0>7Z?ichg4We8yyx)|vVG_9t^pF|dxKiG?U zBZKZrKdesI7pEvpPa%(p~h}+o0ypi=X|(KkRL8?jF!B2;WiyTU?cjYux)nl z?BZ|r`kUkE@`dBDm>r_xF;VK~vjVTRT63E9vA5gUT3bJbE0CbwXISwtxb^3VL4&q4 zK1hUzf;m_Ov-F>I=ev@t@$_&AP@bU3B&G#{{3v8Cd(KOUQTr;KdOl;$9NEhVs>}bt zKXfSszEWecYCyX~y2=@2M-{LS`?#c0AGDmqNtCA(W-Y~;Uad}ix7AgxB!cD`OGa1P z+08)fDB>Yn$`AV$H}onNa)hpPpBrT{Bjh|gE2d1@w9?Vh2vr$6Z!4?Qki@4hUHV*Z zIyl{WYo{TatRKoz_bKn2Kjq}WXZoIUM-=+~oAqWL>=)MCa_1@(=MW2=-gr-5?mZm0 zN1IhRw9!*^bj~^T&7ZMR=(D}Mn*XrDO|SjZ;5zyLmj*XqTXUqUI6}R<{`z-=Ye<9p z#imniByDM(`{3GH(_orx`lx>#xPP{n-ThSy@I7VJ;t1jdWw$_DAPB#ONPRg_5ayS} zr&%vO;|c|RF4aKgs(adqtmy9nH!dN{*XKz=30b;h_J9lbKWZ-SXr}BNh~l}E=U#H; zbgchVKep>Q?WyOaf500{E;AmlM%gX`ZkXPCDk~rHgKha8iKj?hA%-;-T$0Bg6!~?M zg6*6nTV#P`y$Lt5$iP70fLF6=ROLaeYOjdLR!vNi56>=zv6q!7%Vl(huB1;`7spYY^^i{+=X?KY9)w?C<-MF;PrlZLkS3S3RjfiT_tn22n z+d-URRl&IfJUI1FxOdBkExGr!6MwGRbm$eMH-J^Ac=fqAh_pSu?#-6@>>&8QzjVO7 z3$s!KhTc3^hfIH#I~~_7G>``lgh`@t4^Iu`{WUtlPA6l<+_W@(4Bk2W3t?GyV?f#S z+!c33qZ8v;F$me5&#e;cH*kAebEPi7n}*}NHMxP$8QgTl_VmAwa5Z@!;e{hP znp=mM_h{0@OJfO^*RrxQ>ZZ)k73Yr`s2p^$dF^JIYCcr>roh>C_YRh^jFy*ptQiv% zHDr4Hh8s(V$#=Ujd&jRm8{Adb-yAVtUeBYG*~_MIA=hr)AfWQurX0$C%S)d>E=QC6 zi;7Cg;U2>#DhAE!dxPJ+(i$)E#g&I}BF%K<^$LKhK@ zj0*=1DbhMmAXn&ZrJcn*VzC3rKWEhwU-ATHU*l-&&Oe{KSXvtH((Jo{@B}=(zar+aS2%MxqM~P3O&P zDPeKel^qqm&3bH9G`AR<^q{T6=BMwrFG9U|^_FVH99=A6u@^+FD5}jK2=QJ2E@=IBK57P9ctc-;<%Z_EenDWcc>F79Ju_qc;bVT}ymeFVl ze}vag>D6XaW1sEbAO_p`bSmoV@r8wFX7!z-?7K60v9q({?St~B!z-s(x6*33)l)U; zfvnNIc|HK^Y#cyQ`apgEQd5dHr#=9K&F~@dM~^ma=Gj0exD98CAmqV zIXF80qNF6#cXu;nBE;mlR`%t-`F%3C+*TP$yJn4ONHC}Fz|~7YA&_R3adOgwK~1;I z@|)V?dGA7UXu-n4Bdk_yd5d3uv_o(48#*aOkNkNN|L4Jp8{*a&lB7LA+{d@?c*_FD z;t)%sn=s$g3BjXqD{(V*K?h4^}+pwMJMX@6A>JNpcyj*BcBQ;Li`yt;$zE z&$@sA7c_4u83c9#G$$u7znQ>~h1)$N9wkZd!~nv(d1<9RDPFbN43<xhuk9{K2C#QeVEomqLDy_w|6g{6JH#z7x;Ya9nWqm&?>uXSx}c5RdNX_^4J zN-Yy#6MFU*Tsd%-2UtWT4@oNcfat#^l0*#GN~1<~*79KS2GDU!ZhI<}&;|5t(-f@^ zBCP+fu``d$F>U+!RZ@f~TclK)G-*tc#@3=zX$*;yLint*l zf%EV!Djq*pra2Z`?$Y#Q$Ht<21|zp1L02sIp>k#0y3Ldpqu0T%)B)&j&D!IRhI#n8 z;^}$cM3#NIyF%k)K%9IalyFB03j69pqF8SI>m0w9kydO6iLZVV!&J_{ZwxvG3@R+V zXJ<|TsPVJx`#GVVQZfDRJV7L4VpX<7f{41i3X9h%vXhkUki7QTC)Ss$YiRVcS%gGJeJxZBq)XWtU7}#JvR)lJrs(R%niq-IDC0^524mhxky|Pmo<4>3ntH0 z4OhbW+^(e(9cDWTt$^y$g0hpF+uqBPqUUu|&YP9@?%!vt^PPd|hK4R_?xWw$Y;C=Z zw!EjLI&;V(tKD)+Ijxm10$8_7H? z`V^4tN8)PDSMeu48=O961K3uVmCW=_65DgnM7Ins+~>cCdt~P(v(V~g%a>0}h>nPO zL`NYO$P)+AY5VmEMq8}*(~f1&pEpml#ThOXXrPLYLGaNF-_ zRaIRra$=?Al$5;cSs0SQN4JvrM-ydlq{TwPS+bdf&xAB!-R!SmpblKH;0iXhlFG`> z*a)RdKyuuc1Qv@#3lS%w4GE{-sZ&XDu?%uV99xNDYYXBVLv97)Ld9MWbT}G_{e;*a zSY%yzctP?KmgHUX8=~NBb4FlbrAsVJjJjakN5>*+$y_VnxGq1Wc-gd?AW1YmYSw+@ z6-(hiXo9k}6XkTz9PIPqC)zw|&d7O!i z<*&rvjK#)-#oh@I8@Ch<9xxcp9gM~uWTe;7h`@x3s5h&tG``M!dbT%K)GqQgO)%Pi zonp{s-s}^KD;b4)rVrNz$}A>vT=F<=Y~k#H$WkVgLZjcf;ZGWafcW-4>y5LUtEaxz zxGECFKNY$3KNY$3zbbN}H_n|uf2?KHHsR(XrMc|%x8Hl5oqj9|AVRFtJakQ4M^C(5 zWs~ogm&YR7lX99q#GUeUG3zDVLG;JMU*bLFhvX@yLL~(As!WK4d__#0wa0INv7Wfc zPHNvDnR3J?diQ1(Dlbh5w$E#~ZbgKLx8tIz3GQI#Tkum!rII;Cahkt>T8=|z?0Dk> zrk0nws=fuA+X^YQtnKxRlTX?x&Z=+Rrs?8GP;~A-7G=|ExS>6E6&zi!F(*x{Ac^-f zmWPE)XHdF?t_T$#3uO1CXf(tRv$7Hak!&D!OP}HyaMHr6pQyB(rVIP2MxOC6$7f$9 z__aN;X|?0tBs$DkK&?@t4ak{gYb5`*A%qt2qx>QndmAB+g_nq<5lGAuBph8sl#x|o zP@brvn-=pr;M|IsIk>@MpPXDpjg=wI1t2b9KFYKp_$y^D zM)@3Y1yUXE*82MT&eP)JtUHUA;BB1tkuDn1M}(4D-`2KOesTBCogHj#b8U3Suf=T3 zV3=>bBhH$AI^s$|&jrcdF4l291T$3_^1BDRuqbi0q5|(MEoR4GN)Q=djrSk6M1jT$ z-brLs3C|*Zx&pv??9{2fA;32=n%qCk zu#zb1kd1C8J+Po$g}p3WG|H~Fq<`1Kr1*G?z}W=#Y9k|8lOV%-uyO_gzKTS**%Mjh z`YEO~Eo#C&P9n>=##aDJOR)WOg*D8ZY8dZLDgaWdC-3cpycUZ~)#@Jjx$*d&GW?~F z#JZ`Lx@cQj4DD7dG2yN4B>?g6!V9D%fi;!ognmT=c8eO~kisOg{qc_~p;E|)^AUj- z+`I}ZoLC3LEmX%Bpx`z&F*UUh3HczCdu`jqz4KUHz#(1TJTgiJfl5|^*cwX@OnR-J zSe>l*XF}DoLlTcu= zmjo%HxPRFvu2Q_)arufB^dCnbW;xi~i?{?K_6sk}E88yKdMi_}+r=Suhy|A=ouD04 zx=)6H(6T?OuHL}1vquc3DQAW}wN4yOu>njH0&Au<>}Bq`3vTTh z(cP~0!5w0*5`9XBgNPv9wpUEss7?ZchiK! zN00VsQJckBMuis~m1Iu$C&?ftiw_FMseZ(>3KF_lA{yQ@`0M+<5(D6+I`|_mV<&kI z|Cl(7FnI+$c(pY@d&hL(y52c7V6(@2RBs|48ZKsC46nzB%gxE3+K7F_jSE!^+8SrE z(S+bI8wdok7QukzY<|)FX7CUlrW$c+N)j_pBSrPg2Vt+yrnC-x_k4lPjiH>ZaN0m# z!Y<>?Xutv&EsDPGSG{y%irb|?%l$byx_A@d{@Y~@(2A8LEDR1>y?wj>{$t6P5s*21 zbHw@OHqM`4x*g?)us=|f9^(TTyK2>Y*&A=C^^l+<4u<6Nv1}0Ser8~TtAY|a%;KI8 zX7HxhfFUlyK}ki_oF9LlGyUCymvx0==u{<*}nJKD{za&%a>o_ zNrbPMus)QDOgsf9@VJ{L+$n`ipNpaoV<+mVI;51Il;E&!5);;&;Z8z^Wbn z@pH2ho}HQYR+H$~OGtAjO`bep{DG_oxhr4quj^Yc)Ft7T-&HnLj&_D=b`@)9B>H}S zlvZN-j2k0Ij$90aW3YMOK0W4-w%d|~&;d2oK|f4oC-w-gU<4pqL{?i|_OSpZBpx7^ zWH%pPHk80(xRUgF_l&o9gnz6#Q}L;13ECVfzv{&O-}#>}8dPNUAATb>{ z+9=l1UJxOtv$Ec%vu2mu>c){EG%YH2*}_TqX`E(xypM;mR_x)_)Pf_OC1itH6Q>cH zQTm+7juN~)O?N}`1jo; zX89;g4k9ChC!lW#H8B80<9N>7T^f-*>(Db0E z!>6git$eaPsCH|ai9n%(?h5Ad>?y3V}+#J_7lMv6-K`R5fHWOO^7w0)F9n{tBvBio!QQ$0;yEgy)At27WV;hX2Dk>#+ zB)>c=+k&aH*L=2`lwc=5)zjcrN#}$vY4OU8FYeACCL-1hV!KyayFXnr;ai;LwDu}c zfm^q3l>o)CH5Fh&LR?z)>#u!IX!p_S@Y|Jur*qDlN+j`3JGzw44RLnzVgBr>=S$@bH~jMaCrNz}}f>e}ywBH`b0$ z{S%TQs|3uR`eTHbSs~^4gYL6cbv?B;2`cu1F=;b0C#R=(qyyyy2-F|Ra=S=-CD^~! z5dO_s?Ihw@=0C4upTwA^CnQ!0m`3tuVkbP+PN_L->L)oI})wxR~jbqWPl1lpQik_a8i{iZ`?o7nM@I@gxe32$nok13*ig z+79b`p za3$!k%gORMfG33rHiGGqM8p?&mguj*a^!28zQf0l39&yFedX&byOi71=z zBllkz&uXBg;a@EA+G8Es3&50uB3hyaA(aK)G#zAtalEK{4pI=!xbq@ ze?;ruS;9XS`go^ysCL`UXW%_;nExM;ll+ecH=A1$&yqT#L#MOFx=&Ny*{_?|tli1? zCayRFueLP2O!{`-yfLAnqsALgP6}mwr2l~npui*Q)XUV3cTq`RF{`KV#O~tqEbBHM zR3ENK7&DorcU#R~790!*u)*?y;7(W^Cwwx6bQY0Q1Gju_nvf5JG~egc74Tk^ijNcu zrQbo8vd#Vxv{yB;kLLuLk8YbYPF(P;e)X!?4YT8jInIf(w|y=vZy`?!&E%;lxC9 zm9!Z`&CDF3a6z6IGdoE+sn)YszmCi_x(Fz9q#2wAm>3C~3eVJmj$W84l2^353}E*d z+*b5B>FIeGC8YYnXOAB{7MbU5M~WC|K28n!&)J@Iay`yLS-Y9 z%&oz)-%g@!@m^{cXWfgc8L*YruM#{#^s`l1#%XHSk}>6mp~0h^4?8Zkgl!?cSA~X> zli8Qye4C3=4@|Cb6WyyfT=CgOgm39kAq96g=>hBSNTS7olE6Ti&jar1Rot1LMap)B z;?_(~+`84fVHHitDb(gR4SE;gHxDDjI5K|l_xJC9X>DzN3ZehM>+1B=+&|wT6fBGi z*VqZ|H>3|v_kWV=)?cv}4cds2Bi+CI?z`L?(*#!(UxO>gwOONE=#o%t zSFhc)e`w*(z2HCt%+0%n~Q@|2voHdUluS! zcGK1UBCgP4P+tM3`raBWqJ*=utk`&X^T^C&o}w7yVmdL|FUV5iA((@g_P=2^;22de zUpj)JPciLD1Ix}l3t;Nd=xa_&;-Fgme3c^jFyNP(q}ho-86-v6rvNMi0)}TctzdT8 zs;hpp%)5=J@aq57qRM_*0oVP8%!%yhTd?W>iPMM=iX6t97+3N-vsMgWPlOPTNkeOE zU6_EmC(A1hFkM*NE$SyQxMcTqvBozv+K}}&V`(ao(qyh}4zaYf)VH*( zkH0;#-9mqbBz5!{=Qw7H@5^y*a8c?daPm5Ih2^6<3!^K~ORS`!w~KK!6t_2!fJlO# zIB`pkgI}tOD3DgJ_?t^A4Lb0JE1o}(29TVd5cV6qA~wF&^ys6rK$I1^vxr^#_~Dn_ zDE2I1*F<~Y+0dRmtZ+=d&QCdmVEfIOLlKPy}_5?B8g{sHaMJk z0(*}nD+#=eb6h{(rCZOQ?HShqFEsA;=VB`Z2LWeE_?UtA4mb(Z^CvVxuKs%vVCq%lhrXV z`Fg3C00>wJz79)<_H%$M!@m0J4mjQfrru@GZ|mX!?iA~2sBDL$IZcFDF}blDAyO*F z4!_9I5RBV^)o7PAD04{DM6#YAU_3rgV;+(cI>lWO+$QhN~=EJj;vT zqmf0Jms6mf{_hdI8P?nNhH2g-`$tK;J_IO9HOTkBxt7Qx#xfNd*WcmfWEl|je2=jI zkS`|~Pqa2(d0JZw!puqD&sD7cuB+Z?7wIrU!k8H07LlrG*X(r>p-ZfKiH?bZnY+eT zy;qevgYI6xdGn-ewit>s9Ajd{C1$F*3z(_q!P&{#VH~89!B1npX`b{SGUzsfPFJni z2-RR>td#A-K0fKMcC;YqYHYE?vp3Ux!Cegiw`esy{Xt2gIjzo+*T}j=8Hu#@XMZ8w zn$pR=sQ~G6<|amvD~!n*AwZy#jJl-mFXG_vYx3bc!b?EhNTRAB9FKVRiXtYpjQR!l z{@B0*0zVGZhJ>Rieu8ag-TCw9-2wndJmp9T8s6)6&FU!q4g!(PCZorCgg5Il`lJQb zU2mow#i@{aF2GzHz^VNCs9ro}RSCmL7q4h}O8!znrCX~1B`QdFdq)lzZoPIQn*>01 z`sp_hmNvJZ97PnUbcw7!6&ga8J&Eegz5vFD%I5zi@MF~w z9UktGyMQ%4!v!leo~A_#T)1%USEeQ?nq`(4oXY>REpE)c`B2 ztcPij5)Tyqhbq$kBT-}>Z13CWSM1AS2WlI{il#qeK+0S_r_b7c7?9w)gd?t0i}Jd^ z1R(gfY{}5MgMOQID2c*NCG6K|lJotB;HOoG9L-lhBp?-X84BR<1*A$8fGYm_Nl97! z&Jng^-H`ZsZEM9D)Kg2mQ6m8#c|MdIO-yu5Ie&gecEGqS8YcY&SFtG?AnNVz&LHs2 zO)o~ImY6(vQB{?BB-K4#5+Z1kh|gg2nzsAq!IqWg2h}*g3b2Va+s17Cg!(k)6qUKP zq5eTTcI{H05|EfSHdvqe}8j~qhJFWB`M*OB;a2QFfp-m9G?03RzE4{coA!M z;z&qC+bZ-WL~2|iwTUFnKj|kl_wgcw1V|FST}f$adqb^%jpWMP57CH11C_AX3BQiQ zK*lG8&6lKP&kQ*MFxQ?1OG1_np~zv03?O=5lfERJVF%`R2{B6y5zuzTZ!9Zr(I!DH zb7rn+(fXs?ro$x9r*v%-iut}00*v(oKkD%27TAv2ZBe-Ifty)USiip}t0)|i2?2@E zo+Unen)qU3*oW&P|O6W->IzUfZx)E2ErJMf@m%YzN8a2U{|VcQL`>AOOP* ztKMHscSPWJ+H?leSxwC~3^@nfOu!Ce(H;{BU(8?&6j-vww#CKKk#=q%Zu(tBC-P;7 zrP30zmL`pV_Z+pVrsDkfz~u9IM*NJbnlld%vSo$IHg6|Tn8@vEobZ48rZq=Dfk=I; zb1zPcow~_-%EfjilJ9oP^ZNg4n6A$KGaa@NhIta`8p6Mf>kr}R;3C{i6I_s<`$pvU z6RKPMzg)gAb#J&F_zgvhGkX)Fx98!|zBPZxhm{4kA+24uGex1KQL3s453n5Q0D()S z9F*2&7O^WM|4DO?MMnGt+(A6j|7|SB&my&6VLmCrwei}%msCJ>hS<8s5A?!kUx=Yn>mGD~d$ literal 0 HcmV?d00001 diff --git a/docs/usage.rst b/docs/usage.rst deleted file mode 100644 index 065fd69..0000000 --- a/docs/usage.rst +++ /dev/null @@ -1,7 +0,0 @@ -===== -Usage -===== - -To use PyUML in a project:: - - import pyuml diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..d6d0bcd --- /dev/null +++ b/poetry.lock @@ -0,0 +1,3227 @@ +# This file is automatically @generated by Poetry 1.7.1 and should not be changed by hand. + +[[package]] +name = "anyio" +version = "4.2.0" +description = "High level compatibility layer for multiple asynchronous event loop implementations" +optional = false +python-versions = ">=3.8" +files = [ + {file = "anyio-4.2.0-py3-none-any.whl", hash = "sha256:745843b39e829e108e518c489b31dc757de7d2131d53fac32bd8df268227bfee"}, + {file = "anyio-4.2.0.tar.gz", hash = "sha256:e1875bb4b4e2de1669f4bc7869b6d3f54231cdced71605e6e64c9be77e3be50f"}, +] + +[package.dependencies] +exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} +idna = ">=2.8" +sniffio = ">=1.1" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.11\""} + +[package.extras] +doc = ["Sphinx (>=7)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx-rtd-theme"] +test = ["anyio[trio]", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "pytest-mock (>=3.6.1)", "trustme", "uvloop (>=0.17)"] +trio = ["trio (>=0.23)"] + +[[package]] +name = "appnope" +version = "0.1.3" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = "*" +files = [ + {file = "appnope-0.1.3-py2.py3-none-any.whl", hash = "sha256:265a455292d0bd8a72453494fa24df5a11eb18373a60c7c0430889f22548605e"}, + {file = "appnope-0.1.3.tar.gz", hash = "sha256:02bd91c4de869fbb1e1c50aafc4098827a7a54ab2f39d9dcba6c9547ed920e24"}, +] + +[[package]] +name = "argon2-cffi" +version = "23.1.0" +description = "Argon2 for Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "argon2_cffi-23.1.0-py3-none-any.whl", hash = "sha256:c670642b78ba29641818ab2e68bd4e6a78ba53b7eff7b4c3815ae16abf91c7ea"}, + {file = "argon2_cffi-23.1.0.tar.gz", hash = "sha256:879c3e79a2729ce768ebb7d36d4609e3a78a4ca2ec3a9f12286ca057e3d0db08"}, +] + +[package.dependencies] +argon2-cffi-bindings = "*" + +[package.extras] +dev = ["argon2-cffi[tests,typing]", "tox (>4)"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-copybutton", "sphinx-notfound-page"] +tests = ["hypothesis", "pytest"] +typing = ["mypy"] + +[[package]] +name = "argon2-cffi-bindings" +version = "21.2.0" +description = "Low-level CFFI bindings for Argon2" +optional = false +python-versions = ">=3.6" +files = [ + {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, + {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, + {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, + {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, + {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, +] + +[package.dependencies] +cffi = ">=1.0.1" + +[package.extras] +dev = ["cogapp", "pre-commit", "pytest", "wheel"] +tests = ["pytest"] + +[[package]] +name = "arrow" +version = "1.3.0" +description = "Better dates & times for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, + {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, +] + +[package.dependencies] +python-dateutil = ">=2.7.0" +types-python-dateutil = ">=2.8.10" + +[package.extras] +doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] + +[[package]] +name = "asttokens" +version = "2.4.1" +description = "Annotate AST trees with source code positions" +optional = false +python-versions = "*" +files = [ + {file = "asttokens-2.4.1-py2.py3-none-any.whl", hash = "sha256:051ed49c3dcae8913ea7cd08e46a606dba30b79993209636c4875bc1d637bc24"}, + {file = "asttokens-2.4.1.tar.gz", hash = "sha256:b03869718ba9a6eb027e134bfdf69f38a236d681c83c160d510768af11254ba0"}, +] + +[package.dependencies] +six = ">=1.12.0" + +[package.extras] +astroid = ["astroid (>=1,<2)", "astroid (>=2,<4)"] +test = ["astroid (>=1,<2)", "astroid (>=2,<4)", "pytest"] + +[[package]] +name = "async-lru" +version = "2.0.4" +description = "Simple LRU cache for asyncio" +optional = false +python-versions = ">=3.8" +files = [ + {file = "async-lru-2.0.4.tar.gz", hash = "sha256:b8a59a5df60805ff63220b2a0c5b5393da5521b113cd5465a44eb037d81a5627"}, + {file = "async_lru-2.0.4-py3-none-any.whl", hash = "sha256:ff02944ce3c288c5be660c42dbcca0742b32c3b279d6dceda655190240b99224"}, +] + +[package.dependencies] +typing-extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} + +[[package]] +name = "atpublic" +version = "4.0" +description = "Keep all y'all's __all__'s in sync" +optional = false +python-versions = ">=3.8" +files = [ + {file = "atpublic-4.0-py3-none-any.whl", hash = "sha256:80057c55641253b86dcb68b524f82328172371b6547d4c7462a9127fbfbbabfc"}, + {file = "atpublic-4.0.tar.gz", hash = "sha256:0f40433219e124edf115c6c363808ca6f0e1cfa7d160d86b2fb94793086d1294"}, +] + +[[package]] +name = "attrs" +version = "23.2.0" +description = "Classes Without Boilerplate" +optional = false +python-versions = ">=3.7" +files = [ + {file = "attrs-23.2.0-py3-none-any.whl", hash = "sha256:99b87a485a5820b23b879f04c2305b44b951b502fd64be915879d77a7e8fc6f1"}, + {file = "attrs-23.2.0.tar.gz", hash = "sha256:935dc3b529c262f6cf76e50877d35a4bd3c1de194fd41f47a2b7ae8f19971f30"}, +] + +[package.extras] +cov = ["attrs[tests]", "coverage[toml] (>=5.3)"] +dev = ["attrs[tests]", "pre-commit"] +docs = ["furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier", "zope-interface"] +tests = ["attrs[tests-no-zope]", "zope-interface"] +tests-mypy = ["mypy (>=1.6)", "pytest-mypy-plugins"] +tests-no-zope = ["attrs[tests-mypy]", "cloudpickle", "hypothesis", "pympler", "pytest (>=4.3.0)", "pytest-xdist[psutil]"] + +[[package]] +name = "babel" +version = "2.14.0" +description = "Internationalization utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "Babel-2.14.0-py3-none-any.whl", hash = "sha256:efb1a25b7118e67ce3a259bed20545c29cb68be8ad2c784c83689981b7a57287"}, + {file = "Babel-2.14.0.tar.gz", hash = "sha256:6919867db036398ba21eb5c7a0f6b28ab8cbc3ae7a73a44ebe34ae74a4e7d363"}, +] + +[package.dependencies] +pytz = {version = ">=2015.7", markers = "python_version < \"3.9\""} + +[package.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "backcall" +version = "0.2.0" +description = "Specifications for callback functions passed in to an API" +optional = false +python-versions = "*" +files = [ + {file = "backcall-0.2.0-py2.py3-none-any.whl", hash = "sha256:fbbce6a29f263178a1f7915c1940bde0ec2b2a967566fe1c65c1dfb7422bd255"}, + {file = "backcall-0.2.0.tar.gz", hash = "sha256:5cbdbf27be5e7cfadb448baf0aa95508f91f2bbc6c6437cd9cd06e2a4c215e1e"}, +] + +[[package]] +name = "bandit" +version = "1.7.6" +description = "Security oriented static analyser for python code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bandit-1.7.6-py3-none-any.whl", hash = "sha256:36da17c67fc87579a5d20c323c8d0b1643a890a2b93f00b3d1229966624694ff"}, + {file = "bandit-1.7.6.tar.gz", hash = "sha256:72ce7bc9741374d96fb2f1c9a8960829885f1243ffde743de70a19cee353e8f3"}, +] + +[package.dependencies] +colorama = {version = ">=0.3.9", markers = "platform_system == \"Windows\""} +GitPython = ">=3.1.30" +PyYAML = ">=5.3.1" +rich = "*" +stevedore = ">=1.20.0" + +[package.extras] +test = ["beautifulsoup4 (>=4.8.0)", "coverage (>=4.5.4)", "fixtures (>=3.0.0)", "flake8 (>=4.0.0)", "pylint (==1.9.4)", "stestr (>=2.5.0)", "testscenarios (>=0.5.0)", "testtools (>=2.3.0)", "tomli (>=1.1.0)"] +toml = ["tomli (>=1.1.0)"] +yaml = ["PyYAML"] + +[[package]] +name = "beautifulsoup4" +version = "4.12.2" +description = "Screen-scraping library" +optional = false +python-versions = ">=3.6.0" +files = [ + {file = "beautifulsoup4-4.12.2-py3-none-any.whl", hash = "sha256:bd2520ca0d9d7d12694a53d44ac482d181b4ec1888909b035a3dbf40d0f57d4a"}, + {file = "beautifulsoup4-4.12.2.tar.gz", hash = "sha256:492bbc69dca35d12daac71c4db1bfff0c876c00ef4a2ffacce226d4638eb72da"}, +] + +[package.dependencies] +soupsieve = ">1.2" + +[package.extras] +html5lib = ["html5lib"] +lxml = ["lxml"] + +[[package]] +name = "bleach" +version = "6.1.0" +description = "An easy safelist-based HTML-sanitizing tool." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bleach-6.1.0-py3-none-any.whl", hash = "sha256:3225f354cfc436b9789c66c4ee030194bee0568fbf9cbdad3bc8b5c26c5f12b6"}, + {file = "bleach-6.1.0.tar.gz", hash = "sha256:0a31f1837963c41d46bbf1331b8778e1308ea0791db03cc4e7357b97cf42a8fe"}, +] + +[package.dependencies] +six = ">=1.9.0" +webencodings = "*" + +[package.extras] +css = ["tinycss2 (>=1.1.0,<1.3)"] + +[[package]] +name = "certifi" +version = "2023.11.17" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2023.11.17-py3-none-any.whl", hash = "sha256:e036ab49d5b79556f99cfc2d9320b34cfbe5be05c5871b51de9329f0603b0474"}, + {file = "certifi-2023.11.17.tar.gz", hash = "sha256:9b469f3a900bf28dc19b8cfbf8019bf47f7fdd1a65a1d4ffb98fc14166beb4d1"}, +] + +[[package]] +name = "cffi" +version = "1.16.0" +description = "Foreign Function Interface for Python calling C code." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cffi-1.16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b3d6606d369fc1da4fd8c357d026317fbb9c9b75d36dc16e90e84c26854b088"}, + {file = "cffi-1.16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ac0f5edd2360eea2f1daa9e26a41db02dd4b0451b48f7c318e217ee092a213e9"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7e61e3e4fa664a8588aa25c883eab612a188c725755afff6289454d6362b9673"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a72e8961a86d19bdb45851d8f1f08b041ea37d2bd8d4fd19903bc3083d80c896"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b50bf3f55561dac5438f8e70bfcdfd74543fd60df5fa5f62d94e5867deca684"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7651c50c8c5ef7bdb41108b7b8c5a83013bfaa8a935590c5d74627c047a583c7"}, + {file = "cffi-1.16.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e4108df7fe9b707191e55f33efbcb2d81928e10cea45527879a4749cbe472614"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:32c68ef735dbe5857c810328cb2481e24722a59a2003018885514d4c09af9743"}, + {file = "cffi-1.16.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:673739cb539f8cdaa07d92d02efa93c9ccf87e345b9a0b556e3ecc666718468d"}, + {file = "cffi-1.16.0-cp310-cp310-win32.whl", hash = "sha256:9f90389693731ff1f659e55c7d1640e2ec43ff725cc61b04b2f9c6d8d017df6a"}, + {file = "cffi-1.16.0-cp310-cp310-win_amd64.whl", hash = "sha256:e6024675e67af929088fda399b2094574609396b1decb609c55fa58b028a32a1"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b84834d0cf97e7d27dd5b7f3aca7b6e9263c56308ab9dc8aae9784abb774d404"}, + {file = "cffi-1.16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1b8ebc27c014c59692bb2664c7d13ce7a6e9a629be20e54e7271fa696ff2b417"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ee07e47c12890ef248766a6e55bd38ebfb2bb8edd4142d56db91b21ea68b7627"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8a9d3ebe49f084ad71f9269834ceccbf398253c9fac910c4fd7053ff1386936"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e70f54f1796669ef691ca07d046cd81a29cb4deb1e5f942003f401c0c4a2695d"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5bf44d66cdf9e893637896c7faa22298baebcd18d1ddb6d2626a6e39793a1d56"}, + {file = "cffi-1.16.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7b78010e7b97fef4bee1e896df8a4bbb6712b7f05b7ef630f9d1da00f6444d2e"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c6a164aa47843fb1b01e941d385aab7215563bb8816d80ff3a363a9f8448a8dc"}, + {file = "cffi-1.16.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e09f3ff613345df5e8c3667da1d918f9149bd623cd9070c983c013792a9a62eb"}, + {file = "cffi-1.16.0-cp311-cp311-win32.whl", hash = "sha256:2c56b361916f390cd758a57f2e16233eb4f64bcbeee88a4881ea90fca14dc6ab"}, + {file = "cffi-1.16.0-cp311-cp311-win_amd64.whl", hash = "sha256:db8e577c19c0fda0beb7e0d4e09e0ba74b1e4c092e0e40bfa12fe05b6f6d75ba"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fa3a0128b152627161ce47201262d3140edb5a5c3da88d73a1b790a959126956"}, + {file = "cffi-1.16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:68e7c44931cc171c54ccb702482e9fc723192e88d25a0e133edd7aff8fcd1f6e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:abd808f9c129ba2beda4cfc53bde801e5bcf9d6e0f22f095e45327c038bfe68e"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88e2b3c14bdb32e440be531ade29d3c50a1a59cd4e51b1dd8b0865c54ea5d2e2"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcc8eb6d5902bb1cf6dc4f187ee3ea80a1eba0a89aba40a5cb20a5087d961357"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b7be2d771cdba2942e13215c4e340bfd76398e9227ad10402a8767ab1865d2e6"}, + {file = "cffi-1.16.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e715596e683d2ce000574bae5d07bd522c781a822866c20495e52520564f0969"}, + {file = "cffi-1.16.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2d92b25dbf6cae33f65005baf472d2c245c050b1ce709cc4588cdcdd5495b520"}, + {file = "cffi-1.16.0-cp312-cp312-win32.whl", hash = "sha256:b2ca4e77f9f47c55c194982e10f058db063937845bb2b7a86c84a6cfe0aefa8b"}, + {file = "cffi-1.16.0-cp312-cp312-win_amd64.whl", hash = "sha256:68678abf380b42ce21a5f2abde8efee05c114c2fdb2e9eef2efdb0257fba1235"}, + {file = "cffi-1.16.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:0c9ef6ff37e974b73c25eecc13952c55bceed9112be2d9d938ded8e856138bcc"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a09582f178759ee8128d9270cd1344154fd473bb77d94ce0aeb2a93ebf0feaf0"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e760191dd42581e023a68b758769e2da259b5d52e3103c6060ddc02c9edb8d7b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:80876338e19c951fdfed6198e70bc88f1c9758b94578d5a7c4c91a87af3cf31c"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a6a14b17d7e17fa0d207ac08642c8820f84f25ce17a442fd15e27ea18d67c59b"}, + {file = "cffi-1.16.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6602bc8dc6f3a9e02b6c22c4fc1e47aa50f8f8e6d3f78a5e16ac33ef5fefa324"}, + {file = "cffi-1.16.0-cp38-cp38-win32.whl", hash = "sha256:131fd094d1065b19540c3d72594260f118b231090295d8c34e19a7bbcf2e860a"}, + {file = "cffi-1.16.0-cp38-cp38-win_amd64.whl", hash = "sha256:31d13b0f99e0836b7ff893d37af07366ebc90b678b6664c955b54561fc36ef36"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:582215a0e9adbe0e379761260553ba11c58943e4bbe9c36430c4ca6ac74b15ed"}, + {file = "cffi-1.16.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b29ebffcf550f9da55bec9e02ad430c992a87e5f512cd63388abb76f1036d8d2"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dc9b18bf40cc75f66f40a7379f6a9513244fe33c0e8aa72e2d56b0196a7ef872"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9cb4a35b3642fc5c005a6755a5d17c6c8b6bcb6981baf81cea8bfbc8903e8ba8"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b86851a328eedc692acf81fb05444bdf1891747c25af7529e39ddafaf68a4f3f"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c0f31130ebc2d37cdd8e44605fb5fa7ad59049298b3f745c74fa74c62fbfcfc4"}, + {file = "cffi-1.16.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8f8e709127c6c77446a8c0a8c8bf3c8ee706a06cd44b1e827c3e6a2ee6b8c098"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:748dcd1e3d3d7cd5443ef03ce8685043294ad6bd7c02a38d1bd367cfd968e000"}, + {file = "cffi-1.16.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:8895613bcc094d4a1b2dbe179d88d7fb4a15cee43c052e8885783fac397d91fe"}, + {file = "cffi-1.16.0-cp39-cp39-win32.whl", hash = "sha256:ed86a35631f7bfbb28e108dd96773b9d5a6ce4811cf6ea468bb6a359b256b1e4"}, + {file = "cffi-1.16.0-cp39-cp39-win_amd64.whl", hash = "sha256:3686dffb02459559c74dd3d81748269ffb0eb027c39a6fc99502de37d501faa8"}, + {file = "cffi-1.16.0.tar.gz", hash = "sha256:bcb3ef43e58665bbda2fb198698fcae6776483e0c4a631aa5647806c25e02cc0"}, +] + +[package.dependencies] +pycparser = "*" + +[[package]] +name = "cfgv" +version = "3.4.0" +description = "Validate configuration and produce human readable error messages." +optional = false +python-versions = ">=3.8" +files = [ + {file = "cfgv-3.4.0-py2.py3-none-any.whl", hash = "sha256:b7265b1f29fd3316bfcd2b330d63d024f2bfd8bcb8b0272f8e19a504856c48f9"}, + {file = "cfgv-3.4.0.tar.gz", hash = "sha256:e52591d4c5f5dead8e0f673fb16db7949d2cfb3f7da4582893288f0ded8fe560"}, +] + +[[package]] +name = "charset-normalizer" +version = "3.3.2" +description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "charset-normalizer-3.3.2.tar.gz", hash = "sha256:f30c3cb33b24454a82faecaf01b19c18562b1e89558fb6c56de4d9118a032fd5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:25baf083bf6f6b341f4121c2f3c548875ee6f5339300e08be3f2b2ba1721cdd3"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:06435b539f889b1f6f4ac1758871aae42dc3a8c0e24ac9e60c2384973ad73027"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9063e24fdb1e498ab71cb7419e24622516c4a04476b17a2dab57e8baa30d6e03"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6897af51655e3691ff853668779c7bad41579facacf5fd7253b0133308cf000d"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1d3193f4a680c64b4b6a9115943538edb896edc190f0b222e73761716519268e"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cd70574b12bb8a4d2aaa0094515df2463cb429d8536cfb6c7ce983246983e5a6"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8465322196c8b4d7ab6d1e049e4c5cb460d0394da4a27d23cc242fbf0034b6b5"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a9a8e9031d613fd2009c182b69c7b2c1ef8239a0efb1df3f7c8da66d5dd3d537"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:beb58fe5cdb101e3a055192ac291b7a21e3b7ef4f67fa1d74e331a7f2124341c"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:e06ed3eb3218bc64786f7db41917d4e686cc4856944f53d5bdf83a6884432e12"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2e81c7b9c8979ce92ed306c249d46894776a909505d8f5a4ba55b14206e3222f"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:572c3763a264ba47b3cf708a44ce965d98555f618ca42c926a9c1616d8f34269"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fd1abc0d89e30cc4e02e4064dc67fcc51bd941eb395c502aac3ec19fab46b519"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win32.whl", hash = "sha256:3d47fa203a7bd9c5b6cee4736ee84ca03b8ef23193c0d1ca99b5089f72645c73"}, + {file = "charset_normalizer-3.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:10955842570876604d404661fbccbc9c7e684caf432c09c715ec38fbae45ae09"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:802fe99cca7457642125a8a88a084cef28ff0cf9407060f7b93dca5aa25480db"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:573f6eac48f4769d667c4442081b1794f52919e7edada77495aaed9236d13a96"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:549a3a73da901d5bc3ce8d24e0600d1fa85524c10287f6004fbab87672bf3e1e"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f27273b60488abe721a075bcca6d7f3964f9f6f067c8c4c605743023d7d3944f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1ceae2f17a9c33cb48e3263960dc5fc8005351ee19db217e9b1bb15d28c02574"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65f6f63034100ead094b8744b3b97965785388f308a64cf8d7c34f2f2e5be0c4"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:753f10e867343b4511128c6ed8c82f7bec3bd026875576dfd88483c5c73b2fd8"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4a78b2b446bd7c934f5dcedc588903fb2f5eec172f3d29e52a9096a43722adfc"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e537484df0d8f426ce2afb2d0f8e1c3d0b114b83f8850e5f2fbea0e797bd82ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:eb6904c354526e758fda7167b33005998fb68c46fbc10e013ca97f21ca5c8887"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:deb6be0ac38ece9ba87dea880e438f25ca3eddfac8b002a2ec3d9183a454e8ae"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:4ab2fe47fae9e0f9dee8c04187ce5d09f48eabe611be8259444906793ab7cbce"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:80402cd6ee291dcb72644d6eac93785fe2c8b9cb30893c1af5b8fdd753b9d40f"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win32.whl", hash = "sha256:7cd13a2e3ddeed6913a65e66e94b51d80a041145a026c27e6bb76c31a853c6ab"}, + {file = "charset_normalizer-3.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:663946639d296df6a2bb2aa51b60a2454ca1cb29835324c640dafb5ff2131a77"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:0b2b64d2bb6d3fb9112bafa732def486049e63de9618b5843bcdd081d8144cd8"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:ddbb2551d7e0102e7252db79ba445cdab71b26640817ab1e3e3648dad515003b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:55086ee1064215781fff39a1af09518bc9255b50d6333f2e4c74ca09fac6a8f6"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f4a014bc36d3c57402e2977dada34f9c12300af536839dc38c0beab8878f38a"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a10af20b82360ab00827f916a6058451b723b4e65030c5a18577c8b2de5b3389"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8d756e44e94489e49571086ef83b2bb8ce311e730092d2c34ca8f7d925cb20aa"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:90d558489962fd4918143277a773316e56c72da56ec7aa3dc3dbbe20fdfed15b"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ac7ffc7ad6d040517be39eb591cac5ff87416c2537df6ba3cba3bae290c0fed"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:7ed9e526742851e8d5cc9e6cf41427dfc6068d4f5a3bb03659444b4cabf6bc26"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8bdb58ff7ba23002a4c5808d608e4e6c687175724f54a5dade5fa8c67b604e4d"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:6b3251890fff30ee142c44144871185dbe13b11bab478a88887a639655be1068"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b4a23f61ce87adf89be746c8a8974fe1c823c891d8f86eb218bb957c924bb143"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:efcb3f6676480691518c177e3b465bcddf57cea040302f9f4e6e191af91174d4"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win32.whl", hash = "sha256:d965bba47ddeec8cd560687584e88cf699fd28f192ceb452d1d7ee807c5597b7"}, + {file = "charset_normalizer-3.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:96b02a3dc4381e5494fad39be677abcb5e6634bf7b4fa83a6dd3112607547001"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:95f2a5796329323b8f0512e09dbb7a1860c46a39da62ecb2324f116fa8fdc85c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c002b4ffc0be611f0d9da932eb0f704fe2602a9a949d1f738e4c34c75b0863d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:a981a536974bbc7a512cf44ed14938cf01030a99e9b3a06dd59578882f06f985"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3287761bc4ee9e33561a7e058c72ac0938c4f57fe49a09eae428fd88aafe7bb6"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:42cb296636fcc8b0644486d15c12376cb9fa75443e00fb25de0b8602e64c1714"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a55554a2fa0d408816b3b5cedf0045f4b8e1a6065aec45849de2d6f3f8e9786"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:c083af607d2515612056a31f0a8d9e0fcb5876b7bfc0abad3ecd275bc4ebc2d5"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:87d1351268731db79e0f8e745d92493ee2841c974128ef629dc518b937d9194c"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:bd8f7df7d12c2db9fab40bdd87a7c09b1530128315d047a086fa3ae3435cb3a8"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:c180f51afb394e165eafe4ac2936a14bee3eb10debc9d9e4db8958fe36afe711"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:8c622a5fe39a48f78944a87d4fb8a53ee07344641b0562c540d840748571b811"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win32.whl", hash = "sha256:db364eca23f876da6f9e16c9da0df51aa4f104a972735574842618b8c6d999d4"}, + {file = "charset_normalizer-3.3.2-cp37-cp37m-win_amd64.whl", hash = "sha256:86216b5cee4b06df986d214f664305142d9c76df9b6512be2738aa72a2048f99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:6463effa3186ea09411d50efc7d85360b38d5f09b870c48e4600f63af490e56a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:6c4caeef8fa63d06bd437cd4bdcf3ffefe6738fb1b25951440d80dc7df8c03ac"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:37e55c8e51c236f95b033f6fb391d7d7970ba5fe7ff453dad675e88cf303377a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb69256e180cb6c8a894fee62b3afebae785babc1ee98b81cdf68bbca1987f33"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ae5f4161f18c61806f411a13b0310bea87f987c7d2ecdbdaad0e94eb2e404238"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b2b0a0c0517616b6869869f8c581d4eb2dd83a4d79e0ebcb7d373ef9956aeb0a"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:45485e01ff4d3630ec0d9617310448a8702f70e9c01906b0d0118bdf9d124cf2"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eb00ed941194665c332bf8e078baf037d6c35d7c4f3102ea2d4f16ca94a26dc8"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:2127566c664442652f024c837091890cb1942c30937add288223dc895793f898"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:a50aebfa173e157099939b17f18600f72f84eed3049e743b68ad15bd69b6bf99"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:4d0d1650369165a14e14e1e47b372cfcb31d6ab44e6e33cb2d4e57265290044d"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:923c0c831b7cfcb071580d3f46c4baf50f174be571576556269530f4bbd79d04"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:06a81e93cd441c56a9b65d8e1d043daeb97a3d0856d177d5c90ba85acb3db087"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win32.whl", hash = "sha256:6ef1d82a3af9d3eecdba2321dc1b3c238245d890843e040e41e470ffa64c3e25"}, + {file = "charset_normalizer-3.3.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb8821e09e916165e160797a6c17edda0679379a4be5c716c260e836e122f54b"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:c235ebd9baae02f1b77bcea61bce332cb4331dc3617d254df3323aa01ab47bd4"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5b4c145409bef602a690e7cfad0a15a55c13320ff7a3ad7ca59c13bb8ba4d45d"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:68d1f8a9e9e37c1223b656399be5d6b448dea850bed7d0f87a8311f1ff3dabb0"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:22afcb9f253dac0696b5a4be4a1c0f8762f8239e21b99680099abd9b2b1b2269"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e27ad930a842b4c5eb8ac0016b0a54f5aebbe679340c26101df33424142c143c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:1f79682fbe303db92bc2b1136016a38a42e835d932bab5b3b1bfcfbf0640e519"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b261ccdec7821281dade748d088bb6e9b69e6d15b30652b74cbbac25e280b796"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:122c7fa62b130ed55f8f285bfd56d5f4b4a5b503609d181f9ad85e55c89f4185"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:d0eccceffcb53201b5bfebb52600a5fb483a20b61da9dbc885f8b103cbe7598c"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:9f96df6923e21816da7e0ad3fd47dd8f94b2a5ce594e00677c0013018b813458"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:7f04c839ed0b6b98b1a7501a002144b76c18fb1c1850c8b98d458ac269e26ed2"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:34d1c8da1e78d2e001f363791c98a272bb734000fcef47a491c1e3b0505657a8"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff8fa367d09b717b2a17a052544193ad76cd49979c805768879cb63d9ca50561"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win32.whl", hash = "sha256:aed38f6e4fb3f5d6bf81bfa990a07806be9d83cf7bacef998ab1a9bd660a581f"}, + {file = "charset_normalizer-3.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:b01b88d45a6fcb69667cd6d2f7a9aeb4bf53760d7fc536bf679ec94fe9f3ff3d"}, + {file = "charset_normalizer-3.3.2-py3-none-any.whl", hash = "sha256:3e4d1f6587322d2788836a99c69062fbb091331ec940e02d12d179c1d53e25fc"}, +] + +[[package]] +name = "click" +version = "8.1.7" +description = "Composable command line interface toolkit" +optional = false +python-versions = ">=3.7" +files = [ + {file = "click-8.1.7-py3-none-any.whl", hash = "sha256:ae74fb96c20a0277a1d615f1e4d73c8414f5a98db8b799a7931d1582f3390c28"}, + {file = "click-8.1.7.tar.gz", hash = "sha256:ca9853ad459e787e2192211578cc907e7594e294c7ccc834310722b41b9ca6de"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "platform_system == \"Windows\""} + +[[package]] +name = "colorama" +version = "0.4.6" +description = "Cross-platform colored terminal text." +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,>=2.7" +files = [ + {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, + {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, +] + +[[package]] +name = "comm" +version = "0.2.1" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.1-py3-none-any.whl", hash = "sha256:87928485c0dfc0e7976fd89fc1e187023cf587e7c353e4a9b417555b44adf021"}, + {file = "comm-0.2.1.tar.gz", hash = "sha256:0bc91edae1344d39d3661dcbc36937181fdaddb304790458f8b044dbc064b89a"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "coverage" +version = "7.4.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.4.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:36b0ea8ab20d6a7564e89cb6135920bc9188fb5f1f7152e94e8300b7b189441a"}, + {file = "coverage-7.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0676cd0ba581e514b7f726495ea75aba3eb20899d824636c6f59b0ed2f88c471"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d0ca5c71a5a1765a0f8f88022c52b6b8be740e512980362f7fdbb03725a0d6b9"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a7c97726520f784239f6c62506bc70e48d01ae71e9da128259d61ca5e9788516"}, + {file = "coverage-7.4.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:815ac2d0f3398a14286dc2cea223a6f338109f9ecf39a71160cd1628786bc6f5"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:80b5ee39b7f0131ebec7968baa9b2309eddb35b8403d1869e08f024efd883566"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:5b2ccb7548a0b65974860a78c9ffe1173cfb5877460e5a229238d985565574ae"}, + {file = "coverage-7.4.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:995ea5c48c4ebfd898eacb098164b3cc826ba273b3049e4a889658548e321b43"}, + {file = "coverage-7.4.0-cp310-cp310-win32.whl", hash = "sha256:79287fd95585ed36e83182794a57a46aeae0b64ca53929d1176db56aacc83451"}, + {file = "coverage-7.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:5b14b4f8760006bfdb6e08667af7bc2d8d9bfdb648351915315ea17645347137"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:04387a4a6ecb330c1878907ce0dc04078ea72a869263e53c72a1ba5bbdf380ca"}, + {file = "coverage-7.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:ea81d8f9691bb53f4fb4db603203029643caffc82bf998ab5b59ca05560f4c06"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:74775198b702868ec2d058cb92720a3c5a9177296f75bd97317c787daf711505"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:76f03940f9973bfaee8cfba70ac991825611b9aac047e5c80d499a44079ec0bc"}, + {file = "coverage-7.4.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:485e9f897cf4856a65a57c7f6ea3dc0d4e6c076c87311d4bc003f82cfe199d25"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:6ae8c9d301207e6856865867d762a4b6fd379c714fcc0607a84b92ee63feff70"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:bf477c355274a72435ceb140dc42de0dc1e1e0bf6e97195be30487d8eaaf1a09"}, + {file = "coverage-7.4.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:83c2dda2666fe32332f8e87481eed056c8b4d163fe18ecc690b02802d36a4d26"}, + {file = "coverage-7.4.0-cp311-cp311-win32.whl", hash = "sha256:697d1317e5290a313ef0d369650cfee1a114abb6021fa239ca12b4849ebbd614"}, + {file = "coverage-7.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:26776ff6c711d9d835557ee453082025d871e30b3fd6c27fcef14733f67f0590"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:13eaf476ec3e883fe3e5fe3707caeb88268a06284484a3daf8250259ef1ba143"}, + {file = "coverage-7.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846f52f46e212affb5bcf131c952fb4075b55aae6b61adc9856222df89cbe3e2"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:26f66da8695719ccf90e794ed567a1549bb2644a706b41e9f6eae6816b398c4a"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:164fdcc3246c69a6526a59b744b62e303039a81e42cfbbdc171c91a8cc2f9446"}, + {file = "coverage-7.4.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:316543f71025a6565677d84bc4df2114e9b6a615aa39fb165d697dba06a54af9"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:bb1de682da0b824411e00a0d4da5a784ec6496b6850fdf8c865c1d68c0e318dd"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:0e8d06778e8fbffccfe96331a3946237f87b1e1d359d7fbe8b06b96c95a5407a"}, + {file = "coverage-7.4.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a56de34db7b7ff77056a37aedded01b2b98b508227d2d0979d373a9b5d353daa"}, + {file = "coverage-7.4.0-cp312-cp312-win32.whl", hash = "sha256:51456e6fa099a8d9d91497202d9563a320513fcf59f33991b0661a4a6f2ad450"}, + {file = "coverage-7.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd3c1e4cb2ff0083758f09be0f77402e1bdf704adb7f89108007300a6da587d0"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e9d1bf53c4c8de58d22e0e956a79a5b37f754ed1ffdbf1a260d9dcfa2d8a325e"}, + {file = "coverage-7.4.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:109f5985182b6b81fe33323ab4707011875198c41964f014579cf82cebf2bb85"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3cc9d4bc55de8003663ec94c2f215d12d42ceea128da8f0f4036235a119c88ac"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cc6d65b21c219ec2072c1293c505cf36e4e913a3f936d80028993dd73c7906b1"}, + {file = "coverage-7.4.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5a10a4920def78bbfff4eff8a05c51be03e42f1c3735be42d851f199144897ba"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:b8e99f06160602bc64da35158bb76c73522a4010f0649be44a4e167ff8555952"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:7d360587e64d006402b7116623cebf9d48893329ef035278969fa3bbf75b697e"}, + {file = "coverage-7.4.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:29f3abe810930311c0b5d1a7140f6395369c3db1be68345638c33eec07535105"}, + {file = "coverage-7.4.0-cp38-cp38-win32.whl", hash = "sha256:5040148f4ec43644702e7b16ca864c5314ccb8ee0751ef617d49aa0e2d6bf4f2"}, + {file = "coverage-7.4.0-cp38-cp38-win_amd64.whl", hash = "sha256:9864463c1c2f9cb3b5db2cf1ff475eed2f0b4285c2aaf4d357b69959941aa555"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:936d38794044b26c99d3dd004d8af0035ac535b92090f7f2bb5aa9c8e2f5cd42"}, + {file = "coverage-7.4.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:799c8f873794a08cdf216aa5d0531c6a3747793b70c53f70e98259720a6fe2d7"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e7defbb9737274023e2d7af02cac77043c86ce88a907c58f42b580a97d5bcca9"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a1526d265743fb49363974b7aa8d5899ff64ee07df47dd8d3e37dcc0818f09ed"}, + {file = "coverage-7.4.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bf635a52fc1ea401baf88843ae8708591aa4adff875e5c23220de43b1ccf575c"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:756ded44f47f330666843b5781be126ab57bb57c22adbb07d83f6b519783b870"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:0eb3c2f32dabe3a4aaf6441dde94f35687224dfd7eb2a7f47f3fd9428e421058"}, + {file = "coverage-7.4.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:bfd5db349d15c08311702611f3dccbef4b4e2ec148fcc636cf8739519b4a5c0f"}, + {file = "coverage-7.4.0-cp39-cp39-win32.whl", hash = "sha256:53d7d9158ee03956e0eadac38dfa1ec8068431ef8058fe6447043db1fb40d932"}, + {file = "coverage-7.4.0-cp39-cp39-win_amd64.whl", hash = "sha256:cfd2a8b6b0d8e66e944d47cdec2f47c48fef2ba2f2dff5a9a75757f64172857e"}, + {file = "coverage-7.4.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:c530833afc4707fe48524a44844493f36d8727f04dcce91fb978c414a8556cc6"}, + {file = "coverage-7.4.0.tar.gz", hash = "sha256:707c0f58cb1712b8809ece32b68996ee1e609f71bd14615bd8f87a1293cb610e"}, +] + +[package.dependencies] +tomli = {version = "*", optional = true, markers = "python_full_version <= \"3.11.0a6\" and extra == \"toml\""} + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "debugpy" +version = "1.8.0" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.0-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:7fb95ca78f7ac43393cd0e0f2b6deda438ec7c5e47fa5d38553340897d2fbdfb"}, + {file = "debugpy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef9ab7df0b9a42ed9c878afd3eaaff471fce3fa73df96022e1f5c9f8f8c87ada"}, + {file = "debugpy-1.8.0-cp310-cp310-win32.whl", hash = "sha256:a8b7a2fd27cd9f3553ac112f356ad4ca93338feadd8910277aff71ab24d8775f"}, + {file = "debugpy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:5d9de202f5d42e62f932507ee8b21e30d49aae7e46d5b1dd5c908db1d7068637"}, + {file = "debugpy-1.8.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:ef54404365fae8d45cf450d0544ee40cefbcb9cb85ea7afe89a963c27028261e"}, + {file = "debugpy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60009b132c91951354f54363f8ebdf7457aeb150e84abba5ae251b8e9f29a8a6"}, + {file = "debugpy-1.8.0-cp311-cp311-win32.whl", hash = "sha256:8cd0197141eb9e8a4566794550cfdcdb8b3db0818bdf8c49a8e8f8053e56e38b"}, + {file = "debugpy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a64093656c4c64dc6a438e11d59369875d200bd5abb8f9b26c1f5f723622e153"}, + {file = "debugpy-1.8.0-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:b05a6b503ed520ad58c8dc682749113d2fd9f41ffd45daec16e558ca884008cd"}, + {file = "debugpy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3c6fb41c98ec51dd010d7ed650accfd07a87fe5e93eca9d5f584d0578f28f35f"}, + {file = "debugpy-1.8.0-cp38-cp38-win32.whl", hash = "sha256:46ab6780159eeabb43c1495d9c84cf85d62975e48b6ec21ee10c95767c0590aa"}, + {file = "debugpy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:bdc5ef99d14b9c0fcb35351b4fbfc06ac0ee576aeab6b2511702e5a648a2e595"}, + {file = "debugpy-1.8.0-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:61eab4a4c8b6125d41a34bad4e5fe3d2cc145caecd63c3fe953be4cc53e65bf8"}, + {file = "debugpy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:125b9a637e013f9faac0a3d6a82bd17c8b5d2c875fb6b7e2772c5aba6d082332"}, + {file = "debugpy-1.8.0-cp39-cp39-win32.whl", hash = "sha256:57161629133113c97b387382045649a2b985a348f0c9366e22217c87b68b73c6"}, + {file = "debugpy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:e3412f9faa9ade82aa64a50b602544efcba848c91384e9f93497a458767e6926"}, + {file = "debugpy-1.8.0-py2.py3-none-any.whl", hash = "sha256:9c9b0ac1ce2a42888199df1a1906e45e6f3c9555497643a85e0bf2406e3ffbc4"}, + {file = "debugpy-1.8.0.zip", hash = "sha256:12af2c55b419521e33d5fb21bd022df0b5eb267c3e178f1d374a63a2a6bdccd0"}, +] + +[[package]] +name = "decorator" +version = "5.1.1" +description = "Decorators for Humans" +optional = false +python-versions = ">=3.5" +files = [ + {file = "decorator-5.1.1-py3-none-any.whl", hash = "sha256:b8c3f85900b9dc423225913c5aace94729fe1fa9763b38939a95226f02d37186"}, + {file = "decorator-5.1.1.tar.gz", hash = "sha256:637996211036b6385ef91435e4fae22989472f9d571faba8927ba8253acbc330"}, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +description = "XML bomb protection for Python stdlib modules" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61"}, + {file = "defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69"}, +] + +[[package]] +name = "distlib" +version = "0.3.8" +description = "Distribution utilities" +optional = false +python-versions = "*" +files = [ + {file = "distlib-0.3.8-py2.py3-none-any.whl", hash = "sha256:034db59a0b96f8ca18035f36290806a9a6e6bd9d1ff91e45a7f172eb17e51784"}, + {file = "distlib-0.3.8.tar.gz", hash = "sha256:1530ea13e350031b6312d8580ddb6b27a104275a31106523b8f123787f494f64"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.0" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.0-py3-none-any.whl", hash = "sha256:4bfd3996ac73b41e9b9628b04e079f193850720ea5945fc96a08633c66912f14"}, + {file = "exceptiongroup-1.2.0.tar.gz", hash = "sha256:91f5c769735f051a4290d52edd0858999b57e5876e9f85937691bd4c9fa3ed68"}, +] + +[package.extras] +test = ["pytest (>=6)"] + +[[package]] +name = "executing" +version = "2.0.1" +description = "Get the currently executing AST node of a frame, and other information" +optional = false +python-versions = ">=3.5" +files = [ + {file = "executing-2.0.1-py2.py3-none-any.whl", hash = "sha256:eac49ca94516ccc753f9fb5ce82603156e590b27525a8bc32cce8ae302eb61bc"}, + {file = "executing-2.0.1.tar.gz", hash = "sha256:35afe2ce3affba8ee97f2d69927fa823b08b472b7b994e36a52a964b93d16147"}, +] + +[package.extras] +tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipython", "littleutils", "pytest", "rich"] + +[[package]] +name = "fastjsonschema" +version = "2.19.1" +description = "Fastest Python implementation of JSON schema" +optional = false +python-versions = "*" +files = [ + {file = "fastjsonschema-2.19.1-py3-none-any.whl", hash = "sha256:3672b47bc94178c9f23dbb654bf47440155d4db9df5f7bc47643315f9c405cd0"}, + {file = "fastjsonschema-2.19.1.tar.gz", hash = "sha256:e3126a94bdc4623d3de4485f8d468a12f02a67921315ddc87836d6e456dc789d"}, +] + +[package.extras] +devel = ["colorama", "json-spec", "jsonschema", "pylint", "pytest", "pytest-benchmark", "pytest-cache", "validictory"] + +[[package]] +name = "filelock" +version = "3.13.1" +description = "A platform independent file lock." +optional = false +python-versions = ">=3.8" +files = [ + {file = "filelock-3.13.1-py3-none-any.whl", hash = "sha256:57dbda9b35157b05fb3e58ee91448612eb674172fab98ee235ccb0b5bee19a1c"}, + {file = "filelock-3.13.1.tar.gz", hash = "sha256:521f5f56c50f8426f5e03ad3b281b490a87ef15bc6c526f168290f0c7148d44e"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.24)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.3.2)", "diff-cover (>=8)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)", "pytest-timeout (>=2.2)"] +typing = ["typing-extensions (>=4.8)"] + +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +files = [ + {file = "ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343"}, + {file = "ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619"}, +] + +[package.dependencies] +python-dateutil = ">=2.8.1" + +[package.extras] +dev = ["flake8", "markdown", "twine", "wheel"] + +[[package]] +name = "gitdb" +version = "4.0.11" +description = "Git Object Database" +optional = false +python-versions = ">=3.7" +files = [ + {file = "gitdb-4.0.11-py3-none-any.whl", hash = "sha256:81a3407ddd2ee8df444cbacea00e2d038e40150acfa3001696fe0dcf1d3adfa4"}, + {file = "gitdb-4.0.11.tar.gz", hash = "sha256:bf5421126136d6d0af55bc1e7c1af1c397a34f5b7bd79e776cd3e89785c2b04b"}, +] + +[package.dependencies] +smmap = ">=3.0.1,<6" + +[[package]] +name = "gitpython" +version = "3.1.41" +description = "GitPython is a Python library used to interact with Git repositories" +optional = false +python-versions = ">=3.7" +files = [ + {file = "GitPython-3.1.41-py3-none-any.whl", hash = "sha256:c36b6634d069b3f719610175020a9aed919421c87552185b085e04fbbdb10b7c"}, + {file = "GitPython-3.1.41.tar.gz", hash = "sha256:ed66e624884f76df22c8e16066d567aaa5a37d5b5fa19db2c6df6f7156db9048"}, +] + +[package.dependencies] +gitdb = ">=4.0.1,<5" + +[package.extras] +test = ["black", "coverage[toml]", "ddt (>=1.1.1,!=1.4.3)", "mock", "mypy", "pre-commit", "pytest (>=7.3.1)", "pytest-cov", "pytest-instafail", "pytest-mock", "pytest-sugar", "sumtypes"] + +[[package]] +name = "graphviz" +version = "0.20.1" +description = "Simple Python interface for Graphviz" +optional = false +python-versions = ">=3.7" +files = [ + {file = "graphviz-0.20.1-py3-none-any.whl", hash = "sha256:587c58a223b51611c0cf461132da386edd896a029524ca61a1462b880bf97977"}, + {file = "graphviz-0.20.1.zip", hash = "sha256:8c58f14adaa3b947daf26c19bc1e98c4e0702cdc31cf99153e6f06904d492bf8"}, +] + +[package.extras] +dev = ["flake8", "pep8-naming", "tox (>=3)", "twine", "wheel"] +docs = ["sphinx (>=5)", "sphinx-autodoc-typehints", "sphinx-rtd-theme"] +test = ["coverage", "mock (>=4)", "pytest (>=7)", "pytest-cov", "pytest-mock (>=3)"] + +[[package]] +name = "griffe" +version = "0.39.0" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.8" +files = [ + {file = "griffe-0.39.0-py3-none-any.whl", hash = "sha256:b5e2f249d86feaad1d3068b33b1c8c2ecf39cb870bf292f2af3a4311891a4835"}, + {file = "griffe-0.39.0.tar.gz", hash = "sha256:34461730c975a31c4ffa413bdad841f217a5d1a1c611b95f6110ed0f2b2fc04d"}, +] + +[package.dependencies] +colorama = ">=0.4" + +[[package]] +name = "identify" +version = "2.5.33" +description = "File identification library for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "identify-2.5.33-py2.py3-none-any.whl", hash = "sha256:d40ce5fcd762817627670da8a7d8d8e65f24342d14539c59488dc603bf662e34"}, + {file = "identify-2.5.33.tar.gz", hash = "sha256:161558f9fe4559e1557e1bff323e8631f6a0e4837f7497767c1782832f16b62d"}, +] + +[package.extras] +license = ["ukkonen"] + +[[package]] +name = "idna" +version = "3.6" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.6-py3-none-any.whl", hash = "sha256:c05567e9c24a6b9faaa835c4821bad0590fbb9d5779e7caa6e1cc4978e7eb24f"}, + {file = "idna-3.6.tar.gz", hash = "sha256:9ecdbbd083b06798ae1e86adcbfe8ab1479cf864e4ee30fe4e46a003d12491ca"}, +] + +[[package]] +name = "importlib-metadata" +version = "7.0.1" +description = "Read metadata from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_metadata-7.0.1-py3-none-any.whl", hash = "sha256:4805911c3a4ec7c3966410053e9ec6a1fecd629117df5adee56dfc9432a1081e"}, + {file = "importlib_metadata-7.0.1.tar.gz", hash = "sha256:f238736bb06590ae52ac1fab06a3a9ef1d8dce2b7a35b5ab329371d6c8f5d2cc"}, +] + +[package.dependencies] +zipp = ">=0.5" + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +perf = ["ipython"] +testing = ["flufl.flake8", "importlib-resources (>=1.3)", "packaging", "pyfakefs", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf (>=0.9.2)", "pytest-ruff"] + +[[package]] +name = "importlib-resources" +version = "6.1.1" +description = "Read resources from Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "importlib_resources-6.1.1-py3-none-any.whl", hash = "sha256:e8bf90d8213b486f428c9c39714b920041cb02c184686a3dee24905aaa8105d6"}, + {file = "importlib_resources-6.1.1.tar.gz", hash = "sha256:3893a00122eafde6894c59914446a512f728a0c1a45f9bb9b63721b6bacf0b4a"}, +] + +[package.dependencies] +zipp = {version = ">=3.1.0", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-ruff", "zipp (>=3.17)"] + +[[package]] +name = "iniconfig" +version = "2.0.0" +description = "brain-dead simple config-ini parsing" +optional = false +python-versions = ">=3.7" +files = [ + {file = "iniconfig-2.0.0-py3-none-any.whl", hash = "sha256:b6a85871a79d2e3b22d2d1b94ac2824226a63c6b741c88f7ae975f18b6778374"}, + {file = "iniconfig-2.0.0.tar.gz", hash = "sha256:2d91e135bf72d31a410b17c16da610a82cb55f6b0477d1a902134b24a455b8b3"}, +] + +[[package]] +name = "ipykernel" +version = "6.29.0" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.0-py3-none-any.whl", hash = "sha256:076663ca68492576f051e4af7720d33f34383e655f2be0d544c8b1c9de915b2f"}, + {file = "ipykernel-6.29.0.tar.gz", hash = "sha256:b5dd3013cab7b330df712891c96cd1ab868c27a7159e606f762015e9bf8ceb3f"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "platform_system == \"Darwin\""} +comm = ">=0.1.1" +debugpy = ">=1.6.5" +ipython = ">=7.23.1" +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +matplotlib-inline = ">=0.1" +nest-asyncio = "*" +packaging = "*" +psutil = "*" +pyzmq = ">=24" +tornado = ">=6.1" +traitlets = ">=5.4.0" + +[package.extras] +cov = ["coverage[toml]", "curio", "matplotlib", "pytest-cov", "trio"] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +pyqt5 = ["pyqt5"] +pyside6 = ["pyside6"] +test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (==0.23.2)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.12.3" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipython-8.12.3-py3-none-any.whl", hash = "sha256:b0340d46a933d27c657b211a329d0be23793c36595acf9e6ef4164bc01a1804c"}, + {file = "ipython-8.12.3.tar.gz", hash = "sha256:3910c4b54543c2ad73d06579aa771041b7d5707b033bd488669b4cf544e3b363"}, +] + +[package.dependencies] +appnope = {version = "*", markers = "sys_platform == \"darwin\""} +backcall = "*" +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\""} +pickleshare = "*" +prompt-toolkit = ">=3.0.30,<3.0.37 || >3.0.37,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5" +typing-extensions = {version = "*", markers = "python_version < \"3.10\""} + +[package.extras] +all = ["black", "curio", "docrepr", "ipykernel", "ipyparallel", "ipywidgets", "matplotlib", "matplotlib (!=3.2.0)", "nbconvert", "nbformat", "notebook", "numpy (>=1.21)", "pandas", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "qtconsole", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "trio", "typing-extensions"] +black = ["black"] +doc = ["docrepr", "ipykernel", "matplotlib", "pytest (<7)", "pytest (<7.1)", "pytest-asyncio", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "stack-data", "testpath", "typing-extensions"] +kernel = ["ipykernel"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pytest (<7.1)", "pytest-asyncio", "testpath"] +test-extra = ["curio", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.21)", "pandas", "pytest (<7.1)", "pytest-asyncio", "testpath", "trio"] + +[[package]] +name = "isoduration" +version = "20.11.0" +description = "Operations with ISO 8601 durations" +optional = false +python-versions = ">=3.7" +files = [ + {file = "isoduration-20.11.0-py3-none-any.whl", hash = "sha256:b2904c2a4228c3d44f409c8ae8e2370eb21a26f7ac2ec5446df141dde3452042"}, + {file = "isoduration-20.11.0.tar.gz", hash = "sha256:ac2f9015137935279eac671f94f89eb00584f940f5dc49462a0c4ee692ba1bd9"}, +] + +[package.dependencies] +arrow = ">=0.15.0" + +[[package]] +name = "jedi" +version = "0.19.1" +description = "An autocompletion tool for Python that can be used for text editors." +optional = false +python-versions = ">=3.6" +files = [ + {file = "jedi-0.19.1-py2.py3-none-any.whl", hash = "sha256:e983c654fe5c02867aef4cdfce5a2fbb4a50adc0af145f70504238f18ef5e7e0"}, + {file = "jedi-0.19.1.tar.gz", hash = "sha256:cf0496f3651bc65d7174ac1b7d043eff454892c708a87d1b683e57b569927ffd"}, +] + +[package.dependencies] +parso = ">=0.8.3,<0.9.0" + +[package.extras] +docs = ["Jinja2 (==2.11.3)", "MarkupSafe (==1.1.1)", "Pygments (==2.8.1)", "alabaster (==0.7.12)", "babel (==2.9.1)", "chardet (==4.0.0)", "commonmark (==0.8.1)", "docutils (==0.17.1)", "future (==0.18.2)", "idna (==2.10)", "imagesize (==1.2.0)", "mock (==1.0.1)", "packaging (==20.9)", "pyparsing (==2.4.7)", "pytz (==2021.1)", "readthedocs-sphinx-ext (==2.1.4)", "recommonmark (==0.5.0)", "requests (==2.25.1)", "six (==1.15.0)", "snowballstemmer (==2.1.0)", "sphinx (==1.8.5)", "sphinx-rtd-theme (==0.4.3)", "sphinxcontrib-serializinghtml (==1.1.4)", "sphinxcontrib-websupport (==1.2.4)", "urllib3 (==1.26.4)"] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["Django", "attrs", "colorama", "docopt", "pytest (<7.0.0)"] + +[[package]] +name = "jinja2" +version = "3.1.3" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "Jinja2-3.1.3-py3-none-any.whl", hash = "sha256:7d6d50dd97d52cbc355597bd845fabfbac3f551e1f99619e39a35ce8c370b5fa"}, + {file = "Jinja2-3.1.3.tar.gz", hash = "sha256:ac8bd6544d4bb2c9792bf3a159e80bba8fda7f07e81bc3aed565432d5925ba90"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "json5" +version = "0.9.14" +description = "A Python implementation of the JSON5 data format." +optional = false +python-versions = "*" +files = [ + {file = "json5-0.9.14-py2.py3-none-any.whl", hash = "sha256:740c7f1b9e584a468dbb2939d8d458db3427f2c93ae2139d05f47e453eae964f"}, + {file = "json5-0.9.14.tar.gz", hash = "sha256:9ed66c3a6ca3510a976a9ef9b8c0787de24802724ab1860bc0153c7fdd589b02"}, +] + +[package.extras] +dev = ["hypothesis"] + +[[package]] +name = "jsonpointer" +version = "2.4" +description = "Identify specific nodes in a JSON document (RFC 6901)" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*, !=3.6.*" +files = [ + {file = "jsonpointer-2.4-py2.py3-none-any.whl", hash = "sha256:15d51bba20eea3165644553647711d150376234112651b4f1811022aecad7d7a"}, + {file = "jsonpointer-2.4.tar.gz", hash = "sha256:585cee82b70211fa9e6043b7bb89db6e1aa49524340dde8ad6b63206ea689d88"}, +] + +[[package]] +name = "jsonschema" +version = "4.21.0" +description = "An implementation of JSON Schema validation for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema-4.21.0-py3-none-any.whl", hash = "sha256:70a09719d375c0a2874571b363c8a24be7df8071b80c9aa76bc4551e7297c63c"}, + {file = "jsonschema-4.21.0.tar.gz", hash = "sha256:3ba18e27f7491ea4a1b22edce00fb820eec968d397feb3f9cb61d5894bb38167"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +fqdn = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +idna = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +isoduration = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +jsonpointer = {version = ">1.13", optional = true, markers = "extra == \"format-nongpl\""} +jsonschema-specifications = ">=2023.03.6" +pkgutil-resolve-name = {version = ">=1.3.10", markers = "python_version < \"3.9\""} +referencing = ">=0.28.4" +rfc3339-validator = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +rfc3986-validator = {version = ">0.1.0", optional = true, markers = "extra == \"format-nongpl\""} +rpds-py = ">=0.7.1" +uri-template = {version = "*", optional = true, markers = "extra == \"format-nongpl\""} +webcolors = {version = ">=1.11", optional = true, markers = "extra == \"format-nongpl\""} + +[package.extras] +format = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3987", "uri-template", "webcolors (>=1.11)"] +format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339-validator", "rfc3986-validator (>0.1.0)", "uri-template", "webcolors (>=1.11)"] + +[[package]] +name = "jsonschema-specifications" +version = "2023.12.1" +description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jsonschema_specifications-2023.12.1-py3-none-any.whl", hash = "sha256:87e4fdf3a94858b8a2ba2778d9ba57d8a9cafca7c7489c46ba0d30a8bc6a9c3c"}, + {file = "jsonschema_specifications-2023.12.1.tar.gz", hash = "sha256:48a76787b3e70f5ed53f1160d2b81f586e4ca6d1548c5de7085d1682674764cc"}, +] + +[package.dependencies] +importlib-resources = {version = ">=1.4.0", markers = "python_version < \"3.9\""} +referencing = ">=0.31.0" + +[[package]] +name = "jupyter-client" +version = "8.6.0" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.0-py3-none-any.whl", hash = "sha256:909c474dbe62582ae62b758bca86d6518c85234bdee2d908c778db6d72f39d99"}, + {file = "jupyter_client-8.6.0.tar.gz", hash = "sha256:0642244bb83b4764ae60d07e010e15f0e2d275ec4e918a8f7b80fbbef3ca60c7"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +python-dateutil = ">=2.8.2" +pyzmq = ">=23.0" +tornado = ">=6.2" +traitlets = ">=5.3" + +[package.extras] +docs = ["ipykernel", "myst-parser", "pydata-sphinx-theme", "sphinx (>=4)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["coverage", "ipykernel (>=6.14)", "mypy", "paramiko", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] + +[[package]] +name = "jupyter-core" +version = "5.7.1" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.1-py3-none-any.whl", hash = "sha256:c65c82126453a723a2804aa52409930434598fd9d35091d63dfb919d2b765bb7"}, + {file = "jupyter_core-5.7.1.tar.gz", hash = "sha256:de61a9d7fc71240f688b2fb5ab659fbb56979458dc66a71decd098e03c79e218"}, +] + +[package.dependencies] +platformdirs = ">=2.5" +pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} +traitlets = ">=5.3" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "traitlets"] +test = ["ipykernel", "pre-commit", "pytest", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "jupyter-events" +version = "0.9.0" +description = "Jupyter Event System library" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_events-0.9.0-py3-none-any.whl", hash = "sha256:d853b3c10273ff9bc8bb8b30076d65e2c9685579db736873de6c2232dde148bf"}, + {file = "jupyter_events-0.9.0.tar.gz", hash = "sha256:81ad2e4bc710881ec274d31c6c50669d71bbaa5dd9d01e600b56faa85700d399"}, +] + +[package.dependencies] +jsonschema = {version = ">=4.18.0", extras = ["format-nongpl"]} +python-json-logger = ">=2.0.4" +pyyaml = ">=5.3" +referencing = "*" +rfc3339-validator = "*" +rfc3986-validator = ">=0.1.1" +traitlets = ">=5.3" + +[package.extras] +cli = ["click", "rich"] +docs = ["jupyterlite-sphinx", "myst-parser", "pydata-sphinx-theme", "sphinxcontrib-spelling"] +test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "pytest-console-scripts", "rich"] + +[[package]] +name = "jupyter-lsp" +version = "2.2.1" +description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter-lsp-2.2.1.tar.gz", hash = "sha256:b17fab6d70fe83c8896b0cff59237640038247c196056b43684a0902b6a9e0fb"}, + {file = "jupyter_lsp-2.2.1-py3-none-any.whl", hash = "sha256:17a689910c5e4ae5e7d334b02f31d08ffbe98108f6f658fb05e4304b4345368b"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jupyter-server = ">=1.1.2" + +[[package]] +name = "jupyter-server" +version = "2.12.5" +description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server-2.12.5-py3-none-any.whl", hash = "sha256:184a0f82809a8522777cfb6b760ab6f4b1bb398664c5860a27cec696cb884923"}, + {file = "jupyter_server-2.12.5.tar.gz", hash = "sha256:0edb626c94baa22809be1323f9770cf1c00a952b17097592e40d03e6a3951689"}, +] + +[package.dependencies] +anyio = ">=3.1.0" +argon2-cffi = "*" +jinja2 = "*" +jupyter-client = ">=7.4.4" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-events = ">=0.9.0" +jupyter-server-terminals = "*" +nbconvert = ">=6.4.4" +nbformat = ">=5.3.0" +overrides = "*" +packaging = "*" +prometheus-client = "*" +pywinpty = {version = "*", markers = "os_name == \"nt\""} +pyzmq = ">=24" +send2trash = ">=1.8.2" +terminado = ">=0.8.3" +tornado = ">=6.2.0" +traitlets = ">=5.6.0" +websocket-client = "*" + +[package.extras] +docs = ["ipykernel", "jinja2", "jupyter-client", "jupyter-server", "myst-parser", "nbformat", "prometheus-client", "pydata-sphinx-theme", "send2trash", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-openapi (>=0.8.0)", "sphinxcontrib-spelling", "sphinxemoji", "tornado", "typing-extensions"] +test = ["flaky", "ipykernel", "pre-commit", "pytest (>=7.0)", "pytest-console-scripts", "pytest-jupyter[server] (>=0.4)", "pytest-timeout", "requests"] + +[[package]] +name = "jupyter-server-terminals" +version = "0.5.1" +description = "A Jupyter Server Extension Providing Terminals." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_server_terminals-0.5.1-py3-none-any.whl", hash = "sha256:5e63e947ddd97bb2832db5ef837a258d9ccd4192cd608c1270850ad947ae5dd7"}, + {file = "jupyter_server_terminals-0.5.1.tar.gz", hash = "sha256:16d3be9cf48be6a1f943f3a6c93c033be259cf4779184c66421709cf63dccfea"}, +] + +[package.dependencies] +pywinpty = {version = ">=2.0.3", markers = "os_name == \"nt\""} +terminado = ">=0.8.3" + +[package.extras] +docs = ["jinja2", "jupyter-server", "mistune (<4.0)", "myst-parser", "nbformat", "packaging", "pydata-sphinx-theme", "sphinxcontrib-github-alt", "sphinxcontrib-openapi", "sphinxcontrib-spelling", "sphinxemoji", "tornado"] +test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (>=0.5.3)", "pytest-timeout"] + +[[package]] +name = "jupyterlab" +version = "4.0.10" +description = "JupyterLab computational environment" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab-4.0.10-py3-none-any.whl", hash = "sha256:fe010ad9e37017488b468632ef2ead255fc7c671c5b64d9ca13e1f7b7e665c37"}, + {file = "jupyterlab-4.0.10.tar.gz", hash = "sha256:46177eb8ede70dc73be922ac99f8ef943bdc2dfbc6a31b353c4bde848a35dee1"}, +] + +[package.dependencies] +async-lru = ">=1.0.0" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +importlib-resources = {version = ">=1.4", markers = "python_version < \"3.9\""} +ipykernel = "*" +jinja2 = ">=3.0.3" +jupyter-core = "*" +jupyter-lsp = ">=2.0.0" +jupyter-server = ">=2.4.0,<3" +jupyterlab-server = ">=2.19.0,<3" +notebook-shim = ">=0.2" +packaging = "*" +tomli = {version = "*", markers = "python_version < \"3.11\""} +tornado = ">=6.2.0" +traitlets = "*" + +[package.extras] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.1.6)"] +docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-tornasync", "sphinx (>=1.8,<7.2.0)", "sphinx-copybutton"] +docs-screenshots = ["altair (==5.0.1)", "ipython (==8.14.0)", "ipywidgets (==8.0.6)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.0.post0)", "matplotlib (==3.7.1)", "nbconvert (>=7.0.0)", "pandas (==2.0.2)", "scipy (==1.10.1)", "vega-datasets (==0.9.0)"] +test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] + +[[package]] +name = "jupyterlab-pygments" +version = "0.3.0" +description = "Pygments theme using JupyterLab CSS variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780"}, + {file = "jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d"}, +] + +[[package]] +name = "jupyterlab-server" +version = "2.25.2" +description = "A set of server components for JupyterLab and JupyterLab like applications." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyterlab_server-2.25.2-py3-none-any.whl", hash = "sha256:5b1798c9cc6a44f65c757de9f97fc06fc3d42535afbf47d2ace5e964ab447aaf"}, + {file = "jupyterlab_server-2.25.2.tar.gz", hash = "sha256:bd0ec7a99ebcedc8bcff939ef86e52c378e44c2707e053fcd81d046ce979ee63"}, +] + +[package.dependencies] +babel = ">=2.10" +importlib-metadata = {version = ">=4.8.3", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0.3" +json5 = ">=0.9.0" +jsonschema = ">=4.18.0" +jupyter-server = ">=1.21,<3" +packaging = ">=21.3" +requests = ">=2.31" + +[package.extras] +docs = ["autodoc-traits", "jinja2 (<3.2.0)", "mistune (<4)", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-copybutton", "sphinxcontrib-openapi (>0.8)"] +openapi = ["openapi-core (>=0.18.0,<0.19.0)", "ruamel-yaml"] +test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-validator (>=0.6.0,<0.8.0)", "pytest (>=7.0)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter[server] (>=0.6.2)", "pytest-timeout", "requests-mock", "ruamel-yaml", "sphinxcontrib-spelling", "strict-rfc3339", "werkzeug"] + +[[package]] +name = "jupytext" +version = "1.16.1" +description = "Jupyter notebooks as Markdown documents, Julia, Python or R scripts" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupytext-1.16.1-py3-none-any.whl", hash = "sha256:796ec4f68ada663569e5d38d4ef03738a01284bfe21c943c485bc36433898bd0"}, + {file = "jupytext-1.16.1.tar.gz", hash = "sha256:68c7b68685e870e80e60fda8286fbd6269e9c74dc1df4316df6fe46eabc94c99"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0" +mdit-py-plugins = "*" +nbformat = "*" +packaging = "*" +pyyaml = "*" +toml = "*" + +[package.extras] +dev = ["jupytext[test-cov,test-external]"] +docs = ["myst-parser", "sphinx", "sphinx-copybutton", "sphinx-rtd-theme"] +test = ["pytest", "pytest-randomly", "pytest-xdist"] +test-cov = ["jupytext[test-integration]", "pytest-cov (>=2.6.1)"] +test-external = ["autopep8", "black", "flake8", "gitpython", "isort", "jupyter-fs (<0.4.0)", "jupytext[test-integration]", "pre-commit", "sphinx-gallery (<0.8)"] +test-functional = ["jupytext[test]"] +test-integration = ["ipykernel", "jupyter-server (!=2.11)", "jupytext[test-functional]", "nbconvert"] +test-ui = ["calysto-bash"] + +[[package]] +name = "makim" +version = "1.10.0" +description = "Simplify the usage of containers" +optional = false +python-versions = ">=3.8.1,<4" +files = [ + {file = "makim-1.10.0-py3-none-any.whl", hash = "sha256:28a7137b5916865297ab081d72f80ce2100cb079e2ac01e490a571ba2379798a"}, + {file = "makim-1.10.0.tar.gz", hash = "sha256:7c9e81893695cd452420e8ce182d78f6128028531a6b8fd3c74244c712c3ef59"}, +] + +[package.dependencies] +colorama = ">=0.4.6" +jinja2 = ">=2.0" +python-dotenv = ">=0.21.1" +pyyaml = ">=5.0" +sh = ">=2.0.0" +typer = ">=0.9.0" +xonsh = ">=0.14.0" + +[[package]] +name = "markdown" +version = "3.5.2" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.5.2-py3-none-any.whl", hash = "sha256:d43323865d89fc0cb9b20c75fc8ad313af307cc087e84b657d9eec768eddeadd"}, + {file = "Markdown-3.5.2.tar.gz", hash = "sha256:e1ac7b3dc550ee80e602e71c1d168002f062e49f1b11e26a36264dafd4df2ef8"}, +] + +[package.dependencies] +importlib-metadata = {version = ">=4.4", markers = "python_version < \"3.10\""} + +[package.extras] +docs = ["mdx-gh-links (>=0.2)", "mkdocs (>=1.5)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + +[[package]] +name = "markdown-it-py" +version = "3.0.0" +description = "Python port of markdown-it. Markdown parsing, done right!" +optional = false +python-versions = ">=3.8" +files = [ + {file = "markdown-it-py-3.0.0.tar.gz", hash = "sha256:e3f60a94fa066dc52ec76661e37c851cb232d92f9886b15cb560aaada2df8feb"}, + {file = "markdown_it_py-3.0.0-py3-none-any.whl", hash = "sha256:355216845c60bd96232cd8d8c40e8f9765cc86f46880e43a8fd22dc1a1a8cab1"}, +] + +[package.dependencies] +mdurl = ">=0.1,<1.0" + +[package.extras] +benchmarking = ["psutil", "pytest", "pytest-benchmark"] +code-style = ["pre-commit (>=3.0,<4.0)"] +compare = ["commonmark (>=0.9,<1.0)", "markdown (>=3.4,<4.0)", "mistletoe (>=1.0,<2.0)", "mistune (>=2.0,<3.0)", "panflute (>=2.3,<3.0)"] +linkify = ["linkify-it-py (>=1,<3)"] +plugins = ["mdit-py-plugins"] +profiling = ["gprof2dot"] +rtd = ["jupyter_sphinx", "mdit-py-plugins", "myst-parser", "pyyaml", "sphinx", "sphinx-copybutton", "sphinx-design", "sphinx_book_theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "markupsafe" +version = "2.1.3" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd0f502fe016460680cd20aaa5a76d241d6f35a1c3350c474bac1273803893fa"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e09031c87a1e51556fdcb46e5bd4f59dfb743061cf93c4d6831bf894f125eb57"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68e78619a61ecf91e76aa3e6e8e33fc4894a2bebe93410754bd28fce0a8a4f9f"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:65c1a9bcdadc6c28eecee2c119465aebff8f7a584dd719facdd9e825ec61ab52"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:525808b8019e36eb524b8c68acdd63a37e75714eac50e988180b169d64480a00"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:962f82a3086483f5e5f64dbad880d31038b698494799b097bc59c2edf392fce6"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:aa7bd130efab1c280bed0f45501b7c8795f9fdbeb02e965371bbef3523627779"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c9c804664ebe8f83a211cace637506669e7890fec1b4195b505c214e50dd4eb7"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win32.whl", hash = "sha256:10bbfe99883db80bdbaff2dcf681dfc6533a614f700da1287707e8a5d78a8431"}, + {file = "MarkupSafe-2.1.3-cp310-cp310-win_amd64.whl", hash = "sha256:1577735524cdad32f9f694208aa75e422adba74f1baee7551620e43a3141f559"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ad9e82fb8f09ade1c3e1b996a6337afac2b8b9e365f926f5a61aacc71adc5b3c"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c0fae6c3be832a0a0473ac912810b2877c8cb9d76ca48de1ed31e1c68386575"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b076b6226fb84157e3f7c971a47ff3a679d837cf338547532ab866c57930dbee"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bfce63a9e7834b12b87c64d6b155fdd9b3b96191b6bd334bf37db7ff1fe457f2"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:338ae27d6b8745585f87218a3f23f1512dbf52c26c28e322dbe54bcede54ccb9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e4dd52d80b8c83fdce44e12478ad2e85c64ea965e75d66dbeafb0a3e77308fcc"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:df0be2b576a7abbf737b1575f048c23fb1d769f267ec4358296f31c2479db8f9"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5bbe06f8eeafd38e5d0a4894ffec89378b6c6a625ff57e3028921f8ff59318ac"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win32.whl", hash = "sha256:dd15ff04ffd7e05ffcb7fe79f1b98041b8ea30ae9234aed2a9168b5797c3effb"}, + {file = "MarkupSafe-2.1.3-cp311-cp311-win_amd64.whl", hash = "sha256:134da1eca9ec0ae528110ccc9e48041e0828d79f24121a1a146161103c76e686"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:8e254ae696c88d98da6555f5ace2279cf7cd5b3f52be2b5cf97feafe883b58d2"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cb0932dc158471523c9637e807d9bfb93e06a95cbf010f1a38b98623b929ef2b"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9402b03f1a1b4dc4c19845e5c749e3ab82d5078d16a2a4c2cd2df62d57bb0707"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ca379055a47383d02a5400cb0d110cef0a776fc644cda797db0c5696cfd7e18e"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:b7ff0f54cb4ff66dd38bebd335a38e2c22c41a8ee45aa608efc890ac3e3931bc"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:c011a4149cfbcf9f03994ec2edffcb8b1dc2d2aede7ca243746df97a5d41ce48"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:56d9f2ecac662ca1611d183feb03a3fa4406469dafe241673d521dd5ae92a155"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win32.whl", hash = "sha256:8758846a7e80910096950b67071243da3e5a20ed2546e6392603c096778d48e0"}, + {file = "MarkupSafe-2.1.3-cp37-cp37m-win_amd64.whl", hash = "sha256:787003c0ddb00500e49a10f2844fac87aa6ce977b90b0feaaf9de23c22508b24"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:2ef12179d3a291be237280175b542c07a36e7f60718296278d8593d21ca937d4"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:2c1b19b3aaacc6e57b7e25710ff571c24d6c3613a45e905b1fde04d691b98ee0"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8afafd99945ead6e075b973fefa56379c5b5c53fd8937dad92c662da5d8fd5ee"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8c41976a29d078bb235fea9b2ecd3da465df42a562910f9022f1a03107bd02be"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d080e0a5eb2529460b30190fcfcc4199bd7f827663f858a226a81bc27beaa97e"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:69c0f17e9f5a7afdf2cc9fb2d1ce6aabdb3bafb7f38017c0b77862bcec2bbad8"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:504b320cd4b7eff6f968eddf81127112db685e81f7e36e75f9f84f0df46041c3"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42de32b22b6b804f42c5d98be4f7e5e977ecdd9ee9b660fda1a3edf03b11792d"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win32.whl", hash = "sha256:ceb01949af7121f9fc39f7d27f91be8546f3fb112c608bc4029aef0bab86a2a5"}, + {file = "MarkupSafe-2.1.3-cp38-cp38-win_amd64.whl", hash = "sha256:1b40069d487e7edb2676d3fbdb2b0829ffa2cd63a2ec26c4938b2d34391b4ecc"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8023faf4e01efadfa183e863fefde0046de576c6f14659e8782065bcece22198"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6b2b56950d93e41f33b4223ead100ea0fe11f8e6ee5f641eb753ce4b77a7042b"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9dcdfd0eaf283af041973bff14a2e143b8bd64e069f4c383416ecd79a81aab58"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:05fb21170423db021895e1ea1e1f3ab3adb85d1c2333cbc2310f2a26bc77272e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:282c2cb35b5b673bbcadb33a585408104df04f14b2d9b01d4c345a3b92861c2c"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:ab4a0df41e7c16a1392727727e7998a467472d0ad65f3ad5e6e765015df08636"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7ef3cb2ebbf91e330e3bb937efada0edd9003683db6b57bb108c4001f37a02ea"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:0a4e4a1aff6c7ac4cd55792abf96c915634c2b97e3cc1c7129578aa68ebd754e"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win32.whl", hash = "sha256:fec21693218efe39aa7f8599346e90c705afa52c5b31ae019b2e57e8f6542bb2"}, + {file = "MarkupSafe-2.1.3-cp39-cp39-win_amd64.whl", hash = "sha256:3fd4abcb888d15a94f32b75d8fd18ee162ca0c064f35b11134be77050296d6ba"}, + {file = "MarkupSafe-2.1.3.tar.gz", hash = "sha256:af598ed32d6ae86f1b747b82783958b1a4ab8f617b06fe68795c7f026abbdcad"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.6" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.5" +files = [ + {file = "matplotlib-inline-0.1.6.tar.gz", hash = "sha256:f887e5f10ba98e8d2b150ddcf4702c1e5f8b3a20005eb0f74bfdbd360ee6f304"}, + {file = "matplotlib_inline-0.1.6-py3-none-any.whl", hash = "sha256:f1f41aab5328aa5aaea9b16d083b128102f8712542f819fe7e6a420ff581b311"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mccabe" +version = "0.7.0" +description = "McCabe checker, plugin for flake8" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mccabe-0.7.0-py2.py3-none-any.whl", hash = "sha256:6c2d30ab6be0e4a46919781807b4f0d834ebdd6c6e3dca0bda5a15f863427b6e"}, + {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, +] + +[[package]] +name = "mdit-py-plugins" +version = "0.4.0" +description = "Collection of plugins for markdown-it-py" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mdit_py_plugins-0.4.0-py3-none-any.whl", hash = "sha256:b51b3bb70691f57f974e257e367107857a93b36f322a9e6d44ca5bf28ec2def9"}, + {file = "mdit_py_plugins-0.4.0.tar.gz", hash = "sha256:d8ab27e9aed6c38aa716819fedfde15ca275715955f8a185a8e1cf90fb1d2c1b"}, +] + +[package.dependencies] +markdown-it-py = ">=1.0.0,<4.0.0" + +[package.extras] +code-style = ["pre-commit"] +rtd = ["myst-parser", "sphinx-book-theme"] +testing = ["coverage", "pytest", "pytest-cov", "pytest-regressions"] + +[[package]] +name = "mdurl" +version = "0.1.2" +description = "Markdown URL utilities" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8"}, + {file = "mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba"}, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + +[[package]] +name = "mistune" +version = "3.0.2" +description = "A sane and fast Markdown parser with useful plugins and renderers" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mistune-3.0.2-py3-none-any.whl", hash = "sha256:71481854c30fdbc938963d3605b72501f5c10a9320ecd412c121c163a1c7d205"}, + {file = "mistune-3.0.2.tar.gz", hash = "sha256:fc7f93ded930c92394ef2cb6f04a8aabab4117a91449e72dcc8dfa646a508be8"}, +] + +[[package]] +name = "mkdocs" +version = "1.5.3" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs-1.5.3-py3-none-any.whl", hash = "sha256:3b3a78e736b31158d64dbb2f8ba29bd46a379d0c6e324c2246c3bc3d2189cfc1"}, + {file = "mkdocs-1.5.3.tar.gz", hash = "sha256:eb7c99214dcb945313ba30426c2451b735992c73c2e10838f76d09e39ff4d0e2"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +importlib-metadata = {version = ">=4.3", markers = "python_version < \"3.10\""} +jinja2 = ">=2.11.1" +markdown = ">=3.2.1" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +packaging = ">=20.5" +pathspec = ">=0.11.1" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" +pyyaml-env-tag = ">=0.1" +watchdog = ">=2.0" + +[package.extras] +i18n = ["babel (>=2.9.0)"] +min-versions = ["babel (==2.9.0)", "click (==7.0)", "colorama (==0.4)", "ghp-import (==1.0)", "importlib-metadata (==4.3)", "jinja2 (==2.11.1)", "markdown (==3.2.1)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "packaging (==20.5)", "pathspec (==0.11.1)", "platformdirs (==2.2.0)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "typing-extensions (==3.10)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-autorefs" +version = "0.5.0" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_autorefs-0.5.0-py3-none-any.whl", hash = "sha256:7930fcb8ac1249f10e683967aeaddc0af49d90702af111a5e390e8b20b3d97ff"}, + {file = "mkdocs_autorefs-0.5.0.tar.gz", hash = "sha256:9a5054a94c08d28855cfab967ada10ed5be76e2bfad642302a610b252c3274c0"}, +] + +[package.dependencies] +Markdown = ">=3.3" +mkdocs = ">=1.1" + +[[package]] +name = "mkdocs-exclude" +version = "1.0.2" +description = "A mkdocs plugin that lets you exclude files or trees." +optional = false +python-versions = "*" +files = [ + {file = "mkdocs-exclude-1.0.2.tar.gz", hash = "sha256:ba6fab3c80ddbe3fd31d3e579861fd3124513708271180a5f81846da8c7e2a51"}, +] + +[package.dependencies] +mkdocs = "*" + +[[package]] +name = "mkdocs-jupyter" +version = "0.24.3" +description = "Use Jupyter in mkdocs websites" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_jupyter-0.24.3-py3-none-any.whl", hash = "sha256:904262a8678a5e5920b7c3c03b5010b36301a69d0a38f2fcbf430493adf6879e"}, + {file = "mkdocs_jupyter-0.24.3.tar.gz", hash = "sha256:3d81da9aea27480e93bab22438910c4f0b9630613e74f85b576590d78e0e8b14"}, +] + +[package.dependencies] +ipykernel = ">6.0.0,<7.0.0" +jupytext = ">1.13.8,<2" +mkdocs = ">=1.4.0,<2" +mkdocs-material = ">9.0.0" +nbconvert = ">=7.2.9,<8" +pygments = ">2.12.0" + +[package.extras] +test = ["coverage[toml]", "pymdown-extensions", "pytest", "pytest-cov"] + +[[package]] +name = "mkdocs-literate-nav" +version = "0.6.1" +description = "MkDocs plugin to specify the navigation in Markdown instead of YAML" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_literate_nav-0.6.1-py3-none-any.whl", hash = "sha256:e70bdc4a07050d32da79c0b697bd88e9a104cf3294282e9cb20eec94c6b0f401"}, + {file = "mkdocs_literate_nav-0.6.1.tar.gz", hash = "sha256:78a7ab6d878371728acb0cdc6235c9b0ffc6e83c997b037f4a5c6ff7cef7d759"}, +] + +[package.dependencies] +mkdocs = ">=1.0.3" + +[[package]] +name = "mkdocs-macros-plugin" +version = "0.7.0" +description = "Unleash the power of MkDocs with macros and variables" +optional = false +python-versions = ">=3.5" +files = [ + {file = "mkdocs-macros-plugin-0.7.0.tar.gz", hash = "sha256:9e64e1cabcf6925359de29fe54f62d5847fb455c2528c440b87f8f1240650608"}, + {file = "mkdocs_macros_plugin-0.7.0-py3-none-any.whl", hash = "sha256:96bdabeb98b96139544f0048ea2f5cb80c7befde6b21e94c6d4596c22774cbcf"}, +] + +[package.dependencies] +jinja2 = "*" +mkdocs = ">=0.17" +python-dateutil = "*" +pyyaml = "*" +termcolor = "*" + +[package.extras] +test = ["mkdocs-include-markdown-plugin", "mkdocs-macros-test", "mkdocs-material (>=6.2)"] + +[[package]] +name = "mkdocs-material" +version = "9.5.4" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.4-py3-none-any.whl", hash = "sha256:efd7cc8ae03296d728da9bd38f4db8b07ab61f9738a0cbd0dfaf2a15a50e7343"}, + {file = "mkdocs_material-9.5.4.tar.gz", hash = "sha256:3d196ee67fad16b2df1a458d650a8ac1890294eaae368d26cee71bc24ad41c40"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.5.3,<1.6.0" +mkdocs-material-extensions = ">=1.3,<2.0" +paginate = ">=0.5,<1.0" +pygments = ">=2.16,<3.0" +pymdown-extensions = ">=10.2,<11.0" +regex = ">=2022.4" +requests = ">=2.26,<3.0" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<2.0)", "mkdocs-git-revision-date-localized-plugin (>=1.2,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=9.4,<10.0)"] +recommended = ["mkdocs-minify-plugin (>=0.7,<1.0)", "mkdocs-redirects (>=1.2,<2.0)", "mkdocs-rss-plugin (>=1.6,<2.0)"] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +description = "Extension pack for Python Markdown and MkDocs Material." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocstrings" +version = "0.24.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings-0.24.0-py3-none-any.whl", hash = "sha256:f4908560c10f587326d8f5165d1908817b2e280bbf707607f601c996366a2264"}, + {file = "mkdocstrings-0.24.0.tar.gz", hash = "sha256:222b1165be41257b494a9d29b14135d2b7ca43f38161d5b10caae03b87bd4f7e"}, +] + +[package.dependencies] +click = ">=7.0" +importlib-metadata = {version = ">=4.6", markers = "python_version < \"3.10\""} +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=0.3.1" +platformdirs = ">=2.2.0" +pymdown-extensions = ">=6.3" +typing-extensions = {version = ">=4.1", markers = "python_version < \"3.10\""} + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.8.0" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocstrings_python-1.8.0-py3-none-any.whl", hash = "sha256:4209970cc90bec194568682a535848a8d8489516c6ed4adbe58bbc67b699ca9d"}, + {file = "mkdocstrings_python-1.8.0.tar.gz", hash = "sha256:1488bddf50ee42c07d9a488dddc197f8e8999c2899687043ec5dd1643d057192"}, +] + +[package.dependencies] +griffe = ">=0.37" +mkdocstrings = ">=0.20" + +[[package]] +name = "mypy" +version = "1.8.0" +description = "Optional static typing for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mypy-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:485a8942f671120f76afffff70f259e1cd0f0cfe08f81c05d8816d958d4577d3"}, + {file = "mypy-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:df9824ac11deaf007443e7ed2a4a26bebff98d2bc43c6da21b2b64185da011c4"}, + {file = "mypy-1.8.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2afecd6354bbfb6e0160f4e4ad9ba6e4e003b767dd80d85516e71f2e955ab50d"}, + {file = "mypy-1.8.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:8963b83d53ee733a6e4196954502b33567ad07dfd74851f32be18eb932fb1cb9"}, + {file = "mypy-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:e46f44b54ebddbeedbd3d5b289a893219065ef805d95094d16a0af6630f5d410"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:855fe27b80375e5c5878492f0729540db47b186509c98dae341254c8f45f42ae"}, + {file = "mypy-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4c886c6cce2d070bd7df4ec4a05a13ee20c0aa60cb587e8d1265b6c03cf91da3"}, + {file = "mypy-1.8.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d19c413b3c07cbecf1f991e2221746b0d2a9410b59cb3f4fb9557f0365a1a817"}, + {file = "mypy-1.8.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9261ed810972061388918c83c3f5cd46079d875026ba97380f3e3978a72f503d"}, + {file = "mypy-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:51720c776d148bad2372ca21ca29256ed483aa9a4cdefefcef49006dff2a6835"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:52825b01f5c4c1c4eb0db253ec09c7aa17e1a7304d247c48b6f3599ef40db8bd"}, + {file = "mypy-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f5ac9a4eeb1ec0f1ccdc6f326bcdb464de5f80eb07fb38b5ddd7b0de6bc61e55"}, + {file = "mypy-1.8.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afe3fe972c645b4632c563d3f3eff1cdca2fa058f730df2b93a35e3b0c538218"}, + {file = "mypy-1.8.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:42c6680d256ab35637ef88891c6bd02514ccb7e1122133ac96055ff458f93fc3"}, + {file = "mypy-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:720a5ca70e136b675af3af63db533c1c8c9181314d207568bbe79051f122669e"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:028cf9f2cae89e202d7b6593cd98db6759379f17a319b5faf4f9978d7084cdc6"}, + {file = "mypy-1.8.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4e6d97288757e1ddba10dd9549ac27982e3e74a49d8d0179fc14d4365c7add66"}, + {file = "mypy-1.8.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f1478736fcebb90f97e40aff11a5f253af890c845ee0c850fe80aa060a267c6"}, + {file = "mypy-1.8.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:42419861b43e6962a649068a61f4a4839205a3ef525b858377a960b9e2de6e0d"}, + {file = "mypy-1.8.0-cp38-cp38-win_amd64.whl", hash = "sha256:2b5b6c721bd4aabaadead3a5e6fa85c11c6c795e0c81a7215776ef8afc66de02"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:5c1538c38584029352878a0466f03a8ee7547d7bd9f641f57a0f3017a7c905b8"}, + {file = "mypy-1.8.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:4ef4be7baf08a203170f29e89d79064463b7fc7a0908b9d0d5114e8009c3a259"}, + {file = "mypy-1.8.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7178def594014aa6c35a8ff411cf37d682f428b3b5617ca79029d8ae72f5402b"}, + {file = "mypy-1.8.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ab3c84fa13c04aeeeabb2a7f67a25ef5d77ac9d6486ff33ded762ef353aa5592"}, + {file = "mypy-1.8.0-cp39-cp39-win_amd64.whl", hash = "sha256:99b00bc72855812a60d253420d8a2eae839b0afa4938f09f4d2aa9bb4654263a"}, + {file = "mypy-1.8.0-py3-none-any.whl", hash = "sha256:538fd81bb5e430cc1381a443971c0475582ff9f434c16cd46d2c66763ce85d9d"}, + {file = "mypy-1.8.0.tar.gz", hash = "sha256:6ff8b244d7085a0b425b56d327b480c3b29cafbd2eff27316a004f9a7391ae07"}, +] + +[package.dependencies] +mypy-extensions = ">=1.0.0" +tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} +typing-extensions = ">=4.1.0" + +[package.extras] +dmypy = ["psutil (>=4.0)"] +install-types = ["pip"] +mypyc = ["setuptools (>=50)"] +reports = ["lxml"] + +[[package]] +name = "mypy-extensions" +version = "1.0.0" +description = "Type system extensions for programs checked with the mypy type checker." +optional = false +python-versions = ">=3.5" +files = [ + {file = "mypy_extensions-1.0.0-py3-none-any.whl", hash = "sha256:4392f6c0eb8a5668a69e23d168ffa70f0be9ccfd32b5cc2d26a34ae5b844552d"}, + {file = "mypy_extensions-1.0.0.tar.gz", hash = "sha256:75dbf8955dc00442a438fc4d0666508a9a97b6bd41aa2f0ffe9d2f2725af0782"}, +] + +[[package]] +name = "nbclient" +version = "0.9.0" +description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." +optional = false +python-versions = ">=3.8.0" +files = [ + {file = "nbclient-0.9.0-py3-none-any.whl", hash = "sha256:a3a1ddfb34d4a9d17fc744d655962714a866639acd30130e9be84191cd97cd15"}, + {file = "nbclient-0.9.0.tar.gz", hash = "sha256:4b28c207877cf33ef3a9838cdc7a54c5ceff981194a82eac59d558f05487295e"}, +] + +[package.dependencies] +jupyter-client = ">=6.1.12" +jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +nbformat = ">=5.1" +traitlets = ">=5.4" + +[package.extras] +dev = ["pre-commit"] +docs = ["autodoc-traits", "mock", "moto", "myst-parser", "nbclient[test]", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.0.0)", "pytest (>=7.0)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] + +[[package]] +name = "nbconvert" +version = "7.14.2" +description = "Converting Jupyter Notebooks" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbconvert-7.14.2-py3-none-any.whl", hash = "sha256:db28590cef90f7faf2ebbc71acd402cbecf13d29176df728c0a9025a49345ea1"}, + {file = "nbconvert-7.14.2.tar.gz", hash = "sha256:a7f8808fd4e082431673ac538400218dd45efd076fbeb07cc6e5aa5a3a4e949e"}, +] + +[package.dependencies] +beautifulsoup4 = "*" +bleach = "!=5.0.0" +defusedxml = "*" +importlib-metadata = {version = ">=3.6", markers = "python_version < \"3.10\""} +jinja2 = ">=3.0" +jupyter-core = ">=4.7" +jupyterlab-pygments = "*" +markupsafe = ">=2.0" +mistune = ">=2.0.3,<4" +nbclient = ">=0.5.0" +nbformat = ">=5.7" +packaging = "*" +pandocfilters = ">=1.4.1" +pygments = ">=2.4.1" +tinycss2 = "*" +traitlets = ">=5.1" + +[package.extras] +all = ["nbconvert[docs,qtpdf,serve,test,webpdf]"] +docs = ["ipykernel", "ipython", "myst-parser", "nbsphinx (>=0.2.12)", "pydata-sphinx-theme", "sphinx (==5.0.2)", "sphinxcontrib-spelling"] +qtpdf = ["nbconvert[qtpng]"] +qtpng = ["pyqtwebengine (>=5.15)"] +serve = ["tornado (>=6.1)"] +test = ["flaky", "ipykernel", "ipywidgets (>=7.5)", "pytest"] +webpdf = ["playwright"] + +[[package]] +name = "nbformat" +version = "5.9.2" +description = "The Jupyter Notebook format" +optional = false +python-versions = ">=3.8" +files = [ + {file = "nbformat-5.9.2-py3-none-any.whl", hash = "sha256:1c5172d786a41b82bcfd0c23f9e6b6f072e8fb49c39250219e4acfff1efe89e9"}, + {file = "nbformat-5.9.2.tar.gz", hash = "sha256:5f98b5ba1997dff175e77e0c17d5c10a96eaed2cbd1de3533d1fc35d5e111192"}, +] + +[package.dependencies] +fastjsonschema = "*" +jsonschema = ">=2.6" +jupyter-core = "*" +traitlets = ">=5.1" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx", "sphinxcontrib-github-alt", "sphinxcontrib-spelling"] +test = ["pep440", "pre-commit", "pytest", "testpath"] + +[[package]] +name = "nest-asyncio" +version = "1.5.9" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.5.9-py3-none-any.whl", hash = "sha256:61ec07ef052e72e3de22045b81b2cc7d71fceb04c568ba0b2e4b2f9f5231bec2"}, + {file = "nest_asyncio-1.5.9.tar.gz", hash = "sha256:d1e1144e9c6e3e6392e0fcf5211cb1c8374b5648a98f1ebe48e5336006b41907"}, +] + +[[package]] +name = "nodeenv" +version = "1.8.0" +description = "Node.js virtual environment builder" +optional = false +python-versions = ">=2.7,!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*" +files = [ + {file = "nodeenv-1.8.0-py2.py3-none-any.whl", hash = "sha256:df865724bb3c3adc86b3876fa209771517b0cfe596beff01a92700e0e8be4cec"}, + {file = "nodeenv-1.8.0.tar.gz", hash = "sha256:d51e0c37e64fbf47d017feac3145cdbb58836d7eee8c6f6d3b6880c5456227d2"}, +] + +[package.dependencies] +setuptools = "*" + +[[package]] +name = "notebook-shim" +version = "0.2.3" +description = "A shim layer for notebook traits and config" +optional = false +python-versions = ">=3.7" +files = [ + {file = "notebook_shim-0.2.3-py3-none-any.whl", hash = "sha256:a83496a43341c1674b093bfcebf0fe8e74cbe7eda5fd2bbc56f8e39e1486c0c7"}, + {file = "notebook_shim-0.2.3.tar.gz", hash = "sha256:f69388ac283ae008cd506dda10d0288b09a017d822d5e8c7129a152cbd3ce7e9"}, +] + +[package.dependencies] +jupyter-server = ">=1.8,<3" + +[package.extras] +test = ["pytest", "pytest-console-scripts", "pytest-jupyter", "pytest-tornasync"] + +[[package]] +name = "overrides" +version = "7.4.0" +description = "A decorator to automatically detect mismatch when overriding a method." +optional = false +python-versions = ">=3.6" +files = [ + {file = "overrides-7.4.0-py3-none-any.whl", hash = "sha256:3ad24583f86d6d7a49049695efe9933e67ba62f0c7625d53c59fa832ce4b8b7d"}, + {file = "overrides-7.4.0.tar.gz", hash = "sha256:9502a3cca51f4fac40b5feca985b6703a5c1f6ad815588a7ca9e285b9dca6757"}, +] + +[[package]] +name = "packaging" +version = "23.2" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-23.2-py3-none-any.whl", hash = "sha256:8c491190033a9af7e1d931d0b5dacc2ef47509b34dd0de67ed209b5203fc88c7"}, + {file = "packaging-23.2.tar.gz", hash = "sha256:048fb0e9405036518eaaf48a55953c750c11e1a1b68e0dd1a9d62ed0c092cfc5"}, +] + +[[package]] +name = "paginate" +version = "0.5.6" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +files = [ + {file = "paginate-0.5.6.tar.gz", hash = "sha256:5e6007b6a9398177a7e1648d04fdd9f8c9766a1a945bceac82f1929e8c78af2d"}, +] + +[[package]] +name = "pandocfilters" +version = "1.5.0" +description = "Utilities for writing pandoc filters in python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pandocfilters-1.5.0-py2.py3-none-any.whl", hash = "sha256:33aae3f25fd1a026079f5d27bdd52496f0e0803b3469282162bafdcbdf6ef14f"}, + {file = "pandocfilters-1.5.0.tar.gz", hash = "sha256:0b679503337d233b4339a817bfc8c50064e2eff681314376a47cb582305a7a38"}, +] + +[[package]] +name = "parso" +version = "0.8.3" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.3-py2.py3-none-any.whl", hash = "sha256:c001d4636cd3aecdaf33cbb40aebb59b094be2a74c556778ef5576c175e19e75"}, + {file = "parso-0.8.3.tar.gz", hash = "sha256:8c07be290bb59f03588915921e29e8a50002acaf2cdc5fa0e0114f91709fafa0"}, +] + +[package.extras] +qa = ["flake8 (==3.8.3)", "mypy (==0.782)"] +testing = ["docopt", "pytest (<6.0.0)"] + +[[package]] +name = "pathspec" +version = "0.12.1" +description = "Utility library for gitignore style pattern matching of file paths." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, + {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, +] + +[[package]] +name = "pbr" +version = "6.0.0" +description = "Python Build Reasonableness" +optional = false +python-versions = ">=2.6" +files = [ + {file = "pbr-6.0.0-py2.py3-none-any.whl", hash = "sha256:4a7317d5e3b17a3dccb6a8cfe67dab65b20551404c52c8ed41279fa4f0cb4cda"}, + {file = "pbr-6.0.0.tar.gz", hash = "sha256:d1377122a5a00e2f940ee482999518efe16d745d423a670c27773dfbc3c9a7d9"}, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +description = "Pexpect allows easy control of interactive console applications." +optional = false +python-versions = "*" +files = [ + {file = "pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523"}, + {file = "pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f"}, +] + +[package.dependencies] +ptyprocess = ">=0.5" + +[[package]] +name = "pickleshare" +version = "0.7.5" +description = "Tiny 'shelve'-like database with concurrency support" +optional = false +python-versions = "*" +files = [ + {file = "pickleshare-0.7.5-py2.py3-none-any.whl", hash = "sha256:9649af414d74d4df115d5d718f82acb59c9d418196b7b4290ed47a12ce62df56"}, + {file = "pickleshare-0.7.5.tar.gz", hash = "sha256:87683d47965c1da65cdacaf31c8441d12b8044cdec9aca500cd78fc2c683afca"}, +] + +[[package]] +name = "pkgutil-resolve-name" +version = "1.3.10" +description = "Resolve a name to an object." +optional = false +python-versions = ">=3.6" +files = [ + {file = "pkgutil_resolve_name-1.3.10-py3-none-any.whl", hash = "sha256:ca27cc078d25c5ad71a9de0a7a330146c4e014c2462d9af19c6b828280649c5e"}, + {file = "pkgutil_resolve_name-1.3.10.tar.gz", hash = "sha256:357d6c9e6a755653cfd78893817c0853af365dd51ec97f3d358a819373bbd174"}, +] + +[[package]] +name = "platformdirs" +version = "4.1.0" +description = "A small Python package for determining appropriate platform-specific dirs, e.g. a \"user data dir\"." +optional = false +python-versions = ">=3.8" +files = [ + {file = "platformdirs-4.1.0-py3-none-any.whl", hash = "sha256:11c8f37bcca40db96d8144522d925583bdb7a31f7b0e37e3ed4318400a8e2380"}, + {file = "platformdirs-4.1.0.tar.gz", hash = "sha256:906d548203468492d432bcb294d4bc2fff751bf84971fbb2c10918cc206ee420"}, +] + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.1)", "sphinx-autodoc-typehints (>=1.24)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4)", "pytest-cov (>=4.1)", "pytest-mock (>=3.11.1)"] + +[[package]] +name = "pluggy" +version = "1.3.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.3.0-py3-none-any.whl", hash = "sha256:d89c696a773f8bd377d18e5ecda92b7a3793cbe66c87060a6fb58c7b6e1061f7"}, + {file = "pluggy-1.3.0.tar.gz", hash = "sha256:cf61ae8f126ac6f7c451172cf30e3e43d3ca77615509771b3a984a0730651e12"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[package]] +name = "pre-commit" +version = "3.5.0" +description = "A framework for managing and maintaining multi-language pre-commit hooks." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pre_commit-3.5.0-py2.py3-none-any.whl", hash = "sha256:841dc9aef25daba9a0238cd27984041fa0467b4199fc4852e27950664919f660"}, + {file = "pre_commit-3.5.0.tar.gz", hash = "sha256:5804465c675b659b0862f07907f96295d490822a450c4c40e747d0b1c6ebcb32"}, +] + +[package.dependencies] +cfgv = ">=2.0.0" +identify = ">=1.0.0" +nodeenv = ">=0.11.1" +pyyaml = ">=5.1" +virtualenv = ">=20.10.0" + +[[package]] +name = "prometheus-client" +version = "0.19.0" +description = "Python client for the Prometheus monitoring system." +optional = false +python-versions = ">=3.8" +files = [ + {file = "prometheus_client-0.19.0-py3-none-any.whl", hash = "sha256:c88b1e6ecf6b41cd8fb5731c7ae919bf66df6ec6fafa555cd6c0e16ca169ae92"}, + {file = "prometheus_client-0.19.0.tar.gz", hash = "sha256:4585b0d1223148c27a225b10dbec5ae9bc4c81a99a3fa80774fa6209935324e1"}, +] + +[package.extras] +twisted = ["twisted"] + +[[package]] +name = "prompt-toolkit" +version = "3.0.43" +description = "Library for building powerful interactive command lines in Python" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "prompt_toolkit-3.0.43-py3-none-any.whl", hash = "sha256:a11a29cb3bf0a28a387fe5122cdb649816a957cd9261dcedf8c9f1fef33eacf6"}, + {file = "prompt_toolkit-3.0.43.tar.gz", hash = "sha256:3527b7af26106cbc65a040bcc84839a3566ec1b051bb0bfe953631e704b0ff7d"}, +] + +[package.dependencies] +wcwidth = "*" + +[[package]] +name = "psutil" +version = "5.9.7" +description = "Cross-platform lib for process and system monitoring in Python." +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*, !=3.5.*" +files = [ + {file = "psutil-5.9.7-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:0bd41bf2d1463dfa535942b2a8f0e958acf6607ac0be52265ab31f7923bcd5e6"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:5794944462509e49d4d458f4dbfb92c47539e7d8d15c796f141f474010084056"}, + {file = "psutil-5.9.7-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:fe361f743cb3389b8efda21980d93eb55c1f1e3898269bc9a2a1d0bb7b1f6508"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:e469990e28f1ad738f65a42dcfc17adaed9d0f325d55047593cb9033a0ab63df"}, + {file = "psutil-5.9.7-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:3c4747a3e2ead1589e647e64aad601981f01b68f9398ddf94d01e3dc0d1e57c7"}, + {file = "psutil-5.9.7-cp27-none-win32.whl", hash = "sha256:1d4bc4a0148fdd7fd8f38e0498639ae128e64538faa507df25a20f8f7fb2341c"}, + {file = "psutil-5.9.7-cp27-none-win_amd64.whl", hash = "sha256:4c03362e280d06bbbfcd52f29acd79c733e0af33d707c54255d21029b8b32ba6"}, + {file = "psutil-5.9.7-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ea36cc62e69a13ec52b2f625c27527f6e4479bca2b340b7a452af55b34fcbe2e"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1132704b876e58d277168cd729d64750633d5ff0183acf5b3c986b8466cd0284"}, + {file = "psutil-5.9.7-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe8b7f07948f1304497ce4f4684881250cd859b16d06a1dc4d7941eeb6233bfe"}, + {file = "psutil-5.9.7-cp36-cp36m-win32.whl", hash = "sha256:b27f8fdb190c8c03914f908a4555159327d7481dac2f01008d483137ef3311a9"}, + {file = "psutil-5.9.7-cp36-cp36m-win_amd64.whl", hash = "sha256:44969859757f4d8f2a9bd5b76eba8c3099a2c8cf3992ff62144061e39ba8568e"}, + {file = "psutil-5.9.7-cp37-abi3-win32.whl", hash = "sha256:c727ca5a9b2dd5193b8644b9f0c883d54f1248310023b5ad3e92036c5e2ada68"}, + {file = "psutil-5.9.7-cp37-abi3-win_amd64.whl", hash = "sha256:f37f87e4d73b79e6c5e749440c3113b81d1ee7d26f21c19c47371ddea834f414"}, + {file = "psutil-5.9.7-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:032f4f2c909818c86cea4fe2cc407f1c0f0cde8e6c6d702b28b8ce0c0d143340"}, + {file = "psutil-5.9.7.tar.gz", hash = "sha256:3f02134e82cfb5d089fddf20bb2e03fd5cd52395321d1c8458a9e58500ff417c"}, +] + +[package.extras] +test = ["enum34", "ipaddress", "mock", "pywin32", "wmi"] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +description = "Run a subprocess in a pseudo terminal" +optional = false +python-versions = "*" +files = [ + {file = "ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35"}, + {file = "ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220"}, +] + +[[package]] +name = "pure-eval" +version = "0.2.2" +description = "Safely evaluate AST nodes without side effects" +optional = false +python-versions = "*" +files = [ + {file = "pure_eval-0.2.2-py3-none-any.whl", hash = "sha256:01eaab343580944bc56080ebe0a674b39ec44a945e6d09ba7db3cb8cec289350"}, + {file = "pure_eval-0.2.2.tar.gz", hash = "sha256:2b45320af6dfaa1750f543d714b6d1c520a1688dec6fd24d339063ce0aaa9ac3"}, +] + +[package.extras] +tests = ["pytest"] + +[[package]] +name = "pycparser" +version = "2.21" +description = "C parser in Python" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "pycparser-2.21-py2.py3-none-any.whl", hash = "sha256:8ee45429555515e1f6b185e78100aea234072576aa43ab53aefcae078162fca9"}, + {file = "pycparser-2.21.tar.gz", hash = "sha256:e644fdec12f7872f86c58ff790da456218b10f863970249516d60a5eaca77206"}, +] + +[[package]] +name = "pygments" +version = "2.17.2" +description = "Pygments is a syntax highlighting package written in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pygments-2.17.2-py3-none-any.whl", hash = "sha256:b27c2826c47d0f3219f29554824c30c5e8945175d888647acd804ddd04af846c"}, + {file = "pygments-2.17.2.tar.gz", hash = "sha256:da46cec9fd2de5be3a8a784f434e4c4ab670b4ff54d605c4c2717e9d49c4c367"}, +] + +[package.extras] +plugins = ["importlib-metadata"] +windows-terminal = ["colorama (>=0.4.6)"] + +[[package]] +name = "pymdown-extensions" +version = "10.7" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.7-py3-none-any.whl", hash = "sha256:6ca215bc57bc12bf32b414887a68b810637d039124ed9b2e5bd3325cbb2c050c"}, + {file = "pymdown_extensions-10.7.tar.gz", hash = "sha256:c0d64d5cf62566f59e6b2b690a4095c931107c250a8c8e1351c1de5f6b036deb"}, +] + +[package.dependencies] +markdown = ">=3.5" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "pytest" +version = "7.4.4" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8"}, + {file = "pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=0.12,<2.0" +tomli = {version = ">=1.0.0", markers = "python_version < \"3.11\""} + +[package.extras] +testing = ["argcomplete", "attrs (>=19.2.0)", "hypothesis (>=3.56)", "mock", "nose", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "pytest-cov" +version = "4.1.0" +description = "Pytest plugin for measuring coverage." +optional = false +python-versions = ">=3.7" +files = [ + {file = "pytest-cov-4.1.0.tar.gz", hash = "sha256:3904b13dfbfec47f003b8e77fd5b589cd11904a21ddf1ab38a64f204d6a10ef6"}, + {file = "pytest_cov-4.1.0-py3-none-any.whl", hash = "sha256:6ba70b9e97e69fcc3fb45bfeab2d0a138fb65c4d0d6a41ef33983ad114be8c3a"}, +] + +[package.dependencies] +coverage = {version = ">=5.2.1", extras = ["toml"]} +pytest = ">=4.6" + +[package.extras] +testing = ["fields", "hunter", "process-tests", "pytest-xdist", "six", "virtualenv"] + +[[package]] +name = "python-dateutil" +version = "2.8.2" +description = "Extensions to the standard Python datetime module" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" +files = [ + {file = "python-dateutil-2.8.2.tar.gz", hash = "sha256:0123cacc1627ae19ddf3c27a5de5bd67ee4586fbdd6440d9748f8abb483d3e86"}, + {file = "python_dateutil-2.8.2-py2.py3-none-any.whl", hash = "sha256:961d03dc3453ebbc59dbdea9e4e11c5651520a876d0f4db161e8674aae935da9"}, +] + +[package.dependencies] +six = ">=1.5" + +[[package]] +name = "python-dotenv" +version = "1.0.0" +description = "Read key-value pairs from a .env file and set them as environment variables" +optional = false +python-versions = ">=3.8" +files = [ + {file = "python-dotenv-1.0.0.tar.gz", hash = "sha256:a8df96034aae6d2d50a4ebe8216326c61c3eb64836776504fcca410e5937a3ba"}, + {file = "python_dotenv-1.0.0-py3-none-any.whl", hash = "sha256:f5971a9226b701070a4bf2c38c89e5a3f0d64de8debda981d1db98583009122a"}, +] + +[package.extras] +cli = ["click (>=5.0)"] + +[[package]] +name = "python-json-logger" +version = "2.0.7" +description = "A python library adding a json log formatter" +optional = false +python-versions = ">=3.6" +files = [ + {file = "python-json-logger-2.0.7.tar.gz", hash = "sha256:23e7ec02d34237c5aa1e29a070193a4ea87583bb4e7f8fd06d3de8264c4b2e1c"}, + {file = "python_json_logger-2.0.7-py3-none-any.whl", hash = "sha256:f380b826a991ebbe3de4d897aeec42760035ac760345e57b812938dc8b35e2bd"}, +] + +[[package]] +name = "pytz" +version = "2023.3.post1" +description = "World timezone definitions, modern and historical" +optional = false +python-versions = "*" +files = [ + {file = "pytz-2023.3.post1-py2.py3-none-any.whl", hash = "sha256:ce42d816b81b68506614c11e8937d3aa9e41007ceb50bfdcb0749b921bf646c7"}, + {file = "pytz-2023.3.post1.tar.gz", hash = "sha256:7b4fddbeb94a1eba4b557da24f19fdf9db575192544270a9101d8509f9f43d7b"}, +] + +[[package]] +name = "pywin32" +version = "306" +description = "Python for Window Extensions" +optional = false +python-versions = "*" +files = [ + {file = "pywin32-306-cp310-cp310-win32.whl", hash = "sha256:06d3420a5155ba65f0b72f2699b5bacf3109f36acbe8923765c22938a69dfc8d"}, + {file = "pywin32-306-cp310-cp310-win_amd64.whl", hash = "sha256:84f4471dbca1887ea3803d8848a1616429ac94a4a8d05f4bc9c5dcfd42ca99c8"}, + {file = "pywin32-306-cp311-cp311-win32.whl", hash = "sha256:e65028133d15b64d2ed8f06dd9fbc268352478d4f9289e69c190ecd6818b6407"}, + {file = "pywin32-306-cp311-cp311-win_amd64.whl", hash = "sha256:a7639f51c184c0272e93f244eb24dafca9b1855707d94c192d4a0b4c01e1100e"}, + {file = "pywin32-306-cp311-cp311-win_arm64.whl", hash = "sha256:70dba0c913d19f942a2db25217d9a1b726c278f483a919f1abfed79c9cf64d3a"}, + {file = "pywin32-306-cp312-cp312-win32.whl", hash = "sha256:383229d515657f4e3ed1343da8be101000562bf514591ff383ae940cad65458b"}, + {file = "pywin32-306-cp312-cp312-win_amd64.whl", hash = "sha256:37257794c1ad39ee9be652da0462dc2e394c8159dfd913a8a4e8eb6fd346da0e"}, + {file = "pywin32-306-cp312-cp312-win_arm64.whl", hash = "sha256:5821ec52f6d321aa59e2db7e0a35b997de60c201943557d108af9d4ae1ec7040"}, + {file = "pywin32-306-cp37-cp37m-win32.whl", hash = "sha256:1c73ea9a0d2283d889001998059f5eaaba3b6238f767c9cf2833b13e6a685f65"}, + {file = "pywin32-306-cp37-cp37m-win_amd64.whl", hash = "sha256:72c5f621542d7bdd4fdb716227be0dd3f8565c11b280be6315b06ace35487d36"}, + {file = "pywin32-306-cp38-cp38-win32.whl", hash = "sha256:e4c092e2589b5cf0d365849e73e02c391c1349958c5ac3e9d5ccb9a28e017b3a"}, + {file = "pywin32-306-cp38-cp38-win_amd64.whl", hash = "sha256:e8ac1ae3601bee6ca9f7cb4b5363bf1c0badb935ef243c4733ff9a393b1690c0"}, + {file = "pywin32-306-cp39-cp39-win32.whl", hash = "sha256:e25fd5b485b55ac9c057f67d94bc203f3f6595078d1fb3b458c9c28b7153a802"}, + {file = "pywin32-306-cp39-cp39-win_amd64.whl", hash = "sha256:39b61c15272833b5c329a2989999dcae836b1eed650252ab1b7bfbe1d59f30f4"}, +] + +[[package]] +name = "pywinpty" +version = "2.0.12" +description = "Pseudo terminal support for Windows from Python." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pywinpty-2.0.12-cp310-none-win_amd64.whl", hash = "sha256:21319cd1d7c8844fb2c970fb3a55a3db5543f112ff9cfcd623746b9c47501575"}, + {file = "pywinpty-2.0.12-cp311-none-win_amd64.whl", hash = "sha256:853985a8f48f4731a716653170cd735da36ffbdc79dcb4c7b7140bce11d8c722"}, + {file = "pywinpty-2.0.12-cp312-none-win_amd64.whl", hash = "sha256:1617b729999eb6713590e17665052b1a6ae0ad76ee31e60b444147c5b6a35dca"}, + {file = "pywinpty-2.0.12-cp38-none-win_amd64.whl", hash = "sha256:189380469ca143d06e19e19ff3fba0fcefe8b4a8cc942140a6b863aed7eebb2d"}, + {file = "pywinpty-2.0.12-cp39-none-win_amd64.whl", hash = "sha256:7520575b6546db23e693cbd865db2764097bd6d4ef5dc18c92555904cd62c3d4"}, + {file = "pywinpty-2.0.12.tar.gz", hash = "sha256:8197de460ae8ebb7f5d1701dfa1b5df45b157bb832e92acba316305e18ca00dd"}, +] + +[[package]] +name = "pyyaml" +version = "6.0.1" +description = "YAML parser and emitter for Python" +optional = false +python-versions = ">=3.6" +files = [ + {file = "PyYAML-6.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d858aa552c999bc8a8d57426ed01e40bef403cd8ccdd0fc5f6f04a00414cac2a"}, + {file = "PyYAML-6.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fd66fc5d0da6d9815ba2cebeb4205f95818ff4b79c3ebe268e75d961704af52f"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:69b023b2b4daa7548bcfbd4aa3da05b3a74b772db9e23b982788168117739938"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:81e0b275a9ecc9c0c0c07b4b90ba548307583c125f54d5b6946cfee6360c733d"}, + {file = "PyYAML-6.0.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba336e390cd8e4d1739f42dfe9bb83a3cc2e80f567d8805e11b46f4a943f5515"}, + {file = "PyYAML-6.0.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:326c013efe8048858a6d312ddd31d56e468118ad4cdeda36c719bf5bb6192290"}, + {file = "PyYAML-6.0.1-cp310-cp310-win32.whl", hash = "sha256:bd4af7373a854424dabd882decdc5579653d7868b8fb26dc7d0e99f823aa5924"}, + {file = "PyYAML-6.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:fd1592b3fdf65fff2ad0004b5e363300ef59ced41c2e6b3a99d4089fa8c5435d"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6965a7bc3cf88e5a1c3bd2e0b5c22f8d677dc88a455344035f03399034eb3007"}, + {file = "PyYAML-6.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f003ed9ad21d6a4713f0a9b5a7a0a79e08dd0f221aff4525a2be4c346ee60aab"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42f8152b8dbc4fe7d96729ec2b99c7097d656dc1213a3229ca5383f973a5ed6d"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:062582fca9fabdd2c8b54a3ef1c978d786e0f6b3a1510e0ac93ef59e0ddae2bc"}, + {file = "PyYAML-6.0.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d2b04aac4d386b172d5b9692e2d2da8de7bfb6c387fa4f801fbf6fb2e6ba4673"}, + {file = "PyYAML-6.0.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:e7d73685e87afe9f3b36c799222440d6cf362062f78be1013661b00c5c6f678b"}, + {file = "PyYAML-6.0.1-cp311-cp311-win32.whl", hash = "sha256:1635fd110e8d85d55237ab316b5b011de701ea0f29d07611174a1b42f1444741"}, + {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, + {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, + {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, + {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, + {file = "PyYAML-6.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:0d3304d8c0adc42be59c5f8a4d9e3d7379e6955ad754aa9d6ab7a398b59dd1df"}, + {file = "PyYAML-6.0.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:50550eb667afee136e9a77d6dc71ae76a44df8b3e51e41b77f6de2932bfe0f47"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1fe35611261b29bd1de0070f0b2f47cb6ff71fa6595c077e42bd0c419fa27b98"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:704219a11b772aea0d8ecd7058d0082713c3562b4e271b849ad7dc4a5c90c13c"}, + {file = "PyYAML-6.0.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:afd7e57eddb1a54f0f1a974bc4391af8bcce0b444685d936840f125cf046d5bd"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win32.whl", hash = "sha256:fca0e3a251908a499833aa292323f32437106001d436eca0e6e7833256674585"}, + {file = "PyYAML-6.0.1-cp36-cp36m-win_amd64.whl", hash = "sha256:f22ac1c3cac4dbc50079e965eba2c1058622631e526bd9afd45fedd49ba781fa"}, + {file = "PyYAML-6.0.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b1275ad35a5d18c62a7220633c913e1b42d44b46ee12554e5fd39c70a243d6a3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:18aeb1bf9a78867dc38b259769503436b7c72f7a1f1f4c93ff9a17de54319b27"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:596106435fa6ad000c2991a98fa58eeb8656ef2325d7e158344fb33864ed87e3"}, + {file = "PyYAML-6.0.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:baa90d3f661d43131ca170712d903e6295d1f7a0f595074f151c0aed377c9b9c"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win32.whl", hash = "sha256:9046c58c4395dff28dd494285c82ba00b546adfc7ef001486fbf0324bc174fba"}, + {file = "PyYAML-6.0.1-cp37-cp37m-win_amd64.whl", hash = "sha256:4fb147e7a67ef577a588a0e2c17b6db51dda102c71de36f8549b6816a96e1867"}, + {file = "PyYAML-6.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:1d4c7e777c441b20e32f52bd377e0c409713e8bb1386e1099c2415f26e479595"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a0cd17c15d3bb3fa06978b4e8958dcdc6e0174ccea823003a106c7d4d7899ac5"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28c119d996beec18c05208a8bd78cbe4007878c6dd15091efb73a30e90539696"}, + {file = "PyYAML-6.0.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7e07cbde391ba96ab58e532ff4803f79c4129397514e1413a7dc761ccd755735"}, + {file = "PyYAML-6.0.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:49a183be227561de579b4a36efbb21b3eab9651dd81b1858589f796549873dd6"}, + {file = "PyYAML-6.0.1-cp38-cp38-win32.whl", hash = "sha256:184c5108a2aca3c5b3d3bf9395d50893a7ab82a38004c8f61c258d4428e80206"}, + {file = "PyYAML-6.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:1e2722cc9fbb45d9b87631ac70924c11d3a401b2d7f410cc0e3bbf249f2dca62"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:9eb6caa9a297fc2c2fb8862bc5370d0303ddba53ba97e71f08023b6cd73d16a8"}, + {file = "PyYAML-6.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c8098ddcc2a85b61647b2590f825f3db38891662cfc2fc776415143f599bb859"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5773183b6446b2c99bb77e77595dd486303b4faab2b086e7b17bc6bef28865f6"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b786eecbdf8499b9ca1d697215862083bd6d2a99965554781d0d8d1ad31e13a0"}, + {file = "PyYAML-6.0.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc1bf2925a1ecd43da378f4db9e4f799775d6367bdb94671027b73b393a7c42c"}, + {file = "PyYAML-6.0.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:04ac92ad1925b2cff1db0cfebffb6ffc43457495c9b3c39d3fcae417d7125dc5"}, + {file = "PyYAML-6.0.1-cp39-cp39-win32.whl", hash = "sha256:faca3bdcf85b2fc05d06ff3fbc1f83e1391b3e724afa3feba7d13eeab355484c"}, + {file = "PyYAML-6.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:510c9deebc5c0225e8c96813043e62b680ba2f9c50a08d3724c7f28a747d1486"}, + {file = "PyYAML-6.0.1.tar.gz", hash = "sha256:bfdf460b1736c775f2ba9f6a92bca30bc2095067b8a9d77876d1fad6cc3b4a43"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "0.1" +description = "A custom YAML tag for referencing environment variables in YAML files. " +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyyaml_env_tag-0.1-py3-none-any.whl", hash = "sha256:af31106dec8a4d68c60207c1886031cbf839b68aa7abccdb19868200532c2069"}, + {file = "pyyaml_env_tag-0.1.tar.gz", hash = "sha256:70092675bda14fdec33b31ba77e7543de9ddc88f2e5b99160396572d11525bdb"}, +] + +[package.dependencies] +pyyaml = "*" + +[[package]] +name = "pyzmq" +version = "25.1.2" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.6" +files = [ + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:e624c789359f1a16f83f35e2c705d07663ff2b4d4479bad35621178d8f0f6ea4"}, + {file = "pyzmq-25.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:49151b0efece79f6a79d41a461d78535356136ee70084a1c22532fc6383f4ad0"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d9a5f194cf730f2b24d6af1f833c14c10f41023da46a7f736f48b6d35061e76e"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:faf79a302f834d9e8304fafdc11d0d042266667ac45209afa57e5efc998e3872"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7f51a7b4ead28d3fca8dda53216314a553b0f7a91ee8fc46a72b402a78c3e43d"}, + {file = "pyzmq-25.1.2-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:0ddd6d71d4ef17ba5a87becf7ddf01b371eaba553c603477679ae817a8d84d75"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:246747b88917e4867e2367b005fc8eefbb4a54b7db363d6c92f89d69abfff4b6"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:00c48ae2fd81e2a50c3485de1b9d5c7c57cd85dc8ec55683eac16846e57ac979"}, + {file = "pyzmq-25.1.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:5a68d491fc20762b630e5db2191dd07ff89834086740f70e978bb2ef2668be08"}, + {file = "pyzmq-25.1.2-cp310-cp310-win32.whl", hash = "sha256:09dfe949e83087da88c4a76767df04b22304a682d6154de2c572625c62ad6886"}, + {file = "pyzmq-25.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:fa99973d2ed20417744fca0073390ad65ce225b546febb0580358e36aa90dba6"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:82544e0e2d0c1811482d37eef297020a040c32e0687c1f6fc23a75b75db8062c"}, + {file = "pyzmq-25.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:01171fc48542348cd1a360a4b6c3e7d8f46cdcf53a8d40f84db6707a6768acc1"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bc69c96735ab501419c432110016329bf0dea8898ce16fab97c6d9106dc0b348"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3e124e6b1dd3dfbeb695435dff0e383256655bb18082e094a8dd1f6293114642"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7598d2ba821caa37a0f9d54c25164a4fa351ce019d64d0b44b45540950458840"}, + {file = "pyzmq-25.1.2-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:d1299d7e964c13607efd148ca1f07dcbf27c3ab9e125d1d0ae1d580a1682399d"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:4e6f689880d5ad87918430957297c975203a082d9a036cc426648fcbedae769b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:cc69949484171cc961e6ecd4a8911b9ce7a0d1f738fcae717177c231bf77437b"}, + {file = "pyzmq-25.1.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:9880078f683466b7f567b8624bfc16cad65077be046b6e8abb53bed4eeb82dd3"}, + {file = "pyzmq-25.1.2-cp311-cp311-win32.whl", hash = "sha256:4e5837af3e5aaa99a091302df5ee001149baff06ad22b722d34e30df5f0d9097"}, + {file = "pyzmq-25.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:25c2dbb97d38b5ac9fd15586e048ec5eb1e38f3d47fe7d92167b0c77bb3584e9"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:11e70516688190e9c2db14fcf93c04192b02d457b582a1f6190b154691b4c93a"}, + {file = "pyzmq-25.1.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:313c3794d650d1fccaaab2df942af9f2c01d6217c846177cfcbc693c7410839e"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b3cbba2f47062b85fe0ef9de5b987612140a9ba3a9c6d2543c6dec9f7c2ab27"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fc31baa0c32a2ca660784d5af3b9487e13b61b3032cb01a115fce6588e1bed30"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:02c9087b109070c5ab0b383079fa1b5f797f8d43e9a66c07a4b8b8bdecfd88ee"}, + {file = "pyzmq-25.1.2-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f8429b17cbb746c3e043cb986328da023657e79d5ed258b711c06a70c2ea7537"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:5074adeacede5f810b7ef39607ee59d94e948b4fd954495bdb072f8c54558181"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:7ae8f354b895cbd85212da245f1a5ad8159e7840e37d78b476bb4f4c3f32a9fe"}, + {file = "pyzmq-25.1.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:b264bf2cc96b5bc43ce0e852be995e400376bd87ceb363822e2cb1964fcdc737"}, + {file = "pyzmq-25.1.2-cp312-cp312-win32.whl", hash = "sha256:02bbc1a87b76e04fd780b45e7f695471ae6de747769e540da909173d50ff8e2d"}, + {file = "pyzmq-25.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:ced111c2e81506abd1dc142e6cd7b68dd53747b3b7ae5edbea4578c5eeff96b7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:7b6d09a8962a91151f0976008eb7b29b433a560fde056ec7a3db9ec8f1075438"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:967668420f36878a3c9ecb5ab33c9d0ff8d054f9c0233d995a6d25b0e95e1b6b"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5edac3f57c7ddaacdb4d40f6ef2f9e299471fc38d112f4bc6d60ab9365445fb0"}, + {file = "pyzmq-25.1.2-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:0dabfb10ef897f3b7e101cacba1437bd3a5032ee667b7ead32bbcdd1a8422fe7"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2c6441e0398c2baacfe5ba30c937d274cfc2dc5b55e82e3749e333aabffde561"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_i686.whl", hash = "sha256:16b726c1f6c2e7625706549f9dbe9b06004dfbec30dbed4bf50cbdfc73e5b32a"}, + {file = "pyzmq-25.1.2-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:a86c2dd76ef71a773e70551a07318b8e52379f58dafa7ae1e0a4be78efd1ff16"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win32.whl", hash = "sha256:359f7f74b5d3c65dae137f33eb2bcfa7ad9ebefd1cab85c935f063f1dbb245cc"}, + {file = "pyzmq-25.1.2-cp36-cp36m-win_amd64.whl", hash = "sha256:55875492f820d0eb3417b51d96fea549cde77893ae3790fd25491c5754ea2f68"}, + {file = "pyzmq-25.1.2-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:b8c8a419dfb02e91b453615c69568442e897aaf77561ee0064d789705ff37a92"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8807c87fa893527ae8a524c15fc505d9950d5e856f03dae5921b5e9aa3b8783b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5e319ed7d6b8f5fad9b76daa0a68497bc6f129858ad956331a5835785761e003"}, + {file = "pyzmq-25.1.2-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:3c53687dde4d9d473c587ae80cc328e5b102b517447456184b485587ebd18b62"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:9add2e5b33d2cd765ad96d5eb734a5e795a0755f7fc49aa04f76d7ddda73fd70"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:e690145a8c0c273c28d3b89d6fb32c45e0d9605b2293c10e650265bf5c11cfec"}, + {file = "pyzmq-25.1.2-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:00a06faa7165634f0cac1abb27e54d7a0b3b44eb9994530b8ec73cf52e15353b"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win32.whl", hash = "sha256:0f97bc2f1f13cb16905a5f3e1fbdf100e712d841482b2237484360f8bc4cb3d7"}, + {file = "pyzmq-25.1.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6cc0020b74b2e410287e5942e1e10886ff81ac77789eb20bec13f7ae681f0fdd"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:bef02cfcbded83473bdd86dd8d3729cd82b2e569b75844fb4ea08fee3c26ae41"}, + {file = "pyzmq-25.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:e10a4b5a4b1192d74853cc71a5e9fd022594573926c2a3a4802020360aa719d8"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:8c5f80e578427d4695adac6fdf4370c14a2feafdc8cb35549c219b90652536ae"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:5dde6751e857910c1339890f3524de74007958557593b9e7e8c5f01cd919f8a7"}, + {file = "pyzmq-25.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ea1608dd169da230a0ad602d5b1ebd39807ac96cae1845c3ceed39af08a5c6df"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:0f513130c4c361201da9bc69df25a086487250e16b5571ead521b31ff6b02220"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:019744b99da30330798bb37df33549d59d380c78e516e3bab9c9b84f87a9592f"}, + {file = "pyzmq-25.1.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:2e2713ef44be5d52dd8b8e2023d706bf66cb22072e97fc71b168e01d25192755"}, + {file = "pyzmq-25.1.2-cp38-cp38-win32.whl", hash = "sha256:07cd61a20a535524906595e09344505a9bd46f1da7a07e504b315d41cd42eb07"}, + {file = "pyzmq-25.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:eb7e49a17fb8c77d3119d41a4523e432eb0c6932187c37deb6fbb00cc3028088"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:94504ff66f278ab4b7e03e4cba7e7e400cb73bfa9d3d71f58d8972a8dc67e7a6"}, + {file = "pyzmq-25.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6dd0d50bbf9dca1d0bdea219ae6b40f713a3fb477c06ca3714f208fd69e16fd8"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:004ff469d21e86f0ef0369717351073e0e577428e514c47c8480770d5e24a565"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c0b5ca88a8928147b7b1e2dfa09f3b6c256bc1135a1338536cbc9ea13d3b7add"}, + {file = "pyzmq-25.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9a79f1d2495b167119d02be7448bfba57fad2a4207c4f68abc0bab4b92925b"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:518efd91c3d8ac9f9b4f7dd0e2b7b8bf1a4fe82a308009016b07eaa48681af82"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:1ec23bd7b3a893ae676d0e54ad47d18064e6c5ae1fadc2f195143fb27373f7f6"}, + {file = "pyzmq-25.1.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:db36c27baed588a5a8346b971477b718fdc66cf5b80cbfbd914b4d6d355e44e2"}, + {file = "pyzmq-25.1.2-cp39-cp39-win32.whl", hash = "sha256:39b1067f13aba39d794a24761e385e2eddc26295826530a8c7b6c6c341584289"}, + {file = "pyzmq-25.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:8e9f3fabc445d0ce320ea2c59a75fe3ea591fdbdeebec5db6de530dd4b09412e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a8c1d566344aee826b74e472e16edae0a02e2a044f14f7c24e123002dcff1c05"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:759cfd391a0996345ba94b6a5110fca9c557ad4166d86a6e81ea526c376a01e8"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7c61e346ac34b74028ede1c6b4bcecf649d69b707b3ff9dc0fab453821b04d1e"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb8fc1f8d69b411b8ec0b5f1ffbcaf14c1db95b6bccea21d83610987435f1a4"}, + {file = "pyzmq-25.1.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:3c00c9b7d1ca8165c610437ca0c92e7b5607b2f9076f4eb4b095c85d6e680a1d"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:df0c7a16ebb94452d2909b9a7b3337940e9a87a824c4fc1c7c36bb4404cb0cde"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:45999e7f7ed5c390f2e87ece7f6c56bf979fb213550229e711e45ecc7d42ccb8"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ac170e9e048b40c605358667aca3d94e98f604a18c44bdb4c102e67070f3ac9b"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1b604734bec94f05f81b360a272fc824334267426ae9905ff32dc2be433ab96"}, + {file = "pyzmq-25.1.2-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:a793ac733e3d895d96f865f1806f160696422554e46d30105807fdc9841b9f7d"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:0806175f2ae5ad4b835ecd87f5f85583316b69f17e97786f7443baaf54b9bb98"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:ef12e259e7bc317c7597d4f6ef59b97b913e162d83b421dd0db3d6410f17a244"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ea253b368eb41116011add00f8d5726762320b1bda892f744c91997b65754d73"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1b9b1f2ad6498445a941d9a4fee096d387fee436e45cc660e72e768d3d8ee611"}, + {file = "pyzmq-25.1.2-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:8b14c75979ce932c53b79976a395cb2a8cd3aaf14aef75e8c2cb55a330b9b49d"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:889370d5174a741a62566c003ee8ddba4b04c3f09a97b8000092b7ca83ec9c49"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9a18fff090441a40ffda8a7f4f18f03dc56ae73f148f1832e109f9bffa85df15"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:99a6b36f95c98839ad98f8c553d8507644c880cf1e0a57fe5e3a3f3969040882"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4345c9a27f4310afbb9c01750e9461ff33d6fb74cd2456b107525bbeebcb5be3"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:3516e0b6224cf6e43e341d56da15fd33bdc37fa0c06af4f029f7d7dfceceabbc"}, + {file = "pyzmq-25.1.2-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:146b9b1f29ead41255387fb07be56dc29639262c0f7344f570eecdcd8d683314"}, + {file = "pyzmq-25.1.2.tar.gz", hash = "sha256:93f1aa311e8bb912e34f004cf186407a4e90eec4f0ecc0efd26056bf7eda0226"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "referencing" +version = "0.32.1" +description = "JSON Referencing + Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "referencing-0.32.1-py3-none-any.whl", hash = "sha256:7e4dc12271d8e15612bfe35792f5ea1c40970dadf8624602e33db2758f7ee554"}, + {file = "referencing-0.32.1.tar.gz", hash = "sha256:3c57da0513e9563eb7e203ebe9bb3a1b509b042016433bd1e45a2853466c3dd3"}, +] + +[package.dependencies] +attrs = ">=22.2.0" +rpds-py = ">=0.7.0" + +[[package]] +name = "regex" +version = "2023.12.25" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.7" +files = [ + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:0694219a1d54336fd0445ea382d49d36882415c0134ee1e8332afd1529f0baa5"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b014333bd0217ad3d54c143de9d4b9a3ca1c5a29a6d0d554952ea071cff0f1f8"}, + {file = "regex-2023.12.25-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d865984b3f71f6d0af64d0d88f5733521698f6c16f445bb09ce746c92c97c586"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1e0eabac536b4cc7f57a5f3d095bfa557860ab912f25965e08fe1545e2ed8b4c"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:c25a8ad70e716f96e13a637802813f65d8a6760ef48672aa3502f4c24ea8b400"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a9b6d73353f777630626f403b0652055ebfe8ff142a44ec2cf18ae470395766e"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a9cc99d6946d750eb75827cb53c4371b8b0fe89c733a94b1573c9dd16ea6c9e4"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88d1f7bef20c721359d8675f7d9f8e414ec5003d8f642fdfd8087777ff7f94b5"}, + {file = "regex-2023.12.25-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cb3fe77aec8f1995611f966d0c656fdce398317f850d0e6e7aebdfe61f40e1cd"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:7aa47c2e9ea33a4a2a05f40fcd3ea36d73853a2aae7b4feab6fc85f8bf2c9704"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:df26481f0c7a3f8739fecb3e81bc9da3fcfae34d6c094563b9d4670b047312e1"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:c40281f7d70baf6e0db0c2f7472b31609f5bc2748fe7275ea65a0b4601d9b392"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:d94a1db462d5690ebf6ae86d11c5e420042b9898af5dcf278bd97d6bda065423"}, + {file = "regex-2023.12.25-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:ba1b30765a55acf15dce3f364e4928b80858fa8f979ad41f862358939bdd1f2f"}, + {file = "regex-2023.12.25-cp310-cp310-win32.whl", hash = "sha256:150c39f5b964e4d7dba46a7962a088fbc91f06e606f023ce57bb347a3b2d4630"}, + {file = "regex-2023.12.25-cp310-cp310-win_amd64.whl", hash = "sha256:09da66917262d9481c719599116c7dc0c321ffcec4b1f510c4f8a066f8768105"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:1b9d811f72210fa9306aeb88385b8f8bcef0dfbf3873410413c00aa94c56c2b6"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d902a43085a308cef32c0d3aea962524b725403fd9373dea18110904003bac97"}, + {file = "regex-2023.12.25-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d166eafc19f4718df38887b2bbe1467a4f74a9830e8605089ea7a30dd4da8887"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c7ad32824b7f02bb3c9f80306d405a1d9b7bb89362d68b3c5a9be53836caebdb"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:636ba0a77de609d6510235b7f0e77ec494d2657108f777e8765efc060094c98c"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0fda75704357805eb953a3ee15a2b240694a9a514548cd49b3c5124b4e2ad01b"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f72cbae7f6b01591f90814250e636065850c5926751af02bb48da94dfced7baa"}, + {file = "regex-2023.12.25-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:db2a0b1857f18b11e3b0e54ddfefc96af46b0896fb678c85f63fb8c37518b3e7"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:7502534e55c7c36c0978c91ba6f61703faf7ce733715ca48f499d3dbbd7657e0"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:e8c7e08bb566de4faaf11984af13f6bcf6a08f327b13631d41d62592681d24fe"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:283fc8eed679758de38fe493b7d7d84a198b558942b03f017b1f94dda8efae80"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:f44dd4d68697559d007462b0a3a1d9acd61d97072b71f6d1968daef26bc744bd"}, + {file = "regex-2023.12.25-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:67d3ccfc590e5e7197750fcb3a2915b416a53e2de847a728cfa60141054123d4"}, + {file = "regex-2023.12.25-cp311-cp311-win32.whl", hash = "sha256:68191f80a9bad283432385961d9efe09d783bcd36ed35a60fb1ff3f1ec2efe87"}, + {file = "regex-2023.12.25-cp311-cp311-win_amd64.whl", hash = "sha256:7d2af3f6b8419661a0c421584cfe8aaec1c0e435ce7e47ee2a97e344b98f794f"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8a0ccf52bb37d1a700375a6b395bff5dd15c50acb745f7db30415bae3c2b0715"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c3c4a78615b7762740531c27cf46e2f388d8d727d0c0c739e72048beb26c8a9d"}, + {file = "regex-2023.12.25-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ad83e7545b4ab69216cef4cc47e344d19622e28aabec61574b20257c65466d6a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b7a635871143661feccce3979e1727c4e094f2bdfd3ec4b90dfd4f16f571a87a"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d498eea3f581fbe1b34b59c697512a8baef88212f92e4c7830fcc1499f5b45a5"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:43f7cd5754d02a56ae4ebb91b33461dc67be8e3e0153f593c509e21d219c5060"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51f4b32f793812714fd5307222a7f77e739b9bc566dc94a18126aba3b92b98a3"}, + {file = "regex-2023.12.25-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba99d8077424501b9616b43a2d208095746fb1284fc5ba490139651f971d39d9"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4bfc2b16e3ba8850e0e262467275dd4d62f0d045e0e9eda2bc65078c0110a11f"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:8c2c19dae8a3eb0ea45a8448356ed561be843b13cbc34b840922ddf565498c1c"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:60080bb3d8617d96f0fb7e19796384cc2467447ef1c491694850ebd3670bc457"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:b77e27b79448e34c2c51c09836033056a0547aa360c45eeeb67803da7b0eedaf"}, + {file = "regex-2023.12.25-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:518440c991f514331f4850a63560321f833979d145d7d81186dbe2f19e27ae3d"}, + {file = "regex-2023.12.25-cp312-cp312-win32.whl", hash = "sha256:e2610e9406d3b0073636a3a2e80db05a02f0c3169b5632022b4e81c0364bcda5"}, + {file = "regex-2023.12.25-cp312-cp312-win_amd64.whl", hash = "sha256:cc37b9aeebab425f11f27e5e9e6cf580be7206c6582a64467a14dda211abc232"}, + {file = "regex-2023.12.25-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:da695d75ac97cb1cd725adac136d25ca687da4536154cdc2815f576e4da11c69"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d126361607b33c4eb7b36debc173bf25d7805847346dd4d99b5499e1fef52bc7"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4719bb05094d7d8563a450cf8738d2e1061420f79cfcc1fa7f0a44744c4d8f73"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5dd58946bce44b53b06d94aa95560d0b243eb2fe64227cba50017a8d8b3cd3e2"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:22a86d9fff2009302c440b9d799ef2fe322416d2d58fc124b926aa89365ec482"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2aae8101919e8aa05ecfe6322b278f41ce2994c4a430303c4cd163fef746e04f"}, + {file = "regex-2023.12.25-cp37-cp37m-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:e692296c4cc2873967771345a876bcfc1c547e8dd695c6b89342488b0ea55cd8"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:263ef5cc10979837f243950637fffb06e8daed7f1ac1e39d5910fd29929e489a"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:d6f7e255e5fa94642a0724e35406e6cb7001c09d476ab5fce002f652b36d0c39"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:88ad44e220e22b63b0f8f81f007e8abbb92874d8ced66f32571ef8beb0643b2b"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:3a17d3ede18f9cedcbe23d2daa8a2cd6f59fe2bf082c567e43083bba3fb00347"}, + {file = "regex-2023.12.25-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:d15b274f9e15b1a0b7a45d2ac86d1f634d983ca40d6b886721626c47a400bf39"}, + {file = "regex-2023.12.25-cp37-cp37m-win32.whl", hash = "sha256:ed19b3a05ae0c97dd8f75a5d8f21f7723a8c33bbc555da6bbe1f96c470139d3c"}, + {file = "regex-2023.12.25-cp37-cp37m-win_amd64.whl", hash = "sha256:a6d1047952c0b8104a1d371f88f4ab62e6275567d4458c1e26e9627ad489b445"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:b43523d7bc2abd757119dbfb38af91b5735eea45537ec6ec3a5ec3f9562a1c53"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:efb2d82f33b2212898f1659fb1c2e9ac30493ac41e4d53123da374c3b5541e64"}, + {file = "regex-2023.12.25-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:b7fca9205b59c1a3d5031f7e64ed627a1074730a51c2a80e97653e3e9fa0d415"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:086dd15e9435b393ae06f96ab69ab2d333f5d65cbe65ca5a3ef0ec9564dfe770"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e81469f7d01efed9b53740aedd26085f20d49da65f9c1f41e822a33992cb1590"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:34e4af5b27232f68042aa40a91c3b9bb4da0eeb31b7632e0091afc4310afe6cb"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9852b76ab558e45b20bf1893b59af64a28bd3820b0c2efc80e0a70a4a3ea51c1"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ff100b203092af77d1a5a7abe085b3506b7eaaf9abf65b73b7d6905b6cb76988"}, + {file = "regex-2023.12.25-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:cc038b2d8b1470364b1888a98fd22d616fba2b6309c5b5f181ad4483e0017861"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:094ba386bb5c01e54e14434d4caabf6583334090865b23ef58e0424a6286d3dc"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:5cd05d0f57846d8ba4b71d9c00f6f37d6b97d5e5ef8b3c3840426a475c8f70f4"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:9aa1a67bbf0f957bbe096375887b2505f5d8ae16bf04488e8b0f334c36e31360"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:98a2636994f943b871786c9e82bfe7883ecdaba2ef5df54e1450fa9869d1f756"}, + {file = "regex-2023.12.25-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:37f8e93a81fc5e5bd8db7e10e62dc64261bcd88f8d7e6640aaebe9bc180d9ce2"}, + {file = "regex-2023.12.25-cp38-cp38-win32.whl", hash = "sha256:d78bd484930c1da2b9679290a41cdb25cc127d783768a0369d6b449e72f88beb"}, + {file = "regex-2023.12.25-cp38-cp38-win_amd64.whl", hash = "sha256:b521dcecebc5b978b447f0f69b5b7f3840eac454862270406a39837ffae4e697"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:f7bc09bc9c29ebead055bcba136a67378f03d66bf359e87d0f7c759d6d4ffa31"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:e14b73607d6231f3cc4622809c196b540a6a44e903bcfad940779c80dffa7be7"}, + {file = "regex-2023.12.25-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9eda5f7a50141291beda3edd00abc2d4a5b16c29c92daf8d5bd76934150f3edc"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cc6bb9aa69aacf0f6032c307da718f61a40cf970849e471254e0e91c56ffca95"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:298dc6354d414bc921581be85695d18912bea163a8b23cac9a2562bbcd5088b1"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:2f4e475a80ecbd15896a976aa0b386c5525d0ed34d5c600b6d3ebac0a67c7ddf"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:531ac6cf22b53e0696f8e1d56ce2396311254eb806111ddd3922c9d937151dae"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:22f3470f7524b6da61e2020672df2f3063676aff444db1daa283c2ea4ed259d6"}, + {file = "regex-2023.12.25-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:89723d2112697feaa320c9d351e5f5e7b841e83f8b143dba8e2d2b5f04e10923"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0ecf44ddf9171cd7566ef1768047f6e66975788258b1c6c6ca78098b95cf9a3d"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:905466ad1702ed4acfd67a902af50b8db1feeb9781436372261808df7a2a7bca"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:4558410b7a5607a645e9804a3e9dd509af12fb72b9825b13791a37cd417d73a5"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:7e316026cc1095f2a3e8cc012822c99f413b702eaa2ca5408a513609488cb62f"}, + {file = "regex-2023.12.25-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:3b1de218d5375cd6ac4b5493e0b9f3df2be331e86520f23382f216c137913d20"}, + {file = "regex-2023.12.25-cp39-cp39-win32.whl", hash = "sha256:11a963f8e25ab5c61348d090bf1b07f1953929c13bd2309a0662e9ff680763c9"}, + {file = "regex-2023.12.25-cp39-cp39-win_amd64.whl", hash = "sha256:e693e233ac92ba83a87024e1d32b5f9ab15ca55ddd916d878146f4e3406b5c91"}, + {file = "regex-2023.12.25.tar.gz", hash = "sha256:29171aa128da69afdf4bde412d5bedc335f2ca8fcfe4489038577d05f16181e5"}, +] + +[[package]] +name = "requests" +version = "2.31.0" +description = "Python HTTP for Humans." +optional = false +python-versions = ">=3.7" +files = [ + {file = "requests-2.31.0-py3-none-any.whl", hash = "sha256:58cd2187c01e70e6e26505bca751777aa9f2ee0b7f4300988b709f44e013003f"}, + {file = "requests-2.31.0.tar.gz", hash = "sha256:942c5a758f98d790eaed1a29cb6eefc7ffb0d1cf7af05c3d2791656dbd6ad1e1"}, +] + +[package.dependencies] +certifi = ">=2017.4.17" +charset-normalizer = ">=2,<4" +idna = ">=2.5,<4" +urllib3 = ">=1.21.1,<3" + +[package.extras] +socks = ["PySocks (>=1.5.6,!=1.5.7)"] +use-chardet-on-py3 = ["chardet (>=3.0.2,<6)"] + +[[package]] +name = "rfc3339-validator" +version = "0.1.4" +description = "A pure python RFC3339 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3339_validator-0.1.4-py2.py3-none-any.whl", hash = "sha256:24f6ec1eda14ef823da9e36ec7113124b39c04d50a4d3d3a3c2859577e7791fa"}, + {file = "rfc3339_validator-0.1.4.tar.gz", hash = "sha256:138a2abdf93304ad60530167e51d2dfb9549521a836871b88d7f4695d0022f6b"}, +] + +[package.dependencies] +six = "*" + +[[package]] +name = "rfc3986-validator" +version = "0.1.1" +description = "Pure python rfc3986 validator" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" +files = [ + {file = "rfc3986_validator-0.1.1-py2.py3-none-any.whl", hash = "sha256:2f235c432ef459970b4306369336b9d5dbdda31b510ca1e327636e01f528bfa9"}, + {file = "rfc3986_validator-0.1.1.tar.gz", hash = "sha256:3d44bde7921b3b9ec3ae4e3adca370438eccebc676456449b145d533b240d055"}, +] + +[[package]] +name = "rich" +version = "13.7.0" +description = "Render rich text, tables, progress bars, syntax highlighting, markdown and more to the terminal" +optional = false +python-versions = ">=3.7.0" +files = [ + {file = "rich-13.7.0-py3-none-any.whl", hash = "sha256:6da14c108c4866ee9520bbffa71f6fe3962e193b7da68720583850cd4548e235"}, + {file = "rich-13.7.0.tar.gz", hash = "sha256:5cb5123b5cf9ee70584244246816e9114227e0b98ad9176eede6ad54bf5403fa"}, +] + +[package.dependencies] +markdown-it-py = ">=2.2.0" +pygments = ">=2.13.0,<3.0.0" +typing-extensions = {version = ">=4.0.0,<5.0", markers = "python_version < \"3.9\""} + +[package.extras] +jupyter = ["ipywidgets (>=7.5.1,<9)"] + +[[package]] +name = "rpds-py" +version = "0.17.1" +description = "Python bindings to Rust's persistent data structures (rpds)" +optional = false +python-versions = ">=3.8" +files = [ + {file = "rpds_py-0.17.1-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4128980a14ed805e1b91a7ed551250282a8ddf8201a4e9f8f5b7e6225f54170d"}, + {file = "rpds_py-0.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ff1dcb8e8bc2261a088821b2595ef031c91d499a0c1b031c152d43fe0a6ecec8"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d65e6b4f1443048eb7e833c2accb4fa7ee67cc7d54f31b4f0555b474758bee55"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a71169d505af63bb4d20d23a8fbd4c6ce272e7bce6cc31f617152aa784436f29"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:436474f17733c7dca0fbf096d36ae65277e8645039df12a0fa52445ca494729d"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:10162fe3f5f47c37ebf6d8ff5a2368508fe22007e3077bf25b9c7d803454d921"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:720215373a280f78a1814becb1312d4e4d1077b1202a56d2b0815e95ccb99ce9"}, + {file = "rpds_py-0.17.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:70fcc6c2906cfa5c6a552ba7ae2ce64b6c32f437d8f3f8eea49925b278a61453"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:91e5a8200e65aaac342a791272c564dffcf1281abd635d304d6c4e6b495f29dc"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:99f567dae93e10be2daaa896e07513dd4bf9c2ecf0576e0533ac36ba3b1d5394"}, + {file = "rpds_py-0.17.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24e4900a6643f87058a27320f81336d527ccfe503984528edde4bb660c8c8d59"}, + {file = "rpds_py-0.17.1-cp310-none-win32.whl", hash = "sha256:0bfb09bf41fe7c51413f563373e5f537eaa653d7adc4830399d4e9bdc199959d"}, + {file = "rpds_py-0.17.1-cp310-none-win_amd64.whl", hash = "sha256:20de7b7179e2031a04042e85dc463a93a82bc177eeba5ddd13ff746325558aa6"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:65dcf105c1943cba45d19207ef51b8bc46d232a381e94dd38719d52d3980015b"}, + {file = "rpds_py-0.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:01f58a7306b64e0a4fe042047dd2b7d411ee82e54240284bab63e325762c1147"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:071bc28c589b86bc6351a339114fb7a029f5cddbaca34103aa573eba7b482382"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ae35e8e6801c5ab071b992cb2da958eee76340e6926ec693b5ff7d6381441745"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:149c5cd24f729e3567b56e1795f74577aa3126c14c11e457bec1b1c90d212e38"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e796051f2070f47230c745d0a77a91088fbee2cc0502e9b796b9c6471983718c"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:60e820ee1004327609b28db8307acc27f5f2e9a0b185b2064c5f23e815f248f8"}, + {file = "rpds_py-0.17.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1957a2ab607f9added64478a6982742eb29f109d89d065fa44e01691a20fc20a"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8587fd64c2a91c33cdc39d0cebdaf30e79491cc029a37fcd458ba863f8815383"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:4dc889a9d8a34758d0fcc9ac86adb97bab3fb7f0c4d29794357eb147536483fd"}, + {file = "rpds_py-0.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2953937f83820376b5979318840f3ee47477d94c17b940fe31d9458d79ae7eea"}, + {file = "rpds_py-0.17.1-cp311-none-win32.whl", hash = "sha256:1bfcad3109c1e5ba3cbe2f421614e70439f72897515a96c462ea657261b96518"}, + {file = "rpds_py-0.17.1-cp311-none-win_amd64.whl", hash = "sha256:99da0a4686ada4ed0f778120a0ea8d066de1a0a92ab0d13ae68492a437db78bf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:1dc29db3900cb1bb40353772417800f29c3d078dbc8024fd64655a04ee3c4bdf"}, + {file = "rpds_py-0.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82ada4a8ed9e82e443fcef87e22a3eed3654dd3adf6e3b3a0deb70f03e86142a"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d36b2b59e8cc6e576f8f7b671e32f2ff43153f0ad6d0201250a7c07f25d570e"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3677fcca7fb728c86a78660c7fb1b07b69b281964673f486ae72860e13f512ad"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:516fb8c77805159e97a689e2f1c80655c7658f5af601c34ffdb916605598cda2"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:df3b6f45ba4515632c5064e35ca7f31d51d13d1479673185ba8f9fefbbed58b9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a967dd6afda7715d911c25a6ba1517975acd8d1092b2f326718725461a3d33f9"}, + {file = "rpds_py-0.17.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:dbbb95e6fc91ea3102505d111b327004d1c4ce98d56a4a02e82cd451f9f57140"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:02866e060219514940342a1f84303a1ef7a1dad0ac311792fbbe19b521b489d2"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2528ff96d09f12e638695f3a2e0c609c7b84c6df7c5ae9bfeb9252b6fa686253"}, + {file = "rpds_py-0.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bd345a13ce06e94c753dab52f8e71e5252aec1e4f8022d24d56decd31e1b9b23"}, + {file = "rpds_py-0.17.1-cp312-none-win32.whl", hash = "sha256:2a792b2e1d3038daa83fa474d559acfd6dc1e3650ee93b2662ddc17dbff20ad1"}, + {file = "rpds_py-0.17.1-cp312-none-win_amd64.whl", hash = "sha256:292f7344a3301802e7c25c53792fae7d1593cb0e50964e7bcdcc5cf533d634e3"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_10_12_x86_64.whl", hash = "sha256:8ffe53e1d8ef2520ebcf0c9fec15bb721da59e8ef283b6ff3079613b1e30513d"}, + {file = "rpds_py-0.17.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4341bd7579611cf50e7b20bb8c2e23512a3dc79de987a1f411cb458ab670eb90"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f4eb548daf4836e3b2c662033bfbfc551db58d30fd8fe660314f86bf8510b93"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b686f25377f9c006acbac63f61614416a6317133ab7fafe5de5f7dc8a06d42eb"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4e21b76075c01d65d0f0f34302b5a7457d95721d5e0667aea65e5bb3ab415c25"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b86b21b348f7e5485fae740d845c65a880f5d1eda1e063bc59bef92d1f7d0c55"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f175e95a197f6a4059b50757a3dca33b32b61691bdbd22c29e8a8d21d3914cae"}, + {file = "rpds_py-0.17.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:1701fc54460ae2e5efc1dd6350eafd7a760f516df8dbe51d4a1c79d69472fbd4"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:9051e3d2af8f55b42061603e29e744724cb5f65b128a491446cc029b3e2ea896"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:7450dbd659fed6dd41d1a7d47ed767e893ba402af8ae664c157c255ec6067fde"}, + {file = "rpds_py-0.17.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5a024fa96d541fd7edaa0e9d904601c6445e95a729a2900c5aec6555fe921ed6"}, + {file = "rpds_py-0.17.1-cp38-none-win32.whl", hash = "sha256:da1ead63368c04a9bded7904757dfcae01eba0e0f9bc41d3d7f57ebf1c04015a"}, + {file = "rpds_py-0.17.1-cp38-none-win_amd64.whl", hash = "sha256:841320e1841bb53fada91c9725e766bb25009cfd4144e92298db296fb6c894fb"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:f6c43b6f97209e370124baf2bf40bb1e8edc25311a158867eb1c3a5d449ebc7a"}, + {file = "rpds_py-0.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:5e7d63ec01fe7c76c2dbb7e972fece45acbb8836e72682bde138e7e039906e2c"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:81038ff87a4e04c22e1d81f947c6ac46f122e0c80460b9006e6517c4d842a6ec"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:810685321f4a304b2b55577c915bece4c4a06dfe38f6e62d9cc1d6ca8ee86b99"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:25f071737dae674ca8937a73d0f43f5a52e92c2d178330b4c0bb6ab05586ffa6"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aa5bfb13f1e89151ade0eb812f7b0d7a4d643406caaad65ce1cbabe0a66d695f"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dfe07308b311a8293a0d5ef4e61411c5c20f682db6b5e73de6c7c8824272c256"}, + {file = "rpds_py-0.17.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a000133a90eea274a6f28adc3084643263b1e7c1a5a66eb0a0a7a36aa757ed74"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:5d0e8a6434a3fbf77d11448c9c25b2f25244226cfbec1a5159947cac5b8c5fa4"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:efa767c220d94aa4ac3a6dd3aeb986e9f229eaf5bce92d8b1b3018d06bed3772"}, + {file = "rpds_py-0.17.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:dbc56680ecf585a384fbd93cd42bc82668b77cb525343170a2d86dafaed2a84b"}, + {file = "rpds_py-0.17.1-cp39-none-win32.whl", hash = "sha256:270987bc22e7e5a962b1094953ae901395e8c1e1e83ad016c5cfcfff75a15a3f"}, + {file = "rpds_py-0.17.1-cp39-none-win_amd64.whl", hash = "sha256:2a7b2f2f56a16a6d62e55354dd329d929560442bd92e87397b7a9586a32e3e76"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a3264e3e858de4fc601741498215835ff324ff2482fd4e4af61b46512dd7fc83"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:f2f3b28b40fddcb6c1f1f6c88c6f3769cd933fa493ceb79da45968a21dccc920"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9584f8f52010295a4a417221861df9bea4c72d9632562b6e59b3c7b87a1522b7"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:c64602e8be701c6cfe42064b71c84ce62ce66ddc6422c15463fd8127db3d8066"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:060f412230d5f19fc8c8b75f315931b408d8ebf56aec33ef4168d1b9e54200b1"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b9412abdf0ba70faa6e2ee6c0cc62a8defb772e78860cef419865917d86c7342"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9737bdaa0ad33d34c0efc718741abaafce62fadae72c8b251df9b0c823c63b22"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9f0e4dc0f17dcea4ab9d13ac5c666b6b5337042b4d8f27e01b70fae41dd65c57"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:1db228102ab9d1ff4c64148c96320d0be7044fa28bd865a9ce628ce98da5973d"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:d8bbd8e56f3ba25a7d0cf980fc42b34028848a53a0e36c9918550e0280b9d0b6"}, + {file = "rpds_py-0.17.1-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:be22ae34d68544df293152b7e50895ba70d2a833ad9566932d750d3625918b82"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_10_12_x86_64.whl", hash = "sha256:bf046179d011e6114daf12a534d874958b039342b347348a78b7cdf0dd9d6041"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-macosx_11_0_arm64.whl", hash = "sha256:1a746a6d49665058a5896000e8d9d2f1a6acba8a03b389c1e4c06e11e0b7f40d"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f0b8bf5b8db49d8fd40f54772a1dcf262e8be0ad2ab0206b5a2ec109c176c0a4"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f7f4cb1f173385e8a39c29510dd11a78bf44e360fb75610594973f5ea141028b"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:7fbd70cb8b54fe745301921b0816c08b6d917593429dfc437fd024b5ba713c58"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9bdf1303df671179eaf2cb41e8515a07fc78d9d00f111eadbe3e14262f59c3d0"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fad059a4bd14c45776600d223ec194e77db6c20255578bb5bcdd7c18fd169361"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3664d126d3388a887db44c2e293f87d500c4184ec43d5d14d2d2babdb4c64cad"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:698ea95a60c8b16b58be9d854c9f993c639f5c214cf9ba782eca53a8789d6b19"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_i686.whl", hash = "sha256:c3d2010656999b63e628a3c694f23020322b4178c450dc478558a2b6ef3cb9bb"}, + {file = "rpds_py-0.17.1-pp38-pypy38_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:938eab7323a736533f015e6069a7d53ef2dcc841e4e533b782c2bfb9fb12d84b"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:1e626b365293a2142a62b9a614e1f8e331b28f3ca57b9f05ebbf4cf2a0f0bdc5"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:380e0df2e9d5d5d339803cfc6d183a5442ad7ab3c63c2a0982e8c824566c5ccc"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b760a56e080a826c2e5af09002c1a037382ed21d03134eb6294812dda268c811"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5576ee2f3a309d2bb403ec292d5958ce03953b0e57a11d224c1f134feaf8c40f"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3c3461ebb4c4f1bbc70b15d20b565759f97a5aaf13af811fcefc892e9197ba"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:637b802f3f069a64436d432117a7e58fab414b4e27a7e81049817ae94de45d8d"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ffee088ea9b593cc6160518ba9bd319b5475e5f3e578e4552d63818773c6f56a"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3ac732390d529d8469b831949c78085b034bff67f584559340008d0f6041a049"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:93432e747fb07fa567ad9cc7aaadd6e29710e515aabf939dfbed8046041346c6"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:7b7d9ca34542099b4e185b3c2a2b2eda2e318a7dbde0b0d83357a6d4421b5296"}, + {file = "rpds_py-0.17.1-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:0387ce69ba06e43df54e43968090f3626e231e4bc9150e4c3246947567695f68"}, + {file = "rpds_py-0.17.1.tar.gz", hash = "sha256:0210b2668f24c078307260bf88bdac9d6f1093635df5123789bfee4d8d7fc8e7"}, +] + +[[package]] +name = "ruff" +version = "0.1.13" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.1.13-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:e3fd36e0d48aeac672aa850045e784673449ce619afc12823ea7868fcc41d8ba"}, + {file = "ruff-0.1.13-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:9fb6b3b86450d4ec6a6732f9f60c4406061b6851c4b29f944f8c9d91c3611c7a"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b13ba5d7156daaf3fd08b6b993360a96060500aca7e307d95ecbc5bb47a69296"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9ebb40442f7b531e136d334ef0851412410061e65d61ca8ce90d894a094feb22"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:226b517f42d59a543d6383cfe03cccf0091e3e0ed1b856c6824be03d2a75d3b6"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:5f0312ba1061e9b8c724e9a702d3c8621e3c6e6c2c9bd862550ab2951ac75c16"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2f59bcf5217c661254bd6bc42d65a6fd1a8b80c48763cb5c2293295babd945dd"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e6894b00495e00c27b6ba61af1fc666f17de6140345e5ef27dd6e08fb987259d"}, + {file = "ruff-0.1.13-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a1600942485c6e66119da294c6294856b5c86fd6df591ce293e4a4cc8e72989"}, + {file = "ruff-0.1.13-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:ee3febce7863e231a467f90e681d3d89210b900d49ce88723ce052c8761be8c7"}, + {file = "ruff-0.1.13-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:dcaab50e278ff497ee4d1fe69b29ca0a9a47cd954bb17963628fa417933c6eb1"}, + {file = "ruff-0.1.13-py3-none-musllinux_1_2_i686.whl", hash = "sha256:f57de973de4edef3ad3044d6a50c02ad9fc2dff0d88587f25f1a48e3f72edf5e"}, + {file = "ruff-0.1.13-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:7a36fa90eb12208272a858475ec43ac811ac37e91ef868759770b71bdabe27b6"}, + {file = "ruff-0.1.13-py3-none-win32.whl", hash = "sha256:a623349a505ff768dad6bd57087e2461be8db58305ebd5577bd0e98631f9ae69"}, + {file = "ruff-0.1.13-py3-none-win_amd64.whl", hash = "sha256:f988746e3c3982bea7f824c8fa318ce7f538c4dfefec99cd09c8770bd33e6539"}, + {file = "ruff-0.1.13-py3-none-win_arm64.whl", hash = "sha256:6bbbc3042075871ec17f28864808540a26f0f79a4478c357d3e3d2284e832998"}, + {file = "ruff-0.1.13.tar.gz", hash = "sha256:e261f1baed6291f434ffb1d5c6bd8051d1c2a26958072d38dfbec39b3dda7352"}, +] + +[[package]] +name = "send2trash" +version = "1.8.2" +description = "Send file to trash natively under Mac OS X, Windows and Linux" +optional = false +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,>=2.7" +files = [ + {file = "Send2Trash-1.8.2-py3-none-any.whl", hash = "sha256:a384719d99c07ce1eefd6905d2decb6f8b7ed054025bb0e618919f945de4f679"}, + {file = "Send2Trash-1.8.2.tar.gz", hash = "sha256:c132d59fa44b9ca2b1699af5c86f57ce9f4c5eb56629d5d55fbb7a35f84e2312"}, +] + +[package.extras] +nativelib = ["pyobjc-framework-Cocoa", "pywin32"] +objc = ["pyobjc-framework-Cocoa"] +win32 = ["pywin32"] + +[[package]] +name = "setuptools" +version = "69.0.3" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.0.3-py3-none-any.whl", hash = "sha256:385eb4edd9c9d5c17540511303e39a147ce2fc04bc55289c322b9e5904fe2c05"}, + {file = "setuptools-69.0.3.tar.gz", hash = "sha256:be1af57fc409f93647f2e8e4573a142ed38724b8cdd389706a867bb4efcf1e78"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-favicon", "sphinx-inline-tabs", "sphinx-lint", "sphinx-notfound-page (>=1,<2)", "sphinx-reredirects", "sphinxcontrib-towncrier"] +testing = ["build[virtualenv]", "filelock (>=3.4.0)", "flake8-2020", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "pip (>=19.1)", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-mypy (>=0.9.1)", "pytest-perf", "pytest-ruff", "pytest-timeout", "pytest-xdist", "tomli-w (>=1.0.0)", "virtualenv (>=13.0.0)", "wheel"] +testing-integration = ["build[virtualenv] (>=1.0.3)", "filelock (>=3.4.0)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "packaging (>=23.1)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[package]] +name = "sh" +version = "2.0.6" +description = "Python subprocess replacement" +optional = false +python-versions = ">=3.8.1,<4.0" +files = [ + {file = "sh-2.0.6-py3-none-any.whl", hash = "sha256:ced8f2e081a858b66a46ace3703dec243779abbd5a1887ba7e3c34f34da70cd2"}, + {file = "sh-2.0.6.tar.gz", hash = "sha256:9b2998f313f201c777e2c0061f0b1367497097ef13388595be147e2a00bf7ba1"}, +] + +[[package]] +name = "six" +version = "1.16.0" +description = "Python 2 and 3 compatibility utilities" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "six-1.16.0-py2.py3-none-any.whl", hash = "sha256:8abb2f1d86890a2dfb989f9a77cfcfd3e47c2a354b01111771326f8aa26e0254"}, + {file = "six-1.16.0.tar.gz", hash = "sha256:1e61c37477a1626458e36f7b1d82aa5c9b094fa4802892072e49de9c60c4c926"}, +] + +[[package]] +name = "smmap" +version = "5.0.1" +description = "A pure Python implementation of a sliding window memory map manager" +optional = false +python-versions = ">=3.7" +files = [ + {file = "smmap-5.0.1-py3-none-any.whl", hash = "sha256:e6d8668fa5f93e706934a62d7b4db19c8d9eb8cf2adbb75ef1b675aa332b69da"}, + {file = "smmap-5.0.1.tar.gz", hash = "sha256:dceeb6c0028fdb6734471eb07c0cd2aae706ccaecab45965ee83f11c8d3b1f62"}, +] + +[[package]] +name = "sniffio" +version = "1.3.0" +description = "Sniff out which async library your code is running under" +optional = false +python-versions = ">=3.7" +files = [ + {file = "sniffio-1.3.0-py3-none-any.whl", hash = "sha256:eecefdce1e5bbfb7ad2eeaabf7c1eeb404d7757c379bd1f7e5cce9d8bf425384"}, + {file = "sniffio-1.3.0.tar.gz", hash = "sha256:e60305c5e5d314f5389259b7f22aaa33d8f7dee49763119234af3755c55b9101"}, +] + +[[package]] +name = "soupsieve" +version = "2.5" +description = "A modern CSS selector implementation for Beautiful Soup." +optional = false +python-versions = ">=3.8" +files = [ + {file = "soupsieve-2.5-py3-none-any.whl", hash = "sha256:eaa337ff55a1579b6549dc679565eac1e3d000563bcb1c8ab0d0fefbc0c2cdc7"}, + {file = "soupsieve-2.5.tar.gz", hash = "sha256:5663d5a7b3bfaeee0bc4372e7fc48f9cff4940b3eec54a6451cc5299f1097690"}, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +description = "Extract data from python stack frames and tracebacks for informative displays" +optional = false +python-versions = "*" +files = [ + {file = "stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695"}, + {file = "stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9"}, +] + +[package.dependencies] +asttokens = ">=2.1.0" +executing = ">=1.2.0" +pure-eval = "*" + +[package.extras] +tests = ["cython", "littleutils", "pygments", "pytest", "typeguard"] + +[[package]] +name = "stevedore" +version = "5.1.0" +description = "Manage dynamic plugins for Python applications" +optional = false +python-versions = ">=3.8" +files = [ + {file = "stevedore-5.1.0-py3-none-any.whl", hash = "sha256:8cc040628f3cea5d7128f2e76cf486b2251a4e543c7b938f58d9a377f6694a2d"}, + {file = "stevedore-5.1.0.tar.gz", hash = "sha256:a54534acf9b89bc7ed264807013b505bf07f74dbe4bcfa37d32bd063870b087c"}, +] + +[package.dependencies] +pbr = ">=2.0.0,<2.1.0 || >2.1.0" + +[[package]] +name = "termcolor" +version = "2.4.0" +description = "ANSI color formatting for output in terminal" +optional = false +python-versions = ">=3.8" +files = [ + {file = "termcolor-2.4.0-py3-none-any.whl", hash = "sha256:9297c0df9c99445c2412e832e882a7884038a25617c60cea2ad69488d4040d63"}, + {file = "termcolor-2.4.0.tar.gz", hash = "sha256:aab9e56047c8ac41ed798fa36d892a37aca6b3e9159f3e0c24bc64a9b3ac7b7a"}, +] + +[package.extras] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "terminado" +version = "0.18.0" +description = "Tornado websocket backend for the Xterm.js Javascript terminal emulator library." +optional = false +python-versions = ">=3.8" +files = [ + {file = "terminado-0.18.0-py3-none-any.whl", hash = "sha256:87b0d96642d0fe5f5abd7783857b9cab167f221a39ff98e3b9619a788a3c0f2e"}, + {file = "terminado-0.18.0.tar.gz", hash = "sha256:1ea08a89b835dd1b8c0c900d92848147cef2537243361b2e3f4dc15df9b6fded"}, +] + +[package.dependencies] +ptyprocess = {version = "*", markers = "os_name != \"nt\""} +pywinpty = {version = ">=1.1.0", markers = "os_name == \"nt\""} +tornado = ">=6.1.0" + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["pre-commit", "pytest (>=7.0)", "pytest-timeout"] +typing = ["mypy (>=1.6,<2.0)", "traitlets (>=5.11.1)"] + +[[package]] +name = "tinycss2" +version = "1.2.1" +description = "A tiny CSS parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tinycss2-1.2.1-py3-none-any.whl", hash = "sha256:2b80a96d41e7c3914b8cda8bc7f705a4d9c49275616e886103dd839dfc847847"}, + {file = "tinycss2-1.2.1.tar.gz", hash = "sha256:8cff3a8f066c2ec677c06dbc7b45619804a6938478d9d73c284b29d14ecb0627"}, +] + +[package.dependencies] +webencodings = ">=0.4" + +[package.extras] +doc = ["sphinx", "sphinx_rtd_theme"] +test = ["flake8", "isort", "pytest"] + +[[package]] +name = "toml" +version = "0.10.2" +description = "Python Library for Tom's Obvious, Minimal Language" +optional = false +python-versions = ">=2.6, !=3.0.*, !=3.1.*, !=3.2.*" +files = [ + {file = "toml-0.10.2-py2.py3-none-any.whl", hash = "sha256:806143ae5bfb6a3c6e736a764057db0e6a0e05e338b5630894a5f779cabb4f9b"}, + {file = "toml-0.10.2.tar.gz", hash = "sha256:b3bda1d108d5dd99f4a20d24d9c348e91c4db7ab1b749200bded2f839ccbe68f"}, +] + +[[package]] +name = "tomli" +version = "2.0.1" +description = "A lil' TOML parser" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tomli-2.0.1-py3-none-any.whl", hash = "sha256:939de3e7a6161af0c887ef91b7d41a53e7c5a1ca976325f429cb46ea9bc30ecc"}, + {file = "tomli-2.0.1.tar.gz", hash = "sha256:de526c12914f0c550d15924c62d72abc48d6fe7364aa87328337a31007fe8a4f"}, +] + +[[package]] +name = "tornado" +version = "6.4" +description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." +optional = false +python-versions = ">= 3.8" +files = [ + {file = "tornado-6.4-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:02ccefc7d8211e5a7f9e8bc3f9e5b0ad6262ba2fbb683a6443ecc804e5224ce0"}, + {file = "tornado-6.4-cp38-abi3-macosx_10_9_x86_64.whl", hash = "sha256:27787de946a9cffd63ce5814c33f734c627a87072ec7eed71f7fc4417bb16263"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f7894c581ecdcf91666a0912f18ce5e757213999e183ebfc2c3fdbf4d5bd764e"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e43bc2e5370a6a8e413e1e1cd0c91bedc5bd62a74a532371042a18ef19e10579"}, + {file = "tornado-6.4-cp38-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f0251554cdd50b4b44362f73ad5ba7126fc5b2c2895cc62b14a1c2d7ea32f212"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:fd03192e287fbd0899dd8f81c6fb9cbbc69194d2074b38f384cb6fa72b80e9c2"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_i686.whl", hash = "sha256:88b84956273fbd73420e6d4b8d5ccbe913c65d31351b4c004ae362eba06e1f78"}, + {file = "tornado-6.4-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:71ddfc23a0e03ef2df1c1397d859868d158c8276a0603b96cf86892bff58149f"}, + {file = "tornado-6.4-cp38-abi3-win32.whl", hash = "sha256:6f8a6c77900f5ae93d8b4ae1196472d0ccc2775cc1dfdc9e7727889145c45052"}, + {file = "tornado-6.4-cp38-abi3-win_amd64.whl", hash = "sha256:10aeaa8006333433da48dec9fe417877f8bcc21f48dda8d661ae79da357b2a63"}, + {file = "tornado-6.4.tar.gz", hash = "sha256:72291fa6e6bc84e626589f1c29d90a5a6d593ef5ae68052ee2ef000dfd273dee"}, +] + +[[package]] +name = "traitlets" +version = "5.14.1" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.1-py3-none-any.whl", hash = "sha256:2e5a030e6eff91737c643231bfcf04a65b0132078dad75e4936700b213652e74"}, + {file = "traitlets-5.14.1.tar.gz", hash = "sha256:8585105b371a04b8316a43d5ce29c098575c2e477850b62b848b964f1444527e"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<7.5)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typer" +version = "0.9.0" +description = "Typer, build great CLIs. Easy to code. Based on Python type hints." +optional = false +python-versions = ">=3.6" +files = [ + {file = "typer-0.9.0-py3-none-any.whl", hash = "sha256:5d96d986a21493606a358cae4461bd8cdf83cbf33a5aa950ae629ca3b51467ee"}, + {file = "typer-0.9.0.tar.gz", hash = "sha256:50922fd79aea2f4751a8e0408ff10d2662bd0c8bbfa84755a699f3bada2978b2"}, +] + +[package.dependencies] +click = ">=7.1.1,<9.0.0" +typing-extensions = ">=3.7.4.3" + +[package.extras] +all = ["colorama (>=0.4.3,<0.5.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] +dev = ["autoflake (>=1.3.1,<2.0.0)", "flake8 (>=3.8.3,<4.0.0)", "pre-commit (>=2.17.0,<3.0.0)"] +doc = ["cairosvg (>=2.5.2,<3.0.0)", "mdx-include (>=1.4.1,<2.0.0)", "mkdocs (>=1.1.2,<2.0.0)", "mkdocs-material (>=8.1.4,<9.0.0)", "pillow (>=9.3.0,<10.0.0)"] +test = ["black (>=22.3.0,<23.0.0)", "coverage (>=6.2,<7.0)", "isort (>=5.0.6,<6.0.0)", "mypy (==0.910)", "pytest (>=4.4.0,<8.0.0)", "pytest-cov (>=2.10.0,<5.0.0)", "pytest-sugar (>=0.9.4,<0.10.0)", "pytest-xdist (>=1.32.0,<4.0.0)", "rich (>=10.11.0,<14.0.0)", "shellingham (>=1.3.0,<2.0.0)"] + +[[package]] +name = "types-python-dateutil" +version = "2.8.19.20240106" +description = "Typing stubs for python-dateutil" +optional = false +python-versions = ">=3.8" +files = [ + {file = "types-python-dateutil-2.8.19.20240106.tar.gz", hash = "sha256:1f8db221c3b98e6ca02ea83a58371b22c374f42ae5bbdf186db9c9a76581459f"}, + {file = "types_python_dateutil-2.8.19.20240106-py3-none-any.whl", hash = "sha256:efbbdc54590d0f16152fa103c9879c7d4a00e82078f6e2cf01769042165acaa2"}, +] + +[[package]] +name = "typing-extensions" +version = "4.9.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.9.0-py3-none-any.whl", hash = "sha256:af72aea155e91adfc61c3ae9e0e342dbc0cba726d6cba4b6c72c1f34e47291cd"}, + {file = "typing_extensions-4.9.0.tar.gz", hash = "sha256:23478f88c37f27d76ac8aee6c905017a143b0b1b886c3c9f66bc2fd94f9f5783"}, +] + +[[package]] +name = "uri-template" +version = "1.3.0" +description = "RFC 6570 URI Template Processor" +optional = false +python-versions = ">=3.7" +files = [ + {file = "uri-template-1.3.0.tar.gz", hash = "sha256:0e00f8eb65e18c7de20d595a14336e9f337ead580c70934141624b6d1ffdacc7"}, + {file = "uri_template-1.3.0-py3-none-any.whl", hash = "sha256:a44a133ea12d44a0c0f06d7d42a52d71282e77e2f937d8abd5655b8d56fc1363"}, +] + +[package.extras] +dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake8-commas", "flake8-comprehensions", "flake8-continuation", "flake8-datetimez", "flake8-docstrings", "flake8-import-order", "flake8-literal", "flake8-modern-annotations", "flake8-noqa", "flake8-pyproject", "flake8-requirements", "flake8-typechecking-import", "flake8-use-fstring", "mypy", "pep8-naming", "types-PyYAML"] + +[[package]] +name = "urllib3" +version = "2.1.0" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.1.0-py3-none-any.whl", hash = "sha256:55901e917a5896a349ff771be919f8bd99aff50b79fe58fec595eb37bbc56bb3"}, + {file = "urllib3-2.1.0.tar.gz", hash = "sha256:df7aa8afb0148fa78488e7899b2c59b5f4ffcfa82e6c54ccb9dd37c1d7b52d54"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "virtualenv" +version = "20.25.0" +description = "Virtual Python Environment builder" +optional = false +python-versions = ">=3.7" +files = [ + {file = "virtualenv-20.25.0-py3-none-any.whl", hash = "sha256:4238949c5ffe6876362d9c0180fc6c3a824a7b12b80604eeb8085f2ed7460de3"}, + {file = "virtualenv-20.25.0.tar.gz", hash = "sha256:bf51c0d9c7dd63ea8e44086fa1e4fb1093a31e963b86959257378aef020e1f1b"}, +] + +[package.dependencies] +distlib = ">=0.3.7,<1" +filelock = ">=3.12.2,<4" +platformdirs = ">=3.9.1,<5" + +[package.extras] +docs = ["furo (>=2023.7.26)", "proselint (>=0.13)", "sphinx (>=7.1.2)", "sphinx-argparse (>=0.4)", "sphinxcontrib-towncrier (>=0.2.1a0)", "towncrier (>=23.6)"] +test = ["covdefaults (>=2.3)", "coverage (>=7.2.7)", "coverage-enable-subprocess (>=1)", "flaky (>=3.7)", "packaging (>=23.1)", "pytest (>=7.4)", "pytest-env (>=0.8.2)", "pytest-freezer (>=0.4.8)", "pytest-mock (>=3.11.1)", "pytest-randomly (>=3.12)", "pytest-timeout (>=2.1)", "setuptools (>=68)", "time-machine (>=2.10)"] + +[[package]] +name = "vulture" +version = "2.10" +description = "Find dead code" +optional = false +python-versions = ">=3.8" +files = [ + {file = "vulture-2.10-py2.py3-none-any.whl", hash = "sha256:568a4176db7468d0157817ae3bb1847a19f1ddc629849af487f9d3b279bff77d"}, + {file = "vulture-2.10.tar.gz", hash = "sha256:2a5c3160bffba77595b6e6dfcc412016bd2a09cd4b66cdf7fbba913684899f6f"}, +] + +[package.dependencies] +toml = "*" + +[[package]] +name = "watchdog" +version = "3.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.7" +files = [ + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:336adfc6f5cc4e037d52db31194f7581ff744b67382eb6021c868322e32eef41"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:a70a8dcde91be523c35b2bf96196edc5730edb347e374c7de7cd20c43ed95397"}, + {file = "watchdog-3.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:adfdeab2da79ea2f76f87eb42a3ab1966a5313e5a69a0213a3cc06ef692b0e96"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b57a1e730af3156d13b7fdddfc23dea6487fceca29fc75c5a868beed29177ae"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ade88d0d778b1b222adebcc0927428f883db07017618a5e684fd03b83342bd9"}, + {file = "watchdog-3.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7e447d172af52ad204d19982739aa2346245cc5ba6f579d16dac4bfec226d2e7"}, + {file = "watchdog-3.0.0-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:9fac43a7466eb73e64a9940ac9ed6369baa39b3bf221ae23493a9ec4d0022674"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:8ae9cda41fa114e28faf86cb137d751a17ffd0316d1c34ccf2235e8a84365c7f"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f70b4aa53bd743729c7475d7ec41093a580528b100e9a8c5b5efe8899592fc"}, + {file = "watchdog-3.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:4f94069eb16657d2c6faada4624c39464f65c05606af50bb7902e036e3219be3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7c5f84b5194c24dd573fa6472685b2a27cc5a17fe5f7b6fd40345378ca6812e3"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:3aa7f6a12e831ddfe78cdd4f8996af9cf334fd6346531b16cec61c3b3c0d8da0"}, + {file = "watchdog-3.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:233b5817932685d39a7896b1090353fc8efc1ef99c9c054e46c8002561252fb8"}, + {file = "watchdog-3.0.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:13bbbb462ee42ec3c5723e1205be8ced776f05b100e4737518c67c8325cf6100"}, + {file = "watchdog-3.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:8f3ceecd20d71067c7fd4c9e832d4e22584318983cabc013dbf3f70ea95de346"}, + {file = "watchdog-3.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:c9d8c8ec7efb887333cf71e328e39cffbf771d8f8f95d308ea4125bf5f90ba64"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:0e06ab8858a76e1219e68c7573dfeba9dd1c0219476c5a44d5333b01d7e1743a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:d00e6be486affb5781468457b21a6cbe848c33ef43f9ea4a73b4882e5f188a44"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:c07253088265c363d1ddf4b3cdb808d59a0468ecd017770ed716991620b8f77a"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:5113334cf8cf0ac8cd45e1f8309a603291b614191c9add34d33075727a967709"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:51f90f73b4697bac9c9a78394c3acbbd331ccd3655c11be1a15ae6fe289a8c83"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:ba07e92756c97e3aca0912b5cbc4e5ad802f4557212788e72a72a47ff376950d"}, + {file = "watchdog-3.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:d429c2430c93b7903914e4db9a966c7f2b068dd2ebdd2fa9b9ce094c7d459f33"}, + {file = "watchdog-3.0.0-py3-none-win32.whl", hash = "sha256:3ed7c71a9dccfe838c2f0b6314ed0d9b22e77d268c67e015450a29036a81f60f"}, + {file = "watchdog-3.0.0-py3-none-win_amd64.whl", hash = "sha256:4c9956d27be0bb08fc5f30d9d0179a855436e655f046d288e2bcc11adfae893c"}, + {file = "watchdog-3.0.0-py3-none-win_ia64.whl", hash = "sha256:5d9f3a10e02d7371cd929b5d8f11e87d4bad890212ed3901f9b4d68767bee759"}, + {file = "watchdog-3.0.0.tar.gz", hash = "sha256:4d98a320595da7a7c5a18fc48cb633c2e73cda78f93cac2ef42d42bf609a33f9"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcwidth" +version = "0.2.13" +description = "Measures the displayed width of unicode strings in a terminal" +optional = false +python-versions = "*" +files = [ + {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, + {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, +] + +[[package]] +name = "webcolors" +version = "1.13" +description = "A library for working with the color formats defined by HTML and CSS." +optional = false +python-versions = ">=3.7" +files = [ + {file = "webcolors-1.13-py3-none-any.whl", hash = "sha256:29bc7e8752c0a1bd4a1f03c14d6e6a72e93d82193738fa860cbff59d0fcc11bf"}, + {file = "webcolors-1.13.tar.gz", hash = "sha256:c225b674c83fa923be93d235330ce0300373d02885cef23238813b0d5668304a"}, +] + +[package.extras] +docs = ["furo", "sphinx", "sphinx-copybutton", "sphinx-inline-tabs", "sphinx-notfound-page", "sphinxext-opengraph"] +tests = ["pytest", "pytest-cov"] + +[[package]] +name = "webencodings" +version = "0.5.1" +description = "Character encoding aliases for legacy web content" +optional = false +python-versions = "*" +files = [ + {file = "webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78"}, + {file = "webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923"}, +] + +[[package]] +name = "websocket-client" +version = "1.7.0" +description = "WebSocket client for Python with low level API options" +optional = false +python-versions = ">=3.8" +files = [ + {file = "websocket-client-1.7.0.tar.gz", hash = "sha256:10e511ea3a8c744631d3bd77e61eb17ed09304c413ad42cf6ddfa4c7787e8fe6"}, + {file = "websocket_client-1.7.0-py3-none-any.whl", hash = "sha256:f4c3d22fec12a2461427a29957ff07d35098ee2d976d3ba244e688b8b4057588"}, +] + +[package.extras] +docs = ["Sphinx (>=6.0)", "sphinx-rtd-theme (>=1.1.0)"] +optional = ["python-socks", "wsaccel"] +test = ["websockets"] + +[[package]] +name = "xonsh" +version = "0.14.0" +description = "Python-powered, cross-platform, Unix-gazing shell" +optional = false +python-versions = ">=3.8" +files = [ + {file = "xonsh-0.14.0-py310-none-any.whl", hash = "sha256:72506c6dc494103df6d04467e127abddb1c6cbe05cc5903b6a4cbfbad217ff5d"}, + {file = "xonsh-0.14.0-py311-none-any.whl", hash = "sha256:678a65671bd0a62cdc43e932d6aecc8b1622aa18942e0afb388b8b8ae02f67a5"}, + {file = "xonsh-0.14.0-py38-none-any.whl", hash = "sha256:25976edc5695fb5806b8b23f384ff48e618e07f4596ec0806007f63122917a83"}, + {file = "xonsh-0.14.0-py39-none-any.whl", hash = "sha256:751b615726d2322d43c8166ad4bc5cbe65d03a3728f1837aa02380fa9fadb189"}, + {file = "xonsh-0.14.0.tar.gz", hash = "sha256:45a8aaabb17ce0d6d4eca9b709ecfd7ce1c8fb92162decd29a45bf88a60e9bf1"}, +] + +[package.extras] +bestshell = ["prompt-toolkit (>=3.0.29)", "pygments (>=2.2)"] +dev = ["pre-commit", "re-ver", "tomli", "xonsh[doc,test]"] +doc = ["doctr", "furo", "livereload", "matplotlib", "myst-parser", "numpydoc", "psutil", "pyzmq", "runthis-sphinxext", "sphinx (>=3.1,<5)", "tornado", "xonsh[bestshell]"] +full = ["distro", "gnureadline", "setproctitle", "ujson", "xonsh[ptk,pygments]"] +linux = ["distro"] +mac = ["gnureadline"] +proctitle = ["setproctitle"] +ptk = ["prompt-toolkit (>=3.0.29)", "pyperclip"] +pygments = ["pygments (>=2.2)"] +test = ["coverage (>=5.3.1)", "prompt-toolkit (>=3.0.29)", "pygments (>=2.2)", "pyte (>=0.8.0)", "pytest (>=7)", "pytest-cov", "pytest-mock", "pytest-rerunfailures", "pytest-subprocess", "pytest-timeout", "restructuredtext-lint", "virtualenv (>=20.16.2)", "xonsh[bestshell]"] + +[[package]] +name = "zipp" +version = "3.17.0" +description = "Backport of pathlib-compatible object wrapper for zip files" +optional = false +python-versions = ">=3.8" +files = [ + {file = "zipp-3.17.0-py3-none-any.whl", hash = "sha256:0e923e726174922dce09c53c59ad483ff7bbb8e572e00c7f7c46b88556409f31"}, + {file = "zipp-3.17.0.tar.gz", hash = "sha256:84e64a1c28cf7e91ed2078bb8cc8c259cb19b76942096c8d7b84947690cabaf0"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "rst.linker (>=1.9)", "sphinx (<7.2.5)", "sphinx (>=3.5)", "sphinx-lint"] +testing = ["big-O", "jaraco.functools", "jaraco.itertools", "more-itertools", "pytest (>=6)", "pytest-black (>=0.3.7)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-ignore-flaky", "pytest-mypy (>=0.9.1)", "pytest-ruff"] + +[metadata] +lock-version = "2.0" +python-versions = ">=3.8.1,<4" +content-hash = "66e582f80e082bbb3e21bd0ce8e8066387d20ce731445dca63175a173f80d90c" diff --git a/pyproject.toml b/pyproject.toml index c8ef6a7..691e1aa 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,5 +1,110 @@ -[tool.black] +[tool.poetry] +name = "pyuml" +version = "0.1.0" +description = "Tool for creating UML from project files" +authors = ["Ivan Ogasawara "] +license = "BSD-3-Clause" +readme = "README.md" +exclude = [ + ".git/*", + ".env*", +] +packages = [ + {include = "pyuml", from="src"}, +] +include = ["src/pyuml/py.typed"] + +[tool.poetry.scripts] +"pyuml" = "pyuml.__main__:app" + +[tool.poetry.dependencies] +python = ">=3.8.1,<4" +graphviz = ">=0.20.1" +atpublic = ">=4.0" +typing-extensions = { version = ">=4", python = "<3.9" } +typer = ">=0.9.0" + +[tool.poetry.group.dev.dependencies] +pytest = ">=7.3.2" +pytest-cov = ">=4.1.0" +coverage = ">=7.2.7" +pre-commit = ">=3.3.2" +ruff = ">=0.1.5" +mypy = ">=1.6.0" +bandit = ">=1.7.5" +vulture = ">=2.9.1" +mccabe = ">=0.6.1" +ipykernel = ">=6.0.0" +ipython = ">=7.0.0" +mkdocs = ">=1.4.3" +mkdocs-exclude = ">=1.0.2" +mkdocs-jupyter = ">=0.24.1" +mkdocs-literate-nav = ">=0.6.0" +mkdocs-macros-plugin = ">=0.7.0,<1" +mkdocs-material = ">=9.1.15" +mkdocstrings = ">=0.21.2" +mkdocstrings-python = ">=1.1.2" +jupyterlab = ">=4.0.5" +makim = "1.10.0" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" + + +[tool.pytest.ini_options] +testpaths = [ + "tests", +] + +[tool.bandit] +exclude_dirs = ["tests"] +targets = "./" + +[tool.vulture] +exclude = ["tests"] +ignore_decorators = ["@abc.abstractmethod"] +ignore_names = [] +make_whitelist = true +min_confidence = 80 +paths = ["./"] +sort_by_size = true +verbose = false + +[tool.ruff] line-length = 79 -skip-string-normalization = true -target-version = ["py36", "py37", "py38"] +force-exclude = true +src = ["./"] +ignore = ["PLR0913"] +exclude = [ + 'docs', +] +select = [ + "E", # pycodestyle + "F", # pyflakes + "D", # pydocstyle + "YTT", # flake8-2020 + "PL", # PL + "RUF", # Ruff-specific rules + "I001", # isort +] +fix = true + +[tool.ruff.pydocstyle] +convention = "numpy" + +[tool.ruff.isort] +# Use a single line between direct and from import +lines-between-types = 1 + +[tool.ruff.format] +quote-style = "single" +[tool.mypy] +python_version = "3.8" +check_untyped_defs = true +strict = true +ignore_missing_imports = true +warn_unused_ignores = true +warn_redundant_casts = true +warn_unused_configs = true diff --git a/pyuml/__init__.py b/pyuml/__init__.py deleted file mode 100644 index 09b24a0..0000000 --- a/pyuml/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# -*- coding: utf-8 -*- - -"""Top-level package for PyUML.""" - -__author__ = """Ivan Ogasawara""" -__email__ = 'ivan.ogasawara@gmail.com' -__version__ = '0.1.0' diff --git a/pyuml/class_graph.py b/pyuml/class_graph.py deleted file mode 100644 index 2454ce4..0000000 --- a/pyuml/class_graph.py +++ /dev/null @@ -1,192 +0,0 @@ -import dataclasses -import glob -import importlib.util -import inspect -import os -import sys -import types - -import graphviz as gv - - -def _get_fullname(entity): - return '{}.{}'.format(entity.__module__, entity.__name__) - - -def _get_methods(entity) -> list: - return [ - k - for k, v in entity.__dict__.items() - if not k.startswith('__') and isinstance(v, types.FunctionType) - ] - - -def _get_dataclass_structure(klass): - result = {'fields': {}, 'methods': _get_methods(klass)} - - result['fields'].update( - {k: v.type.__name__ for k, v in klass.__dataclass_fields__.items()} - ) - return result - - -def _get_base_classes(klass): - return [ - c - for c in klass.__mro__ - if c.__name__ != 'object' and c.__name__ != klass.__name__ - ] - - -def _get_annotations(klass): - return getattr(klass, '__annotations__', {}) - - -def _get_classicclass_structure(klass): - _methods = _get_methods(klass) - - result = { - 'fields': { - k: _get_annotations(klass).get(k, object).__name__ - for k in klass.__dict__.keys() - if not k.startswith('__') and k not in _methods - }, - 'methods': _methods, - } - return result - - -def _get_class_structure(klass): - if dataclasses.is_dataclass(klass): - return _get_dataclass_structure(klass) - elif inspect.isclass(klass): - return _get_classicclass_structure(klass) - - -def _get_entity_class_html(entity): - class_template = '''< - - - - - - - - - -
{}
- - {} -
-
- - {} -
-
>''' - - class_name_template = ( - '
{}.{} {}
' - ) - row_key_value_template = '{}: {}' - row_key_template = '{}' - - empty_row = '' - base_classes = ', '.join( - [_get_fullname(c) for c in _get_base_classes(entity)] - ) - - if base_classes != '': - base_classes = '({})'.format(base_classes) - - class_structure = _get_class_structure(entity) - - class_name = class_name_template.format( - entity.__module__, entity.__qualname__, base_classes - ) - attributes = ''.join( - [ - row_key_value_template.format(k, v) - for k, v in class_structure['fields'].items() - ] - ) - - methods = ''.join( - [row_key_template.format(k) for k in class_structure['methods']] - ) - - return class_template.format( - class_name, - attributes if attributes else empty_row, - methods if methods else empty_row, - ) - - -def _search_modules(target: str, exclude_pattern=['__pycache__']) -> list: - results = [] - for f in glob.glob('{}/**/*'.format(target), recursive=True): - skip = False - for x in exclude_pattern: - if x in f: - skip = True - break - if not skip and f.endswith('.py'): - results.append(f) - return results - - -def _extract_filename(filename: str) -> str: - return filename.split(os.sep)[-1].split('.')[0] - - -def _get_classes_from_module(module_path: str) -> list: - spec = importlib.util.spec_from_file_location( - _extract_filename(module_path), module_path - ) - module = importlib.util.module_from_spec(spec) - - classes_list = [] - - try: - spec.loader.exec_module(module) # type: ignore - for o in module.__dir__(): - if o.startswith('__'): - continue - klass = getattr(module, o) - if inspect.isclass(klass): - classes_list.append(klass) - except Exception as e: - print(' {} '.format(module_path).center(80, '=')) - print(e) - print('.' * 80) - return classes_list - - -def create_class_diagram(classes_list: list, verbose: bool = False): - g = gv.Digraph(comment='Graph') - g.attr('node', shape='none', rankdir='BT') - - edges = [] - for c in classes_list: - g.node(_get_fullname(c), _get_entity_class_html(c)) - - for b in _get_base_classes(c): - edges.append((_get_fullname(b), _get_fullname(c))) - - if verbose: - print('[II]', _get_fullname(c), '- included.') - - g.edges(edges) - return g - - -def create_class_diagram_from_source(source: str, verbose: bool = False): - classes_list = [] - - if not os.path.exists(source): - raise Exception('Path "{}" doesn\'t exist.'.format(source)) - if os.path.isdir(source): - sys.path.insert(0, source) - - for f in _search_modules(source): - classes_list.extend(_get_classes_from_module(f)) - return create_class_diagram(classes_list, verbose=verbose) diff --git a/pyuml/pyuml.py b/pyuml/pyuml.py deleted file mode 100644 index 82b82fd..0000000 --- a/pyuml/pyuml.py +++ /dev/null @@ -1,53 +0,0 @@ -"""Main module template with example functions.""" -import argparse - -from pyuml import class_graph - - -def main(): - p = argparse.ArgumentParser() - p.add_argument( - '--class-diagram', - dest='is_class_diagram', - action='store_true', - help='Generate a class diagram from a target.', - ) - p.add_argument( - '--target', - dest='target', - type=str, - help='Specify the target directory/file', - ) - p.add_argument( - '--source', - dest='source', - type=str, - help='Specify the source directory/file', - ) - p.add_argument( - '--verbose', - dest='verbose', - action='store_true', - help='Print internal messages', - ) - ns = p.parse_args() - - if ns.is_class_diagram: - if not ns.target: - raise Exception( - '`target` parameter is required to generate the class diagram.' - ) - if not ns.source: - raise Exception( - '`source` parameter is required to generate the class diagram.' - ) - - g = class_graph.create_class_diagram_from_source( - ns.source, verbose=ns.verbose - ) - g.format = 'png' - g.render(ns.target) - - -if __name__ == '__main__': - main() diff --git a/requirements_dev.txt b/requirements_dev.txt deleted file mode 100644 index d196eea..0000000 --- a/requirements_dev.txt +++ /dev/null @@ -1,12 +0,0 @@ -pip==18.1 -bumpversion==0.5.3 -wheel==0.32.1 -watchdog==0.9.0 -flake8==3.5.0 -tox==3.5.2 -coverage==4.5.1 -Sphinx==1.8.1 -twine==1.12.1 -pytest==3.8.2 -pytest-runner==4.2 -pytest-cov==2.6.1 diff --git a/setup.cfg b/setup.cfg deleted file mode 100644 index 0ac0177..0000000 --- a/setup.cfg +++ /dev/null @@ -1,34 +0,0 @@ -[bdist_wheel] -universal = 1 - -[aliases] -# Define setup.py command aliases here -test = pytest - -[flake8] -ignore = D202,D203,W503,E203 -max-line-length = 79 -exclude = tests,build,dist,docs,.git,__pycache__,.tox,.eggs,*.egg,.asv -docstring-convention=numpy - -[mypy] -ignore_missing_imports = True -strict_optional = True -files = pyuml/ - -[pydocstyle] -inherit = false -convention = numpy -match = (?!test_|conftest).*\.py -match-dir = pyuml/* - -[isort] -known_third_party = class_a,graphviz,setuptools -ensure_newline_before_comments=true -line_length = 79 -multi_line_output = 3 -include_trailing_comma = true - -[tool:pytest] -collect_ignore = ['setup.py'] - diff --git a/setup.py b/setup.py deleted file mode 100644 index f805249..0000000 --- a/setup.py +++ /dev/null @@ -1,55 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -"""The setup script.""" - -from setuptools import find_packages, setup - -with open('README.rst') as readme_file: - readme = readme_file.read() - -with open('HISTORY.rst') as history_file: - history = history_file.read() - -requirements = [] - -setup_requirements = [ - 'pytest-runner', -] - -test_requirements = [ - 'pytest', -] - -setup( - author="Ivan Ogasawara", - author_email='ivan.ogasawara@gmail.com', - classifiers=[ - 'Development Status :: 2 - Pre-Alpha', - 'Intended Audience :: Developers', - 'License :: OSI Approved :: Apache Software License', - 'Natural Language :: English', - "Programming Language :: Python :: 2", - 'Programming Language :: Python :: 2.7', - 'Programming Language :: Python :: 3', - 'Programming Language :: Python :: 3.4', - 'Programming Language :: Python :: 3.5', - 'Programming Language :: Python :: 3.6', - 'Programming Language :: Python :: 3.7', - ], - description="Python tools for UML", - install_requires=requirements, - license="Apache Software License 2.0", - long_description=readme + '\n\n' + history, - include_package_data=True, - keywords='pyuml', - name='pyuml', - packages=find_packages(include=['pyuml', 'class_graph']), - setup_requires=setup_requirements, - test_suite='tests', - tests_require=test_requirements, - url='https://github.com/xmnlab/pyuml', - version='0.1.0', - zip_safe=False, - entry_points={'console_scripts': ['pyuml = pyuml.pyuml:main']}, -) diff --git a/src/pyuml/__init__.py b/src/pyuml/__init__.py new file mode 100644 index 0000000..e1f2e1b --- /dev/null +++ b/src/pyuml/__init__.py @@ -0,0 +1,19 @@ +"""Top-level package for PyUML.""" +# mypy: disable-error-code="attr-defined" + +from importlib import metadata as importlib_metadata + + +def get_version() -> str: + """Return the program version.""" + try: + return importlib_metadata.version(__name__) + except importlib_metadata.PackageNotFoundError: # pragma: no cover + return '0.1.0' # semantic-release + + +version = get_version() + +__version__ = version +__author__ = 'Ivan Ogasawara' +__email__ = 'ivan.ogasawara@gmail.com' diff --git a/src/pyuml/__main__.py b/src/pyuml/__main__.py new file mode 100644 index 0000000..ae68795 --- /dev/null +++ b/src/pyuml/__main__.py @@ -0,0 +1,5 @@ +"""The definition of the action for `python -m` command.""" +from pyuml.cli import app + +if __name__ == '__main__': + app() diff --git a/src/pyuml/class_graph.py b/src/pyuml/class_graph.py new file mode 100644 index 0000000..64e5388 --- /dev/null +++ b/src/pyuml/class_graph.py @@ -0,0 +1,304 @@ +"""Create graphviz for classes.""" +from __future__ import annotations + +import copy +import dataclasses +import glob +import importlib.util +import inspect +import os +import sys +import types + +from pathlib import Path +from typing import Any, Type, Union, cast + +import graphviz as gv +import typer + + +def raise_error(message: str, exit_code: int = 1) -> None: + """Raise an error using typer.""" + red_text = typer.style(message, fg=typer.colors.RED, bold=True) + typer.echo(red_text, err=True, color=True) + raise typer.Exit(exit_code) + + +def _get_fullname(entity: Type[Any]) -> str: + """ + Get the fully qualified name of a given entity. + + Parameters + ---------- + entity : types.ModuleType + The entity for which the full name is required. + + Returns + ------- + str + Fully qualified name of the entity. + """ + return f'{entity.__module__}.{entity.__name__}' + + +def _get_methods(entity: Type[Any]) -> list[str]: + """ + Return a list of methods of a given entity. + + Parameters + ---------- + entity : types.ModuleType + The entity whose methods are to be extracted. + + Returns + ------- + list + A list of method names. + """ + return [ + k + for k, v in entity.__dict__.items() + if not k.startswith('__') and isinstance(v, types.FunctionType) + ] + + +def _get_dataclass_structure( + klass: Type[Any], +) -> dict[str, Union[dict[str, str], list[str]]]: + fields = { + k: v.type.__name__ for k, v in klass.__dataclass_fields__.items() + } + return {'fields': fields, 'methods': _get_methods(klass)} + + +def _get_base_classes(klass: Type[Any]) -> list[Type[Any]]: + return [ + c + for c in klass.__mro__ + if c.__name__ not in ('object', klass.__name__) + ] + + +def _get_annotations(klass: Type[Any]) -> dict[str, Any]: + return getattr(klass, '__annotations__', {}) + + +def _get_classicclass_structure( + klass: Type[Any], +) -> dict[str, Union[dict[str, str], list[str]]]: + _methods = _get_methods(klass) + + return { + 'fields': { + k: _get_annotations(klass).get(k, object).__name__ + for k in list(klass.__dict__.keys()) + if not k.startswith('__') and k not in _methods + }, + 'methods': _methods, + } + + +def _get_class_structure( + klass: Type[Any], +) -> dict[str, Union[dict[str, str], list[str]]]: + if dataclasses.is_dataclass(klass): + return _get_dataclass_structure(klass) + elif inspect.isclass(klass): + return _get_classicclass_structure(klass) + + raise Exception('The given class is not actually a class.') + + +def _get_entity_class_uml(entity: Type[Any]) -> str: + """ + Generate the UML node representation for a given class entity. + + Parameters + ---------- + entity : type + The class entity to be represented in UML. + + Returns + ------- + str + A string representation of the class in UML node format. + """ + # Extract base classes, class structure, and format the class name + base_classes = ', '.join( + [_get_fullname(c) for c in _get_base_classes(entity)] + ) + class_structure = _get_class_structure(entity) + class_name = f'{entity.__name__}' + + if base_classes: + class_name += f' : {base_classes}' + + # Formatting fields and methods + fields_struct = cast(dict[str, str], class_structure['fields']) + fields = ( + '\\l'.join([f'+ {k}: {v}' for k, v in fields_struct.items()]) + '\\l' + ) + methods_struct = cast(list[str], class_structure['methods']) + methods = '\\l'.join([f'+ {m}()' for m in methods_struct]) + '\\l' + + # Combine class name, fields, and methods into the UML node format + uml_representation = '{' + f'{class_name}|{fields}|{methods}' + '}' + return uml_representation + + +def _search_modules( + target: str, exclude_pattern: list[str] = ['__pycache__'] +) -> list[str]: + """ + Search for Python modules in a given path, excluding specified patterns. + + Parameters + ---------- + target : str + Target directory to search for modules. + exclude_pattern : list, optional + Patterns to exclude from the search, by default ['__pycache__']. + + Returns + ------- + list + A list of module file paths. + """ + results = [] + for f in glob.glob('{}/**/*'.format(target), recursive=True): + skip = False + for x in exclude_pattern: + if x in f: + skip = True + break + if not skip and f.endswith('.py'): + results.append(f) + + return results + + +def _extract_filename(filename: str) -> str: + return filename.split(os.sep)[-1].split('.')[0] + + +def _extract_module_name(module_path: str) -> tuple[str, str]: + """ + Extract the module name from its file path. + + Parameters + ---------- + module_path : str + The file path of the module. + + Returns + ------- + tuple[str, str] + Returns the module path and the module name. + """ + # Extract the module name from the path. + # This needs to be adapted depending on your project's structure. + # Example: 'path/to/module.py' -> 'path.to.module' + module_split = module_path.split(os.sep) + module_path = os.sep.join(module_split[:-1]) + module_filename = module_split[-1] + module_name = module_filename.rstrip('.py') + return module_path, module_name + + +def _get_classes_from_module(module_path: str) -> list[Type[Any]]: + """ + Extract classes from a given module path using importlib.import_module. + + Parameters + ---------- + module_path : str + The path to the module from which classes are to be extracted. + + Returns + ------- + list + A list of class objects. + """ + module_path, module_name = _extract_module_name(module_path) + original_path = copy.deepcopy(sys.path) + try: + sys.path.insert(0, module_path) + module = importlib.import_module(module_name) + sys.path = original_path + classes_list = [ + getattr(module, o) + for o in dir(module) + if inspect.isclass(getattr(module, o)) and not o.startswith('__') + ] + return classes_list + except KeyboardInterrupt: + raise_error('KeyboardInterrupt', 1) + except Exception as e: + print(f' Error loading module {module_name} '.center(80, '=')) + print(e) + print('.' * 80) + return [] + return classes_list + + +def create_class_diagram( + classes_list: list[Type[Any]], + verbose: bool = False, +) -> gv.Digraph: + """Create a diagram for a list of classes.""" + g = gv.Digraph(comment='Graph') + g.attr('node', shape='record', rankdir='BT') + + edges = [] + for c in classes_list: + g.node(_get_fullname(c), _get_entity_class_uml(c)) + + for b in _get_base_classes(c): + edges.append((_get_fullname(b), _get_fullname(c))) + + if verbose: + print('[II]', _get_fullname(c), '- included.') + + g.edges(set(edges)) + return g + + +def create_class_diagram_from_source( + source: Path, verbose: bool = False +) -> gv.Digraph: + """ + Create a class diagram from the source code located at the specified path. + + Parameters + ---------- + source : Path + The path to the source code. + verbose : bool, optional + Flag to enable verbose logging, by default False. + + Returns + ------- + gv.Digraph + Graphviz Digraph object representing the class diagram. + + Raises + ------ + FileNotFoundError + If the provided path does not exist. + ValueError + If the provided path is not a directory. + """ + classes_list = [] + + path_str = str(source) + + if not os.path.exists(path_str): + raise_error(f'Path "{path_str}" doesn\'t exist.', 1) + if os.path.isdir(path_str): + sys.path.insert(0, path_str) + + for f in _search_modules(path_str): + classes_list.extend(_get_classes_from_module(f)) + else: + classes_list.extend(_get_classes_from_module(path_str)) + return create_class_diagram(classes_list, verbose=verbose) diff --git a/src/pyuml/cli.py b/src/pyuml/cli.py new file mode 100644 index 0000000..6412c48 --- /dev/null +++ b/src/pyuml/cli.py @@ -0,0 +1,62 @@ +"""Main module template with example functions.""" +from __future__ import annotations + +from pathlib import Path + +import typer + +from typer import Context, Option +from typing_extensions import Annotated + +from pyuml import __version__, class_graph + +app = typer.Typer() + + +@app.callback(invoke_without_command=True) +def main( + ctx: Context, + version: bool = Option( + None, + '--version', + '-v', + is_flag=True, + help='Show the version and exit.', + ), +) -> None: + """Run pyuml.""" + if version: + typer.echo(f'Version: {__version__}') + raise typer.Exit() + + if ctx.invoked_subcommand is None: + typer.echo(ctx.get_help()) + raise typer.Exit(0) + + +@app.command('class') +def class_( + source: Annotated[ + Path, + typer.Option( + ..., help='Source path for the project that would be scanned.' + ), + ] = Path('.'), + target: Annotated[ + Path, + typer.Option( + ..., help='Target path where the UML graph will be generated.' + ), + ] = Path('/tmp'), + verbose: Annotated[ + bool, typer.Option(help='Active the verbose mode.') + ] = False, +) -> None: + """Run the command for class graph.""" + g = class_graph.create_class_diagram_from_source(source, verbose=verbose) + g.format = 'png' + g.render(target) + + +if __name__ == '__main__': + app() diff --git a/src/pyuml/py.typed b/src/pyuml/py.typed new file mode 100644 index 0000000..e69de29 diff --git a/tests/notebooks/test.ipynb b/tests/notebooks/test.ipynb new file mode 100644 index 0000000..9a9502c --- /dev/null +++ b/tests/notebooks/test.ipynb @@ -0,0 +1,88 @@ +{ + "cells": [ + { + "cell_type": "code", + "execution_count": 1, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting class_a.py\n" + ] + } + ], + "source": [ + "%%writefile class_a.py\n", + "import dataclasses\n", + "\n", + "\n", + "@dataclasses.dataclass\n", + "class ClassA:\n", + " aa : str = None\n", + " ab : int = 0\n", + " \n", + " def print_content(self):\n", + " print(self.__dict__)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Overwriting class_b.py\n" + ] + } + ], + "source": [ + "%%writefile class_b.py\n", + "import dataclasses\n", + "from class_a import ClassA\n", + "\n", + "@dataclasses.dataclass\n", + "class ClassB(ClassA):\n", + " ba : str = None\n", + " bb : int = 0\n", + " \n", + " def print_content(self):\n", + " print(self.__dict__)\n", + " " + ] + }, + { + "cell_type": "code", + "execution_count": null, + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.7.6" + } + }, + "nbformat": 4, + "nbformat_minor": 4 +} diff --git a/tests/notebooks/test_pyuml.py b/tests/notebooks/test_pyuml.py new file mode 100644 index 0000000..6c9c777 --- /dev/null +++ b/tests/notebooks/test_pyuml.py @@ -0,0 +1,8 @@ +"""Main tests for pyuml.""" + + +def test_import() -> None: + """Test import.""" + import pyuml + + assert pyuml diff --git a/tox.ini b/tox.ini deleted file mode 100644 index 2583d15..0000000 --- a/tox.ini +++ /dev/null @@ -1,27 +0,0 @@ -[tox] -envlist = py27, py34, py35, py36, flake8 - -[travis] -python = - 3.6: py36 - 3.5: py35 - 3.4: py34 - 2.7: py27 - -[testenv:flake8] -basepython = python -deps = flake8 -commands = flake8 pyuml - -[testenv] -setenv = - PYTHONPATH = {toxinidir} -deps = - -r{toxinidir}/requirements_dev.txt -; If you want to make tox run the tests with the same versions, create a -; requirements.txt with the pinned versions and uncomment the following line: -; -r{toxinidir}/requirements.txt -commands = - pip install -U pip - py.test --basetemp={envtmpdir} --cov=pyuml -