From 1fcd07becff8e14b433092ed483868843685eb83 Mon Sep 17 00:00:00 2001 From: javierzazo_microsoft Date: Tue, 7 May 2024 14:41:17 +0100 Subject: [PATCH] :tada: init: new start --- .apidoc_conf.py | 40 + .apidoc_conf.py.jinja | 1 + .azure-pipelines/cg.yml | 19 + .azure-pipelines/cg.yml.jinja | 1 + .codespellrc | 6 + .copier-answers.yml.jinja | 2 + .coveragerc | 11 + .coveragerc.jinja | 1 + .cz.toml | 6 + .devcontainer/devcontainer.json | 38 + .devcontainer/direnvrc | 12 + .devcontainer/on-create.sh | 29 + .devcontainer/on-create.sh.jinja | 1 + .devcontainer/post-create.sh | 13 + .dockerignore | 18 + .editorconfig | 21 + .envrc | 7 + .github/dependabot.yaml | 27 + .github/workflows/ci.yml | 116 + .github/workflows/codeql.yml | 75 + .gitignore | 39 + .gitignore.jinja | 1 + .pre-commit-config.yaml | 72 + .vscode/launch.json | 22 + .vscode/settings.json | 7 + CODE_OF_CONDUCT.md | 9 + Dockerfile.build-context | 4 + LICENSE | 21 + README.md | 205 ++ README.md.jinja | 1 + SECURITY.md | 41 + SUPPORT.md | 25 + bin/build-docs | 6 + bin/check-all | 24 + bin/docs-api | 11 + bin/docs-api.jinja | 1 + bin/serve-docs | 5 + cookie-doh.code-workspace | 89 + copier.yml | 86 + docs/.pages | 3 + docs/css/extra.css | 4 + docs/images/favicon.ico | Bin 0 -> 318 bytes docs/images/logo.png | Bin 0 -> 65116 bytes docs/index.md | 1 + docs/index.md.jinja | 1 + mkdocs.yml | 86 + mkdocs.yml.jinja | 1 + poetry.lock | 2048 +++++++++++++++++ poetry.toml | 2 + pyproject.toml | 34 + pyproject.toml.jinja | 1 + pyrightconfig.json | 52 + pytest.ini | 4 + ruff.toml | 48 + ruff.toml.jinja | 1 + src/python/{{module_name}}/__init__.py | 0 src/python/{{module_name}}/example.py | 6 + test/python/{{module_name}}_test/__init__.py | 0 .../{{module_name}}_test/test_example.py | 6 + {{project_name}}.code-workspace.jinja | 1 + 60 files changed, 3412 insertions(+) create mode 100644 .apidoc_conf.py create mode 120000 .apidoc_conf.py.jinja create mode 100644 .azure-pipelines/cg.yml create mode 120000 .azure-pipelines/cg.yml.jinja create mode 100644 .codespellrc create mode 100644 .copier-answers.yml.jinja create mode 100644 .coveragerc create mode 120000 .coveragerc.jinja create mode 100644 .cz.toml create mode 100644 .devcontainer/devcontainer.json create mode 100644 .devcontainer/direnvrc create mode 100755 .devcontainer/on-create.sh create mode 120000 .devcontainer/on-create.sh.jinja create mode 100755 .devcontainer/post-create.sh create mode 100644 .dockerignore create mode 100644 .editorconfig create mode 100644 .envrc create mode 100644 .github/dependabot.yaml create mode 100644 .github/workflows/ci.yml create mode 100644 .github/workflows/codeql.yml create mode 100644 .gitignore create mode 120000 .gitignore.jinja create mode 100644 .pre-commit-config.yaml create mode 100644 .vscode/launch.json create mode 100644 .vscode/settings.json create mode 100644 CODE_OF_CONDUCT.md create mode 100644 Dockerfile.build-context create mode 100644 LICENSE create mode 100644 README.md create mode 120000 README.md.jinja create mode 100644 SECURITY.md create mode 100644 SUPPORT.md create mode 100755 bin/build-docs create mode 100755 bin/check-all create mode 100755 bin/docs-api create mode 120000 bin/docs-api.jinja create mode 100755 bin/serve-docs create mode 100644 cookie-doh.code-workspace create mode 100644 copier.yml create mode 100644 docs/.pages create mode 100644 docs/css/extra.css create mode 100644 docs/images/favicon.ico create mode 100644 docs/images/logo.png create mode 100644 docs/index.md create mode 120000 docs/index.md.jinja create mode 100644 mkdocs.yml create mode 120000 mkdocs.yml.jinja create mode 100644 poetry.lock create mode 100644 poetry.toml create mode 100644 pyproject.toml create mode 120000 pyproject.toml.jinja create mode 100644 pyrightconfig.json create mode 100644 pytest.ini create mode 100644 ruff.toml create mode 120000 ruff.toml.jinja create mode 100644 src/python/{{module_name}}/__init__.py create mode 100644 src/python/{{module_name}}/example.py create mode 100644 test/python/{{module_name}}_test/__init__.py create mode 100644 test/python/{{module_name}}_test/test_example.py create mode 120000 {{project_name}}.code-workspace.jinja diff --git a/.apidoc_conf.py b/.apidoc_conf.py new file mode 100644 index 0000000..172055e --- /dev/null +++ b/.apidoc_conf.py @@ -0,0 +1,40 @@ +# -- Project information ----------------------------------------------------- +project = "{{project_name}}" +copyright = "microsoft" +author = "microsoft research" + +# -- General configuration --------------------------------------------------- + +# Add any Sphinx extension module names here, as strings. They can be +# extensions coming with Sphinx (named 'sphinx.ext.*') or your custom +# ones. +extensions = [ + "sphinx.ext.autodoc", # main extension for generating from docstrings + "sphinx.ext.autosummary", # adds summary tables + "sphinx.ext.intersphinx", + "sphinx.ext.napoleon", # not sure this one works with the markdown builder + # The `sphinx_autodoc_typehints` extension must be loaded AFTER `sphinx.ext.napoleon`. + "sphinx_autodoc_typehints", + "sphinx_markdown_builder", +] + +# Add any paths that contain templates here, relative to this directory. +templates_path = [] + +# List of patterns, relative to source directory, that match files and +# directories to ignore when looking for source files. +# This pattern also affects html_static_path and html_extra_path. +exclude_patterns = [] + +intersphinx_mapping = { + "python": ("https://docs.python.org/3/", None), +} + +always_document_param_types = True + +autosummary_generate = True # Turn on sphinx.ext.autosummary +autoclass_content = "class" +autodoc_class_signature = "separated" +autodoc_inherit_docstrings = True # If no docstring, inherit from base class +set_type_checking_flag = True # Enable 'expensive' imports for sphinx_autodoc_typehints +add_module_names = False # Remove namespaces from class/method signatures diff --git a/.apidoc_conf.py.jinja b/.apidoc_conf.py.jinja new file mode 120000 index 0000000..ab18855 --- /dev/null +++ b/.apidoc_conf.py.jinja @@ -0,0 +1 @@ +.apidoc_conf.py \ No newline at end of file diff --git a/.azure-pipelines/cg.yml b/.azure-pipelines/cg.yml new file mode 100644 index 0000000..9b06912 --- /dev/null +++ b/.azure-pipelines/cg.yml @@ -0,0 +1,19 @@ +trigger: [main] +pr: [main] +schedules: + - cron: "0 0 * * 1" + displayName: "Weekly: {{project_name}}" + branches: + include: + - main +pool: + vmImage: ubuntu-latest +variables: + EnableDetectorPoetry: true +steps: + - task: ComponentGovernanceComponentDetection@0 + inputs: + showAlertLink: true + failOnAlert: true + failOnStderr: true + logLevel: debug diff --git a/.azure-pipelines/cg.yml.jinja b/.azure-pipelines/cg.yml.jinja new file mode 120000 index 0000000..f266c92 --- /dev/null +++ b/.azure-pipelines/cg.yml.jinja @@ -0,0 +1 @@ +cg.yml \ No newline at end of file diff --git a/.codespellrc b/.codespellrc new file mode 100644 index 0000000..ed48934 --- /dev/null +++ b/.codespellrc @@ -0,0 +1,6 @@ +[codespell] +write-changes = +count = true +quiet-level = 3 +ignore-words-list = aks,aml,requestors +skip = *.drawio diff --git a/.copier-answers.yml.jinja b/.copier-answers.yml.jinja new file mode 100644 index 0000000..43e93a1 --- /dev/null +++ b/.copier-answers.yml.jinja @@ -0,0 +1,2 @@ +# Changes here will be overwritten by Copier; NEVER EDIT MANUALLY +{{_copier_answers|to_nice_yaml -}} diff --git a/.coveragerc b/.coveragerc new file mode 100644 index 0000000..748b7ac --- /dev/null +++ b/.coveragerc @@ -0,0 +1,11 @@ +[run] +branch = True +data_file = .tmp/.coverage +source = src/python/{{module_name}} +relative_files = true + +[report] +show_missing = true + +[xml] +output = .tmp/reports/coverage.xml diff --git a/.coveragerc.jinja b/.coveragerc.jinja new file mode 120000 index 0000000..75d9b81 --- /dev/null +++ b/.coveragerc.jinja @@ -0,0 +1 @@ +.coveragerc \ No newline at end of file diff --git a/.cz.toml b/.cz.toml new file mode 100644 index 0000000..8ce9ee0 --- /dev/null +++ b/.cz.toml @@ -0,0 +1,6 @@ +[tool.commitizen] +name = "cz_gitmoji" +tag_format = "v$version" +version_scheme = "pep440" +version_provider = "poetry" +update_changelog_on_bump = true diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json new file mode 100644 index 0000000..bf6ce08 --- /dev/null +++ b/.devcontainer/devcontainer.json @@ -0,0 +1,38 @@ +{ + "image": "mcr.microsoft.com/devcontainers/python:3.10", + "features": { + "ghcr.io/devcontainers/features/git": {}, + "ghcr.io/devcontainers/features/sshd": {}, + "ghcr.io/devcontainers/features/github-cli": {}, + "ghcr.io/devcontainers-contrib/features/tmux-apt-get": {}, + "ghcr.io/devcontainers/features/common-utils": { + "configureZshAsDefaultShell": true + }, + "ghcr.io/devcontainers/features/docker-in-docker": {}, + "ghcr.io/devcontainers-contrib/features/fzf": {}, + "ghcr.io/devcontainers-contrib/features/pipx-package": {}, + "ghcr.io/devcontainers-contrib/features/poetry": {}, + "ghcr.io/devcontainers-contrib/features/direnv": {}, + "ghcr.io/devcontainers-contrib/features/pre-commit": {}, + "ghcr.io/devcontainers-contrib/features/neovim-apt-get": {}, + "ghcr.io/devcontainers-contrib/features/copier": {} + }, + "onCreateCommand": ".devcontainer/on-create.sh", + "postCreateCommand": ".devcontainer/post-create.sh", + "customizations": { + "vscode": { + "extensions": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.debugpy", + "ms-toolsai.jupyter", + "charliermarsh.ruff", + "eamodio.gitlens", + "redhat.vscode-yaml", + "bierner.github-markdown-preview", + "GitHub.copilot", + "GitHub.vscode-pull-request-github" + ] + } + } +} diff --git a/.devcontainer/direnvrc b/.devcontainer/direnvrc new file mode 100644 index 0000000..a87e0d0 --- /dev/null +++ b/.devcontainer/direnvrc @@ -0,0 +1,12 @@ +layout_poetry() { + if [[ ! -f pyproject.toml ]]; then + log_status 'No pyproject.toml found. Will initialize poetry in no-interactive mode' + poetry init -n -q + poetry run pip install -U pip wheel setuptools + fi + poetry run echo >> /dev/null + local VENV=$(dirname $(poetry run which python)) + export VIRTUAL_ENV=$(echo "$VENV" | rev | cut -d'/' -f2- | rev) + export POETRY_ACTIVE=1 + PATH_add "$VENV" +} diff --git a/.devcontainer/on-create.sh b/.devcontainer/on-create.sh new file mode 100755 index 0000000..63521c5 --- /dev/null +++ b/.devcontainer/on-create.sh @@ -0,0 +1,29 @@ +#! /bin/bash +# this runs ONCE at devcontainer creation time, and it runs during pre-build phase which +# means it does not have access to user context +# =========================== + +# finish config of direnv settings (would be nice to improve the devcontainer "feature") +echo "CONFIGURING DIRENV..." +echo 'eval "$(direnv hook zsh)"' >> ~/.zshrc +echo 'eval "$(direnv hook bash)"' >> ~/.bashrc +eval "$(direnv hook bash)" +mkdir -p ~/.config/direnv/ +cp /workspaces/{{project_name}}/.devcontainer/direnvrc ~/.config/direnv/direnvrc + +echo "UPDATE PIP" +pip install --upgrade pip + +echo "INSTALLING COMMITIZEN" +pipx install commitizen +pipx inject commitizen cz-conventional-gitmoji +echo 'eval "$(register-python-argcomplete cz)"' >> ~/.zshrc +echo 'eval "$(register-python-argcomplete cz)"' >> ~/.bashrc + +echo "POETRY INSTALL" +poetry config virtualenvs.in-project true +direnv allow . +poetry install + +echo "CONFIGURING PRE-COMMIT" +pre-commit install --install-hooks diff --git a/.devcontainer/on-create.sh.jinja b/.devcontainer/on-create.sh.jinja new file mode 120000 index 0000000..1c0169a --- /dev/null +++ b/.devcontainer/on-create.sh.jinja @@ -0,0 +1 @@ +on-create.sh \ No newline at end of file diff --git a/.devcontainer/post-create.sh b/.devcontainer/post-create.sh new file mode 100755 index 0000000..a4aedec --- /dev/null +++ b/.devcontainer/post-create.sh @@ -0,0 +1,13 @@ +#! /bin/bash +# this runs ONCE after the container is created, and runs in the user's context inside the container +# =========================== + +git config -–global core.editor "nano" +git config --global pager.branch false +git config --global alias.ba branch +git config --global alias.co checkout +git config --global alias.st status +git config --global alias.sa stash +git config --global alias.cp cherry-pick +git config --global alias.mt mergetool +git config --global alias.pl pull --rebase diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..8de5e22 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,18 @@ +**/.venv +**/.tox +**/.tox.docker +**/.tmp +**/.mypy_cache +**/.pytest_cache +**/.coverage +**/.idea +**/.direnv +**/.vscode +**/*.pyc + +**/src/python/*.egg-info +**/build/ +**/dist + +.git +.coverage diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000..9f1abc3 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,21 @@ +# EditorConfig defines consistent coding styles for various IDEs. +# https://editorconfig.org/ +# Pycharm supports this file by default while VS Code requires an extension: +# https://marketplace.visualstudio.com/items?itemName=EditorConfig.EditorConfig +root = true + +[*] +# unix-style newlines with a newline ending every file +end_of_line = lf +# makes sure files end in a newline on save +insert_final_newline = true +charset = utf-8 +max_line_length = 99 + +[*.py] +indent_style = space +indent_size = 4 + +[{*.yaml,*.yml,.pages}] +indent_style = space +indent_size = 2 diff --git a/.envrc b/.envrc new file mode 100644 index 0000000..e44f487 --- /dev/null +++ b/.envrc @@ -0,0 +1,7 @@ +layout_poetry + +# get path to the root of the project even if deep into the path +SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) + +# add bin directory to the path +export PATH="${SCRIPT_DIR}/bin:$PATH" diff --git a/.github/dependabot.yaml b/.github/dependabot.yaml new file mode 100644 index 0000000..df9152f --- /dev/null +++ b/.github/dependabot.yaml @@ -0,0 +1,27 @@ +version: 2 +updates: + - package-ecosystem: github-actions + directory: "/" + schedule: + interval: weekly + target-branch: main + groups: + github-actions: + patterns: + - "*" + commit-message: + prefix: ":arrow_up: dep-bump" + include: scope + + - package-ecosystem: pip + directory: "/" # location of package manifests + schedule: + interval: monthly + target-branch: main + groups: + package-dependencies: + patterns: + - "*" + commit-message: + prefix: ":arrow_up: dep-bump" + include: scope diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..adbff56 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,116 @@ +name: CI +on: + push: + branches: [ main ] + tags: + - "v[0-9]+.[0-9]+.[0-9]+" + pull_request: + branches: [ main ] + workflow_dispatch: + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + pre-commit: + runs-on: ubuntu-latest + name: pre-commit + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install dependencies + run: | + python -m pip install -U pip + pip install -U pre-commit + pre-commit install --install-hooks + + - name: pre-commit + run: | + pre-commit run --all-files + env: + SKIP: "ruff,ruff-format,pyright" + + run-tests: + runs-on: ubuntu-latest + name: run-tests + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + + - name: Install dependencies + run: | + python -m pip install -U pip + pip install -U poetry + poetry install + + - name: ruff-check + run: | + poetry run ruff check --no-fix --output-format=github + + - name: ruff-format + run: | + poetry run ruff format --check + + - name: pyright + run: | + poetry run pyright + + - name: pytest + run: | + poetry run coverage run -m pytest + + - name: coverage + run: | + poetry run coverage xml -o .tmp/reports/coverage.xml + + build-docs: + runs-on: ubuntu-latest + name: build-docs + steps: + - uses: actions/checkout@v4 + + - name: Install dependencies + run: | + python -m pip install -U pip + pip install -U poetry + poetry install + + - name: build-docs + run: | + bin/build-docs + + - name: upload-gh-pages + uses: actions/upload-pages-artifact@v3 + with: + path: dist/site + + deploy-docs: + needs: [run-tests, build-docs, pre-commit] + runs-on: ubuntu-latest + name: deploy-docs + permissions: + pages: write + id-token: write + if: github.ref_name == 'main' + steps: + - name: deploy-gh-pages + id: deployment + uses: actions/deploy-pages@v4 + + codeql: + uses: ./.github/workflows/codeql.yml + secrets: inherit + permissions: + contents: read + actions: read + security-events: write diff --git a/.github/workflows/codeql.yml b/.github/workflows/codeql.yml new file mode 100644 index 0000000..1137877 --- /dev/null +++ b/.github/workflows/codeql.yml @@ -0,0 +1,75 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: CodeQL + +on: + workflow_call: + schedule: + - cron: '42 23 * * 4' + +permissions: + contents: read + actions: read + security-events: write + +jobs: + analyze: + name: analyze + runs-on: ubuntu-latest + permissions: + actions: read + contents: read + security-events: write + + strategy: + fail-fast: false + matrix: + language: [ python ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python', 'ruby' ] + # Learn more about CodeQL language support at https://aka.ms/codeql-docs/language-support + + steps: + - name: checkout-repository + uses: actions/checkout@v4 + + # Initializes the CodeQL tools for scanning. + - name: initialize-codeql + uses: github/codeql-action/init@v3 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + + # Details on CodeQL's query packs refer to : https://docs.github.com/en/code-security/code-scanning/automatically-scanning-your-code-for-vulnerabilities-and-errors/configuring-code-scanning#using-queries-in-ql-packs + # queries: security-extended,security-and-quality + + + # Autobuild attempts to build any compiled languages (C/C++, C#, Go, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: autobuild + uses: github/codeql-action/autobuild@v3 + + # ℹ️ Command-line programs to run using the OS shell. + # πŸ“š See https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions#jobsjob_idstepsrun + + # If the Autobuild fails above, remove it and uncomment the following three lines. + # modify them (or add more) to build your code if your project, please refer to the EXAMPLE below for guidance. + + # - run: | + # echo "Run, Build Application using script" + # ./location_of_script_within_repo/buildscript.sh + + - name: codeql-analysis + uses: github/codeql-action/analyze@v3 + with: + category: "/language:${{matrix.language}}" diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..ccbff65 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +.venv +.coverage +.tmp + +**/*.pyc +**/*.egg-info +**/build/ +.DS_Store + +# ignore the distribution and docs/api folders +**/dist +**/docs/api + +# ignore personal workspace files +**/*.code-workspace +!{{project_name}}.code-workspace +{% if false %} # template files are excluded from copied repos +!cookie-doh.code-workspace +!cookie-doh.code-workspace.jinja +{% endif %} +**/.vscode/* +!**/.vscode/launch.json +!**/.vscode/settings.json + +**/.idea/* +# The module files tell Pycharm about the various components in the repo. +!**/.idea/*.iml +!**/.idea/modules.xml +# Allows us to share configurations for running pytest and other tools through the IDE. +!**/.idea/runConfigurations +# Watcher tasks allow us to share things like auto formatters. +!**/.idea/watcherTasks.xml + +# Draw.io tmp files +**/*.drawio.dtmp +**/*.drawio.bkp + +# outputs +**/outputs diff --git a/.gitignore.jinja b/.gitignore.jinja new file mode 120000 index 0000000..3e4e48b --- /dev/null +++ b/.gitignore.jinja @@ -0,0 +1 @@ +.gitignore \ No newline at end of file diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..77e2e7c --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,72 @@ +ci: + autofix_prs: false + autoupdate_commit_msg: ":arrow-up: dep-bump(pre-commit): update pre-commit hooks" + +default_install_hook_types: [pre-commit, pre-push, commit-msg] + +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-ast + - id: check-added-large-files + - id: check-case-conflict + - id: check-docstring-first + - id: check-executables-have-shebangs + - id: check-merge-conflict + - id: check-shebang-scripts-are-executable + - id: check-symlinks + - id: check-toml + - id: check-xml + exclude: (?x)(^.idea/) + - id: check-yaml + args: ["--unsafe"] + - id: debug-statements + - id: detect-private-key + - id: end-of-file-fixer + - id: forbid-submodules + - id: trailing-whitespace + + - repo: https://gitlab.com/bmares/check-json5 + rev: v1.0.0 + hooks: + - id: check-json5 + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.4.3 + hooks: + - id: ruff # linter + name: ruff-check + types_or: [python, pyi, jupyter] + args: [--fix] + - id: ruff-format # formatter + types_or: [python, pyi, jupyter] + + - repo: https://github.com/commitizen-tools/commitizen + rev: v3.25.0 + hooks: + - id: commitizen + additional_dependencies: [cz-conventional-gitmoji] + - id: commitizen-branch + additional_dependencies: [cz-conventional-gitmoji] + stages: [push] + + - repo: https://github.com/ljnsn/cz-conventional-gitmoji + rev: v0.3.1 + hooks: + - id: conventional-gitmoji + + - repo: https://github.com/asottile/blacken-docs + rev: 1.16.0 + hooks: + - id: blacken-docs + additional_dependencies: [black] + + - repo: https://github.com/codespell-project/codespell + rev: v2.2.6 + hooks: + - id: codespell + name: Run codespell to check for common misspellings in files + language: python + types: [text] + exclude: "poetry.lock|CHANGELOG.md" diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..5297e65 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,22 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "name": "Debug Test", + "type": "debugpy", + "request": "launch", + "justMyCode": true, + "program": "${file}", + "purpose": [ + "debug-test" + ], + "console": "integratedTerminal", + "env": { + "PYTEST_ADDOPTS": "--no-cov" + } // https://github.com/microsoft/vscode-python/issues/693#issuecomment-926591721 + } + ] +} diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..8bb3b31 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,7 @@ +{ + "python.testing.pytestArgs": [ + "test" + ], + "python.testing.unittestEnabled": false, + "python.testing.pytestEnabled": true +} diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..f9ba8cf --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,9 @@ +# Microsoft Open Source Code of Conduct + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). + +Resources: + +- [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/) +- [Microsoft Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) +- Contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with questions or concerns diff --git a/Dockerfile.build-context b/Dockerfile.build-context new file mode 100644 index 0000000..8a5dd4e --- /dev/null +++ b/Dockerfile.build-context @@ -0,0 +1,4 @@ +ARG REGISTRY=mcr.microsoft.com/mirror/docker/library +FROM ${REGISTRY}/ubuntu:22.04 + +COPY . /code diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..9e841e7 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ + MIT License + + Copyright (c) Microsoft Corporation. + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE diff --git a/README.md b/README.md new file mode 100644 index 0000000..5860298 --- /dev/null +++ b/README.md @@ -0,0 +1,205 @@ +# :cookie: {{project_name}} + +[![CI](https://github.com/health-futures/cookie-doh/actions/workflows/ci.yml/badge.svg)](https://github.com/health-futures/cookie-doh/actions/workflows/ci.yml) +[![Checked with pyright](https://microsoft.github.io/pyright/img/pyright_badge.svg)](https://microsoft.github.io/pyright/) +[![Ruff](https://img.shields.io/endpoint?url=https://raw.githubusercontent.com/astral-sh/ruff/main/assets/badge/v2.json)](https://github.com/astral-sh/ruff) +[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) + +{{project_name}} info + + +----------------------------------------------------------------- + + +## :notebook_with_decorative_cover: Documentation +https://{{organization}}.github.io/{{project_name}} + + + +## :rocket: Getting Started + + + + +*Description of how to install and use the code or content goes here* + + + +### Optional system dependencies + +We use the following optional dependencies for development: + +* [direnv](https://direnv.net/): To manage environment variables and load python virtual environments automatically. +* [pyenv](https://github.com/pyenv/pyenv): To manage python versions. +* [pipx](https://pipxproject.github.io/pipx/): To install python packages in isolated environments. +* [commitizen](https://commitizen-tools.github.io/commitizen/): To help with [conventional commits](https://www.conventionalcommits.org/en/v1.0.0/). +* [cz-conventional-gitmoji](https://github.com/ljnsn/cz-conventional-gitmoji): A commitizen plugin that combines gitmoji and conventional commits. +* [pre-commit](https://pre-commit.com/): To run code formatting and linting before committing. + +### Required system dependencies + +* [poetry](https://python-poetry.org/): To manage package dependencies and virtual environments. +* [python >= 3.10](https://www.python.org/) + +For setting up the development environment: + +* Clone the repository and cd into it. +* Install the dependencies with poetry: +```bash +poetry install +``` + +### Devcontainer + +Learn about [Devcontainers](https://containers.dev/). +Requires [Docker](https://www.docker.com/get-started/) installed on your local machine. + +:point_right: Follow instructions for [VSCode](https://code.visualstudio.com/docs/devcontainers/tutorial) +and/or [PyCharm](https://www.jetbrains.com/help/pycharm/connect-to-devcontainer.html). + + +### Codespaces + +Learn about [GitHub Codespaces](https://docs.github.com/en/codespaces) and/or [DevPod](https://devpod.sh/). + +[![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/{{organization}}/{{project_name}}) + +[![Open in DevPod!](https://devpod.sh/assets/open-in-devpod.svg)](https://devpod.sh/open#https://github.com/{{organization}}/{{project_name}}) + + + + + +### Installing + + +This repository does not hold installable content. + + + + + + + + + + + + + + +### Deployment (CI/CD) + + + + +_At this time, the repository does not use continuous integration or produce a website, artifact, or anything deployed._ + + + + + + + + + + + + + +-------------------------------------------- + + +## :memo: Guide to using GitHub inside Microsoft + +You can find information on using GitHub inside Microsoft at [aka.ms/gim](https://aka.ms/gim). + +
+ Expand for links to common tasks + +- [Switching between EMU GitHub and normal GitHub without logging out and back in constantly](https://aka.ms/StartRight/README-Template/maintainingMultipleAccount) +- [Creating a repository](https://aka.ms/StartRight) +- [Changing repository visibility](https://aka.ms/StartRight/README-Template/policies/jit) +- [Gaining repository permissions, access, and roles](https://aka.ms/StartRight/README-TEmplates/gim/policies/access) +- [Enabling easy access to your low sensitivity and widely applicable repository by setting it to Internal Visibility and having any FTE who wants to see it join the 1ES Enterprise Visibility MyAccess Group](https://aka.ms/StartRight/README-Template/gim/innersource-access) +- [Migrating repositories](https://aka.ms/StartRight/README-Template/troubleshoot/migration) +- [Setting branch protection](https://aka.ms/StartRight/README-Template/gim/policies/branch-protection) +- [Setting up GitHubActions](https://aka.ms/StartRight/README-Template/policies/actions) +- [and other actions](https://aka.ms/StartRight/README-Template/gim/policies) + +
+ + +## :mountain: Contributing + +This project welcomes contributions and suggestions. Most contributions require you to agree to a +Contributor License Agreement (CLA) declaring that you have the right to, and actually do, grant us +the rights to use your contribution. For details, visit https://cla.opensource.microsoft.com. + +When you submit a pull request, a CLA bot will automatically determine whether you need to provide +a CLA and decorate the PR appropriately (e.g., status check, comment). Simply follow the instructions +provided by the bot. You will only need to do this once across all repos using our CLA. + +This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). +For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or +contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments. + + +## :balance_scale: Trademarks + +This project may contain trademarks or logos for projects, products, or services. Authorized use of Microsoft +trademarks or logos is subject to and must follow +[Microsoft's Trademark & Brand Guidelines](https://www.microsoft.com/en-us/legal/intellectualproperty/trademarks/usage/general). +Use of Microsoft trademarks or logos in modified versions of this project must not cause confusion or imply Microsoft sponsorship. +Any use of third-party trademarks or logos are subject to those third-party's policies. + + + diff --git a/README.md.jinja b/README.md.jinja new file mode 120000 index 0000000..42061c0 --- /dev/null +++ b/README.md.jinja @@ -0,0 +1 @@ +README.md \ No newline at end of file diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..82db58a --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,41 @@ + + +## Security + +Microsoft takes the security of our software products and services seriously, which includes all source code repositories managed through our GitHub organizations, which include [Microsoft](https://github.com/Microsoft), [Azure](https://github.com/Azure), [DotNet](https://github.com/dotnet), [AspNet](https://github.com/aspnet) and [Xamarin](https://github.com/xamarin). + +If you believe you have found a security vulnerability in any Microsoft-owned repository that meets [Microsoft's definition of a security vulnerability](https://aka.ms/security.md/definition), please report it to us as described below. + +## Reporting Security Issues + +**Please do not report security vulnerabilities through public GitHub issues.** + +Instead, please report them to the Microsoft Security Response Center (MSRC) at [https://msrc.microsoft.com/create-report](https://aka.ms/security.md/msrc/create-report). + +If you prefer to submit without logging in, send email to [secure@microsoft.com](mailto:secure@microsoft.com). If possible, encrypt your message with our PGP key; please download it from the [Microsoft Security Response Center PGP Key page](https://aka.ms/security.md/msrc/pgp). + +You should receive a response within 24 hours. If for some reason you do not, please follow up via email to ensure we received your original message. Additional information can be found at [microsoft.com/msrc](https://www.microsoft.com/msrc). + +Please include the requested information listed below (as much as you can provide) to help us better understand the nature and scope of the possible issue: + + * Type of issue (e.g. buffer overflow, SQL injection, cross-site scripting, etc.) + * Full paths of source file(s) related to the manifestation of the issue + * The location of the affected source code (tag/branch/commit or direct URL) + * Any special configuration required to reproduce the issue + * Step-by-step instructions to reproduce the issue + * Proof-of-concept or exploit code (if possible) + * Impact of the issue, including how an attacker might exploit the issue + +This information will help us triage your report more quickly. + +If you are reporting for a bug bounty, more complete reports can contribute to a higher bounty award. Please visit our [Microsoft Bug Bounty Program](https://aka.ms/security.md/msrc/bounty) page for more details about our active programs. + +## Preferred Languages + +We prefer all communications to be in English. + +## Policy + +Microsoft follows the principle of [Coordinated Vulnerability Disclosure](https://aka.ms/security.md/cvd). + + diff --git a/SUPPORT.md b/SUPPORT.md new file mode 100644 index 0000000..44dcbc5 --- /dev/null +++ b/SUPPORT.md @@ -0,0 +1,25 @@ +# TODO: The maintainer of this repo has not yet edited this file + +**REPO OWNER**: Do you want Customer Service & Support (CSS) support for this product/project? + +- **No CSS support:** Fill out this template with information about how to file issues and get help. +- **Yes CSS support:** Fill out an intake form at [aka.ms/onboardsupport](https://aka.ms/onboardsupport). CSS will work with/help you to determine next steps. +- **Not sure?** Fill out an intake as though the answer were "Yes". CSS will help you decide. + +*Then remove this first heading from this SUPPORT.MD file before publishing your repo.* + +# Support + +## How to file issues and get help + +This project uses GitHub Issues to track bugs and feature requests. Please search the existing +issues before filing new issues to avoid duplicates. For new issues, file your bug or +feature request as a new Issue. + +For help and questions about using this project, please **REPO MAINTAINER: INSERT INSTRUCTIONS HERE +FOR HOW TO ENGAGE REPO OWNERS OR COMMUNITY FOR HELP. COULD BE A STACK OVERFLOW TAG OR OTHER +CHANNEL. WHERE WILL YOU HELP PEOPLE?**. + +## Microsoft Support Policy + +Support for this **PROJECT or PRODUCT** is limited to the resources listed above. diff --git a/bin/build-docs b/bin/build-docs new file mode 100755 index 0000000..d6841d5 --- /dev/null +++ b/bin/build-docs @@ -0,0 +1,6 @@ +#!/usr/bin/env bash +set -e + +bin/docs-api +rm -rf dist/site +poetry run mkdocs build --site-dir=dist/site diff --git a/bin/check-all b/bin/check-all new file mode 100755 index 0000000..252041e --- /dev/null +++ b/bin/check-all @@ -0,0 +1,24 @@ +#!/usr/bin/env bash + +echo "RUNNING PRE-COMMIT HOOKS" +pre-commit run --all + +echo +echo "RUNNING RUFF CHECK" +poetry run ruff check + +echo +echo "RUNNING RUFF FORMAT" +poetry run ruff format + +echo +echo "RUNNING PYRIGHT" +poetry run pyright + +echo +echo "RUNNING PYTEST AND COVERAGE" +poetry run coverage run -m pytest + +echo +echo "BUILDING API AND MARKDOWN DOCS" +build-docs diff --git a/bin/docs-api b/bin/docs-api new file mode 100755 index 0000000..f836a28 --- /dev/null +++ b/bin/docs-api @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +set -e + +rm -rf dist/sphinx-apidoc +mkdir -p dist/sphinx-apidoc +cp .apidoc_conf.py dist/sphinx-apidoc/conf.py +poetry run sphinx-apidoc --doc-project="{{project_name}}" --tocfile=index --implicit-namespaces --module-first --output-dir=dist/sphinx-apidoc --templatedir=dist/sphinx-apidoc-templates "src/python/{{module_name}}" + +rm -rf dist/sphinx-markdown docs/api +poetry run sphinx-build -M markdown dist/sphinx-apidoc dist/sphinx-markdown +cp -r dist/sphinx-markdown/markdown docs/api diff --git a/bin/docs-api.jinja b/bin/docs-api.jinja new file mode 120000 index 0000000..3d8a0b7 --- /dev/null +++ b/bin/docs-api.jinja @@ -0,0 +1 @@ +docs-api \ No newline at end of file diff --git a/bin/serve-docs b/bin/serve-docs new file mode 100755 index 0000000..4a25136 --- /dev/null +++ b/bin/serve-docs @@ -0,0 +1,5 @@ +#!/usr/bin/env bash +set -e + +bin/docs-api +poetry run mkdocs serve diff --git a/cookie-doh.code-workspace b/cookie-doh.code-workspace new file mode 100644 index 0000000..f4fbc7a --- /dev/null +++ b/cookie-doh.code-workspace @@ -0,0 +1,89 @@ +{ + "folders": [ + { + "path": "." + } + ], + "settings": { + "files.exclude": { + // tool-generated dirs/files + ".mypy_cache": true, + ".pytest_cache": true, + ".coverage": true, + "**/tags": true, + "**/build": true, + // other editor/ide settings + "**/.idea": true, + "**/__pycache__": true, + "**/.venv": true, + "**/dist": true + }, + // settings to apply to all workspace roots + "debug.toolBarLocation": "commandCenter", + "diffEditor.diffAlgorithm": "advanced", + "editor.formatOnSave": true, + "editor.codeActionsOnSave": { + "source.organizeImports": "explicit", + "source.fixAll": "explicit", + }, + "editor.rulers": [ + 99 + ], + "[dockercompose]": { + "editor.autoIndent": "advanced" + }, + "[jsonc]": { + "editor.defaultFormatter": "vscode.json-language-features" + }, + "[python]": { + "editor.defaultFormatter": "charliermarsh.ruff" + }, + "[yaml]": { + "editor.autoIndent": "advanced" + }, + "files.insertFinalNewline": true, + "files.trimFinalNewlines": true, + "markdown.validate.enabled": true, + "notebook.formatOnSave.enabled": true, + "notebook.codeActionsOnSave": { + "source.fixAll": true, + "source.organizeImports": true + }, + "python.languageServer": "Pylance", + "python.analysis.typeCheckingMode": "basic", + "python.analysis.autoImportCompletions": true, + "python.analysis.extraPaths": [ + "${workspaceFolder}/src/python" + ], + "python.autoComplete.extraPaths": [ + "${workspaceFolder}/src/python" + ], + "python.analysis.inlayHints.pytestParameters": true, + "python.defaultInterpreterPath": ".venv/bin/python", + "python.envFile": "${workspaceFolder}/.envrc", + "search.exclude": { + "**/build": true, + "**/.tmp": true, + "**/outputs": true, + "**/__pycache__": true, + "**/.venv": true, + "**/dist": true + }, + "yaml.format.bracketSpacing": false, + "yaml.format.enable": true, + "yaml.format.printWidth": 99, + }, + "extensions": { + "recommendations": [ + "ms-python.python", + "ms-python.vscode-pylance", + "ms-python.debugpy", + "charliermarsh.ruff", + "eamodio.gitlens", + "redhat.vscode-yaml", + "bierner.github-markdown-preview", + "GitHub.copilot", + "GitHub.vscode-pull-request-github" + ] + } +} diff --git a/copier.yml b/copier.yml new file mode 100644 index 0000000..02700d2 --- /dev/null +++ b/copier.yml @@ -0,0 +1,86 @@ +# questions +organization: + type: str + help: | + GitHub organization or username for this repository. + E.g., "microsoft", "your_username", "your_organization", etc. + +project_name: + type: str + help: What is your project name? + validator: >- + {% if not (project_name | regex_search('^[a-zA-Z_][a-zA-Z0-9\-_]*$')) %} + project_name must start with a letter, followed by one or more letters, digits, dashes or underscores. + {% endif %} + +module_name: + type: str + help: What is your Python module name? Can be the same as your project's name. + default: "{{ project_name|lower|replace(' ', '_')|replace('-', '_') }}" + validator: >- + {% if not (module_name | regex_search('^[a-zA-Z_][a-zA-Z0-9_]*')) %} + project_name must start with a letter, followed by one or more letters, digits or underscores. + {% endif %} + + repo_exists: + type: bool + help: Does this repository already exist on GitHub? + default: false + +_exclude: + - CHANGELOG.md + - cookie-doh.code-workspace + - poetry.lock + - copier.yaml + - copier.yml + - .git + - .DS_Store + - .svn + - "~*" + - "*.py[co]" + - __pycache__ + +_message_after_copy: | + Your project "{{ project_name }}" has been created successfully! πŸŽ‰ + + Next steps: + + {% if repo_exists -%} + + 1. Pull repository into your newly created project: + + $ cd {{ _copier_conf.dst_path }} + $ git remote add origin https://github.com/{{ organization }}/{{ project_name }}.git + $ git pull origin main # and resolve any conflicts + + {% else -%} + 1. Create a new repository on GitHub: + + a. Install the GitHub CLI (if you haven't already): https://cli.github.com/ + b. Authenticate with GitHub and create the new repository: + + $ gh auth login + $ gh repo create {{ organization }}/{{ project_name }} --private --remote=origin + $ cd {{ _copier_conf.dst_path }} + + {% endif -%} + + 2. Add project dependencies to `pyproject.toml` and install them with Poetry: + + $ poetry add # optional + $ poetry install + + 3. Add the project's outputs, configure pre-commit and commit your changes: + + $ git add . + $ pre-commit install --install-hooks + $ git commit -m "init: initialize repo" + + 5. Happy coding! πŸš€ + +_message_after_update: | + Your project "{{ project_name }}" has been updated! πŸŽ‰ + In case there are any conflicts, please resolve them. Then, you're done! πŸš€ + +_message_before_copy: | + πŸ’ƒ Thanks for generating a project using our template! πŸ•Ί diff --git a/docs/.pages b/docs/.pages new file mode 100644 index 0000000..a6123b3 --- /dev/null +++ b/docs/.pages @@ -0,0 +1,3 @@ +nav: +- ... +- reference: api diff --git a/docs/css/extra.css b/docs/css/extra.css new file mode 100644 index 0000000..b12f857 --- /dev/null +++ b/docs/css/extra.css @@ -0,0 +1,4 @@ +/* + Here in case we want to modify the style of the chosen theme. + Try not to do too much here or it might become difficult to maintain. + */ diff --git a/docs/images/favicon.ico b/docs/images/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..42cb6d559852da7d84d8b88f5b14abfeaa48db0f GIT binary patch literal 318 zcmb79xeb6o408k$ZD?qryrCF|omhZT7=sc!(H)|oAScJpuLF$F-RXN211124aAF~p zmu=zGsn%@WoBS_q9JP!Tf&nEF?3Gn*md()>xmTQlX$2QnMh-uBROa1l2F?LEI{uG; M7rw04)vFoJ-e>3!lmGw# literal 0 HcmV?d00001 diff --git a/docs/images/logo.png b/docs/images/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..273e64dd25d0c975f5b6c512d708120ec3b46e16 GIT binary patch literal 65116 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 literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..2b62cd4 --- /dev/null +++ b/docs/index.md @@ -0,0 +1 @@ +# :cookie: {{project_name}} diff --git a/docs/index.md.jinja b/docs/index.md.jinja new file mode 120000 index 0000000..dd0ea36 --- /dev/null +++ b/docs/index.md.jinja @@ -0,0 +1 @@ +index.md \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..1f57bcb --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,86 @@ +site_name: "{{project_name}}" +repo_url: https://github.com/{{organization}}/{{project_name}} +repo_name: "{{project_name}}" +docs_dir: docs +theme: + name: material + logo: images/logo.png + favicon: images/favicon.ico + palette: + # Palette toggle for automatic mode + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + + # Palette toggle for light mode + - media: "(prefers-color-scheme: light)" + scheme: default + toggle: + icon: material/brightness-7 + name: Switch to dark mode + + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + toggle: + icon: material/brightness-4 + name: Switch to light mode + icon: + repo: fontawesome/brands/github-alt + features: + - navigation.sections + - navigation.expand + - navigation.instant + - navigation.instant.prefetch + - navigation.path + - content.code.copy + - toc.follow + - navigation.top +extra_css: + - css/extra.css +# removed because of codeql detection +# https://github.com/{{organization}}/{{project_name}}/security/code-scanning/3 +# https://github.com/{{organization}}/{{project_name}}/security/code-scanning/4 +#extra_javascript: +# - js/mathjax.js +# - js/tex-mml-chtml.js +plugins: + - search + - awesome-pages + - mkdocs-video: + is_video: true + video_controls: true +markdown_extensions: + # Allows for nicely styled notes and warnings: !!! note + - admonition + # Allows for adding attributes to markdown content: !(some-image){: align=left } + - attr_list + - md_in_html + - pymdownx.details + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.magiclink + - pymdownx.superfences + - pymdownx.tabbed: + alternate_style: true + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - toc: + permalink: true + - def_list # definition / description lists + - pymdownx.tasklist: # Allows us to make a Tasklist: [x] some checked thing + custom_checkbox: true + # removed because of codeql detection + # https://github.com/{{organization}}/{{project_name}}/security/code-scanning/3 + # https://github.com/{{organization}}/{{project_name}}/security/code-scanning/4 + # - pymdownx.arithmatex: + # generic: true + # Needed because sphinx is generating lists with 2 spaces which is not supported by mkdocs + # See: https://github.com/mkdocs/mkdocs/issues/545 + - mdx_truly_sane_lists diff --git a/mkdocs.yml.jinja b/mkdocs.yml.jinja new file mode 120000 index 0000000..4e5c1cc --- /dev/null +++ b/mkdocs.yml.jinja @@ -0,0 +1 @@ +mkdocs.yml \ No newline at end of file diff --git a/poetry.lock b/poetry.lock new file mode 100644 index 0000000..255b9ea --- /dev/null +++ b/poetry.lock @@ -0,0 +1,2048 @@ +# This file is automatically @generated by Poetry 1.8.2 and should not be changed by hand. + +[[package]] +name = "alabaster" +version = "0.7.16" +description = "A light, configurable Sphinx theme" +optional = false +python-versions = ">=3.9" +files = [ + {file = "alabaster-0.7.16-py3-none-any.whl", hash = "sha256:b46733c07dce03ae4e150330b975c75737fa60f0a7c591b6c8bf4928a28e2c92"}, + {file = "alabaster-0.7.16.tar.gz", hash = "sha256:75a8b99c28a5dad50dd7f8ccdd447a121ddb3892da9e53d1ca5cca3106d58d65"}, +] + +[[package]] +name = "appnope" +version = "0.1.4" +description = "Disable App Nap on macOS >= 10.9" +optional = false +python-versions = ">=3.6" +files = [ + {file = "appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c"}, + {file = "appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee"}, +] + +[[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 = "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.extras] +dev = ["freezegun (>=1.0,<2.0)", "pytest (>=6.0)", "pytest-cov"] + +[[package]] +name = "bracex" +version = "2.4" +description = "Bash style brace expander." +optional = false +python-versions = ">=3.8" +files = [ + {file = "bracex-2.4-py3-none-any.whl", hash = "sha256:efdc71eff95eaff5e0f8cfebe7d01adf2c8637c8c92edaf63ef348c241a82418"}, + {file = "bracex-2.4.tar.gz", hash = "sha256:a27eaf1df42cf561fed58b7a8f3fdf129d1ea16a81e1fadd1d17989bc6384beb"}, +] + +[[package]] +name = "certifi" +version = "2024.2.2" +description = "Python package for providing Mozilla's CA Bundle." +optional = false +python-versions = ">=3.6" +files = [ + {file = "certifi-2024.2.2-py3-none-any.whl", hash = "sha256:dc383c07b76109f368f6106eee2b593b04a011ea4d55f652c6ca24a754d1cdd1"}, + {file = "certifi-2024.2.2.tar.gz", hash = "sha256:0569859f95fc761b18b45ef421b1290a0f65f147e92a1e5eb3e635f9a5e4e66f"}, +] + +[[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 = "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.2" +description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." +optional = false +python-versions = ">=3.8" +files = [ + {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, + {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, +] + +[package.dependencies] +traitlets = ">=4" + +[package.extras] +test = ["pytest"] + +[[package]] +name = "coverage" +version = "7.5.0" +description = "Code coverage measurement for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "coverage-7.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:432949a32c3e3f820af808db1833d6d1631664d53dd3ce487aa25d574e18ad1c"}, + {file = "coverage-7.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2bd7065249703cbeb6d4ce679c734bef0ee69baa7bff9724361ada04a15b7e3b"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bbfe6389c5522b99768a93d89aca52ef92310a96b99782973b9d11e80511f932"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:39793731182c4be939b4be0cdecde074b833f6171313cf53481f869937129ed3"}, + {file = "coverage-7.5.0-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:85a5dbe1ba1bf38d6c63b6d2c42132d45cbee6d9f0c51b52c59aa4afba057517"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:357754dcdfd811462a725e7501a9b4556388e8ecf66e79df6f4b988fa3d0b39a"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:a81eb64feded34f40c8986869a2f764f0fe2db58c0530d3a4afbcde50f314880"}, + {file = "coverage-7.5.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:51431d0abbed3a868e967f8257c5faf283d41ec882f58413cf295a389bb22e58"}, + {file = "coverage-7.5.0-cp310-cp310-win32.whl", hash = "sha256:f609ebcb0242d84b7adeee2b06c11a2ddaec5464d21888b2c8255f5fd6a98ae4"}, + {file = "coverage-7.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:6782cd6216fab5a83216cc39f13ebe30adfac2fa72688c5a4d8d180cd52e8f6a"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:e768d870801f68c74c2b669fc909839660180c366501d4cc4b87efd6b0eee375"}, + {file = "coverage-7.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:84921b10aeb2dd453247fd10de22907984eaf80901b578a5cf0bb1e279a587cb"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:710c62b6e35a9a766b99b15cdc56d5aeda0914edae8bb467e9c355f75d14ee95"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c379cdd3efc0658e652a14112d51a7668f6bfca7445c5a10dee7eabecabba19d"}, + {file = "coverage-7.5.0-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fea9d3ca80bcf17edb2c08a4704259dadac196fe5e9274067e7a20511fad1743"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:41327143c5b1d715f5f98a397608f90ab9ebba606ae4e6f3389c2145410c52b1"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:565b2e82d0968c977e0b0f7cbf25fd06d78d4856289abc79694c8edcce6eb2de"}, + {file = "coverage-7.5.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:cf3539007202ebfe03923128fedfdd245db5860a36810136ad95a564a2fdffff"}, + {file = "coverage-7.5.0-cp311-cp311-win32.whl", hash = "sha256:bf0b4b8d9caa8d64df838e0f8dcf68fb570c5733b726d1494b87f3da85db3a2d"}, + {file = "coverage-7.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:9c6384cc90e37cfb60435bbbe0488444e54b98700f727f16f64d8bfda0b84656"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:fed7a72d54bd52f4aeb6c6e951f363903bd7d70bc1cad64dd1f087980d309ab9"}, + {file = "coverage-7.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cbe6581fcff7c8e262eb574244f81f5faaea539e712a058e6707a9d272fe5b64"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad97ec0da94b378e593ef532b980c15e377df9b9608c7c6da3506953182398af"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bd4bacd62aa2f1a1627352fe68885d6ee694bdaebb16038b6e680f2924a9b2cc"}, + {file = "coverage-7.5.0-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:adf032b6c105881f9d77fa17d9eebe0ad1f9bfb2ad25777811f97c5362aa07f2"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:4ba01d9ba112b55bfa4b24808ec431197bb34f09f66f7cb4fd0258ff9d3711b1"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:f0bfe42523893c188e9616d853c47685e1c575fe25f737adf473d0405dcfa7eb"}, + {file = "coverage-7.5.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:a9a7ef30a1b02547c1b23fa9a5564f03c9982fc71eb2ecb7f98c96d7a0db5cf2"}, + {file = "coverage-7.5.0-cp312-cp312-win32.whl", hash = "sha256:3c2b77f295edb9fcdb6a250f83e6481c679335ca7e6e4a955e4290350f2d22a4"}, + {file = "coverage-7.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:427e1e627b0963ac02d7c8730ca6d935df10280d230508c0ba059505e9233475"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:9dd88fce54abbdbf4c42fb1fea0e498973d07816f24c0e27a1ecaf91883ce69e"}, + {file = "coverage-7.5.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:a898c11dca8f8c97b467138004a30133974aacd572818c383596f8d5b2eb04a9"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:07dfdd492d645eea1bd70fb1d6febdcf47db178b0d99161d8e4eed18e7f62fe7"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d3d117890b6eee85887b1eed41eefe2e598ad6e40523d9f94c4c4b213258e4a4"}, + {file = "coverage-7.5.0-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6afd2e84e7da40fe23ca588379f815fb6dbbb1b757c883935ed11647205111cb"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:a9960dd1891b2ddf13a7fe45339cd59ecee3abb6b8326d8b932d0c5da208104f"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:ced268e82af993d7801a9db2dbc1d2322e786c5dc76295d8e89473d46c6b84d4"}, + {file = "coverage-7.5.0-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:e7c211f25777746d468d76f11719e64acb40eed410d81c26cefac641975beb88"}, + {file = "coverage-7.5.0-cp38-cp38-win32.whl", hash = "sha256:262fffc1f6c1a26125d5d573e1ec379285a3723363f3bd9c83923c9593a2ac25"}, + {file = "coverage-7.5.0-cp38-cp38-win_amd64.whl", hash = "sha256:eed462b4541c540d63ab57b3fc69e7d8c84d5957668854ee4e408b50e92ce26a"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:d0194d654e360b3e6cc9b774e83235bae6b9b2cac3be09040880bb0e8a88f4a1"}, + {file = "coverage-7.5.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:33c020d3322662e74bc507fb11488773a96894aa82a622c35a5a28673c0c26f5"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0cbdf2cae14a06827bec50bd58e49249452d211d9caddd8bd80e35b53cb04631"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:3235d7c781232e525b0761730e052388a01548bd7f67d0067a253887c6e8df46"}, + {file = "coverage-7.5.0-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2de4e546f0ec4b2787d625e0b16b78e99c3e21bc1722b4977c0dddf11ca84e"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:4d0e206259b73af35c4ec1319fd04003776e11e859936658cb6ceffdeba0f5be"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:2055c4fb9a6ff624253d432aa471a37202cd8f458c033d6d989be4499aed037b"}, + {file = "coverage-7.5.0-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:075299460948cd12722a970c7eae43d25d37989da682997687b34ae6b87c0ef0"}, + {file = "coverage-7.5.0-cp39-cp39-win32.whl", hash = "sha256:280132aada3bc2f0fac939a5771db4fbb84f245cb35b94fae4994d4c1f80dae7"}, + {file = "coverage-7.5.0-cp39-cp39-win_amd64.whl", hash = "sha256:c58536f6892559e030e6924896a44098bc1290663ea12532c78cef71d0df8493"}, + {file = "coverage-7.5.0-pp38.pp39.pp310-none-any.whl", hash = "sha256:2b57780b51084d5223eee7b59f0d4911c31c16ee5aa12737c7a02455829ff067"}, + {file = "coverage-7.5.0.tar.gz", hash = "sha256:cf62d17310f34084c59c01e027259076479128d11e4661bb6c9acb38c5e19bb8"}, +] + +[package.extras] +toml = ["tomli"] + +[[package]] +name = "debugpy" +version = "1.8.1" +description = "An implementation of the Debug Adapter Protocol for Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "debugpy-1.8.1-cp310-cp310-macosx_11_0_x86_64.whl", hash = "sha256:3bda0f1e943d386cc7a0e71bfa59f4137909e2ed947fb3946c506e113000f741"}, + {file = "debugpy-1.8.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dda73bf69ea479c8577a0448f8c707691152e6c4de7f0c4dec5a4bc11dee516e"}, + {file = "debugpy-1.8.1-cp310-cp310-win32.whl", hash = "sha256:3a79c6f62adef994b2dbe9fc2cc9cc3864a23575b6e387339ab739873bea53d0"}, + {file = "debugpy-1.8.1-cp310-cp310-win_amd64.whl", hash = "sha256:7eb7bd2b56ea3bedb009616d9e2f64aab8fc7000d481faec3cd26c98a964bcdd"}, + {file = "debugpy-1.8.1-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:016a9fcfc2c6b57f939673c874310d8581d51a0fe0858e7fac4e240c5eb743cb"}, + {file = "debugpy-1.8.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd97ed11a4c7f6d042d320ce03d83b20c3fb40da892f994bc041bbc415d7a099"}, + {file = "debugpy-1.8.1-cp311-cp311-win32.whl", hash = "sha256:0de56aba8249c28a300bdb0672a9b94785074eb82eb672db66c8144fff673146"}, + {file = "debugpy-1.8.1-cp311-cp311-win_amd64.whl", hash = "sha256:1a9fe0829c2b854757b4fd0a338d93bc17249a3bf69ecf765c61d4c522bb92a8"}, + {file = "debugpy-1.8.1-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:3ebb70ba1a6524d19fa7bb122f44b74170c447d5746a503e36adc244a20ac539"}, + {file = "debugpy-1.8.1-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a2e658a9630f27534e63922ebf655a6ab60c370f4d2fc5c02a5b19baf4410ace"}, + {file = "debugpy-1.8.1-cp312-cp312-win32.whl", hash = "sha256:caad2846e21188797a1f17fc09c31b84c7c3c23baf2516fed5b40b378515bbf0"}, + {file = "debugpy-1.8.1-cp312-cp312-win_amd64.whl", hash = "sha256:edcc9f58ec0fd121a25bc950d4578df47428d72e1a0d66c07403b04eb93bcf98"}, + {file = "debugpy-1.8.1-cp38-cp38-macosx_11_0_x86_64.whl", hash = "sha256:7a3afa222f6fd3d9dfecd52729bc2e12c93e22a7491405a0ecbf9e1d32d45b39"}, + {file = "debugpy-1.8.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d915a18f0597ef685e88bb35e5d7ab968964b7befefe1aaea1eb5b2640b586c7"}, + {file = "debugpy-1.8.1-cp38-cp38-win32.whl", hash = "sha256:92116039b5500633cc8d44ecc187abe2dfa9b90f7a82bbf81d079fcdd506bae9"}, + {file = "debugpy-1.8.1-cp38-cp38-win_amd64.whl", hash = "sha256:e38beb7992b5afd9d5244e96ad5fa9135e94993b0c551ceebf3fe1a5d9beb234"}, + {file = "debugpy-1.8.1-cp39-cp39-macosx_11_0_x86_64.whl", hash = "sha256:bfb20cb57486c8e4793d41996652e5a6a885b4d9175dd369045dad59eaacea42"}, + {file = "debugpy-1.8.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:efd3fdd3f67a7e576dd869c184c5dd71d9aaa36ded271939da352880c012e703"}, + {file = "debugpy-1.8.1-cp39-cp39-win32.whl", hash = "sha256:58911e8521ca0c785ac7a0539f1e77e0ce2df753f786188f382229278b4cdf23"}, + {file = "debugpy-1.8.1-cp39-cp39-win_amd64.whl", hash = "sha256:6df9aa9599eb05ca179fb0b810282255202a66835c6efb1d112d21ecb830ddd3"}, + {file = "debugpy-1.8.1-py2.py3-none-any.whl", hash = "sha256:28acbe2241222b87e255260c76741e1fbf04fdc3b6d094fcf57b6c6f75ce1242"}, + {file = "debugpy-1.8.1.zip", hash = "sha256:f696d6be15be87aef621917585f9bb94b1dc9e8aced570db1b8a6fc14e8f9b42"}, +] + +[[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 = "docutils" +version = "0.21.2" +description = "Docutils -- Python Documentation Utilities" +optional = false +python-versions = ">=3.9" +files = [ + {file = "docutils-0.21.2-py3-none-any.whl", hash = "sha256:dafca5b9e384f0e419294eb4d2ff9fa826435bf15f15b7bd45723e8ad76811b2"}, + {file = "docutils-0.21.2.tar.gz", hash = "sha256:3a6b18732edf182daa3cd12775bbb338cf5691468f91eeeb109deff6ebfa986f"}, +] + +[[package]] +name = "exceptiongroup" +version = "1.2.1" +description = "Backport of PEP 654 (exception groups)" +optional = false +python-versions = ">=3.7" +files = [ + {file = "exceptiongroup-1.2.1-py3-none-any.whl", hash = "sha256:5258b9ed329c5bbdd31a309f53cbfb0b155341807f6ff7606a1e801a891b29ad"}, + {file = "exceptiongroup-1.2.1.tar.gz", hash = "sha256:a4785e48b045528f5bfe627b6ad554ff32def154f42372786903b7abcfe1aa16"}, +] + +[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 = "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 = "idna" +version = "3.7" +description = "Internationalized Domain Names in Applications (IDNA)" +optional = false +python-versions = ">=3.5" +files = [ + {file = "idna-3.7-py3-none-any.whl", hash = "sha256:82fee1fc78add43492d3a1898bfa6d8a904cc97d8427f683ed8e798d07761aa0"}, + {file = "idna-3.7.tar.gz", hash = "sha256:028ff3aadf0609c1fd278d8ea3089299412a7a8b9bd005dd08b9f8285bcb5cfc"}, +] + +[[package]] +name = "imagesize" +version = "1.4.1" +description = "Getting image size from png/jpeg/jpeg2000/gif file" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +files = [ + {file = "imagesize-1.4.1-py2.py3-none-any.whl", hash = "sha256:0d8d18d08f840c19d0ee7ca1fd82490fdc3729b7ac93f49870406ddde8ef8d8b"}, + {file = "imagesize-1.4.1.tar.gz", hash = "sha256:69150444affb9cb0d5cc5a92b3676f0b2fb7cd9ae39e947a5e11a36b4497cd4a"}, +] + +[[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.4" +description = "IPython Kernel for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "ipykernel-6.29.4-py3-none-any.whl", hash = "sha256:1181e653d95c6808039c509ef8e67c4126b3b3af7781496c7cbfb5ed938a27da"}, + {file = "ipykernel-6.29.4.tar.gz", hash = "sha256:3d44070060f9475ac2092b760123fadf105d2e2493c24848b6691a7c4f42af5c"}, +] + +[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.5)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "ipython" +version = "8.24.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.10" +files = [ + {file = "ipython-8.24.0-py3-none-any.whl", hash = "sha256:d7bf2f6c4314984e3e02393213bab8703cf163ede39672ce5918c51fe253a2a3"}, + {file = "ipython-8.24.0.tar.gz", hash = "sha256:010db3f8a728a578bb641fdd06c063b9fb8e96a9464c63aec6310fbcb5e80501"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +decorator = "*" +exceptiongroup = {version = "*", markers = "python_version < \"3.11\""} +jedi = ">=0.16" +matplotlib-inline = "*" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt-toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.4.0" +stack-data = "*" +traitlets = ">=5.13.0" +typing-extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[black,doc,kernel,matplotlib,nbconvert,nbformat,notebook,parallel,qtconsole]", "ipython[test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "ipykernel", "ipython[test]", "matplotlib", "setuptools (>=18.5)", "sphinx (>=1.3)", "sphinx-rtd-theme", "sphinxcontrib-jquery", "stack-data", "typing-extensions"] +kernel = ["ipykernel"] +matplotlib = ["matplotlib"] +nbconvert = ["nbconvert"] +nbformat = ["nbformat"] +notebook = ["ipywidgets", "notebook"] +parallel = ["ipyparallel"] +qtconsole = ["qtconsole"] +test = ["pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] +test-extra = ["curio", "ipython[test]", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] + +[[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.4" +description = "A very fast and expressive template engine." +optional = false +python-versions = ">=3.7" +files = [ + {file = "jinja2-3.1.4-py3-none-any.whl", hash = "sha256:bc5dd2abb727a5319567b7a813e6a2e7318c39f4f487cfe6c89c6f9c7d25197d"}, + {file = "jinja2-3.1.4.tar.gz", hash = "sha256:4a3aee7acbbe7303aede8e9648d13b8bf88a429282aa6122a993f0ac800cb369"}, +] + +[package.dependencies] +MarkupSafe = ">=2.0" + +[package.extras] +i18n = ["Babel (>=2.7)"] + +[[package]] +name = "jupyter-client" +version = "8.6.1" +description = "Jupyter protocol implementation and client libraries" +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_client-8.6.1-py3-none-any.whl", hash = "sha256:3b7bd22f058434e3b9a7ea4b1500ed47de2713872288c0d511d19926f99b459f"}, + {file = "jupyter_client-8.6.1.tar.gz", hash = "sha256:e842515e2bab8e19186d89fdfea7abd15e39dd581f94e399f00e2af5a1652d3f"}, +] + +[package.dependencies] +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.2" +description = "Jupyter core package. A base package on which Jupyter projects rely." +optional = false +python-versions = ">=3.8" +files = [ + {file = "jupyter_core-5.7.2-py3-none-any.whl", hash = "sha256:4f7315d2f6b4bcf2e3e7cb6e46772eba760ae459cd1f59d29eb57b0a01bd7409"}, + {file = "jupyter_core-5.7.2.tar.gz", hash = "sha256:aa5f8d32bbf6b431ac830496da7392035d6f61b4f54872f15c4bd2a9c3f536d9"}, +] + +[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 (<8)", "pytest-cov", "pytest-timeout"] + +[[package]] +name = "lxml" +version = "5.2.1" +description = "Powerful and Pythonic XML processing library combining libxml2/libxslt with the ElementTree API." +optional = false +python-versions = ">=3.6" +files = [ + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:1f7785f4f789fdb522729ae465adcaa099e2a3441519df750ebdccc481d961a1"}, + {file = "lxml-5.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6cc6ee342fb7fa2471bd9b6d6fdfc78925a697bf5c2bcd0a302e98b0d35bfad3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:794f04eec78f1d0e35d9e0c36cbbb22e42d370dda1609fb03bcd7aeb458c6377"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c817d420c60a5183953c783b0547d9eb43b7b344a2c46f69513d5952a78cddf3"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:2213afee476546a7f37c7a9b4ad4d74b1e112a6fafffc9185d6d21f043128c81"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:b070bbe8d3f0f6147689bed981d19bbb33070225373338df755a46893528104a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e02c5175f63effbd7c5e590399c118d5db6183bbfe8e0d118bdb5c2d1b48d937"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:3dc773b2861b37b41a6136e0b72a1a44689a9c4c101e0cddb6b854016acc0aa8"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_ppc64le.whl", hash = "sha256:d7520db34088c96cc0e0a3ad51a4fd5b401f279ee112aa2b7f8f976d8582606d"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_s390x.whl", hash = "sha256:bcbf4af004f98793a95355980764b3d80d47117678118a44a80b721c9913436a"}, + {file = "lxml-5.2.1-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:a2b44bec7adf3e9305ce6cbfa47a4395667e744097faed97abb4728748ba7d47"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:1c5bb205e9212d0ebddf946bc07e73fa245c864a5f90f341d11ce7b0b854475d"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:2c9d147f754b1b0e723e6afb7ba1566ecb162fe4ea657f53d2139bbf894d050a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:3545039fa4779be2df51d6395e91a810f57122290864918b172d5dc7ca5bb433"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:a91481dbcddf1736c98a80b122afa0f7296eeb80b72344d7f45dc9f781551f56"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2ddfe41ddc81f29a4c44c8ce239eda5ade4e7fc305fb7311759dd6229a080052"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7baf9ffc238e4bf401299f50e971a45bfcc10a785522541a6e3179c83eabf0a"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:31e9a882013c2f6bd2f2c974241bf4ba68c85eba943648ce88936d23209a2e01"}, + {file = "lxml-5.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0a15438253b34e6362b2dc41475e7f80de76320f335e70c5528b7148cac253a1"}, + {file = "lxml-5.2.1-cp310-cp310-win32.whl", hash = "sha256:6992030d43b916407c9aa52e9673612ff39a575523c5f4cf72cdef75365709a5"}, + {file = "lxml-5.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:da052e7962ea2d5e5ef5bc0355d55007407087392cf465b7ad84ce5f3e25fe0f"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:70ac664a48aa64e5e635ae5566f5227f2ab7f66a3990d67566d9907edcbbf867"}, + {file = "lxml-5.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1ae67b4e737cddc96c99461d2f75d218bdf7a0c3d3ad5604d1f5e7464a2f9ffe"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f18a5a84e16886898e51ab4b1d43acb3083c39b14c8caeb3589aabff0ee0b270"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c6f2c8372b98208ce609c9e1d707f6918cc118fea4e2c754c9f0812c04ca116d"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:394ed3924d7a01b5bd9a0d9d946136e1c2f7b3dc337196d99e61740ed4bc6fe1"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5d077bc40a1fe984e1a9931e801e42959a1e6598edc8a3223b061d30fbd26bbc"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:764b521b75701f60683500d8621841bec41a65eb739b8466000c6fdbc256c240"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:3a6b45da02336895da82b9d472cd274b22dc27a5cea1d4b793874eead23dd14f"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_ppc64le.whl", hash = "sha256:5ea7b6766ac2dfe4bcac8b8595107665a18ef01f8c8343f00710b85096d1b53a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_s390x.whl", hash = "sha256:e196a4ff48310ba62e53a8e0f97ca2bca83cdd2fe2934d8b5cb0df0a841b193a"}, + {file = "lxml-5.2.1-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:200e63525948e325d6a13a76ba2911f927ad399ef64f57898cf7c74e69b71095"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:dae0ed02f6b075426accbf6b2863c3d0a7eacc1b41fb40f2251d931e50188dad"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:ab31a88a651039a07a3ae327d68ebdd8bc589b16938c09ef3f32a4b809dc96ef"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:df2e6f546c4df14bc81f9498bbc007fbb87669f1bb707c6138878c46b06f6510"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:5dd1537e7cc06efd81371f5d1a992bd5ab156b2b4f88834ca852de4a8ea523fa"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:9b9ec9c9978b708d488bec36b9e4c94d88fd12ccac3e62134a9d17ddba910ea9"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:8e77c69d5892cb5ba71703c4057091e31ccf534bd7f129307a4d084d90d014b8"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:a8d5c70e04aac1eda5c829a26d1f75c6e5286c74743133d9f742cda8e53b9c2f"}, + {file = "lxml-5.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c94e75445b00319c1fad60f3c98b09cd63fe1134a8a953dcd48989ef42318534"}, + {file = "lxml-5.2.1-cp311-cp311-win32.whl", hash = "sha256:4951e4f7a5680a2db62f7f4ab2f84617674d36d2d76a729b9a8be4b59b3659be"}, + {file = "lxml-5.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:5c670c0406bdc845b474b680b9a5456c561c65cf366f8db5a60154088c92d102"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:abc25c3cab9ec7fcd299b9bcb3b8d4a1231877e425c650fa1c7576c5107ab851"}, + {file = "lxml-5.2.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:6935bbf153f9a965f1e07c2649c0849d29832487c52bb4a5c5066031d8b44fd5"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d793bebb202a6000390a5390078e945bbb49855c29c7e4d56a85901326c3b5d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:afd5562927cdef7c4f5550374acbc117fd4ecc05b5007bdfa57cc5355864e0a4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e7259016bc4345a31af861fdce942b77c99049d6c2107ca07dc2bba2435c1d9"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:530e7c04f72002d2f334d5257c8a51bf409db0316feee7c87e4385043be136af"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:59689a75ba8d7ffca577aefd017d08d659d86ad4585ccc73e43edbfc7476781a"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:f9737bf36262046213a28e789cc82d82c6ef19c85a0cf05e75c670a33342ac2c"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_ppc64le.whl", hash = "sha256:3a74c4f27167cb95c1d4af1c0b59e88b7f3e0182138db2501c353555f7ec57f4"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_s390x.whl", hash = "sha256:68a2610dbe138fa8c5826b3f6d98a7cfc29707b850ddcc3e21910a6fe51f6ca0"}, + {file = "lxml-5.2.1-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:f0a1bc63a465b6d72569a9bba9f2ef0334c4e03958e043da1920299100bc7c08"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:c2d35a1d047efd68027817b32ab1586c1169e60ca02c65d428ae815b593e65d4"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:79bd05260359170f78b181b59ce871673ed01ba048deef4bf49a36ab3e72e80b"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:865bad62df277c04beed9478fe665b9ef63eb28fe026d5dedcb89b537d2e2ea6"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:44f6c7caff88d988db017b9b0e4ab04934f11e3e72d478031efc7edcac6c622f"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:71e97313406ccf55d32cc98a533ee05c61e15d11b99215b237346171c179c0b0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:057cdc6b86ab732cf361f8b4d8af87cf195a1f6dc5b0ff3de2dced242c2015e0"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:f3bbbc998d42f8e561f347e798b85513ba4da324c2b3f9b7969e9c45b10f6169"}, + {file = "lxml-5.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:491755202eb21a5e350dae00c6d9a17247769c64dcf62d8c788b5c135e179dc4"}, + {file = "lxml-5.2.1-cp312-cp312-win32.whl", hash = "sha256:8de8f9d6caa7f25b204fc861718815d41cbcf27ee8f028c89c882a0cf4ae4134"}, + {file = "lxml-5.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:f2a9efc53d5b714b8df2b4b3e992accf8ce5bbdfe544d74d5c6766c9e1146a3a"}, + {file = "lxml-5.2.1-cp36-cp36m-macosx_10_9_x86_64.whl", hash = "sha256:70a9768e1b9d79edca17890175ba915654ee1725975d69ab64813dd785a2bd5c"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c38d7b9a690b090de999835f0443d8aa93ce5f2064035dfc48f27f02b4afc3d0"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5670fb70a828663cc37552a2a85bf2ac38475572b0e9b91283dc09efb52c41d1"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_28_x86_64.whl", hash = "sha256:958244ad566c3ffc385f47dddde4145088a0ab893504b54b52c041987a8c1863"}, + {file = "lxml-5.2.1-cp36-cp36m-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:b6241d4eee5f89453307c2f2bfa03b50362052ca0af1efecf9fef9a41a22bb4f"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_aarch64.whl", hash = "sha256:2a66bf12fbd4666dd023b6f51223aed3d9f3b40fef06ce404cb75bafd3d89536"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_ppc64le.whl", hash = "sha256:9123716666e25b7b71c4e1789ec829ed18663152008b58544d95b008ed9e21e9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_s390x.whl", hash = "sha256:0c3f67e2aeda739d1cc0b1102c9a9129f7dc83901226cc24dd72ba275ced4218"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_1_x86_64.whl", hash = "sha256:5d5792e9b3fb8d16a19f46aa8208987cfeafe082363ee2745ea8b643d9cc5b45"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_aarch64.whl", hash = "sha256:88e22fc0a6684337d25c994381ed8a1580a6f5ebebd5ad41f89f663ff4ec2885"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_ppc64le.whl", hash = "sha256:21c2e6b09565ba5b45ae161b438e033a86ad1736b8c838c766146eff8ceffff9"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_s390x.whl", hash = "sha256:afbbdb120d1e78d2ba8064a68058001b871154cc57787031b645c9142b937a62"}, + {file = "lxml-5.2.1-cp36-cp36m-musllinux_1_2_x86_64.whl", hash = "sha256:627402ad8dea044dde2eccde4370560a2b750ef894c9578e1d4f8ffd54000461"}, + {file = "lxml-5.2.1-cp36-cp36m-win32.whl", hash = "sha256:e89580a581bf478d8dcb97d9cd011d567768e8bc4095f8557b21c4d4c5fea7d0"}, + {file = "lxml-5.2.1-cp36-cp36m-win_amd64.whl", hash = "sha256:59565f10607c244bc4c05c0c5fa0c190c990996e0c719d05deec7030c2aa8289"}, + {file = "lxml-5.2.1-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:857500f88b17a6479202ff5fe5f580fc3404922cd02ab3716197adf1ef628029"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:56c22432809085b3f3ae04e6e7bdd36883d7258fcd90e53ba7b2e463efc7a6af"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a55ee573116ba208932e2d1a037cc4b10d2c1cb264ced2184d00b18ce585b2c0"}, + {file = "lxml-5.2.1-cp37-cp37m-manylinux_2_28_x86_64.whl", hash = "sha256:6cf58416653c5901e12624e4013708b6e11142956e7f35e7a83f1ab02f3fe456"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:64c2baa7774bc22dd4474248ba16fe1a7f611c13ac6123408694d4cc93d66dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_ppc64le.whl", hash = "sha256:74b28c6334cca4dd704e8004cba1955af0b778cf449142e581e404bd211fb619"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_s390x.whl", hash = "sha256:7221d49259aa1e5a8f00d3d28b1e0b76031655ca74bb287123ef56c3db92f213"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:3dbe858ee582cbb2c6294dc85f55b5f19c918c2597855e950f34b660f1a5ede6"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:04ab5415bf6c86e0518d57240a96c4d1fcfc3cb370bb2ac2a732b67f579e5a04"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:6ab833e4735a7e5533711a6ea2df26459b96f9eec36d23f74cafe03631647c41"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:f443cdef978430887ed55112b491f670bba6462cea7a7742ff8f14b7abb98d75"}, + {file = "lxml-5.2.1-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:9e2addd2d1866fe112bc6f80117bcc6bc25191c5ed1bfbcf9f1386a884252ae8"}, + {file = "lxml-5.2.1-cp37-cp37m-win32.whl", hash = "sha256:f51969bac61441fd31f028d7b3b45962f3ecebf691a510495e5d2cd8c8092dbd"}, + {file = "lxml-5.2.1-cp37-cp37m-win_amd64.whl", hash = "sha256:b0b58fbfa1bf7367dde8a557994e3b1637294be6cf2169810375caf8571a085c"}, + {file = "lxml-5.2.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:804f74efe22b6a227306dd890eecc4f8c59ff25ca35f1f14e7482bbce96ef10b"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:08802f0c56ed150cc6885ae0788a321b73505d2263ee56dad84d200cab11c07a"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0f8c09ed18ecb4ebf23e02b8e7a22a05d6411911e6fabef3a36e4f371f4f2585"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e3d30321949861404323c50aebeb1943461a67cd51d4200ab02babc58bd06a86"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:b560e3aa4b1d49e0e6c847d72665384db35b2f5d45f8e6a5c0072e0283430533"}, + {file = "lxml-5.2.1-cp38-cp38-manylinux_2_28_x86_64.whl", hash = "sha256:058a1308914f20784c9f4674036527e7c04f7be6fb60f5d61353545aa7fcb739"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:adfb84ca6b87e06bc6b146dc7da7623395db1e31621c4785ad0658c5028b37d7"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:417d14450f06d51f363e41cace6488519038f940676ce9664b34ebf5653433a5"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:a2dfe7e2473f9b59496247aad6e23b405ddf2e12ef0765677b0081c02d6c2c0b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:bf2e2458345d9bffb0d9ec16557d8858c9c88d2d11fed53998512504cd9df49b"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:58278b29cb89f3e43ff3e0c756abbd1518f3ee6adad9e35b51fb101c1c1daaec"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:64641a6068a16201366476731301441ce93457eb8452056f570133a6ceb15fca"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:78bfa756eab503673991bdcf464917ef7845a964903d3302c5f68417ecdc948c"}, + {file = "lxml-5.2.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:11a04306fcba10cd9637e669fd73aa274c1c09ca64af79c041aa820ea992b637"}, + {file = "lxml-5.2.1-cp38-cp38-win32.whl", hash = "sha256:66bc5eb8a323ed9894f8fa0ee6cb3e3fb2403d99aee635078fd19a8bc7a5a5da"}, + {file = "lxml-5.2.1-cp38-cp38-win_amd64.whl", hash = "sha256:9676bfc686fa6a3fa10cd4ae6b76cae8be26eb5ec6811d2a325636c460da1806"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:cf22b41fdae514ee2f1691b6c3cdeae666d8b7fa9434de445f12bbeee0cf48dd"}, + {file = "lxml-5.2.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ec42088248c596dbd61d4ae8a5b004f97a4d91a9fd286f632e42e60b706718d7"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cd53553ddad4a9c2f1f022756ae64abe16da1feb497edf4d9f87f99ec7cf86bd"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feaa45c0eae424d3e90d78823f3828e7dc42a42f21ed420db98da2c4ecf0a2cb"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ddc678fb4c7e30cf830a2b5a8d869538bc55b28d6c68544d09c7d0d8f17694dc"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:853e074d4931dbcba7480d4dcab23d5c56bd9607f92825ab80ee2bd916edea53"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc4691d60512798304acb9207987e7b2b7c44627ea88b9d77489bbe3e6cc3bd4"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:beb72935a941965c52990f3a32d7f07ce869fe21c6af8b34bf6a277b33a345d3"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_ppc64le.whl", hash = "sha256:6588c459c5627fefa30139be4d2e28a2c2a1d0d1c265aad2ba1935a7863a4913"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_s390x.whl", hash = "sha256:588008b8497667f1ddca7c99f2f85ce8511f8f7871b4a06ceede68ab62dff64b"}, + {file = "lxml-5.2.1-cp39-cp39-manylinux_2_28_x86_64.whl", hash = "sha256:b6787b643356111dfd4032b5bffe26d2f8331556ecb79e15dacb9275da02866e"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:7c17b64b0a6ef4e5affae6a3724010a7a66bda48a62cfe0674dabd46642e8b54"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:27aa20d45c2e0b8cd05da6d4759649170e8dfc4f4e5ef33a34d06f2d79075d57"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:d4f2cc7060dc3646632d7f15fe68e2fa98f58e35dd5666cd525f3b35d3fed7f8"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:ff46d772d5f6f73564979cd77a4fffe55c916a05f3cb70e7c9c0590059fb29ef"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:96323338e6c14e958d775700ec8a88346014a85e5de73ac7967db0367582049b"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:52421b41ac99e9d91934e4d0d0fe7da9f02bfa7536bb4431b4c05c906c8c6919"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:7a7efd5b6d3e30d81ec68ab8a88252d7c7c6f13aaa875009fe3097eb4e30b84c"}, + {file = "lxml-5.2.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:0ed777c1e8c99b63037b91f9d73a6aad20fd035d77ac84afcc205225f8f41188"}, + {file = "lxml-5.2.1-cp39-cp39-win32.whl", hash = "sha256:644df54d729ef810dcd0f7732e50e5ad1bd0a135278ed8d6bcb06f33b6b6f708"}, + {file = "lxml-5.2.1-cp39-cp39-win_amd64.whl", hash = "sha256:9ca66b8e90daca431b7ca1408cae085d025326570e57749695d6a01454790e95"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:9b0ff53900566bc6325ecde9181d89afadc59c5ffa39bddf084aaedfe3b06a11"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fd6037392f2d57793ab98d9e26798f44b8b4da2f2464388588f48ac52c489ea1"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b9c07e7a45bb64e21df4b6aa623cb8ba214dfb47d2027d90eac197329bb5e94"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3249cc2989d9090eeac5467e50e9ec2d40704fea9ab72f36b034ea34ee65ca98"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:f42038016852ae51b4088b2862126535cc4fc85802bfe30dea3500fdfaf1864e"}, + {file = "lxml-5.2.1-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:533658f8fbf056b70e434dff7e7aa611bcacb33e01f75de7f821810e48d1bb66"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:622020d4521e22fb371e15f580d153134bfb68d6a429d1342a25f051ec72df1c"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efa7b51824aa0ee957ccd5a741c73e6851de55f40d807f08069eb4c5a26b2baa"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c6ad0fbf105f6bcc9300c00010a2ffa44ea6f555df1a2ad95c88f5656104817"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:e233db59c8f76630c512ab4a4daf5a5986da5c3d5b44b8e9fc742f2a24dbd460"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:6a014510830df1475176466b6087fc0c08b47a36714823e58d8b8d7709132a96"}, + {file = "lxml-5.2.1-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:d38c8f50ecf57f0463399569aa388b232cf1a2ffb8f0a9a5412d0db57e054860"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:5aea8212fb823e006b995c4dda533edcf98a893d941f173f6c9506126188860d"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ff097ae562e637409b429a7ac958a20aab237a0378c42dabaa1e3abf2f896e5f"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0f5d65c39f16717a47c36c756af0fb36144069c4718824b7533f803ecdf91138"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:3d0c3dd24bb4605439bf91068598d00c6370684f8de4a67c2992683f6c309d6b"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e32be23d538753a8adb6c85bd539f5fd3b15cb987404327c569dfc5fd8366e85"}, + {file = "lxml-5.2.1-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:cc518cea79fd1e2f6c90baafa28906d4309d24f3a63e801d855e7424c5b34144"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:a0af35bd8ebf84888373630f73f24e86bf016642fb8576fba49d3d6b560b7cbc"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f8aca2e3a72f37bfc7b14ba96d4056244001ddcc18382bd0daa087fd2e68a354"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5ca1e8188b26a819387b29c3895c47a5e618708fe6f787f3b1a471de2c4a94d9"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c8ba129e6d3b0136a0f50345b2cb3db53f6bda5dd8c7f5d83fbccba97fb5dcb5"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:e998e304036198b4f6914e6a1e2b6f925208a20e2042563d9734881150c6c246"}, + {file = "lxml-5.2.1-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:d3be9b2076112e51b323bdf6d5a7f8a798de55fb8d95fcb64bd179460cdc0704"}, + {file = "lxml-5.2.1.tar.gz", hash = "sha256:3f7765e69bbce0906a7c74d5fe46d2c7a7596147318dbc08e4a2431f3060e306"}, +] + +[package.extras] +cssselect = ["cssselect (>=0.7)"] +html-clean = ["lxml-html-clean"] +html5 = ["html5lib"] +htmlsoup = ["BeautifulSoup4"] +source = ["Cython (>=3.0.10)"] + +[[package]] +name = "markdown" +version = "3.6" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "Markdown-3.6-py3-none-any.whl", hash = "sha256:48f276f4d8cfb8ce6527c8f79e2ee29708508bf4d40aa410fbc3b4ee832c850f"}, + {file = "Markdown-3.6.tar.gz", hash = "sha256:ed4f41f6daecbeeb96e576ce414c41d2d876daa9a16cb35fa8ed8c2ddfad0224"}, +] + +[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 = "markupsafe" +version = "2.1.5" +description = "Safely add untrusted strings to HTML/XML markup." +optional = false +python-versions = ">=3.7" +files = [ + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:a17a92de5231666cfbe003f0e4b9b3a7ae3afb1ec2845aadc2bacc93ff85febc"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:72b6be590cc35924b02c78ef34b467da4ba07e4e0f0454a2c5907f473fc50ce5"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e61659ba32cf2cf1481e575d0462554625196a1f2fc06a1c777d3f48e8865d46"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2174c595a0d73a3080ca3257b40096db99799265e1c27cc5a610743acd86d62f"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ae2ad8ae6ebee9d2d94b17fb62763125f3f374c25618198f40cbb8b525411900"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:075202fa5b72c86ad32dc7d0b56024ebdbcf2048c0ba09f1cde31bfdd57bcfff"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:598e3276b64aff0e7b3451b72e94fa3c238d452e7ddcd893c3ab324717456bad"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:fce659a462a1be54d2ffcacea5e3ba2d74daa74f30f5f143fe0c58636e355fdd"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win32.whl", hash = "sha256:d9fad5155d72433c921b782e58892377c44bd6252b5af2f67f16b194987338a4"}, + {file = "MarkupSafe-2.1.5-cp310-cp310-win_amd64.whl", hash = "sha256:bf50cd79a75d181c9181df03572cdce0fbb75cc353bc350712073108cba98de5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:629ddd2ca402ae6dbedfceeba9c46d5f7b2a61d9749597d4307f943ef198fc1f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5b7b716f97b52c5a14bffdf688f971b2d5ef4029127f1ad7a513973cfd818df2"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6ec585f69cec0aa07d945b20805be741395e28ac1627333b1c5b0105962ffced"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b91c037585eba9095565a3556f611e3cbfaa42ca1e865f7b8015fe5c7336d5a5"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7502934a33b54030eaf1194c21c692a534196063db72176b0c4028e140f8f32c"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:0e397ac966fdf721b2c528cf028494e86172b4feba51d65f81ffd65c63798f3f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:c061bb86a71b42465156a3ee7bd58c8c2ceacdbeb95d05a99893e08b8467359a"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:3a57fdd7ce31c7ff06cdfbf31dafa96cc533c21e443d57f5b1ecc6cdc668ec7f"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win32.whl", hash = "sha256:397081c1a0bfb5124355710fe79478cdbeb39626492b15d399526ae53422b906"}, + {file = "MarkupSafe-2.1.5-cp311-cp311-win_amd64.whl", hash = "sha256:2b7c57a4dfc4f16f7142221afe5ba4e093e09e728ca65c51f5620c9aaeb9a617"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:8dec4936e9c3100156f8a2dc89c4b88d5c435175ff03413b443469c7c8c5f4d1"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:3c6b973f22eb18a789b1460b4b91bf04ae3f0c4234a0a6aa6b0a92f6f7b951d4"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ac07bad82163452a6884fe8fa0963fb98c2346ba78d779ec06bd7a6262132aee"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f5dfb42c4604dddc8e4305050aa6deb084540643ed5804d7455b5df8fe16f5e5"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ea3d8a3d18833cf4304cd2fc9cbb1efe188ca9b5efef2bdac7adc20594a0e46b"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:d050b3361367a06d752db6ead6e7edeb0009be66bc3bae0ee9d97fb326badc2a"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bec0a414d016ac1a18862a519e54b2fd0fc8bbfd6890376898a6c0891dd82e9f"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:58c98fee265677f63a4385256a6d7683ab1832f3ddd1e66fe948d5880c21a169"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win32.whl", hash = "sha256:8590b4ae07a35970728874632fed7bd57b26b0102df2d2b233b6d9d82f6c62ad"}, + {file = "MarkupSafe-2.1.5-cp312-cp312-win_amd64.whl", hash = "sha256:823b65d8706e32ad2df51ed89496147a42a2a6e01c13cfb6ffb8b1e92bc910bb"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:c8b29db45f8fe46ad280a7294f5c3ec36dbac9491f2d1c17345be8e69cc5928f"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec6a563cff360b50eed26f13adc43e61bc0c04d94b8be985e6fb24b81f6dcfdf"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a549b9c31bec33820e885335b451286e2969a2d9e24879f83fe904a5ce59d70a"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4f11aa001c540f62c6166c7726f71f7573b52c68c31f014c25cc7901deea0b52"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:7b2e5a267c855eea6b4283940daa6e88a285f5f2a67f2220203786dfa59b37e9"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:2d2d793e36e230fd32babe143b04cec8a8b3eb8a3122d2aceb4a371e6b09b8df"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:ce409136744f6521e39fd8e2a24c53fa18ad67aa5bc7c2cf83645cce5b5c4e50"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win32.whl", hash = "sha256:4096e9de5c6fdf43fb4f04c26fb114f61ef0bf2e5604b6ee3019d51b69e8c371"}, + {file = "MarkupSafe-2.1.5-cp37-cp37m-win_amd64.whl", hash = "sha256:4275d846e41ecefa46e2015117a9f491e57a71ddd59bbead77e904dc02b1bed2"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:656f7526c69fac7f600bd1f400991cc282b417d17539a1b228617081106feb4a"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:97cafb1f3cbcd3fd2b6fbfb99ae11cdb14deea0736fc2b0952ee177f2b813a46"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f3fbcb7ef1f16e48246f704ab79d79da8a46891e2da03f8783a5b6fa41a9532"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fa9db3f79de01457b03d4f01b34cf91bc0048eb2c3846ff26f66687c2f6d16ab"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ffee1f21e5ef0d712f9033568f8344d5da8cc2869dbd08d87c84656e6a2d2f68"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:5dedb4db619ba5a2787a94d877bc8ffc0566f92a01c0ef214865e54ecc9ee5e0"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:30b600cf0a7ac9234b2638fbc0fb6158ba5bdcdf46aeb631ead21248b9affbc4"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:8dd717634f5a044f860435c1d8c16a270ddf0ef8588d4887037c5028b859b0c3"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win32.whl", hash = "sha256:daa4ee5a243f0f20d528d939d06670a298dd39b1ad5f8a72a4275124a7819eff"}, + {file = "MarkupSafe-2.1.5-cp38-cp38-win_amd64.whl", hash = "sha256:619bc166c4f2de5caa5a633b8b7326fbe98e0ccbfacabd87268a2b15ff73a029"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7a68b554d356a91cce1236aa7682dc01df0edba8d043fd1ce607c49dd3c1edcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:db0b55e0f3cc0be60c1f19efdde9a637c32740486004f20d1cff53c3c0ece4d2"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e53af139f8579a6d5f7b76549125f0d94d7e630761a2111bc431fd820e163b8"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:17b950fccb810b3293638215058e432159d2b71005c74371d784862b7e4683f3"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4c31f53cdae6ecfa91a77820e8b151dba54ab528ba65dfd235c80b086d68a465"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:bff1b4290a66b490a2f4719358c0cdcd9bafb6b8f061e45c7a2460866bf50c2e"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:bc1667f8b83f48511b94671e0e441401371dfd0f0a795c7daa4a3cd1dde55bea"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:5049256f536511ee3f7e1b3f87d1d1209d327e818e6ae1365e8653d7e3abb6a6"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win32.whl", hash = "sha256:00e046b6dd71aa03a41079792f8473dc494d564611a8f89bbbd7cb93295ebdcf"}, + {file = "MarkupSafe-2.1.5-cp39-cp39-win_amd64.whl", hash = "sha256:fa173ec60341d6bb97a89f5ea19c85c5643c1e7dedebc22f5181eb73573142c5"}, + {file = "MarkupSafe-2.1.5.tar.gz", hash = "sha256:d283d37a890ba4c1ae73ffadf8046435c76e7bc2247bbb63c00bd1a709c6544b"}, +] + +[[package]] +name = "matplotlib-inline" +version = "0.1.7" +description = "Inline Matplotlib backend for Jupyter" +optional = false +python-versions = ">=3.8" +files = [ + {file = "matplotlib_inline-0.1.7-py3-none-any.whl", hash = "sha256:df192d39a4ff8f21b1895d72e6a13f5fcc5099f00fa84384e0ea28c2cc0653ca"}, + {file = "matplotlib_inline-0.1.7.tar.gz", hash = "sha256:8423b23ec666be3d16e16b60bdd8ac4e86e840ebd1dd11a30b9f117f2fa0ab90"}, +] + +[package.dependencies] +traitlets = "*" + +[[package]] +name = "mdx-truly-sane-lists" +version = "1.3" +description = "Extension for Python-Markdown that makes lists truly sane. Custom indents for nested lists and fix for messy linebreaks." +optional = false +python-versions = "*" +files = [ + {file = "mdx_truly_sane_lists-1.3-py3-none-any.whl", hash = "sha256:b9546a4c40ff8f1ab692f77cee4b6bfe8ddf9cccf23f0a24e71f3716fe290a37"}, + {file = "mdx_truly_sane_lists-1.3.tar.gz", hash = "sha256:b661022df7520a1e113af7c355c62216b384c867e4f59fb8ee7ad511e6e77f45"}, +] + +[package.dependencies] +Markdown = ">=2.6" + +[[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 = "mkdocs" +version = "1.6.0" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs-1.6.0-py3-none-any.whl", hash = "sha256:1eb5cb7676b7d89323e62b56235010216319217d4af5ddc543a91beb8d125ea7"}, + {file = "mkdocs-1.6.0.tar.gz", hash = "sha256:a73f735824ef83a4f3bcb7a231dcab23f5a838f88b7efc54a0eef5fbdbc3c512"}, +] + +[package.dependencies] +click = ">=7.0" +colorama = {version = ">=0.4", markers = "platform_system == \"Windows\""} +ghp-import = ">=1.0" +jinja2 = ">=2.11.1" +markdown = ">=3.3.6" +markupsafe = ">=2.0.1" +mergedeep = ">=1.3.4" +mkdocs-get-deps = ">=0.2.0" +packaging = ">=20.5" +pathspec = ">=0.11.1" +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.4)", "jinja2 (==2.11.1)", "markdown (==3.3.6)", "markupsafe (==2.0.1)", "mergedeep (==1.3.4)", "mkdocs-get-deps (==0.2.0)", "packaging (==20.5)", "pathspec (==0.11.1)", "pyyaml (==5.1)", "pyyaml-env-tag (==0.1)", "watchdog (==2.0)"] + +[[package]] +name = "mkdocs-awesome-pages-plugin" +version = "2.9.2" +description = "An MkDocs plugin that simplifies configuring page titles and their order" +optional = false +python-versions = ">=3.7" +files = [ + {file = "mkdocs_awesome_pages_plugin-2.9.2-py3-none-any.whl", hash = "sha256:9c795587695bd1ee85a8b7e43293005418df5a8b9ef296a3e628be427b693b4d"}, + {file = "mkdocs_awesome_pages_plugin-2.9.2.tar.gz", hash = "sha256:c3f7d366ecfe99b64524c49a84d8e13c576c19a918ea2e6f59bb486a259313af"}, +] + +[package.dependencies] +mkdocs = ">=1" +natsort = ">=8.1.0" +wcmatch = ">=7" + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.0" +description = "MkDocs extension that lists all dependencies according to a mkdocs.yml file" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_get_deps-0.2.0-py3-none-any.whl", hash = "sha256:2bf11d0b133e77a0dd036abeeb06dec8775e46efa526dc70667d8863eefc6134"}, + {file = "mkdocs_get_deps-0.2.0.tar.gz", hash = "sha256:162b3d129c7fad9b19abfdcb9c1458a651628e4b1dea628ac68790fb3061c60c"}, +] + +[package.dependencies] +mergedeep = ">=1.3.4" +platformdirs = ">=2.2.0" +pyyaml = ">=5.1" + +[[package]] +name = "mkdocs-material" +version = "9.5.20" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +files = [ + {file = "mkdocs_material-9.5.20-py3-none-any.whl", hash = "sha256:ad0094a7597bcb5d0cc3e8e543a10927c2581f7f647b9bb4861600f583180f9b"}, + {file = "mkdocs_material-9.5.20.tar.gz", hash = "sha256:986eef0250d22f70fb06ce0f4eac64cc92bd797a589ec3892ce31fad976fe3da"}, +] + +[package.dependencies] +babel = ">=2.10,<3.0" +colorama = ">=0.4,<1.0" +jinja2 = ">=3.0,<4.0" +markdown = ">=3.2,<4.0" +mkdocs = ">=1.6,<2.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.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<11.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 = "mkdocs-video" +version = "1.5.0" +description = "" +optional = false +python-versions = ">=3.6" +files = [ + {file = "mkdocs-video-1.5.0.tar.gz", hash = "sha256:0defc018f4b7927f8afffc4d8e039c84dfba636dffc5e25e2bfa8d6350bc8eca"}, + {file = "mkdocs_video-1.5.0-py3-none-any.whl", hash = "sha256:b35613d4dacbac2dfa94d8c2600383cda14ad99a1fa1542b5fc4e9c6d19e9fe1"}, +] + +[package.dependencies] +lxml = ">=4.7.0" +mkdocs = ">=1.1.0,<2" + +[[package]] +name = "natsort" +version = "8.4.0" +description = "Simple yet flexible natural sorting in Python." +optional = false +python-versions = ">=3.7" +files = [ + {file = "natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c"}, + {file = "natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581"}, +] + +[package.extras] +fast = ["fastnumbers (>=2.0.0)"] +icu = ["PyICU (>=1.0.0)"] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +description = "Patch asyncio to allow nested event loops" +optional = false +python-versions = ">=3.5" +files = [ + {file = "nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c"}, + {file = "nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe"}, +] + +[[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 = "packaging" +version = "24.0" +description = "Core utilities for Python packages" +optional = false +python-versions = ">=3.7" +files = [ + {file = "packaging-24.0-py3-none-any.whl", hash = "sha256:2ddfb553fdf02fb784c234c7ba6ccc288296ceabec964ad2eae3777778130bc5"}, + {file = "packaging-24.0.tar.gz", hash = "sha256:eb82c5e3e56209074766e6885bb04b8c38a0c015d0a30036ebe7ece34c9989e9"}, +] + +[[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 = "parso" +version = "0.8.4" +description = "A Python Parser" +optional = false +python-versions = ">=3.6" +files = [ + {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, + {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, +] + +[package.extras] +qa = ["flake8 (==5.0.4)", "mypy (==0.971)", "types-setuptools (==67.2.0.1)"] +testing = ["docopt", "pytest"] + +[[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 = "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 = "platformdirs" +version = "4.2.1" +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.2.1-py3-none-any.whl", hash = "sha256:17d5a1161b3fd67b390023cb2d3b026bbd40abde6fdb052dfbd3a29c3ba22ee1"}, + {file = "platformdirs-4.2.1.tar.gz", hash = "sha256:031cd18d4ec63ec53e82dceaac0417d218a6863f7745dfcc9efe7793b7039bdf"}, +] + +[package.extras] +docs = ["furo (>=2023.9.10)", "proselint (>=0.13)", "sphinx (>=7.2.6)", "sphinx-autodoc-typehints (>=1.25.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=7.4.3)", "pytest-cov (>=4.1)", "pytest-mock (>=3.12)"] +type = ["mypy (>=1.8)"] + +[[package]] +name = "pluggy" +version = "1.5.0" +description = "plugin and hook calling mechanisms for python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pluggy-1.5.0-py3-none-any.whl", hash = "sha256:44e1ad92c8ca002de6377e165f3e0f1be63266ab4d554740532335b9d75ea669"}, + {file = "pluggy-1.5.0.tar.gz", hash = "sha256:2cffa88e94fdc978c4c574f15f9e59b7f4201d439195c3715ca9e2486f1d0cf1"}, +] + +[package.extras] +dev = ["pre-commit", "tox"] +testing = ["pytest", "pytest-benchmark"] + +[[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.8" +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.8-cp27-cp27m-macosx_10_9_x86_64.whl", hash = "sha256:26bd09967ae00920df88e0352a91cff1a78f8d69b3ecabbfe733610c0af486c8"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_i686.whl", hash = "sha256:05806de88103b25903dff19bb6692bd2e714ccf9e668d050d144012055cbca73"}, + {file = "psutil-5.9.8-cp27-cp27m-manylinux2010_x86_64.whl", hash = "sha256:611052c4bc70432ec770d5d54f64206aa7203a101ec273a0cd82418c86503bb7"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_i686.whl", hash = "sha256:50187900d73c1381ba1454cf40308c2bf6f34268518b3f36a9b663ca87e65e36"}, + {file = "psutil-5.9.8-cp27-cp27mu-manylinux2010_x86_64.whl", hash = "sha256:02615ed8c5ea222323408ceba16c60e99c3f91639b07da6373fb7e6539abc56d"}, + {file = "psutil-5.9.8-cp27-none-win32.whl", hash = "sha256:36f435891adb138ed3c9e58c6af3e2e6ca9ac2f365efe1f9cfef2794e6c93b4e"}, + {file = "psutil-5.9.8-cp27-none-win_amd64.whl", hash = "sha256:bd1184ceb3f87651a67b2708d4c3338e9b10c5df903f2e3776b62303b26cb631"}, + {file = "psutil-5.9.8-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:aee678c8720623dc456fa20659af736241f575d79429a0e5e9cf88ae0605cc81"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:8cb6403ce6d8e047495a701dc7c5bd788add903f8986d523e3e20b98b733e421"}, + {file = "psutil-5.9.8-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d06016f7f8625a1825ba3732081d77c94589dca78b7a3fc072194851e88461a4"}, + {file = "psutil-5.9.8-cp36-cp36m-win32.whl", hash = "sha256:7d79560ad97af658a0f6adfef8b834b53f64746d45b403f225b85c5c2c140eee"}, + {file = "psutil-5.9.8-cp36-cp36m-win_amd64.whl", hash = "sha256:27cc40c3493bb10de1be4b3f07cae4c010ce715290a5be22b98493509c6299e2"}, + {file = "psutil-5.9.8-cp37-abi3-win32.whl", hash = "sha256:bc56c2a1b0d15aa3eaa5a60c9f3f8e3e565303b465dbf57a1b730e7a2b9844e0"}, + {file = "psutil-5.9.8-cp37-abi3-win_amd64.whl", hash = "sha256:8db4c1b57507eef143a15a6884ca10f7c73876cdf5d51e713151c1236a0e68cf"}, + {file = "psutil-5.9.8-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:d16bbddf0693323b8c6123dd804100241da461e41d6e332fb0ba6058f630f8c8"}, + {file = "psutil-5.9.8.tar.gz", hash = "sha256:6be126e3225486dff286a8fb9a06246a5253f4c7c53b475ea5f5ac934e64194c"}, +] + +[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.22" +description = "C parser in Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, + {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, +] + +[[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.8.1" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.8" +files = [ + {file = "pymdown_extensions-10.8.1-py3-none-any.whl", hash = "sha256:f938326115884f48c6059c67377c46cf631c733ef3629b6eed1349989d1b30cb"}, + {file = "pymdown_extensions-10.8.1.tar.gz", hash = "sha256:3ab1db5c9e21728dabf75192d71471f8e50f216627e9a1fa9535ecb0231b9940"}, +] + +[package.dependencies] +markdown = ">=3.6" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.12)"] + +[[package]] +name = "pyright" +version = "1.1.361" +description = "Command line wrapper for pyright" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyright-1.1.361-py3-none-any.whl", hash = "sha256:c50fc94ce92b5c958cfccbbe34142e7411d474da43d6c14a958667e35b9df7ea"}, + {file = "pyright-1.1.361.tar.gz", hash = "sha256:1d67933315666b05d230c85ea8fb97aaa2056e4092a13df87b7765bb9e8f1a8d"}, +] + +[package.dependencies] +nodeenv = ">=1.6.0" + +[package.extras] +all = ["twine (>=3.4.1)"] +dev = ["twine (>=3.4.1)"] + +[[package]] +name = "pytest" +version = "8.2.0" +description = "pytest: simple powerful testing with Python" +optional = false +python-versions = ">=3.8" +files = [ + {file = "pytest-8.2.0-py3-none-any.whl", hash = "sha256:1733f0620f6cda4095bbf0d9ff8022486e91892245bb9e7d5542c018f612f233"}, + {file = "pytest-8.2.0.tar.gz", hash = "sha256:d507d4482197eac0ba2bae2e9babf0672eb333017bcedaa5fb1a3d42c1174b3f"}, +] + +[package.dependencies] +colorama = {version = "*", markers = "sys_platform == \"win32\""} +exceptiongroup = {version = ">=1.0.0rc8", markers = "python_version < \"3.11\""} +iniconfig = "*" +packaging = "*" +pluggy = ">=1.5,<2.0" +tomli = {version = ">=1", markers = "python_version < \"3.11\""} + +[package.extras] +dev = ["argcomplete", "attrs (>=19.2)", "hypothesis (>=3.56)", "mock", "pygments (>=2.7.2)", "requests", "setuptools", "xmlschema"] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +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.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3"}, + {file = "python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427"}, +] + +[package.dependencies] +six = ">=1.5" + +[[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 = "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_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, + {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 = "26.0.3" +description = "Python bindings for 0MQ" +optional = false +python-versions = ">=3.7" +files = [ + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:44dd6fc3034f1eaa72ece33588867df9e006a7303725a12d64c3dff92330f625"}, + {file = "pyzmq-26.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:acb704195a71ac5ea5ecf2811c9ee19ecdc62b91878528302dd0be1b9451cc90"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5dbb9c997932473a27afa93954bb77a9f9b786b4ccf718d903f35da3232317de"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6bcb34f869d431799c3ee7d516554797f7760cb2198ecaa89c3f176f72d062be"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:38ece17ec5f20d7d9b442e5174ae9f020365d01ba7c112205a4d59cf19dc38ee"}, + {file = "pyzmq-26.0.3-cp310-cp310-manylinux_2_28_x86_64.whl", hash = "sha256:ba6e5e6588e49139a0979d03a7deb9c734bde647b9a8808f26acf9c547cab1bf"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:3bf8b000a4e2967e6dfdd8656cd0757d18c7e5ce3d16339e550bd462f4857e59"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:2136f64fbb86451dbbf70223635a468272dd20075f988a102bf8a3f194a411dc"}, + {file = "pyzmq-26.0.3-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:e8918973fbd34e7814f59143c5f600ecd38b8038161239fd1a3d33d5817a38b8"}, + {file = "pyzmq-26.0.3-cp310-cp310-win32.whl", hash = "sha256:0aaf982e68a7ac284377d051c742610220fd06d330dcd4c4dbb4cdd77c22a537"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:f1a9b7d00fdf60b4039f4455afd031fe85ee8305b019334b72dcf73c567edc47"}, + {file = "pyzmq-26.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:80b12f25d805a919d53efc0a5ad7c0c0326f13b4eae981a5d7b7cc343318ebb7"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:a72a84570f84c374b4c287183debc776dc319d3e8ce6b6a0041ce2e400de3f32"}, + {file = "pyzmq-26.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:7ca684ee649b55fd8f378127ac8462fb6c85f251c2fb027eb3c887e8ee347bcd"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e222562dc0f38571c8b1ffdae9d7adb866363134299264a1958d077800b193b7"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f17cde1db0754c35a91ac00b22b25c11da6eec5746431d6e5092f0cd31a3fea9"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b7c0c0b3244bb2275abe255d4a30c050d541c6cb18b870975553f1fb6f37527"}, + {file = "pyzmq-26.0.3-cp311-cp311-manylinux_2_28_x86_64.whl", hash = "sha256:ac97a21de3712afe6a6c071abfad40a6224fd14fa6ff0ff8d0c6e6cd4e2f807a"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:88b88282e55fa39dd556d7fc04160bcf39dea015f78e0cecec8ff4f06c1fc2b5"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:72b67f966b57dbd18dcc7efbc1c7fc9f5f983e572db1877081f075004614fcdd"}, + {file = "pyzmq-26.0.3-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:f4b6cecbbf3b7380f3b61de3a7b93cb721125dc125c854c14ddc91225ba52f83"}, + {file = "pyzmq-26.0.3-cp311-cp311-win32.whl", hash = "sha256:eed56b6a39216d31ff8cd2f1d048b5bf1700e4b32a01b14379c3b6dde9ce3aa3"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:3191d312c73e3cfd0f0afdf51df8405aafeb0bad71e7ed8f68b24b63c4f36500"}, + {file = "pyzmq-26.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:b6907da3017ef55139cf0e417c5123a84c7332520e73a6902ff1f79046cd3b94"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_15_universal2.whl", hash = "sha256:068ca17214038ae986d68f4a7021f97e187ed278ab6dccb79f837d765a54d753"}, + {file = "pyzmq-26.0.3-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:7821d44fe07335bea256b9f1f41474a642ca55fa671dfd9f00af8d68a920c2d4"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eeb438a26d87c123bb318e5f2b3d86a36060b01f22fbdffd8cf247d52f7c9a2b"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:69ea9d6d9baa25a4dc9cef5e2b77b8537827b122214f210dd925132e34ae9b12"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7daa3e1369355766dea11f1d8ef829905c3b9da886ea3152788dc25ee6079e02"}, + {file = "pyzmq-26.0.3-cp312-cp312-manylinux_2_28_x86_64.whl", hash = "sha256:6ca7a9a06b52d0e38ccf6bca1aeff7be178917893f3883f37b75589d42c4ac20"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:1b7d0e124948daa4d9686d421ef5087c0516bc6179fdcf8828b8444f8e461a77"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:e746524418b70f38550f2190eeee834db8850088c834d4c8406fbb9bc1ae10b2"}, + {file = "pyzmq-26.0.3-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:6b3146f9ae6af82c47a5282ac8803523d381b3b21caeae0327ed2f7ecb718798"}, + {file = "pyzmq-26.0.3-cp312-cp312-win32.whl", hash = "sha256:2b291d1230845871c00c8462c50565a9cd6026fe1228e77ca934470bb7d70ea0"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:926838a535c2c1ea21c903f909a9a54e675c2126728c21381a94ddf37c3cbddf"}, + {file = "pyzmq-26.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:5bf6c237f8c681dfb91b17f8435b2735951f0d1fad10cc5dfd96db110243370b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-macosx_10_9_x86_64.whl", hash = "sha256:0c0991f5a96a8e620f7691e61178cd8f457b49e17b7d9cfa2067e2a0a89fc1d5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:dbf012d8fcb9f2cf0643b65df3b355fdd74fc0035d70bb5c845e9e30a3a4654b"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:01fbfbeb8249a68d257f601deb50c70c929dc2dfe683b754659569e502fbd3aa"}, + {file = "pyzmq-26.0.3-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c8eb19abe87029c18f226d42b8a2c9efdd139d08f8bf6e085dd9075446db450"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_aarch64.whl", hash = "sha256:5344b896e79800af86ad643408ca9aa303a017f6ebff8cee5a3163c1e9aec987"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_i686.whl", hash = "sha256:204e0f176fd1d067671157d049466869b3ae1fc51e354708b0dc41cf94e23a3a"}, + {file = "pyzmq-26.0.3-cp37-cp37m-musllinux_1_1_x86_64.whl", hash = "sha256:a42db008d58530efa3b881eeee4991146de0b790e095f7ae43ba5cc612decbc5"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win32.whl", hash = "sha256:8d7a498671ca87e32b54cb47c82a92b40130a26c5197d392720a1bce1b3c77cf"}, + {file = "pyzmq-26.0.3-cp37-cp37m-win_amd64.whl", hash = "sha256:3b4032a96410bdc760061b14ed6a33613ffb7f702181ba999df5d16fb96ba16a"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:2cc4e280098c1b192c42a849de8de2c8e0f3a84086a76ec5b07bfee29bda7d18"}, + {file = "pyzmq-26.0.3-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:5bde86a2ed3ce587fa2b207424ce15b9a83a9fa14422dcc1c5356a13aed3df9d"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:34106f68e20e6ff253c9f596ea50397dbd8699828d55e8fa18bd4323d8d966e6"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:ebbbd0e728af5db9b04e56389e2299a57ea8b9dd15c9759153ee2455b32be6ad"}, + {file = "pyzmq-26.0.3-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f6b1d1c631e5940cac5a0b22c5379c86e8df6a4ec277c7a856b714021ab6cfad"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:e891ce81edd463b3b4c3b885c5603c00141151dd9c6936d98a680c8c72fe5c67"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:9b273ecfbc590a1b98f014ae41e5cf723932f3b53ba9367cfb676f838038b32c"}, + {file = "pyzmq-26.0.3-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:b32bff85fb02a75ea0b68f21e2412255b5731f3f389ed9aecc13a6752f58ac97"}, + {file = "pyzmq-26.0.3-cp38-cp38-win32.whl", hash = "sha256:f6c21c00478a7bea93caaaef9e7629145d4153b15a8653e8bb4609d4bc70dbfc"}, + {file = "pyzmq-26.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:3401613148d93ef0fd9aabdbddb212de3db7a4475367f49f590c837355343972"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:2ed8357f4c6e0daa4f3baf31832df8a33334e0fe5b020a61bc8b345a3db7a606"}, + {file = "pyzmq-26.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c1c8f2a2ca45292084c75bb6d3a25545cff0ed931ed228d3a1810ae3758f975f"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:b63731993cdddcc8e087c64e9cf003f909262b359110070183d7f3025d1c56b5"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b3cd31f859b662ac5d7f4226ec7d8bd60384fa037fc02aee6ff0b53ba29a3ba8"}, + {file = "pyzmq-26.0.3-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:115f8359402fa527cf47708d6f8a0f8234f0e9ca0cab7c18c9c189c194dbf620"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:715bdf952b9533ba13dfcf1f431a8f49e63cecc31d91d007bc1deb914f47d0e4"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:e1258c639e00bf5e8a522fec6c3eaa3e30cf1c23a2f21a586be7e04d50c9acab"}, + {file = "pyzmq-26.0.3-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:15c59e780be8f30a60816a9adab900c12a58d79c1ac742b4a8df044ab2a6d920"}, + {file = "pyzmq-26.0.3-cp39-cp39-win32.whl", hash = "sha256:d0cdde3c78d8ab5b46595054e5def32a755fc028685add5ddc7403e9f6de9879"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:ce828058d482ef860746bf532822842e0ff484e27f540ef5c813d516dd8896d2"}, + {file = "pyzmq-26.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:788f15721c64109cf720791714dc14afd0f449d63f3a5487724f024345067381"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:2c18645ef6294d99b256806e34653e86236eb266278c8ec8112622b61db255de"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7e6bc96ebe49604df3ec2c6389cc3876cabe475e6bfc84ced1bf4e630662cb35"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:971e8990c5cc4ddcff26e149398fc7b0f6a042306e82500f5e8db3b10ce69f84"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d8416c23161abd94cc7da80c734ad7c9f5dbebdadfdaa77dad78244457448223"}, + {file = "pyzmq-26.0.3-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:082a2988364b60bb5de809373098361cf1dbb239623e39e46cb18bc035ed9c0c"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d57dfbf9737763b3a60d26e6800e02e04284926329aee8fb01049635e957fe81"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:77a85dca4c2430ac04dc2a2185c2deb3858a34fe7f403d0a946fa56970cf60a1"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:4c82a6d952a1d555bf4be42b6532927d2a5686dd3c3e280e5f63225ab47ac1f5"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4496b1282c70c442809fc1b151977c3d967bfb33e4e17cedbf226d97de18f709"}, + {file = "pyzmq-26.0.3-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:e4946d6bdb7ba972dfda282f9127e5756d4f299028b1566d1245fa0d438847e6"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:03c0ae165e700364b266876d712acb1ac02693acd920afa67da2ebb91a0b3c09"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:3e3070e680f79887d60feeda051a58d0ac36622e1759f305a41059eff62c6da7"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:6ca08b840fe95d1c2bd9ab92dac5685f949fc6f9ae820ec16193e5ddf603c3b2"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e76654e9dbfb835b3518f9938e565c7806976c07b37c33526b574cc1a1050480"}, + {file = "pyzmq-26.0.3-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:871587bdadd1075b112e697173e946a07d722459d20716ceb3d1bd6c64bd08ce"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d0a2d1bd63a4ad79483049b26514e70fa618ce6115220da9efdff63688808b17"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0270b49b6847f0d106d64b5086e9ad5dc8a902413b5dbbb15d12b60f9c1747a4"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:703c60b9910488d3d0954ca585c34f541e506a091a41930e663a098d3b794c67"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:74423631b6be371edfbf7eabb02ab995c2563fee60a80a30829176842e71722a"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:4adfbb5451196842a88fda3612e2c0414134874bffb1c2ce83ab4242ec9e027d"}, + {file = "pyzmq-26.0.3-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:3516119f4f9b8671083a70b6afaa0a070f5683e431ab3dc26e9215620d7ca1ad"}, + {file = "pyzmq-26.0.3.tar.gz", hash = "sha256:dba7d9f2e047dfa2bca3b01f4f84aa5246725203d6284e3790f2ca15fba6b40a"}, +] + +[package.dependencies] +cffi = {version = "*", markers = "implementation_name == \"pypy\""} + +[[package]] +name = "regex" +version = "2024.4.28" +description = "Alternative regular expression module, to replace re." +optional = false +python-versions = ">=3.8" +files = [ + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:cd196d056b40af073d95a2879678585f0b74ad35190fac04ca67954c582c6b61"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8bb381f777351bd534462f63e1c6afb10a7caa9fa2a421ae22c26e796fe31b1f"}, + {file = "regex-2024.4.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:47af45b6153522733aa6e92543938e97a70ce0900649ba626cf5aad290b737b6"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:99d6a550425cc51c656331af0e2b1651e90eaaa23fb4acde577cf15068e2e20f"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:bf29304a8011feb58913c382902fde3395957a47645bf848eea695839aa101b7"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:92da587eee39a52c91aebea8b850e4e4f095fe5928d415cb7ed656b3460ae79a"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6277d426e2f31bdbacb377d17a7475e32b2d7d1f02faaecc48d8e370c6a3ff31"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:28e1f28d07220c0f3da0e8fcd5a115bbb53f8b55cecf9bec0c946eb9a059a94c"}, + {file = "regex-2024.4.28-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:aaa179975a64790c1f2701ac562b5eeb733946eeb036b5bcca05c8d928a62f10"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:6f435946b7bf7a1b438b4e6b149b947c837cb23c704e780c19ba3e6855dbbdd3"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:19d6c11bf35a6ad077eb23852827f91c804eeb71ecb85db4ee1386825b9dc4db"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_ppc64le.whl", hash = "sha256:fdae0120cddc839eb8e3c15faa8ad541cc6d906d3eb24d82fb041cfe2807bc1e"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_s390x.whl", hash = "sha256:e672cf9caaf669053121f1766d659a8813bd547edef6e009205378faf45c67b8"}, + {file = "regex-2024.4.28-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:f57515750d07e14743db55d59759893fdb21d2668f39e549a7d6cad5d70f9fea"}, + {file = "regex-2024.4.28-cp310-cp310-win32.whl", hash = "sha256:a1409c4eccb6981c7baabc8888d3550df518add6e06fe74fa1d9312c1838652d"}, + {file = "regex-2024.4.28-cp310-cp310-win_amd64.whl", hash = "sha256:1f687a28640f763f23f8a9801fe9e1b37338bb1ca5d564ddd41619458f1f22d1"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:84077821c85f222362b72fdc44f7a3a13587a013a45cf14534df1cbbdc9a6796"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b45d4503de8f4f3dc02f1d28a9b039e5504a02cc18906cfe744c11def942e9eb"}, + {file = "regex-2024.4.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:457c2cd5a646dd4ed536c92b535d73548fb8e216ebee602aa9f48e068fc393f3"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2b51739ddfd013c6f657b55a508de8b9ea78b56d22b236052c3a85a675102dc6"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:459226445c7d7454981c4c0ce0ad1a72e1e751c3e417f305722bbcee6697e06a"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:670fa596984b08a4a769491cbdf22350431970d0112e03d7e4eeaecaafcd0fec"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fe00f4fe11c8a521b173e6324d862ee7ee3412bf7107570c9b564fe1119b56fb"}, + {file = "regex-2024.4.28-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:36f392dc7763fe7924575475736bddf9ab9f7a66b920932d0ea50c2ded2f5636"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:23a412b7b1a7063f81a742463f38821097b6a37ce1e5b89dd8e871d14dbfd86b"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:f1d6e4b7b2ae3a6a9df53efbf199e4bfcff0959dbdb5fd9ced34d4407348e39a"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_ppc64le.whl", hash = "sha256:499334ad139557de97cbc4347ee921c0e2b5e9c0f009859e74f3f77918339257"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_s390x.whl", hash = "sha256:0940038bec2fe9e26b203d636c44d31dd8766abc1fe66262da6484bd82461ccf"}, + {file = "regex-2024.4.28-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:66372c2a01782c5fe8e04bff4a2a0121a9897e19223d9eab30c54c50b2ebeb7f"}, + {file = "regex-2024.4.28-cp311-cp311-win32.whl", hash = "sha256:c77d10ec3c1cf328b2f501ca32583625987ea0f23a0c2a49b37a39ee5c4c4630"}, + {file = "regex-2024.4.28-cp311-cp311-win_amd64.whl", hash = "sha256:fc0916c4295c64d6890a46e02d4482bb5ccf33bf1a824c0eaa9e83b148291f90"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:08a1749f04fee2811c7617fdd46d2e46d09106fa8f475c884b65c01326eb15c5"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:b8eb28995771c087a73338f695a08c9abfdf723d185e57b97f6175c5051ff1ae"}, + {file = "regex-2024.4.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:dd7ef715ccb8040954d44cfeff17e6b8e9f79c8019daae2fd30a8806ef5435c0"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:fb0315a2b26fde4005a7c401707c5352df274460f2f85b209cf6024271373013"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f2fc053228a6bd3a17a9b0a3f15c3ab3cf95727b00557e92e1cfe094b88cc662"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7fe9739a686dc44733d52d6e4f7b9c77b285e49edf8570754b322bca6b85b4cc"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a74fcf77d979364f9b69fcf8200849ca29a374973dc193a7317698aa37d8b01c"}, + {file = "regex-2024.4.28-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:965fd0cf4694d76f6564896b422724ec7b959ef927a7cb187fc6b3f4e4f59833"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2fef0b38c34ae675fcbb1b5db760d40c3fc3612cfa186e9e50df5782cac02bcd"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_i686.whl", hash = "sha256:bc365ce25f6c7c5ed70e4bc674f9137f52b7dd6a125037f9132a7be52b8a252f"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_ppc64le.whl", hash = "sha256:ac69b394764bb857429b031d29d9604842bc4cbfd964d764b1af1868eeebc4f0"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_s390x.whl", hash = "sha256:144a1fc54765f5c5c36d6d4b073299832aa1ec6a746a6452c3ee7b46b3d3b11d"}, + {file = "regex-2024.4.28-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2630ca4e152c221072fd4a56d4622b5ada876f668ecd24d5ab62544ae6793ed6"}, + {file = "regex-2024.4.28-cp312-cp312-win32.whl", hash = "sha256:7f3502f03b4da52bbe8ba962621daa846f38489cae5c4a7b5d738f15f6443d17"}, + {file = "regex-2024.4.28-cp312-cp312-win_amd64.whl", hash = "sha256:0dd3f69098511e71880fb00f5815db9ed0ef62c05775395968299cb400aeab82"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:374f690e1dd0dbdcddea4a5c9bdd97632cf656c69113f7cd6a361f2a67221cb6"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:25f87ae6b96374db20f180eab083aafe419b194e96e4f282c40191e71980c666"}, + {file = "regex-2024.4.28-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:5dbc1bcc7413eebe5f18196e22804a3be1bfdfc7e2afd415e12c068624d48247"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f85151ec5a232335f1be022b09fbbe459042ea1951d8a48fef251223fc67eee1"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:57ba112e5530530fd175ed550373eb263db4ca98b5f00694d73b18b9a02e7185"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:224803b74aab56aa7be313f92a8d9911dcade37e5f167db62a738d0c85fdac4b"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0a54a047b607fd2d2d52a05e6ad294602f1e0dec2291152b745870afc47c1397"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0a2a512d623f1f2d01d881513af9fc6a7c46e5cfffb7dc50c38ce959f9246c94"}, + {file = "regex-2024.4.28-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:c06bf3f38f0707592898428636cbb75d0a846651b053a1cf748763e3063a6925"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_aarch64.whl", hash = "sha256:1031a5e7b048ee371ab3653aad3030ecfad6ee9ecdc85f0242c57751a05b0ac4"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_i686.whl", hash = "sha256:d7a353ebfa7154c871a35caca7bfd8f9e18666829a1dc187115b80e35a29393e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_ppc64le.whl", hash = "sha256:7e76b9cfbf5ced1aca15a0e5b6f229344d9b3123439ffce552b11faab0114a02"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_s390x.whl", hash = "sha256:5ce479ecc068bc2a74cb98dd8dba99e070d1b2f4a8371a7dfe631f85db70fe6e"}, + {file = "regex-2024.4.28-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:7d77b6f63f806578c604dca209280e4c54f0fa9a8128bb8d2cc5fb6f99da4150"}, + {file = "regex-2024.4.28-cp38-cp38-win32.whl", hash = "sha256:d84308f097d7a513359757c69707ad339da799e53b7393819ec2ea36bc4beb58"}, + {file = "regex-2024.4.28-cp38-cp38-win_amd64.whl", hash = "sha256:2cc1b87bba1dd1a898e664a31012725e48af826bf3971e786c53e32e02adae6c"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:7413167c507a768eafb5424413c5b2f515c606be5bb4ef8c5dee43925aa5718b"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:108e2dcf0b53a7c4ab8986842a8edcb8ab2e59919a74ff51c296772e8e74d0ae"}, + {file = "regex-2024.4.28-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f1c5742c31ba7d72f2dedf7968998730664b45e38827637e0f04a2ac7de2f5f1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecc6148228c9ae25ce403eade13a0961de1cb016bdb35c6eafd8e7b87ad028b1"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b7d893c8cf0e2429b823ef1a1d360a25950ed11f0e2a9df2b5198821832e1947"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4290035b169578ffbbfa50d904d26bec16a94526071ebec3dadbebf67a26b25e"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:44a22ae1cfd82e4ffa2066eb3390777dc79468f866f0625261a93e44cdf6482b"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fd24fd140b69f0b0bcc9165c397e9b2e89ecbeda83303abf2a072609f60239e2"}, + {file = "regex-2024.4.28-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:39fb166d2196413bead229cd64a2ffd6ec78ebab83fff7d2701103cf9f4dfd26"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9301cc6db4d83d2c0719f7fcda37229691745168bf6ae849bea2e85fc769175d"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:7c3d389e8d76a49923683123730c33e9553063d9041658f23897f0b396b2386f"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_ppc64le.whl", hash = "sha256:99ef6289b62042500d581170d06e17f5353b111a15aa6b25b05b91c6886df8fc"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_s390x.whl", hash = "sha256:b91d529b47798c016d4b4c1d06cc826ac40d196da54f0de3c519f5a297c5076a"}, + {file = "regex-2024.4.28-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:43548ad74ea50456e1c68d3c67fff3de64c6edb85bcd511d1136f9b5376fc9d1"}, + {file = "regex-2024.4.28-cp39-cp39-win32.whl", hash = "sha256:05d9b6578a22db7dedb4df81451f360395828b04f4513980b6bd7a1412c679cc"}, + {file = "regex-2024.4.28-cp39-cp39-win_amd64.whl", hash = "sha256:3986217ec830c2109875be740531feb8ddafe0dfa49767cdcd072ed7e8927962"}, + {file = "regex-2024.4.28.tar.gz", hash = "sha256:83ab366777ea45d58f72593adf35d36ca911ea8bd838483c1823b883a121b0e4"}, +] + +[[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 = "ruff" +version = "0.2.2" +description = "An extremely fast Python linter and code formatter, written in Rust." +optional = false +python-versions = ">=3.7" +files = [ + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:0a9efb032855ffb3c21f6405751d5e147b0c6b631e3ca3f6b20f917572b97eb6"}, + {file = "ruff-0.2.2-py3-none-macosx_10_12_x86_64.whl", hash = "sha256:d450b7fbff85913f866a5384d8912710936e2b96da74541c82c1b458472ddb39"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ecd46e3106850a5c26aee114e562c329f9a1fbe9e4821b008c4404f64ff9ce73"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5e22676a5b875bd72acd3d11d5fa9075d3a5f53b877fe7b4793e4673499318ba"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1695700d1e25a99d28f7a1636d85bafcc5030bba9d0578c0781ba1790dbcf51c"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64.manylinux2014_ppc64.whl", hash = "sha256:b0c232af3d0bd8f521806223723456ffebf8e323bd1e4e82b0befb20ba18388e"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f63d96494eeec2fc70d909393bcd76c69f35334cdbd9e20d089fb3f0640216ca"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6a61ea0ff048e06de273b2e45bd72629f470f5da8f71daf09fe481278b175001"}, + {file = "ruff-0.2.2-py3-none-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:5e1439c8f407e4f356470e54cdecdca1bd5439a0673792dbe34a2b0a551a2fe3"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:940de32dc8853eba0f67f7198b3e79bc6ba95c2edbfdfac2144c8235114d6726"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_armv7l.whl", hash = "sha256:0c126da55c38dd917621552ab430213bdb3273bb10ddb67bc4b761989210eb6e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_i686.whl", hash = "sha256:3b65494f7e4bed2e74110dac1f0d17dc8e1f42faaa784e7c58a98e335ec83d7e"}, + {file = "ruff-0.2.2-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:1ec49be4fe6ddac0503833f3ed8930528e26d1e60ad35c2446da372d16651ce9"}, + {file = "ruff-0.2.2-py3-none-win32.whl", hash = "sha256:d920499b576f6c68295bc04e7b17b6544d9d05f196bb3aac4358792ef6f34325"}, + {file = "ruff-0.2.2-py3-none-win_amd64.whl", hash = "sha256:cc9a91ae137d687f43a44c900e5d95e9617cb37d4c989e462980ba27039d239d"}, + {file = "ruff-0.2.2-py3-none-win_arm64.whl", hash = "sha256:c9d15fc41e6054bfc7200478720570078f0b41c9ae4f010bcc16bd6f4d1aacdd"}, + {file = "ruff-0.2.2.tar.gz", hash = "sha256:e62ed7f36b3068a30ba39193a14274cd706bc486fad521276458022f7bccb31d"}, +] + +[[package]] +name = "setuptools" +version = "69.5.1" +description = "Easily download, build, install, upgrade, and uninstall Python packages" +optional = false +python-versions = ">=3.8" +files = [ + {file = "setuptools-69.5.1-py3-none-any.whl", hash = "sha256:c636ac361bc47580504644275c9ad802c50415c7522212252c033bd15f301f32"}, + {file = "setuptools-69.5.1.tar.gz", hash = "sha256:6c1fccdac05a97e598fb0ae3bbed5904ccb317337a51139dcd51453611bbb987"}, +] + +[package.extras] +docs = ["furo", "jaraco.packaging (>=9.3)", "jaraco.tidelift (>=1.4)", "pygments-github-lexers (==0.0.5)", "rst.linker (>=1.9)", "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)", "importlib-metadata", "ini2toml[lite] (>=0.9)", "jaraco.develop (>=7.21)", "jaraco.envs (>=2.2)", "jaraco.path (>=3.2.0)", "mypy (==1.9)", "packaging (>=23.2)", "pip (>=19.1)", "pytest (>=6,!=8.1.1)", "pytest-checkdocs (>=2.4)", "pytest-cov", "pytest-enabler (>=2.2)", "pytest-home (>=0.5)", "pytest-mypy", "pytest-perf", "pytest-ruff (>=0.2.1)", "pytest-timeout", "pytest-xdist (>=3)", "tomli", "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.2)", "pytest", "pytest-enabler", "pytest-xdist", "tomli", "virtualenv (>=13.0.0)", "wheel"] + +[[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 = "snowballstemmer" +version = "2.2.0" +description = "This package provides 29 stemmers for 28 languages generated from Snowball algorithms." +optional = false +python-versions = "*" +files = [ + {file = "snowballstemmer-2.2.0-py2.py3-none-any.whl", hash = "sha256:c8e1716e83cc398ae16824e5572ae04e0d9fc2c6b985fb0f900f5f0c96ecba1a"}, + {file = "snowballstemmer-2.2.0.tar.gz", hash = "sha256:09b16deb8547d3412ad7b590689584cd0fe25ec8db3be37788be3810cbf19cb1"}, +] + +[[package]] +name = "sphinx" +version = "7.3.7" +description = "Python documentation generator" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx-7.3.7-py3-none-any.whl", hash = "sha256:413f75440be4cacf328f580b4274ada4565fb2187d696a84970c23f77b64d8c3"}, + {file = "sphinx-7.3.7.tar.gz", hash = "sha256:a4a7db75ed37531c05002d56ed6948d4c42f473a36f46e1382b0bd76ca9627bc"}, +] + +[package.dependencies] +alabaster = ">=0.7.14,<0.8.0" +babel = ">=2.9" +colorama = {version = ">=0.4.5", markers = "sys_platform == \"win32\""} +docutils = ">=0.18.1,<0.22" +imagesize = ">=1.3" +Jinja2 = ">=3.0" +packaging = ">=21.0" +Pygments = ">=2.14" +requests = ">=2.25.0" +snowballstemmer = ">=2.0" +sphinxcontrib-applehelp = "*" +sphinxcontrib-devhelp = "*" +sphinxcontrib-htmlhelp = ">=2.0.0" +sphinxcontrib-jsmath = "*" +sphinxcontrib-qthelp = "*" +sphinxcontrib-serializinghtml = ">=1.1.9" +tomli = {version = ">=2", markers = "python_version < \"3.11\""} + +[package.extras] +docs = ["sphinxcontrib-websupport"] +lint = ["flake8 (>=3.5.0)", "importlib_metadata", "mypy (==1.9.0)", "pytest (>=6.0)", "ruff (==0.3.7)", "sphinx-lint", "tomli", "types-docutils", "types-requests"] +test = ["cython (>=3.0)", "defusedxml (>=0.7.1)", "pytest (>=6.0)", "setuptools (>=67.0)"] + +[[package]] +name = "sphinx-autodoc-typehints" +version = "2.1.0" +description = "Type hints (PEP 484) support for the Sphinx autodoc extension" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinx_autodoc_typehints-2.1.0-py3-none-any.whl", hash = "sha256:46f1a710b3ed35904f63a77c5e68334c5ee1c2e22828b75fdcd147f1c52c199b"}, + {file = "sphinx_autodoc_typehints-2.1.0.tar.gz", hash = "sha256:51bf8dc77c4fba747e32f0735002a91500747d0553cae616863848e8f5e49fe8"}, +] + +[package.dependencies] +sphinx = ">=7.3.5" + +[package.extras] +docs = ["furo (>=2024.1.29)"] +numpy = ["nptyping (>=2.5)"] +testing = ["covdefaults (>=2.3)", "coverage (>=7.4.4)", "defusedxml (>=0.7.1)", "diff-cover (>=9)", "pytest (>=8.1.1)", "pytest-cov (>=5)", "sphobjinv (>=2.3.1)", "typing-extensions (>=4.11)"] + +[[package]] +name = "sphinx-markdown-builder" +version = "0.6.6" +description = "A Sphinx extension to add markdown generation support." +optional = false +python-versions = ">=3.7" +files = [ + {file = "sphinx-markdown-builder-0.6.6.tar.gz", hash = "sha256:febd8e03e20e357e624c52efdc7ef9d5ab70d58549784158033c9657d040f44e"}, + {file = "sphinx_markdown_builder-0.6.6-py3-none-any.whl", hash = "sha256:e6fd4626c6daf1c25a464fd7d6d64e4a97e69abca1684fb2a12fba44cb6db363"}, +] + +[package.dependencies] +docutils = "*" +sphinx = ">=5.1.0" +tabulate = "*" + +[package.extras] +dev = ["black", "bumpver", "coveralls", "flake8", "isort", "pip-tools", "pylint", "pytest", "pytest-cov", "sphinx (>=5.3.0)", "sphinx-needs", "sphinxcontrib-plantuml", "sphinxcontrib.httpdomain"] + +[[package]] +name = "sphinxcontrib-applehelp" +version = "1.0.8" +description = "sphinxcontrib-applehelp is a Sphinx extension which outputs Apple help books" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_applehelp-1.0.8-py3-none-any.whl", hash = "sha256:cb61eb0ec1b61f349e5cc36b2028e9e7ca765be05e49641c97241274753067b4"}, + {file = "sphinxcontrib_applehelp-1.0.8.tar.gz", hash = "sha256:c40a4f96f3776c4393d933412053962fac2b84f4c99a7982ba42e09576a70619"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-devhelp" +version = "1.0.6" +description = "sphinxcontrib-devhelp is a sphinx extension which outputs Devhelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_devhelp-1.0.6-py3-none-any.whl", hash = "sha256:6485d09629944511c893fa11355bda18b742b83a2b181f9a009f7e500595c90f"}, + {file = "sphinxcontrib_devhelp-1.0.6.tar.gz", hash = "sha256:9893fd3f90506bc4b97bdb977ceb8fbd823989f4316b28c3841ec128544372d3"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-htmlhelp" +version = "2.0.5" +description = "sphinxcontrib-htmlhelp is a sphinx extension which renders HTML help files" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_htmlhelp-2.0.5-py3-none-any.whl", hash = "sha256:393f04f112b4d2f53d93448d4bce35842f62b307ccdc549ec1585e950bc35e04"}, + {file = "sphinxcontrib_htmlhelp-2.0.5.tar.gz", hash = "sha256:0dc87637d5de53dd5eec3a6a01753b1ccf99494bd756aafecd74b4fa9e729015"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["html5lib", "pytest"] + +[[package]] +name = "sphinxcontrib-jsmath" +version = "1.0.1" +description = "A sphinx extension which renders display math in HTML via JavaScript" +optional = false +python-versions = ">=3.5" +files = [ + {file = "sphinxcontrib-jsmath-1.0.1.tar.gz", hash = "sha256:a9925e4a4587247ed2191a22df5f6970656cb8ca2bd6284309578f2153e0c4b8"}, + {file = "sphinxcontrib_jsmath-1.0.1-py2.py3-none-any.whl", hash = "sha256:2ec2eaebfb78f3f2078e73666b1415417a116cc848b72e5172e596c871103178"}, +] + +[package.extras] +test = ["flake8", "mypy", "pytest"] + +[[package]] +name = "sphinxcontrib-qthelp" +version = "1.0.7" +description = "sphinxcontrib-qthelp is a sphinx extension which outputs QtHelp documents" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_qthelp-1.0.7-py3-none-any.whl", hash = "sha256:e2ae3b5c492d58fcbd73281fbd27e34b8393ec34a073c792642cd8e529288182"}, + {file = "sphinxcontrib_qthelp-1.0.7.tar.gz", hash = "sha256:053dedc38823a80a7209a80860b16b722e9e0209e32fea98c90e4e6624588ed6"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[package]] +name = "sphinxcontrib-serializinghtml" +version = "1.1.10" +description = "sphinxcontrib-serializinghtml is a sphinx extension which outputs \"serialized\" HTML files (json and pickle)" +optional = false +python-versions = ">=3.9" +files = [ + {file = "sphinxcontrib_serializinghtml-1.1.10-py3-none-any.whl", hash = "sha256:326369b8df80a7d2d8d7f99aa5ac577f51ea51556ed974e7716cfd4fca3f6cb7"}, + {file = "sphinxcontrib_serializinghtml-1.1.10.tar.gz", hash = "sha256:93f3f5dc458b91b192fe10c397e324f262cf163d79f3282c158e8436a2c4511f"}, +] + +[package.extras] +lint = ["docutils-stubs", "flake8", "mypy"] +standalone = ["Sphinx (>=5)"] +test = ["pytest"] + +[[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 = "tabulate" +version = "0.9.0" +description = "Pretty-print tabular data" +optional = false +python-versions = ">=3.7" +files = [ + {file = "tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f"}, + {file = "tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c"}, +] + +[package.extras] +widechars = ["wcwidth"] + +[[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.3" +description = "Traitlets Python configuration system" +optional = false +python-versions = ">=3.8" +files = [ + {file = "traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f"}, + {file = "traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7"}, +] + +[package.extras] +docs = ["myst-parser", "pydata-sphinx-theme", "sphinx"] +test = ["argcomplete (>=3.0.3)", "mypy (>=1.7.0)", "pre-commit", "pytest (>=7.0,<8.2)", "pytest-mock", "pytest-mypy-testing"] + +[[package]] +name = "typing-extensions" +version = "4.11.0" +description = "Backported and Experimental Type Hints for Python 3.8+" +optional = false +python-versions = ">=3.8" +files = [ + {file = "typing_extensions-4.11.0-py3-none-any.whl", hash = "sha256:c1f94d72897edaf4ce775bb7558d5b79d8126906a14ea5ed1635921406c0387a"}, + {file = "typing_extensions-4.11.0.tar.gz", hash = "sha256:83f085bd5ca59c80295fc2a82ab5dac679cbe02b9f33f7d83af68e241bea51b0"}, +] + +[[package]] +name = "urllib3" +version = "2.2.1" +description = "HTTP library with thread-safe connection pooling, file post, and more." +optional = false +python-versions = ">=3.8" +files = [ + {file = "urllib3-2.2.1-py3-none-any.whl", hash = "sha256:450b20ec296a467077128bff42b73080516e71b56ff59a60a02bef2232c4fa9d"}, + {file = "urllib3-2.2.1.tar.gz", hash = "sha256:d0570876c61ab9e520d776c38acbbb5b05a776d3f9ff98a5c8fd5162a444cf19"}, +] + +[package.extras] +brotli = ["brotli (>=1.0.9)", "brotlicffi (>=0.8.0)"] +h2 = ["h2 (>=4,<5)"] +socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] +zstd = ["zstandard (>=0.18.0)"] + +[[package]] +name = "watchdog" +version = "4.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.8" +files = [ + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:39cb34b1f1afbf23e9562501673e7146777efe95da24fab5707b88f7fb11649b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c522392acc5e962bcac3b22b9592493ffd06d1fc5d755954e6be9f4990de932b"}, + {file = "watchdog-4.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6c47bdd680009b11c9ac382163e05ca43baf4127954c5f6d0250e7d772d2b80c"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:8350d4055505412a426b6ad8c521bc7d367d1637a762c70fdd93a3a0d595990b"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c17d98799f32e3f55f181f19dd2021d762eb38fdd381b4a748b9f5a36738e935"}, + {file = "watchdog-4.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4986db5e8880b0e6b7cd52ba36255d4793bf5cdc95bd6264806c233173b1ec0b"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_universal2.whl", hash = "sha256:11e12fafb13372e18ca1bbf12d50f593e7280646687463dd47730fd4f4d5d257"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:5369136a6474678e02426bd984466343924d1df8e2fd94a9b443cb7e3aa20d19"}, + {file = "watchdog-4.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:76ad8484379695f3fe46228962017a7e1337e9acadafed67eb20aabb175df98b"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:45cc09cc4c3b43fb10b59ef4d07318d9a3ecdbff03abd2e36e77b6dd9f9a5c85"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:eed82cdf79cd7f0232e2fdc1ad05b06a5e102a43e331f7d041e5f0e0a34a51c4"}, + {file = "watchdog-4.0.0-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ba30a896166f0fee83183cec913298151b73164160d965af2e93a20bbd2ab605"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:d18d7f18a47de6863cd480734613502904611730f8def45fc52a5d97503e5101"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2895bf0518361a9728773083908801a376743bcc37dfa252b801af8fd281b1ca"}, + {file = "watchdog-4.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:87e9df830022488e235dd601478c15ad73a0389628588ba0b028cb74eb72fed8"}, + {file = "watchdog-4.0.0-pp310-pypy310_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6e949a8a94186bced05b6508faa61b7adacc911115664ccb1923b9ad1f1ccf7b"}, + {file = "watchdog-4.0.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:6a4db54edea37d1058b08947c789a2354ee02972ed5d1e0dca9b0b820f4c7f92"}, + {file = "watchdog-4.0.0-pp39-pypy39_pp73-macosx_10_9_x86_64.whl", hash = "sha256:d31481ccf4694a8416b681544c23bd271f5a123162ab603c7d7d2dd7dd901a07"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:8fec441f5adcf81dd240a5fe78e3d83767999771630b5ddfc5867827a34fa3d3"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:6a9c71a0b02985b4b0b6d14b875a6c86ddea2fdbebd0c9a720a806a8bbffc69f"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:557ba04c816d23ce98a06e70af6abaa0485f6d94994ec78a42b05d1c03dcbd50"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:d0f9bd1fd919134d459d8abf954f63886745f4660ef66480b9d753a7c9d40927"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:f9b2fdca47dc855516b2d66eef3c39f2672cbf7e7a42e7e67ad2cbfcd6ba107d"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:73c7a935e62033bd5e8f0da33a4dcb763da2361921a69a5a95aaf6c93aa03a87"}, + {file = "watchdog-4.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:6a80d5cae8c265842c7419c560b9961561556c4361b297b4c431903f8c33b269"}, + {file = "watchdog-4.0.0-py3-none-win32.whl", hash = "sha256:8f9a542c979df62098ae9c58b19e03ad3df1c9d8c6895d96c0d51da17b243b1c"}, + {file = "watchdog-4.0.0-py3-none-win_amd64.whl", hash = "sha256:f970663fa4f7e80401a7b0cbeec00fa801bf0287d93d48368fc3e6fa32716245"}, + {file = "watchdog-4.0.0-py3-none-win_ia64.whl", hash = "sha256:9a03e16e55465177d416699331b0f3564138f1807ecc5f2de9d55d8f188d08c7"}, + {file = "watchdog-4.0.0.tar.gz", hash = "sha256:e3e7065cbdabe6183ab82199d7a4f6b3ba0a438c5a512a68559846ccb76a78ec"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + +[[package]] +name = "wcmatch" +version = "8.5.1" +description = "Wildcard/glob file name matcher." +optional = false +python-versions = ">=3.8" +files = [ + {file = "wcmatch-8.5.1-py3-none-any.whl", hash = "sha256:24c19cedc92bc9c9e27f39db4e1824d72f95bd2cea32b254a47a45b1a1b227ed"}, + {file = "wcmatch-8.5.1.tar.gz", hash = "sha256:c0088c7f6426cf6bf27e530e2b7b734031905f7e490475fd83c7c5008ab581b3"}, +] + +[package.dependencies] +bracex = ">=2.1.1" + +[[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"}, +] + +[metadata] +lock-version = "2.0" +python-versions = "^3.10" +content-hash = "81ba9446efa913b7085df29850e2834bb86c8e3c308c2e548d976f29c6eb4218" diff --git a/poetry.toml b/poetry.toml new file mode 100644 index 0000000..ab1033b --- /dev/null +++ b/poetry.toml @@ -0,0 +1,2 @@ +[virtualenvs] +in-project = true diff --git a/pyproject.toml b/pyproject.toml new file mode 100644 index 0000000..8a5220b --- /dev/null +++ b/pyproject.toml @@ -0,0 +1,34 @@ +[tool.poetry] +name = "{{project_name}}" +version = "0.0.0" +description = "" +authors = ["microsoft"] +license = "MIT License" +readme = "README.md" +packages = [{ include = "{{module_name}}", from = "src/python" }] + +[tool.poetry.dependencies] +# write here dependencies of your project +python = "^3.10" + +[tool.poetry.group.dev.dependencies] +coverage = "^7.4.1" +ipykernel = "^6.29.2" +ruff = "^0.2.1" +pyright = "^1.1.349" +pytest = "^8.0.0" + +[tool.poetry.group.docs.dependencies] +mdx-truly-sane-lists = "*" +mkdocs = "*" +mkdocs-awesome-pages-plugin = "*" +mkdocs-material = "*" +mkdocs-video = "*" +pymdown-extensions = ">=10.0.0" # Fix CVE-2023-32309 pymdown-extensions 9.10 +sphinx = "*" +sphinx-autodoc-typehints = "*" +sphinx-markdown-builder = "*" + +[build-system] +requires = ["poetry-core"] +build-backend = "poetry.core.masonry.api" diff --git a/pyproject.toml.jinja b/pyproject.toml.jinja new file mode 120000 index 0000000..7b2511e --- /dev/null +++ b/pyproject.toml.jinja @@ -0,0 +1 @@ +pyproject.toml \ No newline at end of file diff --git a/pyrightconfig.json b/pyrightconfig.json new file mode 100644 index 0000000..f3639d5 --- /dev/null +++ b/pyrightconfig.json @@ -0,0 +1,52 @@ +{ + "pythonVersion": "3.10", + "include": [ + "src/python", + "test/python" + ], + "exclude": [ + "**/__pycache__" + ], + "deprecateTypingAliases": true, + "reportPropertyTypeMismatch": true, + "reportUnusedImport": true, + "reportUnusedClass": true, + "reportUnusedVariable": true, + "reportDuplicateImport": true, + "reportUntypedFunctionDecorator": true, + "reportUntypedClassDecorator": true, + "reportUntypedBaseClass": true, + "reportUntypedNamedTuple": true, + "reportConstantRedefinition": true, + "reportDeprecated": true, + "reportInconsistentConstructor": true, + "reportUnknownParameterType": true, + "reportMissingParameterType": true, + "reportMissingTypeArgument": true, + "reportUnnecessaryCast": true, + "reportUnnecessaryContains": true, + "reportImplicitStringConcatenation": true, + "reportInvalidStubStatement": true, + "reportIncompleteStub": true, + "reportUnnecessaryTypeIgnoreComment": true, + "reportMatchNotExhaustive": true, + "reportShadowedImports": true, + "reportMissingTypeStubs": false, + "reportImportCycles": false, + "reportUnusedFunction": false, + "reportMissingSuperCall": false, + "reportPrivateUsage": false, + "reportUninitializedInstanceVariable": false, + "reportUnknownArgumentType": false, + "reportUnknownLambdaType": false, + "reportUnknownVariableType": false, + "reportUnknownMemberType": false, + "reportCallInDefaultInitializer": false, + "reportUnnecessaryIsInstance": false, + "reportUnnecessaryComparison": false, + "reportUnusedCallResult": false, + "reportUnusedExpression": false, + "reportImplicitOverride": false, + "reportIncompatibleVariableOverride": false, + "reportIncompatibleMethodOverride": false +} diff --git a/pytest.ini b/pytest.ini new file mode 100644 index 0000000..6247475 --- /dev/null +++ b/pytest.ini @@ -0,0 +1,4 @@ +[pytest] +cache_dir = .tmp/.pytest_cache +testpaths = test +addopts = -ra --cache-clear --capture=no diff --git a/ruff.toml b/ruff.toml new file mode 100644 index 0000000..af84024 --- /dev/null +++ b/ruff.toml @@ -0,0 +1,48 @@ +cache-dir = ".tmp/.ruff_cache" +include = ["src/python/**/*.py", "test/python/**/*.py"] +line-length = 99 +indent-width = 4 +target-version = "py310" + +[lint] +# Enable Pyflakes (`F`) and a subset of the pycodestyle (`E`) codes by default. +select = ["B", "D", "E", "F", "I", "Q", "W", "NPY", "PD", "PTH", "RUF", "UP"] +ignore = [ + "B026", # B026: Star-arg unpacking after a keyword argument is strongly discouraged + "D100", # D100: Missing docstring in public module + "D101", # D101: Missing docstring in public class + "D102", # D102: Missing docstring in public method + "D103", # D103: Missing docstring in public function + "D104", # D104: Missing docstring in public package + "D105", # D105: Missing docstring in magic method + "D107", # D107: Missing docstring in __init__ + "D417", # D417: Missing argument descriptions in Docstrings + "E203", # E203: Whitespace before ':' + "E501", # E501: Line too long ({width} > {limit}) +] + +# Allow fix for all enabled rules (when `--fix`) is provided. +fixable = ["ALL"] +unfixable = [] + +# Allow unused variables when underscore-prefixed. +dummy-variable-rgx = "^(_+|(_+[a-zA-Z0-9_]*[a-zA-Z0-9]+?))$" + +[lint.per-file-ignores] +"test/*" = ["F401"] # unused-import + +[lint.pydocstyle] +convention = "google" + +[lint.isort] +known-first-party = ["{{project_name}}", "{{project_name}}_test"] + +[format] +quote-style = "double" # Like Black, use double quotes for strings. +indent-style = "space" # Like Black, indent with spaces, rather than tabs. +skip-magic-trailing-comma = false # Like Black, respect magic trailing commas. +line-ending = "auto" # Like Black, automatically detect the appropriate line ending. + +# Enable auto-formatting of code examples in docstrings. Markdown, +# reStructuredText code/literal blocks and doctests are all supported. +docstring-code-format = true diff --git a/ruff.toml.jinja b/ruff.toml.jinja new file mode 120000 index 0000000..4acdc43 --- /dev/null +++ b/ruff.toml.jinja @@ -0,0 +1 @@ +ruff.toml \ No newline at end of file diff --git a/src/python/{{module_name}}/__init__.py b/src/python/{{module_name}}/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/src/python/{{module_name}}/example.py b/src/python/{{module_name}}/example.py new file mode 100644 index 0000000..5a1f31d --- /dev/null +++ b/src/python/{{module_name}}/example.py @@ -0,0 +1,6 @@ +"""DELETE ME!""" + + +def hello_world() -> None: + """Example function.""" + print("Hello World") diff --git a/test/python/{{module_name}}_test/__init__.py b/test/python/{{module_name}}_test/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/test/python/{{module_name}}_test/test_example.py b/test/python/{{module_name}}_test/test_example.py new file mode 100644 index 0000000..f3590b5 --- /dev/null +++ b/test/python/{{module_name}}_test/test_example.py @@ -0,0 +1,6 @@ +"""DELETE ME!""" + + +def test_example(): + """Example test.""" + assert True diff --git a/{{project_name}}.code-workspace.jinja b/{{project_name}}.code-workspace.jinja new file mode 120000 index 0000000..ff80164 --- /dev/null +++ b/{{project_name}}.code-workspace.jinja @@ -0,0 +1 @@ +cookie-doh.code-workspace \ No newline at end of file