diff --git a/.github/workflows/build-windows-wheels.yml b/.github/workflows/build-windows-wheels.yml new file mode 100644 index 0000000..abab1fb --- /dev/null +++ b/.github/workflows/build-windows-wheels.yml @@ -0,0 +1,80 @@ +name: Windows Wheels + +on: + push: + branches: [main] + pull_request: + workflow_dispatch: + +permissions: + contents: read + +jobs: + build-windows: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12"] + + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Poetry + run: pip install --upgrade poetry + + - name: Build wheel + run: poetry build -f wheel + + - name: Verify wheel contains binary + shell: pwsh + run: | + Add-Type -AssemblyName System.IO.Compression.FileSystem + $wheel = Get-ChildItem dist/*.whl | Select-Object -First 1 + Write-Host "Inspecting $($wheel.Name)" + $zip = [System.IO.Compression.ZipFile]::OpenRead($wheel.FullName) + $entries = $zip.Entries | Where-Object { $_.Name -match '\.(pyd|dll)$' } + if ($entries.Count -eq 0) { + Write-Error "No .pyd or .dll found in wheel" + $zip.Dispose() + exit 1 + } + $entries | ForEach-Object { Write-Host "Found: $($_.FullName)" } + $zip.Dispose() + + - name: Smoke test — install and import + shell: pwsh + run: | + python -m venv test-env + test-env\Scripts\Activate.ps1 + pip install (Get-ChildItem dist\*.whl).FullName + python -c "import ellphi; print('version:', ellphi.__version__)" + python -c "from ellphi.solver import has_cpp_backend; assert has_cpp_backend(), 'C++ backend not available'" + python -c "from ellphi.solver import build_info; print(build_info())" + + - name: Smoke test — run solver + shell: pwsh + run: | + test-env\Scripts\Activate.ps1 + python -c @" + import numpy as np + from ellphi import tangency, coef_from_cov + c1 = coef_from_cov(np.array([[0.0, 0.0]]), np.eye(2).reshape(1, 2, 2)) + c2 = coef_from_cov(np.array([[3.0, 0.0]]), np.eye(2).reshape(1, 2, 2)) + result = tangency(c1, c2) + print('tangency t =', result.t) + assert result.t > 0, 'Expected positive tangency time' + print('Solver smoke test passed.') + "@ + + - name: Upload wheel artifact + uses: actions/upload-artifact@v4 + with: + name: wheel-windows-py${{ matrix.python-version }} + path: dist/*.whl + retention-days: 30 diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..f12f545 --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,37 @@ +name: docs + +on: + push: + branches: + - main + - "ellphi-*" + pull_request: + workflow_dispatch: + +permissions: + contents: write + +jobs: + docs: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Install poetry + run: pipx install poetry + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.10" + cache: "poetry" + + - name: Install dependencies + run: poetry install --with docs + + - name: Build docs + run: poetry run mkdocs build + + - name: Deploy to gh-pages + if: github.event_name == 'push' && github.ref == 'refs/heads/main' + run: poetry run mkdocs gh-deploy --force diff --git a/.github/workflows/python-app.yml b/.github/workflows/python-app.yml index f4ea5a7..0a88614 100644 --- a/.github/workflows/python-app.yml +++ b/.github/workflows/python-app.yml @@ -17,23 +17,29 @@ jobs: strategy: fail-fast: false matrix: - python-version: ["3.10", "3.11"] + python-version: ["3.10", "3.11", "3.12"] + env: + ELLPHI_USE_EIGEN: "1" + ELLPHI_EIGEN_INCLUDE: "/usr/include/eigen3" steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} cache: "pip" + - name: Install Eigen headers + run: sudo apt-get update && sudo apt-get install -y libeigen3-dev + # -- Poetry ------------------------------------------------------ - name: Install Poetry run: pip install --upgrade poetry - name: Cache Poetry env - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pypoetry key: ${{ runner.os }}-poetry-${{ hashFiles('pyproject.toml') }}-v2 @@ -60,20 +66,26 @@ jobs: # 3.11 限定で mypy typecheck: runs-on: ubuntu-latest + env: + ELLPHI_USE_EIGEN: "1" + ELLPHI_EIGEN_INCLUDE: "/usr/include/eigen3" steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.11" cache: "pip" + - name: Install Eigen headers + run: sudo apt-get update && sudo apt-get install -y libeigen3-dev + - name: Install Poetry run: pip install --upgrade poetry - name: Cache Poetry env - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pypoetry key: ${{ runner.os }}-poetry-${{ hashFiles('pyproject.toml') }}-v2 @@ -89,15 +101,21 @@ jobs: package-test: runs-on: ubuntu-latest + env: + ELLPHI_USE_EIGEN: "1" + ELLPHI_EIGEN_INCLUDE: "/usr/include/eigen3" steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.11" cache: "pip" + - name: Install Eigen headers + run: sudo apt-get update && sudo apt-get install -y libeigen3-dev + - name: Install Poetry run: pip install --upgrade poetry @@ -139,13 +157,13 @@ jobs: cd test_run pytest ../tests - build-docs: + demo-install: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: "3.11" cache: "pip" @@ -154,14 +172,10 @@ jobs: run: pip install --upgrade poetry - name: Cache Poetry env - uses: actions/cache@v3 + uses: actions/cache@v4 with: path: ~/.cache/pypoetry key: ${{ runner.os }}-poetry-${{ hashFiles('pyproject.toml') }}-v2 - name: Install project (demo extras) - run: poetry install --with demo # Install core and demo dependencies - - # Add steps for building documentation here, e.g., mkdocs build or sphinx build - # - name: Build documentation - # run: poetry run mkdocs build + run: poetry install --with demo # Ensure the demo dependency set resolves diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml new file mode 100644 index 0000000..ad8acff --- /dev/null +++ b/.github/workflows/release.yml @@ -0,0 +1,163 @@ +# Release workflow — publishes to PyPI or TestPyPI based on tag name. +# +# Routing: +# v*.dev* → TestPyPI (publish-testpypi job) +# v*.*.* → PyPI (publish-pypi job) +# +# Prerequisites (one-time setup): +# +# 1. GitHub Environments (Settings → Environments): +# - "pypi" — Deployment tags: v[0-9]*.[0-9]*.[0-9]* +# and v[0-9]*.[0-9]*.[0-9]*.post[0-9]* +# Optional: add Required reviewers for release approval. +# - "testpypi" — Deployment tags: v* (allow all) +# +# 2. PyPI Trusted Publishing (pypi.org → ellphi → Publishing): +# Owner: t-uda, Repository: ellphi, +# Workflow: release.yml, Environment: pypi +# +# 3. TestPyPI Trusted Publishing (test.pypi.org → ellphi → Publishing): +# Owner: t-uda, Repository: ellphi, +# Workflow: release.yml, Environment: testpypi +# +# Tag examples: +# v0.1.2 → PyPI +# v0.1.2.post1 → PyPI +# v0.1.2.dev1 → TestPyPI +# v0.1.2a1 → blocked by "pypi" environment tag rule → manual decision +# v0.1.2rc1 → blocked by "pypi" environment tag rule → manual decision + +name: Release + +on: + push: + tags: ["v*"] + +permissions: + contents: read + +jobs: + build-sdist: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: "3.12" + + - name: Install Poetry + run: pip install --upgrade poetry + + - name: Build sdist + run: poetry build -f sdist + + - name: Upload sdist + uses: actions/upload-artifact@v4 + with: + name: dist-sdist + path: dist/*.tar.gz + + build-linux: + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12"] + env: + ELLPHI_USE_EIGEN: "1" + ELLPHI_EIGEN_INCLUDE: "/usr/include/eigen3" + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Eigen headers + run: sudo apt-get update && sudo apt-get install -y libeigen3-dev + + - name: Install Poetry + run: pip install --upgrade poetry + + - name: Build wheel + run: poetry build -f wheel + + - name: Upload wheel + uses: actions/upload-artifact@v4 + with: + name: dist-linux-py${{ matrix.python-version }} + path: dist/*.whl + + build-windows: + runs-on: windows-latest + strategy: + fail-fast: false + matrix: + python-version: ["3.10", "3.11", "3.12"] + steps: + - uses: actions/checkout@v4 + + - name: Set up Python + uses: actions/setup-python@v5 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Poetry + run: pip install --upgrade poetry + + - name: Build wheel + run: poetry build -f wheel + + - name: Upload wheel + uses: actions/upload-artifact@v4 + with: + name: dist-windows-py${{ matrix.python-version }} + path: dist/*.whl + + publish-testpypi: + if: contains(github.ref_name, 'dev') + needs: [build-sdist, build-linux, build-windows] + runs-on: ubuntu-latest + environment: testpypi + permissions: + id-token: write + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: List distribution files + run: ls -la dist/ + + - name: Publish to TestPyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + repository-url: https://test.pypi.org/legacy/ + packages-dir: dist/ + + publish-pypi: + if: ${{ !contains(github.ref_name, 'dev') }} + needs: [build-sdist, build-linux, build-windows] + runs-on: ubuntu-latest + environment: pypi + permissions: + id-token: write + steps: + - name: Download all artifacts + uses: actions/download-artifact@v4 + with: + path: dist + merge-multiple: true + + - name: List distribution files + run: ls -la dist/ + + - name: Publish to PyPI + uses: pypa/gh-action-pypi-publish@release/v1 + with: + packages-dir: dist/ diff --git a/.gitignore b/.gitignore index c4dba2f..76425e8 100644 --- a/.gitignore +++ b/.gitignore @@ -3,6 +3,9 @@ # Gemini .gemini/ GEMINI.md +# Claude +.claude/ +CLAUDE.md # Serena AI Helper .serena/ diff --git a/AGENTS.md b/AGENTS.md index a662edf..8fcfc0f 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -18,6 +18,13 @@ poetry install This command installs all Python dependencies and also compiles the C++ backend for the tangency solver. If the C++ code (`src/ellphi/_tangency_cpp_impl.cpp`) is modified, the backend will be automatically rebuilt the next time you run `poetry install`. +Optional Eigen build (C++ linear algebra): +- Install Eigen headers (Ubuntu: `apt-get install libeigen3-dev`, macOS: `brew install eigen`). +- Rebuild with `ELLPHI_USE_EIGEN=1` and `ELLPHI_EIGEN_INCLUDE` set to the Eigen include path. + - Linux default: `/usr/include/eigen3` + - macOS default: `/opt/homebrew/include/eigen3` (Apple Silicon) or `/usr/local/include/eigen3` (Intel) +- Verify with `python -m ellphi --build-info` and check `cpp_linalg_kind`. + ### A Note on Managing Dependencies If you need to add, remove, or update dependencies in `pyproject.toml`, you must also update the `poetry.lock` file to reflect these changes. After modifying `pyproject.toml`, run the following command: @@ -98,3 +105,15 @@ Before requesting review or handing work back to the user: * **Coding Style:** All Python code should adhere to the [PEP 8 style guide](https://peps.python.org/pep-0008/). * **Docstrings:** Docstrings must be written in **English**. They can include simple mathematical expressions where appropriate. * **Comments:** Code comments should be short and simple. Do not add verbose trivial comments. + +## Documentation-only Tasks + +Docs-only changes (files under `docs/`, `mkdocs.yml`, `docs/javascripts/`) +do **not** require the full Python CI checklist (black/flake8/mypy/pytest). +Instead, run: + +```bash +poetry run mkdocs build +``` + +and confirm it exits without errors before committing. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..c729ff4 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,37 @@ +# Claude Code Guidelines + +This file is loaded automatically by Claude Code at session start. +For general project conventions and CI requirements, read `AGENTS.md` first. + +## Subagent Permissions + +When orchestrating work through Claude Code subagents, the following +permissions must be present in `.claude/settings.local.json`: + +```json +{ + "permissions": { + "allow": [ + "Edit", + "Write", + "Bash(git:*)", + "Bash(cp:*)", + "Bash(python3:*)" + ] + } +} +``` + +Notes: +- Permission changes take effect after a session restart. +- Binary file processing (e.g. image transparency) should be handled by + the main agent, not delegated to subagents. +- Simple one-off shell commands that fall outside the patterns above + can be run by the main agent directly. + +## Orchestration Style + +- Delegate file editing and git commits to background subagents. +- Use the main agent for discussion, planning, and binary/image processing. +- Commit granularity: one logical change per commit; a subagent handling + multiple related files in one pass may bundle them into a single commit. diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..6430c42 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,180 @@ +# Contributing + +This document describes a simple, low-overhead workflow for developing and +releasing ellphi. It keeps `main` as a released version and uses a dedicated +release branch for ongoing work. + +## Before You Start + +Always check the project-wide guidelines and CI expectations: + +- `AGENTS.md` +- `.github/workflows/python-app.yml` +- `.github/workflows/docs.yml` (for docs / release-note changes) + +They define the required local checks and the order CI will run them. + +## Branching Model + +- `main` always points to the latest released version. +- Each release is developed on its own branch (e.g., `ellphi-0.1.2`). +- Feature PRs are merged into the release branch, not into `main`. + +## Versioning + +We only bump versions at two moments: + +1. Start of a new release cycle: set a dev version (e.g., `0.1.2.dev0`). +2. Release: set the final version (e.g., `0.1.2`). + +Use the version sync script so that metadata and runtime version stay aligned: + +```bash +poetry run python scripts/update_version.py 0.1.2.dev0 +``` + +## Release Notes + +Create an "Unreleased" section at the start of the cycle and update it as +features land: + +```text +## Unreleased +``` + +Right before the release, replace it with a dated heading such as: + +```text +## 0.1.2 - YYYY-MM-DD +``` + +## Standard Workflow (Simple) + +1. Create a release branch from `main`. +2. Bump to a dev version once (e.g., `0.1.2.dev0`) and commit it. +3. Merge feature PRs into the release branch. +4. When ready for the final release, create a short-lived version-bump branch + from the release branch. +5. On that version-bump branch: + - finalize `RELEASE_NOTES.md` + - run `poetry run python scripts/update_version.py 0.1.2` + - run all required local checks + - run `poetry run mkdocs build` +6. Open a PR from the version-bump branch back into the release branch and + merge it after CI passes. +7. Open a PR from the release branch into `main` and merge it. +8. Create the final release tag (e.g., `v0.1.2`) from the commit now on + `main`, then push the tag. + +Do not tag a side branch or an unmerged release candidate commit. Tag the exact +commit that now represents the released state on `main`. + +## Publishing + +Releases are published automatically by the CI release workflow +(`.github/workflows/release.yml`). + +| Tag | Destination | +|-----|-------------| +| `v0.1.2.dev1` | TestPyPI | +| `v0.1.2` | PyPI | +| `v0.1.2.post1` | PyPI | +| `v0.1.2a1`, `v0.1.2rc1` | Blocked by environment rule — manual decision | + +Additional `v0.1.2.devN` tags are optional. Create another dev release only if +you want a fresh TestPyPI snapshot for validation before the final release. + +```bash +# Example: publish a dev build to TestPyPI +git tag v0.1.2.dev1 +git push origin v0.1.2.dev1 + +# Example: after the release branch has been merged into main, +# tag the main commit that now contains version 0.1.2 +git tag v0.1.2 +git push origin v0.1.2 +``` + +The workflow uses PyPI Trusted Publishing (no API tokens needed). +See the comments at the top of `release.yml` for one-time setup steps. + +## Required Local Checks + +Mirror CI locally. Run the exact commands listed in `AGENTS.md` and +`.github/workflows/python-app.yml`, in the same order when relevant. For docs +and release-note changes, also mirror `.github/workflows/docs.yml` by running +`poetry run mkdocs build`. Do not skip steps. If something cannot run, stop +and document the blocker. + +## Optional Eigen Build (C++ linear algebra) + +If you want to test the Eigen build locally: + +1. Install Eigen headers: + - Ubuntu: `apt-get install libeigen3-dev` + - macOS (Homebrew): `brew install eigen` +2. Rebuild the extension with: + +```bash +ELLPHI_USE_EIGEN=1 ELLPHI_EIGEN_INCLUDE=/usr/include/eigen3 poetry install +``` + +On macOS, use `/opt/homebrew/include/eigen3` (Apple Silicon) or +`/usr/local/include/eigen3` (Intel). + +Verify via: + +```bash +python -m ellphi --build-info +``` + +## Docs CI and Deployment + +- `.github/workflows/docs.yml` runs `mkdocs build` on pull requests, on pushes + to `ellphi-*`, and via `workflow_dispatch`. +- It deploys to `gh-pages` only on pushes to `main`. +- `.github/workflows/python-app.yml` contains a `demo-install` job that checks + the demo dependency set; it is not the docs deployment workflow. + +## Documentation + +### Building and previewing + +```bash +# One-off build +poetry run mkdocs build + +# Live-reload server (http://127.0.0.1:8000) +poetry run mkdocs serve +``` + +Run `poetry run mkdocs build` before committing any docs change and confirm +the build completes without errors. + +### English style + +All documentation is written in **British English** +(`optimisation`, `normalise`, `characterisation`, `centred`, etc.). + +### Mathematical notation + +| Element | Convention | Example | +|---|---|---| +| Inline math | `\(...\)` | `\(t \ge 0\)` | +| Display math | `\[...\]` or `$$...$$` (block only) | — | +| Vectors | `\bm{·}` (bold italic via `\boldsymbol`) | `\(\bm{x}_c\)` | +| Matrices | Plain capital letter | `\(A\)`, `\(\Sigma\)` | +| Scalars | Plain italic | `\(t\)`, `\(\mu\)` | + +`\bm` is defined as a MathJax macro in `docs/javascripts/mathjax.js`. +Inline math must not span multiple source lines. + +### Assets + +Logo assets live in `docs/assets/`: + +- `logo.png` — full logo (icon + wordmark), transparent background +- `logo-icon.png` — icon only, used for navbar and favicon + +The root `ellphi-logo.png` is kept in sync with `docs/assets/logo.png` +(used by the README). diff --git a/README.md b/README.md index 1a66522..dddcdf7 100644 --- a/README.md +++ b/README.md @@ -28,6 +28,25 @@ To install with demo dependencies for notebooks and examples: pip install ellphi[demo] ``` +## Optional Eigen build (from source) + +If you build from source (for example, with `poetry install`), you can enable +the C++ linear algebra implementation based on Eigen. + +Install Eigen headers: + +- Ubuntu: `apt-get install libeigen3-dev` +- macOS (Homebrew): `brew install eigen` + +Then build with: + +```bash +ELLPHI_USE_EIGEN=1 ELLPHI_EIGEN_INCLUDE=/usr/include/eigen3 poetry install +``` + +On macOS, use `/opt/homebrew/include/eigen3` (Apple Silicon) or +`/usr/local/include/eigen3` (Intel). + ## Supported Python Versions Python 3.10 or later. @@ -98,10 +117,20 @@ From the shell: python -m ellphi --version ``` +Build info (including the C++ linear algebra choice): + +```bash +python -m ellphi --build-info +``` + ## Contributing Interested in contributing? We welcome pull requests! +Please read `CONTRIBUTING.md` for the branching/versioning flow and +`AGENTS.md` (plus `.github/workflows/python-app.yml`) for the required local +checks before opening a PR. + To get started with development, clone the repository and set up your environment: ```bash diff --git a/RELEASE_NOTES.md b/RELEASE_NOTES.md index e489196..6edfbe1 100644 --- a/RELEASE_NOTES.md +++ b/RELEASE_NOTES.md @@ -1,3 +1,49 @@ +## 0.1.2 - 2026-03-25 + +### Added + +- Added the new `ellphi.grad` API for differentiable workflows: + `tangency_grad(...)` for single-pair gradients, + `pdist_tangency_grad(...)` for condensed pairwise distances plus a VJP + pullback, and `coef_from_cov_grad(...)` for differentiable conversion from + centres/covariances to packed conic coefficients. +- Added C++ backend build metadata helpers: + `ellphi.build_info()`, `ellphi.cpp_linalg_kind()`, and + `ellphi --build-info` / `python -m ellphi --build-info`. +- Added `EllipseCloud.from_cov(...)` for constructing clouds directly from + precomputed centres/covariances, and `EllipseCloud.distance_matrix()` as a + square-matrix convenience wrapper around `pdist_tangency`. + +### Changed + +- Source builds can now opt into an Eigen-based C++ linear-algebra backend via + `ELLPHI_USE_EIGEN=1` (with `ELLPHI_EIGEN_INCLUDE` when needed). Build + metadata now records the linear-algebra implementation and embedded backend + version. + +### Fixed + +- `ellphi.visualization.ellipse_patch(...)` now preserves explicit + `facecolor` / `fc` arguments while keeping hollow ellipses as the default. +- `coef_from_cov_grad(...)` now validates batch and dimensionality mismatches + consistently and returns `NaN` outputs for singular covariances in line with + `coef_from_cov(...)`. +- The C++ backend build cache is now invalidated when switching between the + internal and Eigen linear-algebra modes, preventing stale extension reuse. + +### Documentation + +- Added a MkDocs documentation site with Getting Started, TDA workflow, + differentiable tangency guide, API reference pages, and a notebook index + that now includes a topology-optimisation example. + +### Packaging + +- Added Windows wheel build support (`win_amd64`, Python 3.10-3.12). +- Added release automation for TestPyPI/PyPI publishing via Trusted + Publishing. +- Added Python 3.12 to the CI test matrix. + ## 0.1.1 - 2025-12-14 ### Added diff --git a/contrib/agent-skill/SKILL.md b/contrib/agent-skill/SKILL.md new file mode 100644 index 0000000..2a599c8 --- /dev/null +++ b/contrib/agent-skill/SKILL.md @@ -0,0 +1,105 @@ +--- +name: ellphi-api +description: > + EllPHi library usage guide for anisotropic persistent homology. + Use when: (1) writing code that imports ellphi, (2) working with + anisotropic persistent homology or ellipsoid tangency distances, + (3) debugging ellphi solver issues or understanding coefficient format. +--- + +# EllPHi API Skill + +## Version check + +```bash +python -c "import ellphi; print(ellphi.__version__)" +``` + +Require >= 0.1.2 for the `grad` module. If older: `pip install -U ellphi`. + +## Core concepts + +### Ellipsoid coefficient format + +Each ellipsoid is a quadratic `Q(x) = x^T A x + 2 b^T x + c`, packed into a flat vector of length `m = (d+1)(d+2)/2` (m=6 for d=2, m=10 for d=3). Packing order: upper-triangular A, then b (length d), then c (scalar). + +**Critical: b = -A x_bar** (negative sign). To recover center: `x_bar = -A^{-1} b`. Use `unpack_conic` to extract (A, b, c). + +### Tangency distance + +The inflation factor `t` at which two ellipsoids become externally tangent. The solver finds pencil parameter `mu` in [0,1] minimizing the discriminant, then `t = sqrt(alpha)`. + +## Quick recipe: point cloud to PH + +```python +import ellphi + +cloud = ellphi.ellipse_cloud(X, k=5) # X: (N, d) point cloud +dists = ellphi.pdist_tangency(cloud) # condensed distance matrix (like scipy pdist) + +# Feed to ripser, GUDHI, etc. +``` + +## Quick recipe: gradient optimization + +```python +from ellphi.grad import pdist_tangency_grad + +dists, vjp = pdist_tangency_grad(cloud.coef) # cloud.coef: (N, m) +grad_coefs = vjp(upstream_grad) # upstream: (N*(N-1)//2,) -> (N, m) +``` + +### End-to-end: centers + covariances → loss + +```python +from ellphi.grad import coef_from_cov_grad, pdist_tangency_grad + +# Forward + VJP for coef_from_cov +coefs, vjp_coef = coef_from_cov_grad(centers, covs) + +# Forward + VJP for tangency distances +dists, vjp_dist = pdist_tangency_grad(coefs) + +# Backward: chain the two VJPs +loss = dists.sum() +grad_coefs = vjp_dist(np.ones_like(dists)) # (N, m) +grad_centers, grad_covs = vjp_coef(grad_coefs) # (N,d), (N,d,d) +``` + +## Solver methods + +Pass `method=` to `tangency()`: + +| Method | Notes | +|--------|-------| +| `"brentq+newton"` | **(default)** Brentq bracketing + Newton polish | +| `"brentq"` | Pure Brentq. Robust, slower | +| `"bisect"` | Most robust, slowest | +| `"newton"` | Requires `x0`. Fast but can diverge | + +## Backends + +`backend=` in `tangency()` / `pdist_tangency()`: `"auto"` (default, C++ if available), `"python"`, `"cpp"`. + +## Common pitfalls + +1. **b sign**: `b = -A x_bar`. Forgetting the negative sign is the #1 bug. +2. **Condensed distances**: `pdist_tangency` returns 1-D like `scipy.spatial.distance.pdist`. Use `squareform` for a full matrix. +3. **Degenerate inputs**: `tangency_grad` raises `ZeroDivisionError` for identical/concentric ellipsoids. +4. **Singular covariance**: `coef_from_cov` returns NaN for singular matrices. + +## Envelope theorem (grad module) + +See [references/grad_module.md](references/grad_module.md) for how the envelope theorem enables efficient exact gradients. + +## API details + +For full function signatures and parameters: + +```bash +python -c "import ellphi; help(ellphi.tangency)" +python -c "from ellphi.grad import tangency_grad; help(tangency_grad)" +``` + +- Current exports: `src/ellphi/__init__.py` +- Full reference: the project's MkDocs site (`mkdocs serve` or published docs) diff --git a/contrib/agent-skill/references/grad_module.md b/contrib/agent-skill/references/grad_module.md new file mode 100644 index 0000000..1c17f0c --- /dev/null +++ b/contrib/agent-skill/references/grad_module.md @@ -0,0 +1,51 @@ +# EllPHi Grad Module — Conceptual Background + +## Envelope theorem approach + +The tangency distance `t` depends on coefficient vectors `p` and `q` through: + +1. The pencil parameter `mu*` (optimal blend), itself a function of (p, q). +2. The tangent point `x*(mu*)`, the pencil ellipsoid center at `mu*`. + +By the envelope theorem, at the optimum `mu*`, the derivative of the +tangent point `x*(mu*)` w.r.t. `p` drops out of the gradient formula. +The `d_mu/dp` terms remain (computed via implicit differentiation): + +``` +dt/dp_i = (1/(2t)) * [(1 - mu*) * base_i + scalar * d_mu/dp_i] +dt/dq_i = (1/(2t)) * [mu* * base_i + scalar * d_mu/dq_i] +``` + +where `base` is the monomial basis at the tangent point, and +`scalar = base . (q - p)`. + +The `d_mu/dp` terms come from implicit differentiation of the optimality +condition `F(mu, p, q) = 0` (handled internally by `solve_mu_gradients` +in `ellphi.differentiable_solver`). + +## coef_from_cov_grad: differentiable geometry + +`coef_from_cov_grad(X, cov, *, scale)` is the differentiable version of +`coef_from_cov`. It returns `(coefs, vjp)` where the VJP maps +`grad_coefs (N, m)` back to `(grad_centers (N, d), grad_cov (N, d, d))`. + +Internally it uses the matrix inverse derivative identity: +`d(Σ⁻¹) = -Σ⁻¹ dΣ Σ⁻¹` to propagate gradients through `A = Σ⁻¹/s²`. + +Combined with `pdist_tangency_grad`, this enables end-to-end gradient +computation from geometric parameters (centers, covariances) through to +a topological loss, without finite differences. + +## Key design points + +- `tangency_grad` / `pdist_tangency_grad` are the public API (in `ellphi.grad`). +- They handle the full chain: mu gradients -> t gradients, including the + `1/(2t)` factor and monomial basis evaluation. +- `pdist_tangency_grad` returns a VJP (vector-Jacobian product) pullback that + accumulates pair contributions into per-ellipsoid gradients. +- `coef_from_cov_grad` completes the chain by differentiating through + the (centers, covs) → coefs mapping. Works for arbitrary dimension d. +- Degenerate configurations (identical/concentric ellipsoids) raise + `ZeroDivisionError` because the implicit function theorem breaks down. + +For function signatures: `python -c "from ellphi.grad import tangency_grad; help(tangency_grad)"` diff --git a/docs/algebraic_sigmoid_newton.md b/docs/algebraic_sigmoid_newton.md index e02ea1d..b02c087 100644 --- a/docs/algebraic_sigmoid_newton.md +++ b/docs/algebraic_sigmoid_newton.md @@ -2,15 +2,13 @@ This document outlines the `algebraic-sigmoid+newton` strategy, a root-finding algorithm designed for functions on the interval $(0, 1)$. This method is particularly useful for objective functions, such as the difference of Mahalanobis distances, where the scale can vary dramatically at the boundaries, causing standard Newton methods to become unstable. -To ensure that the optimization variable remains within the $(0, 1)$ domain, this strategy employs a variable transformation known as the **Algebraic Sigmoid function**. This reparameterization allows Newton's method to be applied in an unbounded space, enhancing stability. +To ensure that the optimisation variable remains within the $(0, 1)$ domain, this strategy employs a variable transformation known as the **Algebraic Sigmoid function**. This reparameterisation allows Newton's method to be applied in an unbounded space, enhancing stability. ## 1. Mathematical Formulation ### 1.1. Variable Transformation -The core of the strategy is a mapping from the unbounded real line $u - \in \mathbb{R}$ to the interval $x - \in (0, 1)$. This is achieved using the algebraic sigmoid function: +The core of the strategy is a mapping from the unbounded real line $u \in \mathbb{R}$ to the interval $x \in (0, 1)$. This is achieved using the algebraic sigmoid function: $$ x(u) = \frac{1}{2} \left( 1 + \frac{u}{\sqrt{1 + u^2}} \right) @@ -20,8 +18,7 @@ This function smoothly maps $(-\infty, \infty)$ to $(0, 1)$ and has a fixed poin ### 1.2. Newton's Method in the Transformed Space -Let the original objective function be $f(x)$, defined on $x - \in (0, 1)$. We define a new function $F(u)$ in the transformed space: +Let the original objective function be $f(x)$, defined on $x \in (0, 1)$. We define a new function $F(u)$ in the transformed space: $$ F(u) = f(x(u)) diff --git a/docs/assets/logo-icon.png b/docs/assets/logo-icon.png new file mode 100644 index 0000000..c474a3f Binary files /dev/null and b/docs/assets/logo-icon.png differ diff --git a/docs/assets/logo.png b/docs/assets/logo.png new file mode 100644 index 0000000..b591304 Binary files /dev/null and b/docs/assets/logo.png differ diff --git a/docs/eigen_backend_plan.md b/docs/eigen_backend_plan.md new file mode 100644 index 0000000..9590164 --- /dev/null +++ b/docs/eigen_backend_plan.md @@ -0,0 +1,81 @@ +# Eigen backend plan + +## Decision +We will keep Eigen as the only optional accelerated backend. For moderate dimensions +(~100x100), Eigen provides enough speed without extra build and packaging +complexity. As a result, we do not maintain a special manylinux cibuildwheel +pipeline. + +## Dependencies (C++) +- Optional: Eigen headers. Required only when building with `ELLPHI_USE_EIGEN=1`. +- Default builds do not require Eigen and use the internal C++ solver. + +## Build knobs in this repo +The build script supports: +- `ELLPHI_USE_EIGEN=1` to enable Eigen code paths at compile time. +- `ELLPHI_EIGEN_INCLUDE` to set Eigen include paths (space-separated). + +Notes: +- Eigen is header-only, so no runtime shared libraries are bundled. + +## Build without Eigen +If Eigen headers are not available, build without enabling it: +1) Do not set `ELLPHI_USE_EIGEN`. +2) Run `poetry install` to build the C++ extension with the internal solver. +3) If `ELLPHI_USE_EIGEN=1` is set without headers, the build fails with a + clear error asking for `ELLPHI_EIGEN_INCLUDE`. + +## Local developer workflow +1) Install Eigen headers (examples): + - Ubuntu: `apt-get install libeigen3-dev` + - macOS (Homebrew): `brew install eigen` +2) If Eigen is not in a standard include location, set: + - `ELLPHI_EIGEN_INCLUDE="/path/to/eigen3"` +3) Rebuild the extension: + - `poetry install` + - If needed, delete `src/ellphi/_tangency_cpp_impl*.so` before reinstalling. +4) Quick sanity check: + ```bash + python - <<'PY' + import ellphi; print(ellphi.has_cpp_backend()) + PY + ``` + +## CI/release approach +- Use the normal wheel build process; no manylinux customization is required + for Eigen because it is header-only. +- If Eigen-enabled wheels are desired, set `ELLPHI_USE_EIGEN=1` and + `ELLPHI_EIGEN_INCLUDE` in the build environment. +- No `auditwheel` bundling is needed. + +## Benchmark summary (Eigen vs internal) +Notes: +- Host: Ubuntu aarch64 (local dev machine) +- Eigen: 3.4.0 (`libeigen3-dev`) +- Build: deleted `_tangency_cpp_impl.so` then rebuilt for each mode via `poetry install` +- Run: `OMP_NUM_THREADS=1 poetry run python scripts/benchmark_dim_scale.py` +- joblib emitted a permissions warning and ran in serial mode + +CPP results (avg_time_ms): +``` +dim,Eigen,Internal +2,0.0245,0.0235 +3,0.0243,0.0232 +5,0.0262,0.0243 +8,0.0305,0.0277 +10,0.0338,0.0301 +15,0.0457,0.0426 +20,0.0560,0.0583 +30,0.0928,0.1663 +40,0.1570,0.2003 +50,0.2404,0.3486 +60,0.3323,0.5255 +80,0.5687,1.0683 +100,0.9809,2.3383 +``` + +## Validation checklist +- Confirm `ellphi.has_cpp_backend()` returns `True` for Eigen builds. +- Confirm `ellphi.cpp_linalg_kind()` returns `eigen` when Eigen is enabled. +- Use `ellphi.build_info()` to inspect solver backend choices and C++ build details. +- Run a small tangency call or the benchmark script to confirm performance. diff --git a/docs/guide/differentiable.md b/docs/guide/differentiable.md new file mode 100644 index 0000000..105a2f3 --- /dev/null +++ b/docs/guide/differentiable.md @@ -0,0 +1,87 @@ +# Differentiable Tangency + +The `ellphi.grad` module exposes gradient-enabled versions of the tangency solver. +Gradients are computed analytically via the **envelope theorem**: because the tangency +point $\bm{x}_c$ is optimal at the solution, its implicit derivative with respect to the +parameters drops out, and only the explicit dependence of the pencil on the coefficient +vectors $\bm{p}$ and $\bm{q}$ contributes. + +## Single-pair gradient + +`tangency_grad` returns a [`TangencyGrad`][ellphi.grad.TangencyGrad] dataclass with the +tangency distance $t$ and the gradients $\partial t/\partial \bm{p}$ and +$\partial t/\partial \bm{q}$: + +```python +import numpy as np +from ellphi import ellipse_cloud +from ellphi.grad import tangency_grad + +rng = np.random.default_rng(0) +X = rng.standard_normal((10, 2)) +cloud = ellipse_cloud(X, k=5) + +p, q = cloud[0], cloud[1] +g = tangency_grad(p, q) + +print(f"t = {g.t:.4f}") +print(f"∂t/∂p shape: {g.dt_dp.shape}") # (6,) for 2D +``` + +## Batch pairwise VJP + +`pdist_tangency_grad` computes all pairwise distances and returns a **VJP (pullback)** +function. This is the building block for optimising a loss that depends on the full +distance matrix: + +```python +import numpy as np +from ellphi import ellipse_cloud +from ellphi.grad import pdist_tangency_grad + +rng = np.random.default_rng(1) +X = rng.standard_normal((20, 2)) +cloud = ellipse_cloud(X, k=5) + +dists, vjp = pdist_tangency_grad(cloud.coef) + +# Suppose the loss is the sum of all tangency distances. +# Its gradient w.r.t. each distance is 1. +grad_coefs = vjp(np.ones_like(dists)) # shape (20, 6) +``` + +## Gradient-based optimisation + +The VJP integrates naturally into any gradient descent loop: + +```python +import numpy as np +from ellphi import ellipse_cloud +from ellphi.grad import pdist_tangency_grad + +rng = np.random.default_rng(2) +X = rng.standard_normal((15, 2)) +cloud = ellipse_cloud(X, k=5) +coefs = cloud.coef.copy() + +lr = 1e-3 +for step in range(50): + dists, vjp = pdist_tangency_grad(coefs) + loss = dists.sum() + grad = vjp(np.ones_like(dists)) # ∂loss/∂coefs + coefs -= lr * grad + if step % 10 == 0: + print(f"step {step:3d} loss={loss:.4f}") +``` + +## Persistent-homology backprop + +When combined with modern TDA libraries, `pdist_tangency_grad` enables differentiating +through a persistence diagram — see `notebooks/topology_optimization.ipynb` for a +worked example. + +## Degenerate inputs + +`tangency_grad` may raise `ZeroDivisionError` for degenerate configurations (identical +or concentric ellipsoids) where $\partial F/\partial \mu$ vanishes at the solution. +Duplicate ellipsoids should be removed from the inputs beforehand. diff --git a/docs/guide/notebooks.md b/docs/guide/notebooks.md new file mode 100644 index 0000000..14f6628 --- /dev/null +++ b/docs/guide/notebooks.md @@ -0,0 +1,38 @@ +# Notebook Examples + +The notebooks below demonstrate EllPHi's key workflows end-to-end. +They are hosted alongside the source code on GitHub and can be viewed +directly in the browser or cloned and run locally. + +!!! note "Future plans" + The notebook collection is planned to move to a dedicated repository + with interactive [Marimo](https://marimo.io) versions that run + entirely in the browser via WebAssembly — no local installation + required. Links on this page will be updated when that migration + is complete. + +## Getting started + +| Notebook | Description | +|---|---| +| [Quick Start](https://github.com/t-uda/ellphi/blob/main/notebooks/quickstart.ipynb) | Install EllPHi, build an ellipse cloud, and compute pairwise tangency distances in a few lines. | + +## Persistent homology workflows + +| Notebook | Description | +|---|---| +| [Anisotropy-aware PH — 6 rings](https://github.com/t-uda/ellphi/blob/main/notebooks/eph-6rings-PH.ipynb) | Full pipeline from a six-ring point cloud to a persistence diagram using elliptic tangency distances. | +| [PH figures — standard vs elliptic](https://github.com/t-uda/ellphi/blob/main/notebooks/eph-6rings-PH-figures.ipynb) | Side-by-side comparison of standard (Euclidean) and anisotropic (elliptic) persistent homology on the same data. | +| [n-dimensional demo (3D)](https://github.com/t-uda/ellphi/blob/main/notebooks/ndim-demo-3d.ipynb) | Extends the quick-start to a 3-D point cloud, showing that the solver and distance pipeline work in any dimension. | + +## Differentiable solver + +| Notebook | Description | +|---|---| +| [Topology Optimisation with Gradients](https://github.com/t-uda/ellphi/blob/main/notebooks/topology_optimization.ipynb) | Gradient-based optimisation of ellipsoid configurations using `ellphi.grad` and the VJP interface. | + +## Benchmarks + +| Notebook | Description | +|---|---| +| [Performance Benchmark](https://github.com/t-uda/ellphi/blob/main/notebooks/performance_benchmark.ipynb) | Compares per-call timings of `pdist_tangency` across the pure-Python and compiled C++ backends. | diff --git a/docs/guide/quickstart.md b/docs/guide/quickstart.md new file mode 100644 index 0000000..04e0a59 --- /dev/null +++ b/docs/guide/quickstart.md @@ -0,0 +1,62 @@ +# Getting Started + +## Installation + +```bash +pip install ellphi +``` + +The C++ backend (recommended for performance) is compiled during installation when a suitable compiler is available. Check whether it loaded: + +```python +import ellphi +print(ellphi.build_info()) +``` + +## Create an ellipse cloud + +`ellipse_cloud` fits a local-covariance ellipse around the *k*-nearest neighbours of each point: + +```python +import numpy as np +from ellphi import ellipse_cloud + +rng = np.random.default_rng(42) +X = rng.standard_normal((80, 2)) # 80 points in ℝ² + +cloud = ellipse_cloud(X, k=5) +print(cloud) # EllipseCloud(coef=array<(N, 6)>, ...) +``` + +Each ellipse is stored as a packed conic coefficient vector of length +$m = (d+1)(d+2)/2$ (6 for 2D, 10 for 3D). + +## Compute pairwise tangency distances + +```python +dists = cloud.pdist_tangency() # condensed array, same layout as scipy.pdist +print(dists.shape) # (N*(N-1)//2,) +``` + +Convert to a square matrix when needed: + +```python +D = cloud.distance_matrix() +``` + +## Visualise + +```python +import matplotlib.pyplot as plt + +ax = cloud.plot(alpha=0.4, edgecolor="steelblue") +ax.scatter(X[:, 0], X[:, 1], s=10, c="k") +ax.set_aspect("equal") +plt.show() +``` + +## Next steps + +- [TDA Workflow](tda_workflow.md) — build a persistence diagram from the tangency distance matrix. +- [Differentiable Tangency](differentiable.md) — gradient-based optimisation with `ellphi.grad`. +- [API Reference](../reference/index.md) — full module documentation. diff --git a/docs/guide/tda_workflow.md b/docs/guide/tda_workflow.md new file mode 100644 index 0000000..904d4cb --- /dev/null +++ b/docs/guide/tda_workflow.md @@ -0,0 +1,108 @@ +# TDA Workflow + +This page shows how to go from a raw point cloud to a persistence diagram using elliptic tangency distances. + +## Overview + +1. Sample a point cloud $X \subset \mathbb{R}^d$. +2. Fit an ellipse cloud with `ellipse_cloud`. +3. Compute the condensed pairwise tangency distance matrix with `pdist_tangency`. +4. Feed the matrix to a persistent-homology library (e.g. [HomCloud](https://homcloud.dev/) or [Ripser](https://github.com/scikit-tda/ripser.py)). + +## Step-by-step example + +```python +import numpy as np +from ellphi import ellipse_cloud + +# 1. Point cloud — six interlocking rings +rng = np.random.default_rng(0) +angles = np.linspace(0, 2 * np.pi, 30, endpoint=False) +rings = [ + np.column_stack([np.cos(angles) + dx, np.sin(angles) + dy]) + for dx, dy in [(0, 0), (1.5, 0), (3, 0), (0.75, 1.3), (2.25, 1.3), (1.5, 2.6)] +] +X = np.vstack(rings) + rng.normal(scale=0.05, size=(180, 2)) + +# 2. Ellipse cloud +cloud = ellipse_cloud(X, k=8) + +# 3. Pairwise tangency distances +dists = cloud.pdist_tangency() +``` + +### Persistence diagram with HomCloud + +```python +import homcloud.interface as hc + +pd = hc.PDList.from_rips_filtration(dists, maxdim=1, metric="precomputed") +pd.histogram(1).plot() # H₁ barcode +``` + +### Persistence diagram with Ripser + +```python +from ripser import ripser +from persim import plot_diagrams + +D = cloud.distance_matrix() +result = ripser(D, metric="precomputed", maxdim=1) +plot_diagrams(result["dgms"]) +``` + +## Notes on distance semantics + +Let $p$ and $q$ be generic (nondegenerate) input quadratic polynomials. More precisely, +$p$ and $q$ are squared Mahalanobis distances whose level sets are ellipsoids. +The solver finds $\mu \in (0, 1)$ such that the center $\bm{x}_c$ of the pencil of conics +$(1-\mu)p + \mu q$ satisfies $p(\bm{x}_c) = q(\bm{x}_c)$. The tangency distance is + +$$t(E_p, E_q) = \sqrt{p(\bm{x}_c)} = \sqrt{q(\bm{x}_c)}.$$ + +Because $\bm{x}_c$ is the center of the pencil element, the gradient of the pencil element +vanishes at $x = \bm{x}_c$, which gives + +$$ +(1 - \mu)\,\nabla p(\bm{x}_c) + \mu\,\nabla q(\bm{x}_c) = 0. +$$ + +For $t > 0$, the normals to the level sets $\{p = t^2\}$ and $\{q = t^2\}$ are +anti-parallel at $\bm{x}_c$: these level sets are the reference ellipsoids dilated by a factor of $t$ about their +respective centres, and they are externally tangent at $\bm{x}_c$. + +Equivalently, $t$ is the smallest scale at which the inflated sublevel sets meet: + +$$ +t = \inf\bigl\{s \ge 0 : E_p(s) \cap E_q(s) \neq \varnothing\bigr\}, +\qquad E_p(s) = \{\bm{x} : p(\bm{x}) \le s^2\}, +$$ + +or $t^2 = \min_x \max\{p(x),\, q(x)\}$. This characterisation yields a coarse +trichotomy for the reference ellipsoids $E_p = \{p \le 1\}$, $E_q = \{q \le 1\}$: + +- $0 \le t < 1$: the reference ellipsoids have non-empty intersection (overlap, + containment, or internal tangency). +- $t = 1$: $E_p$ and $E_q$ are externally tangent. +- $t > 1$: $E_p$ and $E_q$ are disjoint; both must be scaled by $t$ to touch. + +Degenerate cases (identical or concentric ellipsoids) yield $t = 0$; the zero level +sets reduce to the respective ellipsoid centres rather than forming two tangent ellipsoids. + +Note that $t$ is non-negative and unbounded above. + +## Choosing $k$ + +By default, `ellipse_cloud` computes an ellipsoid cloud by $k$-nearest neighbour +local covariance construction. + +Larger $k$ produces fatter, more overlapping ellipsoids and tends to smooth out local +noise. A good starting range is $k \in [5, 15]$ for 2D data; for higher-dimensional +data increase $k$ proportionally. + +## Rescaling + +The covariance construction estimates local metrics at each data point, but this process +may distort the scale compared to the global Euclidean metric derived from the input. +Use `cloud.rescale(method="median")` to normalise the scale of the ellipses before +computing tangency distances if you want to compare with the Euclidean setting. diff --git a/docs/hybrid_tuning.md b/docs/hybrid_tuning.md index 9c300e6..c5ce6ce 100644 --- a/docs/hybrid_tuning.md +++ b/docs/hybrid_tuning.md @@ -35,7 +35,7 @@ those quadratic values and the reported scaling factor, normalised by * `brentq+newton` with 28 Brent iterations followed by 3 Newton steps delivered zero failures across 120 cases while keeping mean absolute - μ error below 5×10⁻⁹. + \(\mu\) error below \(5 \times 10^{-9}\). * The tuned hybrid (`28×3`) halves the mean runtime compared to pure bisection (1.09 ms vs. 2.32 ms) while retaining the robustness of the bracketing stage. diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..0aab1fd --- /dev/null +++ b/docs/index.md @@ -0,0 +1,38 @@ +![EllPHi](assets/logo.png){ width=220 style="display:block;margin:0 auto 1rem;" } + +# EllPHi + +**EllPHi** is a fast ellipse (and ellipsoid) tangency solver for Python, designed for applications in Topological Data Analysis (TDA) and Computational Geometry. + +## Features + +- **Ellipse cloud construction** — fit local covariance ellipses to a point cloud with `ellipse_cloud`. +- **Fast tangency distances** — compute the pairwise tangency distance matrix with `pdist_tangency`, dispatching automatically to a compiled C++ backend (Eigen) when available. +- **Differentiable solver** — `ellphi.grad` provides per-pair gradients (`tangency_grad`) and a batch pairwise VJP (`pdist_tangency_grad`) for gradient-based optimisation and persistent-homology backprop. +- **n-dimensional support** — geometry and solver work in any dimension ≥ 2. + +## Quick install + +```bash +pip install ellphi +``` + +## Five-line example + +```python +import numpy as np +from ellphi import ellipse_cloud, pdist_tangency + +rng = np.random.default_rng(0) +X = rng.standard_normal((60, 2)) # 60 points in 2D +cloud = ellipse_cloud(X, k=5) # fit local-covariance ellipses +dists = cloud.pdist_tangency() # condensed distance matrix (1770,) +print(dists.min(), dists.max()) +``` + +## Documentation + +- [Getting Started](guide/quickstart.md) — install and first steps +- [TDA Workflow](guide/tda_workflow.md) — full pipeline from point cloud to persistence diagram +- [Differentiable Tangency](guide/differentiable.md) — gradient-based optimisation with `ellphi.grad` +- [API Reference](reference/index.md) — full module documentation diff --git a/docs/javascripts/mathjax.js b/docs/javascripts/mathjax.js new file mode 100644 index 0000000..93a539c --- /dev/null +++ b/docs/javascripts/mathjax.js @@ -0,0 +1,20 @@ +window.MathJax = { + tex: { + packages: {'[+]': ['boldsymbol']}, + inlineMath: [["\\(", "\\)"]], + displayMath: [["\\[", "\\]"]], + processEscapes: true, + processEnvironments: true, + macros: { + bm: ["\\boldsymbol{#1}", 1] + } + }, + options: { + ignoreHtmlClass: ".*|", + processHtmlClass: "arithmatex" + } +}; + +document$.subscribe(() => { + MathJax.typesetPromise() +}) diff --git a/docs/reference/ellcloud.md b/docs/reference/ellcloud.md new file mode 100644 index 0000000..f06ade4 --- /dev/null +++ b/docs/reference/ellcloud.md @@ -0,0 +1,19 @@ +# ellphi.ellcloud + +The `EllipseCloud` class is the central data structure of EllPHi. It holds an array of ellipsoid coefficient vectors together with the original means and covariances, and provides convenience methods for computing tangency distances and visualisation. + +The `ellipse_cloud` factory function (an alias for `EllipseCloud.from_point_cloud`) is the recommended entry point: + +```python +from ellphi import ellipse_cloud +cloud = ellipse_cloud(X, k=5) +``` + +When centres and covariance matrices are already available, prefer the direct +constructor: + +```python +cloud = EllipseCloud.from_cov(centers, covs) +``` + +::: ellphi.ellcloud diff --git a/docs/reference/geometry.md b/docs/reference/geometry.md new file mode 100644 index 0000000..cbbde90 --- /dev/null +++ b/docs/reference/geometry.md @@ -0,0 +1,13 @@ +# ellphi.geometry + +Utilities for encoding and decoding ellipsoid geometry as packed conic coefficient vectors. + +A *d*-dimensional ellipsoid centred at $\bm{x}_0$ with covariance $\Sigma$ is represented by the quadratic form + +$$ +E = \{ \bm{x} : (\bm{x} - \bm{x}_0)^\top \Sigma^{-1} (\bm{x} - \bm{x}_0) \le 1 \} +$$ + +The coefficient vector packs the upper-triangular entries of $A = \Sigma^{-1}$, followed by the linear term $\bm{b} = -A\bm{x}_0$ and the scalar $c = \bm{x}_0^\top A \bm{x}_0$, into a flat array of length $m = (d+1)(d+2)/2$. The internal evaluator applies a factor of 2 to $\bm{b}$, so the effective evaluation is $(\bm{x} - \bm{x}_0)^\top A (\bm{x} - \bm{x}_0)$, which equals 1 on the ellipsoid boundary and 0 at its center. + +::: ellphi.geometry diff --git a/docs/reference/grad.md b/docs/reference/grad.md new file mode 100644 index 0000000..ad8f5c2 --- /dev/null +++ b/docs/reference/grad.md @@ -0,0 +1,21 @@ +# ellphi.grad + +Differentiable tangency distances for gradient-based optimisation and persistent-homology backprop. + +Gradients are derived via the **envelope theorem**: the derivative through the optimal tangent point $\bm{x}^*$ vanishes, so only the explicit dependence of the pencil on the input coefficients survives. This makes the gradient cheap — no second solver pass is required. + +```python +from ellphi.grad import tangency_grad, pdist_tangency_grad + +# Single pair +g = tangency_grad(p, q) +# g.t, g.dt_dp, g.dt_dq + +# Batch pairwise with VJP +dists, vjp = pdist_tangency_grad(coefs) +grad_coefs = vjp(upstream_grad) # ∂loss/∂coefs +``` + +See the [Differentiable Tangency guide](../guide/differentiable.md) for full examples. + +::: ellphi.grad diff --git a/docs/reference/index.md b/docs/reference/index.md new file mode 100644 index 0000000..fcfe5be --- /dev/null +++ b/docs/reference/index.md @@ -0,0 +1,24 @@ +# API Reference + +EllPHi's public API is organised into the following modules: + +| Module | Description | +|--------|-------------| +| [`ellphi.geometry`](geometry.md) | Conic coefficient encoding/decoding and covariance-to-ellipse conversion. | +| [`ellphi.ellcloud`](ellcloud.md) | `EllipseCloud` container and the `ellipse_cloud` factory function. | +| [`ellphi.solver`](solver.md) | Tangency solver — `tangency` (single pair) and `pdist_tangency` (pairwise). | +| [`ellphi.grad`](grad.md) | Differentiable solver — gradients and VJP for gradient-based optimisation. | +| [`ellphi.visualization`](visualization.md) | Matplotlib helpers for visualising ellipse clouds. | + +The top-level `ellphi` namespace re-exports the most commonly used symbols: + +```python +from ellphi import ( + ellipse_cloud, # factory: point cloud → EllipseCloud + EllipseCloud, + tangency, # single-pair tangency distance + pdist_tangency, # pairwise condensed distance matrix + TangencyResult, # NamedTuple: t, point, mu + build_info, # solver backend details +) +``` diff --git a/docs/reference/solver.md b/docs/reference/solver.md new file mode 100644 index 0000000..80c5bf2 --- /dev/null +++ b/docs/reference/solver.md @@ -0,0 +1,21 @@ +# ellphi.solver + +The solver module dispatches tangency computations to the best available backend: + +- **C++ / Eigen** — compiled extension, used automatically when available (`backend="auto"`). +- **Pure Python** — SciPy-based fallback, always available. + +The default method `"brentq+newton"` uses a short bracketing phase followed by Newton refinement, which is significantly faster than pure Brent's method for high-dimensional inputs. + +```python +from ellphi import tangency, pdist_tangency, build_info + +print(build_info()) # shows cpp_backend_available, cpp_linalg_kind, etc. + +result = tangency(p, q) +print(result.t, result.point, result.mu) + +dists = pdist_tangency(cloud) # condensed array +``` + +::: ellphi.solver diff --git a/docs/reference/visualization.md b/docs/reference/visualization.md new file mode 100644 index 0000000..d435350 --- /dev/null +++ b/docs/reference/visualization.md @@ -0,0 +1,16 @@ +# ellphi.visualization + +Matplotlib helpers for rendering ellipse clouds. For most use cases, `EllipseCloud.plot()` is the recommended entry point — it calls `ellipse_patch` internally. + +```python +import matplotlib.pyplot as plt +from ellphi.visualization import ellipse_patch + +fig, ax = plt.subplots() +patch = ellipse_patch(center, r_major, r_minor, theta, edgecolor="teal", alpha=0.5) +ax.add_patch(patch) +ax.set_aspect("equal") +plt.show() +``` + +::: ellphi.visualization diff --git a/ellphi-logo.png b/ellphi-logo.png index 673218b..b591304 100644 Binary files a/ellphi-logo.png and b/ellphi-logo.png differ diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..5503958 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,83 @@ +site_name: EllPHi +site_url: https://t-uda.github.io/ellphi/ +repo_url: https://github.com/t-uda/ellphi + +theme: + name: material + logo: assets/logo-icon.png + favicon: assets/logo-icon.png + features: + - navigation.tabs + - navigation.instant + - content.code.copy + 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 + primary: teal + accent: purple + toggle: + icon: material/brightness-7 + name: Switch to dark mode + # Palette toggle for dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: teal + accent: lime + toggle: + icon: material/brightness-4 + name: Switch to system preference + +plugins: + - search + - mkdocstrings: + handlers: + python: + paths: [src] + options: + docstring_style: google # or numpy, depending on your codebase style + show_source: true + show_root_heading: true + +markdown_extensions: + - attr_list + - admonition + - pymdownx.details + - pymdownx.superfences + - pymdownx.highlight: + anchor_linenums: true + line_spans: __span + pygments_lang_class: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.arithmatex: + generic: true + +extra_javascript: + - javascripts/mathjax.js + - https://polyfill.io/v3/polyfill.min.js?features=es6 + - https://cdn.jsdelivr.net/npm/mathjax@3/es5/tex-chtml-full.js + +nav: + - Home: index.md + - Getting Started: guide/quickstart.md + - User Guide: + - TDA Workflow: guide/tda_workflow.md + - Differentiable Tangency: guide/differentiable.md + - Notebook Examples: guide/notebooks.md + - API Reference: + - Overview: reference/index.md + - ellphi.geometry: reference/geometry.md + - ellphi.ellcloud: reference/ellcloud.md + - ellphi.solver: reference/solver.md + - ellphi.grad: reference/grad.md + - ellphi.visualization: reference/visualization.md + - Design Notes: + - Algebraic Sigmoid + Newton: algebraic_sigmoid_newton.md + - Hybrid Solver Tuning: hybrid_tuning.md + - Eigen Backend Plan: eigen_backend_plan.md diff --git a/notebooks/topology_optimization.ipynb b/notebooks/topology_optimization.ipynb new file mode 100644 index 0000000..d6a7db5 --- /dev/null +++ b/notebooks/topology_optimization.ipynb @@ -0,0 +1,658 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "9b76127b", + "metadata": {}, + "source": [ + "# Topology Optimisation with EllPHi Gradients\n", + "\n", + "This notebook demonstrates how to use `ellphi.grad` for gradient-based\n", + "optimisation of ellipsoid configurations. No dependencies beyond **ellphi**\n", + "and **scipy** are required.\n", + "\n", + "**Sections**\n", + "1. Gradient-aware tangency (single pair)\n", + "2. Batch gradients and the VJP pattern\n", + "3. [Placeholder] Persistence diagram optimisation" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "36a9cd5b", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:45.703843Z", + "iopub.status.busy": "2026-03-20T11:10:45.703712Z", + "iopub.status.idle": "2026-03-20T11:10:46.165826Z", + "shell.execute_reply": "2026-03-20T11:10:46.165469Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "ellphi version: 0.1.2.dev0\n" + ] + } + ], + "source": [ + "import numpy as np\n", + "import ellphi\n", + "from ellphi import (\n", + " tangency_grad,\n", + " pdist_tangency_grad,\n", + " pdist_tangency,\n", + " coef_from_axes,\n", + " coef_from_cov,\n", + " tangency,\n", + ")\n", + "\n", + "rng = np.random.default_rng(42)\n", + "print('ellphi version:', ellphi.__version__)" + ] + }, + { + "cell_type": "markdown", + "id": "866f83a9", + "metadata": {}, + "source": [ + "---\n", + "## 1. Gradient-aware tangency (single pair)\n", + "\n", + "`tangency_grad(p, q)` returns a `TangencyGrad` dataclass with three fields:\n", + "\n", + "| Field | Shape | Meaning |\n", + "|-------|-------|---------|\n", + "| `t` | scalar | Tangency distance (same as `tangency(p, q).t`) |\n", + "| `dt_dp` | `(m,)` | Gradient of `t` w.r.t. first-ellipsoid coefficients |\n", + "| `dt_dq` | `(m,)` | Gradient of `t` w.r.t. second-ellipsoid coefficients |\n", + "\n", + "`coef_from_axes(X, r0, r1, theta)` builds a single ellipse coefficient vector\n", + "from a center `X`, semi-axes `r0`/`r1`, and orientation angle `theta`." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "8a14d47a", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.168191Z", + "iopub.status.busy": "2026-03-20T11:10:46.167996Z", + "iopub.status.idle": "2026-03-20T11:10:46.172330Z", + "shell.execute_reply": "2026-03-20T11:10:46.172027Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "t = 1.042287\n", + "dt_dp = [3.13295714 2.49616215 0.49720002 2.2102748 0.88051065 0.38983255]\n", + "dt_dq = [0.72235141 0.57552854 0.11463711 0.50961282 0.20301526 0.08988188]\n" + ] + } + ], + "source": [ + "# Build two 2-D ellipses from axes/angle representation\n", + "p = coef_from_axes(np.array([0.0, 0.0]), 3.0, 1.0, 0.3)\n", + "q = coef_from_axes(np.array([4.0, 1.0]), 2.0, 0.5, -0.5)\n", + "\n", + "g = tangency_grad(p, q)\n", + "print(f't = {g.t:.6f}')\n", + "print(f'dt_dp = {g.dt_dp}')\n", + "print(f'dt_dq = {g.dt_dq}')" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "3149595e", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.173730Z", + "iopub.status.busy": "2026-03-20T11:10:46.173629Z", + "iopub.status.idle": "2026-03-20T11:10:46.176233Z", + "shell.execute_reply": "2026-03-20T11:10:46.175982Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "analytic dt_dp[0] = 3.13295714\n", + "finite-diff = 3.13295714\n", + "relative error = 2.69e-11\n" + ] + } + ], + "source": [ + "# Quick finite-difference check for dt_dp[0]\n", + "h = 1e-6\n", + "p_plus = p.copy()\n", + "p_plus[0] += h\n", + "p_minus = p.copy()\n", + "p_minus[0] -= h\n", + "fd = (tangency(p_plus, q).t - tangency(p_minus, q).t) / (2 * h)\n", + "print(f'analytic dt_dp[0] = {g.dt_dp[0]:.8f}')\n", + "print(f'finite-diff = {fd:.8f}')\n", + "print(f'relative error = {abs(g.dt_dp[0] - fd) / abs(fd):.2e}')" + ] + }, + { + "cell_type": "markdown", + "id": "922864c6", + "metadata": {}, + "source": [ + "---\n", + "## 2. Batch gradients and the VJP pattern\n", + "\n", + "`pdist_tangency_grad(coefs)` returns:\n", + "- `dists`: condensed pairwise distance array (same as `pdist_tangency`)\n", + "- `vjp`: a pullback `grad_dists → grad_coefs` that accumulates upstream\n", + " gradients into per-ellipsoid coefficient gradients\n", + "\n", + "The VJP can be chained with any scalar loss `L(dists)` via the chain rule:\n", + "`∂L/∂coefs = vjp(∂L/∂dists)`" + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6f1fa22b", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.177401Z", + "iopub.status.busy": "2026-03-20T11:10:46.177321Z", + "iopub.status.idle": "2026-03-20T11:10:46.183603Z", + "shell.execute_reply": "2026-03-20T11:10:46.183360Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "max |dists - ref|: 0.0\n", + "distances: [2.29796195 8.07432226 3.18499214 5.91116232 7.6311246 1.21815661\n", + " 6.87865889 6.05896354 5.01377611 6.56044731]\n" + ] + } + ], + "source": [ + "# Build a small cloud of N=5 random 2-D ellipses\n", + "N = 5\n", + "means = rng.uniform(-20, 20, (N, 2))\n", + "covs = np.stack([\n", + " (lambda F: F @ F.T + 4 * np.eye(2))(rng.standard_normal((2, 2)))\n", + " for _ in range(N)\n", + "])\n", + "coefs = coef_from_cov(means, covs)\n", + "\n", + "dists, vjp = pdist_tangency_grad(coefs)\n", + "\n", + "# Verify distances match pdist_tangency\n", + "ref = pdist_tangency(coefs)\n", + "print('max |dists - ref|:', np.max(np.abs(dists - ref)))\n", + "print('distances:', dists)" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "1bdb2c81", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.184782Z", + "iopub.status.busy": "2026-03-20T11:10:46.184695Z", + "iopub.status.idle": "2026-03-20T11:10:46.186730Z", + "shell.execute_reply": "2026-03-20T11:10:46.186495Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "grad_coefs shape: (5, 6)\n", + "grad_coefs[0]: [29.27797444 16.4591706 5.01931062 4.31358709 1.63785166 0.26589981]\n" + ] + } + ], + "source": [ + "# Example: gradient of sum(dists) w.r.t. all coefficients\n", + "grad_coefs = vjp(np.ones_like(dists))\n", + "print('grad_coefs shape:', grad_coefs.shape) # (N, m)\n", + "print('grad_coefs[0]:', grad_coefs[0])" + ] + }, + { + "cell_type": "markdown", + "id": "9d2c0deb", + "metadata": {}, + "source": [ + "---\n", + "## 3. Persistence Diagram Optimisation via VJP (homcloud)\n", + "\n", + "This section drives gradient descent on ellipsoid centres using a\n", + "**persistence-diagram loss** on H1 features computed with\n", + "[homcloud](https://homcloud.dev).\n", + "\n", + "### Setup\n", + "\n", + "* N = 8 two-dimensional ellipsoids with **fixed** isotropic shape\n", + " (covariance `1.5 I`) whose centres are optimised.\n", + "* The N × N tangency-distance matrix `D` is fed to\n", + " `hc.PDList.from_rips_filtration` to build a **flag (clique)\n", + " filtration** on the complete weighted graph. Because `t(P, Q)` is a\n", + " dissimilarity (not a metric — the triangle inequality fails in\n", + " general), the resulting persistence diagram is interpreted as the PH\n", + " of a weighted graph, not as Vietoris–Rips PH of a metric space.\n", + "\n", + "### Loss and gradient chain\n", + "\n", + "A single H1 birth–death pair `(b, d)` is targeted. The loss is\n", + "\n", + " L = (b − b*)² + (d − d*)²\n", + "\n", + "where `(b*, d*)` is a feasible target with `b* < d*`.\n", + "\n", + "The gradient flows through the following chain:\n", + "\n", + " ∂L/∂dists (sparse: only the birth edge and the death edge are non-zero)\n", + " ↓ vjp\n", + " ∂L/∂coefs (shape N × m)\n", + " ↓ Jacobian of coef_from_cov w.r.t. centres\n", + " ∂L/∂centres (shape N × 2)\n", + "\n", + "For a Rips H1 pair in generic position, `b` is the weight of a unique\n", + "birth edge and `d` is the weight of a unique death-controlling edge, so\n", + "`∂b/∂dists[k]` and `∂d/∂dists[k]` are 0 or 1. Both edges are\n", + "identified by scanning `D` (float32) for unique matches; a non-unique\n", + "match indicates a degenerate (non-smooth) step and the loop stops.\n", + "\n", + "**Float32 approximation note.** HomCloud / ripser uses float32 distances\n", + "internally. Critical edges are selected from the float32 matrix, while\n", + "the VJP pullback operates on the original float64 tangency distances.\n", + "This is a reasonable numerical approximation; strictly speaking it is\n", + "the gradient of the ideal real-weight filtration value, not of the\n", + "exact float32-rounded pipeline.\n", + "\n", + "**Smoothness note.** The map from centres to the selected pair is only\n", + "*locally* smooth. As long as the critical edges and the selected H1\n", + "pair do not change, the update is the **ordinary gradient** of that\n", + "local smooth branch. When ties or pairing switches occur the objective\n", + "is non-smooth; the same step acts as a heuristic continuation and offers\n", + "no convergence guarantee.\n", + "\n", + "### Centre-only Jacobian\n", + "\n", + "With fixed inverse covariance `Q = cov⁻¹` and centre `X`, the packed\n", + "ellphi coefficients satisfy `ℓ = −Q X` and `c = Xᵀ Q X`. The\n", + "Jacobian `J = d(coef)/d(X)` is therefore\n", + "\n", + " J = [ 0, 0 ] ← quad block (fixed)\n", + " [ 0, 0 ]\n", + " [ 0, 0 ]\n", + " [−Q₁₁, −Q₁₂] ← linear block\n", + " [−Q₁₂, −Q₂₂]\n", + " [2(QX)₁, 2(QX)₂] ← constant\n", + "\n", + "and `grad_X = Jᵀ @ grad_coef`." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "9akahxlx11v", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.188153Z", + "iopub.status.busy": "2026-03-20T11:10:46.188063Z", + "iopub.status.idle": "2026-03-20T11:10:46.778690Z", + "shell.execute_reply": "2026-03-20T11:10:46.778360Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Initial H1 pair: birth = 1.1027, death = 2.1507, persistence = 1.0480\n" + ] + } + ], + "source": [ + "import homcloud.interface as hc\n", + "import tempfile\n", + "import os\n", + "import matplotlib.pyplot as plt\n", + "\n", + "# --- Initial configuration ---\n", + "# N ellipsoids with fixed isotropic covariance arranged roughly on a circle.\n", + "# Using a separate RNG so this section is reproducible independently.\n", + "rng_opt = np.random.default_rng(7)\n", + "N_OPT = 8\n", + "angles_opt = np.linspace(0, 2 * np.pi, N_OPT, endpoint=False)\n", + "centers_init = np.column_stack(\n", + " [3.0 * np.cos(angles_opt), 3.0 * np.sin(angles_opt)]\n", + ") + rng_opt.normal(0, 0.2, (N_OPT, 2))\n", + "\n", + "cov_shape = 1.5 * np.eye(2)\n", + "covs_opt = np.stack([cov_shape] * N_OPT)\n", + "inv_covs_opt = np.linalg.inv(covs_opt) # Q = cov^{-1}, fixed throughout\n", + "\n", + "\n", + "def build_D_and_pd(centers, covs, N):\n", + " \"\"\"Compute pairwise tangency distances and the H1 persistence diagram.\"\"\"\n", + " coefs = coef_from_cov(centers, covs)\n", + " dists, vjp = pdist_tangency_grad(coefs)\n", + " # Build float32 distance matrix (homcloud / ripser uses float32 internally)\n", + " D = np.zeros((N, N), dtype=np.float32)\n", + " k = 0\n", + " for i in range(N):\n", + " for j in range(i + 1, N):\n", + " D[i, j] = D[j, i] = dists[k]\n", + " k += 1\n", + " with tempfile.NamedTemporaryFile(suffix=\".pdgm\", delete=False) as f:\n", + " tmp = f.name\n", + " pdlist = hc.PDList.from_rips_filtration(D, maxdim=1, save_to=tmp)\n", + " pd1 = pdlist.dth_diagram(1)\n", + " os.unlink(tmp)\n", + " return dists, vjp, D, pd1\n", + "\n", + "\n", + "# Verify initial configuration has exactly one H1 pair\n", + "_, _, D_init, pd1_init = build_D_and_pd(centers_init, covs_opt, N_OPT)\n", + "pairs_init = pd1_init.pairs()\n", + "assert len(pairs_init) == 1, (\n", + " f\"Expected exactly 1 H1 pair for the demo, got {len(pairs_init)}. \"\n", + " \"Try a different initial configuration.\"\n", + ")\n", + "p0 = pairs_init[0]\n", + "b0, d0 = float(p0.birth), float(p0.death)\n", + "print(f\"Initial H1 pair: birth = {b0:.4f}, death = {d0:.4f}, \"\n", + " f\"persistence = {d0 - b0:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "l91i3dahq3", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.780304Z", + "iopub.status.busy": "2026-03-20T11:10:46.780124Z", + "iopub.status.idle": "2026-03-20T11:10:46.783523Z", + "shell.execute_reply": "2026-03-20T11:10:46.783252Z" + } + }, + "outputs": [], + "source": [ + "def condensed_idx(i, j, N):\n", + " \"\"\"SciPy-style condensed index for the unordered edge {i, j}.\"\"\"\n", + " if i > j:\n", + " i, j = j, i\n", + " return N * i - i * (i + 1) // 2 + j - i - 1\n", + "\n", + "\n", + "def find_unique_edge(D_f32, val_f32, N):\n", + " \"\"\"Return the unique edge (i, j) with D_f32[i, j] == val_f32.\n", + "\n", + " The genericity assumption required for the gradient to be well-defined\n", + " is that the birth (or death) value is attained by exactly one edge in the\n", + " float32 distance matrix seen by homcloud / ripser. If more than one edge\n", + " matches, the configuration is degenerate and the caller should stop.\n", + "\n", + " Note: homcloud 4.8.0 does not expose birth/death simplex vertex indices\n", + " for Rips filtrations (RipsResolver.resolve_cells is not implemented).\n", + " This scan is the correct fallback under the generic-position assumption.\n", + " \"\"\"\n", + " matches = [\n", + " (i, j)\n", + " for i in range(N)\n", + " for j in range(i + 1, N)\n", + " if D_f32[i, j] == val_f32\n", + " ]\n", + " return matches[0] if len(matches) == 1 else None\n", + "\n", + "\n", + "def center_gradient(grad_coefs, centers, inv_covs):\n", + " \"\"\"Backpropagate grad_coefs to centre coordinates.\n", + "\n", + " With fixed Q = inv_cov, the packed ellphi conic coefficients are:\n", + " quad block (indices 0..n_quad-1): constant, no centre dependence\n", + " linear block (indices n_quad..n_quad+n-1): ℓ = −Q X\n", + " constant (index -1): c = Xᵀ Q X\n", + "\n", + " The Jacobian J = d(coef)/d(X) has:\n", + " rows for quad: 0\n", + " rows for linear: −Q (n × n matrix)\n", + " row for const: 2(QX)ᵀ\n", + "\n", + " Hence grad_X = Jᵀ @ g = −Q @ g_linear + 2*(Q @ X) * g_const.\n", + "\n", + " For 2D ellipses (n=2), the packed layout is\n", + " [Q11, Q12, Q22, l1, l2, c], so n_quad = 3.\n", + " \"\"\"\n", + " N = len(centers)\n", + " n = centers.shape[1] # spatial dimension\n", + " n_quad = n * (n + 1) // 2 # number of upper-triangular quad entries\n", + " grad_centers = np.zeros_like(centers)\n", + " for i in range(N):\n", + " Q = inv_covs[i]\n", + " X = centers[i]\n", + " g = grad_coefs[i]\n", + " g_linear = g[n_quad: n_quad + n]\n", + " g_const = g[-1]\n", + " grad_centers[i] = -Q @ g_linear + 2.0 * (Q @ X) * g_const\n", + " return grad_centers" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "07owbfuamkkh", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:46.784833Z", + "iopub.status.busy": "2026-03-20T11:10:46.784745Z", + "iopub.status.idle": "2026-03-20T11:10:47.166662Z", + "shell.execute_reply": "2026-03-20T11:10:47.166298Z" + } + }, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Target: b* = 1.3027, d* = 1.9507 (delta = 0.2000)\n", + "Step 1: b = 1.1027, d = 2.1507, L = 0.080000\n", + "Step 10: b = 1.1553, d = 2.1065, L = 0.045975\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Step 20: b = 1.1977, d = 2.0748, L = 0.026426\n", + "Step 30: b = 1.2279, d = 2.0497, L = 0.015384\n", + "Step 40: b = 1.2494, d = 2.0296, L = 0.009065\n", + "\n", + "Final H1 pair: birth = 1.2494, death = 2.0296\n", + "Target: b* = 1.3027, d* = 1.9507\n" + ] + } + ], + "source": [ + "# --- Optimisation target ---\n", + "# Shrink persistence: push birth up and death down by delta,\n", + "# ensuring b* < d* (feasibility).\n", + "delta = min(0.2, 0.25 * (d0 - b0))\n", + "b_star = b0 + delta\n", + "d_star = d0 - delta\n", + "print(f\"Target: b* = {b_star:.4f}, d* = {d_star:.4f} (delta = {delta:.4f})\")\n", + "\n", + "# --- Gradient-descent loop ---\n", + "# On each locally smooth branch (fixed critical edges and H1 pairing)\n", + "# this is ordinary gradient descent. When pairing switches or ties\n", + "# occur it acts as a heuristic continuation step.\n", + "lr = 0.05\n", + "n_steps = 40\n", + "\n", + "centers_cur = centers_init.copy()\n", + "history = [(b0, d0)]\n", + "losses = []\n", + "\n", + "for step in range(n_steps):\n", + " dists, vjp, D, pd1 = build_D_and_pd(centers_cur, covs_opt, N_OPT)\n", + " pairs = pd1.pairs()\n", + "\n", + " # Stop if the number of H1 pairs has changed\n", + " if len(pairs) != 1:\n", + " print(f\"Step {step}: H1 count = {len(pairs)}, stopping.\")\n", + " break\n", + "\n", + " # Exactly one H1 pair at this point; take it directly\n", + " p = pairs[0]\n", + " b, d = float(p.birth), float(p.death)\n", + " history.append((b, d))\n", + " loss = (b - b_star) ** 2 + (d - d_star) ** 2\n", + " losses.append(loss)\n", + "\n", + " if (step + 1) % 10 == 0 or step == 0:\n", + " print(f\"Step {step + 1:3d}: b = {b:.4f}, d = {d:.4f}, L = {loss:.6f}\")\n", + "\n", + " # Identify the birth and death edges from the float32 distance matrix.\n", + " # Under the generic-position assumption (no two edges share the same\n", + " # float32 weight), each filtration value corresponds to a unique edge.\n", + " # The gradient is then the exact derivative of that locally smooth branch;\n", + " # the float64→float32 rounding in the filtration step is not back-propagated.\n", + " birth_edge = find_unique_edge(D, np.float32(b), N_OPT)\n", + " death_edge = find_unique_edge(D, np.float32(d), N_OPT)\n", + "\n", + " if birth_edge is None or death_edge is None:\n", + " # Non-unique edge: degenerate (non-smooth) configuration.\n", + " print(f\"Step {step}: non-unique birth or death edge, stopping.\")\n", + " break\n", + "\n", + " # Assemble the sparse upstream gradient in distance space.\n", + " # ∂L/∂dists is non-zero only at the two critical edges.\n", + " grad_dists = np.zeros_like(dists)\n", + " grad_dists[condensed_idx(*birth_edge, N_OPT)] += 2.0 * (b - b_star)\n", + " grad_dists[condensed_idx(*death_edge, N_OPT)] += 2.0 * (d - d_star)\n", + "\n", + " # Pull back through the VJP to coefficient space, then to centre space.\n", + " grad_coefs = vjp(grad_dists)\n", + " grad_c = center_gradient(grad_coefs, centers_cur, inv_covs_opt)\n", + "\n", + " centers_cur = centers_cur - lr * grad_c\n", + "\n", + "print(f\"\\nFinal H1 pair: birth = {history[-1][0]:.4f}, death = {history[-1][1]:.4f}\")\n", + "print(f\"Target: b* = {b_star:.4f}, d* = {d_star:.4f}\")" + ] + }, + { + "cell_type": "code", + "execution_count": 9, + "id": "s9qfzlroai", + "metadata": { + "execution": { + "iopub.execute_input": "2026-03-20T11:10:47.168608Z", + "iopub.status.busy": "2026-03-20T11:10:47.168452Z", + "iopub.status.idle": "2026-03-20T11:10:47.453332Z", + "shell.execute_reply": "2026-03-20T11:10:47.453034Z" + } + }, + "outputs": [ + { + "data": { + "image/png": "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QW699VakpKTgjTfeUP+m8Ed7h6vBgQZ6INesWVOJfIwE5r1QUBhmOb755hslmvHYKQBTNOX1tfQxpsDP60fxmdu9+eab6jMF7y1CD14K5jy+Bx54QP3mHnrooXzb8NrzHFNk5/7o7UpxksK2WZw3i4OjR49W4iHPAe97itFFJQSjcMnzWZigaw1ff/01nnvuuatux2vJYzGLh+b7ujiuVk9Yc11KyoULF9QATGH3Pzlx4oSqS1j38DzTUoT3Oa97WVDSOszyOlLcttpGwSQIgiAIgiAIgiAIgl2QlJTEMDnTiBEjSrT92bNnTXq93vTaa6/lW3/gwAGTs7NzvvW9e/dW+54zZ07euqysLFPNmjVNo0ePzlu3Y8cOtd2sWbOu+D7zPr744ot863/44QeTTqczbdiwId96bsftN23apF5/8MEH6vXly5eLPS7z91yNM2fOXFHWcePGqXUvv/xyvm3btWtn6tChQ7513O6FF17Ie/3OO++oddxvQerWrav2bSYzM9NkMBiuKI+bm1u+7y6sjIXxzTffqO147SzZtWuXWj9t2rR868ePH39F+flvrhszZkyp7hOj0Whq3LixadCgQerfZtLT003169c3DRgw4IrvmjhxYr593nTTTabAwMBijzU7O9sUHBxsatu2rboHzXz11Vdqn7z+ZnJzc/NtQxISEkw1atTI991Tp041+fr6qu2LgteA++/fv3++45s+fbo6P4mJiep1SkqKqVq1aqbJkyfn+3xUVJTJz88v33oeQ0hISN5nyd9//62+h/dMQTZv3qzemzdvnulaeO+999R+XnrppRJtz22nTJmSb92aNWvUev61tp4o6XUxf7flfVoYq1atUtstXbr0ivd4HvnewoUL89WVPO/8XRd3PAV/t5bHaXmflbQOM3Px4kW1/q233jJZg0TECoIgCIIgCIIgCIKdwCgzwmnQJYFTcxnJxUjE2NjYvIVRhox8LDhNmNF9d911V95rJunhlHBGd5YUTtllxJ8l8+fPVxGsjJyzLIfZB9NcDrNH5W+//abKXRScKn2tU7eZGMkSTpu25jhLch7MybsYgctIYbPVwu7du63eHz9PGNFpCe0KyIMPPnhFVGdJj72k9wkjGRl5SFsDlse8HX1m+/Xrh/Xr119x3Qo7z/ys+V4uDEaL0rOUn7VMFMXIX05zt0Sv1+dtw+/m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/HbGXMct16/2eHMcs7kEYq9n3BIUlBPErq6uKig7ffr0Wj2IuZ4xf/zxx4aWLVuqMcv3q/Hjx6uDa3Paj8uYL3/P/vjjj4amTZuqz2OrVq0Mf/zxR62N+XrHLfuiip4j73Eisny2EIiVbdyVtn/WxpJiJLWxT7MFDMReZCf/mDorl4iIiIiIiIiIiMiaWVfBESIiIiIiIiIiIiIzxEAsERERERERERERUQ1jIJaIiIiIiIiIiIiohjEQS0RERERERERERFTDGIglIiIiIiIiIiIiqmEMxBIRERERERERERHVMAZiiYiIiIiIiIiIiGoYA7FERERERERERERENYyBWCIiIiKqVX379sUTTzxxxZ/Xr18fH374YY38biIiIiIiU2EglojKTJo0CSNHjuQaISIik9q1axemTp161cesX78ednZ2yMzMrLVxERERERHdCIcbejYRERERUTULDAy86s9LSkq4zomIiIjI4jAjlsgG/fzzz2jTpg1cXV3h7++PgQMH4umnn8b8+fOxfPlylWEki2QbiYSEBNxxxx3w8fGBn58fRowYgbi4uH9l0r788svq4NnLywvTpk1DcXGxCf+XRERkzrRaLR555BF4e3sjICAA//3vf2EwGCosTSD7pM8//xy33nor3N3dcf/996Nfv37qZ76+vurnsi8qpdfr8cwzz6h9VkhICF566SUT/A+JiIiIiC7FQCyRjUlMTMSdd96JKVOm4NixYyrYOnr0aLz44osq2Dp06FD1GFm6d++uso6GDBkCT09PbNq0CVu2bIGHh4d6XPlA69q1a8t+38KFC7FkyRIVmCUiIqqInPxzcHDAzp078dFHH+H999/H119/fcWVJcHUUaNG4dChQ2r/8ssvv6j7o6Oj1T5Lfkf53y0B2x07duDtt9/GK6+8gtWrV/OFICIiIiKTYmkCIhsjB6uShSTB13r16qn7JDtWSIZsUVGRyh4qtWDBApVZJAfHknEk5s6dq7JjJeg6ePBgdZ+TkxPmzJkDNzc3tGrVSh30Spbtq6++Cnt7nvMhIqJL1a1bFx988IHatzRr1kwFWOW2ZLtW5K677sLkyZPLbsfGxqrLoKAgtU8qLzIyUp1gFE2aNMGnn36qThgOGjSILwMRERERmQyjI0Q2JioqCgMGDFDB1zFjxuCrr75CRkbGFR9/4MABnDp1SmXESiasLDLVs7CwEKdPn77k90oQtlS3bt2Qm5uryhoQERFdrmvXrmUn+Er3GydPnoROp6twZXXs2LHSK1ECseWFhoYiOTmZLwIRERERmRQzYolsjEajUdMzt27dir/++guffPIJ/vOf/6jpmxWRYGqHDh3w/fffV7mZChERUXWRUgOV5ejoeMltCfjK7A4iIiIiIlNiIJbIBskBaY8ePdTywgsvqBIFS5cuVeUFLs9Eat++PRYvXqymfkoTrqtlzhYUFKjyBmL79u0qe1amnhIREV3u8hOAst+QMgJywrAyZJ8lrpRBS0RERERkbliagMgGD3xff/117N69G/Hx8aqpVkpKClq0aKG6VB88eFA1PklNTVWNusaPH6+6WY8YMUI165KafFIb9rHHHsPZs2fLfq807rr33ntx9OhRrFixQtXmk27YrA9LREQVkX3Q9OnT1T5HmjzKDI3HH3+80itLTiLKicXff/9d7cdkBgcRERERkTljRiyRjZGs1o0bN+LDDz9Edna2OpB97733cNNNN6n6exJklUs5oF23bh369u2rHv/ss8+qBl85OTmoU6eOqjNbPkNWbksmU+/evVXDrzvvvFN1uCYiIqrIPffco2ZSdO7cWWXBShB26tSplV5Zsi96+eWXMXPmTNXES37fvHnzuLKJiIiIyGzZGQwGg6kHQUSWbdKkScjMzMSyZctMPRQiIiIiIiIiIrPE0gRERERERERERERENYyBWCIiIiIiIiIiIqIaxtIERERERERERERERDWMGbFERERERERERERENYyBWCIiIiIiIiIiIqIaxkAsERERERERERERUQ1jIJaIiIiIiIiIiIiohjEQS0RERERERERERFTDGIglIiIiIiIiIiIiqmEMxBIRERERERERERHVMAZiiYiIiIiIiIiIiGoYA7FEREREREREREREqFn/D8YAX3P0klgjAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "history = np.array(history)\n", + "\n", + "fig, axes = plt.subplots(1, 3, figsize=(14, 4))\n", + "\n", + "# --- Panel 1: loss curve ---\n", + "ax = axes[0]\n", + "ax.plot(losses, color=\"steelblue\")\n", + "ax.set_xlabel(\"step\")\n", + "ax.set_ylabel(\"L\")\n", + "ax.set_title(\"Loss L = (b − b*)² + (d − d*)²\")\n", + "ax.set_yscale(\"log\")\n", + "\n", + "# --- Panel 2: H1 pair trajectory in PD space ---\n", + "ax = axes[1]\n", + "diag_lo = min(history[:, 0].min(), b_star, d_star) - 0.1\n", + "diag_hi = max(history[:, 1].max(), b_star, d_star) + 0.1\n", + "ax.plot([diag_lo, diag_hi], [diag_lo, diag_hi], \"gray\", lw=0.8, ls=\"--\")\n", + "\n", + "sc = ax.scatter(\n", + " history[:, 0], history[:, 1],\n", + " c=np.arange(len(history)), cmap=\"viridis\",\n", + " s=20, zorder=3,\n", + ")\n", + "ax.plot(history[0, 0], history[0, 1], \"go\", ms=8, label=\"start\", zorder=4)\n", + "ax.plot(history[-1, 0], history[-1, 1], \"r*\", ms=12, label=\"end\", zorder=4)\n", + "ax.plot(b_star, d_star, \"kx\", ms=10, mew=2, label=\"target\", zorder=5)\n", + "plt.colorbar(sc, ax=ax, label=\"step\")\n", + "ax.set_xlabel(\"birth\")\n", + "ax.set_ylabel(\"death\")\n", + "ax.set_title(\"H1 pair trajectory in PD space\")\n", + "ax.legend(fontsize=8)\n", + "\n", + "# --- Panel 3: initial vs final ellipsoid centres ---\n", + "ax = axes[2]\n", + "r_ell = np.sqrt(cov_shape[0, 0]) # radius of isotropic ellipsoid\n", + "theta_ell = np.linspace(0, 2 * np.pi, 60)\n", + "cos_t, sin_t = np.cos(theta_ell), np.sin(theta_ell)\n", + "for i in range(N_OPT):\n", + " ci = centers_init[i]\n", + " cf = centers_cur[i]\n", + " ax.plot(ci[0] + r_ell * cos_t, ci[1] + r_ell * sin_t, \"g--\", alpha=0.4)\n", + " ax.plot(cf[0] + r_ell * cos_t, cf[1] + r_ell * sin_t, \"b-\", alpha=0.7)\n", + " ax.annotate(\"\", xy=cf, xytext=ci,\n", + " arrowprops=dict(arrowstyle=\"->\", color=\"orange\", lw=1.2))\n", + "ax.set_aspect(\"equal\")\n", + "ax.set_title(\"Centres: initial (green dashed) → final (blue)\\norange arrows show displacement\")\n", + "\n", + "plt.tight_layout()\n", + "plt.show()" + ] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Poetry ellphi 2025", + "language": "python", + "name": "poetry-ellphi2025" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.12.4" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/poetry.lock b/poetry.lock index 6fb3e56..2fb69e3 100644 --- a/poetry.lock +++ b/poetry.lock @@ -2,26 +2,23 @@ [[package]] name = "anyio" -version = "4.9.0" -description = "High level compatibility layer for multiple asynchronous event loop implementations" +version = "4.12.0" +description = "High-level concurrency and networking framework on top of asyncio or Trio" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "anyio-4.9.0-py3-none-any.whl", hash = "sha256:9f76d541cad6e36af7beb62e978876f3b41e3e04f2c1fbf0884604c0a9c4d93c"}, - {file = "anyio-4.9.0.tar.gz", hash = "sha256:673c0c244e15788651a4ff38710fea9675823028a6f08a5eda409e0c9840a028"}, + {file = "anyio-4.12.0-py3-none-any.whl", hash = "sha256:dad2376a628f98eeca4881fc56cd06affd18f659b17a747d3ff0307ced94b1bb"}, + {file = "anyio-4.12.0.tar.gz", hash = "sha256:73c693b567b0c55130c104d0b43a9baf3aa6a31fc6110116509f27bf75e21ec0"}, ] [package.dependencies] exceptiongroup = {version = ">=1.0.2", markers = "python_version < \"3.11\""} idna = ">=2.8" -sniffio = ">=1.1" typing_extensions = {version = ">=4.5", markers = "python_version < \"3.13\""} [package.extras] -doc = ["Sphinx (>=8.2,<9.0)", "packaging", "sphinx-autodoc-typehints (>=1.2.0)", "sphinx_rtd_theme"] -test = ["anyio[trio]", "blockbuster (>=1.5.23)", "coverage[toml] (>=7)", "exceptiongroup (>=1.2.0)", "hypothesis (>=4.0)", "psutil (>=5.9)", "pytest (>=7.0)", "trustme", "truststore (>=0.9.1) ; python_version >= \"3.10\"", "uvloop (>=0.21) ; platform_python_implementation == \"CPython\" and platform_system != \"Windows\" and python_version < \"3.14\""] -trio = ["trio (>=0.26.1)"] +trio = ["trio (>=0.31.0) ; python_version < \"3.10\"", "trio (>=0.32.0) ; python_version >= \"3.10\""] [[package]] name = "appnope" @@ -53,77 +50,81 @@ argon2-cffi-bindings = "*" [[package]] name = "argon2-cffi-bindings" -version = "21.2.0" +version = "25.1.0" description = "Low-level CFFI bindings for Argon2" optional = false -python-versions = ">=3.6" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "argon2-cffi-bindings-21.2.0.tar.gz", hash = "sha256:bb89ceffa6c791807d1305ceb77dbfacc5aa499891d2c55661c6459651fc39e3"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ccb949252cb2ab3a08c02024acb77cfb179492d5701c7cbdbfd776124d4d2367"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9524464572e12979364b7d600abf96181d3541da11e23ddf565a32e70bd4dc0d"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b746dba803a79238e925d9046a63aa26bf86ab2a2fe74ce6b009a1c3f5c8f2ae"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58ed19212051f49a523abb1dbe954337dc82d947fb6e5a0da60f7c8471a8476c"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:bd46088725ef7f58b5a1ef7ca06647ebaf0eb4baff7d1d0d177c6cc8744abd86"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_i686.whl", hash = "sha256:8cd69c07dd875537a824deec19f978e0f2078fdda07fd5c42ac29668dda5f40f"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f1152ac548bd5b8bcecfb0b0371f082037e47128653df2e8ba6e914d384f3c3e"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win32.whl", hash = "sha256:603ca0aba86b1349b147cab91ae970c63118a0f30444d4bc80355937c950c082"}, - {file = "argon2_cffi_bindings-21.2.0-cp36-abi3-win_amd64.whl", hash = "sha256:b2ef1c30440dbbcba7a5dc3e319408b59676e2e039e2ae11a8775ecf482b192f"}, - {file = "argon2_cffi_bindings-21.2.0-cp38-abi3-macosx_10_9_universal2.whl", hash = "sha256:e415e3f62c8d124ee16018e491a009937f8cf7ebf5eb430ffc5de21b900dad93"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3e385d1c39c520c08b53d63300c3ecc28622f076f4c2b0e6d7e796e9f6502194"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c3e3cc67fdb7d82c4718f19b4e7a87123caf8a93fde7e23cf66ac0337d3cb3f"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6a22ad9800121b71099d0fb0a65323810a15f2e292f2ba450810a7316e128ee5"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f9f8b450ed0547e3d473fdc8612083fd08dd2120d6ac8f73828df9b7d45bb351"}, - {file = "argon2_cffi_bindings-21.2.0-pp37-pypy37_pp73-win_amd64.whl", hash = "sha256:93f9bf70084f97245ba10ee36575f0c3f1e7d7724d67d8e5b08e61787c320ed7"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-macosx_10_9_x86_64.whl", hash = "sha256:3b9ef65804859d335dc6b31582cad2c5166f0c3e7975f324d9ffaa34ee7e6583"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d4966ef5848d820776f5f562a7d45fdd70c2f330c961d0d745b784034bd9f48d"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20ef543a89dee4db46a1a6e206cd015360e5a75822f76df533845c3cbaf72670"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ed2937d286e2ad0cc79a7087d3c272832865f779430e0cc2b4f3718d3159b0cb"}, - {file = "argon2_cffi_bindings-21.2.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:5e00316dabdaea0b2dd82d141cc66889ced0cdcbfa599e8b471cf22c620c329a"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:3d3f05610594151994ca9ccb3c771115bdb4daef161976a266f0dd8aa9996b8f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:8b8efee945193e667a396cbc7b4fb7d357297d6234d30a489905d96caabde56b"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3c6702abc36bf3ccba3f802b799505def420a1b7039862014a65db3205967f5a"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a1c70058c6ab1e352304ac7e3b52554daadacd8d453c1752e547c76e9c99ac44"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e2fd3bfbff3c5d74fef31a722f729bf93500910db650c925c2d6ef879a7e51cb"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c4f9665de60b1b0e99bcd6be4f17d90339698ce954cfd8d9cf4f91c995165a92"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ba92837e4a9aa6a508c8d2d7883ed5a8f6c308c89a4790e1e447a220deb79a85"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win32.whl", hash = "sha256:84a461d4d84ae1295871329b346a97f68eade8c53b6ed9a7ca2d7467f3c8ff6f"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b55aec3565b65f56455eebc9b9f34130440404f27fe21c3b375bf1ea4d8fbae6"}, + {file = "argon2_cffi_bindings-25.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:87c33a52407e4c41f3b70a9c2d3f6056d88b10dad7695be708c5021673f55623"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:aecba1723ae35330a008418a91ea6cfcedf6d31e5fbaa056a166462ff066d500"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2630b6240b495dfab90aebe159ff784d08ea999aa4b0d17efa734055a07d2f44"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:7aef0c91e2c0fbca6fc68e7555aa60ef7008a739cbe045541e438373bc54d2b0"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1e021e87faa76ae0d413b619fe2b65ab9a037f24c60a1e6cc43457ae20de6dc6"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e924cfc503018a714f94a49a149fdc0b644eaead5d1f089330399134fa028a"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c87b72589133f0346a1cb8d5ecca4b933e3c9b64656c9d175270a000e73b288d"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:1db89609c06afa1a214a69a462ea741cf735b29a57530478c06eb81dd403de99"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win32.whl", hash = "sha256:473bcb5f82924b1becbb637b63303ec8d10e84c8d241119419897a26116515d2"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_amd64.whl", hash = "sha256:a98cd7d17e9f7ce244c0803cad3c23a7d379c301ba618a5fa76a67d116618b98"}, + {file = "argon2_cffi_bindings-25.1.0-cp39-abi3-win_arm64.whl", hash = "sha256:b0fdbcf513833809c882823f98dc2f931cf659d9a1429616ac3adebb49f5db94"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6dca33a9859abf613e22733131fc9194091c1fa7cb3e131c143056b4856aa47e"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:21378b40e1b8d1655dd5310c84a40fc19a9aa5e6366e835ceb8576bf0fea716d"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d588dec224e2a83edbdc785a5e6f3c6cd736f46bfd4b441bbb5aa1f5085e584"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5acb4e41090d53f17ca1110c3427f0a130f944b896fc8c83973219c97f57b690"}, + {file = "argon2_cffi_bindings-25.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:da0c79c23a63723aa5d782250fbf51b768abca630285262fb5144ba5ae01e520"}, + {file = "argon2_cffi_bindings-25.1.0.tar.gz", hash = "sha256:b957f3e6ea4d55d820e40ff76f450952807013d361a65d7f28acc0acbf29229d"}, ] [package.dependencies] -cffi = ">=1.0.1" - -[package.extras] -dev = ["cogapp", "pre-commit", "pytest", "wheel"] -tests = ["pytest"] +cffi = [ + {version = ">=1.0.1", markers = "python_version < \"3.14\""}, + {version = ">=2.0.0b1", markers = "python_version >= \"3.14\""}, +] [[package]] name = "arrow" -version = "1.3.0" +version = "1.4.0" description = "Better dates & times for Python" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "arrow-1.3.0-py3-none-any.whl", hash = "sha256:c728b120ebc00eb84e01882a6f5e7927a53960aa990ce7dd2b10f39005a67f80"}, - {file = "arrow-1.3.0.tar.gz", hash = "sha256:d4540617648cb5f895730f1ad8c82a65f2dad0166f57b75f3ca54759c4d67a85"}, + {file = "arrow-1.4.0-py3-none-any.whl", hash = "sha256:749f0769958ebdc79c173ff0b0670d59051a535fa26e8eba02953dc19eb43205"}, + {file = "arrow-1.4.0.tar.gz", hash = "sha256:ed0cc050e98001b8779e84d461b0098c4ac597e88704a655582b21d116e526d7"}, ] [package.dependencies] python-dateutil = ">=2.7.0" -types-python-dateutil = ">=2.8.10" +tzdata = {version = "*", markers = "python_version >= \"3.9\""} [package.extras] doc = ["doc8", "sphinx (>=7.0.0)", "sphinx-autobuild", "sphinx-autodoc-typehints", "sphinx_rtd_theme (>=1.3.0)"] -test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2021.1)", "simplejson (==3.*)"] +test = ["dateparser (==1.*)", "pre-commit", "pytest", "pytest-cov", "pytest-mock", "pytz (==2025.2)", "simplejson (==3.*)"] [[package]] name = "asttokens" -version = "3.0.0" +version = "3.0.1" description = "Annotate AST trees with source code positions" optional = false python-versions = ">=3.8" groups = ["main", "demo", "dev"] files = [ - {file = "asttokens-3.0.0-py3-none-any.whl", hash = "sha256:e3078351a059199dd5138cb1c706e6430c05eff2ff136af5eb4790f9d28932e2"}, - {file = "asttokens-3.0.0.tar.gz", hash = "sha256:0dcd8baa8d62b0c1d118b399b2ddba3c4aff271d0d7a9e0d4c1681c79035bbc7"}, + {file = "asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a"}, + {file = "asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7"}, ] [package.extras] -astroid = ["astroid (>=2,<4)"] -test = ["astroid (>=2,<4)", "pytest", "pytest-cov", "pytest-xdist"] +astroid = ["astroid (>=2,<5)"] +test = ["astroid (>=2,<5)", "pytest (<9.0)", "pytest-cov", "pytest-xdist"] [[package]] name = "async-lru" @@ -142,31 +143,23 @@ typing_extensions = {version = ">=4.0.0", markers = "python_version < \"3.11\""} [[package]] name = "attrs" -version = "25.3.0" +version = "25.4.0" description = "Classes Without Boilerplate" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "attrs-25.3.0-py3-none-any.whl", hash = "sha256:427318ce031701fea540783410126f03899a97ffc6f61596ad581ac2e40e3bc3"}, - {file = "attrs-25.3.0.tar.gz", hash = "sha256:75d7cefc7fb576747b2c81b4442d4d4a1ce0900973527c011d1030fd3bf4af1b"}, + {file = "attrs-25.4.0-py3-none-any.whl", hash = "sha256:adcf7e2a1fb3b36ac48d97835bb6d8ade15b8dcce26aba8bf1d14847b57a3373"}, + {file = "attrs-25.4.0.tar.gz", hash = "sha256:16d5969b87f0859ef33a48b35d55ac1be6e42ae49d5e853b597db70c35c57e11"}, ] -[package.extras] -benchmark = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-codspeed", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -cov = ["cloudpickle ; platform_python_implementation == \"CPython\"", "coverage[toml] (>=5.3)", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -dev = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pre-commit-uv", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -docs = ["cogapp", "furo", "myst-parser", "sphinx", "sphinx-notfound-page", "sphinxcontrib-towncrier", "towncrier"] -tests = ["cloudpickle ; platform_python_implementation == \"CPython\"", "hypothesis", "mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pympler", "pytest (>=4.3.0)", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-xdist[psutil]"] -tests-mypy = ["mypy (>=1.11.1) ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\"", "pytest-mypy-plugins ; platform_python_implementation == \"CPython\" and python_version >= \"3.10\""] - [[package]] name = "babel" version = "2.17.0" description = "Internationalization utilities" optional = false python-versions = ">=3.8" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] files = [ {file = "babel-2.17.0-py3-none-any.whl", hash = "sha256:4d0b53093fdfb4b21c92b5213dba5a1b23885afa8383709427046b21c366e5f2"}, {file = "babel-2.17.0.tar.gz", hash = "sha256:0c54cffb19f690cdcc52a3b50bcbf71e07a808d1c80d549f2459b9d2cf0afb9d"}, @@ -175,20 +168,40 @@ files = [ [package.extras] dev = ["backports.zoneinfo ; python_version < \"3.9\"", "freezegun (>=1.0,<2.0)", "jinja2 (>=3.0)", "pytest (>=6.0)", "pytest-cov", "pytz", "setuptools", "tzdata ; sys_platform == \"win32\""] +[[package]] +name = "backrefs" +version = "6.1" +description = "A wrapper around re and regex that adds additional back references." +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "backrefs-6.1-py310-none-any.whl", hash = "sha256:2a2ccb96302337ce61ee4717ceacfbf26ba4efb1d55af86564b8bbaeda39cac1"}, + {file = "backrefs-6.1-py311-none-any.whl", hash = "sha256:e82bba3875ee4430f4de4b6db19429a27275d95a5f3773c57e9e18abc23fd2b7"}, + {file = "backrefs-6.1-py312-none-any.whl", hash = "sha256:c64698c8d2269343d88947c0735cb4b78745bd3ba590e10313fbf3f78c34da5a"}, + {file = "backrefs-6.1-py313-none-any.whl", hash = "sha256:4c9d3dc1e2e558965202c012304f33d4e0e477e1c103663fd2c3cc9bb18b0d05"}, + {file = "backrefs-6.1-py314-none-any.whl", hash = "sha256:13eafbc9ccd5222e9c1f0bec563e6d2a6d21514962f11e7fc79872fd56cbc853"}, + {file = "backrefs-6.1-py39-none-any.whl", hash = "sha256:a9e99b8a4867852cad177a6430e31b0f6e495d65f8c6c134b68c14c3c95bf4b0"}, + {file = "backrefs-6.1.tar.gz", hash = "sha256:3bba1749aafe1db9b915f00e0dd166cba613b6f788ffd63060ac3485dc9be231"}, +] + +[package.extras] +extras = ["regex"] + [[package]] name = "beautifulsoup4" -version = "4.13.4" +version = "4.14.3" description = "Screen-scraping library" optional = false python-versions = ">=3.7.0" groups = ["main", "demo"] files = [ - {file = "beautifulsoup4-4.13.4-py3-none-any.whl", hash = "sha256:9bbbb14bfde9d79f38b8cd5f8c7c85f4b8f2523190ebed90e950a8dea4cb1c4b"}, - {file = "beautifulsoup4-4.13.4.tar.gz", hash = "sha256:dbb3c4e1ceae6aefebdaf2423247260cd062430a410e38c66f2baa50a8437195"}, + {file = "beautifulsoup4-4.14.3-py3-none-any.whl", hash = "sha256:0918bfe44902e6ad8d57732ba310582e98da931428d231a5ecb9e7c703a735bb"}, + {file = "beautifulsoup4-4.14.3.tar.gz", hash = "sha256:6292b1c5186d356bba669ef9f7f051757099565ad9ada5dd630bd9de5fa7fb86"}, ] [package.dependencies] -soupsieve = ">1.2" +soupsieve = ">=1.6.1" typing-extensions = ">=4.0.0" [package.extras] @@ -200,34 +213,39 @@ lxml = ["lxml"] [[package]] name = "black" -version = "25.1.0" +version = "25.12.0" description = "The uncompromising code formatter." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "black-25.1.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:759e7ec1e050a15f89b770cefbf91ebee8917aac5c20483bc2d80a6c3a04df32"}, - {file = "black-25.1.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e519ecf93120f34243e6b0054db49c00a35f84f195d5bce7e9f5cfc578fc2da"}, - {file = "black-25.1.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:055e59b198df7ac0b7efca5ad7ff2516bca343276c466be72eb04a3bcc1f82d7"}, - {file = "black-25.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:db8ea9917d6f8fc62abd90d944920d95e73c83a5ee3383493e35d271aca872e9"}, - {file = "black-25.1.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a39337598244de4bae26475f77dda852ea00a93bd4c728e09eacd827ec929df0"}, - {file = "black-25.1.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:96c1c7cd856bba8e20094e36e0f948718dc688dba4a9d78c3adde52b9e6c2299"}, - {file = "black-25.1.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bce2e264d59c91e52d8000d507eb20a9aca4a778731a08cfff7e5ac4a4bb7096"}, - {file = "black-25.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:172b1dbff09f86ce6f4eb8edf9dede08b1fce58ba194c87d7a4f1a5aa2f5b3c2"}, - {file = "black-25.1.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4b60580e829091e6f9238c848ea6750efed72140b91b048770b64e74fe04908b"}, - {file = "black-25.1.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1e2978f6df243b155ef5fa7e558a43037c3079093ed5d10fd84c43900f2d8ecc"}, - {file = "black-25.1.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3b48735872ec535027d979e8dcb20bf4f70b5ac75a8ea99f127c106a7d7aba9f"}, - {file = "black-25.1.0-cp312-cp312-win_amd64.whl", hash = "sha256:ea0213189960bda9cf99be5b8c8ce66bb054af5e9e861249cd23471bd7b0b3ba"}, - {file = "black-25.1.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8f0b18a02996a836cc9c9c78e5babec10930862827b1b724ddfe98ccf2f2fe4f"}, - {file = "black-25.1.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:afebb7098bfbc70037a053b91ae8437c3857482d3a690fefc03e9ff7aa9a5fd3"}, - {file = "black-25.1.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:030b9759066a4ee5e5aca28c3c77f9c64789cdd4de8ac1df642c40b708be6171"}, - {file = "black-25.1.0-cp313-cp313-win_amd64.whl", hash = "sha256:a22f402b410566e2d1c950708c77ebf5ebd5d0d88a6a2e87c86d9fb48afa0d18"}, - {file = "black-25.1.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:a1ee0a0c330f7b5130ce0caed9936a904793576ef4d2b98c40835d6a65afa6a0"}, - {file = "black-25.1.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f3df5f1bf91d36002b0a75389ca8663510cf0531cca8aa5c1ef695b46d98655f"}, - {file = "black-25.1.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6827d563a2c820772b32ce8a42828dc6790f095f441beef18f96aa6f8294e"}, - {file = "black-25.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:bacabb307dca5ebaf9c118d2d2f6903da0d62c9faa82bd21a33eecc319559355"}, - {file = "black-25.1.0-py3-none-any.whl", hash = "sha256:95e8176dae143ba9097f351d174fdaf0ccd29efb414b362ae3fd72bf0f710717"}, - {file = "black-25.1.0.tar.gz", hash = "sha256:33496d5cd1222ad73391352b4ae8da15253c5de89b93a80b3e2c8d9a19ec2666"}, + {file = "black-25.12.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f85ba1ad15d446756b4ab5f3044731bf68b777f8f9ac9cdabd2425b97cd9c4e8"}, + {file = "black-25.12.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:546eecfe9a3a6b46f9d69d8a642585a6eaf348bcbbc4d87a19635570e02d9f4a"}, + {file = "black-25.12.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17dcc893da8d73d8f74a596f64b7c98ef5239c2cd2b053c0f25912c4494bf9ea"}, + {file = "black-25.12.0-cp310-cp310-win_amd64.whl", hash = "sha256:09524b0e6af8ba7a3ffabdfc7a9922fb9adef60fed008c7cd2fc01f3048e6e6f"}, + {file = "black-25.12.0-cp310-cp310-win_arm64.whl", hash = "sha256:b162653ed89eb942758efeb29d5e333ca5bb90e5130216f8369857db5955a7da"}, + {file = "black-25.12.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d0cfa263e85caea2cff57d8f917f9f51adae8e20b610e2b23de35b5b11ce691a"}, + {file = "black-25.12.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1a2f578ae20c19c50a382286ba78bfbeafdf788579b053d8e4980afb079ab9be"}, + {file = "black-25.12.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3e1b65634b0e471d07ff86ec338819e2ef860689859ef4501ab7ac290431f9b"}, + {file = "black-25.12.0-cp311-cp311-win_amd64.whl", hash = "sha256:a3fa71e3b8dd9f7c6ac4d818345237dfb4175ed3bf37cd5a581dbc4c034f1ec5"}, + {file = "black-25.12.0-cp311-cp311-win_arm64.whl", hash = "sha256:51e267458f7e650afed8445dc7edb3187143003d52a1b710c7321aef22aa9655"}, + {file = "black-25.12.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:31f96b7c98c1ddaeb07dc0f56c652e25bdedaac76d5b68a059d998b57c55594a"}, + {file = "black-25.12.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:05dd459a19e218078a1f98178c13f861fe6a9a5f88fc969ca4d9b49eb1809783"}, + {file = "black-25.12.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c1f68c5eff61f226934be6b5b80296cf6939e5d2f0c2f7d543ea08b204bfaf59"}, + {file = "black-25.12.0-cp312-cp312-win_amd64.whl", hash = "sha256:274f940c147ddab4442d316b27f9e332ca586d39c85ecf59ebdea82cc9ee8892"}, + {file = "black-25.12.0-cp312-cp312-win_arm64.whl", hash = "sha256:169506ba91ef21e2e0591563deda7f00030cb466e747c4b09cb0a9dae5db2f43"}, + {file = "black-25.12.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a05ddeb656534c3e27a05a29196c962877c83fa5503db89e68857d1161ad08a5"}, + {file = "black-25.12.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:9ec77439ef3e34896995503865a85732c94396edcc739f302c5673a2315e1e7f"}, + {file = "black-25.12.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0e509c858adf63aa61d908061b52e580c40eae0dfa72415fa47ac01b12e29baf"}, + {file = "black-25.12.0-cp313-cp313-win_amd64.whl", hash = "sha256:252678f07f5bac4ff0d0e9b261fbb029fa530cfa206d0a636a34ab445ef8ca9d"}, + {file = "black-25.12.0-cp313-cp313-win_arm64.whl", hash = "sha256:bc5b1c09fe3c931ddd20ee548511c64ebf964ada7e6f0763d443947fd1c603ce"}, + {file = "black-25.12.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:0a0953b134f9335c2434864a643c842c44fba562155c738a2a37a4d61f00cad5"}, + {file = "black-25.12.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2355bbb6c3b76062870942d8cc450d4f8ac71f9c93c40122762c8784df49543f"}, + {file = "black-25.12.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9678bd991cc793e81d19aeeae57966ee02909877cb65838ccffef24c3ebac08f"}, + {file = "black-25.12.0-cp314-cp314-win_amd64.whl", hash = "sha256:97596189949a8aad13ad12fcbb4ae89330039b96ad6742e6f6b45e75ad5cfd83"}, + {file = "black-25.12.0-cp314-cp314-win_arm64.whl", hash = "sha256:778285d9ea197f34704e3791ea9404cd6d07595745907dd2ce3da7a13627b29b"}, + {file = "black-25.12.0-py3-none-any.whl", hash = "sha256:48ceb36c16dbc84062740049eef990bb2ce07598272e673c17d1a7720c71c828"}, + {file = "black-25.12.0.tar.gz", hash = "sha256:8d3dd9cea14bff7ddc0eb243c811cdb1a011ebb4800a5f0335a01a68654796a7"}, ] [package.dependencies] @@ -237,6 +255,7 @@ mypy-extensions = ">=0.4.3" packaging = ">=22.0" pathspec = ">=0.9.0" platformdirs = ">=2" +pytokens = ">=0.3.0" tokenize-rt = {version = ">=3.2.0", optional = true, markers = "extra == \"jupyter\""} tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} typing-extensions = {version = ">=4.0.1", markers = "python_version < \"3.11\""} @@ -249,14 +268,14 @@ uvloop = ["uvloop (>=0.15.2)"] [[package]] name = "bleach" -version = "6.2.0" +version = "6.3.0" description = "An easy safelist-based HTML-sanitizing tool." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "bleach-6.2.0-py3-none-any.whl", hash = "sha256:117d9c6097a7c3d22fd578fcd8d35ff1e125df6736f554da4e432fdd63f31e5e"}, - {file = "bleach-6.2.0.tar.gz", hash = "sha256:123e894118b8a599fd80d3ec1a6d4cc7ce4e5882b1317a7e1ba69b56e95f991f"}, + {file = "bleach-6.3.0-py3-none-any.whl", hash = "sha256:fe10ec77c93ddf3d13a73b035abaac7a9f5e436513864ccdad516693213c65d6"}, + {file = "bleach-6.3.0.tar.gz", hash = "sha256:6f3b91b1c0a02bb9a78b5a454c92506aa0fdf197e1d5e114d2e00c6f64306d22"}, ] [package.dependencies] @@ -280,208 +299,246 @@ files = [ [[package]] name = "certifi" -version = "2025.7.14" +version = "2025.11.12" description = "Python package for providing Mozilla's CA Bundle." optional = false python-versions = ">=3.7" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] files = [ - {file = "certifi-2025.7.14-py3-none-any.whl", hash = "sha256:6b31f564a415d79ee77df69d757bb49a5bb53bd9f756cbbe24394ffd6fc1f4b2"}, - {file = "certifi-2025.7.14.tar.gz", hash = "sha256:8ea99dbdfaaf2ba2f9bac77b9249ef62ec5218e7c2b2e903378ed5fccf765995"}, + {file = "certifi-2025.11.12-py3-none-any.whl", hash = "sha256:97de8790030bbd5c2d96b7ec782fc2f7820ef8dba6db909ccf95449f2d062d4b"}, + {file = "certifi-2025.11.12.tar.gz", hash = "sha256:d8ab5478f2ecd78af242878415affce761ca6bc54a22a27e026d7c25357c3316"}, ] [[package]] name = "cffi" -version = "1.17.1" +version = "2.0.0" description = "Foreign Function Interface for Python calling C code." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "cffi-1.17.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:df8b1c11f177bc2313ec4b2d46baec87a5f3e71fc8b45dab2ee7cae86d9aba14"}, - {file = "cffi-1.17.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8f2cdc858323644ab277e9bb925ad72ae0e67f69e804f4898c070998d50b1a67"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:edae79245293e15384b51f88b00613ba9f7198016a5948b5dddf4917d4d26382"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45398b671ac6d70e67da8e4224a065cec6a93541bb7aebe1b198a61b58c7b702"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:ad9413ccdeda48c5afdae7e4fa2192157e991ff761e7ab8fdd8926f40b160cc3"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5da5719280082ac6bd9aa7becb3938dc9f9cbd57fac7d2871717b1feb0902ab6"}, - {file = "cffi-1.17.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2bb1a08b8008b281856e5971307cc386a8e9c5b625ac297e853d36da6efe9c17"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:045d61c734659cc045141be4bae381a41d89b741f795af1dd018bfb532fd0df8"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_i686.whl", hash = "sha256:6883e737d7d9e4899a8a695e00ec36bd4e5e4f18fabe0aca0efe0a4b44cdb13e"}, - {file = "cffi-1.17.1-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:6b8b4a92e1c65048ff98cfe1f735ef8f1ceb72e3d5f0c25fdb12087a23da22be"}, - {file = "cffi-1.17.1-cp310-cp310-win32.whl", hash = "sha256:c9c3d058ebabb74db66e431095118094d06abf53284d9c81f27300d0e0d8bc7c"}, - {file = "cffi-1.17.1-cp310-cp310-win_amd64.whl", hash = "sha256:0f048dcf80db46f0098ccac01132761580d28e28bc0f78ae0d58048063317e15"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a45e3c6913c5b87b3ff120dcdc03f6131fa0065027d0ed7ee6190736a74cd401"}, - {file = "cffi-1.17.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:30c5e0cb5ae493c04c8b42916e52ca38079f1b235c2f8ae5f4527b963c401caf"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f75c7ab1f9e4aca5414ed4d8e5c0e303a34f4421f8a0d47a4d019ceff0ab6af4"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a1ed2dd2972641495a3ec98445e09766f077aee98a1c896dcb4ad0d303628e41"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:46bf43160c1a35f7ec506d254e5c890f3c03648a4dbac12d624e4490a7046cd1"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:a24ed04c8ffd54b0729c07cee15a81d964e6fee0e3d4d342a27b020d22959dc6"}, - {file = "cffi-1.17.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:610faea79c43e44c71e1ec53a554553fa22321b65fae24889706c0a84d4ad86d"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:a9b15d491f3ad5d692e11f6b71f7857e7835eb677955c00cc0aefcd0669adaf6"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_i686.whl", hash = "sha256:de2ea4b5833625383e464549fec1bc395c1bdeeb5f25c4a3a82b5a8c756ec22f"}, - {file = "cffi-1.17.1-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:fc48c783f9c87e60831201f2cce7f3b2e4846bf4d8728eabe54d60700b318a0b"}, - {file = "cffi-1.17.1-cp311-cp311-win32.whl", hash = "sha256:85a950a4ac9c359340d5963966e3e0a94a676bd6245a4b55bc43949eee26a655"}, - {file = "cffi-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:caaf0640ef5f5517f49bc275eca1406b0ffa6aa184892812030f04c2abf589a0"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:805b4371bf7197c329fcb3ead37e710d1bca9da5d583f5073b799d5c5bd1eee4"}, - {file = "cffi-1.17.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:733e99bc2df47476e3848417c5a4540522f234dfd4ef3ab7fafdf555b082ec0c"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1257bdabf294dceb59f5e70c64a3e2f462c30c7ad68092d01bbbfb1c16b1ba36"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:da95af8214998d77a98cc14e3a3bd00aa191526343078b530ceb0bd710fb48a5"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d63afe322132c194cf832bfec0dc69a99fb9bb6bbd550f161a49e9e855cc78ff"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f79fc4fc25f1c8698ff97788206bb3c2598949bfe0fef03d299eb1b5356ada99"}, - {file = "cffi-1.17.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62ce867176a75d03a665bad002af8e6d54644fad99a3c70905c543130e39d93"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:386c8bf53c502fff58903061338ce4f4950cbdcb23e2902d86c0f722b786bbe3"}, - {file = "cffi-1.17.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:4ceb10419a9adf4460ea14cfd6bc43d08701f0835e979bf821052f1805850fe8"}, - {file = "cffi-1.17.1-cp312-cp312-win32.whl", hash = "sha256:a08d7e755f8ed21095a310a693525137cfe756ce62d066e53f502a83dc550f65"}, - {file = "cffi-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:51392eae71afec0d0c8fb1a53b204dbb3bcabcb3c9b807eedf3e1e6ccf2de903"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f3a2b4222ce6b60e2e8b337bb9596923045681d71e5a082783484d845390938e"}, - {file = "cffi-1.17.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0984a4925a435b1da406122d4d7968dd861c1385afe3b45ba82b750f229811e2"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d01b12eeeb4427d3110de311e1774046ad344f5b1a7403101878976ecd7a10f3"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:706510fe141c86a69c8ddc029c7910003a17353970cff3b904ff0686a5927683"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:de55b766c7aa2e2a3092c51e0483d700341182f08e67c63630d5b6f200bb28e5"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c59d6e989d07460165cc5ad3c61f9fd8f1b4796eacbd81cee78957842b834af4"}, - {file = "cffi-1.17.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:dd398dbc6773384a17fe0d3e7eeb8d1a21c2200473ee6806bb5e6a8e62bb73dd"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:3edc8d958eb099c634dace3c7e16560ae474aa3803a5df240542b305d14e14ed"}, - {file = "cffi-1.17.1-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:72e72408cad3d5419375fc87d289076ee319835bdfa2caad331e377589aebba9"}, - {file = "cffi-1.17.1-cp313-cp313-win32.whl", hash = "sha256:e03eab0a8677fa80d646b5ddece1cbeaf556c313dcfac435ba11f107ba117b5d"}, - {file = "cffi-1.17.1-cp313-cp313-win_amd64.whl", hash = "sha256:f6a16c31041f09ead72d69f583767292f750d24913dadacf5756b966aacb3f1a"}, - {file = "cffi-1.17.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:636062ea65bd0195bc012fea9321aca499c0504409f413dc88af450b57ffd03b"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c7eac2ef9b63c79431bc4b25f1cd649d7f061a28808cbc6c47b534bd789ef964"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e221cf152cff04059d011ee126477f0d9588303eb57e88923578ace7baad17f9"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:31000ec67d4221a71bd3f67df918b1f88f676f1c3b535a7eb473255fdc0b83fc"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6f17be4345073b0a7b8ea599688f692ac3ef23ce28e5df79c04de519dbc4912c"}, - {file = "cffi-1.17.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0e2b1fac190ae3ebfe37b979cc1ce69c81f4e4fe5746bb401dca63a9062cdaf1"}, - {file = "cffi-1.17.1-cp38-cp38-win32.whl", hash = "sha256:7596d6620d3fa590f677e9ee430df2958d2d6d6de2feeae5b20e82c00b76fbf8"}, - {file = "cffi-1.17.1-cp38-cp38-win_amd64.whl", hash = "sha256:78122be759c3f8a014ce010908ae03364d00a1f81ab5c7f4a7a5120607ea56e1"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:b2ab587605f4ba0bf81dc0cb08a41bd1c0a5906bd59243d56bad7668a6fc6c16"}, - {file = "cffi-1.17.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:28b16024becceed8c6dfbc75629e27788d8a3f9030691a1dbf9821a128b22c36"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1d599671f396c4723d016dbddb72fe8e0397082b0a77a4fab8028923bec050e8"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca74b8dbe6e8e8263c0ffd60277de77dcee6c837a3d0881d8c1ead7268c9e576"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f7f5baafcc48261359e14bcd6d9bff6d4b28d9103847c9e136694cb0501aef87"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98e3969bcff97cae1b2def8ba499ea3d6f31ddfdb7635374834cf89a1a08ecf0"}, - {file = "cffi-1.17.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cdf5ce3acdfd1661132f2a9c19cac174758dc2352bfe37d98aa7512c6b7178b3"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:9755e4345d1ec879e3849e62222a18c7174d65a6a92d5b346b1863912168b595"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_i686.whl", hash = "sha256:f1e22e8c4419538cb197e4dd60acc919d7696e5ef98ee4da4e01d3f8cfa4cc5a"}, - {file = "cffi-1.17.1-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:c03e868a0b3bc35839ba98e74211ed2b05d2119be4e8a0f224fba9384f1fe02e"}, - {file = "cffi-1.17.1-cp39-cp39-win32.whl", hash = "sha256:e31ae45bc2e29f6b2abd0de1cc3b9d5205aa847cafaecb8af1476a609a2f6eb7"}, - {file = "cffi-1.17.1-cp39-cp39-win_amd64.whl", hash = "sha256:d016c76bdd850f3c626af19b0542c9677ba156e4ee4fccfdd7848803533ef662"}, - {file = "cffi-1.17.1.tar.gz", hash = "sha256:1c39c6016c32bc48dd54561950ebd6836e1670f2ae46128f67cf49e789c52824"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44"}, + {file = "cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4"}, + {file = "cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5"}, + {file = "cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb"}, + {file = "cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a"}, + {file = "cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe"}, + {file = "cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664"}, + {file = "cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414"}, + {file = "cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743"}, + {file = "cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5"}, + {file = "cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5"}, + {file = "cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d"}, + {file = "cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037"}, + {file = "cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94"}, + {file = "cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187"}, + {file = "cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18"}, + {file = "cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5"}, + {file = "cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb"}, + {file = "cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3"}, + {file = "cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c"}, + {file = "cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b"}, + {file = "cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27"}, + {file = "cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75"}, + {file = "cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5"}, + {file = "cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef"}, + {file = "cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205"}, + {file = "cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1"}, + {file = "cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f"}, + {file = "cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25"}, + {file = "cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9"}, + {file = "cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc"}, + {file = "cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512"}, + {file = "cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4"}, + {file = "cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e"}, + {file = "cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6"}, + {file = "cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:fe562eb1a64e67dd297ccc4f5addea2501664954f2692b69a76449ec7913ecbf"}, + {file = "cffi-2.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:de8dad4425a6ca6e4e5e297b27b5c824ecc7581910bf9aee86cb6835e6812aa7"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:4647afc2f90d1ddd33441e5b0e85b16b12ddec4fca55f0d9671fef036ecca27c"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3f4d46d8b35698056ec29bca21546e1551a205058ae1a181d871e278b0b28165"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:e6e73b9e02893c764e7e8d5bb5ce277f1a009cd5243f8228f75f842bf937c534"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:cb527a79772e5ef98fb1d700678fe031e353e765d1ca2d409c92263c6d43e09f"}, + {file = "cffi-2.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:61d028e90346df14fedc3d1e5441df818d095f3b87d286825dfcbd6459b7ef63"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:0f6084a0ea23d05d20c3edcda20c3d006f9b6f3fefeac38f59262e10cef47ee2"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1cd13c99ce269b3ed80b417dcd591415d3372bcac067009b6e0f59c7d4015e65"}, + {file = "cffi-2.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:89472c9762729b5ae1ad974b777416bfda4ac5642423fa93bd57a09204712322"}, + {file = "cffi-2.0.0-cp39-cp39-win32.whl", hash = "sha256:2081580ebb843f759b9f617314a24ed5738c51d2aee65d31e02f6f7a2b97707a"}, + {file = "cffi-2.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:b882b3df248017dba09d6b16defe9b5c407fe32fc7c65a9c69798e6175601be9"}, + {file = "cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529"}, ] [package.dependencies] -pycparser = "*" +pycparser = {version = "*", markers = "implementation_name != \"PyPy\""} [[package]] name = "charset-normalizer" -version = "3.4.2" +version = "3.4.4" description = "The Real First Universal Charset Detector. Open, modern and actively maintained alternative to Chardet." optional = false python-versions = ">=3.7" -groups = ["main", "demo"] -files = [ - {file = "charset_normalizer-3.4.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c48ed483eb946e6c04ccbe02c6b4d1d48e51944b6db70f697e089c193404941"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2d318c11350e10662026ad0eb71bb51c7812fc8590825304ae0bdd4ac283acd"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9cbfacf36cb0ec2897ce0ebc5d08ca44213af24265bd56eca54bee7923c48fd6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:18dd2e350387c87dabe711b86f83c9c78af772c748904d372ade190b5c7c9d4d"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8075c35cd58273fee266c58c0c9b670947c19df5fb98e7b66710e04ad4e9ff86"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:5bf4545e3b962767e5c06fe1738f951f77d27967cb2caa64c28be7c4563e162c"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:7a6ab32f7210554a96cd9e33abe3ddd86732beeafc7a28e9955cdf22ffadbab0"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:b33de11b92e9f75a2b545d6e9b6f37e398d86c3e9e9653c4864eb7e89c5773ef"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8755483f3c00d6c9a77f490c17e6ab0c8729e39e6390328e42521ef175380ae6"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:68a328e5f55ec37c57f19ebb1fdc56a248db2e3e9ad769919a58672958e8f366"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21b2899062867b0e1fde9b724f8aecb1af14f2778d69aacd1a5a1853a597a5db"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win32.whl", hash = "sha256:e8082b26888e2f8b36a042a58307d5b917ef2b1cacab921ad3323ef91901c71a"}, - {file = "charset_normalizer-3.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:f69a27e45c43520f5487f27627059b64aaf160415589230992cec34c5e18a509"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:be1e352acbe3c78727a16a455126d9ff83ea2dfdcbc83148d2982305a04714c2"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:aa88ca0b1932e93f2d961bf3addbb2db902198dca337d88c89e1559e066e7645"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d524ba3f1581b35c03cb42beebab4a13e6cdad7b36246bd22541fa585a56cccd"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:28a1005facc94196e1fb3e82a3d442a9d9110b8434fc1ded7a24a2983c9888d8"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdb20a30fe1175ecabed17cbf7812f7b804b8a315a25f24678bcdf120a90077f"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:0f5d9ed7f254402c9e7d35d2f5972c9bbea9040e99cd2861bd77dc68263277c7"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:efd387a49825780ff861998cd959767800d54f8308936b21025326de4b5a42b9"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:f0aa37f3c979cf2546b73e8222bbfa3dc07a641585340179d768068e3455e544"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:e70e990b2137b29dc5564715de1e12701815dacc1d056308e2b17e9095372a82"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:0c8c57f84ccfc871a48a47321cfa49ae1df56cd1d965a09abe84066f6853b9c0"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:6b66f92b17849b85cad91259efc341dce9c1af48e2173bf38a85c6329f1033e5"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win32.whl", hash = "sha256:daac4765328a919a805fa5e2720f3e94767abd632ae410a9062dff5412bae65a"}, - {file = "charset_normalizer-3.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:e53efc7c7cee4c1e70661e2e112ca46a575f90ed9ae3fef200f2a25e954f4b28"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0c29de6a1a95f24b9a1aa7aefd27d2487263f00dfd55a77719b530788f75cff7"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cddf7bd982eaa998934a91f69d182aec997c6c468898efe6679af88283b498d3"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fcbe676a55d7445b22c10967bceaaf0ee69407fbe0ece4d032b6eb8d4565982a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d41c4d287cfc69060fa91cae9683eacffad989f1a10811995fa309df656ec214"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4e594135de17ab3866138f496755f302b72157d115086d100c3f19370839dd3a"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cf713fe9a71ef6fd5adf7a79670135081cd4431c2943864757f0fa3a65b1fafd"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a370b3e078e418187da8c3674eddb9d983ec09445c99a3a263c2011993522981"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:a955b438e62efdf7e0b7b52a64dc5c3396e2634baa62471768a64bc2adb73d5c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7222ffd5e4de8e57e03ce2cef95a4c43c98fcb72ad86909abdfc2c17d227fc1b"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:bee093bf902e1d8fc0ac143c88902c3dfc8941f7ea1d6a8dd2bcb786d33db03d"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dedb8adb91d11846ee08bec4c8236c8549ac721c245678282dcb06b221aab59f"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win32.whl", hash = "sha256:db4c7bf0e07fc3b7d89ac2a5880a6a8062056801b83ff56d8464b70f65482b6c"}, - {file = "charset_normalizer-3.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:5a9979887252a82fefd3d3ed2a8e3b937a7a809f65dcb1e068b090e165bbe99e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:926ca93accd5d36ccdabd803392ddc3e03e6d4cd1cf17deff3b989ab8e9dbcf0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eba9904b0f38a143592d9fc0e19e2df0fa2e41c3c3745554761c5f6447eedabf"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3fddb7e2c84ac87ac3a947cb4e66d143ca5863ef48e4a5ecb83bd48619e4634e"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:98f862da73774290f251b9df8d11161b6cf25b599a66baf087c1ffe340e9bfd1"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c9379d65defcab82d07b2a9dfbfc2e95bc8fe0ebb1b176a3190230a3ef0e07c"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e635b87f01ebc977342e2697d05b56632f5f879a4f15955dfe8cef2448b51691"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:1c95a1e2902a8b722868587c0e1184ad5c55631de5afc0eb96bc4b0d738092c0"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ef8de666d6179b009dce7bcb2ad4c4a779f113f12caf8dc77f0162c29d20490b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:32fc0341d72e0f73f80acb0a2c94216bd704f4f0bce10aedea38f30502b271ff"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:289200a18fa698949d2b39c671c2cc7a24d44096784e76614899a7ccf2574b7b"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4a476b06fbcf359ad25d34a057b7219281286ae2477cc5ff5e3f70a246971148"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win32.whl", hash = "sha256:aaeeb6a479c7667fbe1099af9617c83aaca22182d6cf8c53966491a0f1b7ffb7"}, - {file = "charset_normalizer-3.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:aa6af9e7d59f9c12b33ae4e9450619cf2488e2bbe9b44030905877f0b2324980"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1cad5f45b3146325bb38d6855642f6fd609c3f7cad4dbaf75549bf3b904d3184"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b2680962a4848b3c4f155dc2ee64505a9c57186d0d56b43123b17ca3de18f0fa"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:36b31da18b8890a76ec181c3cf44326bf2c48e36d393ca1b72b3f484113ea344"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f4074c5a429281bf056ddd4c5d3b740ebca4d43ffffe2ef4bf4d2d05114299da"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c9e36a97bee9b86ef9a1cf7bb96747eb7a15c2f22bdb5b516434b00f2a599f02"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_aarch64.whl", hash = "sha256:1b1bde144d98e446b056ef98e59c256e9294f6b74d7af6846bf5ffdafd687a7d"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_i686.whl", hash = "sha256:915f3849a011c1f593ab99092f3cecfcb4d65d8feb4a64cf1bf2d22074dc0ec4"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_ppc64le.whl", hash = "sha256:fb707f3e15060adf5b7ada797624a6c6e0138e2a26baa089df64c68ee98e040f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_s390x.whl", hash = "sha256:25a23ea5c7edc53e0f29bae2c44fcb5a1aa10591aae107f2a2b2583a9c5cbc64"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-musllinux_1_2_x86_64.whl", hash = "sha256:770cab594ecf99ae64c236bc9ee3439c3f46be49796e265ce0cc8bc17b10294f"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win32.whl", hash = "sha256:6a0289e4589e8bdfef02a80478f1dfcb14f0ab696b5a00e1f4b8a14a307a3c58"}, - {file = "charset_normalizer-3.4.2-cp37-cp37m-win_amd64.whl", hash = "sha256:6fc1f5b51fa4cecaa18f2bd7a003f3dd039dd615cd69a2afd6d3b19aed6775f2"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:76af085e67e56c8816c3ccf256ebd136def2ed9654525348cfa744b6802b69eb"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e45ba65510e2647721e35323d6ef54c7974959f6081b58d4ef5d87c60c84919a"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:046595208aae0120559a67693ecc65dd75d46f7bf687f159127046628178dc45"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:75d10d37a47afee94919c4fab4c22b9bc2a8bf7d4f46f87363bcf0573f3ff4f5"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6333b3aa5a12c26b2a4d4e7335a28f1475e0e5e17d69d55141ee3cab736f66d1"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e8323a9b031aa0393768b87f04b4164a40037fb2a3c11ac06a03ffecd3618027"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:24498ba8ed6c2e0b56d4acbf83f2d989720a93b41d712ebd4f4979660db4417b"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:844da2b5728b5ce0e32d863af26f32b5ce61bc4273a9c720a9f3aa9df73b1455"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:65c981bdbd3f57670af8b59777cbfae75364b483fa8a9f420f08094531d54a01"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:3c21d4fca343c805a52c0c78edc01e3477f6dd1ad7c47653241cf2a206d4fc58"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:dc7039885fa1baf9be153a0626e337aa7ec8bf96b0128605fb0d77788ddc1681"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win32.whl", hash = "sha256:8272b73e1c5603666618805fe821edba66892e2870058c94c53147602eab29c7"}, - {file = "charset_normalizer-3.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:70f7172939fdf8790425ba31915bfbe8335030f05b9913d7ae00a87d4395620a"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:005fa3432484527f9732ebd315da8da8001593e2cf46a3d817669f062c3d9ed4"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e92fca20c46e9f5e1bb485887d074918b13543b1c2a1185e69bb8d17ab6236a7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:50bf98d5e563b83cc29471fa114366e6806bc06bc7a25fd59641e41445327836"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:721c76e84fe669be19c5791da68232ca2e05ba5185575086e384352e2c309597"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82d8fd25b7f4675d0c47cf95b594d4e7b158aca33b76aa63d07186e13c0e0ab7"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b3daeac64d5b371dea99714f08ffc2c208522ec6b06fbc7866a450dd446f5c0f"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:dccab8d5fa1ef9bfba0590ecf4d46df048d18ffe3eec01eeb73a42e0d9e7a8ba"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:aaf27faa992bfee0264dc1f03f4c75e9fcdda66a519db6b957a3f826e285cf12"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:eb30abc20df9ab0814b5a2524f23d75dcf83cde762c161917a2b4b7b55b1e518"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:c72fbbe68c6f32f251bdc08b8611c7b3060612236e960ef848e0a517ddbe76c5"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:982bb1e8b4ffda883b3d0a521e23abcd6fd17418f6d2c4118d257a10199c0ce3"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win32.whl", hash = "sha256:43e0933a0eff183ee85833f341ec567c0980dae57c464d8a508e1b2ceb336471"}, - {file = "charset_normalizer-3.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:d11b54acf878eef558599658b0ffca78138c8c3655cf4f3a4a673c437e67732e"}, - {file = "charset_normalizer-3.4.2-py3-none-any.whl", hash = "sha256:7f56930ab0abd1c45cd15be65cc741c28b1c9a34876ce8c17a2fa107810c0af0"}, - {file = "charset_normalizer-3.4.2.tar.gz", hash = "sha256:5baececa9ecba31eff645232d59845c07aa030f0c81ee70184a90d35099a0e63"}, +groups = ["main", "demo", "docs"] +files = [ + {file = "charset_normalizer-3.4.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e824f1492727fa856dd6eda4f7cee25f8518a12f3c4a56a74e8095695089cf6d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4bd5d4137d500351a30687c2d3971758aac9a19208fc110ccb9d7188fbe709e8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:027f6de494925c0ab2a55eab46ae5129951638a49a34d87f4c3eda90f696b4ad"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f820802628d2694cb7e56db99213f930856014862f3fd943d290ea8438d07ca8"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:798d75d81754988d2565bff1b97ba5a44411867c0cf32b77a7e8f8d84796b10d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d1bb833febdff5c8927f922386db610b49db6e0d4f4ee29601d71e7c2694313"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:9cd98cdc06614a2f768d2b7286d66805f94c48cde050acdbbb7db2600ab3197e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:077fbb858e903c73f6c9db43374fd213b0b6a778106bc7032446a8e8b5b38b93"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:244bfb999c71b35de57821b8ea746b24e863398194a4014e4c76adc2bbdfeff0"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:64b55f9dce520635f018f907ff1b0df1fdc31f2795a922fb49dd14fbcdf48c84"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:faa3a41b2b66b6e50f84ae4a68c64fcd0c44355741c6374813a800cd6695db9e"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:6515f3182dbe4ea06ced2d9e8666d97b46ef4c75e326b79bb624110f122551db"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cc00f04ed596e9dc0da42ed17ac5e596c6ccba999ba6bd92b0e0aef2f170f2d6"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win32.whl", hash = "sha256:f34be2938726fc13801220747472850852fe6b1ea75869a048d6f896838c896f"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_amd64.whl", hash = "sha256:a61900df84c667873b292c3de315a786dd8dac506704dea57bc957bd31e22c7d"}, + {file = "charset_normalizer-3.4.4-cp310-cp310-win_arm64.whl", hash = "sha256:cead0978fc57397645f12578bfd2d5ea9138ea0fac82b2f63f7f7c6877986a69"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6e1fcf0720908f200cd21aa4e6750a48ff6ce4afe7ff5a79a90d5ed8a08296f8"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f819d5fe9234f9f82d75bdfa9aef3a3d72c4d24a6e57aeaebba32a704553aa0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a59cb51917aa591b1c4e6a43c132f0cdc3c76dbad6155df4e28ee626cc77a0a3"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8ef3c867360f88ac904fd3f5e1f902f13307af9052646963ee08ff4f131adafc"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d9e45d7faa48ee908174d8fe84854479ef838fc6a705c9315372eacbc2f02897"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:840c25fb618a231545cbab0564a799f101b63b9901f2569faecd6b222ac72381"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ca5862d5b3928c4940729dacc329aa9102900382fea192fc5e52eb69d6093815"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9c7f57c3d666a53421049053eaacdd14bbd0a528e2186fcb2e672effd053bb0"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:277e970e750505ed74c832b4bf75dac7476262ee2a013f5574dd49075879e161"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:31fd66405eaf47bb62e8cd575dc621c56c668f27d46a61d975a249930dd5e2a4"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:0d3d8f15c07f86e9ff82319b3d9ef6f4bf907608f53fe9d92b28ea9ae3d1fd89"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:9f7fcd74d410a36883701fafa2482a6af2ff5ba96b9a620e9e0721e28ead5569"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ebf3e58c7ec8a8bed6d66a75d7fb37b55e5015b03ceae72a8e7c74495551e224"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win32.whl", hash = "sha256:eecbc200c7fd5ddb9a7f16c7decb07b566c29fa2161a16cf67b8d068bd21690a"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_amd64.whl", hash = "sha256:5ae497466c7901d54b639cf42d5b8c1b6a4fead55215500d2f486d34db48d016"}, + {file = "charset_normalizer-3.4.4-cp311-cp311-win_arm64.whl", hash = "sha256:65e2befcd84bc6f37095f5961e68a6f077bf44946771354a28ad434c2cce0ae1"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:0a98e6759f854bd25a58a73fa88833fba3b7c491169f86ce1180c948ab3fd394"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b5b290ccc2a263e8d185130284f8501e3e36c5e02750fc6b6bdeb2e9e96f1e25"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74bb723680f9f7a6234dcf67aea57e708ec1fbdf5699fb91dfd6f511b0a320ef"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f1e34719c6ed0b92f418c7c780480b26b5d9c50349e9a9af7d76bf757530350d"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:2437418e20515acec67d86e12bf70056a33abdacb5cb1655042f6538d6b085a8"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:11d694519d7f29d6cd09f6ac70028dba10f92f6cdd059096db198c283794ac86"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ac1c4a689edcc530fc9d9aa11f5774b9e2f33f9a0c6a57864e90908f5208d30a"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:21d142cc6c0ec30d2efee5068ca36c128a30b0f2c53c1c07bd78cb6bc1d3be5f"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:5dbe56a36425d26d6cfb40ce79c314a2e4dd6211d51d6d2191c00bed34f354cc"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:5bfbb1b9acf3334612667b61bd3002196fe2a1eb4dd74d247e0f2a4d50ec9bbf"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:d055ec1e26e441f6187acf818b73564e6e6282709e9bcb5b63f5b23068356a15"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:af2d8c67d8e573d6de5bc30cdb27e9b95e49115cd9baad5ddbd1a6207aaa82a9"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:780236ac706e66881f3b7f2f32dfe90507a09e67d1d454c762cf642e6e1586e0"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win32.whl", hash = "sha256:5833d2c39d8896e4e19b689ffc198f08ea58116bee26dea51e362ecc7cd3ed26"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:a79cfe37875f822425b89a82333404539ae63dbdddf97f84dcbc3d339aae9525"}, + {file = "charset_normalizer-3.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:376bec83a63b8021bb5c8ea75e21c4ccb86e7e45ca4eb81146091b56599b80c3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:e1f185f86a6f3403aa2420e815904c67b2f9ebc443f045edd0de921108345794"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b39f987ae8ccdf0d2642338faf2abb1862340facc796048b604ef14919e55ed"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3162d5d8ce1bb98dd51af660f2121c55d0fa541b46dff7bb9b9f86ea1d87de72"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:81d5eb2a312700f4ecaa977a8235b634ce853200e828fbadf3a9c50bab278328"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5bd2293095d766545ec1a8f612559f6b40abc0eb18bb2f5d1171872d34036ede"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8a8b89589086a25749f471e6a900d3f662d1d3b6e2e59dcecf787b1cc3a1894"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc7637e2f80d8530ee4a78e878bce464f70087ce73cf7c1caf142416923b98f1"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f8bf04158c6b607d747e93949aa60618b61312fe647a6369f88ce2ff16043490"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:554af85e960429cf30784dd47447d5125aaa3b99a6f0683589dbd27e2f45da44"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:74018750915ee7ad843a774364e13a3db91682f26142baddf775342c3f5b1133"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:c0463276121fdee9c49b98908b3a89c39be45d86d1dbaa22957e38f6321d4ce3"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:362d61fd13843997c1c446760ef36f240cf81d3ebf74ac62652aebaf7838561e"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:9a26f18905b8dd5d685d6d07b0cdf98a79f3c7a918906af7cc143ea2e164c8bc"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win32.whl", hash = "sha256:9b35f4c90079ff2e2edc5b26c0c77925e5d2d255c42c74fdb70fb49b172726ac"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:b435cba5f4f750aa6c0a0d92c541fb79f69a387c91e61f1795227e4ed9cece14"}, + {file = "charset_normalizer-3.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:542d2cee80be6f80247095cc36c418f7bddd14f4a6de45af91dfad36d817bba2"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:da3326d9e65ef63a817ecbcc0df6e94463713b754fe293eaa03da99befb9a5bd"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8af65f14dc14a79b924524b1e7fffe304517b2bff5a58bf64f30b98bbc5079eb"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:74664978bb272435107de04e36db5a9735e78232b85b77d45cfb38f758efd33e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:752944c7ffbfdd10c074dc58ec2d5a8a4cd9493b314d367c14d24c17684ddd14"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d1f13550535ad8cff21b8d757a3257963e951d96e20ec82ab44bc64aeb62a191"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ecaae4149d99b1c9e7b88bb03e3221956f68fd6d50be2ef061b2381b61d20838"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:cb6254dc36b47a990e59e1068afacdcd02958bdcce30bb50cc1700a8b9d624a6"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c8ae8a0f02f57a6e61203a31428fa1d677cbe50c93622b4149d5c0f319c1d19e"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:47cc91b2f4dd2833fddaedd2893006b0106129d4b94fdb6af1f4ce5a9965577c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:82004af6c302b5d3ab2cfc4cc5f29db16123b1a8417f2e25f9066f91d4411090"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:2b7d8f6c26245217bd2ad053761201e9f9680f8ce52f0fcd8d0755aeae5b2152"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:799a7a5e4fb2d5898c60b640fd4981d6a25f1c11790935a44ce38c54e985f828"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:99ae2cffebb06e6c22bdc25801d7b30f503cc87dbd283479e7b606f70aff57ec"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win32.whl", hash = "sha256:f9d332f8c2a2fcbffe1378594431458ddbef721c1769d78e2cbc06280d8155f9"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:8a6562c3700cce886c5be75ade4a5db4214fda19fede41d9792d100288d8f94c"}, + {file = "charset_normalizer-3.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:de00632ca48df9daf77a2c65a484531649261ec9f25489917f09e455cb09ddb2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:ce8a0633f41a967713a59c4139d29110c07e826d131a316b50ce11b1d79b4f84"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eaabd426fe94daf8fd157c32e571c85cb12e66692f15516a83a03264b08d06c3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4ef880e27901b6cc782f1b95f82da9313c0eb95c3af699103088fa0ac3ce9ac"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2aaba3b0819274cc41757a1da876f810a3e4d7b6eb25699253a4effef9e8e4af"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:778d2e08eda00f4256d7f672ca9fef386071c9202f5e4607920b86d7803387f2"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f155a433c2ec037d4e8df17d18922c3a0d9b3232a396690f17175d2946f0218d"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a8bf8d0f749c5757af2142fe7903a9df1d2e8aa3841559b2bad34b08d0e2bcf3"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:194f08cbb32dc406d6e1aea671a68be0823673db2832b38405deba2fb0d88f63"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_armv7l.whl", hash = "sha256:6aee717dcfead04c6eb1ce3bd29ac1e22663cdea57f943c87d1eab9a025438d7"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_ppc64le.whl", hash = "sha256:cd4b7ca9984e5e7985c12bc60a6f173f3c958eae74f3ef6624bb6b26e2abbae4"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_riscv64.whl", hash = "sha256:b7cf1017d601aa35e6bb650b6ad28652c9cd78ee6caff19f3c28d03e1c80acbf"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_s390x.whl", hash = "sha256:e912091979546adf63357d7e2ccff9b44f026c075aeaf25a52d0e95ad2281074"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:5cb4d72eea50c8868f5288b7f7f33ed276118325c1dfd3957089f6b519e1382a"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win32.whl", hash = "sha256:837c2ce8c5a65a2035be9b3569c684358dfbf109fd3b6969630a87535495ceaa"}, + {file = "charset_normalizer-3.4.4-cp38-cp38-win_amd64.whl", hash = "sha256:44c2a8734b333e0578090c4cd6b16f275e07aa6614ca8715e6c038e865e70576"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:a9768c477b9d7bd54bc0c86dbaebdec6f03306675526c9927c0e8a04e8f94af9"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1bee1e43c28aa63cb16e5c14e582580546b08e535299b8b6158a7c9c768a1f3d"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:fd44c878ea55ba351104cb93cc85e74916eb8fa440ca7903e57575e97394f608"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0f04b14ffe5fdc8c4933862d8306109a2c51e0704acfa35d51598eb45a1e89fc"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:cd09d08005f958f370f539f186d10aec3377d55b9eeb0d796025d4886119d76e"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4fe7859a4e3e8457458e2ff592f15ccb02f3da787fcd31e0183879c3ad4692a1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fa09f53c465e532f4d3db095e0c55b615f010ad81803d383195b6b5ca6cbf5f3"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:7fa17817dc5625de8a027cb8b26d9fefa3ea28c8253929b8d6649e705d2835b6"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_armv7l.whl", hash = "sha256:5947809c8a2417be3267efc979c47d76a079758166f7d43ef5ae8e9f92751f88"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_ppc64le.whl", hash = "sha256:4902828217069c3c5c71094537a8e623f5d097858ac6ca8252f7b4d10b7560f1"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:7c308f7e26e4363d79df40ca5b2be1c6ba9f02bdbccfed5abddb7859a6ce72cf"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_s390x.whl", hash = "sha256:2c9d3c380143a1fedbff95a312aa798578371eb29da42106a29019368a475318"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:cb01158d8b88ee68f15949894ccc6712278243d95f344770fa7593fa2d94410c"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win32.whl", hash = "sha256:2677acec1a2f8ef614c6888b5b4ae4060cc184174a938ed4e8ef690e15d3e505"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_amd64.whl", hash = "sha256:f8e160feb2aed042cd657a72acc0b481212ed28b1b9a95c0cee1621b524e1966"}, + {file = "charset_normalizer-3.4.4-cp39-cp39-win_arm64.whl", hash = "sha256:b5d84d37db046c5ca74ee7bb47dd6cbc13f80665fdde3e8040bdd3fb015ecb50"}, + {file = "charset_normalizer-3.4.4-py3-none-any.whl", hash = "sha256:7a32c560861a02ff789ad905a2fe94e3f840803362c84fecf1851cb4cf3dc37f"}, + {file = "charset_normalizer-3.4.4.tar.gz", hash = "sha256:94537985111c35f28720e43603b8e7b43a6ecfb2ce1d3058bbe955b73404e21a"}, ] [[package]] name = "click" -version = "8.2.1" +version = "8.3.1" description = "Composable command line interface toolkit" optional = false python-versions = ">=3.10" -groups = ["dev"] +groups = ["dev", "docs"] files = [ - {file = "click-8.2.1-py3-none-any.whl", hash = "sha256:61a3265b914e850b85317d0b3109c7f8cd35a670f963866005d6ef1d5175a12b"}, - {file = "click-8.2.1.tar.gz", hash = "sha256:27c491cc05d968d271d5a1db13e3b5a184636d9d930f148c50b038f0d0646202"}, + {file = "click-8.3.1-py3-none-any.whl", hash = "sha256:981153a64e25f12d547d3426c367a4857371575ee7ad18df2a6183ab0545b2a6"}, + {file = "click-8.3.1.tar.gz", hash = "sha256:12ff4785d337a1bb490bb7e9c2b1ee5da3112e94a8622f26a6c77f5d2fc6842a"}, ] [package.dependencies] @@ -493,28 +550,25 @@ 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" -groups = ["main", "demo", "dev"] -markers = "sys_platform == \"win32\" or platform_system == \"Windows\"" +groups = ["main", "demo", "dev", "docs"] files = [ {file = "colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6"}, {file = "colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44"}, ] +markers = {main = "sys_platform == \"win32\" or platform_system == \"Windows\"", demo = "sys_platform == \"win32\" or platform_system == \"Windows\"", dev = "sys_platform == \"win32\" or platform_system == \"Windows\""} [[package]] name = "comm" -version = "0.2.2" +version = "0.2.3" description = "Jupyter Python Comm implementation, for usage in ipykernel, xeus-python etc." optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "comm-0.2.2-py3-none-any.whl", hash = "sha256:e6fb86cb70ff661ee8c9c14e7d36d6de3b4066f1441be4063df9c5009f0a64d3"}, - {file = "comm-0.2.2.tar.gz", hash = "sha256:3fd7a84065306e07bea1773df6eb8282de51ba82f77c72f9c85716ab11fe980e"}, + {file = "comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417"}, + {file = "comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971"}, ] -[package.dependencies] -traitlets = ">=4" - [package.extras] test = ["pytest"] @@ -525,6 +579,7 @@ description = "Python library for calculating contours of 2D quadrilateral grids optional = false python-versions = ">=3.10" groups = ["main", "demo"] +markers = "python_version == \"3.10\"" files = [ {file = "contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934"}, {file = "contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989"}, @@ -595,106 +650,199 @@ mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.15.0)", " test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] +[[package]] +name = "contourpy" +version = "1.3.3" +description = "Python library for calculating contours of 2D quadrilateral grids" +optional = false +python-versions = ">=3.11" +groups = ["main", "demo"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1"}, + {file = "contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a"}, + {file = "contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620"}, + {file = "contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f"}, + {file = "contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff"}, + {file = "contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42"}, + {file = "contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb"}, + {file = "contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea"}, + {file = "contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7"}, + {file = "contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411"}, + {file = "contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69"}, + {file = "contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b"}, + {file = "contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:177fb367556747a686509d6fef71d221a4b198a3905fe824430e5ea0fda54eb5"}, + {file = "contourpy-1.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d002b6f00d73d69333dac9d0b8d5e84d9724ff9ef044fd63c5986e62b7c9e1b1"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:348ac1f5d4f1d66d3322420f01d42e43122f43616e0f194fc1c9f5d830c5b286"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:655456777ff65c2c548b7c454af9c6f33f16c8884f11083244b5819cc214f1b5"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:644a6853d15b2512d67881586bd03f462c7ab755db95f16f14d7e238f2852c67"}, + {file = "contourpy-1.3.3-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4debd64f124ca62069f313a9cb86656ff087786016d76927ae2cf37846b006c9"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a15459b0f4615b00bbd1e91f1b9e19b7e63aea7483d03d804186f278c0af2659"}, + {file = "contourpy-1.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ca0fdcd73925568ca027e0b17ab07aad764be4706d0a925b89227e447d9737b7"}, + {file = "contourpy-1.3.3-cp313-cp313-win32.whl", hash = "sha256:b20c7c9a3bf701366556e1b1984ed2d0cedf999903c51311417cf5f591d8c78d"}, + {file = "contourpy-1.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:1cadd8b8969f060ba45ed7c1b714fe69185812ab43bd6b86a9123fe8f99c3263"}, + {file = "contourpy-1.3.3-cp313-cp313-win_arm64.whl", hash = "sha256:fd914713266421b7536de2bfa8181aa8c699432b6763a0ea64195ebe28bff6a9"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:88df9880d507169449d434c293467418b9f6cbe82edd19284aa0409e7fdb933d"}, + {file = "contourpy-1.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:d06bb1f751ba5d417047db62bca3c8fde202b8c11fb50742ab3ab962c81e8216"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e4e6b05a45525357e382909a4c1600444e2a45b4795163d3b22669285591c1ae"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ab3074b48c4e2cf1a960e6bbeb7f04566bf36b1861d5c9d4d8ac04b82e38ba20"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6c3d53c796f8647d6deb1abe867daeb66dcc8a97e8455efa729516b997b8ed99"}, + {file = "contourpy-1.3.3-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:50ed930df7289ff2a8d7afeb9603f8289e5704755c7e5c3bbd929c90c817164b"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:4feffb6537d64b84877da813a5c30f1422ea5739566abf0bd18065ac040e120a"}, + {file = "contourpy-1.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:2b7e9480ffe2b0cd2e787e4df64270e3a0440d9db8dc823312e2c940c167df7e"}, + {file = "contourpy-1.3.3-cp313-cp313t-win32.whl", hash = "sha256:283edd842a01e3dcd435b1c5116798d661378d83d36d337b8dde1d16a5fc9ba3"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_amd64.whl", hash = "sha256:87acf5963fc2b34825e5b6b048f40e3635dd547f590b04d2ab317c2619ef7ae8"}, + {file = "contourpy-1.3.3-cp313-cp313t-win_arm64.whl", hash = "sha256:3c30273eb2a55024ff31ba7d052dde990d7d8e5450f4bbb6e913558b3d6c2301"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fde6c716d51c04b1c25d0b90364d0be954624a0ee9d60e23e850e8d48353d07a"}, + {file = "contourpy-1.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:cbedb772ed74ff5be440fa8eee9bd49f64f6e3fc09436d9c7d8f1c287b121d77"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:22e9b1bd7a9b1d652cd77388465dc358dafcd2e217d35552424aa4f996f524f5"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a22738912262aa3e254e4f3cb079a95a67132fc5a063890e224393596902f5a4"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:afe5a512f31ee6bd7d0dda52ec9864c984ca3d66664444f2d72e0dc4eb832e36"}, + {file = "contourpy-1.3.3-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f64836de09927cba6f79dcd00fdd7d5329f3fccc633468507079c829ca4db4e3"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1fd43c3be4c8e5fd6e4f2baeae35ae18176cf2e5cced681cca908addf1cdd53b"}, + {file = "contourpy-1.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6afc576f7b33cf00996e5c1102dc2a8f7cc89e39c0b55df93a0b78c1bd992b36"}, + {file = "contourpy-1.3.3-cp314-cp314-win32.whl", hash = "sha256:66c8a43a4f7b8df8b71ee1840e4211a3c8d93b214b213f590e18a1beca458f7d"}, + {file = "contourpy-1.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:cf9022ef053f2694e31d630feaacb21ea24224be1c3ad0520b13d844274614fd"}, + {file = "contourpy-1.3.3-cp314-cp314-win_arm64.whl", hash = "sha256:95b181891b4c71de4bb404c6621e7e2390745f887f2a026b2d99e92c17892339"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:33c82d0138c0a062380332c861387650c82e4cf1747aaa6938b9b6516762e772"}, + {file = "contourpy-1.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:ea37e7b45949df430fe649e5de8351c423430046a2af20b1c1961cae3afcda77"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d304906ecc71672e9c89e87c4675dc5c2645e1f4269a5063b99b0bb29f232d13"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ca658cd1a680a5c9ea96dc61cdbae1e85c8f25849843aa799dfd3cb370ad4fbe"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ab2fd90904c503739a75b7c8c5c01160130ba67944a7b77bbf36ef8054576e7f"}, + {file = "contourpy-1.3.3-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b7301b89040075c30e5768810bc96a8e8d78085b47d8be6e4c3f5a0b4ed478a0"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:2a2a8b627d5cc6b7c41a4beff6c5ad5eb848c88255fda4a8745f7e901b32d8e4"}, + {file = "contourpy-1.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:fd6ec6be509c787f1caf6b247f0b1ca598bef13f4ddeaa126b7658215529ba0f"}, + {file = "contourpy-1.3.3-cp314-cp314t-win32.whl", hash = "sha256:e74a9a0f5e3fff48fb5a7f2fd2b9b70a3fe014a67522f79b7cca4c0c7e43c9ae"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_amd64.whl", hash = "sha256:13b68d6a62db8eafaebb8039218921399baf6e47bf85006fd8529f2a08ef33fc"}, + {file = "contourpy-1.3.3-cp314-cp314t-win_arm64.whl", hash = "sha256:b7448cb5a725bb1e35ce88771b86fba35ef418952474492cf7c764059933ff8b"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989"}, + {file = "contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77"}, + {file = "contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880"}, +] + +[package.dependencies] +numpy = ">=1.25" + +[package.extras] +bokeh = ["bokeh", "selenium"] +docs = ["furo", "sphinx (>=7.2)", "sphinx-copybutton"] +mypy = ["bokeh", "contourpy[bokeh,docs]", "docutils-stubs", "mypy (==1.17.0)", "types-Pillow"] +test = ["Pillow", "contourpy[test-no-images]", "matplotlib"] +test-no-images = ["pytest", "pytest-cov", "pytest-rerunfailures", "pytest-xdist", "wurlitzer"] + [[package]] name = "coverage" -version = "7.13.0" +version = "7.13.1" description = "Code coverage measurement for Python" optional = false python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "coverage-7.13.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:02d9fb9eccd48f6843c98a37bd6817462f130b86da8660461e8f5e54d4c06070"}, - {file = "coverage-7.13.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:367449cf07d33dc216c083f2036bb7d976c6e4903ab31be400ad74ad9f85ce98"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cdb3c9f8fef0a954c632f64328a3935988d33a6604ce4bf67ec3e39670f12ae5"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d10fd186aac2316f9bbb46ef91977f9d394ded67050ad6d84d94ed6ea2e8e54e"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f88ae3e69df2ab62fb0bc5219a597cb890ba5c438190ffa87490b315190bb33"}, - {file = "coverage-7.13.0-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4be718e51e86f553bcf515305a158a1cd180d23b72f07ae76d6017c3cc5d791"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a00d3a393207ae12f7c49bb1c113190883b500f48979abb118d8b72b8c95c032"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3a7b1cd820e1b6116f92c6128f1188e7afe421c7e1b35fa9836b11444e53ebd9"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:37eee4e552a65866f15dedd917d5e5f3d59805994260720821e2c1b51ac3248f"}, - {file = "coverage-7.13.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:62d7c4f13102148c78d7353c6052af6d899a7f6df66a32bddcc0c0eb7c5326f8"}, - {file = "coverage-7.13.0-cp310-cp310-win32.whl", hash = "sha256:24e4e56304fdb56f96f80eabf840eab043b3afea9348b88be680ec5986780a0f"}, - {file = "coverage-7.13.0-cp310-cp310-win_amd64.whl", hash = "sha256:74c136e4093627cf04b26a35dab8cbfc9b37c647f0502fc313376e11726ba303"}, - {file = "coverage-7.13.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0dfa3855031070058add1a59fdfda0192fd3e8f97e7c81de0596c145dea51820"}, - {file = "coverage-7.13.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4fdb6f54f38e334db97f72fa0c701e66d8479af0bc3f9bfb5b90f1c30f54500f"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:7e442c013447d1d8d195be62852270b78b6e255b79b8675bad8479641e21fd96"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:1ed5630d946859de835a85e9a43b721123a8a44ec26e2830b296d478c7fd4259"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7f15a931a668e58087bc39d05d2b4bf4b14ff2875b49c994bbdb1c2217a8daeb"}, - {file = "coverage-7.13.0-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:30a3a201a127ea57f7e14ba43c93c9c4be8b7d17a26e03bb49e6966d019eede9"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7a485ff48fbd231efa32d58f479befce52dcb6bfb2a88bb7bf9a0b89b1bc8030"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:22486cdafba4f9e471c816a2a5745337742a617fef68e890d8baf9f3036d7833"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:263c3dbccc78e2e331e59e90115941b5f53e85cfcc6b3b2fbff1fd4e3d2c6ea8"}, - {file = "coverage-7.13.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5330fa0cc1f5c3c4c3bb8e101b742025933e7848989370a1d4c8c5e401ea753"}, - {file = "coverage-7.13.0-cp311-cp311-win32.whl", hash = "sha256:0f4872f5d6c54419c94c25dd6ae1d015deeb337d06e448cd890a1e89a8ee7f3b"}, - {file = "coverage-7.13.0-cp311-cp311-win_amd64.whl", hash = "sha256:51a202e0f80f241ccb68e3e26e19ab5b3bf0f813314f2c967642f13ebcf1ddfe"}, - {file = "coverage-7.13.0-cp311-cp311-win_arm64.whl", hash = "sha256:d2a9d7f1c11487b1c69367ab3ac2d81b9b3721f097aa409a3191c3e90f8f3dd7"}, - {file = "coverage-7.13.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0b3d67d31383c4c68e19a88e28fc4c2e29517580f1b0ebec4a069d502ce1e0bf"}, - {file = "coverage-7.13.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:581f086833d24a22c89ae0fe2142cfaa1c92c930adf637ddf122d55083fb5a0f"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a3a30f0e257df382f5f9534d4ce3d4cf06eafaf5192beb1a7bd066cb10e78fb"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:583221913fbc8f53b88c42e8dbb8fca1d0f2e597cb190ce45916662b8b9d9621"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f5d9bd30756fff3e7216491a0d6d520c448d5124d3d8e8f56446d6412499e74"}, - {file = "coverage-7.13.0-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a23e5a1f8b982d56fa64f8e442e037f6ce29322f1f9e6c2344cd9e9f4407ee57"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9b01c22bc74a7fb44066aaf765224c0d933ddf1f5047d6cdfe4795504a4493f8"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:898cce66d0836973f48dda4e3514d863d70142bdf6dfab932b9b6a90ea5b222d"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3ab483ea0e251b5790c2aac03acde31bff0c736bf8a86829b89382b407cd1c3b"}, - {file = "coverage-7.13.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d84e91521c5e4cb6602fe11ece3e1de03b2760e14ae4fcf1a4b56fa3c801fcd"}, - {file = "coverage-7.13.0-cp312-cp312-win32.whl", hash = "sha256:193c3887285eec1dbdb3f2bd7fbc351d570ca9c02ca756c3afbc71b3c98af6ef"}, - {file = "coverage-7.13.0-cp312-cp312-win_amd64.whl", hash = "sha256:4f3e223b2b2db5e0db0c2b97286aba0036ca000f06aca9b12112eaa9af3d92ae"}, - {file = "coverage-7.13.0-cp312-cp312-win_arm64.whl", hash = "sha256:086cede306d96202e15a4b77ace8472e39d9f4e5f9fd92dd4fecdfb2313b2080"}, - {file = "coverage-7.13.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:28ee1c96109974af104028a8ef57cec21447d42d0e937c0275329272e370ebcf"}, - {file = "coverage-7.13.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:d1e97353dcc5587b85986cda4ff3ec98081d7e84dd95e8b2a6d59820f0545f8a"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:99acd4dfdfeb58e1937629eb1ab6ab0899b131f183ee5f23e0b5da5cba2fec74"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:ff45e0cd8451e293b63ced93161e189780baf444119391b3e7d25315060368a6"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f4f72a85316d8e13234cafe0a9f81b40418ad7a082792fa4165bd7d45d96066b"}, - {file = "coverage-7.13.0-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:11c21557d0e0a5a38632cbbaca5f008723b26a89d70db6315523df6df77d6232"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:76541dc8d53715fb4f7a3a06b34b0dc6846e3c69bc6204c55653a85dd6220971"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:6e9e451dee940a86789134b6b0ffbe31c454ade3b849bb8a9d2cca2541a8e91d"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:5c67dace46f361125e6b9cace8fe0b729ed8479f47e70c89b838d319375c8137"}, - {file = "coverage-7.13.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f59883c643cb19630500f57016f76cfdcd6845ca8c5b5ea1f6e17f74c8e5f511"}, - {file = "coverage-7.13.0-cp313-cp313-win32.whl", hash = "sha256:58632b187be6f0be500f553be41e277712baa278147ecb7559983c6d9faf7ae1"}, - {file = "coverage-7.13.0-cp313-cp313-win_amd64.whl", hash = "sha256:73419b89f812f498aca53f757dd834919b48ce4799f9d5cad33ca0ae442bdb1a"}, - {file = "coverage-7.13.0-cp313-cp313-win_arm64.whl", hash = "sha256:eb76670874fdd6091eedcc856128ee48c41a9bbbb9c3f1c7c3cf169290e3ffd6"}, - {file = "coverage-7.13.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:6e63ccc6e0ad8986386461c3c4b737540f20426e7ec932f42e030320896c311a"}, - {file = "coverage-7.13.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:494f5459ffa1bd45e18558cd98710c36c0b8fbfa82a5eabcbe671d80ecffbfe8"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:06cac81bf10f74034e055e903f5f946e3e26fc51c09fc9f584e4a1605d977053"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f2ffc92b46ed6e6760f1d47a71e56b5664781bc68986dbd1836b2b70c0ce2071"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0602f701057c6823e5db1b74530ce85f17c3c5be5c85fc042ac939cbd909426e"}, - {file = "coverage-7.13.0-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:25dc33618d45456ccb1d37bce44bc78cf269909aa14c4db2e03d63146a8a1493"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:71936a8b3b977ddd0b694c28c6a34f4fff2e9dd201969a4ff5d5fc7742d614b0"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:936bc20503ce24770c71938d1369461f0c5320830800933bc3956e2a4ded930e"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:af0a583efaacc52ae2521f8d7910aff65cdb093091d76291ac5820d5e947fc1c"}, - {file = "coverage-7.13.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:f1c23e24a7000da892a312fb17e33c5f94f8b001de44b7cf8ba2e36fbd15859e"}, - {file = "coverage-7.13.0-cp313-cp313t-win32.whl", hash = "sha256:5f8a0297355e652001015e93be345ee54393e45dc3050af4a0475c5a2b767d46"}, - {file = "coverage-7.13.0-cp313-cp313t-win_amd64.whl", hash = "sha256:6abb3a4c52f05e08460bd9acf04fec027f8718ecaa0d09c40ffbc3fbd70ecc39"}, - {file = "coverage-7.13.0-cp313-cp313t-win_arm64.whl", hash = "sha256:3ad968d1e3aa6ce5be295ab5fe3ae1bf5bb4769d0f98a80a0252d543a2ef2e9e"}, - {file = "coverage-7.13.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:453b7ec753cf5e4356e14fe858064e5520c460d3bbbcb9c35e55c0d21155c256"}, - {file = "coverage-7.13.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:af827b7cbb303e1befa6c4f94fd2bf72f108089cfa0f8abab8f4ca553cf5ca5a"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9987a9e4f8197a1000280f7cc089e3ea2c8b3c0a64d750537809879a7b4ceaf9"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3188936845cd0cb114fa6a51842a304cdbac2958145d03be2377ec41eb285d19"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a2bdb3babb74079f021696cb46b8bb5f5661165c385d3a238712b031a12355be"}, - {file = "coverage-7.13.0-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7464663eaca6adba4175f6c19354feea61ebbdd735563a03d1e472c7072d27bb"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:8069e831f205d2ff1f3d355e82f511eb7c5522d7d413f5db5756b772ec8697f8"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:6fb2d5d272341565f08e962cce14cdf843a08ac43bd621783527adb06b089c4b"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:5e70f92ef89bac1ac8a99b3324923b4749f008fdbd7aa9cb35e01d7a284a04f9"}, - {file = "coverage-7.13.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4b5de7d4583e60d5fd246dd57fcd3a8aa23c6e118a8c72b38adf666ba8e7e927"}, - {file = "coverage-7.13.0-cp314-cp314-win32.whl", hash = "sha256:a6c6e16b663be828a8f0b6c5027d36471d4a9f90d28444aa4ced4d48d7d6ae8f"}, - {file = "coverage-7.13.0-cp314-cp314-win_amd64.whl", hash = "sha256:0900872f2fdb3ee5646b557918d02279dc3af3dfb39029ac4e945458b13f73bc"}, - {file = "coverage-7.13.0-cp314-cp314-win_arm64.whl", hash = "sha256:3a10260e6a152e5f03f26db4a407c4c62d3830b9af9b7c0450b183615f05d43b"}, - {file = "coverage-7.13.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9097818b6cc1cfb5f174e3263eba4a62a17683bcfe5c4b5d07f4c97fa51fbf28"}, - {file = "coverage-7.13.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0018f73dfb4301a89292c73be6ba5f58722ff79f51593352759c1790ded1cabe"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:166ad2a22ee770f5656e1257703139d3533b4a0b6909af67c6b4a3adc1c98657"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f6aaef16d65d1787280943f1c8718dc32e9cf141014e4634d64446702d26e0ff"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e999e2dcc094002d6e2c7bbc1fb85b58ba4f465a760a8014d97619330cdbbbf3"}, - {file = "coverage-7.13.0-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:00c3d22cf6fb1cf3bf662aaaa4e563be8243a5ed2630339069799835a9cc7f9b"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:22ccfe8d9bb0d6134892cbe1262493a8c70d736b9df930f3f3afae0fe3ac924d"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:9372dff5ea15930fea0445eaf37bbbafbc771a49e70c0aeed8b4e2c2614cc00e"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:69ac2c492918c2461bc6ace42d0479638e60719f2a4ef3f0815fa2df88e9f940"}, - {file = "coverage-7.13.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:739c6c051a7540608d097b8e13c76cfa85263ced467168dc6b477bae3df7d0e2"}, - {file = "coverage-7.13.0-cp314-cp314t-win32.whl", hash = "sha256:fe81055d8c6c9de76d60c94ddea73c290b416e061d40d542b24a5871bad498b7"}, - {file = "coverage-7.13.0-cp314-cp314t-win_amd64.whl", hash = "sha256:445badb539005283825959ac9fa4a28f712c214b65af3a2c464f1adc90f5fcbc"}, - {file = "coverage-7.13.0-cp314-cp314t-win_arm64.whl", hash = "sha256:de7f6748b890708578fc4b7bb967d810aeb6fcc9bff4bb77dbca77dab2f9df6a"}, - {file = "coverage-7.13.0-py3-none-any.whl", hash = "sha256:850d2998f380b1e266459ca5b47bc9e7daf9af1d070f66317972f382d46f1904"}, - {file = "coverage-7.13.0.tar.gz", hash = "sha256:a394aa27f2d7ff9bc04cf703817773a59ad6dfbd577032e690f961d2460ee936"}, + {file = "coverage-7.13.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e1fa280b3ad78eea5be86f94f461c04943d942697e0dac889fa18fff8f5f9147"}, + {file = "coverage-7.13.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c3d8c679607220979434f494b139dfb00131ebf70bb406553d69c1ff01a5c33d"}, + {file = "coverage-7.13.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:339dc63b3eba969067b00f41f15ad161bf2946613156fb131266d8debc8e44d0"}, + {file = "coverage-7.13.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:db622b999ffe49cb891f2fff3b340cdc2f9797d01a0a202a0973ba2562501d90"}, + {file = "coverage-7.13.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1443ba9acbb593fa7c1c29e011d7c9761545fe35e7652e85ce7f51a16f7e08d"}, + {file = "coverage-7.13.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c832ec92c4499ac463186af72f9ed4d8daec15499b16f0a879b0d1c8e5cf4a3b"}, + {file = "coverage-7.13.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:562ec27dfa3f311e0db1ba243ec6e5f6ab96b1edfcfc6cf86f28038bc4961ce6"}, + {file = "coverage-7.13.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:4de84e71173d4dada2897e5a0e1b7877e5eefbfe0d6a44edee6ce31d9b8ec09e"}, + {file = "coverage-7.13.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:a5a68357f686f8c4d527a2dc04f52e669c2fc1cbde38f6f7eb6a0e58cbd17cae"}, + {file = "coverage-7.13.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:77cc258aeb29a3417062758975521eae60af6f79e930d6993555eeac6a8eac29"}, + {file = "coverage-7.13.1-cp310-cp310-win32.whl", hash = "sha256:bb4f8c3c9a9f34423dba193f241f617b08ffc63e27f67159f60ae6baf2dcfe0f"}, + {file = "coverage-7.13.1-cp310-cp310-win_amd64.whl", hash = "sha256:c8e2706ceb622bc63bac98ebb10ef5da80ed70fbd8a7999a5076de3afaef0fb1"}, + {file = "coverage-7.13.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a55d509a1dc5a5b708b5dad3b5334e07a16ad4c2185e27b40e4dba796ab7f88"}, + {file = "coverage-7.13.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4d010d080c4888371033baab27e47c9df7d6fb28d0b7b7adf85a4a49be9298b3"}, + {file = "coverage-7.13.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d938b4a840fb1523b9dfbbb454f652967f18e197569c32266d4d13f37244c3d9"}, + {file = "coverage-7.13.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bf100a3288f9bb7f919b87eb84f87101e197535b9bd0e2c2b5b3179633324fee"}, + {file = "coverage-7.13.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef6688db9bf91ba111ae734ba6ef1a063304a881749726e0d3575f5c10a9facf"}, + {file = "coverage-7.13.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0b609fc9cdbd1f02e51f67f51e5aee60a841ef58a68d00d5ee2c0faf357481a3"}, + {file = "coverage-7.13.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c43257717611ff5e9a1d79dce8e47566235ebda63328718d9b65dd640bc832ef"}, + {file = "coverage-7.13.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e09fbecc007f7b6afdfb3b07ce5bd9f8494b6856dd4f577d26c66c391b829851"}, + {file = "coverage-7.13.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:a03a4f3a19a189919c7055098790285cc5c5b0b3976f8d227aea39dbf9f8bfdb"}, + {file = "coverage-7.13.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3820778ea1387c2b6a818caec01c63adc5b3750211af6447e8dcfb9b6f08dbba"}, + {file = "coverage-7.13.1-cp311-cp311-win32.whl", hash = "sha256:ff10896fa55167371960c5908150b434b71c876dfab97b69478f22c8b445ea19"}, + {file = "coverage-7.13.1-cp311-cp311-win_amd64.whl", hash = "sha256:a998cc0aeeea4c6d5622a3754da5a493055d2d95186bad877b0a34ea6e6dbe0a"}, + {file = "coverage-7.13.1-cp311-cp311-win_arm64.whl", hash = "sha256:fea07c1a39a22614acb762e3fbbb4011f65eedafcb2948feeef641ac78b4ee5c"}, + {file = "coverage-7.13.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6f34591000f06e62085b1865c9bc5f7858df748834662a51edadfd2c3bfe0dd3"}, + {file = "coverage-7.13.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b67e47c5595b9224599016e333f5ec25392597a89d5744658f837d204e16c63e"}, + {file = "coverage-7.13.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3e7b8bd70c48ffb28461ebe092c2345536fb18bbbf19d287c8913699735f505c"}, + {file = "coverage-7.13.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c223d078112e90dc0e5c4e35b98b9584164bea9fbbd221c0b21c5241f6d51b62"}, + {file = "coverage-7.13.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:794f7c05af0763b1bbd1b9e6eff0e52ad068be3b12cd96c87de037b01390c968"}, + {file = "coverage-7.13.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:0642eae483cc8c2902e4af7298bf886d605e80f26382124cddc3967c2a3df09e"}, + {file = "coverage-7.13.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:9f5e772ed5fef25b3de9f2008fe67b92d46831bd2bc5bdc5dd6bfd06b83b316f"}, + {file = "coverage-7.13.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:45980ea19277dc0a579e432aef6a504fe098ef3a9032ead15e446eb0f1191aee"}, + {file = "coverage-7.13.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f18eca6028ffa62adbd185a8f1e1dd242f2e68164dba5c2b74a5204850b4cf"}, + {file = "coverage-7.13.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8dca5590fec7a89ed6826fce625595279e586ead52e9e958d3237821fbc750c"}, + {file = "coverage-7.13.1-cp312-cp312-win32.whl", hash = "sha256:ff86d4e85188bba72cfb876df3e11fa243439882c55957184af44a35bd5880b7"}, + {file = "coverage-7.13.1-cp312-cp312-win_amd64.whl", hash = "sha256:16cc1da46c04fb0fb128b4dc430b78fa2aba8a6c0c9f8eb391fd5103409a6ac6"}, + {file = "coverage-7.13.1-cp312-cp312-win_arm64.whl", hash = "sha256:8d9bc218650022a768f3775dd7fdac1886437325d8d295d923ebcfef4892ad5c"}, + {file = "coverage-7.13.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cb237bfd0ef4d5eb6a19e29f9e528ac67ac3be932ea6b44fb6cc09b9f3ecff78"}, + {file = "coverage-7.13.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1dcb645d7e34dcbcc96cd7c132b1fc55c39263ca62eb961c064eb3928997363b"}, + {file = "coverage-7.13.1-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3d42df8201e00384736f0df9be2ced39324c3907607d17d50d50116c989d84cd"}, + {file = "coverage-7.13.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa3edde1aa8807de1d05934982416cb3ec46d1d4d91e280bcce7cca01c507992"}, + {file = "coverage-7.13.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9edd0e01a343766add6817bc448408858ba6b489039eaaa2018474e4001651a4"}, + {file = "coverage-7.13.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:985b7836931d033570b94c94713c6dba5f9d3ff26045f72c3e5dbc5fe3361e5a"}, + {file = "coverage-7.13.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ffed1e4980889765c84a5d1a566159e363b71d6b6fbaf0bebc9d3c30bc016766"}, + {file = "coverage-7.13.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:8842af7f175078456b8b17f1b73a0d16a65dcbdc653ecefeb00a56b3c8c298c4"}, + {file = "coverage-7.13.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:ccd7a6fca48ca9c131d9b0a2972a581e28b13416fc313fb98b6d24a03ce9a398"}, + {file = "coverage-7.13.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0403f647055de2609be776965108447deb8e384fe4a553c119e3ff6bfbab4784"}, + {file = "coverage-7.13.1-cp313-cp313-win32.whl", hash = "sha256:549d195116a1ba1e1ae2f5ca143f9777800f6636eab917d4f02b5310d6d73461"}, + {file = "coverage-7.13.1-cp313-cp313-win_amd64.whl", hash = "sha256:5899d28b5276f536fcf840b18b61a9fce23cc3aec1d114c44c07fe94ebeaa500"}, + {file = "coverage-7.13.1-cp313-cp313-win_arm64.whl", hash = "sha256:868a2fae76dfb06e87291bcbd4dcbcc778a8500510b618d50496e520bd94d9b9"}, + {file = "coverage-7.13.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:67170979de0dacac3f3097d02b0ad188d8edcea44ccc44aaa0550af49150c7dc"}, + {file = "coverage-7.13.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f80e2bb21bfab56ed7405c2d79d34b5dc0bc96c2c1d2a067b643a09fb756c43a"}, + {file = "coverage-7.13.1-cp313-cp313t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:f83351e0f7dcdb14d7326c3d8d8c4e915fa685cbfdc6281f9470d97a04e9dfe4"}, + {file = "coverage-7.13.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:bb3f6562e89bad0110afbe64e485aac2462efdce6232cdec7862a095dc3412f6"}, + {file = "coverage-7.13.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77545b5dcda13b70f872c3b5974ac64c21d05e65b1590b441c8560115dc3a0d1"}, + {file = "coverage-7.13.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:a4d240d260a1aed814790bbe1f10a5ff31ce6c21bc78f0da4a1e8268d6c80dbd"}, + {file = "coverage-7.13.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:d2287ac9360dec3837bfdad969963a5d073a09a85d898bd86bea82aa8876ef3c"}, + {file = "coverage-7.13.1-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:0d2c11f3ea4db66b5cbded23b20185c35066892c67d80ec4be4bab257b9ad1e0"}, + {file = "coverage-7.13.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:3fc6a169517ca0d7ca6846c3c5392ef2b9e38896f61d615cb75b9e7134d4ee1e"}, + {file = "coverage-7.13.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d10a2ed46386e850bb3de503a54f9fe8192e5917fcbb143bfef653a9355e9a53"}, + {file = "coverage-7.13.1-cp313-cp313t-win32.whl", hash = "sha256:75a6f4aa904301dab8022397a22c0039edc1f51e90b83dbd4464b8a38dc87842"}, + {file = "coverage-7.13.1-cp313-cp313t-win_amd64.whl", hash = "sha256:309ef5706e95e62578cda256b97f5e097916a2c26247c287bbe74794e7150df2"}, + {file = "coverage-7.13.1-cp313-cp313t-win_arm64.whl", hash = "sha256:92f980729e79b5d16d221038dbf2e8f9a9136afa072f9d5d6ed4cb984b126a09"}, + {file = "coverage-7.13.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:97ab3647280d458a1f9adb85244e81587505a43c0c7cff851f5116cd2814b894"}, + {file = "coverage-7.13.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:8f572d989142e0908e6acf57ad1b9b86989ff057c006d13b76c146ec6a20216a"}, + {file = "coverage-7.13.1-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:d72140ccf8a147e94274024ff6fd8fb7811354cf7ef88b1f0a988ebaa5bc774f"}, + {file = "coverage-7.13.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:d3c9f051b028810f5a87c88e5d6e9af3c0ff32ef62763bf15d29f740453ca909"}, + {file = "coverage-7.13.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f398ba4df52d30b1763f62eed9de5620dcde96e6f491f4c62686736b155aa6e4"}, + {file = "coverage-7.13.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:132718176cc723026d201e347f800cd1a9e4b62ccd3f82476950834dad501c75"}, + {file = "coverage-7.13.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:9e549d642426e3579b3f4b92d0431543b012dcb6e825c91619d4e93b7363c3f9"}, + {file = "coverage-7.13.1-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:90480b2134999301eea795b3a9dbf606c6fbab1b489150c501da84a959442465"}, + {file = "coverage-7.13.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e825dbb7f84dfa24663dd75835e7257f8882629fc11f03ecf77d84a75134b864"}, + {file = "coverage-7.13.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:623dcc6d7a7ba450bbdbeedbaa0c42b329bdae16491af2282f12a7e809be7eb9"}, + {file = "coverage-7.13.1-cp314-cp314-win32.whl", hash = "sha256:6e73ebb44dca5f708dc871fe0b90cf4cff1a13f9956f747cc87b535a840386f5"}, + {file = "coverage-7.13.1-cp314-cp314-win_amd64.whl", hash = "sha256:be753b225d159feb397bd0bf91ae86f689bad0da09d3b301478cd39b878ab31a"}, + {file = "coverage-7.13.1-cp314-cp314-win_arm64.whl", hash = "sha256:228b90f613b25ba0019361e4ab81520b343b622fc657daf7e501c4ed6a2366c0"}, + {file = "coverage-7.13.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:60cfb538fe9ef86e5b2ab0ca8fc8d62524777f6c611dcaf76dc16fbe9b8e698a"}, + {file = "coverage-7.13.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:57dfc8048c72ba48a8c45e188d811e5efd7e49b387effc8fb17e97936dde5bf6"}, + {file = "coverage-7.13.1-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:3f2f725aa3e909b3c5fdb8192490bdd8e1495e85906af74fe6e34a2a77ba0673"}, + {file = "coverage-7.13.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9ee68b21909686eeb21dfcba2c3b81fee70dcf38b140dcd5aa70680995fa3aa5"}, + {file = "coverage-7.13.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:724b1b270cb13ea2e6503476e34541a0b1f62280bc997eab443f87790202033d"}, + {file = "coverage-7.13.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:916abf1ac5cf7eb16bc540a5bf75c71c43a676f5c52fcb9fe75a2bd75fb944e8"}, + {file = "coverage-7.13.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:776483fd35b58d8afe3acbd9988d5de592ab6da2d2a865edfdbc9fdb43e7c486"}, + {file = "coverage-7.13.1-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:b6f3b96617e9852703f5b633ea01315ca45c77e879584f283c44127f0f1ec564"}, + {file = "coverage-7.13.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:bd63e7b74661fed317212fab774e2a648bc4bb09b35f25474f8e3325d2945cd7"}, + {file = "coverage-7.13.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:933082f161bbb3e9f90d00990dc956120f608cdbcaeea15c4d897f56ef4fe416"}, + {file = "coverage-7.13.1-cp314-cp314t-win32.whl", hash = "sha256:18be793c4c87de2965e1c0f060f03d9e5aff66cfeae8e1dbe6e5b88056ec153f"}, + {file = "coverage-7.13.1-cp314-cp314t-win_amd64.whl", hash = "sha256:0e42e0ec0cd3e0d851cb3c91f770c9301f48647cb2877cb78f74bdaa07639a79"}, + {file = "coverage-7.13.1-cp314-cp314t-win_arm64.whl", hash = "sha256:eaecf47ef10c72ece9a2a92118257da87e460e113b83cc0d2905cbbe931792b4"}, + {file = "coverage-7.13.1-py3-none-any.whl", hash = "sha256:2016745cb3ba554469d02819d78958b571792bb68e31302610e898f80dd3a573"}, + {file = "coverage-7.13.1.tar.gz", hash = "sha256:b7593fe7eb5feaa3fbb461ac79aac9f9fc0387a5ca8080b0c6fe2ca27b091afd"}, ] [package.dependencies] @@ -721,110 +869,91 @@ tests = ["pytest", "pytest-cov", "pytest-xdist"] [[package]] name = "cython" -version = "3.1.2" +version = "3.2.3" description = "The Cython compiler for writing C extensions in the Python language." optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "cython-3.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0f2add8b23cb19da3f546a688cd8f9e0bfc2776715ebf5e283bc3113b03ff008"}, - {file = "cython-3.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0d6248a2ae155ca4c42d7fa6a9a05154d62e695d7736bc17e1b85da6dcc361df"}, - {file = "cython-3.1.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:262bf49d9da64e2a34c86cbf8de4aa37daffb0f602396f116cca1ed47dc4b9f2"}, - {file = "cython-3.1.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ae53ae93c699d5f113953a9869df2fc269d8e173f9aa0616c6d8d6e12b4e9827"}, - {file = "cython-3.1.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b417c5d046ce676ee595ec7955ed47a68ad6f419cbf8c2a8708e55a3b38dfa35"}, - {file = "cython-3.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:af127da4b956e0e906e552fad838dc3fb6b6384164070ceebb0d90982a8ae25a"}, - {file = "cython-3.1.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:9be3d4954b46fd0f2dceac011d470f658eaf819132db52fbd1cf226ee60348db"}, - {file = "cython-3.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:63da49672c4bb022b4de9d37bab6c29953dbf5a31a2f40dffd0cf0915dcd7a17"}, - {file = "cython-3.1.2-cp310-cp310-win32.whl", hash = "sha256:2d8291dbbc1cb86b8d60c86fe9cbf99ec72de28cb157cbe869c95df4d32efa96"}, - {file = "cython-3.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:e1f30a1339e03c80968a371ef76bf27a6648c5646cccd14a97e731b6957db97a"}, - {file = "cython-3.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5548573e0912d7dc80579827493315384c462e2f15797b91a8ed177686d31eb9"}, - {file = "cython-3.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bf3ea5bc50d80762c490f42846820a868a6406fdb5878ae9e4cc2f11b50228a"}, - {file = "cython-3.1.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:20ce53951d06ab2bca39f153d9c5add1d631c2a44d58bf67288c9d631be9724e"}, - {file = "cython-3.1.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e05a36224e3002d48c7c1c695b3771343bd16bc57eab60d6c5d5e08f3cbbafd8"}, - {file = "cython-3.1.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:dbc0fc0777c7ab82297c01c61a1161093a22a41714f62e8c35188a309bd5db8e"}, - {file = "cython-3.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:18161ef3dd0e90a944daa2be468dd27696712a5f792d6289e97d2a31298ad688"}, - {file = "cython-3.1.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ca45020950cd52d82189d6dfb6225737586be6fe7b0b9d3fadd7daca62eff531"}, - {file = "cython-3.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:aaae97d6d07610224be2b73a93e9e3dd85c09aedfd8e47054e3ef5a863387dae"}, - {file = "cython-3.1.2-cp311-cp311-win32.whl", hash = "sha256:3d439d9b19e7e70f6ff745602906d282a853dd5219d8e7abbf355de680c9d120"}, - {file = "cython-3.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:8efa44ee2f1876e40eb5e45f6513a19758077c56bf140623ccab43d31f873b61"}, - {file = "cython-3.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:9c2c4b6f9a941c857b40168b3f3c81d514e509d985c2dcd12e1a4fea9734192e"}, - {file = "cython-3.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:bdbc115bbe1b8c1dcbcd1b03748ea87fa967eb8dfc3a1a9bb243d4a382efcff4"}, - {file = "cython-3.1.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05111f89db1ca98edc0675cfaa62be47b3ff519a29876eb095532a9f9e052b8"}, - {file = "cython-3.1.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6e7188df8709be32cfdfadc7c3782e361c929df9132f95e1bbc90a340dca3c7"}, - {file = "cython-3.1.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1c0ecc71e60a051732c2607b8eb8f2a03a5dac09b28e52b8af323c329db9987b"}, - {file = "cython-3.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f27143cf88835c8bcc9bf3304953f23f377d1d991e8942982fe7be344c7cfce3"}, - {file = "cython-3.1.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:d8c43566701133f53bf13485839d8f3f309095fe0d3b9d0cd5873073394d2edc"}, - {file = "cython-3.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a3bb893e85f027a929c1764bb14db4c31cbdf8a96f59a78f608f2ba7cfbbce95"}, - {file = "cython-3.1.2-cp312-cp312-win32.whl", hash = "sha256:12c5902f105e43ca9af7874cdf87a23627f98c15d5a4f6d38bc9d334845145c0"}, - {file = "cython-3.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:06789eb7bd2e55b38b9dd349e9309f794aee0fed99c26ea5c9562d463877763f"}, - {file = "cython-3.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cc22e5f18af436c894b90c257130346930fdc860d7f42b924548c591672beeef"}, - {file = "cython-3.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42c7bffb0fe9898996c7eef9eb74ce3654553c7a3a3f3da66e5a49f801904ce0"}, - {file = "cython-3.1.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:88dc7fd54bfae78c366c6106a759f389000ea4dfe8ed9568af9d2f612825a164"}, - {file = "cython-3.1.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80d0ce057672ca50728153757d022842d5dcec536b50c79615a22dda2a874ea0"}, - {file = "cython-3.1.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:eda6a43f1b78eae0d841698916eef661d15f8bc8439c266a964ea4c504f05612"}, - {file = "cython-3.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b4c516d103e87c2e9c1ab85227e4d91c7484c1ba29e25f8afbf67bae93fee164"}, - {file = "cython-3.1.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:7542f1d18ab2cd22debc72974ec9e53437a20623d47d6001466e430538d7df54"}, - {file = "cython-3.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:63335513c06dcec4ecdaa8598f36c969032149ffd92a461f641ee363dc83c7ad"}, - {file = "cython-3.1.2-cp313-cp313-win32.whl", hash = "sha256:b377d542299332bfeb61ec09c57821b10f1597304394ba76544f4d07780a16df"}, - {file = "cython-3.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:8ab1319c77f15b0ae04b3fb03588df3afdec4cf79e90eeea5c961e0ebd8fdf72"}, - {file = "cython-3.1.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:dbc1f225cb9f9be7a025589463507e10bb2d76a3258f8d308e0e2d0b966c556e"}, - {file = "cython-3.1.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:c1661c1701c96e1866f839e238570c96a97535a81da76a26f45f99ede18b3897"}, - {file = "cython-3.1.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:955bc6032d89ce380458266e65dcf5ae0ed1e7c03a7a4457e3e4773e90ba7373"}, - {file = "cython-3.1.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0b58e859889dd0fc6c3a990445b930f692948b28328bb4f3ed84b51028b7e183"}, - {file = "cython-3.1.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:992a6504aa3eed50dd1fc3d1fa998928b08c1188130bd526e177b6d7f3383ec4"}, - {file = "cython-3.1.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:f3d03077938b02ec47a56aa156da7bfc2379193738397d4e88086db5b0a374e0"}, - {file = "cython-3.1.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:b7e1d3c383a5f4ca5319248b9cb1b16a04fb36e153d651e558897171b7dbabb9"}, - {file = "cython-3.1.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:58d4d45e40cadf4f602d96b7016cf24ccfe4d954c61fa30b79813db8ccb7818f"}, - {file = "cython-3.1.2-cp38-cp38-win32.whl", hash = "sha256:919ff38a93f7c21829a519693b336979feb41a0f7ca35969402d7e211706100e"}, - {file = "cython-3.1.2-cp38-cp38-win_amd64.whl", hash = "sha256:aca994519645ba8fb5e99c0f9d4be28d61435775552aaf893a158c583cd218a5"}, - {file = "cython-3.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:fe7f1ee4c13f8a773bd6c66b3d25879f40596faeab49f97d28c39b16ace5fff9"}, - {file = "cython-3.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c9ec7d2baea122d94790624f743ff5b78f4e777bf969384be65b69d92fa4bc3f"}, - {file = "cython-3.1.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:df57827185874f29240b02402e615547ab995d90182a852c6ec4f91bbae355a4"}, - {file = "cython-3.1.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1a69b9b4fe0a48a8271027c0703c71ab1993c4caca01791c0fd2e2bd9031aa"}, - {file = "cython-3.1.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:970cc1558519f0f108c3e2f4b3480de4945228d9292612d5b2bb687e36c646b8"}, - {file = "cython-3.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:604c39cd6d152498a940aeae28b6fd44481a255a3fdf1b0051c30f3873c88b7f"}, - {file = "cython-3.1.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:855f2ae06438c7405997cf0df42d5b508ec3248272bb39df4a7a4a82a5f7c8cb"}, - {file = "cython-3.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:9e3016ca7a86728bfcbdd52449521e859a977451f296a7ae4967cefa2ec498f7"}, - {file = "cython-3.1.2-cp39-cp39-win32.whl", hash = "sha256:4896fc2b0f90820ea6fcf79a07e30822f84630a404d4e075784124262f6d0adf"}, - {file = "cython-3.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:a965b81eb4f5a5f3f6760b162cb4de3907c71a9ba25d74de1ad7a0e4856f0412"}, - {file = "cython-3.1.2-py3-none-any.whl", hash = "sha256:d23fd7ffd7457205f08571a42b108a3cf993e83a59fe4d72b42e6fc592cf2639"}, - {file = "cython-3.1.2.tar.gz", hash = "sha256:6bbf7a953fa6762dfecdec015e3b054ba51c0121a45ad851fa130f63f5331381"}, + {file = "cython-3.2.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:55c0157a5940fbf0b054508207fe0fc5cc796d0532af492c0fa35b5b41a883f7"}, + {file = "cython-3.2.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51fd1a56d0fc682c05ecc44f11927dbe28dd2867c30148557b62d7d1017a13d8"}, + {file = "cython-3.2.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1309bdce06f767e8514377f44b3a5b9e5b91e58af1348010cca10b572e1852ad"}, + {file = "cython-3.2.3-cp310-cp310-win_amd64.whl", hash = "sha256:6b6dd6b7aca8447b2a6779b314cc402f1e4990754507a88477e535b3c8b41ad1"}, + {file = "cython-3.2.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c041f7e338cca2422e0924716b04fabeda57636214324fc1941396acce99e7c7"}, + {file = "cython-3.2.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:283262b8f902323ceb6ed3b643f275a2a963e7ab059f0714a467933383cbc56d"}, + {file = "cython-3.2.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22a624290c2883387b2c2cfb5224c15bff21432c6a2cf0c23ac8df3dcbd45e96"}, + {file = "cython-3.2.3-cp311-cp311-win_amd64.whl", hash = "sha256:26404441f733fd1cfb0dd9c45477f501437e7d51fad05bb402bd2feb4e127aa3"}, + {file = "cython-3.2.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cf210228c15b5c625824d8e31d43b6fea25f9e13c81dac632f2f7d838e0229a5"}, + {file = "cython-3.2.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f5bf0cebeb4147e172a114437d3fce5a507595d8fdd821be792b1bb25c691514"}, + {file = "cython-3.2.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1f8700ba89c977438744f083890d87187f15709507a5489e0f6d682053b7fa0"}, + {file = "cython-3.2.3-cp312-cp312-win_amd64.whl", hash = "sha256:25732f3981a93407826297f4423206e5e22c3cfccfc74e37bf444453bbdc076f"}, + {file = "cython-3.2.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1d097ad4686b58b8c03d760d08eca28f79878d404ef7452c49636170571654e0"}, + {file = "cython-3.2.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2a18f2e3bcd018416157d0a83446e29b4a31437ab79061fe5504c077e70389d0"}, + {file = "cython-3.2.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:73afc824896ffaf22bf8122d0a7107f0120e3188a353bdcfa92317fc0d9a87ce"}, + {file = "cython-3.2.3-cp313-cp313-win_amd64.whl", hash = "sha256:9aa1a8abf3d8bb53cc19cfaa21c004afad8d4ccb17513f8aa11a788d1f525abd"}, + {file = "cython-3.2.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:80f20369d7aaf4e76cfef902025256918a5cc6eb0aed6d8783e4b1c563e4f6c4"}, + {file = "cython-3.2.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60d19376252722241a3d3ec8a695c5cae4deb053486d2e5f9a40cb569a0cf984"}, + {file = "cython-3.2.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e4293f1861480b397809a6f021a6c12e15e918feae1c7add80c99d07af206578"}, + {file = "cython-3.2.3-cp314-cp314-win_amd64.whl", hash = "sha256:84330e7c8bf220a82b633678b9f99e10227c8f4c406d67c5552449ab2afedef8"}, + {file = "cython-3.2.3-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:18b5e738c9dbb1cb488b51e35c3a1b9aa7363166cce40158fe6ccb454f6498ac"}, + {file = "cython-3.2.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c102388cf7604ff5647164d5041fd5de2393198a87883fdb50f6c078fc2f4f8e"}, + {file = "cython-3.2.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e31f52ea7e35463b21410f150006eb07b663a0b3ceea8ee8f35e0b8e02b75f50"}, + {file = "cython-3.2.3-cp38-cp38-win_amd64.whl", hash = "sha256:228f11be8406015d1ce84a25bf4f96167ff6fc18b834deca5716d95ae15a818c"}, + {file = "cython-3.2.3-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:74f482da8b605c61b4df6ff716d013f20131949cb2fa59b03e63abd36ef5bac0"}, + {file = "cython-3.2.3-cp39-abi3-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:0a75a04688875b275a6c875565e672325bae04327dd6ec2fc25aeb5c6cf82fce"}, + {file = "cython-3.2.3-cp39-abi3-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:6b01b36c9eb1b68c25bddbeef7379f7bfc37f7c9afc044e71840ffab761a2dd0"}, + {file = "cython-3.2.3-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3829f99d611412288f44ff543e9d2b5c0c83274998b2a6680bbe5cca3539c1fd"}, + {file = "cython-3.2.3-cp39-abi3-musllinux_1_2_armv7l.whl", hash = "sha256:c2365a0c79ab9c0fa86d30a4a6ba7e37fc1be9537c48b79b9d63ee7e08bf2fef"}, + {file = "cython-3.2.3-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:3141734fb15f8b5e9402b9240f8da8336edecae91742b41c85678c31ab68f66d"}, + {file = "cython-3.2.3-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:9a24cc653fad3adbd9cbaa638d80df3aa08a1fe27f62eb35850971c70be680df"}, + {file = "cython-3.2.3-cp39-abi3-win32.whl", hash = "sha256:b39dff92db70cbd95528f3b81d70e06bd6d3fc9c1dd91321e4d3b999ece3bceb"}, + {file = "cython-3.2.3-cp39-abi3-win_arm64.whl", hash = "sha256:18edc858e6a52de47fe03ffa97ea14dadf450e20069de0a8aef531006c4bbd93"}, + {file = "cython-3.2.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0145e64485f0a9741c9314ae176282dffeb48d2ef30ae315d7224698867c317f"}, + {file = "cython-3.2.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c5ac7201d8382c0da69e4a119c14be6acd7c286615a0383ffbd1dbfdbaa3df7"}, + {file = "cython-3.2.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fabe2f37acb63a5521d16193effb15acd082e35458f30f1c1f3e506271fee8a7"}, + {file = "cython-3.2.3-cp39-cp39-win_amd64.whl", hash = "sha256:4f40efa83c93060a271046930d2322ec045abb9722d25a377702cb57aa823c2b"}, + {file = "cython-3.2.3-py3-none-any.whl", hash = "sha256:06a1317097f540d3bb6c7b81ed58a0d8b9dbfa97abf39dfd4c22ee87a6c7241e"}, + {file = "cython-3.2.3.tar.gz", hash = "sha256:f13832412d633376ffc08d751cc18ed0d7d00a398a4065e2871db505258748a6"}, ] [[package]] name = "debugpy" -version = "1.8.15" +version = "1.8.19" description = "An implementation of the Debug Adapter Protocol for Python" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "debugpy-1.8.15-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:e9a8125c85172e3ec30985012e7a81ea5e70bbb836637f8a4104f454f9b06c97"}, - {file = "debugpy-1.8.15-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7fd0b6b5eccaa745c214fd240ea82f46049d99ef74b185a3517dad3ea1ec55d9"}, - {file = "debugpy-1.8.15-cp310-cp310-win32.whl", hash = "sha256:8181cce4d344010f6bfe94a531c351a46a96b0f7987750932b2908e7a1e14a55"}, - {file = "debugpy-1.8.15-cp310-cp310-win_amd64.whl", hash = "sha256:af2dcae4e4cd6e8b35f982ccab29fe65f7e8766e10720a717bc80c464584ee21"}, - {file = "debugpy-1.8.15-cp311-cp311-macosx_14_0_universal2.whl", hash = "sha256:babc4fb1962dd6a37e94d611280e3d0d11a1f5e6c72ac9b3d87a08212c4b6dd3"}, - {file = "debugpy-1.8.15-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f778e68f2986a58479d0ac4f643e0b8c82fdd97c2e200d4d61e7c2d13838eb53"}, - {file = "debugpy-1.8.15-cp311-cp311-win32.whl", hash = "sha256:f9d1b5abd75cd965e2deabb1a06b0e93a1546f31f9f621d2705e78104377c702"}, - {file = "debugpy-1.8.15-cp311-cp311-win_amd64.whl", hash = "sha256:62954fb904bec463e2b5a415777f6d1926c97febb08ef1694da0e5d1463c5c3b"}, - {file = "debugpy-1.8.15-cp312-cp312-macosx_14_0_universal2.whl", hash = "sha256:3dcc7225cb317469721ab5136cda9ff9c8b6e6fb43e87c9e15d5b108b99d01ba"}, - {file = "debugpy-1.8.15-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:047a493ca93c85ccede1dbbaf4e66816794bdc214213dde41a9a61e42d27f8fc"}, - {file = "debugpy-1.8.15-cp312-cp312-win32.whl", hash = "sha256:b08e9b0bc260cf324c890626961dad4ffd973f7568fbf57feb3c3a65ab6b6327"}, - {file = "debugpy-1.8.15-cp312-cp312-win_amd64.whl", hash = "sha256:e2a4fe357c92334272eb2845fcfcdbec3ef9f22c16cf613c388ac0887aed15fa"}, - {file = "debugpy-1.8.15-cp313-cp313-macosx_14_0_universal2.whl", hash = "sha256:f5e01291ad7d6649aed5773256c5bba7a1a556196300232de1474c3c372592bf"}, - {file = "debugpy-1.8.15-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:94dc0f0d00e528d915e0ce1c78e771475b2335b376c49afcc7382ee0b146bab6"}, - {file = "debugpy-1.8.15-cp313-cp313-win32.whl", hash = "sha256:fcf0748d4f6e25f89dc5e013d1129ca6f26ad4da405e0723a4f704583896a709"}, - {file = "debugpy-1.8.15-cp313-cp313-win_amd64.whl", hash = "sha256:73c943776cb83e36baf95e8f7f8da765896fd94b05991e7bc162456d25500683"}, - {file = "debugpy-1.8.15-cp38-cp38-macosx_14_0_x86_64.whl", hash = "sha256:054cd4935bd2e4964dfe1aeee4d6bca89d0c833366776fc35387f8a2f517dd00"}, - {file = "debugpy-1.8.15-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:21c4288e662997df3176c4b9d93ee1393913fbaf320732be332d538000c53208"}, - {file = "debugpy-1.8.15-cp38-cp38-win32.whl", hash = "sha256:aaa8ce6a37d764f93fe583d7c6ca58eb7550b36941387483db113125f122bb0d"}, - {file = "debugpy-1.8.15-cp38-cp38-win_amd64.whl", hash = "sha256:71cdf7f676af78e70f005c7fad2ef9da0edc2a24befbf3ab146a51f0d58048c2"}, - {file = "debugpy-1.8.15-cp39-cp39-macosx_14_0_x86_64.whl", hash = "sha256:085b6d0adb3eb457c2823ac497a0690b10a99eff8b01c01a041e84579f114b56"}, - {file = "debugpy-1.8.15-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cd546a405381d17527814852642df0a74b7da8acc20ae5f3cfad0b7c86419511"}, - {file = "debugpy-1.8.15-cp39-cp39-win32.whl", hash = "sha256:ae0d445fe11ff4351428e6c2389e904e1cdcb4a47785da5a5ec4af6c5b95fce5"}, - {file = "debugpy-1.8.15-cp39-cp39-win_amd64.whl", hash = "sha256:de7db80189ca97ab4b10a87e4039cfe4dd7ddfccc8f33b5ae40fcd33792fc67a"}, - {file = "debugpy-1.8.15-py2.py3-none-any.whl", hash = "sha256:bce2e6c5ff4f2e00b98d45e7e01a49c7b489ff6df5f12d881c67d2f1ac635f3d"}, - {file = "debugpy-1.8.15.tar.gz", hash = "sha256:58d7a20b7773ab5ee6bdfb2e6cf622fdf1e40c9d5aef2857d85391526719ac00"}, + {file = "debugpy-1.8.19-cp310-cp310-macosx_15_0_x86_64.whl", hash = "sha256:fce6da15d73be5935b4438435c53adb512326a3e11e4f90793ea87cd9f018254"}, + {file = "debugpy-1.8.19-cp310-cp310-manylinux_2_34_x86_64.whl", hash = "sha256:e24b1652a1df1ab04d81e7ead446a91c226de704ff5dde6bd0a0dbaab07aa3f2"}, + {file = "debugpy-1.8.19-cp310-cp310-win32.whl", hash = "sha256:327cb28c3ad9e17bc925efc7f7018195fd4787c2fe4b7af1eec11f1d19bdec62"}, + {file = "debugpy-1.8.19-cp310-cp310-win_amd64.whl", hash = "sha256:b7dd275cf2c99e53adb9654f5ae015f70415bbe2bacbe24cfee30d54b6aa03c5"}, + {file = "debugpy-1.8.19-cp311-cp311-macosx_15_0_universal2.whl", hash = "sha256:c5dcfa21de1f735a4f7ced4556339a109aa0f618d366ede9da0a3600f2516d8b"}, + {file = "debugpy-1.8.19-cp311-cp311-manylinux_2_34_x86_64.whl", hash = "sha256:806d6800246244004625d5222d7765874ab2d22f3ba5f615416cf1342d61c488"}, + {file = "debugpy-1.8.19-cp311-cp311-win32.whl", hash = "sha256:783a519e6dfb1f3cd773a9bda592f4887a65040cb0c7bd38dde410f4e53c40d4"}, + {file = "debugpy-1.8.19-cp311-cp311-win_amd64.whl", hash = "sha256:14035cbdbb1fe4b642babcdcb5935c2da3b1067ac211c5c5a8fdc0bb31adbcaa"}, + {file = "debugpy-1.8.19-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:bccb1540a49cde77edc7ce7d9d075c1dbeb2414751bc0048c7a11e1b597a4c2e"}, + {file = "debugpy-1.8.19-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:e9c68d9a382ec754dc05ed1d1b4ed5bd824b9f7c1a8cd1083adb84b3c93501de"}, + {file = "debugpy-1.8.19-cp312-cp312-win32.whl", hash = "sha256:6599cab8a783d1496ae9984c52cb13b7c4a3bd06a8e6c33446832a5d97ce0bee"}, + {file = "debugpy-1.8.19-cp312-cp312-win_amd64.whl", hash = "sha256:66e3d2fd8f2035a8f111eb127fa508469dfa40928a89b460b41fd988684dc83d"}, + {file = "debugpy-1.8.19-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:91e35db2672a0abaf325f4868fcac9c1674a0d9ad9bb8a8c849c03a5ebba3e6d"}, + {file = "debugpy-1.8.19-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:85016a73ab84dea1c1f1dcd88ec692993bcbe4532d1b49ecb5f3c688ae50c606"}, + {file = "debugpy-1.8.19-cp313-cp313-win32.whl", hash = "sha256:b605f17e89ba0ecee994391194285fada89cee111cfcd29d6f2ee11cbdc40976"}, + {file = "debugpy-1.8.19-cp313-cp313-win_amd64.whl", hash = "sha256:c30639998a9f9cd9699b4b621942c0179a6527f083c72351f95c6ab1728d5b73"}, + {file = "debugpy-1.8.19-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:1e8c4d1bd230067bf1bbcdbd6032e5a57068638eb28b9153d008ecde288152af"}, + {file = "debugpy-1.8.19-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:d40c016c1f538dbf1762936e3aeb43a89b965069d9f60f9e39d35d9d25e6b809"}, + {file = "debugpy-1.8.19-cp314-cp314-win32.whl", hash = "sha256:0601708223fe1cd0e27c6cce67a899d92c7d68e73690211e6788a4b0e1903f5b"}, + {file = "debugpy-1.8.19-cp314-cp314-win_amd64.whl", hash = "sha256:8e19a725f5d486f20e53a1dde2ab8bb2c9607c40c00a42ab646def962b41125f"}, + {file = "debugpy-1.8.19-cp38-cp38-macosx_15_0_x86_64.whl", hash = "sha256:d9b6f633fd2865af2afba2beb0c1819b6ecd4aed1c8f90f5d1bbca3272306b10"}, + {file = "debugpy-1.8.19-cp38-cp38-manylinux_2_34_x86_64.whl", hash = "sha256:a21bfdea088f713df05fa246ba0520f6ba44dd7eaec224742f51987a6979a648"}, + {file = "debugpy-1.8.19-cp38-cp38-win32.whl", hash = "sha256:b1cb98e5325da3059ca24445fca48314bfddfdf65ce1b59ff07055e723f06bd2"}, + {file = "debugpy-1.8.19-cp38-cp38-win_amd64.whl", hash = "sha256:c9b9bf440141a36836bdbe4320a2b126bb38aafa85e1aed05d7bfbb0e2a278bf"}, + {file = "debugpy-1.8.19-cp39-cp39-macosx_15_0_x86_64.whl", hash = "sha256:c047177ab2d286451f242b855b650d313198c4a987140d4b35218b2855a64a4a"}, + {file = "debugpy-1.8.19-cp39-cp39-manylinux_2_34_x86_64.whl", hash = "sha256:4468de0c30012d367944f0eab4ecb8371736e8ef9522a465f61214f344c11183"}, + {file = "debugpy-1.8.19-cp39-cp39-win32.whl", hash = "sha256:7b62c0f015120ede25e5124a5f9d8a424e1208e3d96a36c89958f046ee21fff6"}, + {file = "debugpy-1.8.19-cp39-cp39-win_amd64.whl", hash = "sha256:76f566baaf7f3e06adbe67ffedccd2ee911d1e486f55931939ce3f0fe1090774"}, + {file = "debugpy-1.8.19-py2.py3-none-any.whl", hash = "sha256:360ffd231a780abbc414ba0f005dad409e71c78637efe8f2bd75837132a41d38"}, + {file = "debugpy-1.8.19.tar.gz", hash = "sha256:eea7e5987445ab0b5ed258093722d5ecb8bb72217c5c9b1e21f64efe23ddebdb"}, ] [[package]] @@ -853,33 +982,33 @@ files = [ [[package]] name = "deprecated" -version = "1.2.18" +version = "1.3.1" description = "Python @deprecated decorator to deprecate old python classes, functions or methods." optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,>=2.7" groups = ["main", "demo"] files = [ - {file = "Deprecated-1.2.18-py2.py3-none-any.whl", hash = "sha256:bd5011788200372a32418f888e326a09ff80d0214bd961147cfed01b5c018eec"}, - {file = "deprecated-1.2.18.tar.gz", hash = "sha256:422b6f6d859da6f2ef57857761bfb392480502a64c3028ca9bbe86085d72115d"}, + {file = "deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f"}, + {file = "deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223"}, ] [package.dependencies] -wrapt = ">=1.10,<2" +wrapt = ">=1.10,<3" [package.extras] dev = ["PyTest", "PyTest-Cov", "bump2version (<1)", "setuptools ; python_version >= \"3.12\"", "tox"] [[package]] name = "exceptiongroup" -version = "1.3.0" +version = "1.3.1" description = "Backport of PEP 654 (exception groups)" optional = false python-versions = ">=3.7" groups = ["main", "demo", "dev"] markers = "python_version == \"3.10\"" files = [ - {file = "exceptiongroup-1.3.0-py3-none-any.whl", hash = "sha256:4d111e6e0c13d0644cad6ddaa7ed0261a0b36971f6d23e7ec9b4b9097da78a10"}, - {file = "exceptiongroup-1.3.0.tar.gz", hash = "sha256:b241f5885f560bc56a59ee63ca4c6a8bfa46ae4ad651af316d4e81817bb9fd88"}, + {file = "exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598"}, + {file = "exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219"}, ] [package.dependencies] @@ -890,14 +1019,14 @@ test = ["pytest (>=6)"] [[package]] name = "executing" -version = "2.2.0" +version = "2.2.1" description = "Get the currently executing AST node of a frame, and other information" optional = false python-versions = ">=3.8" groups = ["main", "demo", "dev"] files = [ - {file = "executing-2.2.0-py2.py3-none-any.whl", hash = "sha256:11387150cad388d62750327a53d3339fad4888b39a6fe233c3afbb54ecffd3aa"}, - {file = "executing-2.2.0.tar.gz", hash = "sha256:5d108c028108fe2551d1a7b2e8b713341e2cb4fc0aa7dcf966fa4327a5226755"}, + {file = "executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017"}, + {file = "executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4"}, ] [package.extras] @@ -905,14 +1034,14 @@ tests = ["asttokens (>=2.1.0)", "coverage", "coverage-enable-subprocess", "ipyth [[package]] name = "fastjsonschema" -version = "2.21.1" +version = "2.21.2" description = "Fastest Python implementation of JSON schema" optional = false python-versions = "*" groups = ["main", "demo"] files = [ - {file = "fastjsonschema-2.21.1-py3-none-any.whl", hash = "sha256:c9e5b7e908310918cf494a434eeb31384dd84a98b57a30bcb1f535015b554667"}, - {file = "fastjsonschema-2.21.1.tar.gz", hash = "sha256:794d4f0a58f848961ba16af7b9c85a3e88cd360df008c59aac6fc5ae9323b5d4"}, + {file = "fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463"}, + {file = "fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de"}, ] [package.extras] @@ -937,67 +1066,75 @@ pyflakes = ">=3.4.0,<3.5.0" [[package]] name = "fonttools" -version = "4.59.0" +version = "4.61.1" description = "Tools to manipulate font files" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "fonttools-4.59.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:524133c1be38445c5c0575eacea42dbd44374b310b1ffc4b60ff01d881fabb96"}, - {file = "fonttools-4.59.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:21e606b2d38fed938dde871c5736822dd6bda7a4631b92e509a1f5cd1b90c5df"}, - {file = "fonttools-4.59.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e93df708c69a193fc7987192f94df250f83f3851fda49413f02ba5dded639482"}, - {file = "fonttools-4.59.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:62224a9bb85b4b66d1b46d45cbe43d71cbf8f527d332b177e3b96191ffbc1e64"}, - {file = "fonttools-4.59.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:b8974b2a266b54c96709bd5e239979cddfd2dbceed331aa567ea1d7c4a2202db"}, - {file = "fonttools-4.59.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:209b75943d158f610b78320eacb5539aa9e920bee2c775445b2846c65d20e19d"}, - {file = "fonttools-4.59.0-cp310-cp310-win32.whl", hash = "sha256:4c908a7036f0f3677f8afa577bcd973e3e20ddd2f7c42a33208d18bee95cdb6f"}, - {file = "fonttools-4.59.0-cp310-cp310-win_amd64.whl", hash = "sha256:8b4309a2775e4feee7356e63b163969a215d663399cce1b3d3b65e7ec2d9680e"}, - {file = "fonttools-4.59.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:841b2186adce48903c0fef235421ae21549020eca942c1da773ac380b056ab3c"}, - {file = "fonttools-4.59.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9bcc1e77fbd1609198966ded6b2a9897bd6c6bcbd2287a2fc7d75f1a254179c5"}, - {file = "fonttools-4.59.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37c377f7cb2ab2eca8a0b319c68146d34a339792f9420fca6cd49cf28d370705"}, - {file = "fonttools-4.59.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fa39475eaccb98f9199eccfda4298abaf35ae0caec676ffc25b3a5e224044464"}, - {file = "fonttools-4.59.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d3972b13148c1d1fbc092b27678a33b3080d1ac0ca305742b0119b75f9e87e38"}, - {file = "fonttools-4.59.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a408c3c51358c89b29cfa5317cf11518b7ce5de1717abb55c5ae2d2921027de6"}, - {file = "fonttools-4.59.0-cp311-cp311-win32.whl", hash = "sha256:6770d7da00f358183d8fd5c4615436189e4f683bdb6affb02cad3d221d7bb757"}, - {file = "fonttools-4.59.0-cp311-cp311-win_amd64.whl", hash = "sha256:84fc186980231a287b28560d3123bd255d3c6b6659828c642b4cf961e2b923d0"}, - {file = "fonttools-4.59.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f9b3a78f69dcbd803cf2fb3f972779875b244c1115481dfbdd567b2c22b31f6b"}, - {file = "fonttools-4.59.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:57bb7e26928573ee7c6504f54c05860d867fd35e675769f3ce01b52af38d48e2"}, - {file = "fonttools-4.59.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:4536f2695fe5c1ffb528d84a35a7d3967e5558d2af58b4775e7ab1449d65767b"}, - {file = "fonttools-4.59.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:885bde7d26e5b40e15c47bd5def48b38cbd50830a65f98122a8fb90962af7cd1"}, - {file = "fonttools-4.59.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6801aeddb6acb2c42eafa45bc1cb98ba236871ae6f33f31e984670b749a8e58e"}, - {file = "fonttools-4.59.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:31003b6a10f70742a63126b80863ab48175fb8272a18ca0846c0482968f0588e"}, - {file = "fonttools-4.59.0-cp312-cp312-win32.whl", hash = "sha256:fbce6dae41b692a5973d0f2158f782b9ad05babc2c2019a970a1094a23909b1b"}, - {file = "fonttools-4.59.0-cp312-cp312-win_amd64.whl", hash = "sha256:332bfe685d1ac58ca8d62b8d6c71c2e52a6c64bc218dc8f7825c9ea51385aa01"}, - {file = "fonttools-4.59.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:78813b49d749e1bb4db1c57f2d4d7e6db22c253cb0a86ad819f5dc197710d4b2"}, - {file = "fonttools-4.59.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:401b1941ce37e78b8fd119b419b617277c65ae9417742a63282257434fd68ea2"}, - {file = "fonttools-4.59.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:efd7e6660674e234e29937bc1481dceb7e0336bfae75b856b4fb272b5093c5d4"}, - {file = "fonttools-4.59.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:51ab1ff33c19e336c02dee1e9fd1abd974a4ca3d8f7eef2a104d0816a241ce97"}, - {file = "fonttools-4.59.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a9bf8adc9e1f3012edc8f09b08336272aec0c55bc677422273e21280db748f7c"}, - {file = "fonttools-4.59.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:37e01c6ec0c98599778c2e688350d624fa4770fbd6144551bd5e032f1199171c"}, - {file = "fonttools-4.59.0-cp313-cp313-win32.whl", hash = "sha256:70d6b3ceaa9cc5a6ac52884f3b3d9544e8e231e95b23f138bdb78e6d4dc0eae3"}, - {file = "fonttools-4.59.0-cp313-cp313-win_amd64.whl", hash = "sha256:26731739daa23b872643f0e4072d5939960237d540c35c14e6a06d47d71ca8fe"}, - {file = "fonttools-4.59.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:8d77f92438daeaddc05682f0f3dac90c5b9829bcac75b57e8ce09cb67786073c"}, - {file = "fonttools-4.59.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:60f6665579e909b618282f3c14fa0b80570fbf1ee0e67678b9a9d43aa5d67a37"}, - {file = "fonttools-4.59.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:169b99a2553a227f7b5fea8d9ecd673aa258617f466b2abc6091fe4512a0dcd0"}, - {file = "fonttools-4.59.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:052444a5d0151878e87e3e512a1aa1a0ab35ee4c28afde0a778e23b0ace4a7de"}, - {file = "fonttools-4.59.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:d40dcf533ca481355aa7b682e9e079f766f35715defa4929aeb5597f9604272e"}, - {file = "fonttools-4.59.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:b818db35879d2edf7f46c7e729c700a0bce03b61b9412f5a7118406687cb151d"}, - {file = "fonttools-4.59.0-cp39-cp39-win32.whl", hash = "sha256:2e7cf8044ce2598bb87e44ba1d2c6e45d7a8decf56055b92906dc53f67c76d64"}, - {file = "fonttools-4.59.0-cp39-cp39-win_amd64.whl", hash = "sha256:902425f5afe28572d65d2bf9c33edd5265c612ff82c69e6f83ea13eafc0dcbea"}, - {file = "fonttools-4.59.0-py3-none-any.whl", hash = "sha256:241313683afd3baacb32a6bd124d0bce7404bc5280e12e291bae1b9bba28711d"}, - {file = "fonttools-4.59.0.tar.gz", hash = "sha256:be392ec3529e2f57faa28709d60723a763904f71a2b63aabe14fee6648fe3b14"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7c7db70d57e5e1089a274cbb2b1fd635c9a24de809a231b154965d415d6c6d24"}, + {file = "fonttools-4.61.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5fe9fd43882620017add5eabb781ebfbc6998ee49b35bd7f8f79af1f9f99a958"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8db08051fc9e7d8bc622f2112511b8107d8f27cd89e2f64ec45e9825e8288da"}, + {file = "fonttools-4.61.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a76d4cb80f41ba94a6691264be76435e5f72f2cb3cab0b092a6212855f71c2f6"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a13fc8aeb24bad755eea8f7f9d409438eb94e82cf86b08fe77a03fbc8f6a96b1"}, + {file = "fonttools-4.61.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b846a1fcf8beadeb9ea4f44ec5bdde393e2f1569e17d700bfc49cd69bde75881"}, + {file = "fonttools-4.61.1-cp310-cp310-win32.whl", hash = "sha256:78a7d3ab09dc47ac1a363a493e6112d8cabed7ba7caad5f54dbe2f08676d1b47"}, + {file = "fonttools-4.61.1-cp310-cp310-win_amd64.whl", hash = "sha256:eff1ac3cc66c2ac7cda1e64b4e2f3ffef474b7335f92fc3833fc632d595fcee6"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c6604b735bb12fef8e0efd5578c9fb5d3d8532d5001ea13a19cddf295673ee09"}, + {file = "fonttools-4.61.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5ce02f38a754f207f2f06557523cd39a06438ba3aafc0639c477ac409fc64e37"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:77efb033d8d7ff233385f30c62c7c79271c8885d5c9657d967ede124671bbdfb"}, + {file = "fonttools-4.61.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:75c1a6dfac6abd407634420c93864a1e274ebc1c7531346d9254c0d8f6ca00f9"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0de30bfe7745c0d1ffa2b0b7048fb7123ad0d71107e10ee090fa0b16b9452e87"}, + {file = "fonttools-4.61.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:58b0ee0ab5b1fc9921eccfe11d1435added19d6494dde14e323f25ad2bc30c56"}, + {file = "fonttools-4.61.1-cp311-cp311-win32.whl", hash = "sha256:f79b168428351d11e10c5aeb61a74e1851ec221081299f4cf56036a95431c43a"}, + {file = "fonttools-4.61.1-cp311-cp311-win_amd64.whl", hash = "sha256:fe2efccb324948a11dd09d22136fe2ac8a97d6c1347cf0b58a911dcd529f66b7"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:f3cb4a569029b9f291f88aafc927dd53683757e640081ca8c412781ea144565e"}, + {file = "fonttools-4.61.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41a7170d042e8c0024703ed13b71893519a1a6d6e18e933e3ec7507a2c26a4b2"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:10d88e55330e092940584774ee5e8a6971b01fc2f4d3466a1d6c158230880796"}, + {file = "fonttools-4.61.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:15acc09befd16a0fb8a8f62bc147e1a82817542d72184acca9ce6e0aeda9fa6d"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e6bcdf33aec38d16508ce61fd81838f24c83c90a1d1b8c68982857038673d6b8"}, + {file = "fonttools-4.61.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5fade934607a523614726119164ff621e8c30e8fa1ffffbbd358662056ba69f0"}, + {file = "fonttools-4.61.1-cp312-cp312-win32.whl", hash = "sha256:75da8f28eff26defba42c52986de97b22106cb8f26515b7c22443ebc9c2d3261"}, + {file = "fonttools-4.61.1-cp312-cp312-win_amd64.whl", hash = "sha256:497c31ce314219888c0e2fce5ad9178ca83fe5230b01a5006726cdf3ac9f24d9"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:8c56c488ab471628ff3bfa80964372fc13504ece601e0d97a78ee74126b2045c"}, + {file = "fonttools-4.61.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:dc492779501fa723b04d0ab1f5be046797fee17d27700476edc7ee9ae535a61e"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:64102ca87e84261419c3747a0d20f396eb024bdbeb04c2bfb37e2891f5fadcb5"}, + {file = "fonttools-4.61.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c1b526c8d3f615a7b1867f38a9410849c8f4aef078535742198e942fba0e9bd"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:41ed4b5ec103bd306bb68f81dc166e77409e5209443e5773cb4ed837bcc9b0d3"}, + {file = "fonttools-4.61.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:b501c862d4901792adaec7c25b1ecc749e2662543f68bb194c42ba18d6eec98d"}, + {file = "fonttools-4.61.1-cp313-cp313-win32.whl", hash = "sha256:4d7092bb38c53bbc78e9255a59158b150bcdc115a1e3b3ce0b5f267dc35dd63c"}, + {file = "fonttools-4.61.1-cp313-cp313-win_amd64.whl", hash = "sha256:21e7c8d76f62ab13c9472ccf74515ca5b9a761d1bde3265152a6dc58700d895b"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:fff4f534200a04b4a36e7ae3cb74493afe807b517a09e99cb4faa89a34ed6ecd"}, + {file = "fonttools-4.61.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:d9203500f7c63545b4ce3799319fe4d9feb1a1b89b28d3cb5abd11b9dd64147e"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:fa646ecec9528bef693415c79a86e733c70a4965dd938e9a226b0fc64c9d2e6c"}, + {file = "fonttools-4.61.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:11f35ad7805edba3aac1a3710d104592df59f4b957e30108ae0ba6c10b11dd75"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b931ae8f62db78861b0ff1ac017851764602288575d65b8e8ff1963fed419063"}, + {file = "fonttools-4.61.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b148b56f5de675ee16d45e769e69f87623a4944f7443850bf9a9376e628a89d2"}, + {file = "fonttools-4.61.1-cp314-cp314-win32.whl", hash = "sha256:9b666a475a65f4e839d3d10473fad6d47e0a9db14a2f4a224029c5bfde58ad2c"}, + {file = "fonttools-4.61.1-cp314-cp314-win_amd64.whl", hash = "sha256:4f5686e1fe5fce75d82d93c47a438a25bf0d1319d2843a926f741140b2b16e0c"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:e76ce097e3c57c4bcb67c5aa24a0ecdbd9f74ea9219997a707a4061fbe2707aa"}, + {file = "fonttools-4.61.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:9cfef3ab326780c04d6646f68d4b4742aae222e8b8ea1d627c74e38afcbc9d91"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a75c301f96db737e1c5ed5fd7d77d9c34466de16095a266509e13da09751bd19"}, + {file = "fonttools-4.61.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:91669ccac46bbc1d09e9273546181919064e8df73488ea087dcac3e2968df9ba"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:c33ab3ca9d3ccd581d58e989d67554e42d8d4ded94ab3ade3508455fe70e65f7"}, + {file = "fonttools-4.61.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:664c5a68ec406f6b1547946683008576ef8b38275608e1cee6c061828171c118"}, + {file = "fonttools-4.61.1-cp314-cp314t-win32.whl", hash = "sha256:aed04cabe26f30c1647ef0e8fbb207516fd40fe9472e9439695f5c6998e60ac5"}, + {file = "fonttools-4.61.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2180f14c141d2f0f3da43f3a81bc8aa4684860f6b0e6f9e165a4831f24e6a23b"}, + {file = "fonttools-4.61.1-py3-none-any.whl", hash = "sha256:17d2bf5d541add43822bcf0c43d7d847b160c9bb01d15d5007d84e2217aaa371"}, + {file = "fonttools-4.61.1.tar.gz", hash = "sha256:6675329885c44657f826ef01d9e4fb33b9158e9d93c537d84ad8399539bc6f69"}, ] [package.extras] -all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.23.0)", "unicodedata2 (>=15.1.0) ; python_version <= \"3.12\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] +all = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "lxml (>=4.0)", "lz4 (>=1.7.4.2)", "matplotlib", "munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\"", "skia-pathops (>=0.5.0)", "sympy", "uharfbuzz (>=0.45.0)", "unicodedata2 (>=17.0.0) ; python_version <= \"3.14\"", "xattr ; sys_platform == \"darwin\"", "zopfli (>=0.1.4)"] graphite = ["lz4 (>=1.7.4.2)"] interpolatable = ["munkres ; platform_python_implementation == \"PyPy\"", "pycairo", "scipy ; platform_python_implementation != \"PyPy\""] lxml = ["lxml (>=4.0)"] pathops = ["skia-pathops (>=0.5.0)"] plot = ["matplotlib"] -repacker = ["uharfbuzz (>=0.23.0)"] +repacker = ["uharfbuzz (>=0.45.0)"] symfont = ["sympy"] type1 = ["xattr ; sys_platform == \"darwin\""] -unicode = ["unicodedata2 (>=15.1.0) ; python_version <= \"3.12\""] +unicode = ["unicodedata2 (>=17.0.0) ; python_version <= \"3.14\""] woff = ["brotli (>=1.0.1) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\"", "zopfli (>=0.1.4)"] [[package]] @@ -1007,11 +1144,61 @@ description = "Validate fully-qualified domain names compliant to RFC 1035 and t optional = false python-versions = "*" groups = ["main", "demo"] +markers = "python_version >= \"3.14\"" files = [ {file = "fqdn-1.4.0-py3-none-any.whl", hash = "sha256:e935616ae81c9c60a22267593fe8e6af68cecc68549cc71bb9bfbcbbcb383386"}, {file = "fqdn-1.4.0.tar.gz", hash = "sha256:30e8f2e685ce87cdace4712fd97c5d09f5e6fa519bbb66e8f188f6a7cb3a5c4e"}, ] +[[package]] +name = "fqdn" +version = "1.5.1" +description = "Validates fully-qualified domain names against RFC 1123, so that they are acceptable to modern bowsers" +optional = false +python-versions = ">=2.7, !=3.0, !=3.1, !=3.2, !=3.3, !=3.4, <4" +groups = ["main", "demo"] +markers = "python_version < \"3.14\"" +files = [ + {file = "fqdn-1.5.1-py3-none-any.whl", hash = "sha256:3a179af3761e4df6eb2e026ff9e1a3033d3587bf980a0b1b2e1e5d08d7358014"}, + {file = "fqdn-1.5.1.tar.gz", hash = "sha256:105ed3677e767fb5ca086a0c1f4bb66ebc3c100be518f0e0d755d9eae164d89f"}, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +description = "Copy your docs directly to the gh-pages branch." +optional = false +python-versions = "*" +groups = ["docs"] +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 = "griffe" +version = "1.15.0" +description = "Signatures for entire Python programs. Extract the structure, the frame, the skeleton of your project, to generate API documentation or find breaking changes in your API." +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "griffe-1.15.0-py3-none-any.whl", hash = "sha256:6f6762661949411031f5fcda9593f586e6ce8340f0ba88921a0f2ef7a81eb9a3"}, + {file = "griffe-1.15.0.tar.gz", hash = "sha256:7726e3afd6f298fbc3696e67958803e7ac843c1cfe59734b6251a40cdbfb5eea"}, +] + +[package.dependencies] +colorama = ">=0.4" + +[package.extras] +pypi = ["pip (>=24.0)", "platformdirs (>=4.2)", "wheel (>=0.42)"] + [[package]] name = "h11" version = "0.16.0" @@ -1121,14 +1308,14 @@ zstd = ["zstandard (>=0.18.0)"] [[package]] name = "idna" -version = "3.10" +version = "3.11" description = "Internationalized Domain Names in Applications (IDNA)" optional = false -python-versions = ">=3.6" -groups = ["main", "demo"] +python-versions = ">=3.8" +groups = ["main", "demo", "docs"] files = [ - {file = "idna-3.10-py3-none-any.whl", hash = "sha256:946d195a0d259cbba61165e88e65941f16e9b36ea6ddb97f00452bae8b1287d3"}, - {file = "idna-3.10.tar.gz", hash = "sha256:12f65c9b470abda6dc35cf8e63cc574b1c52b11df2c86030af0ac09b01b13ea9"}, + {file = "idna-3.11-py3-none-any.whl", hash = "sha256:771a87f49d9defaf64091e6e6fe9c18d4833f140bd19464795bc32d966ca37ea"}, + {file = "idna-3.11.tar.gz", hash = "sha256:795dafcc9c04ed0c1fb032c2aa73654d8e8c5023a7df64a53f39190ada629902"}, ] [package.extras] @@ -1136,14 +1323,14 @@ all = ["flake8 (>=7.1.1)", "mypy (>=1.11.2)", "pytest (>=8.3.2)", "ruff (>=0.6.2 [[package]] name = "imageio" -version = "2.37.0" -description = "Library for reading and writing a wide range of image, video, scientific, and volumetric data formats." +version = "2.37.2" +description = "Read and write images and video across all major formats. Supports scientific and volumetric data." optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "imageio-2.37.0-py3-none-any.whl", hash = "sha256:11efa15b87bc7871b61590326b2d635439acc321cf7f8ce996f812543ce10eed"}, - {file = "imageio-2.37.0.tar.gz", hash = "sha256:71b57b3669666272c818497aebba2b4c5f20d5b37c81720e5e1a56d59c492996"}, + {file = "imageio-2.37.2-py3-none-any.whl", hash = "sha256:ad9adfb20335d718c03de457358ed69f141021a333c40a53e57273d8a5bd0b9b"}, + {file = "imageio-2.37.2.tar.gz", hash = "sha256:0212ef2727ac9caa5ca4b2c75ae89454312f440a756fcfc8ef1993e718f50f8a"}, ] [package.dependencies] @@ -1151,14 +1338,14 @@ numpy = "*" pillow = ">=8.3.2" [package.extras] -all-plugins = ["astropy", "av", "imageio-ffmpeg", "numpy (>2)", "pillow-heif", "psutil", "rawpy", "tifffile"] -all-plugins-pypy = ["av", "imageio-ffmpeg", "pillow-heif", "psutil", "tifffile"] -build = ["wheel"] +all-plugins = ["astropy", "av", "fsspec[http]", "imageio-ffmpeg", "numpy (>2)", "pillow-heif", "psutil", "rawpy", "tifffile"] +all-plugins-pypy = ["fsspec[http]", "imageio-ffmpeg", "pillow-heif", "psutil", "tifffile"] dev = ["black", "flake8", "fsspec[github]", "pytest", "pytest-cov"] docs = ["numpydoc", "pydata-sphinx-theme", "sphinx (<6)"] ffmpeg = ["imageio-ffmpeg", "psutil"] fits = ["astropy"] -full = ["astropy", "av", "black", "flake8", "fsspec[github]", "gdal", "imageio-ffmpeg", "itk", "numpy (>2)", "numpydoc", "pillow-heif", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "rawpy", "sphinx (<6)", "tifffile", "wheel"] +freeimage = ["fsspec[http]"] +full = ["astropy", "av", "black", "flake8", "fsspec[github,http]", "imageio-ffmpeg", "numpy (>2)", "numpydoc", "pillow-heif", "psutil", "pydata-sphinx-theme", "pytest", "pytest-cov", "rawpy", "sphinx (<6)", "tifffile"] gdal = ["gdal"] itk = ["itk"] linting = ["black", "flake8"] @@ -1170,26 +1357,26 @@ tifffile = ["tifffile"] [[package]] name = "iniconfig" -version = "2.1.0" +version = "2.3.0" description = "brain-dead simple config-ini parsing" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["dev"] files = [ - {file = "iniconfig-2.1.0-py3-none-any.whl", hash = "sha256:9deba5723312380e77435581c6bf4935c94cbfab9b1ed33ef8d238ea168eb760"}, - {file = "iniconfig-2.1.0.tar.gz", hash = "sha256:3abbd2e30b36733fee78f9c7f7308f2d0050e88f0087fd25c2645f63c773e1c7"}, + {file = "iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12"}, + {file = "iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730"}, ] [[package]] name = "ipykernel" -version = "6.30.0" +version = "7.1.0" description = "IPython Kernel for Jupyter" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "ipykernel-6.30.0-py3-none-any.whl", hash = "sha256:fd2936e55c4a1c2ee8b1e5fa6a372b8eecc0ab1338750dee76f48fa5cca1301e"}, - {file = "ipykernel-6.30.0.tar.gz", hash = "sha256:b7b808ddb2d261aae2df3a26ff3ff810046e6de3dfbc6f7de8c98ea0a6cb632c"}, + {file = "ipykernel-7.1.0-py3-none-any.whl", hash = "sha256:763b5ec6c5b7776f6a8d7ce09b267693b4e5ce75cb50ae696aaefb3c85e1ea4c"}, + {file = "ipykernel-7.1.0.tar.gz", hash = "sha256:58a3fc88533d5930c3546dc7eac66c6d288acde4f801e2001e65edc5dc9cf0db"}, ] [package.dependencies] @@ -1209,7 +1396,7 @@ traitlets = ">=5.4.0" [package.extras] cov = ["coverage[toml]", "matplotlib", "pytest-cov", "trio"] -docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] +docs = ["intersphinx-registry", "myst-parser", "pydata-sphinx-theme", "sphinx (<8.2.0)", "sphinx-autodoc-typehints", "sphinxcontrib-github-alt", "sphinxcontrib-spelling", "trio"] pyqt5 = ["pyqt5"] pyside6 = ["pyside6"] test = ["flaky", "ipyparallel", "pre-commit", "pytest (>=7.0,<9)", "pytest-asyncio (>=0.23.5)", "pytest-cov", "pytest-timeout"] @@ -1221,6 +1408,7 @@ description = "IPython: Productive Interactive Computing" optional = false python-versions = ">=3.10" groups = ["main", "demo", "dev"] +markers = "python_version == \"3.10\"" files = [ {file = "ipython-8.37.0-py3-none-any.whl", hash = "sha256:ed87326596b878932dbcb171e3e698845434d8c61b8d8cd474bf663041a9dcf2"}, {file = "ipython-8.37.0.tar.gz", hash = "sha256:ca815841e1a41a1e6b73a0b08f3038af9b2252564d01fc405356d34033012216"}, @@ -1253,6 +1441,56 @@ qtconsole = ["qtconsole"] test = ["packaging", "pickleshare", "pytest", "pytest-asyncio (<0.22)", "testpath"] test-extra = ["curio", "ipython[test]", "jupyter_ai", "matplotlib (!=3.2.0)", "nbformat", "numpy (>=1.23)", "pandas", "trio"] +[[package]] +name = "ipython" +version = "9.8.0" +description = "IPython: Productive Interactive Computing" +optional = false +python-versions = ">=3.11" +groups = ["main", "demo", "dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython-9.8.0-py3-none-any.whl", hash = "sha256:ebe6d1d58d7d988fbf23ff8ff6d8e1622cfdb194daf4b7b73b792c4ec3b85385"}, + {file = "ipython-9.8.0.tar.gz", hash = "sha256:8e4ce129a627eb9dd221c41b1d2cdaed4ef7c9da8c17c63f6f578fe231141f83"}, +] + +[package.dependencies] +colorama = {version = ">=0.4.4", markers = "sys_platform == \"win32\""} +decorator = ">=4.3.2" +ipython-pygments-lexers = ">=1.0.0" +jedi = ">=0.18.1" +matplotlib-inline = ">=0.1.5" +pexpect = {version = ">4.3", markers = "sys_platform != \"win32\" and sys_platform != \"emscripten\""} +prompt_toolkit = ">=3.0.41,<3.1.0" +pygments = ">=2.11.0" +stack_data = ">=0.6.0" +traitlets = ">=5.13.0" +typing_extensions = {version = ">=4.6", markers = "python_version < \"3.12\""} + +[package.extras] +all = ["ipython[doc,matplotlib,test,test-extra]"] +black = ["black"] +doc = ["docrepr", "exceptiongroup", "intersphinx_registry", "ipykernel", "ipython[matplotlib,test]", "setuptools (>=70.0)", "sphinx (>=8.0)", "sphinx-rtd-theme (>=0.1.8)", "sphinx_toml (==0.0.4)", "typing_extensions"] +matplotlib = ["matplotlib (>3.9)"] +test = ["packaging (>=20.1.0)", "pytest (>=7.0.0)", "pytest-asyncio (>=1.0.0)", "setuptools (>=61.2)", "testpath (>=0.2)"] +test-extra = ["curio", "ipykernel (>6.30)", "ipython[matplotlib]", "ipython[test]", "jupyter_ai", "nbclient", "nbformat", "numpy (>=1.27)", "pandas (>2.1)", "trio (>=0.1.0)"] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +description = "Defines a variety of Pygments lexers for highlighting IPython code." +optional = false +python-versions = ">=3.8" +groups = ["main", "demo", "dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c"}, + {file = "ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81"}, +] + +[package.dependencies] +pygments = "*" + [[package]] name = "isoduration" version = "20.11.0" @@ -1294,7 +1532,7 @@ version = "3.1.6" description = "A very fast and expressive template engine." optional = false python-versions = ">=3.7" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] files = [ {file = "jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67"}, {file = "jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d"}, @@ -1308,26 +1546,26 @@ i18n = ["Babel (>=2.7)"] [[package]] name = "joblib" -version = "1.5.1" +version = "1.5.3" description = "Lightweight pipelining with Python functions" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "joblib-1.5.1-py3-none-any.whl", hash = "sha256:4719a31f054c7d766948dcd83e9613686b27114f190f717cec7eaa2084f8a74a"}, - {file = "joblib-1.5.1.tar.gz", hash = "sha256:f4f86e351f39fe3d0d32a9f2c3d8af1ee4cec285aafcb27003dda5205576b444"}, + {file = "joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713"}, + {file = "joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3"}, ] [[package]] name = "json5" -version = "0.12.0" +version = "0.12.1" description = "A Python implementation of the JSON5 data format." optional = false python-versions = ">=3.8.0" groups = ["main", "demo"] files = [ - {file = "json5-0.12.0-py3-none-any.whl", hash = "sha256:6d37aa6c08b0609f16e1ec5ff94697e2cbbfbad5ac112afa05794da9ab7810db"}, - {file = "json5-0.12.0.tar.gz", hash = "sha256:0b4b6ff56801a1c7dc817b0241bca4ce474a0e6a163bfef3fc594d3fd263ff3a"}, + {file = "json5-0.12.1-py3-none-any.whl", hash = "sha256:d9c9b3bc34a5f54d43c35e11ef7cb87d8bdd098c6ace87117a7b7e83e705c1d5"}, + {file = "json5-0.12.1.tar.gz", hash = "sha256:b2743e77b3242f8d03c143dd975a6ec7c52e2f2afe76ed934e53503dd4ad4990"}, ] [package.extras] @@ -1347,14 +1585,14 @@ files = [ [[package]] name = "jsonschema" -version = "4.25.0" +version = "4.25.1" description = "An implementation of JSON Schema validation for Python" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "jsonschema-4.25.0-py3-none-any.whl", hash = "sha256:24c2e8da302de79c8b9382fee3e76b355e44d2a4364bb207159ce10b517bd716"}, - {file = "jsonschema-4.25.0.tar.gz", hash = "sha256:e63acf5c11762c0e6672ffb61482bdf57f0876684d8d249c0fe2d730d48bc55f"}, + {file = "jsonschema-4.25.1-py3-none-any.whl", hash = "sha256:3fba0169e345c7175110351d456342c364814cfcf3b964ba4587f22915230a63"}, + {file = "jsonschema-4.25.1.tar.gz", hash = "sha256:e4a9655ce0da0c0b67a085847e00a3a51449e1157f4f75e9fb5aa545e122eb85"}, ] [package.dependencies] @@ -1378,14 +1616,14 @@ format-nongpl = ["fqdn", "idna", "isoduration", "jsonpointer (>1.13)", "rfc3339- [[package]] name = "jsonschema-specifications" -version = "2025.4.1" +version = "2025.9.1" description = "The JSON Schema meta-schemas and vocabularies, exposed as a Registry" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "jsonschema_specifications-2025.4.1-py3-none-any.whl", hash = "sha256:4653bffbd6584f7de83a67e0d620ef16900b390ddc7939d56684d6c81e33f1af"}, - {file = "jsonschema_specifications-2025.4.1.tar.gz", hash = "sha256:630159c9f4dbea161a6a2205c3011cc4f18ff381b189fff48bb39b9bf26ae608"}, + {file = "jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe"}, + {file = "jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d"}, ] [package.dependencies] @@ -1393,42 +1631,41 @@ referencing = ">=0.31.0" [[package]] name = "jupyter-client" -version = "8.6.3" +version = "8.7.0" description = "Jupyter protocol implementation and client libraries" optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "jupyter_client-8.6.3-py3-none-any.whl", hash = "sha256:e8a19cc986cc45905ac3362915f410f3af85424b4c0905e94fa5f2cb08e8f23f"}, - {file = "jupyter_client-8.6.3.tar.gz", hash = "sha256:35b3a0947c4a6e9d589eb97d7d4cd5e90f910ee73101611f01283732bd6d9419"}, + {file = "jupyter_client-8.7.0-py3-none-any.whl", hash = "sha256:3671a94fd25e62f5f2f554f5e95389c2294d89822378a5f2dd24353e1494a9e0"}, + {file = "jupyter_client-8.7.0.tar.gz", hash = "sha256:3357212d9cbe01209e59190f67a3a7e1f387a4f4e88d1e0433ad84d7b262531d"}, ] [package.dependencies] -jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" +jupyter-core = ">=5.1" python-dateutil = ">=2.8.2" -pyzmq = ">=23.0" -tornado = ">=6.2" +pyzmq = ">=25.0" +tornado = ">=6.4.1" 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 ; sys_platform == \"win32\"", "pre-commit", "pytest (<8.2.0)", "pytest-cov", "pytest-jupyter[client] (>=0.4.1)", "pytest-timeout"] +test = ["anyio", "coverage", "ipykernel (>=6.14)", "mypy", "paramiko ; sys_platform == \"win32\"", "pre-commit", "pytest", "pytest-cov", "pytest-jupyter[client] (>=0.6.2)", "pytest-timeout"] [[package]] name = "jupyter-core" -version = "5.8.1" +version = "5.9.1" description = "Jupyter core package. A base package on which Jupyter projects rely." optional = false -python-versions = ">=3.8" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "jupyter_core-5.8.1-py3-none-any.whl", hash = "sha256:c28d268fc90fb53f1338ded2eb410704c5449a358406e8a948b75706e24863d0"}, - {file = "jupyter_core-5.8.1.tar.gz", hash = "sha256:0a5f9706f70e64786b75acba995988915ebd4601c8a52e534a40b51c95f59941"}, + {file = "jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407"}, + {file = "jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508"}, ] [package.dependencies] platformdirs = ">=2.5" -pywin32 = {version = ">=300", markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\""} traitlets = ">=5.3" [package.extras] @@ -1464,14 +1701,14 @@ test = ["click", "pre-commit", "pytest (>=7.0)", "pytest-asyncio (>=0.19.0)", "p [[package]] name = "jupyter-lsp" -version = "2.2.6" +version = "2.3.0" description = "Multi-Language Server WebSocket proxy for Jupyter Notebook/Lab server" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "jupyter_lsp-2.2.6-py3-none-any.whl", hash = "sha256:283783752bf0b459ee7fa88effa72104d87dd343b82d5c06cf113ef755b15b6d"}, - {file = "jupyter_lsp-2.2.6.tar.gz", hash = "sha256:0566bd9bb04fd9e6774a937ed01522b555ba78be37bebef787c8ab22de4c0361"}, + {file = "jupyter_lsp-2.3.0-py3-none-any.whl", hash = "sha256:e914a3cb2addf48b1c7710914771aaf1819d46b2e5a79b0f917b5478ec93f34f"}, + {file = "jupyter_lsp-2.3.0.tar.gz", hash = "sha256:458aa59339dc868fb784d73364f17dbce8836e906cd75fd471a325cba02e0245"}, ] [package.dependencies] @@ -1479,14 +1716,14 @@ jupyter_server = ">=1.1.2" [[package]] name = "jupyter-server" -version = "2.16.0" +version = "2.17.0" description = "The backend—i.e. core services, APIs, and REST endpoints—to Jupyter web applications." optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "jupyter_server-2.16.0-py3-none-any.whl", hash = "sha256:3d8db5be3bc64403b1c65b400a1d7f4647a5ce743f3b20dbdefe8ddb7b55af9e"}, - {file = "jupyter_server-2.16.0.tar.gz", hash = "sha256:65d4b44fdf2dcbbdfe0aa1ace4a842d4aaf746a2b7b168134d5aaed35621b7f6"}, + {file = "jupyter_server-2.17.0-py3-none-any.whl", hash = "sha256:e8cb9c7db4251f51ed307e329b81b72ccf2056ff82d50524debde1ee1870e13f"}, + {file = "jupyter_server-2.17.0.tar.gz", hash = "sha256:c38ea898566964c888b4772ae1ed58eca84592e88251d2cfc4d171f81f7e99d5"}, ] [package.dependencies] @@ -1499,7 +1736,7 @@ jupyter-events = ">=0.11.0" jupyter-server-terminals = ">=0.4.4" nbconvert = ">=6.4.4" nbformat = ">=5.3.0" -overrides = ">=5.0" +overrides = {version = ">=5.0", markers = "python_version < \"3.12\""} packaging = ">=22.0" prometheus-client = ">=0.9" pywinpty = {version = ">=2.0.1", markers = "os_name == \"nt\""} @@ -1536,25 +1773,25 @@ test = ["jupyter-server (>=2.0.0)", "pytest (>=7.0)", "pytest-jupyter[server] (> [[package]] name = "jupyterlab" -version = "4.4.5" +version = "4.5.1" description = "JupyterLab computational environment" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "jupyterlab-4.4.5-py3-none-any.whl", hash = "sha256:e76244cceb2d1fb4a99341f3edc866f2a13a9e14c50368d730d75d8017be0863"}, - {file = "jupyterlab-4.4.5.tar.gz", hash = "sha256:0bd6c18e6a3c3d91388af6540afa3d0bb0b2e76287a7b88ddf20ab41b336e595"}, + {file = "jupyterlab-4.5.1-py3-none-any.whl", hash = "sha256:31b059de96de0754ff1f2ce6279774b6aab8c34d7082e9752db58207c99bd514"}, + {file = "jupyterlab-4.5.1.tar.gz", hash = "sha256:09da1ddfbd9eec18b5101dbb8515612aa1e47443321fb99503725a88e93d20d9"}, ] [package.dependencies] async-lru = ">=1.0.0" -httpx = ">=0.25.0" -ipykernel = ">=6.5.0" +httpx = ">=0.25.0,<1" +ipykernel = ">=6.5.0,<6.30.0 || >6.30.0" jinja2 = ">=3.0.3" jupyter-core = "*" jupyter-lsp = ">=2.0.0" jupyter-server = ">=2.4.0,<3" -jupyterlab-server = ">=2.27.1,<3" +jupyterlab-server = ">=2.28.0,<3" notebook-shim = ">=0.2" packaging = "*" setuptools = ">=41.1.0" @@ -1563,9 +1800,9 @@ tornado = ">=6.2.0" traitlets = "*" [package.extras] -dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.4)"] +dev = ["build", "bump2version", "coverage", "hatch", "pre-commit", "pytest-cov", "ruff (==0.11.12)"] docs = ["jsx-lexer", "myst-parser", "pydata-sphinx-theme (>=0.13.0)", "pytest", "pytest-check-links", "pytest-jupyter", "sphinx (>=1.8,<8.2.0)", "sphinx-copybutton"] -docs-screenshots = ["altair (==5.5.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)", "vega-datasets (==0.9.0)"] +docs-screenshots = ["altair (==6.0.0)", "ipython (==8.16.1)", "ipywidgets (==8.1.5)", "jupyterlab-geojson (==3.4.0)", "jupyterlab-language-pack-zh-cn (==4.3.post1)", "matplotlib (==3.10.0)", "nbconvert (>=7.0.0)", "pandas (==2.2.3)", "scipy (==1.15.1)"] test = ["coverage", "pytest (>=7.0)", "pytest-check-links (>=0.7)", "pytest-console-scripts", "pytest-cov", "pytest-jupyter (>=0.5.3)", "pytest-timeout", "pytest-tornasync", "requests", "requests-cache", "virtualenv"] upgrade-extension = ["copier (>=9,<10)", "jinja2-time (<0.3)", "pydantic (<3.0)", "pyyaml-include (<3.0)", "tomli-w (<2.0)"] @@ -1583,14 +1820,14 @@ files = [ [[package]] name = "jupyterlab-server" -version = "2.27.3" +version = "2.28.0" description = "A set of server components for JupyterLab and JupyterLab like applications." optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "jupyterlab_server-2.27.3-py3-none-any.whl", hash = "sha256:e697488f66c3db49df675158a77b3b017520d772c6e1548c7d9bcc5df7944ee4"}, - {file = "jupyterlab_server-2.27.3.tar.gz", hash = "sha256:eb36caca59e74471988f0ae25c77945610b887f777255aa21f8065def9e51ed4"}, + {file = "jupyterlab_server-2.28.0-py3-none-any.whl", hash = "sha256:e4355b148fdcf34d312bbbc80f22467d6d20460e8b8736bf235577dd18506968"}, + {file = "jupyterlab_server-2.28.0.tar.gz", hash = "sha256:35baa81898b15f93573e2deca50d11ac0ae407ebb688299d3a5213265033712c"}, ] [package.dependencies] @@ -1609,104 +1846,125 @@ test = ["hatch", "ipykernel", "openapi-core (>=0.18.0,<0.19.0)", "openapi-spec-v [[package]] name = "kiwisolver" -version = "1.4.8" +version = "1.4.9" description = "A fast implementation of the Cassowary constraint solver" optional = false python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:88c6f252f6816a73b1f8c904f7bbe02fd67c09a69f7cb8a0eecdbf5ce78e63db"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c72941acb7b67138f35b879bbe85be0f6c6a70cab78fe3ef6db9c024d9223e5b"}, - {file = "kiwisolver-1.4.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce2cf1e5688edcb727fdf7cd1bbd0b6416758996826a8be1d958f91880d0809d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_i686.manylinux2010_i686.whl", hash = "sha256:c8bf637892dc6e6aad2bc6d4d69d08764166e5e3f69d469e55427b6ac001b19d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:034d2c891f76bd3edbdb3ea11140d8510dca675443da7304205a2eaa45d8334c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d47b28d1dfe0793d5e96bce90835e17edf9a499b53969b03c6c47ea5985844c3"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:eb158fe28ca0c29f2260cca8c43005329ad58452c36f0edf298204de32a9a3ed"}, - {file = "kiwisolver-1.4.8-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d5536185fce131780ebd809f8e623bf4030ce1b161353166c49a3c74c287897f"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:369b75d40abedc1da2c1f4de13f3482cb99e3237b38726710f4a793432b1c5ff"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:641f2ddf9358c80faa22e22eb4c9f54bd3f0e442e038728f500e3b978d00aa7d"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:d561d2d8883e0819445cfe58d7ddd673e4015c3c57261d7bdcd3710d0d14005c"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:1732e065704b47c9afca7ffa272f845300a4eb959276bf6970dc07265e73b605"}, - {file = "kiwisolver-1.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:bcb1ebc3547619c3b58a39e2448af089ea2ef44b37988caf432447374941574e"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:89c107041f7b27844179ea9c85d6da275aa55ecf28413e87624d033cf1f6b751"}, - {file = "kiwisolver-1.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:b5773efa2be9eb9fcf5415ea3ab70fc785d598729fd6057bea38d539ead28271"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a4d3601908c560bdf880f07d94f31d734afd1bb71e96585cace0e38ef44c6d84"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:856b269c4d28a5c0d5e6c1955ec36ebfd1651ac00e1ce0afa3e28da95293b561"}, - {file = "kiwisolver-1.4.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c2b9a96e0f326205af81a15718a9073328df1173a2619a68553decb7097fd5d7"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c5020c83e8553f770cb3b5fc13faac40f17e0b205bd237aebd21d53d733adb03"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:dace81d28c787956bfbfbbfd72fdcef014f37d9b48830829e488fdb32b49d954"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11e1022b524bd48ae56c9b4f9296bce77e15a2e42a502cceba602f804b32bb79"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3b9b4d2892fefc886f30301cdd80debd8bb01ecdf165a449eb6e78f79f0fabd6"}, - {file = "kiwisolver-1.4.8-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3a96c0e790ee875d65e340ab383700e2b4891677b7fcd30a699146f9384a2bb0"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:23454ff084b07ac54ca8be535f4174170c1094a4cff78fbae4f73a4bcc0d4dab"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:87b287251ad6488e95b4f0b4a79a6d04d3ea35fde6340eb38fbd1ca9cd35bbbc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b21dbe165081142b1232a240fc6383fd32cdd877ca6cc89eab93e5f5883e1c25"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:768cade2c2df13db52475bd28d3a3fac8c9eff04b0e9e2fda0f3760f20b3f7fc"}, - {file = "kiwisolver-1.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d47cfb2650f0e103d4bf68b0b5804c68da97272c84bb12850d877a95c056bd67"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:ed33ca2002a779a2e20eeb06aea7721b6e47f2d4b8a8ece979d8ba9e2a167e34"}, - {file = "kiwisolver-1.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:16523b40aab60426ffdebe33ac374457cf62863e330a90a0383639ce14bf44b2"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d6af5e8815fd02997cb6ad9bbed0ee1e60014438ee1a5c2444c96f87b8843502"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bade438f86e21d91e0cf5dd7c0ed00cda0f77c8c1616bd83f9fc157fa6760d31"}, - {file = "kiwisolver-1.4.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b83dc6769ddbc57613280118fb4ce3cd08899cc3369f7d0e0fab518a7cf37fdb"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:111793b232842991be367ed828076b03d96202c19221b5ebab421ce8bcad016f"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:257af1622860e51b1a9d0ce387bf5c2c4f36a90594cb9514f55b074bcc787cfc"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b5637c3f316cab1ec1c9a12b8c5f4750a4c4b71af9157645bf32830e39c03a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:782bb86f245ec18009890e7cb8d13a5ef54dcf2ebe18ed65f795e635a96a1c6a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc978a80a0db3a66d25767b03688f1147a69e6237175c0f4ffffaaedf744055a"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:36dbbfd34838500a31f52c9786990d00150860e46cd5041386f217101350f0d3"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:eaa973f1e05131de5ff3569bbba7f5fd07ea0595d3870ed4a526d486fe57fa1b"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a66f60f8d0c87ab7f59b6fb80e642ebb29fec354a4dfad687ca4092ae69d04f4"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858416b7fb777a53f0c59ca08190ce24e9abbd3cffa18886a5781b8e3e26f65d"}, - {file = "kiwisolver-1.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:085940635c62697391baafaaeabdf3dd7a6c3643577dde337f4d66eba021b2b8"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:01c3d31902c7db5fb6182832713d3b4122ad9317c2c5877d0539227d96bb2e50"}, - {file = "kiwisolver-1.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:a3c44cb68861de93f0c4a8175fbaa691f0aa22550c331fefef02b618a9dcb476"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:1c8ceb754339793c24aee1c9fb2485b5b1f5bb1c2c214ff13368431e51fc9a09"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:54a62808ac74b5e55a04a408cda6156f986cefbcf0ada13572696b507cc92fa1"}, - {file = "kiwisolver-1.4.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:68269e60ee4929893aad82666821aaacbd455284124817af45c11e50a4b42e3c"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:34d142fba9c464bc3bbfeff15c96eab0e7310343d6aefb62a79d51421fcc5f1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3ddc373e0eef45b59197de815b1b28ef89ae3955e7722cc9710fb91cd77b7f47"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:77e6f57a20b9bd4e1e2cedda4d0b986ebd0216236f0106e55c28aea3d3d69b16"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:08e77738ed7538f036cd1170cbed942ef749137b1311fa2bbe2a7fda2f6bf3cc"}, - {file = "kiwisolver-1.4.8-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a5ce1e481a74b44dd5e92ff03ea0cb371ae7a0268318e202be06c8f04f4f1246"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fc2ace710ba7c1dfd1a3b42530b62b9ceed115f19a1656adefce7b1782a37794"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:3452046c37c7692bd52b0e752b87954ef86ee2224e624ef7ce6cb21e8c41cc1b"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:7e9a60b50fe8b2ec6f448fe8d81b07e40141bfced7f896309df271a0b92f80f3"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:918139571133f366e8362fa4a297aeba86c7816b7ecf0bc79168080e2bd79957"}, - {file = "kiwisolver-1.4.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e063ef9f89885a1d68dd8b2e18f5ead48653176d10a0e324e3b0030e3a69adeb"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_amd64.whl", hash = "sha256:a17b7c4f5b2c51bb68ed379defd608a03954a1845dfed7cc0117f1cc8a9b7fd2"}, - {file = "kiwisolver-1.4.8-cp313-cp313-win_arm64.whl", hash = "sha256:3cd3bc628b25f74aedc6d374d5babf0166a92ff1317f46267f12d2ed54bc1d30"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:370fd2df41660ed4e26b8c9d6bbcad668fbe2560462cba151a721d49e5b6628c"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:84a2f830d42707de1d191b9490ac186bf7997a9495d4e9072210a1296345f7dc"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:7a3ad337add5148cf51ce0b55642dc551c0b9d6248458a757f98796ca7348712"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7506488470f41169b86d8c9aeff587293f530a23a23a49d6bc64dab66bedc71e"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2f0121b07b356a22fb0414cec4666bbe36fd6d0d759db3d37228f496ed67c880"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d6d6bd87df62c27d4185de7c511c6248040afae67028a8a22012b010bc7ad062"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:291331973c64bb9cce50bbe871fb2e675c4331dab4f31abe89f175ad7679a4d7"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:893f5525bb92d3d735878ec00f781b2de998333659507d29ea4466208df37bed"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:b47a465040146981dc9db8647981b8cb96366fbc8d452b031e4f8fdffec3f26d"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:99cea8b9dd34ff80c521aef46a1dddb0dcc0283cf18bde6d756f1e6f31772165"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:151dffc4865e5fe6dafce5480fab84f950d14566c480c08a53c663a0020504b6"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:577facaa411c10421314598b50413aa1ebcf5126f704f1e5d72d7e4e9f020d90"}, - {file = "kiwisolver-1.4.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:be4816dc51c8a471749d664161b434912eee82f2ea66bd7628bd14583a833e85"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:e7a019419b7b510f0f7c9dceff8c5eae2392037eae483a7f9162625233802b0a"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:286b18e86682fd2217a48fc6be6b0f20c1d0ed10958d8dc53453ad58d7be0bf8"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4191ee8dfd0be1c3666ccbac178c5a05d5f8d689bbe3fc92f3c4abec817f8fe0"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7cd2785b9391f2873ad46088ed7599a6a71e762e1ea33e87514b1a441ed1da1c"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c07b29089b7ba090b6f1a669f1411f27221c3662b3a1b7010e67b59bb5a6f10b"}, - {file = "kiwisolver-1.4.8-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:65ea09a5a3faadd59c2ce96dc7bf0f364986a315949dc6374f04396b0d60e09b"}, - {file = "kiwisolver-1.4.8.tar.gz", hash = "sha256:23d5f023bdc8c7e54eb65f03ca5d5bb25b601eac4d7f1a042888a1f45237987e"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b4b4d74bda2b8ebf4da5bd42af11d02d04428b2c32846e4c2c93219df8a7987b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:fb3b8132019ea572f4611d770991000d7f58127560c4889729248eb5852a102f"}, + {file = "kiwisolver-1.4.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:84fd60810829c27ae375114cd379da1fa65e6918e1da405f356a775d49a62bcf"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:b78efa4c6e804ecdf727e580dbb9cba85624d2e1c6b5cb059c66290063bd99a9"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4efec7bcf21671db6a3294ff301d2fc861c31faa3c8740d1a94689234d1b415"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:90f47e70293fc3688b71271100a1a5453aa9944a81d27ff779c108372cf5567b"}, + {file = "kiwisolver-1.4.9-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8fdca1def57a2e88ef339de1737a1449d6dbf5fab184c54a1fca01d541317154"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9cf554f21be770f5111a1690d42313e140355e687e05cf82cb23d0a721a64a48"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:fc1795ac5cd0510207482c3d1d3ed781143383b8cfd36f5c645f3897ce066220"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:ccd09f20ccdbbd341b21a67ab50a119b64a403b09288c27481575105283c1586"}, + {file = "kiwisolver-1.4.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:540c7c72324d864406a009d72f5d6856f49693db95d1fbb46cf86febef873634"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_amd64.whl", hash = "sha256:ede8c6d533bc6601a47ad4046080d36b8fc99f81e6f1c17b0ac3c2dc91ac7611"}, + {file = "kiwisolver-1.4.9-cp310-cp310-win_arm64.whl", hash = "sha256:7b4da0d01ac866a57dd61ac258c5607b4cd677f63abaec7b148354d2b2cdd536"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:eb14a5da6dc7642b0f3a18f13654847cd8b7a2550e2645a5bda677862b03ba16"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:39a219e1c81ae3b103643d2aedb90f1ef22650deb266ff12a19e7773f3e5f089"}, + {file = "kiwisolver-1.4.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2405a7d98604b87f3fc28b1716783534b1b4b8510d8142adca34ee0bc3c87543"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:dc1ae486f9abcef254b5618dfb4113dd49f94c68e3e027d03cf0143f3f772b61"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a1f570ce4d62d718dce3f179ee78dac3b545ac16c0c04bb363b7607a949c0d1"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:cb27e7b78d716c591e88e0a09a2139c6577865d7f2e152488c2cc6257f460872"}, + {file = "kiwisolver-1.4.9-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:15163165efc2f627eb9687ea5f3a28137217d217ac4024893d753f46bce9de26"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bdee92c56a71d2b24c33a7d4c2856bd6419d017e08caa7802d2963870e315028"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:412f287c55a6f54b0650bd9b6dce5aceddb95864a1a90c87af16979d37c89771"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2c93f00dcba2eea70af2be5f11a830a742fe6b579a1d4e00f47760ef13be247a"}, + {file = "kiwisolver-1.4.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f117e1a089d9411663a3207ba874f31be9ac8eaa5b533787024dc07aeb74f464"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_amd64.whl", hash = "sha256:be6a04e6c79819c9a8c2373317d19a96048e5a3f90bec587787e86a1153883c2"}, + {file = "kiwisolver-1.4.9-cp311-cp311-win_arm64.whl", hash = "sha256:0ae37737256ba2de764ddc12aed4956460277f00c4996d51a197e72f62f5eec7"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:ac5a486ac389dddcc5bef4f365b6ae3ffff2c433324fb38dd35e3fab7c957999"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f2ba92255faa7309d06fe44c3a4a97efe1c8d640c2a79a5ef728b685762a6fd2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:4a2899935e724dd1074cb568ce7ac0dce28b2cd6ab539c8e001a8578eb106d14"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f6008a4919fdbc0b0097089f67a1eb55d950ed7e90ce2cc3e640abadd2757a04"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:67bb8b474b4181770f926f7b7d2f8c0248cbcb78b660fdd41a47054b28d2a752"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2327a4a30d3ee07d2fbe2e7933e8a37c591663b96ce42a00bc67461a87d7df77"}, + {file = "kiwisolver-1.4.9-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7a08b491ec91b1d5053ac177afe5290adacf1f0f6307d771ccac5de30592d198"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d8fc5c867c22b828001b6a38d2eaeb88160bf5783c6cb4a5e440efc981ce286d"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:3b3115b2581ea35bb6d1f24a4c90af37e5d9b49dcff267eeed14c3893c5b86ab"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:858e4c22fb075920b96a291928cb7dea5644e94c0ee4fcd5af7e865655e4ccf2"}, + {file = "kiwisolver-1.4.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ed0fecd28cc62c54b262e3736f8bb2512d8dcfdc2bcf08be5f47f96bf405b145"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_amd64.whl", hash = "sha256:f68208a520c3d86ea51acf688a3e3002615a7f0238002cccc17affecc86a8a54"}, + {file = "kiwisolver-1.4.9-cp312-cp312-win_arm64.whl", hash = "sha256:2c1a4f57df73965f3f14df20b80ee29e6a7930a57d2d9e8491a25f676e197c60"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:a5d0432ccf1c7ab14f9949eec60c5d1f924f17c037e9f8b33352fa05799359b8"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efb3a45b35622bb6c16dbfab491a8f5a391fe0e9d45ef32f4df85658232ca0e2"}, + {file = "kiwisolver-1.4.9-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1a12cf6398e8a0a001a059747a1cbf24705e18fe413bc22de7b3d15c67cffe3f"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b67e6efbf68e077dd71d1a6b37e43e1a99d0bff1a3d51867d45ee8908b931098"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5656aa670507437af0207645273ccdfee4f14bacd7f7c67a4306d0dcaeaf6eed"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:bfc08add558155345129c7803b3671cf195e6a56e7a12f3dde7c57d9b417f525"}, + {file = "kiwisolver-1.4.9-cp313-cp313-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:40092754720b174e6ccf9e845d0d8c7d8e12c3d71e7fc35f55f3813e96376f78"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:497d05f29a1300d14e02e6441cf0f5ee81c1ff5a304b0d9fb77423974684e08b"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:bdd1a81a1860476eb41ac4bc1e07b3f07259e6d55bbf739b79c8aaedcf512799"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:e6b93f13371d341afee3be9f7c5964e3fe61d5fa30f6a30eb49856935dfe4fc3"}, + {file = "kiwisolver-1.4.9-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d75aa530ccfaa593da12834b86a0724f58bff12706659baa9227c2ccaa06264c"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_amd64.whl", hash = "sha256:dd0a578400839256df88c16abddf9ba14813ec5f21362e1fe65022e00c883d4d"}, + {file = "kiwisolver-1.4.9-cp313-cp313-win_arm64.whl", hash = "sha256:d4188e73af84ca82468f09cadc5ac4db578109e52acb4518d8154698d3a87ca2"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:5a0f2724dfd4e3b3ac5a82436a8e6fd16baa7d507117e4279b660fe8ca38a3a1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:1b11d6a633e4ed84fc0ddafd4ebfd8ea49b3f25082c04ad12b8315c11d504dc1"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:61874cdb0a36016354853593cffc38e56fc9ca5aa97d2c05d3dcf6922cd55a11"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:60c439763a969a6af93b4881db0eed8fadf93ee98e18cbc35bc8da868d0c4f0c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92a2f997387a1b79a75e7803aa7ded2cfbe2823852ccf1ba3bcf613b62ae3197"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a31d512c812daea6d8b3be3b2bfcbeb091dbb09177706569bcfc6240dcf8b41c"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:52a15b0f35dad39862d376df10c5230155243a2c1a436e39eb55623ccbd68185"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a30fd6fdef1430fd9e1ba7b3398b5ee4e2887783917a687d86ba69985fb08748"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_ppc64le.whl", hash = "sha256:cc9617b46837c6468197b5945e196ee9ca43057bb7d9d1ae688101e4e1dddf64"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_s390x.whl", hash = "sha256:0ab74e19f6a2b027ea4f845a78827969af45ce790e6cb3e1ebab71bdf9f215ff"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dba5ee5d3981160c28d5490f0d1b7ed730c22470ff7f6cc26cfcfaacb9896a07"}, + {file = "kiwisolver-1.4.9-cp313-cp313t-win_arm64.whl", hash = "sha256:0749fd8f4218ad2e851e11cc4dc05c7cbc0cbc4267bdfdb31782e65aace4ee9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:9928fe1eb816d11ae170885a74d074f57af3a0d65777ca47e9aeb854a1fba386"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d0005b053977e7b43388ddec89fa567f43d4f6d5c2c0affe57de5ebf290dc552"}, + {file = "kiwisolver-1.4.9-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2635d352d67458b66fd0667c14cb1d4145e9560d503219034a18a87e971ce4f3"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:767c23ad1c58c9e827b649a9ab7809fd5fd9db266a9cf02b0e926ddc2c680d58"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72d0eb9fba308b8311685c2268cf7d0a0639a6cd027d8128659f72bdd8a024b4"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f68e4f3eeca8fb22cc3d731f9715a13b652795ef657a13df1ad0c7dc0e9731df"}, + {file = "kiwisolver-1.4.9-cp314-cp314-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d84cd4061ae292d8ac367b2c3fa3aad11cb8625a95d135fe93f286f914f3f5a6"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:a60ea74330b91bd22a29638940d115df9dc00af5035a9a2a6ad9399ffb4ceca5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:ce6a3a4e106cf35c2d9c4fa17c05ce0b180db622736845d4315519397a77beaf"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:77937e5e2a38a7b48eef0585114fe7930346993a88060d0bf886086d2aa49ef5"}, + {file = "kiwisolver-1.4.9-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:24c175051354f4a28c5d6a31c93906dc653e2bf234e8a4bbfb964892078898ce"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_amd64.whl", hash = "sha256:0763515d4df10edf6d06a3c19734e2566368980d21ebec439f33f9eb936c07b7"}, + {file = "kiwisolver-1.4.9-cp314-cp314-win_arm64.whl", hash = "sha256:0e4e2bf29574a6a7b7f6cb5fa69293b9f96c928949ac4a53ba3f525dffb87f9c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:d976bbb382b202f71c67f77b0ac11244021cfa3f7dfd9e562eefcea2df711548"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2489e4e5d7ef9a1c300a5e0196e43d9c739f066ef23270607d45aba368b91f2d"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:e2ea9f7ab7fbf18fffb1b5434ce7c69a07582f7acc7717720f1d69f3e806f90c"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b34e51affded8faee0dfdb705416153819d8ea9250bbbf7ea1b249bdeb5f1122"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8aacd3d4b33b772542b2e01beb50187536967b514b00003bdda7589722d2a64"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7cf974dd4e35fa315563ac99d6287a1024e4dc2077b8a7d7cd3d2fb65d283134"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:85bd218b5ecfbee8c8a82e121802dcb519a86044c9c3b2e4aef02fa05c6da370"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0856e241c2d3df4efef7c04a1e46b1936b6120c9bcf36dd216e3acd84bc4fb21"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:9af39d6551f97d31a4deebeac6f45b156f9755ddc59c07b402c148f5dbb6482a"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:bb4ae2b57fc1d8cbd1cf7b1d9913803681ffa903e7488012be5b76dedf49297f"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:aedff62918805fb62d43a4aa2ecd4482c380dc76cd31bd7c8878588a61bd0369"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_amd64.whl", hash = "sha256:1fa333e8b2ce4d9660f2cda9c0e1b6bafcfb2457a9d259faa82289e73ec24891"}, + {file = "kiwisolver-1.4.9-cp314-cp314t-win_arm64.whl", hash = "sha256:4a48a2ce79d65d363597ef7b567ce3d14d68783d2b2263d98db3d9477805ba32"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:4d1d9e582ad4d63062d34077a9a1e9f3c34088a2ec5135b1f7190c07cf366527"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:deed0c7258ceb4c44ad5ec7d9918f9f14fd05b2be86378d86cf50e63d1e7b771"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0a590506f303f512dff6b7f75fd2fd18e16943efee932008fe7140e5fa91d80e"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e09c2279a4d01f099f52d5c4b3d9e208e91edcbd1a175c9662a8b16e000fece9"}, + {file = "kiwisolver-1.4.9-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:c9e7cdf45d594ee04d5be1b24dd9d49f3d1590959b2271fb30b5ca2b262c00fb"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:720e05574713db64c356e86732c0f3c5252818d05f9df320f0ad8380641acea5"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:17680d737d5335b552994a2008fab4c851bcd7de33094a82067ef3a576ff02fa"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:85b5352f94e490c028926ea567fc569c52ec79ce131dadb968d3853e809518c2"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:464415881e4801295659462c49461a24fb107c140de781d55518c4b80cb6790f"}, + {file = "kiwisolver-1.4.9-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:fb940820c63a9590d31d88b815e7a3aa5915cad3ce735ab45f0c730b39547de1"}, + {file = "kiwisolver-1.4.9.tar.gz", hash = "sha256:c3b22c26c6fd6811b0ae8363b95ca8ce4ea3c202d3d0975b2914310ceb1bcc4d"}, ] [[package]] name = "lark" -version = "1.2.2" +version = "1.3.1" description = "a modern parsing library" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "lark-1.2.2-py3-none-any.whl", hash = "sha256:c2276486b02f0f1b90be155f2c8ba4a8e194d42775786db622faccd652d8e80c"}, - {file = "lark-1.2.2.tar.gz", hash = "sha256:ca807d0162cd16cef15a8feecb862d7319e7a09bdb13aef927968e45040fed80"}, + {file = "lark-1.3.1-py3-none-any.whl", hash = "sha256:c629b661023a014c37da873b4ff58a817398d12635d3bbb2c5a03be7fe5d1e12"}, + {file = "lark-1.3.1.tar.gz", hash = "sha256:b426a7a6d6d53189d318f2b6236ab5d6429eaf09259f1ca33eb716eed10d2905"}, ] [package.extras] @@ -1715,119 +1973,271 @@ interegular = ["interegular (>=0.3.1,<0.4.0)"] nearley = ["js2py"] regex = ["regex"] +[[package]] +name = "librt" +version = "0.7.5" +description = "Mypyc runtime library" +optional = false +python-versions = ">=3.9" +groups = ["dev"] +markers = "platform_python_implementation != \"PyPy\"" +files = [ + {file = "librt-0.7.5-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:81056e01bba1394f1d92904ec61a4078f66df785316275edbaf51d90da8c6e26"}, + {file = "librt-0.7.5-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d7c72c8756eeb3aefb1b9e3dac7c37a4a25db63640cac0ab6fc18e91a0edf05a"}, + {file = "librt-0.7.5-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:ddc4a16207f88f9597b397fc1f60781266d13b13de922ff61c206547a29e4bbd"}, + {file = "librt-0.7.5-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:63055d3dda433ebb314c9f1819942f16a19203c454508fdb2d167613f7017169"}, + {file = "librt-0.7.5-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9f85f9b5db87b0f52e53c68ad2a0c5a53e00afa439bd54a1723742a2b1021276"}, + {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c566a4672564c5d54d8ab65cdaae5a87ee14c1564c1a2ddc7a9f5811c750f023"}, + {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:fee15c2a190ef389f14928135c6fb2d25cd3fdb7887bfd9a7b444bbdc8c06b96"}, + {file = "librt-0.7.5-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:584cb3e605ec45ba350962cec853e17be0a25a772f21f09f1e422f7044ae2a7d"}, + {file = "librt-0.7.5-cp310-cp310-win32.whl", hash = "sha256:9c08527055fbb03c641c15bbc5b79dd2942fb6a3bd8dabf141dd7e97eeea4904"}, + {file = "librt-0.7.5-cp310-cp310-win_amd64.whl", hash = "sha256:dd810f2d39c526c42ea205e0addad5dc08ef853c625387806a29d07f9d150d9b"}, + {file = "librt-0.7.5-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f952e1a78c480edee8fb43aa2bf2e84dcd46c917d44f8065b883079d3893e8fc"}, + {file = "librt-0.7.5-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:75965c1f4efb7234ff52a58b729d245a21e87e4b6a26a0ec08052f02b16274e4"}, + {file = "librt-0.7.5-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:732e0aa0385b59a1b2545159e781c792cc58ce9c134249233a7c7250a44684c4"}, + {file = "librt-0.7.5-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdde31759bd8888f3ef0eebda80394a48961328a17c264dce8cc35f4b9cde35d"}, + {file = "librt-0.7.5-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:df3146d52465b3b6397d25d513f428cb421c18df65b7378667bb5f1e3cc45805"}, + {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:29c8d2fae11d4379ea207ba7fc69d43237e42cf8a9f90ec6e05993687e6d648b"}, + {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bb41f04046b4f22b1e7ba5ef513402cd2e3477ec610e5f92d38fe2bba383d419"}, + {file = "librt-0.7.5-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8bb7883c1e94ceb87c2bf81385266f032da09cd040e804cc002f2c9d6b842e2f"}, + {file = "librt-0.7.5-cp311-cp311-win32.whl", hash = "sha256:84d4a6b9efd6124f728558a18e79e7cc5c5d4efc09b2b846c910de7e564f5bad"}, + {file = "librt-0.7.5-cp311-cp311-win_amd64.whl", hash = "sha256:ab4b0d3bee6f6ff7017e18e576ac7e41a06697d8dea4b8f3ab9e0c8e1300c409"}, + {file = "librt-0.7.5-cp311-cp311-win_arm64.whl", hash = "sha256:730be847daad773a3c898943cf67fb9845a3961d06fb79672ceb0a8cd8624cfa"}, + {file = "librt-0.7.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba1077c562a046208a2dc6366227b3eeae8f2c2ab4b41eaf4fd2fa28cece4203"}, + {file = "librt-0.7.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:654fdc971c76348a73af5240d8e2529265b9a7ba6321e38dd5bae7b0d4ab3abe"}, + {file = "librt-0.7.5-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6b7b58913d475911f6f33e8082f19dd9b120c4f4a5c911d07e395d67b81c6982"}, + {file = "librt-0.7.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b8e0fd344bad57026a8f4ccfaf406486c2fc991838050c2fef156170edc3b775"}, + {file = "librt-0.7.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:46aa91813c267c3f60db75d56419b42c0c0b9748ec2c568a0e3588e543fb4233"}, + {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ddc0ab9dbc5f9ceaf2bf7a367bf01f2697660e908f6534800e88f43590b271db"}, + {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:7a488908a470451338607650f1c064175094aedebf4a4fa37890682e30ce0b57"}, + {file = "librt-0.7.5-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e47fc52602ffc374e69bf1b76536dc99f7f6dd876bd786c8213eaa3598be030a"}, + {file = "librt-0.7.5-cp312-cp312-win32.whl", hash = "sha256:cda8b025875946ffff5a9a7590bf9acde3eb02cb6200f06a2d3e691ef3d9955b"}, + {file = "librt-0.7.5-cp312-cp312-win_amd64.whl", hash = "sha256:b591c094afd0ffda820e931148c9e48dc31a556dc5b2b9b3cc552fa710d858e4"}, + {file = "librt-0.7.5-cp312-cp312-win_arm64.whl", hash = "sha256:532ddc6a8a6ca341b1cd7f4d999043e4c71a212b26fe9fd2e7f1e8bb4e873544"}, + {file = "librt-0.7.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b1795c4b2789b458fa290059062c2f5a297ddb28c31e704d27e161386469691a"}, + {file = "librt-0.7.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2fcbf2e135c11f721193aa5f42ba112bb1046afafbffd407cbc81d8d735c74d0"}, + {file = "librt-0.7.5-cp313-cp313-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:c039bbf79a9a2498404d1ae7e29a6c175e63678d7a54013a97397c40aee026c5"}, + {file = "librt-0.7.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3919c9407faeeee35430ae135e3a78acd4ecaaaa73767529e2c15ca1d73ba325"}, + {file = "librt-0.7.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:26b46620e1e0e45af510d9848ea0915e7040605dd2ae94ebefb6c962cbb6f7ec"}, + {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9bbb8facc5375476d392990dd6a71f97e4cb42e2ac66f32e860f6e47299d5e89"}, + {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:e9e9c988b5ffde7be02180f864cbd17c0b0c1231c235748912ab2afa05789c25"}, + {file = "librt-0.7.5-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:edf6b465306215b19dbe6c3fb63cf374a8f3e1ad77f3b4c16544b83033bbb67b"}, + {file = "librt-0.7.5-cp313-cp313-win32.whl", hash = "sha256:060bde69c3604f694bd8ae21a780fe8be46bb3dbb863642e8dfc75c931ca8eee"}, + {file = "librt-0.7.5-cp313-cp313-win_amd64.whl", hash = "sha256:a82d5a0ee43aeae2116d7292c77cc8038f4841830ade8aa922e098933b468b9e"}, + {file = "librt-0.7.5-cp313-cp313-win_arm64.whl", hash = "sha256:3c98a8d0ac9e2a7cb8ff8c53e5d6e8d82bfb2839abf144fdeaaa832f2a12aa45"}, + {file = "librt-0.7.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9937574e6d842f359b8585903d04f5b4ab62277a091a93e02058158074dc52f2"}, + {file = "librt-0.7.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:5cd3afd71e9bc146203b6c8141921e738364158d4aa7cdb9a874e2505163770f"}, + {file = "librt-0.7.5-cp314-cp314-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:9cffa3ef0af29687455161cb446eff059bf27607f95163d6a37e27bcb37180f6"}, + {file = "librt-0.7.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:82f3f088482e2229387eadf8215c03f7726d56f69cce8c0c40f0795aebc9b361"}, + {file = "librt-0.7.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7aa33153a5bb0bac783d2c57885889b1162823384e8313d47800a0e10d0070e"}, + {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:265729b551a2dd329cc47b323a182fb7961af42abf21e913c9dd7d3331b2f3c2"}, + {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:168e04663e126416ba712114050f413ac306759a1791d87b7c11d4428ba75760"}, + {file = "librt-0.7.5-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:553dc58987d1d853adda8aeadf4db8e29749f0b11877afcc429a9ad892818ae2"}, + {file = "librt-0.7.5-cp314-cp314-win32.whl", hash = "sha256:263f4fae9eba277513357c871275b18d14de93fd49bf5e43dc60a97b81ad5eb8"}, + {file = "librt-0.7.5-cp314-cp314-win_amd64.whl", hash = "sha256:85f485b7471571e99fab4f44eeb327dc0e1f814ada575f3fa85e698417d8a54e"}, + {file = "librt-0.7.5-cp314-cp314-win_arm64.whl", hash = "sha256:49c596cd18e90e58b7caa4d7ca7606049c1802125fcff96b8af73fa5c3870e4d"}, + {file = "librt-0.7.5-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:54d2aef0b0f5056f130981ad45081b278602ff3657fe16c88529f5058038e802"}, + {file = "librt-0.7.5-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0b4791202296ad51ac09a3ff58eb49d9da8e3a4009167a6d76ac418a974e5fd4"}, + {file = "librt-0.7.5-cp314-cp314t-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:6e860909fea75baef941ee6436e0453612505883b9d0d87924d4fda27865b9a2"}, + {file = "librt-0.7.5-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f02c4337bf271c4f06637f5ff254fad2238c0b8e32a3a480ebb2fc5e26f754a5"}, + {file = "librt-0.7.5-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7f51ffe59f4556243d3cc82d827bde74765f594fa3ceb80ec4de0c13ccd3416"}, + {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:0b7f080ba30601dfa3e3deed3160352273e1b9bc92e652f51103c3e9298f7899"}, + {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:fb565b4219abc8ea2402e61c7ba648a62903831059ed3564fa1245cc245d58d7"}, + {file = "librt-0.7.5-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a3cfb15961e7333ea6ef033dc574af75153b5c230d5ad25fbcd55198f21e0cf"}, + {file = "librt-0.7.5-cp314-cp314t-win32.whl", hash = "sha256:118716de5ad6726332db1801bc90fa6d94194cd2e07c1a7822cebf12c496714d"}, + {file = "librt-0.7.5-cp314-cp314t-win_amd64.whl", hash = "sha256:3dd58f7ce20360c6ce0c04f7bd9081c7f9c19fc6129a3c705d0c5a35439f201d"}, + {file = "librt-0.7.5-cp314-cp314t-win_arm64.whl", hash = "sha256:08153ea537609d11f774d2bfe84af39d50d5c9ca3a4d061d946e0c9d8bce04a1"}, + {file = "librt-0.7.5-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:df2e210400b28e50994477ebf82f055698c79797b6ee47a1669d383ca33263e1"}, + {file = "librt-0.7.5-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d2cc7d187e8c6e9b7bdbefa9697ce897a704ea7a7ce844f2b4e0e2aa07ae51d3"}, + {file = "librt-0.7.5-cp39-cp39-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:39183abee670bc37b85f11e86c44a9cad1ed6efa48b580083e89ecee13dd9717"}, + {file = "librt-0.7.5-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191cbd42660446d67cf7a95ac7bfa60f49b8b3b0417c64f216284a1d86fc9335"}, + {file = "librt-0.7.5-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea1b60b86595a5dc1f57b44a801a1c4d8209c0a69518391d349973a4491408e6"}, + {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:af69d9e159575e877c7546d1ee817b4ae089aa221dd1117e20c24ad8dc8659c7"}, + {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:0e2bf8f91093fac43e3eaebacf777f12fd539dce9ec5af3efc6d8424e96ccd49"}, + {file = "librt-0.7.5-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:8dcae24de1bc9da93aa689cb6313c70e776d7cea2fcf26b9b6160fedfe6bd9af"}, + {file = "librt-0.7.5-cp39-cp39-win32.whl", hash = "sha256:cdb001a1a0e4f41e613bca2c0fc147fc8a7396f53fc94201cbfd8ec7cd69ca4b"}, + {file = "librt-0.7.5-cp39-cp39-win_amd64.whl", hash = "sha256:a9eacbf983319b26b5f340a2e0cd47ac1ee4725a7f3a72fd0f15063c934b69d6"}, + {file = "librt-0.7.5.tar.gz", hash = "sha256:de4221a1181fa9c8c4b5f35506ed6f298948f44003d84d2a8b9885d7e01e6cfa"}, +] + +[[package]] +name = "markdown" +version = "3.10" +description = "Python implementation of John Gruber's Markdown." +optional = false +python-versions = ">=3.10" +groups = ["docs"] +files = [ + {file = "markdown-3.10-py3-none-any.whl", hash = "sha256:b5b99d6951e2e4948d939255596523444c0e677c669700b1d17aa4a8a464cb7c"}, + {file = "markdown-3.10.tar.gz", hash = "sha256:37062d4f2aa4b2b6b32aefb80faa300f82cc790cb949a35b8caede34f2b68c0e"}, +] + +[package.extras] +docs = ["mdx_gh_links (>=0.2)", "mkdocs (>=1.6)", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-nature (>=0.6)", "mkdocs-section-index", "mkdocstrings[python]"] +testing = ["coverage", "pyyaml"] + [[package]] name = "markupsafe" -version = "3.0.2" +version = "3.0.3" description = "Safely add untrusted strings to HTML/XML markup." optional = false python-versions = ">=3.9" -groups = ["main", "demo"] -files = [ - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:7e94c425039cde14257288fd61dcfb01963e658efbc0ff54f5306b06054700f8"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:9e2d922824181480953426608b81967de705c3cef4d1af983af849d7bd619158"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:38a9ef736c01fccdd6600705b09dc574584b89bea478200c5fbf112a6b0d5579"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bbcb445fa71794da8f178f0f6d66789a28d7319071af7a496d4d507ed566270d"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57cb5a3cf367aeb1d316576250f65edec5bb3be939e9247ae594b4bcbc317dfb"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3809ede931876f5b2ec92eef964286840ed3540dadf803dd570c3b7e13141a3b"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e07c3764494e3776c602c1e78e298937c3315ccc9043ead7e685b7f2b8d47b3c"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b424c77b206d63d500bcb69fa55ed8d0e6a3774056bdc4839fc9298a7edca171"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win32.whl", hash = "sha256:fcabf5ff6eea076f859677f5f0b6b5c1a51e70a376b0579e0eadef8db48c6b50"}, - {file = "MarkupSafe-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:6af100e168aa82a50e186c82875a5893c5597a0c1ccdb0d8b40240b1f28b969a"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9025b4018f3a1314059769c7bf15441064b2207cb3f065e6ea1e7359cb46db9d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:93335ca3812df2f366e80509ae119189886b0f3c2b81325d39efdb84a1e2ae93"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2cb8438c3cbb25e220c2ab33bb226559e7afb3baec11c4f218ffa7308603c832"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a123e330ef0853c6e822384873bef7507557d8e4a082961e1defa947aa59ba84"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1e084f686b92e5b83186b07e8a17fc09e38fff551f3602b249881fec658d3eca"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d8213e09c917a951de9d09ecee036d5c7d36cb6cb7dbaece4c71a60d79fb9798"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:5b02fb34468b6aaa40dfc198d813a641e3a63b98c2b05a16b9f80b7ec314185e"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:0bff5e0ae4ef2e1ae4fdf2dfd5b76c75e5c2fa4132d05fc1b0dabcd20c7e28c4"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win32.whl", hash = "sha256:6c89876f41da747c8d3677a2b540fb32ef5715f97b66eeb0c6b66f5e3ef6f59d"}, - {file = "MarkupSafe-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:70a87b411535ccad5ef2f1df5136506a10775d267e197e4cf531ced10537bd6b"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:9778bd8ab0a994ebf6f84c2b949e65736d5575320a17ae8984a77fab08db94cf"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:846ade7b71e3536c4e56b386c2a47adf5741d2d8b94ec9dc3e92e5e1ee1e2225"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1c99d261bd2d5f6b59325c92c73df481e05e57f19837bdca8413b9eac4bd8028"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e17c96c14e19278594aa4841ec148115f9c7615a47382ecb6b82bd8fea3ab0c8"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:88416bd1e65dcea10bc7569faacb2c20ce071dd1f87539ca2ab364bf6231393c"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2181e67807fc2fa785d0592dc2d6206c019b9502410671cc905d132a92866557"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:52305740fe773d09cffb16f8ed0427942901f00adedac82ec8b67752f58a1b22"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:ad10d3ded218f1039f11a75f8091880239651b52e9bb592ca27de44eed242a48"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win32.whl", hash = "sha256:0f4ca02bea9a23221c0182836703cbf8930c5e9454bacce27e767509fa286a30"}, - {file = "MarkupSafe-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:8e06879fc22a25ca47312fbe7c8264eb0b662f6db27cb2d3bbbc74b1df4b9b87"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:ba9527cdd4c926ed0760bc301f6728ef34d841f405abf9d4f959c478421e4efd"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:f8b3d067f2e40fe93e1ccdd6b2e1d16c43140e76f02fb1319a05cf2b79d99430"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:569511d3b58c8791ab4c2e1285575265991e6d8f8700c7be0e88f86cb0672094"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:15ab75ef81add55874e7ab7055e9c397312385bd9ced94920f2802310c930396"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f3818cb119498c0678015754eba762e0d61e5b52d34c8b13d770f0719f7b1d79"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:cdb82a876c47801bb54a690c5ae105a46b392ac6099881cdfb9f6e95e4014c6a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:cabc348d87e913db6ab4aa100f01b08f481097838bdddf7c7a84b7575b7309ca"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:444dcda765c8a838eaae23112db52f1efaf750daddb2d9ca300bcae1039adc5c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win32.whl", hash = "sha256:bcf3e58998965654fdaff38e58584d8937aa3096ab5354d493c77d1fdd66d7a1"}, - {file = "MarkupSafe-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:e6a2a455bd412959b57a172ce6328d2dd1f01cb2135efda2e4576e8a23fa3b0f"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:b5a6b3ada725cea8a5e634536b1b01c30bcdcd7f9c6fff4151548d5bf6b3a36c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:a904af0a6162c73e3edcb969eeeb53a63ceeb5d8cf642fade7d39e7963a22ddb"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4aa4e5faecf353ed117801a068ebab7b7e09ffb6e1d5e412dc852e0da018126c"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c0ef13eaeee5b615fb07c9a7dadb38eac06a0608b41570d8ade51c56539e509d"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d16a81a06776313e817c951135cf7340a3e91e8c1ff2fac444cfd75fffa04afe"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6381026f158fdb7c72a168278597a5e3a5222e83ea18f543112b2662a9b699c5"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:3d79d162e7be8f996986c064d1c7c817f6df3a77fe3d6859f6f9e7be4b8c213a"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:131a3c7689c85f5ad20f9f6fb1b866f402c445b220c19fe4308c0b147ccd2ad9"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win32.whl", hash = "sha256:ba8062ed2cf21c07a9e295d5b8a2a5ce678b913b45fdf68c32d95d6c1291e0b6"}, - {file = "MarkupSafe-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:e444a31f8db13eb18ada366ab3cf45fd4b31e4db1236a4448f68778c1d1a5a2f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:eaa0a10b7f72326f1372a713e73c3f739b524b3af41feb43e4921cb529f5929a"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:48032821bbdf20f5799ff537c7ac3d1fba0ba032cfc06194faffa8cda8b560ff"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1a9d3f5f0901fdec14d8d2f66ef7d035f2157240a433441719ac9a3fba440b13"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:88b49a3b9ff31e19998750c38e030fc7bb937398b1f78cfa599aaef92d693144"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cfad01eed2c2e0c01fd0ecd2ef42c492f7f93902e39a42fc9ee1692961443a29"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:1225beacc926f536dc82e45f8a4d68502949dc67eea90eab715dea3a21c1b5f0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:3169b1eefae027567d1ce6ee7cae382c57fe26e82775f460f0b2778beaad66c0"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:eb7972a85c54febfb25b5c4b4f3af4dcc731994c7da0d8a0b4a6eb0640e1d178"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win32.whl", hash = "sha256:8c4e8c3ce11e1f92f6536ff07154f9d49677ebaaafc32db9db4620bc11ed480f"}, - {file = "MarkupSafe-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:6e296a513ca3d94054c2c881cc913116e90fd030ad1c656b3869762b754f5f8a"}, - {file = "markupsafe-3.0.2.tar.gz", hash = "sha256:ee55d3edf80167e48ea11a923c7386f4669df67d7994554387f84e7d8b0a2bf0"}, +groups = ["main", "demo", "docs"] +files = [ + {file = "markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559"}, + {file = "markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591"}, + {file = "markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6"}, + {file = "markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1"}, + {file = "markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8"}, + {file = "markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad"}, + {file = "markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf"}, + {file = "markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115"}, + {file = "markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a"}, + {file = "markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01"}, + {file = "markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e"}, + {file = "markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d"}, + {file = "markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f"}, + {file = "markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b"}, + {file = "markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c"}, + {file = "markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795"}, + {file = "markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676"}, + {file = "markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc"}, + {file = "markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12"}, + {file = "markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5"}, + {file = "markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73"}, + {file = "markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025"}, + {file = "markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb"}, + {file = "markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218"}, + {file = "markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe"}, + {file = "markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97"}, + {file = "markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf"}, + {file = "markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe"}, + {file = "markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581"}, + {file = "markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab"}, + {file = "markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50"}, + {file = "markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523"}, + {file = "markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9"}, + {file = "markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:15d939a21d546304880945ca1ecb8a039db6b4dc49b2c5a400387cdae6a62e26"}, + {file = "markupsafe-3.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f71a396b3bf33ecaa1626c255855702aca4d3d9fea5e051b41ac59a9c1c41edc"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f4b68347f8c5eab4a13419215bdfd7f8c9b19f2b25520968adfad23eb0ce60c"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e8fc20152abba6b83724d7ff268c249fa196d8259ff481f3b1476383f8f24e42"}, + {file = "markupsafe-3.0.3-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:949b8d66bc381ee8b007cd945914c721d9aba8e27f71959d750a46f7c282b20b"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:3537e01efc9d4dccdf77221fb1cb3b8e1a38d5428920e0657ce299b20324d758"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:591ae9f2a647529ca990bc681daebdd52c8791ff06c2bfa05b65163e28102ef2"}, + {file = "markupsafe-3.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a320721ab5a1aba0a233739394eb907f8c8da5c98c9181d1161e77a0c8e36f2d"}, + {file = "markupsafe-3.0.3-cp39-cp39-win32.whl", hash = "sha256:df2449253ef108a379b8b5d6b43f4b1a8e81a061d6537becd5582fba5f9196d7"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:7c3fb7d25180895632e5d3148dbdc29ea38ccb7fd210aa27acbd1201a1902c6e"}, + {file = "markupsafe-3.0.3-cp39-cp39-win_arm64.whl", hash = "sha256:38664109c14ffc9e7437e86b4dceb442b0096dfe3541d7864d9cbe1da4cf36c8"}, + {file = "markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698"}, ] [[package]] name = "matplotlib" -version = "3.10.3" +version = "3.10.8" description = "Python plotting package" optional = false python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "matplotlib-3.10.3-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:213fadd6348d106ca7db99e113f1bea1e65e383c3ba76e8556ba4a3054b65ae7"}, - {file = "matplotlib-3.10.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d3bec61cb8221f0ca6313889308326e7bb303d0d302c5cc9e523b2f2e6c73deb"}, - {file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8c21ae75651c0231b3ba014b6d5e08fb969c40cdb5a011e33e99ed0c9ea86ecb"}, - {file = "matplotlib-3.10.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a49e39755580b08e30e3620efc659330eac5d6534ab7eae50fa5e31f53ee4e30"}, - {file = "matplotlib-3.10.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:cf4636203e1190871d3a73664dea03d26fb019b66692cbfd642faafdad6208e8"}, - {file = "matplotlib-3.10.3-cp310-cp310-win_amd64.whl", hash = "sha256:fd5641a9bb9d55f4dd2afe897a53b537c834b9012684c8444cc105895c8c16fd"}, - {file = "matplotlib-3.10.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0ef061f74cd488586f552d0c336b2f078d43bc00dc473d2c3e7bfee2272f3fa8"}, - {file = "matplotlib-3.10.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96985d14dc5f4a736bbea4b9de9afaa735f8a0fc2ca75be2fa9e96b2097369d"}, - {file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7c5f0283da91e9522bdba4d6583ed9d5521566f63729ffb68334f86d0bb98049"}, - {file = "matplotlib-3.10.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fdfa07c0ec58035242bc8b2c8aae37037c9a886370eef6850703d7583e19964b"}, - {file = "matplotlib-3.10.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c0b9849a17bce080a16ebcb80a7b714b5677d0ec32161a2cc0a8e5a6030ae220"}, - {file = "matplotlib-3.10.3-cp311-cp311-win_amd64.whl", hash = "sha256:eef6ed6c03717083bc6d69c2d7ee8624205c29a8e6ea5a31cd3492ecdbaee1e1"}, - {file = "matplotlib-3.10.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0ab1affc11d1f495ab9e6362b8174a25afc19c081ba5b0775ef00533a4236eea"}, - {file = "matplotlib-3.10.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2a818d8bdcafa7ed2eed74487fdb071c09c1ae24152d403952adad11fa3c65b4"}, - {file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748ebc3470c253e770b17d8b0557f0aa85cf8c63fd52f1a61af5b27ec0b7ffee"}, - {file = "matplotlib-3.10.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ed70453fd99733293ace1aec568255bc51c6361cb0da94fa5ebf0649fdb2150a"}, - {file = "matplotlib-3.10.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dbed9917b44070e55640bd13419de83b4c918e52d97561544814ba463811cbc7"}, - {file = "matplotlib-3.10.3-cp312-cp312-win_amd64.whl", hash = "sha256:cf37d8c6ef1a48829443e8ba5227b44236d7fcaf7647caa3178a4ff9f7a5be05"}, - {file = "matplotlib-3.10.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:9f2efccc8dcf2b86fc4ee849eea5dcaecedd0773b30f47980dc0cbeabf26ec84"}, - {file = "matplotlib-3.10.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:3ddbba06a6c126e3301c3d272a99dcbe7f6c24c14024e80307ff03791a5f294e"}, - {file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:748302b33ae9326995b238f606e9ed840bf5886ebafcb233775d946aa8107a15"}, - {file = "matplotlib-3.10.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a80fcccbef63302c0efd78042ea3c2436104c5b1a4d3ae20f864593696364ac7"}, - {file = "matplotlib-3.10.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:55e46cbfe1f8586adb34f7587c3e4f7dedc59d5226719faf6cb54fc24f2fd52d"}, - {file = "matplotlib-3.10.3-cp313-cp313-win_amd64.whl", hash = "sha256:151d89cb8d33cb23345cd12490c76fd5d18a56581a16d950b48c6ff19bb2ab93"}, - {file = "matplotlib-3.10.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c26dd9834e74d164d06433dc7be5d75a1e9890b926b3e57e74fa446e1a62c3e2"}, - {file = "matplotlib-3.10.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:24853dad5b8c84c8c2390fc31ce4858b6df504156893292ce8092d190ef8151d"}, - {file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:68f7878214d369d7d4215e2a9075fef743be38fa401d32e6020bab2dfabaa566"}, - {file = "matplotlib-3.10.3-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f6929fc618cb6db9cb75086f73b3219bbb25920cb24cee2ea7a12b04971a4158"}, - {file = "matplotlib-3.10.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6c7818292a5cc372a2dc4c795e5c356942eb8350b98ef913f7fda51fe175ac5d"}, - {file = "matplotlib-3.10.3-cp313-cp313t-win_amd64.whl", hash = "sha256:4f23ffe95c5667ef8a2b56eea9b53db7f43910fa4a2d5472ae0f72b64deab4d5"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:86ab63d66bbc83fdb6733471d3bff40897c1e9921cba112accd748eee4bce5e4"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:a48f9c08bf7444b5d2391a83e75edb464ccda3c380384b36532a0962593a1751"}, - {file = "matplotlib-3.10.3-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cb73d8aa75a237457988f9765e4dfe1c0d2453c5ca4eabc897d4309672c8e014"}, - {file = "matplotlib-3.10.3.tar.gz", hash = "sha256:2f82d2c5bb7ae93aaaa4cd42aca65d76ce6376f83304fa3a630b569aca274df0"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:00270d217d6b20d14b584c521f810d60c5c78406dc289859776550df837dcda7"}, + {file = "matplotlib-3.10.8-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:37b3c1cc42aa184b3f738cfa18c1c1d72fd496d85467a6cf7b807936d39aa656"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee40c27c795bda6a5292e9cff9890189d32f7e3a0bf04e0e3c9430c4a00c37df"}, + {file = "matplotlib-3.10.8-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a48f2b74020919552ea25d222d5cc6af9ca3f4eb43a93e14d068457f545c2a17"}, + {file = "matplotlib-3.10.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f254d118d14a7f99d616271d6c3c27922c092dac11112670b157798b89bf4933"}, + {file = "matplotlib-3.10.8-cp310-cp310-win_amd64.whl", hash = "sha256:f9b587c9c7274c1613a30afabf65a272114cd6cdbe67b3406f818c79d7ab2e2a"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:6be43b667360fef5c754dda5d25a32e6307a03c204f3c0fc5468b78fa87b4160"}, + {file = "matplotlib-3.10.8-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2b336e2d91a3d7006864e0990c83b216fcdca64b5a6484912902cef87313d78"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:efb30e3baaea72ce5928e32bab719ab4770099079d66726a62b11b1ef7273be4"}, + {file = "matplotlib-3.10.8-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d56a1efd5bfd61486c8bc968fa18734464556f0fb8e51690f4ac25d85cbbbbc2"}, + {file = "matplotlib-3.10.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238b7ce5717600615c895050239ec955d91f321c209dd110db988500558e70d6"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_amd64.whl", hash = "sha256:18821ace09c763ec93aef5eeff087ee493a24051936d7b9ebcad9662f66501f9"}, + {file = "matplotlib-3.10.8-cp311-cp311-win_arm64.whl", hash = "sha256:bab485bcf8b1c7d2060b4fcb6fc368a9e6f4cd754c9c2fea281f4be21df394a2"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:64fcc24778ca0404ce0cb7b6b77ae1f4c7231cdd60e6778f999ee05cbd581b9a"}, + {file = "matplotlib-3.10.8-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b9a5ca4ac220a0cdd1ba6bcba3608547117d30468fefce49bb26f55c1a3d5c58"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3ab4aabc72de4ff77b3ec33a6d78a68227bf1123465887f9905ba79184a1cc04"}, + {file = "matplotlib-3.10.8-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:24d50994d8c5816ddc35411e50a86ab05f575e2530c02752e02538122613371f"}, + {file = "matplotlib-3.10.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:99eefd13c0dc3b3c1b4d561c1169e65fe47aab7b8158754d7c084088e2329466"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_amd64.whl", hash = "sha256:dd80ecb295460a5d9d260df63c43f4afbdd832d725a531f008dad1664f458adf"}, + {file = "matplotlib-3.10.8-cp312-cp312-win_arm64.whl", hash = "sha256:3c624e43ed56313651bc18a47f838b60d7b8032ed348911c54906b130b20071b"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3f2e409836d7f5ac2f1c013110a4d50b9f7edc26328c108915f9075d7d7a91b6"}, + {file = "matplotlib-3.10.8-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:56271f3dac49a88d7fca5060f004d9d22b865f743a12a23b1e937a0be4818ee1"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a0a7f52498f72f13d4a25ea70f35f4cb60642b466cbb0a9be951b5bc3f45a486"}, + {file = "matplotlib-3.10.8-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:646d95230efb9ca614a7a594d4fcacde0ac61d25e37dd51710b36477594963ce"}, + {file = "matplotlib-3.10.8-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:f89c151aab2e2e23cb3fe0acad1e8b82841fd265379c4cecd0f3fcb34c15e0f6"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_amd64.whl", hash = "sha256:e8ea3e2d4066083e264e75c829078f9e149fa119d27e19acd503de65e0b13149"}, + {file = "matplotlib-3.10.8-cp313-cp313-win_arm64.whl", hash = "sha256:c108a1d6fa78a50646029cb6d49808ff0fc1330fda87fa6f6250c6b5369b6645"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ad3d9833a64cf48cc4300f2b406c3d0f4f4724a91c0bd5640678a6ba7c102077"}, + {file = "matplotlib-3.10.8-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:eb3823f11823deade26ce3b9f40dcb4a213da7a670013929f31d5f5ed1055b22"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d9050fee89a89ed57b4fb2c1bfac9a3d0c57a0d55aed95949eedbc42070fea39"}, + {file = "matplotlib-3.10.8-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b44d07310e404ba95f8c25aa5536f154c0a8ec473303535949e52eb71d0a1565"}, + {file = "matplotlib-3.10.8-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:0a33deb84c15ede243aead39f77e990469fff93ad1521163305095b77b72ce4a"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_amd64.whl", hash = "sha256:3a48a78d2786784cc2413e57397981fb45c79e968d99656706018d6e62e57958"}, + {file = "matplotlib-3.10.8-cp313-cp313t-win_arm64.whl", hash = "sha256:15d30132718972c2c074cd14638c7f4592bd98719e2308bccea40e0538bc0cb5"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b53285e65d4fa4c86399979e956235deb900be5baa7fc1218ea67fbfaeaadd6f"}, + {file = "matplotlib-3.10.8-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:32f8dce744be5569bebe789e46727946041199030db8aeb2954d26013a0eb26b"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4cf267add95b1c88300d96ca837833d4112756045364f5c734a2276038dae27d"}, + {file = "matplotlib-3.10.8-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2cf5bd12cecf46908f286d7838b2abc6c91cda506c0445b8223a7c19a00df008"}, + {file = "matplotlib-3.10.8-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:41703cc95688f2516b480f7f339d8851a6035f18e100ee6a32bc0b8536a12a9c"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_amd64.whl", hash = "sha256:83d282364ea9f3e52363da262ce32a09dfe241e4080dcedda3c0db059d3c1f11"}, + {file = "matplotlib-3.10.8-cp314-cp314-win_arm64.whl", hash = "sha256:2c1998e92cd5999e295a731bcb2911c75f597d937341f3030cc24ef2733d78a8"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:b5a2b97dbdc7d4f353ebf343744f1d1f1cca8aa8bfddb4262fcf4306c3761d50"}, + {file = "matplotlib-3.10.8-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3f5c3e4da343bba819f0234186b9004faba952cc420fbc522dc4e103c1985908"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f62550b9a30afde8c1c3ae450e5eb547d579dd69b25c2fc7a1c67f934c1717a"}, + {file = "matplotlib-3.10.8-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:495672de149445ec1b772ff2c9ede9b769e3cb4f0d0aa7fa730d7f59e2d4e1c1"}, + {file = "matplotlib-3.10.8-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:595ba4d8fe983b88f0eec8c26a241e16d6376fe1979086232f481f8f3f67494c"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_amd64.whl", hash = "sha256:25d380fe8b1dc32cf8f0b1b448470a77afb195438bafdf1d858bfb876f3edf7b"}, + {file = "matplotlib-3.10.8-cp314-cp314t-win_arm64.whl", hash = "sha256:113bb52413ea508ce954a02c10ffd0d565f9c3bc7f2eddc27dfe1731e71c7b5f"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:f97aeb209c3d2511443f8797e3e5a569aebb040d4f8bc79aa3ee78a8fb9e3dd8"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:fb061f596dad3a0f52b60dc6a5dec4a0c300dec41e058a7efe09256188d170b7"}, + {file = "matplotlib-3.10.8-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:12d90df9183093fcd479f4172ac26b322b1248b15729cb57f42f71f24c7e37a3"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6da7c2ce169267d0d066adcf63758f0604aa6c3eebf67458930f9d9b79ad1db1"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9153c3292705be9f9c64498a8872118540c3f4123d1a1c840172edf262c8be4a"}, + {file = "matplotlib-3.10.8-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1ae029229a57cd1e8fe542485f27e7ca7b23aa9e8944ddb4985d0bc444f1eca2"}, + {file = "matplotlib-3.10.8.tar.gz", hash = "sha256:2299372c19d56bcd35cf05a2738308758d32b9eaed2371898d8f5bd33f084aa3"}, ] [package.dependencies] @@ -1838,7 +2248,7 @@ kiwisolver = ">=1.3.1" numpy = ">=1.23" packaging = ">=20.0" pillow = ">=8" -pyparsing = ">=2.3.1" +pyparsing = ">=3" python-dateutil = ">=2.7" [package.extras] @@ -1846,19 +2256,22 @@ dev = ["meson-python (>=0.13.1,<0.17.0)", "pybind11 (>=2.13.2,!=2.13.3)", "setup [[package]] name = "matplotlib-inline" -version = "0.1.7" +version = "0.2.1" description = "Inline Matplotlib backend for Jupyter" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo", "dev"] 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"}, + {file = "matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76"}, + {file = "matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe"}, ] [package.dependencies] traitlets = "*" +[package.extras] +test = ["flake8", "nbdime", "nbval", "notebook", "pytest"] + [[package]] name = "mccabe" version = "0.7.0" @@ -1871,133 +2284,307 @@ files = [ {file = "mccabe-0.7.0.tar.gz", hash = "sha256:348e0240c33b60bbdf4e523192ef919f28cb2c3d7d5c7794f74009290f236325"}, ] +[[package]] +name = "mergedeep" +version = "1.3.4" +description = "A deep merge function for 🐍." +optional = false +python-versions = ">=3.6" +groups = ["docs"] +files = [ + {file = "mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307"}, + {file = "mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8"}, +] + [[package]] name = "mistune" -version = "3.1.3" +version = "3.2.0" description = "A sane and fast Markdown parser with useful plugins and renderers" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "mistune-3.1.3-py3-none-any.whl", hash = "sha256:1a32314113cff28aa6432e99e522677c8587fd83e3d51c29b82a52409c842bd9"}, - {file = "mistune-3.1.3.tar.gz", hash = "sha256:a7035c21782b2becb6be62f8f25d3df81ccb4d6fa477a6525b15af06539f02a0"}, + {file = "mistune-3.2.0-py3-none-any.whl", hash = "sha256:febdc629a3c78616b94393c6580551e0e34cc289987ec6c35ed3f4be42d0eee1"}, + {file = "mistune-3.2.0.tar.gz", hash = "sha256:708487c8a8cdd99c9d90eb3ed4c3ed961246ff78ac82f03418f5183ab70e398a"}, ] [package.dependencies] typing-extensions = {version = "*", markers = "python_version < \"3.11\""} +[[package]] +name = "mkdocs" +version = "1.6.1" +description = "Project documentation with Markdown." +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e"}, + {file = "mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2"}, +] + +[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) ; platform_system == \"Windows\"", "ghp-import (==1.0)", "importlib-metadata (==4.4) ; python_version < \"3.10\"", "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-autorefs" +version = "1.3.1" +description = "Automatically link across pages in MkDocs." +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "mkdocs_autorefs-1.3.1-py3-none-any.whl", hash = "sha256:18c504ae4d3ee7f344369bb26cb31d4105569ee252aab7d75ec2734c2c8b0474"}, + {file = "mkdocs_autorefs-1.3.1.tar.gz", hash = "sha256:a6d30cbcccae336d622a66c2418a3c92a8196b69782774529ad441abb23c0902"}, +] + +[package.dependencies] +Markdown = ">=3.3" +markupsafe = ">=2.0.1" +mkdocs = ">=1.1" + +[[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" +groups = ["docs"] +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.7.1" +description = "Documentation that simply works" +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "mkdocs_material-9.7.1-py3-none-any.whl", hash = "sha256:3f6100937d7d731f87f1e3e3b021c97f7239666b9ba1151ab476cabb96c60d5c"}, + {file = "mkdocs_material-9.7.1.tar.gz", hash = "sha256:89601b8f2c3e6c6ee0a918cc3566cb201d40bf37c3cd3c2067e26fadb8cce2b8"}, +] + +[package.dependencies] +babel = ">=2.10" +backrefs = ">=5.7.post1" +colorama = ">=0.4" +jinja2 = ">=3.1" +markdown = ">=3.2" +mkdocs = ">=1.6" +mkdocs-material-extensions = ">=1.3" +paginate = ">=0.5" +pygments = ">=2.16" +pymdown-extensions = ">=10.2" +requests = ">=2.30" + +[package.extras] +git = ["mkdocs-git-committers-plugin-2 (>=1.1,<3)", "mkdocs-git-revision-date-localized-plugin (>=1.2.4,<2.0)"] +imaging = ["cairosvg (>=2.6,<3.0)", "pillow (>=10.2,<12.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" +groups = ["docs"] +files = [ + {file = "mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31"}, + {file = "mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443"}, +] + +[[package]] +name = "mkdocstrings" +version = "0.25.0" +description = "Automatic documentation from sources, for MkDocs." +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "mkdocstrings-0.25.0-py3-none-any.whl", hash = "sha256:df1b63f26675fcde8c1b77e7ea996cd2f93220b148e06455428f676f5dc838f1"}, + {file = "mkdocstrings-0.25.0.tar.gz", hash = "sha256:066986b3fb5b9ef2d37c4417255a808f7e63b40ff8f67f6cab8054d903fbc91d"}, +] + +[package.dependencies] +click = ">=7.0" +Jinja2 = ">=2.11.1" +Markdown = ">=3.3" +MarkupSafe = ">=1.1" +mkdocs = ">=1.4" +mkdocs-autorefs = ">=0.3.1" +mkdocstrings-python = {version = ">=0.5.2", optional = true, markers = "extra == \"python\""} +platformdirs = ">=2.2.0" +pymdown-extensions = ">=6.3" + +[package.extras] +crystal = ["mkdocstrings-crystal (>=0.3.4)"] +python = ["mkdocstrings-python (>=0.5.2)"] +python-legacy = ["mkdocstrings-python-legacy (>=0.2.1)"] + +[[package]] +name = "mkdocstrings-python" +version = "1.10.9" +description = "A Python handler for mkdocstrings." +optional = false +python-versions = ">=3.8" +groups = ["docs"] +files = [ + {file = "mkdocstrings_python-1.10.9-py3-none-any.whl", hash = "sha256:cbe98710a6757dfd4dff79bf36cb9731908fb4c69dd2736b15270ae7a488243d"}, + {file = "mkdocstrings_python-1.10.9.tar.gz", hash = "sha256:f344aaa47e727d8a2dc911e063025e58e2b7fb31a41110ccc3902aa6be7ca196"}, +] + +[package.dependencies] +griffe = ">=0.49" +mkdocs-autorefs = ">=1.0" +mkdocstrings = ">=0.25" + [[package]] name = "msgpack" -version = "1.1.1" +version = "1.1.2" description = "MessagePack serializer" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "msgpack-1.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:353b6fc0c36fde68b661a12949d7d49f8f51ff5fa019c1e47c87c4ff34b080ed"}, - {file = "msgpack-1.1.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:79c408fcf76a958491b4e3b103d1c417044544b68e96d06432a189b43d1215c8"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:78426096939c2c7482bf31ef15ca219a9e24460289c00dd0b94411040bb73ad2"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8b17ba27727a36cb73aabacaa44b13090feb88a01d012c0f4be70c00f75048b4"}, - {file = "msgpack-1.1.1-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:7a17ac1ea6ec3c7687d70201cfda3b1e8061466f28f686c24f627cae4ea8efd0"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:88d1e966c9235c1d4e2afac21ca83933ba59537e2e2727a999bf3f515ca2af26"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:f6d58656842e1b2ddbe07f43f56b10a60f2ba5826164910968f5933e5178af75"}, - {file = "msgpack-1.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:96decdfc4adcbc087f5ea7ebdcfd3dee9a13358cae6e81d54be962efc38f6338"}, - {file = "msgpack-1.1.1-cp310-cp310-win32.whl", hash = "sha256:6640fd979ca9a212e4bcdf6eb74051ade2c690b862b679bfcb60ae46e6dc4bfd"}, - {file = "msgpack-1.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:8b65b53204fe1bd037c40c4148d00ef918eb2108d24c9aaa20bc31f9810ce0a8"}, - {file = "msgpack-1.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:71ef05c1726884e44f8b1d1773604ab5d4d17729d8491403a705e649116c9558"}, - {file = "msgpack-1.1.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:36043272c6aede309d29d56851f8841ba907a1a3d04435e43e8a19928e243c1d"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a32747b1b39c3ac27d0670122b57e6e57f28eefb725e0b625618d1b59bf9d1e0"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8a8b10fdb84a43e50d38057b06901ec9da52baac6983d3f709d8507f3889d43f"}, - {file = "msgpack-1.1.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:ba0c325c3f485dc54ec298d8b024e134acf07c10d494ffa24373bea729acf704"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:88daaf7d146e48ec71212ce21109b66e06a98e5e44dca47d853cbfe171d6c8d2"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:d8b55ea20dc59b181d3f47103f113e6f28a5e1c89fd5b67b9140edb442ab67f2"}, - {file = "msgpack-1.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4a28e8072ae9779f20427af07f53bbb8b4aa81151054e882aee333b158da8752"}, - {file = "msgpack-1.1.1-cp311-cp311-win32.whl", hash = "sha256:7da8831f9a0fdb526621ba09a281fadc58ea12701bc709e7b8cbc362feabc295"}, - {file = "msgpack-1.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:5fd1b58e1431008a57247d6e7cc4faa41c3607e8e7d4aaf81f7c29ea013cb458"}, - {file = "msgpack-1.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ae497b11f4c21558d95de9f64fff7053544f4d1a17731c866143ed6bb4591238"}, - {file = "msgpack-1.1.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:33be9ab121df9b6b461ff91baac6f2731f83d9b27ed948c5b9d1978ae28bf157"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6f64ae8fe7ffba251fecb8408540c34ee9df1c26674c50c4544d72dbf792e5ce"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a494554874691720ba5891c9b0b39474ba43ffb1aaf32a5dac874effb1619e1a"}, - {file = "msgpack-1.1.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:cb643284ab0ed26f6957d969fe0dd8bb17beb567beb8998140b5e38a90974f6c"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:d275a9e3c81b1093c060c3837e580c37f47c51eca031f7b5fb76f7b8470f5f9b"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4fd6b577e4541676e0cc9ddc1709d25014d3ad9a66caa19962c4f5de30fc09ef"}, - {file = "msgpack-1.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb29aaa613c0a1c40d1af111abf025f1732cab333f96f285d6a93b934738a68a"}, - {file = "msgpack-1.1.1-cp312-cp312-win32.whl", hash = "sha256:870b9a626280c86cff9c576ec0d9cbcc54a1e5ebda9cd26dab12baf41fee218c"}, - {file = "msgpack-1.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:5692095123007180dca3e788bb4c399cc26626da51629a31d40207cb262e67f4"}, - {file = "msgpack-1.1.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:3765afa6bd4832fc11c3749be4ba4b69a0e8d7b728f78e68120a157a4c5d41f0"}, - {file = "msgpack-1.1.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8ddb2bcfd1a8b9e431c8d6f4f7db0773084e107730ecf3472f1dfe9ad583f3d9"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:196a736f0526a03653d829d7d4c5500a97eea3648aebfd4b6743875f28aa2af8"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9d592d06e3cc2f537ceeeb23d38799c6ad83255289bb84c2e5792e5a8dea268a"}, - {file = "msgpack-1.1.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:4df2311b0ce24f06ba253fda361f938dfecd7b961576f9be3f3fbd60e87130ac"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:e4141c5a32b5e37905b5940aacbc59739f036930367d7acce7a64e4dec1f5e0b"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:b1ce7f41670c5a69e1389420436f41385b1aa2504c3b0c30620764b15dded2e7"}, - {file = "msgpack-1.1.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4147151acabb9caed4e474c3344181e91ff7a388b888f1e19ea04f7e73dc7ad5"}, - {file = "msgpack-1.1.1-cp313-cp313-win32.whl", hash = "sha256:500e85823a27d6d9bba1d057c871b4210c1dd6fb01fbb764e37e4e8847376323"}, - {file = "msgpack-1.1.1-cp313-cp313-win_amd64.whl", hash = "sha256:6d489fba546295983abd142812bda76b57e33d0b9f5d5b71c09a583285506f69"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bba1be28247e68994355e028dcd668316db30c1f758d3241a7b903ac78dcd285"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b8f93dcddb243159c9e4109c9750ba5b335ab8d48d9522c5308cd05d7e3ce600"}, - {file = "msgpack-1.1.1-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2fbbc0b906a24038c9958a1ba7ae0918ad35b06cb449d398b76a7d08470b0ed9"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:61e35a55a546a1690d9d09effaa436c25ae6130573b6ee9829c37ef0f18d5e78"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:1abfc6e949b352dadf4bce0eb78023212ec5ac42f6abfd469ce91d783c149c2a"}, - {file = "msgpack-1.1.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:996f2609ddf0142daba4cefd767d6db26958aac8439ee41db9cc0db9f4c4c3a6"}, - {file = "msgpack-1.1.1-cp38-cp38-win32.whl", hash = "sha256:4d3237b224b930d58e9d83c81c0dba7aacc20fcc2f89c1e5423aa0529a4cd142"}, - {file = "msgpack-1.1.1-cp38-cp38-win_amd64.whl", hash = "sha256:da8f41e602574ece93dbbda1fab24650d6bf2a24089f9e9dbb4f5730ec1e58ad"}, - {file = "msgpack-1.1.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:f5be6b6bc52fad84d010cb45433720327ce886009d862f46b26d4d154001994b"}, - {file = "msgpack-1.1.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:3a89cd8c087ea67e64844287ea52888239cbd2940884eafd2dcd25754fb72232"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d75f3807a9900a7d575d8d6674a3a47e9f227e8716256f35bc6f03fc597ffbf"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d182dac0221eb8faef2e6f44701812b467c02674a322c739355c39e94730cdbf"}, - {file = "msgpack-1.1.1-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1b13fe0fb4aac1aa5320cd693b297fe6fdef0e7bea5518cbc2dd5299f873ae90"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:435807eeb1bc791ceb3247d13c79868deb22184e1fc4224808750f0d7d1affc1"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:4835d17af722609a45e16037bb1d4d78b7bdf19d6c0128116d178956618c4e88"}, - {file = "msgpack-1.1.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:a8ef6e342c137888ebbfb233e02b8fbd689bb5b5fcc59b34711ac47ebd504478"}, - {file = "msgpack-1.1.1-cp39-cp39-win32.whl", hash = "sha256:61abccf9de335d9efd149e2fff97ed5974f2481b3353772e8e2dd3402ba2bd57"}, - {file = "msgpack-1.1.1-cp39-cp39-win_amd64.whl", hash = "sha256:40eae974c873b2992fd36424a5d9407f93e97656d999f43fca9d29f820899084"}, - {file = "msgpack-1.1.1.tar.gz", hash = "sha256:77b79ce34a2bdab2594f490c8e80dd62a02d650b91a75159a63ec413b8d104cd"}, + {file = "msgpack-1.1.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0051fffef5a37ca2cd16978ae4f0aef92f164df86823871b5162812bebecd8e2"}, + {file = "msgpack-1.1.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a605409040f2da88676e9c9e5853b3449ba8011973616189ea5ee55ddbc5bc87"}, + {file = "msgpack-1.1.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8b696e83c9f1532b4af884045ba7f3aa741a63b2bc22617293a2c6a7c645f251"}, + {file = "msgpack-1.1.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:365c0bbe981a27d8932da71af63ef86acc59ed5c01ad929e09a0b88c6294e28a"}, + {file = "msgpack-1.1.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:41d1a5d875680166d3ac5c38573896453bbbea7092936d2e107214daf43b1d4f"}, + {file = "msgpack-1.1.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:354e81bcdebaab427c3df4281187edc765d5d76bfb3a7c125af9da7a27e8458f"}, + {file = "msgpack-1.1.2-cp310-cp310-win32.whl", hash = "sha256:e64c8d2f5e5d5fda7b842f55dec6133260ea8f53c4257d64494c534f306bf7a9"}, + {file = "msgpack-1.1.2-cp310-cp310-win_amd64.whl", hash = "sha256:db6192777d943bdaaafb6ba66d44bf65aa0e9c5616fa1d2da9bb08828c6b39aa"}, + {file = "msgpack-1.1.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:2e86a607e558d22985d856948c12a3fa7b42efad264dca8a3ebbcfa2735d786c"}, + {file = "msgpack-1.1.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:283ae72fc89da59aa004ba147e8fc2f766647b1251500182fac0350d8af299c0"}, + {file = "msgpack-1.1.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61c8aa3bd513d87c72ed0b37b53dd5c5a0f58f2ff9f26e1555d3bd7948fb7296"}, + {file = "msgpack-1.1.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:454e29e186285d2ebe65be34629fa0e8605202c60fbc7c4c650ccd41870896ef"}, + {file = "msgpack-1.1.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7bc8813f88417599564fafa59fd6f95be417179f76b40325b500b3c98409757c"}, + {file = "msgpack-1.1.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bafca952dc13907bdfdedfc6a5f579bf4f292bdd506fadb38389afa3ac5b208e"}, + {file = "msgpack-1.1.2-cp311-cp311-win32.whl", hash = "sha256:602b6740e95ffc55bfb078172d279de3773d7b7db1f703b2f1323566b878b90e"}, + {file = "msgpack-1.1.2-cp311-cp311-win_amd64.whl", hash = "sha256:d198d275222dc54244bf3327eb8cbe00307d220241d9cec4d306d49a44e85f68"}, + {file = "msgpack-1.1.2-cp311-cp311-win_arm64.whl", hash = "sha256:86f8136dfa5c116365a8a651a7d7484b65b13339731dd6faebb9a0242151c406"}, + {file = "msgpack-1.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:70a0dff9d1f8da25179ffcf880e10cf1aad55fdb63cd59c9a49a1b82290062aa"}, + {file = "msgpack-1.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:446abdd8b94b55c800ac34b102dffd2f6aa0ce643c55dfc017ad89347db3dbdb"}, + {file = "msgpack-1.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c63eea553c69ab05b6747901b97d620bb2a690633c77f23feb0c6a947a8a7b8f"}, + {file = "msgpack-1.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:372839311ccf6bdaf39b00b61288e0557916c3729529b301c52c2d88842add42"}, + {file = "msgpack-1.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2929af52106ca73fcb28576218476ffbb531a036c2adbcf54a3664de124303e9"}, + {file = "msgpack-1.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:be52a8fc79e45b0364210eef5234a7cf8d330836d0a64dfbb878efa903d84620"}, + {file = "msgpack-1.1.2-cp312-cp312-win32.whl", hash = "sha256:1fff3d825d7859ac888b0fbda39a42d59193543920eda9d9bea44d958a878029"}, + {file = "msgpack-1.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:1de460f0403172cff81169a30b9a92b260cb809c4cb7e2fc79ae8d0510c78b6b"}, + {file = "msgpack-1.1.2-cp312-cp312-win_arm64.whl", hash = "sha256:be5980f3ee0e6bd44f3a9e9dea01054f175b50c3e6cdb692bc9424c0bbb8bf69"}, + {file = "msgpack-1.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:4efd7b5979ccb539c221a4c4e16aac1a533efc97f3b759bb5a5ac9f6d10383bf"}, + {file = "msgpack-1.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:42eefe2c3e2af97ed470eec850facbe1b5ad1d6eacdbadc42ec98e7dcf68b4b7"}, + {file = "msgpack-1.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1fdf7d83102bf09e7ce3357de96c59b627395352a4024f6e2458501f158bf999"}, + {file = "msgpack-1.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fac4be746328f90caa3cd4bc67e6fe36ca2bf61d5c6eb6d895b6527e3f05071e"}, + {file = "msgpack-1.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fffee09044073e69f2bad787071aeec727183e7580443dfeb8556cbf1978d162"}, + {file = "msgpack-1.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:5928604de9b032bc17f5099496417f113c45bc6bc21b5c6920caf34b3c428794"}, + {file = "msgpack-1.1.2-cp313-cp313-win32.whl", hash = "sha256:a7787d353595c7c7e145e2331abf8b7ff1e6673a6b974ded96e6d4ec09f00c8c"}, + {file = "msgpack-1.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:a465f0dceb8e13a487e54c07d04ae3ba131c7c5b95e2612596eafde1dccf64a9"}, + {file = "msgpack-1.1.2-cp313-cp313-win_arm64.whl", hash = "sha256:e69b39f8c0aa5ec24b57737ebee40be647035158f14ed4b40e6f150077e21a84"}, + {file = "msgpack-1.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:e23ce8d5f7aa6ea6d2a2b326b4ba46c985dbb204523759984430db7114f8aa00"}, + {file = "msgpack-1.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6c15b7d74c939ebe620dd8e559384be806204d73b4f9356320632d783d1f7939"}, + {file = "msgpack-1.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:99e2cb7b9031568a2a5c73aa077180f93dd2e95b4f8d3b8e14a73ae94a9e667e"}, + {file = "msgpack-1.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:180759d89a057eab503cf62eeec0aa61c4ea1200dee709f3a8e9397dbb3b6931"}, + {file = "msgpack-1.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:04fb995247a6e83830b62f0b07bf36540c213f6eac8e851166d8d86d83cbd014"}, + {file = "msgpack-1.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:8e22ab046fa7ede9e36eeb4cfad44d46450f37bb05d5ec482b02868f451c95e2"}, + {file = "msgpack-1.1.2-cp314-cp314-win32.whl", hash = "sha256:80a0ff7d4abf5fecb995fcf235d4064b9a9a8a40a3ab80999e6ac1e30b702717"}, + {file = "msgpack-1.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:9ade919fac6a3e7260b7f64cea89df6bec59104987cbea34d34a2fa15d74310b"}, + {file = "msgpack-1.1.2-cp314-cp314-win_arm64.whl", hash = "sha256:59415c6076b1e30e563eb732e23b994a61c159cec44deaf584e5cc1dd662f2af"}, + {file = "msgpack-1.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:897c478140877e5307760b0ea66e0932738879e7aa68144d9b78ea4c8302a84a"}, + {file = "msgpack-1.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a668204fa43e6d02f89dbe79a30b0d67238d9ec4c5bd8a940fc3a004a47b721b"}, + {file = "msgpack-1.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5559d03930d3aa0f3aacb4c42c776af1a2ace2611871c84a75afe436695e6245"}, + {file = "msgpack-1.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:70c5a7a9fea7f036b716191c29047374c10721c389c21e9ffafad04df8c52c90"}, + {file = "msgpack-1.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:f2cb069d8b981abc72b41aea1c580ce92d57c673ec61af4c500153a626cb9e20"}, + {file = "msgpack-1.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d62ce1f483f355f61adb5433ebfd8868c5f078d1a52d042b0a998682b4fa8c27"}, + {file = "msgpack-1.1.2-cp314-cp314t-win32.whl", hash = "sha256:1d1418482b1ee984625d88aa9585db570180c286d942da463533b238b98b812b"}, + {file = "msgpack-1.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:5a46bf7e831d09470ad92dff02b8b1ac92175ca36b087f904a0519857c6be3ff"}, + {file = "msgpack-1.1.2-cp314-cp314t-win_arm64.whl", hash = "sha256:d99ef64f349d5ec3293688e91486c5fdb925ed03807f64d98d205d2713c60b46"}, + {file = "msgpack-1.1.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:ea5405c46e690122a76531ab97a079e184c0daf491e588592d6a23d3e32af99e"}, + {file = "msgpack-1.1.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:9fba231af7a933400238cb357ecccf8ab5d51535ea95d94fc35b7806218ff844"}, + {file = "msgpack-1.1.2-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a8f6e7d30253714751aa0b0c84ae28948e852ee7fb0524082e6716769124bc23"}, + {file = "msgpack-1.1.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:94fd7dc7d8cb0a54432f296f2246bc39474e017204ca6f4ff345941d4ed285a7"}, + {file = "msgpack-1.1.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:350ad5353a467d9e3b126d8d1b90fe05ad081e2e1cef5753f8c345217c37e7b8"}, + {file = "msgpack-1.1.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:6bde749afe671dc44893f8d08e83bf475a1a14570d67c4bb5cec5573463c8833"}, + {file = "msgpack-1.1.2-cp39-cp39-win32.whl", hash = "sha256:ad09b984828d6b7bb52d1d1d0c9be68ad781fa004ca39216c8a1e63c0f34ba3c"}, + {file = "msgpack-1.1.2-cp39-cp39-win_amd64.whl", hash = "sha256:67016ae8c8965124fdede9d3769528ad8284f14d635337ffa6a713a580f6c030"}, + {file = "msgpack-1.1.2.tar.gz", hash = "sha256:3b60763c1373dd60f398488069bcdc703cd08a711477b5d480eecc9f9626f47e"}, ] [[package]] name = "mypy" -version = "1.17.0" +version = "1.19.1" description = "Optional static typing for Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "mypy-1.17.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f8e08de6138043108b3b18f09d3f817a4783912e48828ab397ecf183135d84d6"}, - {file = "mypy-1.17.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ce4a17920ec144647d448fc43725b5873548b1aae6c603225626747ededf582d"}, - {file = "mypy-1.17.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6ff25d151cc057fdddb1cb1881ef36e9c41fa2a5e78d8dd71bee6e4dcd2bc05b"}, - {file = "mypy-1.17.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93468cf29aa9a132bceb103bd8475f78cacde2b1b9a94fd978d50d4bdf616c9a"}, - {file = "mypy-1.17.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:98189382b310f16343151f65dd7e6867386d3e35f7878c45cfa11383d175d91f"}, - {file = "mypy-1.17.0-cp310-cp310-win_amd64.whl", hash = "sha256:c004135a300ab06a045c1c0d8e3f10215e71d7b4f5bb9a42ab80236364429937"}, - {file = "mypy-1.17.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9d4fe5c72fd262d9c2c91c1117d16aac555e05f5beb2bae6a755274c6eec42be"}, - {file = "mypy-1.17.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d96b196e5c16f41b4f7736840e8455958e832871990c7ba26bf58175e357ed61"}, - {file = "mypy-1.17.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:73a0ff2dd10337ceb521c080d4147755ee302dcde6e1a913babd59473904615f"}, - {file = "mypy-1.17.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:24cfcc1179c4447854e9e406d3af0f77736d631ec87d31c6281ecd5025df625d"}, - {file = "mypy-1.17.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3c56f180ff6430e6373db7a1d569317675b0a451caf5fef6ce4ab365f5f2f6c3"}, - {file = "mypy-1.17.0-cp311-cp311-win_amd64.whl", hash = "sha256:eafaf8b9252734400f9b77df98b4eee3d2eecab16104680d51341c75702cad70"}, - {file = "mypy-1.17.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f986f1cab8dbec39ba6e0eaa42d4d3ac6686516a5d3dccd64be095db05ebc6bb"}, - {file = "mypy-1.17.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51e455a54d199dd6e931cd7ea987d061c2afbaf0960f7f66deef47c90d1b304d"}, - {file = "mypy-1.17.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3204d773bab5ff4ebbd1f8efa11b498027cd57017c003ae970f310e5b96be8d8"}, - {file = "mypy-1.17.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1051df7ec0886fa246a530ae917c473491e9a0ba6938cfd0ec2abc1076495c3e"}, - {file = "mypy-1.17.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f773c6d14dcc108a5b141b4456b0871df638eb411a89cd1c0c001fc4a9d08fc8"}, - {file = "mypy-1.17.0-cp312-cp312-win_amd64.whl", hash = "sha256:1619a485fd0e9c959b943c7b519ed26b712de3002d7de43154a489a2d0fd817d"}, - {file = "mypy-1.17.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:2c41aa59211e49d717d92b3bb1238c06d387c9325d3122085113c79118bebb06"}, - {file = "mypy-1.17.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0e69db1fb65b3114f98c753e3930a00514f5b68794ba80590eb02090d54a5d4a"}, - {file = "mypy-1.17.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:03ba330b76710f83d6ac500053f7727270b6b8553b0423348ffb3af6f2f7b889"}, - {file = "mypy-1.17.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:037bc0f0b124ce46bfde955c647f3e395c6174476a968c0f22c95a8d2f589bba"}, - {file = "mypy-1.17.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c38876106cb6132259683632b287238858bd58de267d80defb6f418e9ee50658"}, - {file = "mypy-1.17.0-cp313-cp313-win_amd64.whl", hash = "sha256:d30ba01c0f151998f367506fab31c2ac4527e6a7b2690107c7a7f9e3cb419a9c"}, - {file = "mypy-1.17.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:63e751f1b5ab51d6f3d219fe3a2fe4523eaa387d854ad06906c63883fde5b1ab"}, - {file = "mypy-1.17.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:f7fb09d05e0f1c329a36dcd30e27564a3555717cde87301fae4fb542402ddfad"}, - {file = "mypy-1.17.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b72c34ce05ac3a1361ae2ebb50757fb6e3624032d91488d93544e9f82db0ed6c"}, - {file = "mypy-1.17.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:434ad499ad8dde8b2f6391ddfa982f41cb07ccda8e3c67781b1bfd4e5f9450a8"}, - {file = "mypy-1.17.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:f105f61a5eff52e137fd73bee32958b2add9d9f0a856f17314018646af838e97"}, - {file = "mypy-1.17.0-cp39-cp39-win_amd64.whl", hash = "sha256:ba06254a5a22729853209550d80f94e28690d5530c661f9416a68ac097b13fc4"}, - {file = "mypy-1.17.0-py3-none-any.whl", hash = "sha256:15d9d0018237ab058e5de3d8fce61b6fa72cc59cc78fd91f1b474bce12abf496"}, - {file = "mypy-1.17.0.tar.gz", hash = "sha256:e5d7ccc08ba089c06e2f5629c660388ef1fee708444f1dee0b9203fa031dee03"}, + {file = "mypy-1.19.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:5f05aa3d375b385734388e844bc01733bd33c644ab48e9684faa54e5389775ec"}, + {file = "mypy-1.19.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:022ea7279374af1a5d78dfcab853fe6a536eebfda4b59deab53cd21f6cd9f00b"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee4c11e460685c3e0c64a4c5de82ae143622410950d6be863303a1c4ba0e36d6"}, + {file = "mypy-1.19.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:de759aafbae8763283b2ee5869c7255391fbc4de3ff171f8f030b5ec48381b74"}, + {file = "mypy-1.19.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ab43590f9cd5108f41aacf9fca31841142c786827a74ab7cc8a2eacb634e09a1"}, + {file = "mypy-1.19.1-cp310-cp310-win_amd64.whl", hash = "sha256:2899753e2f61e571b3971747e302d5f420c3fd09650e1951e99f823bc3089dac"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:d8dfc6ab58ca7dda47d9237349157500468e404b17213d44fc1cb77bce532288"}, + {file = "mypy-1.19.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e3f276d8493c3c97930e354b2595a44a21348b320d859fb4a2b9f66da9ed27ab"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2abb24cf3f17864770d18d673c85235ba52456b36a06b6afc1e07c1fdcd3d0e6"}, + {file = "mypy-1.19.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a009ffa5a621762d0c926a078c2d639104becab69e79538a494bcccb62cc0331"}, + {file = "mypy-1.19.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f7cee03c9a2e2ee26ec07479f38ea9c884e301d42c6d43a19d20fb014e3ba925"}, + {file = "mypy-1.19.1-cp311-cp311-win_amd64.whl", hash = "sha256:4b84a7a18f41e167f7995200a1d07a4a6810e89d29859df936f1c3923d263042"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a8174a03289288c1f6c46d55cef02379b478bfbc8e358e02047487cad44c6ca1"}, + {file = "mypy-1.19.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffcebe56eb09ff0c0885e750036a095e23793ba6c2e894e7e63f6d89ad51f22e"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b64d987153888790bcdb03a6473d321820597ab8dd9243b27a92153c4fa50fd2"}, + {file = "mypy-1.19.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c35d298c2c4bba75feb2195655dfea8124d855dfd7343bf8b8c055421eaf0cf8"}, + {file = "mypy-1.19.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:34c81968774648ab5ac09c29a375fdede03ba253f8f8287847bd480782f73a6a"}, + {file = "mypy-1.19.1-cp312-cp312-win_amd64.whl", hash = "sha256:b10e7c2cd7870ba4ad9b2d8a6102eb5ffc1f16ca35e3de6bfa390c1113029d13"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e3157c7594ff2ef1634ee058aafc56a82db665c9438fd41b390f3bde1ab12250"}, + {file = "mypy-1.19.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdb12f69bcc02700c2b47e070238f42cb87f18c0bc1fc4cdb4fb2bc5fd7a3b8b"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f859fb09d9583a985be9a493d5cfc5515b56b08f7447759a0c5deaf68d80506e"}, + {file = "mypy-1.19.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c9a6538e0415310aad77cb94004ca6482330fece18036b5f360b62c45814c4ef"}, + {file = "mypy-1.19.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:da4869fc5e7f62a88f3fe0b5c919d1d9f7ea3cef92d3689de2823fd27e40aa75"}, + {file = "mypy-1.19.1-cp313-cp313-win_amd64.whl", hash = "sha256:016f2246209095e8eda7538944daa1d60e1e8134d98983b9fc1e92c1fc0cb8dd"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:06e6170bd5836770e8104c8fdd58e5e725cfeb309f0a6c681a811f557e97eac1"}, + {file = "mypy-1.19.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:804bd67b8054a85447c8954215a906d6eff9cabeabe493fb6334b24f4bfff718"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:21761006a7f497cb0d4de3d8ef4ca70532256688b0523eee02baf9eec895e27b"}, + {file = "mypy-1.19.1-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:28902ee51f12e0f19e1e16fbe2f8f06b6637f482c459dd393efddd0ec7f82045"}, + {file = "mypy-1.19.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:481daf36a4c443332e2ae9c137dfee878fcea781a2e3f895d54bd3002a900957"}, + {file = "mypy-1.19.1-cp314-cp314-win_amd64.whl", hash = "sha256:8bb5c6f6d043655e055be9b542aa5f3bdd30e4f3589163e85f93f3640060509f"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7bcfc336a03a1aaa26dfce9fff3e287a3ba99872a157561cbfcebe67c13308e3"}, + {file = "mypy-1.19.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:b7951a701c07ea584c4fe327834b92a30825514c868b1f69c30445093fdd9d5a"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b13cfdd6c87fc3efb69ea4ec18ef79c74c3f98b4e5498ca9b85ab3b2c2329a67"}, + {file = "mypy-1.19.1-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f28f99c824ecebcdaa2e55d82953e38ff60ee5ec938476796636b86afa3956e"}, + {file = "mypy-1.19.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c608937067d2fc5a4dd1a5ce92fd9e1398691b8c5d012d66e1ddd430e9244376"}, + {file = "mypy-1.19.1-cp39-cp39-win_amd64.whl", hash = "sha256:409088884802d511ee52ca067707b90c883426bd95514e8cfda8281dc2effe24"}, + {file = "mypy-1.19.1-py3-none-any.whl", hash = "sha256:f1235f5ea01b7db5468d53ece6aaddf1ad0b88d9e7462b86ef96fe04995d7247"}, + {file = "mypy-1.19.1.tar.gz", hash = "sha256:19d88bb05303fe63f71dd2c6270daca27cb9401c4ca8255fe50d1d920e0eb9ba"}, ] [package.dependencies] +librt = {version = ">=0.6.2", markers = "platform_python_implementation != \"PyPy\""} mypy_extensions = ">=1.0.0" pathspec = ">=0.9.0" tomli = {version = ">=1.1.0", markers = "python_version < \"3.11\""} @@ -2024,20 +2611,20 @@ files = [ [[package]] name = "narwhals" -version = "1.48.0" +version = "2.14.0" description = "Extremely lightweight compatibility layer between dataframe libraries" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "narwhals-1.48.0-py3-none-any.whl", hash = "sha256:2bbddc3adeed0c5b15ead8fe61f1d5e459f00c1d2fa60921e52a0f9bdc06077d"}, - {file = "narwhals-1.48.0.tar.gz", hash = "sha256:7243b456cbdb60edb148731a8f9b203f473a373a249ad66c699362508730e63f"}, + {file = "narwhals-2.14.0-py3-none-any.whl", hash = "sha256:b56796c9a00179bd757d15282c540024e1d5c910b19b8c9944d836566c030acf"}, + {file = "narwhals-2.14.0.tar.gz", hash = "sha256:98be155c3599db4d5c211e565c3190c398c87e7bf5b3cdb157dece67641946e0"}, ] [package.extras] cudf = ["cudf (>=24.10.0)"] dask = ["dask[dataframe] (>=2024.8)"] -duckdb = ["duckdb (>=1.0)"] +duckdb = ["duckdb (>=1.1)"] ibis = ["ibis-framework (>=6.0.0)", "packaging", "pyarrow-hotfix", "rich"] modin = ["modin"] pandas = ["pandas (>=1.1.3)"] @@ -2045,30 +2632,30 @@ polars = ["polars (>=0.20.4)"] pyarrow = ["pyarrow (>=13.0.0)"] pyspark = ["pyspark (>=3.5.0)"] pyspark-connect = ["pyspark[connect] (>=3.5.0)"] -sqlframe = ["sqlframe (>=3.22.0)"] +sqlframe = ["sqlframe (>=3.22.0,!=3.39.3)"] [[package]] name = "nbclient" -version = "0.10.2" +version = "0.10.4" description = "A client library for executing notebooks. Formerly nbconvert's ExecutePreprocessor." optional = false -python-versions = ">=3.9.0" +python-versions = ">=3.10.0" groups = ["main", "demo"] files = [ - {file = "nbclient-0.10.2-py3-none-any.whl", hash = "sha256:4ffee11e788b4a27fabeb7955547e4318a5298f34342a4bfd01f2e1faaeadc3d"}, - {file = "nbclient-0.10.2.tar.gz", hash = "sha256:90b7fc6b810630db87a6d0c2250b1f0ab4cf4d3c27a299b0cde78a4ed3fd9193"}, + {file = "nbclient-0.10.4-py3-none-any.whl", hash = "sha256:9162df5a7373d70d606527300a95a975a47c137776cd942e52d9c7e29ff83440"}, + {file = "nbclient-0.10.4.tar.gz", hash = "sha256:1e54091b16e6da39e297b0ece3e10f6f29f4ac4e8ee515d29f8a7099bd6553c9"}, ] [package.dependencies] jupyter-client = ">=6.1.12" jupyter-core = ">=4.12,<5.0.dev0 || >=5.1.dev0" -nbformat = ">=5.1" +nbformat = ">=5.1.3" traitlets = ">=5.4" [package.extras] dev = ["pre-commit"] -docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] -test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=7.0,<8)", "pytest-asyncio", "pytest-cov (>=4.0)", "testpath", "xmltodict"] +docs = ["autodoc-traits", "flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "mock", "moto", "myst-parser", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "sphinx (>=1.7)", "sphinx-book-theme", "sphinxcontrib-spelling", "testpath", "xmltodict"] +test = ["flaky", "ipykernel (>=6.19.3)", "ipython", "ipywidgets", "nbconvert (>=7.1.0)", "pytest (>=9.0.1,<10)", "pytest-asyncio (>=1.3.0)", "pytest-cov (>=4.0)", "testpath", "xmltodict"] [[package]] name = "nbconvert" @@ -2166,6 +2753,7 @@ description = "Fundamental package for array computing in Python" optional = false python-versions = ">=3.10" groups = ["main", "demo"] +markers = "python_version == \"3.10\"" files = [ {file = "numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb"}, {file = "numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90"}, @@ -2224,24 +2812,125 @@ files = [ {file = "numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd"}, ] +[[package]] +name = "numpy" +version = "2.4.0" +description = "Fundamental package for array computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main", "demo", "dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "numpy-2.4.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:316b2f2584682318539f0bcaca5a496ce9ca78c88066579ebd11fd06f8e4741e"}, + {file = "numpy-2.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a2718c1de8504121714234b6f8241d0019450353276c88b9453c9c3d92e101db"}, + {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:21555da4ec4a0c942520ead42c3b0dc9477441e085c42b0fbdd6a084869a6f6b"}, + {file = "numpy-2.4.0-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:413aa561266a4be2d06cd2b9665e89d9f54c543f418773076a76adcf2af08bc7"}, + {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0feafc9e03128074689183031181fac0897ff169692d8492066e949041096548"}, + {file = "numpy-2.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a8fdfed3deaf1928fb7667d96e0567cdf58c2b370ea2ee7e586aa383ec2cb346"}, + {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e06a922a469cae9a57100864caf4f8a97a1026513793969f8ba5b63137a35d25"}, + {file = "numpy-2.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:927ccf5cd17c48f801f4ed43a7e5673a2724bd2171460be3e3894e6e332ef83a"}, + {file = "numpy-2.4.0-cp311-cp311-win32.whl", hash = "sha256:882567b7ae57c1b1a0250208cc21a7976d8cbcc49d5a322e607e6f09c9e0bd53"}, + {file = "numpy-2.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:8b986403023c8f3bf8f487c2e6186afda156174d31c175f747d8934dfddf3479"}, + {file = "numpy-2.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:3f3096405acc48887458bbf9f6814d43785ac7ba2a57ea6442b581dedbc60ce6"}, + {file = "numpy-2.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2a8b6bb8369abefb8bd1801b054ad50e02b3275c8614dc6e5b0373c305291037"}, + {file = "numpy-2.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2e284ca13d5a8367e43734148622caf0b261b275673823593e3e3634a6490f83"}, + {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:49ff32b09f5aa0cd30a20c2b39db3e669c845589f2b7fc910365210887e39344"}, + {file = "numpy-2.4.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:36cbfb13c152b1c7c184ddac43765db8ad672567e7bafff2cc755a09917ed2e6"}, + {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35ddc8f4914466e6fc954c76527aa91aa763682a4f6d73249ef20b418fe6effb"}, + {file = "numpy-2.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc578891de1db95b2a35001b695451767b580bb45753717498213c5ff3c41d63"}, + {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:98e81648e0b36e325ab67e46b5400a7a6d4a22b8a7c8e8bbfe20e7db7906bf95"}, + {file = "numpy-2.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d57b5046c120561ba8fa8e4030fbb8b822f3063910fa901ffadf16e2b7128ad6"}, + {file = "numpy-2.4.0-cp312-cp312-win32.whl", hash = "sha256:92190db305a6f48734d3982f2c60fa30d6b5ee9bff10f2887b930d7b40119f4c"}, + {file = "numpy-2.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:680060061adb2d74ce352628cb798cfdec399068aa7f07ba9fb818b2b3305f98"}, + {file = "numpy-2.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:39699233bc72dd482da1415dcb06076e32f60eddc796a796c5fb6c5efce94667"}, + {file = "numpy-2.4.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:a152d86a3ae00ba5f47b3acf3b827509fd0b6cb7d3259665e63dafbad22a75ea"}, + {file = "numpy-2.4.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:39b19251dec4de8ff8496cd0806cbe27bf0684f765abb1f4809554de93785f2d"}, + {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:009bd0ea12d3c784b6639a8457537016ce5172109e585338e11334f6a7bb88ee"}, + {file = "numpy-2.4.0-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:5fe44e277225fd3dff6882d86d3d447205d43532c3627313d17e754fb3905a0e"}, + {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f935c4493eda9069851058fa0d9e39dbf6286be690066509305e52912714dbb2"}, + {file = "numpy-2.4.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8cfa5f29a695cb7438965e6c3e8d06e0416060cf0d709c1b1c1653a939bf5c2a"}, + {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ba0cb30acd3ef11c94dc27fbfba68940652492bc107075e7ffe23057f9425681"}, + {file = "numpy-2.4.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:60e8c196cd82cbbd4f130b5290007e13e6de3eca79f0d4d38014769d96a7c475"}, + {file = "numpy-2.4.0-cp313-cp313-win32.whl", hash = "sha256:5f48cb3e88fbc294dc90e215d86fbaf1c852c63dbdb6c3a3e63f45c4b57f7344"}, + {file = "numpy-2.4.0-cp313-cp313-win_amd64.whl", hash = "sha256:a899699294f28f7be8992853c0c60741f16ff199205e2e6cdca155762cbaa59d"}, + {file = "numpy-2.4.0-cp313-cp313-win_arm64.whl", hash = "sha256:9198f447e1dc5647d07c9a6bbe2063cc0132728cc7175b39dbc796da5b54920d"}, + {file = "numpy-2.4.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74623f2ab5cc3f7c886add4f735d1031a1d2be4a4ae63c0546cfd74e7a31ddf6"}, + {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:0804a8e4ab070d1d35496e65ffd3cf8114c136a2b81f61dfab0de4b218aacfd5"}, + {file = "numpy-2.4.0-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:02a2038eb27f9443a8b266a66911e926566b5a6ffd1a689b588f7f35b81e7dc3"}, + {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1889b3a3f47a7b5bee16bc25a2145bd7cb91897f815ce3499db64c7458b6d91d"}, + {file = "numpy-2.4.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:85eef4cb5625c47ee6425c58a3502555e10f45ee973da878ac8248ad58c136f3"}, + {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:6dc8b7e2f4eb184b37655195f421836cfae6f58197b67e3ffc501f1333d993fa"}, + {file = "numpy-2.4.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:44aba2f0cafd287871a495fb3163408b0bd25bbce135c6f621534a07f4f7875c"}, + {file = "numpy-2.4.0-cp313-cp313t-win32.whl", hash = "sha256:20c115517513831860c573996e395707aa9fb691eb179200125c250e895fcd93"}, + {file = "numpy-2.4.0-cp313-cp313t-win_amd64.whl", hash = "sha256:b48e35f4ab6f6a7597c46e301126ceba4c44cd3280e3750f85db48b082624fa4"}, + {file = "numpy-2.4.0-cp313-cp313t-win_arm64.whl", hash = "sha256:4d1cfce39e511069b11e67cd0bd78ceff31443b7c9e5c04db73c7a19f572967c"}, + {file = "numpy-2.4.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c95eb6db2884917d86cde0b4d4cf31adf485c8ec36bf8696dd66fa70de96f36b"}, + {file = "numpy-2.4.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:65167da969cd1ec3a1df31cb221ca3a19a8aaa25370ecb17d428415e93c1935e"}, + {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:3de19cfecd1465d0dcf8a5b5ea8b3155b42ed0b639dba4b71e323d74f2a3be5e"}, + {file = "numpy-2.4.0-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6c05483c3136ac4c91b4e81903cb53a8707d316f488124d0398499a4f8e8ef51"}, + {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:36667db4d6c1cea79c8930ab72fadfb4060feb4bfe724141cd4bd064d2e5f8ce"}, + {file = "numpy-2.4.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a818668b674047fd88c4cddada7ab8f1c298812783e8328e956b78dc4807f9f"}, + {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1ee32359fb7543b7b7bd0b2f46294db27e29e7bbdf70541e81b190836cd83ded"}, + {file = "numpy-2.4.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e493962256a38f58283de033d8af176c5c91c084ea30f15834f7545451c42059"}, + {file = "numpy-2.4.0-cp314-cp314-win32.whl", hash = "sha256:6bbaebf0d11567fa8926215ae731e1d58e6ec28a8a25235b8a47405d301332db"}, + {file = "numpy-2.4.0-cp314-cp314-win_amd64.whl", hash = "sha256:3d857f55e7fdf7c38ab96c4558c95b97d1c685be6b05c249f5fdafcbd6f9899e"}, + {file = "numpy-2.4.0-cp314-cp314-win_arm64.whl", hash = "sha256:bb50ce5fb202a26fd5404620e7ef820ad1ab3558b444cb0b55beb7ef66cd2d63"}, + {file = "numpy-2.4.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:355354388cba60f2132df297e2d53053d4063f79077b67b481d21276d61fc4df"}, + {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:1d8f9fde5f6dc1b6fc34df8162f3b3079365468703fee7f31d4e0cc8c63baed9"}, + {file = "numpy-2.4.0-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:e0434aa22c821f44eeb4c650b81c7fbdd8c0122c6c4b5a576a76d5a35625ecd9"}, + {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40483b2f2d3ba7aad426443767ff5632ec3156ef09742b96913787d13c336471"}, + {file = "numpy-2.4.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9e6a7664ddd9746e20b7325351fe1a8408d0a2bf9c63b5e898290ddc8f09544"}, + {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ecb0019d44f4cdb50b676c5d0cb4b1eae8e15d1ed3d3e6639f986fc92b2ec52c"}, + {file = "numpy-2.4.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d0ffd9e2e4441c96a9c91ec1783285d80bf835b677853fc2770a89d50c1e48ac"}, + {file = "numpy-2.4.0-cp314-cp314t-win32.whl", hash = "sha256:77f0d13fa87036d7553bf81f0e1fe3ce68d14c9976c9851744e4d3e91127e95f"}, + {file = "numpy-2.4.0-cp314-cp314t-win_amd64.whl", hash = "sha256:b1f5b45829ac1848893f0ddf5cb326110604d6df96cdc255b0bf9edd154104d4"}, + {file = "numpy-2.4.0-cp314-cp314t-win_arm64.whl", hash = "sha256:23a3e9d1a6f360267e8fbb38ba5db355a6a7e9be71d7fce7ab3125e88bb646c8"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b54c83f1c0c0f1d748dca0af516062b8829d53d1f0c402be24b4257a9c48ada6"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:aabb081ca0ec5d39591fc33018cd4b3f96e1a2dd6756282029986d00a785fba4"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:8eafe7c36c8430b7794edeab3087dec7bf31d634d92f2af9949434b9d1964cba"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:2f585f52b2baf07ff3356158d9268ea095e221371f1074fadea2f42544d58b4d"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:32ed06d0fe9cae27d8fb5f400c63ccee72370599c75e683a6358dd3a4fb50aaf"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:57c540ed8fb1f05cb997c6761cd56db72395b0d6985e90571ff660452ade4f98"}, + {file = "numpy-2.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a39fb973a726e63223287adc6dafe444ce75af952d711e400f3bf2b36ef55a7b"}, + {file = "numpy-2.4.0.tar.gz", hash = "sha256:6e504f7b16118198f138ef31ba24d985b124c2c469fe8467007cf30fd992f934"}, +] + +[[package]] +name = "numpy-typing-compat" +version = "20251206.2.4" +description = "Static typing compatibility layer for older versions of NumPy" +optional = false +python-versions = ">=3.11" +groups = ["dev"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "numpy_typing_compat-20251206.2.4-py3-none-any.whl", hash = "sha256:a82e723bd20efaa4cf2886709d4264c144f1f2b609bda83d1545113b7e47a5b5"}, + {file = "numpy_typing_compat-20251206.2.4.tar.gz", hash = "sha256:59882d23aaff054a2536da80564012cdce33487657be4d79c5925bb8705fcabc"}, +] + +[package.dependencies] +numpy = ">=2.4rc1,<2.5" + [[package]] name = "optype" -version = "0.12.2" -description = "Building blocks for precise & flexible type hints" +version = "0.15.0" +description = "Building Blocks for Precise & Flexible Type Hints" optional = false python-versions = ">=3.11" groups = ["dev"] markers = "python_version >= \"3.11\"" files = [ - {file = "optype-0.12.2-py3-none-any.whl", hash = "sha256:e38966fcd5ae9dec1c1bdecccdd8fdc7cfb8f21686f45ce3669a3a566c7cc110"}, - {file = "optype-0.12.2.tar.gz", hash = "sha256:3f53a89f56f0ea23be4d212611dce0f3a2a8946543a9a72783e349c49b232934"}, + {file = "optype-0.15.0-py3-none-any.whl", hash = "sha256:caba40ece9ea39b499fa76c036a82e0d452a432dd4dd3e8e0d30892be2e8c76c"}, + {file = "optype-0.15.0.tar.gz", hash = "sha256:457d6ca9e7da19967ec16d42bdf94e240b33b5d70a56fbbf5b427e5ea39cf41e"}, ] [package.dependencies] +numpy = {version = ">=1.25", optional = true, markers = "extra == \"numpy\""} +numpy-typing-compat = {version = ">=20250818.1.25,<20251207", optional = true, markers = "extra == \"numpy\""} typing-extensions = {version = ">=4.10", markers = "python_full_version < \"3.13.0\""} [package.extras] -numpy = ["numpy (>=1.25)"] +numpy = ["numpy (>=1.25)", "numpy-typing-compat (>=20250818.1.25,<20251207)"] [[package]] name = "overrides" @@ -2250,6 +2939,7 @@ description = "A decorator to automatically detect mismatch when overriding a me optional = false python-versions = ">=3.6" groups = ["main", "demo"] +markers = "python_version < \"3.12\"" files = [ {file = "overrides-7.7.0-py3-none-any.whl", hash = "sha256:c7ed9d062f78b8e4c1a7b70bd8796b35ead4d9f510227ef9c5dc7626c60d7e49"}, {file = "overrides-7.7.0.tar.gz", hash = "sha256:55158fa3d93b98cc75299b1e67078ad9003ca27945c76162c1c0766d6f91820a"}, @@ -2261,62 +2951,91 @@ version = "25.0" description = "Core utilities for Python packages" optional = false python-versions = ">=3.8" -groups = ["main", "demo", "dev"] +groups = ["main", "demo", "dev", "docs"] files = [ {file = "packaging-25.0-py3-none-any.whl", hash = "sha256:29572ef2b1f17581046b3a2227d5c611fb25ec70ca1ba8554b24b0e69331a484"}, {file = "packaging-25.0.tar.gz", hash = "sha256:d443872c98d677bf60f6a1f2f8c1cb748e8fe762d2bf9d3148b5599295b0fc4f"}, ] +[[package]] +name = "paginate" +version = "0.5.7" +description = "Divides large result sets into pages for easier browsing" +optional = false +python-versions = "*" +groups = ["docs"] +files = [ + {file = "paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591"}, + {file = "paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945"}, +] + +[package.extras] +dev = ["pytest", "tox"] +lint = ["black"] + [[package]] name = "pandas" -version = "2.3.2" +version = "2.3.3" description = "Powerful data structures for data analysis, time series, and statistics" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "pandas-2.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:52bc29a946304c360561974c6542d1dd628ddafa69134a7131fdfd6a5d7a1a35"}, - {file = "pandas-2.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:220cc5c35ffaa764dd5bb17cf42df283b5cb7fdf49e10a7b053a06c9cb48ee2b"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:42c05e15111221384019897df20c6fe893b2f697d03c811ee67ec9e0bb5a3424"}, - {file = "pandas-2.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:cc03acc273c5515ab69f898df99d9d4f12c4d70dbfc24c3acc6203751d0804cf"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d25c20a03e8870f6339bcf67281b946bd20b86f1a544ebbebb87e66a8d642cba"}, - {file = "pandas-2.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:21bb612d148bb5860b7eb2c10faacf1a810799245afd342cf297d7551513fbb6"}, - {file = "pandas-2.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:b62d586eb25cb8cb70a5746a378fc3194cb7f11ea77170d59f889f5dfe3cec7a"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1333e9c299adcbb68ee89a9bb568fc3f20f9cbb419f1dd5225071e6cddb2a743"}, - {file = "pandas-2.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:76972bcbd7de8e91ad5f0ca884a9f2c477a2125354af624e022c49e5bd0dfff4"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b98bdd7c456a05eef7cd21fd6b29e3ca243591fe531c62be94a2cc987efb5ac2"}, - {file = "pandas-2.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1d81573b3f7db40d020983f78721e9bfc425f411e616ef019a10ebf597aedb2e"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e190b738675a73b581736cc8ec71ae113d6c3768d0bd18bffa5b9a0927b0b6ea"}, - {file = "pandas-2.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:c253828cb08f47488d60f43c5fc95114c771bbfff085da54bfc79cb4f9e3a372"}, - {file = "pandas-2.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:9467697b8083f9667b212633ad6aa4ab32436dcbaf4cd57325debb0ddef2012f"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fbb977f802156e7a3f829e9d1d5398f6192375a3e2d1a9ee0803e35fe70a2b9"}, - {file = "pandas-2.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1b9b52693123dd234b7c985c68b709b0b009f4521000d0525f2b95c22f15944b"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0bd281310d4f412733f319a5bc552f86d62cddc5f51d2e392c8787335c994175"}, - {file = "pandas-2.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96d31a6b4354e3b9b8a2c848af75d31da390657e3ac6f30c05c82068b9ed79b9"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:df4df0b9d02bb873a106971bb85d448378ef14b86ba96f035f50bbd3688456b4"}, - {file = "pandas-2.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:213a5adf93d020b74327cb2c1b842884dbdd37f895f42dcc2f09d451d949f811"}, - {file = "pandas-2.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c13b81a9347eb8c7548f53fd9a4f08d4dfe996836543f805c987bafa03317ae"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0c6ecbac99a354a051ef21c5307601093cb9e0f4b1855984a084bfec9302699e"}, - {file = "pandas-2.3.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c6f048aa0fd080d6a06cc7e7537c09b53be6642d330ac6f54a600c3ace857ee9"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0064187b80a5be6f2f9c9d6bdde29372468751dfa89f4211a3c5871854cfbf7a"}, - {file = "pandas-2.3.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4ac8c320bded4718b298281339c1a50fb00a6ba78cb2a63521c39bec95b0209b"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:114c2fe4f4328cf98ce5716d1532f3ab79c5919f95a9cfee81d9140064a2e4d6"}, - {file = "pandas-2.3.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:48fa91c4dfb3b2b9bfdb5c24cd3567575f4e13f9636810462ffed8925352be5a"}, - {file = "pandas-2.3.2-cp313-cp313-win_amd64.whl", hash = "sha256:12d039facec710f7ba305786837d0225a3444af7bbd9c15c32ca2d40d157ed8b"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:c624b615ce97864eb588779ed4046186f967374185c047070545253a52ab2d57"}, - {file = "pandas-2.3.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:0cee69d583b9b128823d9514171cabb6861e09409af805b54459bd0c821a35c2"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2319656ed81124982900b4c37f0e0c58c015af9a7bbc62342ba5ad07ace82ba9"}, - {file = "pandas-2.3.2-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b37205ad6f00d52f16b6d09f406434ba928c1a1966e2771006a9033c736d30d2"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:837248b4fc3a9b83b9c6214699a13f069dc13510a6a6d7f9ba33145d2841a012"}, - {file = "pandas-2.3.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:d2c3554bd31b731cd6490d94a28f3abb8dd770634a9e06eb6d2911b9827db370"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:88080a0ff8a55eac9c84e3ff3c7665b3b5476c6fbc484775ca1910ce1c3e0b87"}, - {file = "pandas-2.3.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:d4a558c7620340a0931828d8065688b3cc5b4c8eb674bcaf33d18ff4a6870b4a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:45178cf09d1858a1509dc73ec261bf5b25a625a389b65be2e47b559905f0ab6a"}, - {file = "pandas-2.3.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:77cefe00e1b210f9c76c697fedd8fdb8d3dd86563e9c8adc9fa72b90f5e9e4c2"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:13bd629c653856f00c53dc495191baa59bcafbbf54860a46ecc50d3a88421a96"}, - {file = "pandas-2.3.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:36d627906fd44b5fd63c943264e11e96e923f8de77d6016dc2f667b9ad193438"}, - {file = "pandas-2.3.2-cp39-cp39-win_amd64.whl", hash = "sha256:a9d7ec92d71a420185dec44909c32e9a362248c4ae2238234b76d5be37f208cc"}, - {file = "pandas-2.3.2.tar.gz", hash = "sha256:ab7b58f8f82706890924ccdfb5f48002b83d2b5a3845976a9fb705d36c34dcdb"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c"}, + {file = "pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1"}, + {file = "pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250"}, + {file = "pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4"}, + {file = "pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523"}, + {file = "pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66"}, + {file = "pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791"}, + {file = "pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151"}, + {file = "pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53"}, + {file = "pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908"}, + {file = "pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98"}, + {file = "pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084"}, + {file = "pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56851a737e3470de7fa88e6131f41281ed440d29a9268dcbf0002da5ac366713"}, + {file = "pandas-2.3.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:bdcd9d1167f4885211e401b3036c0c8d9e274eee67ea8d0758a256d60704cfe8"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e32e7cc9af0f1cc15548288a51a3b681cc2a219faa838e995f7dc53dbab1062d"}, + {file = "pandas-2.3.3-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:318d77e0e42a628c04dc56bcef4b40de67918f7041c2b061af1da41dcff670ac"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:4e0a175408804d566144e170d0476b15d78458795bb18f1304fb94160cabf40c"}, + {file = "pandas-2.3.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:93c2d9ab0fc11822b5eece72ec9587e172f63cff87c00b062f6e37448ced4493"}, + {file = "pandas-2.3.3-cp313-cp313-win_amd64.whl", hash = "sha256:f8bfc0e12dc78f777f323f55c58649591b2cd0c43534e8355c51d3fede5f4dee"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:75ea25f9529fdec2d2e93a42c523962261e567d250b0013b16210e1d40d7c2e5"}, + {file = "pandas-2.3.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:74ecdf1d301e812db96a465a525952f4dde225fdb6d8e5a521d47e1f42041e21"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6435cb949cb34ec11cc9860246ccb2fdc9ecd742c12d3304989017d53f039a78"}, + {file = "pandas-2.3.3-cp313-cp313t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:900f47d8f20860de523a1ac881c4c36d65efcb2eb850e6948140fa781736e110"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a45c765238e2ed7d7c608fc5bc4a6f88b642f2f01e70c0c23d2224dd21829d86"}, + {file = "pandas-2.3.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c4fc4c21971a1a9f4bdb4c73978c7f7256caa3e62b323f70d6cb80db583350bc"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ee15f284898e7b246df8087fc82b87b01686f98ee67d85a17b7ab44143a3a9a0"}, + {file = "pandas-2.3.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1611aedd912e1ff81ff41c745822980c49ce4a7907537be8692c8dbc31924593"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d2cefc361461662ac48810cb14365a365ce864afe85ef1f447ff5a1e99ea81c"}, + {file = "pandas-2.3.3-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ee67acbbf05014ea6c763beb097e03cd629961c8a632075eeb34247120abcb4b"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:c46467899aaa4da076d5abc11084634e2d197e9460643dd455ac3db5856b24d6"}, + {file = "pandas-2.3.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:6253c72c6a1d990a410bc7de641d34053364ef8bcd3126f7e7450125887dffe3"}, + {file = "pandas-2.3.3-cp314-cp314-win_amd64.whl", hash = "sha256:1b07204a219b3b7350abaae088f451860223a52cfb8a6c53358e7948735158e5"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:2462b1a365b6109d275250baaae7b760fd25c726aaca0054649286bcfbb3e8ec"}, + {file = "pandas-2.3.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:0242fe9a49aa8b4d78a4fa03acb397a58833ef6199e9aa40a95f027bb3a1b6e7"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a21d830e78df0a515db2b3d2f5570610f5e6bd2e27749770e8bb7b524b89b450"}, + {file = "pandas-2.3.3-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e3ebdb170b5ef78f19bfb71b0dc5dc58775032361fa188e814959b74d726dd5"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:d051c0e065b94b7a3cea50eb1ec32e912cd96dba41647eb24104b6c6c14c5788"}, + {file = "pandas-2.3.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:3869faf4bd07b3b66a9f462417d0ca3a9df29a9f6abd5d0d0dbab15dac7abe87"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:c503ba5216814e295f40711470446bc3fd00f0faea8a086cbc688808e26f92a2"}, + {file = "pandas-2.3.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a637c5cdfa04b6d6e2ecedcb81fc52ffb0fd78ce2ebccc9ea964df9f658de8c8"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:854d00d556406bffe66a4c0802f334c9ad5a96b4f1f868adf036a21b11ef13ff"}, + {file = "pandas-2.3.3-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bf1f8a81d04ca90e32a0aceb819d34dbd378a98bf923b6398b9a3ec0bf44de29"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:23ebd657a4d38268c7dfbdf089fbc31ea709d82e4923c5ffd4fbd5747133ce73"}, + {file = "pandas-2.3.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:5554c929ccc317d41a5e3d1234f3be588248e61f08a74dd17c9eabb535777dc9"}, + {file = "pandas-2.3.3-cp39-cp39-win_amd64.whl", hash = "sha256:d3e28b3e83862ccf4d85ff19cf8c20b2ae7e503881711ff2d534dc8f761131aa"}, + {file = "pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b"}, ] [package.dependencies] @@ -2368,14 +3087,14 @@ files = [ [[package]] name = "parso" -version = "0.8.4" +version = "0.8.5" description = "A Python Parser" optional = false python-versions = ">=3.6" groups = ["main", "demo", "dev"] files = [ - {file = "parso-0.8.4-py2.py3-none-any.whl", hash = "sha256:a418670a20291dacd2dddc80c377c5c3791378ee1e8d12bffc35420643d43f18"}, - {file = "parso-0.8.4.tar.gz", hash = "sha256:eb3a7b58240fb99099a345571deecc0f9540ea5f4dd2fe14c2a99d6b281ab92d"}, + {file = "parso-0.8.5-py2.py3-none-any.whl", hash = "sha256:646204b5ee239c396d040b90f9e272e9a8017c630092bf59980beb62fd033887"}, + {file = "parso-0.8.5.tar.gz", hash = "sha256:034d7354a9a018bdce352f48b2a8a450f05e9d6ee85db84764e9b6bd96dafe5a"}, ] [package.extras] @@ -2388,7 +3107,7 @@ version = "0.12.1" description = "Utility library for gitignore style pattern matching of file paths." optional = false python-versions = ">=3.8" -groups = ["dev"] +groups = ["dev", "docs"] files = [ {file = "pathspec-0.12.1-py3-none-any.whl", hash = "sha256:a0d503e138a4c123b27490a4f7beda6a01c6f288df0e4a8b79c7eb0dc7b4cc08"}, {file = "pathspec-0.12.1.tar.gz", hash = "sha256:a482d51503a1ab33b1c67a6c3813a26953dbdc71c31dacaef9a838c4e29f5712"}, @@ -2436,156 +3155,140 @@ ptyprocess = ">=0.5" [[package]] name = "pillow" -version = "11.3.0" -description = "Python Imaging Library (Fork)" +version = "12.0.0" +description = "Python Imaging Library (fork)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "pillow-11.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:1b9c17fd4ace828b3003dfd1e30bff24863e0eb59b535e8f80194d9cc7ecf860"}, - {file = "pillow-11.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:65dc69160114cdd0ca0f35cb434633c75e8e7fad4cf855177a05bf38678f73ad"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7107195ddc914f656c7fc8e4a5e1c25f32e9236ea3ea860f257b0436011fddd0"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cc3e831b563b3114baac7ec2ee86819eb03caa1a2cef0b481a5675b59c4fe23b"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1f182ebd2303acf8c380a54f615ec883322593320a9b00438eb842c1f37ae50"}, - {file = "pillow-11.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4445fa62e15936a028672fd48c4c11a66d641d2c05726c7ec1f8ba6a572036ae"}, - {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:71f511f6b3b91dd543282477be45a033e4845a40278fa8dcdbfdb07109bf18f9"}, - {file = "pillow-11.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:040a5b691b0713e1f6cbe222e0f4f74cd233421e105850ae3b3c0ceda520f42e"}, - {file = "pillow-11.3.0-cp310-cp310-win32.whl", hash = "sha256:89bd777bc6624fe4115e9fac3352c79ed60f3bb18651420635f26e643e3dd1f6"}, - {file = "pillow-11.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:19d2ff547c75b8e3ff46f4d9ef969a06c30ab2d4263a9e287733aa8b2429ce8f"}, - {file = "pillow-11.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:819931d25e57b513242859ce1876c58c59dc31587847bf74cfe06b2e0cb22d2f"}, - {file = "pillow-11.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:1cd110edf822773368b396281a2293aeb91c90a2db00d78ea43e7e861631b722"}, - {file = "pillow-11.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9c412fddd1b77a75aa904615ebaa6001f169b26fd467b4be93aded278266b288"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7d1aa4de119a0ecac0a34a9c8bde33f34022e2e8f99104e47a3ca392fd60e37d"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:91da1d88226663594e3f6b4b8c3c8d85bd504117d043740a8e0ec449087cc494"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:643f189248837533073c405ec2f0bb250ba54598cf80e8c1e043381a60632f58"}, - {file = "pillow-11.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:106064daa23a745510dabce1d84f29137a37224831d88eb4ce94bb187b1d7e5f"}, - {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd8ff254faf15591e724dc7c4ddb6bf4793efcbe13802a4ae3e863cd300b493e"}, - {file = "pillow-11.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:932c754c2d51ad2b2271fd01c3d121daaa35e27efae2a616f77bf164bc0b3e94"}, - {file = "pillow-11.3.0-cp311-cp311-win32.whl", hash = "sha256:b4b8f3efc8d530a1544e5962bd6b403d5f7fe8b9e08227c6b255f98ad82b4ba0"}, - {file = "pillow-11.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:1a992e86b0dd7aeb1f053cd506508c0999d710a8f07b4c791c63843fc6a807ac"}, - {file = "pillow-11.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:30807c931ff7c095620fe04448e2c2fc673fcbb1ffe2a7da3fb39613489b1ddd"}, - {file = "pillow-11.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fdae223722da47b024b867c1ea0be64e0df702c5e0a60e27daad39bf960dd1e4"}, - {file = "pillow-11.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:921bd305b10e82b4d1f5e802b6850677f965d8394203d182f078873851dada69"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:eb76541cba2f958032d79d143b98a3a6b3ea87f0959bbe256c0b5e416599fd5d"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:67172f2944ebba3d4a7b54f2e95c786a3a50c21b88456329314caaa28cda70f6"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:97f07ed9f56a3b9b5f49d3661dc9607484e85c67e27f3e8be2c7d28ca032fec7"}, - {file = "pillow-11.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:676b2815362456b5b3216b4fd5bd89d362100dc6f4945154ff172e206a22c024"}, - {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3e184b2f26ff146363dd07bde8b711833d7b0202e27d13540bfe2e35a323a809"}, - {file = "pillow-11.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6be31e3fc9a621e071bc17bb7de63b85cbe0bfae91bb0363c893cbe67247780d"}, - {file = "pillow-11.3.0-cp312-cp312-win32.whl", hash = "sha256:7b161756381f0918e05e7cb8a371fff367e807770f8fe92ecb20d905d0e1c149"}, - {file = "pillow-11.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a6444696fce635783440b7f7a9fc24b3ad10a9ea3f0ab66c5905be1c19ccf17d"}, - {file = "pillow-11.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:2aceea54f957dd4448264f9bf40875da0415c83eb85f55069d89c0ed436e3542"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:1c627742b539bba4309df89171356fcb3cc5a9178355b2727d1b74a6cf155fbd"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:30b7c02f3899d10f13d7a48163c8969e4e653f8b43416d23d13d1bbfdc93b9f8"}, - {file = "pillow-11.3.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:7859a4cc7c9295f5838015d8cc0a9c215b77e43d07a25e460f35cf516df8626f"}, - {file = "pillow-11.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:ec1ee50470b0d050984394423d96325b744d55c701a439d2bd66089bff963d3c"}, - {file = "pillow-11.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:7db51d222548ccfd274e4572fdbf3e810a5e66b00608862f947b163e613b67dd"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2d6fcc902a24ac74495df63faad1884282239265c6839a0a6416d33faedfae7e"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f0f5d8f4a08090c6d6d578351a2b91acf519a54986c055af27e7a93feae6d3f1"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c37d8ba9411d6003bba9e518db0db0c58a680ab9fe5179f040b0463644bc9805"}, - {file = "pillow-11.3.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13f87d581e71d9189ab21fe0efb5a23e9f28552d5be6979e84001d3b8505abe8"}, - {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:023f6d2d11784a465f09fd09a34b150ea4672e85fb3d05931d89f373ab14abb2"}, - {file = "pillow-11.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:45dfc51ac5975b938e9809451c51734124e73b04d0f0ac621649821a63852e7b"}, - {file = "pillow-11.3.0-cp313-cp313-win32.whl", hash = "sha256:a4d336baed65d50d37b88ca5b60c0fa9d81e3a87d4a7930d3880d1624d5b31f3"}, - {file = "pillow-11.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0bce5c4fd0921f99d2e858dc4d4d64193407e1b99478bc5cacecba2311abde51"}, - {file = "pillow-11.3.0-cp313-cp313-win_arm64.whl", hash = "sha256:1904e1264881f682f02b7f8167935cce37bc97db457f8e7849dc3a6a52b99580"}, - {file = "pillow-11.3.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4c834a3921375c48ee6b9624061076bc0a32a60b5532b322cc0ea64e639dd50e"}, - {file = "pillow-11.3.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:5e05688ccef30ea69b9317a9ead994b93975104a677a36a8ed8106be9260aa6d"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:1019b04af07fc0163e2810167918cb5add8d74674b6267616021ab558dc98ced"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f944255db153ebb2b19c51fe85dd99ef0ce494123f21b9db4877ffdfc5590c7c"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1f85acb69adf2aaee8b7da124efebbdb959a104db34d3a2cb0f3793dbae422a8"}, - {file = "pillow-11.3.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:05f6ecbeff5005399bb48d198f098a9b4b6bdf27b8487c7f38ca16eeb070cd59"}, - {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:a7bc6e6fd0395bc052f16b1a8670859964dbd7003bd0af2ff08342eb6e442cfe"}, - {file = "pillow-11.3.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:83e1b0161c9d148125083a35c1c5a89db5b7054834fd4387499e06552035236c"}, - {file = "pillow-11.3.0-cp313-cp313t-win32.whl", hash = "sha256:2a3117c06b8fb646639dce83694f2f9eac405472713fcb1ae887469c0d4f6788"}, - {file = "pillow-11.3.0-cp313-cp313t-win_amd64.whl", hash = "sha256:857844335c95bea93fb39e0fa2726b4d9d758850b34075a7e3ff4f4fa3aa3b31"}, - {file = "pillow-11.3.0-cp313-cp313t-win_arm64.whl", hash = "sha256:8797edc41f3e8536ae4b10897ee2f637235c94f27404cac7297f7b607dd0716e"}, - {file = "pillow-11.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:d9da3df5f9ea2a89b81bb6087177fb1f4d1c7146d583a3fe5c672c0d94e55e12"}, - {file = "pillow-11.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:0b275ff9b04df7b640c59ec5a3cb113eefd3795a8df80bac69646ef699c6981a"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0743841cabd3dba6a83f38a92672cccbd69af56e3e91777b0ee7f4dba4385632"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2465a69cf967b8b49ee1b96d76718cd98c4e925414ead59fdf75cf0fd07df673"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41742638139424703b4d01665b807c6468e23e699e8e90cffefe291c5832b027"}, - {file = "pillow-11.3.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93efb0b4de7e340d99057415c749175e24c8864302369e05914682ba642e5d77"}, - {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7966e38dcd0fa11ca390aed7c6f20454443581d758242023cf36fcb319b1a874"}, - {file = "pillow-11.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:98a9afa7b9007c67ed84c57c9e0ad86a6000da96eaa638e4f8abe5b65ff83f0a"}, - {file = "pillow-11.3.0-cp314-cp314-win32.whl", hash = "sha256:02a723e6bf909e7cea0dac1b0e0310be9d7650cd66222a5f1c571455c0a45214"}, - {file = "pillow-11.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:a418486160228f64dd9e9efcd132679b7a02a5f22c982c78b6fc7dab3fefb635"}, - {file = "pillow-11.3.0-cp314-cp314-win_arm64.whl", hash = "sha256:155658efb5e044669c08896c0c44231c5e9abcaadbc5cd3648df2f7c0b96b9a6"}, - {file = "pillow-11.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:59a03cdf019efbfeeed910bf79c7c93255c3d54bc45898ac2a4140071b02b4ae"}, - {file = "pillow-11.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f8a5827f84d973d8636e9dc5764af4f0cf2318d26744b3d902931701b0d46653"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ee92f2fd10f4adc4b43d07ec5e779932b4eb3dbfbc34790ada5a6669bc095aa6"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c96d333dcf42d01f47b37e0979b6bd73ec91eae18614864622d9b87bbd5bbf36"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c96f993ab8c98460cd0c001447bff6194403e8b1d7e149ade5f00594918128b"}, - {file = "pillow-11.3.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:41342b64afeba938edb034d122b2dda5db2139b9a4af999729ba8818e0056477"}, - {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:068d9c39a2d1b358eb9f245ce7ab1b5c3246c7c8c7d9ba58cfa5b43146c06e50"}, - {file = "pillow-11.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:a1bc6ba083b145187f648b667e05a2534ecc4b9f2784c2cbe3089e44868f2b9b"}, - {file = "pillow-11.3.0-cp314-cp314t-win32.whl", hash = "sha256:118ca10c0d60b06d006be10a501fd6bbdfef559251ed31b794668ed569c87e12"}, - {file = "pillow-11.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:8924748b688aa210d79883357d102cd64690e56b923a186f35a82cbc10f997db"}, - {file = "pillow-11.3.0-cp314-cp314t-win_arm64.whl", hash = "sha256:79ea0d14d3ebad43ec77ad5272e6ff9bba5b679ef73375ea760261207fa8e0aa"}, - {file = "pillow-11.3.0-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:48d254f8a4c776de343051023eb61ffe818299eeac478da55227d96e241de53f"}, - {file = "pillow-11.3.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:7aee118e30a4cf54fdd873bd3a29de51e29105ab11f9aad8c32123f58c8f8081"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:23cff760a9049c502721bdb743a7cb3e03365fafcdfc2ef9784610714166e5a4"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6359a3bc43f57d5b375d1ad54a0074318a0844d11b76abccf478c37c986d3cfc"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:092c80c76635f5ecb10f3f83d76716165c96f5229addbd1ec2bdbbda7d496e06"}, - {file = "pillow-11.3.0-cp39-cp39-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cadc9e0ea0a2431124cde7e1697106471fc4c1da01530e679b2391c37d3fbb3a"}, - {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6a418691000f2a418c9135a7cf0d797c1bb7d9a485e61fe8e7722845b95ef978"}, - {file = "pillow-11.3.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:97afb3a00b65cc0804d1c7abddbf090a81eaac02768af58cbdcaaa0a931e0b6d"}, - {file = "pillow-11.3.0-cp39-cp39-win32.whl", hash = "sha256:ea944117a7974ae78059fcc1800e5d3295172bb97035c0c1d9345fca1419da71"}, - {file = "pillow-11.3.0-cp39-cp39-win_amd64.whl", hash = "sha256:e5c5858ad8ec655450a7c7df532e9842cf8df7cc349df7225c60d5d348c8aada"}, - {file = "pillow-11.3.0-cp39-cp39-win_arm64.whl", hash = "sha256:6abdbfd3aea42be05702a8dd98832329c167ee84400a1d1f61ab11437f1717eb"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:3cee80663f29e3843b68199b9d6f4f54bd1d4a6b59bdd91bceefc51238bcb967"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:b5f56c3f344f2ccaf0dd875d3e180f631dc60a51b314295a3e681fe8cf851fbe"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e67d793d180c9df62f1f40aee3accca4829d3794c95098887edc18af4b8b780c"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d000f46e2917c705e9fb93a3606ee4a819d1e3aa7a9b442f6444f07e77cf5e25"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:527b37216b6ac3a12d7838dc3bd75208ec57c1c6d11ef01902266a5a0c14fc27"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:be5463ac478b623b9dd3937afd7fb7ab3d79dd290a28e2b6df292dc75063eb8a"}, - {file = "pillow-11.3.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:8dc70ca24c110503e16918a658b869019126ecfe03109b754c402daff12b3d9f"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7c8ec7a017ad1bd562f93dbd8505763e688d388cde6e4a010ae1486916e713e6"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9ab6ae226de48019caa8074894544af5b53a117ccb9d3b3dcb2871464c829438"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe27fb049cdcca11f11a7bfda64043c37b30e6b91f10cb5bab275806c32f6ab3"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:465b9e8844e3c3519a983d58b80be3f668e2a7a5db97f2784e7079fbc9f9822c"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5418b53c0d59b3824d05e029669efa023bbef0f3e92e75ec8428f3799487f361"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:504b6f59505f08ae014f724b6207ff6222662aab5cc9542577fb084ed0676ac7"}, - {file = "pillow-11.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c84d689db21a1c397d001aa08241044aa2069e7587b398c8cc63020390b1c1b8"}, - {file = "pillow-11.3.0.tar.gz", hash = "sha256:3828ee7586cd0b2091b6209e5ad53e20d0649bbe87164a459d0676e035e8f523"}, + {file = "pillow-12.0.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:3adfb466bbc544b926d50fe8f4a4e6abd8c6bffd28a26177594e6e9b2b76572b"}, + {file = "pillow-12.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1ac11e8ea4f611c3c0147424eae514028b5e9077dd99ab91e1bd7bc33ff145e1"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d49e2314c373f4c2b39446fb1a45ed333c850e09d0c59ac79b72eb3b95397363"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c7b2a63fd6d5246349f3d3f37b14430d73ee7e8173154461785e43036ffa96ca"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d64317d2587c70324b79861babb9c09f71fbb780bad212018874b2c013d8600e"}, + {file = "pillow-12.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d77153e14b709fd8b8af6f66a3afbb9ed6e9fc5ccf0b6b7e1ced7b036a228782"}, + {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:32ed80ea8a90ee3e6fa08c21e2e091bba6eda8eccc83dbc34c95169507a91f10"}, + {file = "pillow-12.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c828a1ae702fc712978bda0320ba1b9893d99be0badf2647f693cc01cf0f04fa"}, + {file = "pillow-12.0.0-cp310-cp310-win32.whl", hash = "sha256:bd87e140e45399c818fac4247880b9ce719e4783d767e030a883a970be632275"}, + {file = "pillow-12.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:455247ac8a4cfb7b9bc45b7e432d10421aea9fc2e74d285ba4072688a74c2e9d"}, + {file = "pillow-12.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6ace95230bfb7cd79ef66caa064bbe2f2a1e63d93471c3a2e1f1348d9f22d6b7"}, + {file = "pillow-12.0.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:0fd00cac9c03256c8b2ff58f162ebcd2587ad3e1f2e397eab718c47e24d231cc"}, + {file = "pillow-12.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:a3475b96f5908b3b16c47533daaa87380c491357d197564e0ba34ae75c0f3257"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:110486b79f2d112cf6add83b28b627e369219388f64ef2f960fef9ebaf54c642"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5269cc1caeedb67e6f7269a42014f381f45e2e7cd42d834ede3c703a1d915fe3"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:aa5129de4e174daccbc59d0a3b6d20eaf24417d59851c07ebb37aeb02947987c"}, + {file = "pillow-12.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bee2a6db3a7242ea309aa7ee8e2780726fed67ff4e5b40169f2c940e7eb09227"}, + {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:90387104ee8400a7b4598253b4c406f8958f59fcf983a6cea2b50d59f7d63d0b"}, + {file = "pillow-12.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bc91a56697869546d1b8f0a3ff35224557ae7f881050e99f615e0119bf934b4e"}, + {file = "pillow-12.0.0-cp311-cp311-win32.whl", hash = "sha256:27f95b12453d165099c84f8a8bfdfd46b9e4bda9e0e4b65f0635430027f55739"}, + {file = "pillow-12.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:b583dc9070312190192631373c6c8ed277254aa6e6084b74bdd0a6d3b221608e"}, + {file = "pillow-12.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:759de84a33be3b178a64c8ba28ad5c135900359e85fb662bc6e403ad4407791d"}, + {file = "pillow-12.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:53561a4ddc36facb432fae7a9d8afbfaf94795414f5cdc5fc52f28c1dca90371"}, + {file = "pillow-12.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:71db6b4c1653045dacc1585c1b0d184004f0d7e694c7b34ac165ca70c0838082"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:2fa5f0b6716fc88f11380b88b31fe591a06c6315e955c096c35715788b339e3f"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:82240051c6ca513c616f7f9da06e871f61bfd7805f566275841af15015b8f98d"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:55f818bd74fe2f11d4d7cbc65880a843c4075e0ac7226bc1a23261dbea531953"}, + {file = "pillow-12.0.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b87843e225e74576437fd5b6a4c2205d422754f84a06942cfaf1dc32243e45a8"}, + {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c607c90ba67533e1b2355b821fef6764d1dd2cbe26b8c1005ae84f7aea25ff79"}, + {file = "pillow-12.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:21f241bdd5080a15bc86d3466a9f6074a9c2c2b314100dd896ac81ee6db2f1ba"}, + {file = "pillow-12.0.0-cp312-cp312-win32.whl", hash = "sha256:dd333073e0cacdc3089525c7df7d39b211bcdf31fc2824e49d01c6b6187b07d0"}, + {file = "pillow-12.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:9fe611163f6303d1619bbcb653540a4d60f9e55e622d60a3108be0d5b441017a"}, + {file = "pillow-12.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:7dfb439562f234f7d57b1ac6bc8fe7f838a4bd49c79230e0f6a1da93e82f1fad"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphoneos.whl", hash = "sha256:0869154a2d0546545cde61d1789a6524319fc1897d9ee31218eae7a60ccc5643"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:a7921c5a6d31b3d756ec980f2f47c0cfdbce0fc48c22a39347a895f41f4a6ea4"}, + {file = "pillow-12.0.0-cp313-cp313-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:1ee80a59f6ce048ae13cda1abf7fbd2a34ab9ee7d401c46be3ca685d1999a399"}, + {file = "pillow-12.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:c50f36a62a22d350c96e49ad02d0da41dbd17ddc2e29750dbdba4323f85eb4a5"}, + {file = "pillow-12.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:5193fde9a5f23c331ea26d0cf171fbf67e3f247585f50c08b3e205c7aeb4589b"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bde737cff1a975b70652b62d626f7785e0480918dece11e8fef3c0cf057351c3"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a6597ff2b61d121172f5844b53f21467f7082f5fb385a9a29c01414463f93b07"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0b817e7035ea7f6b942c13aa03bb554fc44fea70838ea21f8eb31c638326584e"}, + {file = "pillow-12.0.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f4f1231b7dec408e8670264ce63e9c71409d9583dd21d32c163e25213ee2a344"}, + {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:6e51b71417049ad6ab14c49608b4a24d8fb3fe605e5dfabfe523b58064dc3d27"}, + {file = "pillow-12.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:d120c38a42c234dc9a8c5de7ceaaf899cf33561956acb4941653f8bdc657aa79"}, + {file = "pillow-12.0.0-cp313-cp313-win32.whl", hash = "sha256:4cc6b3b2efff105c6a1656cfe59da4fdde2cda9af1c5e0b58529b24525d0a098"}, + {file = "pillow-12.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:4cf7fed4b4580601c4345ceb5d4cbf5a980d030fd5ad07c4d2ec589f95f09905"}, + {file = "pillow-12.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:9f0b04c6b8584c2c193babcccc908b38ed29524b29dd464bc8801bf10d746a3a"}, + {file = "pillow-12.0.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7fa22993bac7b77b78cae22bad1e2a987ddf0d9015c63358032f84a53f23cdc3"}, + {file = "pillow-12.0.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f135c702ac42262573fe9714dfe99c944b4ba307af5eb507abef1667e2cbbced"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c85de1136429c524e55cfa4e033b4a7940ac5c8ee4d9401cc2d1bf48154bbc7b"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:38df9b4bfd3db902c9c2bd369bcacaf9d935b2fff73709429d95cc41554f7b3d"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7d87ef5795da03d742bf49439f9ca4d027cde49c82c5371ba52464aee266699a"}, + {file = "pillow-12.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aff9e4d82d082ff9513bdd6acd4f5bd359f5b2c870907d2b0a9c5e10d40c88fe"}, + {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:8d8ca2b210ada074d57fcee40c30446c9562e542fc46aedc19baf758a93532ee"}, + {file = "pillow-12.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:99a7f72fb6249302aa62245680754862a44179b545ded638cf1fef59befb57ef"}, + {file = "pillow-12.0.0-cp313-cp313t-win32.whl", hash = "sha256:4078242472387600b2ce8d93ade8899c12bf33fa89e55ec89fe126e9d6d5d9e9"}, + {file = "pillow-12.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:2c54c1a783d6d60595d3514f0efe9b37c8808746a66920315bfd34a938d7994b"}, + {file = "pillow-12.0.0-cp313-cp313t-win_arm64.whl", hash = "sha256:26d9f7d2b604cd23aba3e9faf795787456ac25634d82cd060556998e39c6fa47"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphoneos.whl", hash = "sha256:beeae3f27f62308f1ddbcfb0690bf44b10732f2ef43758f169d5e9303165d3f9"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_arm64_iphonesimulator.whl", hash = "sha256:d4827615da15cd59784ce39d3388275ec093ae3ee8d7f0c089b76fa87af756c2"}, + {file = "pillow-12.0.0-cp314-cp314-ios_13_0_x86_64_iphonesimulator.whl", hash = "sha256:3e42edad50b6909089750e65c91aa09aaf1e0a71310d383f11321b27c224ed8a"}, + {file = "pillow-12.0.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:e5d8efac84c9afcb40914ab49ba063d94f5dbdf5066db4482c66a992f47a3a3b"}, + {file = "pillow-12.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:266cd5f2b63ff316d5a1bba46268e603c9caf5606d44f38c2873c380950576ad"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:58eea5ebe51504057dd95c5b77d21700b77615ab0243d8152793dc00eb4faf01"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f13711b1a5ba512d647a0e4ba79280d3a9a045aaf7e0cc6fbe96b91d4cdf6b0c"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6846bd2d116ff42cba6b646edf5bf61d37e5cbd256425fa089fee4ff5c07a99e"}, + {file = "pillow-12.0.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c98fa880d695de164b4135a52fd2e9cd7b7c90a9d8ac5e9e443a24a95ef9248e"}, + {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:fa3ed2a29a9e9d2d488b4da81dcb54720ac3104a20bf0bd273f1e4648aff5af9"}, + {file = "pillow-12.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:d034140032870024e6b9892c692fe2968493790dd57208b2c37e3fb35f6df3ab"}, + {file = "pillow-12.0.0-cp314-cp314-win32.whl", hash = "sha256:1b1b133e6e16105f524a8dec491e0586d072948ce15c9b914e41cdadd209052b"}, + {file = "pillow-12.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:8dc232e39d409036af549c86f24aed8273a40ffa459981146829a324e0848b4b"}, + {file = "pillow-12.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:d52610d51e265a51518692045e372a4c363056130d922a7351429ac9f27e70b0"}, + {file = "pillow-12.0.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:1979f4566bb96c1e50a62d9831e2ea2d1211761e5662afc545fa766f996632f6"}, + {file = "pillow-12.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:b2e4b27a6e15b04832fe9bf292b94b5ca156016bbc1ea9c2c20098a0320d6cf6"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fb3096c30df99fd01c7bf8e544f392103d0795b9f98ba71a8054bcbf56b255f1"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7438839e9e053ef79f7112c881cef684013855016f928b168b81ed5835f3e75e"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5d5c411a8eaa2299322b647cd932586b1427367fd3184ffbb8f7a219ea2041ca"}, + {file = "pillow-12.0.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7e091d464ac59d2c7ad8e7e08105eaf9dafbc3883fd7265ffccc2baad6ac925"}, + {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:792a2c0be4dcc18af9d4a2dfd8a11a17d5e25274a1062b0ec1c2d79c76f3e7f8"}, + {file = "pillow-12.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:afbefa430092f71a9593a99ab6a4e7538bc9eabbf7bf94f91510d3503943edc4"}, + {file = "pillow-12.0.0-cp314-cp314t-win32.whl", hash = "sha256:3830c769decf88f1289680a59d4f4c46c72573446352e2befec9a8512104fa52"}, + {file = "pillow-12.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:905b0365b210c73afb0ebe9101a32572152dfd1c144c7e28968a331b9217b94a"}, + {file = "pillow-12.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:99353a06902c2e43b43e8ff74ee65a7d90307d82370604746738a1e0661ccca7"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b22bd8c974942477156be55a768f7aa37c46904c175be4e158b6a86e3a6b7ca8"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:805ebf596939e48dbb2e4922a1d3852cfc25c38160751ce02da93058b48d252a"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cae81479f77420d217def5f54b5b9d279804d17e982e0f2fa19b1d1e14ab5197"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:aeaefa96c768fc66818730b952a862235d68825c178f1b3ffd4efd7ad2edcb7c"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:09f2d0abef9e4e2f349305a4f8cc784a8a6c2f58a8c4892eea13b10a943bd26e"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bdee52571a343d721fb2eb3b090a82d959ff37fc631e3f70422e0c2e029f3e76"}, + {file = "pillow-12.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:b290fd8aa38422444d4b50d579de197557f182ef1068b75f5aa8558638b8d0a5"}, + {file = "pillow-12.0.0.tar.gz", hash = "sha256:87d4f8125c9988bfbed67af47dd7a953e2fc7b0cc1e7800ec6d2080d490bb353"}, ] [package.extras] docs = ["furo", "olefile", "sphinx (>=8.2)", "sphinx-autobuild", "sphinx-copybutton", "sphinx-inline-tabs", "sphinxext-opengraph"] fpx = ["olefile"] mic = ["olefile"] -test-arrow = ["pyarrow"] -tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] -typing = ["typing-extensions ; python_version < \"3.10\""] +test-arrow = ["arro3-compute", "arro3-core", "nanoarrow", "pyarrow"] +tests = ["check-manifest", "coverage (>=7.4.2)", "defusedxml", "markdown2", "olefile", "packaging", "pyroma (>=5)", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "trove-classifiers (>=2024.10.12)"] xmp = ["defusedxml"] [[package]] name = "platformdirs" -version = "4.3.8" +version = "4.5.1" description = "A small Python package for determining appropriate platform-specific dirs, e.g. a `user data dir`." optional = false -python-versions = ">=3.9" -groups = ["main", "demo", "dev"] +python-versions = ">=3.10" +groups = ["main", "demo", "dev", "docs"] files = [ - {file = "platformdirs-4.3.8-py3-none-any.whl", hash = "sha256:ff7059bb7eb1179e2685604f4aaf157cfd9535242bd23742eadc3c13542139b4"}, - {file = "platformdirs-4.3.8.tar.gz", hash = "sha256:3d512d96e16bcb959a814c9f348431070822a6496326a4be0911c40b5a74c2bc"}, + {file = "platformdirs-4.5.1-py3-none-any.whl", hash = "sha256:d03afa3963c806a9bed9d5125c8f4cb2fdaf74a55ab60e5d59b3fde758104d31"}, + {file = "platformdirs-4.5.1.tar.gz", hash = "sha256:61d5cdcc6065745cdd94f0f878977f8de9437be93de97c1c12f853c9c0cdcbda"}, ] [package.extras] -docs = ["furo (>=2024.8.6)", "proselint (>=0.14)", "sphinx (>=8.1.3)", "sphinx-autodoc-typehints (>=3)"] -test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.3.4)", "pytest-cov (>=6)", "pytest-mock (>=3.14)"] -type = ["mypy (>=1.14.1)"] +docs = ["furo (>=2025.9.25)", "proselint (>=0.14)", "sphinx (>=8.2.3)", "sphinx-autodoc-typehints (>=3.2)"] +test = ["appdirs (==1.4.4)", "covdefaults (>=2.3)", "pytest (>=8.4.2)", "pytest-cov (>=7)", "pytest-mock (>=3.15.1)"] +type = ["mypy (>=1.18.2)"] [[package]] name = "plotly" -version = "6.2.0" +version = "6.5.0" description = "An open-source interactive data visualization library for Python" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "plotly-6.2.0-py3-none-any.whl", hash = "sha256:32c444d4c940887219cb80738317040363deefdfee4f354498cc0b6dab8978bd"}, - {file = "plotly-6.2.0.tar.gz", hash = "sha256:9dfa23c328000f16c928beb68927444c1ab9eae837d1fe648dbcda5360c7953d"}, + {file = "plotly-6.5.0-py3-none-any.whl", hash = "sha256:5ac851e100367735250206788a2b1325412aa4a4917a4fe3e6f0bc5aa6f3d90a"}, + {file = "plotly-6.5.0.tar.gz", hash = "sha256:d5d38224883fd38c1409bef7d6a8dc32b74348d39313f3c52ca998b8e447f5c8"}, ] [package.dependencies] @@ -2598,7 +3301,7 @@ dev-build = ["build", "jupyter", "plotly[dev-core]"] dev-core = ["pytest", "requests", "ruff (==0.11.12)"] dev-optional = ["anywidget", "colorcet", "fiona (<=1.9.6) ; python_version <= \"3.8\"", "geopandas", "inflect", "numpy", "orjson", "pandas", "pdfrw", "pillow", "plotly-geo", "plotly[dev-build]", "plotly[kaleido]", "polars[timezone]", "pyarrow", "pyshp", "pytz", "scikit-image", "scipy", "shapely", "statsmodels", "vaex ; python_version <= \"3.9\"", "xarray"] express = ["numpy"] -kaleido = ["kaleido (>=1.0.0)"] +kaleido = ["kaleido (>=1.1.0)"] [[package]] name = "pluggy" @@ -2640,14 +3343,14 @@ xxhash = ["xxhash (>=1.4.3)"] [[package]] name = "prometheus-client" -version = "0.22.1" +version = "0.23.1" description = "Python client for the Prometheus monitoring system." optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "prometheus_client-0.22.1-py3-none-any.whl", hash = "sha256:cca895342e308174341b2cbf99a56bef291fbc0ef7b9e5412a0f26d653ba7094"}, - {file = "prometheus_client-0.22.1.tar.gz", hash = "sha256:190f1331e783cf21eb60bca559354e0a4d4378facecf78f5428c39b675d20d28"}, + {file = "prometheus_client-0.23.1-py3-none-any.whl", hash = "sha256:dd1913e6e76b59cfe44e7a4b83e01afc9873c1bdfd2ed8739f1e76aeca115f99"}, + {file = "prometheus_client-0.23.1.tar.gz", hash = "sha256:6ae8f9081eaaaf153a2e959d2e6c4f4fb57b12ef76c8c7980202f1e57b48b2ce"}, ] [package.extras] @@ -2655,14 +3358,14 @@ twisted = ["twisted"] [[package]] name = "prompt-toolkit" -version = "3.0.51" +version = "3.0.52" description = "Library for building powerful interactive command lines in Python" optional = false python-versions = ">=3.8" groups = ["main", "demo", "dev"] files = [ - {file = "prompt_toolkit-3.0.51-py3-none-any.whl", hash = "sha256:52742911fde84e2d423e2f9a4cf1de7d7ac4e51958f648d9540e0fb8db077b07"}, - {file = "prompt_toolkit-3.0.51.tar.gz", hash = "sha256:931a162e3b27fc90c86f1b48bb1fb2c528c2761475e57c9c06de13311c7b54ed"}, + {file = "prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955"}, + {file = "prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855"}, ] [package.dependencies] @@ -2670,27 +3373,38 @@ wcwidth = "*" [[package]] name = "psutil" -version = "7.0.0" -description = "Cross-platform lib for process and system monitoring in Python. NOTE: the syntax of this script MUST be kept compatible with Python 2.7." +version = "7.2.1" +description = "Cross-platform lib for process and system monitoring." optional = false python-versions = ">=3.6" groups = ["main", "demo"] files = [ - {file = "psutil-7.0.0-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:101d71dc322e3cffd7cea0650b09b3d08b8e7c4109dd6809fe452dfd00e58b25"}, - {file = "psutil-7.0.0-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:39db632f6bb862eeccf56660871433e111b6ea58f2caea825571951d4b6aa3da"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_i686.manylinux2010_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:1fcee592b4c6f146991ca55919ea3d1f8926497a713ed7faaf8225e174581e91"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_12_x86_64.manylinux2010_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b1388a4f6875d7e2aff5c4ca1cc16c545ed41dd8bb596cefea80111db353a34"}, - {file = "psutil-7.0.0-cp36-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a5f098451abc2828f7dc6b58d44b532b22f2088f4999a937557b603ce72b1993"}, - {file = "psutil-7.0.0-cp36-cp36m-win32.whl", hash = "sha256:84df4eb63e16849689f76b1ffcb36db7b8de703d1bc1fe41773db487621b6c17"}, - {file = "psutil-7.0.0-cp36-cp36m-win_amd64.whl", hash = "sha256:1e744154a6580bc968a0195fd25e80432d3afec619daf145b9e5ba16cc1d688e"}, - {file = "psutil-7.0.0-cp37-abi3-win32.whl", hash = "sha256:ba3fcef7523064a6c9da440fc4d6bd07da93ac726b5733c29027d7dc95b39d99"}, - {file = "psutil-7.0.0-cp37-abi3-win_amd64.whl", hash = "sha256:4cf3d4eb1aa9b348dec30105c55cd9b7d4629285735a102beb4441e38db90553"}, - {file = "psutil-7.0.0.tar.gz", hash = "sha256:7be9c3eba38beccb6495ea33afd982a44074b78f28c434a1f51cc07fd315c456"}, + {file = "psutil-7.2.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:ba9f33bb525b14c3ea563b2fd521a84d2fa214ec59e3e6a2858f78d0844dd60d"}, + {file = "psutil-7.2.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:81442dac7abfc2f4f4385ea9e12ddf5a796721c0f6133260687fec5c3780fa49"}, + {file = "psutil-7.2.1-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ea46c0d060491051d39f0d2cff4f98d5c72b288289f57a21556cc7d504db37fc"}, + {file = "psutil-7.2.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:35630d5af80d5d0d49cfc4d64c1c13838baf6717a13effb35869a5919b854cdf"}, + {file = "psutil-7.2.1-cp313-cp313t-win_amd64.whl", hash = "sha256:923f8653416604e356073e6e0bccbe7c09990acef442def2f5640dd0faa9689f"}, + {file = "psutil-7.2.1-cp313-cp313t-win_arm64.whl", hash = "sha256:cfbe6b40ca48019a51827f20d830887b3107a74a79b01ceb8cc8de4ccb17b672"}, + {file = "psutil-7.2.1-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:494c513ccc53225ae23eec7fe6e1482f1b8a44674241b54561f755a898650679"}, + {file = "psutil-7.2.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:3fce5f92c22b00cdefd1645aa58ab4877a01679e901555067b1bd77039aa589f"}, + {file = "psutil-7.2.1-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:93f3f7b0bb07711b49626e7940d6fe52aa9940ad86e8f7e74842e73189712129"}, + {file = "psutil-7.2.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d34d2ca888208eea2b5c68186841336a7f5e0b990edec929be909353a202768a"}, + {file = "psutil-7.2.1-cp314-cp314t-win_amd64.whl", hash = "sha256:2ceae842a78d1603753561132d5ad1b2f8a7979cb0c283f5b52fb4e6e14b1a79"}, + {file = "psutil-7.2.1-cp314-cp314t-win_arm64.whl", hash = "sha256:08a2f175e48a898c8eb8eace45ce01777f4785bc744c90aa2cc7f2fa5462a266"}, + {file = "psutil-7.2.1-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2e953fcfaedcfbc952b44744f22d16575d3aa78eb4f51ae74165b4e96e55f42"}, + {file = "psutil-7.2.1-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:05cc68dbb8c174828624062e73078e7e35406f4ca2d0866c272c2410d8ef06d1"}, + {file = "psutil-7.2.1-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5e38404ca2bb30ed7267a46c02f06ff842e92da3bb8c5bfdadbd35a5722314d8"}, + {file = "psutil-7.2.1-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab2b98c9fc19f13f59628d94df5cc4cc4844bc572467d113a8b517d634e362c6"}, + {file = "psutil-7.2.1-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f78baafb38436d5a128f837fab2d92c276dfb48af01a240b861ae02b2413ada8"}, + {file = "psutil-7.2.1-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:99a4cd17a5fdd1f3d014396502daa70b5ec21bf4ffe38393e152f8e449757d67"}, + {file = "psutil-7.2.1-cp37-abi3-win_amd64.whl", hash = "sha256:b1b0671619343aa71c20ff9767eced0483e4fc9e1f489d50923738caf6a03c17"}, + {file = "psutil-7.2.1-cp37-abi3-win_arm64.whl", hash = "sha256:0d67c1822c355aa6f7314d92018fb4268a76668a536f133599b91edd48759442"}, + {file = "psutil-7.2.1.tar.gz", hash = "sha256:f7583aec590485b43ca601dd9cea0dcd65bd7bb21d30ef4ddbf4ea6b5ed1bdd3"}, ] [package.extras] -dev = ["abi3audit", "black (==24.10.0)", "check-manifest", "coverage", "packaging", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "virtualenv", "vulture", "wheel"] -test = ["pytest", "pytest-xdist", "setuptools"] +dev = ["abi3audit", "black", "check-manifest", "coverage", "packaging", "psleak", "pylint", "pyperf", "pypinfo", "pytest", "pytest-cov", "pytest-instafail", "pytest-xdist", "requests", "rstcheck", "ruff", "setuptools", "sphinx", "sphinx_rtd_theme", "toml-sort", "twine", "validate-pyproject[all]", "virtualenv", "vulture", "wheel"] +test = ["psleak", "pytest", "pytest-instafail", "pytest-xdist", "setuptools"] [[package]] name = "ptyprocess" @@ -2707,19 +3421,26 @@ markers = {main = "sys_platform != \"win32\" and sys_platform != \"emscripten\" [[package]] name = "pulp" -version = "3.2.1" +version = "3.3.0" description = "PuLP is an LP modeler written in python. PuLP can generate MPS or LP files and call GLPK, COIN CLP/CBC, CPLEX, and GUROBI to solve linear problems." optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "pulp-3.2.1-py3-none-any.whl", hash = "sha256:c6cf7fe84cef15795bc7c27e2f3c6784db5cf6ebf68e94d5a659b02415f982c5"}, - {file = "pulp-3.2.1.tar.gz", hash = "sha256:fc6c02c47c06342c586b175924add753cad7638ff6149b3b43e87ac6709ac469"}, + {file = "pulp-3.3.0-py3-none-any.whl", hash = "sha256:dd6ad2d63f196d1254eddf9dcff5cd224912c1f046120cb7c143c5b0eda63fae"}, + {file = "pulp-3.3.0.tar.gz", hash = "sha256:7eb99b9ce7beeb8bbb7ea9d1c919f02f003ab7867e0d1e322f2f2c26dd31c8ba"}, ] [package.extras] +copt = ["coptpy"] +cplex = ["cplex ; sys_platform != \"darwin\" or python_full_version < \"3.12.0\""] +gurobi = ["gurobipy"] +highs = ["highspy"] +mosek = ["mosek"] open-py = ["cylp", "highspy", "pyscipopt"] -public-py = ["coptpy", "gurobipy", "xpress"] +public-py = ["coptpy", "cplex ; sys_platform != \"darwin\" or python_full_version < \"3.12.0\"", "gurobipy", "xpress"] +scip = ["pyscipopt"] +xpress = ["xpress"] [[package]] name = "pure-eval" @@ -2750,14 +3471,15 @@ files = [ [[package]] name = "pycparser" -version = "2.22" +version = "2.23" description = "C parser in Python" optional = false python-versions = ">=3.8" groups = ["main", "demo"] +markers = "implementation_name != \"PyPy\"" files = [ - {file = "pycparser-2.22-py3-none-any.whl", hash = "sha256:c3702b6d3dd8c7abc1afa565d7e63d53a1d0bd86cdc24edd75470f4de499cfcc"}, - {file = "pycparser-2.22.tar.gz", hash = "sha256:491c8be9c040f5390f5bf44a5b07752bd07f56edf992381b05c701439eec10f6"}, + {file = "pycparser-2.23-py3-none-any.whl", hash = "sha256:e5c6e8d3fbad53479cab09ac03729e0a9faf2bee3db8208a550daf5af81a5934"}, + {file = "pycparser-2.23.tar.gz", hash = "sha256:78816d4f24add8f10a06d6f05b4d424ad9e96cfebf68a4ddc99c65c0720d00c2"}, ] [[package]] @@ -2778,7 +3500,7 @@ version = "2.19.2" description = "Pygments is a syntax highlighting package written in Python." optional = false python-versions = ">=3.8" -groups = ["main", "demo", "dev"] +groups = ["main", "demo", "dev", "docs"] files = [ {file = "pygments-2.19.2-py3-none-any.whl", hash = "sha256:86540386c03d588bb81d44bc3928634ff26449851e99741617ecb9037ee5ec0b"}, {file = "pygments-2.19.2.tar.gz", hash = "sha256:636cb2477cec7f8952536970bc533bc43743542f70392ae026374600add5b887"}, @@ -2787,16 +3509,35 @@ files = [ [package.extras] windows-terminal = ["colorama (>=0.4.6)"] +[[package]] +name = "pymdown-extensions" +version = "10.20" +description = "Extension pack for Python Markdown." +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "pymdown_extensions-10.20-py3-none-any.whl", hash = "sha256:ea9e62add865da80a271d00bfa1c0fa085b20d133fb3fc97afdc88e682f60b2f"}, + {file = "pymdown_extensions-10.20.tar.gz", hash = "sha256:5c73566ab0cf38c6ba084cb7c5ea64a119ae0500cce754ccb682761dfea13a52"}, +] + +[package.dependencies] +markdown = ">=3.6" +pyyaml = "*" + +[package.extras] +extra = ["pygments (>=2.19.1)"] + [[package]] name = "pyparsing" -version = "3.2.3" -description = "pyparsing module - Classes and methods to define and execute parsing grammars" +version = "3.3.1" +description = "pyparsing - Classes and methods to define and execute parsing grammars" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "pyparsing-3.2.3-py3-none-any.whl", hash = "sha256:a749938e02d6fd0b59b356ca504a24982314bb090c383e3cf201c95ef7e2bfcf"}, - {file = "pyparsing-3.2.3.tar.gz", hash = "sha256:b9c13f1ab8b3b542f72e28f634bad4de758ab3ce4546e4301970ad6fa77c38be"}, + {file = "pyparsing-3.3.1-py3-none-any.whl", hash = "sha256:023b5e7e5520ad96642e2c6db4cb683d3970bd640cdf7115049a6e9c3682df82"}, + {file = "pyparsing-3.3.1.tar.gz", hash = "sha256:47fad0f17ac1e2cad3de3b458570fbc9b03560aa029ed5e16ee5554da9a2251c"}, ] [package.extras] @@ -2804,14 +3545,14 @@ diagrams = ["jinja2", "railroad-diagrams"] [[package]] name = "pytest" -version = "8.4.1" +version = "8.4.2" description = "pytest: simple powerful testing with Python" optional = false python-versions = ">=3.9" groups = ["dev"] files = [ - {file = "pytest-8.4.1-py3-none-any.whl", hash = "sha256:539c70ba6fcead8e78eebbf1115e8b589e7565830d7d006a8723f19ac8a0afb7"}, - {file = "pytest-8.4.1.tar.gz", hash = "sha256:7c67fd69174877359ed9371ec3af8a3d2b04741818c51e5e99cc1742251fa93c"}, + {file = "pytest-8.4.2-py3-none-any.whl", hash = "sha256:872f880de3fc3a5bdc88a11b39c9710c3497a547cfa9320bc3c5e62fbf272e79"}, + {file = "pytest-8.4.2.tar.gz", hash = "sha256:86c0d0b93306b961d58d62a4db4879f27fe25513d4b969df351abdddb3c30e01"}, ] [package.dependencies] @@ -2852,7 +3593,7 @@ 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" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] 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"}, @@ -2863,19 +3604,34 @@ six = ">=1.5" [[package]] name = "python-json-logger" -version = "3.3.0" +version = "4.0.0" description = "JSON Log Formatter for the Python Logging Package" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "python_json_logger-3.3.0-py3-none-any.whl", hash = "sha256:dd980fae8cffb24c13caf6e158d3d61c0d6d22342f932cb6e9deedab3d35eec7"}, - {file = "python_json_logger-3.3.0.tar.gz", hash = "sha256:12b7e74b17775e7d565129296105bbe3910842d9d0eb083fc83a6a617aa8df84"}, + {file = "python_json_logger-4.0.0-py3-none-any.whl", hash = "sha256:af09c9daf6a813aa4cc7180395f50f2a9e5fa056034c9953aec92e381c5ba1e2"}, + {file = "python_json_logger-4.0.0.tar.gz", hash = "sha256:f58e68eb46e1faed27e0f574a55a0455eecd7b8a5b88b85a784519ba3cff047f"}, ] [package.extras] dev = ["backports.zoneinfo ; python_version < \"3.9\"", "black", "build", "freezegun", "mdx_truly_sane_lists", "mike", "mkdocs", "mkdocs-awesome-pages-plugin", "mkdocs-gen-files", "mkdocs-literate-nav", "mkdocs-material (>=8.5)", "mkdocstrings[python]", "msgspec ; implementation_name != \"pypy\"", "mypy", "orjson ; implementation_name != \"pypy\"", "pylint", "pytest", "tzdata", "validate-pyproject[all]"] +[[package]] +name = "pytokens" +version = "0.3.0" +description = "A Fast, spec compliant Python 3.14+ tokenizer that runs on older Pythons." +optional = false +python-versions = ">=3.8" +groups = ["dev"] +files = [ + {file = "pytokens-0.3.0-py3-none-any.whl", hash = "sha256:95b2b5eaf832e469d141a378872480ede3f251a5a5041b8ec6e581d3ac71bbf3"}, + {file = "pytokens-0.3.0.tar.gz", hash = "sha256:2f932b14ed08de5fcf0b391ace2642f858f1394c0857202959000b68ed7a458a"}, +] + +[package.extras] +dev = ["black", "build", "mypy", "pytest", "pytest-cov", "setuptools", "tox", "twine", "wheel"] + [[package]] name = "pytz" version = "2025.2" @@ -2890,14 +3646,14 @@ files = [ [[package]] name = "pyvista" -version = "0.45.3" +version = "0.46.4" description = "Easier Pythonic interface to VTK" optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "pyvista-0.45.3-py3-none-any.whl", hash = "sha256:a38109c67e47b46f8c7f31bdf5786e7265bea2785fbf469dd822f2e814c3bf1c"}, - {file = "pyvista-0.45.3.tar.gz", hash = "sha256:bca39f5ea17e45f40070ab45423dfd2c4fc81c33e0fb565bafded81c024fd04f"}, + {file = "pyvista-0.46.4-py3-none-any.whl", hash = "sha256:f113a8db2f49ae1b2f9eeb477c51a4038a4dfdd02ac097900aa49bf1d77f7b2e"}, + {file = "pyvista-0.46.4.tar.gz", hash = "sha256:37ddd2783a45b552623df293e77ce93ed015244e8d89d1de179d2df594d7c571"}, ] [package.dependencies] @@ -2906,214 +3662,233 @@ numpy = ">=1.21.0" pillow = "*" pooch = "*" scooby = ">=0.5.1" -typing-extensions = "*" -vtk = "<9.4.0 || >9.4.0,<9.4.1 || >9.4.1,<9.5.0" +typing-extensions = ">=4.10" +vtk = "<9.4.0 || >9.4.0,<9.4.1 || >9.4.1,<9.6.0" [package.extras] all = ["pyvista[colormaps,io,jupyter]"] -colormaps = ["cmocean", "colorcet"] +colormaps = ["cmcrameri", "cmocean", "colorcet"] io = ["imageio", "meshio (>=5.2)"] jupyter = ["ipywidgets", "jupyter-server-proxy", "nest_asyncio", "trame (>=2.5.2)", "trame-client (>=2.12.7)", "trame-server (>=2.11.7)", "trame-vtk (>=2.5.8)", "trame-vuetify (>=2.3.1)"] -[[package]] -name = "pywin32" -version = "311" -description = "Python for Window Extensions" -optional = false -python-versions = "*" -groups = ["main", "demo"] -markers = "sys_platform == \"win32\" and platform_python_implementation != \"PyPy\"" -files = [ - {file = "pywin32-311-cp310-cp310-win32.whl", hash = "sha256:d03ff496d2a0cd4a5893504789d4a15399133fe82517455e78bad62efbb7f0a3"}, - {file = "pywin32-311-cp310-cp310-win_amd64.whl", hash = "sha256:797c2772017851984b97180b0bebe4b620bb86328e8a884bb626156295a63b3b"}, - {file = "pywin32-311-cp310-cp310-win_arm64.whl", hash = "sha256:0502d1facf1fed4839a9a51ccbcc63d952cf318f78ffc00a7e78528ac27d7a2b"}, - {file = "pywin32-311-cp311-cp311-win32.whl", hash = "sha256:184eb5e436dea364dcd3d2316d577d625c0351bf237c4e9a5fabbcfa5a58b151"}, - {file = "pywin32-311-cp311-cp311-win_amd64.whl", hash = "sha256:3ce80b34b22b17ccbd937a6e78e7225d80c52f5ab9940fe0506a1a16f3dab503"}, - {file = "pywin32-311-cp311-cp311-win_arm64.whl", hash = "sha256:a733f1388e1a842abb67ffa8e7aad0e70ac519e09b0f6a784e65a136ec7cefd2"}, - {file = "pywin32-311-cp312-cp312-win32.whl", hash = "sha256:750ec6e621af2b948540032557b10a2d43b0cee2ae9758c54154d711cc852d31"}, - {file = "pywin32-311-cp312-cp312-win_amd64.whl", hash = "sha256:b8c095edad5c211ff31c05223658e71bf7116daa0ecf3ad85f3201ea3190d067"}, - {file = "pywin32-311-cp312-cp312-win_arm64.whl", hash = "sha256:e286f46a9a39c4a18b319c28f59b61de793654af2f395c102b4f819e584b5852"}, - {file = "pywin32-311-cp313-cp313-win32.whl", hash = "sha256:f95ba5a847cba10dd8c4d8fefa9f2a6cf283b8b88ed6178fa8a6c1ab16054d0d"}, - {file = "pywin32-311-cp313-cp313-win_amd64.whl", hash = "sha256:718a38f7e5b058e76aee1c56ddd06908116d35147e133427e59a3983f703a20d"}, - {file = "pywin32-311-cp313-cp313-win_arm64.whl", hash = "sha256:7b4075d959648406202d92a2310cb990fea19b535c7f4a78d3f5e10b926eeb8a"}, - {file = "pywin32-311-cp314-cp314-win32.whl", hash = "sha256:b7a2c10b93f8986666d0c803ee19b5990885872a7de910fc460f9b0c2fbf92ee"}, - {file = "pywin32-311-cp314-cp314-win_amd64.whl", hash = "sha256:3aca44c046bd2ed8c90de9cb8427f581c479e594e99b5c0bb19b29c10fd6cb87"}, - {file = "pywin32-311-cp314-cp314-win_arm64.whl", hash = "sha256:a508e2d9025764a8270f93111a970e1d0fbfc33f4153b388bb649b7eec4f9b42"}, - {file = "pywin32-311-cp38-cp38-win32.whl", hash = "sha256:6c6f2969607b5023b0d9ce2541f8d2cbb01c4f46bc87456017cf63b73f1e2d8c"}, - {file = "pywin32-311-cp38-cp38-win_amd64.whl", hash = "sha256:c8015b09fb9a5e188f83b7b04de91ddca4658cee2ae6f3bc483f0b21a77ef6cd"}, - {file = "pywin32-311-cp39-cp39-win32.whl", hash = "sha256:aba8f82d551a942cb20d4a83413ccbac30790b50efb89a75e4f586ac0bb8056b"}, - {file = "pywin32-311-cp39-cp39-win_amd64.whl", hash = "sha256:e0c4cfb0621281fe40387df582097fd796e80430597cb9944f0ae70447bacd91"}, - {file = "pywin32-311-cp39-cp39-win_arm64.whl", hash = "sha256:62ea666235135fee79bb154e695f3ff67370afefd71bd7fea7512fc70ef31e3d"}, -] - [[package]] name = "pywinpty" -version = "2.0.15" +version = "3.0.2" description = "Pseudo terminal support for Windows from Python." optional = false python-versions = ">=3.9" groups = ["main", "demo"] markers = "os_name == \"nt\"" files = [ - {file = "pywinpty-2.0.15-cp310-cp310-win_amd64.whl", hash = "sha256:8e7f5de756a615a38b96cd86fa3cd65f901ce54ce147a3179c45907fa11b4c4e"}, - {file = "pywinpty-2.0.15-cp311-cp311-win_amd64.whl", hash = "sha256:9a6bcec2df2707aaa9d08b86071970ee32c5026e10bcc3cc5f6f391d85baf7ca"}, - {file = "pywinpty-2.0.15-cp312-cp312-win_amd64.whl", hash = "sha256:83a8f20b430bbc5d8957249f875341a60219a4e971580f2ba694fbfb54a45ebc"}, - {file = "pywinpty-2.0.15-cp313-cp313-win_amd64.whl", hash = "sha256:ab5920877dd632c124b4ed17bc6dd6ef3b9f86cd492b963ffdb1a67b85b0f408"}, - {file = "pywinpty-2.0.15-cp313-cp313t-win_amd64.whl", hash = "sha256:a4560ad8c01e537708d2790dbe7da7d986791de805d89dd0d3697ca59e9e4901"}, - {file = "pywinpty-2.0.15-cp39-cp39-win_amd64.whl", hash = "sha256:d261cd88fcd358cfb48a7ca0700db3e1c088c9c10403c9ebc0d8a8b57aa6a117"}, - {file = "pywinpty-2.0.15.tar.gz", hash = "sha256:312cf39153a8736c617d45ce8b6ad6cd2107de121df91c455b10ce6bba7a39b2"}, + {file = "pywinpty-3.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:65db57fd3387d71e8372b6a54269cbcd0f6dfa6d4616a29e0af749ec19f5c558"}, + {file = "pywinpty-3.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:327790d70e4c841ebd9d0f295a780177149aeb405bca44c7115a3de5c2054b23"}, + {file = "pywinpty-3.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:99fdd9b455f0ad6419aba6731a7a0d2f88ced83c3c94a80ff9533d95fa8d8a9e"}, + {file = "pywinpty-3.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:18f78b81e4cfee6aabe7ea8688441d30247b73e52cd9657138015c5f4ee13a51"}, + {file = "pywinpty-3.0.2-cp313-cp313t-win_amd64.whl", hash = "sha256:663383ecfab7fc382cc97ea5c4f7f0bb32c2f889259855df6ea34e5df42d305b"}, + {file = "pywinpty-3.0.2-cp314-cp314-win_amd64.whl", hash = "sha256:28297cecc37bee9f24d8889e47231972d6e9e84f7b668909de54f36ca785029a"}, + {file = "pywinpty-3.0.2-cp314-cp314t-win_amd64.whl", hash = "sha256:34b55ae9a1b671fe3eae071d86618110538e8eaad18fcb1531c0830b91a82767"}, + {file = "pywinpty-3.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:3962daf801bc38dd4de872108c424b5338c9a46c6efca5761854cd66370a9022"}, + {file = "pywinpty-3.0.2.tar.gz", hash = "sha256:1505cc4cb248af42cb6285a65c9c2086ee9e7e574078ee60933d5d7fa86fb004"}, ] [[package]] name = "pyyaml" -version = "6.0.2" +version = "6.0.3" description = "YAML parser and emitter for Python" optional = false python-versions = ">=3.8" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] +files = [ + {file = "PyYAML-6.0.3-cp38-cp38-macosx_10_13_x86_64.whl", hash = "sha256:c2514fceb77bc5e7a2f7adfaa1feb2fb311607c9cb518dbc378688ec73d8292f"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c57bb8c96f6d1808c030b1687b9b5fb476abaa47f0db9c0101f5e9f394e97f4"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:efd7b85f94a6f21e4932043973a7ba2613b059c4a000551892ac9f1d11f5baf3"}, + {file = "PyYAML-6.0.3-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:22ba7cfcad58ef3ecddc7ed1db3409af68d023b7f940da23c6c2a1890976eda6"}, + {file = "PyYAML-6.0.3-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:6344df0d5755a2c9a276d4473ae6b90647e216ab4757f8426893b5dd2ac3f369"}, + {file = "PyYAML-6.0.3-cp38-cp38-win32.whl", hash = "sha256:3ff07ec89bae51176c0549bc4c63aa6202991da2d9a6129d7aef7f1407d3f295"}, + {file = "PyYAML-6.0.3-cp38-cp38-win_amd64.whl", hash = "sha256:5cf4e27da7e3fbed4d6c3d8e797387aaad68102272f8f9752883bc32d61cb87b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b"}, + {file = "pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198"}, + {file = "pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0"}, + {file = "pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69"}, + {file = "pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e"}, + {file = "pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e"}, + {file = "pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00"}, + {file = "pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a"}, + {file = "pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4"}, + {file = "pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b"}, + {file = "pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196"}, + {file = "pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c"}, + {file = "pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e"}, + {file = "pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea"}, + {file = "pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b"}, + {file = "pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8"}, + {file = "pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5"}, + {file = "pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6"}, + {file = "pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be"}, + {file = "pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c"}, + {file = "pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac"}, + {file = "pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788"}, + {file = "pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764"}, + {file = "pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac"}, + {file = "pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3"}, + {file = "pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702"}, + {file = "pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065"}, + {file = "pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9"}, + {file = "pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_10_13_x86_64.whl", hash = "sha256:b865addae83924361678b652338317d1bd7e79b1f4596f96b96c77a5a34b34da"}, + {file = "pyyaml-6.0.3-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c3355370a2c156cffb25e876646f149d5d68f5e0a3ce86a5084dd0b64a994917"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3c5677e12444c15717b902a5798264fa7909e41153cdf9ef7ad571b704a63dd9"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ed875a24292240029e4483f9d4a4b8a1ae08843b9c54f43fcc11e404532a8a5"}, + {file = "pyyaml-6.0.3-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0150219816b6a1fa26fb4699fb7daa9caf09eb1999f3b70fb6e786805e80375a"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:fa160448684b4e94d80416c0fa4aac48967a969efe22931448d853ada8baf926"}, + {file = "pyyaml-6.0.3-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:27c0abcb4a5dac13684a37f76e701e054692a9b2d3064b70f5e4eb54810553d7"}, + {file = "pyyaml-6.0.3-cp39-cp39-win32.whl", hash = "sha256:1ebe39cb5fc479422b83de611d14e2c0d3bb2a18bbcb01f229ab3cfbd8fee7a0"}, + {file = "pyyaml-6.0.3-cp39-cp39-win_amd64.whl", hash = "sha256:2e71d11abed7344e42a8849600193d15b6def118602c4c176f748e4583246007"}, + {file = "pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f"}, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +description = "A custom YAML tag for referencing environment variables in YAML files." +optional = false +python-versions = ">=3.9" +groups = ["docs"] files = [ - {file = "PyYAML-6.0.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:0a9a2848a5b7feac301353437eb7d5957887edbf81d56e903999a75a3d743086"}, - {file = "PyYAML-6.0.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:29717114e51c84ddfba879543fb232a6ed60086602313ca38cce623c1d62cfbf"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8824b5a04a04a047e72eea5cec3bc266db09e35de6bdfe34c9436ac5ee27d237"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7c36280e6fb8385e520936c3cb3b8042851904eba0e58d277dca80a5cfed590b"}, - {file = "PyYAML-6.0.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ec031d5d2feb36d1d1a24380e4db6d43695f3748343d99434e6f5f9156aaa2ed"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:936d68689298c36b53b29f23c6dbb74de12b4ac12ca6cfe0e047bedceea56180"}, - {file = "PyYAML-6.0.2-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:23502f431948090f597378482b4812b0caae32c22213aecf3b55325e049a6c68"}, - {file = "PyYAML-6.0.2-cp310-cp310-win32.whl", hash = "sha256:2e99c6826ffa974fe6e27cdb5ed0021786b03fc98e5ee3c5bfe1fd5015f42b99"}, - {file = "PyYAML-6.0.2-cp310-cp310-win_amd64.whl", hash = "sha256:a4d3091415f010369ae4ed1fc6b79def9416358877534caf6a0fdd2146c87a3e"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:cc1c1159b3d456576af7a3e4d1ba7e6924cb39de8f67111c735f6fc832082774"}, - {file = "PyYAML-6.0.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1e2120ef853f59c7419231f3bf4e7021f1b936f6ebd222406c3b60212205d2ee"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5d225db5a45f21e78dd9358e58a98702a0302f2659a3c6cd320564b75b86f47c"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:5ac9328ec4831237bec75defaf839f7d4564be1e6b25ac710bd1a96321cc8317"}, - {file = "PyYAML-6.0.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3ad2a3decf9aaba3d29c8f537ac4b243e36bef957511b4766cb0057d32b0be85"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:ff3824dc5261f50c9b0dfb3be22b4567a6f938ccce4587b38952d85fd9e9afe4"}, - {file = "PyYAML-6.0.2-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:797b4f722ffa07cc8d62053e4cff1486fa6dc094105d13fea7b1de7d8bf71c9e"}, - {file = "PyYAML-6.0.2-cp311-cp311-win32.whl", hash = "sha256:11d8f3dd2b9c1207dcaf2ee0bbbfd5991f571186ec9cc78427ba5bd32afae4b5"}, - {file = "PyYAML-6.0.2-cp311-cp311-win_amd64.whl", hash = "sha256:e10ce637b18caea04431ce14fabcf5c64a1c61ec9c56b071a4b7ca131ca52d44"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:c70c95198c015b85feafc136515252a261a84561b7b1d51e3384e0655ddf25ab"}, - {file = "PyYAML-6.0.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ce826d6ef20b1bc864f0a68340c8b3287705cae2f8b4b1d932177dcc76721725"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1f71ea527786de97d1a0cc0eacd1defc0985dcf6b3f17bb77dcfc8c34bec4dc5"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9b22676e8097e9e22e36d6b7bda33190d0d400f345f23d4065d48f4ca7ae0425"}, - {file = "PyYAML-6.0.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:80bab7bfc629882493af4aa31a4cfa43a4c57c83813253626916b8c7ada83476"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:0833f8694549e586547b576dcfaba4a6b55b9e96098b36cdc7ebefe667dfed48"}, - {file = "PyYAML-6.0.2-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8b9c7197f7cb2738065c481a0461e50ad02f18c78cd75775628afb4d7137fb3b"}, - {file = "PyYAML-6.0.2-cp312-cp312-win32.whl", hash = "sha256:ef6107725bd54b262d6dedcc2af448a266975032bc85ef0172c5f059da6325b4"}, - {file = "PyYAML-6.0.2-cp312-cp312-win_amd64.whl", hash = "sha256:7e7401d0de89a9a855c839bc697c079a4af81cf878373abd7dc625847d25cbd8"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:efdca5630322a10774e8e98e1af481aad470dd62c3170801852d752aa7a783ba"}, - {file = "PyYAML-6.0.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:50187695423ffe49e2deacb8cd10510bc361faac997de9efef88badc3bb9e2d1"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0ffe8360bab4910ef1b9e87fb812d8bc0a308b0d0eef8c8f44e0254ab3b07133"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:17e311b6c678207928d649faa7cb0d7b4c26a0ba73d41e99c4fff6b6c3276484"}, - {file = "PyYAML-6.0.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70b189594dbe54f75ab3a1acec5f1e3faa7e8cf2f1e08d9b561cb41b845f69d5"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_aarch64.whl", hash = "sha256:41e4e3953a79407c794916fa277a82531dd93aad34e29c2a514c2c0c5fe971cc"}, - {file = "PyYAML-6.0.2-cp313-cp313-musllinux_1_1_x86_64.whl", hash = "sha256:68ccc6023a3400877818152ad9a1033e3db8625d899c72eacb5a668902e4d652"}, - {file = "PyYAML-6.0.2-cp313-cp313-win32.whl", hash = "sha256:bc2fa7c6b47d6bc618dd7fb02ef6fdedb1090ec036abab80d4681424b84c1183"}, - {file = "PyYAML-6.0.2-cp313-cp313-win_amd64.whl", hash = "sha256:8388ee1976c416731879ac16da0aff3f63b286ffdd57cdeb95f3f2e085687563"}, - {file = "PyYAML-6.0.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:24471b829b3bf607e04e88d79542a9d48bb037c2267d7927a874e6c205ca7e9a"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d7fded462629cfa4b685c5416b949ebad6cec74af5e2d42905d41e257e0869f5"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d84a1718ee396f54f3a086ea0a66d8e552b2ab2017ef8b420e92edbc841c352d"}, - {file = "PyYAML-6.0.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9056c1ecd25795207ad294bcf39f2db3d845767be0ea6e6a34d856f006006083"}, - {file = "PyYAML-6.0.2-cp38-cp38-musllinux_1_1_x86_64.whl", hash = "sha256:82d09873e40955485746739bcb8b4586983670466c23382c19cffecbf1fd8706"}, - {file = "PyYAML-6.0.2-cp38-cp38-win32.whl", hash = "sha256:43fa96a3ca0d6b1812e01ced1044a003533c47f6ee8aca31724f78e93ccc089a"}, - {file = "PyYAML-6.0.2-cp38-cp38-win_amd64.whl", hash = "sha256:01179a4a8559ab5de078078f37e5c1a30d76bb88519906844fd7bdea1b7729ff"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:688ba32a1cffef67fd2e9398a2efebaea461578b0923624778664cc1c914db5d"}, - {file = "PyYAML-6.0.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:a8786accb172bd8afb8be14490a16625cbc387036876ab6ba70912730faf8e1f"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d8e03406cac8513435335dbab54c0d385e4a49e4945d2909a581c83647ca0290"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f753120cb8181e736c57ef7636e83f31b9c0d1722c516f7e86cf15b7aa57ff12"}, - {file = "PyYAML-6.0.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3b1fdb9dc17f5a7677423d508ab4f243a726dea51fa5e70992e59a7411c89d19"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_aarch64.whl", hash = "sha256:0b69e4ce7a131fe56b7e4d770c67429700908fc0752af059838b1cfb41960e4e"}, - {file = "PyYAML-6.0.2-cp39-cp39-musllinux_1_1_x86_64.whl", hash = "sha256:a9f8c2e67970f13b16084e04f134610fd1d374bf477b17ec1599185cf611d725"}, - {file = "PyYAML-6.0.2-cp39-cp39-win32.whl", hash = "sha256:6395c297d42274772abc367baaa79683958044e5d3835486c16da75d2a694631"}, - {file = "PyYAML-6.0.2-cp39-cp39-win_amd64.whl", hash = "sha256:39693e1f8320ae4f43943590b49779ffb98acb81f788220ea932a6b6c51004d8"}, - {file = "pyyaml-6.0.2.tar.gz", hash = "sha256:d584d9ec91ad65861cc08d42e834324ef890a082e591037abe114850ff7bbc3e"}, + {file = "pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04"}, + {file = "pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff"}, ] +[package.dependencies] +pyyaml = "*" + [[package]] name = "pyzmq" -version = "27.0.0" +version = "27.1.0" description = "Python bindings for 0MQ" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "pyzmq-27.0.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:b973ee650e8f442ce482c1d99ca7ab537c69098d53a3d046676a484fd710c87a"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:661942bc7cd0223d569d808f2e5696d9cc120acc73bf3e88a1f1be7ab648a7e4"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:50360fb2a056ffd16e5f4177eee67f1dd1017332ea53fb095fe7b5bf29c70246"}, - {file = "pyzmq-27.0.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cf209a6dc4b420ed32a7093642843cbf8703ed0a7d86c16c0b98af46762ebefb"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2dace4a7041cca2fba5357a2d7c97c5effdf52f63a1ef252cfa496875a3762d"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63af72b2955fc77caf0a77444baa2431fcabb4370219da38e1a9f8d12aaebe28"}, - {file = "pyzmq-27.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e8c4adce8e37e75c4215297d7745551b8dcfa5f728f23ce09bf4e678a9399413"}, - {file = "pyzmq-27.0.0-cp310-cp310-win32.whl", hash = "sha256:5d5ef4718ecab24f785794e0e7536436698b459bfbc19a1650ef55280119d93b"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:e40609380480b3d12c30f841323f42451c755b8fece84235236f5fe5ffca8c1c"}, - {file = "pyzmq-27.0.0-cp310-cp310-win_arm64.whl", hash = "sha256:6b0397b0be277b46762956f576e04dc06ced265759e8c2ff41a0ee1aa0064198"}, - {file = "pyzmq-27.0.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:21457825249b2a53834fa969c69713f8b5a79583689387a5e7aed880963ac564"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1958947983fef513e6e98eff9cb487b60bf14f588dc0e6bf35fa13751d2c8251"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0dc628b5493f9a8cd9844b8bee9732ef587ab00002157c9329e4fc0ef4d3afa"}, - {file = "pyzmq-27.0.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7bbe9e1ed2c8d3da736a15694d87c12493e54cc9dc9790796f0321794bbc91f"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc1091f59143b471d19eb64f54bae4f54bcf2a466ffb66fe45d94d8d734eb495"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:7011ade88c8e535cf140f8d1a59428676fbbce7c6e54fefce58bf117aefb6667"}, - {file = "pyzmq-27.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:2c386339d7e3f064213aede5d03d054b237937fbca6dd2197ac8cf3b25a6b14e"}, - {file = "pyzmq-27.0.0-cp311-cp311-win32.whl", hash = "sha256:0546a720c1f407b2172cb04b6b094a78773491497e3644863cf5c96c42df8cff"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:15f39d50bd6c9091c67315ceb878a4f531957b121d2a05ebd077eb35ddc5efed"}, - {file = "pyzmq-27.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c5817641eebb391a2268c27fecd4162448e03538387093cdbd8bf3510c316b38"}, - {file = "pyzmq-27.0.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:cbabc59dcfaac66655c040dfcb8118f133fb5dde185e5fc152628354c1598e52"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:cb0ac5179cba4b2f94f1aa208fbb77b62c4c9bf24dd446278b8b602cf85fcda3"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53a48f0228eab6cbf69fde3aa3c03cbe04e50e623ef92ae395fce47ef8a76152"}, - {file = "pyzmq-27.0.0-cp312-abi3-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:111db5f395e09f7e775f759d598f43cb815fc58e0147623c4816486e1a39dc22"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:c8878011653dcdc27cc2c57e04ff96f0471e797f5c19ac3d7813a245bcb24371"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:c0ed2c1f335ba55b5fdc964622254917d6b782311c50e138863eda409fbb3b6d"}, - {file = "pyzmq-27.0.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e918d70862d4cfd4b1c187310015646a14e1f5917922ab45b29f28f345eeb6be"}, - {file = "pyzmq-27.0.0-cp312-abi3-win32.whl", hash = "sha256:88b4e43cab04c3c0f0d55df3b1eef62df2b629a1a369b5289a58f6fa8b07c4f4"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_amd64.whl", hash = "sha256:dce4199bf5f648a902ce37e7b3afa286f305cd2ef7a8b6ec907470ccb6c8b371"}, - {file = "pyzmq-27.0.0-cp312-abi3-win_arm64.whl", hash = "sha256:56e46bbb85d52c1072b3f809cc1ce77251d560bc036d3a312b96db1afe76db2e"}, - {file = "pyzmq-27.0.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:c36ad534c0c29b4afa088dc53543c525b23c0797e01b69fef59b1a9c0e38b688"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:67855c14173aec36395d7777aaba3cc527b393821f30143fd20b98e1ff31fd38"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8617c7d43cd8ccdb62aebe984bfed77ca8f036e6c3e46dd3dddda64b10f0ab7a"}, - {file = "pyzmq-27.0.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:67bfbcbd0a04c575e8103a6061d03e393d9f80ffdb9beb3189261e9e9bc5d5e9"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:5cd11d46d7b7e5958121b3eaf4cd8638eff3a720ec527692132f05a57f14341d"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:b801c2e40c5aa6072c2f4876de8dccd100af6d9918d4d0d7aa54a1d982fd4f44"}, - {file = "pyzmq-27.0.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:20d5cb29e8c5f76a127c75b6e7a77e846bc4b655c373baa098c26a61b7ecd0ef"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win32.whl", hash = "sha256:a20528da85c7ac7a19b7384e8c3f8fa707841fd85afc4ed56eda59d93e3d98ad"}, - {file = "pyzmq-27.0.0-cp313-cp313t-win_amd64.whl", hash = "sha256:d8229f2efece6a660ee211d74d91dbc2a76b95544d46c74c615e491900dc107f"}, - {file = "pyzmq-27.0.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:f4162dbbd9c5c84fb930a36f290b08c93e35fce020d768a16fc8891a2f72bab8"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4e7d0a8d460fba526cc047333bdcbf172a159b8bd6be8c3eb63a416ff9ba1477"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:29f44e3c26b9783816ba9ce274110435d8f5b19bbd82f7a6c7612bb1452a3597"}, - {file = "pyzmq-27.0.0-cp38-cp38-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6e435540fa1da54667f0026cf1e8407fe6d8a11f1010b7f06b0b17214ebfcf5e"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:51f5726de3532b8222e569990c8aa34664faa97038304644679a51d906e60c6e"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:42c7555123679637c99205b1aa9e8f7d90fe29d4c243c719e347d4852545216c"}, - {file = "pyzmq-27.0.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:a979b7cf9e33d86c4949df527a3018767e5f53bc3b02adf14d4d8db1db63ccc0"}, - {file = "pyzmq-27.0.0-cp38-cp38-win32.whl", hash = "sha256:26b72c5ae20bf59061c3570db835edb81d1e0706ff141747055591c4b41193f8"}, - {file = "pyzmq-27.0.0-cp38-cp38-win_amd64.whl", hash = "sha256:55a0155b148fe0428285a30922f7213539aa84329a5ad828bca4bbbc665c70a4"}, - {file = "pyzmq-27.0.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:100f6e5052ba42b2533011d34a018a5ace34f8cac67cb03cfa37c8bdae0ca617"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:bf6c6b061efd00404b9750e2cfbd9507492c8d4b3721ded76cb03786131be2ed"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ee05728c0b0b2484a9fc20466fa776fffb65d95f7317a3419985b8c908563861"}, - {file = "pyzmq-27.0.0-cp39-cp39-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7cdf07fe0a557b131366f80727ec8ccc4b70d89f1e3f920d94a594d598d754f0"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:90252fa2ff3a104219db1f5ced7032a7b5fc82d7c8d2fec2b9a3e6fd4e25576b"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:ea6d441c513bf18c578c73c323acf7b4184507fc244762193aa3a871333c9045"}, - {file = "pyzmq-27.0.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:ae2b34bcfaae20c064948a4113bf8709eee89fd08317eb293ae4ebd69b4d9740"}, - {file = "pyzmq-27.0.0-cp39-cp39-win32.whl", hash = "sha256:5b10bd6f008937705cf6e7bf8b6ece5ca055991e3eb130bca8023e20b86aa9a3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_amd64.whl", hash = "sha256:00387d12a8af4b24883895f7e6b9495dc20a66027b696536edac35cb988c38f3"}, - {file = "pyzmq-27.0.0-cp39-cp39-win_arm64.whl", hash = "sha256:4c19d39c04c29a6619adfeb19e3735c421b3bfee082f320662f52e59c47202ba"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:656c1866505a5735d0660b7da6d7147174bbf59d4975fc2b7f09f43c9bc25745"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:74175b9e12779382432dd1d1f5960ebe7465d36649b98a06c6b26be24d173fab"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8c6de908465697a8708e4d6843a1e884f567962fc61eb1706856545141d0cbb"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c644aaacc01d0df5c7072826df45e67301f191c55f68d7b2916d83a9ddc1b551"}, - {file = "pyzmq-27.0.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:10f70c1d9a446a85013a36871a296007f6fe4232b530aa254baf9da3f8328bc0"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd1dc59763effd1576f8368047c9c31468fce0af89d76b5067641137506792ae"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:60e8cc82d968174650c1860d7b716366caab9973787a1c060cf8043130f7d0f7"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:14fe7aaac86e4e93ea779a821967360c781d7ac5115b3f1a171ced77065a0174"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6ad0562d4e6abb785be3e4dd68599c41be821b521da38c402bc9ab2a8e7ebc7e"}, - {file = "pyzmq-27.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:9df43a2459cd3a3563404c1456b2c4c69564daa7dbaf15724c09821a3329ce46"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:8c86ea8fe85e2eb0ffa00b53192c401477d5252f6dd1db2e2ed21c1c30d17e5e"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:c45fee3968834cd291a13da5fac128b696c9592a9493a0f7ce0b47fa03cc574d"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cae73bb6898c4e045fbed5024cb587e4110fddb66f6163bcab5f81f9d4b9c496"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:26d542258c7a1f35a9cff3d887687d3235006134b0ac1c62a6fe1ad3ac10440e"}, - {file = "pyzmq-27.0.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:04cd50ef3b28e35ced65740fb9956a5b3f77a6ff32fcd887e3210433f437dd0f"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:39ddd3ba0a641f01d8f13a3cfd4c4924eb58e660d8afe87e9061d6e8ca6f7ac3"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:8ca7e6a0388dd9e1180b14728051068f4efe83e0d2de058b5ff92c63f399a73f"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2524c40891be6a3106885a3935d58452dd83eb7a5742a33cc780a1ad4c49dec0"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6a56e3e5bd2d62a01744fd2f1ce21d760c7c65f030e9522738d75932a14ab62a"}, - {file = "pyzmq-27.0.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:096af9e133fec3a72108ddefba1e42985cb3639e9de52cfd336b6fc23aa083e9"}, - {file = "pyzmq-27.0.0.tar.gz", hash = "sha256:b1f08eeb9ce1510e6939b6e5dcd46a17765e2333daae78ecf4606808442e52cf"}, + {file = "pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b"}, + {file = "pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1"}, + {file = "pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386"}, + {file = "pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f"}, + {file = "pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32"}, + {file = "pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f"}, + {file = "pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2"}, + {file = "pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394"}, + {file = "pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97"}, + {file = "pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07"}, + {file = "pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233"}, + {file = "pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856"}, + {file = "pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496"}, + {file = "pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf"}, + {file = "pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5"}, + {file = "pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6"}, + {file = "pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9"}, + {file = "pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97"}, + {file = "pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2"}, + {file = "pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e"}, + {file = "pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96"}, + {file = "pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd"}, + {file = "pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0"}, + {file = "pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7"}, + {file = "pyzmq-27.1.0-cp38-cp38-macosx_10_15_universal2.whl", hash = "sha256:18339186c0ed0ce5835f2656cdfb32203125917711af64da64dbaa3d949e5a1b"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:753d56fba8f70962cd8295fb3edb40b9b16deaa882dd2b5a3a2039f9ff7625aa"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b721c05d932e5ad9ff9344f708c96b9e1a485418c6618d765fca95d4daacfbef"}, + {file = "pyzmq-27.1.0-cp38-cp38-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be883ff3d722e6085ee3f4afc057a50f7f2e0c72d289fd54df5706b4e3d3a50"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:b2e592db3a93128daf567de9650a2f3859017b3f7a66bc4ed6e4779d6034976f"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:ad68808a61cbfbbae7ba26d6233f2a4aa3b221de379ce9ee468aa7a83b9c36b0"}, + {file = "pyzmq-27.1.0-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:e2687c2d230e8d8584fbea433c24382edfeda0c60627aca3446aa5e58d5d1831"}, + {file = "pyzmq-27.1.0-cp38-cp38-win32.whl", hash = "sha256:a1aa0ee920fb3825d6c825ae3f6c508403b905b698b6460408ebd5bb04bbb312"}, + {file = "pyzmq-27.1.0-cp38-cp38-win_amd64.whl", hash = "sha256:df7cd397ece96cf20a76fae705d40efbab217d217897a5053267cd88a700c266"}, + {file = "pyzmq-27.1.0-cp39-cp39-macosx_10_15_universal2.whl", hash = "sha256:96c71c32fff75957db6ae33cd961439f386505c6e6b377370af9b24a1ef9eafb"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:49d3980544447f6bd2968b6ac913ab963a49dcaa2d4a2990041f16057b04c429"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:849ca054d81aa1c175c49484afaaa5db0622092b5eccb2055f9f3bb8f703782d"}, + {file = "pyzmq-27.1.0-cp39-cp39-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3970778e74cb7f85934d2b926b9900e92bfe597e62267d7499acc39c9c28e345"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:da96ecdcf7d3919c3be2de91a8c513c186f6762aa6cf7c01087ed74fad7f0968"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:9541c444cfe1b1c0156c5c86ece2bb926c7079a18e7b47b0b1b3b1b875e5d098"}, + {file = "pyzmq-27.1.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e30a74a39b93e2e1591b58eb1acef4902be27c957a8720b0e368f579b82dc22f"}, + {file = "pyzmq-27.1.0-cp39-cp39-win32.whl", hash = "sha256:b1267823d72d1e40701dcba7edc45fd17f71be1285557b7fe668887150a14b78"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_amd64.whl", hash = "sha256:0c996ded912812a2fcd7ab6574f4ad3edc27cb6510349431e4930d4196ade7db"}, + {file = "pyzmq-27.1.0-cp39-cp39-win_arm64.whl", hash = "sha256:346e9ba4198177a07e7706050f35d733e08c1c1f8ceacd5eb6389d653579ffbc"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74"}, + {file = "pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271"}, + {file = "pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-macosx_10_15_x86_64.whl", hash = "sha256:50081a4e98472ba9f5a02850014b4c9b629da6710f8f14f3b15897c666a28f1b"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:510869f9df36ab97f89f4cff9d002a89ac554c7ac9cadd87d444aa4cf66abd27"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f8426a01b1c4098a750973c37131cf585f61c7911d735f729935a0c701b68d3"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:726b6a502f2e34c6d2ada5e702929586d3ac948a4dbbb7fed9854ec8c0466027"}, + {file = "pyzmq-27.1.0-pp38-pypy38_pp73-win_amd64.whl", hash = "sha256:bd67e7c8f4654bef471c0b1ca6614af0b5202a790723a58b79d9584dc8022a78"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:722ea791aa233ac0a819fc2c475e1292c76930b31f1d828cb61073e2fe5e208f"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:01f9437501886d3a1dd4b02ef59fb8cc384fa718ce066d52f175ee49dd5b7ed8"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4a19387a3dddcc762bfd2f570d14e2395b2c9701329b266f83dd87a2b3cbd381"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c618fbcd069e3a29dcd221739cacde52edcc681f041907867e0f5cc7e85f172"}, + {file = "pyzmq-27.1.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:ff8d114d14ac671d88c89b9224c63d6c4e5a613fe8acd5594ce53d752a3aafe9"}, + {file = "pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540"}, ] [package.dependencies] @@ -3121,14 +3896,14 @@ cffi = {version = "*", markers = "implementation_name == \"pypy\""} [[package]] name = "referencing" -version = "0.36.2" +version = "0.37.0" description = "JSON Referencing + Python" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "referencing-0.36.2-py3-none-any.whl", hash = "sha256:e8699adbbf8b5c7de96d8ffa0eb5c158b3beafce084968e2ea8bb08c6794dcd0"}, - {file = "referencing-0.36.2.tar.gz", hash = "sha256:df2e89862cd09deabbdba16944cc3f10feb6b3e6f18e902f7cc25609a34775aa"}, + {file = "referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231"}, + {file = "referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8"}, ] [package.dependencies] @@ -3138,14 +3913,14 @@ typing-extensions = {version = ">=4.4.0", markers = "python_version < \"3.13\""} [[package]] name = "requests" -version = "2.32.4" +version = "2.32.5" description = "Python HTTP for Humans." optional = false -python-versions = ">=3.8" -groups = ["main", "demo"] +python-versions = ">=3.9" +groups = ["main", "demo", "docs"] files = [ - {file = "requests-2.32.4-py3-none-any.whl", hash = "sha256:27babd3cda2a6d50b30443204ee89830707d396671944c998b5975b031ac2b2c"}, - {file = "requests-2.32.4.tar.gz", hash = "sha256:27d0316682c8a29834d3264820024b62a36942083d52caf2f14c0591336d3422"}, + {file = "requests-2.32.5-py3-none-any.whl", hash = "sha256:2462f94637a34fd532264295e186976db0f5d453d1cdd31473c85a6a161affb6"}, + {file = "requests-2.32.5.tar.gz", hash = "sha256:dbba0bac56e100853db0ea71b82b4dfd5fe2bf6d3754a8893c3af500cec7d7cf"}, ] [package.dependencies] @@ -3205,61 +3980,77 @@ testing = ["pytest (>=8.3.5)"] [[package]] name = "ripser" -version = "0.6.12" +version = "0.6.14" description = "A Lean Persistent Homology Library for Python" optional = false python-versions = "*" groups = ["main", "demo"] files = [ - {file = "ripser-0.6.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:200db8d24344512c2f12d7e4eb93535d6ab3e997b58dd833a8609566a2ae3253"}, - {file = "ripser-0.6.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:179b2845e6ea49f87aea15f0e4a7c2c0c5aeb6eda52fb8fe899926743fbed614"}, - {file = "ripser-0.6.12-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84957835fd3331ce0dcd2fc72b132fe7fa7bf5c172956abe402c84d6ec6587f9"}, - {file = "ripser-0.6.12-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4cb47dd1af424387e3094d14e497f46b2c687fa9743656be28c46f103ff85a9e"}, - {file = "ripser-0.6.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:9b500c9689abe655c10bdc04b127f3c5ae1ea11db25efafe802993a93811a84a"}, - {file = "ripser-0.6.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:07d1814cbfa9cfa84a3971e8db9378c7579de5ba7f9fde9f7a82a2c13b93cf3c"}, - {file = "ripser-0.6.12-cp310-cp310-win32.whl", hash = "sha256:6e4f13514ce315ca1f26177571f54a1893c512f802d8a1e774976f8e67b0c696"}, - {file = "ripser-0.6.12-cp310-cp310-win_amd64.whl", hash = "sha256:985f33f228cf8997e246fe4774188b1d0a5094b0259c3fdc24a81d0e01e07391"}, - {file = "ripser-0.6.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c70961cc71b0e12681762fc53f8e62d127c3d8a5153a896a34e01bec0a30eb62"}, - {file = "ripser-0.6.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2e2ad1a79246f12c762bb254eb9a46c66831eab5809a124a5482df5d52b9b8dd"}, - {file = "ripser-0.6.12-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:042accd74b21d5502802caf9810ee399c3e23e6350064c967554a16391238650"}, - {file = "ripser-0.6.12-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:eaa053a001527d8baa7f4cc56e7c374e33589a05bb363f15cf099c597d65f1ea"}, - {file = "ripser-0.6.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2f7e58947d9e5730c11d9d65db7b21a566efb656ad87e27094efd89ea442b1c6"}, - {file = "ripser-0.6.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:203af3cf03949be1a78f4c13bf5508a693789d549b5539696ef54e3c91c5b30c"}, - {file = "ripser-0.6.12-cp311-cp311-win32.whl", hash = "sha256:e932ca5acbfb6970e4cfc3f2352291854dee4d579d51686c2c3d67d588f70393"}, - {file = "ripser-0.6.12-cp311-cp311-win_amd64.whl", hash = "sha256:4ae3c5d693a9b19e8c8002cde065743ddcd89d11232e2bc980c556652eb27441"}, - {file = "ripser-0.6.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6dc976925dcc7f21efb24f869586c9cff93df8beaa19c6bed8f347622c52417e"}, - {file = "ripser-0.6.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b86d0eb289d0c5c62bb26517f147ee90a080f68c2cedb0320d09861215028468"}, - {file = "ripser-0.6.12-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:6dd8ada70f81ae77452870ec81243f33ae54daa5aecd062ef8b8e1d80f69ee61"}, - {file = "ripser-0.6.12-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4860aea7a51f834391d75b89d7742272a898d93957991394b1fe7eef86886763"}, - {file = "ripser-0.6.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:bb763129462ba223f23c5ce43e2044c47eca1681e918f514eb693123967f55ed"}, - {file = "ripser-0.6.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:783da253766f7a1d55924111f1de2257cbf63690e62eac00913dc943fa9d571f"}, - {file = "ripser-0.6.12-cp312-cp312-win32.whl", hash = "sha256:db342b89a189d115fbcbac259460b0296c5612e34d3ebf2b5faf56c67181b7e9"}, - {file = "ripser-0.6.12-cp312-cp312-win_amd64.whl", hash = "sha256:b17e05a39ff9bfb31017caa39067a4540fc5a33d2a604d9aa313922ff42a4ff5"}, - {file = "ripser-0.6.12-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:7dc2dd31e4124de664bc43af221f2291599a4c2fedeb6b9ab013b6ce96b6f3c2"}, - {file = "ripser-0.6.12-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:298e57a64ce6b6701c4db7ea446d1df17c79be4669d19969577e1425fec7731b"}, - {file = "ripser-0.6.12-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:05f6f7f1c6ffc2d8d798122f05e410e9659e1e9729e15d4b0b7c029ad645e60f"}, - {file = "ripser-0.6.12-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:7554f9886817088ba229a53982e125c66fc121ce7a699c7b7752aea2b3d67d25"}, - {file = "ripser-0.6.12-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:b8735944df3027b7aee923412a95a37d7f11049d804c4ecb2478f7559c6f954f"}, - {file = "ripser-0.6.12-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:cd190350da36ff248ad9d3bf531744f1aa566245bb08a7b06610b77cb4a5128e"}, - {file = "ripser-0.6.12-cp313-cp313-win32.whl", hash = "sha256:066350d9c638da6f7a864b4cc1506773fc753d16688831b4b0868acfbb0d96f3"}, - {file = "ripser-0.6.12-cp313-cp313-win_amd64.whl", hash = "sha256:1a41bdb71780ebe2a943626e1bbabf17365a4d9fd038f1da570665000b326adf"}, - {file = "ripser-0.6.12-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:c73563e52dad6f3e7c03695e2c66c3569ef2aae9cffecaf1b3f65102feb947c7"}, - {file = "ripser-0.6.12-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:7edfe4308f2c7cc4f066640b4999eaa83f9af02a05f732e4971cc8e413d606d7"}, - {file = "ripser-0.6.12-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7679d31e91279ac3aaad129045b202b8878874410dab8d64e3c445ab97dff945"}, - {file = "ripser-0.6.12-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:70d0815eeb2c81fef896b6c3c6a93c0daf5d4e561de53d9edf7e142b2835d99c"}, - {file = "ripser-0.6.12-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:e8b52c8270afb4fc9875393cd8c36235d83cc1e2c2b04e06e23b06c46fe26ac0"}, - {file = "ripser-0.6.12-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:42874c02ea672aff2002df8001458e574af4ac7482cae41a16d0e8f70a158363"}, - {file = "ripser-0.6.12-cp38-cp38-win32.whl", hash = "sha256:be6e732c5c3b7a20e37eb2b8b66fb522dfb8c903678bdc9b9aa69bba0936c6ec"}, - {file = "ripser-0.6.12-cp38-cp38-win_amd64.whl", hash = "sha256:79503532fea5cc75fed9cb847660130582a3bd80e1cd1a358e14bfba2d4add04"}, - {file = "ripser-0.6.12-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6a50eea0496a04d2c4a84ded83e639f1571019215e6154d23de8cd70034c4add"}, - {file = "ripser-0.6.12-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e35157da79ab96e3de2357b2cac957239a47992768b8ce59c12c3033b351542e"}, - {file = "ripser-0.6.12-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:75debaa4d2d431738b92be62c2fde363b7e665911b5c0dd2870be0a3ca0f8e1b"}, - {file = "ripser-0.6.12-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:376db6549bf00bb0b4e72e052ad62f501bd09b3bf163b3bac4f04eb71798833f"}, - {file = "ripser-0.6.12-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:6963359caa4068f3e255af3a912bcd01924b9ae410ec32afd4bbcbab547de8ce"}, - {file = "ripser-0.6.12-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:58144a97e675fb52fabb7a827e0a3cc258de8e4730afec3e19ea781752ff2154"}, - {file = "ripser-0.6.12-cp39-cp39-win32.whl", hash = "sha256:034fcf9a980f094771f28ad4b1883d2d8d1fdc9413c1c4920b77a3a47efc0ad4"}, - {file = "ripser-0.6.12-cp39-cp39-win_amd64.whl", hash = "sha256:b918e0dc21c67d7f2413dc24c0f6377823358e7e670f281ffb2177f5c7f9ea05"}, - {file = "ripser-0.6.12.tar.gz", hash = "sha256:06a0c4ef15a95541b9b3d3d67a94e474a2876eee67235d2b2b5176b7f29e0411"}, + {file = "ripser-0.6.14-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e24323fa3ea90afde58d26ea3e0f0b78f8e4592416b07e011aaeabcd0665b2af"}, + {file = "ripser-0.6.14-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4c845d8293698789b76a2c9686f412ccfa59ef54e60f769ba7e417fe86bf9d61"}, + {file = "ripser-0.6.14-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1cba91ee032a87c050c257f46681459ce1a7a62daad73848be98384e71a00849"}, + {file = "ripser-0.6.14-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:452c1e6af9c3b3da5507433f976fb4af51fc9782347e6b9bb2959c00981446df"}, + {file = "ripser-0.6.14-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8e03ad22830a199dff9b6572cf1d162a55ada4ffe08f73767957c86b216963ec"}, + {file = "ripser-0.6.14-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:0f29714baa9ea31bf68649fb32f9a12091d46d77e557cff7d67a9690bcd26d15"}, + {file = "ripser-0.6.14-cp310-cp310-win32.whl", hash = "sha256:ff5ae9796e8a7d3329c92e48ab6d9a10eaccfcd1a2912428bf7328257aa0a627"}, + {file = "ripser-0.6.14-cp310-cp310-win_amd64.whl", hash = "sha256:b3a7c9a6a50c25b562dd36d1af3897fb37e5a3535f92773573c53ee54a22ddb2"}, + {file = "ripser-0.6.14-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:efe1a5c5b0d778ec2df8798cfa6c606c008b215fbd1fa8b624acd7d9764ea8e8"}, + {file = "ripser-0.6.14-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bbd0c7fcda80237b37305199e1ca7fdc9ad71c6ac585fc6dccb287d9ecfddbf"}, + {file = "ripser-0.6.14-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3005a38717bde96baadb21f8296311700b928fefd4c026d46dfaf56e17fd9c8b"}, + {file = "ripser-0.6.14-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:888c9df17006acefbb84718b10b75a32732c4fcc1dc536c5b5a3fc92a5e3e5de"}, + {file = "ripser-0.6.14-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e7d6aa94a1724a90b4099c74a299a0a168acaf7a8bd7591d488e0f9f4da98492"}, + {file = "ripser-0.6.14-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5497b1f372643d90c387b2ee436538ca3b05fbf8d0fbb4e80d8f98dee153c400"}, + {file = "ripser-0.6.14-cp311-cp311-win32.whl", hash = "sha256:6c53757a6c51c8fa4c0357bae26781c4ca24ef5164c0aab3bbe00309f7d5e79e"}, + {file = "ripser-0.6.14-cp311-cp311-win_amd64.whl", hash = "sha256:b4dfac06d7298c5d6669b16ca335e6223cbcbd33b2487a1da372e049a94fe93f"}, + {file = "ripser-0.6.14-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:62abfbf3a03dac0e9eda9015ed018eec48722d694c42af4d8e3b253dee7662b7"}, + {file = "ripser-0.6.14-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2740d387207b97d5662a10c826983437c1c8e5660e06df3a49821be3933cb50f"}, + {file = "ripser-0.6.14-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:38f96c5aa0e71ac02d6060c9bd86ed0b553f319a9f50d43cae4d268005a8564c"}, + {file = "ripser-0.6.14-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5c757a2c130f686ebd8ac5f02fc18326234a96ea26f3115ee231d77de631785c"}, + {file = "ripser-0.6.14-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:b6215698fb29bbde4393565cc75f60dad97fd1506f13b7620d2c6662c46fc85a"}, + {file = "ripser-0.6.14-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5dff01737061f4318ad4f7e8d2f4bdf17c6711f3ef75c3bc1c83546edcc913ad"}, + {file = "ripser-0.6.14-cp312-cp312-win32.whl", hash = "sha256:fd132d12e92b63a614fa20cad32d59b6576748f3384fa021b18f733d3c192a93"}, + {file = "ripser-0.6.14-cp312-cp312-win_amd64.whl", hash = "sha256:c5e02617921a5503420d23648134a9e4baa70636259748dd9779168804b4110e"}, + {file = "ripser-0.6.14-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:56c6dea6ca370991c14dfa4b3889ed12c8f921c74a9e220aa4fe57c2dc681f9e"}, + {file = "ripser-0.6.14-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:c1fdc8a20bb99ebb76923907ab0397c7050241a51febc96b4cb8be58ca59a2db"}, + {file = "ripser-0.6.14-cp313-cp313-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e8fd474f789bc1db04753c40efc385229f204363f30b2adad69f8c782276b3e9"}, + {file = "ripser-0.6.14-cp313-cp313-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d1f9392fa2481b74a99d422c363f68c598a30e41b24968a4f0a3f3f576ac4001"}, + {file = "ripser-0.6.14-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5512844d5b3fd1b1c2a255b148224d8741cc65d0586f374c22d26ccb4e3069e1"}, + {file = "ripser-0.6.14-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:c6ab18241c0ec4080f9330494abf8a4493a8f3edd88de6e05067e92e7e5c9793"}, + {file = "ripser-0.6.14-cp313-cp313-win32.whl", hash = "sha256:be27ff2ee5378ca1cc25d8d73c7c97341acd179dadf6a71da84401689455a723"}, + {file = "ripser-0.6.14-cp313-cp313-win_amd64.whl", hash = "sha256:d829c377fa0e7195a03cdc811b0f3e77591a70efd4820359070fe4a5153caadb"}, + {file = "ripser-0.6.14-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9cfb8c50bd6aaea8d0baf3a612d5cd3d68660c091f7e533cb1f012241b0c43ce"}, + {file = "ripser-0.6.14-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:6a757674fb8a10221e4728efade521a9e07f3b8dbca3b00ef7e1b2a9e4144334"}, + {file = "ripser-0.6.14-cp314-cp314-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eeb947c72d2ce530de60a8ac2f91cc77fdf47d97efafa0a2b2e5844963b14138"}, + {file = "ripser-0.6.14-cp314-cp314-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18dce133791a3967f2ca044142432b6698d05c0daf724c09bb7db42f111eef89"}, + {file = "ripser-0.6.14-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:d784449191636115d442e56192dd0112e607d1b41cf49089d9a1771bbfc574ae"}, + {file = "ripser-0.6.14-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:05a37e0b18f775c8873d67ed5dc3482c772b9cea111c0a65a9bdac4d17f87a08"}, + {file = "ripser-0.6.14-cp314-cp314-win32.whl", hash = "sha256:bccdc7b0115b4fcee9cd403795609d3860219994b41ec0b767cba8a13e85ea06"}, + {file = "ripser-0.6.14-cp314-cp314-win_amd64.whl", hash = "sha256:4c813e07c63436829c32a6fa80e3809676a27e36b4b94d1ebe1ee32e9af71f9e"}, + {file = "ripser-0.6.14-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:4b08896dcbdf75d028842585e69d2b8721490e99fe9b27c79e776532b69677d5"}, + {file = "ripser-0.6.14-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:efd92bc50d32c8a65b8eeb6e826637eca82b87dd26b27bd8c0f4bed5d84352d8"}, + {file = "ripser-0.6.14-cp314-cp314t-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:cdeee3f93adfc14ed3b7e9104d6084f83db725dca574aa98deea41f5b5aff0d2"}, + {file = "ripser-0.6.14-cp314-cp314t-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f12913d4a415e7e5e28ada39868d125c39fd432ab3f610fd9e8c426a4e2a0eba"}, + {file = "ripser-0.6.14-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df20462b3192c3844a3ce5fffdc9fc732eb4c8651d820b6f376195c2a5bfc220"}, + {file = "ripser-0.6.14-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:d51622f6961c93a0028f220cdb44517783186cfc55f63765291aa4959082f731"}, + {file = "ripser-0.6.14-cp314-cp314t-win32.whl", hash = "sha256:5fb9a2977408399fca916b1f18d2c882fd1b6b9b508db4d96be61deac280d259"}, + {file = "ripser-0.6.14-cp314-cp314t-win_amd64.whl", hash = "sha256:d5168a48f727bdcb99d92fb834321cc2957e8e74c448e7fe47064a625c2e703b"}, + {file = "ripser-0.6.14-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:3068f5de15532c21861a150f5523c52c4d4e97c275376a3279a1c384a0c45520"}, + {file = "ripser-0.6.14-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:e6807b931c6a89c7f4b617ee34fe723606e64b9b71510b36d18694f71c458a92"}, + {file = "ripser-0.6.14-cp38-cp38-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b3c0cf1690366eaa00e5abecd5b341ec2b4399342466bb465a2b5e4492b18de4"}, + {file = "ripser-0.6.14-cp38-cp38-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d3351cf0fce2fbacb6dd182dc51bc64dd58711b5da820bf79a5a1f693901646e"}, + {file = "ripser-0.6.14-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:ef578222bbf1c876446c0dc9ff0b51adce2b25374ba18b22879c26ffa0c76bf1"}, + {file = "ripser-0.6.14-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f8c34901ea31add06f1bc94892ad4d1a52b6296c78f649a8835efc13beb6eacf"}, + {file = "ripser-0.6.14-cp38-cp38-win32.whl", hash = "sha256:12b74376af249b114f9296a5695cb31fc6d3f4529ecb38b6ffd419208f9cc567"}, + {file = "ripser-0.6.14-cp38-cp38-win_amd64.whl", hash = "sha256:198ccc8c9864d90bd35e6ea5c43c2933d4c89209b295f41922c3d366bab874fd"}, + {file = "ripser-0.6.14-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:7aa1a4acf0d8165430f2d866e54d14947f79c6cba696ab3f874d1a466e0fe3d9"}, + {file = "ripser-0.6.14-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:ef9e89889163751dd0f88d714bc03759ba0f26da730f2651ca0492d3bbf62254"}, + {file = "ripser-0.6.14-cp39-cp39-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:911371861bda290f0ba9f3d8f07b33cffd5fa76a0e5ec08d647b79b04f3b4c25"}, + {file = "ripser-0.6.14-cp39-cp39-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:96af0132f9e25cd6bc5ee6fccf5e9d61a386ef5beb910db1b081ee32b8a49792"}, + {file = "ripser-0.6.14-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:236e898246b2baa7d6c504a7f68c8b690eac8f7d6b5e2157fd2589273fc1eb68"}, + {file = "ripser-0.6.14-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:4c884d4f98ae1e61886a4a05d3b2e6da00c7cc52415c678b122a8762285cd237"}, + {file = "ripser-0.6.14-cp39-cp39-win32.whl", hash = "sha256:14dae4e6f84e3789a4f7cecaec243e3f18791aa25152572cd8fb7ff1b4df5711"}, + {file = "ripser-0.6.14-cp39-cp39-win_amd64.whl", hash = "sha256:d7335a8c17f72d86d564e7d6f7f17e9111583e48363fad8dd0566c8d7f8726ad"}, + {file = "ripser-0.6.14.tar.gz", hash = "sha256:95dcc16e4577090f0ae8abd6b2665892aaed0fdfaacbdcfcc277e20e30860863"}, ] [package.dependencies] @@ -3270,198 +4061,175 @@ scikit-learn = "*" scipy = "*" [package.extras] -docs = ["sktda_docs_config", "sphinx (<8.2.0)"] -examples = ["jupyter", "pillow", "tadasets"] +docs = ["jupyter", "pillow", "sktda_docs_config", "sphinx (<8.2.0)"] +ruff = ["ruff (<0.12.0)"] testing = ["pytest", "pytest-cov"] [[package]] name = "rpds-py" -version = "0.26.0" +version = "0.30.0" description = "Python bindings to Rust's persistent data structures (rpds)" optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "rpds_py-0.26.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:4c70c70f9169692b36307a95f3d8c0a9fcd79f7b4a383aad5eaa0e9718b79b37"}, - {file = "rpds_py-0.26.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:777c62479d12395bfb932944e61e915741e364c843afc3196b694db3d669fcd0"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ec671691e72dff75817386aa02d81e708b5a7ec0dec6669ec05213ff6b77e1bd"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:6a1cb5d6ce81379401bbb7f6dbe3d56de537fb8235979843f0d53bc2e9815a79"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4f789e32fa1fb6a7bf890e0124e7b42d1e60d28ebff57fe806719abb75f0e9a3"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9c55b0a669976cf258afd718de3d9ad1b7d1fe0a91cd1ab36f38b03d4d4aeaaf"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c70d9ec912802ecfd6cd390dadb34a9578b04f9bcb8e863d0a7598ba5e9e7ccc"}, - {file = "rpds_py-0.26.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3021933c2cb7def39d927b9862292e0f4c75a13d7de70eb0ab06efed4c508c19"}, - {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8a7898b6ca3b7d6659e55cdac825a2e58c638cbf335cde41f4619e290dd0ad11"}, - {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:12bff2ad9447188377f1b2794772f91fe68bb4bbfa5a39d7941fbebdbf8c500f"}, - {file = "rpds_py-0.26.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:191aa858f7d4902e975d4cf2f2d9243816c91e9605070aeb09c0a800d187e323"}, - {file = "rpds_py-0.26.0-cp310-cp310-win32.whl", hash = "sha256:b37a04d9f52cb76b6b78f35109b513f6519efb481d8ca4c321f6a3b9580b3f45"}, - {file = "rpds_py-0.26.0-cp310-cp310-win_amd64.whl", hash = "sha256:38721d4c9edd3eb6670437d8d5e2070063f305bfa2d5aa4278c51cedcd508a84"}, - {file = "rpds_py-0.26.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:9e8cb77286025bdb21be2941d64ac6ca016130bfdcd228739e8ab137eb4406ed"}, - {file = "rpds_py-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:5e09330b21d98adc8ccb2dbb9fc6cb434e8908d4c119aeaa772cb1caab5440a0"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2c9c1b92b774b2e68d11193dc39620d62fd8ab33f0a3c77ecdabe19c179cdbc1"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:824e6d3503ab990d7090768e4dfd9e840837bae057f212ff9f4f05ec6d1975e7"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8ad7fd2258228bf288f2331f0a6148ad0186b2e3643055ed0db30990e59817a6"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dc23bbb3e06ec1ea72d515fb572c1fea59695aefbffb106501138762e1e915e"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d80bf832ac7b1920ee29a426cdca335f96a2b5caa839811803e999b41ba9030d"}, - {file = "rpds_py-0.26.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:0919f38f5542c0a87e7b4afcafab6fd2c15386632d249e9a087498571250abe3"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d422b945683e409000c888e384546dbab9009bb92f7c0b456e217988cf316107"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:77a7711fa562ba2da1aa757e11024ad6d93bad6ad7ede5afb9af144623e5f76a"}, - {file = "rpds_py-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:238e8c8610cb7c29460e37184f6799547f7e09e6a9bdbdab4e8edb90986a2318"}, - {file = "rpds_py-0.26.0-cp311-cp311-win32.whl", hash = "sha256:893b022bfbdf26d7bedb083efeea624e8550ca6eb98bf7fea30211ce95b9201a"}, - {file = "rpds_py-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:87a5531de9f71aceb8af041d72fc4cab4943648d91875ed56d2e629bef6d4c03"}, - {file = "rpds_py-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:de2713f48c1ad57f89ac25b3cb7daed2156d8e822cf0eca9b96a6f990718cc41"}, - {file = "rpds_py-0.26.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:894514d47e012e794f1350f076c427d2347ebf82f9b958d554d12819849a369d"}, - {file = "rpds_py-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc921b96fa95a097add244da36a1d9e4f3039160d1d30f1b35837bf108c21136"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3e1157659470aa42a75448b6e943c895be8c70531c43cb78b9ba990778955582"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:521ccf56f45bb3a791182dc6b88ae5f8fa079dd705ee42138c76deb1238e554e"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9def736773fd56b305c0eef698be5192c77bfa30d55a0e5885f80126c4831a15"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cdad4ea3b4513b475e027be79e5a0ceac8ee1c113a1a11e5edc3c30c29f964d8"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:82b165b07f416bdccf5c84546a484cc8f15137ca38325403864bfdf2b5b72f6a"}, - {file = "rpds_py-0.26.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:d04cab0a54b9dba4d278fe955a1390da3cf71f57feb78ddc7cb67cbe0bd30323"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:79061ba1a11b6a12743a2b0f72a46aa2758613d454aa6ba4f5a265cc48850158"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:f405c93675d8d4c5ac87364bb38d06c988e11028a64b52a47158a355079661f3"}, - {file = "rpds_py-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:dafd4c44b74aa4bed4b250f1aed165b8ef5de743bcca3b88fc9619b6087093d2"}, - {file = "rpds_py-0.26.0-cp312-cp312-win32.whl", hash = "sha256:3da5852aad63fa0c6f836f3359647870e21ea96cf433eb393ffa45263a170d44"}, - {file = "rpds_py-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:cf47cfdabc2194a669dcf7a8dbba62e37a04c5041d2125fae0233b720da6f05c"}, - {file = "rpds_py-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:20ab1ae4fa534f73647aad289003f1104092890849e0266271351922ed5574f8"}, - {file = "rpds_py-0.26.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:696764a5be111b036256c0b18cd29783fab22154690fc698062fc1b0084b511d"}, - {file = "rpds_py-0.26.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e6c15d2080a63aaed876e228efe4f814bc7889c63b1e112ad46fdc8b368b9e1"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:390e3170babf42462739a93321e657444f0862c6d722a291accc46f9d21ed04e"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7da84c2c74c0f5bc97d853d9e17bb83e2dcafcff0dc48286916001cc114379a1"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:4c5fe114a6dd480a510b6d3661d09d67d1622c4bf20660a474507aaee7eeeee9"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:3100b3090269f3a7ea727b06a6080d4eb7439dca4c0e91a07c5d133bb1727ea7"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2c03c9b0c64afd0320ae57de4c982801271c0c211aa2d37f3003ff5feb75bb04"}, - {file = "rpds_py-0.26.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:5963b72ccd199ade6ee493723d18a3f21ba7d5b957017607f815788cef50eaf1"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9da4e873860ad5bab3291438525cae80169daecbfafe5657f7f5fb4d6b3f96b9"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:5afaddaa8e8c7f1f7b4c5c725c0070b6eed0228f705b90a1732a48e84350f4e9"}, - {file = "rpds_py-0.26.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:4916dc96489616a6f9667e7526af8fa693c0fdb4f3acb0e5d9f4400eb06a47ba"}, - {file = "rpds_py-0.26.0-cp313-cp313-win32.whl", hash = "sha256:2a343f91b17097c546b93f7999976fd6c9d5900617aa848c81d794e062ab302b"}, - {file = "rpds_py-0.26.0-cp313-cp313-win_amd64.whl", hash = "sha256:0a0b60701f2300c81b2ac88a5fb893ccfa408e1c4a555a77f908a2596eb875a5"}, - {file = "rpds_py-0.26.0-cp313-cp313-win_arm64.whl", hash = "sha256:257d011919f133a4746958257f2c75238e3ff54255acd5e3e11f3ff41fd14256"}, - {file = "rpds_py-0.26.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:529c8156d7506fba5740e05da8795688f87119cce330c244519cf706a4a3d618"}, - {file = "rpds_py-0.26.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:f53ec51f9d24e9638a40cabb95078ade8c99251945dad8d57bf4aabe86ecee35"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7ab504c4d654e4a29558eaa5bb8cea5fdc1703ea60a8099ffd9c758472cf913f"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:fd0641abca296bc1a00183fe44f7fced8807ed49d501f188faa642d0e4975b83"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69b312fecc1d017b5327afa81d4da1480f51c68810963a7336d92203dbb3d4f1"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:c741107203954f6fc34d3066d213d0a0c40f7bb5aafd698fb39888af277c70d8"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc3e55a7db08dc9a6ed5fb7103019d2c1a38a349ac41901f9f66d7f95750942f"}, - {file = "rpds_py-0.26.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9e851920caab2dbcae311fd28f4313c6953993893eb5c1bb367ec69d9a39e7ed"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:dfbf280da5f876d0b00c81f26bedce274e72a678c28845453885a9b3c22ae632"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:1cc81d14ddfa53d7f3906694d35d54d9d3f850ef8e4e99ee68bc0d1e5fed9a9c"}, - {file = "rpds_py-0.26.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:dca83c498b4650a91efcf7b88d669b170256bf8017a5db6f3e06c2bf031f57e0"}, - {file = "rpds_py-0.26.0-cp313-cp313t-win32.whl", hash = "sha256:4d11382bcaf12f80b51d790dee295c56a159633a8e81e6323b16e55d81ae37e9"}, - {file = "rpds_py-0.26.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ff110acded3c22c033e637dd8896e411c7d3a11289b2edf041f86663dbc791e9"}, - {file = "rpds_py-0.26.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:da619979df60a940cd434084355c514c25cf8eb4cf9a508510682f6c851a4f7a"}, - {file = "rpds_py-0.26.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ea89a2458a1a75f87caabefe789c87539ea4e43b40f18cff526052e35bbb4fdf"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:feac1045b3327a45944e7dcbeb57530339f6b17baff154df51ef8b0da34c8c12"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b818a592bd69bfe437ee8368603d4a2d928c34cffcdf77c2e761a759ffd17d20"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1a8b0dd8648709b62d9372fc00a57466f5fdeefed666afe3fea5a6c9539a0331"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:6d3498ad0df07d81112aa6ec6c95a7e7b1ae00929fb73e7ebee0f3faaeabad2f"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24a4146ccb15be237fdef10f331c568e1b0e505f8c8c9ed5d67759dac58ac246"}, - {file = "rpds_py-0.26.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a9a63785467b2d73635957d32a4f6e73d5e4df497a16a6392fa066b753e87387"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:de4ed93a8c91debfd5a047be327b7cc8b0cc6afe32a716bbbc4aedca9e2a83af"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:caf51943715b12af827696ec395bfa68f090a4c1a1d2509eb4e2cb69abbbdb33"}, - {file = "rpds_py-0.26.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:4a59e5bc386de021f56337f757301b337d7ab58baa40174fb150accd480bc953"}, - {file = "rpds_py-0.26.0-cp314-cp314-win32.whl", hash = "sha256:92c8db839367ef16a662478f0a2fe13e15f2227da3c1430a782ad0f6ee009ec9"}, - {file = "rpds_py-0.26.0-cp314-cp314-win_amd64.whl", hash = "sha256:b0afb8cdd034150d4d9f53926226ed27ad15b7f465e93d7468caaf5eafae0d37"}, - {file = "rpds_py-0.26.0-cp314-cp314-win_arm64.whl", hash = "sha256:ca3f059f4ba485d90c8dc75cb5ca897e15325e4e609812ce57f896607c1c0867"}, - {file = "rpds_py-0.26.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:5afea17ab3a126006dc2f293b14ffc7ef3c85336cf451564a0515ed7648033da"}, - {file = "rpds_py-0.26.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:69f0c0a3df7fd3a7eec50a00396104bb9a843ea6d45fcc31c2d5243446ffd7a7"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:801a71f70f9813e82d2513c9a96532551fce1e278ec0c64610992c49c04c2dad"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:df52098cde6d5e02fa75c1f6244f07971773adb4a26625edd5c18fee906fa84d"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9bc596b30f86dc6f0929499c9e574601679d0341a0108c25b9b358a042f51bca"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9dfbe56b299cf5875b68eb6f0ebaadc9cac520a1989cac0db0765abfb3709c19"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ac64f4b2bdb4ea622175c9ab7cf09444e412e22c0e02e906978b3b488af5fde8"}, - {file = "rpds_py-0.26.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:181ef9b6bbf9845a264f9aa45c31836e9f3c1f13be565d0d010e964c661d1e2b"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:49028aa684c144ea502a8e847d23aed5e4c2ef7cadfa7d5eaafcb40864844b7a"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:e5d524d68a474a9688336045bbf76cb0def88549c1b2ad9dbfec1fb7cfbe9170"}, - {file = "rpds_py-0.26.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:c1851f429b822831bd2edcbe0cfd12ee9ea77868f8d3daf267b189371671c80e"}, - {file = "rpds_py-0.26.0-cp314-cp314t-win32.whl", hash = "sha256:7bdb17009696214c3b66bb3590c6d62e14ac5935e53e929bcdbc5a495987a84f"}, - {file = "rpds_py-0.26.0-cp314-cp314t-win_amd64.whl", hash = "sha256:f14440b9573a6f76b4ee4770c13f0b5921f71dde3b6fcb8dabbefd13b7fe05d7"}, - {file = "rpds_py-0.26.0-cp39-cp39-macosx_10_12_x86_64.whl", hash = "sha256:7a48af25d9b3c15684059d0d1fc0bc30e8eee5ca521030e2bffddcab5be40226"}, - {file = "rpds_py-0.26.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:0c71c2f6bf36e61ee5c47b2b9b5d47e4d1baad6426bfed9eea3e858fc6ee8806"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:1d815d48b1804ed7867b539236b6dd62997850ca1c91cad187f2ddb1b7bbef19"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:84cfbd4d4d2cdeb2be61a057a258d26b22877266dd905809e94172dff01a42ae"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fbaa70553ca116c77717f513e08815aec458e6b69a028d4028d403b3bc84ff37"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39bfea47c375f379d8e87ab4bb9eb2c836e4f2069f0f65731d85e55d74666387"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1533b7eb683fb5f38c1d68a3c78f5fdd8f1412fa6b9bf03b40f450785a0ab915"}, - {file = "rpds_py-0.26.0-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c5ab0ee51f560d179b057555b4f601b7df909ed31312d301b99f8b9fc6028284"}, - {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:e5162afc9e0d1f9cae3b577d9c29ddbab3505ab39012cb794d94a005825bde21"}, - {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:43f10b007033f359bc3fa9cd5e6c1e76723f056ffa9a6b5c117cc35720a80292"}, - {file = "rpds_py-0.26.0-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:e3730a48e5622e598293eee0762b09cff34dd3f271530f47b0894891281f051d"}, - {file = "rpds_py-0.26.0-cp39-cp39-win32.whl", hash = "sha256:4b1f66eb81eab2e0ff5775a3a312e5e2e16bf758f7b06be82fb0d04078c7ac51"}, - {file = "rpds_py-0.26.0-cp39-cp39-win_amd64.whl", hash = "sha256:519067e29f67b5c90e64fb1a6b6e9d2ec0ba28705c51956637bac23a2f4ddae1"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_10_12_x86_64.whl", hash = "sha256:3c0909c5234543ada2515c05dc08595b08d621ba919629e94427e8e03539c958"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:c1fb0cda2abcc0ac62f64e2ea4b4e64c57dfd6b885e693095460c61bde7bb18e"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:84d142d2d6cf9b31c12aa4878d82ed3b2324226270b89b676ac62ccd7df52d08"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a547e21c5610b7e9093d870be50682a6a6cf180d6da0f42c47c306073bfdbbf6"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:35e9a70a0f335371275cdcd08bc5b8051ac494dd58bff3bbfb421038220dc871"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:0dfa6115c6def37905344d56fb54c03afc49104e2ca473d5dedec0f6606913b4"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:313cfcd6af1a55a286a3c9a25f64af6d0e46cf60bc5798f1db152d97a216ff6f"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f7bf2496fa563c046d05e4d232d7b7fd61346e2402052064b773e5c378bf6f73"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:aa81873e2c8c5aa616ab8e017a481a96742fdf9313c40f14338ca7dbf50cb55f"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_i686.whl", hash = "sha256:68ffcf982715f5b5b7686bdd349ff75d422e8f22551000c24b30eaa1b7f7ae84"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:6188de70e190847bb6db3dc3981cbadff87d27d6fe9b4f0e18726d55795cee9b"}, - {file = "rpds_py-0.26.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1c962145c7473723df9722ba4c058de12eb5ebedcb4e27e7d902920aa3831ee8"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:f61a9326f80ca59214d1cceb0a09bb2ece5b2563d4e0cd37bfd5515c28510674"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:183f857a53bcf4b1b42ef0f57ca553ab56bdd170e49d8091e96c51c3d69ca696"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:941c1cfdf4799d623cf3aa1d326a6b4fdb7a5799ee2687f3516738216d2262fb"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:72a8d9564a717ee291f554eeb4bfeafe2309d5ec0aa6c475170bdab0f9ee8e88"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:511d15193cbe013619dd05414c35a7dedf2088fcee93c6bbb7c77859765bd4e8"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:aea1f9741b603a8d8fedb0ed5502c2bc0accbc51f43e2ad1337fe7259c2b77a5"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4019a9d473c708cf2f16415688ef0b4639e07abaa569d72f74745bbeffafa2c7"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:093d63b4b0f52d98ebae33b8c50900d3d67e0666094b1be7a12fffd7f65de74b"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2abe21d8ba64cded53a2a677e149ceb76dcf44284202d737178afe7ba540c1eb"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:4feb7511c29f8442cbbc28149a92093d32e815a28aa2c50d333826ad2a20fdf0"}, - {file = "rpds_py-0.26.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:e99685fc95d386da368013e7fb4269dd39c30d99f812a8372d62f244f662709c"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_10_12_x86_64.whl", hash = "sha256:a90a13408a7a856b87be8a9f008fff53c5080eea4e4180f6c2e546e4a972fb5d"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:3ac51b65e8dc76cf4949419c54c5528adb24fc721df722fd452e5fbc236f5c40"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:59b2093224a18c6508d95cfdeba8db9cbfd6f3494e94793b58972933fcee4c6d"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:4f01a5d6444a3258b00dc07b6ea4733e26f8072b788bef750baa37b370266137"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:b6e2c12160c72aeda9d1283e612f68804621f448145a210f1bf1d79151c47090"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:cb28c1f569f8d33b2b5dcd05d0e6ef7005d8639c54c2f0be824f05aedf715255"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1766b5724c3f779317d5321664a343c07773c8c5fd1532e4039e6cc7d1a815be"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:b6d9e5a2ed9c4988c8f9b28b3bc0e3e5b1aaa10c28d210a594ff3a8c02742daf"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:b5f7a446ddaf6ca0fad9a5535b56fbfc29998bf0e0b450d174bbec0d600e1d72"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_i686.whl", hash = "sha256:eed5ac260dd545fbc20da5f4f15e7efe36a55e0e7cf706e4ec005b491a9546a0"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:582462833ba7cee52e968b0341b85e392ae53d44c0f9af6a5927c80e539a8b67"}, - {file = "rpds_py-0.26.0-pp39-pypy39_pp73-win_amd64.whl", hash = "sha256:69a607203441e07e9a8a529cff1d5b73f6a160f22db1097211e6212a68567d11"}, - {file = "rpds_py-0.26.0.tar.gz", hash = "sha256:20dae58a859b0906f0685642e591056f1e787f3a8b39c8e8749a45dc7d26bdb0"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288"}, + {file = "rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221"}, + {file = "rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7"}, + {file = "rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139"}, + {file = "rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464"}, + {file = "rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425"}, + {file = "rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d"}, + {file = "rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed"}, + {file = "rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85"}, + {file = "rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825"}, + {file = "rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad"}, + {file = "rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6"}, + {file = "rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e"}, + {file = "rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394"}, + {file = "rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b"}, + {file = "rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:f83424d738204d9770830d35290ff3273fbb02b41f919870479fab14b9d303b2"}, + {file = "rpds_py-0.30.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e7536cd91353c5273434b4e003cbda89034d67e7710eab8761fd918ec6c69cf8"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:2771c6c15973347f50fece41fc447c054b7ac2ae0502388ce3b6738cd366e3d4"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:0a59119fc6e3f460315fe9d08149f8102aa322299deaa5cab5b40092345c2136"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:76fec018282b4ead0364022e3c54b60bf368b9d926877957a8624b58419169b7"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:692bef75a5525db97318e8cd061542b5a79812d711ea03dbc1f6f8dbb0c5f0d2"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9027da1ce107104c50c81383cae773ef5c24d296dd11c99e2629dbd7967a20c6"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_31_riscv64.whl", hash = "sha256:9cf69cdda1f5968a30a359aba2f7f9aa648a9ce4b580d6826437f2b291cfc86e"}, + {file = "rpds_py-0.30.0-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a4796a717bf12b9da9d3ad002519a86063dcac8988b030e405704ef7d74d2d9d"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:5d4c2aa7c50ad4728a094ebd5eb46c452e9cb7edbfdb18f9e1221f597a73e1e7"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:ba81a9203d07805435eb06f536d95a266c21e5b2dfbf6517748ca40c98d19e31"}, + {file = "rpds_py-0.30.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:945dccface01af02675628334f7cf49c2af4c1c904748efc5cf7bbdf0b579f95"}, + {file = "rpds_py-0.30.0-cp313-cp313-win32.whl", hash = "sha256:b40fb160a2db369a194cb27943582b38f79fc4887291417685f3ad693c5a1d5d"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_amd64.whl", hash = "sha256:806f36b1b605e2d6a72716f321f20036b9489d29c51c91f4dd29a3e3afb73b15"}, + {file = "rpds_py-0.30.0-cp313-cp313-win_arm64.whl", hash = "sha256:d96c2086587c7c30d44f31f42eae4eac89b60dabbac18c7669be3700f13c3ce1"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_10_12_x86_64.whl", hash = "sha256:eb0b93f2e5c2189ee831ee43f156ed34e2a89a78a66b98cadad955972548be5a"}, + {file = "rpds_py-0.30.0-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:922e10f31f303c7c920da8981051ff6d8c1a56207dbdf330d9047f6d30b70e5e"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:cdc62c8286ba9bf7f47befdcea13ea0e26bf294bda99758fd90535cbaf408000"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:47f9a91efc418b54fb8190a6b4aa7813a23fb79c51f4bb84e418f5476c38b8db"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:1f3587eb9b17f3789ad50824084fa6f81921bbf9a795826570bda82cb3ed91f2"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:39c02563fc592411c2c61d26b6c5fe1e51eaa44a75aa2c8735ca88b0d9599daa"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:51a1234d8febafdfd33a42d97da7a43f5dcb120c1060e352a3fbc0c6d36e2083"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_31_riscv64.whl", hash = "sha256:eb2c4071ab598733724c08221091e8d80e89064cd472819285a9ab0f24bcedb9"}, + {file = "rpds_py-0.30.0-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:6bdfdb946967d816e6adf9a3d8201bfad269c67efe6cefd7093ef959683c8de0"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c77afbd5f5250bf27bf516c7c4a016813eb2d3e116139aed0096940c5982da94"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:61046904275472a76c8c90c9ccee9013d70a6d0f73eecefd38c1ae7c39045a08"}, + {file = "rpds_py-0.30.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c5f36a861bc4b7da6516dbdf302c55313afa09b81931e8280361a4f6c9a2d27"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win32.whl", hash = "sha256:3d4a69de7a3e50ffc214ae16d79d8fbb0922972da0356dcf4d0fdca2878559c6"}, + {file = "rpds_py-0.30.0-cp313-cp313t-win_amd64.whl", hash = "sha256:f14fc5df50a716f7ece6a80b6c78bb35ea2ca47c499e422aa4463455dd96d56d"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:68f19c879420aa08f61203801423f6cd5ac5f0ac4ac82a2368a9fcd6a9a075e0"}, + {file = "rpds_py-0.30.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:ec7c4490c672c1a0389d319b3a9cfcd098dcdc4783991553c332a15acf7249be"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f251c812357a3fed308d684a5079ddfb9d933860fc6de89f2b7ab00da481e65f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:ac98b175585ecf4c0348fd7b29c3864bda53b805c773cbf7bfdaffc8070c976f"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:3e62880792319dbeb7eb866547f2e35973289e7d5696c6e295476448f5b63c87"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:4e7fc54e0900ab35d041b0601431b0a0eb495f0851a0639b6ef90f7741b39a18"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47e77dc9822d3ad616c3d5759ea5631a75e5809d5a28707744ef79d7a1bcfcad"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_31_riscv64.whl", hash = "sha256:b4dc1a6ff022ff85ecafef7979a2c6eb423430e05f1165d6688234e62ba99a07"}, + {file = "rpds_py-0.30.0-cp314-cp314-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4559c972db3a360808309e06a74628b95eaccbf961c335c8fe0d590cf587456f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:0ed177ed9bded28f8deb6ab40c183cd1192aa0de40c12f38be4d59cd33cb5c65"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:ad1fa8db769b76ea911cb4e10f049d80bf518c104f15b3edb2371cc65375c46f"}, + {file = "rpds_py-0.30.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:46e83c697b1f1c72b50e5ee5adb4353eef7406fb3f2043d64c33f20ad1c2fc53"}, + {file = "rpds_py-0.30.0-cp314-cp314-win32.whl", hash = "sha256:ee454b2a007d57363c2dfd5b6ca4a5d7e2c518938f8ed3b706e37e5d470801ed"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_amd64.whl", hash = "sha256:95f0802447ac2d10bcc69f6dc28fe95fdf17940367b21d34e34c737870758950"}, + {file = "rpds_py-0.30.0-cp314-cp314-win_arm64.whl", hash = "sha256:613aa4771c99f03346e54c3f038e4cc574ac09a3ddfb0e8878487335e96dead6"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_10_12_x86_64.whl", hash = "sha256:7e6ecfcb62edfd632e56983964e6884851786443739dbfe3582947e87274f7cb"}, + {file = "rpds_py-0.30.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:a1d0bc22a7cdc173fedebb73ef81e07faef93692b8c1ad3733b67e31e1b6e1b8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d08f00679177226c4cb8c5265012eea897c8ca3b93f429e546600c971bcbae7"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:5965af57d5848192c13534f90f9dd16464f3c37aaf166cc1da1cae1fd5a34898"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9a4e86e34e9ab6b667c27f3211ca48f73dba7cd3d90f8d5b11be56e5dbc3fb4e"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e5d3e6b26f2c785d65cc25ef1e5267ccbe1b069c5c21b8cc724efee290554419"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:626a7433c34566535b6e56a1b39a7b17ba961e97ce3b80ec62e6f1312c025551"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_31_riscv64.whl", hash = "sha256:acd7eb3f4471577b9b5a41baf02a978e8bdeb08b4b355273994f8b87032000a8"}, + {file = "rpds_py-0.30.0-cp314-cp314t-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:fe5fa731a1fa8a0a56b0977413f8cacac1768dad38d16b3a296712709476fbd5"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:74a3243a411126362712ee1524dfc90c650a503502f135d54d1b352bd01f2404"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:3e8eeb0544f2eb0d2581774be4c3410356eba189529a6b3e36bbbf9696175856"}, + {file = "rpds_py-0.30.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:dbd936cde57abfee19ab3213cf9c26be06d60750e60a8e4dd85d1ab12c8b1f40"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win32.whl", hash = "sha256:dc824125c72246d924f7f796b4f63c1e9dc810c7d9e2355864b3c3a73d59ade0"}, + {file = "rpds_py-0.30.0-cp314-cp314t-win_amd64.whl", hash = "sha256:27f4b0e92de5bfbc6f86e43959e6edd1425c33b5e69aab0984a72047f2bcf1e3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4"}, + {file = "rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e"}, + {file = "rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84"}, ] [[package]] name = "scikit-learn" -version = "1.7.1" +version = "1.7.2" description = "A set of python modules for machine learning and data mining" optional = false python-versions = ">=3.10" groups = ["main", "demo"] +markers = "python_version == \"3.10\"" files = [ - {file = "scikit_learn-1.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:406204dd4004f0517f0b23cf4b28c6245cbd51ab1b6b78153bc784def214946d"}, - {file = "scikit_learn-1.7.1-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:16af2e44164f05d04337fd1fc3ae7c4ea61fd9b0d527e22665346336920fe0e1"}, - {file = "scikit_learn-1.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2f2e78e56a40c7587dea9a28dc4a49500fa2ead366869418c66f0fd75b80885c"}, - {file = "scikit_learn-1.7.1-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b62b76ad408a821475b43b7bb90a9b1c9a4d8d125d505c2df0539f06d6e631b1"}, - {file = "scikit_learn-1.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:9963b065677a4ce295e8ccdee80a1dd62b37249e667095039adcd5bce6e90deb"}, - {file = "scikit_learn-1.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:90c8494ea23e24c0fb371afc474618c1019dc152ce4a10e4607e62196113851b"}, - {file = "scikit_learn-1.7.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:bb870c0daf3bf3be145ec51df8ac84720d9972170786601039f024bf6d61a518"}, - {file = "scikit_learn-1.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40daccd1b5623f39e8943ab39735cadf0bdce80e67cdca2adcb5426e987320a8"}, - {file = "scikit_learn-1.7.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:30d1f413cfc0aa5a99132a554f1d80517563c34a9d3e7c118fde2d273c6fe0f7"}, - {file = "scikit_learn-1.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:c711d652829a1805a95d7fe96654604a8f16eab5a9e9ad87b3e60173415cb650"}, - {file = "scikit_learn-1.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3cee419b49b5bbae8796ecd690f97aa412ef1674410c23fc3257c6b8b85b8087"}, - {file = "scikit_learn-1.7.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:2fd8b8d35817b0d9ebf0b576f7d5ffbbabdb55536b0655a8aaae629d7ffd2e1f"}, - {file = "scikit_learn-1.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:588410fa19a96a69763202f1d6b7b91d5d7a5d73be36e189bc6396bfb355bd87"}, - {file = "scikit_learn-1.7.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3142f0abe1ad1d1c31a2ae987621e41f6b578144a911ff4ac94781a583adad7"}, - {file = "scikit_learn-1.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:3ddd9092c1bd469acab337d87930067c87eac6bd544f8d5027430983f1e1ae88"}, - {file = "scikit_learn-1.7.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b7839687fa46d02e01035ad775982f2470be2668e13ddd151f0f55a5bf123bae"}, - {file = "scikit_learn-1.7.1-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:a10f276639195a96c86aa572ee0698ad64ee939a7b042060b98bd1930c261d10"}, - {file = "scikit_learn-1.7.1-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:13679981fdaebc10cc4c13c43344416a86fcbc61449cb3e6517e1df9d12c8309"}, - {file = "scikit_learn-1.7.1-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4f1262883c6a63f067a980a8cdd2d2e7f2513dddcef6a9eaada6416a7a7cbe43"}, - {file = "scikit_learn-1.7.1-cp313-cp313-win_amd64.whl", hash = "sha256:ca6d31fb10e04d50bfd2b50d66744729dbb512d4efd0223b864e2fdbfc4cee11"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:781674d096303cfe3d351ae6963ff7c958db61cde3421cd490e3a5a58f2a94ae"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:10679f7f125fe7ecd5fad37dd1aa2daae7e3ad8df7f3eefa08901b8254b3e12c"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1f812729e38c8cb37f760dce71a9b83ccfb04f59b3dca7c6079dcdc60544fa9e"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:88e1a20131cf741b84b89567e1717f27a2ced228e0f29103426102bc2e3b8ef7"}, - {file = "scikit_learn-1.7.1-cp313-cp313t-win_amd64.whl", hash = "sha256:b1bd1d919210b6a10b7554b717c9000b5485aa95a1d0f177ae0d7ee8ec750da5"}, - {file = "scikit_learn-1.7.1.tar.gz", hash = "sha256:24b3f1e976a4665aa74ee0fcaac2b8fccc6ae77c8e07ab25da3ba6d3292b9802"}, + {file = "scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f"}, + {file = "scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c"}, + {file = "scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8"}, + {file = "scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18"}, + {file = "scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5"}, + {file = "scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e"}, + {file = "scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1"}, + {file = "scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d"}, + {file = "scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1"}, + {file = "scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1"}, + {file = "scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96"}, + {file = "scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476"}, + {file = "scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b"}, + {file = "scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44"}, + {file = "scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290"}, + {file = "scikit_learn-1.7.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0b7dacaa05e5d76759fb071558a8b5130f4845166d88654a0f9bdf3eb57851b7"}, + {file = "scikit_learn-1.7.2-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:abebbd61ad9e1deed54cca45caea8ad5f79e1b93173dece40bb8e0c658dbe6fe"}, + {file = "scikit_learn-1.7.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:502c18e39849c0ea1a5d681af1dbcf15f6cce601aebb657aabbfe84133c1907f"}, + {file = "scikit_learn-1.7.2-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7a4c328a71785382fe3fe676a9ecf2c86189249beff90bf85e22bdb7efaf9ae0"}, + {file = "scikit_learn-1.7.2-cp313-cp313-win_amd64.whl", hash = "sha256:63a9afd6f7b229aad94618c01c252ce9e6fa97918c5ca19c9a17a087d819440c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:9acb6c5e867447b4e1390930e3944a005e2cb115922e693c08a323421a6966e8"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:2a41e2a0ef45063e654152ec9d8bcfc39f7afce35b08902bfe290c2498a67a6a"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:98335fb98509b73385b3ab2bd0639b1f610541d3988ee675c670371d6a87aa7c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:191e5550980d45449126e23ed1d5e9e24b2c68329ee1f691a3987476e115e09c"}, + {file = "scikit_learn-1.7.2-cp313-cp313t-win_amd64.whl", hash = "sha256:57dc4deb1d3762c75d685507fbd0bc17160144b2f2ba4ccea5dc285ab0d0e973"}, + {file = "scikit_learn-1.7.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fa8f63940e29c82d1e67a45d5297bdebbcb585f5a5a50c4914cc2e852ab77f33"}, + {file = "scikit_learn-1.7.2-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:f95dc55b7902b91331fa4e5845dd5bde0580c9cd9612b1b2791b7e80c3d32615"}, + {file = "scikit_learn-1.7.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9656e4a53e54578ad10a434dc1f993330568cfee176dff07112b8785fb413106"}, + {file = "scikit_learn-1.7.2-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96dc05a854add0e50d3f47a1ef21a10a595016da5b007c7d9cd9d0bffd1fcc61"}, + {file = "scikit_learn-1.7.2-cp314-cp314-win_amd64.whl", hash = "sha256:bb24510ed3f9f61476181e4db51ce801e2ba37541def12dc9333b946fc7a9cf8"}, + {file = "scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda"}, ] [package.dependencies] @@ -3479,6 +4247,69 @@ install = ["joblib (>=1.2.0)", "numpy (>=1.22.0)", "scipy (>=1.8.0)", "threadpoo maintenance = ["conda-lock (==3.0.1)"] tests = ["matplotlib (>=3.5.0)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.4.0)", "polars (>=0.20.30)", "pooch (>=1.6.0)", "pyamg (>=4.2.1)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)", "scikit-image (>=0.19.0)"] +[[package]] +name = "scikit-learn" +version = "1.8.0" +description = "A set of python modules for machine learning and data mining" +optional = false +python-versions = ">=3.11" +groups = ["main", "demo"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:146b4d36f800c013d267b29168813f7a03a43ecd2895d04861f1240b564421da"}, + {file = "scikit_learn-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f984ca4b14914e6b4094c5d52a32ea16b49832c03bd17a110f004db3c223e8e1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e30adb87f0cc81c7690a84f7932dd66be5bac57cfe16b91cb9151683a4a2d3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ada8121bcb4dac28d930febc791a69f7cb1673c8495e5eee274190b73a4559c1"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:c57b1b610bd1f40ba43970e11ce62821c2e6569e4d74023db19c6b26f246cb3b"}, + {file = "scikit_learn-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:2838551e011a64e3053ad7618dda9310175f7515f1742fa2d756f7c874c05961"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5fb63362b5a7ddab88e52b6dbb47dac3fd7dafeee740dc6c8d8a446ddedade8e"}, + {file = "scikit_learn-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5025ce924beccb28298246e589c691fe1b8c1c96507e6d27d12c5fadd85bfd76"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4496bb2cf7a43ce1a2d7524a79e40bc5da45cf598dbf9545b7e8316ccba47bb4"}, + {file = "scikit_learn-1.8.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0bcfe4d0d14aec44921545fd2af2338c7471de9cb701f1da4c9d85906ab847a"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:35c007dedb2ffe38fe3ee7d201ebac4a2deccd2408e8621d53067733e3c74809"}, + {file = "scikit_learn-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:8c497fff237d7b4e07e9ef1a640887fa4fb765647f86fbe00f969ff6280ce2bb"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:0d6ae97234d5d7079dc0040990a6f7aeb97cb7fa7e8945f1999a429b23569e0a"}, + {file = "scikit_learn-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:edec98c5e7c128328124a029bceb09eda2d526997780fef8d65e9a69eead963e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:74b66d8689d52ed04c271e1329f0c61635bcaf5b926db9b12d58914cdc01fe57"}, + {file = "scikit_learn-1.8.0-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8fdf95767f989b0cfedb85f7ed8ca215d4be728031f56ff5a519ee1e3276dc2e"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:2de443b9373b3b615aec1bb57f9baa6bb3a9bd093f1269ba95c17d870422b271"}, + {file = "scikit_learn-1.8.0-cp313-cp313-win_arm64.whl", hash = "sha256:eddde82a035681427cbedded4e6eff5e57fa59216c2e3e90b10b19ab1d0a65c3"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:7cc267b6108f0a1499a734167282c00c4ebf61328566b55ef262d48e9849c735"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:fe1c011a640a9f0791146011dfd3c7d9669785f9fed2b2a5f9e207536cf5c2fd"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:72358cce49465d140cc4e7792015bb1f0296a9742d5622c67e31399b75468b9e"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:80832434a6cc114f5219211eec13dcbc16c2bac0e31ef64c6d346cde3cf054cb"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_amd64.whl", hash = "sha256:ee787491dbfe082d9c3013f01f5991658b0f38aa8177e4cd4bf434c58f551702"}, + {file = "scikit_learn-1.8.0-cp313-cp313t-win_arm64.whl", hash = "sha256:bf97c10a3f5a7543f9b88cbf488d33d175e9146115a451ae34568597ba33dcde"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:c22a2da7a198c28dd1a6e1136f19c830beab7fdca5b3e5c8bba8394f8a5c45b3"}, + {file = "scikit_learn-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:6b595b07a03069a2b1740dc08c2299993850ea81cce4fe19b2421e0c970de6b7"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:29ffc74089f3d5e87dfca4c2c8450f88bdc61b0fc6ed5d267f3988f19a1309f6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fb65db5d7531bccf3a4f6bec3462223bea71384e2cda41da0f10b7c292b9e7c4"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:56079a99c20d230e873ea40753102102734c5953366972a71d5cb39a32bc40c6"}, + {file = "scikit_learn-1.8.0-cp314-cp314-win_arm64.whl", hash = "sha256:3bad7565bc9cf37ce19a7c0d107742b320c1285df7aab1a6e2d28780df167242"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:4511be56637e46c25721e83d1a9cea9614e7badc7040c4d573d75fbe257d6fd7"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:a69525355a641bf8ef136a7fa447672fb54fe8d60cab5538d9eb7c6438543fb9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c2656924ec73e5939c76ac4c8b026fc203b83d8900362eb2599d8aee80e4880f"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:15fc3b5d19cc2be65404786857f2e13c70c83dd4782676dd6814e3b89dc8f5b9"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_amd64.whl", hash = "sha256:00d6f1d66fbcf4eba6e356e1420d33cc06c70a45bb1363cd6f6a8e4ebbbdece2"}, + {file = "scikit_learn-1.8.0-cp314-cp314t-win_arm64.whl", hash = "sha256:f28dd15c6bb0b66ba09728cf09fd8736c304be29409bd8445a080c1280619e8c"}, + {file = "scikit_learn-1.8.0.tar.gz", hash = "sha256:9bccbb3b40e3de10351f8f5068e105d0f4083b1a65fa07b6634fbc401a6287fd"}, +] + +[package.dependencies] +joblib = ">=1.3.0" +numpy = ">=1.24.1" +scipy = ">=1.10.0" +threadpoolctl = ">=3.2.0" + +[package.extras] +benchmark = ["matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "pandas (>=1.5.0)"] +build = ["cython (>=3.1.2)", "meson-python (>=0.17.1)", "numpy (>=1.24.1)", "scipy (>=1.10.0)"] +docs = ["Pillow (>=10.1.0)", "matplotlib (>=3.6.1)", "memory_profiler (>=0.57.0)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pydata-sphinx-theme (>=0.15.3)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)", "sphinx (>=7.3.7)", "sphinx-copybutton (>=0.5.2)", "sphinx-design (>=0.6.0)", "sphinx-gallery (>=0.17.1)", "sphinx-prompt (>=1.4.0)", "sphinx-remove-toctrees (>=1.0.0.post1)", "sphinxcontrib-sass (>=0.3.4)", "sphinxext-opengraph (>=0.9.1)", "towncrier (>=24.8.0)"] +examples = ["matplotlib (>=3.6.1)", "pandas (>=1.5.0)", "plotly (>=5.18.0)", "pooch (>=1.8.0)", "scikit-image (>=0.22.0)", "seaborn (>=0.13.0)"] +install = ["joblib (>=1.3.0)", "numpy (>=1.24.1)", "scipy (>=1.10.0)", "threadpoolctl (>=3.2.0)"] +maintenance = ["conda-lock (==3.0.1)"] +tests = ["matplotlib (>=3.6.1)", "mypy (>=1.15)", "numpydoc (>=1.2.0)", "pandas (>=1.5.0)", "polars (>=0.20.30)", "pooch (>=1.8.0)", "pyamg (>=5.0.0)", "pyarrow (>=12.0.0)", "pytest (>=7.1.2)", "pytest-cov (>=2.9.0)", "ruff (>=0.11.7)"] + [[package]] name = "scipy" version = "1.15.3" @@ -3486,6 +4317,7 @@ description = "Fundamental algorithms for scientific computing in Python" optional = false python-versions = ">=3.10" groups = ["main", "demo"] +markers = "python_version == \"3.10\"" files = [ {file = "scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c"}, {file = "scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253"}, @@ -3543,35 +4375,115 @@ dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodest doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "matplotlib (>=3.5)", "myst-nb", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.0.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] test = ["Cython", "array-api-strict (>=2.0,<2.1.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] +[[package]] +name = "scipy" +version = "1.16.3" +description = "Fundamental algorithms for scientific computing in Python" +optional = false +python-versions = ">=3.11" +groups = ["main", "demo"] +markers = "python_version >= \"3.11\"" +files = [ + {file = "scipy-1.16.3-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:40be6cf99e68b6c4321e9f8782e7d5ff8265af28ef2cd56e9c9b2638fa08ad97"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:8be1ca9170fcb6223cc7c27f4305d680ded114a1567c0bd2bfcbf947d1b17511"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:bea0a62734d20d67608660f69dcda23e7f90fb4ca20974ab80b6ed40df87a005"}, + {file = "scipy-1.16.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:2a207a6ce9c24f1951241f4693ede2d393f59c07abc159b2cb2be980820e01fb"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:532fb5ad6a87e9e9cd9c959b106b73145a03f04c7d57ea3e6f6bb60b86ab0876"}, + {file = "scipy-1.16.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0151a0749efeaaab78711c78422d413c583b8cdd2011a3c1d6c794938ee9fdb2"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b7180967113560cca57418a7bc719e30366b47959dd845a93206fbed693c867e"}, + {file = "scipy-1.16.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:deb3841c925eeddb6afc1e4e4a45e418d19ec7b87c5df177695224078e8ec733"}, + {file = "scipy-1.16.3-cp311-cp311-win_amd64.whl", hash = "sha256:53c3844d527213631e886621df5695d35e4f6a75f620dca412bcd292f6b87d78"}, + {file = "scipy-1.16.3-cp311-cp311-win_arm64.whl", hash = "sha256:9452781bd879b14b6f055b26643703551320aa8d79ae064a71df55c00286a184"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:81fc5827606858cf71446a5e98715ba0e11f0dbc83d71c7409d05486592a45d6"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:c97176013d404c7346bf57874eaac5187d969293bf40497140b0a2b2b7482e07"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:2b71d93c8a9936046866acebc915e2af2e292b883ed6e2cbe5c34beb094b82d9"}, + {file = "scipy-1.16.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:3d4a07a8e785d80289dfe66b7c27d8634a773020742ec7187b85ccc4b0e7b686"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0553371015692a898e1aa858fed67a3576c34edefa6b7ebdb4e9dde49ce5c203"}, + {file = "scipy-1.16.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:72d1717fd3b5e6ec747327ce9bda32d5463f472c9dce9f54499e81fbd50245a1"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:1fb2472e72e24d1530debe6ae078db70fb1605350c88a3d14bc401d6306dbffe"}, + {file = "scipy-1.16.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c5192722cffe15f9329a3948c4b1db789fbb1f05c97899187dcf009b283aea70"}, + {file = "scipy-1.16.3-cp312-cp312-win_amd64.whl", hash = "sha256:56edc65510d1331dae01ef9b658d428e33ed48b4f77b1d51caf479a0253f96dc"}, + {file = "scipy-1.16.3-cp312-cp312-win_arm64.whl", hash = "sha256:a8a26c78ef223d3e30920ef759e25625a0ecdd0d60e5a8818b7513c3e5384cf2"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_10_14_x86_64.whl", hash = "sha256:d2ec56337675e61b312179a1ad124f5f570c00f920cc75e1000025451b88241c"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:16b8bc35a4cc24db80a0ec836a9286d0e31b2503cb2fd7ff7fb0e0374a97081d"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:5803c5fadd29de0cf27fa08ccbfe7a9e5d741bf63e4ab1085437266f12460ff9"}, + {file = "scipy-1.16.3-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:b81c27fc41954319a943d43b20e07c40bdcd3ff7cf013f4fb86286faefe546c4"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0c3b4dd3d9b08dbce0f3440032c52e9e2ab9f96ade2d3943313dfe51a7056959"}, + {file = "scipy-1.16.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7dc1360c06535ea6116a2220f760ae572db9f661aba2d88074fe30ec2aa1ff88"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:663b8d66a8748051c3ee9c96465fb417509315b99c71550fda2591d7dd634234"}, + {file = "scipy-1.16.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eab43fae33a0c39006a88096cd7b4f4ef545ea0447d250d5ac18202d40b6611d"}, + {file = "scipy-1.16.3-cp313-cp313-win_amd64.whl", hash = "sha256:062246acacbe9f8210de8e751b16fc37458213f124bef161a5a02c7a39284304"}, + {file = "scipy-1.16.3-cp313-cp313-win_arm64.whl", hash = "sha256:50a3dbf286dbc7d84f176f9a1574c705f277cb6565069f88f60db9eafdbe3ee2"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_10_14_x86_64.whl", hash = "sha256:fb4b29f4cf8cc5a8d628bc8d8e26d12d7278cd1f219f22698a378c3d67db5e4b"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_12_0_arm64.whl", hash = "sha256:8d09d72dc92742988b0e7750bddb8060b0c7079606c0d24a8cc8e9c9c11f9079"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:03192a35e661470197556de24e7cb1330d84b35b94ead65c46ad6f16f6b28f2a"}, + {file = "scipy-1.16.3-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:57d01cb6f85e34f0946b33caa66e892aae072b64b034183f3d87c4025802a119"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:96491a6a54e995f00a28a3c3badfff58fd093bf26cd5fb34a2188c8c756a3a2c"}, + {file = "scipy-1.16.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cd13e354df9938598af2be05822c323e97132d5e6306b83a3b4ee6724c6e522e"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:63d3cdacb8a824a295191a723ee5e4ea7768ca5ca5f2838532d9f2e2b3ce2135"}, + {file = "scipy-1.16.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:e7efa2681ea410b10dde31a52b18b0154d66f2485328830e45fdf183af5aefc6"}, + {file = "scipy-1.16.3-cp313-cp313t-win_amd64.whl", hash = "sha256:2d1ae2cf0c350e7705168ff2429962a89ad90c2d49d1dd300686d8b2a5af22fc"}, + {file = "scipy-1.16.3-cp313-cp313t-win_arm64.whl", hash = "sha256:0c623a54f7b79dd88ef56da19bc2873afec9673a48f3b85b18e4d402bdd29a5a"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_10_14_x86_64.whl", hash = "sha256:875555ce62743e1d54f06cdf22c1e0bc47b91130ac40fe5d783b6dfa114beeb6"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:bb61878c18a470021fb515a843dc7a76961a8daceaaaa8bad1332f1bf4b54657"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:f2622206f5559784fa5c4b53a950c3c7c1cf3e84ca1b9c4b6c03f062f289ca26"}, + {file = "scipy-1.16.3-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:7f68154688c515cdb541a31ef8eb66d8cd1050605be9dcd74199cbd22ac739bc"}, + {file = "scipy-1.16.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3c820ddb80029fe9f43d61b81d8b488d3ef8ca010d15122b152db77dc94c22"}, + {file = "scipy-1.16.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d3837938ae715fc0fe3c39c0202de3a8853aff22ca66781ddc2ade7554b7e2cc"}, + {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:aadd23f98f9cb069b3bd64ddc900c4d277778242e961751f77a8cb5c4b946fb0"}, + {file = "scipy-1.16.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b7c5f1bda1354d6a19bc6af73a649f8285ca63ac6b52e64e658a5a11d4d69800"}, + {file = "scipy-1.16.3-cp314-cp314-win_amd64.whl", hash = "sha256:e5d42a9472e7579e473879a1990327830493a7047506d58d73fc429b84c1d49d"}, + {file = "scipy-1.16.3-cp314-cp314-win_arm64.whl", hash = "sha256:6020470b9d00245926f2d5bb93b119ca0340f0d564eb6fbaad843eaebf9d690f"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_10_14_x86_64.whl", hash = "sha256:e1d27cbcb4602680a49d787d90664fa4974063ac9d4134813332a8c53dbe667c"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_12_0_arm64.whl", hash = "sha256:9b9c9c07b6d56a35777a1b4cc8966118fb16cfd8daf6743867d17d36cfad2d40"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:3a4c460301fb2cffb7f88528f30b3127742cff583603aa7dc964a52c463b385d"}, + {file = "scipy-1.16.3-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:f667a4542cc8917af1db06366d3f78a5c8e83badd56409f94d1eac8d8d9133fa"}, + {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f379b54b77a597aa7ee5e697df0d66903e41b9c85a6dd7946159e356319158e8"}, + {file = "scipy-1.16.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4aff59800a3b7f786b70bfd6ab551001cb553244988d7d6b8299cb1ea653b353"}, + {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:da7763f55885045036fabcebd80144b757d3db06ab0861415d1c3b7c69042146"}, + {file = "scipy-1.16.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ffa6eea95283b2b8079b821dc11f50a17d0571c92b43e2b5b12764dc5f9b285d"}, + {file = "scipy-1.16.3-cp314-cp314t-win_amd64.whl", hash = "sha256:d9f48cafc7ce94cf9b15c6bffdc443a81a27bf7075cf2dcd5c8b40f85d10c4e7"}, + {file = "scipy-1.16.3-cp314-cp314t-win_arm64.whl", hash = "sha256:21d9d6b197227a12dcbf9633320a4e34c6b0e51c57268df255a0942983bac562"}, + {file = "scipy-1.16.3.tar.gz", hash = "sha256:01e87659402762f43bd2fee13370553a17ada367d42e7487800bf2916535aecb"}, +] + +[package.dependencies] +numpy = ">=1.25.2,<2.6" + +[package.extras] +dev = ["cython-lint (>=0.12.2)", "doit (>=0.36.0)", "mypy (==1.10.0)", "pycodestyle", "pydevtool", "rich-click", "ruff (>=0.0.292)", "types-psutil", "typing_extensions"] +doc = ["intersphinx_registry", "jupyterlite-pyodide-kernel", "jupyterlite-sphinx (>=0.19.1)", "jupytext", "linkify-it-py", "matplotlib (>=3.5)", "myst-nb (>=1.2.0)", "numpydoc", "pooch", "pydata-sphinx-theme (>=0.15.2)", "sphinx (>=5.0.0,<8.2.0)", "sphinx-copybutton", "sphinx-design (>=0.4.0)"] +test = ["Cython", "array-api-strict (>=2.3.1)", "asv", "gmpy2", "hypothesis (>=6.30)", "meson", "mpmath", "ninja ; sys_platform != \"emscripten\"", "pooch", "pytest (>=8.0.0)", "pytest-cov", "pytest-timeout", "pytest-xdist", "scikit-umfpack", "threadpoolctl"] + [[package]] name = "scipy-stubs" -version = "1.16.0.2" +version = "1.17.0.0" description = "Type annotations for SciPy" optional = false python-versions = ">=3.11" groups = ["dev"] markers = "python_version >= \"3.11\"" files = [ - {file = "scipy_stubs-1.16.0.2-py3-none-any.whl", hash = "sha256:dc364d24a3accd1663e7576480bdb720533f94de8a05590354ff6d4a83d765c7"}, - {file = "scipy_stubs-1.16.0.2.tar.gz", hash = "sha256:f83aacaf2e899d044de6483e6112bf7a1942d683304077bc9e78cf6f21353acd"}, + {file = "scipy_stubs-1.17.0.0-py3-none-any.whl", hash = "sha256:17b336fa6c56afb0cf47e426e3cb36a7eb8b73351ee0a52d1e5cef7634b5e936"}, + {file = "scipy_stubs-1.17.0.0.tar.gz", hash = "sha256:01953f1c7967876be942afa21c1cc864c92714d01b1970ef8bdd468b4468d4b7"}, ] [package.dependencies] -optype = ">=0.10.0,<1" +optype = {version = ">=0.14.0,<0.16", extras = ["numpy"]} [package.extras] -scipy = ["scipy (>=1.16.0,<1.17)"] +scipy = ["scipy (>=1.17.0rc2,<1.18)"] [[package]] name = "scooby" -version = "0.10.1" +version = "0.11.0" description = "A Great Dane turned Python environment detective" optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "scooby-0.10.1-py3-none-any.whl", hash = "sha256:c099a0b4b013f949436bdd4e2a6e9b4f8aba8211e2a65dc1d2d3b9317ef8d4c1"}, - {file = "scooby-0.10.1.tar.gz", hash = "sha256:2ea147670cbf7cad42600c9990f2289f7b3c02c0769b0cc02a73e59d11c8f885"}, + {file = "scooby-0.11.0-py3-none-any.whl", hash = "sha256:a79663d1a7711eb104e4b2935988ea1ed5f7be6b7288fad23b4fba7462832f9d"}, + {file = "scooby-0.11.0.tar.gz", hash = "sha256:3dfacc6becf2d6558efa4b625bae3b844ced5d256f3143ebf774e005367e712a"}, ] [package.extras] @@ -3601,14 +4513,14 @@ stats = ["scipy (>=1.7)", "statsmodels (>=0.12)"] [[package]] name = "send2trash" -version = "1.8.3" +version = "2.0.0" description = "Send file to trash natively under Mac OS X, Windows and Linux" optional = false -python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,>=2.7" +python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,!=3.3.*,!=3.4.*,!=3.5.*,!=3.6.*,!=3.7.*" groups = ["main", "demo"] files = [ - {file = "Send2Trash-1.8.3-py3-none-any.whl", hash = "sha256:0c31227e0bd08961c7665474a3d1ef7193929fedda4233843689baa056be46c9"}, - {file = "Send2Trash-1.8.3.tar.gz", hash = "sha256:b18e7a3966d99871aefeb00cfbcfdced55ce4871194810fc71f4aa484b953abf"}, + {file = "send2trash-2.0.0-py3-none-any.whl", hash = "sha256:e70d5ce41dbb890882cc78bc25d137478330b39a391e756fadf82e34da4d85b8"}, + {file = "send2trash-2.0.0.tar.gz", hash = "sha256:1761421da3f9930bfe51ed7c45343948573383ad4c27e3acebc91be324e7770d"}, ] [package.extras] @@ -3643,34 +4555,22 @@ version = "1.17.0" description = "Python 2 and 3 compatibility utilities" optional = false python-versions = "!=3.0.*,!=3.1.*,!=3.2.*,>=2.7" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] files = [ {file = "six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274"}, {file = "six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81"}, ] -[[package]] -name = "sniffio" -version = "1.3.1" -description = "Sniff out which async library your code is running under" -optional = false -python-versions = ">=3.7" -groups = ["main", "demo"] -files = [ - {file = "sniffio-1.3.1-py3-none-any.whl", hash = "sha256:2f6da418d1f1e0fddd844478f41680e794e6051915791a034ff65e5f100525a2"}, - {file = "sniffio-1.3.1.tar.gz", hash = "sha256:f4324edc670a0f49750a81b895f35c3adb843cca46f0530f79fc1babb23789dc"}, -] - [[package]] name = "soupsieve" -version = "2.7" +version = "2.8.1" description = "A modern CSS selector implementation for Beautiful Soup." optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "soupsieve-2.7-py3-none-any.whl", hash = "sha256:6e60cc5c1ffaf1cebcc12e8188320b72071e922c2e897f737cadce79ad5d30c4"}, - {file = "soupsieve-2.7.tar.gz", hash = "sha256:ad282f9b6926286d2ead4750552c8a6142bc4c783fd66b0293547c8fe6ae126a"}, + {file = "soupsieve-2.8.1-py3-none-any.whl", hash = "sha256:a11fe2a6f3d76ab3cf2de04eb339c1be5b506a8a47f2ceb6d139803177f85434"}, + {file = "soupsieve-2.8.1.tar.gz", hash = "sha256:4cf733bc50fa805f5df4b8ef4740fc0e0fa6218cf3006269afd3f9d6d80fd350"}, ] [[package]] @@ -3760,67 +4660,77 @@ files = [ [[package]] name = "tomli" -version = "2.2.1" +version = "2.3.0" description = "A lil' TOML parser" optional = false python-versions = ">=3.8" groups = ["main", "demo", "dev"] markers = "python_version == \"3.10\"" files = [ - {file = "tomli-2.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:678e4fa69e4575eb77d103de3df8a895e1591b48e740211bd1067378c69e8249"}, - {file = "tomli-2.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:023aa114dd824ade0100497eb2318602af309e5a55595f76b626d6d9f3b7b0a6"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ece47d672db52ac607a3d9599a9d48dcb2f2f735c6c2d1f34130085bb12b112a"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6972ca9c9cc9f0acaa56a8ca1ff51e7af152a9f87fb64623e31d5c83700080ee"}, - {file = "tomli-2.2.1-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c954d2250168d28797dd4e3ac5cf812a406cd5a92674ee4c8f123c889786aa8e"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8dd28b3e155b80f4d54beb40a441d366adcfe740969820caf156c019fb5c7ec4"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:e59e304978767a54663af13c07b3d1af22ddee3bb2fb0618ca1593e4f593a106"}, - {file = "tomli-2.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:33580bccab0338d00994d7f16f4c4ec25b776af3ffaac1ed74e0b3fc95e885a8"}, - {file = "tomli-2.2.1-cp311-cp311-win32.whl", hash = "sha256:465af0e0875402f1d226519c9904f37254b3045fc5084697cefb9bdde1ff99ff"}, - {file = "tomli-2.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2d0f2fdd22b02c6d81637a3c95f8cd77f995846af7414c5c4b8d0545afa1bc4b"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4a8f6e44de52d5e6c657c9fe83b562f5f4256d8ebbfe4ff922c495620a7f6cea"}, - {file = "tomli-2.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8d57ca8095a641b8237d5b079147646153d22552f1c637fd3ba7f4b0b29167a8"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:4e340144ad7ae1533cb897d406382b4b6fede8890a03738ff1683af800d54192"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:db2b95f9de79181805df90bedc5a5ab4c165e6ec3fe99f970d0e302f384ad222"}, - {file = "tomli-2.2.1-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:40741994320b232529c802f8bc86da4e1aa9f413db394617b9a256ae0f9a7f77"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:400e720fe168c0f8521520190686ef8ef033fb19fc493da09779e592861b78c6"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:02abe224de6ae62c19f090f68da4e27b10af2b93213d36cf44e6e1c5abd19fdd"}, - {file = "tomli-2.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b82ebccc8c8a36f2094e969560a1b836758481f3dc360ce9a3277c65f374285e"}, - {file = "tomli-2.2.1-cp312-cp312-win32.whl", hash = "sha256:889f80ef92701b9dbb224e49ec87c645ce5df3fa2cc548664eb8a25e03127a98"}, - {file = "tomli-2.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:7fc04e92e1d624a4a63c76474610238576942d6b8950a2d7f908a340494e67e4"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:f4039b9cbc3048b2416cc57ab3bda989a6fcf9b36cf8937f01a6e731b64f80d7"}, - {file = "tomli-2.2.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:286f0ca2ffeeb5b9bd4fcc8d6c330534323ec51b2f52da063b11c502da16f30c"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a92ef1a44547e894e2a17d24e7557a5e85a9e1d0048b0b5e7541f76c5032cb13"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9316dc65bed1684c9a98ee68759ceaed29d229e985297003e494aa825ebb0281"}, - {file = "tomli-2.2.1-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:e85e99945e688e32d5a35c1ff38ed0b3f41f43fad8df0bdf79f72b2ba7bc5272"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:ac065718db92ca818f8d6141b5f66369833d4a80a9d74435a268c52bdfa73140"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:d920f33822747519673ee656a4b6ac33e382eca9d331c87770faa3eef562aeb2"}, - {file = "tomli-2.2.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:a198f10c4d1b1375d7687bc25294306e551bf1abfa4eace6650070a5c1ae2744"}, - {file = "tomli-2.2.1-cp313-cp313-win32.whl", hash = "sha256:d3f5614314d758649ab2ab3a62d4f2004c825922f9e370b29416484086b264ec"}, - {file = "tomli-2.2.1-cp313-cp313-win_amd64.whl", hash = "sha256:a38aa0308e754b0e3c67e344754dff64999ff9b513e691d0e786265c93583c69"}, - {file = "tomli-2.2.1-py3-none-any.whl", hash = "sha256:cb55c73c5f4408779d0cf3eef9f762b9c9f147a77de7b258bef0a5628adc85cc"}, - {file = "tomli-2.2.1.tar.gz", hash = "sha256:cd45e1dc79c835ce60f7404ec8119f2eb06d38b1deba146f07ced3bbc44505ff"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:88bd15eb972f3664f5ed4b57c1634a97153b4bac4479dcb6a495f41921eb7f45"}, + {file = "tomli-2.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:883b1c0d6398a6a9d29b508c331fa56adbcdff647f6ace4dfca0f50e90dfd0ba"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1381caf13ab9f300e30dd8feadb3de072aeb86f1d34a8569453ff32a7dea4bf"}, + {file = "tomli-2.3.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a0e285d2649b78c0d9027570d4da3425bdb49830a6156121360b3f8511ea3441"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0a154a9ae14bfcf5d8917a59b51ffd5a3ac1fd149b71b47a3a104ca4edcfa845"}, + {file = "tomli-2.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:74bf8464ff93e413514fefd2be591c3b0b23231a77f901db1eb30d6f712fc42c"}, + {file = "tomli-2.3.0-cp311-cp311-win32.whl", hash = "sha256:00b5f5d95bbfc7d12f91ad8c593a1659b6387b43f054104cda404be6bda62456"}, + {file = "tomli-2.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:4dc4ce8483a5d429ab602f111a93a6ab1ed425eae3122032db7e9acf449451be"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d7d86942e56ded512a594786a5ba0a5e521d02529b3826e7761a05138341a2ac"}, + {file = "tomli-2.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:73ee0b47d4dad1c5e996e3cd33b8a76a50167ae5f96a2607cbe8cc773506ab22"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:792262b94d5d0a466afb5bc63c7daa9d75520110971ee269152083270998316f"}, + {file = "tomli-2.3.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4f195fe57ecceac95a66a75ac24d9d5fbc98ef0962e09b2eddec5d39375aae52"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e31d432427dcbf4d86958c184b9bfd1e96b5b71f8eb17e6d02531f434fd335b8"}, + {file = "tomli-2.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7b0882799624980785240ab732537fcfc372601015c00f7fc367c55308c186f6"}, + {file = "tomli-2.3.0-cp312-cp312-win32.whl", hash = "sha256:ff72b71b5d10d22ecb084d345fc26f42b5143c5533db5e2eaba7d2d335358876"}, + {file = "tomli-2.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:1cb4ed918939151a03f33d4242ccd0aa5f11b3547d0cf30f7c74a408a5b99878"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:5192f562738228945d7b13d4930baffda67b69425a7f0da96d360b0a3888136b"}, + {file = "tomli-2.3.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:be71c93a63d738597996be9528f4abe628d1adf5e6eb11607bc8fe1a510b5dae"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c4665508bcbac83a31ff8ab08f424b665200c0e1e645d2bd9ab3d3e557b6185b"}, + {file = "tomli-2.3.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4021923f97266babc6ccab9f5068642a0095faa0a51a246a6a02fccbb3514eaf"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4ea38c40145a357d513bffad0ed869f13c1773716cf71ccaa83b0fa0cc4e42f"}, + {file = "tomli-2.3.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:ad805ea85eda330dbad64c7ea7a4556259665bdf9d2672f5dccc740eb9d3ca05"}, + {file = "tomli-2.3.0-cp313-cp313-win32.whl", hash = "sha256:97d5eec30149fd3294270e889b4234023f2c69747e555a27bd708828353ab606"}, + {file = "tomli-2.3.0-cp313-cp313-win_amd64.whl", hash = "sha256:0c95ca56fbe89e065c6ead5b593ee64b84a26fca063b5d71a1122bf26e533999"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:cebc6fe843e0733ee827a282aca4999b596241195f43b4cc371d64fc6639da9e"}, + {file = "tomli-2.3.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:4c2ef0244c75aba9355561272009d934953817c49f47d768070c3c94355c2aa3"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c22a8bf253bacc0cf11f35ad9808b6cb75ada2631c2d97c971122583b129afbc"}, + {file = "tomli-2.3.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0eea8cc5c5e9f89c9b90c4896a8deefc74f518db5927d0e0e8d4a80953d774d0"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b74a0e59ec5d15127acdabd75ea17726ac4c5178ae51b85bfe39c4f8a278e879"}, + {file = "tomli-2.3.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:b5870b50c9db823c595983571d1296a6ff3e1b88f734a4c8f6fc6188397de005"}, + {file = "tomli-2.3.0-cp314-cp314-win32.whl", hash = "sha256:feb0dacc61170ed7ab602d3d972a58f14ee3ee60494292d384649a3dc38ef463"}, + {file = "tomli-2.3.0-cp314-cp314-win_amd64.whl", hash = "sha256:b273fcbd7fc64dc3600c098e39136522650c49bca95df2d11cf3b626422392c8"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:940d56ee0410fa17ee1f12b817b37a4d4e4dc4d27340863cc67236c74f582e77"}, + {file = "tomli-2.3.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:f85209946d1fe94416debbb88d00eb92ce9cd5266775424ff81bc959e001acaf"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a56212bdcce682e56b0aaf79e869ba5d15a6163f88d5451cbde388d48b13f530"}, + {file = "tomli-2.3.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c5f3ffd1e098dfc032d4d3af5c0ac64f6d286d98bc148698356847b80fa4de1b"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:5e01decd096b1530d97d5d85cb4dff4af2d8347bd35686654a004f8dea20fc67"}, + {file = "tomli-2.3.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8a35dd0e643bb2610f156cca8db95d213a90015c11fee76c946aa62b7ae7e02f"}, + {file = "tomli-2.3.0-cp314-cp314t-win32.whl", hash = "sha256:a1f7f282fe248311650081faafa5f4732bdbfef5d45fe3f2e702fbc6f2d496e0"}, + {file = "tomli-2.3.0-cp314-cp314t-win_amd64.whl", hash = "sha256:70a251f8d4ba2d9ac2542eecf008b3c8a9fc5c3f9f02c56a9d7952612be2fdba"}, + {file = "tomli-2.3.0-py3-none-any.whl", hash = "sha256:e95b1af3c5b07d9e643909b5abbec77cd9f1217e6d0bca72b0234736b9fb1f1b"}, + {file = "tomli-2.3.0.tar.gz", hash = "sha256:64be704a875d2a59753d80ee8a533c3fe183e3f06807ff7dc2232938ccb01549"}, ] [[package]] name = "tornado" -version = "6.5.1" +version = "6.5.4" description = "Tornado is a Python web framework and asynchronous networking library, originally developed at FriendFeed." optional = false python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d50065ba7fd11d3bd41bcad0825227cc9a95154bad83239357094c36708001f7"}, - {file = "tornado-6.5.1-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9e9ca370f717997cb85606d074b0e5b247282cf5e2e1611568b8821afe0342d6"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b77e9dfa7ed69754a54c89d82ef746398be82f749df69c4d3abe75c4d1ff4888"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:253b76040ee3bab8bcf7ba9feb136436a3787208717a1fb9f2c16b744fba7331"}, - {file = "tornado-6.5.1-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:308473f4cc5a76227157cdf904de33ac268af770b2c5f05ca6c1161d82fdd95e"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:caec6314ce8a81cf69bd89909f4b633b9f523834dc1a352021775d45e51d9401"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:13ce6e3396c24e2808774741331638ee6c2f50b114b97a55c5b442df65fd9692"}, - {file = "tornado-6.5.1-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:5cae6145f4cdf5ab24744526cc0f55a17d76f02c98f4cff9daa08ae9a217448a"}, - {file = "tornado-6.5.1-cp39-abi3-win32.whl", hash = "sha256:e0a36e1bc684dca10b1aa75a31df8bdfed656831489bc1e6a6ebed05dc1ec365"}, - {file = "tornado-6.5.1-cp39-abi3-win_amd64.whl", hash = "sha256:908e7d64567cecd4c2b458075589a775063453aeb1d2a1853eedb806922f568b"}, - {file = "tornado-6.5.1-cp39-abi3-win_arm64.whl", hash = "sha256:02420a0eb7bf617257b9935e2b754d1b63897525d8a289c9d65690d580b4dcf7"}, - {file = "tornado-6.5.1.tar.gz", hash = "sha256:84ceece391e8eb9b2b95578db65e920d2a61070260594819589609ba9bc6308c"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:d6241c1a16b1c9e4cc28148b1cda97dd1c6cb4fb7068ac1bedc610768dff0ba9"}, + {file = "tornado-6.5.4-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:2d50f63dda1d2cac3ae1fa23d254e16b5e38153758470e9956cbc3d813d40843"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d1cf66105dc6acb5af613c054955b8137e34a03698aa53272dbda4afe252be17"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:50ff0a58b0dc97939d29da29cd624da010e7f804746621c78d14b80238669335"}, + {file = "tornado-6.5.4-cp39-abi3-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e5fb5e04efa54cf0baabdd10061eb4148e0be137166146fff835745f59ab9f7f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:9c86b1643b33a4cd415f8d0fe53045f913bf07b4a3ef646b735a6a86047dda84"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_i686.whl", hash = "sha256:6eb82872335a53dd063a4f10917b3efd28270b56a33db69009606a0312660a6f"}, + {file = "tornado-6.5.4-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6076d5dda368c9328ff41ab5d9dd3608e695e8225d1cd0fd1e006f05da3635a8"}, + {file = "tornado-6.5.4-cp39-abi3-win32.whl", hash = "sha256:1768110f2411d5cd281bac0a090f707223ce77fd110424361092859e089b38d1"}, + {file = "tornado-6.5.4-cp39-abi3-win_amd64.whl", hash = "sha256:fa07d31e0cd85c60713f2b995da613588aa03e1303d75705dca6af8babc18ddc"}, + {file = "tornado-6.5.4-cp39-abi3-win_arm64.whl", hash = "sha256:053e6e16701eb6cbe641f308f4c1a9541f91b6261991160391bfc342e8a551a1"}, + {file = "tornado-6.5.4.tar.gz", hash = "sha256:a22fa9047405d03260b483980635f0b041989d8bcc9a313f8fe18b411d84b1d7"}, ] [[package]] @@ -3861,40 +4771,28 @@ files = [ 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 = "types-python-dateutil" -version = "2.9.0.20250708" -description = "Typing stubs for python-dateutil" -optional = false -python-versions = ">=3.9" -groups = ["main", "demo"] -files = [ - {file = "types_python_dateutil-2.9.0.20250708-py3-none-any.whl", hash = "sha256:4d6d0cc1cc4d24a2dc3816024e502564094497b713f7befda4d5bc7a8e3fd21f"}, - {file = "types_python_dateutil-2.9.0.20250708.tar.gz", hash = "sha256:ccdbd75dab2d6c9696c350579f34cffe2c281e4c5f27a585b2a2438dd1d5c8ab"}, -] - [[package]] name = "typing-extensions" -version = "4.14.1" +version = "4.15.0" description = "Backported and Experimental Type Hints for Python 3.9+" optional = false python-versions = ">=3.9" groups = ["main", "demo", "dev"] files = [ - {file = "typing_extensions-4.14.1-py3-none-any.whl", hash = "sha256:d1e1e3b58374dc93031d6eda2420a48ea44a36c2b4766a4fdeb3710755731d76"}, - {file = "typing_extensions-4.14.1.tar.gz", hash = "sha256:38b39f4aeeab64884ce9f74c94263ef78f3c22467c8724005483154c26648d36"}, + {file = "typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548"}, + {file = "typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466"}, ] [[package]] name = "tzdata" -version = "2025.2" +version = "2025.3" description = "Provider of IANA time zone data" optional = false python-versions = ">=2" groups = ["main", "demo"] files = [ - {file = "tzdata-2025.2-py2.py3-none-any.whl", hash = "sha256:1a403fada01ff9221ca8044d701868fa132215d84beb92242d9acd2147f667a8"}, - {file = "tzdata-2025.2.tar.gz", hash = "sha256:b60a638fcc0daffadf82fe0f57e53d06bdec2f36c4df66280ae79bce6bd6f2b9"}, + {file = "tzdata-2025.3-py2.py3-none-any.whl", hash = "sha256:06a47e5700f3081aab02b2e513160914ff0694bce9947d6b76ebd6bf57cfc5d1"}, + {file = "tzdata-2025.3.tar.gz", hash = "sha256:de39c2ca5dc7b0344f2eba86f49d614019d29f060fc4ebc8a417896a620b56a7"}, ] [[package]] @@ -3914,53 +4812,59 @@ dev = ["flake8", "flake8-annotations", "flake8-bandit", "flake8-bugbear", "flake [[package]] name = "urllib3" -version = "2.5.0" +version = "2.6.2" description = "HTTP library with thread-safe connection pooling, file post, and more." optional = false python-versions = ">=3.9" -groups = ["main", "demo"] +groups = ["main", "demo", "docs"] files = [ - {file = "urllib3-2.5.0-py3-none-any.whl", hash = "sha256:e6b01673c0fa6a13e374b50871808eb3bf7046c4b125b216f6bf1cc604cff0dc"}, - {file = "urllib3-2.5.0.tar.gz", hash = "sha256:3fc47733c7e419d4bc3f6b3dc2b4f890bb743906a30d56ba4a5bfa4bbff92760"}, + {file = "urllib3-2.6.2-py3-none-any.whl", hash = "sha256:ec21cddfe7724fc7cb4ba4bea7aa8e2ef36f607a4bab81aa6ce42a13dc3f03dd"}, + {file = "urllib3-2.6.2.tar.gz", hash = "sha256:016f9c98bb7e98085cb2b4b17b87d2c702975664e4f060c6532e64d1c1a5e797"}, ] [package.extras] -brotli = ["brotli (>=1.0.9) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=0.8.0) ; platform_python_implementation != \"CPython\""] +brotli = ["brotli (>=1.2.0) ; platform_python_implementation == \"CPython\"", "brotlicffi (>=1.2.0.0) ; platform_python_implementation != \"CPython\""] h2 = ["h2 (>=4,<5)"] socks = ["pysocks (>=1.5.6,!=1.5.7,<2.0)"] -zstd = ["zstandard (>=0.18.0)"] +zstd = ["backports-zstd (>=1.0.0) ; python_version < \"3.14\""] [[package]] name = "vtk" -version = "9.4.2" +version = "9.5.2" description = "VTK is an open-source toolkit for 3D computer graphics, image processing, and visualization" optional = false python-versions = "*" groups = ["main", "demo"] files = [ - {file = "vtk-9.4.2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:97788af1881d115d90d118e6b6db4e673d4250473df074015edaf633e134945f"}, - {file = "vtk-9.4.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c5b2db2ffb52394cf3a72fb9d74ec980d944b9fecd626bdcd223ac896fa8b975"}, - {file = "vtk-9.4.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:20898263a57a2f414d6deaf9fecf0d81f6eb43d8f2002c66b20425d258e2a316"}, - {file = "vtk-9.4.2-cp310-cp310-win_amd64.whl", hash = "sha256:918830427783737c38f5e3f4ad81f229904c975665897d09748057fcfacab42b"}, - {file = "vtk-9.4.2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:267302d1def1f28c7a4bed1422bccb55f20db6a9b760d25883535bd56111143b"}, - {file = "vtk-9.4.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c378ec0a51fc690268c30484828e6ffe4b525be87bf21229c29a773f910787e1"}, - {file = "vtk-9.4.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4b9db93562c9d6b39dafd65f00eccc5eb9bcc6a7c715db789c064536551368f2"}, - {file = "vtk-9.4.2-cp311-cp311-win_amd64.whl", hash = "sha256:ee6013aef653aca14f881a2b4b33b13895166fad34eac340691852444848e971"}, - {file = "vtk-9.4.2-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:5482c147e36490a90fadf01333b8b06f2a88659a9cb012523603697e7de37dc7"}, - {file = "vtk-9.4.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ac03471cada196b9465305336649cd502ce4796ee5006eade2cdaf7f2b5b593b"}, - {file = "vtk-9.4.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ef81842d151312b52455b2b613871c57ca7323c2f901914e13fc750b74ce3fd2"}, - {file = "vtk-9.4.2-cp312-cp312-win_amd64.whl", hash = "sha256:fded22d5bc8cd2193ef27214efb63e1db5318f566fb64f2cf31332b820ece6ac"}, - {file = "vtk-9.4.2-cp313-cp313-macosx_10_10_x86_64.whl", hash = "sha256:ec8c4258ceb9b3eb9c8101e1db1cca16825f0c0daa891ae4d85cd2ae9ec7681c"}, - {file = "vtk-9.4.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:1e291fc1a0c6a8432185abd9265d44fc7822b39325dc8e81d01b798858b68733"}, - {file = "vtk-9.4.2-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c6d15129443eb950b8faf127b67935a680533aa08ad832b9137889543084ddd"}, - {file = "vtk-9.4.2-cp313-cp313-win_amd64.whl", hash = "sha256:5be5096e8c247c1ae151cc68121fbb0b6c5c76217e69d9600e4b8ba0c1c53c9f"}, - {file = "vtk-9.4.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:7211fd50ba6c75b0ccc9e66a489e484967590a4c1dc8df2f51cfab76b582bb15"}, - {file = "vtk-9.4.2-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:c09149df36c3023bfd9a58263491477838651a7ce1c5eddd8ebead84de935068"}, - {file = "vtk-9.4.2-cp38-cp38-win_amd64.whl", hash = "sha256:747b69bbc1cb7d50d461454da91d4d300b183ca6811dba9f4c8642aa2ada0a10"}, - {file = "vtk-9.4.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:8c52ae99ee97dcb973e0a6cf33c0ab849cdf66391be9b4f1ead40d12d33934c0"}, - {file = "vtk-9.4.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:c4a35f32011d5a2a6fc1263292533918fab3f6a3686d4718dce308f5b08555cc"}, - {file = "vtk-9.4.2-cp39-cp39-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:290017e775d35a79187b8ed84f56c787a5047802c5cddf3068dc2275f548e040"}, - {file = "vtk-9.4.2-cp39-cp39-win_amd64.whl", hash = "sha256:86d4ccd4a09c1a7a29919f892106fcb4190ceb9bdf64e391270860b25acc2a0e"}, + {file = "vtk-9.5.2-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:9ca87122352cf3c8748fee73c48930efa46fe1a868149a1f760bc17e8fae27ba"}, + {file = "vtk-9.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6da02d69dcf2d42472ec8c227e6a8406cedea53d3928af97f8d4e776ff89c95f"}, + {file = "vtk-9.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c0ba9cc4b5cd463a1984dfac6d0a9eeef888b273208739f8ebc46d392ddabb93"}, + {file = "vtk-9.5.2-cp310-cp310-manylinux_2_28_aarch64.whl", hash = "sha256:c9254f864ebef3d69666a1feedf09cad129e4c91f85ca804c38cf8addedb2748"}, + {file = "vtk-9.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:7c56dbd02e5b4ec0422886bf9e26059ad2d4622857dbfb90d9ed254104fd9d6c"}, + {file = "vtk-9.5.2-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:afcbc6dc122ebba877793940fda8fd2cbe14e1dae590e6872ea74894abdab9be"}, + {file = "vtk-9.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:005877a568b96cf00ceb5bec268cf102db756bed509cb240fa40ada414a24bf0"}, + {file = "vtk-9.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2e2fe2535483adb1ba8cc83a0dc296faaffa2505808a3b04f697084f656e5f84"}, + {file = "vtk-9.5.2-cp311-cp311-manylinux_2_28_aarch64.whl", hash = "sha256:0248aab2ee51a69fadcdcf74697a045e2d525009a35296100eed2211f0cca2bb"}, + {file = "vtk-9.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:f78674fd265022499ea6b7f03d7f11a861e89e1df043592a82e4f5235c537ef5"}, + {file = "vtk-9.5.2-cp312-cp312-macosx_10_10_x86_64.whl", hash = "sha256:cf5dbc93b6806b08799204430a4fc4bea74290c1c101fa64f1a4703144087fa3"}, + {file = "vtk-9.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:cce212b911d13fb0ca36d339f658c9db1ff27a5a730cdddd5d0c6b2ec24c15b1"}, + {file = "vtk-9.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:454711c51038824ddc75f955e1064c4e214b452c2e67083f01a8b43fc0ed62cb"}, + {file = "vtk-9.5.2-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:9fce9688f0dede00dc6f3b046037c5fa8378479fa8303a353fd69afae4078d9a"}, + {file = "vtk-9.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:5357bccdf8629373195cab871e45c50383d052d316192aa48f45bd9f87bafccb"}, + {file = "vtk-9.5.2-cp313-cp313-macosx_10_10_x86_64.whl", hash = "sha256:1eae5016620a5fd78f4918256ea65dbe100a7c3ce68f763b64523f06aaaeafbc"}, + {file = "vtk-9.5.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:29ad766e308dcaa23b36261180cd9960215f48815b31c7ac2aa52edc88e21ef7"}, + {file = "vtk-9.5.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:11cf870c05539e9f82f4a5adf450384e0be4ee6cc80274f9502715a4139e2777"}, + {file = "vtk-9.5.2-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:3c4b658d61815cb87177f4e94281396c9be5a28798464a2c6fa0897b1bba282f"}, + {file = "vtk-9.5.2-cp313-cp313-win_amd64.whl", hash = "sha256:974783b8865e2ddc2818d3090705b6bc6bf8ae40346d67f9a43485fabcfb3a99"}, + {file = "vtk-9.5.2-cp38-cp38-macosx_10_10_x86_64.whl", hash = "sha256:227c5e6e9195aa9d92a64d6d07d09f000576b5df231522b5c156a3c4c4190d69"}, + {file = "vtk-9.5.2-cp38-cp38-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b5d0a89e893d9279ba9742d0bbd47d7dfac96fccd8fb9d024bb8aa098fde5637"}, + {file = "vtk-9.5.2-cp38-cp38-manylinux_2_28_aarch64.whl", hash = "sha256:371d9068f5cb25861aa51c1d1792fffce5a44032dbece55412562429c5f257cc"}, + {file = "vtk-9.5.2-cp38-cp38-win_amd64.whl", hash = "sha256:7cf2e2e12184c018388f06fbffcb93ea9e478ca4bf636c3f66bd7503e2230298"}, + {file = "vtk-9.5.2-cp39-cp39-macosx_10_10_x86_64.whl", hash = "sha256:9b148e57837d1fd2a8a72f171a0fb40872837dea191f673f2b7ec397935c754e"}, + {file = "vtk-9.5.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:6a3b27f22d7e15f6a2d60510e70d75dac4ed2a53600e31275b67fedc45afbcc0"}, + {file = "vtk-9.5.2-cp39-cp39-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b6b91968581132b0d96142a08d50028efa5aa7a876d4aff6de1664e99e006c89"}, + {file = "vtk-9.5.2-cp39-cp39-manylinux_2_28_aarch64.whl", hash = "sha256:2b37670d56de32935eeadee58e1a9a0b5d3847294ca24ea9329101089be5de83"}, + {file = "vtk-9.5.2-cp39-cp39-win_amd64.whl", hash = "sha256:1ac9ff528892e585f8f3286b26a90250bd6ea9107c38e6e194939f6f28269ad6"}, ] [package.dependencies] @@ -3970,28 +4874,71 @@ matplotlib = ">=2.0.0" numpy = ["numpy (>=1.9)"] web = ["wslink (>=1.0.4)"] +[[package]] +name = "watchdog" +version = "6.0.0" +description = "Filesystem events monitoring" +optional = false +python-versions = ">=3.9" +groups = ["docs"] +files = [ + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d1cdb490583ebd691c012b3d6dae011000fe42edb7a82ece80965b42abd61f26"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:bc64ab3bdb6a04d69d4023b29422170b74681784ffb9463ed4870cf2f3e66112"}, + {file = "watchdog-6.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c897ac1b55c5a1461e16dae288d22bb2e412ba9807df8397a635d88f671d36c3"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:6eb11feb5a0d452ee41f824e271ca311a09e250441c262ca2fd7ebcf2461a06c"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ef810fbf7b781a5a593894e4f439773830bdecb885e6880d957d5b9382a960d2"}, + {file = "watchdog-6.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:afd0fe1b2270917c5e23c2a65ce50c2a4abb63daafb0d419fde368e272a76b7c"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860"}, + {file = "watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134"}, + {file = "watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:e6f0e77c9417e7cd62af82529b10563db3423625c5fce018430b249bf977f9e8"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:90c8e78f3b94014f7aaae121e6b909674df5b46ec24d6bebc45c44c56729af2a"}, + {file = "watchdog-6.0.0-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:e7631a77ffb1f7d2eefa4445ebbee491c720a5661ddf6df3498ebecae5ed375c"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c7ac31a19f4545dd92fc25d200694098f42c9a8e391bc00bdd362c5736dbf881"}, + {file = "watchdog-6.0.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:9513f27a1a582d9808cf21a07dae516f0fab1cf2d7683a742c498b93eedabb11"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_10_15_x86_64.whl", hash = "sha256:7a0e56874cfbc4b9b05c60c8a1926fedf56324bb08cfbc188969777940aef3aa"}, + {file = "watchdog-6.0.0-pp39-pypy39_pp73-macosx_11_0_arm64.whl", hash = "sha256:e6439e374fc012255b4ec786ae3c4bc838cd7309a540e5fe0952d03687d8804e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c"}, + {file = "watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2"}, + {file = "watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a"}, + {file = "watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680"}, + {file = "watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f"}, + {file = "watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282"}, +] + +[package.extras] +watchmedo = ["PyYAML (>=3.10)"] + [[package]] name = "wcwidth" -version = "0.2.13" +version = "0.2.14" description = "Measures the displayed width of unicode strings in a terminal" optional = false -python-versions = "*" +python-versions = ">=3.6" groups = ["main", "demo", "dev"] files = [ - {file = "wcwidth-0.2.13-py2.py3-none-any.whl", hash = "sha256:3da69048e4540d84af32131829ff948f1e022c1c6bdb8d6102117aac784f6859"}, - {file = "wcwidth-0.2.13.tar.gz", hash = "sha256:72ea0c06399eb286d978fdedb6923a9eb47e1c486ce63e9b4e64fc18303972b5"}, + {file = "wcwidth-0.2.14-py2.py3-none-any.whl", hash = "sha256:a7bb560c8aee30f9957e5f9895805edd20602f2d7f720186dfd906e82b4982e1"}, + {file = "wcwidth-0.2.14.tar.gz", hash = "sha256:4d478375d31bc5395a3c55c40ccdf3354688364cd61c4f6adacaa9215d0b3605"}, ] [[package]] name = "webcolors" -version = "24.11.1" +version = "25.10.0" description = "A library for working with the color formats defined by HTML and CSS." optional = false -python-versions = ">=3.9" +python-versions = ">=3.10" groups = ["main", "demo"] files = [ - {file = "webcolors-24.11.1-py3-none-any.whl", hash = "sha256:515291393b4cdf0eb19c155749a096f779f7d909f7cceea072791cb9095b92e9"}, - {file = "webcolors-24.11.1.tar.gz", hash = "sha256:ecb3d768f32202af770477b8b65f318fa4f566c22948673a977b00d589dd80f6"}, + {file = "webcolors-25.10.0-py3-none-any.whl", hash = "sha256:032c727334856fc0b968f63daa252a1ac93d33db2f5267756623c210e57a4f1d"}, + {file = "webcolors-25.10.0.tar.gz", hash = "sha256:62abae86504f66d0f6364c2a8520de4a0c47b80c03fc3a5f1815fedbef7c19bf"}, ] [[package]] @@ -4008,114 +4955,145 @@ files = [ [[package]] name = "websocket-client" -version = "1.8.0" +version = "1.9.0" description = "WebSocket client for Python with low level API options" optional = false -python-versions = ">=3.8" +python-versions = ">=3.9" groups = ["main", "demo"] files = [ - {file = "websocket_client-1.8.0-py3-none-any.whl", hash = "sha256:17b44cc997f5c498e809b22cdf2d9c7a9e71c02c8cc2b6c56e7c2d1239bfa526"}, - {file = "websocket_client-1.8.0.tar.gz", hash = "sha256:3239df9f44da632f96012472805d40a23281a991027ce11d2f45a6f24ac4c3da"}, + {file = "websocket_client-1.9.0-py3-none-any.whl", hash = "sha256:af248a825037ef591efbf6ed20cc5faa03d3b47b9e5a2230a529eeee1c1fc3ef"}, + {file = "websocket_client-1.9.0.tar.gz", hash = "sha256:9e813624b6eb619999a97dc7958469217c3176312b3a16a4bd1bc7e08a46ec98"}, ] [package.extras] -docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx-rtd-theme (>=1.1.0)"] +docs = ["Sphinx (>=6.0)", "myst-parser (>=2.0.0)", "sphinx_rtd_theme (>=1.1.0)"] optional = ["python-socks", "wsaccel"] -test = ["websockets"] +test = ["pytest", "websockets"] [[package]] name = "wrapt" -version = "1.17.2" +version = "2.0.1" description = "Module for decorators, wrappers and monkey patching." optional = false python-versions = ">=3.8" groups = ["main", "demo"] files = [ - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3d57c572081fed831ad2d26fd430d565b76aa277ed1d30ff4d40670b1c0dd984"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b5e251054542ae57ac7f3fba5d10bfff615b6c2fb09abeb37d2f1463f841ae22"}, - {file = "wrapt-1.17.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:80dd7db6a7cb57ffbc279c4394246414ec99537ae81ffd702443335a61dbf3a7"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0a6e821770cf99cc586d33833b2ff32faebdbe886bd6322395606cf55153246c"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:b60fb58b90c6d63779cb0c0c54eeb38941bae3ecf7a73c764c52c88c2dcb9d72"}, - {file = "wrapt-1.17.2-cp310-cp310-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b870b5df5b71d8c3359d21be8f0d6c485fa0ebdb6477dda51a1ea54a9b558061"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4011d137b9955791f9084749cba9a367c68d50ab8d11d64c50ba1688c9b457f2"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:1473400e5b2733e58b396a04eb7f35f541e1fb976d0c0724d0223dd607e0f74c"}, - {file = "wrapt-1.17.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:3cedbfa9c940fdad3e6e941db7138e26ce8aad38ab5fe9dcfadfed9db7a54e62"}, - {file = "wrapt-1.17.2-cp310-cp310-win32.whl", hash = "sha256:582530701bff1dec6779efa00c516496968edd851fba224fbd86e46cc6b73563"}, - {file = "wrapt-1.17.2-cp310-cp310-win_amd64.whl", hash = "sha256:58705da316756681ad3c9c73fd15499aa4d8c69f9fd38dc8a35e06c12468582f"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ff04ef6eec3eee8a5efef2401495967a916feaa353643defcc03fc74fe213b58"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:4db983e7bca53819efdbd64590ee96c9213894272c776966ca6306b73e4affda"}, - {file = "wrapt-1.17.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9abc77a4ce4c6f2a3168ff34b1da9b0f311a8f1cfd694ec96b0603dff1c79438"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0b929ac182f5ace000d459c59c2c9c33047e20e935f8e39371fa6e3b85d56f4a"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:f09b286faeff3c750a879d336fb6d8713206fc97af3adc14def0cdd349df6000"}, - {file = "wrapt-1.17.2-cp311-cp311-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:1a7ed2d9d039bd41e889f6fb9364554052ca21ce823580f6a07c4ec245c1f5d6"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:129a150f5c445165ff941fc02ee27df65940fcb8a22a61828b1853c98763a64b"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1fb5699e4464afe5c7e65fa51d4f99e0b2eadcc176e4aa33600a3df7801d6662"}, - {file = "wrapt-1.17.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9a2bce789a5ea90e51a02dfcc39e31b7f1e662bc3317979aa7e5538e3a034f72"}, - {file = "wrapt-1.17.2-cp311-cp311-win32.whl", hash = "sha256:4afd5814270fdf6380616b321fd31435a462019d834f83c8611a0ce7484c7317"}, - {file = "wrapt-1.17.2-cp311-cp311-win_amd64.whl", hash = "sha256:acc130bc0375999da18e3d19e5a86403667ac0c4042a094fefb7eec8ebac7cf3"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d5e2439eecc762cd85e7bd37161d4714aa03a33c5ba884e26c81559817ca0925"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fc7cb4c1c744f8c05cd5f9438a3caa6ab94ce8344e952d7c45a8ed59dd88392"}, - {file = "wrapt-1.17.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8fdbdb757d5390f7c675e558fd3186d590973244fab0c5fe63d373ade3e99d40"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5bb1d0dbf99411f3d871deb6faa9aabb9d4e744d67dcaaa05399af89d847a91d"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d18a4865f46b8579d44e4fe1e2bcbc6472ad83d98e22a26c963d46e4c125ef0b"}, - {file = "wrapt-1.17.2-cp312-cp312-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:bc570b5f14a79734437cb7b0500376b6b791153314986074486e0b0fa8d71d98"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6d9187b01bebc3875bac9b087948a2bccefe464a7d8f627cf6e48b1bbae30f82"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9e8659775f1adf02eb1e6f109751268e493c73716ca5761f8acb695e52a756ae"}, - {file = "wrapt-1.17.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e8b2816ebef96d83657b56306152a93909a83f23994f4b30ad4573b00bd11bb9"}, - {file = "wrapt-1.17.2-cp312-cp312-win32.whl", hash = "sha256:468090021f391fe0056ad3e807e3d9034e0fd01adcd3bdfba977b6fdf4213ea9"}, - {file = "wrapt-1.17.2-cp312-cp312-win_amd64.whl", hash = "sha256:ec89ed91f2fa8e3f52ae53cd3cf640d6feff92ba90d62236a81e4e563ac0e991"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:6ed6ffac43aecfe6d86ec5b74b06a5be33d5bb9243d055141e8cabb12aa08125"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:35621ae4c00e056adb0009f8e86e28eb4a41a4bfa8f9bfa9fca7d343fe94f998"}, - {file = "wrapt-1.17.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a604bf7a053f8362d27eb9fefd2097f82600b856d5abe996d623babd067b1ab5"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:5cbabee4f083b6b4cd282f5b817a867cf0b1028c54d445b7ec7cfe6505057cf8"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:49703ce2ddc220df165bd2962f8e03b84c89fee2d65e1c24a7defff6f988f4d6"}, - {file = "wrapt-1.17.2-cp313-cp313-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8112e52c5822fc4253f3901b676c55ddf288614dc7011634e2719718eaa187dc"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:9fee687dce376205d9a494e9c121e27183b2a3df18037f89d69bd7b35bcf59e2"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:18983c537e04d11cf027fbb60a1e8dfd5190e2b60cc27bc0808e653e7b218d1b"}, - {file = "wrapt-1.17.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:703919b1633412ab54bcf920ab388735832fdcb9f9a00ae49387f0fe67dad504"}, - {file = "wrapt-1.17.2-cp313-cp313-win32.whl", hash = "sha256:abbb9e76177c35d4e8568e58650aa6926040d6a9f6f03435b7a522bf1c487f9a"}, - {file = "wrapt-1.17.2-cp313-cp313-win_amd64.whl", hash = "sha256:69606d7bb691b50a4240ce6b22ebb319c1cfb164e5f6569835058196e0f3a845"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:4a721d3c943dae44f8e243b380cb645a709ba5bd35d3ad27bc2ed947e9c68192"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:766d8bbefcb9e00c3ac3b000d9acc51f1b399513f44d77dfe0eb026ad7c9a19b"}, - {file = "wrapt-1.17.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e496a8ce2c256da1eb98bd15803a79bee00fc351f5dfb9ea82594a3f058309e0"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:40d615e4fe22f4ad3528448c193b218e077656ca9ccb22ce2cb20db730f8d306"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:a5aaeff38654462bc4b09023918b7f21790efb807f54c000a39d41d69cf552cb"}, - {file = "wrapt-1.17.2-cp313-cp313t-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9a7d15bbd2bc99e92e39f49a04653062ee6085c0e18b3b7512a4f2fe91f2d681"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:e3890b508a23299083e065f435a492b5435eba6e304a7114d2f919d400888cc6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:8c8b293cd65ad716d13d8dd3624e42e5a19cc2a2f1acc74b30c2c13f15cb61a6"}, - {file = "wrapt-1.17.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4c82b8785d98cdd9fed4cac84d765d234ed3251bd6afe34cb7ac523cb93e8b4f"}, - {file = "wrapt-1.17.2-cp313-cp313t-win32.whl", hash = "sha256:13e6afb7fe71fe7485a4550a8844cc9ffbe263c0f1a1eea569bc7091d4898555"}, - {file = "wrapt-1.17.2-cp313-cp313t-win_amd64.whl", hash = "sha256:eaf675418ed6b3b31c7a989fd007fa7c3be66ce14e5c3b27336383604c9da85c"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:5c803c401ea1c1c18de70a06a6f79fcc9c5acfc79133e9869e730ad7f8ad8ef9"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:f917c1180fdb8623c2b75a99192f4025e412597c50b2ac870f156de8fb101119"}, - {file = "wrapt-1.17.2-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:ecc840861360ba9d176d413a5489b9a0aff6d6303d7e733e2c4623cfa26904a6"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb87745b2e6dc56361bfde481d5a378dc314b252a98d7dd19a651a3fa58f24a9"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:58455b79ec2661c3600e65c0a716955adc2410f7383755d537584b0de41b1d8a"}, - {file = "wrapt-1.17.2-cp38-cp38-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b4e42a40a5e164cbfdb7b386c966a588b1047558a990981ace551ed7e12ca9c2"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:91bd7d1773e64019f9288b7a5101f3ae50d3d8e6b1de7edee9c2ccc1d32f0c0a"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_i686.whl", hash = "sha256:bb90fb8bda722a1b9d48ac1e6c38f923ea757b3baf8ebd0c82e09c5c1a0e7a04"}, - {file = "wrapt-1.17.2-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:08e7ce672e35efa54c5024936e559469436f8b8096253404faeb54d2a878416f"}, - {file = "wrapt-1.17.2-cp38-cp38-win32.whl", hash = "sha256:410a92fefd2e0e10d26210e1dfb4a876ddaf8439ef60d6434f21ef8d87efc5b7"}, - {file = "wrapt-1.17.2-cp38-cp38-win_amd64.whl", hash = "sha256:95c658736ec15602da0ed73f312d410117723914a5c91a14ee4cdd72f1d790b3"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:99039fa9e6306880572915728d7f6c24a86ec57b0a83f6b2491e1d8ab0235b9a"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:2696993ee1eebd20b8e4ee4356483c4cb696066ddc24bd70bcbb80fa56ff9061"}, - {file = "wrapt-1.17.2-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:612dff5db80beef9e649c6d803a8d50c409082f1fedc9dbcdfde2983b2025b82"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:62c2caa1585c82b3f7a7ab56afef7b3602021d6da34fbc1cf234ff139fed3cd9"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:c958bcfd59bacc2d0249dcfe575e71da54f9dcf4a8bdf89c4cb9a68a1170d73f"}, - {file = "wrapt-1.17.2-cp39-cp39-manylinux_2_5_x86_64.manylinux1_x86_64.manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc78a84e2dfbc27afe4b2bd7c80c8db9bca75cc5b85df52bfe634596a1da846b"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:ba0f0eb61ef00ea10e00eb53a9129501f52385c44853dbd6c4ad3f403603083f"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_i686.whl", hash = "sha256:1e1fe0e6ab7775fd842bc39e86f6dcfc4507ab0ffe206093e76d61cde37225c8"}, - {file = "wrapt-1.17.2-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:c86563182421896d73858e08e1db93afdd2b947a70064b813d515d66549e15f9"}, - {file = "wrapt-1.17.2-cp39-cp39-win32.whl", hash = "sha256:f393cda562f79828f38a819f4788641ac7c4085f30f1ce1a68672baa686482bb"}, - {file = "wrapt-1.17.2-cp39-cp39-win_amd64.whl", hash = "sha256:36ccae62f64235cf8ddb682073a60519426fdd4725524ae38874adf72b5f2aeb"}, - {file = "wrapt-1.17.2-py3-none-any.whl", hash = "sha256:b18f2d1533a71f069c7f82d524a52599053d4c7166e9dd374ae2136b7f40f7c8"}, - {file = "wrapt-1.17.2.tar.gz", hash = "sha256:41388e9d4d1522446fe79d3213196bd9e3b301a336965b9e27ca2788ebd122f3"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:64b103acdaa53b7caf409e8d45d39a8442fe6dcfec6ba3f3d141e0cc2b5b4dbd"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:91bcc576260a274b169c3098e9a3519fb01f2989f6d3d386ef9cbf8653de1374"}, + {file = "wrapt-2.0.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:ab594f346517010050126fcd822697b25a7031d815bb4fbc238ccbe568216489"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:36982b26f190f4d737f04a492a68accbfc6fa042c3f42326fdfbb6c5b7a20a31"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23097ed8bc4c93b7bf36fa2113c6c733c976316ce0ee2c816f64ca06102034ef"}, + {file = "wrapt-2.0.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8bacfe6e001749a3b64db47bcf0341da757c95959f592823a93931a422395013"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec3303e8a81932171f455f792f8df500fc1a09f20069e5c16bd7049ab4e8e38"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3f373a4ab5dbc528a94334f9fe444395b23c2f5332adab9ff4ea82f5a9e33bc1"}, + {file = "wrapt-2.0.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f49027b0b9503bf6c8cdc297ca55006b80c2f5dd36cecc72c6835ab6e10e8a25"}, + {file = "wrapt-2.0.1-cp310-cp310-win32.whl", hash = "sha256:8330b42d769965e96e01fa14034b28a2a7600fbf7e8f0cc90ebb36d492c993e4"}, + {file = "wrapt-2.0.1-cp310-cp310-win_amd64.whl", hash = "sha256:1218573502a8235bb8a7ecaed12736213b22dcde9feab115fa2989d42b5ded45"}, + {file = "wrapt-2.0.1-cp310-cp310-win_arm64.whl", hash = "sha256:eda8e4ecd662d48c28bb86be9e837c13e45c58b8300e43ba3c9b4fa9900302f7"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:0e17283f533a0d24d6e5429a7d11f250a58d28b4ae5186f8f47853e3e70d2590"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:85df8d92158cb8f3965aecc27cf821461bb5f40b450b03facc5d9f0d4d6ddec6"}, + {file = "wrapt-2.0.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c1be685ac7700c966b8610ccc63c3187a72e33cab53526a27b2a285a662cd4f7"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:df0b6d3b95932809c5b3fecc18fda0f1e07452d05e2662a0b35548985f256e28"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4da7384b0e5d4cae05c97cd6f94faaf78cc8b0f791fc63af43436d98c4ab37bb"}, + {file = "wrapt-2.0.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ec65a78fbd9d6f083a15d7613b2800d5663dbb6bb96003899c834beaa68b242c"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7de3cc939be0e1174969f943f3b44e0d79b6f9a82198133a5b7fc6cc92882f16"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:fb1a5b72cbd751813adc02ef01ada0b0d05d3dcbc32976ce189a1279d80ad4a2"}, + {file = "wrapt-2.0.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3fa272ca34332581e00bf7773e993d4f632594eb2d1b0b162a9038df0fd971dd"}, + {file = "wrapt-2.0.1-cp311-cp311-win32.whl", hash = "sha256:fc007fdf480c77301ab1afdbb6ab22a5deee8885f3b1ed7afcb7e5e84a0e27be"}, + {file = "wrapt-2.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:47434236c396d04875180171ee1f3815ca1eada05e24a1ee99546320d54d1d1b"}, + {file = "wrapt-2.0.1-cp311-cp311-win_arm64.whl", hash = "sha256:837e31620e06b16030b1d126ed78e9383815cbac914693f54926d816d35d8edf"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:1fdbb34da15450f2b1d735a0e969c24bdb8d8924892380126e2a293d9902078c"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3d32794fe940b7000f0519904e247f902f0149edbe6316c710a8562fb6738841"}, + {file = "wrapt-2.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:386fb54d9cd903ee0012c09291336469eb7b244f7183d40dc3e86a16a4bace62"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7b219cb2182f230676308cdcacd428fa837987b89e4b7c5c9025088b8a6c9faf"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:641e94e789b5f6b4822bb8d8ebbdfc10f4e4eae7756d648b717d980f657a9eb9"}, + {file = "wrapt-2.0.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:fe21b118b9f58859b5ebaa4b130dee18669df4bd111daad082b7beb8799ad16b"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:17fb85fa4abc26a5184d93b3efd2dcc14deb4b09edcdb3535a536ad34f0b4dba"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b89ef9223d665ab255ae42cc282d27d69704d94be0deffc8b9d919179a609684"}, + {file = "wrapt-2.0.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a453257f19c31b31ba593c30d997d6e5be39e3b5ad9148c2af5a7314061c63eb"}, + {file = "wrapt-2.0.1-cp312-cp312-win32.whl", hash = "sha256:3e271346f01e9c8b1130a6a3b0e11908049fe5be2d365a5f402778049147e7e9"}, + {file = "wrapt-2.0.1-cp312-cp312-win_amd64.whl", hash = "sha256:2da620b31a90cdefa9cd0c2b661882329e2e19d1d7b9b920189956b76c564d75"}, + {file = "wrapt-2.0.1-cp312-cp312-win_arm64.whl", hash = "sha256:aea9c7224c302bc8bfc892b908537f56c430802560e827b75ecbde81b604598b"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:47b0f8bafe90f7736151f61482c583c86b0693d80f075a58701dd1549b0010a9"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:cbeb0971e13b4bd81d34169ed57a6dda017328d1a22b62fda45e1d21dd06148f"}, + {file = "wrapt-2.0.1-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:eb7cffe572ad0a141a7886a1d2efa5bef0bf7fe021deeea76b3ab334d2c38218"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:c8d60527d1ecfc131426b10d93ab5d53e08a09c5fa0175f6b21b3252080c70a9"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c654eafb01afac55246053d67a4b9a984a3567c3808bb7df2f8de1c1caba2e1c"}, + {file = "wrapt-2.0.1-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:98d873ed6c8b4ee2418f7afce666751854d6d03e3c0ec2a399bb039cd2ae89db"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:c9e850f5b7fc67af856ff054c71690d54fa940c3ef74209ad9f935b4f66a0233"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:e505629359cb5f751e16e30cf3f91a1d3ddb4552480c205947da415d597f7ac2"}, + {file = "wrapt-2.0.1-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:2879af909312d0baf35f08edeea918ee3af7ab57c37fe47cb6a373c9f2749c7b"}, + {file = "wrapt-2.0.1-cp313-cp313-win32.whl", hash = "sha256:d67956c676be5a24102c7407a71f4126d30de2a569a1c7871c9f3cabc94225d7"}, + {file = "wrapt-2.0.1-cp313-cp313-win_amd64.whl", hash = "sha256:9ca66b38dd642bf90c59b6738af8070747b610115a39af2498535f62b5cdc1c3"}, + {file = "wrapt-2.0.1-cp313-cp313-win_arm64.whl", hash = "sha256:5a4939eae35db6b6cec8e7aa0e833dcca0acad8231672c26c2a9ab7a0f8ac9c8"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_universal2.whl", hash = "sha256:a52f93d95c8d38fed0669da2ebdb0b0376e895d84596a976c15a9eb45e3eccb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:4e54bbf554ee29fcceee24fa41c4d091398b911da6e7f5d7bffda963c9aed2e1"}, + {file = "wrapt-2.0.1-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:908f8c6c71557f4deaa280f55d0728c3bca0960e8c3dd5ceeeafb3c19942719d"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e2f84e9af2060e3904a32cea9bb6db23ce3f91cfd90c6b426757cf7cc01c45c7"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e3612dc06b436968dfb9142c62e5dfa9eb5924f91120b3c8ff501ad878f90eb3"}, + {file = "wrapt-2.0.1-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6d2d947d266d99a1477cd005b23cbd09465276e302515e122df56bb9511aca1b"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:7d539241e87b650cbc4c3ac9f32c8d1ac8a54e510f6dca3f6ab60dcfd48c9b10"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:4811e15d88ee62dbf5c77f2c3ff3932b1e3ac92323ba3912f51fc4016ce81ecf"}, + {file = "wrapt-2.0.1-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:c1c91405fcf1d501fa5d55df21e58ea49e6b879ae829f1039faaf7e5e509b41e"}, + {file = "wrapt-2.0.1-cp313-cp313t-win32.whl", hash = "sha256:e76e3f91f864e89db8b8d2a8311d57df93f01ad6bb1e9b9976d1f2e83e18315c"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_amd64.whl", hash = "sha256:83ce30937f0ba0d28818807b303a412440c4b63e39d3d8fc036a94764b728c92"}, + {file = "wrapt-2.0.1-cp313-cp313t-win_arm64.whl", hash = "sha256:4b55cacc57e1dc2d0991dbe74c6419ffd415fb66474a02335cb10efd1aa3f84f"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_universal2.whl", hash = "sha256:5e53b428f65ece6d9dad23cb87e64506392b720a0b45076c05354d27a13351a1"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:ad3ee9d0f254851c71780966eb417ef8e72117155cff04821ab9b60549694a55"}, + {file = "wrapt-2.0.1-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d7b822c61ed04ee6ad64bc90d13368ad6eb094db54883b5dde2182f67a7f22c0"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7164a55f5e83a9a0b031d3ffab4d4e36bbec42e7025db560f225489fa929e509"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e60690ba71a57424c8d9ff28f8d006b7ad7772c22a4af432188572cd7fa004a1"}, + {file = "wrapt-2.0.1-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3cd1a4bd9a7a619922a8557e1318232e7269b5fb69d4ba97b04d20450a6bf970"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:b4c2e3d777e38e913b8ce3a6257af72fb608f86a1df471cb1d4339755d0a807c"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:3d366aa598d69416b5afedf1faa539fac40c1d80a42f6b236c88c73a3c8f2d41"}, + {file = "wrapt-2.0.1-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:c235095d6d090aa903f1db61f892fffb779c1eaeb2a50e566b52001f7a0f66ed"}, + {file = "wrapt-2.0.1-cp314-cp314-win32.whl", hash = "sha256:bfb5539005259f8127ea9c885bdc231978c06b7a980e63a8a61c8c4c979719d0"}, + {file = "wrapt-2.0.1-cp314-cp314-win_amd64.whl", hash = "sha256:4ae879acc449caa9ed43fc36ba08392b9412ee67941748d31d94e3cedb36628c"}, + {file = "wrapt-2.0.1-cp314-cp314-win_arm64.whl", hash = "sha256:8639b843c9efd84675f1e100ed9e99538ebea7297b62c4b45a7042edb84db03e"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_universal2.whl", hash = "sha256:9219a1d946a9b32bb23ccae66bdb61e35c62773ce7ca6509ceea70f344656b7b"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:fa4184e74197af3adad3c889a1af95b53bb0466bced92ea99a0c014e48323eec"}, + {file = "wrapt-2.0.1-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c5ef2f2b8a53b7caee2f797ef166a390fef73979b15778a4a153e4b5fedce8fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e042d653a4745be832d5aa190ff80ee4f02c34b21f4b785745eceacd0907b815"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2afa23318136709c4b23d87d543b425c399887b4057936cd20386d5b1422b6fa"}, + {file = "wrapt-2.0.1-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:6c72328f668cf4c503ffcf9434c2b71fdd624345ced7941bc6693e61bbe36bef"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:3793ac154afb0e5b45d1233cb94d354ef7a983708cc3bb12563853b1d8d53747"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:fec0d993ecba3991645b4857837277469c8cc4c554a7e24d064d1ca291cfb81f"}, + {file = "wrapt-2.0.1-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:949520bccc1fa227274da7d03bf238be15389cd94e32e4297b92337df9b7a349"}, + {file = "wrapt-2.0.1-cp314-cp314t-win32.whl", hash = "sha256:be9e84e91d6497ba62594158d3d31ec0486c60055c49179edc51ee43d095f79c"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_amd64.whl", hash = "sha256:61c4956171c7434634401db448371277d07032a81cc21c599c22953374781395"}, + {file = "wrapt-2.0.1-cp314-cp314t-win_arm64.whl", hash = "sha256:35cdbd478607036fee40273be8ed54a451f5f23121bd9d4be515158f9498f7ad"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_universal2.whl", hash = "sha256:90897ea1cf0679763b62e79657958cd54eae5659f6360fc7d2ccc6f906342183"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_10_9_x86_64.whl", hash = "sha256:50844efc8cdf63b2d90cd3d62d4947a28311e6266ce5235a219d21b195b4ec2c"}, + {file = "wrapt-2.0.1-cp38-cp38-macosx_11_0_arm64.whl", hash = "sha256:49989061a9977a8cbd6d20f2efa813f24bf657c6990a42967019ce779a878dbf"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:09c7476ab884b74dce081ad9bfd07fe5822d8600abade571cb1f66d5fc915af6"}, + {file = "wrapt-2.0.1-cp38-cp38-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d1a8a09a004ef100e614beec82862d11fc17d601092c3599afd22b1f36e4137e"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_aarch64.whl", hash = "sha256:89a82053b193837bf93c0f8a57ded6e4b6d88033a499dadff5067e912c2a41e9"}, + {file = "wrapt-2.0.1-cp38-cp38-musllinux_1_2_x86_64.whl", hash = "sha256:f26f8e2ca19564e2e1fdbb6a0e47f36e0efbab1acc31e15471fad88f828c75f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win32.whl", hash = "sha256:115cae4beed3542e37866469a8a1f2b9ec549b4463572b000611e9946b86e6f6"}, + {file = "wrapt-2.0.1-cp38-cp38-win_amd64.whl", hash = "sha256:c4012a2bd37059d04f8209916aa771dfb564cccb86079072bdcd48a308b6a5c5"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_universal2.whl", hash = "sha256:68424221a2dc00d634b54f92441914929c5ffb1c30b3b837343978343a3512a3"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_10_9_x86_64.whl", hash = "sha256:6bd1a18f5a797fe740cb3d7a0e853a8ce6461cc62023b630caec80171a6b8097"}, + {file = "wrapt-2.0.1-cp39-cp39-macosx_11_0_arm64.whl", hash = "sha256:fb3a86e703868561c5cad155a15c36c716e1ab513b7065bd2ac8ed353c503333"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:5dc1b852337c6792aa111ca8becff5bacf576bf4a0255b0f05eb749da6a1643e"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c046781d422f0830de6329fa4b16796096f28a92c8aef3850674442cdcb87b7f"}, + {file = "wrapt-2.0.1-cp39-cp39-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f73f9f7a0ebd0db139253d27e5fc8d2866ceaeef19c30ab5d69dcbe35e1a6981"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_aarch64.whl", hash = "sha256:b667189cf8efe008f55bbda321890bef628a67ab4147ebf90d182f2dadc78790"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_riscv64.whl", hash = "sha256:a9a83618c4f0757557c077ef71d708ddd9847ed66b7cc63416632af70d3e2308"}, + {file = "wrapt-2.0.1-cp39-cp39-musllinux_1_2_x86_64.whl", hash = "sha256:1e9b121e9aeb15df416c2c960b8255a49d44b4038016ee17af03975992d03931"}, + {file = "wrapt-2.0.1-cp39-cp39-win32.whl", hash = "sha256:1f186e26ea0a55f809f232e92cc8556a0977e00183c3ebda039a807a42be1494"}, + {file = "wrapt-2.0.1-cp39-cp39-win_amd64.whl", hash = "sha256:bf4cb76f36be5de950ce13e22e7fdf462b35b04665a12b64f3ac5c1bbbcf3728"}, + {file = "wrapt-2.0.1-cp39-cp39-win_arm64.whl", hash = "sha256:d6cc985b9c8b235bd933990cdbf0f891f8e010b65a3911f7a55179cd7b0fc57b"}, + {file = "wrapt-2.0.1-py3-none-any.whl", hash = "sha256:4d2ce1bf1a48c5277d7969259232b57645aae5686dba1eaeade39442277afbca"}, + {file = "wrapt-2.0.1.tar.gz", hash = "sha256:9c9c635e78497cacb81e84f8b11b23e0aacac7a136e73b8e5b2109a1d9fc468f"}, ] +[package.extras] +dev = ["pytest", "setuptools"] + [extras] demo = ["homcloud", "ipykernel", "jupyterlab", "nbformat", "pandas", "plotly", "seaborn", "tqdm"] [metadata] lock-version = "2.1" python-versions = ">=3.10" -content-hash = "fcba08f8a6a29bfb3fd876e3a72862170aee8ab67838ba2a3d87a91a997d024c" +content-hash = "f48e31a467c31ba9bc25de096029f851d7cb1a3a51e100ca6d75842c9c8a6950" diff --git a/pyproject.toml b/pyproject.toml index 2770e85..353e61c 100755 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,6 +1,6 @@ [project] name = "ellphi" -version = "0.1.1.post1" +version = "0.1.2" description = "Fast ellipse tangency solver" authors = [ { name = "Tomoki Uda", email = "tomoki.uda@gmail.com" } @@ -95,6 +95,15 @@ homcloud = "^4.8.0" tqdm = "^4.67.1" seaborn = "^0.13" +[tool.poetry.group.docs] +optional = true + +[tool.poetry.group.docs.dependencies] +mkdocs = "^1.6.0" +mkdocs-material = "^9.5.0" +mkdocstrings = {extras = ["python"], version = "0.25.0"} +mkdocs-autorefs = "1.3.1" + [tool.mypy] mypy_path = "src" diff --git a/scripts/benchmark_dim_scale.py b/scripts/benchmark_dim_scale.py new file mode 100644 index 0000000..4c1b4fa --- /dev/null +++ b/scripts/benchmark_dim_scale.py @@ -0,0 +1,66 @@ +import time +import numpy as np +import ellphi +import sys + + +def generate_random_ellipse(dim): + # Random center + center = np.random.rand(dim) * 10.0 + + # Random positive definite matrix + X = np.random.rand(dim, dim) + cov = X @ X.T + np.eye(dim) * 0.1 + + # Convert to coefficients + # coef_from_cov returns (n, m) array + # We pass a list of centers and list of covs (length 1) + coefs = ellphi.coef_from_cov([center], [cov]) + return coefs[0] + + +def benchmark(): + dims = [2, 3, 5, 8, 10, 15, 20, 30, 40, 50, 60, 80, 100] + n_trials = 20 # Number of different ellipse pairs to test per dimension + n_repeats = 20 # Number of repeats for timing per pair + + print("dim,backend,avg_time_ms") + + for dim in dims: + # Pre-generate ellipse pairs to avoid measuring generation time + pairs = [] + for _ in range(n_trials): + p = generate_random_ellipse(dim) + q = generate_random_ellipse(dim) + pairs.append((p, q)) + + # Benchmark Python backend + py_times = [] + for p, q in pairs: + start = time.perf_counter() + for _ in range(n_repeats): + ellphi.tangency(p, q, backend="python") + end = time.perf_counter() + py_times.append((end - start) / n_repeats) + avg_py = np.mean(py_times) * 1000.0 + print(f"{dim},python,{avg_py:.4f}") + + # Benchmark C++ backend + if ellphi.has_cpp_backend(): + cpp_times = [] + for p, q in pairs: + start = time.perf_counter() + for _ in range(n_repeats): + ellphi.tangency(p, q, backend="cpp") + end = time.perf_counter() + cpp_times.append((end - start) / n_repeats) + avg_cpp = np.mean(cpp_times) * 1000.0 + print(f"{dim},cpp,{avg_cpp:.4f}") + else: + print(f"{dim},cpp,NaN") + + sys.stdout.flush() + + +if __name__ == "__main__": + benchmark() diff --git a/scripts/build_tangency_cpp.py b/scripts/build_tangency_cpp.py index dbb403c..8f2f0f0 100644 --- a/scripts/build_tangency_cpp.py +++ b/scripts/build_tangency_cpp.py @@ -4,7 +4,9 @@ from __future__ import annotations import ctypes +import os import re +import shlex import sys import sysconfig from pathlib import Path @@ -19,6 +21,23 @@ _LIB_NAME = "_tangency_cpp_impl" +def _use_eigen() -> bool: + value = os.getenv("ELLPHI_USE_EIGEN", "") + return value.lower() in {"1", "true", "yes", "on"} + + +def _eigen_include_dirs() -> list[str]: + raw = os.getenv("ELLPHI_EIGEN_INCLUDE", "") + if raw: + return shlex.split(raw) + candidates = [ + "/usr/include/eigen3", + "/usr/local/include/eigen3", + "/opt/homebrew/include/eigen3", + ] + return [path for path in candidates if Path(path).exists()] + + def _library_suffix() -> str: suffix = sysconfig.get_config_var("SHLIB_SUFFIX") if suffix: @@ -88,6 +107,24 @@ def _existing_library_version(path: Path) -> str | None: return value.decode("utf-8", errors="replace") +def _existing_library_linalg_kind(path: Path) -> str | None: + try: + lib = ctypes.CDLL(str(path)) + except OSError: + return None + + try: + func = lib.tangency_linalg_kind + except AttributeError: + return None + + func.restype = ctypes.c_char_p + value = func() + if not value: + return None + return value.decode("utf-8", errors="replace") + + def _ensure_parent(path: Path) -> None: path.parent.mkdir(parents=True, exist_ok=True) @@ -95,11 +132,24 @@ def _ensure_parent(path: Path) -> None: class _TangencyExtension(Extension): def __init__(self) -> None: version = _project_version() + define_macros = [("TANGENCY_VERSION", f'"{version}"')] + extra_link_args: list[str] = [] + include_dirs: list[str] = [] + if _use_eigen(): + define_macros.append(("ELLPHI_USE_EIGEN", "1")) + include_dirs = _eigen_include_dirs() + if not include_dirs: + raise RuntimeError( + "ELLPHI_USE_EIGEN is set but no Eigen include path was found. " + "Set ELLPHI_EIGEN_INCLUDE to the Eigen headers." + ) super().__init__( name=_LIB_NAME, sources=[str(_source_path())], language="c++", - define_macros=[("TANGENCY_VERSION", f'"{version}"')], + define_macros=define_macros, + extra_link_args=extra_link_args, + include_dirs=include_dirs, ) @@ -121,6 +171,10 @@ def build_extension(self, ext: Extension) -> None: # type: ignore[override] ctype = compiler.compiler_type compile_opts = list(self.c_opts.get(ctype, [])) link_opts = list(self.l_opts.get(ctype, [])) + if getattr(ext, "extra_compile_args", None): + compile_opts.extend(ext.extra_compile_args) + if getattr(ext, "extra_link_args", None): + link_opts.extend(ext.extra_link_args) objects = compiler.compile( ext.sources, # type: ignore[arg-type] @@ -160,10 +214,13 @@ def build() -> Path: raise FileNotFoundError(f"C++ source not found: {source}") existing_version = _existing_library_version(output) + expected_kind = "eigen" if _use_eigen() else "internal" + existing_kind = _existing_library_linalg_kind(output) if ( output.exists() and output.stat().st_mtime >= source.stat().st_mtime and existing_version == project_version + and existing_kind == expected_kind ): return output diff --git a/scripts/hybrid_tuning.py b/scripts/hybrid_tuning.py index 4425c4c..e772f18 100644 --- a/scripts/hybrid_tuning.py +++ b/scripts/hybrid_tuning.py @@ -2,7 +2,7 @@ """Benchmark tangency backends/methods to tune the hybrid solver. The script generates a mix of well-conditioned and highly eccentric -ellipsoids, calls :func:`ellphi.solver.tangency` with different +ellipsoids, calls `ellphi.solver.tangency` with different backends/methods, and reports aggregated + per-dimension timing/accuracy statistics (markdown table by default). The output guides the selection of iteration budgets that generalise beyond 2D while remaining faster diff --git a/src/ellphi/__init__.py b/src/ellphi/__init__.py index 53e7166..9a58db7 100644 --- a/src/ellphi/__init__.py +++ b/src/ellphi/__init__.py @@ -38,9 +38,14 @@ pdist_tangency, TangencyResult, has_cpp_backend, + cpp_linalg_kind, + BuildInfo, + build_info, ) +from .grad import TangencyGrad, tangency_grad, pdist_tangency_grad, coef_from_cov_grad + FloatArray = NDArray[np.float64] @@ -62,19 +67,27 @@ "pdist_tangency", "TangencyResult", "has_cpp_backend", + "cpp_linalg_kind", + "BuildInfo", + "build_info", + # grad + "TangencyGrad", + "tangency_grad", + "pdist_tangency_grad", + "coef_from_cov_grad", "__version__", "version_info", ] def version_info() -> str: - """Return the current :mod:`ellphi` version string.""" + """Return the current `ellphi` version string.""" return __version__ def _main() -> None: - """A minimal CLI for printing the current version.""" + """A minimal CLI for printing the current version and build info.""" import argparse @@ -84,10 +97,17 @@ def _main() -> None: action="store_true", help="Print the installed ellphi version and exit", ) + parser.add_argument( + "--build-info", + action="store_true", + help="Print the ellphi build info and exit", + ) args = parser.parse_args() if args.version: print(version_info()) - else: + if args.build_info: + print(build_info()) + if not args.version and not args.build_info: parser.print_help() diff --git a/src/ellphi/__init__.pyi b/src/ellphi/__init__.pyi index 5411710..d98f65c 100644 --- a/src/ellphi/__init__.pyi +++ b/src/ellphi/__init__.pyi @@ -15,13 +15,22 @@ from .geometry import ( unit_vector as unit_vector, ) from .solver import ( + BuildInfo as BuildInfo, TangencyResult as TangencyResult, + cpp_linalg_kind as cpp_linalg_kind, + build_info as build_info, has_cpp_backend as has_cpp_backend, pdist_tangency as pdist_tangency, pencil as pencil, quad_eval as quad_eval, tangency as tangency, ) +from .grad import ( + TangencyGrad as TangencyGrad, + tangency_grad as tangency_grad, + pdist_tangency_grad as pdist_tangency_grad, + coef_from_cov_grad as coef_from_cov_grad, +) from ._version import __version__ as __version__ def version_info() -> str: ... @@ -41,6 +50,13 @@ __all__ = [ "pdist_tangency", "TangencyResult", "has_cpp_backend", + "cpp_linalg_kind", + "BuildInfo", + "build_info", + "TangencyGrad", + "tangency_grad", + "pdist_tangency_grad", + "coef_from_cov_grad", "FloatArray", "__version__", "version_info", diff --git a/src/ellphi/__main__.py b/src/ellphi/__main__.py index 26ac131..d2d3393 100644 --- a/src/ellphi/__main__.py +++ b/src/ellphi/__main__.py @@ -1,7 +1,7 @@ -"""Command-line entry point for :mod:`ellphi`. +"""Command-line entry point for `ellphi`. Allows executing ``python -m ellphi`` to access the minimal CLI that exposes -version information. +version/build information. """ from . import _main diff --git a/src/ellphi/_solver_python.py b/src/ellphi/_solver_python.py index befed31..6ffab85 100644 --- a/src/ellphi/_solver_python.py +++ b/src/ellphi/_solver_python.py @@ -11,6 +11,7 @@ Callable, Iterator, Literal, + NamedTuple, Tuple, cast, ) @@ -110,7 +111,7 @@ def _gaussian_elimination(matrix: numpy.ndarray, rhs: numpy.ndarray) -> numpy.nd x = numpy.zeros(dim, dtype=float) for i in range(dim - 1, -1, -1): diag = A[i, i] - if diag == 0.0: + if diag == 0.0: # pragma: no cover - guarded by pivot checks raise numpy.linalg.LinAlgError("Matrix is singular") residual = b[i] - A[i, i + 1 :] @ x[i + 1 :] x[i] = residual / diag @@ -152,7 +153,20 @@ def pencil(p: numpy.ndarray, q: numpy.ndarray, mu: float) -> numpy.ndarray: return (1.0 - mu) * p + mu * q -TangencyResult = namedtuple("TangencyResult", ["t", "point", "mu"]) +class TangencyResult(NamedTuple): + """Result of a tangency point calculation. + + Attributes: + t: The tangency time (distance). + point: The tangent point as a NumPy array. + mu: The pencil parameter μ at which the two ellipses are tangent. + """ + + t: float + point: numpy.ndarray + mu: float + + NewtonResult = namedtuple("NewtonResult", ["root", "converged"]) @@ -349,7 +363,7 @@ def wrapper(mu: float) -> float: return wrapper def solve_single_stage(method_name: SingleStageMethodName, **kwargs: Any) -> float: - if method_name == "newton": + if method_name == "newton": # pragma: no cover - currently unused kwargs.setdefault("fprime", curry_df) result = root_scalar(curry_f, method=method_name, **kwargs) return float(result.root) @@ -479,10 +493,7 @@ def tangency( failsafe: If `True`, a failsafe fallback is enabled. Returns: - A `TangencyResult` named tuple with the following fields: - - `t`: The tangency time. - - `point`: The tangent point. - - `mu`: The pencil parameter `μ` at which the two ellipses are tangent. + A `TangencyResult` containing the tangency time, point, and pencil parameter. Raises: RuntimeError: If the solver fails to converge to a valid solution diff --git a/src/ellphi/_solver_python.pyi b/src/ellphi/_solver_python.pyi index b190537..b859733 100644 --- a/src/ellphi/_solver_python.pyi +++ b/src/ellphi/_solver_python.pyi @@ -15,6 +15,7 @@ __all__ = [ MethodName = str # Simplified for stub def _gaussian_elimination(matrix: FloatArray, rhs: FloatArray) -> FloatArray: ... +def _u_from_x(x: float | FloatArray) -> float | FloatArray: ... def _center(coef: FloatArray) -> FloatArray: ... def quad_eval(coef: FloatArray, center: Tuple[float, ...] | FloatArray) -> float: ... def pencil(p: FloatArray, q: FloatArray, mu: float) -> FloatArray: ... diff --git a/src/ellphi/_tangency_cpp.py b/src/ellphi/_tangency_cpp.py index df02238..740c3ed 100644 --- a/src/ellphi/_tangency_cpp.py +++ b/src/ellphi/_tangency_cpp.py @@ -99,6 +99,41 @@ def is_available() -> bool: return _LIB is not None +def linalg_kind() -> str | None: + """Return the C++ linear algebra build kind. + + Returns: + The build kind ("eigen" or "internal") if the C++ backend is available, + otherwise `None`. + """ + if _LIB is None: + return None + try: + func = _LIB.tangency_linalg_kind + except AttributeError as exc: + raise RuntimeError( + "C++ backend is missing linear algebra metadata. " + "Please rebuild the extension." + ) from exc + func.restype = ctypes.c_char_p + value = func() + if value is None: + raise RuntimeError("C++ backend returned an empty linear algebra kind") + return value.decode("utf-8", errors="replace") + + +def backend_version() -> str | None: + """Return the C++ backend build version string. + + Returns: + The embedded build version if the C++ backend is available, otherwise + `None`. + """ + if _LIB is None: + return None + return _library_version(_LIB) + + def _ensure_available() -> ctypes.CDLL: if _LIB is None: message = ( diff --git a/src/ellphi/_tangency_cpp.pyi b/src/ellphi/_tangency_cpp.pyi index ccc1cde..aca13b9 100644 --- a/src/ellphi/_tangency_cpp.pyi +++ b/src/ellphi/_tangency_cpp.pyi @@ -3,6 +3,8 @@ from ellphi import FloatArray from ._solver_python import TangencyResult def is_available() -> bool: ... +def linalg_kind() -> str | None: ... +def backend_version() -> str | None: ... def tangency( pcoef: FloatArray, qcoef: FloatArray, diff --git a/src/ellphi/_tangency_cpp_impl.cpp b/src/ellphi/_tangency_cpp_impl.cpp index 739d18e..afbfc30 100644 --- a/src/ellphi/_tangency_cpp_impl.cpp +++ b/src/ellphi/_tangency_cpp_impl.cpp @@ -10,11 +10,36 @@ #include #include +#if defined(ELLPHI_USE_EIGEN) +#include +#include +#endif + #ifndef TANGENCY_VERSION #define TANGENCY_VERSION "0+unknown" #endif -extern "C" const char* tangency_backend_version() { return TANGENCY_VERSION; } +#ifndef TANGENCY_LINALG_KIND +#if defined(ELLPHI_USE_EIGEN) +#define TANGENCY_LINALG_KIND "eigen" +#else +#define TANGENCY_LINALG_KIND "internal" +#endif +#endif + +#if defined(_WIN32) || defined(__CYGWIN__) +#define ELLPHI_EXPORT __declspec(dllexport) +#else +#define ELLPHI_EXPORT +#endif + +ELLPHI_EXPORT extern "C" const char* tangency_backend_version() { + return TANGENCY_VERSION; +} + +ELLPHI_EXPORT extern "C" const char* tangency_linalg_kind() { + return TANGENCY_LINALG_KIND; +} namespace { @@ -74,52 +99,89 @@ struct DecodedConic { double constant; }; +// Forward declarations for optimization functions +void decode_conic_into(const std::vector& coef, DecodedConic& out); +void pencil_into(const std::vector& p, const std::vector& q, double mu, std::vector& out); +void cholesky_factor_into(const std::vector& matrix, int dim, std::vector& out); +void solve_with_cholesky_into(const std::vector& chol, const std::vector& rhs, int dim, std::vector& out); +void cholesky_factor_into_internal(const std::vector& matrix, int dim, std::vector& out); +void solve_with_cholesky_into_internal(const std::vector& chol, const std::vector& rhs, int dim, std::vector& out); +#if defined(ELLPHI_USE_EIGEN) +void cholesky_factor_into_eigen(const std::vector& matrix, int dim, std::vector& out); +void solve_with_cholesky_into_eigen(const std::vector& chol, const std::vector& rhs, int dim, std::vector& out); +#endif +void gaussian_elimination_into(std::vector matrix, std::vector rhs, int dim, std::vector& out); +void matvec_into(const std::vector& matrix, const std::vector& vec, int dim, std::vector& out); +void center_with_fallback_into(const DecodedConic& conic, std::vector& out_center, std::vector& work_rhs, std::vector& work_chol); + DecodedConic decode_conic(const std::vector& coef) { DecodedConic decoded{}; - decoded.dim = infer_dim_from_coef_length(coef.size()); - const int dim = decoded.dim; - const std::size_t quad_entries = static_cast(dim * (dim + 1) / 2); - decoded.quad.assign(static_cast(dim * dim), 0.0); - decoded.linear.assign(dim, 0.0); + decode_conic_into(coef, decoded); + return decoded; +} + +void decode_conic_into(const std::vector& coef, DecodedConic& out) { + out.dim = infer_dim_from_coef_length(coef.size()); + const int dim = out.dim; + const std::size_t quad_size = static_cast(dim * dim); + if (out.quad.size() != quad_size) { + out.quad.resize(quad_size); + } + if (out.linear.size() != static_cast(dim)) { + out.linear.resize(dim); + } + + std::fill(out.quad.begin(), out.quad.end(), 0.0); std::size_t idx = 0; for (int i = 0; i < dim; ++i) { for (int j = i; j < dim; ++j) { double value = coef[idx++]; - decoded.quad[static_cast(i * dim + j)] = value; - decoded.quad[static_cast(j * dim + i)] = value; + out.quad[static_cast(i * dim + j)] = value; + out.quad[static_cast(j * dim + i)] = value; } } for (int i = 0; i < dim; ++i) { - decoded.linear[static_cast(i)] = coef[idx++]; + out.linear[static_cast(i)] = coef[idx++]; } if (idx >= coef.size()) { raise("Coefficient vector too short to contain constant term"); } - decoded.constant = coef[idx]; + out.constant = coef[idx]; - const std::size_t expected_length = quad_entries + static_cast(dim) + 1U; + const std::size_t expected_length = idx + 1; if (coef.size() != expected_length) { raise("Coefficient length mismatch during decoding"); } - return decoded; } - std::vector pencil( const std::vector& p, const std::vector& q, double mu +) { + std::vector result(p.size()); + pencil_into(p, q, mu, result); + return result; +} + +void pencil_into( + const std::vector& p, + const std::vector& q, + double mu, + std::vector& out ) { if (p.size() != q.size()) { raise("Coefficient vectors must have the same length"); } - std::vector result(p.size(), 0.0); + if (out.size() != p.size()) { + out.resize(p.size()); + } const double alpha = 1.0 - mu; - for (std::size_t i = 0; i < result.size(); ++i) { - result[i] = alpha * p[i] + mu * q[i]; + const std::size_t n = p.size(); + for (std::size_t i = 0; i < n; ++i) { + out[i] = alpha * p[i] + mu * q[i]; } - return result; } struct SolverContext { @@ -129,6 +191,18 @@ struct SolverContext { DecodedConic q_dec; std::vector diff_coef; DecodedConic diff_dec; + + // Working buffers to avoid reallocation + std::vector work_coef; + DecodedConic work_conic; + std::vector work_chol; + std::vector work_rhs; + std::vector work_center; + std::vector work_residual; + std::vector work_solved; + double cache_mu = std::numeric_limits::quiet_NaN(); + bool cache_valid = false; + bool cache_chol_ok = false; }; SolverContext build_solver_context( @@ -144,82 +218,184 @@ SolverContext build_solver_context( decode_conic(pcoef), decode_conic(qcoef), {}, - {} + {}, + {}, {}, {}, {}, {}, {}, {} }; ctx.diff_coef.resize(pcoef.size()); for (std::size_t i = 0; i < pcoef.size(); ++i) { ctx.diff_coef[i] = pcoef[i] - qcoef[i]; } ctx.diff_dec = decode_conic(ctx.diff_coef); + + // Initialize working buffers + int dim = ctx.p_dec.dim; + ctx.work_coef.resize(pcoef.size()); + // work_conic will be resized in decode_conic_into + ctx.work_chol.resize(static_cast(dim * dim)); + ctx.work_rhs.resize(dim); + ctx.work_center.resize(dim); + ctx.work_residual.resize(dim); + ctx.work_solved.resize(dim); + return ctx; } -std::vector cholesky_factor(const std::vector& matrix, int dim) { - std::vector chol(static_cast(dim * dim), 0.0); + + +void cholesky_factor_into_internal(const std::vector& matrix, int dim, std::vector& out) { + const std::size_t size = static_cast(dim * dim); + if (out.size() != size) { + out.resize(size); + } + std::fill(out.begin(), out.end(), 0.0); + + // Pointer access for optimization + const double* mat_ptr = matrix.data(); + double* out_ptr = out.data(); + for (int i = 0; i < dim; ++i) { + double* row_i = out_ptr + i * dim; + const double* mat_row_i = mat_ptr + i * dim; + for (int j = 0; j <= i; ++j) { + double* row_j = out_ptr + j * dim; double sum = 0.0; + + // Vectorizable loop for (int k = 0; k < j; ++k) { - sum += chol[static_cast(i * dim + k)] * - chol[static_cast(j * dim + k)]; + sum += row_i[k] * row_j[k]; } + if (i == j) { - double value = matrix[static_cast(i * dim + i)] - sum; + double value = mat_row_i[i] - sum; if (value <= 0.0) { raise("Degenerate conic (determinant zero)"); } - chol[static_cast(i * dim + j)] = std::sqrt(value); + row_i[j] = std::sqrt(value); } else { - double diag = chol[static_cast(j * dim + j)]; + double diag = row_j[j]; if (diag == 0.0) { raise("Degenerate conic (determinant zero)"); } - chol[static_cast(i * dim + j)] = - (matrix[static_cast(i * dim + j)] - sum) / diag; + row_i[j] = (mat_row_i[j] - sum) / diag; } } } - return chol; } -std::vector solve_with_cholesky( + + +void solve_with_cholesky_into_internal( const std::vector& chol, const std::vector& rhs, - int dim + int dim, + std::vector& out ) { - std::vector y(dim, 0.0); + if (out.size() != static_cast(dim)) { + out.resize(dim); + } + // Forward substitution (Ly = b) + // Reuse out as y for (int i = 0; i < dim; ++i) { double sum = 0.0; for (int k = 0; k < i; ++k) { - sum += chol[static_cast(i * dim + k)] * y[static_cast(k)]; + sum += chol[static_cast(i * dim + k)] * out[static_cast(k)]; } double diag = chol[static_cast(i * dim + i)]; if (diag == 0.0) { raise("Degenerate conic (determinant zero)"); } - y[static_cast(i)] = (rhs[static_cast(i)] - sum) / diag; + out[static_cast(i)] = (rhs[static_cast(i)] - sum) / diag; } - std::vector x(dim, 0.0); + // Backward substitution (L^T x = y) + // Reuse out as x (in-place) for (int i = dim - 1; i >= 0; --i) { double sum = 0.0; for (int k = i + 1; k < dim; ++k) { - sum += chol[static_cast(k * dim + i)] * x[static_cast(k)]; + sum += chol[static_cast(k * dim + i)] * out[static_cast(k)]; } double diag = chol[static_cast(i * dim + i)]; if (diag == 0.0) { raise("Degenerate conic (determinant zero)"); } - x[static_cast(i)] = (y[static_cast(i)] - sum) / diag; + out[static_cast(i)] = (out[static_cast(i)] - sum) / diag; + } +} + +#if defined(ELLPHI_USE_EIGEN) +void cholesky_factor_into_eigen(const std::vector& matrix, int dim, std::vector& out) { + const std::size_t size = static_cast(dim * dim); + if (out.size() != size) { + out.resize(size); + } + std::fill(out.begin(), out.end(), 0.0); + + using RowMajorMat = Eigen::Matrix; + Eigen::Map mat(matrix.data(), dim, dim); + Eigen::LLT llt(mat); + if (llt.info() != Eigen::Success) { + raise("Degenerate conic (determinant zero)"); + } + const auto L = llt.matrixL(); + for (int i = 0; i < dim; ++i) { + for (int j = 0; j <= i; ++j) { + out[static_cast(i * dim + j)] = L(i, j); + } + } +} + +void solve_with_cholesky_into_eigen( + const std::vector& chol, + const std::vector& rhs, + int dim, + std::vector& out +) { + if (out.size() != static_cast(dim)) { + out.resize(dim); } - return x; + using RowMajorMat = Eigen::Matrix; + using Vec = Eigen::Matrix; + Eigen::Map L(chol.data(), dim, dim); + Eigen::Map b(rhs.data(), dim); + Eigen::Map x(out.data(), dim); + x = L.template triangularView().solve(b); + x = L.transpose().template triangularView().solve(x); +} +#endif + +void cholesky_factor_into(const std::vector& matrix, int dim, std::vector& out) { +#if defined(ELLPHI_USE_EIGEN) + cholesky_factor_into_eigen(matrix, dim, out); +#else + cholesky_factor_into_internal(matrix, dim, out); +#endif +} + +void solve_with_cholesky_into( + const std::vector& chol, + const std::vector& rhs, + int dim, + std::vector& out +) { +#if defined(ELLPHI_USE_EIGEN) + solve_with_cholesky_into_eigen(chol, rhs, dim, out); +#else + solve_with_cholesky_into_internal(chol, rhs, dim, out); +#endif } -std::vector gaussian_elimination( - std::vector matrix, - std::vector rhs, - int dim + + +void gaussian_elimination_into( + std::vector matrix, // Pass by value to copy + std::vector rhs, // Pass by value to copy + int dim, + std::vector& out ) { + if (out.size() != static_cast(dim)) { + out.resize(dim); + } for (int k = 0; k < dim; ++k) { int pivot = k; double pivot_value = std::abs(matrix[static_cast(k * dim + k)]); @@ -253,35 +429,37 @@ std::vector gaussian_elimination( } } - std::vector x(dim, 0.0); for (int i = dim - 1; i >= 0; --i) { double sum = rhs[static_cast(i)]; for (int j = i + 1; j < dim; ++j) { - sum -= matrix[static_cast(i * dim + j)] * x[static_cast(j)]; + sum -= matrix[static_cast(i * dim + j)] * out[static_cast(j)]; } double diag = matrix[static_cast(i * dim + i)]; if (diag == 0.0) { raise("Degenerate conic (determinant zero)"); } - x[static_cast(i)] = sum / diag; + out[static_cast(i)] = sum / diag; } - return x; } -std::vector matvec( + + +void matvec_into( const std::vector& matrix, const std::vector& vec, - int dim + int dim, + std::vector& out ) { - std::vector result(dim, 0.0); + if (out.size() != static_cast(dim)) { + out.resize(dim); + } for (int i = 0; i < dim; ++i) { double sum = 0.0; for (int j = 0; j < dim; ++j) { sum += matrix[static_cast(i * dim + j)] * vec[static_cast(j)]; } - result[static_cast(i)] = sum; + out[static_cast(i)] = sum; } - return result; } double quad_eval(const DecodedConic& conic, const std::vector& point) { @@ -313,56 +491,108 @@ struct PencilGeometry { }; std::vector center_with_fallback(const DecodedConic& conic) { - std::vector rhs = conic.linear; - for (double& value : rhs) { - value = -value; + std::vector center(conic.dim); + std::vector work_rhs(conic.dim); + std::vector work_chol(static_cast(conic.dim * conic.dim)); + center_with_fallback_into(conic, center, work_rhs, work_chol); + return center; +} + +void center_with_fallback_into( + const DecodedConic& conic, + std::vector& out_center, + std::vector& work_rhs, + std::vector& work_chol +) { + const int dim = conic.dim; + if (work_rhs.size() != static_cast(dim)) { + work_rhs.resize(dim); } + // Copy linear to work_rhs and negate + for(int i=0; i chol = cholesky_factor(conic.quad, conic.dim); - return solve_with_cholesky(chol, rhs, conic.dim); + cholesky_factor_into(conic.quad, dim, work_chol); + solve_with_cholesky_into(work_chol, work_rhs, dim, out_center); } catch (const std::runtime_error& ex) { if (!is_degenerate_error(ex)) { throw; } - return gaussian_elimination(conic.quad, rhs, conic.dim); + // Fallback: gaussian_elimination copies inputs, so we can pass quad and work_rhs + gaussian_elimination_into(conic.quad, work_rhs, dim, out_center); } } -PencilGeometry build_pencil_geometry(double mu, const SolverContext& ctx) { - PencilGeometry geom; - geom.conic = decode_conic(pencil(ctx.pcoef, ctx.qcoef, mu)); - geom.chol = cholesky_factor(geom.conic.quad, geom.conic.dim); - std::vector rhs = geom.conic.linear; - for (double& value : rhs) { - value = -value; +void compute_geometry_for_mu(double mu, SolverContext& ctx) { + if (ctx.cache_valid && mu == ctx.cache_mu) { + return; } - geom.center = solve_with_cholesky(geom.chol, rhs, geom.conic.dim); - return geom; + ctx.cache_valid = false; + ctx.cache_chol_ok = false; + + pencil_into(ctx.pcoef, ctx.qcoef, mu, ctx.work_coef); + decode_conic_into(ctx.work_coef, ctx.work_conic); + + const int dim = ctx.work_conic.dim; + if (ctx.work_rhs.size() != static_cast(dim)) { + ctx.work_rhs.resize(dim); + } + for (int i = 0; i < dim; ++i) { + ctx.work_rhs[i] = -ctx.work_conic.linear[i]; + } + + try { + cholesky_factor_into(ctx.work_conic.quad, dim, ctx.work_chol); + solve_with_cholesky_into(ctx.work_chol, ctx.work_rhs, dim, ctx.work_center); + ctx.cache_chol_ok = true; + } catch (const std::runtime_error& ex) { + if (!is_degenerate_error(ex)) { + throw; + } + gaussian_elimination_into(ctx.work_conic.quad, ctx.work_rhs, dim, ctx.work_center); + } + + ctx.cache_mu = mu; + ctx.cache_valid = true; } -double target(double mu, const SolverContext& ctx) { - DecodedConic conic = decode_conic(pencil(ctx.pcoef, ctx.qcoef, mu)); - std::vector center = center_with_fallback(conic); - double p_value = quad_eval(ctx.p_dec, center); - double q_value = quad_eval(ctx.q_dec, center); +double target(double mu, SolverContext& ctx) { + compute_geometry_for_mu(mu, ctx); + + double p_value = quad_eval(ctx.p_dec, ctx.work_center); + double q_value = quad_eval(ctx.q_dec, ctx.work_center); return p_value - q_value; } -double target_prime(double mu, const SolverContext& ctx) { +double target_prime(double mu, SolverContext& ctx) { try { - PencilGeometry geom = build_pencil_geometry(mu, ctx); - const int dim = geom.conic.dim; + compute_geometry_for_mu(mu, ctx); + if (!ctx.cache_chol_ok) { + return std::numeric_limits::quiet_NaN(); + } + + const int dim = ctx.work_conic.dim; + + // Now compute derivative if (ctx.diff_dec.dim != dim) { raise("Dimension mismatch while computing derivative"); } - std::vector mat_center = matvec(ctx.diff_dec.quad, geom.center, dim); - std::vector residual(dim, 0.0); + + // matvec_into(ctx.diff_dec.quad, geom.center, dim, work_residual) + matvec_into(ctx.diff_dec.quad, ctx.work_center, dim, ctx.work_residual); + + // residual = -(mat_center + diff_linear) for (int i = 0; i < dim; ++i) { - residual[static_cast(i)] = - -(mat_center[static_cast(i)] + ctx.diff_dec.linear[static_cast(i)]); + ctx.work_residual[i] = -(ctx.work_residual[i] + ctx.diff_dec.linear[i]); } - std::vector solved = solve_with_cholesky(geom.chol, residual, dim); - double dot = std::inner_product(residual.begin(), residual.end(), solved.begin(), 0.0); + + // solved = solve_with_cholesky(chol, residual) + // use work_solved + solve_with_cholesky_into(ctx.work_chol, ctx.work_residual, dim, ctx.work_solved); + + double dot = std::inner_product(ctx.work_residual.begin(), ctx.work_residual.end(), ctx.work_solved.begin(), 0.0); return 2.0 * dot; } catch (const std::runtime_error& ex) { if (is_degenerate_error(ex)) { @@ -881,12 +1111,6 @@ void copy_error(char* buffer, std::size_t size, const std::string& message) { } // namespace -#if defined(_WIN32) || defined(__CYGWIN__) -#define ELLPHI_EXPORT __declspec(dllexport) -#else -#define ELLPHI_EXPORT -#endif - ELLPHI_EXPORT extern "C" int tangency_solve( const double* pcoef, const double* qcoef, diff --git a/src/ellphi/_version.py b/src/ellphi/_version.py index 716c94e..e793082 100644 --- a/src/ellphi/_version.py +++ b/src/ellphi/_version.py @@ -1,3 +1,3 @@ """Canonical package version.""" -__version__ = "0.1.1.post1" +__version__ = "0.1.2" diff --git a/src/ellphi/ellcloud.py b/src/ellphi/ellcloud.py index e532bc4..01df549 100644 --- a/src/ellphi/ellcloud.py +++ b/src/ellphi/ellcloud.py @@ -179,6 +179,39 @@ def pdist_tangency( backend=backend, ) + def distance_matrix( + self, + *, + parallel: bool = True, + n_jobs: int | None = -1, + backend: str = "auto", + ) -> numpy.ndarray: + """Computes the square pairwise tangency distance matrix. + + This is a convenience wrapper around `pdist_tangency` that returns the + full square matrix using the same layout as + `scipy.spatial.distance.squareform`. + + Args: + parallel: If `True`, the computation is performed in parallel. + n_jobs: The number of jobs to run in parallel. See + `ellphi.solver.pdist_tangency` for more details. + backend: The backend to use for the computation. Can be one of + "auto", "python", or "cpp". + + Returns: + A square matrix of tangency distances with shape `(n, n)`. + """ + if self.n == 0: + return numpy.empty((0, 0), dtype=float) + return squareform( + self.pdist_tangency( + parallel=parallel, + n_jobs=n_jobs, + backend=backend, + ) + ) + @classmethod def from_point_cloud( cls: type[EllipseCloud], @@ -217,6 +250,47 @@ def from_point_cloud( ellcloud.rescale(method=rescaling) return ellcloud + @classmethod + def from_cov( + cls: type[EllipseCloud], + X: numpy.ndarray, + cov: numpy.ndarray, + *, + rescaling: str = "none", + ) -> EllipseCloud: + """Creates an `EllipseCloud` from centers and covariance matrices. + + This class method is the recommended entry point when ellipsoid + covariances are already known and no k-nearest-neighbour structure is + involved. + + Args: + X: An array of centers with shape `(n, d)` or a single center with + shape `(d,)`. + cov: An array of covariance matrices with shape `(n, d, d)` or a + single covariance matrix with shape `(d, d)`. + rescaling: The method to use for rescaling the ellipses. Can be + one of "none", "median", or "average". + + Returns: + An `EllipseCloud` object created from the provided centers and + covariances. + """ + centers = numpy.array(X, dtype=float, copy=True) + covariances = numpy.array(cov, dtype=float, copy=True) + + if centers.ndim == 1: + centers = centers[numpy.newaxis, :] + if covariances.ndim == 2: + covariances = covariances[numpy.newaxis, :, :] + + coefs = coef_from_cov(centers, covariances) + nbd = numpy.empty((centers.shape[0], 0), dtype=int) + ellcloud = cls(coefs, centers, covariances, k=0, nbd=nbd) + if rescaling != "none": + ellcloud.rescale(method=rescaling) + return ellcloud + @classmethod def from_local_cov( cls: type[EllipseCloud], X: numpy.ndarray, *, k: int = 5 diff --git a/src/ellphi/ellcloud.pyi b/src/ellphi/ellcloud.pyi index 9003e22..108c98d 100644 --- a/src/ellphi/ellcloud.pyi +++ b/src/ellphi/ellcloud.pyi @@ -32,6 +32,9 @@ class EllipseCloud: def pdist_tangency( self, *, parallel: bool = True, n_jobs: int | None = -1, backend: str = "auto" ) -> FloatArray: ... + def distance_matrix( + self, *, parallel: bool = True, n_jobs: int | None = -1, backend: str = "auto" + ) -> FloatArray: ... @classmethod def from_point_cloud( cls, @@ -42,6 +45,14 @@ class EllipseCloud: **kwgs: Any, ) -> EllipseCloud: ... @classmethod + def from_cov( + cls, + X: FloatArray, + cov: FloatArray, + *, + rescaling: str = "none", + ) -> EllipseCloud: ... + @classmethod def from_local_cov(cls, X: FloatArray, *, k: int = 5) -> EllipseCloud: ... def rescale(self, *, method: str = "median") -> float: ... diff --git a/src/ellphi/geometry.py b/src/ellphi/geometry.py index ed666fc..89f4dbd 100644 --- a/src/ellphi/geometry.py +++ b/src/ellphi/geometry.py @@ -1,4 +1,4 @@ -"""Geometry helpers shared across the :mod:`ellphi` package. +"""Geometry helpers shared across the `ellphi` package. This module historically provided 2D-only utilities for working with ellipses represented as quadratic forms. For the n-dimensional extension @@ -7,14 +7,14 @@ Key API (all return ``numpy.float64`` arrays): -* :func:`unit_vector` -* :func:`axes_from_cov` -* :func:`coef_from_axes` -* :func:`coef_from_cov` -* :func:`pack_conic` -* :func:`unpack_conic` -* :func:`unpack_single_conic` -* :func:`infer_dim_from_coef_length` +* [`unit_vector`][ellphi.geometry.unit_vector] +* [`axes_from_cov`][ellphi.geometry.axes_from_cov] +* [`coef_from_axes`][ellphi.geometry.coef_from_axes] +* [`coef_from_cov`][ellphi.geometry.coef_from_cov] +* [`pack_conic`][ellphi.geometry.pack_conic] +* [`unpack_conic`][ellphi.geometry.unpack_conic] +* [`unpack_single_conic`][ellphi.geometry.unpack_single_conic] +* [`infer_dim_from_coef_length`][ellphi.geometry.infer_dim_from_coef_length] """ from __future__ import annotations @@ -63,8 +63,16 @@ def axes_from_cov(cov: numpy.ndarray, /, *, scale: float = 1.0): Returns: A tuple containing the major axis, minor axis, and angle of the major - axis in radians. The major axis is always greater than or equal to the - minor axis. + axis in radians. The major axis is always greater than or equal to the + minor axis. + + Examples: + >>> import numpy as np + >>> from ellphi.geometry import axes_from_cov + >>> cov = np.array([[4.0, 0.0], [0.0, 1.0]]) + >>> r_major, r_minor, theta = axes_from_cov(cov) + >>> float(r_major), float(r_minor) + (2.0, 1.0) """ if len(cov.shape) <= 2: cov = cov[None, :, :] @@ -125,7 +133,7 @@ def infer_dim_from_coef_length(length: int) -> int: "quadratic form" ) n = (sqrt_disc - 3) // 2 - if n < 2 or ((n + 1) * (n + 2)) // 2 != length: + if n < 2 or ((n + 1) * (n + 2)) // 2 != length: # pragma: no cover raise ValueError( f"Coefficient length {length} does not correspond to a valid " "dimension" ) @@ -158,7 +166,7 @@ def pack_conic( Returns: A NumPy array of shape `(..., m)` where `m = (n + 1)(n + 2) / 2`, - representing the packed conic coefficients. + representing the packed conic coefficients. """ matrices = numpy.asarray(matrices, dtype=float) linear = numpy.asarray(linear, dtype=float) @@ -192,7 +200,8 @@ def unpack_conic( ) -> tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]: """Unpacks a flattened coefficient vector into a conic's components. - This function is the inverse of :func:`pack_conic`. It takes a flattened + This function is the inverse of + [`pack_conic`][ellphi.geometry.pack_conic]. It takes a flattened coefficient vector and returns the quadratic, linear, and constant terms of the conic's equation. @@ -201,7 +210,7 @@ def unpack_conic( Returns: A tuple containing the quadratic matrix `A`, the linear coefficients - `b`, and the constant term `c`. + `b`, and the constant term `c`. """ coef = numpy.asarray(coef, dtype=float) squeeze = False @@ -234,7 +243,8 @@ def unpack_single_conic( ) -> tuple[numpy.ndarray, numpy.ndarray, numpy.ndarray]: """Unpacks a single flattened coefficient vector into a conic's components. - This function is a convenience wrapper around :func:`unpack_conic` for a + This function is a convenience wrapper around + [`unpack_conic`][ellphi.geometry.unpack_conic] for a single conic. It accepts a coefficient array of shape `(m,)` or `(1, m)` and returns the conic's components. @@ -243,7 +253,7 @@ def unpack_single_conic( Returns: A tuple containing the quadratic matrix `A`, the linear coefficients - `b`, and the constant term `c`. + `b`, and the constant term `c`. """ matrices, linear, constant = unpack_conic(coef) if matrices.ndim == 3: @@ -294,7 +304,16 @@ def coef_from_cov( Returns: A NumPy array of packed conic coefficients with shape `(n, m)`, where - `m = (d + 1)(d + 2) / 2`. + `m = (d + 1)(d + 2) / 2`. + + Examples: + >>> import numpy as np + >>> from ellphi.geometry import coef_from_cov + >>> center = np.array([1.0, 0.0]) + >>> cov = np.array([[2.0, 0.0], [0.0, 1.0]]) + >>> coef = coef_from_cov(center, cov) + >>> coef.shape + (1, 6) """ centers = numpy.asarray(X, dtype=float) cov = numpy.asarray(cov, dtype=float) diff --git a/src/ellphi/grad.py b/src/ellphi/grad.py new file mode 100644 index 0000000..92cc0e5 --- /dev/null +++ b/src/ellphi/grad.py @@ -0,0 +1,276 @@ +"""Differentiable tangency distances and geometry helpers. + +Gradient-based optimisation support for ellphi. + +This module exposes ``tangency_grad`` (single-pair gradient), +``pdist_tangency_grad`` (batch pairwise, with VJP pullback), and +``coef_from_cov_grad`` (differentiable coefficient computation). +""" + +from __future__ import annotations + +import dataclasses +from itertools import combinations +from typing import Callable + +import numpy as np + +from .differentiable_solver import solve_mu_gradients +from .solver import tangency + +__all__ = ["TangencyGrad", "tangency_grad", "pdist_tangency_grad", "coef_from_cov_grad"] + + +@dataclasses.dataclass(slots=True, frozen=True) +class TangencyGrad: + """Tangency distance and its gradients with respect to both ellipsoids. + + Attributes: + t: Tangency distance (same as ``TangencyResult.t``). + dt_dp: Gradient of ``t`` w.r.t. ``p`` (shape ``(m,)``). + dt_dq: Gradient of ``t`` w.r.t. ``q`` (shape ``(m,)``). + """ + + t: float + dt_dp: np.ndarray + dt_dq: np.ndarray + + +def tangency_grad(p: np.ndarray, q: np.ndarray, **solver_kwargs) -> TangencyGrad: + """Return the tangency distance and its gradients w.r.t. ``p`` and ``q``. + + Uses the envelope theorem: the chain through the optimal center vanishes, + so only the explicit dependence of the pencil coefficients on ``p``/``q`` + contributes. + + Args: + p: Coefficient vector of the first ellipsoid. + q: Coefficient vector of the second ellipsoid. + **solver_kwargs: Forwarded to ``tangency()`` (e.g. ``method``, + ``backend``). + + Returns: + A [`TangencyGrad`][ellphi.grad.TangencyGrad] with ``t``, + ``dt_dp``, and ``dt_dq``. + + Raises: + ZeroDivisionError: When the pencil derivative ``∂F/∂μ`` vanishes at + the solution — which occurs for degenerate configurations such as + identical or concentric nested ellipsoids. These cases make both + the implicit-function step in `solve_mu_gradients` and the + ``1/(2t)`` factor in the gradient formula ill-defined. + Note: ``tangency()`` itself returns a small non-zero ``t`` for + such inputs (never exactly ``0.0``), so this error surfaces from + ``solve_mu_gradients`` rather than from the ``1/(2t)`` term. + """ + p = np.asarray(p, dtype=float).reshape(-1) + q = np.asarray(q, dtype=float).reshape(-1) + + res = tangency(p, q, **solver_kwargs) + mu, center, t = res.mu, res.point, res.t + + _, d_mu_dp, d_mu_dq = solve_mu_gradients(p, q, mu=mu) + + # Monomial basis evaluated at center: [x_i*x_j (i<=j), 2*x_k, 1] + tri_i, tri_j = np.triu_indices(center.shape[0]) + quad_entries = np.where( + tri_i == tri_j, + center[tri_i] ** 2, + 2.0 * center[tri_i] * center[tri_j], + ) + base = np.concatenate([quad_entries, 2.0 * center, [1.0]]) + + scalar = float(np.dot(base, q - p)) + inv2t = 0.5 / t + + return TangencyGrad( + t=t, + dt_dp=inv2t * ((1.0 - mu) * base + scalar * d_mu_dp), + dt_dq=inv2t * (mu * base + scalar * d_mu_dq), + ) + + +def pdist_tangency_grad( + coefs: np.ndarray, +) -> tuple[np.ndarray, Callable[[np.ndarray], np.ndarray]]: + """Pairwise tangency distances and a VJP (pullback) for all pairs. + + Computes the same condensed distance array as + [`pdist_tangency`][ellphi.pdist_tangency] + and additionally returns a VJP function that maps upstream gradient vectors + back to per-ellipsoid coefficient gradients. + + Args: + coefs: Array of shape ``(N, m)`` containing ``N`` ellipsoid coefficient + vectors. + + Returns: + A tuple ``(dists, vjp)`` where: + + - ``dists`` is a 1-D array of shape ``(N*(N-1)//2,)`` with pairwise + tangency distances in the same order as ``scipy.spatial.distance.pdist``. + - ``vjp`` is a callable ``(grad_dists,) -> grad_coefs`` that accumulates + upstream gradients into an array of shape ``(N, m)``. + + Examples: + >>> import numpy as np + >>> from ellphi import ellipse_cloud + >>> from ellphi.grad import pdist_tangency_grad + >>> rng = np.random.default_rng(0) + >>> cloud = ellipse_cloud(rng.standard_normal((6, 2)), k=3) + >>> dists, vjp = pdist_tangency_grad(cloud.coef) + >>> dists.shape # N*(N-1)//2 = 15 + (15,) + >>> vjp(np.ones(15)).shape # (N, m) = (6, 6) + (6, 6) + """ + coefs = np.asarray(coefs, dtype=float) + if coefs.ndim == 3 and coefs.shape[1] == 1: + coefs = coefs[:, 0, :] + if coefs.ndim != 2: + raise ValueError("Expected coefficient array with shape (N, m)") + N = len(coefs) + pairs = list(combinations(range(N), 2)) + dists = np.empty(len(pairs)) + store: list[tuple[int, int, np.ndarray, np.ndarray]] = [] + + for k, (i, j) in enumerate(pairs): + g = tangency_grad(coefs[i], coefs[j]) + dists[k] = g.t + store.append((i, j, g.dt_dp, g.dt_dq)) + + def vjp(grad_dists: np.ndarray) -> np.ndarray: + g_coefs = np.zeros_like(coefs) + for k, (i, j, dt_dp, dt_dq) in enumerate(store): + g_coefs[i] += grad_dists[k] * dt_dp + g_coefs[j] += grad_dists[k] * dt_dq + return g_coefs + + return dists, vjp + + +def coef_from_cov_grad( + X: np.ndarray, + cov: np.ndarray, + /, + *, + scale: float = 1.0, +) -> tuple[np.ndarray, Callable[[np.ndarray], tuple[np.ndarray, np.ndarray]]]: + """Converts centers and covariances to packed conic coefficients, with VJP. + + This is the differentiable version of ``coef_from_cov``. It returns the same + coefficient array plus a VJP (vector-Jacobian product) pullback function. + + Args: + X: Centers array, shape ``(n, d)`` or ``(d,)``. + cov: Covariance matrices, shape ``(n, d, d)`` or ``(d, d)``. + scale: Optional scaling factor for covariance matrices. + + Returns: + A tuple ``(coefs, vjp)`` where: + + - ``coefs``: shape ``(n, m)``, same as ``coef_from_cov`` output + - ``vjp``: callable ``(grad_coefs,) -> (grad_X, grad_cov)`` where + ``grad_X`` has shape ``(n, d)`` and ``grad_cov`` has shape ``(n, d, d)`` + """ + from .geometry import pack_conic + + centers = np.asarray(X, dtype=float) + cov_arr = np.asarray(cov, dtype=float) + + if centers.ndim == 1: + centers = centers[np.newaxis, :] + if cov_arr.ndim == 2: + cov_arr = cov_arr[np.newaxis, :, :] + + if centers.shape[0] != cov_arr.shape[0]: + raise ValueError("Mismatch between number of centres and covariance matrices") + if cov_arr.shape[-1] != cov_arr.shape[-2]: + raise ValueError("Covariance matrices must be square") + + n, d = centers.shape + + if cov_arr.shape[-1] != d: + raise ValueError("Centre dimensionality and covariance size must agree") + s2 = scale**2 + + # Forward pass – handle singular covariances the same way coef_from_cov + # does: return NaN coefficients so callers can detect degeneracy. + try: + inv_cov = np.linalg.inv(cov_arr) # (n, d, d) + except np.linalg.LinAlgError: + m = (d + 1) * (d + 2) // 2 + coefs = np.full((n, m), np.nan, dtype=float) + + def vjp_nan( + grad_coefs: np.ndarray, + ) -> tuple[np.ndarray, np.ndarray]: + return ( + np.full_like(centers, np.nan), + np.full_like(cov_arr, np.nan), + ) + + return coefs, vjp_nan + + A = inv_cov / s2 # (n, d, d) + b = -np.einsum("nij,nj->ni", A, centers) # (n, d) + c = np.einsum("ni,nij,nj->n", centers, A, centers) # (n,) + + coefs = pack_conic(A, b, c) + + # Precompute indices for unpacking + tri_i, tri_j = np.triu_indices(d) + n_quad = tri_i.size + + def vjp( + grad_coefs: np.ndarray, + ) -> tuple[np.ndarray, np.ndarray]: + gc = np.asarray(grad_coefs, dtype=float) + + # Unpack grad_coefs into grad_A_packed, grad_b, grad_c + grad_A_packed = gc[:, :n_quad] # (n, n_quad) + grad_b = gc[:, n_quad : n_quad + d] # (n, d) + grad_c = gc[:, n_quad + d] # (n,) + + # Reconstruct grad_A from upper-tri packed entries. + # pack_conic extracts A[tri_i, tri_j] (upper triangle only), so + # the gradient from packing only touches those entries. + grad_A = np.zeros((n, d, d), dtype=float) + grad_A[:, tri_i, tri_j] = grad_A_packed + + # Accumulate contributions from b = -A @ center into grad_A. + # b_k = -sum_j A[k,j] * center[j], so dL/dA[k,j] += -grad_b[k]*center[j] + # This contribution is for the FULL matrix (not just upper triangle). + grad_A += -np.einsum("ni,nj->nij", grad_b, centers) + + # Accumulate contributions from c = center^T A center into grad_A. + # c = sum_{i,j} center[i] A[i,j] center[j], so + # dL/dA[i,j] += grad_c * center[i] * center[j] + grad_A += grad_c[:, None, None] * np.einsum("ni,nj->nij", centers, centers) + + # A is parameterized by symmetric covariances, so project the + # unconstrained matrix gradient back onto the symmetric subspace before + # exposing grad_cov or differentiating through inv(cov). + grad_A = 0.5 * (grad_A + np.swapaxes(grad_A, -2, -1)) + + # --- grad w.r.t. centers --- + # From b = -A @ center: grad_center += -A^T @ grad_b + grad_centers = -np.einsum("nji,nj->ni", A, grad_b) + # From c = center^T A center: grad_center += 2 * A @ center * grad_c + # = -2 * b * grad_c + grad_centers += -2.0 * b * grad_c[:, None] + + # --- grad w.r.t. cov (via A = inv(cov)/s^2) --- + # A = inv(cov) / s^2 + # dA = -inv(cov) @ dCov @ inv(cov) / s^2 + # = tr(grad_A^T (-inv(cov) dCov inv(cov) / s^2)) + # = -1/s^2 * tr(inv(cov)^T grad_A^T inv(cov)^T dCov) + # Since inv(cov) and grad_A are symmetric: + # grad_cov = -inv(cov) @ grad_A @ inv(cov) / s^2 + # = -s^2 A @ grad_A @ s^2 A / s^2 + # = -s^2 * A @ grad_A @ A + grad_cov = -s2 * np.einsum("nij,njk,nkl->nil", A, grad_A, A) + + return grad_centers, grad_cov + + return coefs, vjp diff --git a/src/ellphi/solver.py b/src/ellphi/solver.py index ec7bd3c..9c58c8c 100644 --- a/src/ellphi/solver.py +++ b/src/ellphi/solver.py @@ -2,12 +2,14 @@ """Tangency solver dispatching between Python and C++ backends.""" +from dataclasses import dataclass from typing import Iterable, Tuple, cast, get_args import numpy from . import _solver_python as _py from . import _tangency_cpp as _cpp +from ._version import __version__ from .geometry import infer_dim_from_coef_length __all__ = [ @@ -20,6 +22,9 @@ "tangency_python", "pdist_tangency_python", "has_cpp_backend", + "cpp_linalg_kind", + "BuildInfo", + "build_info", "MethodName", ] @@ -40,7 +45,26 @@ BackendLiteral = tuple[str, ...] -_BACKEND_NAMES: BackendLiteral = ("auto", "python", "cpp") +_BACKEND_CHOICES: BackendLiteral = ("auto", "python", "cpp") + + +@dataclass(frozen=True) +class BuildInfo: + """Summary of solver backends and C++ build details. + + Notes: + - ``backend_choices`` are the accepted values for the ``backend`` argument + in solver functions ("auto", "python", "cpp"). + - ``cpp_linalg_kind`` reports the linear algebra implementation used by the + C++ implementation ("eigen" or "internal"). + """ + + version: str + backend_choices: tuple[str, ...] + backend_default: str + cpp_backend_available: bool + cpp_linalg_kind: str | None + cpp_backend_version: str | None def has_cpp_backend() -> bool: @@ -52,6 +76,28 @@ def has_cpp_backend() -> bool: return _cpp.is_available() +def cpp_linalg_kind() -> str | None: + """Return the C++ linear algebra build kind. + + Returns: + The linear algebra kind ("eigen" or "internal") if the C++ backend is + available, otherwise `None`. + """ + return _cpp.linalg_kind() + + +def build_info() -> BuildInfo: + """Return build information for solver selection and C++ backend details.""" + return BuildInfo( + version=__version__, + backend_choices=_BACKEND_CHOICES, + backend_default="auto", + cpp_backend_available=has_cpp_backend(), + cpp_linalg_kind=cpp_linalg_kind(), + cpp_backend_version=_cpp.backend_version(), + ) + + def _extract_coef_array(ellcloud: Iterable[numpy.ndarray]) -> numpy.ndarray: coef = getattr(ellcloud, "coef", ellcloud) array = numpy.asarray(coef, dtype=float) @@ -64,9 +110,10 @@ def _extract_coef_array(ellcloud: Iterable[numpy.ndarray]) -> numpy.ndarray: def _should_use_cpp(backend: str) -> bool: - if backend not in _BACKEND_NAMES: + if backend not in _BACKEND_CHOICES: raise ValueError( - f"Unknown backend '{backend}'. Expected one of {', '.join(_BACKEND_NAMES)}" + "Unknown backend " + f"'{backend}'. Expected one of {', '.join(_BACKEND_CHOICES)}" ) if backend == "cpp": if not has_cpp_backend(): @@ -129,10 +176,7 @@ def tangency( falls back to the high-precision Brent's method. Returns: - A `TangencyResult` named tuple with the following fields: - - `t`: The tangency time. - - `point`: The tangent point. - - `mu`: The pencil parameter `μ` at which the two ellipses are tangent. + A `TangencyResult` containing the tangency time, point, and pencil parameter. """ method_literal = _normalize_method(method) pcoef_arr = numpy.asarray(pcoef, dtype=float).reshape(-1) @@ -164,9 +208,10 @@ def tangency( default_newton if hybrid_newton_maxiter is None else hybrid_newton_maxiter ) - if backend not in _BACKEND_NAMES: + if backend not in _BACKEND_CHOICES: raise ValueError( - f"Unknown backend '{backend}'. Expected one of {', '.join(_BACKEND_NAMES)}" + "Unknown backend " + f"'{backend}'. Expected one of {', '.join(_BACKEND_CHOICES)}" ) use_cpp = backend in {"cpp", "auto"} and _should_use_cpp(backend) @@ -214,9 +259,10 @@ def pdist_tangency( Returns: A condensed distance matrix of tangency distances. """ - if backend not in _BACKEND_NAMES: + if backend not in _BACKEND_CHOICES: raise ValueError( - f"Unknown backend '{backend}'. Expected one of {', '.join(_BACKEND_NAMES)}" + "Unknown backend " + f"'{backend}'. Expected one of {', '.join(_BACKEND_CHOICES)}" ) if backend in {"cpp", "auto"}: diff --git a/src/ellphi/solver.pyi b/src/ellphi/solver.pyi index d66d155..9c0101b 100644 --- a/src/ellphi/solver.pyi +++ b/src/ellphi/solver.pyi @@ -1,3 +1,4 @@ +from dataclasses import dataclass from typing import Iterable, Tuple from ellphi import FloatArray from ._solver_python import TangencyResult, MethodName @@ -12,6 +13,9 @@ __all__ = [ "tangency_python", "pdist_tangency_python", "has_cpp_backend", + "cpp_linalg_kind", + "BuildInfo", + "build_info", "MethodName", ] @@ -33,6 +37,17 @@ def pdist_tangency_python( BackendLiteral = Tuple[str, ...] def has_cpp_backend() -> bool: ... +def cpp_linalg_kind() -> str | None: ... +@dataclass(frozen=True) +class BuildInfo: + version: str + backend_choices: Tuple[str, ...] + backend_default: str + cpp_backend_available: bool + cpp_linalg_kind: str | None + cpp_backend_version: str | None + +def build_info() -> BuildInfo: ... def tangency( pcoef: FloatArray, qcoef: FloatArray, diff --git a/src/ellphi/visualization.py b/src/ellphi/visualization.py index 8946f30..5f4f83c 100644 --- a/src/ellphi/visualization.py +++ b/src/ellphi/visualization.py @@ -29,15 +29,23 @@ def ellipse_patch(X, r_major=1, r_minor=1, theta=0, *, cov=None, scale=1, **kwgs Returns: A `matplotlib.patches.Ellipse` object. + + Examples: + >>> import matplotlib.pyplot as plt + >>> from ellphi.visualization import ellipse_patch + >>> patch = ellipse_patch([0, 0], r_major=2.0, r_minor=1.0, theta=0.0) + >>> type(patch).__name__ + 'Ellipse' """ if cov is not None: r_major, r_minor, theta = axes_from_cov(cov) + if "facecolor" not in kwgs and "fc" not in kwgs: + kwgs["facecolor"] = "none" ellipse = plt.matplotlib.patches.Ellipse( X, width=2 * r_major * scale, height=2 * r_minor * scale, angle=numpy.degrees(theta), - facecolor="none", **kwgs, ) return ellipse diff --git a/tests/test_cli.py b/tests/test_cli.py index ea749a3..0697b8e 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -1,5 +1,6 @@ """Tests for the ellphi CLI.""" +import runpy import unittest.mock from contextlib import redirect_stdout import io @@ -17,6 +18,26 @@ def test_cli_version(): assert output == version_info() +def test_cli_build_info(): + """Test the --build-info argument.""" + with unittest.mock.patch("sys.argv", ["ellphi", "--build-info"]): + with io.StringIO() as buf, redirect_stdout(buf): + _main() + output = buf.getvalue().strip().splitlines() + assert len(output) == 1 + assert output[0].startswith("BuildInfo(") + + +def test_cli_version_and_build_info(): + """Test --version and --build-info together.""" + with unittest.mock.patch("sys.argv", ["ellphi", "--version", "--build-info"]): + with io.StringIO() as buf, redirect_stdout(buf): + _main() + output = buf.getvalue().strip().splitlines() + assert output[0] == version_info() + assert output[1].startswith("BuildInfo(") + + def test_cli_help(): """Test the --help argument.""" with unittest.mock.patch("sys.argv", ["ellphi", "--help"]): @@ -34,3 +55,12 @@ def test_cli_no_args(): _main() output = buf.getvalue() assert "usage: ellphi" in output + + +def test_cli_module_entrypoint(): + """Test running the module entry point.""" + with unittest.mock.patch("sys.argv", ["ellphi", "--version"]): + with io.StringIO() as buf, redirect_stdout(buf): + runpy.run_module("ellphi", run_name="__main__") + output = buf.getvalue().strip() + assert output == version_info() diff --git a/tests/test_coef_from_cov_grad.py b/tests/test_coef_from_cov_grad.py new file mode 100644 index 0000000..367f029 --- /dev/null +++ b/tests/test_coef_from_cov_grad.py @@ -0,0 +1,228 @@ +"""Tests for ellphi.grad.coef_from_cov_grad.""" + +from __future__ import annotations + +import numpy as np +import pytest + +from ellphi import coef_from_cov_grad +from ellphi.geometry import coef_from_cov + +from .factories import random_covariance + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _numerical_jacobian_X(centers, covs, scale, h=1e-6): + """Central FD Jacobian of coef_from_cov w.r.t. centers.""" + n, d = centers.shape + coefs0 = coef_from_cov(centers, covs, scale=scale) + m = coefs0.shape[-1] + jac = np.zeros((n, m, n, d)) + for i in range(n): + for j in range(d): + X_plus = centers.copy() + X_plus[i, j] += h + X_minus = centers.copy() + X_minus[i, j] -= h + c_plus = coef_from_cov(X_plus, covs, scale=scale) + c_minus = coef_from_cov(X_minus, covs, scale=scale) + jac[:, :, i, j] = (c_plus - c_minus) / (2 * h) + return jac + + +def _numerical_jacobian_cov(centers, covs, scale, h=1e-6): + """Central FD Jacobian of coef_from_cov w.r.t. cov entries. + + Perturbs each entry of the symmetric covariance matrix while maintaining + symmetry. For the symmetric parameterization, we perturb both (j,k) and + (k,j) together and split the off-diagonal derivative evenly across the + returned matrix entries. + """ + n, d = centers.shape + coefs0 = coef_from_cov(centers, covs, scale=scale) + m = coefs0.shape[-1] + jac = np.zeros((n, m, n, d, d)) + for i in range(n): + for j in range(d): + for k in range(j, d): + cov_plus = covs.copy() + cov_plus[i, j, k] += h + if j != k: + cov_plus[i, k, j] += h + cov_minus = covs.copy() + cov_minus[i, j, k] -= h + if j != k: + cov_minus[i, k, j] -= h + c_plus = coef_from_cov(centers, cov_plus, scale=scale) + c_minus = coef_from_cov(centers, cov_minus, scale=scale) + deriv = (c_plus - c_minus) / (2 * h) + if j == k: + jac[:, :, i, j, k] = deriv + else: + jac[:, :, i, j, k] = 0.5 * deriv + jac[:, :, i, k, j] = 0.5 * deriv + return jac + + +def _check_vjp_against_fd(centers, covs, scale, rng): + """Check VJP matches numerical Jacobian for given inputs.""" + n, d = centers.shape + + coefs, vjp = coef_from_cov_grad(centers, covs, scale=scale) + m = coefs.shape[-1] + + # Check forward pass matches coef_from_cov + ref = coef_from_cov(centers, covs, scale=scale) + np.testing.assert_allclose(coefs, ref, atol=1e-12) + + # Random upstream gradient + g_coefs = rng.standard_normal((n, m)) + grad_X, grad_cov = vjp(g_coefs) + + # --- Check grad_X via FD --- + jac_X = _numerical_jacobian_X(centers, covs, scale) + # Expected grad_X[i, j] = sum over (a, b) of g_coefs[a, b] * jac_X[a, b, i, j] + expected_grad_X = np.einsum("ab,abij->ij", g_coefs, jac_X) + np.testing.assert_allclose(grad_X, expected_grad_X, rtol=1e-5, atol=1e-8) + + # --- Check grad_cov via FD --- + np.testing.assert_allclose(grad_cov, np.swapaxes(grad_cov, -2, -1), atol=1e-12) + jac_cov = _numerical_jacobian_cov(centers, covs, scale) + expected_grad_cov = np.einsum("ab,abijk->ijk", g_coefs, jac_cov) + np.testing.assert_allclose(grad_cov, expected_grad_cov, rtol=1e-5, atol=1e-8) + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_forward_matches_coef_from_cov_d2(rng): + """Forward pass matches coef_from_cov for d=2.""" + centers = rng.uniform(-5, 5, size=(3, 2)) + covs = np.stack([random_covariance(rng, dim=2) for _ in range(3)]) + coefs, _ = coef_from_cov_grad(centers, covs) + ref = coef_from_cov(centers, covs) + np.testing.assert_allclose(coefs, ref, atol=1e-12) + + +def test_vjp_d2_identity_cov(rng): + """VJP correct for d=2 with identity covariance.""" + centers = rng.uniform(-5, 5, size=(2, 2)) + covs = np.stack([np.eye(2)] * 2) + _check_vjp_against_fd(centers, covs, scale=1.0, rng=rng) + + +def test_vjp_d2_random_cov(rng): + """VJP correct for d=2 with random covariances.""" + centers = rng.uniform(-5, 5, size=(3, 2)) + covs = np.stack([random_covariance(rng, dim=2) for _ in range(3)]) + _check_vjp_against_fd(centers, covs, scale=1.0, rng=rng) + + +def test_vjp_d3(rng): + """VJP correct for d=3.""" + centers = rng.uniform(-5, 5, size=(2, 3)) + covs = np.stack([random_covariance(rng, dim=3) for _ in range(2)]) + _check_vjp_against_fd(centers, covs, scale=1.0, rng=rng) + + +def test_vjp_rotated_cov(rng): + """VJP correct for non-identity covariance with rotation (d=2).""" + angle = rng.uniform(0, np.pi) + cos, sin = np.cos(angle), np.sin(angle) + rot = np.array([[cos, -sin], [sin, cos]]) + diag = np.diag([3.0, 0.5]) + cov = rot @ diag @ rot.T + + centers = rng.uniform(-5, 5, size=(2, 2)) + covs = np.stack([cov, cov]) + _check_vjp_against_fd(centers, covs, scale=1.0, rng=rng) + + +def test_vjp_with_scale(rng): + """VJP correct for non-unit scale values.""" + centers = rng.uniform(-5, 5, size=(2, 2)) + covs = np.stack([random_covariance(rng, dim=2) for _ in range(2)]) + for scale in [0.5, 2.0, 3.7]: + _check_vjp_against_fd(centers, covs, scale=scale, rng=rng) + + +def test_vjp_single_ellipsoid(rng): + """VJP works for a single ellipsoid (d,) input.""" + center = rng.uniform(-5, 5, size=(2,)) + cov = random_covariance(rng, dim=2) + + coefs, vjp = coef_from_cov_grad(center, cov) + ref = coef_from_cov(center, cov) + np.testing.assert_allclose(coefs, ref, atol=1e-12) + + m = coefs.shape[-1] + g = rng.standard_normal((1, m)) + grad_X, grad_cov = vjp(g) + assert grad_X.shape == (1, 2) + assert grad_cov.shape == (1, 2, 2) + + +def test_vjp_d4(rng): + """VJP correct for d=4 (higher dimension).""" + centers = rng.uniform(-3, 3, size=(2, 4)) + covs = np.stack([random_covariance(rng, dim=4) for _ in range(2)]) + _check_vjp_against_fd(centers, covs, scale=1.0, rng=rng) + + +def test_grad_shapes(rng): + """Output shapes are correct.""" + n, d = 4, 3 + centers = rng.uniform(-5, 5, size=(n, d)) + covs = np.stack([random_covariance(rng, dim=d) for _ in range(n)]) + + coefs, vjp = coef_from_cov_grad(centers, covs) + m = (d + 1) * (d + 2) // 2 + assert coefs.shape == (n, m) + + g = rng.standard_normal((n, m)) + grad_X, grad_cov = vjp(g) + assert grad_X.shape == (n, d) + assert grad_cov.shape == (n, d, d) + + +# --------------------------------------------------------------------------- +# Input validation +# --------------------------------------------------------------------------- + + +def test_batch_size_mismatch(): + """Mismatched centre/covariance batch sizes raise ValueError.""" + with pytest.raises(ValueError, match="Mismatch"): + coef_from_cov_grad(np.zeros((3, 2)), np.eye(2)[np.newaxis]) + + +def test_non_square_cov(): + """Non-square covariance raises ValueError.""" + with pytest.raises(ValueError, match="square"): + coef_from_cov_grad(np.zeros((2, 2)), np.zeros((2, 3, 2))) + + +def test_dimension_mismatch(): + """Centre/covariance dimension mismatch raises ValueError.""" + with pytest.raises(ValueError, match="dimensionality"): + coef_from_cov_grad(np.zeros((2, 2)), np.eye(3)[np.newaxis].repeat(2, axis=0)) + + +def test_singular_cov_returns_nan(): + """Singular covariance returns NaN coefficients, matching coef_from_cov.""" + centers = np.zeros((1, 2)) + cov_sing = np.zeros((1, 2, 2)) + + coefs, vjp = coef_from_cov_grad(centers, cov_sing) + ref = coef_from_cov(centers, cov_sing) + np.testing.assert_array_equal(np.isnan(coefs), np.isnan(ref)) + + grad_X, grad_cov = vjp(np.ones_like(coefs)) + assert np.all(np.isnan(grad_X)) + assert np.all(np.isnan(grad_cov)) diff --git a/tests/test_cpp_backend.py b/tests/test_cpp_backend.py index 9a95b96..5e3f03a 100644 --- a/tests/test_cpp_backend.py +++ b/tests/test_cpp_backend.py @@ -1,8 +1,12 @@ from __future__ import annotations +import types + import numpy import pytest +import ellphi._tangency_cpp as _cpp +from ellphi import build_info, cpp_linalg_kind from ellphi.geometry import coef_from_cov from ellphi.solver import ( has_cpp_backend, @@ -24,6 +28,55 @@ def example_coefficients(): return numpy.stack([p, q, r], axis=0) +def test_build_info(): + info = build_info() + assert info.version + assert info.backend_default == "auto" + assert info.backend_choices == ("auto", "python", "cpp") + assert info.cpp_backend_available == has_cpp_backend() + assert info.cpp_linalg_kind == cpp_linalg_kind() + if has_cpp_backend(): + assert info.cpp_linalg_kind in {"eigen", "internal"} + assert info.cpp_backend_version is not None + else: + assert info.cpp_linalg_kind is None + assert info.cpp_backend_version is None + + +def test_cpp_linalg_kind_missing_backend(monkeypatch): + monkeypatch.setattr(_cpp, "_LIB", None) + assert _cpp.is_available() is False + assert _cpp.linalg_kind() is None + assert _cpp.backend_version() is None + + +def test_cpp_linalg_kind_missing_symbol(monkeypatch): + monkeypatch.setattr(_cpp, "_LIB", types.SimpleNamespace()) + with pytest.raises(RuntimeError, match="linear algebra metadata"): + _cpp.linalg_kind() + + +def test_cpp_linalg_kind_empty_value(monkeypatch): + def _linalg_kind(): + return None + + monkeypatch.setattr( + _cpp, "_LIB", types.SimpleNamespace(tangency_linalg_kind=_linalg_kind) + ) + with pytest.raises(RuntimeError, match="empty linear algebra kind"): + _cpp.linalg_kind() + + +def test_cpp_linalg_kind_dummy_value(monkeypatch): + def _linalg_kind(): + return b"eigen" + + monkeypatch.setattr( + _cpp, "_LIB", types.SimpleNamespace(tangency_linalg_kind=_linalg_kind) + ) + assert _cpp.linalg_kind() == "eigen" + + @pytest.mark.skipif(not has_cpp_backend(), reason="C++ backend not available") def test_tangency_cpp_matches_python(example_coefficients): p, q, _ = example_coefficients diff --git a/tests/test_cpp_backend_edge_cases.py b/tests/test_cpp_backend_edge_cases.py new file mode 100644 index 0000000..5739740 --- /dev/null +++ b/tests/test_cpp_backend_edge_cases.py @@ -0,0 +1,160 @@ +import types +from importlib.metadata import PackageNotFoundError +from pathlib import Path + +import numpy as np +import pytest + +import ellphi._tangency_cpp as _cpp + + +def test_library_suffix_prefers_sysconfig(monkeypatch): + monkeypatch.setattr(_cpp.sysconfig, "get_config_var", lambda _: ".pyd") + assert _cpp._library_suffix() == ".pyd" + + +@pytest.mark.parametrize( + "platform, expected", + [ + ("win32", ".dll"), + ("darwin", ".dylib"), + ("linux", ".so"), + ], +) +def test_library_suffix_platform_fallback(monkeypatch, platform, expected): + monkeypatch.setattr(_cpp.sysconfig, "get_config_var", lambda _: None) + monkeypatch.setattr(_cpp.sys, "platform", platform) + assert _cpp._library_suffix() == expected + + +def test_expected_backend_version_uses_package_metadata(monkeypatch): + monkeypatch.setattr(_cpp, "__version__", "0+unknown") + monkeypatch.setattr(_cpp, "package_version", lambda _: "9.9.9") + assert _cpp._expected_backend_version() == "9.9.9" + + +def test_expected_backend_version_falls_back_on_missing_package(monkeypatch): + monkeypatch.setattr(_cpp, "__version__", "0+unknown") + + def raise_not_found(_: str) -> str: + raise PackageNotFoundError + + monkeypatch.setattr(_cpp, "package_version", raise_not_found) + assert _cpp._expected_backend_version() == "0+unknown" + + +def test_library_version_requires_metadata(): + with pytest.raises(RuntimeError, match="version metadata"): + _cpp._library_version(types.SimpleNamespace()) + + +def test_library_version_rejects_empty_value(): + def version_func(): + return None + + lib = types.SimpleNamespace(tangency_backend_version=version_func) + with pytest.raises(RuntimeError, match="empty version string"): + _cpp._library_version(lib) + + +def test_library_version_decodes_bytes(): + def version_func(): + return b"1.2.3" + + lib = types.SimpleNamespace(tangency_backend_version=version_func) + assert _cpp._library_version(lib) == "1.2.3" + + +def test_validate_library_version_reports_mismatch(monkeypatch): + monkeypatch.setattr(_cpp, "_expected_backend_version", lambda: "expected") + monkeypatch.setattr(_cpp, "_library_version", lambda _: "actual") + with pytest.raises(RuntimeError, match="version mismatch"): + _cpp._validate_library_version(object()) + + +def test_load_library_raises_on_missing_file(monkeypatch, tmp_path): + missing = tmp_path / "missing.so" + monkeypatch.setattr(_cpp, "_library_path", lambda: Path(missing)) + with pytest.raises(FileNotFoundError, match="library missing"): + _cpp._load_library() + + +def test_ensure_available_uses_error_message(monkeypatch): + monkeypatch.setattr(_cpp, "_LIB", None) + monkeypatch.setattr(_cpp, "_LIB_ERROR", "boom") + with pytest.raises(RuntimeError, match="boom"): + _cpp._ensure_available() + + +def test_ensure_available_defaults_message(monkeypatch): + monkeypatch.setattr(_cpp, "_LIB", None) + monkeypatch.setattr(_cpp, "_LIB_ERROR", None) + with pytest.raises(RuntimeError, match="C\\+\\+ backend not available"): + _cpp._ensure_available() + + +@pytest.mark.parametrize( + "message, exc_type", + [ + ("x0 must be provided for Newton method", ValueError), + ("Degenerate conic", ZeroDivisionError), + ("other", RuntimeError), + ("", RuntimeError), + ], +) +def test_raise_backend_error(message, exc_type): + with pytest.raises(exc_type): + _cpp._raise_backend_error(message) + + +def test_tangency_rejects_non_1d_inputs(monkeypatch): + def tangency_solve(*_args, **_kwargs): + return 0 + + dummy_lib = types.SimpleNamespace(tangency_solve=tangency_solve) + monkeypatch.setattr(_cpp, "_ensure_available", lambda: dummy_lib) + pcoef = np.zeros((1, 6)) + qcoef = np.zeros((6,)) + with pytest.raises(ValueError, match="one-dimensional"): + _cpp.tangency( + pcoef, + qcoef, + method="brentq", + bracket=(0.0, 1.0), + x0=None, + hybrid_bracket_maxiter=1, + hybrid_newton_maxiter=1, + failsafe=True, + ) + + +def test_tangency_rejects_shape_mismatch(monkeypatch): + def tangency_solve(*_args, **_kwargs): + return 0 + + dummy_lib = types.SimpleNamespace(tangency_solve=tangency_solve) + monkeypatch.setattr(_cpp, "_ensure_available", lambda: dummy_lib) + pcoef = np.zeros((6,)) + qcoef = np.zeros((7,)) + with pytest.raises(ValueError, match="same length"): + _cpp.tangency( + pcoef, + qcoef, + method="brentq", + bracket=(0.0, 1.0), + x0=None, + hybrid_bracket_maxiter=1, + hybrid_newton_maxiter=1, + failsafe=True, + ) + + +def test_pdist_tangency_rejects_invalid_shape(monkeypatch): + def pdist_tangency(*_args, **_kwargs): + return 0 + + dummy_lib = types.SimpleNamespace(pdist_tangency=pdist_tangency) + monkeypatch.setattr(_cpp, "_ensure_available", lambda: dummy_lib) + coef = np.zeros((6,)) + with pytest.raises(ValueError, match="shape \\(m, n\\)"): + _cpp.pdist_tangency(coef) diff --git a/tests/test_differentiable_solver.py b/tests/test_differentiable_solver.py index e49775e..0b9ba39 100644 --- a/tests/test_differentiable_solver.py +++ b/tests/test_differentiable_solver.py @@ -1,6 +1,8 @@ import numpy as np import pytest +from types import SimpleNamespace +import ellphi.differentiable_solver as diff_solver from ellphi.differentiable_solver import ( solve_mu_gradients, solve_mu_numerical_diff, @@ -96,3 +98,18 @@ def test_analytic_gradients_high_dimension(rng): mu_direct = solve_mu(p, q) assert mu == pytest.approx(mu_direct) + + +def test_solve_mu_gradients_rejects_zero_derivative(monkeypatch, rng): + p, q = random_coef_pair(rng) + + def fake_pencil(*_args, **_kwargs): + return SimpleNamespace(center=np.zeros(2)) + + monkeypatch.setattr(diff_solver, "build_tangent_pencil", fake_pencil) + monkeypatch.setattr(diff_solver, "target_prime_from_pencil", lambda *_args: 0.0) + + with pytest.raises( + ZeroDivisionError, match="Derivative with respect to mu is numerically zero" + ): + diff_solver.solve_mu_gradients(p, q, mu=0.5) diff --git a/tests/test_ellcloud.py b/tests/test_ellcloud.py index 0e362ce..0a3f5a8 100644 --- a/tests/test_ellcloud.py +++ b/tests/test_ellcloud.py @@ -1,8 +1,13 @@ import numpy as np import pytest +import matplotlib.pyplot as plt +from scipy.spatial.distance import squareform from ellphi.ellcloud import EllipseCloud -from ellphi.geometry import coef_from_cov +from ellphi.geometry import coef_from_axes, coef_from_cov +from ellphi.solver import pdist_tangency + +from .factories import random_cloud def test_local_cov_uses_actual_neighbourhood_size(): @@ -96,6 +101,179 @@ def test_post_init_value_errors(): EllipseCloud(coef, mean, cov, 2, np.zeros((3, 2))) +def test_post_init_validates_mean_shape(): + coef = np.stack( + [ + coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0), + coef_from_axes([1.0, 0.5], 1.5, 1.2, 0.3), + ], + axis=0, + ) + mean = np.zeros((3, 2)) + cov = np.stack([np.eye(2), np.eye(2)], axis=0) + nbd = np.zeros((2, 0), dtype=int) + with pytest.raises(ValueError, match="Mean array has shape"): + EllipseCloud(coef, mean, cov, k=0, nbd=nbd) + + +def test_post_init_validates_cov_shape(): + coef = np.stack( + [ + coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0), + coef_from_axes([1.0, 0.5], 1.5, 1.2, 0.3), + ], + axis=0, + ) + mean = np.zeros((2, 2)) + cov = np.zeros((2, 3, 3)) + nbd = np.zeros((2, 0), dtype=int) + with pytest.raises(ValueError, match="Covariance array has shape"): + EllipseCloud(coef, mean, cov, k=0, nbd=nbd) + + +def test_post_init_validates_neighbourhood_shape(): + coef = np.stack( + [ + coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0), + coef_from_axes([1.0, 0.5], 1.5, 1.2, 0.3), + ], + axis=0, + ) + mean = np.zeros((2, 2)) + cov = np.stack([np.eye(2), np.eye(2)], axis=0) + nbd = np.zeros((3, 1), dtype=int) + with pytest.raises(ValueError, match="Neighbourhood index array"): + EllipseCloud(coef, mean, cov, k=0, nbd=nbd) + + +def test_iter_returns_coefficients(): + coef = np.stack( + [ + coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0), + coef_from_axes([1.0, 0.5], 1.5, 1.2, 0.3), + ], + axis=0, + ) + mean = np.zeros((2, 2)) + cov = np.stack([np.eye(2), np.eye(2)], axis=0) + nbd = np.zeros((2, 0), dtype=int) + cloud = EllipseCloud(coef, mean, cov, k=0, nbd=nbd) + first = next(iter(cloud)) + np.testing.assert_allclose(first, coef[0]) + + +def test_plot_creates_axes_and_patches(): + coef = np.stack( + [ + coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0), + coef_from_axes([1.0, 0.5], 1.5, 1.2, 0.3), + ], + axis=0, + ) + mean = np.array([[0.0, 0.0], [1.0, 0.5]]) + cov = np.stack([np.eye(2), np.eye(2)], axis=0) + nbd = np.zeros((2, 0), dtype=int) + cloud = EllipseCloud(coef, mean, cov, k=0, nbd=nbd) + ax = cloud.plot() + assert len(ax.patches) == 2 + plt.close(ax.figure) + + +def test_from_cov_accepts_single_2d_sample(): + center = np.array([1.0, 2.0]) + cov = np.array([[2.0, 0.1], [0.1, 1.5]]) + + cloud = EllipseCloud.from_cov(center, cov) + + assert cloud.k == 0 + assert cloud.n == 1 + assert cloud.nbd.shape == (1, 0) + np.testing.assert_allclose(cloud.mean, center[np.newaxis, :]) + np.testing.assert_allclose(cloud.cov, cov[np.newaxis, :, :]) + np.testing.assert_allclose(cloud.coef, coef_from_cov(center, cov)) + + +def test_from_cov_matches_manual_constructor_3d(rng): + expected = random_cloud(rng, n_ellipses=4, dim=3) + + cloud = EllipseCloud.from_cov(expected.mean, expected.cov) + + assert cloud.k == 0 + assert cloud.nbd.shape == (expected.n, 0) + np.testing.assert_allclose(cloud.mean, expected.mean) + np.testing.assert_allclose(cloud.cov, expected.cov) + np.testing.assert_allclose(cloud.coef, expected.coef) + + +@pytest.mark.parametrize("method", ["median", "average"]) +def test_from_cov_rescaling_matches_manual_rescale(rng, method): + original = random_cloud(rng, n_ellipses=5) + manual = EllipseCloud( + coef=original.coef.copy(), + mean=original.mean.copy(), + cov=original.cov.copy(), + k=0, + nbd=np.empty((original.n, 0), dtype=int), + ) + manual.rescale(method=method) + + cloud = EllipseCloud.from_cov( + original.mean.copy(), + original.cov.copy(), + rescaling=method, + ) + + np.testing.assert_allclose(cloud.mean, manual.mean) + np.testing.assert_allclose(cloud.cov, manual.cov) + np.testing.assert_allclose(cloud.coef, manual.coef) + + +def test_pdist_tangency_wrapper_matches_solver(rng): + cloud = random_cloud(rng, n_ellipses=4) + wrapper = cloud.pdist_tangency(backend="python", parallel=False) + direct = pdist_tangency(cloud, backend="python", parallel=False) + np.testing.assert_allclose(wrapper, direct) + + +def test_distance_matrix_matches_squareform(rng): + cloud = random_cloud(rng, n_ellipses=4) + + matrix = cloud.distance_matrix(backend="python", parallel=False) + expected = squareform(cloud.pdist_tangency(backend="python", parallel=False)) + + assert matrix.shape == (cloud.n, cloud.n) + np.testing.assert_allclose(matrix, expected) + + +def test_distance_matrix_empty_cloud_returns_empty_square(): + cloud = EllipseCloud( + coef=np.empty((0, 6), dtype=float), + mean=np.empty((0, 2), dtype=float), + cov=np.empty((0, 2, 2), dtype=float), + k=0, + nbd=np.empty((0, 0), dtype=int), + ) + + matrix = cloud.distance_matrix() + + assert matrix.shape == (0, 0) + + +def test_from_cov_rescaling_does_not_mutate_inputs(rng): + original = random_cloud(rng, n_ellipses=5) + means = original.mean.copy() + covs = original.cov.copy() + means_before = means.copy() + covs_before = covs.copy() + + cloud = EllipseCloud.from_cov(means, covs, rescaling="median") + + np.testing.assert_allclose(means, means_before) + np.testing.assert_allclose(covs, covs_before) + assert not np.shares_memory(cloud.mean, means) + assert not np.shares_memory(cloud.cov, covs) + + def test_str_method(): X = np.array([[0.0, 0.0], [1.0, 1.0], [2.0, 0.0]]) ellcloud = EllipseCloud.from_local_cov(X, k=3) diff --git a/tests/test_ellcloud_rescale.py b/tests/test_ellcloud_rescale.py index 3cad35b..2c48c85 100644 --- a/tests/test_ellcloud_rescale.py +++ b/tests/test_ellcloud_rescale.py @@ -1,4 +1,4 @@ -"""Regression tests for :mod:`ellphi.ellcloud`.""" +"""Regression tests for `ellphi.ellcloud`.""" from __future__ import annotations diff --git a/tests/test_geometry_edge_cases.py b/tests/test_geometry_edge_cases.py new file mode 100644 index 0000000..fcffb2a --- /dev/null +++ b/tests/test_geometry_edge_cases.py @@ -0,0 +1,63 @@ +import numpy as np +import pytest + +from ellphi.geometry import ( + coef_from_cov, + infer_dim_from_coef_length, + pack_conic, + unpack_conic, + unpack_single_conic, +) + + +def test_infer_dim_from_coef_length_rejects_invalid_discriminant(): + with pytest.raises(ValueError, match="symmetric quadratic form"): + infer_dim_from_coef_length(7) + + +def test_pack_conic_requires_square_matrix(): + matrix = np.zeros((2, 3)) + linear = np.zeros(3) + with pytest.raises(ValueError, match="Quadratic matrices must have shape"): + pack_conic(matrix, linear, 0.0) + + +def test_pack_conic_requires_linear_match(): + matrix = np.eye(2) + linear = np.zeros(3) + with pytest.raises(ValueError, match="Linear term incompatible"): + pack_conic(matrix, linear, 0.0) + + +def test_unpack_conic_rejects_invalid_rank(): + coef = np.zeros((2, 2, 2)) + with pytest.raises(ValueError, match="one- or two-dimensional"): + unpack_conic(coef) + + +def test_unpack_single_conic_rejects_multiple_entries(): + centers = np.array([[0.0, 0.0], [1.0, 1.0]]) + covs = np.stack([np.eye(2), 2.0 * np.eye(2)]) + coef = coef_from_cov(centers, covs) + with pytest.raises(ValueError, match="Expected coefficients for a single conic"): + unpack_single_conic(coef) + + +@pytest.mark.parametrize( + "centers, covs, message", + [ + (np.zeros((2, 2)), np.zeros((1, 2, 2)), "number of centres"), + (np.zeros((1, 2)), np.zeros((1, 2, 3)), "Covariance matrices must be square"), + (np.zeros((1, 3)), np.zeros((1, 2, 2)), "dimensionality"), + ], +) +def test_coef_from_cov_validates_shapes(centers, covs, message): + with pytest.raises(ValueError, match=message): + coef_from_cov(centers, covs) + + +def test_coef_from_cov_singular_returns_nan(): + center = np.array([0.0, 0.0]) + cov = np.array([[1.0, 0.0], [0.0, 0.0]]) + coef = coef_from_cov(center, cov) + assert np.isnan(coef).all() diff --git a/tests/test_grad.py b/tests/test_grad.py new file mode 100644 index 0000000..981ebae --- /dev/null +++ b/tests/test_grad.py @@ -0,0 +1,175 @@ +"""Tests for ellphi.grad (tangency_grad and pdist_tangency_grad).""" + +from __future__ import annotations + +import numpy as np +import pytest + +from ellphi import tangency_grad, pdist_tangency_grad, pdist_tangency, TangencyGrad +from ellphi.solver import tangency + +from .factories import random_coef_pair, random_covariance +from ellphi.geometry import coef_from_cov + + +# --------------------------------------------------------------------------- +# Helpers +# --------------------------------------------------------------------------- + + +def _finite_diff_t_dp(p, q, h=1e-6): + """Central finite difference of tangency().t w.r.t. p.""" + grad = np.zeros_like(p) + for i in range(len(p)): + p_plus = p.copy() + p_plus[i] += h + p_minus = p.copy() + p_minus[i] -= h + grad[i] = (tangency(p_plus, q).t - tangency(p_minus, q).t) / (2 * h) + return grad + + +def _finite_diff_t_dq(p, q, h=1e-6): + """Central finite difference of tangency().t w.r.t. q.""" + grad = np.zeros_like(q) + for i in range(len(q)): + q_plus = q.copy() + q_plus[i] += h + q_minus = q.copy() + q_minus[i] -= h + grad[i] = (tangency(p, q_plus).t - tangency(p, q_minus).t) / (2 * h) + return grad + + +# --------------------------------------------------------------------------- +# Tests +# --------------------------------------------------------------------------- + + +def test_tangency_grad_dt_dp(rng): + """tangency_grad().dt_dp matches central finite differences.""" + p, q = random_coef_pair(rng) + g = tangency_grad(p, q) + fd = _finite_diff_t_dp(p, q) + np.testing.assert_allclose(g.dt_dp, fd, rtol=1e-5, atol=1e-8) + + +def test_tangency_grad_dt_dq(rng): + """tangency_grad().dt_dq matches central finite differences.""" + p, q = random_coef_pair(rng) + g = tangency_grad(p, q) + fd = _finite_diff_t_dq(p, q) + np.testing.assert_allclose(g.dt_dq, fd, rtol=1e-5, atol=1e-8) + + +def test_tangency_grad_returns_correct_t(rng): + """tangency_grad().t equals tangency().t.""" + p, q = random_coef_pair(rng) + g = tangency_grad(p, q) + ref = tangency(p, q).t + assert g.t == pytest.approx(ref) + + +def test_tangency_grad_is_frozen_dataclass(rng): + """TangencyGrad is immutable.""" + p, q = random_coef_pair(rng) + g = tangency_grad(p, q) + assert isinstance(g, TangencyGrad) + with pytest.raises((AttributeError, TypeError)): + g.t = 999.0 # type: ignore[misc] + + +def test_pdist_tangency_grad_values_match(rng): + """pdist_tangency_grad distances equal pdist_tangency to high precision.""" + n = 5 + means = rng.uniform(-20.0, 20.0, size=(n, 2)) + covs = np.stack([random_covariance(rng) for _ in range(n)]) + coefs = coef_from_cov(means, covs) + + dists, _ = pdist_tangency_grad(coefs) + ref = pdist_tangency(coefs) + + np.testing.assert_allclose(dists, ref, atol=1e-12) + + +def test_pdist_tangency_grad_vjp(rng): + """VJP directional-derivative check: g·dists_pert ≈ g·vjp(g).""" + n = 4 + means = rng.uniform(-20.0, 20.0, size=(n, 2)) + covs = np.stack([random_covariance(rng) for _ in range(n)]) + coefs = coef_from_cov(means, covs) + + dists, vjp = pdist_tangency_grad(coefs) + n_pairs = len(dists) + + # Random upstream gradient vector + g_upstream = rng.standard_normal(n_pairs) + g_coefs = vjp(g_upstream) + + # Directional derivative via finite difference + h = 1e-5 + direction = rng.standard_normal(coefs.shape) + direction /= np.linalg.norm(direction) + dists_plus, _ = pdist_tangency_grad(coefs + h * direction) + dists_minus, _ = pdist_tangency_grad(coefs - h * direction) + fd_directional = np.dot(g_upstream, (dists_plus - dists_minus) / (2 * h)) + + # VJP directional: + vjp_directional = float(np.dot(g_coefs.ravel(), direction.ravel())) + + assert fd_directional == pytest.approx(vjp_directional, rel=1e-4) + + +def test_tangency_grad_accepts_list_input(rng): + """tangency_grad accepts list inputs, matching tangency() behaviour.""" + p, q = random_coef_pair(rng) + g_arr = tangency_grad(p, q) + g_list = tangency_grad(list(p), list(q)) + assert g_list.t == pytest.approx(g_arr.t) + np.testing.assert_array_equal(g_list.dt_dp, g_arr.dt_dp) + np.testing.assert_array_equal(g_list.dt_dq, g_arr.dt_dq) + + +def test_tangency_grad_accepts_row_vector_input(rng): + """tangency_grad accepts (1, m) row-vector inputs.""" + p, q = random_coef_pair(rng) + g_arr = tangency_grad(p, q) + g_row = tangency_grad(p[None, :], q[None, :]) + assert g_row.t == pytest.approx(g_arr.t) + np.testing.assert_array_equal(g_row.dt_dp, g_arr.dt_dp) + np.testing.assert_array_equal(g_row.dt_dq, g_arr.dt_dq) + + +def test_pdist_tangency_grad_rejects_bad_shape(rng): + """pdist_tangency_grad raises ValueError for unsupported array layouts.""" + n = 4 + means = rng.uniform(-20.0, 20.0, size=(n, 2)) + covs = np.stack([random_covariance(rng) for _ in range(n)]) + coefs = coef_from_cov(means, covs) + + with pytest.raises(ValueError, match="Expected coefficient array"): + pdist_tangency_grad(coefs[:, :, None]) # (N, m, 1) — wrong layout + + +def test_pdist_tangency_grad_accepts_n1m_input(rng): + """pdist_tangency_grad accepts (N, 1, m) arrays, matching pdist_tangency().""" + n = 4 + means = rng.uniform(-20.0, 20.0, size=(n, 2)) + covs = np.stack([random_covariance(rng) for _ in range(n)]) + coefs = coef_from_cov(means, covs) + + dists_2d, _ = pdist_tangency_grad(coefs) + dists_3d, _ = pdist_tangency_grad(coefs[:, None, :]) # (N, 1, m) + np.testing.assert_array_equal(dists_2d, dists_3d) + + +def test_tangency_grad_3d(rng): + """tangency_grad works for 3-D ellipsoids.""" + p, q = random_coef_pair(rng, dim=3) + g = tangency_grad(p, q) + assert g.dt_dp.shape == p.shape + assert g.dt_dq.shape == q.shape + fd_dp = _finite_diff_t_dp(p, q) + fd_dq = _finite_diff_t_dq(p, q) + np.testing.assert_allclose(g.dt_dp, fd_dp, rtol=1e-5, atol=1e-8) + np.testing.assert_allclose(g.dt_dq, fd_dq, rtol=1e-5, atol=1e-8) diff --git a/tests/test_init.py b/tests/test_init.py index 8a9d57c..d09fd1c 100644 --- a/tests/test_init.py +++ b/tests/test_init.py @@ -1,4 +1,4 @@ -"""Tests for the :mod:`ellphi` package initialisation.""" +"""Tests for the `ellphi` package initialisation.""" import importlib import sys diff --git a/tests/test_solver_dispatch_edge_cases.py b/tests/test_solver_dispatch_edge_cases.py new file mode 100644 index 0000000..820f085 --- /dev/null +++ b/tests/test_solver_dispatch_edge_cases.py @@ -0,0 +1,51 @@ +import numpy as np +import pytest + +import ellphi.solver as solver_mod +from ellphi.geometry import coef_from_axes + +from .factories import random_cloud + + +def test_extract_coef_array_requires_2d(): + with pytest.raises(ValueError, match="shape"): + solver_mod._extract_coef_array(np.zeros(6)) + + +def test_should_use_cpp_rejects_unknown_backend(): + with pytest.raises(ValueError, match="Unknown backend"): + solver_mod._should_use_cpp("unknown") + + +def test_should_use_cpp_python_returns_false(): + assert solver_mod._should_use_cpp("python") is False + + +def test_should_use_cpp_requires_available_backend(monkeypatch): + monkeypatch.setattr(solver_mod._cpp, "is_available", lambda: False) + with pytest.raises(RuntimeError, match="C\\+\\+ backend requested"): + solver_mod._should_use_cpp("cpp") + + +def test_normalize_method_rejects_unknown(): + with pytest.raises(ValueError, match="Unknown method"): + solver_mod._normalize_method("not-a-method") + + +def test_tangency_rejects_mismatched_coefficients(): + p = np.zeros(6) + q = np.zeros(7) + with pytest.raises(ValueError, match="same length"): + solver_mod.tangency(p, q, backend="python") + + +def test_tangency_rejects_unknown_backend(): + p = coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0) + with pytest.raises(ValueError, match="Unknown backend"): + solver_mod.tangency(p, p, backend="unknown") + + +def test_pdist_tangency_rejects_unknown_backend(rng): + cloud = random_cloud(rng, n_ellipses=2) + with pytest.raises(ValueError, match="Unknown backend"): + solver_mod.pdist_tangency(cloud, backend="unknown") diff --git a/tests/test_solver_python_edge_cases.py b/tests/test_solver_python_edge_cases.py new file mode 100644 index 0000000..0fb9fca --- /dev/null +++ b/tests/test_solver_python_edge_cases.py @@ -0,0 +1,253 @@ +import numpy as np +import pytest +from types import SimpleNamespace + +import ellphi._solver_python as solver_py +from ellphi.geometry import coef_from_axes + +from .factories import random_cloud, random_coef_pair + + +def test_gaussian_elimination_requires_square_matrix(): + matrix = np.zeros((2, 3)) + rhs = np.zeros(2) + with pytest.raises(np.linalg.LinAlgError, match="square"): + solver_py._gaussian_elimination(matrix, rhs) + + +def test_gaussian_elimination_detects_singular_pivot(): + matrix = np.array([[0.0, 1.0], [0.0, 2.0]]) + rhs = np.array([1.0, 2.0]) + with pytest.raises(np.linalg.LinAlgError, match="singular"): + solver_py._gaussian_elimination(matrix, rhs) + + +def test_gaussian_elimination_detects_zero_diagonal(): + matrix = np.array([[1.0, 1.0], [2.0, 2.0]]) + rhs = np.array([1.0, 2.0]) + with pytest.raises(np.linalg.LinAlgError, match="singular"): + solver_py._gaussian_elimination(matrix, rhs) + + +def test_quad_eval_dimension_mismatch(): + coef = coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0) + with pytest.raises(ValueError, match="dimensionality"): + solver_py.quad_eval(coef, [0.0, 0.0, 0.0]) + + +def test_algsig_newton_nan_x0_fallback_converges(): + def f(x: float) -> float: + return x - 0.5 + + def df(x: float) -> float: + return 1.0 + + result = solver_py._algsig_newton_py(f, df, np.nan, maxiter=3, xtol=1e-12, rtol=0.0) + assert result.converged + assert result.root == pytest.approx(0.5) + + +def test_algsig_newton_nonfinite_target_returns_failure(): + def f(x: float) -> float: + return np.nan + + def df(x: float) -> float: + return 1.0 + + result = solver_py._algsig_newton_py(f, df, 0.5, maxiter=2, xtol=1e-12, rtol=0.0) + assert not result.converged + + +def test_algsig_newton_zero_derivative_returns_failure(): + def f(x: float) -> float: + return 1.0 + + def df(x: float) -> float: + return 0.0 + + result = solver_py._algsig_newton_py(f, df, 0.5, maxiter=2, xtol=1e-12, rtol=0.0) + assert not result.converged + + +def test_algsig_newton_nonfinite_candidate_backtracks_and_fails(): + def f(x: float) -> float: + return 1e308 + + def df(x: float) -> float: + return 1e-308 + + result = solver_py._algsig_newton_py(f, df, 0.5, maxiter=1, xtol=1e-12, rtol=0.0) + assert not result.converged + + +def test_algsig_newton_stops_after_max_iterations(): + def f(x: float) -> float: + return x - 0.25 + + def df(x: float) -> float: + return 1.0 + + result = solver_py._algsig_newton_py(f, df, 0.9, maxiter=1, xtol=0.0, rtol=0.0) + assert not result.converged + + +def test_target_prime_returns_nan_when_pencil_build_fails(monkeypatch): + def raise_error(*args, **kwargs): + raise np.linalg.LinAlgError("boom") + + monkeypatch.setattr(solver_py, "build_tangent_pencil", raise_error) + p = coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0) + q = coef_from_axes([1.0, 0.0], 1.0, 1.0, 0.0) + value = solver_py._target_prime(0.5, p, q) + assert np.isnan(value) + + +def test_initial_mu_for_newton_defaults_on_all_nan_scores(): + def df(mu: float) -> float: + return np.nan + + mu = solver_py._initial_mu_for_newton(df) + assert mu == 0.5 + + +def test_initial_mu_for_newton_handles_exceptions(): + def df(mu: float) -> float: + raise RuntimeError("boom") + + mu = solver_py._initial_mu_for_newton(df) + assert mu == 0.5 + + +def test_initial_mu_for_newton_prefers_larger_gradient(): + def df(mu: float) -> float: + return 1.0 if mu < 0.5 else 2.0 + + mu = solver_py._initial_mu_for_newton(df) + assert mu == pytest.approx(1.0 - 1e-5) + + +def test_solve_mu_brentq_newton_failsafe_uses_brentq(rng, monkeypatch): + p, q = random_coef_pair(rng) + expected = solver_py.solve_mu(p, q, method="brentq") + + def raise_newton(*args, **kwargs): + raise RuntimeError("boom") + + monkeypatch.setattr(solver_py, "scipy_newton", raise_newton) + result = solver_py.solve_mu(p, q, method="brentq+newton", failsafe=True) + assert result == pytest.approx(expected) + + +def test_solve_mu_brentq_newton_rejects_invalid_maxiter(rng): + p, q = random_coef_pair(rng) + with pytest.raises(ValueError, match="hybrid_bracket_maxiter"): + solver_py.solve_mu( + p, q, method="brentq+newton", hybrid_bracket_maxiter=0, x0=0.5 + ) + with pytest.raises(ValueError, match="hybrid_newton_maxiter"): + solver_py.solve_mu( + p, q, method="brentq+newton", hybrid_newton_maxiter=0, x0=0.5 + ) + + +def test_solve_mu_brentq_newton_without_failsafe_returns_mu0(rng, monkeypatch): + p, q = random_coef_pair(rng) + expected = solver_py.solve_mu(p, q, method="brentq") + + def fake_newton(*args, **kwargs): + return 0.123, SimpleNamespace(converged=False) + + monkeypatch.setattr(solver_py, "scipy_newton", fake_newton) + result = solver_py.solve_mu(p, q, method="brentq+newton", failsafe=False) + assert result == pytest.approx(expected) + + +def test_solve_mu_algsig_newton_failsafe_returns_brentq(rng, monkeypatch): + p, q = random_coef_pair(rng) + expected = solver_py.solve_mu(p, q, method="brentq") + + monkeypatch.setattr( + solver_py, + "_algsig_newton_py", + lambda *args, **kwargs: solver_py.NewtonResult(0.5, False), + ) + + result = solver_py.solve_mu(p, q, method="algsig+newton", failsafe=True, x0=0.5) + assert result == pytest.approx(expected) + + +def test_solve_mu_algsig_newton_without_failsafe_raises(rng, monkeypatch): + p, q = random_coef_pair(rng) + monkeypatch.setattr( + solver_py, + "_algsig_newton_py", + lambda *args, **kwargs: solver_py.NewtonResult(0.5, False), + ) + + with pytest.raises(RuntimeError, match="algsig\\+newton failed to converge"): + solver_py.solve_mu(p, q, method="algsig+newton", failsafe=False, x0=0.5) + + +def test_solve_mu_newton_nonconverged_failsafe_returns_brentq(rng, monkeypatch): + p, q = random_coef_pair(rng) + expected = solver_py.solve_mu(p, q, method="brentq") + + def fake_newton(*args, **kwargs): + return 0.123, SimpleNamespace(converged=False) + + monkeypatch.setattr(solver_py, "scipy_newton", fake_newton) + result = solver_py.solve_mu(p, q, method="newton", x0=0.5, failsafe=True) + assert result == pytest.approx(expected) + + +def test_solve_mu_newton_nonconverged_without_failsafe_raises(rng, monkeypatch): + p, q = random_coef_pair(rng) + + def fake_newton(*args, **kwargs): + return 0.123, SimpleNamespace(converged=False) + + monkeypatch.setattr(solver_py, "scipy_newton", fake_newton) + with pytest.raises(RuntimeError, match="Newton method failed to converge"): + solver_py.solve_mu(p, q, method="newton", x0=0.5, failsafe=False) + + +def test_solve_mu_rejects_unknown_method(rng): + p, q = random_coef_pair(rng) + with pytest.raises(ValueError, match="Unknown method"): + solver_py.solve_mu(p, q, method="not-a-method") + + +def test_solve_mu_rejects_nonfinite_target(monkeypatch, rng): + p, q = random_coef_pair(rng) + monkeypatch.setattr(solver_py, "_target", lambda mu, p, q: np.nan) + with pytest.raises(RuntimeError, match="Non-finite target value"): + solver_py.solve_mu(p, q, method="newton", x0=0.5, failsafe=False) + + +def test_tangency_rejects_mu_outside_bracket(monkeypatch): + p = coef_from_axes([0.0, 0.0], 1.0, 1.0, 0.0) + q = coef_from_axes([1.0, 0.0], 1.0, 1.0, 0.0) + monkeypatch.setattr(solver_py, "solve_mu", lambda *args, **kwargs: 2.0) + with pytest.raises(RuntimeError, match="within the bracket"): + solver_py.tangency(p, q, bracket=(0.0, 1.0)) + + +def test_pdist_tangency_parallel_returns_empty_for_single_ellipse(rng): + cloud = random_cloud(rng, n_ellipses=1) + result = solver_py._pdist_tangency_parallel(cloud) + assert result.shape == (0,) + assert result.dtype == float + + +def test_pdist_tangency_serial_branch_matches_serial(rng): + cloud = random_cloud(rng, n_ellipses=3) + result = solver_py.pdist_tangency(cloud, parallel=False) + expected = solver_py._pdist_tangency_serial(cloud) + np.testing.assert_allclose(result, expected) + + +def test_pdist_tangency_parallel_branch_matches_parallel(rng): + cloud = random_cloud(rng, n_ellipses=3) + result = solver_py.pdist_tangency(cloud, parallel=True, n_jobs=1) + expected = solver_py._pdist_tangency_parallel(cloud, n_jobs=1) + np.testing.assert_allclose(result, expected) diff --git a/tests/test_visualization.py b/tests/test_visualization.py index b9a1641..09ef1f5 100644 --- a/tests/test_visualization.py +++ b/tests/test_visualization.py @@ -1,6 +1,7 @@ """Tests for the ellphi visualization module.""" import numpy as np +from matplotlib.colors import to_rgba from matplotlib.patches import Ellipse from ellphi.visualization import ellipse_patch @@ -38,3 +39,18 @@ def test_ellipse_patch_direct_params(): assert np.isclose(patch.width, 2 * r_major) assert np.isclose(patch.height, 2 * r_minor) assert np.isclose(patch.angle, np.degrees(theta)) + assert np.allclose(patch.get_facecolor(), to_rgba("none")) + + +def test_ellipse_patch_respects_explicit_facecolor(): + """Explicit facecolor/fill arguments should not be overridden.""" + patch = ellipse_patch( + [0.0, 0.0], + r_major=1.5, + r_minor=0.5, + theta=0.0, + facecolor="steelblue", + alpha=0.4, + ) + + assert np.allclose(patch.get_facecolor(), to_rgba("steelblue", alpha=0.4))