From bb5286bcbee7939619d80c3683dde5212d6a3b33 Mon Sep 17 00:00:00 2001 From: sharkinsspatial Date: Fri, 24 Apr 2026 12:08:16 -0400 Subject: [PATCH 1/5] Initial mkdocs. --- .github/workflows/docs.yml | 29 + README.md | 17 + docs/DEVELOP.md | 36 + docs/api/zarr-table.md | 42 + docs/architecture/query-pipeline.md | 48 + docs/architecture/spatial-indexing.md | 4 + docs/architecture/zarr.md | 55 + docs/assets/ds_favicon.png | Bin 0 -> 1500 bytes docs/assets/logo_no_text.png | Bin 0 -> 4638 bytes docs/composite-chunk-scanning.excalidraw | 443 +++ docs/diagrams/Index_scanning.excalidraw | 3240 ++++++++++++++++ docs/diagrams/chunk_scanning.excalidraw | 3433 +++++++++++++++++ docs/diagrams/chunk_scanning.png | Bin 0 -> 86070 bytes docs/diagrams/index_scanning.png | Bin 0 -> 87723 bytes docs/index.md | 24 + docs/overrides/main.html | 8 + docs/overrides/stylesheets/extra.css | 41 + .../plans/2026-04-20-mkdocs-site.md | 493 +++ .../specs/2026-04-20-mkdocs-design.md | 108 + docs/user-guide/installation.md | 29 + docs/user-guide/quickstart.md | 126 + mkdocs.yml | 97 + pyproject.toml | 3 + uv.lock | 1187 ++++++ 24 files changed, 9463 insertions(+) create mode 100644 .github/workflows/docs.yml create mode 100644 docs/DEVELOP.md create mode 100644 docs/api/zarr-table.md create mode 100644 docs/architecture/query-pipeline.md create mode 100644 docs/architecture/spatial-indexing.md create mode 100644 docs/architecture/zarr.md create mode 100644 docs/assets/ds_favicon.png create mode 100644 docs/assets/logo_no_text.png create mode 100644 docs/composite-chunk-scanning.excalidraw create mode 100644 docs/diagrams/Index_scanning.excalidraw create mode 100644 docs/diagrams/chunk_scanning.excalidraw create mode 100644 docs/diagrams/chunk_scanning.png create mode 100644 docs/diagrams/index_scanning.png create mode 100644 docs/index.md create mode 100644 docs/overrides/main.html create mode 100644 docs/overrides/stylesheets/extra.css create mode 100644 docs/superpowers/plans/2026-04-20-mkdocs-site.md create mode 100644 docs/superpowers/specs/2026-04-20-mkdocs-design.md create mode 100644 docs/user-guide/installation.md create mode 100644 docs/user-guide/quickstart.md create mode 100644 mkdocs.yml create mode 100644 uv.lock diff --git a/.github/workflows/docs.yml b/.github/workflows/docs.yml new file mode 100644 index 0000000..c0e89cd --- /dev/null +++ b/.github/workflows/docs.yml @@ -0,0 +1,29 @@ +name: Deploy docs + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write + +jobs: + deploy: + name: Deploy MkDocs to GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Deploy docs + env: + GIT_COMMITTER_NAME: CI + GIT_COMMITTER_EMAIL: ci-bot@example.com + run: uv run --group docs mkdocs gh-deploy --force diff --git a/README.md b/README.md index 0d95fb8..a232eac 100644 --- a/README.md +++ b/README.md @@ -4,6 +4,17 @@ This is a prototype for querying STAC or CMR style _metadata_ about Zarr arrays This concept was conceived by the team at [Earthmover](https://www.earthmover.io/) and is outlined in their whitepaper Level 2 Data Collections in Zarr / Icechunk. +## Why + +The Earthmover whitepaper outlines several rationales for storing +_metadata_ in a Zarr store. The most compelling cases are + +- **Heterogeneous Arrays** - With the advent of Virtualizarr we are often representing chunks from source files that we don't control. For Level 2 and Level 3 datasets like Sentinel 2 this means that virtual Zarr arrays have varying `dtypes`, `codecs` and `crs` values. +If the source arrays are heterogeneous, they cannot be concatenated along a dimension to form a single datacube. Because of this we need an alternative to select or discover these arrays other than the normal coordinate or dimensional slicing we use with datacubes. + +- **Synchornization** - Our current metadata management solutions (STAC, CMR, ODC) all use disconnected metadata stores which reference raw data assets in object storage. +This can present problems as systems require complex, fragile orchestration to maintain consistency between metadata indexes and source data. Using Icechunk as store can alleviate this as array data and metadata updates can be completed in a single atomic transaction. + ## Schema To store this _metadata_, zarr-datafusion-search uses a convention where the Zarr store represents each metadata "field" with a 1-dimensional array in a root group named `"meta"`. @@ -28,6 +39,12 @@ In addition, DataFusion-Python supports [_custom table providers_](https://dataf > you must use the same version of DataFusion-Python as the version of > DataFusion used to compile the custom table provider. +## Installation +```bash +uv add zarr-datafusion-search +``` + +## Usage ```py from zarr_datafusion_search import ZarrTable from datafusion import SessionContext diff --git a/docs/DEVELOP.md b/docs/DEVELOP.md new file mode 100644 index 0000000..ef88c01 --- /dev/null +++ b/docs/DEVELOP.md @@ -0,0 +1,36 @@ +# Contributing + +## Rust + +From the project root, run: + +```bash +cargo test +``` + +A suite of benchmarks are available (though the remote S3 benchmarks use data in a +protected bucket and require credentials). Benchmarks are in separate binaries and +can be run via: + +```bash +cargo bench --bench datetime_local +cargo bench --bench bbox_colunms_local +cargo bench --bench bbox_local +``` + +## Python bindings + +From the `python/` directory, run: + +```bash +uv run --no-project maturin develop --uv +``` + +The `--no-project` flag is necessary to avoid building the Rust code (in release +mode) an extra time before we even reach the `maturin develop` command. + +Prefix all `uv run` commands with `--no-project`. For example: + +```bash +uv run --no-project pytest +``` diff --git a/docs/api/zarr-table.md b/docs/api/zarr-table.md new file mode 100644 index 0000000..4423b4a --- /dev/null +++ b/docs/api/zarr-table.md @@ -0,0 +1,42 @@ +# ZarrTable + +## Overview + +`ZarrTable` is a DataFusion custom table provider that exposes a Zarr metadata +store as a SQL-queryable table. + +## Import + +```python +from zarr_datafusion_search import ZarrTable +``` + +## Constructor + +```python +ZarrTable(path: str) +``` + +| Parameter | Type | Description | +|-----------|------|-------------| +| `path` | `str` | Path to the root of the Zarr store (local filesystem or object store URI) | + +## Usage + +Pass a `ZarrTable` instance to DataFusion's `register_table_provider`: + +```python +from zarr_datafusion_search import ZarrTable +from datafusion import SessionContext + +ctx = SessionContext() +ctx.register_table_provider("my_table", ZarrTable("/path/to/store.zarr")) + +df = ctx.sql("SELECT date, collection FROM my_table LIMIT 10") +df.show() +``` + +!!! note + `ZarrTable` must be compiled against the same version of DataFusion as the + `datafusion` Python package you have installed. Check `python/pyproject.toml` + for the required `datafusion>=` version constraint. diff --git a/docs/architecture/query-pipeline.md b/docs/architecture/query-pipeline.md new file mode 100644 index 0000000..5370af9 --- /dev/null +++ b/docs/architecture/query-pipeline.md @@ -0,0 +1,48 @@ +# Query Pipeline + +The library uses [Apache Datafusion](https://datafusion.apache.org/) as the +foundation of its expression parser and execution planner. To interact with +the custom Zarr schema described in [zarr.md](./zarr.md) we use a custom +Datafusion +[TableProvider](https://datafusion.apache.org/library-user-guide/custom-table-providers.html) + + +The `ZarrTableProvider` uses several techniques to try and improve filter +execution performance. There are 2 main drivers of execution cost. + +1. Retrieving and deserializing Zarr chunks. +2. Evaluating expressions against chunks. + +#### Non-indexed columns +In the most basic case, the TableProvider looks at the "columns" used in the +expression predicate and retrieves each chunk for the metadata arrays of these +"columns" to build a `RecordBatch` with a schema of just the predicate columns. + +This `RecordBatch` is evaluated against the filter to find matching rows. If it +contains matching rows and there are additional projected "columns" in +expression, the chunk for that column's array is loaded and the indexes for the +matching rows are selected. + +These selected rows are combined and added to the `RecordBatchStream`. + +![](../diagrams/chunk_scanning.png) + +#### Indexed columns +While the approach described above can be highly performant for many types of +columns and expressions, it can be slow for `dtypes` that are slow to +deserialize (variable length types) or when the predicate evaluation is +expensive (geodatafusion functions). + +In these cases we want to use additional metadata or materialized indexes to +1. Reduce the number of chunks we retrieve and deserialize. +2. Reduce the number of values we check against the filter predicate. + +Currently we support using [geo-index](https://github.com/georust/geo-index) +R-tree indexes. In this case the "basic" pipeline is short circuited. The +`TableProvder` checks if the "column" in the predicate has an index. If an +index exists, it uses it find the "rows" that satisfy the predicate. The +`TableProvider` fetches only the chunks for those rows and then only decodes +those portions of the chunks. The filter predicate is never used against the +raw values. + +![](../diagrams/index_scanning.png) diff --git a/docs/architecture/spatial-indexing.md b/docs/architecture/spatial-indexing.md new file mode 100644 index 0000000..0735c04 --- /dev/null +++ b/docs/architecture/spatial-indexing.md @@ -0,0 +1,4 @@ +# Spatial Indexing + +!!! note "Coming soon" + This page is under construction. diff --git a/docs/architecture/zarr.md b/docs/architecture/zarr.md new file mode 100644 index 0000000..8b011d0 --- /dev/null +++ b/docs/architecture/zarr.md @@ -0,0 +1,55 @@ +# Zarr Structure + +`zarr-datafusion-search` uses a set of 1D arrays to store metadata, +treating them as if they were columns in a columnar storage format like +Parquet. + +#### Schema +The library requires a special group named `meta`. It discovers each array stored in the `meta` group and +maps its Zarr v3 `dtype` to an Arrow type to build an +[Arrow schema](https://arrow.apache.org/cookbook/py/schema.html). These are the +current supported type mappings. + +## Supported dtype mappings + +| Zarr v3 dtype | Arrow type | Notes | +|---|---|---| +| `bool` | `Boolean` | | +| `int8` | `Int8` | | +| `int16` | `Int16` | | +| `int32` | `Int32` | | +| `int64` | `Int64` | | +| `uint8` | `UInt8` | | +| `uint16` | `UInt16` | | +| `uint32` | `UInt32` | | +| `uint64` | `UInt64` | | +| `float16` | `Float16` | | +| `float32` | `Float32` | | +| `float64` | `Float64` | | +| `bytes` | `BinaryView` | When the field name is `bbox`, mapped to WKB with EPSG:4326 CRS via the GeoArrow extension type instead | +| `r` (raw bits) | `BinaryView` | | +| `string` | `Utf8View` | | +| `numpy.datetime64[s]` | `Timestamp(Second, None)` | | +| `numpy.datetime64[ms]` | `Timestamp(Millisecond, None)` | | +| `numpy.datetime64[us]` | `Timestamp(Microsecond, None)` | | +| `numpy.datetime64[ns]` | `Timestamp(Nanosecond, None)` | | +| `complex64` | — | Not supported | +| `complex128` | — | Not supported | + +### Chunking +Because the `meta` arrays are combined by Datafusion into a single schema they +need to maintain chunk alignment. This means that during array creation time, +the chunk size must be the same for each array. And as data is appended, it needs to be appended to each array simultaneously. +Because the chunks are aligned across arrays, the library can treat the combined chunks similar to a Parquet row group. + +This diagram demonstrates the chunk alignment +![](../diagrams/chunk_scanning.png) + +### Indexes +`zarr-datafusion-search` supports the optional use of materialized indexes to improve +scanning performance. We use the following convention, if a `meta` +array is used in the filter predicate `zarr-datafusion-search` will look for a +group called `indexes` and search for an array of the same name as the +predicate array. Currently the only index type supported are R-tree indexes +generated by the [geo-index](https://github.com/georust/geo-index) +library but we will continue to expand index support. diff --git a/docs/assets/ds_favicon.png b/docs/assets/ds_favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..db95a323eff7b0a05e1f11c90d38892b12341282 GIT binary patch literal 1500 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�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 z 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 JdD$}j{{xdb+pz!u literal 0 HcmV?d00001 diff --git a/docs/index.md b/docs/index.md new file mode 100644 index 0000000..7ac0a7f --- /dev/null +++ b/docs/index.md @@ -0,0 +1,24 @@ +# zarr-datafusion-search + +A prototype for querying STAC or CMR style _metadata_ about Zarr arrays and groups +using [DataFusion](https://datafusion.apache.org/), an extensible query engine written +in Rust. + +This concept was conceived by the team at [Earthmover](https://www.earthmover.io/) +and is outlined in their whitepaper *Level 2 Data Collections in Zarr / Icechunk*. + +## Why + +The Earthmover whitepaper outlines several rationales for storing +_metadata_ in a Zarr store. The most compelling cases are + +- **Heterogeneous Arrays** - With the advent of Virtualizarr we are often representing chunks from source files that we don't control. For Level 2 and Level 3 datasets like Sentinel 2 this means that virtual Zarr arrays have varying `dtypes`, `codecs` and `crs` values. +If the source arrays are heterogeneous, they cannot be concatenated along a dimension to form a single datacube. Because of this we need an alternative to select or discover these arrays other than the normal coordinate or dimensional slicing we use with datacubes. + +- **Synchronization** - Our current metadata management solutions (STAC, CMR, ODC) all use disconnected metadata stores which reference raw data assets in object storage. +This can present problems as systems require complex, fragile orchestration to maintain consistency between metadata indexes and source data. Using Icechunk as store can alleviate this as array data and metadata updates can be completed in a single atomic transaction. + + +- **[User Guide](user-guide/installation.md)** — Installation, quickstart +- **[API Reference](api/zarr-table.md)** — `ZarrTable` class documentation +- **[Developer Docs](DEVELOP.md)** — Contributing and running benchmarks diff --git a/docs/overrides/main.html b/docs/overrides/main.html new file mode 100644 index 0000000..0af326a --- /dev/null +++ b/docs/overrides/main.html @@ -0,0 +1,8 @@ +{% extends "base.html" %} + +{% block outdated %} + You're not viewing the latest version. + + Click here to go to latest. + +{% endblock %} diff --git a/docs/overrides/stylesheets/extra.css b/docs/overrides/stylesheets/extra.css new file mode 100644 index 0000000..a6a7b1c --- /dev/null +++ b/docs/overrides/stylesheets/extra.css @@ -0,0 +1,41 @@ +:root, +[data-md-color-scheme="default"] { + --md-primary-fg-color: #cf3f02; + --md-default-fg-color: #443f3f; + --boxShadowD: 0px 12px 24px 0px rgba(68, 63, 63, 0.08), + 0px 0px 4px 0px rgba(68, 63, 63, 0.08); +} +body { + margin: 0; + padding: 0; +} +h1, +h2, +h3, +h4, +h5, +h6 { + font-family: var(--md-heading-font); + font-weight: bold; +} +.md-typeset h1, +.md-typeset h2 { + font-weight: normal; + color: var(--md-default-fg-color); +} +.md-typeset h3, +.md-typeset h4 { + font-weight: bold; + color: var(--md-default-fg-color); +} +.md-button, +.md-typeset .md-button { + font-family: var(--md-heading-font); +} +.md-content .supheading { + font-family: var(--md-heading-font); + text-transform: uppercase; + color: var(--md-primary-fg-color); + font-size: 0.75rem; + font-weight: bold; +} diff --git a/docs/superpowers/plans/2026-04-20-mkdocs-site.md b/docs/superpowers/plans/2026-04-20-mkdocs-site.md new file mode 100644 index 0000000..cdf2b35 --- /dev/null +++ b/docs/superpowers/plans/2026-04-20-mkdocs-site.md @@ -0,0 +1,493 @@ +# MkDocs Documentation Site Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Set up a MkDocs Material documentation site for zarr-datafusion-search, deployable to GitHub Pages at `https://developmentseed.github.io/zarr-datafusion-search`. + +**Architecture:** Root-level `mkdocs.yml` + `docs/` directory. Stub pages with `!!! note "Coming soon"` admonitions for all sections except `index.md` (populated from README) and `DEVELOP.md` (copied from root). A single GitHub Actions workflow deploys on push to `main` using `mkdocs gh-deploy`. + +**Tech Stack:** MkDocs, mkdocs-material, uv (dependency management), GitHub Actions + +--- + +## File Map + +| Action | Path | Purpose | +|--------|------|---------| +| Create | `mkdocs.yml` | Site configuration | +| Modify | `pyproject.toml` | Add `docs` dependency group | +| Create | `docs/index.md` | Landing page (from README content) | +| Create | `docs/DEVELOP.md` | Copy of root `DEVELOP.md` | +| Create | `docs/user-guide/installation.md` | Stub | +| Create | `docs/user-guide/quickstart.md` | Stub | +| Create | `docs/user-guide/schema.md` | Stub | +| Create | `docs/user-guide/spatial-queries.md` | Stub | +| Create | `docs/examples/local.md` | Stub | +| Create | `docs/examples/s3-icechunk.md` | Stub | +| Create | `docs/api/zarr-table.md` | Hand-written API reference | +| Create | `docs/architecture/spatial-indexing.md` | Stub | +| Create | `docs/architecture/query-pipeline.md` | Stub | +| Create | `.github/workflows/docs.yml` | CI deploy workflow | + +--- + +### Task 1: Add docs dependencies to pyproject.toml + +**Files:** +- Modify: `pyproject.toml` + +The root `pyproject.toml` already has a `[dependency-groups]` section with `dev`. Add a `docs` group. + +- [ ] **Step 1: Add the docs dependency group** + +Open `pyproject.toml` and add the following after the existing `[dependency-groups]` `dev` entry: + +```toml +[dependency-groups] +dev = ["ipykernel>=6.30.1"] +docs = [ + "mkdocs-material>=9.5", +] +``` + +- [ ] **Step 2: Verify uv can resolve the group** + +Run from the repo root: +```bash +uv sync --group docs +``` + +Expected: Dependencies resolve and install without errors. You will see `mkdocs-material` and its transitive deps installed. + +--- + +### Task 2: Create mkdocs.yml + +**Files:** +- Create: `mkdocs.yml` + +- [ ] **Step 1: Create the file** + +Create `mkdocs.yml` at the repo root with the following content: + +```yaml +site_name: zarr-datafusion-search +repo_name: developmentseed/zarr-datafusion-search +repo_url: https://github.com/developmentseed/zarr-datafusion-search +site_description: Query Zarr metadata with DataFusion SQL +site_author: Development Seed +site_url: https://developmentseed.github.io/zarr-datafusion-search/ +docs_dir: docs + +extra: + social: + - icon: "fontawesome/brands/github" + link: "https://github.com/developmentseed" + - icon: "material/web" + link: "https://developmentseed.org/" + +nav: + - index.md + - User Guide: + - user-guide/installation.md + - user-guide/quickstart.md + - user-guide/schema.md + - user-guide/spatial-queries.md + - Examples: + - examples/local.md + - examples/s3-icechunk.md + - API Reference: + - api/zarr-table.md + - Architecture: + - architecture/spatial-indexing.md + - architecture/query-pipeline.md + - Developer Docs: DEVELOP.md + +theme: + name: material + icon: + logo: material/database-search + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + - media: "(prefers-color-scheme: light)" + scheme: default + primary: teal + accent: teal + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: teal + accent: teal + toggle: + icon: material/brightness-4 + name: Switch to system preference + + features: + - content.code.copy + - navigation.indexes + - navigation.instant + - navigation.tracking + - search.suggest + - search.share + +plugins: + - search + +markdown_extensions: + - admonition + - attr_list + - def_list + - footnotes + - pymdownx.details + - pymdownx.superfences + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.snippets + - pymdownx.tasklist: + custom_checkbox: true + - toc: + permalink: true +``` + +- [ ] **Step 2: Verify MkDocs can parse the config (before docs/ exists)** + +Run: +```bash +uv run --group docs mkdocs build --strict 2>&1 | head -20 +``` + +Expected: Errors about missing doc files — that's fine, it confirms the YAML parses. If you see a YAML parse error instead, fix the indentation in `mkdocs.yml`. + +--- + +### Task 3: Create docs/index.md + +**Files:** +- Create: `docs/index.md` + +This is the landing page. Populate it from the README content rather than leaving it as a stub. + +- [ ] **Step 1: Create the file** + +```markdown +# zarr-datafusion-search + +A prototype for querying STAC or CMR style _metadata_ about Zarr arrays and groups +using [DataFusion](https://datafusion.apache.org/), an extensible query engine written +in Rust. + +This concept was conceived by the team at [Earthmover](https://www.earthmover.io/) +and is outlined in their whitepaper *Level 2 Data Collections in Zarr / Icechunk*. + +## Quick Start + +```python +from zarr_datafusion_search import ZarrTable +from datafusion import SessionContext + +# Create a new DataFusion session context +ctx = SessionContext() + +# Register a specific Zarr store as a table named "zarr_data" +ctx.register_table_provider("zarr_data", ZarrTable("zarr_store.zarr")) + +# Run SQL queries against the Zarr data +df = ctx.sql("SELECT * FROM zarr_data;") +df.show() +``` + +!!! note + The underlying DataFusion TableProvider ABI is not entirely stable. Use the + same version of `datafusion-python` as the version of DataFusion used to + compile this package. + +## Navigation + +- **[User Guide](user-guide/installation.md)** — Installation, quickstart, and + how-to guides +- **[Examples](examples/local.md)** — Full worked examples against local and + S3-backed stores +- **[API Reference](api/zarr-table.md)** — `ZarrTable` class documentation +- **[Architecture](architecture/spatial-indexing.md)** — How the query engine + and spatial indexing work +- **[Developer Docs](DEVELOP.md)** — Contributing and running benchmarks +``` + +--- + +### Task 4: Create docs/DEVELOP.md + +**Files:** +- Create: `docs/DEVELOP.md` + +- [ ] **Step 1: Copy root DEVELOP.md into docs/** + +```markdown +# Contributing + +## Rust + +From the project root, run: + +```bash +cargo test +``` + +A suite of benchmarks are available (though the remote S3 benchmarks use data in a +protected bucket and require credentials). Benchmarks are in separate binaries and +can be run via: + +```bash +cargo bench --bench datetime_local +cargo bench --bench bbox_colunms_local +cargo bench --bench bbox_local +``` + +## Python bindings + +From the `python/` directory, run: + +```bash +uv run --no-project maturin develop --uv +``` + +The `--no-project` flag is necessary to avoid building the Rust code (in release +mode) an extra time before we even reach the `maturin develop` command. + +Prefix all `uv run` commands with `--no-project`. For example: + +```bash +uv run --no-project pytest +``` +``` + +--- + +### Task 5: Create stub pages + +**Files:** +- Create: `docs/user-guide/installation.md` +- Create: `docs/user-guide/quickstart.md` +- Create: `docs/user-guide/schema.md` +- Create: `docs/user-guide/spatial-queries.md` +- Create: `docs/examples/local.md` +- Create: `docs/examples/s3-icechunk.md` +- Create: `docs/architecture/spatial-indexing.md` +- Create: `docs/architecture/query-pipeline.md` + +Each stub has the same structure: a heading and a "coming soon" admonition. + +- [ ] **Step 1: Create docs/user-guide/installation.md** + +```markdown +# Installation + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 2: Create docs/user-guide/quickstart.md** + +```markdown +# Quickstart + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 3: Create docs/user-guide/schema.md** + +```markdown +# Schema Conventions + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 4: Create docs/user-guide/spatial-queries.md** + +```markdown +# Spatial Queries + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 5: Create docs/examples/local.md** + +```markdown +# Local Store Example + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 6: Create docs/examples/s3-icechunk.md** + +```markdown +# S3 + Icechunk Example + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 7: Create docs/architecture/spatial-indexing.md** + +```markdown +# Spatial Indexing + +!!! note "Coming soon" + This page is under construction. +``` + +- [ ] **Step 8: Create docs/architecture/query-pipeline.md** + +```markdown +# Query Pipeline + +!!! note "Coming soon" + This page is under construction. +``` + +--- + +### Task 6: Create docs/api/zarr-table.md + +**Files:** +- Create: `docs/api/zarr-table.md` + +Hand-written reference for `ZarrTable`. The Python package exposes one class: +`ZarrTable`, imported from `zarr_datafusion_search`. + +- [ ] **Step 1: Create the file** + +```markdown +# ZarrTable + +::: zarr_datafusion_search.ZarrTable + +## Overview + +`ZarrTable` is a DataFusion custom table provider that exposes a Zarr metadata +store as a SQL-queryable table. + +## Import + +```python +from zarr_datafusion_search import ZarrTable +``` + +## Constructor + +```python +ZarrTable(path: str) +``` + +| Parameter | Type | Description | +|-----------|------|-------------| +| `path` | `str` | Path to the root of the Zarr store (local filesystem or object store URI) | + +## Usage + +Pass a `ZarrTable` instance to DataFusion's `register_table_provider`: + +```python +from zarr_datafusion_search import ZarrTable +from datafusion import SessionContext + +ctx = SessionContext() +ctx.register_table_provider("my_table", ZarrTable("/path/to/store.zarr")) + +df = ctx.sql("SELECT date, collection FROM my_table LIMIT 10") +df.show() +``` + +!!! note + `ZarrTable` must be compiled against the same version of DataFusion as the + `datafusion` Python package you have installed. Check `python/pyproject.toml` + for the required `datafusion>=` version constraint. +``` + +--- + +### Task 7: Create GitHub Actions deployment workflow + +**Files:** +- Create: `.github/workflows/docs.yml` + +- [ ] **Step 1: Create the workflow file** + +```yaml +name: Deploy docs + +on: + push: + branches: + - main + workflow_dispatch: + +permissions: + contents: write + +jobs: + deploy: + name: Deploy MkDocs to GitHub Pages + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - uses: astral-sh/setup-uv@v5 + with: + enable-cache: true + + - name: Deploy docs + env: + GIT_COMMITTER_NAME: CI + GIT_COMMITTER_EMAIL: ci-bot@example.com + run: uv run --group docs mkdocs gh-deploy --force +``` + +--- + +### Task 8: Verify the full site builds locally + +No files created. This is a verification step only. + +- [ ] **Step 1: Build the site** + +Run from the repo root: +```bash +uv run --group docs mkdocs build --strict +``` + +Expected output (last few lines): +``` +INFO - Documentation built in X.XX seconds +``` + +No warnings or errors about missing files, broken links, or invalid nav entries. + +- [ ] **Step 2: Serve locally and check the site** + +```bash +uv run --group docs mkdocs serve +``` + +Open `http://127.0.0.1:8000` in a browser. Verify: + +- Dark/light/auto toggle works in the top-right +- All nav sections expand (User Guide, Examples, API Reference, Architecture, Developer Docs) +- Each stub page renders the "Coming soon" admonition +- `index.md` shows the quick start code block with syntax highlighting +- Search bar is present and functional +- GitHub repo link in the top-right points to the correct repo + +Stop the server with `Ctrl+C`. diff --git a/docs/superpowers/specs/2026-04-20-mkdocs-design.md b/docs/superpowers/specs/2026-04-20-mkdocs-design.md new file mode 100644 index 0000000..038f9ef --- /dev/null +++ b/docs/superpowers/specs/2026-04-20-mkdocs-design.md @@ -0,0 +1,108 @@ +--- +name: MkDocs Documentation Site +description: Design spec for the zarr-datafusion-search MkDocs Material docs site +type: project +--- + +# MkDocs Documentation Site Design + +## Overview + +Add a MkDocs Material documentation site to `zarr-datafusion-search`, hosted at +`https://developmentseed.github.io/zarr-datafusion-search`. The site covers both +the Python API and the architecture of the system, following the same pattern used +by obstore and geoarrow-rs from the same ecosystem. + +## File Structure + +``` +zarr-datafusion-search/ + mkdocs.yml + docs/ + index.md + user-guide/ + installation.md + quickstart.md + schema.md + spatial-queries.md + examples/ + local.md + s3-icechunk.md + api/ + zarr-table.md + architecture/ + spatial-indexing.md + query-pipeline.md + DEVELOP.md # copy of root DEVELOP.md + .github/workflows/ + docs.yml # deploy on push to main +``` + +## Navigation + +```yaml +nav: + - index.md + - User Guide: + - user-guide/installation.md + - user-guide/quickstart.md + - user-guide/schema.md + - user-guide/spatial-queries.md + - Examples: + - examples/local.md + - examples/s3-icechunk.md + - API Reference: + - api/zarr-table.md + - Architecture: + - architecture/spatial-indexing.md + - architecture/query-pipeline.md + - Developer Docs: DEVELOP.md +``` + +## MkDocs Configuration + +- **Theme**: Material with dark/light/auto palette toggle +- **Plugins**: `search` only (no `mkdocstrings`, no `mike`) +- **Markdown extensions**: admonition, code highlighting, superfences, toc with + permalink — matching the geoarrow-rs/obstore baseline set +- **Site URL**: `https://developmentseed.github.io/zarr-datafusion-search` +- **Repo**: `developmentseed/zarr-datafusion-search` + +## Placeholder Pages + +All stub pages will contain: +1. A `# Title` heading +2. A `!!! note "Coming soon"` admonition so the site builds cleanly + +The `index.md` will be populated from the existing `README.md` content +(project description + Python usage snippet) rather than left as a stub. + +`docs/DEVELOP.md` will be a copy of the root `DEVELOP.md`. + +## GitHub Actions Deployment + +`.github/workflows/docs.yml`: + +- Trigger: push to `main` +- Runner: `ubuntu-latest` +- Steps: checkout → `astral-sh/setup-uv` → `uv run mkdocs gh-deploy --force` +- The `uv` doc dependencies will be declared in a `[dependency-groups]` `docs` + group in the root `pyproject.toml` + +## Dependencies + +Added to root `pyproject.toml` under `[dependency-groups] docs`: + +``` +mkdocs-material +mkdocs-material[imaging] # for social plugin if added later +``` + +Minimal for now; `mkdocstrings` added when API surface grows. + +## Out of Scope + +- `mike` versioning (add when first stable release is cut) +- `mkdocstrings` auto-generated API reference (add when `ZarrTable` API stabilizes) +- Blog section +- Custom domain diff --git a/docs/user-guide/installation.md b/docs/user-guide/installation.md new file mode 100644 index 0000000..860d4f6 --- /dev/null +++ b/docs/user-guide/installation.md @@ -0,0 +1,29 @@ +# Installation + +## Requirements + +- Python 3.10 or later +- `datafusion >= 52.0` + +## Install from PyPI + +```bash +pip install zarr-datafusion-search +``` + +## Install with uv + +```bash +uv add zarr-datafusion-search +``` + +## DataFusion version compatibility + +`zarr-datafusion-search` is compiled against a specific version of the +DataFusion engine. The `datafusion` Python package you have installed must +match. Check the `datafusion>=` constraint in +[`python/pyproject.toml`](https://github.com/developmentseed/zarr-datafusion-search/blob/main/python/pyproject.toml) +for the required version. + +If you see an error like `abi3 wheel is not compatible` or a symbol not found +at import time, this is almost always a DataFusion version mismatch. diff --git a/docs/user-guide/quickstart.md b/docs/user-guide/quickstart.md new file mode 100644 index 0000000..ab11582 --- /dev/null +++ b/docs/user-guide/quickstart.md @@ -0,0 +1,126 @@ +# Quickstart + +This guide walks through querying a Zarr store with SQL in three steps: +create a store, register it as a DataFusion table, and run queries. + +## 1. Create a Zarr store + +A `zarr-datafusion-search` store is a Zarr v3 group containing a `meta/` +subgroup. Each 1D array inside `meta/` becomes a SQL column. The simplest +way to build a test store is with `zarr-python` and `shapely`: + +```python +import numpy as np +import shapely +import zarr +from zarr.dtype import VariableLengthBytes, VariableLengthUTF8 + +root = zarr.open_group("my_store.zarr", mode="w", zarr_format=3) +meta = root.create_group("meta") + +# Timestamps +meta.create_array( + "date", + data=np.array(["2023-01-01", "2023-01-02", "2023-01-03"], dtype="datetime64[ms]"), +) + +# String metadata +collection = meta.create_array( + "collection", + shape=(3,), + dtype=VariableLengthUTF8(), +) +collection[:] = ["sentinel-2", "sentinel-2", "landsat-8"] + +# Bounding boxes stored as WKB +bbox = meta.create_array( + "bbox", + shape=(3,), + dtype=VariableLengthBytes(), +) +bbox[:] = shapely.to_wkb([ + shapely.box(-10.0, -10.0, 10.0, 10.0), + shapely.box(-20.0, -20.0, 20.0, 20.0), + shapely.box( 30.0, 30.0, 50.0, 50.0), +]) +``` + +## 2. Register the store + +Use `ZarrTable.from_obstore` to open the store through +[obstore](https://github.com/developmentseed/obstore), then register it +with a DataFusion `SessionContext`: + +```python +from datafusion import SessionContext +from obstore.store import LocalStore +from zarr_datafusion_search import ZarrTable + +store = LocalStore("my_store.zarr") +zarr_table = await ZarrTable.from_obstore(store, "/meta") + +ctx = SessionContext() +ctx.register_table("my_data", zarr_table) +``` + +## 3. Query with SQL + +Once registered, any DataFusion SQL query works against the table: + +```python +# Inspect the schema +df = ctx.sql("SELECT * FROM my_data LIMIT 5") +print(df.schema()) +df.show() + +# Filter by date +df = ctx.sql(""" + SELECT date, collection + FROM my_data + WHERE date >= '2023-01-02' +""") +df.show() +``` + +## 4. Spatial queries + +Spatial SQL functions are provided by `geodatafusion`, which is included as a +dependency and requires no separate install. Call `register_all` to make the +functions available in your session: + +```python +from geodatafusion import register_all + +register_all(ctx) + +df = ctx.sql(""" + SELECT date, collection + FROM my_data + WHERE ST_Intersects( + bbox, + ST_GeomFromText('POLYGON((-15 -15, -15 15, 15 15, 15 -15, -15 -15))') + ) +""") +df.show() +``` + +## Using an Icechunk store + +If your data lives in an [Icechunk](https://icechunk.io) repository, open a +read-only session and pass it directly to `ZarrTable.from_icechunk`: + +```python +import icechunk +from zarr_datafusion_search import ZarrTable + +storage = icechunk.local_filesystem_storage("my_repo") +repo = icechunk.Repository.open(storage) +session = repo.readonly_session("main") + +zarr_table = await ZarrTable.from_icechunk(session=session, group_path="/meta") + +ctx = SessionContext() +ctx.register_table("my_data", zarr_table) +``` + +From here the SQL interface is identical to the local store example above. diff --git a/mkdocs.yml b/mkdocs.yml new file mode 100644 index 0000000..13ca298 --- /dev/null +++ b/mkdocs.yml @@ -0,0 +1,97 @@ +site_name: zarr-datafusion-search +repo_name: developmentseed/zarr-datafusion-search +repo_url: https://github.com/developmentseed/zarr-datafusion-search +site_description: Query Zarr metadata with DataFusion SQL +site_author: Development Seed +site_url: https://developmentseed.github.io/zarr-datafusion-search/ +docs_dir: docs + +extra: + social: + - icon: "fontawesome/brands/github" + link: "https://github.com/developmentseed" + - icon: "material/web" + link: "https://developmentseed.org/" + +exclude_docs: | + superpowers/ + +nav: + - index.md + - User Guide: + - user-guide/installation.md + - user-guide/quickstart.md + - API Reference: + - api/zarr-table.md + - Architecture: + - architecture/zarr.md + - architecture/query-pipeline.md + - Developer Docs: DEVELOP.md + +theme: + language: en + name: material + custom_dir: docs/overrides + logo: assets/logo_no_text.png + favicon: assets/ds_favicon.png + palette: + - media: "(prefers-color-scheme)" + toggle: + icon: material/brightness-auto + name: Switch to light mode + - media: "(prefers-color-scheme: light)" + primary: default + accent: deep orange + toggle: + icon: material/brightness-7 + name: Switch to dark mode + - media: "(prefers-color-scheme: dark)" + scheme: slate + primary: default + accent: deep orange + toggle: + icon: material/brightness-4 + name: Switch to system preference + + font: + text: Roboto + code: Roboto Mono + + features: + - content.code.annotate + - content.code.copy + - navigation.indexes + - navigation.instant + - navigation.tracking + - search.suggest + - search.share + +extra_css: + - overrides/stylesheets/extra.css + +plugins: + - search + +markdown_extensions: + - admonition + - attr_list + - def_list + - footnotes + - md_in_html + - pymdownx.details + - pymdownx.emoji: + emoji_index: !!python/name:material.extensions.emoji.twemoji + emoji_generator: !!python/name:material.extensions.emoji.to_svg + - pymdownx.highlight: + anchor_linenums: true + - pymdownx.inlinehilite + - pymdownx.magiclink: + hide_protocol: true + repo_url_shortener: true + - pymdownx.smartsymbols + - pymdownx.snippets + - pymdownx.superfences + - pymdownx.tasklist: + custom_checkbox: true + - toc: + permalink: true diff --git a/pyproject.toml b/pyproject.toml index b89f414..f22e25b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -13,3 +13,6 @@ dependencies = [ [dependency-groups] dev = ["ipykernel>=6.30.1"] +docs = [ + "mkdocs-material>=9.5", +] diff --git a/uv.lock b/uv.lock new file mode 100644 index 0000000..48ca478 --- /dev/null +++ b/uv.lock @@ -0,0 +1,1187 @@ +version = 1 +revision = 3 +requires-python = ">=3.12" + +[[package]] +name = "appnope" +version = "0.1.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/5d/752690df9ef5b76e169e68d6a129fa6d08a7100ca7f754c89495db3c6019/appnope-0.1.4.tar.gz", hash = "sha256:1de3860566df9caf38f01f86f65e0e13e379af54f9e4bee1e66b48f2efffd1ee", size = 4170, upload-time = "2024-02-06T09:43:11.258Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/29/5ecc3a15d5a33e31b26c11426c45c501e439cb865d0bff96315d86443b78/appnope-0.1.4-py2.py3-none-any.whl", hash = "sha256:502575ee11cd7a28c0205f379b525beefebab9d161b7c964670864014ed7213c", size = 4321, upload-time = "2024-02-06T09:43:09.663Z" }, +] + +[[package]] +name = "asttokens" +version = "3.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/be/a5/8e3f9b6771b0b408517c82d97aed8f2036509bc247d46114925e32fe33f0/asttokens-3.0.1.tar.gz", hash = "sha256:71a4ee5de0bde6a31d64f6b13f2293ac190344478f081c3d1bccfcf5eacb0cb7", size = 62308, upload-time = "2025-11-15T16:43:48.578Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/39/e7eaf1799466a4aef85b6a4fe7bd175ad2b1c6345066aa33f1f58d4b18d0/asttokens-3.0.1-py3-none-any.whl", hash = "sha256:15a3ebc0f43c2d0a50eeafea25e19046c68398e487b9f1f5b517f7c0f40f976a", size = 27047, upload-time = "2025-11-15T16:43:16.109Z" }, +] + +[[package]] +name = "babel" +version = "2.18.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7d/b2/51899539b6ceeeb420d40ed3cd4b7a40519404f9baf3d4ac99dc413a834b/babel-2.18.0.tar.gz", hash = "sha256:b80b99a14bd085fcacfa15c9165f651fbb3406e66cc603abf11c5750937c992d", size = 9959554, upload-time = "2026-02-01T12:30:56.078Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/f5/21d2de20e8b8b0408f0681956ca2c69f1320a3848ac50e6e7f39c6159675/babel-2.18.0-py3-none-any.whl", hash = "sha256:e2b422b277c2b9a9630c1d7903c2a00d0830c409c59ac8cae9081c92f1aeba35", size = 10196845, upload-time = "2026-02-01T12:30:53.445Z" }, +] + +[[package]] +name = "backrefs" +version = "6.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4e/a6/e325ec73b638d3ede4421b5445d4a0b8b219481826cc079d510100af356c/backrefs-6.2.tar.gz", hash = "sha256:f44ff4d48808b243b6c0cdc6231e22195c32f77046018141556c66f8bab72a49", size = 7012303, upload-time = "2026-02-16T19:10:15.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/39/3765df263e08a4df37f4f43cb5aa3c6c17a4bdd42ecfe841e04c26037171/backrefs-6.2-py310-none-any.whl", hash = "sha256:0fdc7b012420b6b144410342caeb8adc54c6866cf12064abc9bb211302e496f8", size = 381075, upload-time = "2026-02-16T19:10:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/0f/f0/35240571e1b67ffb19dafb29ab34150b6f59f93f717b041082cdb1bfceb1/backrefs-6.2-py311-none-any.whl", hash = "sha256:08aa7fae530c6b2361d7bdcbda1a7c454e330cc9dbcd03f5c23205e430e5c3be", size = 392874, upload-time = "2026-02-16T19:10:06.314Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/77e8c9745b4d227cce9f5e0a6f68041278c5f9b18588b35905f5f19c1beb/backrefs-6.2-py312-none-any.whl", hash = "sha256:c3f4b9cb2af8cda0d87ab4f57800b57b95428488477be164dd2b47be54db0c90", size = 398787, upload-time = "2026-02-16T19:10:08.274Z" }, + { url = "https://files.pythonhosted.org/packages/c5/71/c754b1737ad99102e03fa3235acb6cb6d3ac9d6f596cbc3e5f236705abd8/backrefs-6.2-py313-none-any.whl", hash = "sha256:12df81596ab511f783b7d87c043ce26bc5b0288cf3bb03610fe76b8189282b2b", size = 400747, upload-time = "2026-02-16T19:10:09.791Z" }, + { url = "https://files.pythonhosted.org/packages/af/75/be12ba31a6eb20dccef2320cd8ccb3f7d9013b68ba4c70156259fee9e409/backrefs-6.2-py314-none-any.whl", hash = "sha256:e5f805ae09819caa1aa0623b4a83790e7028604aa2b8c73ba602c4454e665de7", size = 412602, upload-time = "2026-02-16T19:10:12.317Z" }, + { url = "https://files.pythonhosted.org/packages/21/f8/d02f650c47d05034dcd6f9c8cf94f39598b7a89c00ecda0ecb2911bc27e9/backrefs-6.2-py39-none-any.whl", hash = "sha256:664e33cd88c6840b7625b826ecf2555f32d491800900f5a541f772c485f7cda7", size = 381077, upload-time = "2026-02-16T19:10:13.74Z" }, +] + +[[package]] +name = "certifi" +version = "2026.2.25" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/af/2d/7bf41579a8986e348fa033a31cdd0e4121114f6bce2457e8876010b092dd/certifi-2026.2.25.tar.gz", hash = "sha256:e887ab5cee78ea814d3472169153c2d12cd43b14bd03329a39a9c6e2e80bfba7", size = 155029, upload-time = "2026-02-25T02:54:17.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3c/c17fb3ca2d9c3acff52e30b309f538586f9f5b9c9cf454f3845fc9af4881/certifi-2026.2.25-py3-none-any.whl", hash = "sha256:027692e4402ad994f1c42e52a4997a9763c646b73e4096e4d5d6db8af1d6f0fa", size = 153684, upload-time = "2026-02-25T02:54:15.766Z" }, +] + +[[package]] +name = "cffi" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pycparser", marker = "implementation_name != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/56/b1ba7935a17738ae8453301356628e8147c79dbb825bcbc73dc7401f9846/cffi-2.0.0.tar.gz", hash = "sha256:44d1b5909021139fe36001ae048dbdde8214afa20200eda0f64c068cac5d5529", size = 523588, upload-time = "2025-09-08T23:24:04.541Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/47/4f61023ea636104d4f16ab488e268b93008c3d0bb76893b1b31db1f96802/cffi-2.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d02d6655b0e54f54c4ef0b94eb6be0607b70853c45ce98bd278dc7de718be5d", size = 185271, upload-time = "2025-09-08T23:22:44.795Z" }, + { url = "https://files.pythonhosted.org/packages/df/a2/781b623f57358e360d62cdd7a8c681f074a71d445418a776eef0aadb4ab4/cffi-2.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8eca2a813c1cb7ad4fb74d368c2ffbbb4789d377ee5bb8df98373c2cc0dee76c", size = 181048, upload-time = "2025-09-08T23:22:45.938Z" }, + { url = "https://files.pythonhosted.org/packages/ff/df/a4f0fbd47331ceeba3d37c2e51e9dfc9722498becbeec2bd8bc856c9538a/cffi-2.0.0-cp312-cp312-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:21d1152871b019407d8ac3985f6775c079416c282e431a4da6afe7aefd2bccbe", size = 212529, upload-time = "2025-09-08T23:22:47.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/72/12b5f8d3865bf0f87cf1404d8c374e7487dcf097a1c91c436e72e6badd83/cffi-2.0.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b21e08af67b8a103c71a250401c78d5e0893beff75e28c53c98f4de42f774062", size = 220097, upload-time = "2025-09-08T23:22:48.677Z" }, + { url = "https://files.pythonhosted.org/packages/c2/95/7a135d52a50dfa7c882ab0ac17e8dc11cec9d55d2c18dda414c051c5e69e/cffi-2.0.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:1e3a615586f05fc4065a8b22b8152f0c1b00cdbc60596d187c2a74f9e3036e4e", size = 207983, upload-time = "2025-09-08T23:22:50.06Z" }, + { url = "https://files.pythonhosted.org/packages/3a/c8/15cb9ada8895957ea171c62dc78ff3e99159ee7adb13c0123c001a2546c1/cffi-2.0.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:81afed14892743bbe14dacb9e36d9e0e504cd204e0b165062c488942b9718037", size = 206519, upload-time = "2025-09-08T23:22:51.364Z" }, + { url = "https://files.pythonhosted.org/packages/78/2d/7fa73dfa841b5ac06c7b8855cfc18622132e365f5b81d02230333ff26e9e/cffi-2.0.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3e17ed538242334bf70832644a32a7aae3d83b57567f9fd60a26257e992b79ba", size = 219572, upload-time = "2025-09-08T23:22:52.902Z" }, + { url = "https://files.pythonhosted.org/packages/07/e0/267e57e387b4ca276b90f0434ff88b2c2241ad72b16d31836adddfd6031b/cffi-2.0.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3925dd22fa2b7699ed2617149842d2e6adde22b262fcbfada50e3d195e4b3a94", size = 222963, upload-time = "2025-09-08T23:22:54.518Z" }, + { url = "https://files.pythonhosted.org/packages/b6/75/1f2747525e06f53efbd878f4d03bac5b859cbc11c633d0fb81432d98a795/cffi-2.0.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:2c8f814d84194c9ea681642fd164267891702542f028a15fc97d4674b6206187", size = 221361, upload-time = "2025-09-08T23:22:55.867Z" }, + { url = "https://files.pythonhosted.org/packages/7b/2b/2b6435f76bfeb6bbf055596976da087377ede68df465419d192acf00c437/cffi-2.0.0-cp312-cp312-win32.whl", hash = "sha256:da902562c3e9c550df360bfa53c035b2f241fed6d9aef119048073680ace4a18", size = 172932, upload-time = "2025-09-08T23:22:57.188Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ed/13bd4418627013bec4ed6e54283b1959cf6db888048c7cf4b4c3b5b36002/cffi-2.0.0-cp312-cp312-win_amd64.whl", hash = "sha256:da68248800ad6320861f129cd9c1bf96ca849a2771a59e0344e88681905916f5", size = 183557, upload-time = "2025-09-08T23:22:58.351Z" }, + { url = "https://files.pythonhosted.org/packages/95/31/9f7f93ad2f8eff1dbc1c3656d7ca5bfd8fb52c9d786b4dcf19b2d02217fa/cffi-2.0.0-cp312-cp312-win_arm64.whl", hash = "sha256:4671d9dd5ec934cb9a73e7ee9676f9362aba54f7f34910956b84d727b0d73fb6", size = 177762, upload-time = "2025-09-08T23:22:59.668Z" }, + { url = "https://files.pythonhosted.org/packages/4b/8d/a0a47a0c9e413a658623d014e91e74a50cdd2c423f7ccfd44086ef767f90/cffi-2.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:00bdf7acc5f795150faa6957054fbbca2439db2f775ce831222b66f192f03beb", size = 185230, upload-time = "2025-09-08T23:23:00.879Z" }, + { url = "https://files.pythonhosted.org/packages/4a/d2/a6c0296814556c68ee32009d9c2ad4f85f2707cdecfd7727951ec228005d/cffi-2.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:45d5e886156860dc35862657e1494b9bae8dfa63bf56796f2fb56e1679fc0bca", size = 181043, upload-time = "2025-09-08T23:23:02.231Z" }, + { url = "https://files.pythonhosted.org/packages/b0/1e/d22cc63332bd59b06481ceaac49d6c507598642e2230f201649058a7e704/cffi-2.0.0-cp313-cp313-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:07b271772c100085dd28b74fa0cd81c8fb1a3ba18b21e03d7c27f3436a10606b", size = 212446, upload-time = "2025-09-08T23:23:03.472Z" }, + { url = "https://files.pythonhosted.org/packages/a9/f5/a2c23eb03b61a0b8747f211eb716446c826ad66818ddc7810cc2cc19b3f2/cffi-2.0.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:d48a880098c96020b02d5a1f7d9251308510ce8858940e6fa99ece33f610838b", size = 220101, upload-time = "2025-09-08T23:23:04.792Z" }, + { url = "https://files.pythonhosted.org/packages/f2/7f/e6647792fc5850d634695bc0e6ab4111ae88e89981d35ac269956605feba/cffi-2.0.0-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:f93fd8e5c8c0a4aa1f424d6173f14a892044054871c771f8566e4008eaa359d2", size = 207948, upload-time = "2025-09-08T23:23:06.127Z" }, + { url = "https://files.pythonhosted.org/packages/cb/1e/a5a1bd6f1fb30f22573f76533de12a00bf274abcdc55c8edab639078abb6/cffi-2.0.0-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:dd4f05f54a52fb558f1ba9f528228066954fee3ebe629fc1660d874d040ae5a3", size = 206422, upload-time = "2025-09-08T23:23:07.753Z" }, + { url = "https://files.pythonhosted.org/packages/98/df/0a1755e750013a2081e863e7cd37e0cdd02664372c754e5560099eb7aa44/cffi-2.0.0-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c8d3b5532fc71b7a77c09192b4a5a200ea992702734a2e9279a37f2478236f26", size = 219499, upload-time = "2025-09-08T23:23:09.648Z" }, + { url = "https://files.pythonhosted.org/packages/50/e1/a969e687fcf9ea58e6e2a928ad5e2dd88cc12f6f0ab477e9971f2309b57c/cffi-2.0.0-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:d9b29c1f0ae438d5ee9acb31cadee00a58c46cc9c0b2f9038c6b0b3470877a8c", size = 222928, upload-time = "2025-09-08T23:23:10.928Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0362578dd2c9e557a28ac77698ed67323ed5b9775ca9d3fe73fe191bb5d8/cffi-2.0.0-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:6d50360be4546678fc1b79ffe7a66265e28667840010348dd69a314145807a1b", size = 221302, upload-time = "2025-09-08T23:23:12.42Z" }, + { url = "https://files.pythonhosted.org/packages/eb/6d/bf9bda840d5f1dfdbf0feca87fbdb64a918a69bca42cfa0ba7b137c48cb8/cffi-2.0.0-cp313-cp313-win32.whl", hash = "sha256:74a03b9698e198d47562765773b4a8309919089150a0bb17d829ad7b44b60d27", size = 172909, upload-time = "2025-09-08T23:23:14.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/18/6519e1ee6f5a1e579e04b9ddb6f1676c17368a7aba48299c3759bbc3c8b3/cffi-2.0.0-cp313-cp313-win_amd64.whl", hash = "sha256:19f705ada2530c1167abacb171925dd886168931e0a7b78f5bffcae5c6b5be75", size = 183402, upload-time = "2025-09-08T23:23:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/02ceeec9a7d6ee63bb596121c2c8e9b3a9e150936f4fbef6ca1943e6137c/cffi-2.0.0-cp313-cp313-win_arm64.whl", hash = "sha256:256f80b80ca3853f90c21b23ee78cd008713787b1b1e93eae9f3d6a7134abd91", size = 177780, upload-time = "2025-09-08T23:23:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/92/c4/3ce07396253a83250ee98564f8d7e9789fab8e58858f35d07a9a2c78de9f/cffi-2.0.0-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:fc33c5141b55ed366cfaad382df24fe7dcbc686de5be719b207bb248e3053dc5", size = 185320, upload-time = "2025-09-08T23:23:18.087Z" }, + { url = "https://files.pythonhosted.org/packages/59/dd/27e9fa567a23931c838c6b02d0764611c62290062a6d4e8ff7863daf9730/cffi-2.0.0-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c654de545946e0db659b3400168c9ad31b5d29593291482c43e3564effbcee13", size = 181487, upload-time = "2025-09-08T23:23:19.622Z" }, + { url = "https://files.pythonhosted.org/packages/d6/43/0e822876f87ea8a4ef95442c3d766a06a51fc5298823f884ef87aaad168c/cffi-2.0.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:24b6f81f1983e6df8db3adc38562c83f7d4a0c36162885ec7f7b77c7dcbec97b", size = 220049, upload-time = "2025-09-08T23:23:20.853Z" }, + { url = "https://files.pythonhosted.org/packages/b4/89/76799151d9c2d2d1ead63c2429da9ea9d7aac304603de0c6e8764e6e8e70/cffi-2.0.0-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:12873ca6cb9b0f0d3a0da705d6086fe911591737a59f28b7936bdfed27c0d47c", size = 207793, upload-time = "2025-09-08T23:23:22.08Z" }, + { url = "https://files.pythonhosted.org/packages/bb/dd/3465b14bb9e24ee24cb88c9e3730f6de63111fffe513492bf8c808a3547e/cffi-2.0.0-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:d9b97165e8aed9272a6bb17c01e3cc5871a594a446ebedc996e2397a1c1ea8ef", size = 206300, upload-time = "2025-09-08T23:23:23.314Z" }, + { url = "https://files.pythonhosted.org/packages/47/d9/d83e293854571c877a92da46fdec39158f8d7e68da75bf73581225d28e90/cffi-2.0.0-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:afb8db5439b81cf9c9d0c80404b60c3cc9c3add93e114dcae767f1477cb53775", size = 219244, upload-time = "2025-09-08T23:23:24.541Z" }, + { url = "https://files.pythonhosted.org/packages/2b/0f/1f177e3683aead2bb00f7679a16451d302c436b5cbf2505f0ea8146ef59e/cffi-2.0.0-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:737fe7d37e1a1bffe70bd5754ea763a62a066dc5913ca57e957824b72a85e205", size = 222828, upload-time = "2025-09-08T23:23:26.143Z" }, + { url = "https://files.pythonhosted.org/packages/c6/0f/cafacebd4b040e3119dcb32fed8bdef8dfe94da653155f9d0b9dc660166e/cffi-2.0.0-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:38100abb9d1b1435bc4cc340bb4489635dc2f0da7456590877030c9b3d40b0c1", size = 220926, upload-time = "2025-09-08T23:23:27.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/aa/df335faa45b395396fcbc03de2dfcab242cd61a9900e914fe682a59170b1/cffi-2.0.0-cp314-cp314-win32.whl", hash = "sha256:087067fa8953339c723661eda6b54bc98c5625757ea62e95eb4898ad5e776e9f", size = 175328, upload-time = "2025-09-08T23:23:44.61Z" }, + { url = "https://files.pythonhosted.org/packages/bb/92/882c2d30831744296ce713f0feb4c1cd30f346ef747b530b5318715cc367/cffi-2.0.0-cp314-cp314-win_amd64.whl", hash = "sha256:203a48d1fb583fc7d78a4c6655692963b860a417c0528492a6bc21f1aaefab25", size = 185650, upload-time = "2025-09-08T23:23:45.848Z" }, + { url = "https://files.pythonhosted.org/packages/9f/2c/98ece204b9d35a7366b5b2c6539c350313ca13932143e79dc133ba757104/cffi-2.0.0-cp314-cp314-win_arm64.whl", hash = "sha256:dbd5c7a25a7cb98f5ca55d258b103a2054f859a46ae11aaf23134f9cc0d356ad", size = 180687, upload-time = "2025-09-08T23:23:47.105Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/c768e4d548bfa607abcda77423448df8c471f25dbe64fb2ef6d555eae006/cffi-2.0.0-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:9a67fc9e8eb39039280526379fb3a70023d77caec1852002b4da7e8b270c4dd9", size = 188773, upload-time = "2025-09-08T23:23:29.347Z" }, + { url = "https://files.pythonhosted.org/packages/2c/ea/5f76bce7cf6fcd0ab1a1058b5af899bfbef198bea4d5686da88471ea0336/cffi-2.0.0-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7a66c7204d8869299919db4d5069a82f1561581af12b11b3c9f48c584eb8743d", size = 185013, upload-time = "2025-09-08T23:23:30.63Z" }, + { url = "https://files.pythonhosted.org/packages/be/b4/c56878d0d1755cf9caa54ba71e5d049479c52f9e4afc230f06822162ab2f/cffi-2.0.0-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:7cc09976e8b56f8cebd752f7113ad07752461f48a58cbba644139015ac24954c", size = 221593, upload-time = "2025-09-08T23:23:31.91Z" }, + { url = "https://files.pythonhosted.org/packages/e0/0d/eb704606dfe8033e7128df5e90fee946bbcb64a04fcdaa97321309004000/cffi-2.0.0-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:92b68146a71df78564e4ef48af17551a5ddd142e5190cdf2c5624d0c3ff5b2e8", size = 209354, upload-time = "2025-09-08T23:23:33.214Z" }, + { url = "https://files.pythonhosted.org/packages/d8/19/3c435d727b368ca475fb8742ab97c9cb13a0de600ce86f62eab7fa3eea60/cffi-2.0.0-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:b1e74d11748e7e98e2f426ab176d4ed720a64412b6a15054378afdb71e0f37dc", size = 208480, upload-time = "2025-09-08T23:23:34.495Z" }, + { url = "https://files.pythonhosted.org/packages/d0/44/681604464ed9541673e486521497406fadcc15b5217c3e326b061696899a/cffi-2.0.0-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:28a3a209b96630bca57cce802da70c266eb08c6e97e5afd61a75611ee6c64592", size = 221584, upload-time = "2025-09-08T23:23:36.096Z" }, + { url = "https://files.pythonhosted.org/packages/25/8e/342a504ff018a2825d395d44d63a767dd8ebc927ebda557fecdaca3ac33a/cffi-2.0.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:7553fb2090d71822f02c629afe6042c299edf91ba1bf94951165613553984512", size = 224443, upload-time = "2025-09-08T23:23:37.328Z" }, + { url = "https://files.pythonhosted.org/packages/e1/5e/b666bacbbc60fbf415ba9988324a132c9a7a0448a9a8f125074671c0f2c3/cffi-2.0.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:6c6c373cfc5c83a975506110d17457138c8c63016b563cc9ed6e056a82f13ce4", size = 223437, upload-time = "2025-09-08T23:23:38.945Z" }, + { url = "https://files.pythonhosted.org/packages/a0/1d/ec1a60bd1a10daa292d3cd6bb0b359a81607154fb8165f3ec95fe003b85c/cffi-2.0.0-cp314-cp314t-win32.whl", hash = "sha256:1fc9ea04857caf665289b7a75923f2c6ed559b8298a1b8c49e59f7dd95c8481e", size = 180487, upload-time = "2025-09-08T23:23:40.423Z" }, + { url = "https://files.pythonhosted.org/packages/bf/41/4c1168c74fac325c0c8156f04b6749c8b6a8f405bbf91413ba088359f60d/cffi-2.0.0-cp314-cp314t-win_amd64.whl", hash = "sha256:d68b6cef7827e8641e8ef16f4494edda8b36104d79773a334beaa1e3521430f6", size = 191726, upload-time = "2025-09-08T23:23:41.742Z" }, + { url = "https://files.pythonhosted.org/packages/ae/3a/dbeec9d1ee0844c679f6bb5d6ad4e9f198b1224f4e7a32825f47f6192b0c/cffi-2.0.0-cp314-cp314t-win_arm64.whl", hash = "sha256:0a1527a803f0a659de1af2e1fd700213caba79377e27e4693648c2923da066f9", size = 184195, upload-time = "2025-09-08T23:23:43.004Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e7/a1/67fe25fac3c7642725500a3f6cfe5821ad557c3abb11c9d20d12c7008d3e/charset_normalizer-3.4.7.tar.gz", hash = "sha256:ae89db9e5f98a11a4bf50407d4363e7b09b31e55bc117b4f7d80aab97ba009e5", size = 144271, upload-time = "2026-04-02T09:28:39.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/eb/4fc8d0a7110eb5fc9cc161723a34a8a6c200ce3b4fbf681bc86feee22308/charset_normalizer-3.4.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:eca9705049ad3c7345d574e3510665cb2cf844c2f2dcfe675332677f081cbd46", size = 311328, upload-time = "2026-04-02T09:26:24.331Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e3/0fadc706008ac9d7b9b5be6dc767c05f9d3e5df51744ce4cc9605de7b9f4/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6178f72c5508bfc5fd446a5905e698c6212932f25bcdd4b47a757a50605a90e2", size = 208061, upload-time = "2026-04-02T09:26:25.568Z" }, + { url = "https://files.pythonhosted.org/packages/42/f0/3dd1045c47f4a4604df85ec18ad093912ae1344ac706993aff91d38773a2/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:e1421b502d83040e6d7fb2fb18dff63957f720da3d77b2fbd3187ceb63755d7b", size = 229031, upload-time = "2026-04-02T09:26:26.865Z" }, + { url = "https://files.pythonhosted.org/packages/dc/67/675a46eb016118a2fbde5a277a5d15f4f69d5f3f5f338e5ee2f8948fcf43/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:edac0f1ab77644605be2cbba52e6b7f630731fc42b34cb0f634be1a6eface56a", size = 225239, upload-time = "2026-04-02T09:26:28.044Z" }, + { url = "https://files.pythonhosted.org/packages/4b/f8/d0118a2f5f23b02cd166fa385c60f9b0d4f9194f574e2b31cef350ad7223/charset_normalizer-3.4.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5649fd1c7bade02f320a462fdefd0b4bd3ce036065836d4f42e0de958038e116", size = 216589, upload-time = "2026-04-02T09:26:29.239Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f1/6d2b0b261b6c4ceef0fcb0d17a01cc5bc53586c2d4796fa04b5c540bc13d/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:203104ed3e428044fd943bc4bf45fa73c0730391f9621e37fe39ecf477b128cb", size = 202733, upload-time = "2026-04-02T09:26:30.5Z" }, + { url = "https://files.pythonhosted.org/packages/6f/c0/7b1f943f7e87cc3db9626ba17807d042c38645f0a1d4415c7a14afb5591f/charset_normalizer-3.4.7-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:298930cec56029e05497a76988377cbd7457ba864beeea92ad7e844fe74cd1f1", size = 212652, upload-time = "2026-04-02T09:26:31.709Z" }, + { url = "https://files.pythonhosted.org/packages/38/dd/5a9ab159fe45c6e72079398f277b7d2b523e7f716acc489726115a910097/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:708838739abf24b2ceb208d0e22403dd018faeef86ddac04319a62ae884c4f15", size = 211229, upload-time = "2026-04-02T09:26:33.282Z" }, + { url = "https://files.pythonhosted.org/packages/d5/ff/531a1cad5ca855d1c1a8b69cb71abfd6d85c0291580146fda7c82857caa1/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0f7eb884681e3938906ed0434f20c63046eacd0111c4ba96f27b76084cd679f5", size = 203552, upload-time = "2026-04-02T09:26:34.845Z" }, + { url = "https://files.pythonhosted.org/packages/c1/4c/a5fb52d528a8ca41f7598cb619409ece30a169fbdf9cdce592e53b46c3a6/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4dc1e73c36828f982bfe79fadf5919923f8a6f4df2860804db9a98c48824ce8d", size = 230806, upload-time = "2026-04-02T09:26:36.152Z" }, + { url = "https://files.pythonhosted.org/packages/59/7a/071feed8124111a32b316b33ae4de83d36923039ef8cf48120266844285b/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:aed52fea0513bac0ccde438c188c8a471c4e0f457c2dd20cdbf6ea7a450046c7", size = 212316, upload-time = "2026-04-02T09:26:37.672Z" }, + { url = "https://files.pythonhosted.org/packages/fd/35/f7dba3994312d7ba508e041eaac39a36b120f32d4c8662b8814dab876431/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:fea24543955a6a729c45a73fe90e08c743f0b3334bbf3201e6c4bc1b0c7fa464", size = 227274, upload-time = "2026-04-02T09:26:38.93Z" }, + { url = "https://files.pythonhosted.org/packages/8a/2d/a572df5c9204ab7688ec1edc895a73ebded3b023bb07364710b05dd1c9be/charset_normalizer-3.4.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:bb6d88045545b26da47aa879dd4a89a71d1dce0f0e549b1abcb31dfe4a8eac49", size = 218468, upload-time = "2026-04-02T09:26:40.17Z" }, + { url = "https://files.pythonhosted.org/packages/86/eb/890922a8b03a568ca2f336c36585a4713c55d4d67bf0f0c78924be6315ca/charset_normalizer-3.4.7-cp312-cp312-win32.whl", hash = "sha256:2257141f39fe65a3fdf38aeccae4b953e5f3b3324f4ff0daf9f15b8518666a2c", size = 148460, upload-time = "2026-04-02T09:26:41.416Z" }, + { url = "https://files.pythonhosted.org/packages/35/d9/0e7dffa06c5ab081f75b1b786f0aefc88365825dfcd0ac544bdb7b2b6853/charset_normalizer-3.4.7-cp312-cp312-win_amd64.whl", hash = "sha256:5ed6ab538499c8644b8a3e18debabcd7ce684f3fa91cf867521a7a0279cab2d6", size = 159330, upload-time = "2026-04-02T09:26:42.554Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/481bcc2a7c88ea6b0878c299547843b2521ccbc40980cb406267088bc701/charset_normalizer-3.4.7-cp312-cp312-win_arm64.whl", hash = "sha256:56be790f86bfb2c98fb742ce566dfb4816e5a83384616ab59c49e0604d49c51d", size = 147828, upload-time = "2026-04-02T09:26:44.075Z" }, + { url = "https://files.pythonhosted.org/packages/c1/3b/66777e39d3ae1ddc77ee606be4ec6d8cbd4c801f65e5a1b6f2b11b8346dd/charset_normalizer-3.4.7-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:f496c9c3cc02230093d8330875c4c3cdfc3b73612a5fd921c65d39cbcef08063", size = 309627, upload-time = "2026-04-02T09:26:45.198Z" }, + { url = "https://files.pythonhosted.org/packages/2e/4e/b7f84e617b4854ade48a1b7915c8ccfadeba444d2a18c291f696e37f0d3b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea948db76d31190bf08bd371623927ee1339d5f2a0b4b1b4a4439a65298703c", size = 207008, upload-time = "2026-04-02T09:26:46.824Z" }, + { url = "https://files.pythonhosted.org/packages/c4/bb/ec73c0257c9e11b268f018f068f5d00aa0ef8c8b09f7753ebd5f2880e248/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a277ab8928b9f299723bc1a2dabb1265911b1a76341f90a510368ca44ad9ab66", size = 228303, upload-time = "2026-04-02T09:26:48.397Z" }, + { url = "https://files.pythonhosted.org/packages/85/fb/32d1f5033484494619f701e719429c69b766bfc4dbc61aa9e9c8c166528b/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3bec022aec2c514d9cf199522a802bd007cd588ab17ab2525f20f9c34d067c18", size = 224282, upload-time = "2026-04-02T09:26:49.684Z" }, + { url = "https://files.pythonhosted.org/packages/fa/07/330e3a0dda4c404d6da83b327270906e9654a24f6c546dc886a0eb0ffb23/charset_normalizer-3.4.7-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e044c39e41b92c845bc815e5ae4230804e8e7bc29e399b0437d64222d92809dd", size = 215595, upload-time = "2026-04-02T09:26:50.915Z" }, + { url = "https://files.pythonhosted.org/packages/e3/7c/fc890655786e423f02556e0216d4b8c6bcb6bdfa890160dc66bf52dee468/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_armv7l.whl", hash = "sha256:f495a1652cf3fbab2eb0639776dad966c2fb874d79d87ca07f9d5f059b8bd215", size = 201986, upload-time = "2026-04-02T09:26:52.197Z" }, + { url = "https://files.pythonhosted.org/packages/d8/97/bfb18b3db2aed3b90cf54dc292ad79fdd5ad65c4eae454099475cbeadd0d/charset_normalizer-3.4.7-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e712b419df8ba5e42b226c510472b37bd57b38e897d3eca5e8cfd410a29fa859", size = 211711, upload-time = "2026-04-02T09:26:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/6f/a5/a581c13798546a7fd557c82614a5c65a13df2157e9ad6373166d2a3e645d/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:7804338df6fcc08105c7745f1502ba68d900f45fd770d5bdd5288ddccb8a42d8", size = 210036, upload-time = "2026-04-02T09:26:54.975Z" }, + { url = "https://files.pythonhosted.org/packages/8c/bf/b3ab5bcb478e4193d517644b0fb2bf5497fbceeaa7a1bc0f4d5b50953861/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:481551899c856c704d58119b5025793fa6730adda3571971af568f66d2424bb5", size = 202998, upload-time = "2026-04-02T09:26:56.303Z" }, + { url = "https://files.pythonhosted.org/packages/e7/4e/23efd79b65d314fa320ec6017b4b5834d5c12a58ba4610aa353af2e2f577/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_ppc64le.whl", hash = "sha256:f59099f9b66f0d7145115e6f80dd8b1d847176df89b234a5a6b3f00437aa0832", size = 230056, upload-time = "2026-04-02T09:26:57.554Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9f/1e1941bc3f0e01df116e68dc37a55c4d249df5e6fa77f008841aef68264f/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:f59ad4c0e8f6bba240a9bb85504faa1ab438237199d4cce5f622761507b8f6a6", size = 211537, upload-time = "2026-04-02T09:26:58.843Z" }, + { url = "https://files.pythonhosted.org/packages/80/0f/088cbb3020d44428964a6c97fe1edfb1b9550396bf6d278330281e8b709c/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_s390x.whl", hash = "sha256:3dedcc22d73ec993f42055eff4fcfed9318d1eeb9a6606c55892a26964964e48", size = 226176, upload-time = "2026-04-02T09:27:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/6a/9f/130394f9bbe06f4f63e22641d32fc9b202b7e251c9aef4db044324dac493/charset_normalizer-3.4.7-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:64f02c6841d7d83f832cd97ccf8eb8a906d06eb95d5276069175c696b024b60a", size = 217723, upload-time = "2026-04-02T09:27:02.021Z" }, + { url = "https://files.pythonhosted.org/packages/73/55/c469897448a06e49f8fa03f6caae97074fde823f432a98f979cc42b90e69/charset_normalizer-3.4.7-cp313-cp313-win32.whl", hash = "sha256:4042d5c8f957e15221d423ba781e85d553722fc4113f523f2feb7b188cc34c5e", size = 148085, upload-time = "2026-04-02T09:27:03.192Z" }, + { url = "https://files.pythonhosted.org/packages/5d/78/1b74c5bbb3f99b77a1715c91b3e0b5bdb6fe302d95ace4f5b1bec37b0167/charset_normalizer-3.4.7-cp313-cp313-win_amd64.whl", hash = "sha256:3946fa46a0cf3e4c8cb1cc52f56bb536310d34f25f01ca9b6c16afa767dab110", size = 158819, upload-time = "2026-04-02T09:27:04.454Z" }, + { url = "https://files.pythonhosted.org/packages/68/86/46bd42279d323deb8687c4a5a811fd548cb7d1de10cf6535d099877a9a9f/charset_normalizer-3.4.7-cp313-cp313-win_arm64.whl", hash = "sha256:80d04837f55fc81da168b98de4f4b797ef007fc8a79ab71c6ec9bc4dd662b15b", size = 147915, upload-time = "2026-04-02T09:27:05.971Z" }, + { url = "https://files.pythonhosted.org/packages/97/c8/c67cb8c70e19ef1960b97b22ed2a1567711de46c4ddf19799923adc836c2/charset_normalizer-3.4.7-cp314-cp314-macosx_10_15_universal2.whl", hash = "sha256:c36c333c39be2dbca264d7803333c896ab8fa7d4d6f0ab7edb7dfd7aea6e98c0", size = 309234, upload-time = "2026-04-02T09:27:07.194Z" }, + { url = "https://files.pythonhosted.org/packages/99/85/c091fdee33f20de70d6c8b522743b6f831a2f1cd3ff86de4c6a827c48a76/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1c2aed2e5e41f24ea8ef1590b8e848a79b56f3a5564a65ceec43c9d692dc7d8a", size = 208042, upload-time = "2026-04-02T09:27:08.749Z" }, + { url = "https://files.pythonhosted.org/packages/87/1c/ab2ce611b984d2fd5d86a5a8a19c1ae26acac6bad967da4967562c75114d/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:54523e136b8948060c0fa0bc7b1b50c32c186f2fceee897a495406bb6e311d2b", size = 228706, upload-time = "2026-04-02T09:27:09.951Z" }, + { url = "https://files.pythonhosted.org/packages/a8/29/2b1d2cb00bf085f59d29eb773ce58ec2d325430f8c216804a0a5cd83cbca/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:715479b9a2802ecac752a3b0efa2b0b60285cf962ee38414211abdfccc233b41", size = 224727, upload-time = "2026-04-02T09:27:11.175Z" }, + { url = "https://files.pythonhosted.org/packages/47/5c/032c2d5a07fe4d4855fea851209cca2b6f03ebeb6d4e3afdb3358386a684/charset_normalizer-3.4.7-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bd6c2a1c7573c64738d716488d2cdd3c00e340e4835707d8fdb8dc1a66ef164e", size = 215882, upload-time = "2026-04-02T09:27:12.446Z" }, + { url = "https://files.pythonhosted.org/packages/2c/c2/356065d5a8b78ed04499cae5f339f091946a6a74f91e03476c33f0ab7100/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_armv7l.whl", hash = "sha256:c45e9440fb78f8ddabcf714b68f936737a121355bf59f3907f4e17721b9d1aae", size = 200860, upload-time = "2026-04-02T09:27:13.721Z" }, + { url = "https://files.pythonhosted.org/packages/0c/cd/a32a84217ced5039f53b29f460962abb2d4420def55afabe45b1c3c7483d/charset_normalizer-3.4.7-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3534e7dcbdcf757da6b85a0bbf5b6868786d5982dd959b065e65481644817a18", size = 211564, upload-time = "2026-04-02T09:27:15.272Z" }, + { url = "https://files.pythonhosted.org/packages/44/86/58e6f13ce26cc3b8f4a36b94a0f22ae2f00a72534520f4ae6857c4b81f89/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e8ac484bf18ce6975760921bb6148041faa8fef0547200386ea0b52b5d27bf7b", size = 211276, upload-time = "2026-04-02T09:27:16.834Z" }, + { url = "https://files.pythonhosted.org/packages/8f/fe/d17c32dc72e17e155e06883efa84514ca375f8a528ba2546bee73fc4df81/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:a5fe03b42827c13cdccd08e6c0247b6a6d4b5e3cdc53fd1749f5896adcdc2356", size = 201238, upload-time = "2026-04-02T09:27:18.229Z" }, + { url = "https://files.pythonhosted.org/packages/6a/29/f33daa50b06525a237451cdb6c69da366c381a3dadcd833fa5676bc468b3/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_ppc64le.whl", hash = "sha256:2d6eb928e13016cea4f1f21d1e10c1cebd5a421bc57ddf5b1142ae3f86824fab", size = 230189, upload-time = "2026-04-02T09:27:19.445Z" }, + { url = "https://files.pythonhosted.org/packages/b6/6e/52c84015394a6a0bdcd435210a7e944c5f94ea1055f5cc5d56c5fe368e7b/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:e74327fb75de8986940def6e8dee4f127cc9752bee7355bb323cc5b2659b6d46", size = 211352, upload-time = "2026-04-02T09:27:20.79Z" }, + { url = "https://files.pythonhosted.org/packages/8c/d7/4353be581b373033fb9198bf1da3cf8f09c1082561e8e922aa7b39bf9fe8/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_s390x.whl", hash = "sha256:d6038d37043bced98a66e68d3aa2b6a35505dc01328cd65217cefe82f25def44", size = 227024, upload-time = "2026-04-02T09:27:22.063Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/99d18aa925bd1740098ccd3060e238e21115fffbfdcb8f3ece837d0ace6c/charset_normalizer-3.4.7-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:7579e913a5339fb8fa133f6bbcfd8e6749696206cf05acdbdca71a1b436d8e72", size = 217869, upload-time = "2026-04-02T09:27:23.486Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/5ee478aa53f4bb7996482153d4bfe1b89e0f087f0ab6b294fcf92d595873/charset_normalizer-3.4.7-cp314-cp314-win32.whl", hash = "sha256:5b77459df20e08151cd6f8b9ef8ef1f961ef73d85c21a555c7eed5b79410ec10", size = 148541, upload-time = "2026-04-02T09:27:25.146Z" }, + { url = "https://files.pythonhosted.org/packages/48/77/72dcb0921b2ce86420b2d79d454c7022bf5be40202a2a07906b9f2a35c97/charset_normalizer-3.4.7-cp314-cp314-win_amd64.whl", hash = "sha256:92a0a01ead5e668468e952e4238cccd7c537364eb7d851ab144ab6627dbbe12f", size = 159634, upload-time = "2026-04-02T09:27:26.642Z" }, + { url = "https://files.pythonhosted.org/packages/c6/a3/c2369911cd72f02386e4e340770f6e158c7980267da16af8f668217abaa0/charset_normalizer-3.4.7-cp314-cp314-win_arm64.whl", hash = "sha256:67f6279d125ca0046a7fd386d01b311c6363844deac3e5b069b514ba3e63c246", size = 148384, upload-time = "2026-04-02T09:27:28.271Z" }, + { url = "https://files.pythonhosted.org/packages/94/09/7e8a7f73d24dba1f0035fbbf014d2c36828fc1bf9c88f84093e57d315935/charset_normalizer-3.4.7-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:effc3f449787117233702311a1b7d8f59cba9ced946ba727bdc329ec69028e24", size = 330133, upload-time = "2026-04-02T09:27:29.474Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/96975ddb11f8e977f706f45cddd8540fd8242f71ecdb5d18a80723dcf62c/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbccdc05410c9ee21bbf16a35f4c1d16123dcdeb8a1d38f33654fa21d0234f79", size = 216257, upload-time = "2026-04-02T09:27:30.793Z" }, + { url = "https://files.pythonhosted.org/packages/e5/e8/1d63bf8ef2d388e95c64b2098f45f84758f6d102a087552da1485912637b/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:733784b6d6def852c814bce5f318d25da2ee65dd4839a0718641c696e09a2960", size = 234851, upload-time = "2026-04-02T09:27:32.44Z" }, + { url = "https://files.pythonhosted.org/packages/9b/40/e5ff04233e70da2681fa43969ad6f66ca5611d7e669be0246c4c7aaf6dc8/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a89c23ef8d2c6b27fd200a42aa4ac72786e7c60d40efdc76e6011260b6e949c4", size = 233393, upload-time = "2026-04-02T09:27:34.03Z" }, + { url = "https://files.pythonhosted.org/packages/be/c1/06c6c49d5a5450f76899992f1ee40b41d076aee9279b49cf9974d2f313d5/charset_normalizer-3.4.7-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6c114670c45346afedc0d947faf3c7f701051d2518b943679c8ff88befe14f8e", size = 223251, upload-time = "2026-04-02T09:27:35.369Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9f/f2ff16fb050946169e3e1f82134d107e5d4ae72647ec8a1b1446c148480f/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_armv7l.whl", hash = "sha256:a180c5e59792af262bf263b21a3c49353f25945d8d9f70628e73de370d55e1e1", size = 206609, upload-time = "2026-04-02T09:27:36.661Z" }, + { url = "https://files.pythonhosted.org/packages/69/d5/a527c0cd8d64d2eab7459784fb4169a0ac76e5a6fc5237337982fd61347e/charset_normalizer-3.4.7-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3c9a494bc5ec77d43cea229c4f6db1e4d8fe7e1bbffa8b6f0f0032430ff8ab44", size = 220014, upload-time = "2026-04-02T09:27:38.019Z" }, + { url = "https://files.pythonhosted.org/packages/7e/80/8a7b8104a3e203074dc9aa2c613d4b726c0e136bad1cc734594b02867972/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:8d828b6667a32a728a1ad1d93957cdf37489c57b97ae6c4de2860fa749b8fc1e", size = 218979, upload-time = "2026-04-02T09:27:39.37Z" }, + { url = "https://files.pythonhosted.org/packages/02/9a/b759b503d507f375b2b5c153e4d2ee0a75aa215b7f2489cf314f4541f2c0/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_armv7l.whl", hash = "sha256:cf1493cd8607bec4d8a7b9b004e699fcf8f9103a9284cc94962cb73d20f9d4a3", size = 209238, upload-time = "2026-04-02T09:27:40.722Z" }, + { url = "https://files.pythonhosted.org/packages/c2/4e/0f3f5d47b86bdb79256e7290b26ac847a2832d9a4033f7eb2cd4bcf4bb5b/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_ppc64le.whl", hash = "sha256:0c96c3b819b5c3e9e165495db84d41914d6894d55181d2d108cc1a69bfc9cce0", size = 236110, upload-time = "2026-04-02T09:27:42.33Z" }, + { url = "https://files.pythonhosted.org/packages/96/23/bce28734eb3ed2c91dcf93abeb8a5cf393a7b2749725030bb630e554fdd8/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:752a45dc4a6934060b3b0dab47e04edc3326575f82be64bc4fc293914566503e", size = 219824, upload-time = "2026-04-02T09:27:43.924Z" }, + { url = "https://files.pythonhosted.org/packages/2c/6f/6e897c6984cc4d41af319b077f2f600fc8214eb2fe2d6bcb79141b882400/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_s390x.whl", hash = "sha256:8778f0c7a52e56f75d12dae53ae320fae900a8b9b4164b981b9c5ce059cd1fcb", size = 233103, upload-time = "2026-04-02T09:27:45.348Z" }, + { url = "https://files.pythonhosted.org/packages/76/22/ef7bd0fe480a0ae9b656189ec00744b60933f68b4f42a7bb06589f6f576a/charset_normalizer-3.4.7-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:ce3412fbe1e31eb81ea42f4169ed94861c56e643189e1e75f0041f3fe7020abe", size = 225194, upload-time = "2026-04-02T09:27:46.706Z" }, + { url = "https://files.pythonhosted.org/packages/c5/a7/0e0ab3e0b5bc1219bd80a6a0d4d72ca74d9250cb2382b7c699c147e06017/charset_normalizer-3.4.7-cp314-cp314t-win32.whl", hash = "sha256:c03a41a8784091e67a39648f70c5f97b5b6a37f216896d44d2cdcb82615339a0", size = 159827, upload-time = "2026-04-02T09:27:48.053Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1d/29d32e0fb40864b1f878c7f5a0b343ae676c6e2b271a2d55cc3a152391da/charset_normalizer-3.4.7-cp314-cp314t-win_amd64.whl", hash = "sha256:03853ed82eeebbce3c2abfdbc98c96dc205f32a79627688ac9a27370ea61a49c", size = 174168, upload-time = "2026-04-02T09:27:49.795Z" }, + { url = "https://files.pythonhosted.org/packages/de/32/d92444ad05c7a6e41fb2036749777c163baf7a0301a040cb672d6b2b1ae9/charset_normalizer-3.4.7-cp314-cp314t-win_arm64.whl", hash = "sha256:c35abb8bfff0185efac5878da64c45dafd2b37fb0383add1be155a763c1f083d", size = 153018, upload-time = "2026-04-02T09:27:51.116Z" }, + { url = "https://files.pythonhosted.org/packages/db/8f/61959034484a4a7c527811f4721e75d02d653a35afb0b6054474d8185d4c/charset_normalizer-3.4.7-py3-none-any.whl", hash = "sha256:3dce51d0f5e7951f8bb4900c257dad282f49190fdbebecd4ba99bcc41fef404d", size = 61958, upload-time = "2026-04-02T09:28:37.794Z" }, +] + +[[package]] +name = "click" +version = "8.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/57/75/31212c6bf2503fdf920d87fee5d7a86a2e3bcf444984126f13d8e4016804/click-8.3.2.tar.gz", hash = "sha256:14162b8b3b3550a7d479eafa77dfd3c38d9dc8951f6f69c78913a8f9a7540fd5", size = 302856, upload-time = "2026-04-03T19:14:45.118Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e4/20/71885d8b97d4f3dde17b1fdb92dbd4908b00541c5a3379787137285f602e/click-8.3.2-py3-none-any.whl", hash = "sha256:1924d2c27c5653561cd2cae4548d1406039cb79b858b747cfea24924bbc1616d", size = 108379, upload-time = "2026-04-03T19:14:43.505Z" }, +] + +[[package]] +name = "colorama" +version = "0.4.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d8/53/6f443c9a4a8358a93a6792e2acffb9d9d5cb0a5cfd8802644b7b1c9a02e4/colorama-0.4.6.tar.gz", hash = "sha256:08695f5cb7ed6e0531a20572697297273c47b8cae5a63ffc6d6ed5c201be6e44", size = 27697, upload-time = "2022-10-25T02:36:22.414Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/d6/3965ed04c63042e047cb6a3e6ed1a63a35087b6a609aa3a15ed8ac56c221/colorama-0.4.6-py2.py3-none-any.whl", hash = "sha256:4f1d9991f5acc0ca119f9d443620b77f9d6b33703e51011c16baf57afb285fc6", size = 25335, upload-time = "2022-10-25T02:36:20.889Z" }, +] + +[[package]] +name = "comm" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/13/7d740c5849255756bc17888787313b61fd38a0a8304fc4f073dfc46122aa/comm-0.2.3.tar.gz", hash = "sha256:2dc8048c10962d55d7ad693be1e7045d891b7ce8d999c97963a5e3e99c055971", size = 6319, upload-time = "2025-07-25T14:02:04.452Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/97/891a0971e1e4a8c5d2b20bbe0e524dc04548d2307fee33cdeba148fd4fc7/comm-0.2.3-py3-none-any.whl", hash = "sha256:c615d91d75f7f04f095b30d1c1711babd43bdc6419c1be9886a85f2f4e489417", size = 7294, upload-time = "2025-07-25T14:02:02.896Z" }, +] + +[[package]] +name = "debugpy" +version = "1.8.20" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/b7/cd8080344452e4874aae67c40d8940e2b4d47b01601a8fd9f44786c757c7/debugpy-1.8.20.tar.gz", hash = "sha256:55bc8701714969f1ab89a6d5f2f3d40c36f91b2cbe2f65d98bf8196f6a6a2c33", size = 1645207, upload-time = "2026-01-29T23:03:28.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/57/7f34f4736bfb6e00f2e4c96351b07805d83c9a7b33d28580ae01374430f7/debugpy-1.8.20-cp312-cp312-macosx_15_0_universal2.whl", hash = "sha256:4ae3135e2089905a916909ef31922b2d733d756f66d87345b3e5e52b7a55f13d", size = 2550686, upload-time = "2026-01-29T23:03:42.023Z" }, + { url = "https://files.pythonhosted.org/packages/ab/78/b193a3975ca34458f6f0e24aaf5c3e3da72f5401f6054c0dfd004b41726f/debugpy-1.8.20-cp312-cp312-manylinux_2_34_x86_64.whl", hash = "sha256:88f47850a4284b88bd2bfee1f26132147d5d504e4e86c22485dfa44b97e19b4b", size = 4310588, upload-time = "2026-01-29T23:03:43.314Z" }, + { url = "https://files.pythonhosted.org/packages/c1/55/f14deb95eaf4f30f07ef4b90a8590fc05d9e04df85ee379712f6fb6736d7/debugpy-1.8.20-cp312-cp312-win32.whl", hash = "sha256:4057ac68f892064e5f98209ab582abfee3b543fb55d2e87610ddc133a954d390", size = 5331372, upload-time = "2026-01-29T23:03:45.526Z" }, + { url = "https://files.pythonhosted.org/packages/a1/39/2bef246368bd42f9bd7cba99844542b74b84dacbdbea0833e610f384fee8/debugpy-1.8.20-cp312-cp312-win_amd64.whl", hash = "sha256:a1a8f851e7cf171330679ef6997e9c579ef6dd33c9098458bd9986a0f4ca52e3", size = 5372835, upload-time = "2026-01-29T23:03:47.245Z" }, + { url = "https://files.pythonhosted.org/packages/15/e2/fc500524cc6f104a9d049abc85a0a8b3f0d14c0a39b9c140511c61e5b40b/debugpy-1.8.20-cp313-cp313-macosx_15_0_universal2.whl", hash = "sha256:5dff4bb27027821fdfcc9e8f87309a28988231165147c31730128b1c983e282a", size = 2539560, upload-time = "2026-01-29T23:03:48.738Z" }, + { url = "https://files.pythonhosted.org/packages/90/83/fb33dcea789ed6018f8da20c5a9bc9d82adc65c0c990faed43f7c955da46/debugpy-1.8.20-cp313-cp313-manylinux_2_34_x86_64.whl", hash = "sha256:84562982dd7cf5ebebfdea667ca20a064e096099997b175fe204e86817f64eaf", size = 4293272, upload-time = "2026-01-29T23:03:50.169Z" }, + { url = "https://files.pythonhosted.org/packages/a6/25/b1e4a01bfb824d79a6af24b99ef291e24189080c93576dfd9b1a2815cd0f/debugpy-1.8.20-cp313-cp313-win32.whl", hash = "sha256:da11dea6447b2cadbf8ce2bec59ecea87cc18d2c574980f643f2d2dfe4862393", size = 5331208, upload-time = "2026-01-29T23:03:51.547Z" }, + { url = "https://files.pythonhosted.org/packages/13/f7/a0b368ce54ffff9e9028c098bd2d28cfc5b54f9f6c186929083d4c60ba58/debugpy-1.8.20-cp313-cp313-win_amd64.whl", hash = "sha256:eb506e45943cab2efb7c6eafdd65b842f3ae779f020c82221f55aca9de135ed7", size = 5372930, upload-time = "2026-01-29T23:03:53.585Z" }, + { url = "https://files.pythonhosted.org/packages/33/2e/f6cb9a8a13f5058f0a20fe09711a7b726232cd5a78c6a7c05b2ec726cff9/debugpy-1.8.20-cp314-cp314-macosx_15_0_universal2.whl", hash = "sha256:9c74df62fc064cd5e5eaca1353a3ef5a5d50da5eb8058fcef63106f7bebe6173", size = 2538066, upload-time = "2026-01-29T23:03:54.999Z" }, + { url = "https://files.pythonhosted.org/packages/c5/56/6ddca50b53624e1ca3ce1d1e49ff22db46c47ea5fb4c0cc5c9b90a616364/debugpy-1.8.20-cp314-cp314-manylinux_2_34_x86_64.whl", hash = "sha256:077a7447589ee9bc1ff0cdf443566d0ecf540ac8aa7333b775ebcb8ce9f4ecad", size = 4269425, upload-time = "2026-01-29T23:03:56.518Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d9/d64199c14a0d4c476df46c82470a3ce45c8d183a6796cfb5e66533b3663c/debugpy-1.8.20-cp314-cp314-win32.whl", hash = "sha256:352036a99dd35053b37b7803f748efc456076f929c6a895556932eaf2d23b07f", size = 5331407, upload-time = "2026-01-29T23:03:58.481Z" }, + { url = "https://files.pythonhosted.org/packages/e0/d9/1f07395b54413432624d61524dfd98c1a7c7827d2abfdb8829ac92638205/debugpy-1.8.20-cp314-cp314-win_amd64.whl", hash = "sha256:a98eec61135465b062846112e5ecf2eebb855305acc1dfbae43b72903b8ab5be", size = 5372521, upload-time = "2026-01-29T23:03:59.864Z" }, + { url = "https://files.pythonhosted.org/packages/e0/c3/7f67dea8ccf8fdcb9c99033bbe3e90b9e7395415843accb81428c441be2d/debugpy-1.8.20-py2.py3-none-any.whl", hash = "sha256:5be9bed9ae3be00665a06acaa48f8329d2b9632f15fd09f6a9a8c8d9907e54d7", size = 5337658, upload-time = "2026-01-29T23:04:17.404Z" }, +] + +[[package]] +name = "decorator" +version = "5.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/fa/6d96a0978d19e17b68d634497769987b16c8f4cd0a7a05048bec693caa6b/decorator-5.2.1.tar.gz", hash = "sha256:65f266143752f734b0a7cc83c46f4618af75b8c5911b00ccb61d0ac9b6da0360", size = 56711, upload-time = "2025-02-24T04:41:34.073Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/8c/f3147f5c4b73e7550fe5f9352eaa956ae838d5c51eb58e7a25b9f3e2643b/decorator-5.2.1-py3-none-any.whl", hash = "sha256:d316bb415a2d9e2d2b3abcc4084c6502fc09240e292cd76a76afc106a1c8e04a", size = 9190, upload-time = "2025-02-24T04:41:32.565Z" }, +] + +[[package]] +name = "donfig" +version = "0.8.1.post1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/25/71/80cc718ff6d7abfbabacb1f57aaa42e9c1552bfdd01e64ddd704e4a03638/donfig-0.8.1.post1.tar.gz", hash = "sha256:3bef3413a4c1c601b585e8d297256d0c1470ea012afa6e8461dc28bfb7c23f52", size = 19506, upload-time = "2024-05-23T14:14:31.513Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/d5/c5db1ea3394c6e1732fb3286b3bd878b59507a8f77d32a2cebda7d7b7cd4/donfig-0.8.1.post1-py3-none-any.whl", hash = "sha256:2a3175ce74a06109ff9307d90a230f81215cbac9a751f4d1c6194644b8204f9d", size = 21592, upload-time = "2024-05-23T14:13:55.283Z" }, +] + +[[package]] +name = "executing" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cc/28/c14e053b6762b1044f34a13aab6859bbf40456d37d23aa286ac24cfd9a5d/executing-2.2.1.tar.gz", hash = "sha256:3632cc370565f6648cc328b32435bd120a1e4ebb20c77e3fdde9a13cd1e533c4", size = 1129488, upload-time = "2025-09-01T09:48:10.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/ea/53f2148663b321f21b5a606bd5f191517cf40b7072c0497d3c92c4a13b1e/executing-2.2.1-py2.py3-none-any.whl", hash = "sha256:760643d3452b4d777d295bb167ccc74c64a81df23fb5e08eff250c425a4b2017", size = 28317, upload-time = "2025-09-01T09:48:08.5Z" }, +] + +[[package]] +name = "ghp-import" +version = "2.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/29/d40217cbe2f6b1359e00c6c307bb3fc876ba74068cbab3dde77f03ca0dc4/ghp-import-2.1.0.tar.gz", hash = "sha256:9c535c4c61193c2df8871222567d7fd7e5014d835f97dc7b7439069e2413d343", size = 10943, upload-time = "2022-05-02T15:47:16.11Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/ec/67fbef5d497f86283db54c22eec6f6140243aae73265799baaaa19cd17fb/ghp_import-2.1.0-py3-none-any.whl", hash = "sha256:8337dd7b50877f163d4c0289bc1f1c7f127550241988d568c1db512c4324a619", size = 11034, upload-time = "2022-05-02T15:47:14.552Z" }, +] + +[[package]] +name = "google-crc32c" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/03/41/4b9c02f99e4c5fb477122cd5437403b552873f014616ac1d19ac8221a58d/google_crc32c-1.8.0.tar.gz", hash = "sha256:a428e25fb7691024de47fecfbff7ff957214da51eddded0da0ae0e0f03a2cf79", size = 14192, upload-time = "2025-12-16T00:35:25.142Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e9/5f/7307325b1198b59324c0fa9807cafb551afb65e831699f2ce211ad5c8240/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:4b8286b659c1335172e39563ab0a768b8015e88e08329fa5321f774275fc3113", size = 31300, upload-time = "2025-12-16T00:21:56.723Z" }, + { url = "https://files.pythonhosted.org/packages/21/8e/58c0d5d86e2220e6a37befe7e6a94dd2f6006044b1a33edf1ff6d9f7e319/google_crc32c-1.8.0-cp312-cp312-macosx_12_0_x86_64.whl", hash = "sha256:2a3dc3318507de089c5384cc74d54318401410f82aa65b2d9cdde9d297aca7cb", size = 30867, upload-time = "2025-12-16T00:38:31.302Z" }, + { url = "https://files.pythonhosted.org/packages/ce/a9/a780cc66f86335a6019f557a8aaca8fbb970728f0efd2430d15ff1beae0e/google_crc32c-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:14f87e04d613dfa218d6135e81b78272c3b904e2a7053b841481b38a7d901411", size = 33364, upload-time = "2025-12-16T00:40:22.96Z" }, + { url = "https://files.pythonhosted.org/packages/21/3f/3457ea803db0198c9aaca2dd373750972ce28a26f00544b6b85088811939/google_crc32c-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:cb5c869c2923d56cb0c8e6bcdd73c009c36ae39b652dbe46a05eb4ef0ad01454", size = 33740, upload-time = "2025-12-16T00:40:23.96Z" }, + { url = "https://files.pythonhosted.org/packages/df/c0/87c2073e0c72515bb8733d4eef7b21548e8d189f094b5dad20b0ecaf64f6/google_crc32c-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:3cc0c8912038065eafa603b238abf252e204accab2a704c63b9e14837a854962", size = 34437, upload-time = "2025-12-16T00:35:21.395Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/000f15b41724589b0e7bc24bc7a8967898d8d3bc8caf64c513d91ef1f6c0/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_arm64.whl", hash = "sha256:3ebb04528e83b2634857f43f9bb8ef5b2bbe7f10f140daeb01b58f972d04736b", size = 31297, upload-time = "2025-12-16T00:23:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/d7/0d/8ebed0c39c53a7e838e2a486da8abb0e52de135f1b376ae2f0b160eb4c1a/google_crc32c-1.8.0-cp313-cp313-macosx_12_0_x86_64.whl", hash = "sha256:450dc98429d3e33ed2926fc99ee81001928d63460f8538f21a5d6060912a8e27", size = 30867, upload-time = "2025-12-16T00:43:14.628Z" }, + { url = "https://files.pythonhosted.org/packages/ce/42/b468aec74a0354b34c8cbf748db20d6e350a68a2b0912e128cabee49806c/google_crc32c-1.8.0-cp313-cp313-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:3b9776774b24ba76831609ffbabce8cdf6fa2bd5e9df37b594221c7e333a81fa", size = 33344, upload-time = "2025-12-16T00:40:24.742Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e8/b33784d6fc77fb5062a8a7854e43e1e618b87d5ddf610a88025e4de6226e/google_crc32c-1.8.0-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:89c17d53d75562edfff86679244830599ee0a48efc216200691de8b02ab6b2b8", size = 33694, upload-time = "2025-12-16T00:40:25.505Z" }, + { url = "https://files.pythonhosted.org/packages/92/b1/d3cbd4d988afb3d8e4db94ca953df429ed6db7282ed0e700d25e6c7bfc8d/google_crc32c-1.8.0-cp313-cp313-win_amd64.whl", hash = "sha256:57a50a9035b75643996fbf224d6661e386c7162d1dfdab9bc4ca790947d1007f", size = 34435, upload-time = "2025-12-16T00:35:22.107Z" }, + { url = "https://files.pythonhosted.org/packages/21/88/8ecf3c2b864a490b9e7010c84fd203ec8cf3b280651106a3a74dd1b0ca72/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_arm64.whl", hash = "sha256:e6584b12cb06796d285d09e33f63309a09368b9d806a551d8036a4207ea43697", size = 31301, upload-time = "2025-12-16T00:24:48.527Z" }, + { url = "https://files.pythonhosted.org/packages/36/c6/f7ff6c11f5ca215d9f43d3629163727a272eabc356e5c9b2853df2bfe965/google_crc32c-1.8.0-cp314-cp314-macosx_12_0_x86_64.whl", hash = "sha256:f4b51844ef67d6cf2e9425983274da75f18b1597bb2c998e1c0a0e8d46f8f651", size = 30868, upload-time = "2025-12-16T00:48:12.163Z" }, + { url = "https://files.pythonhosted.org/packages/56/15/c25671c7aad70f8179d858c55a6ae8404902abe0cdcf32a29d581792b491/google_crc32c-1.8.0-cp314-cp314-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b0d1a7afc6e8e4635564ba8aa5c0548e3173e41b6384d7711a9123165f582de2", size = 33381, upload-time = "2025-12-16T00:40:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/42/fa/f50f51260d7b0ef5d4898af122d8a7ec5a84e2984f676f746445f783705f/google_crc32c-1.8.0-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8b3f68782f3cbd1bce027e48768293072813469af6a61a86f6bb4977a4380f21", size = 33734, upload-time = "2025-12-16T00:40:27.028Z" }, + { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, +] + +[[package]] +name = "icechunk" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "zarr" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e2/24/dfff6a94dd007d3ab95343f19dc865f4e6b87f69015456af778f2b12401e/icechunk-2.0.3.tar.gz", hash = "sha256:51725570cf1c4dbb5709f3dbca41dee78951447be0fcba8b0370278a3dabade8", size = 2963765, upload-time = "2026-04-16T03:35:00.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/57/20/b5ba8ed6efeb2c0f6df2a58b386702682f8e744c912d18e8d2219da6df7d/icechunk-2.0.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:f6c715871d757c01107cccf6abf50432e5e7947382cc1fa85044e691b59683a6", size = 16844983, upload-time = "2026-04-16T03:35:34.544Z" }, + { url = "https://files.pythonhosted.org/packages/56/fd/7e64489e4f6a692e74ca6b721c1b5bb9444398f981cad3e1c039de1a5bf4/icechunk-2.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5a3bdaee4295917960c185ee9ae01dcf5f3410a25b51eb5962d0d2939a337da4", size = 15508694, upload-time = "2026-04-16T03:35:23.567Z" }, + { url = "https://files.pythonhosted.org/packages/0a/e2/7bb9142fd1e20a39d039f13e18e43486ff27060c22b7345306f1e664e62a/icechunk-2.0.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e84292f690a35e9b9d6ef9ba22a1679585cccf2ffc13e135ce6290e9722202f1", size = 17211955, upload-time = "2026-04-16T03:35:12.693Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/0c579af082fa30e5e9c3e742520ed49834a791eaf5df40fcd23036b718b8/icechunk-2.0.3-cp312-cp312-manylinux_2_28_aarch64.whl", hash = "sha256:88fd72b3144dee6bc4a139cd313b7d48d0d181718ff405f0a30317157262b6b8", size = 16824020, upload-time = "2026-04-16T03:34:50.526Z" }, + { url = "https://files.pythonhosted.org/packages/f7/59/07de1ed19f532e9d8738866c292eba5cb5f427f8410fe09e53d7f09ccec8/icechunk-2.0.3-cp312-cp312-manylinux_2_28_armv7l.whl", hash = "sha256:d8bf1f98f16efb55a39765d7a27482df4194fa1ddfd07b3a1a804efa5113418d", size = 16703566, upload-time = "2026-04-16T03:35:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/6a/60/307b321122d2d5ca50d287de12b6389c9408b380cb42bd37da5b8777a7e2/icechunk-2.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ba26f14d6988931b831dfd9272ed189a31c9a8e82949fb9cce2c5693f0624e12", size = 17043942, upload-time = "2026-04-16T03:35:43.827Z" }, + { url = "https://files.pythonhosted.org/packages/62/65/22773ca40872f375f5d256ad9cba3a07f182b1eef0d3f16625f0ffcecee9/icechunk-2.0.3-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:0462f6530b3bd8bed1589736b30a49f7ec8180fd748e390090ff64d8c87d9f85", size = 16869551, upload-time = "2026-04-16T03:35:53.658Z" }, + { url = "https://files.pythonhosted.org/packages/f0/f9/9dc894fd1ab077ccb39534a44b9e4099ead299bc95a9ba3634ce3b9329eb/icechunk-2.0.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:9ffc2a3e82ce5b72674161eb96c028943f3b1e4f373acdacfe2a12905a9faee0", size = 16966145, upload-time = "2026-04-16T03:36:02.609Z" }, + { url = "https://files.pythonhosted.org/packages/5d/62/df6eb1362a7248852a8b2b3acaefba279bedb2421b1fc4b2bf9d1635c91c/icechunk-2.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fdb855623c95fac639b1856b09e188f20813ff120d445c44812727ea0f8af8ca", size = 17620385, upload-time = "2026-04-16T03:36:11.828Z" }, + { url = "https://files.pythonhosted.org/packages/7b/66/d767a68b7b72b896b841d53f32d14330c64aa585a21e973e411403626299/icechunk-2.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:3a018e98cbf3183b3899afa0476cc8129261f89e6e0e449d36a9d7996290158b", size = 15948454, upload-time = "2026-04-16T03:36:21.593Z" }, + { url = "https://files.pythonhosted.org/packages/33/9d/a13c72fccb6c9099189fae28c08d7c958dc11064414567d8036b27ce9725/icechunk-2.0.3-cp313-cp313-macosx_10_12_x86_64.whl", hash = "sha256:b2bbf1ee4785e9c7be04feacc599500b450af9cb9c42ecf4d74b341533006e7a", size = 16844017, upload-time = "2026-04-16T03:35:37.463Z" }, + { url = "https://files.pythonhosted.org/packages/92/78/5e0f9afc3203edb3226fd8a45dabb45dac7051c97d9474f5deb19489800e/icechunk-2.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a46be4527237ba54bca1b979b060a06f808289307885fce35d45217bb6b1238c", size = 15507201, upload-time = "2026-04-16T03:35:27.529Z" }, + { url = "https://files.pythonhosted.org/packages/0f/9f/3576d375d80a8291724eadefdc6a26aab1ea749d93cd828ee986c28c8f60/icechunk-2.0.3-cp313-cp313-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ff6759e3b23261a4b28e0f0b00c4c5d9e5b1f94ccf82e61be251a235a122128c", size = 17211289, upload-time = "2026-04-16T03:35:15.618Z" }, + { url = "https://files.pythonhosted.org/packages/9a/11/a8b98a2d62445af62c2389163c68da2598b64d75d5a8a1251b5b68d1ef3c/icechunk-2.0.3-cp313-cp313-manylinux_2_28_aarch64.whl", hash = "sha256:5fdef6b06153c20ef5013f03b63360bbddfbfc8562f0bb7aedeebbe62118b948", size = 16822825, upload-time = "2026-04-16T03:34:54.184Z" }, + { url = "https://files.pythonhosted.org/packages/cf/c1/153a3cda237d56e0e4a86d4fa14a3b7054c8a9be909c457fe12777d95c50/icechunk-2.0.3-cp313-cp313-manylinux_2_28_armv7l.whl", hash = "sha256:7cb8d5a7c5dfcc552511584267be8f49765f80f0becab29677781bfa1ba595c3", size = 16702944, upload-time = "2026-04-16T03:35:05.895Z" }, + { url = "https://files.pythonhosted.org/packages/bf/44/2a3bf02f956a9714457f6b1b3db703d0cef390fbc554d059fa11133e291c/icechunk-2.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:fbb78b4e7b4da83a5b02e73e85aaf2fb0dd533ea6ac774c9d46284c166674819", size = 17041023, upload-time = "2026-04-16T03:35:47.647Z" }, + { url = "https://files.pythonhosted.org/packages/c1/80/7fcd4d2bdf65551e83ef2c2b46f8bea426e5a37ad7e1c65107ba08019025/icechunk-2.0.3-cp313-cp313-musllinux_1_2_armv7l.whl", hash = "sha256:fb5e05e97235fa9b1ff18947b538b0c0fc85a6109d53cce959c81988f9149d03", size = 16868580, upload-time = "2026-04-16T03:35:56.675Z" }, + { url = "https://files.pythonhosted.org/packages/87/d7/d003a1117211b9127b977c0a6753a51edde2aee47fc1ecdeb9e1b41ebc11/icechunk-2.0.3-cp313-cp313-musllinux_1_2_i686.whl", hash = "sha256:9fde8f045412bd893c5b65e3ba7f16a623f6bb225e1d1dc172e09cc6fa0d1527", size = 16966319, upload-time = "2026-04-16T03:36:05.556Z" }, + { url = "https://files.pythonhosted.org/packages/52/85/ab008d9b8fdbc5d0cf6e1812a0f575b0b99f814e78e8536757271800cc37/icechunk-2.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:e954694ff52e9bb7a78b40d6d50a139f247388924aad8748904d7f7d8bae77fd", size = 17619184, upload-time = "2026-04-16T03:36:15.011Z" }, + { url = "https://files.pythonhosted.org/packages/e3/6e/fd8d6a459a3c2f1a536999048ffc5b772c16f4859c9b2857ff16eeb0faf2/icechunk-2.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:66c065e7f6c6c3ff43fed27c8e504c45da8c26f3c9466c490c918d6e71a9c282", size = 15948079, upload-time = "2026-04-16T03:36:24.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/c7/17e04ceee3d0231d254b2872b31e1c7544f20907ac29c67e64d4a79fff65/icechunk-2.0.3-cp314-cp314-macosx_10_12_x86_64.whl", hash = "sha256:c70a286a01682135ebc6f3bee61e1b847de48ce7f3ed1196454daf87337357ab", size = 16848875, upload-time = "2026-04-16T03:35:40.601Z" }, + { url = "https://files.pythonhosted.org/packages/f9/9c/36700145ec9fc285c8d3c068cc8ba93faf225eb884ece874038cf0251336/icechunk-2.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:d6d67619d5bc06c1767b3a26c483583410fc0b5a1bbe633cbfbaf5bdb362f987", size = 15510751, upload-time = "2026-04-16T03:35:30.938Z" }, + { url = "https://files.pythonhosted.org/packages/97/94/736d57abfa6816ef51e7cbf655ee2c9a2a2f5e55774afdcfb5b1aa9a0cd7/icechunk-2.0.3-cp314-cp314-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:2d26cd91fbe860a6c31d413c51b08593afaa7faf85bd083ec8c2b5d3f973b01c", size = 17219544, upload-time = "2026-04-16T03:35:19.592Z" }, + { url = "https://files.pythonhosted.org/packages/51/ad/946fd17af99c10d26ec95967de80e51db498016e794872a87a0ad0c65463/icechunk-2.0.3-cp314-cp314-manylinux_2_28_aarch64.whl", hash = "sha256:099261c04b5cfe78b63d089cedeb826ea5229c371395da5788da37357800d8f5", size = 16830897, upload-time = "2026-04-16T03:34:57.357Z" }, + { url = "https://files.pythonhosted.org/packages/0a/de/749024ec18937e5a84d28d03394e213e0cf0b52dabc221b02554b7abd085/icechunk-2.0.3-cp314-cp314-manylinux_2_28_armv7l.whl", hash = "sha256:925dcc84c35e6bdcd1699ff7aa396905012f42b34f320d95f7d9805415dd890c", size = 16713507, upload-time = "2026-04-16T03:35:08.817Z" }, + { url = "https://files.pythonhosted.org/packages/c2/22/b389189e61835d0de3402bfbdb11de966da540e6c901e3943b5710806eb9/icechunk-2.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7809e1d0b5e8fc5cb9bfbe6d5da64421ea0349d9faaf786ab3df35b7239f0bc0", size = 17049900, upload-time = "2026-04-16T03:35:50.741Z" }, + { url = "https://files.pythonhosted.org/packages/07/c4/38b960ea2c5945462db8b0267d1c026a93e1a434f5e7132b3a224524bd45/icechunk-2.0.3-cp314-cp314-musllinux_1_2_armv7l.whl", hash = "sha256:3762d46cbdda3f99d6daed5ac7b8234b7e4213b7cf592952f914c59636fc69b0", size = 16875557, upload-time = "2026-04-16T03:35:59.904Z" }, + { url = "https://files.pythonhosted.org/packages/2d/7c/47b905285974f5973bf09c725b589df1c7dc8853d82d5126dbce75efb009/icechunk-2.0.3-cp314-cp314-musllinux_1_2_i686.whl", hash = "sha256:de420657b9de86c5e0df7ac908fa507650e7f7ec5303f8fc74d2ad67e212b9a2", size = 16973074, upload-time = "2026-04-16T03:36:08.875Z" }, + { url = "https://files.pythonhosted.org/packages/f8/c3/98326c50afd523662b44ad4c38c56e039a8cdd9a80b9e56e83deeadbe555/icechunk-2.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:ed0b5cb12f54fbf29e36d14c1299729e3036d089b9c65fbfafc9eced88bd5eea", size = 17627673, upload-time = "2026-04-16T03:36:17.941Z" }, + { url = "https://files.pythonhosted.org/packages/d6/78/692a639107ebb6331efd4656fa057ef172d12c03c47280c80a96b986da5c/icechunk-2.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:8d556d1f77e8d1fa97a491f78061441ddc2fc0a932be945be0147632caa99ec8", size = 15956410, upload-time = "2026-04-16T03:36:27.326Z" }, +] + +[[package]] +name = "idna" +version = "3.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/12/2948fbe5513d062169bd91f7d7b1cd97bc8894f32946b71fa39f6e63ca0c/idna-3.12.tar.gz", hash = "sha256:724e9952cc9e2bd7550ea784adb098d837ab5267ef67a1ab9cf7846bdbdd8254", size = 194350, upload-time = "2026-04-21T13:32:48.916Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/53/b2/acc33950394b3becb2b664741a0c0889c7ef9f9ffbfa8d47eddb53a50abd/idna-3.12-py3-none-any.whl", hash = "sha256:60ffaa1858fac94c9c124728c24fcde8160f3fb4a7f79aa8cdd33a9d1af60a67", size = 68634, upload-time = "2026-04-21T13:32:47.403Z" }, +] + +[[package]] +name = "ipykernel" +version = "7.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "appnope", marker = "sys_platform == 'darwin'" }, + { name = "comm" }, + { name = "debugpy" }, + { name = "ipython" }, + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "matplotlib-inline" }, + { name = "nest-asyncio" }, + { name = "packaging" }, + { name = "psutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/8d/b68b728e2d06b9e0051019640a40a9eb7a88fcd82c2e1b5ce70bef5ff044/ipykernel-7.2.0.tar.gz", hash = "sha256:18ed160b6dee2cbb16e5f3575858bc19d8f1fe6046a9a680c708494ce31d909e", size = 176046, upload-time = "2026-02-06T16:43:27.403Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/b9/e73d5d9f405cba7706c539aa8b311b49d4c2f3d698d9c12f815231169c71/ipykernel-7.2.0-py3-none-any.whl", hash = "sha256:3bbd4420d2b3cc105cbdf3756bfc04500b1e52f090a90716851f3916c62e1661", size = 118788, upload-time = "2026-02-06T16:43:25.149Z" }, +] + +[[package]] +name = "ipython" +version = "9.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "ipython-pygments-lexers" }, + { name = "jedi" }, + { name = "matplotlib-inline" }, + { name = "pexpect", marker = "sys_platform != 'emscripten' and sys_platform != 'win32'" }, + { name = "prompt-toolkit" }, + { name = "pygments" }, + { name = "stack-data" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3a/73/7114f80a8f9cabdb13c27732dce24af945b2923dcab80723602f7c8bc2d8/ipython-9.12.0.tar.gz", hash = "sha256:01daa83f504b693ba523b5a407246cabde4eb4513285a3c6acaff11a66735ee4", size = 4428879, upload-time = "2026-03-27T09:42:45.312Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/22/906c8108974c673ebef6356c506cebb6870d48cedea3c41e949e2dd556bb/ipython-9.12.0-py3-none-any.whl", hash = "sha256:0f2701e8ee86e117e37f50563205d36feaa259d2e08d4a6bc6b6d74b18ce128d", size = 625661, upload-time = "2026-03-27T09:42:42.831Z" }, +] + +[[package]] +name = "ipython-pygments-lexers" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ef/4c/5dd1d8af08107f88c7f741ead7a40854b8ac24ddf9ae850afbcf698aa552/ipython_pygments_lexers-1.1.1.tar.gz", hash = "sha256:09c0138009e56b6854f9535736f4171d855c8c08a563a0dcd8022f78355c7e81", size = 8393, upload-time = "2025-01-17T11:24:34.505Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d9/33/1f075bf72b0b747cb3288d011319aaf64083cf2efef8354174e3ed4540e2/ipython_pygments_lexers-1.1.1-py3-none-any.whl", hash = "sha256:a9462224a505ade19a605f71f8fa63c2048833ce50abc86768a0d81d876dc81c", size = 8074, upload-time = "2025-01-17T11:24:33.271Z" }, +] + +[[package]] +name = "jedi" +version = "0.19.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/3a/79a912fbd4d8dd6fbb02bf69afd3bb72cf0c729bb3063c6f4498603db17a/jedi-0.19.2.tar.gz", hash = "sha256:4770dc3de41bde3966b02eb84fbcf557fb33cce26ad23da12c742fb50ecb11f0", size = 1231287, upload-time = "2024-11-11T01:41:42.873Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/5a/9cac0c82afec3d09ccd97c8b6502d48f165f9124db81b4bcb90b4af974ee/jedi-0.19.2-py2.py3-none-any.whl", hash = "sha256:a8ef22bde8490f57fe5c7681a3c83cb58874daf72b4784de3cce5b6ef6edb5b9", size = 1572278, upload-time = "2024-11-11T01:41:40.175Z" }, +] + +[[package]] +name = "jinja2" +version = "3.1.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markupsafe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/bf/f7da0350254c0ed7c72f3e33cef02e048281fec7ecec5f032d4aac52226b/jinja2-3.1.6.tar.gz", hash = "sha256:0137fb05990d35f1275a587e9aee6d56da821fc83491a0fb838183be43f66d6d", size = 245115, upload-time = "2025-03-05T20:05:02.478Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/a1/3d680cbfd5f4b8f15abc1d571870c5fc3e594bb582bc3b64ea099db13e56/jinja2-3.1.6-py3-none-any.whl", hash = "sha256:85ece4451f492d0c13c5dd7c13a64681a86afae63a5f347908daf103ce6d2f67", size = 134899, upload-time = "2025-03-05T20:05:00.369Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/05/e4/ba649102a3bc3fbca54e7239fb924fd434c766f855693d86de0b1f2bec81/jupyter_client-8.8.0.tar.gz", hash = "sha256:d556811419a4f2d96c869af34e854e3f059b7cc2d6d01a9cd9c85c267691be3e", size = 348020, upload-time = "2026-01-08T13:55:47.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2d/0b/ceb7694d864abc0a047649aec263878acb9f792e1fec3e676f22dc9015e3/jupyter_client-8.8.0-py3-none-any.whl", hash = "sha256:f93a5b99c5e23a507b773d3a1136bd6e16c67883ccdbd9a829b0bbdb98cd7d7a", size = 107371, upload-time = "2026-01-08T13:55:45.562Z" }, +] + +[[package]] +name = "jupyter-core" +version = "5.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "platformdirs" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/49/9d1284d0dc65e2c757b74c6687b6d319b02f822ad039e5c512df9194d9dd/jupyter_core-5.9.1.tar.gz", hash = "sha256:4d09aaff303b9566c3ce657f580bd089ff5c91f5f89cf7d8846c3cdf465b5508", size = 89814, upload-time = "2025-10-16T19:19:18.444Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/e7/80988e32bf6f73919a113473a604f5a8f09094de312b9d52b79c2df7612b/jupyter_core-5.9.1-py3-none-any.whl", hash = "sha256:ebf87fdc6073d142e114c72c9e29a9d7ca03fad818c5d300ce2adc1fb0743407", size = 29032, upload-time = "2025-10-16T19:19:16.783Z" }, +] + +[[package]] +name = "markdown" +version = "3.10.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2b/f4/69fa6ed85ae003c2378ffa8f6d2e3234662abd02c10d216c0ba96081a238/markdown-3.10.2.tar.gz", hash = "sha256:994d51325d25ad8aa7ce4ebaec003febcce822c3f8c911e3b17c52f7f589f950", size = 368805, upload-time = "2026-02-09T14:57:26.942Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/de/1f/77fa3081e4f66ca3576c896ae5d31c3002ac6607f9747d2e3aa49227e464/markdown-3.10.2-py3-none-any.whl", hash = "sha256:e91464b71ae3ee7afd3017d9f358ef0baf158fd9a298db92f1d4761133824c36", size = 108180, upload-time = "2026-02-09T14:57:25.787Z" }, +] + +[[package]] +name = "markupsafe" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/7e/99/7690b6d4034fffd95959cbe0c02de8deb3098cc577c67bb6a24fe5d7caa7/markupsafe-3.0.3.tar.gz", hash = "sha256:722695808f4b6457b320fdc131280796bdceb04ab50fe1795cd540799ebe1698", size = 80313, upload-time = "2025-09-27T18:37:40.426Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5a/72/147da192e38635ada20e0a2e1a51cf8823d2119ce8883f7053879c2199b5/markupsafe-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d53197da72cc091b024dd97249dfc7794d6a56530370992a5e1a08983ad9230e", size = 11615, upload-time = "2025-09-27T18:36:30.854Z" }, + { url = "https://files.pythonhosted.org/packages/9a/81/7e4e08678a1f98521201c3079f77db69fb552acd56067661f8c2f534a718/markupsafe-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1872df69a4de6aead3491198eaf13810b565bdbeec3ae2dc8780f14458ec73ce", size = 12020, upload-time = "2025-09-27T18:36:31.971Z" }, + { url = "https://files.pythonhosted.org/packages/1e/2c/799f4742efc39633a1b54a92eec4082e4f815314869865d876824c257c1e/markupsafe-3.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a7e8ae81ae39e62a41ec302f972ba6ae23a5c5396c8e60113e9066ef893da0d", size = 24332, upload-time = "2025-09-27T18:36:32.813Z" }, + { url = "https://files.pythonhosted.org/packages/3c/2e/8d0c2ab90a8c1d9a24f0399058ab8519a3279d1bd4289511d74e909f060e/markupsafe-3.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d6dd0be5b5b189d31db7cda48b91d7e0a9795f31430b7f271219ab30f1d3ac9d", size = 22947, upload-time = "2025-09-27T18:36:33.86Z" }, + { url = "https://files.pythonhosted.org/packages/2c/54/887f3092a85238093a0b2154bd629c89444f395618842e8b0c41783898ea/markupsafe-3.0.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:94c6f0bb423f739146aec64595853541634bde58b2135f27f61c1ffd1cd4d16a", size = 21962, upload-time = "2025-09-27T18:36:35.099Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2f/336b8c7b6f4a4d95e91119dc8521402461b74a485558d8f238a68312f11c/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:be8813b57049a7dc738189df53d69395eba14fb99345e0a5994914a3864c8a4b", size = 23760, upload-time = "2025-09-27T18:36:36.001Z" }, + { url = "https://files.pythonhosted.org/packages/32/43/67935f2b7e4982ffb50a4d169b724d74b62a3964bc1a9a527f5ac4f1ee2b/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:83891d0e9fb81a825d9a6d61e3f07550ca70a076484292a70fde82c4b807286f", size = 21529, upload-time = "2025-09-27T18:36:36.906Z" }, + { url = "https://files.pythonhosted.org/packages/89/e0/4486f11e51bbba8b0c041098859e869e304d1c261e59244baa3d295d47b7/markupsafe-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:77f0643abe7495da77fb436f50f8dab76dbc6e5fd25d39589a0f1fe6548bfa2b", size = 23015, upload-time = "2025-09-27T18:36:37.868Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e1/78ee7a023dac597a5825441ebd17170785a9dab23de95d2c7508ade94e0e/markupsafe-3.0.3-cp312-cp312-win32.whl", hash = "sha256:d88b440e37a16e651bda4c7c2b930eb586fd15ca7406cb39e211fcff3bf3017d", size = 14540, upload-time = "2025-09-27T18:36:38.761Z" }, + { url = "https://files.pythonhosted.org/packages/aa/5b/bec5aa9bbbb2c946ca2733ef9c4ca91c91b6a24580193e891b5f7dbe8e1e/markupsafe-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:26a5784ded40c9e318cfc2bdb30fe164bdb8665ded9cd64d500a34fb42067b1c", size = 15105, upload-time = "2025-09-27T18:36:39.701Z" }, + { url = "https://files.pythonhosted.org/packages/e5/f1/216fc1bbfd74011693a4fd837e7026152e89c4bcf3e77b6692fba9923123/markupsafe-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:35add3b638a5d900e807944a078b51922212fb3dedb01633a8defc4b01a3c85f", size = 13906, upload-time = "2025-09-27T18:36:40.689Z" }, + { url = "https://files.pythonhosted.org/packages/38/2f/907b9c7bbba283e68f20259574b13d005c121a0fa4c175f9bed27c4597ff/markupsafe-3.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:e1cf1972137e83c5d4c136c43ced9ac51d0e124706ee1c8aa8532c1287fa8795", size = 11622, upload-time = "2025-09-27T18:36:41.777Z" }, + { url = "https://files.pythonhosted.org/packages/9c/d9/5f7756922cdd676869eca1c4e3c0cd0df60ed30199ffd775e319089cb3ed/markupsafe-3.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:116bb52f642a37c115f517494ea5feb03889e04df47eeff5b130b1808ce7c219", size = 12029, upload-time = "2025-09-27T18:36:43.257Z" }, + { url = "https://files.pythonhosted.org/packages/00/07/575a68c754943058c78f30db02ee03a64b3c638586fba6a6dd56830b30a3/markupsafe-3.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:133a43e73a802c5562be9bbcd03d090aa5a1fe899db609c29e8c8d815c5f6de6", size = 24374, upload-time = "2025-09-27T18:36:44.508Z" }, + { url = "https://files.pythonhosted.org/packages/a9/21/9b05698b46f218fc0e118e1f8168395c65c8a2c750ae2bab54fc4bd4e0e8/markupsafe-3.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ccfcd093f13f0f0b7fdd0f198b90053bf7b2f02a3927a30e63f3ccc9df56b676", size = 22980, upload-time = "2025-09-27T18:36:45.385Z" }, + { url = "https://files.pythonhosted.org/packages/7f/71/544260864f893f18b6827315b988c146b559391e6e7e8f7252839b1b846a/markupsafe-3.0.3-cp313-cp313-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:509fa21c6deb7a7a273d629cf5ec029bc209d1a51178615ddf718f5918992ab9", size = 21990, upload-time = "2025-09-27T18:36:46.916Z" }, + { url = "https://files.pythonhosted.org/packages/c2/28/b50fc2f74d1ad761af2f5dcce7492648b983d00a65b8c0e0cb457c82ebbe/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a4afe79fb3de0b7097d81da19090f4df4f8d3a2b3adaa8764138aac2e44f3af1", size = 23784, upload-time = "2025-09-27T18:36:47.884Z" }, + { url = "https://files.pythonhosted.org/packages/ed/76/104b2aa106a208da8b17a2fb72e033a5a9d7073c68f7e508b94916ed47a9/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_riscv64.whl", hash = "sha256:795e7751525cae078558e679d646ae45574b47ed6e7771863fcc079a6171a0fc", size = 21588, upload-time = "2025-09-27T18:36:48.82Z" }, + { url = "https://files.pythonhosted.org/packages/b5/99/16a5eb2d140087ebd97180d95249b00a03aa87e29cc224056274f2e45fd6/markupsafe-3.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:8485f406a96febb5140bfeca44a73e3ce5116b2501ac54fe953e488fb1d03b12", size = 23041, upload-time = "2025-09-27T18:36:49.797Z" }, + { url = "https://files.pythonhosted.org/packages/19/bc/e7140ed90c5d61d77cea142eed9f9c303f4c4806f60a1044c13e3f1471d0/markupsafe-3.0.3-cp313-cp313-win32.whl", hash = "sha256:bdd37121970bfd8be76c5fb069c7751683bdf373db1ed6c010162b2a130248ed", size = 14543, upload-time = "2025-09-27T18:36:51.584Z" }, + { url = "https://files.pythonhosted.org/packages/05/73/c4abe620b841b6b791f2edc248f556900667a5a1cf023a6646967ae98335/markupsafe-3.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:9a1abfdc021a164803f4d485104931fb8f8c1efd55bc6b748d2f5774e78b62c5", size = 15113, upload-time = "2025-09-27T18:36:52.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/3a/fa34a0f7cfef23cf9500d68cb7c32dd64ffd58a12b09225fb03dd37d5b80/markupsafe-3.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:7e68f88e5b8799aa49c85cd116c932a1ac15caaa3f5db09087854d218359e485", size = 13911, upload-time = "2025-09-27T18:36:53.513Z" }, + { url = "https://files.pythonhosted.org/packages/e4/d7/e05cd7efe43a88a17a37b3ae96e79a19e846f3f456fe79c57ca61356ef01/markupsafe-3.0.3-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:218551f6df4868a8d527e3062d0fb968682fe92054e89978594c28e642c43a73", size = 11658, upload-time = "2025-09-27T18:36:54.819Z" }, + { url = "https://files.pythonhosted.org/packages/99/9e/e412117548182ce2148bdeacdda3bb494260c0b0184360fe0d56389b523b/markupsafe-3.0.3-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:3524b778fe5cfb3452a09d31e7b5adefeea8c5be1d43c4f810ba09f2ceb29d37", size = 12066, upload-time = "2025-09-27T18:36:55.714Z" }, + { url = "https://files.pythonhosted.org/packages/bc/e6/fa0ffcda717ef64a5108eaa7b4f5ed28d56122c9a6d70ab8b72f9f715c80/markupsafe-3.0.3-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4e885a3d1efa2eadc93c894a21770e4bc67899e3543680313b09f139e149ab19", size = 25639, upload-time = "2025-09-27T18:36:56.908Z" }, + { url = "https://files.pythonhosted.org/packages/96/ec/2102e881fe9d25fc16cb4b25d5f5cde50970967ffa5dddafdb771237062d/markupsafe-3.0.3-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8709b08f4a89aa7586de0aadc8da56180242ee0ada3999749b183aa23df95025", size = 23569, upload-time = "2025-09-27T18:36:57.913Z" }, + { url = "https://files.pythonhosted.org/packages/4b/30/6f2fce1f1f205fc9323255b216ca8a235b15860c34b6798f810f05828e32/markupsafe-3.0.3-cp313-cp313t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:b8512a91625c9b3da6f127803b166b629725e68af71f8184ae7e7d54686a56d6", size = 23284, upload-time = "2025-09-27T18:36:58.833Z" }, + { url = "https://files.pythonhosted.org/packages/58/47/4a0ccea4ab9f5dcb6f79c0236d954acb382202721e704223a8aafa38b5c8/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:9b79b7a16f7fedff2495d684f2b59b0457c3b493778c9eed31111be64d58279f", size = 24801, upload-time = "2025-09-27T18:36:59.739Z" }, + { url = "https://files.pythonhosted.org/packages/6a/70/3780e9b72180b6fecb83a4814d84c3bf4b4ae4bf0b19c27196104149734c/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_riscv64.whl", hash = "sha256:12c63dfb4a98206f045aa9563db46507995f7ef6d83b2f68eda65c307c6829eb", size = 22769, upload-time = "2025-09-27T18:37:00.719Z" }, + { url = "https://files.pythonhosted.org/packages/98/c5/c03c7f4125180fc215220c035beac6b9cb684bc7a067c84fc69414d315f5/markupsafe-3.0.3-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:8f71bc33915be5186016f675cd83a1e08523649b0e33efdb898db577ef5bb009", size = 23642, upload-time = "2025-09-27T18:37:01.673Z" }, + { url = "https://files.pythonhosted.org/packages/80/d6/2d1b89f6ca4bff1036499b1e29a1d02d282259f3681540e16563f27ebc23/markupsafe-3.0.3-cp313-cp313t-win32.whl", hash = "sha256:69c0b73548bc525c8cb9a251cddf1931d1db4d2258e9599c28c07ef3580ef354", size = 14612, upload-time = "2025-09-27T18:37:02.639Z" }, + { url = "https://files.pythonhosted.org/packages/2b/98/e48a4bfba0a0ffcf9925fe2d69240bfaa19c6f7507b8cd09c70684a53c1e/markupsafe-3.0.3-cp313-cp313t-win_amd64.whl", hash = "sha256:1b4b79e8ebf6b55351f0d91fe80f893b4743f104bff22e90697db1590e47a218", size = 15200, upload-time = "2025-09-27T18:37:03.582Z" }, + { url = "https://files.pythonhosted.org/packages/0e/72/e3cc540f351f316e9ed0f092757459afbc595824ca724cbc5a5d4263713f/markupsafe-3.0.3-cp313-cp313t-win_arm64.whl", hash = "sha256:ad2cf8aa28b8c020ab2fc8287b0f823d0a7d8630784c31e9ee5edea20f406287", size = 13973, upload-time = "2025-09-27T18:37:04.929Z" }, + { url = "https://files.pythonhosted.org/packages/33/8a/8e42d4838cd89b7dde187011e97fe6c3af66d8c044997d2183fbd6d31352/markupsafe-3.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:eaa9599de571d72e2daf60164784109f19978b327a3910d3e9de8c97b5b70cfe", size = 11619, upload-time = "2025-09-27T18:37:06.342Z" }, + { url = "https://files.pythonhosted.org/packages/b5/64/7660f8a4a8e53c924d0fa05dc3a55c9cee10bbd82b11c5afb27d44b096ce/markupsafe-3.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:c47a551199eb8eb2121d4f0f15ae0f923d31350ab9280078d1e5f12b249e0026", size = 12029, upload-time = "2025-09-27T18:37:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/da/ef/e648bfd021127bef5fa12e1720ffed0c6cbb8310c8d9bea7266337ff06de/markupsafe-3.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f34c41761022dd093b4b6896d4810782ffbabe30f2d443ff5f083e0cbbb8c737", size = 24408, upload-time = "2025-09-27T18:37:09.572Z" }, + { url = "https://files.pythonhosted.org/packages/41/3c/a36c2450754618e62008bf7435ccb0f88053e07592e6028a34776213d877/markupsafe-3.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:457a69a9577064c05a97c41f4e65148652db078a3a509039e64d3467b9e7ef97", size = 23005, upload-time = "2025-09-27T18:37:10.58Z" }, + { url = "https://files.pythonhosted.org/packages/bc/20/b7fdf89a8456b099837cd1dc21974632a02a999ec9bf7ca3e490aacd98e7/markupsafe-3.0.3-cp314-cp314-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e8afc3f2ccfa24215f8cb28dcf43f0113ac3c37c2f0f0806d8c70e4228c5cf4d", size = 22048, upload-time = "2025-09-27T18:37:11.547Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a7/591f592afdc734f47db08a75793a55d7fbcc6902a723ae4cfbab61010cc5/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:ec15a59cf5af7be74194f7ab02d0f59a62bdcf1a537677ce67a2537c9b87fcda", size = 23821, upload-time = "2025-09-27T18:37:12.48Z" }, + { url = "https://files.pythonhosted.org/packages/7d/33/45b24e4f44195b26521bc6f1a82197118f74df348556594bd2262bda1038/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_riscv64.whl", hash = "sha256:0eb9ff8191e8498cca014656ae6b8d61f39da5f95b488805da4bb029cccbfbaf", size = 21606, upload-time = "2025-09-27T18:37:13.485Z" }, + { url = "https://files.pythonhosted.org/packages/ff/0e/53dfaca23a69fbfbbf17a4b64072090e70717344c52eaaaa9c5ddff1e5f0/markupsafe-3.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:2713baf880df847f2bece4230d4d094280f4e67b1e813eec43b4c0e144a34ffe", size = 23043, upload-time = "2025-09-27T18:37:14.408Z" }, + { url = "https://files.pythonhosted.org/packages/46/11/f333a06fc16236d5238bfe74daccbca41459dcd8d1fa952e8fbd5dccfb70/markupsafe-3.0.3-cp314-cp314-win32.whl", hash = "sha256:729586769a26dbceff69f7a7dbbf59ab6572b99d94576a5592625d5b411576b9", size = 14747, upload-time = "2025-09-27T18:37:15.36Z" }, + { url = "https://files.pythonhosted.org/packages/28/52/182836104b33b444e400b14f797212f720cbc9ed6ba34c800639d154e821/markupsafe-3.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:bdc919ead48f234740ad807933cdf545180bfbe9342c2bb451556db2ed958581", size = 15341, upload-time = "2025-09-27T18:37:16.496Z" }, + { url = "https://files.pythonhosted.org/packages/6f/18/acf23e91bd94fd7b3031558b1f013adfa21a8e407a3fdb32745538730382/markupsafe-3.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:5a7d5dc5140555cf21a6fefbdbf8723f06fcd2f63ef108f2854de715e4422cb4", size = 14073, upload-time = "2025-09-27T18:37:17.476Z" }, + { url = "https://files.pythonhosted.org/packages/3c/f0/57689aa4076e1b43b15fdfa646b04653969d50cf30c32a102762be2485da/markupsafe-3.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:1353ef0c1b138e1907ae78e2f6c63ff67501122006b0f9abad68fda5f4ffc6ab", size = 11661, upload-time = "2025-09-27T18:37:18.453Z" }, + { url = "https://files.pythonhosted.org/packages/89/c3/2e67a7ca217c6912985ec766c6393b636fb0c2344443ff9d91404dc4c79f/markupsafe-3.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:1085e7fbddd3be5f89cc898938f42c0b3c711fdcb37d75221de2666af647c175", size = 12069, upload-time = "2025-09-27T18:37:19.332Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/be561dce4e6ca66b15276e184ce4b8aec61fe83662cce2f7d72bd3249d28/markupsafe-3.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1b52b4fb9df4eb9ae465f8d0c228a00624de2334f216f178a995ccdcf82c4634", size = 25670, upload-time = "2025-09-27T18:37:20.245Z" }, + { url = "https://files.pythonhosted.org/packages/50/09/c419f6f5a92e5fadde27efd190eca90f05e1261b10dbd8cbcb39cd8ea1dc/markupsafe-3.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:fed51ac40f757d41b7c48425901843666a6677e3e8eb0abcff09e4ba6e664f50", size = 23598, upload-time = "2025-09-27T18:37:21.177Z" }, + { url = "https://files.pythonhosted.org/packages/22/44/a0681611106e0b2921b3033fc19bc53323e0b50bc70cffdd19f7d679bb66/markupsafe-3.0.3-cp314-cp314t-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f190daf01f13c72eac4efd5c430a8de82489d9cff23c364c3ea822545032993e", size = 23261, upload-time = "2025-09-27T18:37:22.167Z" }, + { url = "https://files.pythonhosted.org/packages/5f/57/1b0b3f100259dc9fffe780cfb60d4be71375510e435efec3d116b6436d43/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:e56b7d45a839a697b5eb268c82a71bd8c7f6c94d6fd50c3d577fa39a9f1409f5", size = 24835, upload-time = "2025-09-27T18:37:23.296Z" }, + { url = "https://files.pythonhosted.org/packages/26/6a/4bf6d0c97c4920f1597cc14dd720705eca0bf7c787aebc6bb4d1bead5388/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_riscv64.whl", hash = "sha256:f3e98bb3798ead92273dc0e5fd0f31ade220f59a266ffd8a4f6065e0a3ce0523", size = 22733, upload-time = "2025-09-27T18:37:24.237Z" }, + { url = "https://files.pythonhosted.org/packages/14/c7/ca723101509b518797fedc2fdf79ba57f886b4aca8a7d31857ba3ee8281f/markupsafe-3.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:5678211cb9333a6468fb8d8be0305520aa073f50d17f089b5b4b477ea6e67fdc", size = 23672, upload-time = "2025-09-27T18:37:25.271Z" }, + { url = "https://files.pythonhosted.org/packages/fb/df/5bd7a48c256faecd1d36edc13133e51397e41b73bb77e1a69deab746ebac/markupsafe-3.0.3-cp314-cp314t-win32.whl", hash = "sha256:915c04ba3851909ce68ccc2b8e2cd691618c4dc4c4232fb7982bca3f41fd8c3d", size = 14819, upload-time = "2025-09-27T18:37:26.285Z" }, + { url = "https://files.pythonhosted.org/packages/1a/8a/0402ba61a2f16038b48b39bccca271134be00c5c9f0f623208399333c448/markupsafe-3.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4faffd047e07c38848ce017e8725090413cd80cbc23d86e55c587bf979e579c9", size = 15426, upload-time = "2025-09-27T18:37:27.316Z" }, + { url = "https://files.pythonhosted.org/packages/70/bc/6f1c2f612465f5fa89b95bead1f44dcb607670fd42891d8fdcd5d039f4f4/markupsafe-3.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:32001d6a8fc98c8cb5c947787c5d08b0a50663d139f1305bac5885d98d9b40fa", size = 14146, upload-time = "2025-09-27T18:37:28.327Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/74/97e72a36efd4ae2bccb3463284300f8953f199b5ffbc04cbbb0ec78f74b1/matplotlib_inline-0.2.1.tar.gz", hash = "sha256:e1ee949c340d771fc39e241ea75683deb94762c8fa5f2927ec57c83c4dffa9fe", size = 8110, upload-time = "2025-10-23T09:00:22.126Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/af/33/ee4519fa02ed11a94aef9559552f3b17bb863f2ecfe1a35dc7f548cde231/matplotlib_inline-0.2.1-py3-none-any.whl", hash = "sha256:d56ce5156ba6085e00a9d54fead6ed29a9c47e215cd1bba2e976ef39f5710a76", size = 9516, upload-time = "2025-10-23T09:00:20.675Z" }, +] + +[[package]] +name = "mergedeep" +version = "1.3.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3a/41/580bb4006e3ed0361b8151a01d324fb03f420815446c7def45d02f74c270/mergedeep-1.3.4.tar.gz", hash = "sha256:0096d52e9dad9939c3d975a774666af186eda617e6ca84df4c94dec30004f2a8", size = 4661, upload-time = "2021-02-05T18:55:30.623Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/19/04f9b178c2d8a15b076c8b5140708fa6ffc5601fb6f1e975537072df5b2a/mergedeep-1.3.4-py3-none-any.whl", hash = "sha256:70775750742b25c0d8f36c55aed03d24c3384d17c951b3175d898bd778ef0307", size = 6354, upload-time = "2021-02-05T18:55:29.583Z" }, +] + +[[package]] +name = "mkdocs" +version = "1.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "ghp-import" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mergedeep" }, + { name = "mkdocs-get-deps" }, + { name = "packaging" }, + { name = "pathspec" }, + { name = "pyyaml" }, + { name = "pyyaml-env-tag" }, + { name = "watchdog" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bc/c6/bbd4f061bd16b378247f12953ffcb04786a618ce5e904b8c5a01a0309061/mkdocs-1.6.1.tar.gz", hash = "sha256:7b432f01d928c084353ab39c57282f29f92136665bdd6abf7c1ec8d822ef86f2", size = 3889159, upload-time = "2024-08-30T12:24:06.899Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, +] + +[[package]] +name = "mkdocs-get-deps" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mergedeep" }, + { name = "platformdirs" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ce/25/b3cccb187655b9393572bde9b09261d267c3bf2f2cdabe347673be5976a6/mkdocs_get_deps-0.2.2.tar.gz", hash = "sha256:8ee8d5f316cdbbb2834bc1df6e69c08fe769a83e040060de26d3c19fad3599a1", size = 11047, upload-time = "2026-03-10T02:46:33.632Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/29/744136411e785c4b0b744d5413e56555265939ab3a104c6a4b719dad33fd/mkdocs_get_deps-0.2.2-py3-none-any.whl", hash = "sha256:e7878cbeac04860b8b5e0ca31d3abad3df9411a75a32cde82f8e44b6c16ff650", size = 9555, upload-time = "2026-03-10T02:46:32.256Z" }, +] + +[[package]] +name = "mkdocs-material" +version = "9.7.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "babel" }, + { name = "backrefs" }, + { name = "colorama" }, + { name = "jinja2" }, + { name = "markdown" }, + { name = "mkdocs" }, + { name = "mkdocs-material-extensions" }, + { name = "paginate" }, + { name = "pygments" }, + { name = "pymdown-extensions" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/45/29/6d2bcf41ae40802c4beda2432396fff97b8456fb496371d1bc7aad6512ec/mkdocs_material-9.7.6.tar.gz", hash = "sha256:00bdde50574f776d328b1862fe65daeaf581ec309bd150f7bff345a098c64a69", size = 4097959, upload-time = "2026-03-19T15:41:58.161Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/01/bc663630c510822c95c47a66af9fa7a443c295b47d5f041e5e6ae62ef659/mkdocs_material-9.7.6-py3-none-any.whl", hash = "sha256:71b84353921b8ea1ba84fe11c50912cc512da8fe0881038fcc9a0761c0e635ba", size = 9305470, upload-time = "2026-03-19T15:41:55.217Z" }, +] + +[[package]] +name = "mkdocs-material-extensions" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/79/9b/9b4c96d6593b2a541e1cb8b34899a6d021d208bb357042823d4d2cabdbe7/mkdocs_material_extensions-1.3.1.tar.gz", hash = "sha256:10c9511cea88f568257f960358a467d12b970e1f7b2c0e5fb2bb48cab1928443", size = 11847, upload-time = "2023-11-22T19:09:45.208Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, +] + +[[package]] +name = "nest-asyncio" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/83/f8/51569ac65d696c8ecbee95938f89d4abf00f47d58d48f6fbabfe8f0baefe/nest_asyncio-1.6.0.tar.gz", hash = "sha256:6f172d5449aca15afd6c646851f4e31e02c598d553a667e38cafa997cfec55fe", size = 7418, upload-time = "2024-01-21T14:25:19.227Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/c2971a3ba4c6103a3d10c4b0f24f461ddc027f0f09763220cf35ca1401b3/nest_asyncio-1.6.0-py3-none-any.whl", hash = "sha256:87af6efd6b5e897c81050477ef65c62e2b2f35d51703cae01aff2905b1852e1c", size = 5195, upload-time = "2024-01-21T14:25:17.223Z" }, +] + +[[package]] +name = "numcodecs" +version = "0.16.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/bd/8a391e7c356366224734efd24da929cc4796fff468bfb179fe1af6548535/numcodecs-0.16.5.tar.gz", hash = "sha256:0d0fb60852f84c0bd9543cc4d2ab9eefd37fc8efcc410acd4777e62a1d300318", size = 6276387, upload-time = "2025-11-21T02:49:48.986Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/cc/55420f3641a67f78392dc0bc5d02cb9eb0a9dcebf2848d1ac77253ca61fa/numcodecs-0.16.5-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:24e675dc8d1550cd976a99479b87d872cb142632c75cc402fea04c08c4898523", size = 1656287, upload-time = "2025-11-21T02:49:25.755Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6c/86644987505dcb90ba6d627d6989c27bafb0699f9fd00187e06d05ea8594/numcodecs-0.16.5-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:94ddfa4341d1a3ab99989d13b01b5134abb687d3dab2ead54b450aefe4ad5bd6", size = 1148899, upload-time = "2025-11-21T02:49:26.87Z" }, + { url = "https://files.pythonhosted.org/packages/97/1e/98aaddf272552d9fef1f0296a9939d1487914a239e98678f6b20f8b0a5c8/numcodecs-0.16.5-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b554ab9ecf69de7ca2b6b5e8bc696bd9747559cb4dd5127bd08d7a28bec59c3a", size = 8534814, upload-time = "2025-11-21T02:49:28.547Z" }, + { url = "https://files.pythonhosted.org/packages/fb/53/78c98ef5c8b2b784453487f3e4d6c017b20747c58b470393e230c78d18e8/numcodecs-0.16.5-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ad1a379a45bd3491deab8ae6548313946744f868c21d5340116977ea3be5b1d6", size = 9173471, upload-time = "2025-11-21T02:49:30.444Z" }, + { url = "https://files.pythonhosted.org/packages/1c/20/2fdec87fc7f8cec950d2b0bea603c12dc9f05b4966dc5924ba5a36a61bf6/numcodecs-0.16.5-cp312-cp312-win_amd64.whl", hash = "sha256:845a9857886ffe4a3172ba1c537ae5bcc01e65068c31cf1fce1a844bd1da050f", size = 801412, upload-time = "2025-11-21T02:49:32.123Z" }, + { url = "https://files.pythonhosted.org/packages/38/38/071ced5a5fd1c85ba0e14ba721b66b053823e5176298c2f707e50bed11d9/numcodecs-0.16.5-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:25be3a516ab677dad890760d357cfe081a371d9c0a2e9a204562318ac5969de3", size = 1654359, upload-time = "2025-11-21T02:49:33.673Z" }, + { url = "https://files.pythonhosted.org/packages/d1/c0/5f84ba7525577c1b9909fc2d06ef11314825fc4ad4378f61d0e4c9883b4a/numcodecs-0.16.5-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:0107e839ef75b854e969cb577e140b1aadb9847893937636582d23a2a4c6ce50", size = 1144237, upload-time = "2025-11-21T02:49:35.294Z" }, + { url = "https://files.pythonhosted.org/packages/0b/00/787ea5f237b8ea7bc67140c99155f9c00b5baf11c49afc5f3bfefa298f95/numcodecs-0.16.5-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:015a7c859ecc2a06e2a548f64008c0ec3aaecabc26456c2c62f4278d8fc20597", size = 8483064, upload-time = "2025-11-21T02:49:36.454Z" }, + { url = "https://files.pythonhosted.org/packages/c4/e6/d359fdd37498e74d26a167f7a51e54542e642ea47181eb4e643a69a066c3/numcodecs-0.16.5-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:84230b4b9dad2392f2a84242bd6e3e659ac137b5a1ce3571d6965fca673e0903", size = 9126063, upload-time = "2025-11-21T02:49:38.018Z" }, + { url = "https://files.pythonhosted.org/packages/27/72/6663cc0382ddbb866136c255c837bcb96cc7ce5e83562efec55e1b995941/numcodecs-0.16.5-cp313-cp313-win_amd64.whl", hash = "sha256:5088145502ad1ebf677ec47d00eb6f0fd600658217db3e0c070c321c85d6cf3d", size = 799275, upload-time = "2025-11-21T02:49:39.558Z" }, + { url = "https://files.pythonhosted.org/packages/3c/9e/38e7ca8184c958b51f45d56a4aeceb1134ecde2d8bd157efadc98502cc42/numcodecs-0.16.5-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:b05647b8b769e6bc8016e9fd4843c823ce5c9f2337c089fb5c9c4da05e5275de", size = 1654721, upload-time = "2025-11-21T02:49:40.602Z" }, + { url = "https://files.pythonhosted.org/packages/a1/37/260fa42e7b2b08e6e00ad632f8dd620961a60a459426c26cea390f8c68d0/numcodecs-0.16.5-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:3832bd1b5af8bb3e413076b7d93318c8e7d7b68935006b9fa36ca057d1725a8f", size = 1146887, upload-time = "2025-11-21T02:49:41.721Z" }, + { url = "https://files.pythonhosted.org/packages/4e/15/e2e1151b5a8b14a15dfd4bb4abccce7fff7580f39bc34092780088835f3a/numcodecs-0.16.5-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49f7b7d24f103187f53135bed28bb9f0ed6b2e14c604664726487bb6d7c882e1", size = 8476987, upload-time = "2025-11-21T02:49:43.363Z" }, + { url = "https://files.pythonhosted.org/packages/6d/30/16a57fc4d9fb0ba06c600408bd6634f2f1753c54a7a351c99c5e09b51ee2/numcodecs-0.16.5-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:aec9736d81b70f337d89c4070ee3ffeff113f386fd789492fa152d26a15043e4", size = 9102377, upload-time = "2025-11-21T02:49:45.508Z" }, + { url = "https://files.pythonhosted.org/packages/31/a5/a0425af36c20d55a3ea884db4b4efca25a43bea9214ba69ca7932dd997b4/numcodecs-0.16.5-cp314-cp314-win_amd64.whl", hash = "sha256:b16a14303800e9fb88abc39463ab4706c037647ac17e49e297faa5f7d7dbbf1d", size = 819022, upload-time = "2025-11-21T02:49:47.39Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/9f/b8cef5bffa569759033adda9481211426f12f53299629b410340795c2514/numpy-2.4.4.tar.gz", hash = "sha256:2d390634c5182175533585cc89f3608a4682ccb173cc9bb940b2881c8d6f8fa0", size = 20731587, upload-time = "2026-03-29T13:22:01.298Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/05/32396bec30fb2263770ee910142f49c1476d08e8ad41abf8403806b520ce/numpy-2.4.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:15716cfef24d3a9762e3acdf87e27f58dc823d1348f765bbea6bef8c639bfa1b", size = 16689272, upload-time = "2026-03-29T13:18:49.223Z" }, + { url = "https://files.pythonhosted.org/packages/c5/f3/a983d28637bfcd763a9c7aafdb6d5c0ebf3d487d1e1459ffdb57e2f01117/numpy-2.4.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:23cbfd4c17357c81021f21540da84ee282b9c8fba38a03b7b9d09ba6b951421e", size = 14699573, upload-time = "2026-03-29T13:18:52.629Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fd/e5ecca1e78c05106d98028114f5c00d3eddb41207686b2b7de3e477b0e22/numpy-2.4.4-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:8b3b60bb7cba2c8c81837661c488637eee696f59a877788a396d33150c35d842", size = 5204782, upload-time = "2026-03-29T13:18:55.579Z" }, + { url = "https://files.pythonhosted.org/packages/de/2f/702a4594413c1a8632092beae8aba00f1d67947389369b3777aed783fdca/numpy-2.4.4-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:e4a010c27ff6f210ff4c6ef34394cd61470d01014439b192ec22552ee867f2a8", size = 6552038, upload-time = "2026-03-29T13:18:57.769Z" }, + { url = "https://files.pythonhosted.org/packages/7f/37/eed308a8f56cba4d1fdf467a4fc67ef4ff4bf1c888f5fc980481890104b1/numpy-2.4.4-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f9e75681b59ddaa5e659898085ae0eaea229d054f2ac0c7e563a62205a700121", size = 15670666, upload-time = "2026-03-29T13:19:00.341Z" }, + { url = "https://files.pythonhosted.org/packages/0a/0d/0e3ecece05b7a7e87ab9fb587855548da437a061326fff64a223b6dcb78a/numpy-2.4.4-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:81f4a14bee47aec54f883e0cad2d73986640c1590eb9bfaaba7ad17394481e6e", size = 16645480, upload-time = "2026-03-29T13:19:03.63Z" }, + { url = "https://files.pythonhosted.org/packages/34/49/f2312c154b82a286758ee2f1743336d50651f8b5195db18cdb63675ff649/numpy-2.4.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:62d6b0f03b694173f9fcb1fb317f7222fd0b0b103e784c6549f5e53a27718c44", size = 17020036, upload-time = "2026-03-29T13:19:07.428Z" }, + { url = "https://files.pythonhosted.org/packages/7b/e9/736d17bd77f1b0ec4f9901aaec129c00d59f5d84d5e79bba540ef12c2330/numpy-2.4.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fbc356aae7adf9e6336d336b9c8111d390a05df88f1805573ebb0807bd06fd1d", size = 18368643, upload-time = "2026-03-29T13:19:10.775Z" }, + { url = "https://files.pythonhosted.org/packages/63/f6/d417977c5f519b17c8a5c3bc9e8304b0908b0e21136fe43bf628a1343914/numpy-2.4.4-cp312-cp312-win32.whl", hash = "sha256:0d35aea54ad1d420c812bfa0385c71cd7cc5bcf7c65fed95fc2cd02fe8c79827", size = 5961117, upload-time = "2026-03-29T13:19:13.464Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5b/e1deebf88ff431b01b7406ca3583ab2bbb90972bbe1c568732e49c844f7e/numpy-2.4.4-cp312-cp312-win_amd64.whl", hash = "sha256:b5f0362dc928a6ecd9db58868fca5e48485205e3855957bdedea308f8672ea4a", size = 12320584, upload-time = "2026-03-29T13:19:16.155Z" }, + { url = "https://files.pythonhosted.org/packages/58/89/e4e856ac82a68c3ed64486a544977d0e7bdd18b8da75b78a577ca31c4395/numpy-2.4.4-cp312-cp312-win_arm64.whl", hash = "sha256:846300f379b5b12cc769334464656bc882e0735d27d9726568bc932fdc49d5ec", size = 10221450, upload-time = "2026-03-29T13:19:18.994Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d0a583ce4fefcc3308806a749a536c201ed6b5ad6e1322e227ee4848979d/numpy-2.4.4-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:08f2e31ed5e6f04b118e49821397f12767934cfdd12a1ce86a058f91e004ee50", size = 16684933, upload-time = "2026-03-29T13:19:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/c1/62/2b7a48fbb745d344742c0277f01286dead15f3f68e4f359fbfcf7b48f70f/numpy-2.4.4-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:e823b8b6edc81e747526f70f71a9c0a07ac4e7ad13020aa736bb7c9d67196115", size = 14694532, upload-time = "2026-03-29T13:19:25.581Z" }, + { url = "https://files.pythonhosted.org/packages/e5/87/499737bfba066b4a3bebff24a8f1c5b2dee410b209bc6668c9be692580f0/numpy-2.4.4-cp313-cp313-macosx_14_0_arm64.whl", hash = "sha256:4a19d9dba1a76618dd86b164d608566f393f8ec6ac7c44f0cc879011c45e65af", size = 5199661, upload-time = "2026-03-29T13:19:28.31Z" }, + { url = "https://files.pythonhosted.org/packages/cd/da/464d551604320d1491bc345efed99b4b7034143a85787aab78d5691d5a0e/numpy-2.4.4-cp313-cp313-macosx_14_0_x86_64.whl", hash = "sha256:d2a8490669bfe99a233298348acc2d824d496dee0e66e31b66a6022c2ad74a5c", size = 6547539, upload-time = "2026-03-29T13:19:30.97Z" }, + { url = "https://files.pythonhosted.org/packages/7d/90/8d23e3b0dafd024bf31bdec225b3bb5c2dbfa6912f8a53b8659f21216cbf/numpy-2.4.4-cp313-cp313-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:45dbed2ab436a9e826e302fcdcbe9133f9b0006e5af7168afb8963a6520da103", size = 15668806, upload-time = "2026-03-29T13:19:33.887Z" }, + { url = "https://files.pythonhosted.org/packages/d1/73/a9d864e42a01896bb5974475438f16086be9ba1f0d19d0bb7a07427c4a8b/numpy-2.4.4-cp313-cp313-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c901b15172510173f5cb310eae652908340f8dede90fff9e3bf6c0d8dfd92f83", size = 16632682, upload-time = "2026-03-29T13:19:37.336Z" }, + { url = "https://files.pythonhosted.org/packages/34/fb/14570d65c3bde4e202a031210475ae9cde9b7686a2e7dc97ee67d2833b35/numpy-2.4.4-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:99d838547ace2c4aace6c4f76e879ddfe02bb58a80c1549928477862b7a6d6ed", size = 17019810, upload-time = "2026-03-29T13:19:40.963Z" }, + { url = "https://files.pythonhosted.org/packages/8a/77/2ba9d87081fd41f6d640c83f26fb7351e536b7ce6dd9061b6af5904e8e46/numpy-2.4.4-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:0aec54fd785890ecca25a6003fd9a5aed47ad607bbac5cd64f836ad8666f4959", size = 18357394, upload-time = "2026-03-29T13:19:44.859Z" }, + { url = "https://files.pythonhosted.org/packages/a2/23/52666c9a41708b0853fa3b1a12c90da38c507a3074883823126d4e9d5b30/numpy-2.4.4-cp313-cp313-win32.whl", hash = "sha256:07077278157d02f65c43b1b26a3886bce886f95d20aabd11f87932750dfb14ed", size = 5959556, upload-time = "2026-03-29T13:19:47.661Z" }, + { url = "https://files.pythonhosted.org/packages/57/fb/48649b4971cde70d817cf97a2a2fdc0b4d8308569f1dd2f2611959d2e0cf/numpy-2.4.4-cp313-cp313-win_amd64.whl", hash = "sha256:5c70f1cc1c4efbe316a572e2d8b9b9cc44e89b95f79ca3331553fbb63716e2bf", size = 12317311, upload-time = "2026-03-29T13:19:50.67Z" }, + { url = "https://files.pythonhosted.org/packages/ba/d8/11490cddd564eb4de97b4579ef6bfe6a736cc07e94c1598590ae25415e01/numpy-2.4.4-cp313-cp313-win_arm64.whl", hash = "sha256:ef4059d6e5152fa1a39f888e344c73fdc926e1b2dd58c771d67b0acfbf2aa67d", size = 10222060, upload-time = "2026-03-29T13:19:54.229Z" }, + { url = "https://files.pythonhosted.org/packages/99/5d/dab4339177a905aad3e2221c915b35202f1ec30d750dd2e5e9d9a72b804b/numpy-2.4.4-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:4bbc7f303d125971f60ec0aaad5e12c62d0d2c925f0ab1273debd0e4ba37aba5", size = 14822302, upload-time = "2026-03-29T13:19:57.585Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/0564a65e7d3d97562ed6f9b0fd0fb0a6f559ee444092f105938b50043876/numpy-2.4.4-cp313-cp313t-macosx_14_0_arm64.whl", hash = "sha256:4d6d57903571f86180eb98f8f0c839fa9ebbfb031356d87f1361be91e433f5b7", size = 5327407, upload-time = "2026-03-29T13:20:00.601Z" }, + { url = "https://files.pythonhosted.org/packages/29/8d/35a3a6ce5ad371afa58b4700f1c820f8f279948cca32524e0a695b0ded83/numpy-2.4.4-cp313-cp313t-macosx_14_0_x86_64.whl", hash = "sha256:4636de7fd195197b7535f231b5de9e4b36d2c440b6e566d2e4e4746e6af0ca93", size = 6647631, upload-time = "2026-03-29T13:20:02.855Z" }, + { url = "https://files.pythonhosted.org/packages/f4/da/477731acbd5a58a946c736edfdabb2ac5b34c3d08d1ba1a7b437fa0884df/numpy-2.4.4-cp313-cp313t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ad2e2ef14e0b04e544ea2fa0a36463f847f113d314aa02e5b402fdf910ef309e", size = 15727691, upload-time = "2026-03-29T13:20:06.004Z" }, + { url = "https://files.pythonhosted.org/packages/e6/db/338535d9b152beabeb511579598418ba0212ce77cf9718edd70262cc4370/numpy-2.4.4-cp313-cp313t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a285b3b96f951841799528cd1f4f01cd70e7e0204b4abebac9463eecfcf2a40", size = 16681241, upload-time = "2026-03-29T13:20:09.417Z" }, + { url = "https://files.pythonhosted.org/packages/e2/a9/ad248e8f58beb7a0219b413c9c7d8151c5d285f7f946c3e26695bdbbe2df/numpy-2.4.4-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:f8474c4241bc18b750be2abea9d7a9ec84f46ef861dbacf86a4f6e043401f79e", size = 17085767, upload-time = "2026-03-29T13:20:13.126Z" }, + { url = "https://files.pythonhosted.org/packages/b5/1a/3b88ccd3694681356f70da841630e4725a7264d6a885c8d442a697e1146b/numpy-2.4.4-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:4e874c976154687c1f71715b034739b45c7711bec81db01914770373d125e392", size = 18403169, upload-time = "2026-03-29T13:20:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/c2/c9/fcfd5d0639222c6eac7f304829b04892ef51c96a75d479214d77e3ce6e33/numpy-2.4.4-cp313-cp313t-win32.whl", hash = "sha256:9c585a1790d5436a5374bac930dad6ed244c046ed91b2b2a3634eb2971d21008", size = 6083477, upload-time = "2026-03-29T13:20:20.195Z" }, + { url = "https://files.pythonhosted.org/packages/d5/e3/3938a61d1c538aaec8ed6fd6323f57b0c2d2d2219512434c5c878db76553/numpy-2.4.4-cp313-cp313t-win_amd64.whl", hash = "sha256:93e15038125dc1e5345d9b5b68aa7f996ec33b98118d18c6ca0d0b7d6198b7e8", size = 12457487, upload-time = "2026-03-29T13:20:22.946Z" }, + { url = "https://files.pythonhosted.org/packages/97/6a/7e345032cc60501721ef94e0e30b60f6b0bd601f9174ebd36389a2b86d40/numpy-2.4.4-cp313-cp313t-win_arm64.whl", hash = "sha256:0dfd3f9d3adbe2920b68b5cd3d51444e13a10792ec7154cd0a2f6e74d4ab3233", size = 10292002, upload-time = "2026-03-29T13:20:25.909Z" }, + { url = "https://files.pythonhosted.org/packages/6e/06/c54062f85f673dd5c04cbe2f14c3acb8c8b95e3384869bb8cc9bff8cb9df/numpy-2.4.4-cp314-cp314-macosx_10_15_x86_64.whl", hash = "sha256:f169b9a863d34f5d11b8698ead99febeaa17a13ca044961aa8e2662a6c7766a0", size = 16684353, upload-time = "2026-03-29T13:20:29.504Z" }, + { url = "https://files.pythonhosted.org/packages/4c/39/8a320264a84404c74cc7e79715de85d6130fa07a0898f67fb5cd5bd79908/numpy-2.4.4-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:2483e4584a1cb3092da4470b38866634bafb223cbcd551ee047633fd2584599a", size = 14704914, upload-time = "2026-03-29T13:20:33.547Z" }, + { url = "https://files.pythonhosted.org/packages/91/fb/287076b2614e1d1044235f50f03748f31fa287e3dbe6abeb35cdfa351eca/numpy-2.4.4-cp314-cp314-macosx_14_0_arm64.whl", hash = "sha256:2d19e6e2095506d1736b7d80595e0f252d76b89f5e715c35e06e937679ea7d7a", size = 5210005, upload-time = "2026-03-29T13:20:36.45Z" }, + { url = "https://files.pythonhosted.org/packages/63/eb/fcc338595309910de6ecabfcef2419a9ce24399680bfb149421fa2df1280/numpy-2.4.4-cp314-cp314-macosx_14_0_x86_64.whl", hash = "sha256:6a246d5914aa1c820c9443ddcee9c02bec3e203b0c080349533fae17727dfd1b", size = 6544974, upload-time = "2026-03-29T13:20:39.014Z" }, + { url = "https://files.pythonhosted.org/packages/44/5d/e7e9044032a716cdfaa3fba27a8e874bf1c5f1912a1ddd4ed071bf8a14a6/numpy-2.4.4-cp314-cp314-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:989824e9faf85f96ec9c7761cd8d29c531ad857bfa1daa930cba85baaecf1a9a", size = 15684591, upload-time = "2026-03-29T13:20:42.146Z" }, + { url = "https://files.pythonhosted.org/packages/98/7c/21252050676612625449b4807d6b695b9ce8a7c9e1c197ee6216c8a65c7c/numpy-2.4.4-cp314-cp314-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:27a8d92cd10f1382a67d7cf4db7ce18341b66438bdd9f691d7b0e48d104c2a9d", size = 16637700, upload-time = "2026-03-29T13:20:46.204Z" }, + { url = "https://files.pythonhosted.org/packages/b1/29/56d2bbef9465db24ef25393383d761a1af4f446a1df9b8cded4fe3a5a5d7/numpy-2.4.4-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:e44319a2953c738205bf3354537979eaa3998ed673395b964c1176083dd46252", size = 17035781, upload-time = "2026-03-29T13:20:50.242Z" }, + { url = "https://files.pythonhosted.org/packages/e3/2b/a35a6d7589d21f44cea7d0a98de5ddcbb3d421b2622a5c96b1edf18707c3/numpy-2.4.4-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:e892aff75639bbef0d2a2cfd55535510df26ff92f63c92cd84ef8d4ba5a5557f", size = 18362959, upload-time = "2026-03-29T13:20:54.019Z" }, + { url = "https://files.pythonhosted.org/packages/64/c9/d52ec581f2390e0f5f85cbfd80fb83d965fc15e9f0e1aec2195faa142cde/numpy-2.4.4-cp314-cp314-win32.whl", hash = "sha256:1378871da56ca8943c2ba674530924bb8ca40cd228358a3b5f302ad60cf875fc", size = 6008768, upload-time = "2026-03-29T13:20:56.912Z" }, + { url = "https://files.pythonhosted.org/packages/fa/22/4cc31a62a6c7b74a8730e31a4274c5dc80e005751e277a2ce38e675e4923/numpy-2.4.4-cp314-cp314-win_amd64.whl", hash = "sha256:715d1c092715954784bc79e1174fc2a90093dc4dc84ea15eb14dad8abdcdeb74", size = 12449181, upload-time = "2026-03-29T13:20:59.548Z" }, + { url = "https://files.pythonhosted.org/packages/70/2e/14cda6f4d8e396c612d1bf97f22958e92148801d7e4f110cabebdc0eef4b/numpy-2.4.4-cp314-cp314-win_arm64.whl", hash = "sha256:2c194dd721e54ecad9ad387c1d35e63dce5c4450c6dc7dd5611283dda239aabb", size = 10496035, upload-time = "2026-03-29T13:21:02.524Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e8/8fed8c8d848d7ecea092dc3469643f9d10bc3a134a815a3b033da1d2039b/numpy-2.4.4-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:2aa0613a5177c264ff5921051a5719d20095ea586ca88cc802c5c218d1c67d3e", size = 14824958, upload-time = "2026-03-29T13:21:05.671Z" }, + { url = "https://files.pythonhosted.org/packages/05/1a/d8007a5138c179c2bf33ef44503e83d70434d2642877ee8fbb230e7c0548/numpy-2.4.4-cp314-cp314t-macosx_14_0_arm64.whl", hash = "sha256:42c16925aa5a02362f986765f9ebabf20de75cdefdca827d14315c568dcab113", size = 5330020, upload-time = "2026-03-29T13:21:08.635Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/ffb99ac6ae93faf117bcbd5c7ba48a7f45364a33e8e458545d3633615dda/numpy-2.4.4-cp314-cp314t-macosx_14_0_x86_64.whl", hash = "sha256:874f200b2a981c647340f841730fc3a2b54c9d940566a3c4149099591e2c4c3d", size = 6650758, upload-time = "2026-03-29T13:21:10.949Z" }, + { url = "https://files.pythonhosted.org/packages/6e/6e/795cc078b78a384052e73b2f6281ff7a700e9bf53bcce2ee579d4f6dd879/numpy-2.4.4-cp314-cp314t-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c9b39d38a9bd2ae1becd7eac1303d031c5c110ad31f2b319c6e7d98b135c934d", size = 15729948, upload-time = "2026-03-29T13:21:14.047Z" }, + { url = "https://files.pythonhosted.org/packages/5f/86/2acbda8cc2af5f3d7bfc791192863b9e3e19674da7b5e533fded124d1299/numpy-2.4.4-cp314-cp314t-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b268594bccac7d7cf5844c7732e3f20c50921d94e36d7ec9b79e9857694b1b2f", size = 16679325, upload-time = "2026-03-29T13:21:17.561Z" }, + { url = "https://files.pythonhosted.org/packages/bc/59/cafd83018f4aa55e0ac6fa92aa066c0a1877b77a615ceff1711c260ffae8/numpy-2.4.4-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:ac6b31e35612a26483e20750126d30d0941f949426974cace8e6b5c58a3657b0", size = 17084883, upload-time = "2026-03-29T13:21:21.106Z" }, + { url = "https://files.pythonhosted.org/packages/f0/85/a42548db84e65ece46ab2caea3d3f78b416a47af387fcbb47ec28e660dc2/numpy-2.4.4-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:8e3ed142f2728df44263aaf5fb1f5b0b99f4070c553a0d7f033be65338329150", size = 18403474, upload-time = "2026-03-29T13:21:24.828Z" }, + { url = "https://files.pythonhosted.org/packages/ed/ad/483d9e262f4b831000062e5d8a45e342166ec8aaa1195264982bca267e62/numpy-2.4.4-cp314-cp314t-win32.whl", hash = "sha256:dddbbd259598d7240b18c9d87c56a9d2fb3b02fe266f49a7c101532e78c1d871", size = 6155500, upload-time = "2026-03-29T13:21:28.205Z" }, + { url = "https://files.pythonhosted.org/packages/c7/03/2fc4e14c7bd4ff2964b74ba90ecb8552540b6315f201df70f137faa5c589/numpy-2.4.4-cp314-cp314t-win_amd64.whl", hash = "sha256:a7164afb23be6e37ad90b2f10426149fd75aee07ca55653d2aa41e66c4ef697e", size = 12637755, upload-time = "2026-03-29T13:21:31.107Z" }, + { url = "https://files.pythonhosted.org/packages/58/78/548fb8e07b1a341746bfbecb32f2c268470f45fa028aacdbd10d9bc73aab/numpy-2.4.4-cp314-cp314t-win_arm64.whl", hash = "sha256:ba203255017337d39f89bdd58417f03c4426f12beed0440cfd933cb15f8669c7", size = 10566643, upload-time = "2026-03-29T13:21:34.339Z" }, +] + +[[package]] +name = "packaging" +version = "26.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/df/de/0d2b39fb4af88a0258f3bac87dfcbb48e73fbdea4a2ed0e2213f9a4c2f9a/packaging-26.1.tar.gz", hash = "sha256:f042152b681c4bfac5cae2742a55e103d27ab2ec0f3d88037136b6bfe7c9c5de", size = 215519, upload-time = "2026-04-14T21:12:49.362Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/c2/920ef838e2f0028c8262f16101ec09ebd5969864e5a64c4c05fad0617c56/packaging-26.1-py3-none-any.whl", hash = "sha256:5d9c0669c6285e491e0ced2eee587eaf67b670d94a19e94e3984a481aba6802f", size = 95831, upload-time = "2026-04-14T21:12:47.56Z" }, +] + +[[package]] +name = "paginate" +version = "0.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/46/68dde5b6bc00c1296ec6466ab27dddede6aec9af1b99090e1107091b3b84/paginate-0.5.7.tar.gz", hash = "sha256:22bd083ab41e1a8b4f3690544afb2c60c25e5c9a63a30fa2f483f6c60c8e5945", size = 19252, upload-time = "2024-08-25T14:17:24.139Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/96/04b8e52da071d28f5e21a805b19cb9390aa17a47462ac87f5e2696b9566d/paginate-0.5.7-py2.py3-none-any.whl", hash = "sha256:b885e2af73abcf01d9559fd5216b57ef722f8c42affbb63942377668e35c7591", size = 13746, upload-time = "2024-08-25T14:17:22.55Z" }, +] + +[[package]] +name = "parso" +version = "0.8.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/76/a1e769043c0c0c9fe391b702539d594731a4362334cdf4dc25d0c09761e7/parso-0.8.6.tar.gz", hash = "sha256:2b9a0332696df97d454fa67b81618fd69c35a7b90327cbe6ba5c92d2c68a7bfd", size = 401621, upload-time = "2026-02-09T15:45:24.425Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b6/61/fae042894f4296ec49e3f193aff5d7c18440da9e48102c3315e1bc4519a7/parso-0.8.6-py2.py3-none-any.whl", hash = "sha256:2c549f800b70a5c4952197248825584cb00f033b29c692671d3bf08bf380baff", size = 106894, upload-time = "2026-02-09T15:45:21.391Z" }, +] + +[[package]] +name = "pathspec" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fa/36/e27608899f9b8d4dff0617b2d9ab17ca5608956ca44461ac14ac48b44015/pathspec-1.0.4.tar.gz", hash = "sha256:0210e2ae8a21a9137c0d470578cb0e595af87edaa6ebf12ff176f14a02e0e645", size = 131200, upload-time = "2026-01-27T03:59:46.938Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/3c/2c197d226f9ea224a9ab8d197933f9da0ae0aac5b6e0f884e2b8d9c8e9f7/pathspec-1.0.4-py3-none-any.whl", hash = "sha256:fb6ae2fd4e7c921a165808a552060e722767cfa526f99ca5156ed2ce45a5c723", size = 55206, upload-time = "2026-01-27T03:59:45.137Z" }, +] + +[[package]] +name = "pexpect" +version = "4.9.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "ptyprocess" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/92/cc564bf6381ff43ce1f4d06852fc19a2f11d180f23dc32d9588bee2f149d/pexpect-4.9.0.tar.gz", hash = "sha256:ee7d41123f3c9911050ea2c2dac107568dc43b2d3b0c7557a33212c398ead30f", size = 166450, upload-time = "2023-11-25T09:07:26.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c3/059298687310d527a58bb01f3b1965787ee3b40dce76752eda8b44e9a2c5/pexpect-4.9.0-py2.py3-none-any.whl", hash = "sha256:7236d1e080e4936be2dc3e326cec0af72acf9212a7e1d060210e70a47e253523", size = 63772, upload-time = "2023-11-25T06:56:14.81Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.9.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9f/4a/0883b8e3802965322523f0b200ecf33d31f10991d0401162f4b23c698b42/platformdirs-4.9.6.tar.gz", hash = "sha256:3bfa75b0ad0db84096ae777218481852c0ebc6c727b3168c1b9e0118e458cf0a", size = 29400, upload-time = "2026-04-09T00:04:10.812Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/75/a6/a0a304dc33b49145b21f4808d763822111e67d1c3a32b524a1baf947b6e1/platformdirs-4.9.6-py3-none-any.whl", hash = "sha256:e61adb1d5e5cb3441b4b7710bea7e4c12250ca49439228cc1021c00dcfac0917", size = 21348, upload-time = "2026-04-09T00:04:09.463Z" }, +] + +[[package]] +name = "prompt-toolkit" +version = "3.0.52" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/96/06e01a7b38dce6fe1db213e061a4602dd6032a8a97ef6c1a862537732421/prompt_toolkit-3.0.52.tar.gz", hash = "sha256:28cde192929c8e7321de85de1ddbe736f1375148b02f2e17edd840042b1be855", size = 434198, upload-time = "2025-08-27T15:24:02.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/03/0d3ce49e2505ae70cf43bc5bb3033955d2fc9f932163e84dc0779cc47f48/prompt_toolkit-3.0.52-py3-none-any.whl", hash = "sha256:9aac639a3bbd33284347de5ad8d68ecc044b91a762dc39b7c21095fcd6a19955", size = 391431, upload-time = "2025-08-27T15:23:59.498Z" }, +] + +[[package]] +name = "psutil" +version = "7.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/aa/c6/d1ddf4abb55e93cebc4f2ed8b5d6dbad109ecb8d63748dd2b20ab5e57ebe/psutil-7.2.2.tar.gz", hash = "sha256:0746f5f8d406af344fd547f1c8daa5f5c33dbc293bb8d6a16d80b4bb88f59372", size = 493740, upload-time = "2026-01-28T18:14:54.428Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/08/510cbdb69c25a96f4ae523f733cdc963ae654904e8db864c07585ef99875/psutil-7.2.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2edccc433cbfa046b980b0df0171cd25bcaeb3a68fe9022db0979e7aa74a826b", size = 130595, upload-time = "2026-01-28T18:14:57.293Z" }, + { url = "https://files.pythonhosted.org/packages/d6/f5/97baea3fe7a5a9af7436301f85490905379b1c6f2dd51fe3ecf24b4c5fbf/psutil-7.2.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:e78c8603dcd9a04c7364f1a3e670cea95d51ee865e4efb3556a3a63adef958ea", size = 131082, upload-time = "2026-01-28T18:14:59.732Z" }, + { url = "https://files.pythonhosted.org/packages/37/d6/246513fbf9fa174af531f28412297dd05241d97a75911ac8febefa1a53c6/psutil-7.2.2-cp313-cp313t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a571f2330c966c62aeda00dd24620425d4b0cc86881c89861fbc04549e5dc63", size = 181476, upload-time = "2026-01-28T18:15:01.884Z" }, + { url = "https://files.pythonhosted.org/packages/b8/b5/9182c9af3836cca61696dabe4fd1304e17bc56cb62f17439e1154f225dd3/psutil-7.2.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:917e891983ca3c1887b4ef36447b1e0873e70c933afc831c6b6da078ba474312", size = 184062, upload-time = "2026-01-28T18:15:04.436Z" }, + { url = "https://files.pythonhosted.org/packages/16/ba/0756dca669f5a9300d0cbcbfae9a4c30e446dfc7440ffe43ded5724bfd93/psutil-7.2.2-cp313-cp313t-win_amd64.whl", hash = "sha256:ab486563df44c17f5173621c7b198955bd6b613fb87c71c161f827d3fb149a9b", size = 139893, upload-time = "2026-01-28T18:15:06.378Z" }, + { url = "https://files.pythonhosted.org/packages/1c/61/8fa0e26f33623b49949346de05ec1ddaad02ed8ba64af45f40a147dbfa97/psutil-7.2.2-cp313-cp313t-win_arm64.whl", hash = "sha256:ae0aefdd8796a7737eccea863f80f81e468a1e4cf14d926bd9b6f5f2d5f90ca9", size = 135589, upload-time = "2026-01-28T18:15:08.03Z" }, + { url = "https://files.pythonhosted.org/packages/81/69/ef179ab5ca24f32acc1dac0c247fd6a13b501fd5534dbae0e05a1c48b66d/psutil-7.2.2-cp314-cp314t-macosx_10_15_x86_64.whl", hash = "sha256:eed63d3b4d62449571547b60578c5b2c4bcccc5387148db46e0c2313dad0ee00", size = 130664, upload-time = "2026-01-28T18:15:09.469Z" }, + { url = "https://files.pythonhosted.org/packages/7b/64/665248b557a236d3fa9efc378d60d95ef56dd0a490c2cd37dafc7660d4a9/psutil-7.2.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:7b6d09433a10592ce39b13d7be5a54fbac1d1228ed29abc880fb23df7cb694c9", size = 131087, upload-time = "2026-01-28T18:15:11.724Z" }, + { url = "https://files.pythonhosted.org/packages/d5/2e/e6782744700d6759ebce3043dcfa661fb61e2fb752b91cdeae9af12c2178/psutil-7.2.2-cp314-cp314t-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1fa4ecf83bcdf6e6c8f4449aff98eefb5d0604bf88cb883d7da3d8d2d909546a", size = 182383, upload-time = "2026-01-28T18:15:13.445Z" }, + { url = "https://files.pythonhosted.org/packages/57/49/0a41cefd10cb7505cdc04dab3eacf24c0c2cb158a998b8c7b1d27ee2c1f5/psutil-7.2.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e452c464a02e7dc7822a05d25db4cde564444a67e58539a00f929c51eddda0cf", size = 185210, upload-time = "2026-01-28T18:15:16.002Z" }, + { url = "https://files.pythonhosted.org/packages/dd/2c/ff9bfb544f283ba5f83ba725a3c5fec6d6b10b8f27ac1dc641c473dc390d/psutil-7.2.2-cp314-cp314t-win_amd64.whl", hash = "sha256:c7663d4e37f13e884d13994247449e9f8f574bc4655d509c3b95e9ec9e2b9dc1", size = 141228, upload-time = "2026-01-28T18:15:18.385Z" }, + { url = "https://files.pythonhosted.org/packages/f2/fc/f8d9c31db14fcec13748d373e668bc3bed94d9077dbc17fb0eebc073233c/psutil-7.2.2-cp314-cp314t-win_arm64.whl", hash = "sha256:11fe5a4f613759764e79c65cf11ebdf26e33d6dd34336f8a337aa2996d71c841", size = 136284, upload-time = "2026-01-28T18:15:19.912Z" }, + { url = "https://files.pythonhosted.org/packages/e7/36/5ee6e05c9bd427237b11b3937ad82bb8ad2752d72c6969314590dd0c2f6e/psutil-7.2.2-cp36-abi3-macosx_10_9_x86_64.whl", hash = "sha256:ed0cace939114f62738d808fdcecd4c869222507e266e574799e9c0faa17d486", size = 129090, upload-time = "2026-01-28T18:15:22.168Z" }, + { url = "https://files.pythonhosted.org/packages/80/c4/f5af4c1ca8c1eeb2e92ccca14ce8effdeec651d5ab6053c589b074eda6e1/psutil-7.2.2-cp36-abi3-macosx_11_0_arm64.whl", hash = "sha256:1a7b04c10f32cc88ab39cbf606e117fd74721c831c98a27dc04578deb0c16979", size = 129859, upload-time = "2026-01-28T18:15:23.795Z" }, + { url = "https://files.pythonhosted.org/packages/b5/70/5d8df3b09e25bce090399cf48e452d25c935ab72dad19406c77f4e828045/psutil-7.2.2-cp36-abi3-manylinux2010_x86_64.manylinux_2_12_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:076a2d2f923fd4821644f5ba89f059523da90dc9014e85f8e45a5774ca5bc6f9", size = 155560, upload-time = "2026-01-28T18:15:25.976Z" }, + { url = "https://files.pythonhosted.org/packages/63/65/37648c0c158dc222aba51c089eb3bdfa238e621674dc42d48706e639204f/psutil-7.2.2-cp36-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b0726cecd84f9474419d67252add4ac0cd9811b04d61123054b9fb6f57df6e9e", size = 156997, upload-time = "2026-01-28T18:15:27.794Z" }, + { url = "https://files.pythonhosted.org/packages/8e/13/125093eadae863ce03c6ffdbae9929430d116a246ef69866dad94da3bfbc/psutil-7.2.2-cp36-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:fd04ef36b4a6d599bbdb225dd1d3f51e00105f6d48a28f006da7f9822f2606d8", size = 148972, upload-time = "2026-01-28T18:15:29.342Z" }, + { url = "https://files.pythonhosted.org/packages/04/78/0acd37ca84ce3ddffaa92ef0f571e073faa6d8ff1f0559ab1272188ea2be/psutil-7.2.2-cp36-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:b58fabe35e80b264a4e3bb23e6b96f9e45a3df7fb7eed419ac0e5947c61e47cc", size = 148266, upload-time = "2026-01-28T18:15:31.597Z" }, + { url = "https://files.pythonhosted.org/packages/b4/90/e2159492b5426be0c1fef7acba807a03511f97c5f86b3caeda6ad92351a7/psutil-7.2.2-cp37-abi3-win_amd64.whl", hash = "sha256:eb7e81434c8d223ec4a219b5fc1c47d0417b12be7ea866e24fb5ad6e84b3d988", size = 137737, upload-time = "2026-01-28T18:15:33.849Z" }, + { url = "https://files.pythonhosted.org/packages/8c/c7/7bb2e321574b10df20cbde462a94e2b71d05f9bbda251ef27d104668306a/psutil-7.2.2-cp37-abi3-win_arm64.whl", hash = "sha256:8c233660f575a5a89e6d4cb65d9f938126312bca76d8fe087b947b3a1aaac9ee", size = 134617, upload-time = "2026-01-28T18:15:36.514Z" }, +] + +[[package]] +name = "ptyprocess" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/e5/16ff212c1e452235a90aeb09066144d0c5a6a8c0834397e03f5224495c4e/ptyprocess-0.7.0.tar.gz", hash = "sha256:5c5d0a3b48ceee0b48485e0c26037c0acd7d29765ca3fbb5cb3831d347423220", size = 70762, upload-time = "2020-12-28T15:15:30.155Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/a6/858897256d0deac81a172289110f31629fc4cee19b6f01283303e18c8db3/ptyprocess-0.7.0-py2.py3-none-any.whl", hash = "sha256:4b41f3967fce3af57cc7e94b888626c18bf37a083e3651ca8feeb66d492fef35", size = 13993, upload-time = "2020-12-28T15:15:28.35Z" }, +] + +[[package]] +name = "pure-eval" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/05/0a34433a064256a578f1783a10da6df098ceaa4a57bbeaa96a6c0352786b/pure_eval-0.2.3.tar.gz", hash = "sha256:5f4e983f40564c576c7c8635ae88db5956bb2229d7e9237d03b3c0b0190eaf42", size = 19752, upload-time = "2024-07-21T12:58:21.801Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/37/efad0257dc6e593a18957422533ff0f87ede7c9c6ea010a2177d738fb82f/pure_eval-0.2.3-py3-none-any.whl", hash = "sha256:1db8e35b67b3d218d818ae653e27f06c3aa420901fa7b081ca98cbedc874e0d0", size = 11842, upload-time = "2024-07-21T12:58:20.04Z" }, +] + +[[package]] +name = "pycparser" +version = "3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/7d/92392ff7815c21062bea51aa7b87d45576f649f16458d78b7cf94b9ab2e6/pycparser-3.0.tar.gz", hash = "sha256:600f49d217304a5902ac3c37e1281c9fe94e4d0489de643a9504c5cdfdfc6b29", size = 103492, upload-time = "2026-01-21T14:26:51.89Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0c/c3/44f3fbbfa403ea2a7c779186dc20772604442dde72947e7d01069cbe98e3/pycparser-3.0-py3-none-any.whl", hash = "sha256:b727414169a36b7d524c1c3e31839a521725078d7b2ff038656844266160a992", size = 48172, upload-time = "2026-01-21T14:26:50.693Z" }, +] + +[[package]] +name = "pygments" +version = "2.20.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/b2/bc9c9196916376152d655522fdcebac55e66de6603a76a02bca1b6414f6c/pygments-2.20.0.tar.gz", hash = "sha256:6757cd03768053ff99f3039c1a36d6c0aa0b263438fcab17520b30a303a82b5f", size = 4955991, upload-time = "2026-03-29T13:29:33.898Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/7e/a72dd26f3b0f4f2bf1dd8923c85f7ceb43172af56d63c7383eb62b332364/pygments-2.20.0-py3-none-any.whl", hash = "sha256:81a9e26dd42fd28a23a2d169d86d7ac03b46e2f8b59ed4698fb4785f946d0176", size = 1231151, upload-time = "2026-03-29T13:29:30.038Z" }, +] + +[[package]] +name = "pymdown-extensions" +version = "10.21.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/df/08/f1c908c581fd11913da4711ea7ba32c0eee40b0190000996bb863b0c9349/pymdown_extensions-10.21.2.tar.gz", hash = "sha256:c3f55a5b8a1d0edf6699e35dcbea71d978d34ff3fa79f3d807b8a5b3fa90fbdc", size = 853922, upload-time = "2026-03-29T15:01:55.233Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f7/27/a2fc51a4a122dfd1015e921ae9d22fee3d20b0b8080d9a704578bf9deece/pymdown_extensions-10.21.2-py3-none-any.whl", hash = "sha256:5c0fd2a2bea14eb39af8ff284f1066d898ab2187d81b889b75d46d4348c01638", size = 268901, upload-time = "2026-03-29T15:01:53.244Z" }, +] + +[[package]] +name = "python-dateutil" +version = "2.9.0.post0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/c0/0c8b6ad9f17a802ee498c46e004a0eb49bc148f2fd230864601a86dcf6db/python-dateutil-2.9.0.post0.tar.gz", hash = "sha256:37dd54208da7e1cd875388217d5e00ebd4179249f90fb72437e91a35459a0ad3", size = 342432, upload-time = "2024-03-01T18:36:20.211Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/57/56b9bcc3c9c6a792fcbaf139543cee77261f3651ca9da0c93f5c1221264b/python_dateutil-2.9.0.post0-py2.py3-none-any.whl", hash = "sha256:a8b2bc7bffae282281c8140a97d3aa9c14da0b136dfe83f850eea9a5f7470427", size = 229892, upload-time = "2024-03-01T18:36:18.57Z" }, +] + +[[package]] +name = "pyyaml" +version = "6.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/8e/961c0007c59b8dd7729d542c61a4d537767a59645b82a0b521206e1e25c2/pyyaml-6.0.3.tar.gz", hash = "sha256:d76623373421df22fb4cf8817020cbb7ef15c725b9d5e45f17e189bfc384190f", size = 130960, upload-time = "2025-09-25T21:33:16.546Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/33/422b98d2195232ca1826284a76852ad5a86fe23e31b009c9886b2d0fb8b2/pyyaml-6.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f047e29dcae44602496db43be01ad42fc6f1cc0d8cd6c83d342306c32270196", size = 182063, upload-time = "2025-09-25T21:32:11.445Z" }, + { url = "https://files.pythonhosted.org/packages/89/a0/6cf41a19a1f2f3feab0e9c0b74134aa2ce6849093d5517a0c550fe37a648/pyyaml-6.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:fc09d0aa354569bc501d4e787133afc08552722d3ab34836a80547331bb5d4a0", size = 173973, upload-time = "2025-09-25T21:32:12.492Z" }, + { url = "https://files.pythonhosted.org/packages/ed/23/7a778b6bd0b9a8039df8b1b1d80e2e2ad78aa04171592c8a5c43a56a6af4/pyyaml-6.0.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9149cad251584d5fb4981be1ecde53a1ca46c891a79788c0df828d2f166bda28", size = 775116, upload-time = "2025-09-25T21:32:13.652Z" }, + { url = "https://files.pythonhosted.org/packages/65/30/d7353c338e12baef4ecc1b09e877c1970bd3382789c159b4f89d6a70dc09/pyyaml-6.0.3-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5fdec68f91a0c6739b380c83b951e2c72ac0197ace422360e6d5a959d8d97b2c", size = 844011, upload-time = "2025-09-25T21:32:15.21Z" }, + { url = "https://files.pythonhosted.org/packages/8b/9d/b3589d3877982d4f2329302ef98a8026e7f4443c765c46cfecc8858c6b4b/pyyaml-6.0.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ba1cc08a7ccde2d2ec775841541641e4548226580ab850948cbfda66a1befcdc", size = 807870, upload-time = "2025-09-25T21:32:16.431Z" }, + { url = "https://files.pythonhosted.org/packages/05/c0/b3be26a015601b822b97d9149ff8cb5ead58c66f981e04fedf4e762f4bd4/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8dc52c23056b9ddd46818a57b78404882310fb473d63f17b07d5c40421e47f8e", size = 761089, upload-time = "2025-09-25T21:32:17.56Z" }, + { url = "https://files.pythonhosted.org/packages/be/8e/98435a21d1d4b46590d5459a22d88128103f8da4c2d4cb8f14f2a96504e1/pyyaml-6.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:41715c910c881bc081f1e8872880d3c650acf13dfa8214bad49ed4cede7c34ea", size = 790181, upload-time = "2025-09-25T21:32:18.834Z" }, + { url = "https://files.pythonhosted.org/packages/74/93/7baea19427dcfbe1e5a372d81473250b379f04b1bd3c4c5ff825e2327202/pyyaml-6.0.3-cp312-cp312-win32.whl", hash = "sha256:96b533f0e99f6579b3d4d4995707cf36df9100d67e0c8303a0c55b27b5f99bc5", size = 137658, upload-time = "2025-09-25T21:32:20.209Z" }, + { url = "https://files.pythonhosted.org/packages/86/bf/899e81e4cce32febab4fb42bb97dcdf66bc135272882d1987881a4b519e9/pyyaml-6.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:5fcd34e47f6e0b794d17de1b4ff496c00986e1c83f7ab2fb8fcfe9616ff7477b", size = 154003, upload-time = "2025-09-25T21:32:21.167Z" }, + { url = "https://files.pythonhosted.org/packages/1a/08/67bd04656199bbb51dbed1439b7f27601dfb576fb864099c7ef0c3e55531/pyyaml-6.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:64386e5e707d03a7e172c0701abfb7e10f0fb753ee1d773128192742712a98fd", size = 140344, upload-time = "2025-09-25T21:32:22.617Z" }, + { url = "https://files.pythonhosted.org/packages/d1/11/0fd08f8192109f7169db964b5707a2f1e8b745d4e239b784a5a1dd80d1db/pyyaml-6.0.3-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:8da9669d359f02c0b91ccc01cac4a67f16afec0dac22c2ad09f46bee0697eba8", size = 181669, upload-time = "2025-09-25T21:32:23.673Z" }, + { url = "https://files.pythonhosted.org/packages/b1/16/95309993f1d3748cd644e02e38b75d50cbc0d9561d21f390a76242ce073f/pyyaml-6.0.3-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:2283a07e2c21a2aa78d9c4442724ec1eb15f5e42a723b99cb3d822d48f5f7ad1", size = 173252, upload-time = "2025-09-25T21:32:25.149Z" }, + { url = "https://files.pythonhosted.org/packages/50/31/b20f376d3f810b9b2371e72ef5adb33879b25edb7a6d072cb7ca0c486398/pyyaml-6.0.3-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ee2922902c45ae8ccada2c5b501ab86c36525b883eff4255313a253a3160861c", size = 767081, upload-time = "2025-09-25T21:32:26.575Z" }, + { url = "https://files.pythonhosted.org/packages/49/1e/a55ca81e949270d5d4432fbbd19dfea5321eda7c41a849d443dc92fd1ff7/pyyaml-6.0.3-cp313-cp313-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a33284e20b78bd4a18c8c2282d549d10bc8408a2a7ff57653c0cf0b9be0afce5", size = 841159, upload-time = "2025-09-25T21:32:27.727Z" }, + { url = "https://files.pythonhosted.org/packages/74/27/e5b8f34d02d9995b80abcef563ea1f8b56d20134d8f4e5e81733b1feceb2/pyyaml-6.0.3-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0f29edc409a6392443abf94b9cf89ce99889a1dd5376d94316ae5145dfedd5d6", size = 801626, upload-time = "2025-09-25T21:32:28.878Z" }, + { url = "https://files.pythonhosted.org/packages/f9/11/ba845c23988798f40e52ba45f34849aa8a1f2d4af4b798588010792ebad6/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:f7057c9a337546edc7973c0d3ba84ddcdf0daa14533c2065749c9075001090e6", size = 753613, upload-time = "2025-09-25T21:32:30.178Z" }, + { url = "https://files.pythonhosted.org/packages/3d/e0/7966e1a7bfc0a45bf0a7fb6b98ea03fc9b8d84fa7f2229e9659680b69ee3/pyyaml-6.0.3-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:eda16858a3cab07b80edaf74336ece1f986ba330fdb8ee0d6c0d68fe82bc96be", size = 794115, upload-time = "2025-09-25T21:32:31.353Z" }, + { url = "https://files.pythonhosted.org/packages/de/94/980b50a6531b3019e45ddeada0626d45fa85cbe22300844a7983285bed3b/pyyaml-6.0.3-cp313-cp313-win32.whl", hash = "sha256:d0eae10f8159e8fdad514efdc92d74fd8d682c933a6dd088030f3834bc8e6b26", size = 137427, upload-time = "2025-09-25T21:32:32.58Z" }, + { url = "https://files.pythonhosted.org/packages/97/c9/39d5b874e8b28845e4ec2202b5da735d0199dbe5b8fb85f91398814a9a46/pyyaml-6.0.3-cp313-cp313-win_amd64.whl", hash = "sha256:79005a0d97d5ddabfeeea4cf676af11e647e41d81c9a7722a193022accdb6b7c", size = 154090, upload-time = "2025-09-25T21:32:33.659Z" }, + { url = "https://files.pythonhosted.org/packages/73/e8/2bdf3ca2090f68bb3d75b44da7bbc71843b19c9f2b9cb9b0f4ab7a5a4329/pyyaml-6.0.3-cp313-cp313-win_arm64.whl", hash = "sha256:5498cd1645aa724a7c71c8f378eb29ebe23da2fc0d7a08071d89469bf1d2defb", size = 140246, upload-time = "2025-09-25T21:32:34.663Z" }, + { url = "https://files.pythonhosted.org/packages/9d/8c/f4bd7f6465179953d3ac9bc44ac1a8a3e6122cf8ada906b4f96c60172d43/pyyaml-6.0.3-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:8d1fab6bb153a416f9aeb4b8763bc0f22a5586065f86f7664fc23339fc1c1fac", size = 181814, upload-time = "2025-09-25T21:32:35.712Z" }, + { url = "https://files.pythonhosted.org/packages/bd/9c/4d95bb87eb2063d20db7b60faa3840c1b18025517ae857371c4dd55a6b3a/pyyaml-6.0.3-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:34d5fcd24b8445fadc33f9cf348c1047101756fd760b4dacb5c3e99755703310", size = 173809, upload-time = "2025-09-25T21:32:36.789Z" }, + { url = "https://files.pythonhosted.org/packages/92/b5/47e807c2623074914e29dabd16cbbdd4bf5e9b2db9f8090fa64411fc5382/pyyaml-6.0.3-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:501a031947e3a9025ed4405a168e6ef5ae3126c59f90ce0cd6f2bfc477be31b7", size = 766454, upload-time = "2025-09-25T21:32:37.966Z" }, + { url = "https://files.pythonhosted.org/packages/02/9e/e5e9b168be58564121efb3de6859c452fccde0ab093d8438905899a3a483/pyyaml-6.0.3-cp314-cp314-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b3bc83488de33889877a0f2543ade9f70c67d66d9ebb4ac959502e12de895788", size = 836355, upload-time = "2025-09-25T21:32:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/88/f9/16491d7ed2a919954993e48aa941b200f38040928474c9e85ea9e64222c3/pyyaml-6.0.3-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c458b6d084f9b935061bc36216e8a69a7e293a2f1e68bf956dcd9e6cbcd143f5", size = 794175, upload-time = "2025-09-25T21:32:40.865Z" }, + { url = "https://files.pythonhosted.org/packages/dd/3f/5989debef34dc6397317802b527dbbafb2b4760878a53d4166579111411e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:7c6610def4f163542a622a73fb39f534f8c101d690126992300bf3207eab9764", size = 755228, upload-time = "2025-09-25T21:32:42.084Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ce/af88a49043cd2e265be63d083fc75b27b6ed062f5f9fd6cdc223ad62f03e/pyyaml-6.0.3-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:5190d403f121660ce8d1d2c1bb2ef1bd05b5f68533fc5c2ea899bd15f4399b35", size = 789194, upload-time = "2025-09-25T21:32:43.362Z" }, + { url = "https://files.pythonhosted.org/packages/23/20/bb6982b26a40bb43951265ba29d4c246ef0ff59c9fdcdf0ed04e0687de4d/pyyaml-6.0.3-cp314-cp314-win_amd64.whl", hash = "sha256:4a2e8cebe2ff6ab7d1050ecd59c25d4c8bd7e6f400f5f82b96557ac0abafd0ac", size = 156429, upload-time = "2025-09-25T21:32:57.844Z" }, + { url = "https://files.pythonhosted.org/packages/f4/f4/a4541072bb9422c8a883ab55255f918fa378ecf083f5b85e87fc2b4eda1b/pyyaml-6.0.3-cp314-cp314-win_arm64.whl", hash = "sha256:93dda82c9c22deb0a405ea4dc5f2d0cda384168e466364dec6255b293923b2f3", size = 143912, upload-time = "2025-09-25T21:32:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/f9/07dd09ae774e4616edf6cda684ee78f97777bdd15847253637a6f052a62f/pyyaml-6.0.3-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:02893d100e99e03eda1c8fd5c441d8c60103fd175728e23e431db1b589cf5ab3", size = 189108, upload-time = "2025-09-25T21:32:44.377Z" }, + { url = "https://files.pythonhosted.org/packages/4e/78/8d08c9fb7ce09ad8c38ad533c1191cf27f7ae1effe5bb9400a46d9437fcf/pyyaml-6.0.3-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:c1ff362665ae507275af2853520967820d9124984e0f7466736aea23d8611fba", size = 183641, upload-time = "2025-09-25T21:32:45.407Z" }, + { url = "https://files.pythonhosted.org/packages/7b/5b/3babb19104a46945cf816d047db2788bcaf8c94527a805610b0289a01c6b/pyyaml-6.0.3-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6adc77889b628398debc7b65c073bcb99c4a0237b248cacaf3fe8a557563ef6c", size = 831901, upload-time = "2025-09-25T21:32:48.83Z" }, + { url = "https://files.pythonhosted.org/packages/8b/cc/dff0684d8dc44da4d22a13f35f073d558c268780ce3c6ba1b87055bb0b87/pyyaml-6.0.3-cp314-cp314t-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:a80cb027f6b349846a3bf6d73b5e95e782175e52f22108cfa17876aaeff93702", size = 861132, upload-time = "2025-09-25T21:32:50.149Z" }, + { url = "https://files.pythonhosted.org/packages/b1/5e/f77dc6b9036943e285ba76b49e118d9ea929885becb0a29ba8a7c75e29fe/pyyaml-6.0.3-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:00c4bdeba853cc34e7dd471f16b4114f4162dc03e6b7afcc2128711f0eca823c", size = 839261, upload-time = "2025-09-25T21:32:51.808Z" }, + { url = "https://files.pythonhosted.org/packages/ce/88/a9db1376aa2a228197c58b37302f284b5617f56a5d959fd1763fb1675ce6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:66e1674c3ef6f541c35191caae2d429b967b99e02040f5ba928632d9a7f0f065", size = 805272, upload-time = "2025-09-25T21:32:52.941Z" }, + { url = "https://files.pythonhosted.org/packages/da/92/1446574745d74df0c92e6aa4a7b0b3130706a4142b2d1a5869f2eaa423c6/pyyaml-6.0.3-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:16249ee61e95f858e83976573de0f5b2893b3677ba71c9dd36b9cf8be9ac6d65", size = 829923, upload-time = "2025-09-25T21:32:54.537Z" }, + { url = "https://files.pythonhosted.org/packages/f0/7a/1c7270340330e575b92f397352af856a8c06f230aa3e76f86b39d01b416a/pyyaml-6.0.3-cp314-cp314t-win_amd64.whl", hash = "sha256:4ad1906908f2f5ae4e5a8ddfce73c320c2a1429ec52eafd27138b7f1cbe341c9", size = 174062, upload-time = "2025-09-25T21:32:55.767Z" }, + { url = "https://files.pythonhosted.org/packages/f1/12/de94a39c2ef588c7e6455cfbe7343d3b2dc9d6b6b2f40c4c6565744c873d/pyyaml-6.0.3-cp314-cp314t-win_arm64.whl", hash = "sha256:ebc55a14a21cb14062aa4162f906cd962b28e2e9ea38f9b4391244cd8de4ae0b", size = 149341, upload-time = "2025-09-25T21:32:56.828Z" }, +] + +[[package]] +name = "pyyaml-env-tag" +version = "1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyyaml" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/eb/2e/79c822141bfd05a853236b504869ebc6b70159afc570e1d5a20641782eaa/pyyaml_env_tag-1.1.tar.gz", hash = "sha256:2eb38b75a2d21ee0475d6d97ec19c63287a7e140231e4214969d0eac923cd7ff", size = 5737, upload-time = "2025-05-13T15:24:01.64Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/11/432f32f8097b03e3cd5fe57e88efb685d964e2e5178a48ed61e841f7fdce/pyyaml_env_tag-1.1-py3-none-any.whl", hash = "sha256:17109e1a528561e32f026364712fee1264bc2ea6715120891174ed1b980d2e04", size = 4722, upload-time = "2025-05-13T15:23:59.629Z" }, +] + +[[package]] +name = "pyzmq" +version = "27.1.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "implementation_name == 'pypy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/0b/3c9baedbdf613ecaa7aa07027780b8867f57b6293b6ee50de316c9f3222b/pyzmq-27.1.0.tar.gz", hash = "sha256:ac0765e3d44455adb6ddbf4417dcce460fc40a05978c08efdf2948072f6db540", size = 281750, upload-time = "2025-09-08T23:10:18.157Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/92/e7/038aab64a946d535901103da16b953c8c9cc9c961dadcbf3609ed6428d23/pyzmq-27.1.0-cp312-abi3-macosx_10_15_universal2.whl", hash = "sha256:452631b640340c928fa343801b0d07eb0c3789a5ffa843f6e1a9cee0ba4eb4fc", size = 1306279, upload-time = "2025-09-08T23:08:03.807Z" }, + { url = "https://files.pythonhosted.org/packages/e8/5e/c3c49fdd0f535ef45eefcc16934648e9e59dace4a37ee88fc53f6cd8e641/pyzmq-27.1.0-cp312-abi3-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1c179799b118e554b66da67d88ed66cd37a169f1f23b5d9f0a231b4e8d44a113", size = 895645, upload-time = "2025-09-08T23:08:05.301Z" }, + { url = "https://files.pythonhosted.org/packages/f8/e5/b0b2504cb4e903a74dcf1ebae157f9e20ebb6ea76095f6cfffea28c42ecd/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3837439b7f99e60312f0c926a6ad437b067356dc2bc2ec96eb395fd0fe804233", size = 652574, upload-time = "2025-09-08T23:08:06.828Z" }, + { url = "https://files.pythonhosted.org/packages/f8/9b/c108cdb55560eaf253f0cbdb61b29971e9fb34d9c3499b0e96e4e60ed8a5/pyzmq-27.1.0-cp312-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43ad9a73e3da1fab5b0e7e13402f0b2fb934ae1c876c51d0afff0e7c052eca31", size = 840995, upload-time = "2025-09-08T23:08:08.396Z" }, + { url = "https://files.pythonhosted.org/packages/c2/bb/b79798ca177b9eb0825b4c9998c6af8cd2a7f15a6a1a4272c1d1a21d382f/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0de3028d69d4cdc475bfe47a6128eb38d8bc0e8f4d69646adfbcd840facbac28", size = 1642070, upload-time = "2025-09-08T23:08:09.989Z" }, + { url = "https://files.pythonhosted.org/packages/9c/80/2df2e7977c4ede24c79ae39dcef3899bfc5f34d1ca7a5b24f182c9b7a9ca/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_i686.whl", hash = "sha256:cf44a7763aea9298c0aa7dbf859f87ed7012de8bda0f3977b6fb1d96745df856", size = 2021121, upload-time = "2025-09-08T23:08:11.907Z" }, + { url = "https://files.pythonhosted.org/packages/46/bd/2d45ad24f5f5ae7e8d01525eb76786fa7557136555cac7d929880519e33a/pyzmq-27.1.0-cp312-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:f30f395a9e6fbca195400ce833c731e7b64c3919aa481af4d88c3759e0cb7496", size = 1878550, upload-time = "2025-09-08T23:08:13.513Z" }, + { url = "https://files.pythonhosted.org/packages/e6/2f/104c0a3c778d7c2ab8190e9db4f62f0b6957b53c9d87db77c284b69f33ea/pyzmq-27.1.0-cp312-abi3-win32.whl", hash = "sha256:250e5436a4ba13885494412b3da5d518cd0d3a278a1ae640e113c073a5f88edd", size = 559184, upload-time = "2025-09-08T23:08:15.163Z" }, + { url = "https://files.pythonhosted.org/packages/fc/7f/a21b20d577e4100c6a41795842028235998a643b1ad406a6d4163ea8f53e/pyzmq-27.1.0-cp312-abi3-win_amd64.whl", hash = "sha256:9ce490cf1d2ca2ad84733aa1d69ce6855372cb5ce9223802450c9b2a7cba0ccf", size = 619480, upload-time = "2025-09-08T23:08:17.192Z" }, + { url = "https://files.pythonhosted.org/packages/78/c2/c012beae5f76b72f007a9e91ee9401cb88c51d0f83c6257a03e785c81cc2/pyzmq-27.1.0-cp312-abi3-win_arm64.whl", hash = "sha256:75a2f36223f0d535a0c919e23615fc85a1e23b71f40c7eb43d7b1dedb4d8f15f", size = 552993, upload-time = "2025-09-08T23:08:18.926Z" }, + { url = "https://files.pythonhosted.org/packages/60/cb/84a13459c51da6cec1b7b1dc1a47e6db6da50b77ad7fd9c145842750a011/pyzmq-27.1.0-cp313-cp313-android_24_arm64_v8a.whl", hash = "sha256:93ad4b0855a664229559e45c8d23797ceac03183c7b6f5b4428152a6b06684a5", size = 1122436, upload-time = "2025-09-08T23:08:20.801Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b6/94414759a69a26c3dd674570a81813c46a078767d931a6c70ad29fc585cb/pyzmq-27.1.0-cp313-cp313-android_24_x86_64.whl", hash = "sha256:fbb4f2400bfda24f12f009cba62ad5734148569ff4949b1b6ec3b519444342e6", size = 1156301, upload-time = "2025-09-08T23:08:22.47Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ad/15906493fd40c316377fd8a8f6b1f93104f97a752667763c9b9c1b71d42d/pyzmq-27.1.0-cp313-cp313t-macosx_10_15_universal2.whl", hash = "sha256:e343d067f7b151cfe4eb3bb796a7752c9d369eed007b91231e817071d2c2fec7", size = 1341197, upload-time = "2025-09-08T23:08:24.286Z" }, + { url = "https://files.pythonhosted.org/packages/14/1d/d343f3ce13db53a54cb8946594e567410b2125394dafcc0268d8dda027e0/pyzmq-27.1.0-cp313-cp313t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:08363b2011dec81c354d694bdecaef4770e0ae96b9afea70b3f47b973655cc05", size = 897275, upload-time = "2025-09-08T23:08:26.063Z" }, + { url = "https://files.pythonhosted.org/packages/69/2d/d83dd6d7ca929a2fc67d2c3005415cdf322af7751d773524809f9e585129/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d54530c8c8b5b8ddb3318f481297441af102517602b569146185fa10b63f4fa9", size = 660469, upload-time = "2025-09-08T23:08:27.623Z" }, + { url = "https://files.pythonhosted.org/packages/3e/cd/9822a7af117f4bc0f1952dbe9ef8358eb50a24928efd5edf54210b850259/pyzmq-27.1.0-cp313-cp313t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3afa12c392f0a44a2414056d730eebc33ec0926aae92b5ad5cf26ebb6cc128", size = 847961, upload-time = "2025-09-08T23:08:29.672Z" }, + { url = "https://files.pythonhosted.org/packages/9a/12/f003e824a19ed73be15542f172fd0ec4ad0b60cf37436652c93b9df7c585/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:c65047adafe573ff023b3187bb93faa583151627bc9c51fc4fb2c561ed689d39", size = 1650282, upload-time = "2025-09-08T23:08:31.349Z" }, + { url = "https://files.pythonhosted.org/packages/d5/4a/e82d788ed58e9a23995cee70dbc20c9aded3d13a92d30d57ec2291f1e8a3/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_i686.whl", hash = "sha256:90e6e9441c946a8b0a667356f7078d96411391a3b8f80980315455574177ec97", size = 2024468, upload-time = "2025-09-08T23:08:33.543Z" }, + { url = "https://files.pythonhosted.org/packages/d9/94/2da0a60841f757481e402b34bf4c8bf57fa54a5466b965de791b1e6f747d/pyzmq-27.1.0-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:add071b2d25f84e8189aaf0882d39a285b42fa3853016ebab234a5e78c7a43db", size = 1885394, upload-time = "2025-09-08T23:08:35.51Z" }, + { url = "https://files.pythonhosted.org/packages/4f/6f/55c10e2e49ad52d080dc24e37adb215e5b0d64990b57598abc2e3f01725b/pyzmq-27.1.0-cp313-cp313t-win32.whl", hash = "sha256:7ccc0700cfdf7bd487bea8d850ec38f204478681ea02a582a8da8171b7f90a1c", size = 574964, upload-time = "2025-09-08T23:08:37.178Z" }, + { url = "https://files.pythonhosted.org/packages/87/4d/2534970ba63dd7c522d8ca80fb92777f362c0f321900667c615e2067cb29/pyzmq-27.1.0-cp313-cp313t-win_amd64.whl", hash = "sha256:8085a9fba668216b9b4323be338ee5437a235fe275b9d1610e422ccc279733e2", size = 641029, upload-time = "2025-09-08T23:08:40.595Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fa/f8aea7a28b0641f31d40dea42d7ef003fded31e184ef47db696bc74cd610/pyzmq-27.1.0-cp313-cp313t-win_arm64.whl", hash = "sha256:6bb54ca21bcfe361e445256c15eedf083f153811c37be87e0514934d6913061e", size = 561541, upload-time = "2025-09-08T23:08:42.668Z" }, + { url = "https://files.pythonhosted.org/packages/87/45/19efbb3000956e82d0331bafca5d9ac19ea2857722fa2caacefb6042f39d/pyzmq-27.1.0-cp314-cp314t-macosx_10_15_universal2.whl", hash = "sha256:ce980af330231615756acd5154f29813d553ea555485ae712c491cd483df6b7a", size = 1341197, upload-time = "2025-09-08T23:08:44.973Z" }, + { url = "https://files.pythonhosted.org/packages/48/43/d72ccdbf0d73d1343936296665826350cb1e825f92f2db9db3e61c2162a2/pyzmq-27.1.0-cp314-cp314t-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:1779be8c549e54a1c38f805e56d2a2e5c009d26de10921d7d51cfd1c8d4632ea", size = 897175, upload-time = "2025-09-08T23:08:46.601Z" }, + { url = "https://files.pythonhosted.org/packages/2f/2e/a483f73a10b65a9ef0161e817321d39a770b2acf8bcf3004a28d90d14a94/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7200bb0f03345515df50d99d3db206a0a6bee1955fbb8c453c76f5bf0e08fb96", size = 660427, upload-time = "2025-09-08T23:08:48.187Z" }, + { url = "https://files.pythonhosted.org/packages/f5/d2/5f36552c2d3e5685abe60dfa56f91169f7a2d99bbaf67c5271022ab40863/pyzmq-27.1.0-cp314-cp314t-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:01c0e07d558b06a60773744ea6251f769cd79a41a97d11b8bf4ab8f034b0424d", size = 847929, upload-time = "2025-09-08T23:08:49.76Z" }, + { url = "https://files.pythonhosted.org/packages/c4/2a/404b331f2b7bf3198e9945f75c4c521f0c6a3a23b51f7a4a401b94a13833/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:80d834abee71f65253c91540445d37c4c561e293ba6e741b992f20a105d69146", size = 1650193, upload-time = "2025-09-08T23:08:51.7Z" }, + { url = "https://files.pythonhosted.org/packages/1c/0b/f4107e33f62a5acf60e3ded67ed33d79b4ce18de432625ce2fc5093d6388/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_i686.whl", hash = "sha256:544b4e3b7198dde4a62b8ff6685e9802a9a1ebf47e77478a5eb88eca2a82f2fd", size = 2024388, upload-time = "2025-09-08T23:08:53.393Z" }, + { url = "https://files.pythonhosted.org/packages/0d/01/add31fe76512642fd6e40e3a3bd21f4b47e242c8ba33efb6809e37076d9b/pyzmq-27.1.0-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:cedc4c68178e59a4046f97eca31b148ddcf51e88677de1ef4e78cf06c5376c9a", size = 1885316, upload-time = "2025-09-08T23:08:55.702Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/a5f38970f9bf07cee96128de79590bb354917914a9be11272cfc7ff26af0/pyzmq-27.1.0-cp314-cp314t-win32.whl", hash = "sha256:1f0b2a577fd770aa6f053211a55d1c47901f4d537389a034c690291485e5fe92", size = 587472, upload-time = "2025-09-08T23:08:58.18Z" }, + { url = "https://files.pythonhosted.org/packages/70/d8/78b1bad170f93fcf5e3536e70e8fadac55030002275c9a29e8f5719185de/pyzmq-27.1.0-cp314-cp314t-win_amd64.whl", hash = "sha256:19c9468ae0437f8074af379e986c5d3d7d7bfe033506af442e8c879732bedbe0", size = 661401, upload-time = "2025-09-08T23:08:59.802Z" }, + { url = "https://files.pythonhosted.org/packages/81/d6/4bfbb40c9a0b42fc53c7cf442f6385db70b40f74a783130c5d0a5aa62228/pyzmq-27.1.0-cp314-cp314t-win_arm64.whl", hash = "sha256:dc5dbf68a7857b59473f7df42650c621d7e8923fb03fa74a526890f4d33cc4d7", size = 575170, upload-time = "2025-09-08T23:09:01.418Z" }, +] + +[[package]] +name = "requests" +version = "2.33.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5f/a4/98b9c7c6428a668bf7e42ebb7c79d576a1c3c1e3ae2d47e674b468388871/requests-2.33.1.tar.gz", hash = "sha256:18817f8c57c6263968bc123d237e3b8b08ac046f5456bd1e307ee8f4250d3517", size = 134120, upload-time = "2026-03-30T16:09:15.531Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d7/8e/7540e8a2036f79a125c1d2ebadf69ed7901608859186c856fa0388ef4197/requests-2.33.1-py3-none-any.whl", hash = "sha256:4e6d1ef462f3626a1f0a0a9c42dd93c63bad33f9f1c1937509b8c5c8718ab56a", size = 64947, upload-time = "2026-03-30T16:09:13.83Z" }, +] + +[[package]] +name = "shapely" +version = "2.1.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4d/bc/0989043118a27cccb4e906a46b7565ce36ca7b57f5a18b78f4f1b0f72d9d/shapely-2.1.2.tar.gz", hash = "sha256:2ed4ecb28320a433db18a5bf029986aa8afcfd740745e78847e330d5d94922a9", size = 315489, upload-time = "2025-09-24T13:51:41.432Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/c0/f3b6453cf2dfa99adc0ba6675f9aaff9e526d2224cbd7ff9c1a879238693/shapely-2.1.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fe2533caae6a91a543dec62e8360fe86ffcdc42a7c55f9dfd0128a977a896b94", size = 1833550, upload-time = "2025-09-24T13:50:30.019Z" }, + { url = "https://files.pythonhosted.org/packages/86/07/59dee0bc4b913b7ab59ab1086225baca5b8f19865e6101db9ebb7243e132/shapely-2.1.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ba4d1333cc0bc94381d6d4308d2e4e008e0bd128bdcff5573199742ee3634359", size = 1643556, upload-time = "2025-09-24T13:50:32.291Z" }, + { url = "https://files.pythonhosted.org/packages/26/29/a5397e75b435b9895cd53e165083faed5d12fd9626eadec15a83a2411f0f/shapely-2.1.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:0bd308103340030feef6c111d3eb98d50dc13feea33affc8a6f9fa549e9458a3", size = 2988308, upload-time = "2025-09-24T13:50:33.862Z" }, + { url = "https://files.pythonhosted.org/packages/b9/37/e781683abac55dde9771e086b790e554811a71ed0b2b8a1e789b7430dd44/shapely-2.1.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1e7d4d7ad262a48bb44277ca12c7c78cb1b0f56b32c10734ec9a1d30c0b0c54b", size = 3099844, upload-time = "2025-09-24T13:50:35.459Z" }, + { url = "https://files.pythonhosted.org/packages/d8/f3/9876b64d4a5a321b9dc482c92bb6f061f2fa42131cba643c699f39317cb9/shapely-2.1.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e9eddfe513096a71896441a7c37db72da0687b34752c4e193577a145c71736fc", size = 3988842, upload-time = "2025-09-24T13:50:37.478Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a0/704c7292f7014c7e74ec84eddb7b109e1fbae74a16deae9c1504b1d15565/shapely-2.1.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:980c777c612514c0cf99bc8a9de6d286f5e186dcaf9091252fcd444e5638193d", size = 4152714, upload-time = "2025-09-24T13:50:39.9Z" }, + { url = "https://files.pythonhosted.org/packages/53/46/319c9dc788884ad0785242543cdffac0e6530e4d0deb6c4862bc4143dcf3/shapely-2.1.2-cp312-cp312-win32.whl", hash = "sha256:9111274b88e4d7b54a95218e243282709b330ef52b7b86bc6aaf4f805306f454", size = 1542745, upload-time = "2025-09-24T13:50:41.414Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bf/cb6c1c505cb31e818e900b9312d514f381fbfa5c4363edfce0fcc4f8c1a4/shapely-2.1.2-cp312-cp312-win_amd64.whl", hash = "sha256:743044b4cfb34f9a67205cee9279feaf60ba7d02e69febc2afc609047cb49179", size = 1722861, upload-time = "2025-09-24T13:50:43.35Z" }, + { url = "https://files.pythonhosted.org/packages/c3/90/98ef257c23c46425dc4d1d31005ad7c8d649fe423a38b917db02c30f1f5a/shapely-2.1.2-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:b510dda1a3672d6879beb319bc7c5fd302c6c354584690973c838f46ec3e0fa8", size = 1832644, upload-time = "2025-09-24T13:50:44.886Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ab/0bee5a830d209adcd3a01f2d4b70e587cdd9fd7380d5198c064091005af8/shapely-2.1.2-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:8cff473e81017594d20ec55d86b54bc635544897e13a7cfc12e36909c5309a2a", size = 1642887, upload-time = "2025-09-24T13:50:46.735Z" }, + { url = "https://files.pythonhosted.org/packages/2d/5e/7d7f54ba960c13302584c73704d8c4d15404a51024631adb60b126a4ae88/shapely-2.1.2-cp313-cp313-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe7b77dc63d707c09726b7908f575fc04ff1d1ad0f3fb92aec212396bc6cfe5e", size = 2970931, upload-time = "2025-09-24T13:50:48.374Z" }, + { url = "https://files.pythonhosted.org/packages/f2/a2/83fc37e2a58090e3d2ff79175a95493c664bcd0b653dd75cb9134645a4e5/shapely-2.1.2-cp313-cp313-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7ed1a5bbfb386ee8332713bf7508bc24e32d24b74fc9a7b9f8529a55db9f4ee6", size = 3082855, upload-time = "2025-09-24T13:50:50.037Z" }, + { url = "https://files.pythonhosted.org/packages/44/2b/578faf235a5b09f16b5f02833c53822294d7f21b242f8e2d0cf03fb64321/shapely-2.1.2-cp313-cp313-musllinux_1_2_aarch64.whl", hash = "sha256:a84e0582858d841d54355246ddfcbd1fce3179f185da7470f41ce39d001ee1af", size = 3979960, upload-time = "2025-09-24T13:50:51.74Z" }, + { url = "https://files.pythonhosted.org/packages/4d/04/167f096386120f692cc4ca02f75a17b961858997a95e67a3cb6a7bbd6b53/shapely-2.1.2-cp313-cp313-musllinux_1_2_x86_64.whl", hash = "sha256:dc3487447a43d42adcdf52d7ac73804f2312cbfa5d433a7d2c506dcab0033dfd", size = 4142851, upload-time = "2025-09-24T13:50:53.49Z" }, + { url = "https://files.pythonhosted.org/packages/48/74/fb402c5a6235d1c65a97348b48cdedb75fb19eca2b1d66d04969fc1c6091/shapely-2.1.2-cp313-cp313-win32.whl", hash = "sha256:9c3a3c648aedc9f99c09263b39f2d8252f199cb3ac154fadc173283d7d111350", size = 1541890, upload-time = "2025-09-24T13:50:55.337Z" }, + { url = "https://files.pythonhosted.org/packages/41/47/3647fe7ad990af60ad98b889657a976042c9988c2807cf322a9d6685f462/shapely-2.1.2-cp313-cp313-win_amd64.whl", hash = "sha256:ca2591bff6645c216695bdf1614fca9c82ea1144d4a7591a466fef64f28f0715", size = 1722151, upload-time = "2025-09-24T13:50:57.153Z" }, + { url = "https://files.pythonhosted.org/packages/3c/49/63953754faa51ffe7d8189bfbe9ca34def29f8c0e34c67cbe2a2795f269d/shapely-2.1.2-cp313-cp313t-macosx_10_13_x86_64.whl", hash = "sha256:2d93d23bdd2ed9dc157b46bc2f19b7da143ca8714464249bef6771c679d5ff40", size = 1834130, upload-time = "2025-09-24T13:50:58.49Z" }, + { url = "https://files.pythonhosted.org/packages/7f/ee/dce001c1984052970ff60eb4727164892fb2d08052c575042a47f5a9e88f/shapely-2.1.2-cp313-cp313t-macosx_11_0_arm64.whl", hash = "sha256:01d0d304b25634d60bd7cf291828119ab55a3bab87dc4af1e44b07fb225f188b", size = 1642802, upload-time = "2025-09-24T13:50:59.871Z" }, + { url = "https://files.pythonhosted.org/packages/da/e7/fc4e9a19929522877fa602f705706b96e78376afb7fad09cad5b9af1553c/shapely-2.1.2-cp313-cp313t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8d8382dd120d64b03698b7298b89611a6ea6f55ada9d39942838b79c9bc89801", size = 3018460, upload-time = "2025-09-24T13:51:02.08Z" }, + { url = "https://files.pythonhosted.org/packages/a1/18/7519a25db21847b525696883ddc8e6a0ecaa36159ea88e0fef11466384d0/shapely-2.1.2-cp313-cp313t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:19efa3611eef966e776183e338b2d7ea43569ae99ab34f8d17c2c054d3205cc0", size = 3095223, upload-time = "2025-09-24T13:51:04.472Z" }, + { url = "https://files.pythonhosted.org/packages/48/de/b59a620b1f3a129c3fecc2737104a0a7e04e79335bd3b0a1f1609744cf17/shapely-2.1.2-cp313-cp313t-musllinux_1_2_aarch64.whl", hash = "sha256:346ec0c1a0fcd32f57f00e4134d1200e14bf3f5ae12af87ba83ca275c502498c", size = 4030760, upload-time = "2025-09-24T13:51:06.455Z" }, + { url = "https://files.pythonhosted.org/packages/96/b3/c6655ee7232b417562bae192ae0d3ceaadb1cc0ffc2088a2ddf415456cc2/shapely-2.1.2-cp313-cp313t-musllinux_1_2_x86_64.whl", hash = "sha256:6305993a35989391bd3476ee538a5c9a845861462327efe00dd11a5c8c709a99", size = 4170078, upload-time = "2025-09-24T13:51:08.584Z" }, + { url = "https://files.pythonhosted.org/packages/a0/8e/605c76808d73503c9333af8f6cbe7e1354d2d238bda5f88eea36bfe0f42a/shapely-2.1.2-cp313-cp313t-win32.whl", hash = "sha256:c8876673449f3401f278c86eb33224c5764582f72b653a415d0e6672fde887bf", size = 1559178, upload-time = "2025-09-24T13:51:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/36/f7/d317eb232352a1f1444d11002d477e54514a4a6045536d49d0c59783c0da/shapely-2.1.2-cp313-cp313t-win_amd64.whl", hash = "sha256:4a44bc62a10d84c11a7a3d7c1c4fe857f7477c3506e24c9062da0db0ae0c449c", size = 1739756, upload-time = "2025-09-24T13:51:12.105Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c4/3ce4c2d9b6aabd27d26ec988f08cb877ba9e6e96086eff81bfea93e688c7/shapely-2.1.2-cp314-cp314-macosx_10_13_x86_64.whl", hash = "sha256:9a522f460d28e2bf4e12396240a5fc1518788b2fcd73535166d748399ef0c223", size = 1831290, upload-time = "2025-09-24T13:51:13.56Z" }, + { url = "https://files.pythonhosted.org/packages/17/b9/f6ab8918fc15429f79cb04afa9f9913546212d7fb5e5196132a2af46676b/shapely-2.1.2-cp314-cp314-macosx_11_0_arm64.whl", hash = "sha256:1ff629e00818033b8d71139565527ced7d776c269a49bd78c9df84e8f852190c", size = 1641463, upload-time = "2025-09-24T13:51:14.972Z" }, + { url = "https://files.pythonhosted.org/packages/a5/57/91d59ae525ca641e7ac5551c04c9503aee6f29b92b392f31790fcb1a4358/shapely-2.1.2-cp314-cp314-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f67b34271dedc3c653eba4e3d7111aa421d5be9b4c4c7d38d30907f796cb30df", size = 2970145, upload-time = "2025-09-24T13:51:16.961Z" }, + { url = "https://files.pythonhosted.org/packages/8a/cb/4948be52ee1da6927831ab59e10d4c29baa2a714f599f1f0d1bc747f5777/shapely-2.1.2-cp314-cp314-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:21952dc00df38a2c28375659b07a3979d22641aeb104751e769c3ee825aadecf", size = 3073806, upload-time = "2025-09-24T13:51:18.712Z" }, + { url = "https://files.pythonhosted.org/packages/03/83/f768a54af775eb41ef2e7bec8a0a0dbe7d2431c3e78c0a8bdba7ab17e446/shapely-2.1.2-cp314-cp314-musllinux_1_2_aarch64.whl", hash = "sha256:1f2f33f486777456586948e333a56ae21f35ae273be99255a191f5c1fa302eb4", size = 3980803, upload-time = "2025-09-24T13:51:20.37Z" }, + { url = "https://files.pythonhosted.org/packages/9f/cb/559c7c195807c91c79d38a1f6901384a2878a76fbdf3f1048893a9b7534d/shapely-2.1.2-cp314-cp314-musllinux_1_2_x86_64.whl", hash = "sha256:cf831a13e0d5a7eb519e96f58ec26e049b1fad411fc6fc23b162a7ce04d9cffc", size = 4133301, upload-time = "2025-09-24T13:51:21.887Z" }, + { url = "https://files.pythonhosted.org/packages/80/cd/60d5ae203241c53ef3abd2ef27c6800e21afd6c94e39db5315ea0cbafb4a/shapely-2.1.2-cp314-cp314-win32.whl", hash = "sha256:61edcd8d0d17dd99075d320a1dd39c0cb9616f7572f10ef91b4b5b00c4aeb566", size = 1583247, upload-time = "2025-09-24T13:51:23.401Z" }, + { url = "https://files.pythonhosted.org/packages/74/d4/135684f342e909330e50d31d441ace06bf83c7dc0777e11043f99167b123/shapely-2.1.2-cp314-cp314-win_amd64.whl", hash = "sha256:a444e7afccdb0999e203b976adb37ea633725333e5b119ad40b1ca291ecf311c", size = 1773019, upload-time = "2025-09-24T13:51:24.873Z" }, + { url = "https://files.pythonhosted.org/packages/a3/05/a44f3f9f695fa3ada22786dc9da33c933da1cbc4bfe876fe3a100bafe263/shapely-2.1.2-cp314-cp314t-macosx_10_13_x86_64.whl", hash = "sha256:5ebe3f84c6112ad3d4632b1fd2290665aa75d4cef5f6c5d77c4c95b324527c6a", size = 1834137, upload-time = "2025-09-24T13:51:26.665Z" }, + { url = "https://files.pythonhosted.org/packages/52/7e/4d57db45bf314573427b0a70dfca15d912d108e6023f623947fa69f39b72/shapely-2.1.2-cp314-cp314t-macosx_11_0_arm64.whl", hash = "sha256:5860eb9f00a1d49ebb14e881f5caf6c2cf472c7fd38bd7f253bbd34f934eb076", size = 1642884, upload-time = "2025-09-24T13:51:28.029Z" }, + { url = "https://files.pythonhosted.org/packages/5a/27/4e29c0a55d6d14ad7422bf86995d7ff3f54af0eba59617eb95caf84b9680/shapely-2.1.2-cp314-cp314t-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:b705c99c76695702656327b819c9660768ec33f5ce01fa32b2af62b56ba400a1", size = 3018320, upload-time = "2025-09-24T13:51:29.903Z" }, + { url = "https://files.pythonhosted.org/packages/9f/bb/992e6a3c463f4d29d4cd6ab8963b75b1b1040199edbd72beada4af46bde5/shapely-2.1.2-cp314-cp314t-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:a1fd0ea855b2cf7c9cddaf25543e914dd75af9de08785f20ca3085f2c9ca60b0", size = 3094931, upload-time = "2025-09-24T13:51:32.699Z" }, + { url = "https://files.pythonhosted.org/packages/9c/16/82e65e21070e473f0ed6451224ed9fa0be85033d17e0c6e7213a12f59d12/shapely-2.1.2-cp314-cp314t-musllinux_1_2_aarch64.whl", hash = "sha256:df90e2db118c3671a0754f38e36802db75fe0920d211a27481daf50a711fdf26", size = 4030406, upload-time = "2025-09-24T13:51:34.189Z" }, + { url = "https://files.pythonhosted.org/packages/7c/75/c24ed871c576d7e2b64b04b1fe3d075157f6eb54e59670d3f5ffb36e25c7/shapely-2.1.2-cp314-cp314t-musllinux_1_2_x86_64.whl", hash = "sha256:361b6d45030b4ac64ddd0a26046906c8202eb60d0f9f53085f5179f1d23021a0", size = 4169511, upload-time = "2025-09-24T13:51:36.297Z" }, + { url = "https://files.pythonhosted.org/packages/b1/f7/b3d1d6d18ebf55236eec1c681ce5e665742aab3c0b7b232720a7d43df7b6/shapely-2.1.2-cp314-cp314t-win32.whl", hash = "sha256:b54df60f1fbdecc8ebc2c5b11870461a6417b3d617f555e5033f1505d36e5735", size = 1602607, upload-time = "2025-09-24T13:51:37.757Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f6/f09272a71976dfc138129b8faf435d064a811ae2f708cb147dccdf7aacdb/shapely-2.1.2-cp314-cp314t-win_amd64.whl", hash = "sha256:0036ac886e0923417932c2e6369b6c52e38e0ff5d9120b90eef5cd9a5fc5cae9", size = 1796682, upload-time = "2025-09-24T13:51:39.233Z" }, +] + +[[package]] +name = "six" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/94/e7/b2c673351809dca68a0e064b6af791aa332cf192da575fd474ed7d6f16a2/six-1.17.0.tar.gz", hash = "sha256:ff70335d468e7eb6ec65b95b99d3a2836546063f63acc5171de367e834932a81", size = 34031, upload-time = "2024-12-04T17:35:28.174Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b7/ce/149a00dd41f10bc29e5921b496af8b574d8413afcd5e30dfa0ed46c2cc5e/six-1.17.0-py2.py3-none-any.whl", hash = "sha256:4721f391ed90541fddacab5acf947aa0d3dc7d27b2e1e8eda2be8970586c3274", size = 11050, upload-time = "2024-12-04T17:35:26.475Z" }, +] + +[[package]] +name = "stack-data" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asttokens" }, + { name = "executing" }, + { name = "pure-eval" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/e3/55dcc2cfbc3ca9c29519eb6884dd1415ecb53b0e934862d3559ddcb7e20b/stack_data-0.6.3.tar.gz", hash = "sha256:836a778de4fec4dcd1dcd89ed8abff8a221f58308462e1c4aa2a3cf30148f0b9", size = 44707, upload-time = "2023-09-30T13:58:05.479Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/7b/ce1eafaf1a76852e2ec9b22edecf1daa58175c090266e9f6c64afcd81d91/stack_data-0.6.3-py3-none-any.whl", hash = "sha256:d5558e0c25a4cb0853cddad3d77da9891a08cb85dd9f9f91b9f8cd66e511e695", size = 24521, upload-time = "2023-09-30T13:58:03.53Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f8/f1/3173dfa4a18db4a9b03e5d55325559dab51ee653763bb8745a75af491286/tornado-6.5.5.tar.gz", hash = "sha256:192b8f3ea91bd7f1f50c06955416ed76c6b72f96779b962f07f911b91e8d30e9", size = 516006, upload-time = "2026-03-10T21:31:02.067Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/59/8c/77f5097695f4dd8255ecbd08b2a1ed8ba8b953d337804dd7080f199e12bf/tornado-6.5.5-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:487dc9cc380e29f58c7ab88f9e27cdeef04b2140862e5076a66fb6bb68bb1bfa", size = 445983, upload-time = "2026-03-10T21:30:44.28Z" }, + { url = "https://files.pythonhosted.org/packages/ab/5e/7625b76cd10f98f1516c36ce0346de62061156352353ef2da44e5c21523c/tornado-6.5.5-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:65a7f1d46d4bb41df1ac99f5fcb685fb25c7e61613742d5108b010975a9a6521", size = 444246, upload-time = "2026-03-10T21:30:46.571Z" }, + { url = "https://files.pythonhosted.org/packages/b2/04/7b5705d5b3c0fab088f434f9c83edac1573830ca49ccf29fb83bf7178eec/tornado-6.5.5-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:e74c92e8e65086b338fd56333fb9a68b9f6f2fe7ad532645a290a464bcf46be5", size = 447229, upload-time = "2026-03-10T21:30:48.273Z" }, + { url = "https://files.pythonhosted.org/packages/34/01/74e034a30ef59afb4097ef8659515e96a39d910b712a89af76f5e4e1f93c/tornado-6.5.5-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:435319e9e340276428bbdb4e7fa732c2d399386d1de5686cb331ec8eee754f07", size = 448192, upload-time = "2026-03-10T21:30:51.22Z" }, + { url = "https://files.pythonhosted.org/packages/be/00/fe9e02c5a96429fce1a1d15a517f5d8444f9c412e0bb9eadfbe3b0fc55bf/tornado-6.5.5-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3f54aa540bdbfee7b9eb268ead60e7d199de5021facd276819c193c0fb28ea4e", size = 448039, upload-time = "2026-03-10T21:30:53.52Z" }, + { url = "https://files.pythonhosted.org/packages/82/9e/656ee4cec0398b1d18d0f1eb6372c41c6b889722641d84948351ae19556d/tornado-6.5.5-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:36abed1754faeb80fbd6e64db2758091e1320f6bba74a4cf8c09cd18ccce8aca", size = 447445, upload-time = "2026-03-10T21:30:55.541Z" }, + { url = "https://files.pythonhosted.org/packages/5a/76/4921c00511f88af86a33de770d64141170f1cfd9c00311aea689949e274e/tornado-6.5.5-cp39-abi3-win32.whl", hash = "sha256:dd3eafaaeec1c7f2f8fdcd5f964e8907ad788fe8a5a32c4426fbbdda621223b7", size = 448582, upload-time = "2026-03-10T21:30:57.142Z" }, + { url = "https://files.pythonhosted.org/packages/2c/23/f6c6112a04d28eed765e374435fb1a9198f73e1ec4b4024184f21faeb1ad/tornado-6.5.5-cp39-abi3-win_amd64.whl", hash = "sha256:6443a794ba961a9f619b1ae926a2e900ac20c34483eea67be4ed8f1e58d3ef7b", size = 448990, upload-time = "2026-03-10T21:30:58.857Z" }, + { url = "https://files.pythonhosted.org/packages/b7/c8/876602cbc96469911f0939f703453c1157b0c826ecb05bdd32e023397d4e/tornado-6.5.5-cp39-abi3-win_arm64.whl", hash = "sha256:2c9a876e094109333f888539ddb2de4361743e5d21eece20688e3e351e4990a6", size = 448016, upload-time = "2026-03-10T21:31:00.43Z" }, +] + +[[package]] +name = "traitlets" +version = "5.14.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/eb/79/72064e6a701c2183016abbbfedaba506d81e30e232a68c9f0d6f6fcd1574/traitlets-5.14.3.tar.gz", hash = "sha256:9ed0579d3502c94b4b3732ac120375cda96f923114522847de4b3bb98b96b6b7", size = 161621, upload-time = "2024-04-19T11:11:49.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/c0/8f5d070730d7836adc9c9b6408dec68c6ced86b304a9b26a14df072a6e8c/traitlets-5.14.3-py3-none-any.whl", hash = "sha256:b74e89e397b1ed28cc831db7aea759ba6640cb3de13090ca145426688ff1ac4f", size = 85359, upload-time = "2024-04-19T11:11:46.763Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/94/1a15dd82efb362ac84269196e94cf00f187f7ed21c242792a923cdb1c61f/typing_extensions-4.15.0.tar.gz", hash = "sha256:0cea48d173cc12fa28ecabc3b837ea3cf6f38c6d1136f85cbaaf598984861466", size = 109391, upload-time = "2025-08-25T13:49:26.313Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/67/36e9267722cc04a6b9f15c7f3441c2363321a3ea07da7ae0c0707beb2a9c/typing_extensions-4.15.0-py3-none-any.whl", hash = "sha256:f0fa19c6845758ab08074a0cfa8b7aecb71c999ca73d62883bc25cc018c4e548", size = 44614, upload-time = "2025-08-25T13:49:24.86Z" }, +] + +[[package]] +name = "urllib3" +version = "2.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c7/24/5f1b3bdffd70275f6661c76461e25f024d5a38a46f04aaca912426a2b1d3/urllib3-2.6.3.tar.gz", hash = "sha256:1b62b6884944a57dbe321509ab94fd4d3b307075e0c2eae991ac71ee15ad38ed", size = 435556, upload-time = "2026-01-07T16:24:43.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/08/aaaad47bc4e9dc8c725e68f9d04865dbcb2052843ff09c97b08904852d84/urllib3-2.6.3-py3-none-any.whl", hash = "sha256:bf272323e553dfb2e87d9bfd225ca7b0f467b919d7bbd355436d3fd37cb0acd4", size = 131584, upload-time = "2026-01-07T16:24:42.685Z" }, +] + +[[package]] +name = "watchdog" +version = "6.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/db/7d/7f3d619e951c88ed75c6037b246ddcf2d322812ee8ea189be89511721d54/watchdog-6.0.0.tar.gz", hash = "sha256:9ddf7c82fda3ae8e24decda1338ede66e1c99883db93711d8fb941eaa2d8c282", size = 131220, upload-time = "2024-11-01T14:07:13.037Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/39/ea/3930d07dafc9e286ed356a679aa02d777c06e9bfd1164fa7c19c288a5483/watchdog-6.0.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:bdd4e6f14b8b18c334febb9c4425a878a2ac20efd1e0b231978e7b150f92a948", size = 96471, upload-time = "2024-11-01T14:06:37.745Z" }, + { url = "https://files.pythonhosted.org/packages/12/87/48361531f70b1f87928b045df868a9fd4e253d9ae087fa4cf3f7113be363/watchdog-6.0.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c7c15dda13c4eb00d6fb6fc508b3c0ed88b9d5d374056b239c4ad1611125c860", size = 88449, upload-time = "2024-11-01T14:06:39.748Z" }, + { url = "https://files.pythonhosted.org/packages/5b/7e/8f322f5e600812e6f9a31b75d242631068ca8f4ef0582dd3ae6e72daecc8/watchdog-6.0.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6f10cb2d5902447c7d0da897e2c6768bca89174d0c6e1e30abec5421af97a5b0", size = 89054, upload-time = "2024-11-01T14:06:41.009Z" }, + { url = "https://files.pythonhosted.org/packages/68/98/b0345cabdce2041a01293ba483333582891a3bd5769b08eceb0d406056ef/watchdog-6.0.0-cp313-cp313-macosx_10_13_universal2.whl", hash = "sha256:490ab2ef84f11129844c23fb14ecf30ef3d8a6abafd3754a6f75ca1e6654136c", size = 96480, upload-time = "2024-11-01T14:06:42.952Z" }, + { url = "https://files.pythonhosted.org/packages/85/83/cdf13902c626b28eedef7ec4f10745c52aad8a8fe7eb04ed7b1f111ca20e/watchdog-6.0.0-cp313-cp313-macosx_10_13_x86_64.whl", hash = "sha256:76aae96b00ae814b181bb25b1b98076d5fc84e8a53cd8885a318b42b6d3a5134", size = 88451, upload-time = "2024-11-01T14:06:45.084Z" }, + { url = "https://files.pythonhosted.org/packages/fe/c4/225c87bae08c8b9ec99030cd48ae9c4eca050a59bf5c2255853e18c87b50/watchdog-6.0.0-cp313-cp313-macosx_11_0_arm64.whl", hash = "sha256:a175f755fc2279e0b7312c0035d52e27211a5bc39719dd529625b1930917345b", size = 89057, upload-time = "2024-11-01T14:06:47.324Z" }, + { url = "https://files.pythonhosted.org/packages/a9/c7/ca4bf3e518cb57a686b2feb4f55a1892fd9a3dd13f470fca14e00f80ea36/watchdog-6.0.0-py3-none-manylinux2014_aarch64.whl", hash = "sha256:7607498efa04a3542ae3e05e64da8202e58159aa1fa4acddf7678d34a35d4f13", size = 79079, upload-time = "2024-11-01T14:06:59.472Z" }, + { url = "https://files.pythonhosted.org/packages/5c/51/d46dc9332f9a647593c947b4b88e2381c8dfc0942d15b8edc0310fa4abb1/watchdog-6.0.0-py3-none-manylinux2014_armv7l.whl", hash = "sha256:9041567ee8953024c83343288ccc458fd0a2d811d6a0fd68c4c22609e3490379", size = 79078, upload-time = "2024-11-01T14:07:01.431Z" }, + { url = "https://files.pythonhosted.org/packages/d4/57/04edbf5e169cd318d5f07b4766fee38e825d64b6913ca157ca32d1a42267/watchdog-6.0.0-py3-none-manylinux2014_i686.whl", hash = "sha256:82dc3e3143c7e38ec49d61af98d6558288c415eac98486a5c581726e0737c00e", size = 79076, upload-time = "2024-11-01T14:07:02.568Z" }, + { url = "https://files.pythonhosted.org/packages/ab/cc/da8422b300e13cb187d2203f20b9253e91058aaf7db65b74142013478e66/watchdog-6.0.0-py3-none-manylinux2014_ppc64.whl", hash = "sha256:212ac9b8bf1161dc91bd09c048048a95ca3a4c4f5e5d4a7d1b1a7d5752a7f96f", size = 79077, upload-time = "2024-11-01T14:07:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/2c/3b/b8964e04ae1a025c44ba8e4291f86e97fac443bca31de8bd98d3263d2fcf/watchdog-6.0.0-py3-none-manylinux2014_ppc64le.whl", hash = "sha256:e3df4cbb9a450c6d49318f6d14f4bbc80d763fa587ba46ec86f99f9e6876bb26", size = 79078, upload-time = "2024-11-01T14:07:05.189Z" }, + { url = "https://files.pythonhosted.org/packages/62/ae/a696eb424bedff7407801c257d4b1afda455fe40821a2be430e173660e81/watchdog-6.0.0-py3-none-manylinux2014_s390x.whl", hash = "sha256:2cce7cfc2008eb51feb6aab51251fd79b85d9894e98ba847408f662b3395ca3c", size = 79077, upload-time = "2024-11-01T14:07:06.376Z" }, + { url = "https://files.pythonhosted.org/packages/b5/e8/dbf020b4d98251a9860752a094d09a65e1b436ad181faf929983f697048f/watchdog-6.0.0-py3-none-manylinux2014_x86_64.whl", hash = "sha256:20ffe5b202af80ab4266dcd3e91aae72bf2da48c0d33bdb15c66658e685e94e2", size = 79078, upload-time = "2024-11-01T14:07:07.547Z" }, + { url = "https://files.pythonhosted.org/packages/07/f6/d0e5b343768e8bcb4cda79f0f2f55051bf26177ecd5651f84c07567461cf/watchdog-6.0.0-py3-none-win32.whl", hash = "sha256:07df1fdd701c5d4c8e55ef6cf55b8f0120fe1aef7ef39a1c6fc6bc2e606d517a", size = 79065, upload-time = "2024-11-01T14:07:09.525Z" }, + { url = "https://files.pythonhosted.org/packages/db/d9/c495884c6e548fce18a8f40568ff120bc3a4b7b99813081c8ac0c936fa64/watchdog-6.0.0-py3-none-win_amd64.whl", hash = "sha256:cbafb470cf848d93b5d013e2ecb245d4aa1c8fd0504e863ccefa32445359d680", size = 79070, upload-time = "2024-11-01T14:07:10.686Z" }, + { url = "https://files.pythonhosted.org/packages/33/e8/e40370e6d74ddba47f002a32919d91310d6074130fe4e17dabcafc15cbf1/watchdog-6.0.0-py3-none-win_ia64.whl", hash = "sha256:a1914259fa9e1454315171103c6a30961236f508b9b623eae470268bbcc6a22f", size = 79067, upload-time = "2024-11-01T14:07:11.845Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/35/a2/8e3becb46433538a38726c948d3399905a4c7cabd0df578ede5dc51f0ec2/wcwidth-0.6.0.tar.gz", hash = "sha256:cdc4e4262d6ef9a1a57e018384cbeb1208d8abbc64176027e2c2455c81313159", size = 159684, upload-time = "2026-02-06T19:19:40.919Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/68/5a/199c59e0a824a3db2b89c5d2dade7ab5f9624dbf6448dc291b46d5ec94d3/wcwidth-0.6.0-py3-none-any.whl", hash = "sha256:1a3a1e510b553315f8e146c54764f4fb6264ffad731b3d78088cdb1478ffbdad", size = 94189, upload-time = "2026-02-06T19:19:39.646Z" }, +] + +[[package]] +name = "zarr" +version = "3.1.7.dev44+g821704644" +source = { git = "https://github.com/zarr-developers/zarr-python.git?rev=main#82170464470197bcd816993aa059ee00dafee214" } +dependencies = [ + { name = "donfig" }, + { name = "google-crc32c" }, + { name = "numcodecs" }, + { name = "numpy" }, + { name = "packaging" }, + { name = "typing-extensions" }, +] + +[[package]] +name = "zarr-datafusion-search" +version = "0.1.0" +source = { virtual = "." } +dependencies = [ + { name = "icechunk" }, + { name = "numpy" }, + { name = "shapely" }, + { name = "zarr" }, +] + +[package.dev-dependencies] +dev = [ + { name = "ipykernel" }, +] +docs = [ + { name = "mkdocs-material" }, +] + +[package.metadata] +requires-dist = [ + { name = "icechunk", specifier = ">=1.1.20" }, + { name = "numpy", specifier = ">=2.3.2" }, + { name = "shapely", specifier = ">=2.1.1" }, + { name = "zarr", git = "https://github.com/zarr-developers/zarr-python.git?rev=main" }, +] + +[package.metadata.requires-dev] +dev = [{ name = "ipykernel", specifier = ">=6.30.1" }] +docs = [{ name = "mkdocs-material", specifier = ">=9.5" }] From 86221c6160a0b62e6b71d765f73d23a4fe802893 Mon Sep 17 00:00:00 2001 From: sharkinsspatial Date: Fri, 24 Apr 2026 12:09:59 -0400 Subject: [PATCH 2/5] Remove composite chunk scanning diagram. --- docs/composite-chunk-scanning.excalidraw | 443 ----------------------- 1 file changed, 443 deletions(-) delete mode 100644 docs/composite-chunk-scanning.excalidraw diff --git a/docs/composite-chunk-scanning.excalidraw b/docs/composite-chunk-scanning.excalidraw deleted file mode 100644 index 1d74aeb..0000000 --- a/docs/composite-chunk-scanning.excalidraw +++ /dev/null @@ -1,443 +0,0 @@ -{ - "type": "excalidraw", - "version": 2, - "source": "https://excalidraw.com", - "elements": [ - { - "id": "title", - "type": "text", - "x": 150, "y": 8, "width": 600, "height": 28, - "angle": 0, - "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1001, "version": 3, "versionNonce": 1001, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "Composite Chunk Scanning", - "fontSize": 22, "fontFamily": 2, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "Composite Chunk Scanning", - "lineHeight": 1.25 - }, - { - "id": "rtree-box", - "type": "rectangle", - "x": 30, "y": 42, "width": 155, "height": 88, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "#fff0f6", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1004, "version": 3, "versionNonce": 1004, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "rtree-text", - "type": "text", - "x": 36, "y": 51, "width": 143, "height": 66, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1005, "version": 3, "versionNonce": 1005, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "R-tree\nSpatial Index\n\u2192 rows [1, 3]", - "fontSize": 13, "fontFamily": 2, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "R-tree\nSpatial Index\n\u2192 rows [1, 3]", - "lineHeight": 1.5 - }, - { - "id": "sql-box", - "type": "rectangle", - "x": 200, "y": 42, "width": 510, "height": 88, - "angle": 0, - "strokeColor": "#1971c2", "backgroundColor": "#e7f5ff", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1002, "version": 3, "versionNonce": 1002, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "sql-text", - "type": "text", - "x": 214, "y": 55, "width": 482, "height": 62, - "angle": 0, - "strokeColor": "#1971c2", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1003, "version": 3, "versionNonce": 1003, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "SELECT date, collection\nFROM zarr_data\nWHERE ST_Intersects(bbox, POLYGON(0 -7, 0 7, 5 7, 5 -7, 0 -7))", - "fontSize": 13, "fontFamily": 3, - "textAlign": "left", "verticalAlign": "top", - "containerId": null, "originalText": "SELECT date, collection\nFROM zarr_data\nWHERE ST_Intersects(bbox, POLYGON(0 -7, 0 7, 5 7, 5 -7, 0 -7))", - "lineHeight": 1.5 - }, - { - "id": "sql-rtree-arrow", - "type": "arrow", - "x": 200, "y": 86, "width": 15, "height": 0, - "angle": 0, - "strokeColor": "#1e1e1e", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 2}, - "seed": 1006, "version": 3, "versionNonce": 1006, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "points": [[0, 0], [-15, 0]], - "lastCommittedPoint": null, "startBinding": null, "endBinding": null, - "startArrowhead": null, "endArrowhead": "arrow" - }, - { - "id": "rtree-grid-arrow", - "type": "arrow", - "x": 107, "y": 131, "width": 0, "height": 170, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "dashed", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 2}, - "seed": 1007, "version": 3, "versionNonce": 1007, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "points": [[0, 0], [0, 170]], - "lastCommittedPoint": null, "startBinding": null, "endBinding": null, - "startArrowhead": null, "endArrowhead": "arrow" - }, - { - "id": "rtree-grid-label", - "type": "text", - "x": 113, "y": 178, "width": 80, "height": 28, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1008, "version": 3, "versionNonce": 1008, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "selects\nrows", - "fontSize": 11, "fontFamily": 2, - "textAlign": "left", "verticalAlign": "top", - "containerId": null, "originalText": "selects\nrows", - "lineHeight": 1.25 - }, - { - "id": "lbl-date-box", - "type": "rectangle", - "x": 195, "y": 228, "width": 140, "height": 534, - "angle": 0, - "strokeColor": "#2f9e44", "backgroundColor": "#f4fef6", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1020, "version": 3, "versionNonce": 1020, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "lbl-date-text", - "type": "text", - "x": 195, "y": 248, "width": 140, "height": 20, - "angle": 0, - "strokeColor": "#2f9e44", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1021, "version": 3, "versionNonce": 1021, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "date[ ]", - "fontSize": 14, "fontFamily": 3, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "date[ ]", - "lineHeight": 1.25 - }, - { - "id": "lbl-coll-box", - "type": "rectangle", - "x": 345, "y": 228, "width": 140, "height": 534, - "angle": 0, - "strokeColor": "#2f9e44", "backgroundColor": "#f4fef6", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1022, "version": 3, "versionNonce": 1022, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "lbl-coll-text", - "type": "text", - "x": 345, "y": 248, "width": 140, "height": 20, - "angle": 0, - "strokeColor": "#2f9e44", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1023, "version": 3, "versionNonce": 1023, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "collection[ ]", - "fontSize": 14, "fontFamily": 3, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "collection[ ]", - "lineHeight": 1.25 - }, - { - "id": "lbl-bbox-box", - "type": "rectangle", - "x": 495, "y": 228, "width": 140, "height": 534, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "#fff8fa", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1024, "version": 3, "versionNonce": 1024, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "lbl-bbox-text", - "type": "text", - "x": 495, "y": 248, "width": 140, "height": 20, - "angle": 0, - "strokeColor": "#c2255c", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 1025, "version": 3, "versionNonce": 1025, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "bbox[ ]", - "fontSize": 14, "fontFamily": 3, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "bbox[ ]", - "lineHeight": 1.25 - }, - { "id": "hdr-0", "type": "text", "x": 30, "y": 319, "width": 155, "height": 16, "angle": 0, "strokeColor": "#495057", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 1011, "version": 3, "versionNonce": 1011, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "Chunk 0", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "Chunk 0", "lineHeight": 1.25 }, - { "id": "hdr-1", "type": "text", "x": 30, "y": 445, "width": 155, "height": 16, "angle": 0, "strokeColor": "#e67700", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 1012, "version": 3, "versionNonce": 1012, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "Chunk 1", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "Chunk 1", "lineHeight": 1.25 }, - { "id": "hdr-2", "type": "text", "x": 30, "y": 559, "width": 155, "height": 16, "angle": 0, "strokeColor": "#495057", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 1013, "version": 3, "versionNonce": 1013, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "Chunk 2", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "Chunk 2", "lineHeight": 1.25 }, - { "id": "hdr-3", "type": "text", "x": 30, "y": 634, "width": 155, "height": 16, "angle": 0, "strokeColor": "#e67700", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 1014, "version": 3, "versionNonce": 1014, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "Chunk 3", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "Chunk 3", "lineHeight": 1.25 }, - { "id": "hdr-4", "type": "text", "x": 30, "y": 709, "width": 155, "height": 16, "angle": 0, "strokeColor": "#495057", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 1015, "version": 3, "versionNonce": 1015, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "Chunk 4", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "Chunk 4", "lineHeight": 1.25 }, - { - "id": "composite-col1", - "type": "rectangle", - "x": 187, "y": 362, "width": 456, "height": 171, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "#fff3bf", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "dashed", - "roughness": 0, "opacity": 60, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1009, "version": 3, "versionNonce": 1009, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "composite-col3", - "type": "rectangle", - "x": 187, "y": 602, "width": 456, "height": 81, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "#fff3bf", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "dashed", - "roughness": 0, "opacity": 60, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 1010, "version": 3, "versionNonce": 1010, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { "id": "d0", "type": "rectangle", "x": 200, "y": 295, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2001, "version": 3, "versionNonce": 2001, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "d1", "type": "rectangle", "x": 200, "y": 370, "width": 130, "height": 155, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#dff6e3", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2002, "version": 3, "versionNonce": 2002, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "d2", "type": "rectangle", "x": 200, "y": 535, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2003, "version": 3, "versionNonce": 2003, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "d3", "type": "rectangle", "x": 200, "y": 610, "width": 130, "height": 65, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#ebfbee", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2004, "version": 3, "versionNonce": 2004, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "d4", "type": "rectangle", "x": 200, "y": 685, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2005, "version": 3, "versionNonce": 2005, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "c0", "type": "rectangle", "x": 350, "y": 295, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2011, "version": 3, "versionNonce": 2011, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "c1", "type": "rectangle", "x": 350, "y": 370, "width": 130, "height": 155, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#dff6e3", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2012, "version": 3, "versionNonce": 2012, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "c2", "type": "rectangle", "x": 350, "y": 535, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2013, "version": 3, "versionNonce": 2013, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "c3", "type": "rectangle", "x": 350, "y": 610, "width": 130, "height": 65, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#ebfbee", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2014, "version": 3, "versionNonce": 2014, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "c4", "type": "rectangle", "x": 350, "y": 685, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2015, "version": 3, "versionNonce": 2015, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "b0", "type": "rectangle", "x": 500, "y": 295, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2021, "version": 3, "versionNonce": 2021, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "b1", "type": "rectangle", "x": 500, "y": 370, "width": 130, "height": 155, "angle": 0, "strokeColor": "#c2255c", "backgroundColor": "#ffe8f0", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2022, "version": 3, "versionNonce": 2022, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "b2", "type": "rectangle", "x": 500, "y": 535, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2023, "version": 3, "versionNonce": 2023, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "b3", "type": "rectangle", "x": 500, "y": 610, "width": 130, "height": 65, "angle": 0, "strokeColor": "#c2255c", "backgroundColor": "#fff0f6", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2024, "version": 3, "versionNonce": 2024, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "b4", "type": "rectangle", "x": 500, "y": 685, "width": 130, "height": 65, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 2025, "version": 3, "versionNonce": 2025, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "td0", "type": "text", "x": 200, "y": 319, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3001, "version": 3, "versionNonce": 3001, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "td2", "type": "text", "x": 200, "y": 559, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3003, "version": 3, "versionNonce": 3003, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "td3", "type": "text", "x": 200, "y": 634, "width": 130, "height": 16, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3004, "version": 3, "versionNonce": 3004, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "read", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "read", "lineHeight": 1.25 }, - { "id": "td4", "type": "text", "x": 200, "y": 709, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3005, "version": 3, "versionNonce": 3005, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tc0", "type": "text", "x": 350, "y": 319, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3011, "version": 3, "versionNonce": 3011, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tc2", "type": "text", "x": 350, "y": 559, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3013, "version": 3, "versionNonce": 3013, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tc3", "type": "text", "x": 350, "y": 634, "width": 130, "height": 16, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3014, "version": 3, "versionNonce": 3014, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "read", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "read", "lineHeight": 1.25 }, - { "id": "tc4", "type": "text", "x": 350, "y": 709, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3015, "version": 3, "versionNonce": 3015, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tb0", "type": "text", "x": 500, "y": 319, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3021, "version": 3, "versionNonce": 3021, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tb2", "type": "text", "x": 500, "y": 559, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3023, "version": 3, "versionNonce": 3023, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "tb3", "type": "text", "x": 500, "y": 634, "width": 130, "height": 16, "angle": 0, "strokeColor": "#c2255c", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3024, "version": 3, "versionNonce": 3024, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "predicate", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "predicate", "lineHeight": 1.25 }, - { "id": "tb4", "type": "text", "x": 500, "y": 709, "width": 130, "height": 16, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 3025, "version": 3, "versionNonce": 3025, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "skip", "fontSize": 12, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "skip", "lineHeight": 1.25 }, - { "id": "mini_d0", "type": "rectangle", "x": 205, "y": 375, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4001, "version": 3, "versionNonce": 4001, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_d1", "type": "rectangle", "x": 205, "y": 405, "width": 120, "height": 27, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4002, "version": 3, "versionNonce": 4002, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_d2", "type": "rectangle", "x": 205, "y": 435, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4003, "version": 3, "versionNonce": 4003, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_d3", "type": "rectangle", "x": 205, "y": 465, "width": 120, "height": 27, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4004, "version": 3, "versionNonce": 4004, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_d4", "type": "rectangle", "x": 205, "y": 495, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4005, "version": 3, "versionNonce": 4005, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_c0", "type": "rectangle", "x": 355, "y": 375, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4011, "version": 3, "versionNonce": 4011, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_c1", "type": "rectangle", "x": 355, "y": 405, "width": 120, "height": 27, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4012, "version": 3, "versionNonce": 4012, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_c2", "type": "rectangle", "x": 355, "y": 435, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4013, "version": 3, "versionNonce": 4013, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_c3", "type": "rectangle", "x": 355, "y": 465, "width": 120, "height": 27, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "#b2f2bb", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4014, "version": 3, "versionNonce": 4014, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_c4", "type": "rectangle", "x": 355, "y": 495, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4015, "version": 3, "versionNonce": 4015, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_b0", "type": "rectangle", "x": 505, "y": 375, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4021, "version": 3, "versionNonce": 4021, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_b1", "type": "rectangle", "x": 505, "y": 405, "width": 120, "height": 27, "angle": 0, "strokeColor": "#c2255c", "backgroundColor": "#faa2c1", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4022, "version": 3, "versionNonce": 4022, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_b2", "type": "rectangle", "x": 505, "y": 435, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4023, "version": 3, "versionNonce": 4023, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_b3", "type": "rectangle", "x": 505, "y": 465, "width": 120, "height": 27, "angle": 0, "strokeColor": "#c2255c", "backgroundColor": "#faa2c1", "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4024, "version": 3, "versionNonce": 4024, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_b4", "type": "rectangle", "x": 505, "y": 495, "width": 120, "height": 27, "angle": 0, "strokeColor": "#adb5bd", "backgroundColor": "#f1f3f5", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": {"type": 3}, "seed": 4025, "version": 3, "versionNonce": 4025, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false }, - { "id": "mini_td0", "type": "text", "x": 205, "y": 381, "width": 120, "height": 13, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 5001, "version": 3, "versionNonce": 5001, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "row 0", "fontSize": 10, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "row 0", "lineHeight": 1.25 }, - { "id": "mini_td1", "type": "text", "x": 205, "y": 411, "width": 120, "height": 13, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 5002, "version": 3, "versionNonce": 5002, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "row 1 \u2713", "fontSize": 10, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "row 1 \u2713", "lineHeight": 1.25 }, - { "id": "mini_td2", "type": "text", "x": 205, "y": 441, "width": 120, "height": 13, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 5003, "version": 3, "versionNonce": 5003, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "row 2", "fontSize": 10, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "row 2", "lineHeight": 1.25 }, - { "id": "mini_td3", "type": "text", "x": 205, "y": 471, "width": 120, "height": 13, "angle": 0, "strokeColor": "#2f9e44", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 5004, "version": 3, "versionNonce": 5004, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "row 3 \u2713", "fontSize": 10, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "row 3 \u2713", "lineHeight": 1.25 }, - { "id": "mini_td4", "type": "text", "x": 205, "y": 501, "width": 120, "height": 13, "angle": 0, "strokeColor": "#868e96", "backgroundColor": "transparent", "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", "roughness": 0, "opacity": 100, "groupIds": [], "frameId": null, "roundness": null, "seed": 5005, "version": 3, "versionNonce": 5005, "isDeleted": false, "boundElements": null, "updated": 1745200000000, "link": null, "locked": false, "text": "row 4", "fontSize": 10, "fontFamily": 2, "textAlign": "center", "verticalAlign": "top", "containerId": null, "originalText": "row 4", "lineHeight": 1.25 }, - { - "id": "comp-label-1", - "type": "text", - "x": 653, "y": 435, "width": 130, "height": 32, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 6001, "version": 3, "versionNonce": 6001, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "Composite\nChunk 1", - "fontSize": 12, "fontFamily": 2, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "Composite\nChunk 1", - "lineHeight": 1.25 - }, - { - "id": "comp-label-3", - "type": "text", - "x": 653, "y": 630, "width": 130, "height": 32, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 6002, "version": 3, "versionNonce": 6002, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "Composite\nChunk 3", - "fontSize": 12, "fontFamily": 2, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "Composite\nChunk 3", - "lineHeight": 1.25 - }, - { - "id": "result-box", - "type": "rectangle", - "x": 640, "y": 720, "width": 160, "height": 55, - "angle": 0, - "strokeColor": "#1971c2", "backgroundColor": "#e7f5ff", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 7001, "version": 3, "versionNonce": 7001, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "result-text", - "type": "text", - "x": 640, "y": 732, "width": 160, "height": 34, - "angle": 0, - "strokeColor": "#1971c2", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 7002, "version": 3, "versionNonce": 7002, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "RecordBatch\n(matching rows)", - "fontSize": 13, "fontFamily": 2, - "textAlign": "center", "verticalAlign": "top", - "containerId": null, "originalText": "RecordBatch\n(matching rows)", - "lineHeight": 1.25 - }, - { - "id": "arr-col1-result", - "type": "arrow", - "x": 718, "y": 469, "width": 0, "height": 249, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 2}, - "seed": 7003, "version": 3, "versionNonce": 7003, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "points": [[0, 0], [0, 249]], - "lastCommittedPoint": null, "startBinding": null, "endBinding": null, - "startArrowhead": null, "endArrowhead": "arrow" - }, - { - "id": "arr-col3-result", - "type": "arrow", - "x": 718, "y": 664, "width": 0, "height": 54, - "angle": 0, - "strokeColor": "#e67700", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 2, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 2}, - "seed": 7004, "version": 3, "versionNonce": 7004, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "points": [[0, 0], [0, 54]], - "lastCommittedPoint": null, "startBinding": null, "endBinding": null, - "startArrowhead": null, "endArrowhead": "arrow" - }, - { - "id": "legend-box", - "type": "rectangle", - "x": 30, "y": 780, "width": 255, "height": 95, - "angle": 0, - "strokeColor": "#868e96", "backgroundColor": "#f8f9fa", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": {"type": 3}, - "seed": 8001, "version": 3, "versionNonce": 8001, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false - }, - { - "id": "legend-text", - "type": "text", - "x": 42, "y": 790, "width": 231, "height": 72, - "angle": 0, - "strokeColor": "#495057", "backgroundColor": "transparent", - "fillStyle": "solid", "strokeWidth": 1, "strokeStyle": "solid", - "roughness": 0, "opacity": 100, - "groupIds": [], "frameId": null, "roundness": null, - "seed": 8002, "version": 3, "versionNonce": 8002, - "isDeleted": false, "boundElements": null, - "updated": 1745200000000, "link": null, "locked": false, - "text": "Gray = skipped (no match)\nGreen = projected column read\nPink = predicate evaluation\nAmber = composite chunk group", - "fontSize": 11, "fontFamily": 2, - "textAlign": "left", "verticalAlign": "top", - "containerId": null, "originalText": "Gray = skipped (no match)\nGreen = projected column read\nPink = predicate evaluation\nAmber = composite chunk group", - "lineHeight": 1.4 - } - ], - "appState": { - "gridSize": null, - "viewBackgroundColor": "#ffffff" - }, - "files": {} -} From ff6579fb74ade31030bcd0593f2194326b2ace41 Mon Sep 17 00:00:00 2001 From: sharkinsspatial Date: Fri, 24 Apr 2026 12:14:24 -0400 Subject: [PATCH 3/5] Remove superpowers docs recommendations. --- .gitignore | 3 + docs/architecture/spatial-indexing.md | 4 - .../plans/2026-04-20-mkdocs-site.md | 493 ------------------ .../specs/2026-04-20-mkdocs-design.md | 108 ---- 4 files changed, 3 insertions(+), 605 deletions(-) delete mode 100644 docs/architecture/spatial-indexing.md delete mode 100644 docs/superpowers/plans/2026-04-20-mkdocs-site.md delete mode 100644 docs/superpowers/specs/2026-04-20-mkdocs-design.md diff --git a/.gitignore b/.gitignore index 8fc3eb5..cabd295 100644 --- a/.gitignore +++ b/.gitignore @@ -156,6 +156,9 @@ venv.bak/ # mkdocs documentation /site +# Superpowers AI planning docs +docs/superpowers/ + # mypy .mypy_cache/ .dmypy.json diff --git a/docs/architecture/spatial-indexing.md b/docs/architecture/spatial-indexing.md deleted file mode 100644 index 0735c04..0000000 --- a/docs/architecture/spatial-indexing.md +++ /dev/null @@ -1,4 +0,0 @@ -# Spatial Indexing - -!!! note "Coming soon" - This page is under construction. diff --git a/docs/superpowers/plans/2026-04-20-mkdocs-site.md b/docs/superpowers/plans/2026-04-20-mkdocs-site.md deleted file mode 100644 index cdf2b35..0000000 --- a/docs/superpowers/plans/2026-04-20-mkdocs-site.md +++ /dev/null @@ -1,493 +0,0 @@ -# MkDocs Documentation Site Implementation Plan - -> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. - -**Goal:** Set up a MkDocs Material documentation site for zarr-datafusion-search, deployable to GitHub Pages at `https://developmentseed.github.io/zarr-datafusion-search`. - -**Architecture:** Root-level `mkdocs.yml` + `docs/` directory. Stub pages with `!!! note "Coming soon"` admonitions for all sections except `index.md` (populated from README) and `DEVELOP.md` (copied from root). A single GitHub Actions workflow deploys on push to `main` using `mkdocs gh-deploy`. - -**Tech Stack:** MkDocs, mkdocs-material, uv (dependency management), GitHub Actions - ---- - -## File Map - -| Action | Path | Purpose | -|--------|------|---------| -| Create | `mkdocs.yml` | Site configuration | -| Modify | `pyproject.toml` | Add `docs` dependency group | -| Create | `docs/index.md` | Landing page (from README content) | -| Create | `docs/DEVELOP.md` | Copy of root `DEVELOP.md` | -| Create | `docs/user-guide/installation.md` | Stub | -| Create | `docs/user-guide/quickstart.md` | Stub | -| Create | `docs/user-guide/schema.md` | Stub | -| Create | `docs/user-guide/spatial-queries.md` | Stub | -| Create | `docs/examples/local.md` | Stub | -| Create | `docs/examples/s3-icechunk.md` | Stub | -| Create | `docs/api/zarr-table.md` | Hand-written API reference | -| Create | `docs/architecture/spatial-indexing.md` | Stub | -| Create | `docs/architecture/query-pipeline.md` | Stub | -| Create | `.github/workflows/docs.yml` | CI deploy workflow | - ---- - -### Task 1: Add docs dependencies to pyproject.toml - -**Files:** -- Modify: `pyproject.toml` - -The root `pyproject.toml` already has a `[dependency-groups]` section with `dev`. Add a `docs` group. - -- [ ] **Step 1: Add the docs dependency group** - -Open `pyproject.toml` and add the following after the existing `[dependency-groups]` `dev` entry: - -```toml -[dependency-groups] -dev = ["ipykernel>=6.30.1"] -docs = [ - "mkdocs-material>=9.5", -] -``` - -- [ ] **Step 2: Verify uv can resolve the group** - -Run from the repo root: -```bash -uv sync --group docs -``` - -Expected: Dependencies resolve and install without errors. You will see `mkdocs-material` and its transitive deps installed. - ---- - -### Task 2: Create mkdocs.yml - -**Files:** -- Create: `mkdocs.yml` - -- [ ] **Step 1: Create the file** - -Create `mkdocs.yml` at the repo root with the following content: - -```yaml -site_name: zarr-datafusion-search -repo_name: developmentseed/zarr-datafusion-search -repo_url: https://github.com/developmentseed/zarr-datafusion-search -site_description: Query Zarr metadata with DataFusion SQL -site_author: Development Seed -site_url: https://developmentseed.github.io/zarr-datafusion-search/ -docs_dir: docs - -extra: - social: - - icon: "fontawesome/brands/github" - link: "https://github.com/developmentseed" - - icon: "material/web" - link: "https://developmentseed.org/" - -nav: - - index.md - - User Guide: - - user-guide/installation.md - - user-guide/quickstart.md - - user-guide/schema.md - - user-guide/spatial-queries.md - - Examples: - - examples/local.md - - examples/s3-icechunk.md - - API Reference: - - api/zarr-table.md - - Architecture: - - architecture/spatial-indexing.md - - architecture/query-pipeline.md - - Developer Docs: DEVELOP.md - -theme: - name: material - icon: - logo: material/database-search - palette: - - media: "(prefers-color-scheme)" - toggle: - icon: material/brightness-auto - name: Switch to light mode - - media: "(prefers-color-scheme: light)" - scheme: default - primary: teal - accent: teal - toggle: - icon: material/brightness-7 - name: Switch to dark mode - - media: "(prefers-color-scheme: dark)" - scheme: slate - primary: teal - accent: teal - toggle: - icon: material/brightness-4 - name: Switch to system preference - - features: - - content.code.copy - - navigation.indexes - - navigation.instant - - navigation.tracking - - search.suggest - - search.share - -plugins: - - search - -markdown_extensions: - - admonition - - attr_list - - def_list - - footnotes - - pymdownx.details - - pymdownx.superfences - - pymdownx.highlight: - anchor_linenums: true - - pymdownx.inlinehilite - - pymdownx.snippets - - pymdownx.tasklist: - custom_checkbox: true - - toc: - permalink: true -``` - -- [ ] **Step 2: Verify MkDocs can parse the config (before docs/ exists)** - -Run: -```bash -uv run --group docs mkdocs build --strict 2>&1 | head -20 -``` - -Expected: Errors about missing doc files — that's fine, it confirms the YAML parses. If you see a YAML parse error instead, fix the indentation in `mkdocs.yml`. - ---- - -### Task 3: Create docs/index.md - -**Files:** -- Create: `docs/index.md` - -This is the landing page. Populate it from the README content rather than leaving it as a stub. - -- [ ] **Step 1: Create the file** - -```markdown -# zarr-datafusion-search - -A prototype for querying STAC or CMR style _metadata_ about Zarr arrays and groups -using [DataFusion](https://datafusion.apache.org/), an extensible query engine written -in Rust. - -This concept was conceived by the team at [Earthmover](https://www.earthmover.io/) -and is outlined in their whitepaper *Level 2 Data Collections in Zarr / Icechunk*. - -## Quick Start - -```python -from zarr_datafusion_search import ZarrTable -from datafusion import SessionContext - -# Create a new DataFusion session context -ctx = SessionContext() - -# Register a specific Zarr store as a table named "zarr_data" -ctx.register_table_provider("zarr_data", ZarrTable("zarr_store.zarr")) - -# Run SQL queries against the Zarr data -df = ctx.sql("SELECT * FROM zarr_data;") -df.show() -``` - -!!! note - The underlying DataFusion TableProvider ABI is not entirely stable. Use the - same version of `datafusion-python` as the version of DataFusion used to - compile this package. - -## Navigation - -- **[User Guide](user-guide/installation.md)** — Installation, quickstart, and - how-to guides -- **[Examples](examples/local.md)** — Full worked examples against local and - S3-backed stores -- **[API Reference](api/zarr-table.md)** — `ZarrTable` class documentation -- **[Architecture](architecture/spatial-indexing.md)** — How the query engine - and spatial indexing work -- **[Developer Docs](DEVELOP.md)** — Contributing and running benchmarks -``` - ---- - -### Task 4: Create docs/DEVELOP.md - -**Files:** -- Create: `docs/DEVELOP.md` - -- [ ] **Step 1: Copy root DEVELOP.md into docs/** - -```markdown -# Contributing - -## Rust - -From the project root, run: - -```bash -cargo test -``` - -A suite of benchmarks are available (though the remote S3 benchmarks use data in a -protected bucket and require credentials). Benchmarks are in separate binaries and -can be run via: - -```bash -cargo bench --bench datetime_local -cargo bench --bench bbox_colunms_local -cargo bench --bench bbox_local -``` - -## Python bindings - -From the `python/` directory, run: - -```bash -uv run --no-project maturin develop --uv -``` - -The `--no-project` flag is necessary to avoid building the Rust code (in release -mode) an extra time before we even reach the `maturin develop` command. - -Prefix all `uv run` commands with `--no-project`. For example: - -```bash -uv run --no-project pytest -``` -``` - ---- - -### Task 5: Create stub pages - -**Files:** -- Create: `docs/user-guide/installation.md` -- Create: `docs/user-guide/quickstart.md` -- Create: `docs/user-guide/schema.md` -- Create: `docs/user-guide/spatial-queries.md` -- Create: `docs/examples/local.md` -- Create: `docs/examples/s3-icechunk.md` -- Create: `docs/architecture/spatial-indexing.md` -- Create: `docs/architecture/query-pipeline.md` - -Each stub has the same structure: a heading and a "coming soon" admonition. - -- [ ] **Step 1: Create docs/user-guide/installation.md** - -```markdown -# Installation - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 2: Create docs/user-guide/quickstart.md** - -```markdown -# Quickstart - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 3: Create docs/user-guide/schema.md** - -```markdown -# Schema Conventions - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 4: Create docs/user-guide/spatial-queries.md** - -```markdown -# Spatial Queries - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 5: Create docs/examples/local.md** - -```markdown -# Local Store Example - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 6: Create docs/examples/s3-icechunk.md** - -```markdown -# S3 + Icechunk Example - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 7: Create docs/architecture/spatial-indexing.md** - -```markdown -# Spatial Indexing - -!!! note "Coming soon" - This page is under construction. -``` - -- [ ] **Step 8: Create docs/architecture/query-pipeline.md** - -```markdown -# Query Pipeline - -!!! note "Coming soon" - This page is under construction. -``` - ---- - -### Task 6: Create docs/api/zarr-table.md - -**Files:** -- Create: `docs/api/zarr-table.md` - -Hand-written reference for `ZarrTable`. The Python package exposes one class: -`ZarrTable`, imported from `zarr_datafusion_search`. - -- [ ] **Step 1: Create the file** - -```markdown -# ZarrTable - -::: zarr_datafusion_search.ZarrTable - -## Overview - -`ZarrTable` is a DataFusion custom table provider that exposes a Zarr metadata -store as a SQL-queryable table. - -## Import - -```python -from zarr_datafusion_search import ZarrTable -``` - -## Constructor - -```python -ZarrTable(path: str) -``` - -| Parameter | Type | Description | -|-----------|------|-------------| -| `path` | `str` | Path to the root of the Zarr store (local filesystem or object store URI) | - -## Usage - -Pass a `ZarrTable` instance to DataFusion's `register_table_provider`: - -```python -from zarr_datafusion_search import ZarrTable -from datafusion import SessionContext - -ctx = SessionContext() -ctx.register_table_provider("my_table", ZarrTable("/path/to/store.zarr")) - -df = ctx.sql("SELECT date, collection FROM my_table LIMIT 10") -df.show() -``` - -!!! note - `ZarrTable` must be compiled against the same version of DataFusion as the - `datafusion` Python package you have installed. Check `python/pyproject.toml` - for the required `datafusion>=` version constraint. -``` - ---- - -### Task 7: Create GitHub Actions deployment workflow - -**Files:** -- Create: `.github/workflows/docs.yml` - -- [ ] **Step 1: Create the workflow file** - -```yaml -name: Deploy docs - -on: - push: - branches: - - main - workflow_dispatch: - -permissions: - contents: write - -jobs: - deploy: - name: Deploy MkDocs to GitHub Pages - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - fetch-depth: 0 - - - uses: astral-sh/setup-uv@v5 - with: - enable-cache: true - - - name: Deploy docs - env: - GIT_COMMITTER_NAME: CI - GIT_COMMITTER_EMAIL: ci-bot@example.com - run: uv run --group docs mkdocs gh-deploy --force -``` - ---- - -### Task 8: Verify the full site builds locally - -No files created. This is a verification step only. - -- [ ] **Step 1: Build the site** - -Run from the repo root: -```bash -uv run --group docs mkdocs build --strict -``` - -Expected output (last few lines): -``` -INFO - Documentation built in X.XX seconds -``` - -No warnings or errors about missing files, broken links, or invalid nav entries. - -- [ ] **Step 2: Serve locally and check the site** - -```bash -uv run --group docs mkdocs serve -``` - -Open `http://127.0.0.1:8000` in a browser. Verify: - -- Dark/light/auto toggle works in the top-right -- All nav sections expand (User Guide, Examples, API Reference, Architecture, Developer Docs) -- Each stub page renders the "Coming soon" admonition -- `index.md` shows the quick start code block with syntax highlighting -- Search bar is present and functional -- GitHub repo link in the top-right points to the correct repo - -Stop the server with `Ctrl+C`. diff --git a/docs/superpowers/specs/2026-04-20-mkdocs-design.md b/docs/superpowers/specs/2026-04-20-mkdocs-design.md deleted file mode 100644 index 038f9ef..0000000 --- a/docs/superpowers/specs/2026-04-20-mkdocs-design.md +++ /dev/null @@ -1,108 +0,0 @@ ---- -name: MkDocs Documentation Site -description: Design spec for the zarr-datafusion-search MkDocs Material docs site -type: project ---- - -# MkDocs Documentation Site Design - -## Overview - -Add a MkDocs Material documentation site to `zarr-datafusion-search`, hosted at -`https://developmentseed.github.io/zarr-datafusion-search`. The site covers both -the Python API and the architecture of the system, following the same pattern used -by obstore and geoarrow-rs from the same ecosystem. - -## File Structure - -``` -zarr-datafusion-search/ - mkdocs.yml - docs/ - index.md - user-guide/ - installation.md - quickstart.md - schema.md - spatial-queries.md - examples/ - local.md - s3-icechunk.md - api/ - zarr-table.md - architecture/ - spatial-indexing.md - query-pipeline.md - DEVELOP.md # copy of root DEVELOP.md - .github/workflows/ - docs.yml # deploy on push to main -``` - -## Navigation - -```yaml -nav: - - index.md - - User Guide: - - user-guide/installation.md - - user-guide/quickstart.md - - user-guide/schema.md - - user-guide/spatial-queries.md - - Examples: - - examples/local.md - - examples/s3-icechunk.md - - API Reference: - - api/zarr-table.md - - Architecture: - - architecture/spatial-indexing.md - - architecture/query-pipeline.md - - Developer Docs: DEVELOP.md -``` - -## MkDocs Configuration - -- **Theme**: Material with dark/light/auto palette toggle -- **Plugins**: `search` only (no `mkdocstrings`, no `mike`) -- **Markdown extensions**: admonition, code highlighting, superfences, toc with - permalink — matching the geoarrow-rs/obstore baseline set -- **Site URL**: `https://developmentseed.github.io/zarr-datafusion-search` -- **Repo**: `developmentseed/zarr-datafusion-search` - -## Placeholder Pages - -All stub pages will contain: -1. A `# Title` heading -2. A `!!! note "Coming soon"` admonition so the site builds cleanly - -The `index.md` will be populated from the existing `README.md` content -(project description + Python usage snippet) rather than left as a stub. - -`docs/DEVELOP.md` will be a copy of the root `DEVELOP.md`. - -## GitHub Actions Deployment - -`.github/workflows/docs.yml`: - -- Trigger: push to `main` -- Runner: `ubuntu-latest` -- Steps: checkout → `astral-sh/setup-uv` → `uv run mkdocs gh-deploy --force` -- The `uv` doc dependencies will be declared in a `[dependency-groups]` `docs` - group in the root `pyproject.toml` - -## Dependencies - -Added to root `pyproject.toml` under `[dependency-groups] docs`: - -``` -mkdocs-material -mkdocs-material[imaging] # for social plugin if added later -``` - -Minimal for now; `mkdocstrings` added when API surface grows. - -## Out of Scope - -- `mike` versioning (add when first stable release is cut) -- `mkdocstrings` auto-generated API reference (add when `ZarrTable` API stabilizes) -- Blog section -- Custom domain From 085995a8ba6f0a01abd3a78947e85c318c0d219b Mon Sep 17 00:00:00 2001 From: sharkinsspatial Date: Fri, 24 Apr 2026 19:55:41 -0400 Subject: [PATCH 4/5] Add mkdocstrings to docs dependencies --- pyproject.toml | 1 + uv.lock | 65 +++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 65 insertions(+), 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index f22e25b..9bba442 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -15,4 +15,5 @@ dependencies = [ dev = ["ipykernel>=6.30.1"] docs = [ "mkdocs-material>=9.5", + "mkdocstrings[python]>=0.29", ] diff --git a/uv.lock b/uv.lock index 48ca478..2cc5ff5 100644 --- a/uv.lock +++ b/uv.lock @@ -298,6 +298,15 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/08/a5/7b059810934a09fb3ccb657e0843813c1fee1183d3bc2c8041800374aa2c/google_crc32c-1.8.0-cp314-cp314-win_amd64.whl", hash = "sha256:d511b3153e7011a27ab6ee6bb3a5404a55b994dc1a7322c0b87b29606d9790e2", size = 34878, upload-time = "2025-12-16T00:35:23.142Z" }, ] +[[package]] +name = "griffelib" +version = "2.0.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9d/82/74f4a3310cdabfbb10da554c3a672847f1ed33c6f61dd472681ce7f1fe67/griffelib-2.0.2.tar.gz", hash = "sha256:3cf20b3bc470e83763ffbf236e0076b1211bac1bc67de13daf494640f2de707e", size = 166461, upload-time = "2026-03-27T11:34:51.091Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/8c/c9138d881c79aa0ea9ed83cbd58d5ca75624378b38cee225dcf5c42cc91f/griffelib-2.0.2-py3-none-any.whl", hash = "sha256:925c857658fb1ba40c0772c37acbc2ab650bd794d9c1b9726922e36ea4117ea1", size = 142357, upload-time = "2026-03-27T11:34:46.275Z" }, +] + [[package]] name = "icechunk" version = "2.0.3" @@ -575,6 +584,20 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/22/5b/dbc6a8cddc9cfa9c4971d59fb12bb8d42e161b7e7f8cc89e49137c5b279c/mkdocs-1.6.1-py3-none-any.whl", hash = "sha256:db91759624d1647f3f34aa0c3f327dd2601beae39a366d6e064c03468d35c20e", size = 3864451, upload-time = "2024-08-30T12:24:05.054Z" }, ] +[[package]] +name = "mkdocs-autorefs" +version = "1.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/52/c0/f641843de3f612a6b48253f39244165acff36657a91cc903633d456ae1ac/mkdocs_autorefs-1.4.4.tar.gz", hash = "sha256:d54a284f27a7346b9c38f1f852177940c222da508e66edc816a0fa55fc6da197", size = 56588, upload-time = "2026-02-10T15:23:55.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/de/a3e710469772c6a89595fc52816da05c1e164b4c866a89e3cb82fb1b67c5/mkdocs_autorefs-1.4.4-py3-none-any.whl", hash = "sha256:834ef5408d827071ad1bc69e0f39704fa34c7fc05bc8e1c72b227dfdc5c76089", size = 25530, upload-time = "2026-02-10T15:23:53.817Z" }, +] + [[package]] name = "mkdocs-get-deps" version = "0.2.2" @@ -620,6 +643,42 @@ wheels = [ { url = "https://files.pythonhosted.org/packages/5b/54/662a4743aa81d9582ee9339d4ffa3c8fd40a4965e033d77b9da9774d3960/mkdocs_material_extensions-1.3.1-py3-none-any.whl", hash = "sha256:adff8b62700b25cb77b53358dad940f3ef973dd6db797907c49e3c2ef3ab4e31", size = 8728, upload-time = "2023-11-22T19:09:43.465Z" }, ] +[[package]] +name = "mkdocstrings" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jinja2" }, + { name = "markdown" }, + { name = "markupsafe" }, + { name = "mkdocs" }, + { name = "mkdocs-autorefs" }, + { name = "pymdown-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/5d/f888d4d3eb31359b327bc9b17a212d6ef03fe0b0682fbb3fc2cb849fb12b/mkdocstrings-1.0.4.tar.gz", hash = "sha256:3969a6515b77db65fd097b53c1b7aa4ae840bd71a2ee62a6a3e89503446d7172", size = 100088, upload-time = "2026-04-15T09:16:53.376Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6e/94/be70f8ee9c45f2f62b39a1f0e9303bc20e138a8f3b8e50ffd89498e177e1/mkdocstrings-1.0.4-py3-none-any.whl", hash = "sha256:63464b4b29053514f32a1dbbf604e52876d5e638111b0c295ab7ed3cac73ca9b", size = 35560, upload-time = "2026-04-15T09:16:51.436Z" }, +] + +[package.optional-dependencies] +python = [ + { name = "mkdocstrings-python" }, +] + +[[package]] +name = "mkdocstrings-python" +version = "2.0.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "griffelib" }, + { name = "mkdocs-autorefs" }, + { name = "mkdocstrings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/33/c225eaf898634bdda489a6766fc35d1683c640bffe0e0acd10646b13536d/mkdocstrings_python-2.0.3.tar.gz", hash = "sha256:c518632751cc869439b31c9d3177678ad2bfa5c21b79b863956ad68fc92c13b8", size = 199083, upload-time = "2026-02-20T10:38:36.368Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/28/79f0f8de97cce916d5ae88a7bee1ad724855e83e6019c0b4d5b3fabc80f3/mkdocstrings_python-2.0.3-py3-none-any.whl", hash = "sha256:0b83513478bdfd803ff05aa43e9b1fca9dd22bcd9471f09ca6257f009bc5ee12", size = 104779, upload-time = "2026-02-20T10:38:34.517Z" }, +] + [[package]] name = "nest-asyncio" version = "1.6.0" @@ -1172,6 +1231,7 @@ dev = [ ] docs = [ { name = "mkdocs-material" }, + { name = "mkdocstrings", extra = ["python"] }, ] [package.metadata] @@ -1184,4 +1244,7 @@ requires-dist = [ [package.metadata.requires-dev] dev = [{ name = "ipykernel", specifier = ">=6.30.1" }] -docs = [{ name = "mkdocs-material", specifier = ">=9.5" }] +docs = [ + { name = "mkdocs-material", specifier = ">=9.5" }, + { name = "mkdocstrings", extras = ["python"], specifier = ">=0.29" }, +] From 2a22c2595b039aaf103506039b892dd42d032205 Mon Sep 17 00:00:00 2001 From: sharkinsspatial Date: Fri, 24 Apr 2026 20:05:27 -0400 Subject: [PATCH 5/5] Use mkdocstrings in place of hand written API docs. --- docs/api/zarr-table.md | 41 +------- mkdocs.yml | 18 ++++ .../python/zarr_datafusion_search/_rust.pyi | 94 +++++++++++++++++++ 3 files changed, 113 insertions(+), 40 deletions(-) create mode 100644 python/python/zarr_datafusion_search/_rust.pyi diff --git a/docs/api/zarr-table.md b/docs/api/zarr-table.md index 4423b4a..a33ad93 100644 --- a/docs/api/zarr-table.md +++ b/docs/api/zarr-table.md @@ -1,42 +1,3 @@ # ZarrTable -## Overview - -`ZarrTable` is a DataFusion custom table provider that exposes a Zarr metadata -store as a SQL-queryable table. - -## Import - -```python -from zarr_datafusion_search import ZarrTable -``` - -## Constructor - -```python -ZarrTable(path: str) -``` - -| Parameter | Type | Description | -|-----------|------|-------------| -| `path` | `str` | Path to the root of the Zarr store (local filesystem or object store URI) | - -## Usage - -Pass a `ZarrTable` instance to DataFusion's `register_table_provider`: - -```python -from zarr_datafusion_search import ZarrTable -from datafusion import SessionContext - -ctx = SessionContext() -ctx.register_table_provider("my_table", ZarrTable("/path/to/store.zarr")) - -df = ctx.sql("SELECT date, collection FROM my_table LIMIT 10") -df.show() -``` - -!!! note - `ZarrTable` must be compiled against the same version of DataFusion as the - `datafusion` Python package you have installed. Check `python/pyproject.toml` - for the required `datafusion>=` version constraint. +::: zarr_datafusion_search.ZarrTable diff --git a/mkdocs.yml b/mkdocs.yml index 13ca298..a0467f2 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -69,8 +69,26 @@ theme: extra_css: - overrides/stylesheets/extra.css +watch: + - python/python + plugins: - search + - mkdocstrings: + handlers: + python: + paths: [python/python] + options: + allow_inspection: false + docstring_style: google + docstring_section_style: list + line_length: 80 + separate_signature: true + show_root_heading: true + show_signature_annotations: true + show_source: false + show_symbol_type_toc: true + signature_crossrefs: true markdown_extensions: - admonition diff --git a/python/python/zarr_datafusion_search/_rust.pyi b/python/python/zarr_datafusion_search/_rust.pyi new file mode 100644 index 0000000..050d463 --- /dev/null +++ b/python/python/zarr_datafusion_search/_rust.pyi @@ -0,0 +1,94 @@ +from __future__ import annotations + +from typing import TYPE_CHECKING, Any + +if TYPE_CHECKING: + from collections.abc import Awaitable + +def ___version() -> str: ... + +class ZarrTable: + """A DataFusion table provider that exposes a Zarr metadata store as a SQL-queryable table. + + `ZarrTable` implements the DataFusion `TableProvider` protocol via the FFI boundary, + so it can be registered directly with a `SessionContext` using + `register_table_provider`. + + Use one of the async class methods to construct an instance: + + - [`from_icechunk`][zarr_datafusion_search.ZarrTable.from_icechunk] — from an Icechunk session + - [`from_obstore`][zarr_datafusion_search.ZarrTable.from_obstore] — from an obstore object store + + Example: + ```python + import asyncio + from datafusion import SessionContext + from zarr_datafusion_search import ZarrTable + + async def main(): + table = await ZarrTable.from_obstore(store, "/meta") + ctx = SessionContext() + ctx.register_table_provider("items", table) + df = ctx.sql("SELECT date, collection FROM items LIMIT 10") + df.show() + + asyncio.run(main()) + ``` + """ + + @classmethod + def from_icechunk( + cls, + session: Any, + group_path: str, + ) -> Awaitable[ZarrTable]: + """Create a ZarrTable from an Icechunk session. + + Args: + session: An open `icechunk.Session` pointing to the store. + group_path: Absolute path to the Zarr group containing the metadata + arrays (e.g. `"/meta"`). + + Returns: + An awaitable that resolves to a `ZarrTable` instance. + + Example: + ```python + table = await ZarrTable.from_icechunk(session, "/meta") + ``` + """ + ... + + @classmethod + def from_obstore( + cls, + store: Any, + group_path: str, + ) -> Awaitable[ZarrTable]: + """Create a ZarrTable from an obstore object store. + + Args: + store: Any obstore-compatible object store (e.g. `obstore.store.S3Store`, + `obstore.store.LocalStore`). + group_path: Absolute path to the Zarr group containing the metadata + arrays (e.g. `"/meta"`). + + Returns: + An awaitable that resolves to a `ZarrTable` instance. + + Example: + ```python + import obstore.store + store = obstore.store.LocalStore("/path/to/data.zarr") + table = await ZarrTable.from_obstore(store, "/meta") + ``` + """ + ... + + def __datafusion_table_provider__(self, session: Any) -> Any: + """Return the FFI `TableProvider` capsule for DataFusion registration. + + This is called automatically by `SessionContext.register_table_provider`. + You do not need to call it directly. + """ + ...