From 70c8c74c33575ebe24b6b4adbfb773f426aeaa3d Mon Sep 17 00:00:00 2001 From: Shakirov Renat Date: Tue, 7 Jul 2026 10:13:09 +0300 Subject: [PATCH 01/18] detection_tags: fixed-val demo + FiftyOne + two-part checkpoint flow Fixed val (correct A/B metric comparison): - add_request.py --subset pins a batch to train/val; load_batch emits image__subset_hint; split honors it (random split only fills un-pinned images). Load base-val + night-val up front so val is frozen; add night-train only for the retrain. FiftyOne (ported from e2e_template/image_detection): - stage=fiftyone: download_images + publish GT and per-model predictions (predictions_model_a=baseline, predictions_model_b=retrained; slot by sorted model id); tag/subset as sample fields. mongo added to docker-compose; datapipe-ml[fiftyone]+fiftyone dep. Tag dimension: numeric tag_id (deterministic via config.TAG_IDS) + tag_name + tag_description; image__tag/tag_metrics key on tag_id, join tag for readable name. Bug fixes: - darken=NaN: a NULL numeric column arrives as NaN when several requests load in one batch; pd.isna guards so base batches are not darkened with gamma=NaN into garbage. - download_images: don't pass S3 storage options to fsspec.open of a public HTTP URL. Defaults/robustness: DB_SCHEMA defaults to public; standard ports. SKILL.md: two-part checkpoint flow (demo-only), fixed-val rationale, pre-flight port/schema checks, always-print-full-table rule, service-watch guidance, troubleshooting (polars-lts on pre-AVX2, count-metrics ordering, double-train, port/tunnel/proxy pitfalls); snapshot/rehearse as inline pg_dump/psql (no committed demo scripts). Co-Authored-By: Claude Opus 4.8 --- .claude/skills/setup-detection-tags/SKILL.md | 333 ++++++++++++++---- examples/detection_tags/.env.example | 8 +- examples/detection_tags/README.md | 97 +++-- examples/detection_tags/detection/app.py | 37 +- examples/detection_tags/detection/config.py | 25 +- examples/detection_tags/detection/data.py | 50 ++- examples/detection_tags/detection/steps.py | 127 ++++++- examples/detection_tags/docker-compose.yml | 11 + examples/detection_tags/pyproject.toml | 3 +- .../detection_tags/scripts/add_request.py | 22 +- 10 files changed, 569 insertions(+), 144 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 38f0d8e7..088b899b 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -2,94 +2,273 @@ name: setup-detection-tags description: > Use when setting up or running examples/detection_tags — a self-contained datapipe detection - demo built around tags (per-scenario metrics), with no Label Studio and no FiftyOne, deployed - from scratch; or when demoing "add a tagged batch, retrain, watch the tag metric rise". + demo built around tags (per-scenario metrics), split into two parts around a checkpoint (train a + baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), with a + FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged batch, retrain, + watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. --- -# detection_tags (tags demo — no Label Studio, no FiftyOne) - -Minimal detection pipeline whose whole point is **tags**: train a baseline, load a **tagged scenario -batch**, retrain, and watch the metric on that tag rise in a `tag_metrics` table. Ground truth is -**injected** (COCO labels, lowercase `cat`/`dog`) — no human annotation — so it runs unattended. - -**First, ask: demo (test) or real data?** — the whole flow branches on this. - -- **Demo / test** → run it unattended on the built-in COCO cat/dog data. Do it in this order and - *narrate each step*: - 1. deploy (services + `uv sync` + `db create-all`), load the **base** batch, run `stage=train`; - 2. **show the metrics** (`detection_model_train__metrics_on_subset`) for the baseline model; - 3. say: *"there's a `night` low-light tagged scenario — want to add it and retrain, or stop here?"* - 4. if yes → load the **night** batch (`--tag night --darken 0.25`), run `stage=train` again; - 5. after the run, **show the metrics again** — both `metrics_on_subset` and **`tag_metrics`** (the - `night/val` recall for the baseline vs the retrained model). - -- **Real data** → don't guess; gather everything up front and fill it in explicitly: - - **images + ground truth**: where are the images, and where do the boxes/labels come from — - a labelled dataset to inject, or real annotation? (this example has no Label Studio; GT is injected) - - **classes**: the real class names → set `DETECTION_CLASSES` / the GT labels to match exactly (casing!) - - **the tag/scenario**: what is the tagged case (e.g. night, occluded, a site) and which images carry it - - **storage + DB**: which S3/MinIO bucket (`DATAPIPE_TAGS_DIR`) and which Postgres/schema (`DB_URL`/`DB_SCHEMA`) - - **GPU + training size**: enough data and epochs that metrics are meaningful (see the note below) - Then wire the loader to the real source instead of the COCO `load_batch` step. - -**Ask first — don't assume (only the unresolved):** which Postgres + which database for `DB_URL` -(don't target an existing DB or drop a `localhost` default without confirming); reuse an existing -venv/`uv` env or a fresh one? GPU available (training is GPU)? surface stage logs or run quiet? - -**How to work:** propose a short plan and get a go-ahead; show each stage's logs and report what -changed; trust the `*_training_status` table, not the exit code. On an unclear failure re-run with -`datapipe --debug … run` sent to a file + `grep`, not inline. - -## Deploy from scratch +# detection_tags (tags demo — two-part, FiftyOne, no Label Studio) + +Detection pipeline whose whole point is **tags**: train a baseline (model A), then add a **tagged +scenario TRAIN batch** and retrain (model B), and watch recall on that tag rise in a `tag_metrics` +table. Ground truth is **injected** (COCO labels, lowercase `cat`/`dog`) — no human annotation. + +The two-part / checkpoint split below is a **presentation device for the live demo only** — it lets +you prep part 1 ahead of time, present part 2, and rehearse it. It is NOT required to use the pipeline: +for real work you just run the stages end to end (the frozen-val data layout still matters — that's +about metric correctness, not the demo). See "Real data" at the end. + +The demo is deliberately **two parts around a checkpoint**, so you can prepare part 1 ahead of time +and present/rehearse part 2 (the retraining) as often as you like: + +- **Part 1 (prep, before the audience):** deploy → load `base-train` + `base-val` + `night-val` + (val is frozen up front) → train **model A** → compute all metrics → **take a checkpoint** → build + the FiftyOne view. Stop here. +- **Part 2 (the live demo):** show model A's metrics + FiftyOne → *ask "ready to retrain?"* → load + the tagged TRAIN batch `night-train` → retrain **model B** → show the metrics again: `night` recall + rises from A to B. Rehearse by resetting to the checkpoint. + +## Ask first — don't assume (only the unresolved) + +1. **Demo (test) or real data?** — the whole flow branches on this (see "Real data" at the end). +2. **Is an env/compose already up?** Check before deploying: `docker compose ls` / + `docker ps` on the target host, and whether a `.venv` already has torch+fiftyone. **Reuse it** + (skip `uv sync` / `compose up` / `db create-all` as appropriate) rather than redeploying — only + deploy the pieces that are missing. Don't drop a `localhost` DB default or target an existing DB + without confirming. +3. **GPU available?** Training is GPU. On a remote cluster (e.g. epoch8 gpu5) run the whole stack + there over SSH; note the host may have a **read-only home** and **no AVX2** (see Troubleshooting). +4. **Surface stage logs or run quiet?** Default: show each stage and report what changed. + +## Frozen val — why the data is loaded in this order (READ THIS) + +A metric on `val` is an **aggregate over the set of images currently in val**. Change that set and +the number moves *even if the model is byte-identical*. If you load the tagged batch as one blob and +let the random split scatter it across train/val at retrain time, model A's val (and tag/val) numbers +shift between the two measurements — an apples-to-oranges comparison that confuses everyone. + +Fix: **freeze val up front.** Load `base-val` and `night-val` (subset pinned to `val`) *before* +training model A, and only add `night-train` (pinned to `train`) later. Then val never changes; model +A is measured once on the full frozen val and its numbers are stable, and B is compared on the exact +same val. `add_request.py --subset train|val` pins a batch; the load step emits `image__subset_hint` +and the split step honors it (random split only fills images without a hint). + +Batches (COCO cat/dog; the pre-staged cache holds **500 images**, so keep the total ≤ 500 or expand +the cache — see Troubleshooting): + +| batch | n | offset | subset | tag | darken | when | +|-------|---|--------|--------|-----|--------|------| +| `base-train` | 325 | 0 | train | — | — | part 1 | +| `base-val` | 100 | 325 | val | — | — | part 1 | +| `night-val` | 25 | 425 | val | night | 0.25 | part 1 | +| `night-train`| 50 | 450 | train | night | 0.25 | part 2 | + +Validated on gpu5: model A → train recall ~0.95, night/val recall ~0.09 (blind in the dark); after +part 2, model B → night/train recall ~0.86. Keep night/val small but not tiny (25 imgs / ~45 GT) — +below ~20 the val payoff is pure ±1-box noise and can even go the wrong way. + +## Pre-flight — CHECK what's already there, then ASK (do this before deploying) + +Never assume a clean host. Before `docker compose up` / loading / training, check each resource and, +if it's occupied, ASK the user what to do (reuse / different port / different schema or DB / wipe) — +don't silently claim it or clobber someone else's work. + ```bash -cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, DATAPIPE_TAGS_DIR -docker compose up -d # postgres + minio ONLY (no mongo, no Label Studio) -uv sync # cu124 torch + polars-lts-cpu + pi-heif baked in +# 1) ports free? (host) — postgres 5432, minio 9000/9001, mongo 27017, fiftyone 5151, app 8000 +ss -ltn | grep -E ':(5432|9000|9001|27017|5151|8000)\b' || echo "all free" +# 2) is a stack already up? +docker compose ls ; docker ps --format '{{.Names}}\t{{.Ports}}' +# 3) does the target DB/schema already hold this pipeline's tables? +psql "$DB_URL" -c "\dt $DB_SCHEMA.*" 2>/dev/null | grep -qi detection && echo "SCHEMA IN USE" || echo "schema clean" +# 4) is a venv already built (torch+fiftyone)? reuse vs fresh uv sync +``` + +Findings → questions to ask: a **busy port** means another stack (reuse it, or remap ports?); a +**populated schema** means a prior run (resume it, wipe it, or use a different `DB_SCHEMA`/DB?); a +**running compose** (reuse or `down`?). The same check applies on your laptop when a **local tunnel +port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), don't kill blindly. + +## Deploy from scratch (standard ports; skip pieces already up) + +```bash +cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI +docker compose up -d # postgres + minio + mongo (mongo is for FiftyOne). No Label Studio. +uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif +# On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): +uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection -# db create-all makes the tables, NOT the schema — create it first: -psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" # or: docker exec psql -U postgres -c "CREATE SCHEMA IF NOT EXISTS datapipe_tags" +# DB_SCHEMA defaults to `public` (already exists). Only if you set a dedicated schema (to share the +# Postgres with other pipelines) create it first: psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" datapipe db create-all ``` -## Two-step data load — via datapipe steps (no annotation) -Loading is a pipeline step (`stage=load`) driven by rows in the `load_request` table. Add a request, -run the load step; it downloads COCO cat/dog, uploads to MinIO, and emits `s3_images` + ground truth -(+ tag). Labels are lowercase `cat`/`dog`; `image_name` = object basename so all joins line up. +## Part 1 — baseline to checkpoint + +Run `stage=train` as ONE step (it internally does split→freeze→train→inference); surface each stage +from its log and by querying the tables after — do NOT invoke `stage=train-prepare` separately before +`stage=train`, or the intermediate re-freeze retrains the model twice (see Troubleshooting). + ```bash -# from examples/detection_tags/detection -python ../scripts/add_request.py --id base --n 450 -datapipe step --labels=stage=load run # batch 1: base cat/dog -python ../scripts/add_request.py --id night --n 50 --offset 450 --tag night --darken 0.25 -datapipe step --labels=stage=load run # batch 2: tagged scenario +# from examples/detection_tags/detection, with .env sourced +python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val +python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 +datapipe step --labels=stage=load run # 450 images; val frozen (100 base + 25 night) +# show the frozen split: SELECT subset_id, count(*) FROM image__subset_hint GROUP BY subset_id + +datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference (SHOW every epoch) +datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics +# count-metrics can print "Batches to process 0" right after training (it hasn't seen the fresh +# predictions yet) — RE-RUN it once; then the tables fill. (See Troubleshooting.) + +# SHOW THE FULL TABLES (see the Rule below). To rehearse part 2 later, snapshot the post-A state +# BEFORE the fiftyone stage (demo-only convenience; skip for real use): +docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql + +datapipe step --labels=stage=fiftyone run # download_images -> GT + model-A predictions ``` -## Run +**Stop here (end of stage 1) and hand the baseline over to the user:** +- show the full training log (all epochs) and the **full** metric tables (`metrics_on_subset` + + `tag_metrics`) — `tag_metrics` for model A at `night/val` is **low** (baseline blind in the dark); +- bring up the **FiftyOne App** service so they can browse GT vs model-A predictions, and give them + its address / how to reach it (see "Let the user watch" — specifics depend on the setup); +- then ask whether to proceed to part 2 (retrain). That's the problem part 2 fixes. + +Surface every epoch from the training log (it streams to a file, e.g. `/tmp/train_A.log`): ```bash -datapipe run # load → split → freeze → train → inference → metrics → tag_metrics -# or by stage: datapipe step --labels=stage=train run +grep -oE "[0-9]+/[0-9]+ +[0-9.]+G +[0-9.]+ +[0-9.]+ +[0-9.]+" /tmp/train_A.log # per-epoch box/cls/dfl loss +grep -E "^ +all +[0-9]+ +[0-9]+" /tmp/train_A.log # per-epoch val P/R/mAP50/mAP50-95 ``` -## The payoff -`tag_metrics(detection_model_id, tag_id, subset_id)` → precision/recall/f1. Compare the baseline -(trained before batch 2) vs the retrained model at `tag=night, subset=val` — recall on the tag rises -once the tagged batch is in training. `tag`/`image__tag` are external inputs (produced by the `load` step); -`tag_metrics` is a real pipeline step (`steps.compute_tag_metrics`, `transform_keys=["detection_model_id"]` -so the aggregation is correct). - -## Two-model demo (baseline vs retrained) -1. Load batch 1 → `datapipe step --labels=stage=train run` → model A (no tag in training). -2. Load batch 2 (`--tag night --darken 0.25`) → `datapipe step --labels=stage=train run` → model B. -3. Read `tag_metrics`: `night/val` ≈ low for A, higher for B. - -## Troubleshooting (may already be fixed — verify against current files) -- **`SIGILL` / `Illegal instruction` in the training subprocess** → `polars` built for a CPU newer - than the host (pre-AVX2). The `polars-lts-cpu` pin is **not enough** on its own: the regular `polars` - comes in transitively (datapipe-ml/core) and both install the same `polars` module. After `uv sync` - force lts-cpu to win: `uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1`. -- **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → ultralytics image - verification needs `pi_heif` (pinned here); reinstall if missing. -- **`No ground truth` at freeze** → `image__ground_truth.image_name` must match `s3_images.image_name` - (the load step uses the object basename for both); a mismatched key makes the join empty. -- **Metrics 0 on a trained model** → tiny/noisy val makes "best epoch" latch onto an early - checkpoint; use enough data (~500 total via the default batches) and the shipped epoch config. +## Part 2 — retrain and watch the tag metric rise + +```bash +python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 +datapipe step --labels=stage=load run # 500 images total +datapipe step --labels=stage=train run # split (night -> TRAIN, val UNCHANGED) + train model B (SHOW every epoch) +# verify val stayed frozen after the split: +# SELECT subset_id, count(*) FILTER (WHERE image_name LIKE '%night%') night, count(*) total +# FROM image__subset s JOIN image__ground_truth USING(image_name) GROUP BY subset_id +datapipe step --labels=stage=count-metrics run # re-run if "0 batches" +datapipe step --labels=stage=fiftyone run # adds predictions_model_b +``` + +`night/val` recall rises from model A to model B — the payoff. Show the full tables again. + +## Rehearse part 2 from the snapshot (demo-only) + +Restore the post-A snapshot and wipe the FiftyOne db, then re-run Part 2 — no retraining of model A, +no image re-download: + +```bash +docker exec psql -U postgres -c "DROP SCHEMA IF EXISTS $DB_SCHEMA CASCADE; CREATE SCHEMA $DB_SCHEMA" +docker exec -i psql -U postgres < /tmp/checkpoint.sql +docker exec mongosh --quiet --eval "db.getSiblingDB('fiftyone').dropDatabase()" +``` + +## RULE: always print the FULL metrics table + +When you show metrics, dump the **whole** table, not a truncated view. Both of these, every time: + +```bash +docker exec psql -U postgres -x -c \ + "SELECT * FROM $DB_SCHEMA.detection_model_train__metrics_on_subset ORDER BY detection_model_id, subset_id" +docker exec psql -U postgres -x -c \ + "SELECT tm.*, t.tag_name FROM $DB_SCHEMA.tag_metrics tm JOIN $DB_SCHEMA.tag t USING(tag_id) \ + ORDER BY tm.detection_model_id, tm.tag_id, tm.subset_id" +``` + +`tag_id` is a numeric surrogate key (deterministic map in `config.TAG_IDS`, e.g. `night`→1); the +`tag` dimension holds `tag_name`/`tag_description`, so join it to show the readable name. + +The payoff comparison: `tag_metrics` at `tag=night, subset=val`, model A vs model B — recall rises. +The night/val set is small (25 images), so treat the rise as **directional**. + +## Let the user watch (offer it — work out the specifics per setup) + +The user can watch three things; make them available and hand over whatever access they need — don't +prescribe fixed commands here and don't leave a committed file behind (it would bake in one machine's +host/ports/paths and mislead on the next). Compute the specifics for the ACTUAL setup at runtime +(local vs remote host, which ports are free, tunnels if remote) and give the user the commands +directly in chat: + +- **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `tag_metrics`, + `detection_model_train__metrics_on_subset`, `detection_training_status`. +- **images** in the FiftyOne App: `ground_truth` vs `predictions_model_a` vs `predictions_model_b`, + filterable by `tag`/`subset`. +- **training progress**: the run streams to a log file — tail it; trust + `detection_training_status.status`, not exit codes. + +**When you START a training run, immediately tell the user how to follow it** (before it finishes), +so they can watch the epochs live — give the log path and the follow command, e.g. +`tail -f /tmp/train_A.log` (or the per-epoch `grep` from Part 1). Do this the moment training kicks +off, for model A and again for model B — not only after it completes. + +When the host is remote these are reached over SSH tunnels; if a local tunnel port is busy, pick a +different left-hand port rather than killing whatever holds it. + +## FiftyOne + +`stage=fiftyone` downloads images locally then publishes to one dataset (`FIFTYONE_DATASET_NAME`, +metadata in MongoDB): fields `ground_truth`, `predictions_model_a` (baseline), `predictions_model_b` +(retrained), plus sample fields `tag` and `subset`. Ported straight from +`examples/e2e_template/image_detection` (same `download_images` + `publish_to_fiftyone` + +`FiftyOneImagesDataTableStore`); the two model fields are assigned by sorted model-id (earliest = +`model_a`). Launch: `fiftyone app launch "$FIFTYONE_DATASET_NAME" --port 5151 --address 0.0.0.0`, +tunnel 5151 (local port MUST equal remote port — the App's WebSocket calls the same port). + +`tag` and `subset` are ordinary **sample fields** (set in-pipeline by `publish_gt_to_fiftyone`, no +scripts) — NOT FiftyOne's native "sample tags". Filter by the **fields** in the sidebar: pick +`tag = night` and `subset = val` — different fields AND together, so you get exactly the night-val +set. (Selecting multiple values inside FiftyOne's native TAGS panel ORs them, which is why we do NOT +mirror tag/subset into native tags.) That isolates where model A misses in the dark; after part 2, +`predictions_model_b` shows model B catching it. Fields stay `predictions_model_a` (baseline, +earliest model id) / `predictions_model_b` (retrained); the exact model ids are in the DB tables. + +## How to work + +Propose a short plan and get a go-ahead; show each stage's logs and report what changed. Trust the +`*_training_status` table, not the exit code. On an unclear failure re-run with `datapipe --debug … run` +to a file + `grep`, not inline. + +## Troubleshooting (verify against current files) + +- **Pre-staged cache is exactly 500 images** → `gt.json` in the cache dir caps the pool. An `offset` + past 500 yields an empty batch silently. Keep the batch total ≤ 500, or rebuild the cache larger + (or point `DATAPIPE_TAGS_CACHE_DIR` at a fresh dir to force a full COCO download). +- **`SIGILL` / `Illegal instruction` in training** → `polars` built for a newer CPU than the host + (pre-AVX2). The `polars-lts-cpu` pin isn't enough alone; the regular `polars` comes in transitively. + After `uv sync`: `uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1`, + then verify `python -c "import polars; print(polars.__version__)"` is the lts one. +- **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. +- **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated + the fresh predictions in the same pass. Re-run `count-metrics` once; then `metrics_on_image/subset` + and `tag_metrics` fill. +- **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` + separately; the split between them changes `image__subset`, which re-freezes the dataset and + retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. +- **`kill -0 ` waiters, not `pgrep -f ""`** → a `pgrep`/`until` loop whose own + command line contains the pattern (e.g. `stage=load`, `uv sync`, `bin/datapipe step`) matches + ITSELF and never exits. Wait on the captured PID instead. +- **Read-only home on the cluster** (e.g. gpu5 `ml`) → put the repo, `HOME`, uv cache, and FiftyOne + local images under a writable path like `/var/tmp`; `/tmp` and `/var/tmp` are writable. +- **Flaky link to the cluster** (Moscow/RU hosts) → SSH may time out transiently; retry. +- **Metrics 0 on a trained model** → tiny/noisy val latches an early "best" checkpoint; use enough + data (~450 total) and the shipped epoch config. - **Training exits 0 but no model** → datapipe swallows step errors; check `detection_training_status`. + +## Real data + +**Skip the two-part / checkpoint / rehearse machinery — that's demo-only.** For real data just run the +stages end to end (`load` → `train` → `count-metrics` → optionally `fiftyone`); no artificial stop, no +snapshot/restore. `--darken` is also demo-only (it synthesizes the low-light scenario from normal COCO +images — real data has real tagged images, so drop it). Still keep **val frozen** (pin `--subset`) — +that's about metric correctness, not the demo. + +Don't guess; gather up front and wire the loader to the real source instead of the COCO `load_batch`: +images + where boxes/labels come from (a labelled set to inject, or real annotation); real class +names (set `DETECTION_CLASSES` / GT labels to match exactly, casing!); the tag/scenario and which +images carry it; storage + DB (`DATAPIPE_TAGS_DIR`, `DB_URL`/`DB_SCHEMA`); GPU + enough data/epochs +that metrics are meaningful. diff --git a/examples/detection_tags/.env.example b/examples/detection_tags/.env.example index ba970ba4..a10f4deb 100644 --- a/examples/detection_tags/.env.example +++ b/examples/detection_tags/.env.example @@ -7,4 +7,10 @@ export S3_PUBLIC_URL=http://localhost:9000 export DATAPIPE_TAGS_DIR=s3://datapipe-tags export DATAPIPE_TAGS_TMP_DIR=/tmp/datapipe-tags export DB_URL=postgresql://postgres:password@localhost:5432/postgres -export DB_SCHEMA=datapipe_tags +# default schema; set a dedicated one (e.g. datapipe_tags) only if you SHARE this Postgres with +# other pipelines — then `db create-all` needs the schema created first (see README). +export DB_SCHEMA=public +# FiftyOne (stage=fiftyone): dataset metadata in MongoDB, images rendered from local files +export FIFTYONE_DATABASE_URI=mongodb://localhost:27017 +export FIFTYONE_DATASET_NAME=datapipe_detection_tags +export LOCAL_IMAGES_DIR=/tmp/datapipe-tags-fiftyone-images diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 8356a89b..8c805639 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -1,57 +1,78 @@ # detection_tags -A minimal, self-contained datapipe detection example built around **tags** — with **no Label -Studio and no FiftyOne**. Ground truth is injected directly (COCO labels, lowercase `cat`/`dog`), -so the whole thing runs unattended from scratch. +A self-contained datapipe detection example built around **tags** (per-scenario metrics), with a +**FiftyOne** view and **no Label Studio**. Ground truth is injected directly (COCO labels, lowercase +`cat`/`dog`), so it runs unattended from scratch. -The point: train a baseline, then add a **tagged scenario batch**, retrain, and watch the metric on -that tag rise — visible in a dedicated `tag_metrics` table (a real pipeline step). +The point: train a baseline (model A), then add a **tagged scenario TRAIN batch** and retrain +(model B), and watch recall on that tag rise — visible in a dedicated `tag_metrics` table. The demo +is split into **two parts around a checkpoint** so you can prep part 1 and rehearse part 2. ## Deploy from scratch ```bash cp .env.example .env && set -a && source .env && set +a -docker compose up -d # postgres + minio only -uv sync # cu124 torch, polars-lts-cpu, pi-heif baked in +docker compose up -d # postgres + minio + mongo (mongo backs FiftyOne) +uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif +# pre-AVX2 host only: force the lts polars to win (else training SIGILLs) +uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection -psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" # db create-all makes tables, not the schema +# DB_SCHEMA defaults to `public` (exists already). For a dedicated schema (sharing the Postgres with +# other pipelines) create it first: psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" datapipe db create-all ``` -## Two-step data load — via datapipe steps (no annotation) -Loading is a real pipeline step (`stage=load`): add a request row, then run the step. It downloads -COCO cat/dog, uploads to MinIO, and produces `s3_images` + ground truth (+ a tag) — no human labelling. +## Frozen val (why the load order matters) +A `val` metric is an aggregate over whatever images are in val; if you add the tagged batch to val at +retrain time, model A's numbers move and the A-vs-B comparison is invalid. So **freeze val up front**: +load `base-val` + `night-val` (pinned `--subset val`) before training A, and add `night-train` +(`--subset train`) only for part 2. `add_request.py --subset` pins a batch (`image__subset_hint`), +the split step honors it. The pre-staged cache holds **500 images**, so keep the total ≤ 500. + +## Part 1 — baseline to checkpoint ```bash # from examples/detection_tags/detection -python ../scripts/add_request.py --id base --n 450 -datapipe step --labels=stage=load run # batch 1: base cat/dog -datapipe step --labels=stage=train run # -> model A (baseline, no tag in training) - -python ../scripts/add_request.py --id night --n 50 --offset 450 --tag night --darken 0.25 -datapipe step --labels=stage=load run # batch 2: tagged low-light scenario -datapipe step --labels=stage=train run # -> model B (tag in training) -datapipe step --labels=stage=count-metrics run # (re)compute metrics incl. tag_metrics +python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val +python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 +datapipe step --labels=stage=load run +datapipe step --labels=stage=train run # model A +datapipe step --labels=stage=count-metrics run # re-run once if it prints "Batches to process 0" +# (demo-only) snapshot the post-A state to rehearse part 2 later, before the fiftyone stage: +docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql +datapipe step --labels=stage=fiftyone run # GT + model-A predictions into FiftyOne ``` -Or just `datapipe run` after adding request rows to run every stage. -### Fast data on a slow/blocked network (pre-staged cache) -The `load` step downloads images from COCO per request, which is slow on a high-latency or -throttled link. To avoid it, pre-stage a cache once from a fast machine: -`DATAPIPE_TAGS_CACHE_DIR/images/.jpg` + `DATAPIPE_TAGS_CACHE_DIR/gt.json` -(`{ ".jpg": {"bboxes": [[x1,y1,x2,y2]], "labels": ["cat"|"dog"]}, ... }`). If that cache is -present, the load step reads images + ground truth from it (no COCO fetches at all). Build it by -downloading the COCO cat/dog subset elsewhere and copying the folder to `DATAPIPE_TAGS_CACHE_DIR` -(default `/tmp/datapipe-tags-cache`). +## Part 2 — retrain and watch the tag metric rise +```bash +python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 +datapipe step --labels=stage=load run +datapipe step --labels=stage=train run # model B (night now in training) +datapipe step --labels=stage=count-metrics run # re-run once if "0 batches" +datapipe step --labels=stage=fiftyone run # adds predictions_model_b +``` +Rehearse (demo-only): restore the snapshot + wipe the FiftyOne db, then re-run part 2 — no retraining +of model A: +```bash +docker exec psql -U postgres -c "DROP SCHEMA IF EXISTS $DB_SCHEMA CASCADE; CREATE SCHEMA $DB_SCHEMA" +docker exec -i psql -U postgres < /tmp/checkpoint.sql +docker exec mongosh --quiet --eval "db.getSiblingDB('fiftyone').dropDatabase()" +``` ## What you get -- `detection_model_train` — trained model(s). -- `detection_model_train__metrics_on_subset` — overall metrics per model. -- **`tag_metrics`** — `(detection_model_id, tag_id, subset_id)` → precision/recall/f1. Compare the - baseline (trained before batch 2) vs the retrained model on `tag=night, subset=val`: the tag recall - rises once the tagged batch is in training. +- `detection_model_train__metrics_on_subset` — overall metrics per (model, subset). +- **`tag_metrics`** — `(detection_model_id, tag_id, subset_id)` → precision/recall/f1. Compare model + A vs model B at `tag=night, subset=val`: recall rises once the tagged batch is in training. +- **FiftyOne** dataset `$FIFTYONE_DATASET_NAME`: `ground_truth`, `predictions_model_a`, + `predictions_model_b`, plus `tag`/`subset` sample fields. Launch: + `fiftyone app launch "$FIFTYONE_DATASET_NAME" --port 5151 --address 0.0.0.0` (tunnel that port if + remote — local port must equal the remote port; filter by the `tag`/`subset` fields). + +### Pre-staged cache (fast loads) +If `DATAPIPE_TAGS_CACHE_DIR/gt.json` + `DATAPIPE_TAGS_CACHE_DIR/images/.jpg` exist, the load +step reads from them instead of fetching COCO. Default dir `/tmp/datapipe-tags-cache`. It caps the +image pool at its size (500 here) — expand it or point at a fresh dir to download more from COCO. ## Notes -- Classes are lowercase (`cat`/`dog`) to match COCO, so injected GT and predictions align. -- On a tiny validation set the "best epoch" pick can latch onto an early checkpoint; this example - uses 50 epochs and a non-trivial batch size to keep metrics meaningful. -- Tables `tag` / `image__tag` are external inputs (produced by the `load` step); `tag_metrics` is - produced by a pipeline `BatchTransform` (`steps.compute_tag_metrics`). +- Classes are lowercase (`cat`/`dog`) to match COCO so injected GT and predictions align. +- Trust `detection_training_status.status`, not exit codes; `count-metrics` may need a second run. +- FiftyOne integration is ported from `examples/e2e_template/image_detection`. diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index bfc00fb8..07ead686 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -24,13 +24,13 @@ BatchTransform( func=steps.load_batch, inputs=["load_request"], - outputs=["s3_images", "image__ground_truth", "tag", "image__tag"], + outputs=["s3_images", "image__ground_truth", "tag", "image__tag", "image__subset_hint"], transform_keys=["request_id"], labels=[("stage", "load")], ), BatchTransform( func=steps.split_df_train_val, - inputs=["image__ground_truth", "image__subset"], + inputs=["image__ground_truth", "image__subset", "image__subset_hint"], outputs=["image__subset"], transform_keys=["image_name"], kwargs=dict(primary_keys=["image_name"], val_perc=0.25, random_seed=42), @@ -126,6 +126,39 @@ transform_keys=["detection_model_id"], labels=[("stage", "train"), ("stage", "count-metrics"), ("stage", "tag-metrics")], ), + # --- FiftyOne (stage=fiftyone): browse GT + both models' predictions, filter by tag --- + BatchTransform( + func=steps.download_images, + inputs=["s3_images"], + outputs=["local_images"], + transform_keys=["image_name"], + kwargs=dict(image__image_path__name="image_url", image__local_image_path__name="local_path"), + labels=[("stage", "fiftyone")], + ), + BatchTransform( + func=steps.publish_gt_to_fiftyone, + inputs=["local_images", "image__ground_truth", "image__subset", "image__tag"], + outputs=["fiftyone_annotations"], + transform_keys=["image_name"], + kwargs=dict(primary_keys=["image_name"], image__image_path__name="local_path"), + labels=[("stage", "fiftyone")], + ), + BatchTransform( + func=steps.publish_predictions_to_fiftyone, + inputs=["local_images", "detection_prediction_train"], + outputs=["fiftyone_predictions_model_a"], + transform_keys=["image_name"], + kwargs=dict(slot="model_a", primary_keys=["image_name"], image__image_path__name="local_path"), + labels=[("stage", "fiftyone")], + ), + BatchTransform( + func=steps.publish_predictions_to_fiftyone, + inputs=["local_images", "detection_prediction_train"], + outputs=["fiftyone_predictions_model_b"], + transform_keys=["image_name"], + kwargs=dict(slot="model_b", primary_keys=["image_name"], image__image_path__name="local_path"), + labels=[("stage", "fiftyone")], + ), ] ) diff --git a/examples/detection_tags/detection/config.py b/examples/detection_tags/detection/config.py index b4a871e0..610295fe 100644 --- a/examples/detection_tags/detection/config.py +++ b/examples/detection_tags/detection/config.py @@ -21,6 +21,22 @@ DETECTION_CLASSES = ["cat", "dog"] COCO_CAT_IDS = {17: "cat", 18: "dog"} # COCO category_id -> class name +# --- tags ----------------------------------------------------------------------- +# Numeric tag ids must be DETERMINISTIC (datapipe re-runs), so map known tag names to +# fixed ids; unknown names fall back to a stable crc32-derived number. +import zlib # noqa: E402 + +TAG_IDS = {"night": 1} +TAG_NAMES = {v: k for k, v in TAG_IDS.items()} + + +def tag_id_for(name: str) -> int: + return TAG_IDS.get(name) or (zlib.crc32(name.encode()) % 100000) + + +def tag_name_for(tag_id) -> str: + return TAG_NAMES.get(tag_id, str(tag_id)) + # --- single storage root -------------------------------------------------------- # Input images live under /images; the pipeline working_dir under /datapipe # (siblings) so listing input images never re-ingests training artifacts. @@ -81,5 +97,12 @@ def datapipe_tmp_folder() -> str: "start docker compose, and run: set -a && source .env && set +a" ) -DB_SCHEMA = os.environ.get("DB_SCHEMA", "datapipe_tags") +DB_SCHEMA = os.environ.get("DB_SCHEMA", "public") DBCONN = DBConn(DB_URL, DB_SCHEMA) + +# --- FiftyOne ------------------------------------------------------------------- +# FiftyOne stores dataset metadata in MongoDB (FIFTYONE_DATABASE_URI, brought up by +# docker compose) and renders samples from LOCAL image files, so the fiftyone stage +# downloads S3 images to LOCAL_IMAGES_DIR first. +FIFTYONE_DATASET_NAME = os.environ.get("FIFTYONE_DATASET_NAME", "datapipe_detection_tags") +LOCAL_IMAGES_DIR = Path(os.environ.get("LOCAL_IMAGES_DIR", "/tmp/datapipe-tags-fiftyone-images")) diff --git a/examples/detection_tags/detection/data.py b/examples/detection_tags/detection/data.py index 4fce06e8..c7184a99 100644 --- a/examples/detection_tags/detection/data.py +++ b/examples/detection_tags/detection/data.py @@ -1,16 +1,34 @@ from __future__ import annotations +from cv_pipeliner.utils.fiftyone import FifyOneSession from datapipe.compute import Catalog, Table from datapipe.store.database import TableStoreDB +from datapipe_ml.utils.image_data_stores import FiftyOneImagesDataTableStore from sqlalchemy import Column, Float, Integer, JSON, String -from config import DBCONN +from config import DBCONN, FIFTYONE_DATASET_NAME + +# one FiftyOne session/dataset shared by the ground-truth + per-model prediction stores; +# each store writes its own field (ground_truth / predictions_model_a / predictions_model_b) +# into the SAME dataset, so a sample shows GT and both models side by side. +fo_session = FifyOneSession() def _t(name, schema): return Table(TableStoreDB(dbconn=DBCONN, name=name, data_sql_schema=schema, create_table=True)) +def _fo(field, additional_info_keys_in_sample=()): + return Table(FiftyOneImagesDataTableStore( + dataset=FIFTYONE_DATASET_NAME, + fo_session=fo_session, + fo_detections_label=field, + rm_only_fo_fields=True, + additional_info_keys_in_sample=list(additional_info_keys_in_sample), + primary_schema=[Column("image_name", String(255), primary_key=True)], + )) + + catalog = Catalog( { # a load request: add a row here, then run `datapipe step --labels=stage=load run` @@ -20,6 +38,9 @@ def _t(name, schema): Column("offset", Integer), Column("tag", String), Column("darken", Float), + # pin every image of this batch to a subset (train/val); NULL = let the + # random split decide. Pinning is how the demo freezes val. + Column("subset", String), ]), # images uploaded by the load step (image_name = object basename) "s3_images": _t("s3_images", [ @@ -37,14 +58,22 @@ def _t(name, schema): Column("image_name", String, primary_key=True), Column("subset_id", String, primary_key=True), ]), + # per-batch pinned subset emitted by the load step (--subset); the split step + # honors these and only randomizes images without a hint. Freezes val. + "image__subset_hint": _t("image__subset_hint", [ + Column("image_name", String, primary_key=True), + Column("subset_id", String), + ]), # --- tags ------------------------------------------------------------- + # tag dimension: numeric tag_id (surrogate key), tag_name (slug), tag_description (readable) "tag": _t("tag", [ - Column("tag_id", String, primary_key=True), - Column("name", String), + Column("tag_id", Integer, primary_key=True), + Column("tag_name", String), + Column("tag_description", String), ]), "image__tag": _t("image__tag", [ Column("image_name", String, primary_key=True), - Column("tag_id", String, primary_key=True), + Column("tag_id", Integer, primary_key=True), ]), # per-image metrics produced by the CountMetrics step (declared so the # tag-metrics transform can read it as an input) @@ -61,7 +90,7 @@ def _t(name, schema): # per-(model, tag, subset) metrics — the tag arc lives here "tag_metrics": _t("tag_metrics", [ Column("detection_model_id", String, primary_key=True), - Column("tag_id", String, primary_key=True), + Column("tag_id", Integer, primary_key=True), Column("subset_id", String, primary_key=True), Column("calc__images_support", Integer), Column("calc__support", Integer), @@ -69,5 +98,16 @@ def _t(name, schema): Column("calc__recall", Float), Column("calc__f1_score", Float), ]), + # --- FiftyOne (stage=fiftyone) --------------------------------------- + # images downloaded locally (FiftyOne renders from local files) + "local_images": _t("local_images", [ + Column("image_name", String(255), primary_key=True), + Column("local_path", String(1024)), + ]), + # GT boxes + per-sample subset/tag fields (filter tag=night in the FO App) + "fiftyone_annotations": _fo("ground_truth", additional_info_keys_in_sample=["subset", "tag"]), + # predictions of the baseline (model A) and the retrained model (model B) + "fiftyone_predictions_model_a": _fo("predictions_model_a"), + "fiftyone_predictions_model_b": _fo("predictions_model_b"), } ) diff --git a/examples/detection_tags/detection/steps.py b/examples/detection_tags/detection/steps.py index e9649472..f61ad680 100644 --- a/examples/detection_tags/detection/steps.py +++ b/examples/detection_tags/detection/steps.py @@ -13,14 +13,18 @@ import numpy as np import pandas as pd import requests +from datapipe_ml.core.image_data import convert_df_with_bbox_to_df_with_image_data from PIL import Image from config import ( COCO_CAT_IDS, DBCONN, + LOCAL_IMAGES_DIR, input_bucket, input_image_url, input_storage_options, + tag_id_for, + tag_name_for, ) COCO_IMG_BASE = "http://images.cocodataset.org/train2017/" @@ -74,11 +78,13 @@ def load_batch(df_request: pd.DataFrame): labels; image_name is the object basename (what a listing would produce).""" s3_cols = ["image_name", "image_url"] gt_cols = ["image_name", "bboxes", "labels"] - tag_cols = ["tag_id", "name"] + tag_cols = ["tag_id", "tag_name", "tag_description"] it_cols = ["image_name", "tag_id"] + hint_cols = ["image_name", "subset_id"] if df_request.empty: return (pd.DataFrame(columns=s3_cols), pd.DataFrame(columns=gt_cols), - pd.DataFrame(columns=tag_cols), pd.DataFrame(columns=it_cols)) + pd.DataFrame(columns=tag_cols), pd.DataFrame(columns=it_cols), + pd.DataFrame(columns=hint_cols)) # Prefer a pre-staged local cache (fast, no COCO): CACHE/images/ + CACHE/gt.json. # Download the cache once on a fast machine and copy it here — avoids per-image COCO fetches. @@ -117,13 +123,19 @@ def raw_bytes_and_gt(fn: str): if not use_cache: _fn_to_id = {id_to_img[i]["file_name"]: i for i in anns.keys()} - s3_rows, gt_rows, tag_rows, tag_defs = [], [], [], {} + s3_rows, gt_rows, tag_rows, tag_defs, hint_rows = [], [], [], {}, [] for _, req in df_request.iterrows(): n = int(req["n"]) offset = int(req.get("offset") or 0) - tag = req.get("tag") or None + # NB: when several requests load in one batch, a NULL in a numeric column arrives as NaN + # (not None) because pandas upcasts the column — so guard with pd.isna, else a base batch + # with darken=NULL would be "darkened" with gamma=NaN and produce garbage images. + tag = req.get("tag") + tag = None if pd.isna(tag) or str(tag) == "" else str(tag) + subset = req.get("subset") + subset = None if pd.isna(subset) or str(subset) == "" else str(subset) darken = req.get("darken") - darken = float(darken) if darken is not None and str(darken) != "" else None + darken = None if pd.isna(darken) or str(darken) == "" else float(darken) for fn in pool[offset: offset + n]: stem, ext = os.path.splitext(fn) raw, boxes, labels = raw_bytes_and_gt(fn) @@ -138,24 +150,44 @@ def raw_bytes_and_gt(fn: str): s3_rows.append({"image_name": name, "image_url": input_image_url(name)}) gt_rows.append({"image_name": name, "bboxes": boxes, "labels": labels}) if tag: - tag_rows.append({"image_name": name, "tag_id": tag}) - tag_defs[tag] = tag + tid = tag_id_for(tag) + tag_rows.append({"image_name": name, "tag_id": tid}) + # tag_defs[name] = (numeric id, readable description); note darkening if any + desc = tag if darken is None else f"{tag} (low-light, gamma {darken})" + tag_defs[tag] = (tid, desc) + if subset: + hint_rows.append({"image_name": name, "subset_id": subset}) return ( pd.DataFrame(s3_rows, columns=s3_cols), pd.DataFrame(gt_rows, columns=gt_cols), - pd.DataFrame([{"tag_id": t, "name": n} for t, n in tag_defs.items()], columns=tag_cols), + pd.DataFrame([{"tag_id": tid, "tag_name": nm, "tag_description": d} + for nm, (tid, d) in tag_defs.items()], columns=tag_cols), pd.DataFrame(tag_rows, columns=it_cols), + pd.DataFrame(hint_rows, columns=hint_cols), ) # --- train/val split ------------------------------------------------------------ -def split_df_train_val(df: pd.DataFrame, subset_df: pd.DataFrame, primary_keys: list[str], - val_perc: float = 0.25, random_seed: int = 42) -> pd.DataFrame: +def split_df_train_val(df: pd.DataFrame, subset_df: pd.DataFrame, hint_df: pd.DataFrame, + primary_keys: list[str], val_perc: float = 0.25, + random_seed: int = 42) -> pd.DataFrame: + """Assign a subset to every image that doesn't have one yet. An image whose subset the load + step pinned via ``image__subset_hint`` (batches loaded with ``--subset``) keeps that pinned + value; the rest are split train/val at random. Honoring the hint is what lets the demo FREEZE + val — load base-val + night-val up front (subset=val) and their assignment never changes when + train batches are added later, so a model's val metrics are stable across retrainings.""" df__merged = pd.merge(df, subset_df, on=primary_keys, how="outer") - df__missing = df__merged[df__merged["subset_id"].isna()].copy() - df__val = df__missing.sample(frac=val_perc, random_state=random_seed) - df__missing["subset_id"] = "train" + df__missing = df__merged[df__merged["subset_id"].isna()][primary_keys].copy() + if hint_df is not None and not hint_df.empty: + hint = hint_df[primary_keys + ["subset_id"]].drop_duplicates(subset=primary_keys) + df__missing = df__missing.merge(hint, on=primary_keys, how="left") + else: + df__missing["subset_id"] = np.nan + df__missing = df__missing.reset_index(drop=True) + unpinned = df__missing[df__missing["subset_id"].isna()] + df__val = unpinned.sample(frac=val_perc, random_state=random_seed) + df__missing.loc[unpinned.index, "subset_id"] = "train" df__missing.loc[df__val.index, "subset_id"] = "val" return pd.concat([subset_df, df__missing], ignore_index=True)[primary_keys + ["subset_id"]] @@ -180,3 +212,72 @@ def compute_tag_metrics(df_metrics_on_image: pd.DataFrame, df_image_tag: pd.Data g["calc__support"] = (tp + fn).astype(int) g["calc__images_support"] = g["images_support"].astype(int) return g[cols] + + +# --- FiftyOne (stage=fiftyone) -------------------------------------------------- +# Same pattern as examples/e2e_template/image_detection: download images locally, +# then publish bbox rows into a FiftyOne dataset via FiftyOneImagesDataTableStore. +def download_images(s3_images_df: pd.DataFrame, image__image_path__name: str, + image__local_image_path__name: str) -> pd.DataFrame: + LOCAL_IMAGES_DIR.mkdir(parents=True, exist_ok=True) + local_paths = [] + for _, row in s3_images_df.iterrows(): + s3_path = row[image__image_path__name] + local_path = LOCAL_IMAGES_DIR / os.path.basename(str(s3_path)) + if not local_path.exists(): + # image_url is the public HTTP URL of the MinIO object (anonymous download), so open it + # plainly — passing S3 storage options here would hit the http filesystem with s3 kwargs. + with fsspec.open(s3_path, "rb") as f_src: + local_path.write_bytes(f_src.read()) + local_paths.append(str(local_path.resolve())) + s3_images_df[image__local_image_path__name] = local_paths + return s3_images_df[["image_name", image__local_image_path__name]] + + +def publish_gt_to_fiftyone(images_df: pd.DataFrame, gt_df: pd.DataFrame, subset_df: pd.DataFrame, + tag_df: pd.DataFrame, primary_keys: list[str], + image__image_path__name: str) -> pd.DataFrame: + """Publish ground-truth boxes and attach per-sample subset/tag (so you can filter tag=night).""" + pk = primary_keys[0] + df = convert_df_with_bbox_to_df_with_image_data( + df__with_bbox=pd.merge(gt_df, images_df, on=pk), + primary_keys=primary_keys, + image__image_path__name=image__image_path__name, + ) + subset_by_image = (subset_df.drop_duplicates(subset=[pk]).set_index(pk)["subset_id"].to_dict() + if not subset_df.empty else {}) + tagid_by_image = (tag_df.drop_duplicates(subset=[pk]).set_index(pk)["tag_id"].to_dict() + if not tag_df.empty else {}) + for _, row in df.iterrows(): + tid = tagid_by_image.get(row[pk]) + # FiftyOne sample fields must be strings; write the tag NAME (not the numeric id) + row["image_data"].additional_info = { + "subset": subset_by_image.get(row[pk]) or "none", + "tag": tag_name_for(tid) if tid is not None else "none", + } + return df + + +def publish_predictions_to_fiftyone(images_df: pd.DataFrame, predictions_df: pd.DataFrame, + slot: str, primary_keys: list[str], + image__image_path__name: str) -> pd.DataFrame: + """Publish one model's predictions into the slot's FiftyOne field. slot='model_a' is the + earliest-trained model (baseline), 'model_b' the next (retrained). Model ids are + timestamp-prefixed, so sorting them yields a stable A/B assignment across all images.""" + pk = primary_keys[0] + empty = pd.DataFrame(columns=primary_keys + ["image_data"]) + if predictions_df.empty: + return empty + ids = sorted(predictions_df["detection_model_id"].dropna().unique().tolist()) + if not ids: + return empty + slot_of = {mid: ("model_a" if i == 0 else "model_b") for i, mid in enumerate(ids)} + target_ids = [mid for mid, s in slot_of.items() if s == slot] + pred = predictions_df[predictions_df["detection_model_id"].isin(target_ids)] + if pred.empty: + return empty + return convert_df_with_bbox_to_df_with_image_data( + df__with_bbox=pd.merge(pred, images_df, on=pk), + primary_keys=primary_keys, + image__image_path__name=image__image_path__name, + ) diff --git a/examples/detection_tags/docker-compose.yml b/examples/detection_tags/docker-compose.yml index d1788ffa..a99d2d0e 100644 --- a/examples/detection_tags/docker-compose.yml +++ b/examples/detection_tags/docker-compose.yml @@ -40,3 +40,14 @@ services: mc mb --ignore-existing local/datapipe-tags && mc anonymous set download local/datapipe-tags " + + # FiftyOne dataset metadata store (the fiftyone stage). Point FIFTYONE_DATABASE_URI at it. + mongo: + image: mongo:7 + ports: + - "27017:27017" + healthcheck: + test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping')"] + interval: 10s + timeout: 5s + retries: 5 diff --git a/examples/detection_tags/pyproject.toml b/examples/detection_tags/pyproject.toml index edb38bc3..a4b989f2 100644 --- a/examples/detection_tags/pyproject.toml +++ b/examples/detection_tags/pyproject.toml @@ -4,12 +4,13 @@ version = "0" requires-python = ">=3.10,<3.13" dependencies = [ "datapipe-app", - "datapipe-ml[torch]", + "datapipe-ml[torch,fiftyone]", # fiftyone extra pulls FiftyOneImagesDataTableStore + cv_pipeliner.fiftyone "torch==2.6.0", "torchvision==0.21.0", "stringzilla==4.4.0", # needed by albumentations "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) "pi-heif", # ultralytics image verification imports it + "fiftyone==1.17.0", # FiftyOne App + dataset (metadata in MongoDB) ] [[tool.uv.index]] diff --git a/examples/detection_tags/scripts/add_request.py b/examples/detection_tags/scripts/add_request.py index 56539876..790c3b4a 100644 --- a/examples/detection_tags/scripts/add_request.py +++ b/examples/detection_tags/scripts/add_request.py @@ -1,10 +1,15 @@ """Add a load request, then run the load step: datapipe step --labels=stage=load run - # batch 1 — base cat/dog - python ../scripts/add_request.py --id base --n 120 - # batch 2 — tagged low-light scenario - python ../scripts/add_request.py --id night --n 40 --offset 120 --tag night --darken 0.1 +Fixed-val demo (freeze val up front, add the tagged train batch later): + # loaded BEFORE training model A — val is frozen from the start + python ../scripts/add_request.py --id base-train --n 400 --offset 0 --subset train + python ../scripts/add_request.py --id base-val --n 100 --offset 400 --subset val + python ../scripts/add_request.py --id night-val --n 50 --offset 500 --subset val --tag night --darken 0.25 + # loaded BEFORE retraining model B (the tagged TRAIN batch — the fix) + python ../scripts/add_request.py --id night-train --n 50 --offset 550 --subset train --tag night --darken 0.25 + +--subset train|val pins every image of the batch to that subset so the random split never moves it. Run from examples/detection_tags/detection (so `import config` resolves).""" from __future__ import annotations @@ -27,6 +32,8 @@ def main() -> int: ap.add_argument("--offset", type=int, default=0, help="skip the first OFFSET picked COCO images") ap.add_argument("--tag", default=None) ap.add_argument("--darken", type=float, default=None, help="gamma < 1 darkens (e.g. 0.1)") + ap.add_argument("--subset", default=None, choices=["train", "val"], + help="pin every image of this batch to a subset (freezes val); omit to random-split") a = ap.parse_args() ds = DataStore(config.DBCONN, create_meta_table=True) @@ -36,11 +43,14 @@ def main() -> int: Column("request_id", String, primary_key=True), Column("n", Integer), Column("offset", Integer), Column("tag", String), Column("darken", Float), + Column("subset", String), ], create_table=True)) dt.store_chunk(pd.DataFrame([{ - "request_id": a.id, "n": a.n, "offset": a.offset, "tag": a.tag, "darken": a.darken, + "request_id": a.id, "n": a.n, "offset": a.offset, "tag": a.tag, + "darken": a.darken, "subset": a.subset, }])) - print(f"added request {a.id}: n={a.n} offset={a.offset} tag={a.tag} darken={a.darken}") + print(f"added request {a.id}: n={a.n} offset={a.offset} tag={a.tag} " + f"darken={a.darken} subset={a.subset}") print("now run: datapipe step --labels=stage=load run") return 0 From 91927e6a4288a97a2a4232e70f669973e4e3936a Mon Sep 17 00:00:00 2001 From: Shakirov Renat Date: Tue, 7 Jul 2026 10:21:11 +0300 Subject: [PATCH 02/18] detection_tags: split demo data synthesis out of the pipeline Move all COCO/demo-only code (constants, download+cache, gamma darkening) into a dedicated detection/coco_demo.py (CocoDemoSource + darken). steps.load_batch is now source-agnostic plumbing: it pulls (bytes, boxes, labels) from the source and lays them into the pipeline tables. For real data you replace one file (coco_demo.py); steps.py/app.py are untouched. Co-Authored-By: Claude Opus 4.8 --- .../detection_tags/detection/coco_demo.py | 105 +++++++++++++++++ examples/detection_tags/detection/steps.py | 108 ++---------------- 2 files changed, 115 insertions(+), 98 deletions(-) create mode 100644 examples/detection_tags/detection/coco_demo.py diff --git a/examples/detection_tags/detection/coco_demo.py b/examples/detection_tags/detection/coco_demo.py new file mode 100644 index 00000000..fd24eb2b --- /dev/null +++ b/examples/detection_tags/detection/coco_demo.py @@ -0,0 +1,105 @@ +"""DEMO DATA SYNTHESIS — COCO cat/dog (replace this module for real data). + +Everything here exists only to fabricate the demo dataset: download the COCO cat/dog subset, inject +ground truth, and darken images to fake a low-light "night" scenario. None of it is part of the tag +pipeline itself — for REAL data, drop this module and feed the `load` step from your own source of +(image bytes, boxes, labels). The pipeline (steps.py / app.py) doesn't care where images come from. +""" +from __future__ import annotations + +import io +import json +import os +import random +import time +import zipfile +from pathlib import Path +from typing import Optional + +import numpy as np +import requests +from PIL import Image + +from config import COCO_CAT_IDS + +COCO_IMG_BASE = "http://images.cocodataset.org/train2017/" +COCO_ANN_URL = "http://images.cocodataset.org/annotations/annotations_trainval2017.zip" +CACHE = Path(os.environ.get("DATAPIPE_TAGS_CACHE_DIR", "/tmp/datapipe-tags-cache")) +RNG_SEED = 1234 + + +def _get(url: str, attempts: int = 4) -> requests.Response: + last: Optional[Exception] = None + for a in range(attempts): + try: + r = requests.get(url, timeout=60, stream=True) + r.raise_for_status() + return r + except requests.RequestException as e: + last = e + time.sleep(min(2 ** a, 20)) + assert last is not None + raise last + + +def _coco_annotations_by_image() -> tuple[dict, dict]: + """Return (id_to_image_meta, {image_id: [cat/dog annotations]}), cached on disk.""" + CACHE.mkdir(parents=True, exist_ok=True) + zip_path = CACHE / "annotations_trainval2017.zip" + if not zip_path.exists() or zip_path.stat().st_size < 1_000_000: + with _get(COCO_ANN_URL) as r, open(zip_path, "wb") as f: + for chunk in r.iter_content(1 << 20): + f.write(chunk) + with zipfile.ZipFile(zip_path) as zf, zf.open("annotations/instances_train2017.json") as h: + inst = json.load(h) + id_to_img = {im["id"]: im for im in inst["images"]} + anns: dict[int, list] = {} + for a in inst["annotations"]: + if a.get("category_id") in COCO_CAT_IDS and not a.get("iscrowd", 0) and a.get("bbox"): + anns.setdefault(a["image_id"], []).append(a) + return id_to_img, anns + + +def darken(raw: bytes, gamma: float) -> bytes: + """Gamma-darken JPEG bytes to fake a low-light scene (gamma < 1 darkens). Demo-only.""" + a = np.asarray(Image.open(io.BytesIO(raw)).convert("RGB")).astype(np.float32) / 255.0 + out = Image.fromarray((np.power(a, 1.0 / gamma) * 255).clip(0, 255).astype(np.uint8)) + buf = io.BytesIO() + out.save(buf, format="JPEG", quality=92) + return buf.getvalue() + + +class CocoDemoSource: + """Deterministic shuffled pool of COCO cat/dog filenames + per-file (bytes, boxes, labels). + + Prefers a pre-staged cache (`$DATAPIPE_TAGS_CACHE_DIR/gt.json` + `images/`) so loads are fast + and offline; falls back to fetching from COCO. Order is a fixed shuffle (RNG_SEED) so `offset`/`n` + slices are reproducible across runs. + """ + + def __init__(self) -> None: + cache_gt_path = CACHE / "gt.json" + self._use_cache = cache_gt_path.exists() and (CACHE / "images").is_dir() + if self._use_cache: + self._cache_gt = json.loads(cache_gt_path.read_text()) + pool = sorted(self._cache_gt.keys()) + else: + self._id_to_img, self._anns = _coco_annotations_by_image() + pool = [self._id_to_img[i]["file_name"] for i in sorted(self._anns.keys())] + self._fn_to_id = {self._id_to_img[i]["file_name"]: i for i in self._anns.keys()} + random.seed(RNG_SEED) + random.shuffle(pool) + self.pool = pool + + def fetch(self, fn: str) -> tuple[bytes, list, list]: + """Return (image_bytes, bboxes[[x1,y1,x2,y2]], labels[lowercase]) for a pool filename.""" + if self._use_cache: + data = (CACHE / "images" / fn).read_bytes() + g = self._cache_gt[fn] + return data, g["bboxes"], g["labels"] + raw = _get(COCO_IMG_BASE + fn).content + anns = self._anns[self._fn_to_id[fn]] + boxes = [[int(a["bbox"][0]), int(a["bbox"][1]), + int(a["bbox"][0] + a["bbox"][2]), int(a["bbox"][1] + a["bbox"][3])] for a in anns] + labels = [COCO_CAT_IDS[a["category_id"]] for a in anns] + return raw, boxes, labels diff --git a/examples/detection_tags/detection/steps.py b/examples/detection_tags/detection/steps.py index f61ad680..8b927fdf 100644 --- a/examples/detection_tags/detection/steps.py +++ b/examples/detection_tags/detection/steps.py @@ -1,24 +1,14 @@ from __future__ import annotations -import io -import json import os -import random -import time -import zipfile -from pathlib import Path -from typing import Optional import fsspec import numpy as np import pandas as pd -import requests from datapipe_ml.core.image_data import convert_df_with_bbox_to_df_with_image_data -from PIL import Image +from coco_demo import CocoDemoSource, darken as demo_darken from config import ( - COCO_CAT_IDS, - DBCONN, LOCAL_IMAGES_DIR, input_bucket, input_image_url, @@ -27,55 +17,12 @@ tag_name_for, ) -COCO_IMG_BASE = "http://images.cocodataset.org/train2017/" -COCO_ANN_URL = "http://images.cocodataset.org/annotations/annotations_trainval2017.zip" -CACHE = Path(os.environ.get("DATAPIPE_TAGS_CACHE_DIR", "/tmp/datapipe-tags-cache")) -RNG_SEED = 1234 - - -# --- COCO helpers --------------------------------------------------------------- -def _get(url: str, attempts: int = 4) -> requests.Response: - last: Optional[Exception] = None - for a in range(attempts): - try: - r = requests.get(url, timeout=60, stream=True) - r.raise_for_status() - return r - except requests.RequestException as e: - last = e - time.sleep(min(2 ** a, 20)) - assert last is not None - raise last - - -def _coco_annotations_by_image() -> tuple[dict, dict]: - """Return (id_to_image_meta, {image_id: [cat/dog annotations]}), cached on disk.""" - CACHE.mkdir(parents=True, exist_ok=True) - zip_path = CACHE / "annotations_trainval2017.zip" - if not zip_path.exists() or zip_path.stat().st_size < 1_000_000: - with _get(COCO_ANN_URL) as r, open(zip_path, "wb") as f: - for chunk in r.iter_content(1 << 20): - f.write(chunk) - with zipfile.ZipFile(zip_path) as zf, zf.open("annotations/instances_train2017.json") as h: - inst = json.load(h) - id_to_img = {im["id"]: im for im in inst["images"]} - anns: dict[int, list] = {} - for a in inst["annotations"]: - if a.get("category_id") in COCO_CAT_IDS and not a.get("iscrowd", 0) and a.get("bbox"): - anns.setdefault(a["image_id"], []).append(a) - return id_to_img, anns - - -def _darken(im: Image.Image, gamma: float) -> Image.Image: - a = np.asarray(im.convert("RGB")).astype(np.float32) / 255.0 - return Image.fromarray((np.power(a, 1.0 / gamma) * 255).clip(0, 255).astype(np.uint8)) - - -# --- load step ------------------------------------------------------------------ +# --- load step (demo: pulls images/GT from coco_demo; swap that module for real data) ----------- def load_batch(df_request: pd.DataFrame): - """For each load_request row: download COCO cat/dog images, upload to object storage, and - return (s3_images, image__ground_truth, tag, image__tag). Ground truth uses lowercase COCO - labels; image_name is the object basename (what a listing would produce).""" + """For each load_request row: pull images + ground truth from the demo source (coco_demo), + optionally darken (a tagged scenario), upload to object storage, and return (s3_images, + image__ground_truth, tag, image__tag, image__subset_hint). image_name is the object basename. + For REAL data, replace coco_demo — this step itself is source-agnostic plumbing.""" s3_cols = ["image_name", "image_url"] gt_cols = ["image_name", "bboxes", "labels"] tag_cols = ["tag_id", "tag_name", "tag_description"] @@ -86,43 +33,10 @@ def load_batch(df_request: pd.DataFrame): pd.DataFrame(columns=tag_cols), pd.DataFrame(columns=it_cols), pd.DataFrame(columns=hint_cols)) - # Prefer a pre-staged local cache (fast, no COCO): CACHE/images/ + CACHE/gt.json. - # Download the cache once on a fast machine and copy it here — avoids per-image COCO fetches. - cache_gt_path = CACHE / "gt.json" - use_cache = cache_gt_path.exists() and (CACHE / "images").is_dir() - if use_cache: - cache_gt = json.loads(cache_gt_path.read_text()) - pool = sorted(cache_gt.keys()) # deterministic order - random.seed(RNG_SEED) - random.shuffle(pool) - anns = None - else: - id_to_img, anns = _coco_annotations_by_image() - by_id = sorted(anns.keys()) - random.seed(RNG_SEED) - random.shuffle(by_id) - pool = [id_to_img[i]["file_name"] for i in by_id] # file names, same order semantics - + source = CocoDemoSource() # demo data (COCO cat/dog); for real data swap coco_demo.py fs = fsspec.filesystem("s3", **input_storage_options()) bucket = input_bucket() - def raw_bytes_and_gt(fn: str): - if use_cache: - data = (CACHE / "images" / fn).read_bytes() - g = cache_gt[fn] - return data, g["bboxes"], g["labels"] - # COCO fallback - # map filename back to id via anns lookup (filename -> id): rebuild once - raw = _get(COCO_IMG_BASE + fn).content - iid = _fn_to_id[fn] - boxes = [[int(a["bbox"][0]), int(a["bbox"][1]), - int(a["bbox"][0] + a["bbox"][2]), int(a["bbox"][1] + a["bbox"][3])] for a in anns[iid]] - labels = [COCO_CAT_IDS[a["category_id"]] for a in anns[iid]] - return raw, boxes, labels - - if not use_cache: - _fn_to_id = {id_to_img[i]["file_name"]: i for i in anns.keys()} - s3_rows, gt_rows, tag_rows, tag_defs, hint_rows = [], [], [], {}, [] for _, req in df_request.iterrows(): n = int(req["n"]) @@ -136,14 +50,12 @@ def raw_bytes_and_gt(fn: str): subset = None if pd.isna(subset) or str(subset) == "" else str(subset) darken = req.get("darken") darken = None if pd.isna(darken) or str(darken) == "" else float(darken) - for fn in pool[offset: offset + n]: + for fn in source.pool[offset: offset + n]: stem, ext = os.path.splitext(fn) - raw, boxes, labels = raw_bytes_and_gt(fn) + raw, boxes, labels = source.fetch(fn) if darken is not None: name = f"{stem}__{tag or 'dark'}{ext}" - buf = io.BytesIO() - _darken(Image.open(io.BytesIO(raw)), darken).save(buf, format="JPEG", quality=92) - data = buf.getvalue() + data = demo_darken(raw, darken) else: name, data = fn, raw fs.pipe(f"{bucket}/images/{name}", data) From 035c5e03815086a7fbd0846e554b644373a47ca9 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Wed, 8 Jul 2026 17:34:09 +0000 Subject: [PATCH 03/18] detection_tags skill: demo flow runs under datapipe-app UI (setup+load+verify; training triggered from the front) --- .claude/skills/setup-detection-tags/SKILL.md | 107 +++++++++++++------ 1 file changed, 76 insertions(+), 31 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 088b899b..0a445f96 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -3,9 +3,10 @@ name: setup-detection-tags description: > Use when setting up or running examples/detection_tags — a self-contained datapipe detection demo built around tags (per-scenario metrics), split into two parts around a checkpoint (train a - baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), with a - FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged batch, retrain, - watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. + baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), served under the + datapipe-app UI front (graph + observability + the detection_tags_yolo ops-spec; training triggered + from the UI) with a FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged + batch, retrain, watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. --- # detection_tags (tags demo — two-part, FiftyOne, no Label Studio) @@ -29,6 +30,15 @@ and present/rehearse part 2 (the retraining) as often as you like: the tagged TRAIN batch `night-train` → retrain **model B** → show the metrics again: `night` recall rises from A to B. Rehearse by resetting to the checkpoint. +> **Training runs on the UI side (integrated datapipe-app setup).** This skill **sets everything up +> itself**: it deploys the stack, checks prerequisites (`uv`, `docker compose`, GPU), loads the data, +> and **verifies the data is in the pipe** — then **stops**. It does **not** run training. **You +> trigger each training run yourself from the datapipe-app front** (the pipeline graph's +> `stage=train` steps, port 8000): model A in part 1, then — after the skill tops up `night-train` — +> model B in part 2. The `datapipe step --labels=stage=train run` commands below are the +> standalone/CLI equivalent for a no-UI setup; in the UI setup you (the human) press run in the front +> instead. + ## Ask first — don't assume (only the unresolved) 1. **Demo (test) or real data?** — the whole flow branches on this (see "Real data" at the end). @@ -103,37 +113,57 @@ cd detection datapipe db create-all ``` -## Part 1 — baseline to checkpoint +Then bring up the **datapipe-app UI front** — it serves the pipeline graph, the observability panels +(training status/curves + the `detection_tags_yolo` ops-spec with the `model_metrics` and `tag_metrics` +tables), and the **run triggers** you use to launch training: + +```bash +# from examples/detection_tags/detection, .env sourced; run it under tmux/nohup so it survives ssh drops +datapipe --pipeline app api --host 127.0.0.1 --port 8000 +``` + +Bind to `127.0.0.1` (not `0.0.0.0`) and reach it over an SSH tunnel `-L 8000:localhost:8000`; open +`http://localhost:8000`. The `app.add_specs([...])` block in `detection/app.py` is what registers the +`detection_tags_yolo` spec the front renders. -Run `stage=train` as ONE step (it internally does split→freeze→train→inference); surface each stage -from its log and by querying the tables after — do NOT invoke `stage=train-prepare` separately before -`stage=train`, or the intermediate re-freeze retrains the model twice (see Troubleshooting). +## Part 1 — set up + load + verify, then STOP (you trigger model-A training from the UI) + +The skill's job in part 1: load the baseline data (val frozen up front) and **verify it's in the +pipe** — then stop. Training is **yours to trigger from the datapipe-app front** (port 8000). ```bash -# from examples/detection_tags/detection, with .env sourced +# SKILL DOES — from examples/detection_tags/detection, with .env sourced: python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 datapipe step --labels=stage=load run # 450 images; val frozen (100 base + 25 night) -# show the frozen split: SELECT subset_id, count(*) FROM image__subset_hint GROUP BY subset_id -datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference (SHOW every epoch) -datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics -# count-metrics can print "Batches to process 0" right after training (it hasn't seen the fresh -# predictions yet) — RE-RUN it once; then the tables fill. (See Troubleshooting.) +# VERIFY the data is in the pipe before handing off: +# SELECT subset_id, count(*) FROM image__subset_hint GROUP BY subset_id -- expect train=325, val=125 +# SELECT count(*) FROM image__ground_truth -- expect 450 +``` -# SHOW THE FULL TABLES (see the Rule below). To rehearse part 2 later, snapshot the post-A state -# BEFORE the fiftyone stage (demo-only convenience; skip for real use): -docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql +**Stop here and hand off.** You now trigger **model-A training from the datapipe-app front** (port +8000) — the `stage=train` steps in the graph (split→freeze→train→inference). Watch it in the +observability panels (training status/curves). When it finishes, compute metrics + the FiftyOne view +(from the UI, or the CLI equivalents): +```bash +# CLI equivalent (no-UI) of what you trigger in the front: +datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference +datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics +# count-metrics can print "Batches to process 0" right after training — RE-RUN it once. (Troubleshooting.) datapipe step --labels=stage=fiftyone run # download_images -> GT + model-A predictions +# (demo-only) snapshot the post-A state to rehearse part 2 later: +docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql ``` -**Stop here (end of stage 1) and hand the baseline over to the user:** -- show the full training log (all epochs) and the **full** metric tables (`metrics_on_subset` + - `tag_metrics`) — `tag_metrics` for model A at `night/val` is **low** (baseline blind in the dark); -- bring up the **FiftyOne App** service so they can browse GT vs model-A predictions, and give them - its address / how to reach it (see "Let the user watch" — specifics depend on the setup); +**After model A, hand the baseline over:** +- show the **full** metric tables (`model_metrics` / `metrics_on_subset` + `tag_metrics`) — in the + front's `detection_tags_yolo` spec or via the RULE query below; `tag_metrics` for model A at + `night/val` is **low** (baseline blind in the dark); +- point the user at the **datapipe-app front** (graph + observability + the two metric tables) and the + **FiftyOne App** (GT vs model-A predictions) — give the addresses / tunnels (see "Let the user watch"); - then ask whether to proceed to part 2 (retrain). That's the problem part 2 fixes. Surface every epoch from the training log (it streams to a file, e.g. `/tmp/train_A.log`): @@ -142,20 +172,31 @@ grep -oE "[0-9]+/[0-9]+ +[0-9.]+G +[0-9.]+ +[0-9.]+ +[0-9.]+" /tmp/train_A.log grep -E "^ +all +[0-9]+ +[0-9]+" /tmp/train_A.log # per-epoch val P/R/mAP50/mAP50-95 ``` -## Part 2 — retrain and watch the tag metric rise +## Part 2 — skill tops up the tagged batch, then you retrain model B from the UI + +The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retrain from the front**. ```bash +# SKILL DOES — add the tagged TRAIN batch and load it (val stays frozen): python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 datapipe step --labels=stage=load run # 500 images total -datapipe step --labels=stage=train run # split (night -> TRAIN, val UNCHANGED) + train model B (SHOW every epoch) -# verify val stayed frozen after the split: -# SELECT subset_id, count(*) FILTER (WHERE image_name LIKE '%night%') night, count(*) total -# FROM image__subset s JOIN image__ground_truth USING(image_name) GROUP BY subset_id +# VERIFY val stayed frozen (night went to TRAIN only): +# SELECT h.subset_id, count(*) FROM image__tag it JOIN tag t USING(tag_id) +# JOIN image__subset_hint h USING(image_name) WHERE t.tag_name='night' GROUP BY h.subset_id +# -- expect train=50, val=25 +``` + +**Stop here and hand off — you trigger model-B training from the datapipe-app front** (`stage=train`; +night is now in TRAIN, val unchanged). Then metrics + FiftyOne (front or CLI equivalent): + +```bash +datapipe step --labels=stage=train run # model B (night in training) datapipe step --labels=stage=count-metrics run # re-run if "0 batches" datapipe step --labels=stage=fiftyone run # adds predictions_model_b ``` -`night/val` recall rises from model A to model B — the payoff. Show the full tables again. +`night/val` recall rises from model A to model B — the payoff. Show the full tables again (in the +front's `detection_tags_yolo` metrics tables, or the RULE query below). ## Rehearse part 2 from the snapshot (demo-only) @@ -188,12 +229,16 @@ The night/val set is small (25 images), so treat the rise as **directional**. ## Let the user watch (offer it — work out the specifics per setup) -The user can watch three things; make them available and hand over whatever access they need — don't -prescribe fixed commands here and don't leave a committed file behind (it would bake in one machine's -host/ports/paths and mislead on the next). Compute the specifics for the ACTUAL setup at runtime -(local vs remote host, which ports are free, tunnels if remote) and give the user the commands +The user watches (and drives) several things; make them available and hand over whatever access they +need — don't prescribe fixed commands here and don't leave a committed file behind (it would bake in +one machine's host/ports/paths and mislead on the next). Compute the specifics for the ACTUAL setup at +runtime (local vs remote host, which ports are free, tunnels if remote) and give the user the commands directly in chat: +- **the datapipe-app front** (`datapipe --pipeline app api --host 127.0.0.1 --port 8000`, tunnel 8000) + — the pipeline graph, observability panels (training status/curves), the `detection_tags_yolo` + ops-spec with the `model_metrics` + `tag_metrics` tables, and the **run triggers** the user presses + to launch model A / model B. This is the primary surface in the UI setup. - **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `tag_metrics`, `detection_model_train__metrics_on_subset`, `detection_training_status`. - **images** in the FiftyOne App: `ground_truth` vs `predictions_model_a` vs `predictions_model_b`, From 813b4f06c1d1df291bc93b5720288646f93d604c Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Wed, 8 Jul 2026 18:19:38 +0000 Subject: [PATCH 04/18] =?UTF-8?q?detection=5Ftags:=20tag=5Fid=20is=20the?= =?UTF-8?q?=20tag=20name=20(text)=20+=20tag=5Fdescription=20=E2=80=94=20dr?= =?UTF-8?q?op=20numeric=20surrogate/tag=5Fname?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/setup-detection-tags/SKILL.md | 7 +++---- examples/detection_tags/detection/config.py | 16 ++-------------- examples/detection_tags/detection/data.py | 9 ++++----- examples/detection_tags/detection/steps.py | 19 ++++++++----------- 4 files changed, 17 insertions(+), 34 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 0a445f96..8dd67c06 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -217,12 +217,11 @@ When you show metrics, dump the **whole** table, not a truncated view. Both of t docker exec psql -U postgres -x -c \ "SELECT * FROM $DB_SCHEMA.detection_model_train__metrics_on_subset ORDER BY detection_model_id, subset_id" docker exec psql -U postgres -x -c \ - "SELECT tm.*, t.tag_name FROM $DB_SCHEMA.tag_metrics tm JOIN $DB_SCHEMA.tag t USING(tag_id) \ - ORDER BY tm.detection_model_id, tm.tag_id, tm.subset_id" + "SELECT * FROM $DB_SCHEMA.tag_metrics ORDER BY detection_model_id, tag_id, subset_id" ``` -`tag_id` is a numeric surrogate key (deterministic map in `config.TAG_IDS`, e.g. `night`→1); the -`tag` dimension holds `tag_name`/`tag_description`, so join it to show the readable name. +`tag_id` **is the tag name itself** (text, e.g. `night`) — no numeric surrogate, no join needed. The +`tag` dimension is two columns: `tag_id` (name) + `tag_description` (readable, notes darkening). The payoff comparison: `tag_metrics` at `tag=night, subset=val`, model A vs model B — recall rises. The night/val set is small (25 images), so treat the rise as **directional**. diff --git a/examples/detection_tags/detection/config.py b/examples/detection_tags/detection/config.py index 610295fe..24272055 100644 --- a/examples/detection_tags/detection/config.py +++ b/examples/detection_tags/detection/config.py @@ -22,20 +22,8 @@ COCO_CAT_IDS = {17: "cat", 18: "dog"} # COCO category_id -> class name # --- tags ----------------------------------------------------------------------- -# Numeric tag ids must be DETERMINISTIC (datapipe re-runs), so map known tag names to -# fixed ids; unknown names fall back to a stable crc32-derived number. -import zlib # noqa: E402 - -TAG_IDS = {"night": 1} -TAG_NAMES = {v: k for k, v in TAG_IDS.items()} - - -def tag_id_for(name: str) -> int: - return TAG_IDS.get(name) or (zlib.crc32(name.encode()) % 100000) - - -def tag_name_for(tag_id) -> str: - return TAG_NAMES.get(tag_id, str(tag_id)) +# tag_id is the human-readable tag NAME itself (text). Two columns only: (tag_id, tag_description). +# No numeric surrogate / separate tag_name — the UI shows the tag by name directly. # --- single storage root -------------------------------------------------------- # Input images live under /images; the pipeline working_dir under /datapipe diff --git a/examples/detection_tags/detection/data.py b/examples/detection_tags/detection/data.py index 75834806..81db064f 100644 --- a/examples/detection_tags/detection/data.py +++ b/examples/detection_tags/detection/data.py @@ -65,15 +65,14 @@ def _fo(field, additional_info_keys_in_sample=()): Column("subset_id", String), ]), # --- tags ------------------------------------------------------------- - # tag dimension: numeric tag_id (surrogate key), tag_name (slug), tag_description (readable) + # tag dimension: tag_id is the tag NAME itself (text) + a readable description (two columns) "tag": _t("tag", [ - Column("tag_id", Integer, primary_key=True), - Column("tag_name", String), + Column("tag_id", String, primary_key=True), Column("tag_description", String), ]), "image__tag": _t("image__tag", [ Column("image_name", String, primary_key=True), - Column("tag_id", Integer, primary_key=True), + Column("tag_id", String, primary_key=True), ]), # per-image metrics produced by the CountMetrics step (declared so the # tag-metrics transform can read it as an input) @@ -90,7 +89,7 @@ def _fo(field, additional_info_keys_in_sample=()): # per-(model, tag, subset) metrics — the tag arc lives here "tag_metrics": _t("tag_metrics", [ Column("detection_model_id", String, primary_key=True), - Column("tag_id", Integer, primary_key=True), + Column("tag_id", String, primary_key=True), Column("subset_id", String, primary_key=True), Column("calc__images_support", Integer), Column("calc__support", Integer), diff --git a/examples/detection_tags/detection/steps.py b/examples/detection_tags/detection/steps.py index 7eec59cb..3136cdde 100644 --- a/examples/detection_tags/detection/steps.py +++ b/examples/detection_tags/detection/steps.py @@ -13,8 +13,6 @@ input_bucket, input_image_url, input_storage_options, - tag_id_for, - tag_name_for, ) # --- load step (demo: pulls images/GT from coco_demo; swap that module for real data) ----------- @@ -25,7 +23,7 @@ def load_batch(df_request: pd.DataFrame): For REAL data, replace coco_demo — this step itself is source-agnostic plumbing.""" s3_cols = ["image_name", "image_url"] gt_cols = ["image_name", "bboxes", "labels"] - tag_cols = ["tag_id", "tag_name", "tag_description"] + tag_cols = ["tag_id", "tag_description"] it_cols = ["image_name", "tag_id"] hint_cols = ["image_name", "subset_id"] if df_request.empty: @@ -62,19 +60,18 @@ def load_batch(df_request: pd.DataFrame): s3_rows.append({"image_name": name, "image_url": input_image_url(name)}) gt_rows.append({"image_name": name, "bboxes": boxes, "labels": labels}) if tag: - tid = tag_id_for(tag) - tag_rows.append({"image_name": name, "tag_id": tid}) - # tag_defs[name] = (numeric id, readable description); note darkening if any + tag_rows.append({"image_name": name, "tag_id": tag}) + # tag_defs[name] = readable description; note darkening if any desc = tag if darken is None else f"{tag} (low-light, gamma {darken})" - tag_defs[tag] = (tid, desc) + tag_defs[tag] = desc if subset: hint_rows.append({"image_name": name, "subset_id": subset}) return ( pd.DataFrame(s3_rows, columns=s3_cols), pd.DataFrame(gt_rows, columns=gt_cols), - pd.DataFrame([{"tag_id": tid, "tag_name": nm, "tag_description": d} - for nm, (tid, d) in tag_defs.items()], columns=tag_cols), + pd.DataFrame([{"tag_id": nm, "tag_description": d} + for nm, d in tag_defs.items()], columns=tag_cols), pd.DataFrame(tag_rows, columns=it_cols), pd.DataFrame(hint_rows, columns=hint_cols), ) @@ -166,10 +163,10 @@ def publish_gt_to_fiftyone(images_df: pd.DataFrame, gt_df: pd.DataFrame, subset_ if not tag_df.empty else {}) for _, row in df.iterrows(): tid = tagid_by_image.get(row[pk]) - # FiftyOne sample fields must be strings; write the tag NAME (not the numeric id) + # tag_id is already the readable tag name (text), so write it straight to the sample field row["image_data"].additional_info = { "subset": subset_by_image.get(row[pk]) or "none", - "tag": tag_name_for(tid) if tid is not None else "none", + "tag": tid if tid is not None else "none", } return df From 3a259942729122cb3836743bbaefe3c25692a296 Mon Sep 17 00:00:00 2001 From: Aleksandr Kozlov Date: Thu, 9 Jul 2026 03:01:01 +0200 Subject: [PATCH 05/18] fix pipeline, version1 --- .claude/skills/datapipe-examples/SKILL.md | 2 +- .claude/skills/setup-detection-tags/SKILL.md | 102 +++++--- .claude/skills/setup-e2e-template/SKILL.md | 5 +- examples/detection_tags/.env.example | 6 +- examples/detection_tags/README.md | 21 +- examples/detection_tags/detection/app.py | 232 +++++++++++++++---- examples/detection_tags/detection/config.py | 11 +- examples/detection_tags/detection/data.py | 58 ++--- examples/detection_tags/detection/steps.py | 122 ++++++---- examples/detection_tags/docker-compose.yml | 38 ++- examples/detection_tags/pyproject.toml | 7 +- 11 files changed, 418 insertions(+), 186 deletions(-) diff --git a/.claude/skills/datapipe-examples/SKILL.md b/.claude/skills/datapipe-examples/SKILL.md index 7e43b7c7..0f120d9b 100644 --- a/.claude/skills/datapipe-examples/SKILL.md +++ b/.claude/skills/datapipe-examples/SKILL.md @@ -18,7 +18,7 @@ Each `examples/*` pipeline has a dedicated setup skill — pick by what it does: | `e2e_template/image_detection` | YOLO detection + Label Studio human-in-the-loop → train → FiftyOne | **setup-e2e-template** | | `e2e_template/image_keypoints` | YOLO-pose keypoints + Label Studio → train → FiftyOne | **setup-e2e-template** | | `sam_cvat` | SAM3 text-prompt boxes+masks → CVAT pre-annotations | **setup-sam-cvat** | -| `detection_tags` | YOLO detection + **tags** (per-scenario metrics), no Label Studio / FiftyOne, GT injected | **setup-detection-tags** | +| `detection_tags` | YOLO detection + **tags** (per-scenario metrics), injected GT, FiftyOne A/B view | **setup-detection-tags** | ## Ask first — don't assume (only the unresolved) Clarify what's not obvious before acting — don't spin up services or pull data you don't need. Ask only the unresolved: diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 8dd67c06..71e94996 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -12,8 +12,10 @@ description: > # detection_tags (tags demo — two-part, FiftyOne, no Label Studio) Detection pipeline whose whole point is **tags**: train a baseline (model A), then add a **tagged -scenario TRAIN batch** and retrain (model B), and watch recall on that tag rise in a `tag_metrics` -table. Ground truth is **injected** (COCO labels, lowercase `cat`/`dog`) — no human annotation. +scenario TRAIN batch** and retrain (model B), and watch recall on that tag rise in +`pipeline_model__metrics_by_tag_on_subset`. Ground truth is **injected** (COCO cat/dog via +`coco_demo`, lowercase labels) — no Label Studio. Metrics use two **`CountMetrics_Subset_PipelineModel`** +steps (subset + tag arc); ops-spec id **`detection_tags_yolo`**. The two-part / checkpoint split below is a **presentation device for the live demo only** — it lets you prep part 1 ahead of time, present part 2, and rehearse it. It is NOT required to use the pipeline: @@ -103,8 +105,9 @@ port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), d ```bash cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI -docker compose up -d # postgres + minio + mongo (mongo is for FiftyOne). No Label Studio. -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif +mkdir -p .docker-data/minio +HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151). No Label Studio. +uv sync # cu124 torch + datapipe-ml[torch,fiftyone] (+ pi-heif if needed) # On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection @@ -114,8 +117,9 @@ datapipe db create-all ``` Then bring up the **datapipe-app UI front** — it serves the pipeline graph, the observability panels -(training status/curves + the `detection_tags_yolo` ops-spec with the `model_metrics` and `tag_metrics` -tables), and the **run triggers** you use to launch training: +(training status/curves + the `detection_tags_yolo` ops-spec with `model_metrics`, +`tag_metrics_on_subset`, and the two **class_metrics** tables), and the **run triggers** you use to +launch training: ```bash # from examples/detection_tags/detection, .env sourced; run it under tmux/nohup so it survives ssh drops @@ -151,17 +155,19 @@ observability panels (training status/curves). When it finishes, compute metrics ```bash # CLI equivalent (no-UI) of what you trigger in the front: datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference -datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics +datapipe step --labels=stage=count-metrics run # subset metrics + tag metrics (two PipelineModel steps) # count-metrics can print "Batches to process 0" right after training — RE-RUN it once. (Troubleshooting.) -datapipe step --labels=stage=fiftyone run # download_images -> GT + model-A predictions +datapipe step --labels=stage=fiftyone run # download → images → annotations → model_a → model_b # (demo-only) snapshot the post-A state to rehearse part 2 later: docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql ``` **After model A, hand the baseline over:** -- show the **full** metric tables (`model_metrics` / `metrics_on_subset` + `tag_metrics`) — in the - front's `detection_tags_yolo` spec or via the RULE query below; `tag_metrics` for model A at - `night/val` is **low** (baseline blind in the dark); +- show the **full** metric tables (`model_metrics` → `pipeline_model__metrics_on_subset`; + `tag_metrics_on_subset` → `pipeline_model__metrics_by_tag_on_subset`; plus class tables + `pipeline_model__metrics_by_cls_on_subset` / `pipeline_model__metrics_by_tag_by_cls_on_subset`) + — in the front's `detection_tags_yolo` spec or via the RULE query below; `tag_id=night, subset_id=val` + recall for model A is **low** (baseline blind in the dark); - point the user at the **datapipe-app front** (graph + observability + the two metric tables) and the **FiftyOne App** (GT vs model-A predictions) — give the addresses / tunnels (see "Let the user watch"); - then ask whether to proceed to part 2 (retrain). That's the problem part 2 fixes. @@ -181,8 +187,8 @@ The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retr python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 datapipe step --labels=stage=load run # 500 images total # VERIFY val stayed frozen (night went to TRAIN only): -# SELECT h.subset_id, count(*) FROM image__tag it JOIN tag t USING(tag_id) -# JOIN image__subset_hint h USING(image_name) WHERE t.tag_name='night' GROUP BY h.subset_id +# SELECT h.subset_id, count(*) FROM image__tag it +# JOIN image__subset_hint h USING(image_name) WHERE it.tag_id='night' GROUP BY h.subset_id # -- expect train=50, val=25 ``` @@ -215,15 +221,17 @@ When you show metrics, dump the **whole** table, not a truncated view. Both of t ```bash docker exec psql -U postgres -x -c \ - "SELECT * FROM $DB_SCHEMA.detection_model_train__metrics_on_subset ORDER BY detection_model_id, subset_id" + "SELECT * FROM $DB_SCHEMA.pipeline_model__metrics_on_subset ORDER BY detection_model_id, subset_id" docker exec psql -U postgres -x -c \ - "SELECT * FROM $DB_SCHEMA.tag_metrics ORDER BY detection_model_id, tag_id, subset_id" + "SELECT * FROM $DB_SCHEMA.pipeline_model__metrics_by_tag_on_subset ORDER BY detection_model_id, tag_id, subset_id" ``` `tag_id` **is the tag name itself** (text, e.g. `night`) — no numeric surrogate, no join needed. The `tag` dimension is two columns: `tag_id` (name) + `tag_description` (readable, notes darkening). -The payoff comparison: `tag_metrics` at `tag=night, subset=val`, model A vs model B — recall rises. +The payoff comparison: `pipeline_model__metrics_by_tag_on_subset` at `tag_id=night, subset_id=val`, +model A vs model B — `calc__weighted_recall` / `calc__weighted_f1_score` rise. FindBestModel also uses +`calc__weighted_f1_score` on `pipeline_model__metrics_on_subset`. The night/val set is small (25 images), so treat the rise as **directional**. ## Let the user watch (offer it — work out the specifics per setup) @@ -236,12 +244,14 @@ directly in chat: - **the datapipe-app front** (`datapipe --pipeline app api --host 127.0.0.1 --port 8000`, tunnel 8000) — the pipeline graph, observability panels (training status/curves), the `detection_tags_yolo` - ops-spec with the `model_metrics` + `tag_metrics` tables, and the **run triggers** the user presses + ops-spec with `model_metrics` + `tag_metrics_on_subset` + **class_metrics** (`subset_class_metrics`, + `tag_class_metrics_on_subset`), and the **run triggers** the user presses to launch model A / model B. This is the primary surface in the UI setup. -- **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `tag_metrics`, - `detection_model_train__metrics_on_subset`, `detection_training_status`. -- **images** in the FiftyOne App: `ground_truth` vs `predictions_model_a` vs `predictions_model_b`, - filterable by `tag`/`subset`. +- **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `pipeline_model__metrics_on_subset`, + `pipeline_model__metrics_by_tag_on_subset`, `pipeline_model__metrics_by_cls_on_subset`, + `detection_training_status`. +- **images** in the FiftyOne App: `annotations` vs `predictions_model_a` vs `predictions_model_b`, + filterable by sample fields `tag_id` / `subset_id`. - **training progress**: the run streams to a log file — tail it; trust `detection_training_status.status`, not exit codes. @@ -255,21 +265,37 @@ different left-hand port rather than killing whatever holds it. ## FiftyOne -`stage=fiftyone` downloads images locally then publishes to one dataset (`FIFTYONE_DATASET_NAME`, -metadata in MongoDB): fields `ground_truth`, `predictions_model_a` (baseline), `predictions_model_b` -(retrained), plus sample fields `tag` and `subset`. Ported straight from -`examples/e2e_template/image_detection` (same `download_images` + `publish_to_fiftyone` + -`FiftyOneImagesDataTableStore`); the two model fields are assigned by sorted model-id (earliest = -`model_a`). Launch: `fiftyone app launch "$FIFTYONE_DATASET_NAME" --port 5151 --address 0.0.0.0`, -tunnel 5151 (local port MUST equal remote port — the App's WebSocket calls the same port). - -`tag` and `subset` are ordinary **sample fields** (set in-pipeline by `publish_gt_to_fiftyone`, no -scripts) — NOT FiftyOne's native "sample tags". Filter by the **fields** in the sidebar: pick -`tag = night` and `subset = val` — different fields AND together, so you get exactly the night-val -set. (Selecting multiple values inside FiftyOne's native TAGS panel ORs them, which is why we do NOT -mirror tag/subset into native tags.) That isolates where model A misses in the dark; after part 2, -`predictions_model_b` shows model B catching it. Fields stay `predictions_model_a` (baseline, -earliest model id) / `predictions_model_b` (retrained); the exact model ids are in the DB tables. +`stage=fiftyone` follows **`examples/e2e_template/image_detection`** (same step order), with an +A/B twist: baseline vs retrained predictions in one dataset (`FIFTYONE_DATASET_NAME`, metadata in +MongoDB). + +Pipeline steps (`detection/steps.py`): +1. `download_images` → `local_images` +2. `publish_to_fiftyone` → `fiftyone_images` (field `images`) +3. `publish_to_fiftyone_ground_truth` → `fiftyone_annotations` (field `annotations`; merges + `subset_id` + `tag_id` onto each sample) +4. `publish_to_fiftyone_predictions_baseline` → `fiftyone_predictions_model_a` (field + `predictions_model_a`; earliest `detection_model_id` → sample field `detection_model_id_a`) +5. `publish_to_fiftyone_predictions_retrained` → `fiftyone_predictions_model_b` (field + `predictions_model_b`; second model id → `detection_model_id_b`) + +Stores share one `fo_session` / dataset (`detection/data.py`). Separate `detection_model_id_a` / +`detection_model_id_b` sample fields avoid the two prediction stores clobbering each other. + +**App UI:** `docker compose up` starts **`fiftyone`** (`voxel51/fiftyone:1.17.0` on **:5151**), wired +to the same MongoDB. Open **http://localhost:5151** (remote → SSH tunnel `-L 5151:localhost:5151`). +Like e2e: run `mkdir -p .docker-data/minio` then +`HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d` so **minio** / **fiftyone** bind mounts +use the host uid (no root-owned files breaking the pipeline). The service bind-mounts +`DATAPIPE_TAGS_TMP_DIR` (default `/tmp/datapipe-tags`) read-only; local images go to +`$DATAPIPE_TAGS_TMP_DIR/local_images` (override with `LOCAL_IMAGES_DIR` if needed). +The pipeline still uses the **`fiftyone` Python lib** from `datapipe-ml[fiftyone]` to publish samples; +only the App server runs in Docker (no host `fiftyone app launch` needed). + +`tag_id` and `subset_id` are ordinary **sample fields** (from the GT publish merge) — NOT FiftyOne's +native "sample tags". Filter in the sidebar: `tag_id = night` AND `subset_id = val` (field filters, +not native TAGS OR-semantics). After part 2, `predictions_model_b` shows model B catching boxes model A +missed in the dark. ## How to work @@ -288,8 +314,8 @@ to a file + `grep`, not inline. then verify `python -c "import polars; print(polars.__version__)"` is the lts one. - **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. - **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated - the fresh predictions in the same pass. Re-run `count-metrics` once; then `metrics_on_image/subset` - and `tag_metrics` fill. + the fresh predictions in the same pass. Re-run `count-metrics` once; then `pipeline_model__metrics_*` + tables fill (subset + tag + class metrics). - **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` separately; the split between them changes `image__subset`, which re-freezes the dataset and retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. diff --git a/.claude/skills/setup-e2e-template/SKILL.md b/.claude/skills/setup-e2e-template/SKILL.md index 112cc961..e46f4c62 100644 --- a/.claude/skills/setup-e2e-template/SKILL.md +++ b/.claude/skills/setup-e2e-template/SKILL.md @@ -65,8 +65,9 @@ conventions, or the freeze join silently yields nothing / classes don't match:** ## Per-scenario tag metrics → see the dedicated example Want to tag a scenario (e.g. dark-room pallets), add it to training, and measure the model on that scenario separately (baseline vs retrained)? That lives as its own self-contained example — -`examples/detection_tags` (`tag`/`image__tag`/`tag_metrics` built into the pipeline, **no Label Studio -or FiftyOne**, ground truth injected). Use the **setup-detection-tags** skill. +`examples/detection_tags` (`tag`/`image__tag`, `CountMetrics_Subset_PipelineModel` tag arc, +**no Label Studio**, ground truth injected, **FiftyOne** baseline vs retrained). Use the +**setup-detection-tags** skill. ## Troubleshooting (may already be fixed — verify against current files) - **No model after `train`, exit 0** → datapipe swallows step errors; check `detection_training_status`, not the exit code. diff --git a/examples/detection_tags/.env.example b/examples/detection_tags/.env.example index a10f4deb..61ef224f 100644 --- a/examples/detection_tags/.env.example +++ b/examples/detection_tags/.env.example @@ -5,12 +5,14 @@ export S3_ENDPOINT_URL=http://localhost:9000 export FSSPEC_S3_ENDPOINT_URL="${S3_ENDPOINT_URL}" export S3_PUBLIC_URL=http://localhost:9000 export DATAPIPE_TAGS_DIR=s3://datapipe-tags +# Local cache for training artifacts and images downloaded for FiftyOne (mounted into compose fiftyone service) export DATAPIPE_TAGS_TMP_DIR=/tmp/datapipe-tags export DB_URL=postgresql://postgres:password@localhost:5432/postgres # default schema; set a dedicated one (e.g. datapipe_tags) only if you SHARE this Postgres with # other pipelines — then `db create-all` needs the schema created first (see README). export DB_SCHEMA=public -# FiftyOne (stage=fiftyone): dataset metadata in MongoDB, images rendered from local files +# FiftyOne (stage=fiftyone): metadata in MongoDB; App UI in docker compose (:5151) export FIFTYONE_DATABASE_URI=mongodb://localhost:27017 export FIFTYONE_DATASET_NAME=datapipe_detection_tags -export LOCAL_IMAGES_DIR=/tmp/datapipe-tags-fiftyone-images +# optional override; default is $DATAPIPE_TAGS_TMP_DIR/local_images (see detection/config.py) +# export LOCAL_IMAGES_DIR=/tmp/datapipe-tags/local_images diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 8c805639..1d5fc8f4 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -11,8 +11,9 @@ is split into **two parts around a checkpoint** so you can prep part 1 and rehea ## Deploy from scratch ```bash cp .env.example .env && set -a && source .env && set +a -docker compose up -d # postgres + minio + mongo (mongo backs FiftyOne) -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif +mkdir -p .docker-data/minio +HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151) +uv sync # cu124 torch + datapipe-ml[torch,fiftyone] # pre-AVX2 host only: force the lts polars to win (else training SIGILLs) uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection @@ -59,13 +60,15 @@ docker exec mongosh --quiet --eval "db.getSiblingDB('fiftyone').dropData ``` ## What you get -- `detection_model_train__metrics_on_subset` — overall metrics per (model, subset). -- **`tag_metrics`** — `(detection_model_id, tag_id, subset_id)` → precision/recall/f1. Compare model - A vs model B at `tag=night, subset=val`: recall rises once the tagged batch is in training. -- **FiftyOne** dataset `$FIFTYONE_DATASET_NAME`: `ground_truth`, `predictions_model_a`, - `predictions_model_b`, plus `tag`/`subset` sample fields. Launch: - `fiftyone app launch "$FIFTYONE_DATASET_NAME" --port 5151 --address 0.0.0.0` (tunnel that port if - remote — local port must equal the remote port; filter by the `tag`/`subset` fields). +- `pipeline_model__metrics_on_subset` — overall metrics per (model, subset). +- **`pipeline_model__metrics_by_tag_on_subset`** — per `(detection_model_id, tag_id, subset_id)`. + Compare model A vs B at `tag_id=night, subset_id=val`: weighted recall/F1 rise after retraining. +- Class tables: `pipeline_model__metrics_by_cls_on_subset`, `pipeline_model__metrics_by_tag_by_cls_on_subset`. +- **FiftyOne** dataset `$FIFTYONE_DATASET_NAME`: fields `annotations`, `predictions_model_a`, + `predictions_model_b`; sample fields `tag_id` / `subset_id`. After `stage=fiftyone`, open the App + from docker compose: **http://localhost:5151** (remote → SSH tunnel `-L 5151:localhost:5151`). + Compose mounts `DATAPIPE_TAGS_TMP_DIR` (default `/tmp/datapipe-tags`); local images land in + `$DATAPIPE_TAGS_TMP_DIR/local_images`. ### Pre-staged cache (fast loads) If `DATAPIPE_TAGS_CACHE_DIR/gt.json` + `DATAPIPE_TAGS_CACHE_DIR/images/.jpg` exist, the load diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index fb805b53..d5eee55e 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -3,11 +3,15 @@ from datapipe.compute import Pipeline from datapipe.datatable import DataStore from datapipe.step.batch_transform import BatchTransform +from datapipe.types import Required from datapipe_app import ( DatapipeApp, DatapipeOpsSpec, + OpsClassMetricTableSpec, OpsColumn, + OpsColumnGroup, OpsDataSpec, + OpsFilterRule, OpsFrozenDatasetSpec, OpsMetricTableSpec, OpsModelSpec, @@ -17,9 +21,9 @@ from datapipe_ml.metrics.model_selection import FindBestModel from datapipe_ml.tasks.detection.freeze import DetectionFreezeDataset from datapipe_ml.tasks.detection.inference import Inference_DetectionModel -from datapipe_ml.tasks.detection.metrics import CountMetrics_Subset_DetectionModel from datapipe_ml.tasks.detection.train.yolov8 import Train_YoloV8_DetectionModel, YoloV8_TrainingConfig from datapipe_ml.training.specs import TrainingResumeConfig, TrainingSyncConfig +from datapipe_ml.workflows.detection_classification.metrics import CountMetrics_Subset_PipelineModel import steps from config import DATAPIPE_DIR, DBCONN, datapipe_tmp_folder @@ -104,71 +108,105 @@ labels=[("stage", "train"), ("stage", "inference")], create_table=True, ), - CountMetrics_Subset_DetectionModel( + CountMetrics_Subset_PipelineModel( input__image__ground_truth="image__ground_truth", input__subset__has__image="image__subset", - input__detection_prediction="detection_prediction_train", - output__detection_model__metrics__on__image="detection_model_train__metrics_on_image", - output__detection_model__metrics__on__subset="detection_model_train__metrics_on_subset", + input__pipeline_prediction="detection_prediction_train", + output__pipeline_model__metrics_on__image="pipeline_model__metrics_on_image", + output__pipeline_model__metrics_by_cls_on__subset="pipeline_model__metrics_by_cls_on_subset", + output__pipeline_model__metrics_on__subset="pipeline_model__metrics_on_subset", primary_keys=["image_name"], bbox_id__name=None, + pipeline_model_primary_keys=["detection_model_id"], minimum_iou=0.5, labels=[("stage", "train"), ("stage", "count-metrics")], create_table=True, ), FindBestModel( input__model="detection_model_train", - input__model__metrics_on__subset="detection_model_train__metrics_on_subset", + input__model__metrics_on__subset="pipeline_model__metrics_on_subset", output__attr__model__is_best="attr__detection_model__is_best", output__best_model="best_detection_model", subset_id="val", is_best__name="detection_model__is_best", primary_keys=["detection_model_id"], - metric__name="calc__f1_score", + metric__name="calc__weighted_f1_score", func="max", group_by=None, labels=[("stage", "train"), ("stage", "count-metrics")], ), - # tag arc: aggregate per-image metrics by (model, tag, subset) - BatchTransform( - func=steps.compute_tag_metrics, - inputs=["detection_model_train__metrics_on_image", "image__tag"], - outputs=["tag_metrics"], - transform_keys=["detection_model_id"], + CountMetrics_Subset_PipelineModel( + input__image__ground_truth=["image__ground_truth", "image__tag"], + input__subset__has__image="image__subset", + input__pipeline_prediction="detection_prediction_train", + output__pipeline_model__metrics_on__image="pipeline_model__metrics_by_tag_on_image", + output__pipeline_model__metrics_by_cls_on__subset="pipeline_model__metrics_by_tag_by_cls_on_subset", + output__pipeline_model__metrics_on__subset="pipeline_model__metrics_by_tag_on_subset", + primary_keys=["image_name"], + bbox_id__name=None, + pipeline_model_primary_keys=["detection_model_id", "tag_id"], + minimum_iou=0.5, labels=[("stage", "train"), ("stage", "count-metrics"), ("stage", "tag-metrics")], + create_table=True, ), - # --- FiftyOne (stage=fiftyone): browse GT + both models' predictions, filter by tag --- + # --- FiftyOne (stage=fiftyone): GT + baseline/retrained predictions, filter by tag_id --- BatchTransform( func=steps.download_images, inputs=["s3_images"], outputs=["local_images"], transform_keys=["image_name"], - kwargs=dict(image__image_path__name="image_url", image__local_image_path__name="local_path"), labels=[("stage", "fiftyone")], + kwargs=dict( + image__image_path__name="image_url", + image__local_image_path__name="local_path", + ), + ), + BatchTransform( + func=steps.publish_to_fiftyone, + inputs=["local_images"], + outputs=["fiftyone_images"], + labels=[("stage", "fiftyone")], + kwargs=dict( + primary_keys=["image_name"], + image__image_path__name="local_path", + ), ), BatchTransform( - func=steps.publish_gt_to_fiftyone, - inputs=["local_images", "image__ground_truth", "image__subset", "image__tag"], + func=steps.publish_to_fiftyone_ground_truth, + inputs=[ + "local_images", + Required("image__ground_truth"), + Required("image__subset"), + Required("image__tag"), + ], outputs=["fiftyone_annotations"], - transform_keys=["image_name"], - kwargs=dict(primary_keys=["image_name"], image__image_path__name="local_path"), labels=[("stage", "fiftyone")], + kwargs=dict( + primary_keys=["image_name"], + image__image_path__name="local_path", + ), ), BatchTransform( - func=steps.publish_predictions_to_fiftyone, + func=steps.publish_to_fiftyone_predictions_baseline, inputs=["local_images", "detection_prediction_train"], outputs=["fiftyone_predictions_model_a"], - transform_keys=["image_name"], - kwargs=dict(slot="model_a", primary_keys=["image_name"], image__image_path__name="local_path"), + transform_keys=["image_name", "detection_model_id"], labels=[("stage", "fiftyone")], + kwargs=dict( + primary_keys=["image_name"], + image__image_path__name="local_path", + ), ), BatchTransform( - func=steps.publish_predictions_to_fiftyone, + func=steps.publish_to_fiftyone_predictions_retrained, inputs=["local_images", "detection_prediction_train"], outputs=["fiftyone_predictions_model_b"], - transform_keys=["image_name"], - kwargs=dict(slot="model_b", primary_keys=["image_name"], image__image_path__name="local_path"), + transform_keys=["image_name", "detection_model_id"], labels=[("stage", "fiftyone")], + kwargs=dict( + primary_keys=["image_name"], + image__image_path__name="local_path", + ), ), ] ) @@ -195,8 +233,10 @@ "image__tag", "detection_frozen_dataset", "detection_model_train", - "detection_model_train__metrics_on_subset", - "tag_metrics", + "pipeline_model__metrics_on_subset", + "pipeline_model__metrics_by_cls_on_subset", + "pipeline_model__metrics_by_tag_on_subset", + "pipeline_model__metrics_by_tag_by_cls_on_subset", ], item_table="s3_images", label_table="image__ground_truth", @@ -250,8 +290,8 @@ OpsMetricTableSpec( id="model_metrics", title="Model metrics", - table="detection_model_train__metrics_on_subset", - metric_source="detection_model_train__metrics_on_subset", + table="pipeline_model__metrics_on_subset", + metric_source="pipeline_model__metrics_on_subset", primary_key_columns=["detection_model_id", "subset_id"], entity_links={ "model": "detection_model_id", @@ -262,26 +302,40 @@ OpsColumn("subset", "Subset", "subset_id", kind="chip", filterable=True), ], metric_columns=[ - OpsColumn("images_support", "Images", "calc__images_support", kind="number"), - OpsColumn("support", "Support", "calc__support", kind="number"), - OpsColumn("tp", "TP", "calc__TP", kind="number"), - OpsColumn("fp", "FP", "calc__FP", kind="number"), - OpsColumn("fn", "FN", "calc__FN", kind="number"), - OpsColumn("iou_mean", "IoU mean", "calc__iou_mean", kind="number"), + OpsColumnGroup( + "Precision", + [ + OpsColumn("weighted_precision", "W-Precision", "calc__weighted_precision", kind="number"), + OpsColumn("macro_precision", "M-Precision", "calc__macro_precision", kind="number"), + ], + ), + OpsColumnGroup( + "Recall", + [ + OpsColumn("weighted_recall", "W-Recall", "calc__weighted_recall", kind="number"), + OpsColumn("macro_recall", "M-Recall", "calc__macro_recall", kind="number"), + ], + ), + OpsColumnGroup( + "F1", + [ + OpsColumn("weighted_f1", "W-F1", "calc__weighted_f1_score", kind="number"), + OpsColumn("macro_f1", "M-F1", "calc__macro_f1_score", kind="number"), + ], + ), OpsColumn("accuracy", "Accuracy", "calc__accuracy", kind="number"), - OpsColumn("precision", "Precision", "calc__precision", kind="number"), - OpsColumn("recall", "Recall", "calc__recall", kind="number"), - OpsColumn("f1", "F1", "calc__f1_score", kind="number"), + OpsColumn("support", "Support", "calc__support", kind="number"), ], - best_metric_column="calc__f1_score", - default_sort=[("f1", "desc")], + best_metric_column="calc__weighted_f1_score", + default_sort=[("weighted_f1", "desc")], filters=[OpsColumn("subset_filter", "Subset", "subset_id", kind="chip", filterable=True)], + default_filters=[OpsFilterRule(column_id="subset_id", operator="equal", value="val")], ), OpsMetricTableSpec( - id="tag_metrics", - title="Tag metrics", - table="tag_metrics", - metric_source="tag_metrics", + id="tag_metrics_on_subset", + title="Tag metrics on subset", + table="pipeline_model__metrics_by_tag_on_subset", + metric_source="pipeline_model__metrics_by_tag_on_subset", primary_key_columns=["detection_model_id", "tag_id", "subset_id"], entity_links={ "model": "detection_model_id", @@ -294,24 +348,110 @@ OpsColumn("subset", "Subset", "subset_id", kind="chip", filterable=True), ], metric_columns=[ - OpsColumn("images_support", "Images", "calc__images_support", kind="number"), + OpsColumnGroup( + "Precision", + [ + OpsColumn("weighted_precision", "W-Precision", "calc__weighted_precision", kind="number"), + OpsColumn("macro_precision", "M-Precision", "calc__macro_precision", kind="number"), + ], + ), + OpsColumnGroup( + "Recall", + [ + OpsColumn("weighted_recall", "W-Recall", "calc__weighted_recall", kind="number"), + OpsColumn("macro_recall", "M-Recall", "calc__macro_recall", kind="number"), + ], + ), + OpsColumnGroup( + "F1", + [ + OpsColumn("weighted_f1", "W-F1", "calc__weighted_f1_score", kind="number"), + OpsColumn("macro_f1", "M-F1", "calc__macro_f1_score", kind="number"), + ], + ), + OpsColumn("accuracy", "Accuracy", "calc__accuracy", kind="number"), + OpsColumn("support", "Support", "calc__support", kind="number"), + ], + best_metric_column="calc__weighted_f1_score", + default_sort=[("weighted_f1", "desc")], + filters=[ + OpsColumn("subset_filter", "Subset", "subset_id", kind="chip", filterable=True), + OpsColumn("tag_filter", "Tag", "tag_id", filterable=True), + ], + default_filters=[OpsFilterRule(column_id="subset_id", operator="equal", value="val")], + ), + ], + class_metrics=[ + OpsClassMetricTableSpec( + id="subset_class_metrics", + title="Subset class metrics", + table="pipeline_model__metrics_by_cls_on_subset", + metric_source="pipeline_model__metrics_by_cls_on_subset", + primary_key_columns=["detection_model_id", "subset_id", "label"], + entity_links={ + "model": "detection_model_id", + "subset": "subset_id", + "class": "label", + }, + primary_columns=[ + OpsColumn("model", "Model", "detection_model_id", filterable=True, link_to="model"), + OpsColumn("subset", "Subset", "subset_id", kind="chip", filterable=True), + OpsColumn("label", "Class", "label", filterable=True), + ], + metric_columns=[ + OpsColumn("precision", "Precision", "calc__precision", kind="number"), + OpsColumn("recall", "Recall", "calc__recall", kind="number"), + OpsColumn("f1", "F1", "calc__f1_score", kind="number"), OpsColumn("support", "Support", "calc__support", kind="number"), OpsColumn("tp", "TP", "calc__TP", kind="number"), OpsColumn("fp", "FP", "calc__FP", kind="number"), OpsColumn("fn", "FN", "calc__FN", kind="number"), + ], + best_metric_column="calc__f1_score", + default_sort=[("f1", "desc")], + filters=[ + OpsColumn("subset_filter", "Subset", "subset_id", kind="chip", filterable=True), + OpsColumn("class_filter", "Class", "label", filterable=True), + ], + default_filters=[OpsFilterRule(column_id="subset_id", operator="equal", value="val")], + ), + OpsClassMetricTableSpec( + id="tag_class_metrics_on_subset", + title="Tag class metrics on subset", + table="pipeline_model__metrics_by_tag_by_cls_on_subset", + metric_source="pipeline_model__metrics_by_tag_by_cls_on_subset", + primary_key_columns=["detection_model_id", "tag_id", "subset_id", "label"], + entity_links={ + "model": "detection_model_id", + "subset": "subset_id", + "tag": "tag_id", + "class": "label", + }, + primary_columns=[ + OpsColumn("model", "Model", "detection_model_id", filterable=True, link_to="model"), + OpsColumn("tag", "Tag", "tag_id", filterable=True), + OpsColumn("subset", "Subset", "subset_id", kind="chip", filterable=True), + OpsColumn("label", "Class", "label", filterable=True), + ], + metric_columns=[ OpsColumn("precision", "Precision", "calc__precision", kind="number"), OpsColumn("recall", "Recall", "calc__recall", kind="number"), OpsColumn("f1", "F1", "calc__f1_score", kind="number"), + OpsColumn("support", "Support", "calc__support", kind="number"), + OpsColumn("tp", "TP", "calc__TP", kind="number"), + OpsColumn("fp", "FP", "calc__FP", kind="number"), + OpsColumn("fn", "FN", "calc__FN", kind="number"), ], best_metric_column="calc__f1_score", default_sort=[("f1", "desc")], filters=[ OpsColumn("subset_filter", "Subset", "subset_id", kind="chip", filterable=True), OpsColumn("tag_filter", "Tag", "tag_id", filterable=True), + OpsColumn("class_filter", "Class", "label", filterable=True), ], + default_filters=[OpsFilterRule(column_id="subset_id", operator="equal", value="val")], ), ], - class_metrics=[], tags=["yolo", "image", "tags", "training"], ) ]) diff --git a/examples/detection_tags/detection/config.py b/examples/detection_tags/detection/config.py index 24272055..88f5d036 100644 --- a/examples/detection_tags/detection/config.py +++ b/examples/detection_tags/detection/config.py @@ -92,5 +92,14 @@ def datapipe_tmp_folder() -> str: # FiftyOne stores dataset metadata in MongoDB (FIFTYONE_DATABASE_URI, brought up by # docker compose) and renders samples from LOCAL image files, so the fiftyone stage # downloads S3 images to LOCAL_IMAGES_DIR first. +def _local_images_dir() -> Path: + explicit = os.environ.get("LOCAL_IMAGES_DIR") + if explicit: + return Path(explicit).resolve() + if _is_cloud_path(DATAPIPE_DIR_ROOT): + return Path(os.environ.get("DATAPIPE_TAGS_TMP_DIR", "/tmp/datapipe-tags")).resolve() / "local_images" + return Path(DATAPIPE_DIR).resolve().parent / "local_images" + + FIFTYONE_DATASET_NAME = os.environ.get("FIFTYONE_DATASET_NAME", "datapipe_detection_tags") -LOCAL_IMAGES_DIR = Path(os.environ.get("LOCAL_IMAGES_DIR", "/tmp/datapipe-tags-fiftyone-images")) +LOCAL_IMAGES_DIR = _local_images_dir() diff --git a/examples/detection_tags/detection/data.py b/examples/detection_tags/detection/data.py index 81db064f..9df287a6 100644 --- a/examples/detection_tags/detection/data.py +++ b/examples/detection_tags/detection/data.py @@ -8,9 +8,6 @@ from config import DBCONN, FIFTYONE_DATASET_NAME -# one FiftyOne session/dataset shared by the ground-truth + per-model prediction stores; -# each store writes its own field (ground_truth / predictions_model_a / predictions_model_b) -# into the SAME dataset, so a sample shows GT and both models side by side. fo_session = FifyOneSession() @@ -18,12 +15,13 @@ def _t(name, schema): return Table(TableStoreDB(dbconn=DBCONN, name=name, data_sql_schema=schema, create_table=True)) -def _fo(field, additional_info_keys_in_sample=()): +def _fo_table(fo_detections_label: str, *, rm_only_fo_fields: bool = True, + additional_info_keys_in_sample=()): return Table(FiftyOneImagesDataTableStore( dataset=FIFTYONE_DATASET_NAME, fo_session=fo_session, - fo_detections_label=field, - rm_only_fo_fields=True, + fo_detections_label=fo_detections_label, + rm_only_fo_fields=rm_only_fo_fields, additional_info_keys_in_sample=list(additional_info_keys_in_sample), primary_schema=[Column("image_name", String(255), primary_key=True)], )) @@ -74,42 +72,26 @@ def _fo(field, additional_info_keys_in_sample=()): Column("image_name", String, primary_key=True), Column("tag_id", String, primary_key=True), ]), - # per-image metrics produced by the CountMetrics step (declared so the - # tag-metrics transform can read it as an input) - "detection_model_train__metrics_on_image": _t("detection_model_train__metrics_on_image", [ - Column("image_name", String, primary_key=True), - Column("detection_model_id", String, primary_key=True), - Column("subset_id", String, primary_key=True), - Column("calc__support", Integer), - Column("calc__TP", Integer), - Column("calc__FP", Integer), - Column("calc__FN", Integer), - Column("calc__iou_mean", Float), - ]), - # per-(model, tag, subset) metrics — the tag arc lives here - "tag_metrics": _t("tag_metrics", [ - Column("detection_model_id", String, primary_key=True), - Column("tag_id", String, primary_key=True), - Column("subset_id", String, primary_key=True), - Column("calc__images_support", Integer), - Column("calc__support", Integer), - Column("calc__TP", Integer), - Column("calc__FP", Integer), - Column("calc__FN", Integer), - Column("calc__precision", Float), - Column("calc__recall", Float), - Column("calc__f1_score", Float), - ]), # --- FiftyOne (stage=fiftyone) --------------------------------------- - # images downloaded locally (FiftyOne renders from local files) + # Same layout as e2e_template/image_detection: one shared dataset, separate stores + # per field. Baseline vs retrained predictions stay side-by-side for A/B comparison; + # subset_id + tag_id are sample fields for filtering (e.g. tag_id=night). "local_images": _t("local_images", [ Column("image_name", String(255), primary_key=True), Column("local_path", String(1024)), ]), - # GT boxes + per-sample subset/tag fields (filter tag=night in the FO App) - "fiftyone_annotations": _fo("ground_truth", additional_info_keys_in_sample=["subset", "tag"]), - # predictions of the baseline (model A) and the retrained model (model B) - "fiftyone_predictions_model_a": _fo("predictions_model_a"), - "fiftyone_predictions_model_b": _fo("predictions_model_b"), + "fiftyone_images": _fo_table("images", rm_only_fo_fields=False), + "fiftyone_annotations": _fo_table( + "annotations", + additional_info_keys_in_sample=["subset_id", "tag_id"], + ), + "fiftyone_predictions_model_a": _fo_table( + "predictions_model_a", + additional_info_keys_in_sample=["detection_model_id_a"], + ), + "fiftyone_predictions_model_b": _fo_table( + "predictions_model_b", + additional_info_keys_in_sample=["detection_model_id_b"], + ), } ) diff --git a/examples/detection_tags/detection/steps.py b/examples/detection_tags/detection/steps.py index 3136cdde..81fd867d 100644 --- a/examples/detection_tags/detection/steps.py +++ b/examples/detection_tags/detection/steps.py @@ -129,17 +129,20 @@ def compute_tag_metrics(df_metrics_on_image: pd.DataFrame, df_image_tag: pd.Data # --- FiftyOne (stage=fiftyone) -------------------------------------------------- # Same pattern as examples/e2e_template/image_detection: download images locally, -# then publish bbox rows into a FiftyOne dataset via FiftyOneImagesDataTableStore. -def download_images(s3_images_df: pd.DataFrame, image__image_path__name: str, - image__local_image_path__name: str) -> pd.DataFrame: +# register samples, then publish GT / predictions into separate fields of one dataset. + + +def download_images( + s3_images_df: pd.DataFrame, + image__image_path__name: str, + image__local_image_path__name: str, +) -> pd.DataFrame: LOCAL_IMAGES_DIR.mkdir(parents=True, exist_ok=True) local_paths = [] for _, row in s3_images_df.iterrows(): s3_path = row[image__image_path__name] local_path = LOCAL_IMAGES_DIR / os.path.basename(str(s3_path)) if not local_path.exists(): - # image_url is the public HTTP URL of the MinIO object (anonymous download), so open it - # plainly — passing S3 storage options here would hit the http filesystem with s3 kwargs. with fsspec.open(s3_path, "rb") as f_src: local_path.write_bytes(f_src.read()) local_paths.append(str(local_path.resolve())) @@ -147,50 +150,87 @@ def download_images(s3_images_df: pd.DataFrame, image__image_path__name: str, return s3_images_df[["image_name", image__local_image_path__name]] -def publish_gt_to_fiftyone(images_df: pd.DataFrame, gt_df: pd.DataFrame, subset_df: pd.DataFrame, - tag_df: pd.DataFrame, primary_keys: list[str], - image__image_path__name: str) -> pd.DataFrame: - """Publish ground-truth boxes and attach per-sample subset/tag (so you can filter tag=night).""" - pk = primary_keys[0] - df = convert_df_with_bbox_to_df_with_image_data( - df__with_bbox=pd.merge(gt_df, images_df, on=pk), +def publish_to_fiftyone( + images_df: pd.DataFrame, + primary_keys: list[str], + image__image_path__name: str, +) -> pd.DataFrame: + return convert_df_with_bbox_to_df_with_image_data( + df__with_bbox=images_df, + image__image_path__name=image__image_path__name, + primary_keys=primary_keys, + ) + + +def publish_to_fiftyone_ground_truth( + images_df: pd.DataFrame, + ground_truth_df: pd.DataFrame, + subset_df: pd.DataFrame, + tag_df: pd.DataFrame, + primary_keys: list[str], + image__image_path__name: str, +) -> pd.DataFrame: + df = pd.merge(images_df, ground_truth_df, on=primary_keys, how="left") + df = pd.merge(df, subset_df, on=primary_keys, how="left") + if tag_df is not None and not tag_df.empty: + df = pd.merge(df, tag_df[primary_keys + ["tag_id"]], on=primary_keys, how="left") + return convert_df_with_bbox_to_df_with_image_data( + df__with_bbox=df, primary_keys=primary_keys, image__image_path__name=image__image_path__name, ) - subset_by_image = (subset_df.drop_duplicates(subset=[pk]).set_index(pk)["subset_id"].to_dict() - if not subset_df.empty else {}) - tagid_by_image = (tag_df.drop_duplicates(subset=[pk]).set_index(pk)["tag_id"].to_dict() - if not tag_df.empty else {}) - for _, row in df.iterrows(): - tid = tagid_by_image.get(row[pk]) - # tag_id is already the readable tag name (text), so write it straight to the sample field - row["image_data"].additional_info = { - "subset": subset_by_image.get(row[pk]) or "none", - "tag": tid if tid is not None else "none", - } - return df - - -def publish_predictions_to_fiftyone(images_df: pd.DataFrame, predictions_df: pd.DataFrame, - slot: str, primary_keys: list[str], - image__image_path__name: str) -> pd.DataFrame: - """Publish one model's predictions into the slot's FiftyOne field. slot='model_a' is the - earliest-trained model (baseline), 'model_b' the next (retrained). Model ids are - timestamp-prefixed, so sorting them yields a stable A/B assignment across all images.""" - pk = primary_keys[0] - empty = pd.DataFrame(columns=primary_keys + ["image_data"]) - if predictions_df.empty: - return empty + + +def _baseline_and_retrained_model_ids(predictions_df: pd.DataFrame) -> tuple[list[str], list[str]]: + """Earliest-trained model = baseline; the next one = retrained (stable A/B across images).""" ids = sorted(predictions_df["detection_model_id"].dropna().unique().tolist()) - if not ids: + return ([ids[0]] if ids else []), (ids[1:2] if len(ids) > 1 else []) + + +def _publish_predictions_for_models( + images_df: pd.DataFrame, + predictions_df: pd.DataFrame, + model_ids: list[str], + model_id_sample_field: str, + primary_keys: list[str], + image__image_path__name: str, +) -> pd.DataFrame: + empty = pd.DataFrame(columns=primary_keys + ["image_data"]) + if predictions_df.empty or not model_ids: return empty - slot_of = {mid: ("model_a" if i == 0 else "model_b") for i, mid in enumerate(ids)} - target_ids = [mid for mid, s in slot_of.items() if s == slot] - pred = predictions_df[predictions_df["detection_model_id"].isin(target_ids)] + pred = predictions_df[predictions_df["detection_model_id"].isin(model_ids)] if pred.empty: return empty + df = pd.merge(pred, images_df, on=primary_keys, how="left") + df[model_id_sample_field] = df["detection_model_id"] return convert_df_with_bbox_to_df_with_image_data( - df__with_bbox=pd.merge(pred, images_df, on=pk), + df__with_bbox=df, primary_keys=primary_keys, image__image_path__name=image__image_path__name, ) + + +def publish_to_fiftyone_predictions_baseline( + images_df: pd.DataFrame, + predictions_df: pd.DataFrame, + primary_keys: list[str], + image__image_path__name: str, +) -> pd.DataFrame: + baseline_ids, _ = _baseline_and_retrained_model_ids(predictions_df) + return _publish_predictions_for_models( + images_df, predictions_df, baseline_ids, "detection_model_id_a", + primary_keys, image__image_path__name, + ) + + +def publish_to_fiftyone_predictions_retrained( + images_df: pd.DataFrame, + predictions_df: pd.DataFrame, + primary_keys: list[str], + image__image_path__name: str, +) -> pd.DataFrame: + _, retrained_ids = _baseline_and_retrained_model_ids(predictions_df) + return _publish_predictions_for_models( + images_df, predictions_df, retrained_ids, "detection_model_id_b", + primary_keys, image__image_path__name, + ) diff --git a/examples/detection_tags/docker-compose.yml b/examples/detection_tags/docker-compose.yml index a99d2d0e..0b88bd6b 100644 --- a/examples/detection_tags/docker-compose.yml +++ b/examples/detection_tags/docker-compose.yml @@ -1,3 +1,8 @@ +# Host-owned bind mounts: mkdir -p .docker-data/minio && HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d +# Postgres/Mongo keep image defaults (they cannot run as arbitrary host uid). +x-host-user: &host-user + user: "${HOST_UID:-1000}:${HOST_GID:-1000}" + services: postgres: image: postgres:14 @@ -15,11 +20,16 @@ services: retries: 5 minio: + <<: *host-user image: minio/minio:latest command: server /data --console-address ":9001" environment: MINIO_ROOT_USER: minioadmin MINIO_ROOT_PASSWORD: minioadmin + volumes: + - type: bind + source: ${DATAPIPE_DOCKER_DATA_DIR:-./.docker-data}/minio + target: /data ports: - "9000:9000" - "9001:9001" @@ -30,6 +40,7 @@ services: retries: 5 minio-init: + <<: *host-user image: minio/mc:latest depends_on: minio: @@ -41,13 +52,32 @@ services: mc anonymous set download local/datapipe-tags " - # FiftyOne dataset metadata store (the fiftyone stage). Point FIFTYONE_DATABASE_URI at it. mongo: image: mongo:7 ports: - "27017:27017" healthcheck: - test: ["CMD", "mongosh", "--quiet", "--eval", "db.adminCommand('ping')"] - interval: 10s + test: ["CMD", "mongosh", "--eval", "db.adminCommand('ping')"] + interval: 5s timeout: 5s - retries: 5 + retries: 12 + start_period: 10s + + fiftyone: + <<: *host-user + image: voxel51/fiftyone:1.17.0 + command: ["python", "-m", "fiftyone.server.main", "--port", "5151"] + environment: + FIFTYONE_DATABASE_URI: mongodb://mongo:27017 + FIFTYONE_DEFAULT_APP_ADDRESS: 0.0.0.0 + ports: + - "5151:5151" + volumes: + # Host paths written by the pipeline (e.g. /tmp/datapipe-tags/local_images) must match inside the container. + - type: bind + source: ${DATAPIPE_TAGS_TMP_DIR:-/tmp/datapipe-tags} + target: /tmp/datapipe-tags + read_only: true + depends_on: + mongo: + condition: service_healthy diff --git a/examples/detection_tags/pyproject.toml b/examples/detection_tags/pyproject.toml index a4b989f2..91875ba5 100644 --- a/examples/detection_tags/pyproject.toml +++ b/examples/detection_tags/pyproject.toml @@ -4,13 +4,12 @@ version = "0" requires-python = ">=3.10,<3.13" dependencies = [ "datapipe-app", - "datapipe-ml[torch,fiftyone]", # fiftyone extra pulls FiftyOneImagesDataTableStore + cv_pipeliner.fiftyone + "datapipe-ml[torch,fiftyone]", # FiftyOneImagesDataTableStore + cv_pipeliner.fiftyone (+ fiftyone lib for stage=fiftyone) "torch==2.6.0", "torchvision==0.21.0", "stringzilla==4.4.0", # needed by albumentations - "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) - "pi-heif", # ultralytics image verification imports it - "fiftyone==1.17.0", # FiftyOne App + dataset (metadata in MongoDB) + # "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) + # "pi-heif", # ultralytics image verification imports it ] [[tool.uv.index]] From e820bb54c63464ec461044dc20bdcef7e16ea035 Mon Sep 17 00:00:00 2001 From: Aleksandr Kozlov Date: Thu, 9 Jul 2026 03:49:14 +0200 Subject: [PATCH 06/18] fix docker compose and fix steps pipelines with fiftyone --- .claude/skills/setup-detection-tags/SKILL.md | 7 +- examples/detection_tags/.gitignore | 1 + examples/detection_tags/README.md | 1 - examples/detection_tags/detection/app.py | 13 +- examples/detection_tags/detection/data.py | 2 +- examples/detection_tags/detection/steps.py | 138 ++++++++++++------- examples/detection_tags/docker-compose.yml | 20 ++- 7 files changed, 115 insertions(+), 67 deletions(-) create mode 100644 examples/detection_tags/.gitignore diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 71e94996..bb20b56f 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -105,7 +105,6 @@ port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), d ```bash cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI -mkdir -p .docker-data/minio HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151). No Label Studio. uv sync # cu124 torch + datapipe-ml[torch,fiftyone] (+ pi-heif if needed) # On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): @@ -284,9 +283,9 @@ Stores share one `fo_session` / dataset (`detection/data.py`). Separate `detecti **App UI:** `docker compose up` starts **`fiftyone`** (`voxel51/fiftyone:1.17.0` on **:5151**), wired to the same MongoDB. Open **http://localhost:5151** (remote → SSH tunnel `-L 5151:localhost:5151`). -Like e2e: run `mkdir -p .docker-data/minio` then -`HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d` so **minio** / **fiftyone** bind mounts -use the host uid (no root-owned files breaking the pipeline). The service bind-mounts +Like e2e: run `HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d` — compose includes +**minio-data-init** (root `chown` on `.docker-data/minio`) so MinIO can write as your uid even if +Docker created the bind mount as root. The service bind-mounts `DATAPIPE_TAGS_TMP_DIR` (default `/tmp/datapipe-tags`) read-only; local images go to `$DATAPIPE_TAGS_TMP_DIR/local_images` (override with `LOCAL_IMAGES_DIR` if needed). The pipeline still uses the **`fiftyone` Python lib** from `datapipe-ml[fiftyone]` to publish samples; diff --git a/examples/detection_tags/.gitignore b/examples/detection_tags/.gitignore new file mode 100644 index 00000000..2c2e96a3 --- /dev/null +++ b/examples/detection_tags/.gitignore @@ -0,0 +1 @@ +.docker-data/ \ No newline at end of file diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 1d5fc8f4..78d9b16f 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -11,7 +11,6 @@ is split into **two parts around a checkpoint** so you can prep part 1 and rehea ## Deploy from scratch ```bash cp .env.example .env && set -a && source .env && set +a -mkdir -p .docker-data/minio HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151) uv sync # cu124 torch + datapipe-ml[torch,fiftyone] # pre-AVX2 host only: force the lts polars to win (else training SIGILLs) diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index 92ddcb8e..12ed0927 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -67,8 +67,7 @@ primary_keys=["image_name"], bbox_id__name=None, image__image_path__name="image_url", - labels=[("stage", "train"), ("stage", "train-prepare")], - create_table=True, + labels=[("stage", "train"), ("stage", "train-prepare")] ), Train_YoloV8_DetectionModel( # type: ignore[list-item] input__detection_frozen_dataset="detection_frozen_dataset", @@ -97,7 +96,6 @@ primary_keys=["image_name"], bbox_id__name=None, labels=[("stage", "train")], - create_table=True, allow_sample_size_mismatch=True, model_suffix="_tags", ), @@ -110,7 +108,6 @@ image__image_path__name="image_url", batch_size_default=1, labels=[("stage", "train"), ("stage", "inference")], - create_table=True, ), CountMetrics_Subset_PipelineModel( input__image__ground_truth="image__ground_truth", @@ -124,7 +121,6 @@ pipeline_model_primary_keys=["detection_model_id"], minimum_iou=0.5, labels=[("stage", "train"), ("stage", "count-metrics")], - create_table=True, ), FindBestModel( input__model="detection_model_train", @@ -151,7 +147,6 @@ pipeline_model_primary_keys=["detection_model_id", "tag_id"], minimum_iou=0.5, labels=[("stage", "train"), ("stage", "count-metrics"), ("stage", "tag-metrics")], - create_table=True, ), # --- FiftyOne (stage=fiftyone): GT + baseline/retrained predictions, filter by tag_id --- BatchTransform( @@ -192,7 +187,7 @@ ), BatchTransform( func=steps.publish_to_fiftyone_predictions_baseline, - inputs=["local_images", "detection_prediction_train"], + inputs=[Required("local_images"), Required("detection_prediction_train")], outputs=["fiftyone_predictions_model_a"], transform_keys=["image_name", "detection_model_id"], labels=[("stage", "fiftyone")], @@ -203,7 +198,7 @@ ), BatchTransform( func=steps.publish_to_fiftyone_predictions_retrained, - inputs=["local_images", "detection_prediction_train"], + inputs=[Required("local_images"), Required("detection_prediction_train")], outputs=["fiftyone_predictions_model_b"], transform_keys=["image_name", "detection_model_id"], labels=[("stage", "fiftyone")], @@ -215,7 +210,7 @@ ] ) -ds = DataStore(DBCONN, create_meta_table=True) +ds = DataStore(DBCONN) app = DatapipeApp(ds, catalog, pipeline) app.add_specs([ diff --git a/examples/detection_tags/detection/data.py b/examples/detection_tags/detection/data.py index 9df287a6..fb33146c 100644 --- a/examples/detection_tags/detection/data.py +++ b/examples/detection_tags/detection/data.py @@ -12,7 +12,7 @@ def _t(name, schema): - return Table(TableStoreDB(dbconn=DBCONN, name=name, data_sql_schema=schema, create_table=True)) + return Table(TableStoreDB(dbconn=DBCONN, name=name, data_sql_schema=schema)) def _fo_table(fo_detections_label: str, *, rm_only_fo_fields: bool = True, diff --git a/examples/detection_tags/detection/steps.py b/examples/detection_tags/detection/steps.py index 0531e19b..faa72c40 100644 --- a/examples/detection_tags/detection/steps.py +++ b/examples/detection_tags/detection/steps.py @@ -2,9 +2,10 @@ import logging import os +import threading +from concurrent.futures import ThreadPoolExecutor import fsspec -import numpy as np import pandas as pd from datapipe_ml.core.image_data import convert_df_with_bbox_to_df_with_image_data @@ -36,8 +37,10 @@ def load_batch(df_request: pd.DataFrame): pd.DataFrame(columns=hint_cols)) source = CocoDemoSource() # demo data (COCO cat/dog); for real data swap coco_demo.py - fs = fsspec.filesystem("s3", **input_storage_options()) bucket = input_bucket() + workers = int(os.environ["DATAPIPE_TAGS_LOAD_WORKERS"]) if os.environ.get("DATAPIPE_TAGS_LOAD_WORKERS") else min( + 32, (os.cpu_count() or 4) * 4, + ) requests = [] for _, req in df_request.iterrows(): @@ -55,16 +58,7 @@ def load_batch(df_request: pd.DataFrame): "darken": darken, }) - total_images = sum(req["n"] for req in requests) - logger.info( - "load_batch: %d request(s), %d image(s) to upload", - len(requests), - total_images, - ) - logger.info("load_batch: uploading to s3://%s/images/", bucket) - - s3_rows, gt_rows, tag_rows, tag_defs, hint_rows = [], [], [], {}, [] - processed = 0 + tasks: list[tuple[str, str | None, str | None, float | None]] = [] for req_idx, req in enumerate(requests, start=1): logger.info( "load_batch: request %d/%d offset=%d n=%d tag=%s subset=%s darken=%s", @@ -72,28 +66,52 @@ def load_batch(df_request: pd.DataFrame): req["tag"], req["subset"], req["darken"], ) for fn in source.pool[req["offset"]: req["offset"] + req["n"]]: - processed += 1 - stem, ext = os.path.splitext(fn) - raw, boxes, labels = source.fetch(fn) - tag, darken, subset = req["tag"], req["darken"], req["subset"] - if darken is not None: - name = f"{stem}__{tag or 'dark'}{ext}" - data = demo_darken(raw, darken) - else: - name, data = fn, raw - fs.pipe(f"{bucket}/images/{name}", data) - s3_rows.append({"image_name": name, "image_url": input_image_url(name)}) - gt_rows.append({"image_name": name, "bboxes": boxes, "labels": labels}) - if tag: - tag_rows.append({"image_name": name, "tag_id": tag}) - desc = tag if darken is None else f"{tag} (low-light, gamma {darken})" - tag_defs[tag] = desc - if subset: - hint_rows.append({"image_name": name, "subset_id": subset}) - logger.info( - "load_batch: uploaded %s (%d/%d done, %d remaining)", - name, processed, total_images, total_images - processed, - ) + tasks.append((fn, req["tag"], req["subset"], req["darken"])) + + total_images = len(tasks) + log_every = max(1, total_images // 10) + logger.info( + "load_batch: %d request(s), %d image(s) to upload to s3://%s/images/ (%d workers)", + len(requests), total_images, bucket, workers, + ) + + tls = threading.local() + + def upload(task: tuple[str, str | None, str | None, float | None]): + fn, tag, subset, darken = task + stem, ext = os.path.splitext(fn) + raw, boxes, labels = source.fetch(fn) + if darken is not None: + name = f"{stem}__{tag or 'dark'}{ext}" + data = demo_darken(raw, darken) + else: + name, data = fn, raw + if not hasattr(tls, "fs"): + tls.fs = fsspec.filesystem("s3", **input_storage_options()) + tls.fs.pipe(f"{bucket}/images/{name}", data) + tag_row = {"image_name": name, "tag_id": tag} if tag else None + tag_desc = (tag if darken is None else f"{tag} (low-light, gamma {darken})") if tag else None + hint_row = {"image_name": name, "subset_id": subset} if subset else None + return ( + {"image_name": name, "image_url": input_image_url(name)}, + {"image_name": name, "bboxes": boxes, "labels": labels}, + tag_row, + tag_desc, + hint_row, + ) + + s3_rows, gt_rows, tag_rows, tag_defs, hint_rows = [], [], [], {}, [] + with ThreadPoolExecutor(max_workers=workers) as executor: + for i, (s3_row, gt_row, tag_row, tag_desc, hint_row) in enumerate(executor.map(upload, tasks), 1): + s3_rows.append(s3_row) + gt_rows.append(gt_row) + if tag_row: + tag_rows.append(tag_row) + tag_defs[tag_row["tag_id"]] = tag_desc + if hint_row: + hint_rows.append(hint_row) + if i % log_every == 0 or i == total_images: + logger.info("load_batch: uploaded %d/%d", i, total_images) logger.info( "load_batch: finished, uploaded %d image(s), %d tag assignment(s), %d unique tag(s)", @@ -127,12 +145,15 @@ def split_df_train_val(df: pd.DataFrame, subset_df: pd.DataFrame, hint_df: pd.Da hint = hint_df[primary_keys + ["subset_id"]].drop_duplicates(subset=primary_keys) df__missing = df__missing.merge(hint, on=primary_keys, how="left") else: - df__missing["subset_id"] = np.nan + df__missing["subset_id"] = None + # all-NaN column becomes float64; cast before assigning "train"/"val" + df__missing["subset_id"] = df__missing["subset_id"].astype(object) df__missing = df__missing.reset_index(drop=True) - unpinned = df__missing[df__missing["subset_id"].isna()] - df__val = unpinned.sample(frac=val_perc, random_state=random_seed) - df__missing.loc[unpinned.index, "subset_id"] = "train" - df__missing.loc[df__val.index, "subset_id"] = "val" + unpinned = df__missing["subset_id"].isna() + if unpinned.any(): + df__val = df__missing[unpinned].sample(frac=val_perc, random_state=random_seed) + df__missing.loc[unpinned, "subset_id"] = "train" + df__missing.loc[df__val.index, "subset_id"] = "val" return pd.concat([subset_df, df__missing], ignore_index=True)[primary_keys + ["subset_id"]] @@ -179,21 +200,32 @@ def publish_to_fiftyone_ground_truth( primary_keys: list[str], image__image_path__name: str, ) -> pd.DataFrame: - df = pd.merge(images_df, ground_truth_df, on=primary_keys, how="left") - df = pd.merge(df, subset_df, on=primary_keys, how="left") - if tag_df is not None and not tag_df.empty: - df = pd.merge(df, tag_df[primary_keys + ["tag_id"]], on=primary_keys, how="left") - return convert_df_with_bbox_to_df_with_image_data( - df__with_bbox=df, + df__image_data = convert_df_with_bbox_to_df_with_image_data( + df__with_bbox=pd.merge(ground_truth_df, images_df, on=primary_keys), primary_keys=primary_keys, image__image_path__name=image__image_path__name, ) + pk = primary_keys[0] + subset_by_image = ( + subset_df.drop_duplicates(subset=[pk]).set_index(pk)["subset_id"].to_dict() + if not subset_df.empty + else {} + ) + tag_by_image = ( + tag_df.drop_duplicates(subset=[pk]).set_index(pk)["tag_id"].to_dict() + if not tag_df.empty + else {} + ) + for _, row in df__image_data.iterrows(): + row["image_data"].additional_info["subset_id"] = subset_by_image.get(row[pk]) or "none" + row["image_data"].additional_info["tag_id"] = tag_by_image.get(row[pk]) or "none" + return df__image_data[primary_keys + ["image_data"]] def _baseline_and_retrained_model_ids(predictions_df: pd.DataFrame) -> tuple[list[str], list[str]]: - """Earliest-trained model = baseline; the next one = retrained (stable A/B across images).""" + """Earliest-trained model = baseline (A); every later model goes to B (stable A/B across images).""" ids = sorted(predictions_df["detection_model_id"].dropna().unique().tolist()) - return ([ids[0]] if ids else []), (ids[1:2] if len(ids) > 1 else []) + return ([ids[0]] if ids else []), (ids[1:] if len(ids) > 1 else []) def _publish_predictions_for_models( @@ -210,13 +242,19 @@ def _publish_predictions_for_models( pred = predictions_df[predictions_df["detection_model_id"].isin(model_ids)] if pred.empty: return empty - df = pd.merge(pred, images_df, on=primary_keys, how="left") + df = pd.merge(pred, images_df, on=primary_keys) df[model_id_sample_field] = df["detection_model_id"] - return convert_df_with_bbox_to_df_with_image_data( + df__image_data = convert_df_with_bbox_to_df_with_image_data( df__with_bbox=df, - primary_keys=primary_keys, + primary_keys=primary_keys + [model_id_sample_field], image__image_path__name=image__image_path__name, ) + for image_data, model_id in zip( + df__image_data["image_data"], + df__image_data[model_id_sample_field], + ): + image_data.additional_info[model_id_sample_field] = model_id + return df__image_data[primary_keys + ["image_data"]] def publish_to_fiftyone_predictions_baseline( diff --git a/examples/detection_tags/docker-compose.yml b/examples/detection_tags/docker-compose.yml index 0b88bd6b..a82c5a23 100644 --- a/examples/detection_tags/docker-compose.yml +++ b/examples/detection_tags/docker-compose.yml @@ -1,4 +1,4 @@ -# Host-owned bind mounts: mkdir -p .docker-data/minio && HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d +# Host-owned bind mounts: HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # Postgres/Mongo keep image defaults (they cannot run as arbitrary host uid). x-host-user: &host-user user: "${HOST_UID:-1000}:${HOST_GID:-1000}" @@ -33,15 +33,29 @@ services: ports: - "9000:9000" - "9001:9001" + depends_on: + minio-data-init: + condition: service_completed_successfully healthcheck: test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] interval: 10s timeout: 5s retries: 5 + # Bind-mount data dir is often created as root by Docker; MinIO runs as HOST_UID. + minio-data-init: + image: alpine:3.20 + user: "0:0" + volumes: + - type: bind + source: ${DATAPIPE_DOCKER_DATA_DIR:-./.docker-data}/minio + target: /data + entrypoint: ["/bin/sh", "-c", "mkdir -p /data && chown -R ${HOST_UID:-1000}:${HOST_GID:-1000} /data"] + minio-init: - <<: *host-user image: minio/mc:latest + environment: + HOME: /tmp depends_on: minio: condition: service_healthy @@ -70,6 +84,8 @@ services: environment: FIFTYONE_DATABASE_URI: mongodb://mongo:27017 FIFTYONE_DEFAULT_APP_ADDRESS: 0.0.0.0 + HOME: /tmp + MPLCONFIGDIR: /tmp/matplotlib ports: - "5151:5151" volumes: From 7f42738524744bc40d1faafe3ad5a5a4653348ca Mon Sep 17 00:00:00 2001 From: Aleksandr Kozlov Date: Thu, 9 Jul 2026 04:00:23 +0200 Subject: [PATCH 07/18] pipeline improvements --- .claude/skills/setup-detection-tags/SKILL.md | 34 ++++++++++++++++---- examples/detection_tags/detection/app.py | 2 +- examples/detection_tags/pyproject.toml | 4 +-- 3 files changed, 31 insertions(+), 9 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index bb20b56f..11b68b31 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -268,15 +268,31 @@ different left-hand port rather than killing whatever holds it. A/B twist: baseline vs retrained predictions in one dataset (`FIFTYONE_DATASET_NAME`, metadata in MongoDB). -Pipeline steps (`detection/steps.py`): +Pipeline steps (`detection/steps.py` + `detection/app.py` wiring): + 1. `download_images` → `local_images` 2. `publish_to_fiftyone` → `fiftyone_images` (field `images`) -3. `publish_to_fiftyone_ground_truth` → `fiftyone_annotations` (field `annotations`; merges - `subset_id` + `tag_id` onto each sample) +3. `publish_to_fiftyone_ground_truth` → `fiftyone_annotations` (field `annotations`) + - Inputs: `local_images` + `Required(image__ground_truth|subset|tag)` (inner join on annotated images). + - Merges GT with `local_images` only; `subset_id` / `tag_id` come from dict lookups on + `image__subset` / `image__tag` — missing → `"none"` (do not left-merge subset/tag onto GT). 4. `publish_to_fiftyone_predictions_baseline` → `fiftyone_predictions_model_a` (field - `predictions_model_a`; earliest `detection_model_id` → sample field `detection_model_id_a`) + `predictions_model_a`) 5. `publish_to_fiftyone_predictions_retrained` → `fiftyone_predictions_model_b` (field - `predictions_model_b`; second model id → `detection_model_id_b`) + `predictions_model_b`) + +**Prediction publish wiring (important):** both steps use +`inputs=[Required("local_images"), Required("detection_prediction_train")]` and +`transform_keys=["image_name", "detection_model_id"]`. That inner-joins images to rows that actually +have train predictions — a full join on all `local_images` puts `NaN` in `detection_model_id` for +images without predictions (e.g. some `*__night.jpg` in val-only) and Postgres errors with +`varchar = double precision`. Input order must stay `local_images` first, then +`detection_prediction_train` — it matches `(images_df, predictions_df)` in `steps.py`. + +**A/B model assignment:** earliest sorted `detection_model_id` → baseline (A, +`detection_model_id_a`); **every later** id → retrained (B, `detection_model_id_b`) — `ids[1:]`, not +just the second model. With 3+ models, B publishes all non-baseline models (same as the old +`publish_predictions_to_fiftyone` slot behaviour). Stores share one `fo_session` / dataset (`detection/data.py`). Separate `detection_model_id_a` / `detection_model_id_b` sample fields avoid the two prediction stores clobbering each other. @@ -291,7 +307,8 @@ Docker created the bind mount as root. The service bind-mounts The pipeline still uses the **`fiftyone` Python lib** from `datapipe-ml[fiftyone]` to publish samples; only the App server runs in Docker (no host `fiftyone app launch` needed). -`tag_id` and `subset_id` are ordinary **sample fields** (from the GT publish merge) — NOT FiftyOne's +`tag_id` and `subset_id` are ordinary **sample fields** (set in GT publish via dict lookup on +`image__subset` / `image__tag`) — NOT FiftyOne's native "sample tags". Filter in the sidebar: `tag_id = night` AND `subset_id = val` (field filters, not native TAGS OR-semantics). After part 2, `predictions_model_b` shows model B catching boxes model A missed in the dark. @@ -327,6 +344,11 @@ to a file + `grep`, not inline. - **Metrics 0 on a trained model** → tiny/noisy val latches an early "best" checkpoint; use enough data (~450 total) and the shipped epoch config. - **Training exits 0 but no model** → datapipe swallows step errors; check `detection_training_status`. +- **`stage=fiftyone` fails: `operator does not exist: character varying = double precision`** on + `detection_prediction_train_meta` — batch index included `local_images` without matching + predictions (`detection_model_id` = `NaN`). Fix: both prediction publish inputs must be + `Required(...)` and `transform_keys` must include `detection_model_id` (see FiftyOne section). + Re-run `datapipe step --labels=stage=fiftyone run` after fixing `app.py`. ## Real data diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index 12ed0927..5b1bcd28 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -62,7 +62,7 @@ output__detection_frozen_dataset="detection_frozen_dataset", output__detection_frozen_dataset__has__image_gt="detection_frozen_dataset__has__image_gt", working_dir=str(DATAPIPE_DIR), - min_within_time="1s", + min_within_time="5min", min_delta=10, primary_keys=["image_name"], bbox_id__name=None, diff --git a/examples/detection_tags/pyproject.toml b/examples/detection_tags/pyproject.toml index 91875ba5..3fd7f7e4 100644 --- a/examples/detection_tags/pyproject.toml +++ b/examples/detection_tags/pyproject.toml @@ -8,8 +8,8 @@ dependencies = [ "torch==2.6.0", "torchvision==0.21.0", "stringzilla==4.4.0", # needed by albumentations - # "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) - # "pi-heif", # ultralytics image verification imports it + "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) + "pi-heif", # ultralytics image verification imports it ] [[tool.uv.index]] From 5af668da0ec839a7aad845bb9d1a2db2312409d7 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 08:09:37 +0000 Subject: [PATCH 08/18] detection_tags: deterministic training (seed=42, workers=0, CUBLAS_WORKSPACE_CONFIG) for reproducible metrics --- examples/detection_tags/detection/app.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index 5b1bcd28..8591e928 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -1,5 +1,12 @@ from __future__ import annotations +import os + +# Deterministic training: cuBLAS needs CUBLAS_WORKSPACE_CONFIG set BEFORE torch/CUDA init, so set it +# here at the entrypoint — the train subprocess inherits it. Pairs with seed + deterministic=True in +# YoloV8_TrainingConfig to keep model-A / model-B metrics reproducible run-to-run on the same GPU. +os.environ.setdefault("CUBLAS_WORKSPACE_CONFIG", ":4096:8") + from datapipe.compute import Pipeline from datapipe.datatable import DataStore from datapipe.step.batch_transform import BatchTransform @@ -86,7 +93,7 @@ working_dir=str(DATAPIPE_DIR), tmp_folder=datapipe_tmp_folder(), yolov8_train_configs=[ - YoloV8_TrainingConfig(model="yolov8n.pt", imgsz=320, batch=10, epochs=10, exist_ok=True) + YoloV8_TrainingConfig(model="yolov8n.pt", imgsz=320, batch=10, epochs=10, exist_ok=True, seed=42, workers=0) ], sync_config=TrainingSyncConfig(enabled=True, interval_s=30, retries=3, retry_sleep_s=30), resume_config=TrainingResumeConfig( From db09122c8cc85561487c04ba69f6259bbb7ac2ea Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 08:53:16 +0000 Subject: [PATCH 09/18] detection_tags: build_cache.py (download-once cache) + unify pool order (sorted filenames + baked shuffle) so cache == download selection --- .../detection_tags/detection/coco_demo.py | 21 ++++--- .../detection_tags/scripts/build_cache.py | 59 +++++++++++++++++++ 2 files changed, 73 insertions(+), 7 deletions(-) create mode 100644 examples/detection_tags/scripts/build_cache.py diff --git a/examples/detection_tags/detection/coco_demo.py b/examples/detection_tags/detection/coco_demo.py index fd24eb2b..17d955b9 100644 --- a/examples/detection_tags/detection/coco_demo.py +++ b/examples/detection_tags/detection/coco_demo.py @@ -72,23 +72,30 @@ def darken(raw: bytes, gamma: float) -> bytes: class CocoDemoSource: """Deterministic shuffled pool of COCO cat/dog filenames + per-file (bytes, boxes, labels). - Prefers a pre-staged cache (`$DATAPIPE_TAGS_CACHE_DIR/gt.json` + `images/`) so loads are fast - and offline; falls back to fetching from COCO. Order is a fixed shuffle (RNG_SEED) so `offset`/`n` - slices are reproducible across runs. + Canonical pool order = filenames sorted, then a fixed seeded shuffle (RNG_SEED), so `offset`/`n` + slices are reproducible across runs and machines. Prefers a pre-staged cache + (`$DATAPIPE_TAGS_CACHE_DIR/gt.json` + `images/`, built by scripts/build_cache.py, which persists + the first N of that canonical order); loads then read the cached key order AS-IS. Falls back to + downloading from COCO in the same canonical order, so cache and download select identically. """ def __init__(self) -> None: cache_gt_path = CACHE / "gt.json" self._use_cache = cache_gt_path.exists() and (CACHE / "images").is_dir() if self._use_cache: + # The cache is pre-shuffled at build time (build_cache.py bakes in the canonical order), + # so read the persisted key order AS-IS. Re-sorting/re-shuffling here would diverge from + # the download path's selection for the same offset/n slices. self._cache_gt = json.loads(cache_gt_path.read_text()) - pool = sorted(self._cache_gt.keys()) + pool = list(self._cache_gt.keys()) else: + # Canonical order: sort by FILENAME (machine-independent) then a fixed seeded shuffle. + # build_cache.py persists the first N of THIS order, so cache == download for any offset. self._id_to_img, self._anns = _coco_annotations_by_image() - pool = [self._id_to_img[i]["file_name"] for i in sorted(self._anns.keys())] self._fn_to_id = {self._id_to_img[i]["file_name"]: i for i in self._anns.keys()} - random.seed(RNG_SEED) - random.shuffle(pool) + pool = sorted(self._fn_to_id.keys()) + random.seed(RNG_SEED) + random.shuffle(pool) self.pool = pool def fetch(self, fn: str) -> tuple[bytes, list, list]: diff --git a/examples/detection_tags/scripts/build_cache.py b/examples/detection_tags/scripts/build_cache.py new file mode 100644 index 00000000..2e755978 --- /dev/null +++ b/examples/detection_tags/scripts/build_cache.py @@ -0,0 +1,59 @@ +"""Build the pre-staged demo cache once (download from COCO), so later loads are fast + offline and +the download and cache selections agree byte-for-byte. + +Writes ``$DATAPIPE_TAGS_CACHE_DIR/gt.json`` + ``images/`` for the first N images of the CANONICAL +pool order (filenames sorted, then the fixed seeded shuffle in coco_demo). Because the cache persists +that exact order and loads read it AS-IS, an offset/n slice picks the same images whether it came from +a fresh download or from the cache — on any machine. + +Run from ``examples/detection_tags/detection`` (so ``import coco_demo`` / ``config`` resolve): + + python ../scripts/build_cache.py [N] # default N=500 + +Forces DOWNLOAD mode (temporarily hides any existing gt.json), rebuilds gt.json + images from scratch, +and restores the previous cache if the build fails partway. +""" +from __future__ import annotations + +import json +import sys +from pathlib import Path + +import coco_demo + + +def main() -> int: + n = int(sys.argv[1]) if len(sys.argv) > 1 else 500 + cache: Path = coco_demo.CACHE + images_dir = cache / "images" + images_dir.mkdir(parents=True, exist_ok=True) + gt_path = cache / "gt.json" + + # Force download mode so we build from the canonical COCO-derived order, not an existing cache. + bak = cache / "gt.json.bak" + if gt_path.exists(): + gt_path.rename(bak) + + try: + src = coco_demo.CocoDemoSource() + assert not src._use_cache, "expected download mode — remove/rename the cache gt.json first" + gt: dict = {} + for i, fn in enumerate(src.pool[:n], 1): + raw, boxes, labels = src.fetch(fn) # original (undarkened) bytes + (images_dir / fn).write_bytes(raw) + gt[fn] = {"bboxes": boxes, "labels": labels} + if i % 50 == 0 or i == n: + print(f" {i}/{n} cached", flush=True) + gt_path.write_text(json.dumps(gt)) # insertion order == canonical first-N + except BaseException: + if bak.exists() and not gt_path.exists(): + bak.rename(gt_path) # restore prior cache on failure + raise + + bak.unlink(missing_ok=True) + print(f"cache built: {len(gt)} images -> {cache}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From bfd3f04a625b372d132bafdcc05ca13ede98ebb8 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 11:13:18 +0000 Subject: [PATCH 10/18] =?UTF-8?q?detection=5Ftags:=20build=5Fcache.py=20?= =?UTF-8?q?=E2=80=94=20sys.path.insert=20so=20import=20coco=5Fdemo=20resol?= =?UTF-8?q?ves=20when=20run=20from=20detection/?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- examples/detection_tags/scripts/build_cache.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/examples/detection_tags/scripts/build_cache.py b/examples/detection_tags/scripts/build_cache.py index 2e755978..b82daa33 100644 --- a/examples/detection_tags/scripts/build_cache.py +++ b/examples/detection_tags/scripts/build_cache.py @@ -19,7 +19,8 @@ import sys from pathlib import Path -import coco_demo +sys.path.insert(0, ".") # run from examples/detection_tags/detection so `import coco_demo` resolves +import coco_demo # noqa: E402 def main() -> int: From 19b91a6c53669a6969159e6b124ca3ab7eed3448 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 11:29:19 +0000 Subject: [PATCH 11/18] =?UTF-8?q?detection=5Ftags=20skill:=20UI-v2=20reali?= =?UTF-8?q?ty=20=E2=80=94=20cat=5Fdog=20spec,=20pipeline=5Fmodel=5F=5Fmetr?= =?UTF-8?q?ics=5F*=20tables,=20FiftyOne=20via=20compose,=20night/val=20gen?= =?UTF-8?q?eralization=20caveat?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/setup-detection-tags/SKILL.md | 137 +++++++------------ 1 file changed, 48 insertions(+), 89 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 11b68b31..c01d8c87 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -4,7 +4,7 @@ description: > Use when setting up or running examples/detection_tags — a self-contained datapipe detection demo built around tags (per-scenario metrics), split into two parts around a checkpoint (train a baseline, then add a tagged TRAIN batch and retrain, watching the tag metric rise), served under the - datapipe-app UI front (graph + observability + the detection_tags_yolo ops-spec; training triggered + datapipe-app UI front (graph + observability + the cat_dog ops-spec; training triggered from the UI) with a FiftyOne view and injected ground truth (no Label Studio). Also for "add a tagged batch, retrain, watch the tag metric rise" and for rehearsing that retraining demo from a saved checkpoint. --- @@ -12,10 +12,8 @@ description: > # detection_tags (tags demo — two-part, FiftyOne, no Label Studio) Detection pipeline whose whole point is **tags**: train a baseline (model A), then add a **tagged -scenario TRAIN batch** and retrain (model B), and watch recall on that tag rise in -`pipeline_model__metrics_by_tag_on_subset`. Ground truth is **injected** (COCO cat/dog via -`coco_demo`, lowercase labels) — no Label Studio. Metrics use two **`CountMetrics_Subset_PipelineModel`** -steps (subset + tag arc); ops-spec id **`detection_tags_yolo`**. +scenario TRAIN batch** and retrain (model B), and watch recall on that tag rise in a `tag_metrics` +table. Ground truth is **injected** (COCO labels, lowercase `cat`/`dog`) — no human annotation. The two-part / checkpoint split below is a **presentation device for the live demo only** — it lets you prep part 1 ahead of time, present part 2, and rehearse it. It is NOT required to use the pipeline: @@ -105,8 +103,8 @@ port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), d ```bash cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI -HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151). No Label Studio. -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] (+ pi-heif if needed) +HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151); HOST_UID/GID avoid sudo perms. No Label Studio. +uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif # On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection @@ -116,9 +114,8 @@ datapipe db create-all ``` Then bring up the **datapipe-app UI front** — it serves the pipeline graph, the observability panels -(training status/curves + the `detection_tags_yolo` ops-spec with `model_metrics`, -`tag_metrics_on_subset`, and the two **class_metrics** tables), and the **run triggers** you use to -launch training: +(training status/curves + the `cat_dog` ops-spec with the `model_metrics` and `tag_metrics` +tables), and the **run triggers** you use to launch training: ```bash # from examples/detection_tags/detection, .env sourced; run it under tmux/nohup so it survives ssh drops @@ -127,7 +124,7 @@ datapipe --pipeline app api --host 127.0.0.1 --port 8000 Bind to `127.0.0.1` (not `0.0.0.0`) and reach it over an SSH tunnel `-L 8000:localhost:8000`; open `http://localhost:8000`. The `app.add_specs([...])` block in `detection/app.py` is what registers the -`detection_tags_yolo` spec the front renders. +`cat_dog` spec the front renders. ## Part 1 — set up + load + verify, then STOP (you trigger model-A training from the UI) @@ -154,19 +151,17 @@ observability panels (training status/curves). When it finishes, compute metrics ```bash # CLI equivalent (no-UI) of what you trigger in the front: datapipe step --labels=stage=train run # split -> freeze -> train model A -> inference -datapipe step --labels=stage=count-metrics run # subset metrics + tag metrics (two PipelineModel steps) +datapipe step --labels=stage=count-metrics run # metrics_on_image/subset + tag_metrics # count-metrics can print "Batches to process 0" right after training — RE-RUN it once. (Troubleshooting.) -datapipe step --labels=stage=fiftyone run # download → images → annotations → model_a → model_b +datapipe step --labels=stage=fiftyone run # download_images -> GT + model-A predictions # (demo-only) snapshot the post-A state to rehearse part 2 later: docker exec pg_dump -U postgres -n "$DB_SCHEMA" postgres > /tmp/checkpoint.sql ``` **After model A, hand the baseline over:** -- show the **full** metric tables (`model_metrics` → `pipeline_model__metrics_on_subset`; - `tag_metrics_on_subset` → `pipeline_model__metrics_by_tag_on_subset`; plus class tables - `pipeline_model__metrics_by_cls_on_subset` / `pipeline_model__metrics_by_tag_by_cls_on_subset`) - — in the front's `detection_tags_yolo` spec or via the RULE query below; `tag_id=night, subset_id=val` - recall for model A is **low** (baseline blind in the dark); +- show the **full** metric tables (`model_metrics` / `metrics_on_subset` + `tag_metrics`) — in the + front's `cat_dog` spec or via the RULE query below; `tag_metrics` for model A at + `night/val` is **low** (baseline blind in the dark); - point the user at the **datapipe-app front** (graph + observability + the two metric tables) and the **FiftyOne App** (GT vs model-A predictions) — give the addresses / tunnels (see "Let the user watch"); - then ask whether to proceed to part 2 (retrain). That's the problem part 2 fixes. @@ -186,8 +181,8 @@ The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retr python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 datapipe step --labels=stage=load run # 500 images total # VERIFY val stayed frozen (night went to TRAIN only): -# SELECT h.subset_id, count(*) FROM image__tag it -# JOIN image__subset_hint h USING(image_name) WHERE it.tag_id='night' GROUP BY h.subset_id +# SELECT h.subset_id, count(*) FROM image__tag it JOIN tag t USING(tag_id) +# JOIN image__subset_hint h USING(image_name) WHERE t.tag_name='night' GROUP BY h.subset_id # -- expect train=50, val=25 ``` @@ -201,7 +196,7 @@ datapipe step --labels=stage=fiftyone run # adds predictions_model_b ``` `night/val` recall rises from model A to model B — the payoff. Show the full tables again (in the -front's `detection_tags_yolo` metrics tables, or the RULE query below). +front's `cat_dog` metrics tables, or the RULE query below). ## Rehearse part 2 from the snapshot (demo-only) @@ -225,13 +220,16 @@ docker exec psql -U postgres -x -c \ "SELECT * FROM $DB_SCHEMA.pipeline_model__metrics_by_tag_on_subset ORDER BY detection_model_id, tag_id, subset_id" ``` -`tag_id` **is the tag name itself** (text, e.g. `night`) — no numeric surrogate, no join needed. The -`tag` dimension is two columns: `tag_id` (name) + `tag_description` (readable, notes darkening). +Metrics live in `pipeline_model__metrics_on_subset` (overall, shown as **Model metrics** in the front) +and `pipeline_model__metrics_by_tag_on_subset` (per-tag, **Tag metrics**). `calc__support` is the GT +**box** count (≥ image count — an image can hold several cat/dog boxes); recall/precision have +`weighted`/`macro` variants. `tag_id` **is the tag name itself** (text, e.g. `night`) — no numeric +surrogate, no join. The `tag` dimension is two columns: `tag_id` (name) + `tag_description`. -The payoff comparison: `pipeline_model__metrics_by_tag_on_subset` at `tag_id=night, subset_id=val`, -model A vs model B — `calc__weighted_recall` / `calc__weighted_f1_score` rise. FindBestModel also uses -`calc__weighted_f1_score` on `pipeline_model__metrics_on_subset`. -The night/val set is small (25 images), so treat the rise as **directional**. +The payoff: `pipeline_model__metrics_by_tag_on_subset` at `tag=night`, model A vs B. The **reliable +signal is night/train** (rises sharply once night is in training). **night/val is directional** — it +rises only if the model *generalizes* the low-light scenario (needs enough night-train + epochs); +with too few, model B memorizes night-train and night/val stays flat. ## Let the user watch (offer it — work out the specifics per setup) @@ -242,15 +240,13 @@ runtime (local vs remote host, which ports are free, tunnels if remote) and give directly in chat: - **the datapipe-app front** (`datapipe --pipeline app api --host 127.0.0.1 --port 8000`, tunnel 8000) - — the pipeline graph, observability panels (training status/curves), the `detection_tags_yolo` - ops-spec with `model_metrics` + `tag_metrics_on_subset` + **class_metrics** (`subset_class_metrics`, - `tag_class_metrics_on_subset`), and the **run triggers** the user presses + — the pipeline graph, observability panels (training status/curves), the `cat_dog` + ops-spec with the `model_metrics` + `tag_metrics` tables, and the **run triggers** the user presses to launch model A / model B. This is the primary surface in the UI setup. - **tables** in DBeaver (Postgres → the `$DB_SCHEMA` schema): `pipeline_model__metrics_on_subset`, - `pipeline_model__metrics_by_tag_on_subset`, `pipeline_model__metrics_by_cls_on_subset`, - `detection_training_status`. -- **images** in the FiftyOne App: `annotations` vs `predictions_model_a` vs `predictions_model_b`, - filterable by sample fields `tag_id` / `subset_id`. + `pipeline_model__metrics_by_tag_on_subset`, `detection_training_status`. +- **images** in the FiftyOne App: `ground_truth` vs `predictions_model_a` vs `predictions_model_b`, + filterable by `tag`/`subset`. - **training progress**: the run streams to a log file — tail it; trust `detection_training_status.status`, not exit codes. @@ -264,54 +260,22 @@ different left-hand port rather than killing whatever holds it. ## FiftyOne -`stage=fiftyone` follows **`examples/e2e_template/image_detection`** (same step order), with an -A/B twist: baseline vs retrained predictions in one dataset (`FIFTYONE_DATASET_NAME`, metadata in -MongoDB). - -Pipeline steps (`detection/steps.py` + `detection/app.py` wiring): - -1. `download_images` → `local_images` -2. `publish_to_fiftyone` → `fiftyone_images` (field `images`) -3. `publish_to_fiftyone_ground_truth` → `fiftyone_annotations` (field `annotations`) - - Inputs: `local_images` + `Required(image__ground_truth|subset|tag)` (inner join on annotated images). - - Merges GT with `local_images` only; `subset_id` / `tag_id` come from dict lookups on - `image__subset` / `image__tag` — missing → `"none"` (do not left-merge subset/tag onto GT). -4. `publish_to_fiftyone_predictions_baseline` → `fiftyone_predictions_model_a` (field - `predictions_model_a`) -5. `publish_to_fiftyone_predictions_retrained` → `fiftyone_predictions_model_b` (field - `predictions_model_b`) - -**Prediction publish wiring (important):** both steps use -`inputs=[Required("local_images"), Required("detection_prediction_train")]` and -`transform_keys=["image_name", "detection_model_id"]`. That inner-joins images to rows that actually -have train predictions — a full join on all `local_images` puts `NaN` in `detection_model_id` for -images without predictions (e.g. some `*__night.jpg` in val-only) and Postgres errors with -`varchar = double precision`. Input order must stay `local_images` first, then -`detection_prediction_train` — it matches `(images_df, predictions_df)` in `steps.py`. - -**A/B model assignment:** earliest sorted `detection_model_id` → baseline (A, -`detection_model_id_a`); **every later** id → retrained (B, `detection_model_id_b`) — `ids[1:]`, not -just the second model. With 3+ models, B publishes all non-baseline models (same as the old -`publish_predictions_to_fiftyone` slot behaviour). - -Stores share one `fo_session` / dataset (`detection/data.py`). Separate `detection_model_id_a` / -`detection_model_id_b` sample fields avoid the two prediction stores clobbering each other. - -**App UI:** `docker compose up` starts **`fiftyone`** (`voxel51/fiftyone:1.17.0` on **:5151**), wired -to the same MongoDB. Open **http://localhost:5151** (remote → SSH tunnel `-L 5151:localhost:5151`). -Like e2e: run `HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d` — compose includes -**minio-data-init** (root `chown` on `.docker-data/minio`) so MinIO can write as your uid even if -Docker created the bind mount as root. The service bind-mounts -`DATAPIPE_TAGS_TMP_DIR` (default `/tmp/datapipe-tags`) read-only; local images go to -`$DATAPIPE_TAGS_TMP_DIR/local_images` (override with `LOCAL_IMAGES_DIR` if needed). -The pipeline still uses the **`fiftyone` Python lib** from `datapipe-ml[fiftyone]` to publish samples; -only the App server runs in Docker (no host `fiftyone app launch` needed). - -`tag_id` and `subset_id` are ordinary **sample fields** (set in GT publish via dict lookup on -`image__subset` / `image__tag`) — NOT FiftyOne's -native "sample tags". Filter in the sidebar: `tag_id = night` AND `subset_id = val` (field filters, -not native TAGS OR-semantics). After part 2, `predictions_model_b` shows model B catching boxes model A -missed in the dark. +`stage=fiftyone` downloads images locally then publishes to one dataset (`FIFTYONE_DATASET_NAME`, +metadata in MongoDB): fields `ground_truth`, `predictions_model_a` (baseline), `predictions_model_b` +(retrained), plus sample fields `tag` and `subset`. Ported straight from +`examples/e2e_template/image_detection` (same `download_images` + `publish_to_fiftyone` + +`FiftyOneImagesDataTableStore`); the two model fields are assigned by sorted model-id (earliest = +`model_a`). The FiftyOne App is a **docker-compose service** (`fiftyone` on :5151) — no manual +`fiftyone app launch`; after `stage=fiftyone`, open `http://localhost:5151` (tunnel 5151; local port +MUST equal remote — the App's WebSocket calls the same port). + +`tag` and `subset` are ordinary **sample fields** (set in-pipeline by `publish_gt_to_fiftyone`, no +scripts) — NOT FiftyOne's native "sample tags". Filter by the **fields** in the sidebar: pick +`tag = night` and `subset = val` — different fields AND together, so you get exactly the night-val +set. (Selecting multiple values inside FiftyOne's native TAGS panel ORs them, which is why we do NOT +mirror tag/subset into native tags.) That isolates where model A misses in the dark; after part 2, +`predictions_model_b` shows model B catching it. Fields stay `predictions_model_a` (baseline, +earliest model id) / `predictions_model_b` (retrained); the exact model ids are in the DB tables. ## How to work @@ -330,8 +294,8 @@ to a file + `grep`, not inline. then verify `python -c "import polars; print(polars.__version__)"` is the lts one. - **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. - **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated - the fresh predictions in the same pass. Re-run `count-metrics` once; then `pipeline_model__metrics_*` - tables fill (subset + tag + class metrics). + the fresh predictions in the same pass. Re-run `count-metrics` once; then `metrics_on_image/subset` + and `tag_metrics` fill. - **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` separately; the split between them changes `image__subset`, which re-freezes the dataset and retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. @@ -344,11 +308,6 @@ to a file + `grep`, not inline. - **Metrics 0 on a trained model** → tiny/noisy val latches an early "best" checkpoint; use enough data (~450 total) and the shipped epoch config. - **Training exits 0 but no model** → datapipe swallows step errors; check `detection_training_status`. -- **`stage=fiftyone` fails: `operator does not exist: character varying = double precision`** on - `detection_prediction_train_meta` — batch index included `local_images` without matching - predictions (`detection_model_id` = `NaN`). Fix: both prediction publish inputs must be - `Required(...)` and `transform_keys` must include `detection_model_id` (see FiftyOne section). - Re-run `datapipe step --labels=stage=fiftyone run` after fixing `app.py`. ## Real data From c8d66ec16601a81ef657111b77f208207cf7c2a0 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 12:44:49 +0000 Subject: [PATCH 12/18] detection_tags: batch recipe 275/75/75/75, deterministic reference numbers, build_cache + freeze-rerun troubleshooting --- .claude/skills/setup-detection-tags/SKILL.md | 44 ++++++++++++------- examples/detection_tags/README.md | 8 ++-- .../detection_tags/scripts/add_request.py | 8 ++-- 3 files changed, 35 insertions(+), 25 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index c01d8c87..f48c46b4 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -69,14 +69,18 @@ the cache — see Troubleshooting): | batch | n | offset | subset | tag | darken | when | |-------|---|--------|--------|-----|--------|------| -| `base-train` | 325 | 0 | train | — | — | part 1 | -| `base-val` | 100 | 325 | val | — | — | part 1 | -| `night-val` | 25 | 425 | val | night | 0.25 | part 1 | -| `night-train`| 50 | 450 | train | night | 0.25 | part 2 | - -Validated on gpu5: model A → train recall ~0.95, night/val recall ~0.09 (blind in the dark); after -part 2, model B → night/train recall ~0.86. Keep night/val small but not tiny (25 imgs / ~45 GT) — -below ~20 the val payoff is pure ±1-box noise and can even go the wrong way. +| `base-train` | 275 | 0 | train | — | — | part 1 | +| `base-val` | 75 | 275 | val | — | — | part 1 | +| `night-val` | 75 | 350 | val | night | 0.25 | part 1 | +| `night-train`| 75 | 425 | train | night | 0.25 | part 2 | + +**Deterministic reference** (gpu5, GTX 1070, seed=42, epochs=10): model A → overall/train recall 0.819, +night/val 0.176; model B → overall/train 0.944, **night/train 0.295 → 0.962** (the payoff), night/val +0.165. The **reliable signal is night/train**. **night/val does NOT rise** at this size/epochs — model +B memorizes the night-train images rather than generalizing low-light, so night/val stays ~flat; a real +val gain needs more night-train + epochs (or milder `--darken`). These exact numbers reproduce on the +**same GPU/CUDA/torch stack** (training determinism is per-hardware); the data/splits/tags reproduce on +any machine (seeded canonical cache). ## Pre-flight — CHECK what's already there, then ASK (do this before deploying) @@ -133,9 +137,9 @@ pipe** — then stop. Training is **yours to trigger from the datapipe-app front ```bash # SKILL DOES — from examples/detection_tags/detection, with .env sourced: -python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train -python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val -python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 +python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val +python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 datapipe step --labels=stage=load run # 450 images; val frozen (100 base + 25 night) # VERIFY the data is in the pipe before handing off: @@ -178,7 +182,7 @@ The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retr ```bash # SKILL DOES — add the tagged TRAIN batch and load it (val stays frozen): -python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 +python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 datapipe step --labels=stage=load run # 500 images total # VERIFY val stayed frozen (night went to TRAIN only): # SELECT h.subset_id, count(*) FROM image__tag it JOIN tag t USING(tag_id) @@ -285,17 +289,23 @@ to a file + `grep`, not inline. ## Troubleshooting (verify against current files) -- **Pre-staged cache is exactly 500 images** → `gt.json` in the cache dir caps the pool. An `offset` - past 500 yields an empty batch silently. Keep the batch total ≤ 500, or rebuild the cache larger - (or point `DATAPIPE_TAGS_CACHE_DIR` at a fresh dir to force a full COCO download). +- **Building the cache / fresh host** → `python ../scripts/build_cache.py [N]` (default 500) downloads + the first N images of the canonical order + writes `gt.json` + `images/`; deterministic — byte-identical + on any COCO-reachable machine. Run once, then loads are fast + offline. The cache caps the pool at its + size, so keep the batch total ≤ N. NOTE: from RU (e.g. gpu5/Moscow) `images.cocodataset.org` is + unreachable — build the cache off-RU and copy `$DATAPIPE_TAGS_CACHE_DIR` (gt.json + images/) to the host. - **`SIGILL` / `Illegal instruction` in training** → `polars` built for a newer CPU than the host (pre-AVX2). The `polars-lts-cpu` pin isn't enough alone; the regular `polars` comes in transitively. After `uv sync`: `uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1`, then verify `python -c "import polars; print(polars.__version__)"` is the lts one. - **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. - **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated - the fresh predictions in the same pass. Re-run `count-metrics` once; then `metrics_on_image/subset` - and `tag_metrics` fill. + the fresh predictions in the same pass. Re-run `count-metrics` once; then the metric tables fill. +- **Model B didn't learn night-train (trains on the OLD frozen dataset)** → after loading `night-train`, + the first `stage=train` re-splits `image__subset` (→ 350 train) but may NOT re-freeze in the same pass + (same propagation lag). If `detection_frozen_dataset__train_images_count` didn't grow, **re-run + `stage=train` once** — the freeze then updates (a new `detection_frozen_dataset` row) and model B trains + on the full set (night/train recall jumps). - **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` separately; the split between them changes `image__subset`, which re-freezes the dataset and retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 78d9b16f..dc30d28f 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -31,9 +31,9 @@ the split step honors it. The pre-staged cache holds **500 images**, so keep the ## Part 1 — baseline to checkpoint ```bash # from examples/detection_tags/detection -python ../scripts/add_request.py --id base-train --n 325 --offset 0 --subset train -python ../scripts/add_request.py --id base-val --n 100 --offset 325 --subset val -python ../scripts/add_request.py --id night-val --n 25 --offset 425 --subset val --tag night --darken 0.25 +python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val +python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 datapipe step --labels=stage=load run datapipe step --labels=stage=train run # model A datapipe step --labels=stage=count-metrics run # re-run once if it prints "Batches to process 0" @@ -44,7 +44,7 @@ datapipe step --labels=stage=fiftyone run # GT + model-A predictions int ## Part 2 — retrain and watch the tag metric rise ```bash -python ../scripts/add_request.py --id night-train --n 50 --offset 450 --subset train --tag night --darken 0.25 +python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 datapipe step --labels=stage=load run datapipe step --labels=stage=train run # model B (night now in training) datapipe step --labels=stage=count-metrics run # re-run once if "0 batches" diff --git a/examples/detection_tags/scripts/add_request.py b/examples/detection_tags/scripts/add_request.py index 790c3b4a..1c63e987 100644 --- a/examples/detection_tags/scripts/add_request.py +++ b/examples/detection_tags/scripts/add_request.py @@ -3,11 +3,11 @@ Fixed-val demo (freeze val up front, add the tagged train batch later): # loaded BEFORE training model A — val is frozen from the start - python ../scripts/add_request.py --id base-train --n 400 --offset 0 --subset train - python ../scripts/add_request.py --id base-val --n 100 --offset 400 --subset val - python ../scripts/add_request.py --id night-val --n 50 --offset 500 --subset val --tag night --darken 0.25 + python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train + python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val + python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 # loaded BEFORE retraining model B (the tagged TRAIN batch — the fix) - python ../scripts/add_request.py --id night-train --n 50 --offset 550 --subset train --tag night --darken 0.25 + python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 --subset train|val pins every image of the batch to that subset so the random split never moves it. Run from examples/detection_tags/detection (so `import config` resolves).""" From bdbc012787dfd2141d869064fef65660b31aa643 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 14:04:54 +0000 Subject: [PATCH 13/18] =?UTF-8?q?detection=5Ftags:=20repro=5Ffingerprint.p?= =?UTF-8?q?y=20=E2=80=94=20per-layer=20md5s=20(cache/darken/env/weights)?= =?UTF-8?q?=20to=20localize=20cross-machine=20divergence?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/repro_fingerprint.py | 84 +++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 examples/detection_tags/scripts/repro_fingerprint.py diff --git a/examples/detection_tags/scripts/repro_fingerprint.py b/examples/detection_tags/scripts/repro_fingerprint.py new file mode 100644 index 00000000..6ef4ee64 --- /dev/null +++ b/examples/detection_tags/scripts/repro_fingerprint.py @@ -0,0 +1,84 @@ +"""Reproducibility fingerprint — run on EACH machine and diff the outputs. + +Prints md5 fingerprints at every data-layer boundary plus the environment, so a cross-machine +metric divergence can be pinned to a specific layer: + + [cache] gt.json + raw image bytes -> differ => different cache/build + [darken] darken(raw, 0.25) bytes -> differ => PIL/numpy stack differs (not using uv.lock?) + [env] lib versions, GPU, CUDA, cuDNN -> differ => not the same software stack / hardware + [model] best.pt of each trained model -> differ with all above equal => GPU-arch training divergence + +Run from examples/detection_tags/detection: ../.venv/bin/python ../scripts/repro_fingerprint.py +""" +from __future__ import annotations + +import hashlib +import json +import os +import platform +import sys +from pathlib import Path + +sys.path.insert(0, ".") +import coco_demo # noqa: E402 + + +def md5(b: bytes) -> str: + return hashlib.md5(b).hexdigest() + + +def main() -> int: + print("== env ==") + print("python", platform.python_version(), platform.machine(), platform.system()) + import importlib.metadata as m + for p in ["torch", "torchvision", "ultralytics", "pillow", "numpy", "opencv-python-headless"]: + try: + print(p, m.version(p)) + except Exception: + print(p, "not-installed") + try: + import torch + print("cuda", torch.version.cuda, "cudnn", torch.backends.cudnn.version(), + "gpu", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "none") + except Exception as e: + print("torch probe failed:", e) + + print("== cache ==") + gt_path = coco_demo.CACHE / "gt.json" + gt = json.loads(gt_path.read_text()) + print("gt.json md5", md5(gt_path.read_bytes()), "keys", len(gt)) + keys = list(gt.keys()) + print("keys-order md5", md5("\n".join(keys).encode())) + probe = keys[0] + raw = (coco_demo.CACHE / "images" / probe).read_bytes() + print(f"raw[{probe}] md5", md5(raw)) + + print("== darken ==") + dark = coco_demo.darken(raw, 0.25) + print(f"darken(raw,0.25) md5", md5(dark)) + + print("== trained models: WEIGHT hashes (state_dict tensors, not file bytes) ==") + # file md5 is misleading — checkpoints embed dates/paths; hash the tensors instead. + tmp = Path(os.environ.get("DATAPIPE_TAGS_TMP_DIR", "/tmp/datapipe-tags")) + found = sorted(tmp.rglob("best.pt")) + if found: + import torch + + def whash(p: Path) -> str: + ckpt = torch.load(p, map_location="cpu", weights_only=False) + sd = ckpt["model"].state_dict() if isinstance(ckpt, dict) and "model" in ckpt else ckpt + h = hashlib.md5() + for k in sorted(sd): + h.update(k.encode()) + h.update(sd[k].cpu().numpy().tobytes()) + return h.hexdigest() + + for p in found[-6:]: + print(p.parent.parent.name, whash(p)) + else: + print("(no best.pt under", tmp, ")") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) From 0d3683a866b3ecf14846fe6dade1640acedab3b5 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 15:57:13 +0000 Subject: [PATCH 14/18] =?UTF-8?q?detection=5Ftags:=20validated=20demo=20re?= =?UTF-8?q?cipe=20=E2=80=94=203-gamma=20night-train=20(B=20beats=20A=20on?= =?UTF-8?q?=20both=20val=20sets,=20+0.09..+0.13),=20freeze=20debounce=201s?= =?UTF-8?q?=20for=20fast=20part-2,=20reference=20numbers?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/setup-detection-tags/SKILL.md | 51 +++++++++++-------- examples/detection_tags/README.md | 10 ++-- examples/detection_tags/detection/app.py | 2 +- .../detection_tags/scripts/add_request.py | 10 ++-- 4 files changed, 43 insertions(+), 30 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index f48c46b4..5f57f131 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -69,18 +69,24 @@ the cache — see Troubleshooting): | batch | n | offset | subset | tag | darken | when | |-------|---|--------|--------|-----|--------|------| -| `base-train` | 275 | 0 | train | — | — | part 1 | -| `base-val` | 75 | 275 | val | — | — | part 1 | -| `night-val` | 75 | 350 | val | night | 0.25 | part 1 | -| `night-train`| 75 | 425 | train | night | 0.25 | part 2 | - -**Deterministic reference** (gpu5, GTX 1070, seed=42, epochs=10): model A → overall/train recall 0.819, -night/val 0.176; model B → overall/train 0.944, **night/train 0.295 → 0.962** (the payoff), night/val -0.165. The **reliable signal is night/train**. **night/val does NOT rise** at this size/epochs — model -B memorizes the night-train images rather than generalizing low-light, so night/val stays ~flat; a real -val gain needs more night-train + epochs (or milder `--darken`). These exact numbers reproduce on the -**same GPU/CUDA/torch stack** (training determinism is per-hardware); the data/splits/tags reproduce on -any machine (seeded canonical cache). +| `base-train` | 200 | 0 | train | — | — | part 1 | +| `base-val` | 75 | 200 | val | — | — | part 1 | +| `night-val` | 75 | 275 | val | night | 0.40 | part 1 | +| `night-train-a`| 50 | 350 | train | night | 0.30 | part 2 | +| `night-train-b`| 50 | 400 | train | night | 0.40 | part 2 | +| `night-train-c`| 50 | 450 | train | night | 0.55 | part 2 | + +**Why THREE night-train batches with different gammas (0.30/0.40/0.55 around val's 0.40):** a single +gamma makes model B memorize that exact darkness (night/train ~0.95, night/val flat); gamma DIVERSITY +forces it to generalize "low light", which is what lifts the held-out val. More epochs does NOT fix +this (30 epochs = deeper memorization, val drops) — the lever is data diversity, keep epochs=10. + +**Deterministic reference** (gpu5, GTX 1070, seed=42, epochs=10, weighted recall/precision on val): +model A → overall 0.324/0.440, night 0.282/0.449; model B → overall **0.415/0.546**, night +**0.409/0.549**. **B beats A on BOTH val sets with fat margins (+0.09..+0.13)** — large enough to +survive cross-hardware noise, so the story holds on any machine. Exact numbers reproduce bit-for-bit +on the **same GPU/CUDA/torch stack** (training determinism is per-hardware); data/splits/tags +reproduce byte-identically on any machine (seeded canonical cache). ## Pre-flight — CHECK what's already there, then ASK (do this before deploying) @@ -137,9 +143,9 @@ pipe** — then stop. Training is **yours to trigger from the datapipe-app front ```bash # SKILL DOES — from examples/detection_tags/detection, with .env sourced: -python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train -python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val -python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 +python ../scripts/add_request.py --id base-train --n 200 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 75 --offset 200 --subset val +python ../scripts/add_request.py --id night-val --n 75 --offset 275 --subset val --tag night --darken 0.40 datapipe step --labels=stage=load run # 450 images; val frozen (100 base + 25 night) # VERIFY the data is in the pipe before handing off: @@ -182,7 +188,9 @@ The skill **tops up** the tagged TRAIN batch and reloads; **you trigger the retr ```bash # SKILL DOES — add the tagged TRAIN batch and load it (val stays frozen): -python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 +python ../scripts/add_request.py --id night-train-a --n 50 --offset 350 --subset train --tag night --darken 0.30 +python ../scripts/add_request.py --id night-train-b --n 50 --offset 400 --subset train --tag night --darken 0.40 +python ../scripts/add_request.py --id night-train-c --n 50 --offset 450 --subset train --tag night --darken 0.55 datapipe step --labels=stage=load run # 500 images total # VERIFY val stayed frozen (night went to TRAIN only): # SELECT h.subset_id, count(*) FROM image__tag it JOIN tag t USING(tag_id) @@ -301,11 +309,12 @@ to a file + `grep`, not inline. - **`No labels found` / every image "corrupt: No module named 'pi_heif'`** → reinstall `pi-heif`. - **count-metrics prints "Batches to process 0" right after training** → datapipe hasn't propagated the fresh predictions in the same pass. Re-run `count-metrics` once; then the metric tables fill. -- **Model B didn't learn night-train (trains on the OLD frozen dataset)** → after loading `night-train`, - the first `stage=train` re-splits `image__subset` (→ 350 train) but may NOT re-freeze in the same pass - (same propagation lag). If `detection_frozen_dataset__train_images_count` didn't grow, **re-run - `stage=train` once** — the freeze then updates (a new `detection_frozen_dataset` row) and model B trains - on the full set (night/train recall jumps). +- **Model B didn't retrain / trains on the OLD frozen dataset** → the freeze step has a time debounce: + `DetectionFreezeDataset(min_within_time=...)` refuses to create a new frozen dataset if the last one is + younger than that ("Not enough time passed since last frozen dataset" in the log). The demo app sets + `min_within_time="1s"` so part 2 retrains immediately; if you see the error (e.g. a config with "5min"), + either lower it or wait it out, then re-run `stage=train`. Verify via + `detection_frozen_dataset__train_images_count` growing (a second `detection_frozen_dataset` row). - **Two identical models get trained** → you ran `stage=train-prepare` and then `stage=train` separately; the split between them changes `image__subset`, which re-freezes the dataset and retrains. Run `stage=train` as one step (it includes prepare), and show the split with a query. diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index dc30d28f..71769e33 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -31,9 +31,9 @@ the split step honors it. The pre-staged cache holds **500 images**, so keep the ## Part 1 — baseline to checkpoint ```bash # from examples/detection_tags/detection -python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train -python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val -python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 +python ../scripts/add_request.py --id base-train --n 200 --offset 0 --subset train +python ../scripts/add_request.py --id base-val --n 75 --offset 200 --subset val +python ../scripts/add_request.py --id night-val --n 75 --offset 275 --subset val --tag night --darken 0.40 datapipe step --labels=stage=load run datapipe step --labels=stage=train run # model A datapipe step --labels=stage=count-metrics run # re-run once if it prints "Batches to process 0" @@ -44,7 +44,9 @@ datapipe step --labels=stage=fiftyone run # GT + model-A predictions int ## Part 2 — retrain and watch the tag metric rise ```bash -python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 +python ../scripts/add_request.py --id night-train-a --n 50 --offset 350 --subset train --tag night --darken 0.30 +python ../scripts/add_request.py --id night-train-b --n 50 --offset 400 --subset train --tag night --darken 0.40 +python ../scripts/add_request.py --id night-train-c --n 50 --offset 450 --subset train --tag night --darken 0.55 datapipe step --labels=stage=load run datapipe step --labels=stage=train run # model B (night now in training) datapipe step --labels=stage=count-metrics run # re-run once if "0 batches" diff --git a/examples/detection_tags/detection/app.py b/examples/detection_tags/detection/app.py index 8591e928..ac0a7935 100644 --- a/examples/detection_tags/detection/app.py +++ b/examples/detection_tags/detection/app.py @@ -69,7 +69,7 @@ output__detection_frozen_dataset="detection_frozen_dataset", output__detection_frozen_dataset__has__image_gt="detection_frozen_dataset__has__image_gt", working_dir=str(DATAPIPE_DIR), - min_within_time="5min", + min_within_time="1s", min_delta=10, primary_keys=["image_name"], bbox_id__name=None, diff --git a/examples/detection_tags/scripts/add_request.py b/examples/detection_tags/scripts/add_request.py index 1c63e987..7aba2f49 100644 --- a/examples/detection_tags/scripts/add_request.py +++ b/examples/detection_tags/scripts/add_request.py @@ -3,11 +3,13 @@ Fixed-val demo (freeze val up front, add the tagged train batch later): # loaded BEFORE training model A — val is frozen from the start - python ../scripts/add_request.py --id base-train --n 275 --offset 0 --subset train - python ../scripts/add_request.py --id base-val --n 75 --offset 275 --subset val - python ../scripts/add_request.py --id night-val --n 75 --offset 350 --subset val --tag night --darken 0.25 + python ../scripts/add_request.py --id base-train --n 200 --offset 0 --subset train + python ../scripts/add_request.py --id base-val --n 75 --offset 200 --subset val + python ../scripts/add_request.py --id night-val --n 75 --offset 275 --subset val --tag night --darken 0.40 # loaded BEFORE retraining model B (the tagged TRAIN batch — the fix) - python ../scripts/add_request.py --id night-train --n 75 --offset 425 --subset train --tag night --darken 0.25 + python ../scripts/add_request.py --id night-train-a --n 50 --offset 350 --subset train --tag night --darken 0.30 + python ../scripts/add_request.py --id night-train-b --n 50 --offset 400 --subset train --tag night --darken 0.40 + python ../scripts/add_request.py --id night-train-c --n 50 --offset 450 --subset train --tag night --darken 0.55 --subset train|val pins every image of the batch to that subset so the random split never moves it. Run from examples/detection_tags/detection (so `import config` resolves).""" From 4e7ce4a2ddf7117126db602b3970afbd1ec14768 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 20:02:38 +0000 Subject: [PATCH 15/18] =?UTF-8?q?detection=5Ftags:=20old-cpu=20extra=20(po?= =?UTF-8?q?lars-lts-cpu,=20pi-heif)=20so=20modern=20hosts=20sync=20the=20l?= =?UTF-8?q?ock=20unmodified=20=E2=80=94=20stops=20cross-machine=20lib=20dr?= =?UTF-8?q?ift=20(ultralytics=208.4.90=20vs=208.4.89)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/setup-detection-tags/SKILL.md | 7 +++++-- examples/detection_tags/README.md | 7 ++++--- examples/detection_tags/pyproject.toml | 8 +++++++- 3 files changed, 16 insertions(+), 6 deletions(-) diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 5f57f131..2c2db481 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -114,8 +114,11 @@ port is busy** — pick a different left-hand port (`-L 5433:localhost:5432`), d ```bash cp .env.example .env && set -a && source .env && set +a # DB_URL, S3/MinIO, FIFTYONE_DATABASE_URI HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151); HOST_UID/GID avoid sudo perms. No Label Studio. -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] + fiftyone + pi-heif -# On a pre-AVX2 host, force the lts polars to win (else the training subprocess SIGILLs): +uv sync # modern hosts: THIS, unmodified. Do NOT edit dependencies/re-lock — + # that drifts lib versions across machines (e.g. a different ultralytics) + # and changes training results. The lock pins everyone to the same stack. +# Legacy host (e.g. epoch8 gpu5: pre-AVX2 CPU) ONLY — extras + force the lts polars to win: +uv sync --extra old-cpu uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection # DB_SCHEMA defaults to `public` (already exists). Only if you set a dedicated schema (to share the diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 71769e33..57db356a 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -12,9 +12,10 @@ is split into **two parts around a checkpoint** so you can prep part 1 and rehea ```bash cp .env.example .env && set -a && source .env && set +a HOST_UID=$(id -u) HOST_GID=$(id -g) docker compose up -d # postgres + minio + mongo + fiftyone (:5151) -uv sync # cu124 torch + datapipe-ml[torch,fiftyone] -# pre-AVX2 host only: force the lts polars to win (else training SIGILLs) -uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 +uv sync # modern hosts: as-is. Do NOT edit deps/re-lock (drifts lib versions + # across machines and changes training results — reproducibility!) +# legacy pre-AVX2 host (e.g. epoch8 gpu5) only: +# uv sync --extra old-cpu && uv pip uninstall polars polars-lts-cpu && uv pip install polars-lts-cpu==1.33.1 cd detection # DB_SCHEMA defaults to `public` (exists already). For a dedicated schema (sharing the Postgres with # other pipelines) create it first: psql "$DB_URL" -c "CREATE SCHEMA IF NOT EXISTS $DB_SCHEMA" diff --git a/examples/detection_tags/pyproject.toml b/examples/detection_tags/pyproject.toml index 3fd7f7e4..f69293e3 100644 --- a/examples/detection_tags/pyproject.toml +++ b/examples/detection_tags/pyproject.toml @@ -8,8 +8,14 @@ dependencies = [ "torch==2.6.0", "torchvision==0.21.0", "stringzilla==4.4.0", # needed by albumentations +] + +# Legacy-host extras (e.g. epoch8 gpu5: pre-AVX2 CPU, old image stack). On modern machines run plain +# `uv sync` — do NOT edit dependencies (editing re-locks and drifts versions across machines). +[project.optional-dependencies] +old-cpu = [ "polars-lts-cpu==1.33.1", # ultralytics/datapipe on pre-AVX2 CPUs (avoids SIGILL) - "pi-heif", # ultralytics image verification imports it + "pi-heif", # ultralytics image verification imports it on this host ] [[tool.uv.index]] From 3b5b1723cf1b51dfcf02f7de9f60aa6a683a36a1 Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Thu, 9 Jul 2026 20:03:34 +0000 Subject: [PATCH 16/18] =?UTF-8?q?detection=5Ftags:=20commit=20uv.lock=20(g?= =?UTF-8?q?itignore=20exception)=20=E2=80=94=20the=20lock=20IS=20the=20cro?= =?UTF-8?q?ss-machine=20reproducibility=20contract?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 3 + examples/detection_tags/uv.lock | 6008 +++++++++++++++++++++++++++++++ 2 files changed, 6011 insertions(+) create mode 100644 examples/detection_tags/uv.lock diff --git a/.gitignore b/.gitignore index 0ec00f6d..3b468bbb 100644 --- a/.gitignore +++ b/.gitignore @@ -23,6 +23,9 @@ dist/ # Lock files (deps resolved inside the image) poetry.lock uv.lock +# ...except detection_tags: its whole point is reproducible cross-machine runs — the lock pins the +# training stack (ultralytics etc.); without it every machine resolves different versions. +!examples/detection_tags/uv.lock # ML models & checkpoints *.pt diff --git a/examples/detection_tags/uv.lock b/examples/detection_tags/uv.lock new file mode 100644 index 00000000..ada75287 --- /dev/null +++ b/examples/detection_tags/uv.lock @@ -0,0 +1,6008 @@ +version = 1 +revision = 3 +requires-python = ">=3.10, <3.13" +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] + +[[package]] +name = "aiobotocore" +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "aioitertools" }, + { name = "botocore" }, + { name = "jmespath" }, + { name = "multidict" }, + { name = "python-dateutil" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e7/75/42cce839c2ec263ff74b10b650fe36b066fbb124cbee6f247eac0983e1ab/aiobotocore-3.7.0.tar.gz", hash = "sha256:c64d871ed5491a6571948dd48eabd185b46c6c23b64e3afd0c059fc7593ada30", size = 127054, upload-time = "2026-05-09T10:02:52.332Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/5f/85535dfb3cfd6442d66d1df1694062c5d6df02f895329e7e120b2a3d2b8b/aiobotocore-3.7.0-py3-none-any.whl", hash = "sha256:680bde7c64679a821a9312641b759d9497f790ba8b2e88c6959e6273ee765b8e", size = 89539, upload-time = "2026-05-09T10:02:50.389Z" }, +] + +[[package]] +name = "aiofiles" +version = "25.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/c3/534eac40372d8ee36ef40df62ec129bee4fdb5ad9706e58a29be53b2c970/aiofiles-25.1.0.tar.gz", hash = "sha256:a8d728f0a29de45dc521f18f07297428d56992a742f0cd2701ba86e44d23d5b2", size = 46354, upload-time = "2025-10-09T20:51:04.358Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bc/8a/340a1555ae33d7354dbca4faa54948d76d89a27ceef032c8c3bc661d003e/aiofiles-25.1.0-py3-none-any.whl", hash = "sha256:abe311e527c862958650f9438e859c1fa7568a141b22abcd015e120e86a85695", size = 14668, upload-time = "2025-10-09T20:51:03.174Z" }, +] + +[[package]] +name = "aiohappyeyeballs" +version = "2.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ce/f4/eec0465c2f67b2664688d0240b3212d5196fd89e741df67ddb81f8d35658/aiohappyeyeballs-2.7.1.tar.gz", hash = "sha256:065665c041c42a5938ed220bdcd7230f22527fbec085e1853d2402c8a3615d9d", size = 24757, upload-time = "2026-07-01T17:11:55.501Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/43/1947f06babed6b3f1d7f38b0c767f52df66bfb2bc10b468c4a7de9eceff2/aiohappyeyeballs-2.7.1-py3-none-any.whl", hash = "sha256:9243213661e29250eb41368e5daa826fc017156c3b8a11440826b2e3ed376472", size = 15038, upload-time = "2026-07-01T17:11:54.055Z" }, +] + +[[package]] +name = "aiohttp" +version = "3.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohappyeyeballs" }, + { name = "aiosignal" }, + { name = "async-timeout", marker = "python_full_version < '3.11'" }, + { name = "attrs" }, + { name = "frozenlist" }, + { name = "multidict" }, + { name = "propcache" }, + { name = "typing-extensions" }, + { name = "yarl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/78/8ea7308cac6934de8c74a14f3d5f65d1c89287426688be79538d0e5c013d/aiohttp-3.14.1.tar.gz", hash = "sha256:307f2cff90a764d329e77040603fa032db89c5c24fdad50c4c15334cba744035", size = 7955794, upload-time = "2026-06-07T21:09:35.529Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6d/67/58ded4b3f2e10f94972d8928050c85330e249a31dd45a0e5f3c0e9c3fa05/aiohttp-3.14.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:8f6bb621e5863cfe8fe5ff5468002d200ec31f30f1280b259dc505b02595099e", size = 766140, upload-time = "2026-06-07T21:05:37.471Z" }, + { url = "https://files.pythonhosted.org/packages/18/68/4ae5b4e08943f316594bb68da89957d3baf5760588fa09509594bd777e4b/aiohttp-3.14.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:4f7215cb3933784f79ed20e5f050e15984f390424339b22375d5a53c933a0491", size = 519430, upload-time = "2026-06-07T21:05:40.751Z" }, + { url = "https://files.pythonhosted.org/packages/cb/c1/316c8f3549dbe5245f92bfd523ec6f32dd4d98cafe21df3f6a19b1184c75/aiohttp-3.14.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d9d4e294455b23a68c9b8f042d0e8e377a265bcb15332753695f6e5b6819e0ce", size = 514406, upload-time = "2026-06-07T21:05:42.111Z" }, + { url = "https://files.pythonhosted.org/packages/5a/ee/fb0ac28684e8d753b83c8a4eebc19a5846912aa0a4daaabb6a9936363840/aiohttp-3.14.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b238af795833d5731d049d82bc84b768ae6f8f97f0495963b3ed9935c5901cc3", size = 1703649, upload-time = "2026-06-07T21:05:43.427Z" }, + { url = "https://files.pythonhosted.org/packages/3b/57/aa2beab673331f111885db8a7b69dfe3ab0e53e446a0ace18ca694b4dc58/aiohttp-3.14.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:e4e5e0ae56914ecdbf446493addefc0159053dd53962cef37d7839f37f73d505", size = 1675126, upload-time = "2026-06-07T21:05:44.897Z" }, + { url = "https://files.pythonhosted.org/packages/47/ea/dad128abe365e79be03b16ed464198ac73e0d257e8260c6f7d6f31cbef26/aiohttp-3.14.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:092e4ce3619a7c6dee52a6bdabda973d9b34b66781f840ce93c7e0cec30cf521", size = 1771558, upload-time = "2026-06-07T21:05:46.405Z" }, + { url = "https://files.pythonhosted.org/packages/63/f3/b5b4e10327cb85d34d24232c6b71b64602f190b3ccb238a043ac6b187dac/aiohttp-3.14.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb33777ea21e8b7ecde0e6fc84f598be0a1192eab1a63bc746d75aa75d38e7bd", size = 1856631, upload-time = "2026-06-07T21:05:47.844Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9d/93294c3045775c708ac8310eb3d3622a11d2951345ad590d532d62a1faa4/aiohttp-3.14.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23119f8fd4f5d16902ed459b63b100bcd269628075162bddac56cc7b5273b3fb", size = 1714139, upload-time = "2026-06-07T21:05:49.982Z" }, + { url = "https://files.pythonhosted.org/packages/29/c4/93067c85a0373492ce8e577435203c5947c454af074ac48ed4f3a1b9dd4a/aiohttp-3.14.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:57fc6745a4b7d0f5a9eb4f40a69718be6c0bc1b8368cc9fe89e90118719f4f42", size = 1588321, upload-time = "2026-06-07T21:05:51.431Z" }, + { url = "https://files.pythonhosted.org/packages/c4/39/9ff91aaf02af8b7b8222a987466da539f154c3e01732c22b5f5a20a8ee66/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:6fd35beba67c4183b09375c5fff9accb47524191a244a99f95fd4472f5402c2b", size = 1670375, upload-time = "2026-06-07T21:05:53.109Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e4/77452a3676b8d99ac1375f77691d6bf65ea6e9f4b201b82ef77c916dc767/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:672b9d65f42eb877f5c3f234a4547e4e1a226ca8c2eed879bb34670a0ce51192", size = 1690933, upload-time = "2026-06-07T21:05:54.902Z" }, + { url = "https://files.pythonhosted.org/packages/7d/84/b0059a7c7fc05ea23f3bc1596ba91c12f79588b9450564a24cac37536d0a/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:24ba13339fed9251d9b1a1bec8c7ab84c0d1675d79d33501e11f94f8b9a84e05", size = 1740798, upload-time = "2026-06-07T21:05:56.458Z" }, + { url = "https://files.pythonhosted.org/packages/8f/3a/e2a513ecbfc362591caa51a7f7e011b3bfc8938b388ae44cd95560d36999/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:94da27378da0610e341c4d30de29a191672683cc82b8f9556e8f7c7212a020fe", size = 1576412, upload-time = "2026-06-07T21:05:57.953Z" }, + { url = "https://files.pythonhosted.org/packages/a1/10/08f1654f538f93d36dcac66310a06eefce4641cdafca83f9f0a5317be254/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:52cdac9432d8b4a719f35094a818d95adcae0f0b4fe9b9b921909e0c87de9e7d", size = 1750199, upload-time = "2026-06-07T21:05:59.488Z" }, + { url = "https://files.pythonhosted.org/packages/99/e4/d91b70c57d8b8e9611e4a2e52238ca3698d3dc1c2efe25b7a9bf594ac584/aiohttp-3.14.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:672ac254412a24d0d0cf00a9e6c238877e4be5e5fa2d188832c1244f45f31966", size = 1699356, upload-time = "2026-06-07T21:06:01.131Z" }, + { url = "https://files.pythonhosted.org/packages/3d/f1/15340176f35ff61b95dbe34020bcf43f9e624a2d7bbac934715ff97d2033/aiohttp-3.14.1-cp310-cp310-win32.whl", hash = "sha256:2fe3607e71acc6ebb0ec8e492a247bf7a291226192dc0084236dfc12478916f6", size = 458939, upload-time = "2026-06-07T21:06:02.86Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c2/a2f1ec5b37f903109e43ae2862268cfe4a67a60c1b2cf43169fcdff5995f/aiohttp-3.14.1-cp310-cp310-win_amd64.whl", hash = "sha256:30099eda75a53c32efb0920e9c33c195314d2cc1c680fbfd30894932ac5f27df", size = 482583, upload-time = "2026-06-07T21:06:04.666Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7a/7b56f6732ef79530afaa72aa335d41b67c8d79b946995f0b11ad72985435/aiohttp-3.14.1-cp310-cp310-win_arm64.whl", hash = "sha256:5a837f49d901f9e368651b676912bff1104ed8c1a83b280bcd7b29adccef5c9c", size = 453470, upload-time = "2026-06-07T21:06:06.322Z" }, + { url = "https://files.pythonhosted.org/packages/26/dd/bf526e6f0a1120dd6f2df2e97bacfe4d358f13d17a0ff5847301a1375a51/aiohttp-3.14.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:aa00140699487bd435fde4342d85c94cb256b7cd3a5b9c3396c67f19922afda2", size = 765225, upload-time = "2026-06-07T21:06:07.957Z" }, + { url = "https://files.pythonhosted.org/packages/8f/e1/a2872aa55495a70f61310d411541c6ee23812d9a884e000c716e1bc3edbf/aiohttp-3.14.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1c1af67559445498b502030c35c59db59966f47041ca9de5b4e707f86bd10b5f", size = 518743, upload-time = "2026-06-07T21:06:09.749Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e7/c60c7b209e509cc787de3cea0550a518538cfc08003e1c1e14c1c63fff71/aiohttp-3.14.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:d44ec478e713ee7f29b439f7eb8dc2b9d4079e11ae114d2c2ac3d5daf30516c8", size = 514139, upload-time = "2026-06-07T21:06:11.26Z" }, + { url = "https://files.pythonhosted.org/packages/5b/8d/614ace2f579702c9840ab1e1447fd8509e35b0b904f7196418fa2f57b25d/aiohttp-3.14.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d3b1a184a9a8f548a6b73f1e26b96b052193e4b3175ed7342aaf1151a1f00a04", size = 1784088, upload-time = "2026-06-07T21:06:12.887Z" }, + { url = "https://files.pythonhosted.org/packages/49/e0/726e90f99542bf292f81a96a12cc4847deb86f3ccf62c6f4014a201f4d33/aiohttp-3.14.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:5f2504bc0322437c9a1ff6d3333ca56c7477b727c995f036b976ae17b98372c8", size = 1737835, upload-time = "2026-06-07T21:06:14.564Z" }, + { url = "https://files.pythonhosted.org/packages/0b/4b/d176d5c4db9d33dacf0543102ea59503bc1d528af4cfd0b719949ca49389/aiohttp-3.14.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:73f05ea02013e02512c3bf42714f1208c57168c779cc6fe23516e4543089d0a6", size = 1842801, upload-time = "2026-06-07T21:06:16.228Z" }, + { url = "https://files.pythonhosted.org/packages/dc/d6/5a99b563690ea0cbed912ae94a2ce33993a5709a651a3a4fe761e7dd973a/aiohttp-3.14.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:797457503c2d426bee06eef808d07b31ede30b65e054444e7de64cad0061b7af", size = 1929992, upload-time = "2026-06-07T21:06:17.947Z" }, + { url = "https://files.pythonhosted.org/packages/76/7f/a987b14a3859094b3cea3f4825219c3e5536242564af6e3f9c2f6c994eb2/aiohttp-3.14.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b821a1f7dedf7e37450654e620038ac3b2e81e8fa6ea269337e97101978ec730", size = 1786989, upload-time = "2026-06-07T21:06:19.677Z" }, + { url = "https://files.pythonhosted.org/packages/f1/1a/420e5c85a3e73349372ed22ce0b6af86bfa6ce16a4b20a64a2e94608c781/aiohttp-3.14.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4cd96b5ba05d67ed0cf00b5b405c8cd99586d8e3481e8ee0a831057591af7621", size = 1640129, upload-time = "2026-06-07T21:06:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/a7/80/18a592ed3be0a402cc03670bd72ee1f8563ddbe1d8d5542dbf868f274136/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d459b98a932296c6f0e94f87511a0b1b90a8a02c30a50e60a297619cd5a58ee", size = 1756576, upload-time = "2026-06-07T21:06:24.8Z" }, + { url = "https://files.pythonhosted.org/packages/ec/0b/8b3d5713373858ff71a617daf6e3b0e81ad63e79d09a3cf2f6b6b983939c/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:764457a7be60825fb770a644852ff717bcbb5042f189f2bd16df61a81b3f6573", size = 1754668, upload-time = "2026-06-07T21:06:26.528Z" }, + { url = "https://files.pythonhosted.org/packages/9f/49/fd564575cf225821d7ba5a117cb8bc27213d8a7e1811162afb43ae077039/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f7a16ef45b081454ef844502d87a848876c490c4cb5c650c230f6ec79ed2c1e7", size = 1817019, upload-time = "2026-06-07T21:06:28.297Z" }, + { url = "https://files.pythonhosted.org/packages/ed/1b/e850c9ae6fc91356552ae668bb6c51e93fa29c8aef13398a10b56678557f/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:2fbc3ed048b3475b9f0cbcb9978e9d2d3511acd91ead203af26ed9f0056004cf", size = 1631638, upload-time = "2026-06-07T21:06:30.242Z" }, + { url = "https://files.pythonhosted.org/packages/eb/94/3c337ba72451a89806ace6f75bddc92bafc5b8d53d90115a512858024b63/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:bedb0cd073cc2dc035e30aeb99444389d3cd2113afe4ef9fcd23d439f5bade85", size = 1835660, upload-time = "2026-06-07T21:06:31.943Z" }, + { url = "https://files.pythonhosted.org/packages/2b/9c/9c18cf367a0498212d9ba7daf990b504a5e8ae064cda4b504e2647c89c03/aiohttp-3.14.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:b6feea921016eb3d4e04d65fc4e9ca402d1a3801f562aef94989f54694917af3", size = 1775698, upload-time = "2026-06-07T21:06:33.72Z" }, + { url = "https://files.pythonhosted.org/packages/b5/63/a251a9d2a6cb45065b2ddc0bde2b3dd10108740a9a42f632c66405a761a2/aiohttp-3.14.1-cp311-cp311-win32.whl", hash = "sha256:313701e488100074ce99850404ee36e741abf6330179fec908a1944ecf570126", size = 458386, upload-time = "2026-06-07T21:06:35.279Z" }, + { url = "https://files.pythonhosted.org/packages/17/ca/69274c51dcd6e8947d77b2806cf47a4a15f2c846e2cbeb1882547d3da283/aiohttp-3.14.1-cp311-cp311-win_amd64.whl", hash = "sha256:03ab4530fdcb3a543a122ba4b65ac9919da9fe9f78a03d328a6e38ff962f7aa5", size = 483406, upload-time = "2026-06-07T21:06:36.824Z" }, + { url = "https://files.pythonhosted.org/packages/2c/8a/c25904f77690c3688ec140f87591ef11a0cfe36bf3d5c0f1f38056fb62b3/aiohttp-3.14.1-cp311-cp311-win_arm64.whl", hash = "sha256:486f7d16ed54c39c2cbd7ca71fd8ba2b8bb7860df65bd7b6ed640bab96a38a8b", size = 452987, upload-time = "2026-06-07T21:06:38.371Z" }, + { url = "https://files.pythonhosted.org/packages/1d/21/151624b51cd92553d95424daf4bf19f19ce9be9002d19253e7e7ce67197b/aiohttp-3.14.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d35143e27778b4bb0fb189562d7f275bff79c62ab8e98459717c0ea617ff2480", size = 757402, upload-time = "2026-06-07T21:06:40.311Z" }, + { url = "https://files.pythonhosted.org/packages/c2/82/280619e0bd7bf2454987e19282616e84762255dd9c8468f62382e8c191f1/aiohttp-3.14.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:bcfb80a2cc36fba2534e5e5b5264dc7ae6fcd9bf15256da3e53d2f499e6fa29d", size = 512310, upload-time = "2026-06-07T21:06:42.207Z" }, + { url = "https://files.pythonhosted.org/packages/55/b2/2aac325583aaa1353045f96dffa586d8a34e8322e14a7ba49cffeb103ab4/aiohttp-3.14.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:27fd7c91e51729b4f7e1577865fa6d34c9adccbc39aabe9000285b48af9f0ec2", size = 512448, upload-time = "2026-06-07T21:06:43.813Z" }, + { url = "https://files.pythonhosted.org/packages/8a/72/a60607cb849faa8af8a356c9329ea2eb6f395d49e82cc82ccba1fd8deb8f/aiohttp-3.14.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:64c567bf9eaf664280116a8688f63016e6b32db2505908e2bdaca1b6438142f2", size = 1766854, upload-time = "2026-06-07T21:06:45.391Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d3/d9fe1c9ec7557ab4d0d82bebaa728c6418f0b93295ec2f4ab015f7710cc7/aiohttp-3.14.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:f5e6ff2bdbb8f4cd3fbe41f99e25bbcd58e3bf9f13d3dd31a11e7917251cc77a", size = 1740884, upload-time = "2026-06-07T21:06:47.413Z" }, + { url = "https://files.pythonhosted.org/packages/c1/dc/f2cecfaf9337ba3e63f181500814ff502aa3d00d9c7ec93a9d23d10a27b2/aiohttp-3.14.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2f73e01dc37122325caf079982621262f96d74823c179038a82fddfc50359264", size = 1810034, upload-time = "2026-06-07T21:06:50.165Z" }, + { url = "https://files.pythonhosted.org/packages/66/d7/2ff65c5e65c0d7476daf7e15c032e0805e36811185b9623e3238ad6c763e/aiohttp-3.14.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:bb2c0c80d431c0d03f2c7dbf125150fedd4f0de17366a7ca33f7ccb822391842", size = 1904054, upload-time = "2026-06-07T21:06:52.035Z" }, + { url = "https://files.pythonhosted.org/packages/20/9c/d445818389df371f56d141d881153ba23183c4735a03f7356ffb43f7757d/aiohttp-3.14.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:3e6fc1a85fa7194a1a7d19f44e8609180f4a8eb5fa4c7ed8b4355f080fad235c", size = 1790278, upload-time = "2026-06-07T21:06:54.049Z" }, + { url = "https://files.pythonhosted.org/packages/4d/aa/bf04cb4d865fc6101c2229a294ad744973b72e513fdc5a6b791e6983d72a/aiohttp-3.14.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:686b6c0d3911ec387b444ddf5dc62fb7f7c0a7d5186a7861626496a5ab4aff95", size = 1591795, upload-time = "2026-06-07T21:06:55.911Z" }, + { url = "https://files.pythonhosted.org/packages/dc/b4/4dac0038960427ba832f6609dfb4ea5437d7fd80c72001b9e48f834f428b/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c6fa4dc7ad6f8109c70bb1499e589f76b0b792baf39f9b017eb92c8a81d0a199", size = 1728397, upload-time = "2026-06-07T21:06:57.777Z" }, + { url = "https://files.pythonhosted.org/packages/2b/f9/7cd4e8ad7aa3b75f17d56bb5498dd604a93d4e6eece822ba0568c413fff0/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:87a5eea1b2a5e21e1ebdbb33ad4165359189327e63fc4e4894693e7f821ac817", size = 1766504, upload-time = "2026-06-07T21:07:00.009Z" }, + { url = "https://files.pythonhosted.org/packages/f9/df/fc01d9fcad0f73fed3f3d361f1f94f975947b50dff82919f6dc2bf4316cc/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:1c1421eb01d4fd608d88cc8290211d177a58532b55ad94076fb349c5bf467f0a", size = 1777806, upload-time = "2026-06-07T21:07:02.064Z" }, + { url = "https://files.pythonhosted.org/packages/41/09/47e2d090bddcc8fb4ccb4c314aadc32d7c5d9bb55f50f6ad1c92fc15d501/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:34b257ec41345c1e8f2df68fa908a7952f5de932723871eb633ecbbff396c9a4", size = 1580707, upload-time = "2026-06-07T21:07:03.942Z" }, + { url = "https://files.pythonhosted.org/packages/3d/36/f1a4ce904ae0b6930cfe9afc96d0896f7ec1a620c400405d63783bb95a9c/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:de538791a80e5d862addbc183f70f0158ac9b9bb872bb147f1fd2a683691e087", size = 1798121, upload-time = "2026-06-07T21:07:05.987Z" }, + { url = "https://files.pythonhosted.org/packages/70/0a/e0075ce9ca0279ee1d4f0c0b85f54fea02ebc83c3007651a72bece658fec/aiohttp-3.14.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6f71173be42d3241d428f760122febb748de0623f44308a6f120d0dd9ec572e3", size = 1767580, upload-time = "2026-06-07T21:07:07.873Z" }, + { url = "https://files.pythonhosted.org/packages/3e/61/a0c0a8f327a9c52095cdd8e312391b00d3ed64ab6c72bb5c33d8ec251cf7/aiohttp-3.14.1-cp312-cp312-win32.whl", hash = "sha256:ec8dc383ee57ea3e883477dcca3f11b65d58199f1080acaf4cd6ad9a99698be4", size = 452771, upload-time = "2026-06-07T21:07:09.669Z" }, + { url = "https://files.pythonhosted.org/packages/df/d9/ea367c75f16ac9c6cdc8febb25e8318fa21a2b1bc8d6514d4b2d890bface/aiohttp-3.14.1-cp312-cp312-win_amd64.whl", hash = "sha256:2aa92c87868cd13674989f9ee83e5f9f7ea4237589b728048e1f0c8f6caa3271", size = 479873, upload-time = "2026-06-07T21:07:11.538Z" }, + { url = "https://files.pythonhosted.org/packages/03/64/8d96784a7851156db8a4c6c3f6f91042fdf39fb15a4cc38c8b3c14833c45/aiohttp-3.14.1-cp312-cp312-win_arm64.whl", hash = "sha256:2c840c90759922cb5e6dda94596e079a30fb5a5ba548e7e0dc00574703940847", size = 448073, upload-time = "2026-06-07T21:07:13.637Z" }, +] + +[[package]] +name = "aiohttp-cors" +version = "0.8.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6f/6d/d89e846a5444b3d5eb8985a6ddb0daef3774928e1bfbce8e84ec97b0ffa7/aiohttp_cors-0.8.1.tar.gz", hash = "sha256:ccacf9cb84b64939ea15f859a146af1f662a6b1d68175754a07315e305fb1403", size = 38626, upload-time = "2025-03-31T14:16:20.048Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/98/3b/40a68de458904bcc143622015fff2352b6461cd92fd66d3527bf1c6f5716/aiohttp_cors-0.8.1-py3-none-any.whl", hash = "sha256:3180cf304c5c712d626b9162b195b1db7ddf976a2a25172b35bb2448b890a80d", size = 25231, upload-time = "2025-03-31T14:16:18.478Z" }, +] + +[[package]] +name = "aioitertools" +version = "0.13.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fd/3c/53c4a17a05fb9ea2313ee1777ff53f5e001aefd5cc85aa2f4c2d982e1e38/aioitertools-0.13.0.tar.gz", hash = "sha256:620bd241acc0bbb9ec819f1ab215866871b4bbd1f73836a55f799200ee86950c", size = 19322, upload-time = "2025-11-06T22:17:07.609Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/a1/510b0a7fadc6f43a6ce50152e69dbd86415240835868bb0bd9b5b88b1e06/aioitertools-0.13.0-py3-none-any.whl", hash = "sha256:0be0292b856f08dfac90e31f4739432f4cb6d7520ab9eb73e143f4f2fa5259be", size = 24182, upload-time = "2025-11-06T22:17:06.502Z" }, +] + +[[package]] +name = "aiosignal" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "frozenlist" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/61/62/06741b579156360248d1ec624842ad0edf697050bbaf7c3e46394e106ad1/aiosignal-1.4.0.tar.gz", hash = "sha256:f47eecd9468083c2029cc99945502cb7708b082c232f9aca65da147157b251c7", size = 25007, upload-time = "2025-07-03T22:54:43.528Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/76/641ae371508676492379f16e2fa48f4e2c11741bd63c48be4b12a6b09cba/aiosignal-1.4.0-py3-none-any.whl", hash = "sha256:053243f8b92b990551949e63930a839ff0cf0b0ebbe0597b0f3fb19e1a0fe82e", size = 7490, upload-time = "2025-07-03T22:54:42.156Z" }, +] + +[[package]] +name = "albucore" +version = "0.0.24" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, + { name = "simsimd" }, + { name = "stringzilla" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/13/69/d4cbcf2a5768bf91cd14ffef783520458431e5d2b22fbc08418d3ba09a88/albucore-0.0.24.tar.gz", hash = "sha256:f2cab5431fadf94abf87fd0c89d9f59046e49fe5de34afea8f89bc8390253746", size = 16981, upload-time = "2025-03-09T18:46:51.409Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0a/e2/91f145e1f32428e9e1f21f46a7022ffe63d11f549ee55c3b9265ff5207fc/albucore-0.0.24-py3-none-any.whl", hash = "sha256:adef6e434e50e22c2ee127b7a3e71f2e35fa088bcf54431e18970b62d97d0005", size = 15372, upload-time = "2025-03-09T18:46:50.177Z" }, +] + +[[package]] +name = "albumentations" +version = "2.0.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "albucore" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, + { name = "pydantic" }, + { name = "pyyaml" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f4/f4/85eb56c3217b53bcfc2d12e840a0b18ca60902086321cafa5a730f9c0470/albumentations-2.0.8.tar.gz", hash = "sha256:4da95e658e490de3c34af8fcdffed09e36aa8a4edd06ca9f9e7e3ea0b0b16856", size = 354460, upload-time = "2025-05-27T21:23:17.415Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8e/64/013409c451a44b61310fb757af4527f3de57fc98a00f40448de28b864290/albumentations-2.0.8-py3-none-any.whl", hash = "sha256:c4c4259aaf04a7386ad85c7fdcb73c6c7146ca3057446b745cc035805acb1017", size = 369423, upload-time = "2025-05-27T21:23:15.609Z" }, +] + +[[package]] +name = "annotated-doc" +version = "0.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/ba/046ceea27344560984e26a590f90bc7f4a75b06701f653222458922b558c/annotated_doc-0.0.4.tar.gz", hash = "sha256:fbcda96e87e9c92ad167c2e53839e57503ecfda18804ea28102353485033faa4", size = 7288, upload-time = "2025-11-10T22:07:42.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/d3/26bf1008eb3d2daa8ef4cacc7f3bfdc11818d111f7e2d0201bc6e3b49d45/annotated_doc-0.0.4-py3-none-any.whl", hash = "sha256:571ac1dc6991c450b25a9c2d84a3705e2ae7a53467b5d111c24fa8baabbed320", size = 5303, upload-time = "2025-11-10T22:07:40.673Z" }, +] + +[[package]] +name = "annotated-types" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ee/67/531ea369ba64dcff5ec9c3402f9f51bf748cec26dde048a2f973a4eea7f5/annotated_types-0.7.0.tar.gz", hash = "sha256:aff07c09a53a08bc8cfccb9c85b05f1aa9a2a6f23728d790723543408344ce89", size = 16081, upload-time = "2024-05-20T21:33:25.928Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/b6/6307fbef88d9b5ee7421e68d78a9f162e0da4900bc5f5793f6d3d0e34fb8/annotated_types-0.7.0-py3-none-any.whl", hash = "sha256:1f02e8b43a8fbbc3f3e0d4f0f4bfc8131bcb4eebe8849b8e5c773f3a1c582a53", size = 13643, upload-time = "2024-05-20T21:33:24.1Z" }, +] + +[[package]] +name = "anyio" +version = "4.14.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "idna" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3b/72/5562aabb8dd7181e8e860622a38bea08d17842b99ecd4c91f84ac95251b0/anyio-4.14.1.tar.gz", hash = "sha256:8d648a3544c1a700e3ff78615cd679e4c5c3f149904287e73687b2596963629e", size = 254831, upload-time = "2026-06-24T20:56:06.017Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/7b/90df4a0a816d98d6ea26f559d87836d494a2cf1fcf063be67df50a7bcc30/anyio-4.14.1-py3-none-any.whl", hash = "sha256:4e5533c5b8ff0a24f5d7a176cbe6877129cd183893f66b537f8f227d10527d72", size = 124875, upload-time = "2026-06-24T20:56:04.413Z" }, +] + +[[package]] +name = "argcomplete" +version = "3.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/c0/c8e94135e66fabf89a120d9b4b123fe6993506beca6c1938a74c24cfa5fd/argcomplete-3.7.0.tar.gz", hash = "sha256:afde224f753f874807b1dc1414e883ab8fe0cda9c04807b6047dcb8e1ac23913", size = 73284, upload-time = "2026-06-30T22:28:22.249Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/f6/5b8ec087cd9cfa9449491ec83f76fb6b7006b4dff57d2ba8aaab330fe8e4/argcomplete-3.7.0-py3-none-any.whl", hash = "sha256:d8f0f22d2a8a7caa383be1e22b6caf1ecaf0ebd10d8f83cc125e36540c95830c", size = 42575, upload-time = "2026-06-30T22:28:20.547Z" }, +] + +[[package]] +name = "asgiref" +version = "3.11.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/40/f03da1264ae8f7cfdbf9146542e5e7e8100a4c66ab48e791df9a03d3f6c0/asgiref-3.11.1.tar.gz", hash = "sha256:5f184dc43b7e763efe848065441eac62229c9f7b0475f41f80e207a114eda4ce", size = 38550, upload-time = "2026-02-03T13:30:14.33Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5c/0a/a72d10ed65068e115044937873362e6e32fab1b7dce0046aeb224682c989/asgiref-3.11.1-py3-none-any.whl", hash = "sha256:e8667a091e69529631969fd45dc268fa79b99c92c5fcdda727757e52146ec133", size = 24345, upload-time = "2026-02-03T13:30:13.039Z" }, +] + +[[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 = "async-lru" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e8/1f/989ecfef8e64109a489fff357450cb73fa73a865a92bd8c272170a6922c2/async_lru-2.3.0.tar.gz", hash = "sha256:89bdb258a0140d7313cf8f4031d816a042202faa61d0ab310a0a538baa1c24b6", size = 16332, upload-time = "2026-03-19T01:04:32.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/e2/c2e3abf398f80732e58b03be77bde9022550d221dd8781bf586bd4d97cc1/async_lru-2.3.0-py3-none-any.whl", hash = "sha256:eea27b01841909316f2cc739807acea1c623df2be8c5cfad7583286397bb8315", size = 8403, upload-time = "2026-03-19T01:04:30.883Z" }, +] + +[[package]] +name = "async-timeout" +version = "5.0.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a5/ae/136395dfbfe00dfc94da3f3e136d0b13f394cba8f4841120e34226265780/async_timeout-5.0.1.tar.gz", hash = "sha256:d9321a7a3d5a6a5e187e824d2fa0793ce379a202935782d555d6e9d2735677d3", size = 9274, upload-time = "2024-11-06T16:41:39.6Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/ba/e2081de779ca30d473f21f5b30e0e737c438205440784c7dfc81efc2b029/async_timeout-5.0.1-py3-none-any.whl", hash = "sha256:39e3809566ff85354557ec2398b55e096c8364bacac9405a7a1fa429e77fe76c", size = 6233, upload-time = "2024-11-06T16:41:37.9Z" }, +] + +[[package]] +name = "attrs" +version = "26.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/9a/8e/82a0fe20a541c03148528be8cac2408564a6c9a0cc7e9171802bc1d26985/attrs-26.1.0.tar.gz", hash = "sha256:d03ceb89cb322a8fd706d4fb91940737b6642aa36998fe130a9bc96c985eff32", size = 952055, upload-time = "2026-03-19T14:22:25.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/b4/17d4b0b2a2dc85a6df63d1157e028ed19f90d4cd97c36717afef2bc2f395/attrs-26.1.0-py3-none-any.whl", hash = "sha256:c647aa4a12dfbad9333ca4e71fe62ddc36f4e63b2d260a37a8b83d2f043ac309", size = 67548, upload-time = "2026-03-19T14:22:23.645Z" }, +] + +[[package]] +name = "backports-zstd" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8e/b5/5a873da082bd08acd6a497f7aae224e94a7c27fa8f24488089cc50a16c84/backports_zstd-1.6.0.tar.gz", hash = "sha256:80a7859ffe70bf239d7a2ce15293bdeb5b4280ff7dc326ffab312b0e254dbb24", size = 1000009, upload-time = "2026-06-14T10:50:58.555Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/8d/3f8e7a0fd319b3c0dbf0c4f751336309bb50a873b9185c2f5d228ff0d21b/backports_zstd-1.6.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:73000459db113a658c4fb0510100ef0e79137b5828bf957b7709aacae4eb1b87", size = 437068, upload-time = "2026-06-14T10:49:05.528Z" }, + { url = "https://files.pythonhosted.org/packages/db/14/4700047713a60131efcb3977a9892fab60bc9dd6634272550b8f1c5a427d/backports_zstd-1.6.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d6e78d5e28f812b39f92397806ecddd4a6f3bf35531a8c039a1f187abc931af8", size = 363456, upload-time = "2026-06-14T10:49:07.154Z" }, + { url = "https://files.pythonhosted.org/packages/c4/34/92de2f1bd5ee29b24302c871b9f3c19155bf9478cd3af5a0dfd70fa2f483/backports_zstd-1.6.0-cp310-cp310-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:32f04d54ec1fdf3aa648b24a10b1c9234ed2046cc4af7a8850cbc236c05d42f3", size = 507392, upload-time = "2026-06-14T10:49:08.63Z" }, + { url = "https://files.pythonhosted.org/packages/5a/95/ed5b8b026c6df1a59681a73396f63cfd10e17ccfbc6315974745a8b7d834/backports_zstd-1.6.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:83415af3c64550a56cc20b4cce59bbaa81f21d28466d7adf98feff011ecbc66d", size = 476957, upload-time = "2026-06-14T10:49:09.894Z" }, + { url = "https://files.pythonhosted.org/packages/5a/47/1a82ede48d9df99c8245cb38622cd1a9b388b34f89e1cb7b6650913b493d/backports_zstd-1.6.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:a3c17e6a267d13de9cbf14bf2ebfa87e03d26692456fc67d2dbed9da4f479b18", size = 582618, upload-time = "2026-06-14T10:49:11.097Z" }, + { url = "https://files.pythonhosted.org/packages/6b/70/441ed36e230b0f66d7d49382c58249b540139c5b1aa096ace1ff00bd7873/backports_zstd-1.6.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:75578c71644b031118ce938855a53530708db7f4af6e83e2f8840d5a1de990f8", size = 642278, upload-time = "2026-06-14T10:49:12.545Z" }, + { url = "https://files.pythonhosted.org/packages/58/a3/8f5737bdb02576577a018c10a4c345a5b4b2e63cc3811baeecc054f71c00/backports_zstd-1.6.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a4ae7ed5a6d813450cc2d818284ea3db9721edcef50a56aae42ea06feec38c6e", size = 492492, upload-time = "2026-06-14T10:49:14.037Z" }, + { url = "https://files.pythonhosted.org/packages/e1/a9/c086507f535c2466a25bf83a876666c9ccde07b17ce81680217ac17355fe/backports_zstd-1.6.0-cp310-cp310-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5e9a8370c8ed873083d5de956d6b2e60adbad31e52d7a11111c96ef01d1910ae", size = 566440, upload-time = "2026-06-14T10:49:15.483Z" }, + { url = "https://files.pythonhosted.org/packages/89/bb/778aaccb58c4d2fba3482438c0d33c6a3a413710ecdb2ee8559ff28632fc/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c2d1ccfe088e8279d605011a3575619a74526c261be357695b3258c0f636115a", size = 482894, upload-time = "2026-06-14T10:49:16.982Z" }, + { url = "https://files.pythonhosted.org/packages/3a/88/87ad188ce971c15bce933e13c4dc2939e741a9cb06a8bd692ef8614c3ed4/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e73a550dbeb84e8fa50f8385f7735e9a4735b465851ef617d02f80ab10e44e7e", size = 510822, upload-time = "2026-06-14T10:49:18.274Z" }, + { url = "https://files.pythonhosted.org/packages/6e/8c/01714884a14b836abfdb1d80339acbb39515b0e92e615c4b65caf0eec257/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:84f92e5a60a78c72ccda79d0417d311a1f6da18f446423ed411726d545bf7b56", size = 586941, upload-time = "2026-06-14T10:49:19.563Z" }, + { url = "https://files.pythonhosted.org/packages/63/43/e2cb44bbe3f7485d6ad8493211f0c8fffdb7e02fb94203fd968751d9fad7/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:0eb4281f402b94d397b7482f6d9efd04c28274e4ed6eb57eb1f87bdd091a6a87", size = 564255, upload-time = "2026-06-14T10:49:20.968Z" }, + { url = "https://files.pythonhosted.org/packages/36/eb/eb0f00f6f7778db3710f757d77f5699c325548037dd975b52b186394125e/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d6b9b06323e3ba947c0003b2d70e02f33c90c36bc6262a92eb8201afc4a1aa08", size = 632836, upload-time = "2026-06-14T10:49:22.177Z" }, + { url = "https://files.pythonhosted.org/packages/ac/b8/5434897431de92e79ebfb2c02e1ab3cd228e92853b7ff981b2cffcce7355/backports_zstd-1.6.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8872a0e9f1af975966b5be6af7eebd3dc4046f15e470b719316516dc3d137cd6", size = 496501, upload-time = "2026-06-14T10:49:23.444Z" }, + { url = "https://files.pythonhosted.org/packages/db/76/754939c3914e9724e20a50b75b17fdc27aeb24d697eb61c3e93438a42920/backports_zstd-1.6.0-cp310-cp310-win32.whl", hash = "sha256:c14fa5dc39a804f1b92d63506f450eca5c59647a18d197d1a564b89dac1be1ce", size = 291527, upload-time = "2026-06-14T10:49:24.568Z" }, + { url = "https://files.pythonhosted.org/packages/84/f1/adcebdc2caa2e3d3d496ac2501f0ada49ad2942ee36e5f88a944bca9ca92/backports_zstd-1.6.0-cp310-cp310-win_amd64.whl", hash = "sha256:8219d6fceae6b39535c4ac323dba0923d10f781d59962ff3504e693fdcafa92c", size = 329024, upload-time = "2026-06-14T10:49:25.773Z" }, + { url = "https://files.pythonhosted.org/packages/74/10/12edc0b401a08aba157b9d331748ac0f0e9890af0a58a9c72425063d1450/backports_zstd-1.6.0-cp310-cp310-win_arm64.whl", hash = "sha256:b7bc9a0b66097f03820a54316d2fdd0beb38859cf98f10d63e94c55450ed8920", size = 291597, upload-time = "2026-06-14T10:49:27.156Z" }, + { url = "https://files.pythonhosted.org/packages/c5/90/428dd82228b1b6d62d5a1bf312c29e6c125af6a182fcfd82768ca179dcc7/backports_zstd-1.6.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c4fc41b2df5529cad5ceb230319e82728096d4b353ce8d4df68a2ec37e291bb8", size = 437067, upload-time = "2026-06-14T10:49:28.335Z" }, + { url = "https://files.pythonhosted.org/packages/ef/48/768edf21fe33bae8d874470b1be136681d4d32eb820a32e1c98262ebe39b/backports_zstd-1.6.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:83391ef5935cc0f329b1abca414ae20ffe40d335fc21a4b5e664f08a74317d5f", size = 363454, upload-time = "2026-06-14T10:49:29.784Z" }, + { url = "https://files.pythonhosted.org/packages/29/8a/d462c2e5071eb573378f0d26760f6590613086fdf59c2d3c66bdfffb9f41/backports_zstd-1.6.0-cp311-cp311-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:7d3f64c503af7b60115b97c16feaf75bd191ef2c978d5c0c7725a6682bef63c5", size = 507393, upload-time = "2026-06-14T10:49:31.077Z" }, + { url = "https://files.pythonhosted.org/packages/b9/cb/af58363b0dd0b497282ecef1fa99789b03cc1885a01a41394cad42ceeff6/backports_zstd-1.6.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0308990ffc998df3c7ed35276bde049728b5c3956203cae40d80893576a41459", size = 476957, upload-time = "2026-06-14T10:49:32.53Z" }, + { url = "https://files.pythonhosted.org/packages/e4/fd/5fbdf2275cefae95c4b3509f6db2dc372d0587ebafea342d28781d51d932/backports_zstd-1.6.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8c298785e2fadeab82342040f2d9ce764ce500e6da6a6d99a2de514e63580b5a", size = 582618, upload-time = "2026-06-14T10:49:33.723Z" }, + { url = "https://files.pythonhosted.org/packages/99/6f/7dd45c53c907ea67f635c3900b58bb3347c01dc2ded441402028aae0ef9c/backports_zstd-1.6.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:ae106fe16e36efc60ab098d02478d30aa0e31e1420eb4ecf0116459253bc6361", size = 642279, upload-time = "2026-06-14T10:49:34.938Z" }, + { url = "https://files.pythonhosted.org/packages/4d/25/a9e37dd035027565fa0b7e367da50e88a6ab26e7fd413269aa118e25258b/backports_zstd-1.6.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7293fefe15f0e5852bdb4ad1e0e26f3cbd4d3e61c19f751ecc4ff34bc1eb237d", size = 492486, upload-time = "2026-06-14T10:49:36.06Z" }, + { url = "https://files.pythonhosted.org/packages/a1/52/659686bf8f7c53ea279e1c44038504b82a6901cee2f5ae83c30bbf581301/backports_zstd-1.6.0-cp311-cp311-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ece8e7288db5b827ef8c64b2f78519f1a173a8991a625978fce02eccd7654fe9", size = 566440, upload-time = "2026-06-14T10:49:37.536Z" }, + { url = "https://files.pythonhosted.org/packages/d9/1a/c7ea5a0ff607a1a6066bb7c7cb65ae20e2f85da6adc69ab77fd8943e180c/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:28eef3881164f3c23ce58ed59e4684103bdd279583eb2d299858c9e9b72fde9a", size = 482899, upload-time = "2026-06-14T10:49:38.805Z" }, + { url = "https://files.pythonhosted.org/packages/83/48/bd2b91100ee4fe6bb4d816e3659cbbb0cda5dd32760d2379c54d1752ec25/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:481a1e9bd8f419fdc625307aa20234687f99368c75df511ef589693c5fea4c6f", size = 510826, upload-time = "2026-06-14T10:49:40.062Z" }, + { url = "https://files.pythonhosted.org/packages/25/fe/fa28509d7ce2ad59404e7ce738a2fd858e12dfd9a896629f10330222a7fb/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:3b6713371f8987a1178df93cb36f29eef191f224021e2d656b2f11ce60d26816", size = 586941, upload-time = "2026-06-14T10:49:41.305Z" }, + { url = "https://files.pythonhosted.org/packages/45/28/757daf2399aa71bb37f9f7f48b42ab03fc51c340eccfad2fec92a23f6aa3/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:b0ddbcd2866b8ff1a2836e4b0e4d44788f5b992d83fac75a38cda8f9a2bee079", size = 564261, upload-time = "2026-06-14T10:49:42.49Z" }, + { url = "https://files.pythonhosted.org/packages/4e/53/9b9db30cb2c148a69c40ad7647aa787338041f3dc81c5b22113286e590e9/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:2914abea516704bdafb2090acd3f15b5f9debecfabd15b8dd8285b2ad3b92209", size = 632869, upload-time = "2026-06-14T10:49:43.981Z" }, + { url = "https://files.pythonhosted.org/packages/81/a4/1692fbb88af8aaf900a53619fcc95c9e45d9ff162223a47fd672a9893c8d/backports_zstd-1.6.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:dd085eafa2aac6f883afd28210a3231f717f25409a1e44a39bb7b04c8c5b5646", size = 496496, upload-time = "2026-06-14T10:49:45.118Z" }, + { url = "https://files.pythonhosted.org/packages/93/42/c5a66c47320bd12ce84a7341330ea582d67069bdb70214bca0b6bf394cfd/backports_zstd-1.6.0-cp311-cp311-win32.whl", hash = "sha256:b81b4cf3d6e0ad7ac92bef248f49fafc954262c5fb0f7e19d6aac497e5a856b2", size = 291613, upload-time = "2026-06-14T10:49:46.473Z" }, + { url = "https://files.pythonhosted.org/packages/2a/f2/f22c19b4cdde429805ff5ac8dd77a95569a7c4cb8991741b2ff0d538f220/backports_zstd-1.6.0-cp311-cp311-win_amd64.whl", hash = "sha256:10b61850c4112952e05aa6e6cce8c9a5936fbeadb321e154216705cc76a14afa", size = 329078, upload-time = "2026-06-14T10:49:47.71Z" }, + { url = "https://files.pythonhosted.org/packages/ef/dc/e902a3f1eb92c4907b5f47f90cb3c2734ee315c4ff67179fc111343b45ba/backports_zstd-1.6.0-cp311-cp311-win_arm64.whl", hash = "sha256:068ef3d8c18815a2e3a752f766313e19910e7c50939b956923748d9c04ebcb1b", size = 291727, upload-time = "2026-06-14T10:49:48.929Z" }, + { url = "https://files.pythonhosted.org/packages/1e/bb/009af3a9532d4cc66d5385391c512210fae32ab2442605f26aca1d8d2957/backports_zstd-1.6.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0466b14723f3b7697669c00ee66fe16e30e25636b286b0a923fa86fa3d8a753c", size = 437407, upload-time = "2026-06-14T10:49:50.155Z" }, + { url = "https://files.pythonhosted.org/packages/0c/76/f7c02efde81ebb9993586f9e435d2fd1191a6f806f640e4eeb8d004493ed/backports_zstd-1.6.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:1d146926e997d2d3de8212bdcbf4985344a2622ca3bec458d8908000a84fd883", size = 363519, upload-time = "2026-06-14T10:49:51.383Z" }, + { url = "https://files.pythonhosted.org/packages/2e/5e/0cf66f12472fe3e082cc4134395a7e0b8746cfb30aabd74251ce8fafa9a7/backports_zstd-1.6.0-cp312-cp312-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:460fd6b3f338c659507ae36cfd6b58ac9942a2ff233c5cf574416dfec0451a84", size = 507756, upload-time = "2026-06-14T10:49:52.497Z" }, + { url = "https://files.pythonhosted.org/packages/03/95/7ed25c90369360f96f8bfa961540845e063377c32a43b775201af66a588c/backports_zstd-1.6.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7c2b1f4a640c51130caa92cef5bf72bd3c3dbbcfbf814c37403aa0601b1811b0", size = 477578, upload-time = "2026-06-14T10:49:53.887Z" }, + { url = "https://files.pythonhosted.org/packages/e3/75/f16b1d3e33ca396525847c81d96e3de7bc74d2c6f9ca2ddee76b0c450697/backports_zstd-1.6.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:beb43e9885202c8d4f3762319ed4d5e98e197622afbff8439fbbdd81d08938b9", size = 583029, upload-time = "2026-06-14T10:49:55.132Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2b/a17b111b631e1c79a0e570881c1a266c661b936585afa395435a458b1991/backports_zstd-1.6.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:fbb746522ebfc11155f1cd688e2c48ef3d74125e38b63eabdaab068a055c3e88", size = 641741, upload-time = "2026-06-14T10:49:56.42Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b2/d17b2722c636d64b4e77ddc68d8d0625719d39f94021be8719a218af4c0a/backports_zstd-1.6.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1a99710fbb225d459d66def4dc2bb2cd4a9a0bdc8b799fc0621cfdd863be9c93", size = 495554, upload-time = "2026-06-14T10:49:57.652Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/2853e8b6c03f03795b6548ea61f82cc104d4f7ff2523a04bc69f46984663/backports_zstd-1.6.0-cp312-cp312-manylinux_2_34_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f69365ee2b836939137de024a302395a1cb8654fb6dc5ffef6381105259c8f87", size = 570027, upload-time = "2026-06-14T10:49:59.003Z" }, + { url = "https://files.pythonhosted.org/packages/18/aa/83f37b81f3b8c6ea035bf260ec374648bd59372894c02323dc9de3cbdf77/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:66cf8038893c7708ec345ffb3ac63c775d10f430f323ac2f0334fdb6a397c57c", size = 483594, upload-time = "2026-06-14T10:50:00.49Z" }, + { url = "https://files.pythonhosted.org/packages/f5/6a/d77f8cd2ff642d3b3652c1ccab5b6583114dbf10f8cb0143531357c83998/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:e514c71ca72f3b56bd8fbda1a6a5b7d1100a2764b42a3c74a38841f25f9b00ab", size = 511206, upload-time = "2026-06-14T10:50:01.86Z" }, + { url = "https://files.pythonhosted.org/packages/56/b2/99a60fe4d1aac8053769d2463271d5df37a7c11c387072fdbb0b16aed7f7/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7741e44f7938ec94f9a52678c8d19b7bc548522ffdc39c9e4481af8db545fa9a", size = 587416, upload-time = "2026-06-14T10:50:03.236Z" }, + { url = "https://files.pythonhosted.org/packages/ec/1e/a9c003fe4d14bd4bf671598d4c7dcc1cef51e3513d9d7111ba1d07b6f07b/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:97e8a9674652496c7612b528085dd5a296c052a2edc466ca1bfb7b0b27820413", size = 567615, upload-time = "2026-06-14T10:50:04.524Z" }, + { url = "https://files.pythonhosted.org/packages/ec/b9/955bd604f692c550c7cb66d00bd7691ead5c86df8ebd23d7254eeaa90789/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:23a793f2fed4dbf0517319759a2cded0b0dd8e8d3797fe30badd5693e320c175", size = 632269, upload-time = "2026-06-14T10:50:05.86Z" }, + { url = "https://files.pythonhosted.org/packages/18/d7/9f61f612f8a4193484c78a1f26db82a50141234189885113ef0085a8a961/backports_zstd-1.6.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:b951113113ed4b8d173418a4f155c14b739dace626b3fa3f82be1831958d39e4", size = 500066, upload-time = "2026-06-14T10:50:07.446Z" }, + { url = "https://files.pythonhosted.org/packages/81/a3/19fb8c48d94139481c5ccaf2fb54c31b543fa635fd7bd7399aadd15752ac/backports_zstd-1.6.0-cp312-cp312-win32.whl", hash = "sha256:6430b34a2ae6fcc604672f4f913102563473d9a015bdca1ce8c95041cc1f2677", size = 291825, upload-time = "2026-06-14T10:50:08.762Z" }, + { url = "https://files.pythonhosted.org/packages/58/38/40ba081c6c71f0f22c64d3d54b912ad75a4e6812caa1397cbb15b5693b12/backports_zstd-1.6.0-cp312-cp312-win_amd64.whl", hash = "sha256:08793876172551a930ce4d65c712cd516184d1a97070d4a1193e05bf0cf7040d", size = 329201, upload-time = "2026-06-14T10:50:09.979Z" }, + { url = "https://files.pythonhosted.org/packages/2b/6c/f7116dd2edc6f960545f0d8616939eae3a20031b3b6669697d4f9fd83b2e/backports_zstd-1.6.0-cp312-cp312-win_arm64.whl", hash = "sha256:03b7c59c71f7a597e2bcb3f8368371e9a660a1bdf1c37afc1f1ad1496a013c19", size = 291901, upload-time = "2026-06-14T10:50:11.198Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/9ed88f528b9484f3847f07b9d1d014b496e048d391b4bc04cb0117bd71a5/backports_zstd-1.6.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:6c73ae37dbf9207727ac095dedef864c05d836eaec962a47b3b64eaadaf1c6b6", size = 411126, upload-time = "2026-06-14T10:50:42.253Z" }, + { url = "https://files.pythonhosted.org/packages/fe/26/bf8093d117cb6c36202ee7a2127f672c7b0c81f0c104ce28124534b75efa/backports_zstd-1.6.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:839faf90a7eb525a401978dc925df8c44bd12526e8ba1529b9f8a7106e729637", size = 340643, upload-time = "2026-06-14T10:50:43.571Z" }, + { url = "https://files.pythonhosted.org/packages/17/10/55f0860ed359d290e0eadd410da47ae720a1acf0d8362149e22acbe63223/backports_zstd-1.6.0-pp310-pypy310_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:f8f5c1c7c69a4b00889e52d9304a918a5b49010f9645768eb5fd0ad404f790ba", size = 421696, upload-time = "2026-06-14T10:50:44.915Z" }, + { url = "https://files.pythonhosted.org/packages/7c/3e/8dd9cc6f3e697e4721e53d6b9ca8c95c9d51ad2e759e7fcee6885e5b71db/backports_zstd-1.6.0-pp310-pypy310_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e80bceebc9b58e959bede9b26cafe15b5b9526f3533a6dd06330c5da73cb9329", size = 395239, upload-time = "2026-06-14T10:50:46.186Z" }, + { url = "https://files.pythonhosted.org/packages/fb/bb/ab92f8599749cb6063416dd9f46e084004c4e8db68e2eb768283012a6d27/backports_zstd-1.6.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:79284c1dd702f4f24ed1a36e51555c907dd237b6c0d829595978f4089a2aeea9", size = 415202, upload-time = "2026-06-14T10:50:47.726Z" }, + { url = "https://files.pythonhosted.org/packages/2c/f4/dd3ef995f6b22e23da145ac3ecc91e1f1fc4cb572b7f95e6b2b11de16782/backports_zstd-1.6.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:1e20b3ecd0a711be82e964aca28554eabbc31ee69a20e5e7b8fd42268af46212", size = 315722, upload-time = "2026-06-14T10:50:49Z" }, + { url = "https://files.pythonhosted.org/packages/e8/09/898fe2f8196fa7ab825f5fed786c68581fdac7d23a8e20baa0cc01cb2f0b/backports_zstd-1.6.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:aeef8563b82ed4af328f98e5041c1b4800d86f68f857ffd1577d4d47dc9aa6cd", size = 411023, upload-time = "2026-06-14T10:50:50.286Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ad/6ad9af1596ab5f284bb53954be41396e13d23c81cdfe3d945402e8ee0215/backports_zstd-1.6.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:9cb75e33131946fabd6319061df3b8b1d588fe0963183280e9b5f49f7772fc09", size = 340554, upload-time = "2026-06-14T10:50:51.523Z" }, + { url = "https://files.pythonhosted.org/packages/f0/00/f083d7c8a4ee5d0bb21b4d3144e76de9f655ca4dd0bffcb95baa5bc47a62/backports_zstd-1.6.0-pp311-pypy311_pp73-manylinux2010_i686.manylinux_2_12_i686.manylinux_2_28_i686.whl", hash = "sha256:ef132cfb638e9a86bd5dc07fb4e1cb895bc55bce6bb5e759366e8b160d0747e2", size = 421694, upload-time = "2026-06-14T10:50:52.917Z" }, + { url = "https://files.pythonhosted.org/packages/41/d7/693b20f3ccae2e05d166f98fe55b1657451170b72c804ed9f6b98df520be/backports_zstd-1.6.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab70eace272d6f122b121c057e436709b50a28abf30d97aab28433c08f4a4095", size = 395237, upload-time = "2026-06-14T10:50:54.448Z" }, + { url = "https://files.pythonhosted.org/packages/53/a1/484e0f9ec994bd2285d6747e7c8028350f1a177e9210bc57637898042d3b/backports_zstd-1.6.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:17efb3d11137de5166dd51eedab9c36ad633402acba386eee8d715213ea47e49", size = 415201, upload-time = "2026-06-14T10:50:55.854Z" }, + { url = "https://files.pythonhosted.org/packages/3c/56/70860ece85cd49b564305cbc22bf6c4183975427ff6dfe2097e855f5dd5e/backports_zstd-1.6.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:994167ff6551b9c1ce226e0aab16295b98c94507b5701aa60d2c32b7d50796b1", size = 315721, upload-time = "2026-06-14T10:50:57.074Z" }, +] + +[[package]] +name = "bcrypt" +version = "5.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d4/36/3329e2518d70ad8e2e5817d5a4cac6bba05a47767ec416c7d020a965f408/bcrypt-5.0.0.tar.gz", hash = "sha256:f748f7c2d6fd375cc93d3fba7ef4a9e3a092421b8dbf34d8d4dc06be9492dfdd", size = 25386, upload-time = "2025-09-25T19:50:47.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/29/6237f151fbfe295fe3e074ecc6d44228faa1e842a81f6d34a02937ee1736/bcrypt-5.0.0-cp38-abi3-macosx_10_12_universal2.whl", hash = "sha256:fc746432b951e92b58317af8e0ca746efe93e66555f1b40888865ef5bf56446b", size = 494553, upload-time = "2025-09-25T19:49:49.006Z" }, + { url = "https://files.pythonhosted.org/packages/45/b6/4c1205dde5e464ea3bd88e8742e19f899c16fa8916fb8510a851fae985b5/bcrypt-5.0.0-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c2388ca94ffee269b6038d48747f4ce8df0ffbea43f31abfa18ac72f0218effb", size = 275009, upload-time = "2025-09-25T19:49:50.581Z" }, + { url = "https://files.pythonhosted.org/packages/3b/71/427945e6ead72ccffe77894b2655b695ccf14ae1866cd977e185d606dd2f/bcrypt-5.0.0-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:560ddb6ec730386e7b3b26b8b4c88197aaed924430e7b74666a586ac997249ef", size = 278029, upload-time = "2025-09-25T19:49:52.533Z" }, + { url = "https://files.pythonhosted.org/packages/17/72/c344825e3b83c5389a369c8a8e58ffe1480b8a699f46c127c34580c4666b/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:d79e5c65dcc9af213594d6f7f1fa2c98ad3fc10431e7aa53c176b441943efbdd", size = 275907, upload-time = "2025-09-25T19:49:54.709Z" }, + { url = "https://files.pythonhosted.org/packages/0b/7e/d4e47d2df1641a36d1212e5c0514f5291e1a956a7749f1e595c07a972038/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:2b732e7d388fa22d48920baa267ba5d97cca38070b69c0e2d37087b381c681fd", size = 296500, upload-time = "2025-09-25T19:49:56.013Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/0ae57a68be2039287ec28bc463b82e4b8dc23f9d12c0be331f4782e19108/bcrypt-5.0.0-cp38-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0c8e093ea2532601a6f686edbc2c6b2ec24131ff5c52f7610dd64fa4553b5464", size = 278412, upload-time = "2025-09-25T19:49:57.356Z" }, + { url = "https://files.pythonhosted.org/packages/45/2b/77424511adb11e6a99e3a00dcc7745034bee89036ad7d7e255a7e47be7d8/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:5b1589f4839a0899c146e8892efe320c0fa096568abd9b95593efac50a87cb75", size = 275486, upload-time = "2025-09-25T19:49:59.116Z" }, + { url = "https://files.pythonhosted.org/packages/43/0a/405c753f6158e0f3f14b00b462d8bca31296f7ecfc8fc8bc7919c0c7d73a/bcrypt-5.0.0-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:89042e61b5e808b67daf24a434d89bab164d4de1746b37a8d173b6b14f3db9ff", size = 277940, upload-time = "2025-09-25T19:50:00.869Z" }, + { url = "https://files.pythonhosted.org/packages/62/83/b3efc285d4aadc1fa83db385ec64dcfa1707e890eb42f03b127d66ac1b7b/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:e3cf5b2560c7b5a142286f69bde914494b6d8f901aaa71e453078388a50881c4", size = 310776, upload-time = "2025-09-25T19:50:02.393Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/47ee337dacecde6d234890fe929936cb03ebc4c3a7460854bbd9c97780b8/bcrypt-5.0.0-cp38-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:f632fd56fc4e61564f78b46a2269153122db34988e78b6be8b32d28507b7eaeb", size = 312922, upload-time = "2025-09-25T19:50:04.232Z" }, + { url = "https://files.pythonhosted.org/packages/d6/3a/43d494dfb728f55f4e1cf8fd435d50c16a2d75493225b54c8d06122523c6/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:801cad5ccb6b87d1b430f183269b94c24f248dddbbc5c1f78b6ed231743e001c", size = 341367, upload-time = "2025-09-25T19:50:05.559Z" }, + { url = "https://files.pythonhosted.org/packages/55/ab/a0727a4547e383e2e22a630e0f908113db37904f58719dc48d4622139b5c/bcrypt-5.0.0-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:3cf67a804fc66fc217e6914a5635000259fbbbb12e78a99488e4d5ba445a71eb", size = 359187, upload-time = "2025-09-25T19:50:06.916Z" }, + { url = "https://files.pythonhosted.org/packages/1b/bb/461f352fdca663524b4643d8b09e8435b4990f17fbf4fea6bc2a90aa0cc7/bcrypt-5.0.0-cp38-abi3-win32.whl", hash = "sha256:3abeb543874b2c0524ff40c57a4e14e5d3a66ff33fb423529c88f180fd756538", size = 153752, upload-time = "2025-09-25T19:50:08.515Z" }, + { url = "https://files.pythonhosted.org/packages/41/aa/4190e60921927b7056820291f56fc57d00d04757c8b316b2d3c0d1d6da2c/bcrypt-5.0.0-cp38-abi3-win_amd64.whl", hash = "sha256:35a77ec55b541e5e583eb3436ffbbf53b0ffa1fa16ca6782279daf95d146dcd9", size = 150881, upload-time = "2025-09-25T19:50:09.742Z" }, + { url = "https://files.pythonhosted.org/packages/54/12/cd77221719d0b39ac0b55dbd39358db1cd1246e0282e104366ebbfb8266a/bcrypt-5.0.0-cp38-abi3-win_arm64.whl", hash = "sha256:cde08734f12c6a4e28dc6755cd11d3bdfea608d93d958fffbe95a7026ebe4980", size = 144931, upload-time = "2025-09-25T19:50:11.016Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ba/2af136406e1c3839aea9ecadc2f6be2bcd1eff255bd451dd39bcf302c47a/bcrypt-5.0.0-cp39-abi3-macosx_10_12_universal2.whl", hash = "sha256:0c418ca99fd47e9c59a301744d63328f17798b5947b0f791e9af3c1c499c2d0a", size = 495313, upload-time = "2025-09-25T19:50:12.309Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ee/2f4985dbad090ace5ad1f7dd8ff94477fe089b5fab2040bd784a3d5f187b/bcrypt-5.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:ddb4e1500f6efdd402218ffe34d040a1196c072e07929b9820f363a1fd1f4191", size = 275290, upload-time = "2025-09-25T19:50:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/e4/6e/b77ade812672d15cf50842e167eead80ac3514f3beacac8902915417f8b7/bcrypt-5.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7aeef54b60ceddb6f30ee3db090351ecf0d40ec6e2abf41430997407a46d2254", size = 278253, upload-time = "2025-09-25T19:50:15.089Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/ed00ed32f1040f7990dac7115f82273e3c03da1e1a1587a778d8cea496d8/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:f0ce778135f60799d89c9693b9b398819d15f1921ba15fe719acb3178215a7db", size = 276084, upload-time = "2025-09-25T19:50:16.699Z" }, + { url = "https://files.pythonhosted.org/packages/e7/c4/fa6e16145e145e87f1fa351bbd54b429354fd72145cd3d4e0c5157cf4c70/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a71f70ee269671460b37a449f5ff26982a6f2ba493b3eabdd687b4bf35f875ac", size = 297185, upload-time = "2025-09-25T19:50:18.525Z" }, + { url = "https://files.pythonhosted.org/packages/24/b4/11f8a31d8b67cca3371e046db49baa7c0594d71eb40ac8121e2fc0888db0/bcrypt-5.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:f8429e1c410b4073944f03bd778a9e066e7fad723564a52ff91841d278dfc822", size = 278656, upload-time = "2025-09-25T19:50:19.809Z" }, + { url = "https://files.pythonhosted.org/packages/ac/31/79f11865f8078e192847d2cb526e3fa27c200933c982c5b2869720fa5fce/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:edfcdcedd0d0f05850c52ba3127b1fce70b9f89e0fe5ff16517df7e81fa3cbb8", size = 275662, upload-time = "2025-09-25T19:50:21.567Z" }, + { url = "https://files.pythonhosted.org/packages/d4/8d/5e43d9584b3b3591a6f9b68f755a4da879a59712981ef5ad2a0ac1379f7a/bcrypt-5.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:611f0a17aa4a25a69362dcc299fda5c8a3d4f160e2abb3831041feb77393a14a", size = 278240, upload-time = "2025-09-25T19:50:23.305Z" }, + { url = "https://files.pythonhosted.org/packages/89/48/44590e3fc158620f680a978aafe8f87a4c4320da81ed11552f0323aa9a57/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_aarch64.whl", hash = "sha256:db99dca3b1fdc3db87d7c57eac0c82281242d1eabf19dcb8a6b10eb29a2e72d1", size = 311152, upload-time = "2025-09-25T19:50:24.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/85/e4fbfc46f14f47b0d20493669a625da5827d07e8a88ee460af6cd9768b44/bcrypt-5.0.0-cp39-abi3-musllinux_1_1_x86_64.whl", hash = "sha256:5feebf85a9cefda32966d8171f5db7e3ba964b77fdfe31919622256f80f9cf42", size = 313284, upload-time = "2025-09-25T19:50:26.268Z" }, + { url = "https://files.pythonhosted.org/packages/25/ae/479f81d3f4594456a01ea2f05b132a519eff9ab5768a70430fa1132384b1/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:3ca8a166b1140436e058298a34d88032ab62f15aae1c598580333dc21d27ef10", size = 341643, upload-time = "2025-09-25T19:50:28.02Z" }, + { url = "https://files.pythonhosted.org/packages/df/d2/36a086dee1473b14276cd6ea7f61aef3b2648710b5d7f1c9e032c29b859f/bcrypt-5.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:61afc381250c3182d9078551e3ac3a41da14154fbff647ddf52a769f588c4172", size = 359698, upload-time = "2025-09-25T19:50:31.347Z" }, + { url = "https://files.pythonhosted.org/packages/c0/f6/688d2cd64bfd0b14d805ddb8a565e11ca1fb0fd6817175d58b10052b6d88/bcrypt-5.0.0-cp39-abi3-win32.whl", hash = "sha256:64d7ce196203e468c457c37ec22390f1a61c85c6f0b8160fd752940ccfb3a683", size = 153725, upload-time = "2025-09-25T19:50:34.384Z" }, + { url = "https://files.pythonhosted.org/packages/9f/b9/9d9a641194a730bda138b3dfe53f584d61c58cd5230e37566e83ec2ffa0d/bcrypt-5.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:64ee8434b0da054d830fa8e89e1c8bf30061d539044a39524ff7dec90481e5c2", size = 150912, upload-time = "2025-09-25T19:50:35.69Z" }, + { url = "https://files.pythonhosted.org/packages/27/44/d2ef5e87509158ad2187f4dd0852df80695bb1ee0cfe0a684727b01a69e0/bcrypt-5.0.0-cp39-abi3-win_arm64.whl", hash = "sha256:f2347d3534e76bf50bca5500989d6c1d05ed64b440408057a37673282c654927", size = 144953, upload-time = "2025-09-25T19:50:37.32Z" }, + { url = "https://files.pythonhosted.org/packages/8a/75/4aa9f5a4d40d762892066ba1046000b329c7cd58e888a6db878019b282dc/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:7edda91d5ab52b15636d9c30da87d2cc84f426c72b9dba7a9b4fe142ba11f534", size = 271180, upload-time = "2025-09-25T19:50:38.575Z" }, + { url = "https://files.pythonhosted.org/packages/54/79/875f9558179573d40a9cc743038ac2bf67dfb79cecb1e8b5d70e88c94c3d/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:046ad6db88edb3c5ece4369af997938fb1c19d6a699b9c1b27b0db432faae4c4", size = 273791, upload-time = "2025-09-25T19:50:39.913Z" }, + { url = "https://files.pythonhosted.org/packages/bc/fe/975adb8c216174bf70fc17535f75e85ac06ed5252ea077be10d9cff5ce24/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:dcd58e2b3a908b5ecc9b9df2f0085592506ac2d5110786018ee5e160f28e0911", size = 270746, upload-time = "2025-09-25T19:50:43.306Z" }, + { url = "https://files.pythonhosted.org/packages/e4/f8/972c96f5a2b6c4b3deca57009d93e946bbdbe2241dca9806d502f29dd3ee/bcrypt-5.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:6b8f520b61e8781efee73cba14e3e8c9556ccfb375623f4f97429544734545b4", size = 273375, upload-time = "2025-09-25T19:50:45.43Z" }, +] + +[[package]] +name = "beautifulsoup4" +version = "4.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "soupsieve" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/43/65/318323f98dbee45d42dff61d8f047181bc6f2268a9068cfad035a46be5af/beautifulsoup4-4.15.0.tar.gz", hash = "sha256:288e3ca7d54b06f2ac191970bc275c1939cb46d450b255bf6718b04aa37ab4f7", size = 632571, upload-time = "2026-06-07T16:44:20.453Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/c6/92fcd42f1ba33e1184263f25bfabf3d27c383410470f169e4b8163bf9c17/beautifulsoup4-4.15.0-py3-none-any.whl", hash = "sha256:d6f88de62e1d4e38ecb1077eb9724cd0eff29d2a08ca16a401e9b9e93f117cf9", size = 109924, upload-time = "2026-06-07T16:44:21.566Z" }, +] + +[[package]] +name = "bleach" +version = "6.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/3c/e12ac860709702bd5ebeb9b56a4fe334f1001246ee1b8f2b7ee28912df7d/bleach-6.4.0.tar.gz", hash = "sha256:4202482733d85cedd04e59fcb2f89f4e4c7c385a78d3c3c23c30446843a37452", size = 204857, upload-time = "2026-06-05T13:01:13.734Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/58/9d/40b6267367182187139a4000b82a3b287d84d745bccd808e75d916920e9d/bleach-6.4.0-py3-none-any.whl", hash = "sha256:4b6b6a54fff2e69a3dde9d21cc6301220bee3c3cb792187d11403fd795031081", size = 165109, upload-time = "2026-06-05T13:01:12.504Z" }, +] + +[package.optional-dependencies] +css = [ + { name = "tinycss2" }, +] + +[[package]] +name = "boto3" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, + { name = "jmespath" }, + { name = "s3transfer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/65/47670987f2f9e181397872c7ee6415b7b95156d711b7eab6c55f66e575bc/boto3-1.43.0.tar.gz", hash = "sha256:80d44a943ef90aba7958ab31d30c155c198acc8a9581b5846b3878b2c8951086", size = 113143, upload-time = "2026-04-29T22:07:49.084Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/a0/3e6a0b1c1ea6bec76f71473727ef27abf3cd40e9709b3ebcbfbcfaae6f79/boto3-1.43.0-py3-none-any.whl", hash = "sha256:8ebe03754a4b73a5cb6ec2f14cca03ac33bd4760d0adea53da4724845130258b", size = 140497, upload-time = "2026-04-29T22:07:46.216Z" }, +] + +[[package]] +name = "botocore" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jmespath" }, + { name = "python-dateutil" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/79/2f4be1896db3db7ccf44504253a175d56b6bd6b669619edc5147d1aa21ea/botocore-1.43.0.tar.gz", hash = "sha256:e933b31a2d644253e1d029d7d39e99ba41b87e29300534f189744cc438cdf928", size = 15286817, upload-time = "2026-04-29T22:07:31.723Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/bf/4b/afc1fef8a43bafb139f57f73bbd70df82807af5934321e8112ae50668827/botocore-1.43.0-py3-none-any.whl", hash = "sha256:cc5b15eaec3c6eac05d8012cb5ef17ebe891beb88a16ca13c374bfaece1241e6", size = 14970102, upload-time = "2026-04-29T22:07:27Z" }, +] + +[[package]] +name = "brotli" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f7/16/c92ca344d646e71a43b8bb353f0a6490d7f6e06210f8554c8f874e454285/brotli-1.2.0.tar.gz", hash = "sha256:e310f77e41941c13340a95976fe66a8a95b01e783d430eeaf7a2f87e0a57dd0a", size = 7388632, upload-time = "2025-11-05T18:39:42.86Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/10/a090475284fc4a71aed40a96f32e44a7fe5bda39687353dd977720b211b6/brotli-1.2.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:3b90b767916ac44e93a8e28ce6adf8d551e43affb512f2377c732d486ac6514e", size = 863089, upload-time = "2025-11-05T18:38:01.181Z" }, + { url = "https://files.pythonhosted.org/packages/03/41/17416630e46c07ac21e378c3464815dd2e120b441e641bc516ac32cc51d2/brotli-1.2.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6be67c19e0b0c56365c6a76e393b932fb0e78b3b56b711d180dd7013cb1fd984", size = 445442, upload-time = "2025-11-05T18:38:02.434Z" }, + { url = "https://files.pythonhosted.org/packages/24/31/90cc06584deb5d4fcafc0985e37741fc6b9717926a78674bbb3ce018957e/brotli-1.2.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0bbd5b5ccd157ae7913750476d48099aaf507a79841c0d04a9db4415b14842de", size = 1532658, upload-time = "2025-11-05T18:38:03.588Z" }, + { url = "https://files.pythonhosted.org/packages/62/17/33bf0c83bcbc96756dfd712201d87342732fad70bb3472c27e833a44a4f9/brotli-1.2.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:3f3c908bcc404c90c77d5a073e55271a0a498f4e0756e48127c35d91cf155947", size = 1631241, upload-time = "2025-11-05T18:38:04.582Z" }, + { url = "https://files.pythonhosted.org/packages/48/10/f47854a1917b62efe29bc98ac18e5d4f71df03f629184575b862ef2e743b/brotli-1.2.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1b557b29782a643420e08d75aea889462a4a8796e9a6cf5621ab05a3f7da8ef2", size = 1424307, upload-time = "2025-11-05T18:38:05.587Z" }, + { url = "https://files.pythonhosted.org/packages/e4/b7/f88eb461719259c17483484ea8456925ee057897f8e64487d76e24e5e38d/brotli-1.2.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:81da1b229b1889f25adadc929aeb9dbc4e922bd18561b65b08dd9343cfccca84", size = 1488208, upload-time = "2025-11-05T18:38:06.613Z" }, + { url = "https://files.pythonhosted.org/packages/26/59/41bbcb983a0c48b0b8004203e74706c6b6e99a04f3c7ca6f4f41f364db50/brotli-1.2.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ff09cd8c5eec3b9d02d2408db41be150d8891c5566addce57513bf546e3d6c6d", size = 1597574, upload-time = "2025-11-05T18:38:07.838Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e6/8c89c3bdabbe802febb4c5c6ca224a395e97913b5df0dff11b54f23c1788/brotli-1.2.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a1778532b978d2536e79c05dac2d8cd857f6c55cd0c95ace5b03740824e0e2f1", size = 1492109, upload-time = "2025-11-05T18:38:08.816Z" }, + { url = "https://files.pythonhosted.org/packages/ed/9a/4b19d4310b2dbd545c0c33f176b0528fa68c3cd0754e34b2f2bcf56548ae/brotli-1.2.0-cp310-cp310-win32.whl", hash = "sha256:b232029d100d393ae3c603c8ffd7e3fe6f798c5e28ddca5feabb8e8fdb732997", size = 334461, upload-time = "2025-11-05T18:38:10.729Z" }, + { url = "https://files.pythonhosted.org/packages/ac/39/70981d9f47705e3c2b95c0847dfa3e7a37aa3b7c6030aedc4873081ed005/brotli-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:ef87b8ab2704da227e83a246356a2b179ef826f550f794b2c52cddb4efbd0196", size = 369035, upload-time = "2025-11-05T18:38:11.827Z" }, + { url = "https://files.pythonhosted.org/packages/7a/ef/f285668811a9e1ddb47a18cb0b437d5fc2760d537a2fe8a57875ad6f8448/brotli-1.2.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:15b33fe93cedc4caaff8a0bd1eb7e3dab1c61bb22a0bf5bdfdfd97cd7da79744", size = 863110, upload-time = "2025-11-05T18:38:12.978Z" }, + { url = "https://files.pythonhosted.org/packages/50/62/a3b77593587010c789a9d6eaa527c79e0848b7b860402cc64bc0bc28a86c/brotli-1.2.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:898be2be399c221d2671d29eed26b6b2713a02c2119168ed914e7d00ceadb56f", size = 445438, upload-time = "2025-11-05T18:38:14.208Z" }, + { url = "https://files.pythonhosted.org/packages/cd/e1/7fadd47f40ce5549dc44493877db40292277db373da5053aff181656e16e/brotli-1.2.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:350c8348f0e76fff0a0fd6c26755d2653863279d086d3aa2c290a6a7251135dd", size = 1534420, upload-time = "2025-11-05T18:38:15.111Z" }, + { url = "https://files.pythonhosted.org/packages/12/8b/1ed2f64054a5a008a4ccd2f271dbba7a5fb1a3067a99f5ceadedd4c1d5a7/brotli-1.2.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:2e1ad3fda65ae0d93fec742a128d72e145c9c7a99ee2fcd667785d99eb25a7fe", size = 1632619, upload-time = "2025-11-05T18:38:16.094Z" }, + { url = "https://files.pythonhosted.org/packages/89/5a/7071a621eb2d052d64efd5da2ef55ecdac7c3b0c6e4f9d519e9c66d987ef/brotli-1.2.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:40d918bce2b427a0c4ba189df7a006ac0c7277c180aee4617d99e9ccaaf59e6a", size = 1426014, upload-time = "2025-11-05T18:38:17.177Z" }, + { url = "https://files.pythonhosted.org/packages/26/6d/0971a8ea435af5156acaaccec1a505f981c9c80227633851f2810abd252a/brotli-1.2.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:2a7f1d03727130fc875448b65b127a9ec5d06d19d0148e7554384229706f9d1b", size = 1489661, upload-time = "2025-11-05T18:38:18.41Z" }, + { url = "https://files.pythonhosted.org/packages/f3/75/c1baca8b4ec6c96a03ef8230fab2a785e35297632f402ebb1e78a1e39116/brotli-1.2.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:9c79f57faa25d97900bfb119480806d783fba83cd09ee0b33c17623935b05fa3", size = 1599150, upload-time = "2025-11-05T18:38:19.792Z" }, + { url = "https://files.pythonhosted.org/packages/0d/1a/23fcfee1c324fd48a63d7ebf4bac3a4115bdb1b00e600f80f727d850b1ae/brotli-1.2.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:844a8ceb8483fefafc412f85c14f2aae2fb69567bf2a0de53cdb88b73e7c43ae", size = 1493505, upload-time = "2025-11-05T18:38:20.913Z" }, + { url = "https://files.pythonhosted.org/packages/36/e5/12904bbd36afeef53d45a84881a4810ae8810ad7e328a971ebbfd760a0b3/brotli-1.2.0-cp311-cp311-win32.whl", hash = "sha256:aa47441fa3026543513139cb8926a92a8e305ee9c71a6209ef7a97d91640ea03", size = 334451, upload-time = "2025-11-05T18:38:21.94Z" }, + { url = "https://files.pythonhosted.org/packages/02/8b/ecb5761b989629a4758c394b9301607a5880de61ee2ee5fe104b87149ebc/brotli-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:022426c9e99fd65d9475dce5c195526f04bb8be8907607e27e747893f6ee3e24", size = 369035, upload-time = "2025-11-05T18:38:22.941Z" }, + { url = "https://files.pythonhosted.org/packages/11/ee/b0a11ab2315c69bb9b45a2aaed022499c9c24a205c3a49c3513b541a7967/brotli-1.2.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:35d382625778834a7f3061b15423919aa03e4f5da34ac8e02c074e4b75ab4f84", size = 861543, upload-time = "2025-11-05T18:38:24.183Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2f/29c1459513cd35828e25531ebfcbf3e92a5e49f560b1777a9af7203eb46e/brotli-1.2.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7a61c06b334bd99bc5ae84f1eeb36bfe01400264b3c352f968c6e30a10f9d08b", size = 444288, upload-time = "2025-11-05T18:38:25.139Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/feba03130d5fceadfa3a1bb102cb14650798c848b1df2a808356f939bb16/brotli-1.2.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:acec55bb7c90f1dfc476126f9711a8e81c9af7fb617409a9ee2953115343f08d", size = 1528071, upload-time = "2025-11-05T18:38:26.081Z" }, + { url = "https://files.pythonhosted.org/packages/2b/38/f3abb554eee089bd15471057ba85f47e53a44a462cfce265d9bf7088eb09/brotli-1.2.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:260d3692396e1895c5034f204f0db022c056f9e2ac841593a4cf9426e2a3faca", size = 1626913, upload-time = "2025-11-05T18:38:27.284Z" }, + { url = "https://files.pythonhosted.org/packages/03/a7/03aa61fbc3c5cbf99b44d158665f9b0dd3d8059be16c460208d9e385c837/brotli-1.2.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:072e7624b1fc4d601036ab3f4f27942ef772887e876beff0301d261210bca97f", size = 1419762, upload-time = "2025-11-05T18:38:28.295Z" }, + { url = "https://files.pythonhosted.org/packages/21/1b/0374a89ee27d152a5069c356c96b93afd1b94eae83f1e004b57eb6ce2f10/brotli-1.2.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:adedc4a67e15327dfdd04884873c6d5a01d3e3b6f61406f99b1ed4865a2f6d28", size = 1484494, upload-time = "2025-11-05T18:38:29.29Z" }, + { url = "https://files.pythonhosted.org/packages/cf/57/69d4fe84a67aef4f524dcd075c6eee868d7850e85bf01d778a857d8dbe0a/brotli-1.2.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:7a47ce5c2288702e09dc22a44d0ee6152f2c7eda97b3c8482d826a1f3cfc7da7", size = 1593302, upload-time = "2025-11-05T18:38:30.639Z" }, + { url = "https://files.pythonhosted.org/packages/d5/3b/39e13ce78a8e9a621c5df3aeb5fd181fcc8caba8c48a194cd629771f6828/brotli-1.2.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:af43b8711a8264bb4e7d6d9a6d004c3a2019c04c01127a868709ec29962b6036", size = 1487913, upload-time = "2025-11-05T18:38:31.618Z" }, + { url = "https://files.pythonhosted.org/packages/62/28/4d00cb9bd76a6357a66fcd54b4b6d70288385584063f4b07884c1e7286ac/brotli-1.2.0-cp312-cp312-win32.whl", hash = "sha256:e99befa0b48f3cd293dafeacdd0d191804d105d279e0b387a32054c1180f3161", size = 334362, upload-time = "2025-11-05T18:38:32.939Z" }, + { url = "https://files.pythonhosted.org/packages/1c/4e/bc1dcac9498859d5e353c9b153627a3752868a9d5f05ce8dedd81a2354ab/brotli-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:b35c13ce241abdd44cb8ca70683f20c0c079728a36a996297adb5334adfc1c44", size = 369115, upload-time = "2025-11-05T18:38:33.765Z" }, +] + +[[package]] +name = "brotlicffi" +version = "1.2.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8a/b6/017dc5f852ed9b8735af77774509271acbf1de02d238377667145fcee01d/brotlicffi-1.2.0.1.tar.gz", hash = "sha256:c20d5c596278307ad06414a6d95a892377ea274a5c6b790c2548c009385d621c", size = 478156, upload-time = "2026-03-05T19:54:11.547Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/9f/b98dcd4af47994cee97aebac866996a006a2e5fc1fd1e2b82a8ad95cf09c/brotlicffi-1.2.0.1-cp38-abi3-macosx_11_0_arm64.whl", hash = "sha256:91ba5f0ccc040f6ff8f7efaf839f797723d03ed46acb8ae9408f99ffd2572cf4", size = 432608, upload-time = "2026-03-05T19:53:56.736Z" }, + { url = "https://files.pythonhosted.org/packages/b1/7a/ac4ee56595a061e3718a6d1ea7e921f4df156894acffb28ed88a1fd52022/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:be9a670c6811af30a4bd42d7116dc5895d3b41beaa8ed8a89050447a0181f5ce", size = 1534257, upload-time = "2026-03-05T19:53:58.667Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/e7410db7f6f56de57744ea52a115084ceb2735f4d44973f349bb92136586/brotlicffi-1.2.0.1-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f3314a3476f59e5443f9f72a6dff16edc0c3463c9b318feaef04ae3e4683f5a", size = 1536838, upload-time = "2026-03-05T19:54:00.705Z" }, + { url = "https://files.pythonhosted.org/packages/a6/75/6e7977d1935fc3fbb201cbd619be8f2c7aea25d40a096967132854b34708/brotlicffi-1.2.0.1-cp38-abi3-win32.whl", hash = "sha256:82ea52e2b5d3145b6c406ebd3efb0d55db718b7ad996bd70c62cec0439de1187", size = 343337, upload-time = "2026-03-05T19:54:02.446Z" }, + { url = "https://files.pythonhosted.org/packages/d8/ef/e7e485ce5e4ba3843a0a92feb767c7b6098fd6e65ce752918074d175ae71/brotlicffi-1.2.0.1-cp38-abi3-win_amd64.whl", hash = "sha256:da2e82a08e7778b8bc539d27ca03cdd684113e81394bfaaad8d0dfc6a17ddede", size = 379026, upload-time = "2026-03-05T19:54:04.322Z" }, + { url = "https://files.pythonhosted.org/packages/7f/53/6262c2256513e6f530d81642477cb19367270922063eaa2d7b781d8c723d/brotlicffi-1.2.0.1-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:e015af99584c6db1490a69a210c765953e473e63adc2d891ac3062a737c9e851", size = 402265, upload-time = "2026-03-05T19:54:05.858Z" }, + { url = "https://files.pythonhosted.org/packages/1f/d9/d5340b43cf5fbe7fe5a083d237e5338cc1caa73bea523be1c5e452c26290/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37cb587d32bf7168e2218c455e22e409ad1f3157c6c71945879a311f3e6b6abf", size = 406710, upload-time = "2026-03-05T19:54:07.272Z" }, + { url = "https://files.pythonhosted.org/packages/a3/82/dbced4c1e0792efdf23fd90ff6d2a320c64ff4dfef7aacc85c04fde9ddd2/brotlicffi-1.2.0.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9d6ba65dd528892b4d9960beba2ae011a753620bcfc66cf6fa3cee18d7b0baa4", size = 402787, upload-time = "2026-03-05T19:54:08.73Z" }, + { url = "https://files.pythonhosted.org/packages/ef/6f/534205ba7590c9a8716a614f270c5c2ec419b5b7079b3f9cd31b7b5580de/brotlicffi-1.2.0.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:f2a5575653b0672638ba039b82fda56854934d7a6a24d4b8b5033f73ab43cbc1", size = 375108, upload-time = "2026-03-05T19:54:10.079Z" }, +] + +[[package]] +name = "cachetools" +version = "6.2.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/39/91/d9ae9a66b01102a18cd16db0cf4cd54187ffe10f0865cc80071a4104fbb3/cachetools-6.2.6.tar.gz", hash = "sha256:16c33e1f276b9a9c0b49ab5782d901e3ad3de0dd6da9bf9bcd29ac5672f2f9e6", size = 32363, upload-time = "2026-01-27T20:32:59.956Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/90/45/f458fa2c388e79dd9d8b9b0c99f1d31b568f27388f2fdba7bb66bbc0c6ed/cachetools-6.2.6-py3-none-any.whl", hash = "sha256:8c9717235b3c651603fff0076db52d6acbfd1b338b8ed50256092f7ce9c85bda", size = 11668, upload-time = "2026-01-27T20:32:58.527Z" }, +] + +[[package]] +name = "certifi" +version = "2026.6.17" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/c7/424b75da314c1045981bd9777432fad05a9e0c69daa4ed7e308bbaffe405/certifi-2026.6.17.tar.gz", hash = "sha256:024c88eeec92ca068db80f02b8b07c9cef7b9fe261d1d535abfd5abd6f6af432", size = 134594, upload-time = "2026-06-17T10:31:07.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/2f/c5464532e965badff2f4c4c1a3a83f5697f0d7c407ed0cda44aaa99bb451/certifi-2026.6.17-py3-none-any.whl", hash = "sha256:2227dcbaafe0d2f59279d1762ddddc37783ed4354594f194ffc31d20f41fc3db", size = 133289, upload-time = "2026-06-17T10:31:06.348Z" }, +] + +[[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/93/d7/516d984057745a6cd96575eea814fe1edd6646ee6efd552fb7b0921dec83/cffi-2.0.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:0cf2d91ecc3fcc0625c2c530fe004f82c110405f101548512cce44322fa8ac44", size = 184283, upload-time = "2025-09-08T23:22:08.01Z" }, + { url = "https://files.pythonhosted.org/packages/9e/84/ad6a0b408daa859246f57c03efd28e5dd1b33c21737c2db84cae8c237aa5/cffi-2.0.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f73b96c41e3b2adedc34a7356e64c8eb96e03a3782b535e043a986276ce12a49", size = 180504, upload-time = "2025-09-08T23:22:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/50/bd/b1a6362b80628111e6653c961f987faa55262b4002fcec42308cad1db680/cffi-2.0.0-cp310-cp310-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:53f77cbe57044e88bbd5ed26ac1d0514d2acf0591dd6bb02a3ae37f76811b80c", size = 208811, upload-time = "2025-09-08T23:22:12.267Z" }, + { url = "https://files.pythonhosted.org/packages/4f/27/6933a8b2562d7bd1fb595074cf99cc81fc3789f6a6c05cdabb46284a3188/cffi-2.0.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3e837e369566884707ddaf85fc1744b47575005c0a229de3327f8f9a20f4efeb", size = 216402, upload-time = "2025-09-08T23:22:13.455Z" }, + { url = "https://files.pythonhosted.org/packages/05/eb/b86f2a2645b62adcfff53b0dd97e8dfafb5c8aa864bd0d9a2c2049a0d551/cffi-2.0.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:5eda85d6d1879e692d546a078b44251cdd08dd1cfb98dfb77b670c97cee49ea0", size = 203217, upload-time = "2025-09-08T23:22:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/9f/e0/6cbe77a53acf5acc7c08cc186c9928864bd7c005f9efd0d126884858a5fe/cffi-2.0.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9332088d75dc3241c702d852d4671613136d90fa6881da7d770a483fd05248b4", size = 203079, upload-time = "2025-09-08T23:22:15.769Z" }, + { url = "https://files.pythonhosted.org/packages/98/29/9b366e70e243eb3d14a5cb488dfd3a0b6b2f1fb001a203f653b93ccfac88/cffi-2.0.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:fc7de24befaeae77ba923797c7c87834c73648a05a4bde34b3b7e5588973a453", size = 216475, upload-time = "2025-09-08T23:22:17.427Z" }, + { url = "https://files.pythonhosted.org/packages/21/7a/13b24e70d2f90a322f2900c5d8e1f14fa7e2a6b3332b7309ba7b2ba51a5a/cffi-2.0.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cf364028c016c03078a23b503f02058f1814320a56ad535686f90565636a9495", size = 218829, upload-time = "2025-09-08T23:22:19.069Z" }, + { url = "https://files.pythonhosted.org/packages/60/99/c9dc110974c59cc981b1f5b66e1d8af8af764e00f0293266824d9c4254bc/cffi-2.0.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:e11e82b744887154b182fd3e7e8512418446501191994dbf9c9fc1f32cc8efd5", size = 211211, upload-time = "2025-09-08T23:22:20.588Z" }, + { url = "https://files.pythonhosted.org/packages/49/72/ff2d12dbf21aca1b32a40ed792ee6b40f6dc3a9cf1644bd7ef6e95e0ac5e/cffi-2.0.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8ea985900c5c95ce9db1745f7933eeef5d314f0565b27625d9a10ec9881e1bfb", size = 218036, upload-time = "2025-09-08T23:22:22.143Z" }, + { url = "https://files.pythonhosted.org/packages/e2/cc/027d7fb82e58c48ea717149b03bcadcbdc293553edb283af792bd4bcbb3f/cffi-2.0.0-cp310-cp310-win32.whl", hash = "sha256:1f72fb8906754ac8a2cc3f9f5aaa298070652a0ffae577e0ea9bd480dc3c931a", size = 172184, upload-time = "2025-09-08T23:22:23.328Z" }, + { url = "https://files.pythonhosted.org/packages/33/fa/072dd15ae27fbb4e06b437eb6e944e75b068deb09e2a2826039e49ee2045/cffi-2.0.0-cp310-cp310-win_amd64.whl", hash = "sha256:b18a3ed7d5b3bd8d9ef7a8cb226502c6bf8308df1525e1cc676c3680e7176739", size = 182790, upload-time = "2025-09-08T23:22:24.752Z" }, + { url = "https://files.pythonhosted.org/packages/12/4a/3dfd5f7850cbf0d06dc84ba9aa00db766b52ca38d8b86e3a38314d52498c/cffi-2.0.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:b4c854ef3adc177950a8dfc81a86f5115d2abd545751a304c5bcf2c2c7283cfe", size = 184344, upload-time = "2025-09-08T23:22:26.456Z" }, + { url = "https://files.pythonhosted.org/packages/4f/8b/f0e4c441227ba756aafbe78f117485b25bb26b1c059d01f137fa6d14896b/cffi-2.0.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2de9a304e27f7596cd03d16f1b7c72219bd944e99cc52b84d0145aefb07cbd3c", size = 180560, upload-time = "2025-09-08T23:22:28.197Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/1200d354378ef52ec227395d95c2576330fd22a869f7a70e88e1447eb234/cffi-2.0.0-cp311-cp311-manylinux1_i686.manylinux2014_i686.manylinux_2_17_i686.manylinux_2_5_i686.whl", hash = "sha256:baf5215e0ab74c16e2dd324e8ec067ef59e41125d3eade2b863d294fd5035c92", size = 209613, upload-time = "2025-09-08T23:22:29.475Z" }, + { url = "https://files.pythonhosted.org/packages/b8/56/6033f5e86e8cc9bb629f0077ba71679508bdf54a9a5e112a3c0b91870332/cffi-2.0.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:730cacb21e1bdff3ce90babf007d0a0917cc3e6492f336c2f0134101e0944f93", size = 216476, upload-time = "2025-09-08T23:22:31.063Z" }, + { url = "https://files.pythonhosted.org/packages/dc/7f/55fecd70f7ece178db2f26128ec41430d8720f2d12ca97bf8f0a628207d5/cffi-2.0.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:6824f87845e3396029f3820c206e459ccc91760e8fa24422f8b0c3d1731cbec5", size = 203374, upload-time = "2025-09-08T23:22:32.507Z" }, + { url = "https://files.pythonhosted.org/packages/84/ef/a7b77c8bdc0f77adc3b46888f1ad54be8f3b7821697a7b89126e829e676a/cffi-2.0.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.whl", hash = "sha256:9de40a7b0323d889cf8d23d1ef214f565ab154443c42737dfe52ff82cf857664", size = 202597, upload-time = "2025-09-08T23:22:34.132Z" }, + { url = "https://files.pythonhosted.org/packages/d7/91/500d892b2bf36529a75b77958edfcd5ad8e2ce4064ce2ecfeab2125d72d1/cffi-2.0.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8941aaadaf67246224cee8c3803777eed332a19d909b47e29c9842ef1e79ac26", size = 215574, upload-time = "2025-09-08T23:22:35.443Z" }, + { url = "https://files.pythonhosted.org/packages/44/64/58f6255b62b101093d5df22dcb752596066c7e89dd725e0afaed242a61be/cffi-2.0.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a05d0c237b3349096d3981b727493e22147f934b20f6f125a3eba8f994bec4a9", size = 218971, upload-time = "2025-09-08T23:22:36.805Z" }, + { url = "https://files.pythonhosted.org/packages/ab/49/fa72cebe2fd8a55fbe14956f9970fe8eb1ac59e5df042f603ef7c8ba0adc/cffi-2.0.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:94698a9c5f91f9d138526b48fe26a199609544591f859c870d477351dc7b2414", size = 211972, upload-time = "2025-09-08T23:22:38.436Z" }, + { url = "https://files.pythonhosted.org/packages/0b/28/dd0967a76aab36731b6ebfe64dec4e981aff7e0608f60c2d46b46982607d/cffi-2.0.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5fed36fccc0612a53f1d4d9a816b50a36702c28a2aa880cb8a122b3466638743", size = 217078, upload-time = "2025-09-08T23:22:39.776Z" }, + { url = "https://files.pythonhosted.org/packages/2b/c0/015b25184413d7ab0a410775fdb4a50fca20f5589b5dab1dbbfa3baad8ce/cffi-2.0.0-cp311-cp311-win32.whl", hash = "sha256:c649e3a33450ec82378822b3dad03cc228b8f5963c0c12fc3b1e0ab940f768a5", size = 172076, upload-time = "2025-09-08T23:22:40.95Z" }, + { url = "https://files.pythonhosted.org/packages/ae/8f/dc5531155e7070361eb1b7e4c1a9d896d0cb21c49f807a6c03fd63fc877e/cffi-2.0.0-cp311-cp311-win_amd64.whl", hash = "sha256:66f011380d0e49ed280c789fbd08ff0d40968ee7b665575489afa95c98196ab5", size = 182820, upload-time = "2025-09-08T23:22:42.463Z" }, + { url = "https://files.pythonhosted.org/packages/95/5c/1b493356429f9aecfd56bc171285a4c4ac8697f76e9bbbbb105e537853a1/cffi-2.0.0-cp311-cp311-win_arm64.whl", hash = "sha256:c6638687455baf640e37344fe26d37c404db8b80d037c3d29f58fe8d1c3b194d", size = 177635, upload-time = "2025-09-08T23:22:43.623Z" }, + { 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" }, +] + +[[package]] +name = "chardet" +version = "7.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/b6/9df434a8eeba2e6628c465a1dfa31034228ef79b26f76f46278f4ef7e49d/chardet-7.4.3.tar.gz", hash = "sha256:cc1d4eb92a4ec1c2df3b490836ffa46922e599d34ce0bb75cf41fd2bf6303d56", size = 784800, upload-time = "2026-04-13T21:33:39.803Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6b/1b/7f73766c119a1344eb69e31890ede7c5825ce03d69a9d29292d1bd1cfa1b/chardet-7.4.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:c0c79b13c9908ac7dfe0a74116ebc9a0f28b2319d23c32f3dfcdfbe1279c7eaf", size = 874121, upload-time = "2026-04-13T21:32:47.065Z" }, + { url = "https://files.pythonhosted.org/packages/8b/02/b677c8203d34dad6c2af48287bb1f8c5dff63db2094636fbe634b555b7fb/chardet-7.4.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bba8bea1b28d927b3e99e47deafe53658d34497c0a891d95ff1ba8ff6663f01c", size = 856900, upload-time = "2026-04-13T21:32:48.893Z" }, + { url = "https://files.pythonhosted.org/packages/c4/4b/1361a485a999d97cac4c895e615326f69a639532a52ef365a468bd09bad1/chardet-7.4.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:23163921dccf3103ce59540b0443c106d2c0a0ff2e0503e05196f5e6fdea453f", size = 876634, upload-time = "2026-04-13T21:32:50.238Z" }, + { url = "https://files.pythonhosted.org/packages/87/23/e31c8ad33aa448f0845fd58af5fc22da1626407616d09df4973b2b34f477/chardet-7.4.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cfb54563fe5f130da17c44c6a4e2e8052ba628e5ab4eab7ef8190f736f0f8f72", size = 886497, upload-time = "2026-04-13T21:32:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/18/ef/ea4edec8c87f7e6eda02673acc68fe48725e564fc5a1865782efb53d5598/chardet-7.4.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3990fffcc6a6045f2234ab72752ad037e3b2d48c72037f244d42738db397eb75", size = 881061, upload-time = "2026-04-13T21:32:53.755Z" }, + { url = "https://files.pythonhosted.org/packages/f2/11/fc10600da98541777d720ad9e6bc040c0e0af1adb92e27142e35158957cb/chardet-7.4.3-cp310-cp310-win_amd64.whl", hash = "sha256:c7116b0452994734ccff35e154b44240090eb0f4f74b9106292668133557c175", size = 942533, upload-time = "2026-04-13T21:32:55.134Z" }, + { url = "https://files.pythonhosted.org/packages/19/52/505c207f334d51e937cbaa27ff95776e16e2d120e13cbe491cd7b3a70b50/chardet-7.4.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:25a862cddc6a9ac07023e808aedd297115345fbaabc2690479481ddc0f980e09", size = 870747, upload-time = "2026-04-13T21:32:56.916Z" }, + { url = "https://files.pythonhosted.org/packages/14/4b/d3c79495dee4831b8bebca2790e72cb90f0c5849c940570a7c7e5b70b952/chardet-7.4.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7005c88da26fd95d8abb8acbe6281d833e9a9181b03cf49b4546c4555389bd97", size = 853210, upload-time = "2026-04-13T21:32:58.309Z" }, + { url = "https://files.pythonhosted.org/packages/b9/99/f6a822ad1bde25a4c38dc3e770485e78e0893dfd871cd6e18ed3ea3a795e/chardet-7.4.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dc50f28bad067393cce0af9091052c3b8df7a23115afd8ba7b2e0947f0cef1f8", size = 873625, upload-time = "2026-04-13T21:32:59.606Z" }, + { url = "https://files.pythonhosted.org/packages/b1/10/31932775c94a86814f76b41c4a772b52abfb0e6125324f32c6da1196c297/chardet-7.4.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4c3da294de1a681097848ab58bd3f2771a674f8039d2d87a5538b28856b815e9", size = 883436, upload-time = "2026-04-13T21:33:01.351Z" }, + { url = "https://files.pythonhosted.org/packages/6c/63/0f43e3acf2c436fdb32a0f904aeb03a2904d2126eed34a042a194d235926/chardet-7.4.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:93c45e116dd51b66226a53ade3f9f635e870de5399b90e00ce45dcc311093bf4", size = 876589, upload-time = "2026-04-13T21:33:02.636Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a6/e9b8f8a3e99602792b01fa7d0a731737615ab56d8bfd0b52935a0ef88b85/chardet-7.4.3-cp311-cp311-win_amd64.whl", hash = "sha256:ccc1f83ab4bcfb901cf39e0c4ba6bc6e726fc6264735f10e24ceb5cb47387578", size = 941866, upload-time = "2026-04-13T21:33:04.282Z" }, + { url = "https://files.pythonhosted.org/packages/61/33/29de185079e6675c3f375546e30a559b7ddc75ce972f18d6e566cd9ea4eb/chardet-7.4.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:75d3c65cc16bddf40b8da1fd25ba84fca5f8070f2b14e86083653c1c85aee971", size = 874870, upload-time = "2026-04-13T21:33:05.977Z" }, + { url = "https://files.pythonhosted.org/packages/9c/2f/4c5af01fd1a7506a1d5375403d68925eac70289229492db5aa68b58103d8/chardet-7.4.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:29af5999f654e8729d251f1724a62b538b1262d9292cccaefddf8a02aae1ef6a", size = 854859, upload-time = "2026-04-13T21:33:07.381Z" }, + { url = "https://files.pythonhosted.org/packages/36/21/edb36ad5dfa48d7f8eed97ab43931ecdaa8c15166c21b1d614967e49d681/chardet-7.4.3-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:626f00299ad62dfe937058a09572beed442ccc7b58f87aa667949b20fd3db235", size = 875032, upload-time = "2026-04-13T21:33:08.741Z" }, + { url = "https://files.pythonhosted.org/packages/e5/59/a32a241d861cf180853a11c8e5a67641cb1b2af13c3a5ccce83ec07e2c9f/chardet-7.4.3-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9a4904dd5f071b7a7d7f50b4a67a86db3c902d243bf31708f1d5cde2f68239cb", size = 888283, upload-time = "2026-04-13T21:33:10.213Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/e1ee6a77abf3782c00e05b89c4d4328c8353bf9500661c4348df1dd68614/chardet-7.4.3-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5d2879598bc220689e8ce509fe9c3f37ad2fca53a36be9c9bd91abdd91dd364f", size = 879974, upload-time = "2026-04-13T21:33:11.448Z" }, + { url = "https://files.pythonhosted.org/packages/32/60/fca69c534602a7ced04280c952a246ad1edde2a6ca3a164f65d32ac41fe7/chardet-7.4.3-cp312-cp312-win_amd64.whl", hash = "sha256:4b2799bd58e7245cfa8d4ab2e8ad1d76a5c3a5b1f32318eb6acca4c69a3e7101", size = 943973, upload-time = "2026-04-13T21:33:12.756Z" }, + { url = "https://files.pythonhosted.org/packages/8c/6c/0a40afdb50a0fe041ab95553b835a8160b6cf0e81edf2ae2fe9f5224cbf9/chardet-7.4.3-py3-none-any.whl", hash = "sha256:1173b74051570cf08099d7429d92e4882d375ad4217f92a6e5240ccfb26f231e", size = 626562, upload-time = "2026-04-13T21:33:38.559Z" }, +] + +[[package]] +name = "charset-normalizer" +version = "3.4.8" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/56/10a88e00039537d74bd420f0457c52ab8f58a1af56126e3b9f1b1c8c4724/charset_normalizer-3.4.8.tar.gz", hash = "sha256:d9bf144d6faf12c70d58e47f7512992ae2882b820031d6cef68152deb645bf2d", size = 151790, upload-time = "2026-07-06T15:27:58.477Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/55/f7590fd3a3b9c80b7106876bc868827304462cbf9b40b0f3d664c04c4e67/charset_normalizer-3.4.8-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ad320cccde0bbe430fe3a0e5ef3f17b16ef7cfe496603d7b3a153aa204e093e5", size = 321984, upload-time = "2026-07-06T15:25:42.469Z" }, + { url = "https://files.pythonhosted.org/packages/08/b2/1d6ebdf9dfb4f3be6777bee1589eb6c3784a5fb7389ebc511b5ca649f540/charset_normalizer-3.4.8-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:825e5c2fb57d2065250e12dfeb414d780e7da242b371d5a78814d3ef40d63fde", size = 216216, upload-time = "2026-07-06T15:25:44.047Z" }, + { url = "https://files.pythonhosted.org/packages/91/b3/be7c7a3d28ae7ccbf9c51641337114457f507005474f0caee4b26abe2be4/charset_normalizer-3.4.8-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:98a91c8dce056a858385cf147eb196ae4d2b35315c2bfc8151ff4027707247e1", size = 238408, upload-time = "2026-07-06T15:25:45.19Z" }, + { url = "https://files.pythonhosted.org/packages/e8/cf/f6bfb15e3feeb47a180d0dffdaa81ff119c5380d86733a35c0e5a31de503/charset_normalizer-3.4.8-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f2bd1869ae6cd2793e51bfacebd1495595c1c007c2dfcfd6874b4a804f29bc7c", size = 233221, upload-time = "2026-07-06T15:25:46.608Z" }, + { url = "https://files.pythonhosted.org/packages/39/f8/a9af1b0e78a4d2a3974eac8289d97f83526346571f5ef3edda13bcff262d/charset_normalizer-3.4.8-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:511851c35e4ec8f4be773acd2c0222a7ec6b63971fea8988103632896f174b4b", size = 223559, upload-time = "2026-07-06T15:25:47.896Z" }, + { url = "https://files.pythonhosted.org/packages/b3/d9/5b8d04939351d4b17047fb6a7fcb44460ccce66663759a1a17fad6d5c250/charset_normalizer-3.4.8-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:bae1f52a68a5dcc1fcb65db69895638654be9a45716c47a5a192552a52925662", size = 207714, upload-time = "2026-07-06T15:25:49.034Z" }, + { url = "https://files.pythonhosted.org/packages/1c/a1/5b691a5a3cfbc0696ec7be6a438ace83ead88a57024845593eb25fb1a39c/charset_normalizer-3.4.8-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:f44633a518ef0889dc7e28dde2e18616f8e932e2d17d9c9ccdbbef40aa3a6794", size = 221394, upload-time = "2026-07-06T15:25:50.177Z" }, + { url = "https://files.pythonhosted.org/packages/d3/d2/6d34df842bf58e0ecd0a5c71ded2596f32b506e606856faf7b8d88ba6c91/charset_normalizer-3.4.8-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0d08f2b7171517aa86ddf0eaba25bc7ac8576d401f2da8764403cf0e876f796b", size = 218970, upload-time = "2026-07-06T15:25:51.317Z" }, + { url = "https://files.pythonhosted.org/packages/d3/2d/a13e5faa0de1cc86a001d1e6b5547688c1a0ca4f8858ff8803516d14ac73/charset_normalizer-3.4.8-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:bde2fd87539f4a023ae8d699f51cd3d359ba79a42953fc03afde80bedf52ffc0", size = 209442, upload-time = "2026-07-06T15:25:52.507Z" }, + { url = "https://files.pythonhosted.org/packages/a9/67/8f2bb932f518d444ad75ca17ce6192c4324b95ee8b4c73072387eb2c96e5/charset_normalizer-3.4.8-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:ba191a019f567339cff1cf861e311a5c442477d91f2ece3ad683f7b004976aae", size = 225986, upload-time = "2026-07-06T15:25:53.911Z" }, + { url = "https://files.pythonhosted.org/packages/84/8d/39ecee39ee858b0a07a3cff1f36c72a632b2fb70f46117042adbf675bdc5/charset_normalizer-3.4.8-cp310-cp310-win32.whl", hash = "sha256:dfce5e536054cf15a14576ecb08913e2e9ceff4cc1da2919694cdb2b45b5c64f", size = 150674, upload-time = "2026-07-06T15:25:55.09Z" }, + { url = "https://files.pythonhosted.org/packages/c0/38/bd10fa06f989f65e9b7e4868179e31ffb5e473049bbbf37e22256ad7503f/charset_normalizer-3.4.8-cp310-cp310-win_amd64.whl", hash = "sha256:06238276da3d880d858a4221d6b968bccc18ca3cbe71f6c5c2de86abb7929ffe", size = 162057, upload-time = "2026-07-06T15:25:56.259Z" }, + { url = "https://files.pythonhosted.org/packages/07/2f/16ff1dc626483a27ac40ca1ae350d01891db496eb574a26a9738e16052db/charset_normalizer-3.4.8-cp310-cp310-win_arm64.whl", hash = "sha256:3731936f612754018aeb99fafc4381b6d80ed9165f2dba719c4e1afca0177048", size = 152815, upload-time = "2026-07-06T15:25:57.389Z" }, + { url = "https://files.pythonhosted.org/packages/94/b5/7f10929c45e2d0d0dc78bead98458c271af3e028e66b16441de88829a8b7/charset_normalizer-3.4.8-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ca832d525a2a52542048111cb44e0dea595b9ad53ad542020aa770f308427b92", size = 316812, upload-time = "2026-07-06T15:25:58.71Z" }, + { url = "https://files.pythonhosted.org/packages/2a/b4/8e936a5e19d7e7b19db29aeed0988b481dc745eed3437829780f6ec98ce9/charset_normalizer-3.4.8-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ab07eb7b564635602734c3ef0e8d2db9d59cbbce54f5dc42b8f11aa1f56ce364", size = 213580, upload-time = "2026-07-06T15:26:00.121Z" }, + { url = "https://files.pythonhosted.org/packages/27/b8/dbc3b3c4796e4e29e193c5d7e100bb8ebfa66267994c01ba1eaaa3ebc474/charset_normalizer-3.4.8-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6e88da593ea098194ea08f58924b716a9ae0c39058edad8c5c9b0bafa39fbd56", size = 235244, upload-time = "2026-07-06T15:26:01.402Z" }, + { url = "https://files.pythonhosted.org/packages/93/22/808ff7eb8d344a174b89a388a4540fb86e486f608c16b9a2a023ddf6c9c6/charset_normalizer-3.4.8-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8ca83574f63f71b485da1c50d4e17bcef7375a56b459a861562554f1fbaac1a4", size = 229678, upload-time = "2026-07-06T15:26:02.62Z" }, + { url = "https://files.pythonhosted.org/packages/c2/35/525d3e86af55a66073c02dbf9b6a720c74601489e4b4cb391cad0a4cb620/charset_normalizer-3.4.8-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9840cca6969a7e35498f1ce6fc32b7842500783d303b5ab254679a0f591093c4", size = 221015, upload-time = "2026-07-06T15:26:03.888Z" }, + { url = "https://files.pythonhosted.org/packages/e1/63/10f18541380f2d1c40ffda42835661aa9f88a1333e586d7b0f1d29869113/charset_normalizer-3.4.8-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:ca8776b012d464136c239f51133120db94397bc69f3faee404ff8c99827f8192", size = 205002, upload-time = "2026-07-06T15:26:05.32Z" }, + { url = "https://files.pythonhosted.org/packages/1e/0b/28168f20737bb7d7d40d29cb82d2084cb3a8c19a4e1fef18f07069a24338/charset_normalizer-3.4.8-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:23c40d25fe581d34ff0ef7ff1ca1527f5c51c5c6edf0b8384eeafac4a0438469", size = 217527, upload-time = "2026-07-06T15:26:06.47Z" }, + { url = "https://files.pythonhosted.org/packages/8a/41/bc39417675dcca7151be665ec20f4b1b25ff3486d8eb2f3d7662ebc56082/charset_normalizer-3.4.8-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6809e40a8876eb4742676fbbb57056c0344ef2555e5597d4343f0b365953afdd", size = 216538, upload-time = "2026-07-06T15:26:07.836Z" }, + { url = "https://files.pythonhosted.org/packages/76/7f/e322a4f060a32aa9510d3c76689be7d58c62653b09fe156912471e17a7bc/charset_normalizer-3.4.8-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:1bfd4bf262d6f26805cc6a32dae2554db66ef7533e6c62cc12644d3882be05e5", size = 206170, upload-time = "2026-07-06T15:26:09.269Z" }, + { url = "https://files.pythonhosted.org/packages/5d/64/07d0a02c401433ba18d57f55a96ffe7c701a11eac57c74bae0e1506cfa40/charset_normalizer-3.4.8-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9421549d803f0f712aa6e1496d15ff5ac510fc4c7104e7e299ea1d498d582d59", size = 222807, upload-time = "2026-07-06T15:26:10.476Z" }, + { url = "https://files.pythonhosted.org/packages/e1/84/2d132bdad9cadc3251bbad2813d29642c068855ad0394234f76845672100/charset_normalizer-3.4.8-cp311-cp311-win32.whl", hash = "sha256:9a2748f7588b0c1e5166db3a9448fe86e392479aded89b0c86382d41cade91a2", size = 150195, upload-time = "2026-07-06T15:26:11.654Z" }, + { url = "https://files.pythonhosted.org/packages/8d/5f/c46567479049f46929d8ed9e628990c2419f369c5ea5797add417808d37b/charset_normalizer-3.4.8-cp311-cp311-win_amd64.whl", hash = "sha256:2e9f0db12ea28a3349e514443fc56d4b1fb3c81d0f9c0e33dacfdfc2ac63f774", size = 161151, upload-time = "2026-07-06T15:26:13.111Z" }, + { url = "https://files.pythonhosted.org/packages/d1/ac/39a8bc03f7550f86f8c43205f2c97bc3a4cea775e5a0c0317917679cdef5/charset_normalizer-3.4.8-cp311-cp311-win_arm64.whl", hash = "sha256:4b1f25c6e376033f31463d66f8bb01ae77a128ca11c6677c69ed8e9ce913bbf9", size = 152392, upload-time = "2026-07-06T15:26:14.335Z" }, + { url = "https://files.pythonhosted.org/packages/59/c2/39de60ef5687662f467bed3d1e6944c67a4f0d057141d0404002b8f405ae/charset_normalizer-3.4.8-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:faac37c4904598daa00cb4c9b32f3b4cc814fb5f145d7a531ceb4a70f2114132", size = 319040, upload-time = "2026-07-06T15:26:15.854Z" }, + { url = "https://files.pythonhosted.org/packages/a7/57/a9474c3aeaa337c8a330c0dc5df266527d56da3b189c029529f6b08af2a4/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f191c19a32dc6cec0fb8079789d786254653a9ce906fcab04ccd2eed07bba233", size = 215541, upload-time = "2026-07-06T15:26:17.265Z" }, + { url = "https://files.pythonhosted.org/packages/13/a9/be1ff7e81f6e086dced2a7a7a28b789be351d9796084ccaf6136a4ffafb3/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:05811b76943d477bb90822dedb5c4565cef70148847a59d574e2b35043aeb563", size = 236913, upload-time = "2026-07-06T15:26:18.482Z" }, + { url = "https://files.pythonhosted.org/packages/8f/75/d8c5eae93da26d463f9ebe46a4937ca44434dc2937a565b92437befb3d94/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:3868a3e4ec1e40b419e060d063f93eac6f046fa21426c4816421223ae7dc8ab8", size = 232815, upload-time = "2026-07-06T15:26:19.734Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/98e301ca944bcca5e6bc312406b579c8a6d81546c1b494afb3a9478495d6/charset_normalizer-3.4.8-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:25f93d194eb6264c64416cabff46a91f6d99b97e7525a1b4f35c77a99e75cc68", size = 223995, upload-time = "2026-07-06T15:26:20.931Z" }, + { url = "https://files.pythonhosted.org/packages/fa/df/f5222366b76dcb31453a9bd922610c893540d0e729fd390439b0d3e972ee/charset_normalizer-3.4.8-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:ee6a62492f18d432cca031fabd158f400a8c25bf7b9458f50953393a2a23d97a", size = 208522, upload-time = "2026-07-06T15:26:22.214Z" }, + { url = "https://files.pythonhosted.org/packages/74/52/293220d59d8ddfb8aa56836b33bd6df58e70795d8a102a858c2984480f00/charset_normalizer-3.4.8-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1c16cb4fc35e4b064f5ee78d849f15a550ada1729c3372916672e38f1f01d1d4", size = 219660, upload-time = "2026-07-06T15:26:23.493Z" }, + { url = "https://files.pythonhosted.org/packages/c3/2c/81a298e66f3d01e61bfc6f7064bbb553b067a9f1d979e5962bf00733069b/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2fbd0edb0426ab28e70fac9d1d4ef549eb5a64a2521f0428c441d75e4387e6c2", size = 218230, upload-time = "2026-07-06T15:26:24.629Z" }, + { url = "https://files.pythonhosted.org/packages/0d/45/f1dd2328cbc3340705f82072c09bd4c68d6e079191cde05810c1eac77eee/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:ccb9052771216170015f810b88065fd9e13b1e0b391f92abb9b47e0919a42aad", size = 210006, upload-time = "2026-07-06T15:26:25.837Z" }, + { url = "https://files.pythonhosted.org/packages/38/63/28697000620e117eb413424caaf60b6f98ddb1b09b2c11f7c0038d9936a7/charset_normalizer-3.4.8-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3809ba5d3cd02aca0894597f2669a825bdfe2229061515c128b0f4e5533b4ab5", size = 225771, upload-time = "2026-07-06T15:26:27.079Z" }, + { url = "https://files.pythonhosted.org/packages/12/a7/d5844e315f5f35e7938c415f07a1df144eed1cf993f1b43cc16c980c5b46/charset_normalizer-3.4.8-cp312-cp312-win32.whl", hash = "sha256:de63c31666a049f653ada24e800192e3c019e96bc7d70fb449a000bccf26a36f", size = 150922, upload-time = "2026-07-06T15:26:28.514Z" }, + { url = "https://files.pythonhosted.org/packages/9b/82/eb8b72f184b1e4986dd9daec15d7f6d9285a6728d2b07b7f04656829f473/charset_normalizer-3.4.8-cp312-cp312-win_amd64.whl", hash = "sha256:14a4bbe066f3fb05c6ba70e9cf9d34614b57a2fd70ea8c27cc30f34155e16a58", size = 162294, upload-time = "2026-07-06T15:26:29.745Z" }, + { url = "https://files.pythonhosted.org/packages/09/5a/ab810134aa41034a08ffe94c058102016e6ad9bce62f3cdba547b4723385/charset_normalizer-3.4.8-cp312-cp312-win_arm64.whl", hash = "sha256:2b5b0c0dca0a02c3f816f89abf18af3d20416dedbc3d3aa5f3981045f88ae7b0", size = 152409, upload-time = "2026-07-06T15:26:31.034Z" }, + { url = "https://files.pythonhosted.org/packages/23/52/d5bee5b6ea81882d549b566d2545b044bbcbc33fe5fbe001008a7e745a21/charset_normalizer-3.4.8-py3-none-any.whl", hash = "sha256:b7c1fb310df524e01fbe84d43b7f95aa4f808f8eaa0dafc185f64ba395e37d54", size = 64279, upload-time = "2026-07-06T15:27:57.043Z" }, +] + +[[package]] +name = "cityhash" +version = "0.4.10" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/29/06f572448a407cbcc6565b4568086da70552a74a850ef20c9c73f1cbbf81/cityhash-0.4.10.tar.gz", hash = "sha256:7e35da9aaf5fcf91da3fea23405874db55ffa58b1abc441d39cce0c8704a9c15", size = 274911, upload-time = "2025-10-09T21:57:51.795Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8b/fc/690b4f0b54ce19c451c35e4fd1efa5a6eab268d72f37b6d322e22dede9b5/cityhash-0.4.10-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:75f3d40a634cad68b32323528b57b2f43f5abb6f687fd504de77eaba9c29621c", size = 73721, upload-time = "2025-10-09T21:57:12.031Z" }, + { url = "https://files.pythonhosted.org/packages/99/58/f28ba8ef0041fcddb630228907e42cbe1ae66f716d1b9252c63bbfa113fc/cityhash-0.4.10-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:b9293b4c79874c7c02d9201a9ee28b6b400751ce6517662cf1bc0a8d42c1c150", size = 67690, upload-time = "2025-10-09T21:57:13.195Z" }, + { url = "https://files.pythonhosted.org/packages/17/b9/4a5fdb49b275f3695df4c779342dc80814a3d18ba752de28950ac6fe2ce9/cityhash-0.4.10-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ce38b677f01cea7979cc3c98c4fdc6bec535b32a4005cdc5506c1f9d656ff87c", size = 352181, upload-time = "2025-10-09T21:57:14.111Z" }, + { url = "https://files.pythonhosted.org/packages/b1/b7/659ce64854a2b4b32204840bc71a8e70408deb95068bca49175a71a6f3be/cityhash-0.4.10-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:390b81885de9dd5a2ec247deb7b8f5dcc74ea11c3b50222c914f99c4c6961fcd", size = 559055, upload-time = "2025-10-09T21:57:15.085Z" }, + { url = "https://files.pythonhosted.org/packages/fd/49/20e30aa0a591256ccf61bd5ba4ad5117ab6f44cac3d0aa126586b683011c/cityhash-0.4.10-cp310-cp310-win32.whl", hash = "sha256:8355ab427a364e30cbe73296fe3b169154023258055e53c60dd16daa85211e6d", size = 63098, upload-time = "2025-10-09T21:57:16.029Z" }, + { url = "https://files.pythonhosted.org/packages/8f/0c/7dc604c92648930aa7fce0eb4a5903da0600ff76308bdc2ffcfe6c77275f/cityhash-0.4.10-cp310-cp310-win_amd64.whl", hash = "sha256:a5f1451022550f5b5d87a62aced1bf9218e8cab9af14b9d1980a2e01acf281ee", size = 58115, upload-time = "2025-10-09T21:57:16.77Z" }, + { url = "https://files.pythonhosted.org/packages/bf/50/5406dfafda0e3b0f9e3ae64cf5441c7b884e4f95b148d7d4a60b6568d769/cityhash-0.4.10-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:86ccc9893733dae9868c5d279b9b61518f55034127ca0f1ed51946fe6578a33d", size = 73056, upload-time = "2025-10-09T21:57:17.917Z" }, + { url = "https://files.pythonhosted.org/packages/51/5b/a0bdff0e2d18be6c77c4d98549c9dd5479bc38db224626fa6953cd1bee19/cityhash-0.4.10-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e2eb819ba8fb6f6615ef5b8e9200060a7a66a07f14ef55bd29c0916ada55bad4", size = 67147, upload-time = "2025-10-09T21:57:18.957Z" }, + { url = "https://files.pythonhosted.org/packages/9a/f0/295fa70bc1e18d087d01151489baae1eb679b776e8671ed80f300e1ba8a1/cityhash-0.4.10-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:e8911ff08138dc6f2134c9a1c19c7e1972a2f198b210c19f2123c999c34d37ca", size = 371848, upload-time = "2025-10-09T21:57:19.705Z" }, + { url = "https://files.pythonhosted.org/packages/22/f2/1d1a2134c6ec94f3871c8c41ebbd893dfb8f20596a93addbfd534243fc8f/cityhash-0.4.10-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96043b803797fe8c8c632edb708ed5a22c72b38c1539b33079be1ec45323290e", size = 586426, upload-time = "2025-10-09T21:57:20.667Z" }, + { url = "https://files.pythonhosted.org/packages/9b/fe/81028167c4cfc96b1d1aa807ec542574dfc6bfe0d28b04cd285dd21b4798/cityhash-0.4.10-cp311-cp311-win32.whl", hash = "sha256:61ec6cf9b0d9895eefb57e1b5151f8731a0e7294ed400741b2a2d596dc21f09d", size = 62879, upload-time = "2025-10-09T21:57:21.778Z" }, + { url = "https://files.pythonhosted.org/packages/bc/6b/10a559d1c89f304a8258a1bd93d7b2c4ad512e4b05b6304e37f73fd7f96d/cityhash-0.4.10-cp311-cp311-win_amd64.whl", hash = "sha256:c04e42ecb23b9c0e7ee4cade50ad9908671f594dfa5586d7838beca9b42adc51", size = 58483, upload-time = "2025-10-09T21:57:22.492Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c0/90bc87f5bfe9a9f05e6a14c90421dcc1f03e1c230d14fb41e668979a464c/cityhash-0.4.10-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:65b5739609833155c59152de0496a8edfd964d89cf9fafbd3b18e75b79acd84f", size = 75149, upload-time = "2025-10-09T21:57:23.536Z" }, + { url = "https://files.pythonhosted.org/packages/8e/e7/ad02bf676baeb3f6214647b0041a406a1c23355a004f7aa1d5546f612957/cityhash-0.4.10-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a507f8c0633ae65edacc7f43340c413b99e32f2274420058e1e0f7887108bfea", size = 68495, upload-time = "2025-10-09T21:57:24.623Z" }, + { url = "https://files.pythonhosted.org/packages/f7/66/32faa612b2056ba9c0201a43abdb1c47b342c2233305646a1ad2941e849d/cityhash-0.4.10-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:0d72afa1b5b7b682d40a5e6d41b2837c0a6f32ac81860be52d54bbf7044520d2", size = 380917, upload-time = "2025-10-09T21:57:25.387Z" }, + { url = "https://files.pythonhosted.org/packages/40/d1/283aef1770b212d4079308c854ca859d5e2e56ead875d9f181edeec2c4ea/cityhash-0.4.10-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6aeb6a3f455e73765d0f1844b5a5004ab89f531a99b82533cfdaa0bc9f616544", size = 599390, upload-time = "2025-10-09T21:57:26.254Z" }, + { url = "https://files.pythonhosted.org/packages/88/94/77bab6a5e9727b56353f25c52ec450918dbe3bb0b4613619f2ff8c3d17f3/cityhash-0.4.10-cp312-cp312-win32.whl", hash = "sha256:e4b92bec4001d4fd72e145c56696d751bb011dd122443a1207713eb811d4e0ae", size = 63778, upload-time = "2025-10-09T21:57:27.142Z" }, + { url = "https://files.pythonhosted.org/packages/5b/84/eb797effbf96c02dae5c8962f07a713d348d6807ee6ae379afef0609695d/cityhash-0.4.10-cp312-cp312-win_amd64.whl", hash = "sha256:bc0a0aed8d1c1aa0b21500d42995ed0a6eb1785746529066d2bd5d7abfee91ba", size = 58886, upload-time = "2025-10-09T21:57:27.885Z" }, +] + +[[package]] +name = "click" +version = "8.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/76/d4/81420972a676e8ffea40450d8c8c92943e7218a78fe9b64359836cc9876b/click-8.4.2.tar.gz", hash = "sha256:9a6cea6e60b17ebe0a44c5cc636d94f09bd66142c1cd7d8b4cd731c4917a15f6", size = 338000, upload-time = "2026-06-24T17:45:15.148Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fb/e2/79c688af8b210d232694e31e59da9f6ec747bae31c3f5946e4e9b98860d5/click-8.4.2-py3-none-any.whl", hash = "sha256:e6f9f66136c816745b9d65817da91d61d957fb16e02e4dcd0552553c5a197b76", size = 119243, upload-time = "2026-06-24T17:45:13.73Z" }, +] + +[[package]] +name = "cloudpickle" +version = "3.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/27/fb/576f067976d320f5f0114a8d9fa1215425441bb35627b1993e5afd8111e5/cloudpickle-3.1.2.tar.gz", hash = "sha256:7fda9eb655c9c230dab534f1983763de5835249750e85fbcef43aaa30a9a2414", size = 22330, upload-time = "2025-11-03T09:25:26.604Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/39/799be3f2f0f38cc727ee3b4f1445fe6d5e4133064ec2e4115069418a5bb6/cloudpickle-3.1.2-py3-none-any.whl", hash = "sha256:9acb47f6afd73f60dc1df93bb801b472f05ff42fa6c84167d25cb206be1fbf4a", size = 22228, upload-time = "2025-11-03T09:25:25.534Z" }, +] + +[[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 = "colorful" +version = "0.5.8" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/82/31/109ef4bedeb32b4202e02ddb133162457adc4eb890a9ed9c05c9dd126ed0/colorful-0.5.8.tar.gz", hash = "sha256:bb16502b198be2f1c42ba3c52c703d5f651d826076817185f0294c1a549a7445", size = 209361, upload-time = "2025-10-29T11:53:21.663Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c3/11/25cdf9d5fc21efd30134fc74c43702c6f7ef09ebae8ed927f1283403ad8d/colorful-0.5.8-py2.py3-none-any.whl", hash = "sha256:a9381fdda3337fbaba5771991020abc69676afa102646650b759927892875992", size = 201334, upload-time = "2025-10-29T11:53:20.251Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/54/eb9bfc647b19f2009dd5c7f5ec51c4e6ca831725f1aea7a993034f483147/contourpy-1.3.2.tar.gz", hash = "sha256:b6945942715a034c671b7fc54f9588126b0b8bf23db2696e3ca8328f3ff0ab54", size = 13466130, upload-time = "2025-04-15T17:47:53.79Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/a3/da4153ec8fe25d263aa48c1a4cbde7f49b59af86f0b6f7862788c60da737/contourpy-1.3.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ba38e3f9f330af820c4b27ceb4b9c7feee5fe0493ea53a8720f4792667465934", size = 268551, upload-time = "2025-04-15T17:34:46.581Z" }, + { url = "https://files.pythonhosted.org/packages/2f/6c/330de89ae1087eb622bfca0177d32a7ece50c3ef07b28002de4757d9d875/contourpy-1.3.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:dc41ba0714aa2968d1f8674ec97504a8f7e334f48eeacebcaa6256213acb0989", size = 253399, upload-time = "2025-04-15T17:34:51.427Z" }, + { url = "https://files.pythonhosted.org/packages/c1/bd/20c6726b1b7f81a8bee5271bed5c165f0a8e1f572578a9d27e2ccb763cb2/contourpy-1.3.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9be002b31c558d1ddf1b9b415b162c603405414bacd6932d031c5b5a8b757f0d", size = 312061, upload-time = "2025-04-15T17:34:55.961Z" }, + { url = "https://files.pythonhosted.org/packages/22/fc/a9665c88f8a2473f823cf1ec601de9e5375050f1958cbb356cdf06ef1ab6/contourpy-1.3.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:8d2e74acbcba3bfdb6d9d8384cdc4f9260cae86ed9beee8bd5f54fee49a430b9", size = 351956, upload-time = "2025-04-15T17:35:00.992Z" }, + { url = "https://files.pythonhosted.org/packages/25/eb/9f0a0238f305ad8fb7ef42481020d6e20cf15e46be99a1fcf939546a177e/contourpy-1.3.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:e259bced5549ac64410162adc973c5e2fb77f04df4a439d00b478e57a0e65512", size = 320872, upload-time = "2025-04-15T17:35:06.177Z" }, + { url = "https://files.pythonhosted.org/packages/32/5c/1ee32d1c7956923202f00cf8d2a14a62ed7517bdc0ee1e55301227fc273c/contourpy-1.3.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ad687a04bc802cbe8b9c399c07162a3c35e227e2daccf1668eb1f278cb698631", size = 325027, upload-time = "2025-04-15T17:35:11.244Z" }, + { url = "https://files.pythonhosted.org/packages/83/bf/9baed89785ba743ef329c2b07fd0611d12bfecbedbdd3eeecf929d8d3b52/contourpy-1.3.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cdd22595308f53ef2f891040ab2b93d79192513ffccbd7fe19be7aa773a5e09f", size = 1306641, upload-time = "2025-04-15T17:35:26.701Z" }, + { url = "https://files.pythonhosted.org/packages/d4/cc/74e5e83d1e35de2d28bd97033426b450bc4fd96e092a1f7a63dc7369b55d/contourpy-1.3.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b4f54d6a2defe9f257327b0f243612dd051cc43825587520b1bf74a31e2f6ef2", size = 1374075, upload-time = "2025-04-15T17:35:43.204Z" }, + { url = "https://files.pythonhosted.org/packages/0c/42/17f3b798fd5e033b46a16f8d9fcb39f1aba051307f5ebf441bad1ecf78f8/contourpy-1.3.2-cp310-cp310-win32.whl", hash = "sha256:f939a054192ddc596e031e50bb13b657ce318cf13d264f095ce9db7dc6ae81c0", size = 177534, upload-time = "2025-04-15T17:35:46.554Z" }, + { url = "https://files.pythonhosted.org/packages/54/ec/5162b8582f2c994721018d0c9ece9dc6ff769d298a8ac6b6a652c307e7df/contourpy-1.3.2-cp310-cp310-win_amd64.whl", hash = "sha256:c440093bbc8fc21c637c03bafcbef95ccd963bc6e0514ad887932c18ca2a759a", size = 221188, upload-time = "2025-04-15T17:35:50.064Z" }, + { url = "https://files.pythonhosted.org/packages/b3/b9/ede788a0b56fc5b071639d06c33cb893f68b1178938f3425debebe2dab78/contourpy-1.3.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:6a37a2fb93d4df3fc4c0e363ea4d16f83195fc09c891bc8ce072b9d084853445", size = 269636, upload-time = "2025-04-15T17:35:54.473Z" }, + { url = "https://files.pythonhosted.org/packages/e6/75/3469f011d64b8bbfa04f709bfc23e1dd71be54d05b1b083be9f5b22750d1/contourpy-1.3.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b7cd50c38f500bbcc9b6a46643a40e0913673f869315d8e70de0438817cb7773", size = 254636, upload-time = "2025-04-15T17:35:58.283Z" }, + { url = "https://files.pythonhosted.org/packages/8d/2f/95adb8dae08ce0ebca4fd8e7ad653159565d9739128b2d5977806656fcd2/contourpy-1.3.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:d6658ccc7251a4433eebd89ed2672c2ed96fba367fd25ca9512aa92a4b46c4f1", size = 313053, upload-time = "2025-04-15T17:36:03.235Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a6/8ccf97a50f31adfa36917707fe39c9a0cbc24b3bbb58185577f119736cc9/contourpy-1.3.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:70771a461aaeb335df14deb6c97439973d253ae70660ca085eec25241137ef43", size = 352985, upload-time = "2025-04-15T17:36:08.275Z" }, + { url = "https://files.pythonhosted.org/packages/1d/b6/7925ab9b77386143f39d9c3243fdd101621b4532eb126743201160ffa7e6/contourpy-1.3.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:65a887a6e8c4cd0897507d814b14c54a8c2e2aa4ac9f7686292f9769fcf9a6ab", size = 323750, upload-time = "2025-04-15T17:36:13.29Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f3/20c5d1ef4f4748e52d60771b8560cf00b69d5c6368b5c2e9311bcfa2a08b/contourpy-1.3.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3859783aefa2b8355697f16642695a5b9792e7a46ab86da1118a4a23a51a33d7", size = 326246, upload-time = "2025-04-15T17:36:18.329Z" }, + { url = "https://files.pythonhosted.org/packages/8c/e5/9dae809e7e0b2d9d70c52b3d24cba134dd3dad979eb3e5e71f5df22ed1f5/contourpy-1.3.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:eab0f6db315fa4d70f1d8ab514e527f0366ec021ff853d7ed6a2d33605cf4b83", size = 1308728, upload-time = "2025-04-15T17:36:33.878Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4a/0058ba34aeea35c0b442ae61a4f4d4ca84d6df8f91309bc2d43bb8dd248f/contourpy-1.3.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:d91a3ccc7fea94ca0acab82ceb77f396d50a1f67412efe4c526f5d20264e6ecd", size = 1375762, upload-time = "2025-04-15T17:36:51.295Z" }, + { url = "https://files.pythonhosted.org/packages/09/33/7174bdfc8b7767ef2c08ed81244762d93d5c579336fc0b51ca57b33d1b80/contourpy-1.3.2-cp311-cp311-win32.whl", hash = "sha256:1c48188778d4d2f3d48e4643fb15d8608b1d01e4b4d6b0548d9b336c28fc9b6f", size = 178196, upload-time = "2025-04-15T17:36:55.002Z" }, + { url = "https://files.pythonhosted.org/packages/5e/fe/4029038b4e1c4485cef18e480b0e2cd2d755448bb071eb9977caac80b77b/contourpy-1.3.2-cp311-cp311-win_amd64.whl", hash = "sha256:5ebac872ba09cb8f2131c46b8739a7ff71de28a24c869bcad554477eb089a878", size = 222017, upload-time = "2025-04-15T17:36:58.576Z" }, + { url = "https://files.pythonhosted.org/packages/34/f7/44785876384eff370c251d58fd65f6ad7f39adce4a093c934d4a67a7c6b6/contourpy-1.3.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:4caf2bcd2969402bf77edc4cb6034c7dd7c0803213b3523f111eb7460a51b8d2", size = 271580, upload-time = "2025-04-15T17:37:03.105Z" }, + { url = "https://files.pythonhosted.org/packages/93/3b/0004767622a9826ea3d95f0e9d98cd8729015768075d61f9fea8eeca42a8/contourpy-1.3.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82199cb78276249796419fe36b7386bd8d2cc3f28b3bc19fe2454fe2e26c4c15", size = 255530, upload-time = "2025-04-15T17:37:07.026Z" }, + { url = "https://files.pythonhosted.org/packages/e7/bb/7bd49e1f4fa805772d9fd130e0d375554ebc771ed7172f48dfcd4ca61549/contourpy-1.3.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:106fab697af11456fcba3e352ad50effe493a90f893fca6c2ca5c033820cea92", size = 307688, upload-time = "2025-04-15T17:37:11.481Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e1d5dbbfa170725ef78357a9a0edc996b09ae4af170927ba8ce977e60a5f/contourpy-1.3.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d14f12932a8d620e307f715857107b1d1845cc44fdb5da2bc8e850f5ceba9f87", size = 347331, upload-time = "2025-04-15T17:37:18.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/66/e69e6e904f5ecf6901be3dd16e7e54d41b6ec6ae3405a535286d4418ffb4/contourpy-1.3.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:532fd26e715560721bb0d5fc7610fce279b3699b018600ab999d1be895b09415", size = 318963, upload-time = "2025-04-15T17:37:22.76Z" }, + { url = "https://files.pythonhosted.org/packages/a8/32/b8a1c8965e4f72482ff2d1ac2cd670ce0b542f203c8e1d34e7c3e6925da7/contourpy-1.3.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f26b383144cf2d2c29f01a1e8170f50dacf0eac02d64139dcd709a8ac4eb3cfe", size = 323681, upload-time = "2025-04-15T17:37:33.001Z" }, + { url = "https://files.pythonhosted.org/packages/30/c6/12a7e6811d08757c7162a541ca4c5c6a34c0f4e98ef2b338791093518e40/contourpy-1.3.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c49f73e61f1f774650a55d221803b101d966ca0c5a2d6d5e4320ec3997489441", size = 1308674, upload-time = "2025-04-15T17:37:48.64Z" }, + { url = "https://files.pythonhosted.org/packages/2a/8a/bebe5a3f68b484d3a2b8ffaf84704b3e343ef1addea528132ef148e22b3b/contourpy-1.3.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3d80b2c0300583228ac98d0a927a1ba6a2ba6b8a742463c564f1d419ee5b211e", size = 1380480, upload-time = "2025-04-15T17:38:06.7Z" }, + { url = "https://files.pythonhosted.org/packages/34/db/fcd325f19b5978fb509a7d55e06d99f5f856294c1991097534360b307cf1/contourpy-1.3.2-cp312-cp312-win32.whl", hash = "sha256:90df94c89a91b7362e1142cbee7568f86514412ab8a2c0d0fca72d7e91b62912", size = 178489, upload-time = "2025-04-15T17:38:10.338Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/fadd0b92ffa7b5eb5949bf340a63a4a496a6930a6c37a7ba0f12acb076d6/contourpy-1.3.2-cp312-cp312-win_amd64.whl", hash = "sha256:8c942a01d9163e2e5cfb05cb66110121b8d07ad438a17f9e766317bcb62abf73", size = 223042, upload-time = "2025-04-15T17:38:14.239Z" }, + { url = "https://files.pythonhosted.org/packages/33/05/b26e3c6ecc05f349ee0013f0bb850a761016d89cec528a98193a48c34033/contourpy-1.3.2-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:fd93cc7f3139b6dd7aab2f26a90dde0aa9fc264dbf70f6740d498a70b860b82c", size = 265681, upload-time = "2025-04-15T17:44:59.314Z" }, + { url = "https://files.pythonhosted.org/packages/2b/25/ac07d6ad12affa7d1ffed11b77417d0a6308170f44ff20fa1d5aa6333f03/contourpy-1.3.2-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:107ba8a6a7eec58bb475329e6d3b95deba9440667c4d62b9b6063942b61d7f16", size = 315101, upload-time = "2025-04-15T17:45:04.165Z" }, + { url = "https://files.pythonhosted.org/packages/8f/4d/5bb3192bbe9d3f27e3061a6a8e7733c9120e203cb8515767d30973f71030/contourpy-1.3.2-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:ded1706ed0c1049224531b81128efbd5084598f18d8a2d9efae833edbd2b40ad", size = 220599, upload-time = "2025-04-15T17:45:08.456Z" }, + { url = "https://files.pythonhosted.org/packages/ff/c0/91f1215d0d9f9f343e4773ba6c9b89e8c0cc7a64a6263f21139da639d848/contourpy-1.3.2-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:5f5964cdad279256c084b69c3f412b7801e15356b16efa9d78aa974041903da0", size = 266807, upload-time = "2025-04-15T17:45:15.535Z" }, + { url = "https://files.pythonhosted.org/packages/d4/79/6be7e90c955c0487e7712660d6cead01fa17bff98e0ea275737cc2bc8e71/contourpy-1.3.2-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:49b65a95d642d4efa8f64ba12558fcb83407e58a2dfba9d796d77b63ccfcaff5", size = 318729, upload-time = "2025-04-15T17:45:20.166Z" }, + { url = "https://files.pythonhosted.org/packages/87/68/7f46fb537958e87427d98a4074bcde4b67a70b04900cfc5ce29bc2f556c1/contourpy-1.3.2-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:8c5acb8dddb0752bf252e01a3035b21443158910ac16a3b0d20e7fed7d534ce5", size = 221791, upload-time = "2025-04-15T17:45:24.794Z" }, +] + +[[package]] +name = "contourpy" +version = "1.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/01/1253e6698a07380cd31a736d248a3f2a50a7c88779a1813da27503cadc2a/contourpy-1.3.3.tar.gz", hash = "sha256:083e12155b210502d0bca491432bb04d56dc3432f95a979b429f2848c3dbe880", size = 13466174, upload-time = "2025-07-26T12:03:12.549Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/91/2e/c4390a31919d8a78b90e8ecf87cd4b4c4f05a5b48d05ec17db8e5404c6f4/contourpy-1.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:709a48ef9a690e1343202916450bc48b9e51c049b089c7f79a267b46cffcdaa1", size = 288773, upload-time = "2025-07-26T12:01:02.277Z" }, + { url = "https://files.pythonhosted.org/packages/0d/44/c4b0b6095fef4dc9c420e041799591e3b63e9619e3044f7f4f6c21c0ab24/contourpy-1.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:23416f38bfd74d5d28ab8429cc4d63fa67d5068bd711a85edb1c3fb0c3e2f381", size = 270149, upload-time = "2025-07-26T12:01:04.072Z" }, + { url = "https://files.pythonhosted.org/packages/30/2e/dd4ced42fefac8470661d7cb7e264808425e6c5d56d175291e93890cce09/contourpy-1.3.3-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:929ddf8c4c7f348e4c0a5a3a714b5c8542ffaa8c22954862a46ca1813b667ee7", size = 329222, upload-time = "2025-07-26T12:01:05.688Z" }, + { url = "https://files.pythonhosted.org/packages/f2/74/cc6ec2548e3d276c71389ea4802a774b7aa3558223b7bade3f25787fafc2/contourpy-1.3.3-cp311-cp311-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9e999574eddae35f1312c2b4b717b7885d4edd6cb46700e04f7f02db454e67c1", size = 377234, upload-time = "2025-07-26T12:01:07.054Z" }, + { url = "https://files.pythonhosted.org/packages/03/b3/64ef723029f917410f75c09da54254c5f9ea90ef89b143ccadb09df14c15/contourpy-1.3.3-cp311-cp311-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0bf67e0e3f482cb69779dd3061b534eb35ac9b17f163d851e2a547d56dba0a3a", size = 380555, upload-time = "2025-07-26T12:01:08.801Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4b/6157f24ca425b89fe2eb7e7be642375711ab671135be21e6faa100f7448c/contourpy-1.3.3-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:51e79c1f7470158e838808d4a996fa9bac72c498e93d8ebe5119bc1e6becb0db", size = 355238, upload-time = "2025-07-26T12:01:10.319Z" }, + { url = "https://files.pythonhosted.org/packages/98/56/f914f0dd678480708a04cfd2206e7c382533249bc5001eb9f58aa693e200/contourpy-1.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:598c3aaece21c503615fd59c92a3598b428b2f01bfb4b8ca9c4edeecc2438620", size = 1326218, upload-time = "2025-07-26T12:01:12.659Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d7/4a972334a0c971acd5172389671113ae82aa7527073980c38d5868ff1161/contourpy-1.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:322ab1c99b008dad206d406bb61d014cf0174df491ae9d9d0fac6a6fda4f977f", size = 1392867, upload-time = "2025-07-26T12:01:15.533Z" }, + { url = "https://files.pythonhosted.org/packages/75/3e/f2cc6cd56dc8cff46b1a56232eabc6feea52720083ea71ab15523daab796/contourpy-1.3.3-cp311-cp311-win32.whl", hash = "sha256:fd907ae12cd483cd83e414b12941c632a969171bf90fc937d0c9f268a31cafff", size = 183677, upload-time = "2025-07-26T12:01:17.088Z" }, + { url = "https://files.pythonhosted.org/packages/98/4b/9bd370b004b5c9d8045c6c33cf65bae018b27aca550a3f657cdc99acdbd8/contourpy-1.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:3519428f6be58431c56581f1694ba8e50626f2dd550af225f82fb5f5814d2a42", size = 225234, upload-time = "2025-07-26T12:01:18.256Z" }, + { url = "https://files.pythonhosted.org/packages/d9/b6/71771e02c2e004450c12b1120a5f488cad2e4d5b590b1af8bad060360fe4/contourpy-1.3.3-cp311-cp311-win_arm64.whl", hash = "sha256:15ff10bfada4bf92ec8b31c62bf7c1834c244019b4a33095a68000d7075df470", size = 193123, upload-time = "2025-07-26T12:01:19.848Z" }, + { url = "https://files.pythonhosted.org/packages/be/45/adfee365d9ea3d853550b2e735f9d66366701c65db7855cd07621732ccfc/contourpy-1.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:b08a32ea2f8e42cf1d4be3169a98dd4be32bafe4f22b6c4cb4ba810fa9e5d2cb", size = 293419, upload-time = "2025-07-26T12:01:21.16Z" }, + { url = "https://files.pythonhosted.org/packages/53/3e/405b59cfa13021a56bba395a6b3aca8cec012b45bf177b0eaf7a202cde2c/contourpy-1.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:556dba8fb6f5d8742f2923fe9457dbdd51e1049c4a43fd3986a0b14a1d815fc6", size = 273979, upload-time = "2025-07-26T12:01:22.448Z" }, + { url = "https://files.pythonhosted.org/packages/d4/1c/a12359b9b2ca3a845e8f7f9ac08bdf776114eb931392fcad91743e2ea17b/contourpy-1.3.3-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:92d9abc807cf7d0e047b95ca5d957cf4792fcd04e920ca70d48add15c1a90ea7", size = 332653, upload-time = "2025-07-26T12:01:24.155Z" }, + { url = "https://files.pythonhosted.org/packages/63/12/897aeebfb475b7748ea67b61e045accdfcf0d971f8a588b67108ed7f5512/contourpy-1.3.3-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b2e8faa0ed68cb29af51edd8e24798bb661eac3bd9f65420c1887b6ca89987c8", size = 379536, upload-time = "2025-07-26T12:01:25.91Z" }, + { url = "https://files.pythonhosted.org/packages/43/8a/a8c584b82deb248930ce069e71576fc09bd7174bbd35183b7943fb1064fd/contourpy-1.3.3-cp312-cp312-manylinux_2_26_s390x.manylinux_2_28_s390x.whl", hash = "sha256:626d60935cf668e70a5ce6ff184fd713e9683fb458898e4249b63be9e28286ea", size = 384397, upload-time = "2025-07-26T12:01:27.152Z" }, + { url = "https://files.pythonhosted.org/packages/cc/8f/ec6289987824b29529d0dfda0d74a07cec60e54b9c92f3c9da4c0ac732de/contourpy-1.3.3-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:4d00e655fcef08aba35ec9610536bfe90267d7ab5ba944f7032549c55a146da1", size = 362601, upload-time = "2025-07-26T12:01:28.808Z" }, + { url = "https://files.pythonhosted.org/packages/05/0a/a3fe3be3ee2dceb3e615ebb4df97ae6f3828aa915d3e10549ce016302bd1/contourpy-1.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:451e71b5a7d597379ef572de31eeb909a87246974d960049a9848c3bc6c41bf7", size = 1331288, upload-time = "2025-07-26T12:01:31.198Z" }, + { url = "https://files.pythonhosted.org/packages/33/1d/acad9bd4e97f13f3e2b18a3977fe1b4a37ecf3d38d815333980c6c72e963/contourpy-1.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:459c1f020cd59fcfe6650180678a9993932d80d44ccde1fa1868977438f0b411", size = 1403386, upload-time = "2025-07-26T12:01:33.947Z" }, + { url = "https://files.pythonhosted.org/packages/cf/8f/5847f44a7fddf859704217a99a23a4f6417b10e5ab1256a179264561540e/contourpy-1.3.3-cp312-cp312-win32.whl", hash = "sha256:023b44101dfe49d7d53932be418477dba359649246075c996866106da069af69", size = 185018, upload-time = "2025-07-26T12:01:35.64Z" }, + { url = "https://files.pythonhosted.org/packages/19/e8/6026ed58a64563186a9ee3f29f41261fd1828f527dd93d33b60feca63352/contourpy-1.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:8153b8bfc11e1e4d75bcb0bff1db232f9e10b274e0929de9d608027e0d34ff8b", size = 226567, upload-time = "2025-07-26T12:01:36.804Z" }, + { url = "https://files.pythonhosted.org/packages/d1/e2/f05240d2c39a1ed228d8328a78b6f44cd695f7ef47beb3e684cf93604f86/contourpy-1.3.3-cp312-cp312-win_arm64.whl", hash = "sha256:07ce5ed73ecdc4a03ffe3e1b3e3c1166db35ae7584be76f65dbbe28a7791b0cc", size = 193655, upload-time = "2025-07-26T12:01:37.999Z" }, + { url = "https://files.pythonhosted.org/packages/a5/29/8dcfe16f0107943fa92388c23f6e05cff0ba58058c4c95b00280d4c75a14/contourpy-1.3.3-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:cd5dfcaeb10f7b7f9dc8941717c6c2ade08f587be2226222c12b25f0483ed497", size = 278809, upload-time = "2025-07-26T12:02:52.74Z" }, + { url = "https://files.pythonhosted.org/packages/85/a9/8b37ef4f7dafeb335daee3c8254645ef5725be4d9c6aa70b50ec46ef2f7e/contourpy-1.3.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:0c1fc238306b35f246d61a1d416a627348b5cf0648648a031e14bb8705fcdfe8", size = 261593, upload-time = "2025-07-26T12:02:54.037Z" }, + { url = "https://files.pythonhosted.org/packages/0a/59/ebfb8c677c75605cc27f7122c90313fd2f375ff3c8d19a1694bda74aaa63/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:70f9aad7de812d6541d29d2bbf8feb22ff7e1c299523db288004e3157ff4674e", size = 302202, upload-time = "2025-07-26T12:02:55.947Z" }, + { url = "https://files.pythonhosted.org/packages/3c/37/21972a15834d90bfbfb009b9d004779bd5a07a0ec0234e5ba8f64d5736f4/contourpy-1.3.3-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5ed3657edf08512fc3fe81b510e35c2012fbd3081d2e26160f27ca28affec989", size = 329207, upload-time = "2025-07-26T12:02:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/0c/58/bd257695f39d05594ca4ad60df5bcb7e32247f9951fd09a9b8edb82d1daa/contourpy-1.3.3-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:3d1a3799d62d45c18bafd41c5fa05120b96a28079f2393af559b843d1a966a77", size = 225315, upload-time = "2025-07-26T12:02:58.801Z" }, +] + +[[package]] +name = "cross-web" +version = "0.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/4a/a0/bdb8370215987cc5bde497cb8b976b17ab14841566ecef2aab6ae3e6c7b0/cross_web-0.7.0.tar.gz", hash = "sha256:15fbc8b9a824a055db8127fd6e43e0773074f620fdecb6b2b587d3d0a2bdd459", size = 332407, upload-time = "2026-05-19T14:18:48.849Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/4a/78b52ec2edcbd9b123638f4e0421fd8699ebe653ebf63ac5f82abd2665bc/cross_web-0.7.0-py3-none-any.whl", hash = "sha256:ddea9be3c68b48eaf16561847a5831a559786949c544b3701432e00a4e8d19d9", size = 25207, upload-time = "2026-05-19T14:18:47.614Z" }, +] + +[[package]] +name = "cryptography" +version = "49.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/99/d1c90d6041656cc6ee229dc99cd67fd0cd5aec3c5f7d72fffc27cc750054/cryptography-49.0.0.tar.gz", hash = "sha256:f89660a348f4f78a92366240a61404e337586ef7f5909a2fef59ca88ef505493", size = 854345, upload-time = "2026-06-12T20:02:30.512Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9b/22/adf66990e63584a68dfb50c24f48a125c07b1699899381c8151e63ed458c/cryptography-49.0.0-cp311-abi3-macosx_11_0_arm64.whl", hash = "sha256:966fe0e9c67490071f14c0d2b1cb2dfb3023c5ce39457343931415f08382f2db", size = 4032100, upload-time = "2026-06-12T20:02:32.143Z" }, + { url = "https://files.pythonhosted.org/packages/09/41/3797cfaf69cae04a13ee78ebd83f0678d9c02b4779d21ce24445326f1a69/cryptography-49.0.0-cp311-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:36d1709f992593689b45bda411498d62c6e365f2ca00b84657d4dadd24de16db", size = 4692978, upload-time = "2026-06-12T20:01:21.305Z" }, + { url = "https://files.pythonhosted.org/packages/e6/8b/43011f7ebe515a8aa20d61f290a326cd890c2e738e16e59eaff8d9c3a412/cryptography-49.0.0-cp311-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0e959b578856a3924bc0cbb710fc12c387b9412a951389f3ca61704a9e25f325", size = 4716422, upload-time = "2026-06-12T20:01:48.566Z" }, + { url = "https://files.pythonhosted.org/packages/4a/91/01ce7303a4579e6d3a6abef01bd322848e9ea7a219adcabc5048b9033571/cryptography-49.0.0-cp311-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:53ecee2e23f7169b6117e99fc8a944e5e50f79e69758a83b52a00cb98ab2b2d2", size = 4700503, upload-time = "2026-06-12T20:02:47.091Z" }, + { url = "https://files.pythonhosted.org/packages/62/99/a2c95cf8293f07491e9e27c20cc4dcd18176d944e674679adeb1d0173fd6/cryptography-49.0.0-cp311-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:2eda353d8a27bcbcaa4cbed18994a74ab4d19a2ca897db188ea269ab9b71419b", size = 5309779, upload-time = "2026-06-12T20:02:08.987Z" }, + { url = "https://files.pythonhosted.org/packages/20/2c/0622f20ff02b2ef32558733443805dc82fd4c275be01b2d19d14676f3a1b/cryptography-49.0.0-cp311-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:2afe9051da7ae7bd5905da5a949280c7d2bb75682e188f650a9d0f2756b834c6", size = 4749683, upload-time = "2026-06-12T20:02:03.335Z" }, + { url = "https://files.pythonhosted.org/packages/a3/5b/c5246635d5fd3b64e0d45ae10e99fd32fe9676a79915ccfe5a61ba9af1a5/cryptography-49.0.0-cp311-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:0b82e28ee398a386f0807bba7884d30f25218855690f45115831bcce5d90822c", size = 4337874, upload-time = "2026-06-12T20:02:54.323Z" }, + { url = "https://files.pythonhosted.org/packages/6d/88/05563c7fe2e914e87d1a536d06fe83e66b4e1d95cb593e05aea375531da8/cryptography-49.0.0-cp311-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:ccac2bfebc306b862133e3bb71f3f6ee8bb525240089b2d952e4144b3a6d5da7", size = 4700283, upload-time = "2026-06-12T20:01:34.822Z" }, + { url = "https://files.pythonhosted.org/packages/c4/b6/d7696e4e890d6ae1469935164c9e5215c557671cb78d6e3f458ccceaa632/cryptography-49.0.0-cp311-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:d0527ce944105f257f605a827d6ebead966c752038b6e8656abb9c5edee6fc68", size = 5265844, upload-time = "2026-06-12T20:01:24.09Z" }, + { url = "https://files.pythonhosted.org/packages/a9/3c/f3ad17eecc1a57b0ba236dc01f90e783c51f4a2f35f64777cc4f47a184b2/cryptography-49.0.0-cp311-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:cbc77da8c523d5abd028635ba850a6966fcee2c82e2bf65a41d1d8afe0f98be9", size = 4749290, upload-time = "2026-06-12T20:01:30.848Z" }, + { url = "https://files.pythonhosted.org/packages/4f/01/339573cf1023163a400b0b5d16f6d507de413b9f60be6fd1b77feeaf6737/cryptography-49.0.0-cp311-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:b87e65d263b3e5d3bb92a57e2a6638e2f31110fa7aa890c7b2dbba42248d0a3f", size = 4834612, upload-time = "2026-06-12T20:01:29.246Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/577302e213a1be9468f92d1afef66fcf1ef83d516819d9992ca547f592bd/cryptography-49.0.0-cp311-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:66ec79c3904820572d7e987abdf304281f141d37ad9a489b8e97066e7b9b6459", size = 4980804, upload-time = "2026-06-12T20:01:42.853Z" }, + { url = "https://files.pythonhosted.org/packages/1f/09/f42b1d190c5ba75f72062a387f8030d1d75f6ab035788f1d9c4b01de6525/cryptography-49.0.0-cp311-abi3-win_amd64.whl", hash = "sha256:e5dfc1e64de5677cec922ffa8da89c546d0415bf6efdf081842e5d44c84e1f0e", size = 3810026, upload-time = "2026-06-12T20:02:39.262Z" }, + { url = "https://files.pythonhosted.org/packages/19/2a/5bb823f5bedcf80718cea7fbc95ec5515cca3769633c4b01a32be7f30e7c/cryptography-49.0.0-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:ec5e529fb80935c94fe7b729f9972b50e351a0e6b50aa294fd5cabb109fcc29a", size = 4025947, upload-time = "2026-06-12T20:01:25.745Z" }, + { url = "https://files.pythonhosted.org/packages/3d/df/40577043ca124e17012f408ddddaeb213b856336ac82ddb3bc915f39e29f/cryptography-49.0.0-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f78ff2c9ed8dc2d036b0f4d640e22522213d047c1b14e61205a7e55c80a494d4", size = 4692429, upload-time = "2026-06-12T20:01:53.628Z" }, + { url = "https://files.pythonhosted.org/packages/2c/99/2d13299eb3dd27b02dcfaafcc91d6b5cb3329f7cbd6d8f51921acd566c1a/cryptography-49.0.0-cp39-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:35b151772baff2c74cba7fa290ceaff4c3b11c0c881eb93eb5dbc05a7cfbba18", size = 4700968, upload-time = "2026-06-12T20:02:45.383Z" }, + { url = "https://files.pythonhosted.org/packages/a5/4d/9c0cd02f95e2602dd5e563da149ee0830abef3537be8b34dc56281ebe27a/cryptography-49.0.0-cp39-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:0f21641cf4b30fca7aee061ced0ec7ad7b073518088b7c9969a297c0ae796c69", size = 4697758, upload-time = "2026-06-12T20:01:41.13Z" }, + { url = "https://files.pythonhosted.org/packages/24/01/186c825898477d77e2324d5360fefe622ff1d8d1963ec0554e2cada8ec77/cryptography-49.0.0-cp39-abi3-manylinux_2_28_ppc64le.whl", hash = "sha256:9e82dcc8e56052715fb18b2429e3bca4823b1629136a2084fc45a9a5cecb9b64", size = 5298863, upload-time = "2026-06-12T20:02:24.579Z" }, + { url = "https://files.pythonhosted.org/packages/b8/7b/62cbbab75d0659865bf0273790031544a0b16c8072d258f9428dcd8190dc/cryptography-49.0.0-cp39-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:6f2debedf9ca60cf1d5bd466475638af5130f89965605cd818484d19987d3a21", size = 4735983, upload-time = "2026-06-12T20:01:50.14Z" }, + { url = "https://files.pythonhosted.org/packages/6c/72/3e798c064bc39e471008075d0f9bc9daf77a80879c092e4a8e170c585ed4/cryptography-49.0.0-cp39-abi3-manylinux_2_31_armv7l.whl", hash = "sha256:8c25ceb16df5b9435f3f6a9829204985b0e0cbee3b48aacd432c7d2c850b44d9", size = 4334173, upload-time = "2026-06-12T20:01:44.743Z" }, + { url = "https://files.pythonhosted.org/packages/f0/ee/6fca21d1ac73e06f8bef71940abfd4d2f6472b4bca284d770f32bd4086f6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:28d8b15e6275f12c8a207dc309dfa957903c927d08d0cc937ee3f63f200693cc", size = 4697298, upload-time = "2026-06-12T20:02:20.918Z" }, + { url = "https://files.pythonhosted.org/packages/67/d0/a5fcd3515f0bae49a7b6d0413cc1bdccdcc1fc0047037a0d480642cdc5d6/cryptography-49.0.0-cp39-abi3-manylinux_2_34_ppc64le.whl", hash = "sha256:6fc361c34fb6aac015ce19435876635e5c6d21db31998b0920f675f131e043b8", size = 5254338, upload-time = "2026-06-12T20:02:22.737Z" }, + { url = "https://files.pythonhosted.org/packages/a0/84/84fe36f19caf857d61cb7fc9c63035a47ffabd84ea12d1d393148efa3615/cryptography-49.0.0-cp39-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:2400ef9c9e2299a25614eb1dea3db54a69b1349efd043bfac9c67630d136df36", size = 4735650, upload-time = "2026-06-12T20:02:41.389Z" }, + { url = "https://files.pythonhosted.org/packages/6c/a0/db537264e234f7273a73ec020873d6d6b39dfd8a53db78b550ca8320440e/cryptography-49.0.0-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:67e1d20ad9ef3a563c59ef22e7a8a0b8210bd26604369ea4a30a7c66aefe504e", size = 4834820, upload-time = "2026-06-12T20:01:51.847Z" }, + { url = "https://files.pythonhosted.org/packages/93/77/8df9eb486495979bccecd1062e2eaf435250e84437040295b57d09048b0b/cryptography-49.0.0-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:42b0684e0e40cf26122427802486f6d93aea593612603a94fbf260c7eb1e9c1b", size = 4967968, upload-time = "2026-06-12T20:02:12.524Z" }, + { url = "https://files.pythonhosted.org/packages/c2/e6/f60198ea8d9dfa15fff9ed4ca02ce362f6eadd9ba757dcc50634c4257b63/cryptography-49.0.0-cp39-abi3-win_amd64.whl", hash = "sha256:026ac7423e6fa66872d3bf889be5974507da3944f866f704fa200eadacd00001", size = 3785547, upload-time = "2026-06-12T20:02:26.847Z" }, + { url = "https://files.pythonhosted.org/packages/63/d3/4a83af35d65e3fad632c926fad684c193ea4398569ccb0bbbc7fe8f5dc9a/cryptography-49.0.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:fc1e275c2f1d97b1a6450b8b0ea3ebfa6e087a611c2b26cb2404d48588abab7b", size = 3993685, upload-time = "2026-06-12T20:02:14.883Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a7/f9dac0ab7f80368c56993a7bf638ef9935f825c91902798481fac0898138/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_aarch64.whl", hash = "sha256:c83782480a4a9da4d0feb51950131ba32e12e70813848b3343f6e18c28a66838", size = 4676239, upload-time = "2026-06-12T20:02:28.793Z" }, + { url = "https://files.pythonhosted.org/packages/d7/70/2ba3769dd0ae167e2f33dfa9592d45db6ff9a61d62ca1a5b3d1bdd09068f/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_28_x86_64.whl", hash = "sha256:b39efa323140595abd3ecca8529d321ae50f55f3aa3ba9cc81ea56a6011953d5", size = 4715584, upload-time = "2026-06-12T20:01:27.495Z" }, + { url = "https://files.pythonhosted.org/packages/94/64/2923570ac1c0bd3a737aa366ac3abbbbde273042308b8cde95e2364a6e6a/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_aarch64.whl", hash = "sha256:b47db11c2c3525083296069b98ac5221907455e989ae0c2e3008bde851921615", size = 4675885, upload-time = "2026-06-12T20:01:55.49Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f8/614dc7e051418cfe53d55173c1e24c6b0085e89996fe90508c2fdf769aef/cryptography-49.0.0-pp311-pypy311_pp73-manylinux_2_34_x86_64.whl", hash = "sha256:084ef1af862eb07ec46d25f68689f2102a9fc0e05ce7b80f14f5fe51e4eef0f6", size = 4715449, upload-time = "2026-06-12T20:02:05.469Z" }, + { url = "https://files.pythonhosted.org/packages/aa/50/a9caea39ad19c431c1a3f8a31114df65b260cdfe67786b6c7e7c040c4c44/cryptography-49.0.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:be9fcb48a55f023493482827d4f459bd263cc20efde64f204b97c123201850c6", size = 3783731, upload-time = "2026-06-12T20:02:43.319Z" }, +] + +[[package]] +name = "cssselect" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/2e/cdfd8b01c37cbf4f9482eefd455853a3cf9c995029a46acd31dfaa9c1dd6/cssselect-1.4.0.tar.gz", hash = "sha256:fdaf0a1425e17dfe8c5cf66191d211b357cf7872ae8afc4c6762ddd8ac47fc92", size = 40589, upload-time = "2026-01-29T07:00:26.701Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/0c/7bb51e3acfafd16c48875bf3db03607674df16f5b6ef8d056586af7e2b8b/cssselect-1.4.0-py3-none-any.whl", hash = "sha256:c0ec5c0191c8ee39fcc8afc1540331d8b55b0183478c50e9c8a79d44dbceb1d8", size = 18540, upload-time = "2026-01-29T07:00:24.994Z" }, +] + +[[package]] +name = "cssutils" +version = "2.15.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "encutils" }, + { name = "more-itertools" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/00/7e89107ea389e952eea73b1b90ac6633e15a519c4a518ee90bb93a2f83dc/cssutils-2.15.0.tar.gz", hash = "sha256:e9739237f3915037dacba787c4b58f280e3ec5d9864953e185bf23d40ff7d021", size = 716080, upload-time = "2026-04-27T20:40:35.615Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/bf/5669e08a6f53e0d4b4648a989e77163ad36d4718195319c8c5af08ded654/cssutils-2.15.0-py3-none-any.whl", hash = "sha256:207faa466810a1aef109261673f2458356d0839ddedaebc0ee553376290fb6a9", size = 180638, upload-time = "2026-04-27T20:40:34.178Z" }, +] + +[[package]] +name = "cv-pipeliner" +version = "0.22.0" +source = { git = "https://github.com/epoch8/cv-pipeliner?tag=0.22.0#8f11269f52c303b370c8f0ac64ee11eadbb5b194" } +dependencies = [ + { name = "dataframe-image" }, + { name = "filterpy" }, + { name = "fsspec" }, + { name = "imageio" }, + { name = "imutils" }, + { name = "joblib" }, + { name = "lxml" }, + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pathy" }, + { name = "pillow" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "tqdm" }, +] + +[[package]] +name = "cycler" +version = "0.12.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/a9/95/a3dbbb5028f35eafb79008e7522a75244477d2838f38cbb722248dabc2a8/cycler-0.12.1.tar.gz", hash = "sha256:88bb128f02ba341da8ef447245a9e138fae777f6a23943da4540077d3601eb1c", size = 7615, upload-time = "2023-10-07T05:32:18.335Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/05/c19819d5e3d95294a6f5947fb9b9629efb316b96de511b418c53d245aae6/cycler-0.12.1-py3-none-any.whl", hash = "sha256:85cef7cff222d8644161529808465972e51340599459b8ac3ccbac5a854e0d30", size = 8321, upload-time = "2023-10-07T05:32:16.783Z" }, +] + +[[package]] +name = "dacite" +version = "1.9.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/55/a0/7ca79796e799a3e782045d29bf052b5cde7439a2bbb17f15ff44f7aacc63/dacite-1.9.2.tar.gz", hash = "sha256:6ccc3b299727c7aa17582f0021f6ae14d5de47c7227932c47fec4cdfefd26f09", size = 22420, upload-time = "2025-02-05T09:27:29.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/35/386550fd60316d1e37eccdda609b074113298f23cef5bddb2049823fe666/dacite-1.9.2-py3-none-any.whl", hash = "sha256:053f7c3f5128ca2e9aceb66892b1a3c8936d02c686e707bee96e19deef4bc4a0", size = 16600, upload-time = "2025-02-05T09:27:24.345Z" }, +] + +[[package]] +name = "dataframe-image" +version = "0.2.7" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "beautifulsoup4" }, + { name = "cssselect" }, + { name = "cssutils" }, + { name = "lxml" }, + { name = "mistune" }, + { name = "nbconvert" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "playwright" }, + { name = "requests" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/69/9f2a3d022752e236c8aac259b7a7ce0544a9de2ef28828cba10cc66a8e05/dataframe_image-0.2.7-py3-none-any.whl", hash = "sha256:168755c7c570468d108cec5442f135be1b62f5a94bc09e0f3d86fb182054a8d6", size = 6663053, upload-time = "2025-01-30T07:19:41.902Z" }, +] + +[[package]] +name = "datapipe-app" +version = "0.6.0" +source = { editable = "../../libs/datapipe-app" } +dependencies = [ + { name = "click" }, + { name = "cv-pipeliner" }, + { name = "datapipe-core" }, + { name = "fastapi" }, + { name = "httpx" }, + { name = "opentelemetry-instrumentation-fastapi" }, + { name = "pydantic-settings" }, + { name = "rich" }, + { name = "starlette-exporter" }, + { name = "uvicorn", extra = ["standard"] }, +] + +[package.metadata] +requires-dist = [ + { name = "click", specifier = ">=7.1.2" }, + { name = "cv-pipeliner", git = "https://github.com/epoch8/cv-pipeliner?tag=0.22.0" }, + { name = "datapipe-core", editable = "../../libs/datapipe-core" }, + { name = "fastapi", specifier = ">=0.69.0" }, + { name = "httpx" }, + { name = "opentelemetry-exporter-gcp-trace", marker = "extra == 'gcp'", specifier = ">=1.3.0,<2" }, + { name = "opentelemetry-exporter-jaeger", marker = "extra == 'jaeger'", specifier = ">=1.8.0,<2" }, + { name = "opentelemetry-instrumentation-fastapi", specifier = ">=0.35b0" }, + { name = "pydantic-settings", specifier = ">=2.0.0" }, + { name = "rich", specifier = ">=13.3.2" }, + { name = "starlette-exporter" }, + { name = "uvicorn", extras = ["standard"], specifier = ">=0.17.0" }, +] +provides-extras = ["gcp", "jaeger"] + +[package.metadata.requires-dev] +dev = [ + { name = "alembic" }, + { name = "black" }, + { name = "flake8" }, + { name = "httpx" }, + { name = "mypy" }, + { name = "pytest", specifier = "<8" }, + { name = "sqlalchemy", extras = ["mypy"] }, +] + +[[package]] +name = "datapipe-core" +version = "0.15.0a5" +source = { editable = "../../libs/datapipe-core" } +dependencies = [ + { name = "cityhash" }, + { name = "click" }, + { name = "cloudpickle" }, + { name = "fsspec" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation-sqlalchemy" }, + { name = "opentelemetry-sdk" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "psycopg2-binary" }, + { name = "pyyaml" }, + { name = "rich" }, + { name = "sqlalchemy" }, + { name = "tqdm-loggable" }, + { name = "traceback-with-variables" }, +] + +[package.optional-dependencies] +gcsfs = [ + { name = "gcsfs" }, +] +ray = [ + { name = "ray", extra = ["default"] }, +] +s3fs = [ + { name = "s3fs" }, +] + +[package.metadata] +requires-dist = [ + { name = "cityhash", specifier = ">=0.4.2,<0.5" }, + { name = "click", specifier = ">=7.1.2" }, + { name = "cloudpickle", specifier = ">=1.6.0" }, + { name = "elasticsearch", marker = "extra == 'elastic'", specifier = ">=8.17.1" }, + { name = "fsspec", specifier = ">=2021.11.1" }, + { name = "gcsfs", marker = "extra == 'gcsfs'", specifier = ">=2021.11.1" }, + { name = "neo4j", marker = "extra == 'neo4j'" }, + { name = "numpy", specifier = ">=1.21.0,<3.0" }, + { name = "openpyxl", marker = "extra == 'excel'", specifier = ">=3.0.7" }, + { name = "opentelemetry-api", specifier = ">=1.8.0,<2" }, + { name = "opentelemetry-exporter-gcp-trace", marker = "extra == 'gcp'" }, + { name = "opentelemetry-instrumentation-sqlalchemy" }, + { name = "opentelemetry-sdk", specifier = ">=1.8.0,<2" }, + { name = "pandas", specifier = ">=1.2.0" }, + { name = "pillow", specifier = ">=12.2.0,<13" }, + { name = "psycopg2-binary", specifier = ">=2.8.4" }, + { name = "pyarrow", marker = "extra == 'pyarrow'", specifier = ">=21.0.0" }, + { name = "pymilvus", marker = "extra == 'milvus'", specifier = ">=2.0.2,<3" }, + { name = "pysqlite3-binary", marker = "sys_platform != 'darwin' and extra == 'sqlite'", specifier = ">=0.5.0,<0.6" }, + { name = "pyyaml", specifier = ">=5.3.1" }, + { name = "qdrant-client", marker = "extra == 'qdrant'", specifier = ">=1.1.7,<2" }, + { name = "ray", extras = ["default"], marker = "extra == 'ray'", specifier = ">=2.5.0,<3" }, + { name = "redis", marker = "extra == 'redis'", specifier = ">=4.3.4,<5" }, + { name = "rich", specifier = ">=13.3.2" }, + { name = "s3fs", marker = "extra == 's3fs'", specifier = ">=2021.11.1" }, + { name = "sqlalchemy", specifier = ">=1.4.0,<3.0.0" }, + { name = "sqlalchemy-pysqlite3-binary", marker = "sys_platform != 'darwin' and extra == 'sqlite'", specifier = ">=0.0.4,<0.0.5" }, + { name = "tqdm-loggable", specifier = ">=0.4.1,<0.5" }, + { name = "traceback-with-variables", specifier = ">=2.0.4,<3" }, + { name = "xlrd", marker = "extra == 'excel'", specifier = ">=2.0.1" }, +] +provides-extras = ["sqlite", "excel", "milvus", "gcsfs", "s3fs", "redis", "qdrant", "ray", "gcp", "elastic", "neo4j", "pyarrow"] + +[package.metadata.requires-dev] +dev = [ + { name = "black" }, + { name = "flake8" }, + { name = "mypy" }, + { name = "pandas-stubs" }, + { name = "pytest", specifier = "==7.*" }, + { name = "pytest-cases" }, + { name = "ruff", specifier = ">=0.12.5" }, + { name = "types-pillow" }, + { name = "types-pyyaml" }, + { name = "types-redis" }, + { name = "types-setuptools" }, + { name = "types-tqdm" }, + { name = "types-tqdm", specifier = ">=4.67.0.20241221" }, +] + +[[package]] +name = "datapipe-detection-tags-example" +version = "0" +source = { virtual = "." } +dependencies = [ + { name = "datapipe-app" }, + { name = "datapipe-ml", extra = ["fiftyone", "torch"] }, + { name = "stringzilla" }, + { name = "torch" }, + { name = "torchvision" }, +] + +[package.optional-dependencies] +old-cpu = [ + { name = "pi-heif" }, + { name = "polars-lts-cpu" }, +] + +[package.dev-dependencies] +dev = [ + { name = "boto3" }, + { name = "pytest" }, + { name = "requests" }, + { name = "tqdm" }, +] + +[package.metadata] +requires-dist = [ + { name = "datapipe-app", editable = "../../libs/datapipe-app" }, + { name = "datapipe-ml", extras = ["torch", "fiftyone"], editable = "../../libs/datapipe-ml" }, + { name = "pi-heif", marker = "extra == 'old-cpu'" }, + { name = "polars-lts-cpu", marker = "extra == 'old-cpu'", specifier = "==1.33.1" }, + { name = "stringzilla", specifier = "==4.4.0" }, + { name = "torch", specifier = "==2.6.0", index = "https://download.pytorch.org/whl/cu124" }, + { name = "torchvision", specifier = "==0.21.0", index = "https://download.pytorch.org/whl/cu124" }, +] +provides-extras = ["old-cpu"] + +[package.metadata.requires-dev] +dev = [ + { name = "boto3" }, + { name = "pytest", specifier = "<8" }, + { name = "requests" }, + { name = "tqdm" }, +] + +[[package]] +name = "datapipe-ml" +version = "0.4.0" +source = { editable = "../../libs/datapipe-ml" } +dependencies = [ + { name = "albumentations" }, + { name = "cv-pipeliner" }, + { name = "datapipe-core", extra = ["gcsfs", "ray", "s3fs"] }, + { name = "dill" }, + { name = "imageio" }, + { name = "ipython" }, + { name = "joblib" }, + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "natsort" }, + { name = "opencv-python" }, + { name = "opencv-python-headless" }, + { name = "pathy" }, + { name = "psutil" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "seaborn" }, + { name = "thop" }, + { name = "tqdm" }, +] + +[package.optional-dependencies] +fiftyone = [ + { name = "fiftyone" }, +] +torch = [ + { name = "huggingface-hub" }, + { name = "requests-toolbelt" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "ultralytics" }, + { name = "yolov5" }, +] + +[package.metadata] +requires-dist = [ + { name = "albumentations", specifier = ">=2.0.0,<3" }, + { name = "asyncssh", marker = "extra == 'sky-vast'" }, + { name = "cv-pipeliner", git = "https://github.com/epoch8/cv-pipeliner?tag=0.22.0" }, + { name = "datapipe-app", marker = "extra == 'observability'", editable = "../../libs/datapipe-app" }, + { name = "datapipe-core", extras = ["gcsfs", "s3fs", "ray"], editable = "../../libs/datapipe-core" }, + { name = "dill", specifier = ">=0.3.7" }, + { name = "fiftyone", marker = "extra == 'fiftyone'" }, + { name = "huggingface-hub", marker = "extra == 'torch'" }, + { name = "image-classifiers", marker = "extra == 'tensorflow'", git = "https://github.com/qubvel/classification_models?rev=a0f006e05485a34ccf871c421279864b0ccd220b" }, + { name = "imageio", specifier = ">=2.31.3,<3" }, + { name = "ipython", specifier = ">=7.0.0,<9" }, + { name = "joblib", specifier = ">=1.3.2,<2" }, + { name = "matplotlib", specifier = ">=3.8" }, + { name = "natsort", specifier = ">=8.4.0" }, + { name = "opencv-python", specifier = ">=4.8.0.76" }, + { name = "opencv-python-headless", specifier = ">=4.8.0.76" }, + { name = "pathy", specifier = ">=0.11.0" }, + { name = "psutil" }, + { name = "pysqlite3-binary", marker = "sys_platform != 'darwin' and extra == 'sqlite'", specifier = ">=0.5.0,<0.6" }, + { name = "requests-toolbelt", marker = "extra == 'torch'", specifier = ">=1.0.0" }, + { name = "s3fs", marker = "extra == 'sky-vast'" }, + { name = "scipy", specifier = ">=1.4.1" }, + { name = "seaborn", specifier = ">=0.13.0" }, + { name = "skypilot", extras = ["vast"], marker = "extra == 'sky-vast'", specifier = "==0.12.3.post1" }, + { name = "sqlalchemy-pysqlite3-binary", marker = "sys_platform != 'darwin' and extra == 'sqlite'", specifier = ">=0.0.4,<0.0.5" }, + { name = "sshfs", marker = "extra == 'sky-vast'" }, + { name = "tensorflow", marker = "extra == 'tensorflow'", specifier = ">=2.13.0,<2.22.0" }, + { name = "thop", specifier = ">=0.1.1" }, + { name = "torch", marker = "extra == 'torch'", specifier = ">=1.12.0" }, + { name = "torchvision", marker = "extra == 'torch'", specifier = ">=0.12.0" }, + { name = "tqdm", specifier = ">=4.64.0" }, + { name = "ultralytics", marker = "extra == 'torch'", specifier = ">=8.4.66,<9.0.0" }, + { name = "vastai-sdk", marker = "extra == 'sky-vast'", specifier = ">=0.1.20,<0.2" }, + { name = "yolov5", marker = "extra == 'torch'", git = "https://github.com/epoch8/yolov5?rev=943ad3c43a981ff81b05c779d2e051641b714f4a" }, +] +provides-extras = ["sqlite", "tensorflow", "torch", "fiftyone", "sky-vast", "observability"] + +[package.metadata.requires-dev] +dev = [ + { name = "autoflake" }, + { name = "black" }, + { name = "datapipe-app", editable = "../../libs/datapipe-app" }, + { name = "flake8" }, + { name = "isort" }, + { name = "mypy" }, + { name = "pandas-stubs" }, + { name = "pytest" }, + { name = "pytest-cases" }, + { name = "ruff" }, + { name = "types-pillow" }, + { name = "types-pyyaml" }, + { name = "types-redis" }, + { name = "types-setuptools" }, + { name = "types-tqdm" }, +] + +[[package]] +name = "decorator" +version = "5.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/60/8b/32f9823da46cde7df2087faa08cd98d01b908f8dcab982cdba9c84e85355/decorator-5.3.1.tar.gz", hash = "sha256:4cbcdd55a6efadb9dbea26b858f4fb3264567b52d69ca0d25b721b553f60ea82", size = 58084, upload-time = "2026-05-18T06:03:28.057Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/05/7f/798705f5296a58ca505d600456748d1be48078eac8a7050d8a98bc9edb89/decorator-5.3.1-py3-none-any.whl", hash = "sha256:f47fe6fdbd2edd623ecfe36875d37aba411624e2670dd395dddae1358689bb3c", size = 10365, upload-time = "2026-05-18T06:03:26.517Z" }, +] + +[[package]] +name = "defusedxml" +version = "0.7.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0f/d5/c66da9b79e5bdb124974bfe172b4daf3c984ebd9c2a06e2b8a4dc7331c72/defusedxml-0.7.1.tar.gz", hash = "sha256:1bb3032db185915b62d7c6209c5a8792be6a32ab2fedacc84e01b52c51aa3e69", size = 75520, upload-time = "2021-03-08T10:59:26.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/07/6c/aa3f2f849e01cb6a001cd8554a88d4c77c5c1a31c95bdf1cf9301e6d9ef4/defusedxml-0.7.1-py2.py3-none-any.whl", hash = "sha256:a352e7e428770286cc899e2542b6cdaedb2b4953ff269a210103ec58f6198a61", size = 25604, upload-time = "2021-03-08T10:59:24.45Z" }, +] + +[[package]] +name = "deprecated" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/85/12f0a49a7c4ffb70572b6c2ef13c90c88fd190debda93b23f026b25f9634/deprecated-1.3.1.tar.gz", hash = "sha256:b1b50e0ff0c1fddaa5708a2c6b0a6588bb09b892825ab2b214ac9ea9d92a5223", size = 2932523, upload-time = "2025-10-30T08:19:02.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/d0/205d54408c08b13550c733c4b85429e7ead111c7f0014309637425520a9a/deprecated-1.3.1-py2.py3-none-any.whl", hash = "sha256:597bfef186b6f60181535a29fbe44865ce137a5079f295b479886c82729d5f3f", size = 11298, upload-time = "2025-10-30T08:19:00.758Z" }, +] + +[[package]] +name = "dill" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/e1/56027a71e31b02ddc53c7d65b01e68edf64dea2932122fe7746a516f75d5/dill-0.4.1.tar.gz", hash = "sha256:423092df4182177d4d8ba8290c8a5b640c66ab35ec7da59ccfa00f6fa3eea5fa", size = 187315, upload-time = "2026-01-19T02:36:56.85Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/77/dc8c558f7593132cf8fefec57c4f60c83b16941c574ac5f619abb3ae7933/dill-0.4.1-py3-none-any.whl", hash = "sha256:1e1ce33e978ae97fcfcff5638477032b801c46c7c65cf717f95fbc2248f79a9d", size = 120019, upload-time = "2026-01-19T02:36:55.663Z" }, +] + +[[package]] +name = "distlib" +version = "0.4.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/02/bd72be9134d25ed783ecbbc38a539ffaefbf90c78418c7fb7229600dbac7/distlib-0.4.3.tar.gz", hash = "sha256:f152097224a0ae24be5a0f6bae1b9359af82133bce63f98a95f86cae1aede9ed", size = 615141, upload-time = "2026-06-12T08:04:52.847Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/08/9c41fb51ab5b43eb21674aff13df270e8ba6c4b29c8624e328dc7a9482af/distlib-0.4.3-py2.py3-none-any.whl", hash = "sha256:4b0ce306c966eb73bc3a7b6abad017c556dadd92c44701562cd528ac7fde4d5b", size = 470628, upload-time = "2026-06-12T08:04:50.506Z" }, +] + +[[package]] +name = "dnspython" +version = "2.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/8c/8b/57666417c0f90f08bcafa776861060426765fdb422eb10212086fb811d26/dnspython-2.8.0.tar.gz", hash = "sha256:181d3c6996452cb1189c4046c61599b84a5a86e099562ffde77d26984ff26d0f", size = 368251, upload-time = "2025-09-07T18:58:00.022Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/5a/18ad964b0086c6e62e2e7500f7edc89e3faa45033c71c1893d34eed2b2de/dnspython-2.8.0-py3-none-any.whl", hash = "sha256:01d9bbc4a2d76bf0db7c1f729812ded6d912bd318d3b1cf81d30c0f845dbf3af", size = 331094, upload-time = "2025-09-07T18:57:58.071Z" }, +] + +[[package]] +name = "encutils" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "chardet" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/24/15d0f368875e53fb02bf7475e8a8c9aec36dee5a3dcb23efc77f585f9eb6/encutils-1.0.0.tar.gz", hash = "sha256:38eca5af18cebabd8be43c17f14c9d3fbba83cc5f7ac8e3ab1c86e24c4b2b91a", size = 22831, upload-time = "2026-04-19T16:27:19.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/cb/27d1c167d7b6607316c0c4ec5869b256104eb2c9607f76ef2ffa10806d3e/encutils-1.0.0-py3-none-any.whl", hash = "sha256:605297da19a23d1b2da7d3b9bd75513acc979e9facf03aa7ec7ba04b5f567a79", size = 21231, upload-time = "2026-04-19T16:27:18.778Z" }, +] + +[[package]] +name = "exceptiongroup" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/50/79/66800aadf48771f6b62f7eb014e352e5d06856655206165d775e675a02c9/exceptiongroup-1.3.1.tar.gz", hash = "sha256:8b412432c6055b0b7d14c310000ae93352ed6754f70fa8f7c34141f91c4e3219", size = 30371, upload-time = "2025-11-21T23:01:54.787Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/0e/97c33bf5009bdbac74fd2beace167cab3f978feb69cc36f1ef79360d6c4e/exceptiongroup-1.3.1-py3-none-any.whl", hash = "sha256:a7a39a3bd276781e98394987d3a5701d0c4edffb633bb7a5144577f82c773598", size = 16740, upload-time = "2025-11-21T23:01:53.443Z" }, +] + +[[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 = "fastapi" +version = "0.139.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-doc" }, + { name = "pydantic" }, + { name = "starlette" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/af/a5f50ccfa659ec1802cb4ca842c23f06d906a8cc9aef6016a2caeea3d4ed/fastapi-0.139.0.tar.gz", hash = "sha256:99ab7b2d92223c76d6cf10757ab3f89d45b38267fc20b2a136cf02f6beac3145", size = 423016, upload-time = "2026-07-01T16:35:33.436Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/7c/8e3c6ad324ea5cb36604fc3f968554887891c316d9dfde57761611d907ad/fastapi-0.139.0-py3-none-any.whl", hash = "sha256:cf15e1e9e667ddb0ad63811e60bd11390d1aac838ca4a7a23f421807b2308189", size = 130339, upload-time = "2026-07-01T16:35:32.19Z" }, +] + +[[package]] +name = "fastjsonschema" +version = "2.21.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/20/b5/23b216d9d985a956623b6bd12d4086b60f0059b27799f23016af04a74ea1/fastjsonschema-2.21.2.tar.gz", hash = "sha256:b1eb43748041c880796cd077f1a07c3d94e93ae84bba5ed36800a33554ae05de", size = 374130, upload-time = "2025-08-14T18:49:36.666Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/a8/20d0723294217e47de6d9e2e40fd4a9d2f7c4b6ef974babd482a59743694/fastjsonschema-2.21.2-py3-none-any.whl", hash = "sha256:1c797122d0a86c5cace2e54bf4e819c36223b552017172f32c5c024a6b77e463", size = 24024, upload-time = "2025-08-14T18:49:34.776Z" }, +] + +[[package]] +name = "fiftyone" +version = "1.17.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiofiles" }, + { name = "argcomplete" }, + { name = "async-lru" }, + { name = "beautifulsoup4" }, + { name = "boto3" }, + { name = "cachetools" }, + { name = "dacite" }, + { name = "deprecated" }, + { name = "dill" }, + { name = "exceptiongroup" }, + { name = "fiftyone-brain" }, + { name = "fiftyone-db" }, + { name = "ftfy" }, + { name = "humanize" }, + { name = "hypercorn" }, + { name = "jinja2" }, + { name = "jsonpatch" }, + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "mongoengine" }, + { name = "motor" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "plotly" }, + { name = "pprintpp" }, + { name = "protobuf" }, + { name = "psutil" }, + { name = "pydash" }, + { name = "pymongo" }, + { name = "pytz" }, + { name = "pyyaml" }, + { name = "regex" }, + { name = "retrying" }, + { name = "rtree" }, + { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "setuptools" }, + { name = "sse-starlette" }, + { name = "sseclient-py" }, + { name = "starlette" }, + { name = "strawberry-graphql" }, + { name = "tabulate" }, + { name = "tqdm" }, + { name = "universal-analytics-python3" }, + { name = "voxel51-eta" }, + { name = "xmltodict" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/3d/a6adc7a808094882e603ab4d3235055fae951fcaf9bd2445c5513a29b0c5/fiftyone-1.17.0.tar.gz", hash = "sha256:ffc47ea388e887f8d7ffd20988bd112baf787166d430a43c2e60630cd87d75ed", size = 17569855, upload-time = "2026-06-09T00:01:14.9Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/56/ae/635982b362144ce9a762a6fa20b40b7f405d09155bdd426657d5260ae74b/fiftyone-1.17.0-py3-none-any.whl", hash = "sha256:aaad18c97b99f2faf2d923d6f32f6f4273bdb9b3b30b32d938590af65827d1c4", size = 17789496, upload-time = "2026-06-09T00:01:12.285Z" }, +] + +[[package]] +name = "fiftyone-brain" +version = "0.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "scikit-learn", version = "1.7.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-learn", version = "1.9.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/f9/e2bfc6a5b4ff06b99fdac8ee5261a0b598a07d4dcd43aabc127f4e7df3de/fiftyone_brain-0.22.0.tar.gz", hash = "sha256:85dfb275ff39d17673435c6521fc4f6bddda1b718021fc1bfaf3601d4e7b0e26", size = 108758, upload-time = "2026-06-03T20:37:02.244Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/75/82c9277b0ec4dee835a47c50dc803163f1e1ab16d5a42e6a3427b753b891/fiftyone_brain-0.22.0-py3-none-any.whl", hash = "sha256:cac218d4630b80c5f7df07ed9ce822973554f002e1f6850c9d991e4727ac9bab", size = 112868, upload-time = "2026-06-03T20:37:00.717Z" }, +] + +[[package]] +name = "fiftyone-db" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/61/19b7b61f1fe84f37fa07dc38c4948653f2a4436adaec0ae8446850908b2f/fiftyone_db-1.4.1.tar.gz", hash = "sha256:7d8950bdee41594131564aa3f47fb79646fb3612e863bc4e6cd8948190a25703", size = 8589, upload-time = "2025-12-30T18:09:45.941Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/47/44fbf273b941f1632cc4de2cd4d0abd336a2cff9a77fc7483708e11640c6/fiftyone_db-1.4.1-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:548d181d04ae8282849c03a91200d5120745d31580733293de46acf3ea62f2ec", size = 44296811, upload-time = "2025-12-30T18:09:32.424Z" }, + { url = "https://files.pythonhosted.org/packages/90/67/0f58ea398c8ba3d41cf8fac7ab7dd97d6d7f5e92cb5c04766612e2781b98/fiftyone_db-1.4.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:56afc3e51e712b535dace231835dacb3023706dea27d755b9ac6e84845cda33d", size = 41061502, upload-time = "2025-12-30T18:09:35.945Z" }, + { url = "https://files.pythonhosted.org/packages/92/03/8d8fa7933155d649c989ba7e04d2be9e335ef238897b19900ba93eaff978/fiftyone_db-1.4.1-py3-none-win32.whl", hash = "sha256:ff15c14a9bbe65ab45da304a572dc5e2970b15f32c7780edb74794b0168ef2c8", size = 6519, upload-time = "2025-12-30T18:09:38.686Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f2/6134ca84e51434b94ca9977e6a7a4024ee9f1a9bd0b27be13428a4814507/fiftyone_db-1.4.1-py3-none-win_amd64.whl", hash = "sha256:8840f6c46761e20970cc3f47ee6002233417c6588b9885776e1dde06bdced9e4", size = 25658204, upload-time = "2025-12-30T18:09:40.609Z" }, +] + +[[package]] +name = "filelock" +version = "3.29.5" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e3/ee/29c668c50888588c432a702f7c2e8ee8a0c9e5286028d91f170308d6b2e9/filelock-3.29.5.tar.gz", hash = "sha256:6e6034c57a00a020e767f2614a5539863f056de7e7991d6d1473aef7ff73f156", size = 68927, upload-time = "2026-07-03T03:50:31.818Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/e3/f1fae3647d170919c2cf2a898e77e7d1a4e5c7cae0aed7bb4bd3f5ebff6f/filelock-3.29.5-py3-none-any.whl", hash = "sha256:8af830889ba3a0ffcefbd6c7d2af8a54012058103771f2e10848222f476a1693", size = 45073, upload-time = "2026-07-03T03:50:30.445Z" }, +] + +[[package]] +name = "filterpy" +version = "1.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f6/1d/ac8914360460fafa1990890259b7fa5ef7ba4cd59014e782e4ab3ab144d8/filterpy-1.4.5.zip", hash = "sha256:4f2a4d39e4ea601b9ab42b2db08b5918a9538c168cff1c6895ae26646f3d73b1", size = 177985, upload-time = "2018-10-10T22:38:24.63Z" } + +[[package]] +name = "fonttools" +version = "4.63.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/84/69/c97f2c18e0db87d2c7b15da1974dace76ae938f1cfa22e2727a648b7ed43/fonttools-4.63.0.tar.gz", hash = "sha256:caeb583deeb5168e694b65cda8b4ee62abedfa66cf88488734466f2366b9c4e0", size = 3597189, upload-time = "2026-05-14T12:04:30.958Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/c9/4141c90a90db20f807c7e10bfd689fe53eb8f7f4caff58ee4d4dfe46919f/fonttools-4.63.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:e3297a6a4059b4acc3a1e9a8b04741f240a80044eef08ebd32e8b5bcdddce75b", size = 2884632, upload-time = "2026-05-14T12:02:38.56Z" }, + { url = "https://files.pythonhosted.org/packages/b8/46/ad12b5c10eae602d7ef814b02afa08aacbf89da917fed5b071282b7eadc2/fonttools-4.63.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b1cd75a03ad8cb5bc40c90bfde68c0c47de423aa19e5c0f362b43520645eea94", size = 2429441, upload-time = "2026-05-14T12:02:41.162Z" }, + { url = "https://files.pythonhosted.org/packages/90/8f/bdca24a84c81d56fffed052229cdcff368f6e05882e526f4558891481f65/fonttools-4.63.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c0425b277a59cff3d80ca42162a8de360f318438a2ac83570842a678d826d579", size = 4946346, upload-time = "2026-05-14T12:02:43.41Z" }, + { url = "https://files.pythonhosted.org/packages/04/59/a639c0e136441ee91a65b56fdf89e5d075927e7a09c559d1b0f5276577db/fonttools-4.63.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d7e5c9973aa04c95650c96e5f5ad865fbf42d62079163ecfab1e01cbc2504c22", size = 4903184, upload-time = "2026-05-14T12:02:45.742Z" }, + { url = "https://files.pythonhosted.org/packages/e6/53/91b7e0cb45b536f3da1b29ba8cbab89f27e8b986809e0b1982303a3f4eca/fonttools-4.63.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cb014d58140a38135f16064c74c652ed57aa0b75cbf8bb59cac821f7edb5334e", size = 4922967, upload-time = "2026-05-14T12:02:48.386Z" }, + { url = "https://files.pythonhosted.org/packages/c7/b7/87439bf44e6b97c5538cd29d0b7e366a5b8ce2cc132a4134fb67fa3f2fa2/fonttools-4.63.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:032038247a96c1690f9f31e377c389383c902531b085aa4e4dabd6f57f870e69", size = 5042799, upload-time = "2026-05-14T12:02:50.424Z" }, + { url = "https://files.pythonhosted.org/packages/ad/7c/8b96c3263b89ef99cded544c0f0636686f85dbd3c211c4dceef0231fca23/fonttools-4.63.0-cp310-cp310-win32.whl", hash = "sha256:a8b33a82979e0a6a34ff435cc81317be1f95ec1ebb7a3a2d1c8a6a54f02ae44e", size = 1519704, upload-time = "2026-05-14T12:02:52.523Z" }, + { url = "https://files.pythonhosted.org/packages/e5/4d/2c2f0069970b6907de8fb5b05c5c0193cc22f717df151d1c7aef1c738f58/fonttools-4.63.0-cp310-cp310-win_amd64.whl", hash = "sha256:0c18358a155d75034911c5ee397a5b44cd19dd325dbb8b35fb60bf421d6a72ac", size = 1568666, upload-time = "2026-05-14T12:02:54.917Z" }, + { url = "https://files.pythonhosted.org/packages/75/2b/a7f1545bdf5da69c4bda0cea2a5781f0ad2a6623e0277267672db43c5fe6/fonttools-4.63.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:2b8ae05d9eacf6081414d759c0a352769ac28ce31280d6bb8e77b03f9e3c449f", size = 2881793, upload-time = "2026-05-14T12:02:56.645Z" }, + { url = "https://files.pythonhosted.org/packages/49/50/965308c703f085f225db2886813b27e015b8b3438c350b22dd65b52c2a2c/fonttools-4.63.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:79cdc9f567aec74a72918fd060283911406750cbc9fd28c1316023deb6ce31a9", size = 2428130, upload-time = "2026-05-14T12:02:58.891Z" }, + { url = "https://files.pythonhosted.org/packages/d8/38/6937fbd7f2dc3a6b48725851bc2c15ec949b9af14d9bbcb5fe83cdf9bdf9/fonttools-4.63.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2c14b4fd138c4bafcca294765c547914e1aa431ae1ca94ab99d8db08c958bd3b", size = 5111952, upload-time = "2026-05-14T12:03:01.263Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/a81f20050a3115b57d62c8e781446949512eac36690dc384ccea65ff4cc1/fonttools-4.63.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:d76ac49f929aecaf82d83250b8347e099d7aecba0f4726c1d9b6df3b8bb5fe18", size = 5082308, upload-time = "2026-05-14T12:03:03.211Z" }, + { url = "https://files.pythonhosted.org/packages/67/00/cdd9d4944ca6ae280d01e69cc37bde3bf663630b837a6fc6d2cd65d80e0e/fonttools-4.63.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dcf076a4474fe0d7367e5bbf5b052c7284fa1feca729c04176ce513521afd8a0", size = 5087932, upload-time = "2026-05-14T12:03:05.147Z" }, + { url = "https://files.pythonhosted.org/packages/f5/f1/0aa0dbea778c75adbef223c42019fd47d22262b905974d62d829545d485f/fonttools-4.63.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7dd683fef0663e9f0f45cf541d788d24caa3ec9db50796b588e1757d8b3bc007", size = 5213271, upload-time = "2026-05-14T12:03:07.238Z" }, + { url = "https://files.pythonhosted.org/packages/a8/99/253e4056e1f0e67b9390125a154b73b5eb73ad521bece95c004858fdeec2/fonttools-4.63.0-cp311-cp311-win32.whl", hash = "sha256:afefc1ed0a59785a7fb06ea7e1678e849c193e1e387db783579bc7b3056fcfcb", size = 2304473, upload-time = "2026-05-14T12:03:09.271Z" }, + { url = "https://files.pythonhosted.org/packages/08/60/defa5e69641db890a63be281f41345f4c33b157824eaf0b9fad3e08b0dcb/fonttools-4.63.0-cp311-cp311-win_amd64.whl", hash = "sha256:063e08bd17bd5a90127a14123de0d6a952dbc847695fd98b63c043d58057f90c", size = 2356389, upload-time = "2026-05-14T12:03:11.53Z" }, + { url = "https://files.pythonhosted.org/packages/08/ef/b3c6b9b5be2f82416d73fe2ed2e96e2793cd80e7510bd6a17ca79cdd88ec/fonttools-4.63.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:37dd23e621e3b0aef1baa70a303b80aaf38449632cfc8fd2a55fb285bbccfc02", size = 2881131, upload-time = "2026-05-14T12:03:13.386Z" }, + { url = "https://files.pythonhosted.org/packages/44/a0/c815bea63117fa63e4e1c01f8a1110d2112fa003f838e6467094ec2432ce/fonttools-4.63.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:a9faff9e0c1f76f9fd55899d2ce785832efebab37eb8ae13995853aef178bef0", size = 2426704, upload-time = "2026-05-14T12:03:15.801Z" }, + { url = "https://files.pythonhosted.org/packages/44/04/0b91d8e916e92ad1fac9e4624760baf0fd5ff2ead614c2f68fb21373f03f/fonttools-4.63.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ef3048ef05dbb552b89817713d9cac912e00d0fde4a3105c00d29e52e10c89af", size = 5044298, upload-time = "2026-05-14T12:03:18.085Z" }, + { url = "https://files.pythonhosted.org/packages/77/c7/2342da9830e3e9d4870305ca5d2091d2a83284f2953079b7bdd3b5e029d8/fonttools-4.63.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:58dc6bb86a78d782f00f9190ca02c119cf5bbe2807536e361e18d42019f877d8", size = 4999800, upload-time = "2026-05-14T12:03:20.161Z" }, + { url = "https://files.pythonhosted.org/packages/e6/6d/67fe16c48d7ce050979b33f47e0d28a318f02da030602e944c34f7a16ef3/fonttools-4.63.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ee08ebfa58f6e1aeff5697ab9582105bb620008c1caafb681e4c557e7483027b", size = 4982666, upload-time = "2026-05-14T12:03:22.87Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/3bbab338c07c71fa56269953845e92c951a61457bbbb0f1022551ea266d9/fonttools-4.63.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:27fdc65af8da6f88b9c6121c47a464cbe359fcfff7ff6fc2d37a1f395d755b78", size = 5133598, upload-time = "2026-05-14T12:03:25.168Z" }, + { url = "https://files.pythonhosted.org/packages/62/f2/aa27c7f98db5b064883dadcc5283947e81e034de42e22a33675878d98b54/fonttools-4.63.0-cp312-cp312-win32.whl", hash = "sha256:af2fd1664d00a397d75f806985ddb36282091c2131a73a6485c23b4a34722263", size = 2292575, upload-time = "2026-05-14T12:03:27.496Z" }, + { url = "https://files.pythonhosted.org/packages/87/36/cccb9bc2a6ab63d1b2980374f0dca72ce95ae267c9b4cfe77455bb70d0d4/fonttools-4.63.0-cp312-cp312-win_amd64.whl", hash = "sha256:59ac449f8cca9b4ffa08d2e7bbadad87ce710d69d1eda5c3c1ce579baa987272", size = 2343211, upload-time = "2026-05-14T12:03:30.057Z" }, + { url = "https://files.pythonhosted.org/packages/2c/47/c99d5268f354002ce80f8d029cd9d7d872969da1de8b93d32de4dc56d6f4/fonttools-4.63.0-py3-none-any.whl", hash = "sha256:445af2eab030a16b9171ea8bdda7ebf7d96bda2df88ee182a464252f6e05e20d", size = 1164562, upload-time = "2026-05-14T12:04:29.092Z" }, +] + +[[package]] +name = "frozenlist" +version = "1.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2d/f5/c831fac6cc817d26fd54c7eaccd04ef7e0288806943f7cc5bbf69f3ac1f0/frozenlist-1.8.0.tar.gz", hash = "sha256:3ede829ed8d842f6cd48fc7081d7a41001a56f1f38603f9d49bf3020d59a31ad", size = 45875, upload-time = "2025-10-06T05:38:17.865Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/4a/557715d5047da48d54e659203b9335be7bfaafda2c3f627b7c47e0b3aaf3/frozenlist-1.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b37f6d31b3dcea7deb5e9696e529a6aa4a898adc33db82da12e4c60a7c4d2011", size = 86230, upload-time = "2025-10-06T05:35:23.699Z" }, + { url = "https://files.pythonhosted.org/packages/a2/fb/c85f9fed3ea8fe8740e5b46a59cc141c23b842eca617da8876cfce5f760e/frozenlist-1.8.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ef2b7b394f208233e471abc541cc6991f907ffd47dc72584acee3147899d6565", size = 49621, upload-time = "2025-10-06T05:35:25.341Z" }, + { url = "https://files.pythonhosted.org/packages/63/70/26ca3f06aace16f2352796b08704338d74b6d1a24ca38f2771afbb7ed915/frozenlist-1.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:a88f062f072d1589b7b46e951698950e7da00442fc1cacbe17e19e025dc327ad", size = 49889, upload-time = "2025-10-06T05:35:26.797Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ed/c7895fd2fde7f3ee70d248175f9b6cdf792fb741ab92dc59cd9ef3bd241b/frozenlist-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f57fb59d9f385710aa7060e89410aeb5058b99e62f4d16b08b91986b9a2140c2", size = 219464, upload-time = "2025-10-06T05:35:28.254Z" }, + { url = "https://files.pythonhosted.org/packages/6b/83/4d587dccbfca74cb8b810472392ad62bfa100bf8108c7223eb4c4fa2f7b3/frozenlist-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:799345ab092bee59f01a915620b5d014698547afd011e691a208637312db9186", size = 221649, upload-time = "2025-10-06T05:35:29.454Z" }, + { url = "https://files.pythonhosted.org/packages/6a/c6/fd3b9cd046ec5fff9dab66831083bc2077006a874a2d3d9247dea93ddf7e/frozenlist-1.8.0-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c23c3ff005322a6e16f71bf8692fcf4d5a304aaafe1e262c98c6d4adc7be863e", size = 219188, upload-time = "2025-10-06T05:35:30.951Z" }, + { url = "https://files.pythonhosted.org/packages/ce/80/6693f55eb2e085fc8afb28cf611448fb5b90e98e068fa1d1b8d8e66e5c7d/frozenlist-1.8.0-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:8a76ea0f0b9dfa06f254ee06053d93a600865b3274358ca48a352ce4f0798450", size = 231748, upload-time = "2025-10-06T05:35:32.101Z" }, + { url = "https://files.pythonhosted.org/packages/97/d6/e9459f7c5183854abd989ba384fe0cc1a0fb795a83c033f0571ec5933ca4/frozenlist-1.8.0-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c7366fe1418a6133d5aa824ee53d406550110984de7637d65a178010f759c6ef", size = 236351, upload-time = "2025-10-06T05:35:33.834Z" }, + { url = "https://files.pythonhosted.org/packages/97/92/24e97474b65c0262e9ecd076e826bfd1d3074adcc165a256e42e7b8a7249/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:13d23a45c4cebade99340c4165bd90eeb4a56c6d8a9d8aa49568cac19a6d0dc4", size = 218767, upload-time = "2025-10-06T05:35:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/ee/bf/dc394a097508f15abff383c5108cb8ad880d1f64a725ed3b90d5c2fbf0bb/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:e4a3408834f65da56c83528fb52ce7911484f0d1eaf7b761fc66001db1646eff", size = 235887, upload-time = "2025-10-06T05:35:36.354Z" }, + { url = "https://files.pythonhosted.org/packages/40/90/25b201b9c015dbc999a5baf475a257010471a1fa8c200c843fd4abbee725/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:42145cd2748ca39f32801dad54aeea10039da6f86e303659db90db1c4b614c8c", size = 228785, upload-time = "2025-10-06T05:35:37.949Z" }, + { url = "https://files.pythonhosted.org/packages/84/f4/b5bc148df03082f05d2dd30c089e269acdbe251ac9a9cf4e727b2dbb8a3d/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e2de870d16a7a53901e41b64ffdf26f2fbb8917b3e6ebf398098d72c5b20bd7f", size = 230312, upload-time = "2025-10-06T05:35:39.178Z" }, + { url = "https://files.pythonhosted.org/packages/db/4b/87e95b5d15097c302430e647136b7d7ab2398a702390cf4c8601975709e7/frozenlist-1.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20e63c9493d33ee48536600d1a5c95eefc870cd71e7ab037763d1fbb89cc51e7", size = 217650, upload-time = "2025-10-06T05:35:40.377Z" }, + { url = "https://files.pythonhosted.org/packages/e5/70/78a0315d1fea97120591a83e0acd644da638c872f142fd72a6cebee825f3/frozenlist-1.8.0-cp310-cp310-win32.whl", hash = "sha256:adbeebaebae3526afc3c96fad434367cafbfd1b25d72369a9e5858453b1bb71a", size = 39659, upload-time = "2025-10-06T05:35:41.863Z" }, + { url = "https://files.pythonhosted.org/packages/66/aa/3f04523fb189a00e147e60c5b2205126118f216b0aa908035c45336e27e4/frozenlist-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:667c3777ca571e5dbeb76f331562ff98b957431df140b54c85fd4d52eea8d8f6", size = 43837, upload-time = "2025-10-06T05:35:43.205Z" }, + { url = "https://files.pythonhosted.org/packages/39/75/1135feecdd7c336938bd55b4dc3b0dfc46d85b9be12ef2628574b28de776/frozenlist-1.8.0-cp310-cp310-win_arm64.whl", hash = "sha256:80f85f0a7cc86e7a54c46d99c9e1318ff01f4687c172ede30fd52d19d1da1c8e", size = 39989, upload-time = "2025-10-06T05:35:44.596Z" }, + { url = "https://files.pythonhosted.org/packages/bc/03/077f869d540370db12165c0aa51640a873fb661d8b315d1d4d67b284d7ac/frozenlist-1.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:09474e9831bc2b2199fad6da3c14c7b0fbdd377cce9d3d77131be28906cb7d84", size = 86912, upload-time = "2025-10-06T05:35:45.98Z" }, + { url = "https://files.pythonhosted.org/packages/df/b5/7610b6bd13e4ae77b96ba85abea1c8cb249683217ef09ac9e0ae93f25a91/frozenlist-1.8.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:17c883ab0ab67200b5f964d2b9ed6b00971917d5d8a92df149dc2c9779208ee9", size = 50046, upload-time = "2025-10-06T05:35:47.009Z" }, + { url = "https://files.pythonhosted.org/packages/6e/ef/0e8f1fe32f8a53dd26bdd1f9347efe0778b0fddf62789ea683f4cc7d787d/frozenlist-1.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:fa47e444b8ba08fffd1c18e8cdb9a75db1b6a27f17507522834ad13ed5922b93", size = 50119, upload-time = "2025-10-06T05:35:48.38Z" }, + { url = "https://files.pythonhosted.org/packages/11/b1/71a477adc7c36e5fb628245dfbdea2166feae310757dea848d02bd0689fd/frozenlist-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2552f44204b744fba866e573be4c1f9048d6a324dfe14475103fd51613eb1d1f", size = 231067, upload-time = "2025-10-06T05:35:49.97Z" }, + { url = "https://files.pythonhosted.org/packages/45/7e/afe40eca3a2dc19b9904c0f5d7edfe82b5304cb831391edec0ac04af94c2/frozenlist-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:957e7c38f250991e48a9a73e6423db1bb9dd14e722a10f6b8bb8e16a0f55f695", size = 233160, upload-time = "2025-10-06T05:35:51.729Z" }, + { url = "https://files.pythonhosted.org/packages/a6/aa/7416eac95603ce428679d273255ffc7c998d4132cfae200103f164b108aa/frozenlist-1.8.0-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:8585e3bb2cdea02fc88ffa245069c36555557ad3609e83be0ec71f54fd4abb52", size = 228544, upload-time = "2025-10-06T05:35:53.246Z" }, + { url = "https://files.pythonhosted.org/packages/8b/3d/2a2d1f683d55ac7e3875e4263d28410063e738384d3adc294f5ff3d7105e/frozenlist-1.8.0-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:edee74874ce20a373d62dc28b0b18b93f645633c2943fd90ee9d898550770581", size = 243797, upload-time = "2025-10-06T05:35:54.497Z" }, + { url = "https://files.pythonhosted.org/packages/78/1e/2d5565b589e580c296d3bb54da08d206e797d941a83a6fdea42af23be79c/frozenlist-1.8.0-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c9a63152fe95756b85f31186bddf42e4c02c6321207fd6601a1c89ebac4fe567", size = 247923, upload-time = "2025-10-06T05:35:55.861Z" }, + { url = "https://files.pythonhosted.org/packages/aa/c3/65872fcf1d326a7f101ad4d86285c403c87be7d832b7470b77f6d2ed5ddc/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b6db2185db9be0a04fecf2f241c70b63b1a242e2805be291855078f2b404dd6b", size = 230886, upload-time = "2025-10-06T05:35:57.399Z" }, + { url = "https://files.pythonhosted.org/packages/a0/76/ac9ced601d62f6956f03cc794f9e04c81719509f85255abf96e2510f4265/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:f4be2e3d8bc8aabd566f8d5b8ba7ecc09249d74ba3c9ed52e54dc23a293f0b92", size = 245731, upload-time = "2025-10-06T05:35:58.563Z" }, + { url = "https://files.pythonhosted.org/packages/b9/49/ecccb5f2598daf0b4a1415497eba4c33c1e8ce07495eb07d2860c731b8d5/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:c8d1634419f39ea6f5c427ea2f90ca85126b54b50837f31497f3bf38266e853d", size = 241544, upload-time = "2025-10-06T05:35:59.719Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/ddf24113323c0bbcc54cb38c8b8916f1da7165e07b8e24a717b4a12cbf10/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:1a7fa382a4a223773ed64242dbe1c9c326ec09457e6b8428efb4118c685c3dfd", size = 241806, upload-time = "2025-10-06T05:36:00.959Z" }, + { url = "https://files.pythonhosted.org/packages/a7/fb/9b9a084d73c67175484ba2789a59f8eebebd0827d186a8102005ce41e1ba/frozenlist-1.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:11847b53d722050808926e785df837353bd4d75f1d494377e59b23594d834967", size = 229382, upload-time = "2025-10-06T05:36:02.22Z" }, + { url = "https://files.pythonhosted.org/packages/95/a3/c8fb25aac55bf5e12dae5c5aa6a98f85d436c1dc658f21c3ac73f9fa95e5/frozenlist-1.8.0-cp311-cp311-win32.whl", hash = "sha256:27c6e8077956cf73eadd514be8fb04d77fc946a7fe9f7fe167648b0b9085cc25", size = 39647, upload-time = "2025-10-06T05:36:03.409Z" }, + { url = "https://files.pythonhosted.org/packages/0a/f5/603d0d6a02cfd4c8f2a095a54672b3cf967ad688a60fb9faf04fc4887f65/frozenlist-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:ac913f8403b36a2c8610bbfd25b8013488533e71e62b4b4adce9c86c8cea905b", size = 44064, upload-time = "2025-10-06T05:36:04.368Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/c2c9ab44e181f043a86f9a8f84d5124b62dbcb3a02c0977ec72b9ac1d3e0/frozenlist-1.8.0-cp311-cp311-win_arm64.whl", hash = "sha256:d4d3214a0f8394edfa3e303136d0575eece0745ff2b47bd2cb2e66dd92d4351a", size = 39937, upload-time = "2025-10-06T05:36:05.669Z" }, + { url = "https://files.pythonhosted.org/packages/69/29/948b9aa87e75820a38650af445d2ef2b6b8a6fab1a23b6bb9e4ef0be2d59/frozenlist-1.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:78f7b9e5d6f2fdb88cdde9440dc147259b62b9d3b019924def9f6478be254ac1", size = 87782, upload-time = "2025-10-06T05:36:06.649Z" }, + { url = "https://files.pythonhosted.org/packages/64/80/4f6e318ee2a7c0750ed724fa33a4bdf1eacdc5a39a7a24e818a773cd91af/frozenlist-1.8.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:229bf37d2e4acdaf808fd3f06e854a4a7a3661e871b10dc1f8f1896a3b05f18b", size = 50594, upload-time = "2025-10-06T05:36:07.69Z" }, + { url = "https://files.pythonhosted.org/packages/2b/94/5c8a2b50a496b11dd519f4a24cb5496cf125681dd99e94c604ccdea9419a/frozenlist-1.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:f833670942247a14eafbb675458b4e61c82e002a148f49e68257b79296e865c4", size = 50448, upload-time = "2025-10-06T05:36:08.78Z" }, + { url = "https://files.pythonhosted.org/packages/6a/bd/d91c5e39f490a49df14320f4e8c80161cfcce09f1e2cde1edd16a551abb3/frozenlist-1.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:494a5952b1c597ba44e0e78113a7266e656b9794eec897b19ead706bd7074383", size = 242411, upload-time = "2025-10-06T05:36:09.801Z" }, + { url = "https://files.pythonhosted.org/packages/8f/83/f61505a05109ef3293dfb1ff594d13d64a2324ac3482be2cedc2be818256/frozenlist-1.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f423a119f4777a4a056b66ce11527366a8bb92f54e541ade21f2374433f6d4", size = 243014, upload-time = "2025-10-06T05:36:11.394Z" }, + { url = "https://files.pythonhosted.org/packages/d8/cb/cb6c7b0f7d4023ddda30cf56b8b17494eb3a79e3fda666bf735f63118b35/frozenlist-1.8.0-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:3462dd9475af2025c31cc61be6652dfa25cbfb56cbbf52f4ccfe029f38decaf8", size = 234909, upload-time = "2025-10-06T05:36:12.598Z" }, + { url = "https://files.pythonhosted.org/packages/31/c5/cd7a1f3b8b34af009fb17d4123c5a778b44ae2804e3ad6b86204255f9ec5/frozenlist-1.8.0-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c4c800524c9cd9bac5166cd6f55285957fcfc907db323e193f2afcd4d9abd69b", size = 250049, upload-time = "2025-10-06T05:36:14.065Z" }, + { url = "https://files.pythonhosted.org/packages/c0/01/2f95d3b416c584a1e7f0e1d6d31998c4a795f7544069ee2e0962a4b60740/frozenlist-1.8.0-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d6a5df73acd3399d893dafc71663ad22534b5aa4f94e8a2fabfe856c3c1b6a52", size = 256485, upload-time = "2025-10-06T05:36:15.39Z" }, + { url = "https://files.pythonhosted.org/packages/ce/03/024bf7720b3abaebcff6d0793d73c154237b85bdf67b7ed55e5e9596dc9a/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:405e8fe955c2280ce66428b3ca55e12b3c4e9c336fb2103a4937e891c69a4a29", size = 237619, upload-time = "2025-10-06T05:36:16.558Z" }, + { url = "https://files.pythonhosted.org/packages/69/fa/f8abdfe7d76b731f5d8bd217827cf6764d4f1d9763407e42717b4bed50a0/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:908bd3f6439f2fef9e85031b59fd4f1297af54415fb60e4254a95f75b3cab3f3", size = 250320, upload-time = "2025-10-06T05:36:17.821Z" }, + { url = "https://files.pythonhosted.org/packages/f5/3c/b051329f718b463b22613e269ad72138cc256c540f78a6de89452803a47d/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:294e487f9ec720bd8ffcebc99d575f7eff3568a08a253d1ee1a0378754b74143", size = 246820, upload-time = "2025-10-06T05:36:19.046Z" }, + { url = "https://files.pythonhosted.org/packages/0f/ae/58282e8f98e444b3f4dd42448ff36fa38bef29e40d40f330b22e7108f565/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:74c51543498289c0c43656701be6b077f4b265868fa7f8a8859c197006efb608", size = 250518, upload-time = "2025-10-06T05:36:20.763Z" }, + { url = "https://files.pythonhosted.org/packages/8f/96/007e5944694d66123183845a106547a15944fbbb7154788cbf7272789536/frozenlist-1.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:776f352e8329135506a1d6bf16ac3f87bc25b28e765949282dcc627af36123aa", size = 239096, upload-time = "2025-10-06T05:36:22.129Z" }, + { url = "https://files.pythonhosted.org/packages/66/bb/852b9d6db2fa40be96f29c0d1205c306288f0684df8fd26ca1951d461a56/frozenlist-1.8.0-cp312-cp312-win32.whl", hash = "sha256:433403ae80709741ce34038da08511d4a77062aa924baf411ef73d1146e74faf", size = 39985, upload-time = "2025-10-06T05:36:23.661Z" }, + { url = "https://files.pythonhosted.org/packages/b8/af/38e51a553dd66eb064cdf193841f16f077585d4d28394c2fa6235cb41765/frozenlist-1.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:34187385b08f866104f0c0617404c8eb08165ab1272e884abc89c112e9c00746", size = 44591, upload-time = "2025-10-06T05:36:24.958Z" }, + { url = "https://files.pythonhosted.org/packages/a7/06/1dc65480ab147339fecc70797e9c2f69d9cea9cf38934ce08df070fdb9cb/frozenlist-1.8.0-cp312-cp312-win_arm64.whl", hash = "sha256:fe3c58d2f5db5fbd18c2987cba06d51b0529f52bc3a6cdc33d3f4eab725104bd", size = 40102, upload-time = "2025-10-06T05:36:26.333Z" }, + { url = "https://files.pythonhosted.org/packages/9a/9a/e35b4a917281c0b8419d4207f4334c8e8c5dbf4f3f5f9ada73958d937dcc/frozenlist-1.8.0-py3-none-any.whl", hash = "sha256:0c18a16eab41e82c295618a77502e17b195883241c563b00f0aa5106fc4eaa0d", size = 13409, upload-time = "2025-10-06T05:38:16.721Z" }, +] + +[[package]] +name = "fsspec" +version = "2026.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/10/a1/ae4e3e5003468d6391d2c77b6fa1cd73bd5d13511d81c642d7b28ac90ed4/fsspec-2026.6.0.tar.gz", hash = "sha256:f5bac145310fe30e16e1471bd6840b2d990d609e872251d7e674241822abf01a", size = 313646, upload-time = "2026-06-16T01:57:28.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e5/22/4222d7ddf3da30f363edaa98e329c2bce6c65497c9cb2810931c8b2c0fbc/fsspec-2026.6.0-py3-none-any.whl", hash = "sha256:02e0b71817df9b2169dc30a16832045764def1191b43dcff5bb85bdee212d2a1", size = 203949, upload-time = "2026-06-16T01:57:26.358Z" }, +] + +[[package]] +name = "ftfy" +version = "6.3.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wcwidth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a5/d3/8650919bc3c7c6e90ee3fa7fd618bf373cbbe55dff043bd67353dbb20cd8/ftfy-6.3.1.tar.gz", hash = "sha256:9b3c3d90f84fb267fe64d375a07b7f8912d817cf86009ae134aa03e1819506ec", size = 308927, upload-time = "2024-10-26T00:50:35.149Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ab/6e/81d47999aebc1b155f81eca4477a616a70f238a2549848c38983f3c22a82/ftfy-6.3.1-py3-none-any.whl", hash = "sha256:7c70eb532015cd2f9adb53f101fb6c7945988d023a085d127d1573dc49dd0083", size = 44821, upload-time = "2024-10-26T00:50:33.425Z" }, +] + +[[package]] +name = "gcsfs" +version = "2026.7.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiohttp" }, + { name = "decorator" }, + { name = "fsspec" }, + { name = "google-auth" }, + { name = "google-auth-oauthlib" }, + { name = "google-cloud-storage" }, + { name = "google-cloud-storage-control" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d3/33/58e23c6f492e091c2f01ae1bffe331aa97e18a0b3d24ff90ef648335ddc8/gcsfs-2026.7.0.tar.gz", hash = "sha256:2df36ce1e9010e76dc4295774030495a97496838483c619e9f63bc0ab7bdc770", size = 1265874, upload-time = "2026-07-06T15:02:30.683Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/eb/a5c4b39903928e6be7735cc7aa31b6c3bbf3d887419e1e7ac751dba02233/gcsfs-2026.7.0-py3-none-any.whl", hash = "sha256:8ce6c08ea64302d8fd4bc23a615ccd9e7752541cde1a88ec8362109bd79cde78", size = 91131, upload-time = "2026-07-06T15:02:29.208Z" }, +] + +[[package]] +name = "gitdb" +version = "4.0.12" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "smmap" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/72/94/63b0fc47eb32792c7ba1fe1b694daec9a63620db1e313033d18140c2320a/gitdb-4.0.12.tar.gz", hash = "sha256:5ef71f855d191a3326fcfbc0d5da835f26b13fbcba60c32c21091c349ffdb571", size = 394684, upload-time = "2025-01-02T07:20:46.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/61/5c78b91c3143ed5c14207f463aecfc8f9dbb5092fb2869baf37c273b2705/gitdb-4.0.12-py3-none-any.whl", hash = "sha256:67073e15955400952c6565cc3e707c554a4eea2e428946f7a4c162fab9bd9bcf", size = 62794, upload-time = "2025-01-02T07:20:43.624Z" }, +] + +[[package]] +name = "gitpython" +version = "3.1.50" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "gitdb" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/f6/354ae6491228b5eb40e10d89c4d13c651fe1cf7556e35ebdded50cff57ce/gitpython-3.1.50.tar.gz", hash = "sha256:80da2d12504d52e1f998772dc5baf6e553f8d2fcfe1fcc226c9d9a2ee3372dcc", size = 219798, upload-time = "2026-05-06T04:01:26.571Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/7a/1c6e3562dfd8950adbb11ffbc65d21e7c89d01a6e4f137fa981056de25c5/gitpython-3.1.50-py3-none-any.whl", hash = "sha256:d352abe2908d07355014abdd21ddf798c2a961469239afec4962e9da884858f9", size = 212507, upload-time = "2026-05-06T04:01:23.799Z" }, +] + +[[package]] +name = "glob2" +version = "0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/a5/bbbc3b74a94fbdbd7915e7ad030f16539bfdc1362f7e9003b594f0537950/glob2-0.7.tar.gz", hash = "sha256:85c3dbd07c8aa26d63d7aacee34fa86e9a91a3873bc30bf62ec46e531f92ab8c", size = 10697, upload-time = "2019-06-10T23:33:48.308Z" } + +[[package]] +name = "google-api-core" +version = "2.31.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "googleapis-common-protos" }, + { name = "proto-plus" }, + { name = "protobuf" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c6/22/155cadf1d49272a9cf48f3168c0f3874fa13397297e611a5ea00cd093880/google_api_core-2.31.0.tar.gz", hash = "sha256:2be84ee0f584c48e6bde1b36766e23348b361fb7e55e56135fc76ce1c397f9c2", size = 176492, upload-time = "2026-06-03T14:52:17.257Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/86/40/9bdbb60b03a332bd45acb8703da08bbc27d991d35286b62e42acc86d243a/google_api_core-2.31.0-py3-none-any.whl", hash = "sha256:ef79fb3784c71cbac89cbd03301ba0c8fb8ad2aa95d7f9204dd9628f7adf59ab", size = 173102, upload-time = "2026-06-03T14:51:26.729Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, + { name = "grpcio-status" }, +] + +[[package]] +name = "google-auth" +version = "2.55.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cryptography" }, + { name = "pyasn1-modules" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/6f/f3f4ac177c67bbee8fe8e88f2ab4f36af88c44a096e165c5217accf6e5d3/google_auth-2.55.1.tar.gz", hash = "sha256:fb2d9b730f2c9b8d326ec8d7222f21aef2ead15bf0513793d6442485d87af0a1", size = 349527, upload-time = "2026-06-25T23:39:27.182Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/1d/f6d3ca1ad0725f2e08a1c6915640748a52de2e66596160a4d53b010cccf0/google_auth-2.55.1-py3-none-any.whl", hash = "sha256:eada68dfd52b3b81191827601e2a0c3fa12540c818534b630ddc5355769c3995", size = 252349, upload-time = "2026-06-25T23:38:52.946Z" }, +] + +[[package]] +name = "google-auth-oauthlib" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-auth" }, + { name = "requests-oauthlib" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/70/18/90c7fac516e63cf2058166fce0c88c353647c677b51cc036c09c49bb5cbb/google_auth_oauthlib-1.4.0.tar.gz", hash = "sha256:18b5e28880eb8eba9065c436becdc0ee8e4b59117a73a510679c82f70cd363d2", size = 21675, upload-time = "2026-05-07T08:03:47.816Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/37/d3/d7dff0d58a9e9244b48044bfb6a898bfcc8ecc42e0031d1bebc695344725/google_auth_oauthlib-1.4.0-py3-none-any.whl", hash = "sha256:251314f213a9ee46a5ae73988e84fd7cca8bb68e7ecf4bfd45940f9e7f51d070", size = 19261, upload-time = "2026-05-07T08:02:13.798Z" }, +] + +[[package]] +name = "google-cloud-core" +version = "2.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a8/dd/1eef226e470369b26824a505c34482c0b493bc35fe8e0c6b003b5feca21a/google_cloud_core-2.6.0.tar.gz", hash = "sha256:e76149739f90fac1fc6757c09f47eaccb3145b54adbd7759b0f7c4b235f46c83", size = 36001, upload-time = "2026-05-07T08:04:04.124Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/4a/98da8930ab109c73d9a5d13782a9ebb81ea8c111f6d534a567b71d23e52b/google_cloud_core-2.6.0-py3-none-any.whl", hash = "sha256:6d63ac8e5eca6d9e4319d0a1e2265fadcd7f1049904378caecfa01cf52dd869e", size = 29390, upload-time = "2026-05-07T08:02:34.672Z" }, +] + +[[package]] +name = "google-cloud-storage" +version = "3.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "google-auth" }, + { name = "google-cloud-core" }, + { name = "google-crc32c" }, + { name = "google-resumable-media" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/58/72/86f94e1639a8bcd9d33e8e01b49afcaa1c3a13bda7683c681717e0901e15/google_cloud_storage-3.12.0.tar.gz", hash = "sha256:03ae9847c6babb368f35f054126b8a08cbc0e3266efb990eb17b9926a45cf3be", size = 17338620, upload-time = "2026-06-12T18:03:29.215Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1b/bd/a89eaebd2f9db5f92ddcc8e4f23c266be1dbd11058bb83451d8dd029f34c/google_cloud_storage-3.12.0-py3-none-any.whl", hash = "sha256:3880773754ddf7c27567b04e2a4d193950b6b99429f37b9097d873686e95b09c", size = 340605, upload-time = "2026-06-12T18:03:12.677Z" }, +] + +[[package]] +name = "google-cloud-storage-control" +version = "1.12.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core", extra = ["grpc"] }, + { name = "google-auth" }, + { name = "grpc-google-iam-v1" }, + { name = "grpcio" }, + { name = "proto-plus" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/88/ae/707995271f77e3c1da715c740160f98f87a79a5c601b28d17c4d2500c037/google_cloud_storage_control-1.12.0.tar.gz", hash = "sha256:49090d03532c0c84c6246a5fd490c31fd4bbffb4c7771c0a6744ec23a194a5f6", size = 137036, upload-time = "2026-06-03T16:14:00.921Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/34/ba/f187f30fb2c8bb5dbb0de0fcb0dec2f8fab0b782ab42facc83ea02628f1b/google_cloud_storage_control-1.12.0-py3-none-any.whl", hash = "sha256:20f7f1252fa5635d47e12f746aa69d719e31eb9405cbbd14cdfba317db27d421", size = 102205, upload-time = "2026-06-03T16:12:43.266Z" }, +] + +[[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/95/ac/6f7bc93886a823ab545948c2dd48143027b2355ad1944c7cf852b338dc91/google_crc32c-1.8.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:0470b8c3d73b5f4e3300165498e4cf25221c7eb37f1159e221d1825b6df8a7ff", size = 31296, upload-time = "2025-12-16T00:19:07.261Z" }, + { url = "https://files.pythonhosted.org/packages/f7/97/a5accde175dee985311d949cfcb1249dcbb290f5ec83c994ea733311948f/google_crc32c-1.8.0-cp310-cp310-macosx_12_0_x86_64.whl", hash = "sha256:119fcd90c57c89f30040b47c211acee231b25a45d225e3225294386f5d258288", size = 30870, upload-time = "2025-12-16T00:29:17.669Z" }, + { url = "https://files.pythonhosted.org/packages/3d/63/bec827e70b7a0d4094e7476f863c0dbd6b5f0f1f91d9c9b32b76dcdfeb4e/google_crc32c-1.8.0-cp310-cp310-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:6f35aaffc8ccd81ba3162443fabb920e65b1f20ab1952a31b13173a67811467d", size = 33214, upload-time = "2025-12-16T00:40:19.618Z" }, + { url = "https://files.pythonhosted.org/packages/63/bc/11b70614df04c289128d782efc084b9035ef8466b3d0a8757c1b6f5cf7ac/google_crc32c-1.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:864abafe7d6e2c4c66395c1eb0fe12dc891879769b52a3d56499612ca93b6092", size = 33589, upload-time = "2025-12-16T00:40:20.7Z" }, + { url = "https://files.pythonhosted.org/packages/3e/00/a08a4bc24f1261cc5b0f47312d8aebfbe4b53c2e6307f1b595605eed246b/google_crc32c-1.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:db3fe8eaf0612fc8b20fa21a5f25bd785bc3cd5be69f8f3412b0ac2ffd49e733", size = 34437, upload-time = "2025-12-16T00:35:19.437Z" }, + { url = "https://files.pythonhosted.org/packages/5d/ef/21ccfaab3d5078d41efe8612e0ed0bfc9ce22475de074162a91a25f7980d/google_crc32c-1.8.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:014a7e68d623e9a4222d663931febc3033c5c7c9730785727de2a81f87d5bab8", size = 31298, upload-time = "2025-12-16T00:20:32.241Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b8/f8413d3f4b676136e965e764ceedec904fe38ae8de0cdc52a12d8eb1096e/google_crc32c-1.8.0-cp311-cp311-macosx_12_0_x86_64.whl", hash = "sha256:86cfc00fe45a0ac7359e5214a1704e51a99e757d0272554874f419f79838c5f7", size = 30872, upload-time = "2025-12-16T00:33:58.785Z" }, + { url = "https://files.pythonhosted.org/packages/f6/fd/33aa4ec62b290477181c55bb1c9302c9698c58c0ce9a6ab4874abc8b0d60/google_crc32c-1.8.0-cp311-cp311-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:19b40d637a54cb71e0829179f6cb41835f0fbd9e8eb60552152a8b52c36cbe15", size = 33243, upload-time = "2025-12-16T00:40:21.46Z" }, + { url = "https://files.pythonhosted.org/packages/71/03/4820b3bd99c9653d1a5210cb32f9ba4da9681619b4d35b6a052432df4773/google_crc32c-1.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:17446feb05abddc187e5441a45971b8394ea4c1b6efd88ab0af393fd9e0a156a", size = 33608, upload-time = "2025-12-16T00:40:22.204Z" }, + { url = "https://files.pythonhosted.org/packages/7c/43/acf61476a11437bf9733fb2f70599b1ced11ec7ed9ea760fdd9a77d0c619/google_crc32c-1.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:71734788a88f551fbd6a97be9668a0020698e07b2bf5b3aa26a36c10cdfb27b2", size = 34439, upload-time = "2025-12-16T00:35:20.458Z" }, + { 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/52/c5/c171e4d8c44fec1422d801a6d2e5d7ddabd733eeda505c79730ee9607f07/google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:87fa445064e7db928226b2e6f0d5304ab4cd0339e664a4e9a25029f384d9bb93", size = 28615, upload-time = "2025-12-16T00:40:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/7d75fe37a7a6ed171a2cf17117177e7aab7e6e0d115858741b41e9dd4254/google_crc32c-1.8.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:f639065ea2042d5c034bf258a9f085eaa7af0cd250667c0635a3118e8f92c69c", size = 28800, upload-time = "2025-12-16T00:40:30.322Z" }, +] + +[[package]] +name = "google-resumable-media" +version = "2.10.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-crc32c" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/48/f8/1ca5781d6be9cb9f73f7d40f4958c4bd1226a60598e3e39e1d6aaf838c4b/google_resumable_media-2.10.0.tar.gz", hash = "sha256:e324bc9d0fdae4c52a08ae90456edc4e71ece858399e1217ac0eb3a51d6bc6ee", size = 2164570, upload-time = "2026-06-03T16:14:26.103Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/d8/00c6854ac1512bb9eaf13bd3f8f28222f7674947fc510a4ff7616f2efc80/google_resumable_media-2.10.0-py3-none-any.whl", hash = "sha256:88152884bee37b2bf36a0ab81ad8c7fd12212c9803dd981d77c1b35b02d34e7c", size = 81533, upload-time = "2026-06-03T16:13:12.51Z" }, +] + +[[package]] +name = "googleapis-common-protos" +version = "1.75.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b5/c8/f439cffde755cffa462bfbb156278fa6f9d09119719af9814b858fd4f81f/googleapis_common_protos-1.75.0.tar.gz", hash = "sha256:53a062ff3c32552fbd62c11fe23768b78e4ddf0494d5e5fd97d3f4689c75fbbd", size = 151035, upload-time = "2026-05-07T08:04:49.423Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/c8/e2645aa8ed02fd4c7a2f59d68783b65b1f3cbdfe39a6308e156509d1fee8/googleapis_common_protos-1.75.0-py3-none-any.whl", hash = "sha256:961ed60399c457ceb0ee8f285a84c870aabc9c6a832b9d37bb281b5bebde43ed", size = 300631, upload-time = "2026-05-07T08:03:30.345Z" }, +] + +[package.optional-dependencies] +grpc = [ + { name = "grpcio" }, +] + +[[package]] +name = "graphql-core" +version = "3.2.11" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4d/90/f2aff026ab4aebd80eb71905106a0885f4cfde85dcf965543f45bed0d9ee/graphql_core-3.2.11.tar.gz", hash = "sha256:e7e156d10beb127cab5c89ff0da71416fc73d27c484a4757d3b2d35633774802", size = 528407, upload-time = "2026-06-05T13:45:22.915Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/00/15/b92b4e1d88d02c6eff9733c9eea21846ab435cc4d813d84ccc5d335955df/graphql_core-3.2.11-py3-none-any.whl", hash = "sha256:0b3e35ff41e9adba53021ab0cef475eb18f57c7f53f0f2ca55567fbf3c537ea0", size = 214879, upload-time = "2026-06-05T13:45:21.245Z" }, +] + +[[package]] +name = "greenlet" +version = "3.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/f1/fbbfef6af0bad0548f09bc28948ea3c275b4edb19e17fc5ca9900a6a634d/greenlet-3.5.3.tar.gz", hash = "sha256:a61efc018fd3eb317eeca31aba90ee9e7f26f22884a79b6c6ec715bf71bb62f1", size = 200270, upload-time = "2026-06-26T19:28:24.832Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/a1/1f7f0c555f5858fd2906fe9f7b0a3554fddb85cb70df7a6aaec41dc292c2/greenlet-3.5.3-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:c180d22d325fb613956b443c3c6f4406eb70e6defc70d3974da2a7b59e06f48c", size = 285838, upload-time = "2026-06-26T18:21:05.167Z" }, + { url = "https://files.pythonhosted.org/packages/0a/29/be9f43ed61677a5759b38c8a9389248133c8c731bbfc0574ecdff66c99fc/greenlet-3.5.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:483d08c11181c83a6ce1a7a61df0f624a208ec40817a3bb2302714592eee4f04", size = 602342, upload-time = "2026-06-26T19:07:06.908Z" }, + { url = "https://files.pythonhosted.org/packages/b9/42/ba41c97ec36aa4b3ec25e5aa691d79561254805fad7f2f826dd6770587e2/greenlet-3.5.3-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:1dae6e0091eae084317e411f047f0b7cb241c6db570f7c45fd6b900a274914ce", size = 615541, upload-time = "2026-06-26T19:10:04.909Z" }, + { url = "https://files.pythonhosted.org/packages/2e/8c/231ca675b0df779816950ca66b40b1fa14dbff4a0ed9814a9a29ec399140/greenlet-3.5.3-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:0f6ff50ff8dbd51fae9b37f4101648b04ea0df19b3f50ab2beb5061e7716a5c8", size = 622473, upload-time = "2026-06-26T19:24:12.786Z" }, + { url = "https://files.pythonhosted.org/packages/f5/c7/28747042e1df8a9cd120a1ebe15529fc4be3b486e13e8d551ff307a82412/greenlet-3.5.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9bcd2d72ccd70a1ec68ba6ef93e7fbb4420ef9997dabc7010d893bd4015e0bec", size = 615675, upload-time = "2026-06-26T18:32:14.444Z" }, + { url = "https://files.pythonhosted.org/packages/81/fe/dd97c483a3ff82849196ccd07851600edd3ac9de74669ca8a6022ada9ea1/greenlet-3.5.3-cp310-cp310-manylinux_2_39_riscv64.whl", hash = "sha256:37bf9c538f5ae6e63d643f88dec37c0c83bdf0e2ebc62961dedcf458822f7b71", size = 418421, upload-time = "2026-06-26T19:25:34.503Z" }, + { url = "https://files.pythonhosted.org/packages/cc/a8/b85525a6c8fba9f009a5f7c8df1545de8fb0f0bf3e0179194ef4e500317f/greenlet-3.5.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:73f152c895e09907e0dbe24f6c2db37beb085cd63db91c3825a0fcd0064124a8", size = 1575057, upload-time = "2026-06-26T19:09:00.264Z" }, + { url = "https://files.pythonhosted.org/packages/03/79/fb76edb218fe6735ab0edeba176c7ab80df9618f7c02ce4208979f3ae7db/greenlet-3.5.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8bdb43e1a1d1873721acab2be99c5befd4d2044ddfd52e4d610801019880a702", size = 1641692, upload-time = "2026-06-26T18:31:41.454Z" }, + { url = "https://files.pythonhosted.org/packages/6b/79/86fe3ee50ed55d9b3907eecd3208b5c3fe8a79515519aae98b4753c3fa1d/greenlet-3.5.3-cp310-cp310-win_amd64.whl", hash = "sha256:0909f9355a9f24845d3299f3112e266a06afb68302041989fd26bd68894933db", size = 238742, upload-time = "2026-06-26T18:20:40.758Z" }, + { url = "https://files.pythonhosted.org/packages/51/58/5404031044f55afad7aad1aff8be3f22b1bed03e237cfeabbc7e5c8cfde0/greenlet-3.5.3-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:aca9b4ce85b152b5524ef7d88170efdff80dc0032aa8b75f9aaf7f3479ea95b4", size = 287424, upload-time = "2026-06-26T18:20:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/b4/bf/1c65e9b94a54d547068fa5b5a8a06f221f3316b48908e08668d29c77cb50/greenlet-3.5.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0f71be4920368fe1fabeeaa53d1e3548337e2b223d9565f8ad5e392a75ba23fc", size = 606523, upload-time = "2026-06-26T19:07:08.859Z" }, + { url = "https://files.pythonhosted.org/packages/b8/c7/b66baacc95775ad511287acb0137b95574a9ce5491902372b7564799d790/greenlet-3.5.3-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:4d77e67f65f98449e3fb83f795b5d0a8437aead2f874ca89c96576caf4be3af6", size = 618315, upload-time = "2026-06-26T19:10:06.055Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a0/68afd1ebad40db87dac0a28ffa120726b98bf9c7c40c481b0f63c105d298/greenlet-3.5.3-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:e18619ba655ac05d78d80fc83cac4ba892bd6927b99e3b8237aee861aaacc8bb", size = 626155, upload-time = "2026-06-26T19:24:14.44Z" }, + { url = "https://files.pythonhosted.org/packages/78/2b/28ed29463522fdbe4c15b1f63922041626a7478316b34ab4adda3f0a4aba/greenlet-3.5.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8540f1e6205bd13ca0ce685581037219ca54a1b41a0a15d228c6c9b8ad5903d7", size = 617381, upload-time = "2026-06-26T18:32:16.077Z" }, + { url = "https://files.pythonhosted.org/packages/07/7f/e327d912239ec4b3b49999e3967389bcf1ee8722b9ee9194d2752ecd558a/greenlet-3.5.3-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:d27c0c653a60d9535f690226474a5cc1036a8b0d7b57504d1c4f89c44a07a80c", size = 421083, upload-time = "2026-06-26T19:25:35.804Z" }, + { url = "https://files.pythonhosted.org/packages/2a/7b/ad04e9d1337fc04965dc9fc616b6a72cb65a24b800a014c011ec812f5489/greenlet-3.5.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:7ef56fe650f50575bf843acde967b9c567687f3c22340941a899b7bc56e956a8", size = 1577771, upload-time = "2026-06-26T19:09:01.537Z" }, + { url = "https://files.pythonhosted.org/packages/d8/33/6c87ab7ba663f70ca21f3022aad1ffe56d3f3e0521e836c2415e13abcc3c/greenlet-3.5.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:5121af01cf911e70056c00d4b46d5e9b5d1415550038573d744138bacb59e6b8", size = 1644048, upload-time = "2026-06-26T18:31:42.996Z" }, + { url = "https://files.pythonhosted.org/packages/1c/35/f0d8ee998b422cf8693b270f098e55d8d4ec8006b061b333f54f177d28d9/greenlet-3.5.3-cp311-cp311-win_amd64.whl", hash = "sha256:0f41e4a05a3c0cb31b17023eff28dd111e1d16bf7d7d00406cd7df23f31398a7", size = 239137, upload-time = "2026-06-26T18:23:21.664Z" }, + { url = "https://files.pythonhosted.org/packages/fb/96/b9820295576ef18c9edc404f10e260ae7215ceaf3781a54b720ed2627862/greenlet-3.5.3-cp311-cp311-win_arm64.whl", hash = "sha256:ec6f1af59f6b5f3fc9678e2ea062d8377d22ac644f7844cb7a292910cf12ff44", size = 237630, upload-time = "2026-06-26T18:24:00.281Z" }, + { url = "https://files.pythonhosted.org/packages/5d/6e/4c37d51a2b7f82d2ff11bb6b5f7d766d9a011726624af255e843727627a3/greenlet-3.5.3-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:719757059f5a53fd0dde23f78cffeafcdd97b21c850ddb7ca684a3c1a1f122e2", size = 288685, upload-time = "2026-06-26T18:22:08.977Z" }, + { url = "https://files.pythonhosted.org/packages/7a/73/815dd90131c1b71ebdf53dbc7c276cafec2a1173b97559f97aba72724a87/greenlet-3.5.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efa9f765dd09f9d0cdac651ffdf631ee59ec5dc6ee7a73e0c012ba9c52fbdf5b", size = 604761, upload-time = "2026-06-26T19:07:10.114Z" }, + { url = "https://files.pythonhosted.org/packages/9f/57/079cfe76bcef36b153b25607ee91c6fcb58f17f8b23c86bbbeabe0c88d72/greenlet-3.5.3-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:7faba15ac005376e02a0384504e0243be3370ce010296a44a820feb342b505ab", size = 617044, upload-time = "2026-06-26T19:10:07.25Z" }, + { url = "https://files.pythonhosted.org/packages/fb/fb/d97dc261209c80744b7c8132693a30d70ec6e7315e632cb0a10b3fec94dd/greenlet-3.5.3-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5795cd1101371140551c645f2d408b8d3c01a5a29cf8a9bce6e759c983682d23", size = 622351, upload-time = "2026-06-26T19:24:16.32Z" }, + { url = "https://files.pythonhosted.org/packages/37/87/b4d095775a3fb1bcafbb483fc206b27ebb785724c83051447737085dc54e/greenlet-3.5.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:87142215824be6ac05e2e8e2786eec307ccbc27c36723c3881959df654af6861", size = 614244, upload-time = "2026-06-26T18:32:17.594Z" }, + { url = "https://files.pythonhosted.org/packages/8e/ac/e5fee13cbbd0e8de312d9a146584b8a51891c68847330ef9dc8b5109d23f/greenlet-3.5.3-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:af4923b3096e26a36d7e9cf24ab88083a20f97d191e3b97f253731ce9b41b28c", size = 425395, upload-time = "2026-06-26T19:25:37.144Z" }, + { url = "https://files.pythonhosted.org/packages/8a/70/7559b609683650fa2b95b8ab84b4ab0b26556a635d19675e12aa832d826d/greenlet-3.5.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:215275b1b49320987352e6c1b054acca0064f965a2c66992bed9a6f7d913f149", size = 1574210, upload-time = "2026-06-26T19:09:03.077Z" }, + { url = "https://files.pythonhosted.org/packages/ae/73/be55392074c60fc37655ca40fa6022457bfbf6718e9e342a7b0b41f96dd2/greenlet-3.5.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:6b1b0eed82364b0e32c4ea0f221452d33e6bb17ae094d9f72aed9851812747ea", size = 1638627, upload-time = "2026-06-26T18:31:44.748Z" }, + { url = "https://files.pythonhosted.org/packages/14/40/c57489acf8e37d74e2913d4eff63aa0dba17acccc4bdeef874dde2dbbec9/greenlet-3.5.3-cp312-cp312-win_amd64.whl", hash = "sha256:cde8adafa2365676f74a979744629589999093bc86e2484214f58e61df08902c", size = 239882, upload-time = "2026-06-26T18:23:27.518Z" }, + { url = "https://files.pythonhosted.org/packages/71/fd/6fea0e3d6600f785069481ee637e09378dd4118acdfd38ad88ae2db31c98/greenlet-3.5.3-cp312-cp312-win_arm64.whl", hash = "sha256:c4e7b79d83805475f0102008843f6eb45fd3bb0b2e88c774adab5fbaab27117d", size = 238211, upload-time = "2026-06-26T18:22:37.671Z" }, +] + +[[package]] +name = "grpc-google-iam-v1" +version = "0.14.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos", extra = ["grpc"] }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/4f/d098419ad0bfc06c9ce440575f05aa22d8973b6c276e86ac7890093d3c37/grpc_google_iam_v1-0.14.4.tar.gz", hash = "sha256:392b3796947ed6334e61171d9ab06bf7eb357f554e5fc7556ad7aab6d0e17038", size = 23706, upload-time = "2026-04-01T01:57:49.813Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/89/22/c2dd50c09bf679bd38173656cd4402d2511e563b33bc88f90009cf50613c/grpc_google_iam_v1-0.14.4-py3-none-any.whl", hash = "sha256:412facc320fcbd94034b4df3d557662051d4d8adfa86e0ddb4dca70a3f739964", size = 32675, upload-time = "2026-04-01T01:57:47.69Z" }, +] + +[[package]] +name = "grpcio" +version = "1.82.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b6/19/e29d3979b420b92d516ee97f0bff4fb88cbb3d724791318f50beb55db549/grpcio-1.82.0.tar.gz", hash = "sha256:bfe3247e0bb598585ce26565730970d21bccf3c9dc547dc6703a1a3c7888e8e1", size = 13184479, upload-time = "2026-07-06T04:22:54.421Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/30/7769be12fd4cc903de34e847bacd5066ea15d66d1f2cd764a2e2c406a1c6/grpcio-1.82.0-cp310-cp310-linux_armv7l.whl", hash = "sha256:d5715a36f16ee57361612833f9b630bc2db52b4be7c6b403266ac7b26813536d", size = 6177083, upload-time = "2026-07-06T04:20:38.876Z" }, + { url = "https://files.pythonhosted.org/packages/62/77/ec3caba0124bb66efff3fe044b162b4a6bd0b1627eb906981213bc73ef45/grpcio-1.82.0-cp310-cp310-macosx_11_0_universal2.whl", hash = "sha256:e00f6e6b371075bc79e94c3447496c1dd1aff3b91a01b24e59db49d3bf1ff795", size = 11961120, upload-time = "2026-07-06T04:20:43.36Z" }, + { url = "https://files.pythonhosted.org/packages/90/3c/9efe957a904ebd651eb8af35e0e7d167884ef0f518f9ebbb0f1772da1d1d/grpcio-1.82.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:6e5010ec0a09242258ad4949daa131503370a72096461968ced25b51d7988401", size = 6754795, upload-time = "2026-07-06T04:20:46.055Z" }, + { url = "https://files.pythonhosted.org/packages/4a/fc/dbee9432f6acd5af168c173649bac67bf1f6ba28f01c39dd0f0d7b133813/grpcio-1.82.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:5c500848925494554c5d7934cd8452d874fe3a831c475b2b7b023872e13f49bd", size = 7484528, upload-time = "2026-07-06T04:20:48.164Z" }, + { url = "https://files.pythonhosted.org/packages/36/84/72040022f7f94759093695fa7703987ad93e9aae0d522115ee3fc0ad47f2/grpcio-1.82.0-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:4fd4843bd7eb04b8b409dafb68d1f1c3666d6b350e3e489f847bea1b4b916ac5", size = 6919051, upload-time = "2026-07-06T04:20:50.38Z" }, + { url = "https://files.pythonhosted.org/packages/86/3e/c18283d9a176e2b665649d84cb540ac19c936018454b138a3e42626b96fd/grpcio-1.82.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:8ec9bc648dc2c862bdc8ca7c87b973474b00a7fa5f8eeea0ec504f3490aa85f5", size = 7525850, upload-time = "2026-07-06T04:20:52.658Z" }, + { url = "https://files.pythonhosted.org/packages/14/b8/1b9ec87ceb4e9250d9e767be62a37556fe95c39ebc08bab2cb202b4f6ea7/grpcio-1.82.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:3933d68934324e34692a2096ebf653174ed724eb44261a742d956c592ee40a1c", size = 8565118, upload-time = "2026-07-06T04:20:54.704Z" }, + { url = "https://files.pythonhosted.org/packages/6e/42/7b47639037f38a56d85c332cf1613773c497371d64651e97902b9820ee88/grpcio-1.82.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:682b7bb01a02ccbdd085a220745e38990baa8cab6fa3b2a7a739f478c90a894f", size = 7933879, upload-time = "2026-07-06T04:20:57.264Z" }, + { url = "https://files.pythonhosted.org/packages/82/ab/575286ad775d239d52ede8e7c063f70106380474f9e268f173d9955a4687/grpcio-1.82.0-cp310-cp310-win32.whl", hash = "sha256:1b9c8eade1caa69682f21a1f49ccbb0f5258c5e4e13fe963c23e6778da9948cd", size = 4257306, upload-time = "2026-07-06T04:20:59.566Z" }, + { url = "https://files.pythonhosted.org/packages/c4/59/b178fbc0c91af4b3291b0a8d60394116bcd24d57e6c3215e2737f11009af/grpcio-1.82.0-cp310-cp310-win_amd64.whl", hash = "sha256:fd8ebfd420efa12f07d6a5f39ecf3538bd1e8d9d53cfa7192457731ac4580953", size = 5006574, upload-time = "2026-07-06T04:21:01.651Z" }, + { url = "https://files.pythonhosted.org/packages/b7/ed/dfba8843c9e0cbf5b3ad33998fab400a6290e29432c5a2c94e684ebbfadf/grpcio-1.82.0-cp311-cp311-linux_armv7l.whl", hash = "sha256:64be5bea5f32b1b13c81d8f322bd49ab22d388b87b5c146050c4faf2769c2036", size = 6181469, upload-time = "2026-07-06T04:21:04.208Z" }, + { url = "https://files.pythonhosted.org/packages/ce/41/fe3cc2de8ccdf0b6a8a9939d731c8bdab37f80c96581237de359baa37bbe/grpcio-1.82.0-cp311-cp311-macosx_11_0_universal2.whl", hash = "sha256:03c0f3085e30e51aa4592a2a0b8ee518c9fb1593eb0368f57d7ccfdda2a1cff1", size = 11971108, upload-time = "2026-07-06T04:21:06.634Z" }, + { url = "https://files.pythonhosted.org/packages/27/49/896d665121bd0a806d62a5bacf93c0db2f7097b29bc52bfab76141589f68/grpcio-1.82.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:bc428d9825f1f83e61c65c8e6fb662384105022231938d6775e1b6cfb2bf517a", size = 6760133, upload-time = "2026-07-06T04:21:09.779Z" }, + { url = "https://files.pythonhosted.org/packages/78/1a/49739ab1be3f66106f54af46da599f2be9fdb79d4fc52e4d5a43a73cfc92/grpcio-1.82.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:4a9389c1b3568b1d6b8c1d85d43eea701814e59280dd955ea0a2d2d65b90cb24", size = 7484373, upload-time = "2026-07-06T04:21:11.942Z" }, + { url = "https://files.pythonhosted.org/packages/d4/a9/53cc88d792b318ec8ed924791cde109096a4174e6e2c115231ece5b69a9a/grpcio-1.82.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:848774370f0783f88e1fa9888f972fa61ab1ec985fffe2668f53bccfa51ef6cb", size = 6924263, upload-time = "2026-07-06T04:21:14.864Z" }, + { url = "https://files.pythonhosted.org/packages/f3/23/d4ea910fcfbd62ad4a7efde95f0fbfec9fe99595be9b58a1a6d67c57c4ff/grpcio-1.82.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:743390c02fb9b565351fc4429b3385c84d851626df11d91a537636b02eaa67df", size = 7531845, upload-time = "2026-07-06T04:21:17.674Z" }, + { url = "https://files.pythonhosted.org/packages/f0/a6/bc6503929c332ae9c74ccf74c57fb67c6b2d9e6ed27bfddb0888d812df52/grpcio-1.82.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:b53959e9af6618b10b46dba4ac82706c4ee90443e95a28004c014c2532d7e053", size = 8568207, upload-time = "2026-07-06T04:21:19.868Z" }, + { url = "https://files.pythonhosted.org/packages/d1/a5/7529b811efd1cb3181bc789d22ec9403b27aa3d3d8acb0b122987036143a/grpcio-1.82.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8045b89d863b5a271e65413361f75dddd70eeab6bf79f2b0e0eaeeb0900d8d24", size = 7938767, upload-time = "2026-07-06T04:21:22.597Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b3/1fa12730f95458fba4319b7935fc4c02a604404ea27f74756c51bf73a263/grpcio-1.82.0-cp311-cp311-win32.whl", hash = "sha256:24310aaf1f96a5327fc0d8e00fc98f0e9f90be8e09cc51becd2553d4b823d286", size = 4256371, upload-time = "2026-07-06T04:21:25.157Z" }, + { url = "https://files.pythonhosted.org/packages/60/10/71202ae4c1cade358a07436c010c145210bc2a730a731e5d297a2dac4f6e/grpcio-1.82.0-cp311-cp311-win_amd64.whl", hash = "sha256:ddcd5f8db890c5c822e4c0b89d641b1db6a0c7255fff02535cbe77c4dabf450f", size = 5009634, upload-time = "2026-07-06T04:21:27.282Z" }, + { url = "https://files.pythonhosted.org/packages/2f/e6/9ce68bc431224177b6f506cfb4896a742119c51255143069970955b6510b/grpcio-1.82.0-cp312-cp312-linux_armv7l.whl", hash = "sha256:03cce11532da292215cd8e5f444de91982e39dfb41a916e0e0f91a5c128588ea", size = 6144680, upload-time = "2026-07-06T04:21:29.808Z" }, + { url = "https://files.pythonhosted.org/packages/59/93/00ecf28e1be7a70b4b4d148d3a551b6c9a37024a669c3650a2c374c64026/grpcio-1.82.0-cp312-cp312-macosx_11_0_universal2.whl", hash = "sha256:01336fe31d1ea5d5154b0d803eb3584e69fb96e0e657acc87bd4d48d6abc9587", size = 11952213, upload-time = "2026-07-06T04:21:32.347Z" }, + { url = "https://files.pythonhosted.org/packages/38/05/9be6bf4cddb5b5f39c0748cdf5639525cd4116a157c8f3802c9217e54882/grpcio-1.82.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:fe56f1bea709ddb2531fbd510a2dd6040e993985507c3b2bf3404507aee989b1", size = 6710770, upload-time = "2026-07-06T04:21:35.382Z" }, + { url = "https://files.pythonhosted.org/packages/00/97/62c0969e993673ebef16d526db2504f38bc4c73cf2593c28746791ab7956/grpcio-1.82.0-cp312-cp312-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:77a5d8fe331376c7aaa4e06e903a43bd144de4f98c6e414e13cbc5d64e5aa61e", size = 7450671, upload-time = "2026-07-06T04:21:37.923Z" }, + { url = "https://files.pythonhosted.org/packages/67/1f/d83d9fbaaef2b6ebbf70a6e467000f13f92b4cf0b84c561c162b43128439/grpcio-1.82.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9ce80ea66c803398fde9c5b1fd925920c9742da7f10f8b85acac0adac3e4d7e0", size = 6886855, upload-time = "2026-07-06T04:21:40.527Z" }, + { url = "https://files.pythonhosted.org/packages/c5/36/5ed2e28b8c5f00599c7d5e94d5f82c32cf73a6fa42d13c2900cb37c861ec/grpcio-1.82.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4665dc8c9ec30acff455e2b15c47b825f18647c555483aa1ccf670adead8adcc", size = 7501322, upload-time = "2026-07-06T04:21:43.78Z" }, + { url = "https://files.pythonhosted.org/packages/89/4e/69113709e14e24289940d6aef067b797c73c8c96f580683af7d5f09b22b0/grpcio-1.82.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:4405d19ecfc7a8caa9043ff5a651e1871b54fc620f917de5dede7e6fb78e9e14", size = 8536896, upload-time = "2026-07-06T04:21:46.387Z" }, + { url = "https://files.pythonhosted.org/packages/30/f6/08bd6eb89a558f0f59dacaef747afda7c21e2c2ecf138ae2ec533dea8aeb/grpcio-1.82.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:30e580c19178609799660f52b1e1eb09248969be20dc44caaa4dcaa3e8450dd9", size = 7913890, upload-time = "2026-07-06T04:21:49.733Z" }, + { url = "https://files.pythonhosted.org/packages/d5/a1/04b467e2ffc93f8e50b660bc6f47c3c8e9ba7603104a741e3d5663a261d4/grpcio-1.82.0-cp312-cp312-win32.whl", hash = "sha256:dbbd83dbaa856b387a4eba74ec3add7f594f090d3b4d390d829dd5834816aae4", size = 4240969, upload-time = "2026-07-06T04:21:52.281Z" }, + { url = "https://files.pythonhosted.org/packages/25/3c/15d3601384d5937e8d9fbe6d8e7b8171008d649744dd7b6c864932937ec9/grpcio-1.82.0-cp312-cp312-win_amd64.whl", hash = "sha256:73176d270699d76a9dc3753f25e01c19fb98f830f826a506e917d83629f1b39b", size = 5001575, upload-time = "2026-07-06T04:21:54.839Z" }, +] + +[[package]] +name = "grpcio-status" +version = "1.82.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "googleapis-common-protos" }, + { name = "grpcio" }, + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/07/c3/42148fdb28747b6c12df1351dece3fd574262fa14b180eca9821428626df/grpcio_status-1.82.0.tar.gz", hash = "sha256:ea0cbc12c52a902cb33ba56fb3233dcfad53ffead08f4a659b1752d473a6a0ac", size = 13902, upload-time = "2026-07-06T04:26:47.864Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ad/f3/fe7e1f57f170ed6cae20eecc0dea62e9de862e68adede80a6cd54a9b4dfa/grpcio_status-1.82.0-py3-none-any.whl", hash = "sha256:d41e45164ae2c265b268aebd9d86defa292a1ba91d86a548bad1f059c4645676", size = 14634, upload-time = "2026-07-06T04:26:38.672Z" }, +] + +[[package]] +name = "h11" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/01/ee/02a2c011bdab74c6fb3c75474d40b3052059d95df7e73351460c8588d963/h11-0.16.0.tar.gz", hash = "sha256:4e35b956cf45792e4caa5885e69fba00bdbc6ffafbfa020300e549b208ee5ff1", size = 101250, upload-time = "2025-04-24T03:35:25.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/4b/29cac41a4d98d144bf5f6d33995617b185d14b22401f75ca86f384e87ff1/h11-0.16.0-py3-none-any.whl", hash = "sha256:63cf8bbe7522de3bf65932fda1d9c2772064ffb3dae62d55932da54b31cb6c86", size = 37515, upload-time = "2025-04-24T03:35:24.344Z" }, +] + +[[package]] +name = "h2" +version = "4.3.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "hpack" }, + { name = "hyperframe" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1d/17/afa56379f94ad0fe8defd37d6eb3f89a25404ffc71d4d848893d270325fc/h2-4.3.0.tar.gz", hash = "sha256:6c59efe4323fa18b47a632221a1888bd7fde6249819beda254aeca909f221bf1", size = 2152026, upload-time = "2025-08-23T18:12:19.778Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/b2/119f6e6dcbd96f9069ce9a2665e0146588dc9f88f29549711853645e736a/h2-4.3.0-py3-none-any.whl", hash = "sha256:c438f029a25f7945c69e0ccf0fb951dc3f73a5f6412981daee861431b70e2bdd", size = 61779, upload-time = "2025-08-23T18:12:17.779Z" }, +] + +[[package]] +name = "hf-xet" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4b/2d/57fd21d84d93efb4bd0b962383790e19dd1bc053501b4264c97903b4e83e/hf_xet-1.5.1.tar.gz", hash = "sha256:51ef4500dab3764b41135ee1381a4b62ce56fc54d4c92b719b59e597d6df5bf6", size = 876636, upload-time = "2026-06-08T23:02:53.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7a/d8/5e54cf37434759d1f4f2ba9b66077ff9d4c4e1f37b6bd7975da5c40d94ab/hf_xet-1.5.1-cp37-abi3-macosx_10_12_x86_64.whl", hash = "sha256:6abd35c3221eff63836618ddfb954dcf84798603f71d8e33e3ed7b04acfdbe6e", size = 4077794, upload-time = "2026-06-08T23:02:40.656Z" }, + { url = "https://files.pythonhosted.org/packages/35/94/4b2ecfbad8f8b04701a23aefb62f540b9137d058b7e1dbef16a32676f0e9/hf_xet-1.5.1-cp37-abi3-macosx_11_0_arm64.whl", hash = "sha256:94e761bbd266bf4c03cee73753916062665ce8365aa40ed321f45afcb934b41e", size = 3845354, upload-time = "2026-06-08T23:02:42.702Z" }, + { url = "https://files.pythonhosted.org/packages/de/cc/f99f4bc7295023d7bd9ebbfd51f75cc530ca262c1227666268b8208f4b77/hf_xet-1.5.1-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:892e3a3a3aecc12aded8b93cf4f9cd059282c7de0732f7d55026f3abdf474350", size = 4514864, upload-time = "2026-06-08T23:02:44.497Z" }, + { url = "https://files.pythonhosted.org/packages/cd/6e/21f7e5a2381278bd3b7b7a5a4d90038518bb6308a0c1daf5d9f8268bb178/hf_xet-1.5.1-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:a93df2039190502835b1db8cd7e178b0b7b889fe9ab51299d5ced26e0dd879a4", size = 4303784, upload-time = "2026-06-08T23:02:46.203Z" }, + { url = "https://files.pythonhosted.org/packages/35/0e/f992bb6927ac1cb30ef74e62268f551f338bc32b2191f7c96a44c6f7283e/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:0c97106032ef70467b4f6bc2d0ccc266d7613ee076afc56516c502f87ce1c4a6", size = 4500703, upload-time = "2026-06-08T23:02:47.628Z" }, + { url = "https://files.pythonhosted.org/packages/fb/d1/90a498d05447980b977b1669246eeeeae4cfb0ea3e7a286eaba627f91bf9/hf_xet-1.5.1-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:6208adb15d192b90e4c2ad2a27ed864359b2cb0f2494eb6d7c7f3699ac02e2bf", size = 4719498, upload-time = "2026-06-08T23:02:49.268Z" }, + { url = "https://files.pythonhosted.org/packages/6d/b6/20f99cfe97cc663a711f7b33cc21d4793e51968e9a26125b4afcd77315ba/hf_xet-1.5.1-cp37-abi3-win_amd64.whl", hash = "sha256:f7b3002f95d1c13e24bcb4537baa8f0eb3838957067c91bb4959bc004a6435f5", size = 4026419, upload-time = "2026-06-08T23:02:50.829Z" }, + { url = "https://files.pythonhosted.org/packages/f9/fa/77453694888f03e5a8c8852d1514a0894d8e81c622d39edbaf308ea0dcf4/hf_xet-1.5.1-cp37-abi3-win_arm64.whl", hash = "sha256:93d090b57b211133f6c0dab0205ef5cb6d89162979ba75a74845045cc3063b8e", size = 3855178, upload-time = "2026-06-08T23:02:52.452Z" }, +] + +[[package]] +name = "hpack" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/5b/fcabf6028144a8723726318b07a32c2f3314acdff6265743cf08a344b18e/hpack-4.2.0.tar.gz", hash = "sha256:0895cfa3b5531fc65fe439c05eb65144f123bf7a394fcaa56aa423548d8e45c0", size = 51300, upload-time = "2026-06-23T18:34:46.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/b4/4a9fcfb2aef6ba44d9073ecd301443aa00b3dac95de5619f2a7de7ec8a91/hpack-4.2.0-py3-none-any.whl", hash = "sha256:858ac0b02280fa582b5080d68db0899c62a80375e0e5413a74970c5e518b6986", size = 34246, upload-time = "2026-06-23T18:34:45.472Z" }, +] + +[[package]] +name = "httpcore" +version = "1.0.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/94/82699a10bca87a5556c9c59b5963f2d039dbd239f25bc2a63907a05a14cb/httpcore-1.0.9.tar.gz", hash = "sha256:6e34463af53fd2ab5d807f399a9b45ea31c3dfa2276f15a2c3f00afff6e176e8", size = 85484, upload-time = "2025-04-24T22:06:22.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7e/f5/f66802a942d491edb555dd61e3a9961140fd64c90bce1eafd741609d334d/httpcore-1.0.9-py3-none-any.whl", hash = "sha256:2d400746a40668fc9dec9810239072b40b4484b640a8c38fd654a024c7a1bf55", size = 78784, upload-time = "2025-04-24T22:06:20.566Z" }, +] + +[[package]] +name = "httptools" +version = "0.8.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/43/e5/d471fcb0e14523fe1c3f4ba58ca52480e7bd70ad7109a3846bc75892f7fb/httptools-0.8.0.tar.gz", hash = "sha256:6b2a32f18d97e16e90827d7a819ffa8dbd8cc245fc4e1fa9d1095b54ef4bd999", size = 271342, upload-time = "2026-05-25T22:17:48.841Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/b9/be66eb0decd730d89b9c94f930e4b8d87787b05724bb84af98bfd825f72c/httptools-0.8.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:bf3b6f807c8541503cecfbb8a8dffb385640d0d96102f3d112aa8740f9b7c826", size = 208805, upload-time = "2026-05-25T22:16:50.434Z" }, + { url = "https://files.pythonhosted.org/packages/9d/f7/b4d41eaae2869d31356bc4bbf546f44fae83ff298af0a043ca0625b06773/httptools-0.8.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da684f2e1aa2ee9bdcb083f3f3a68c5956750b375bc5df864d3a5f0c42a40b77", size = 113527, upload-time = "2026-05-25T22:16:51.672Z" }, + { url = "https://files.pythonhosted.org/packages/e6/e4/77487e14fc7be47180fd0eb4267c7486d0cc59b74031839a3daf8650136b/httptools-0.8.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a6f21e2a3b0067bbe7f67e34cfd16276af556e5e52f4c7503be0cb5f90e905e4", size = 450035, upload-time = "2026-05-25T22:16:53.313Z" }, + { url = "https://files.pythonhosted.org/packages/da/72/5a8f787e323f56fbd86c32a4be92a86776e4cfe8b4317db999f452028362/httptools-0.8.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ea897f0c729581ebf72131a438a7932d9b14efef72d75ada966700cac3caaeb", size = 451101, upload-time = "2026-05-25T22:16:54.696Z" }, + { url = "https://files.pythonhosted.org/packages/ed/41/b44a25560955197674b6744cb903664300e239235a5eaa69df0890d87054/httptools-0.8.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:c0d726cc107fceb7d45f978483b4b70dd8caa836f5914d3434bb18628eb73813", size = 436140, upload-time = "2026-05-25T22:16:56.239Z" }, + { url = "https://files.pythonhosted.org/packages/74/b0/054aac84c03d7e097bf4c605fb7e74eec3d65c0276adf64ee97f3a103ff5/httptools-0.8.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:9878eb2785ba5eb70631ad269b37976f73d647955e26c91d490eb8a4edfda4ba", size = 437041, upload-time = "2026-05-25T22:16:57.716Z" }, + { url = "https://files.pythonhosted.org/packages/bb/e8/86b85bbc0ac7892232f1a99ab96a9aa71936984fa06adfc0afc83ca7789e/httptools-0.8.0-cp310-cp310-win_amd64.whl", hash = "sha256:b205e5f5523fa039679da0dfe5a10132b2a4abeae6a86fdd1ddc035f7f836557", size = 90454, upload-time = "2026-05-25T22:16:58.871Z" }, + { url = "https://files.pythonhosted.org/packages/f8/d2/c3eedaef57de65c3cc5f8dc244cf12d09c84ad258a479055aad6db23206c/httptools-0.8.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:ed377e64805bdba4943c82717333f8f8603a13b09aff9cead2717c6c817fb168", size = 208428, upload-time = "2026-05-25T22:16:59.717Z" }, + { url = "https://files.pythonhosted.org/packages/f1/94/dfe435d90d0ef61ec0f2cc3d480eef78c59727c6c2ce039f433882f6131a/httptools-0.8.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:9518c406d7b310f05adb1a37f80acabac40504a575d7c0da6d3e365c695ac20d", size = 113366, upload-time = "2026-05-25T22:17:00.795Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d4/13025f1a56e615dcb331e0bbe2d9a1143212b58c263385fc5d2e558f5bac/httptools-0.8.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:57278e6fa0424c42a8a3e454828ab4f0aff27b40cddf9679579b98c6dce6a376", size = 464676, upload-time = "2026-05-25T22:17:02.014Z" }, + { url = "https://files.pythonhosted.org/packages/bf/95/4c1c26c0b985f8a3331682d802598f14e32dc41bf7509266eb2c04ad4801/httptools-0.8.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bbb8caadb2b742d293169d2b458b5c001ef70e3158704aa3d3ef9597624c5d1d", size = 464235, upload-time = "2026-05-25T22:17:03.109Z" }, + { url = "https://files.pythonhosted.org/packages/a2/82/6735be2b0ca527718c431cdb8e5f70c3862c0844a687df0f572c51e11497/httptools-0.8.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:52dd695b865fe96d9d2b16b64a895f3f57bf3cb064e8383cd3b5713a069e8085", size = 449809, upload-time = "2026-05-25T22:17:04.443Z" }, + { url = "https://files.pythonhosted.org/packages/b5/f9/5811c74f37a758c8a4aa3dc430375119d335947e883efc4664d8f3559a41/httptools-0.8.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:20b4aac66ff65f7db06a375808b78f42a94970aa22e826b3cb2b43eb09174124", size = 452174, upload-time = "2026-05-25T22:17:05.476Z" }, + { url = "https://files.pythonhosted.org/packages/cc/94/97b75870dea07b71e3ec535cebe525b08d723152e4c7d13fa887e51f4de2/httptools-0.8.0-cp311-cp311-win_amd64.whl", hash = "sha256:a1b4c8e7a489a0d750d91894e9a8cdc295838f1924c0ca903ae993456fddec07", size = 90991, upload-time = "2026-05-25T22:17:06.75Z" }, + { url = "https://files.pythonhosted.org/packages/14/88/1d21a36da8f5cb0fa49eafd4b169eba5608d57e75bbcf61845cbc6243216/httptools-0.8.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:880490234c10f70a9830743097e8958d6e4b9f5a0ffc24515023afeef984054d", size = 208247, upload-time = "2026-05-25T22:17:07.843Z" }, + { url = "https://files.pythonhosted.org/packages/a5/42/cc4feea2945cb3051038f090c9b36bd5b8a9d7f5a894a506a8983e33fd1c/httptools-0.8.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:5931891fb7b441b8a3853cf1b85c82c903defce084dd5f6771ca46e31bf862c5", size = 113064, upload-time = "2026-05-25T22:17:09.136Z" }, + { url = "https://files.pythonhosted.org/packages/e3/a6/febbb8b8db0f58b38e44ad6cb946e6a255ae49b55f2e8543408fb7501ccd/httptools-0.8.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:b15fc622b0f869d19207c4089a501d9bcc63ca5e071ffdd2f03f922df882dcb2", size = 523851, upload-time = "2026-05-25T22:17:10.106Z" }, + { url = "https://files.pythonhosted.org/packages/b7/e4/f90a0df0b83beff265b7e3b65f2a4cefd95792d4be0ac3e16049f2acd3c2/httptools-0.8.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:425f83884fd6343828d8c565f046cb72b6d19063f6924093e11bcd8e1548cd09", size = 518842, upload-time = "2026-05-25T22:17:11.218Z" }, + { url = "https://files.pythonhosted.org/packages/9e/2d/0c9ac76dd2c893841fbf6498d6acec4f2442e1b7067f6e3e316a80e494e8/httptools-0.8.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ef7c3c97f4311c7be57e2986629df89d49cb434dbff78eafcd48c2bff986b15a", size = 501238, upload-time = "2026-05-25T22:17:12.728Z" }, + { url = "https://files.pythonhosted.org/packages/ca/42/906adc91ae3a5fa9c59c0a2f21c139725bd7e5b41ae6acd485cd14123ebf/httptools-0.8.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a1afd7c9fbff0d9f5d489c4ce2768bd09c84a46ddefc7161e6aa82ae35c85745", size = 509567, upload-time = "2026-05-25T22:17:13.842Z" }, + { url = "https://files.pythonhosted.org/packages/05/0b/4240efeb672751ee5b9b380cb0e3fdc050bc05f68adc7a8aefc4fcd9a69a/httptools-0.8.0-cp312-cp312-win_amd64.whl", hash = "sha256:cd96f29b4bab1d42fa6e3d008711c75e0f79e94e06827330160e3a304227f150", size = 90918, upload-time = "2026-05-25T22:17:15.155Z" }, +] + +[[package]] +name = "httpx" +version = "0.28.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "certifi" }, + { name = "httpcore" }, + { name = "idna" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/df/48c586a5fe32a0f01324ee087459e112ebb7224f646c0b5023f5e79e9956/httpx-0.28.1.tar.gz", hash = "sha256:75e98c5f16b0f35b567856f597f06ff2270a374470a5c2392242528e3e3e42fc", size = 141406, upload-time = "2024-12-06T15:37:23.222Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2a/39/e50c7c3a983047577ee07d2a9e53faf5a69493943ec3f6a384bdc792deb2/httpx-0.28.1-py3-none-any.whl", hash = "sha256:d909fcccc110f8c7faf814ca82a9a4d816bc5a6dbfea25d6591d6985b8ba59ad", size = 73517, upload-time = "2024-12-06T15:37:21.509Z" }, +] + +[[package]] +name = "huggingface-hub" +version = "1.22.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "filelock" }, + { name = "fsspec" }, + { name = "hf-xet", marker = "platform_machine == 'AMD64' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'arm64' or platform_machine == 'x86_64'" }, + { name = "httpx" }, + { name = "packaging" }, + { name = "pyyaml" }, + { name = "tqdm" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/77/ea/dc54b4dda5841cb3a7812a178695be776e7c15c597887c2ed892f17d015a/huggingface_hub-1.22.0.tar.gz", hash = "sha256:e2dfe5fe1ec3b87ba2709aa34555b23e3f3f6ad4d7255238e13ddb8348e6bbfa", size = 914232, upload-time = "2026-07-03T09:46:44.685Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/64/9c/a1a377265abd8b823a2c661c665028ccb6b9fba1ca9d08e52ff679c20ecd/huggingface_hub-1.22.0-py3-none-any.whl", hash = "sha256:b09e19309ae09ee0a71892701c4fe70af39ab4e00817321dc62f2289a977249b", size = 765085, upload-time = "2026-07-03T09:46:42.832Z" }, +] + +[[package]] +name = "humanize" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0a/ea/13a1ef3c12d12662905801495283530251918b70d62d368f1d2e0272c70d/humanize-4.16.0.tar.gz", hash = "sha256:7dc2244a2f84a4bfb1d36c37bac80cd78e35cdc5c119206d87b018e1445f3a3f", size = 89515, upload-time = "2026-06-30T16:17:29.859Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b0/aa/0b7365d30fed43e7a3449aba1fe20a0a7174d9cf13e282af4e69ac825441/humanize-4.16.0-py3-none-any.whl", hash = "sha256:353eb2f34c09d098b2880eee8bef21832eae6d174f48c5762fff7e5fcb74d01d", size = 137209, upload-time = "2026-06-30T16:17:28.36Z" }, +] + +[[package]] +name = "hypercorn" +version = "0.18.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "h11" }, + { name = "h2" }, + { name = "priority" }, + { name = "taskgroup", marker = "python_full_version < '3.11'" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, + { name = "wsproto" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/01/39f41a014b83dd5c795217362f2ca9071cf243e6a75bdcd6cd5b944658cc/hypercorn-0.18.0.tar.gz", hash = "sha256:d63267548939c46b0247dc8e5b45a9947590e35e64ee73a23c074aa3cf88e9da", size = 68420, upload-time = "2025-11-08T13:54:04.78Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/93/35/850277d1b17b206bd10874c8a9a3f52e059452fb49bb0d22cbb908f6038b/hypercorn-0.18.0-py3-none-any.whl", hash = "sha256:225e268f2c1c2f28f6d8f6db8f40cb8c992963610c5725e13ccfcddccb24b1cd", size = 61640, upload-time = "2025-11-08T13:54:03.202Z" }, +] + +[[package]] +name = "hyperframe" +version = "6.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/02/e7/94f8232d4a74cc99514c13a9f995811485a6903d48e5d952771ef6322e30/hyperframe-6.1.0.tar.gz", hash = "sha256:f630908a00854a7adeabd6382b43923a4c4cd4b821fcb527e6ab9e15382a3b08", size = 26566, upload-time = "2025-01-22T21:41:49.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/48/30/47d0bf6072f7252e6521f3447ccfa40b421b6824517f82854703d0f5a98b/hyperframe-6.1.0-py3-none-any.whl", hash = "sha256:b03380493a519fce58ea5af42e4a42317bf9bd425596f7a0835ffce80f1a42e5", size = 13007, upload-time = "2025-01-22T21:41:47.295Z" }, +] + +[[package]] +name = "idna" +version = "3.18" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/cd/63/9496c57188a2ee585e0f1db071d75089a11e98aa86eb99d9d7618fc1edce/idna-3.18.tar.gz", hash = "sha256:ffb385a7e039654cef1ab9ef32c6fafe283c0c0467bba1d9029738ce4a14a848", size = 196711, upload-time = "2026-06-02T14:34:07.794Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1e/5e/d4e9f1a599fb8e573b7b87160658329fbf28d19eac2718f51fc3def3aa5a/idna-3.18-py3-none-any.whl", hash = "sha256:7f952cbe720b688055e3f87de14f5c3e5fdaa8bc3928985c4077ca689de849a2", size = 65455, upload-time = "2026-06-02T14:34:06.319Z" }, +] + +[[package]] +name = "imageio" +version = "2.37.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b1/84/93bcd1300216ea50811cee96873b84a1bebf8d0489ffaf7f2a3756bab866/imageio-2.37.3.tar.gz", hash = "sha256:bbb37efbfc4c400fcd534b367b91fcd66d5da639aaa138034431a1c5e0a41451", size = 389673, upload-time = "2026-03-09T11:31:12.573Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/fa/391e437a34e55095173dca5f24070d89cbc233ff85bf1c29c93248c6588d/imageio-2.37.3-py3-none-any.whl", hash = "sha256:46f5bb8522cd421c0f5ae104d8268f569d856b29eb1a13b92829d1970f32c9f0", size = 317646, upload-time = "2026-03-09T11:31:10.771Z" }, +] + +[[package]] +name = "imutils" +version = "0.5.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3f/d3/ecb4d108f6c1041d24842a345ee0123cd7f366ba75cf122601e856d42ba2/imutils-0.5.4.tar.gz", hash = "sha256:03827a9fca8b5c540305c0844a62591cf35a0caec199cb0f2f0a4a0fb15d8f24", size = 17240, upload-time = "2021-01-15T10:53:17.816Z" } + +[[package]] +name = "inflate64" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/3e/f3/41bb2901543abe7aad0b0b0284ae5854bb75f848cf406bf8a046bf525f67/inflate64-1.0.4.tar.gz", hash = "sha256:b398c686960c029777afc0ed281a86f66adb956cfc3fbf6667cc6453f7b407ce", size = 902542, upload-time = "2025-11-28T10:55:52.641Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/d5/5c13cfc7954ed716ae0e5e64c4f54be43f8c145b546472b67803feaa18a4/inflate64-1.0.4-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:f1a47837d4322e0684824f91eb635aa6fd1967584140c478b0a1aca7b11740d6", size = 58602, upload-time = "2025-11-28T10:54:21.346Z" }, + { url = "https://files.pythonhosted.org/packages/33/57/4d740b677cda81ec6f47c05b502ed15103c8a7d9c3e91ee93352d46fe69c/inflate64-1.0.4-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8600478542e2354d1ee7b5c57c957006cabacd8b787b4046951f487a2216e5c0", size = 35856, upload-time = "2025-11-28T10:54:22.629Z" }, + { url = "https://files.pythonhosted.org/packages/17/cd/ec3c058283706a43ab790e8d611a3a787a4f4cc4ae3faeafba6e2e216e36/inflate64-1.0.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:fb2b5a62579d074f38352a3494c3c6ac1a90516b75c5793c39303547f1fea925", size = 36007, upload-time = "2025-11-28T10:54:23.685Z" }, + { url = "https://files.pythonhosted.org/packages/24/83/90f7086f8078057a090db43459e478dc45e2d5ce2509f9c6a6a08100efa0/inflate64-1.0.4-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dcfafc572a642215894af1ec8d05949fa35eb7cb36d053aa97b11eccf1ae579e", size = 95055, upload-time = "2025-11-28T10:54:24.864Z" }, + { url = "https://files.pythonhosted.org/packages/95/d3/4f760f095ce8a9494d441b96a8735346141dd24f52fa573c971c0da1c958/inflate64-1.0.4-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:cb93159cb60aee8cab62541aa70e4c460f13359660a27a1a486518bba0153535", size = 96645, upload-time = "2025-11-28T10:54:26.308Z" }, + { url = "https://files.pythonhosted.org/packages/8c/2a/78ab2fcb02c13e3c8c93c2d82bf5eec1862b428bc6177dcc76ac4044408d/inflate64-1.0.4-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:89126ceb4d96e76842f4697017a9a3e750c34e029ddb360b3d8ca79a648d47f6", size = 92933, upload-time = "2025-11-28T10:54:27.563Z" }, + { url = "https://files.pythonhosted.org/packages/c5/1b/c9a2d84fc117dddee0749dc1b3ab9ed725bf92e866ef0ede0945a5128ef0/inflate64-1.0.4-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f70e6692617ec82500b203eefac8765302298ce7e73584fcf995bb9e23184530", size = 95898, upload-time = "2025-11-28T10:54:28.91Z" }, + { url = "https://files.pythonhosted.org/packages/bd/85/5879fa47122c7d5b563c6dacbd4a782bd9464405f69d46af01e02d4a3907/inflate64-1.0.4-cp310-cp310-win32.whl", hash = "sha256:d08cdda33341b4f992af60c12dc60e370e9993b80a936c17244a602711eeb727", size = 32940, upload-time = "2025-11-28T10:54:30.385Z" }, + { url = "https://files.pythonhosted.org/packages/a3/59/cef1b3505dc33d8cb9d115481923dec1de1372d29ac278622feecf9c03a1/inflate64-1.0.4-cp310-cp310-win_amd64.whl", hash = "sha256:950dd7fe53474df5f4699b8f099980027e812d55fd82d8e167d599822c3d27d6", size = 35541, upload-time = "2025-11-28T10:54:31.837Z" }, + { url = "https://files.pythonhosted.org/packages/72/13/d964fbfceeee6752c36c45645e5e9a9ef0dd70d4ce64e5e7316822e43382/inflate64-1.0.4-cp310-cp310-win_arm64.whl", hash = "sha256:bad20de249d6336793f6267880668dbb286ca5c6e6991795aa6344c817588068", size = 33460, upload-time = "2025-11-28T10:54:32.954Z" }, + { url = "https://files.pythonhosted.org/packages/39/e4/2fc07d71cf863ed4167e7d3eb7f89de0341ffe3ed3a62ff6cc4123bdbda6/inflate64-1.0.4-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:bccda9815b27623e805a34ee3ee4f46c93f0cc7ac621f9834d75f033fd79c27a", size = 58595, upload-time = "2025-11-28T10:54:34.338Z" }, + { url = "https://files.pythonhosted.org/packages/53/77/1119bb53e8f4c9c77f2a5e3ab7d8c3e905fcfc9912073962b9b4cbf72118/inflate64-1.0.4-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c11e2a3cb9d9b49620c9b0c806dd0c55daec3b6bb665299b770a68f01bfc5432", size = 35854, upload-time = "2025-11-28T10:54:35.796Z" }, + { url = "https://files.pythonhosted.org/packages/de/40/8b028a731f6fabbb49069a58f1aa5c3332688b57dcb8726f9e596661ce5b/inflate64-1.0.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e42def03ace8c58fd50b0df4f40241c45a2314c3876d020cce24acf958323c98", size = 36011, upload-time = "2025-11-28T10:54:37.208Z" }, + { url = "https://files.pythonhosted.org/packages/86/a3/5b67ef7fd5e7546d4c2be8a9a869c70d9fd525de1cfb2b4dc4b0855eeee8/inflate64-1.0.4-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7912927a509ca58d1a445ce4ff6e6e9f276dc1d72687386cdf7103bf590e785c", size = 98112, upload-time = "2025-11-28T10:54:38.616Z" }, + { url = "https://files.pythonhosted.org/packages/5b/6e/6443ea6c42f6b244c4e59cb43f16e6b903669f718a96e3f1985acf473dea/inflate64-1.0.4-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ec40c0383cbd84d845dcb785a48ae76eef43246c923f84fda380fdd5ea653d3c", size = 99549, upload-time = "2025-11-28T10:54:40.167Z" }, + { url = "https://files.pythonhosted.org/packages/e3/ce/e98577e0771b857b491a64a3f7495eb507e0752b80093068b69813088df1/inflate64-1.0.4-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:5b01539fea372c6078b9707d9121c12cb321e587e193f50e257ce06cf5b15e41", size = 95946, upload-time = "2025-11-28T10:54:41.318Z" }, + { url = "https://files.pythonhosted.org/packages/6b/3e/8165ff4051dff08b2cc8448dafd15a697564e84cf40f3ee0dc0df16eed16/inflate64-1.0.4-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:bf4e34e32a37a42e9cf8bd9681f89e3e37b218f97d8b8cc95bd065419bc8db13", size = 98766, upload-time = "2025-11-28T10:54:43.366Z" }, + { url = "https://files.pythonhosted.org/packages/79/b8/20cad309ded1d97195c5ad50e341b38ddc2e82f5c44ee7d000c4372c8b56/inflate64-1.0.4-cp311-cp311-win32.whl", hash = "sha256:2725ccc14b138f0ad622d0322b769f177f9edfe016ee9ed3404102935d39e7de", size = 32939, upload-time = "2025-11-28T10:54:44.507Z" }, + { url = "https://files.pythonhosted.org/packages/8c/32/be5cac018960157d33d61278377d590d5cc34922222cb0c4dc3284ce6eeb/inflate64-1.0.4-cp311-cp311-win_amd64.whl", hash = "sha256:7056148548c1f25dcb38251f88c19b4635a5f32af4c7bad00621c85509e3d8c0", size = 35535, upload-time = "2025-11-28T10:54:46.214Z" }, + { url = "https://files.pythonhosted.org/packages/13/36/9b130e45299d587f306178d65e950e1c8f60a09db8bb55c7cdce8fdda3b6/inflate64-1.0.4-cp311-cp311-win_arm64.whl", hash = "sha256:2ea7bdcad65e255b4596f84880f6e0c1756d6336d620e302653257defa407742", size = 33457, upload-time = "2025-11-28T10:54:47.258Z" }, + { url = "https://files.pythonhosted.org/packages/ed/33/5cfa7468960de1be0833e7e41adf5b7804a0aef2fb46f3679df3876bf3ab/inflate64-1.0.4-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:c8009e4a4918ee6c8cbc49e58fe159464895064cfdf0565fed3f49ca81e45272", size = 58619, upload-time = "2025-11-28T10:54:48.315Z" }, + { url = "https://files.pythonhosted.org/packages/cd/0a/583c7c2832da36e986c5758d0afb6f5944599e55c5b798b066a9ef63e581/inflate64-1.0.4-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:0d173a7a0e865bb7d19685c5b1ad2994712b8361b24136d7e94abeff58505647", size = 35865, upload-time = "2025-11-28T10:54:49.389Z" }, + { url = "https://files.pythonhosted.org/packages/72/4b/9c6acfbe900e5c8698132244c68036b0455bd2169f46e356c83dc0366f11/inflate64-1.0.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8bad992f2d034f5f7e36208e54502d1b0829ce772c898e5dc59109833420148a", size = 36019, upload-time = "2025-11-28T10:54:50.813Z" }, + { url = "https://files.pythonhosted.org/packages/7f/66/c0c3d3b4b863aab2c2ce631d219a8eb3b95b78acd5f40d3212f071e693db/inflate64-1.0.4-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6bfcf806912ced77a21394f7363805ecacd626b79f93cba87d505a48e88ede78", size = 98765, upload-time = "2025-11-28T10:54:52.273Z" }, + { url = "https://files.pythonhosted.org/packages/37/00/1a2351a85d36b26c5b2b8cfbb37ad86084c98f592dd7590f8577d8b33993/inflate64-1.0.4-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:62d1aac3aba094ae42e27ce7581b414c90f218248be0953b6aeb11a127225e5d", size = 100594, upload-time = "2025-11-28T10:54:53.684Z" }, + { url = "https://files.pythonhosted.org/packages/f7/3e/5d18ff5b86aaaf54117e1bb6ce15cb17163f56035f9c480e609d35f258ab/inflate64-1.0.4-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8065166f355122484f004225b379d403346bdae69ec624786a9334f025580675", size = 96745, upload-time = "2025-11-28T10:54:55.277Z" }, + { url = "https://files.pythonhosted.org/packages/84/ff/306d5d6aca1e04e596d2a504a59ff9a900623a6ec852f38aab99f384562d/inflate64-1.0.4-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94a95f32087d223d2e119ff5c7c264109e8d4cb7e421e7a688a899a6fe021b38", size = 99795, upload-time = "2025-11-28T10:54:56.485Z" }, + { url = "https://files.pythonhosted.org/packages/cf/ec/d4caa4bf3c9e520c15e900fee5a00fc523953843e14aa378ca1abfb2b4ea/inflate64-1.0.4-cp312-cp312-win32.whl", hash = "sha256:ad4fa490bb7dc2a4640a3adaa2d5950f4a465ba034bbcf184c2103646e58ad97", size = 32956, upload-time = "2025-11-28T10:54:57.642Z" }, + { url = "https://files.pythonhosted.org/packages/33/c4/c0de4e9bdf12e449360b710e9ab5b5248804610f382b538773cbd07b72bb/inflate64-1.0.4-cp312-cp312-win_amd64.whl", hash = "sha256:2c6befdf83d088a6e0d10d0873a9d4bfde2ce00ad7a52c8189cf303306f98030", size = 35577, upload-time = "2025-11-28T10:54:59.14Z" }, + { url = "https://files.pythonhosted.org/packages/80/07/03a5ef74ad3869b3c5af3b09216321f5a1a5a45265f7bd6d5abc669c7622/inflate64-1.0.4-cp312-cp312-win_arm64.whl", hash = "sha256:2b263c619469f90a75f29c421c53d31b208ad494a078235a8f6db2bc96583fdc", size = 33465, upload-time = "2025-11-28T10:55:00.568Z" }, +] + +[[package]] +name = "iniconfig" +version = "2.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/72/34/14ca021ce8e5dfedc35312d08ba8bf51fdd999c576889fc2c24cb97f4f10/iniconfig-2.3.0.tar.gz", hash = "sha256:c76315c77db068650d49c5b56314774a7804df16fee4402c1f19d6d15d8c4730", size = 20503, upload-time = "2025-10-18T21:55:43.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/cb/b1/3846dd7f199d53cb17f49cba7e651e9ce294d8497c8c150530ed11865bb8/iniconfig-2.3.0-py3-none-any.whl", hash = "sha256:f631c04d2c48c52b84d0d0549c99ff3859c98df65b3101406327ecc7d53fbf12", size = 7484, upload-time = "2025-10-18T21:55:41.639Z" }, +] + +[[package]] +name = "ipython" +version = "8.39.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "decorator" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { 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" }, + { name = "typing-extensions", marker = "python_full_version < '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/40/18/f8598d287006885e7136451fdea0755af4ebcbfe342836f24deefaed1164/ipython-8.39.0.tar.gz", hash = "sha256:4110ae96012c379b8b6db898a07e186c40a2a1ef5d57a7fa83166047d9da7624", size = 5513971, upload-time = "2026-03-27T10:02:13.94Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c0/56/4cc7fc9e9e3f38fd324f24f8afe0ad8bb5fa41283f37f1aaf9de0612c968/ipython-8.39.0-py3-none-any.whl", hash = "sha256:bb3c51c4fa8148ab1dea07a79584d1c854e234ea44aa1283bcb37bc75054651f", size = 831849, upload-time = "2026-03-27T10:02:07.846Z" }, +] + +[[package]] +name = "jedi" +version = "0.20.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "parso" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/b7/a3635f6a2d7cf5b5dd98064fc1d5fbbafcb25477bcea204a3a92145d158b/jedi-0.20.0.tar.gz", hash = "sha256:c3f4ccbd276696f4b19c54618d4fb18f9fc24b0aef02acf704b23f487daa1011", size = 3119416, upload-time = "2026-05-01T23:38:47.814Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/93/242e2eab5fe682ffcb8b0084bde703a41d51e17ee0f3a31ff0d9d813620a/jedi-0.20.0-py2.py3-none-any.whl", hash = "sha256:7bdd9c2634f56713299976f4cbd59cb3fa92165cc5e05ea811fb253480728b67", size = 4884812, upload-time = "2026-05-01T23:38:43.919Z" }, +] + +[[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 = "jmespath" +version = "1.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d3/59/322338183ecda247fb5d1763a6cbe46eff7222eaeebafd9fa65d4bf5cb11/jmespath-1.1.0.tar.gz", hash = "sha256:472c87d80f36026ae83c6ddd0f1d05d4e510134ed462851fd5f754c8c3cbb88d", size = 27377, upload-time = "2026-01-22T16:35:26.279Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/14/2f/967ba146e6d58cf6a652da73885f52fc68001525b4197effc174321d70b4/jmespath-1.1.0-py3-none-any.whl", hash = "sha256:a5663118de4908c91729bea0acadca56526eb2698e83de10cd116ae0f4e97c64", size = 20419, upload-time = "2026-01-22T16:35:24.919Z" }, +] + +[[package]] +name = "joblib" +version = "1.5.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/41/f2/d34e8b3a08a9cc79a50b2208a93dce981fe615b64d5a4d4abee421d898df/joblib-1.5.3.tar.gz", hash = "sha256:8561a3269e6801106863fd0d6d84bb737be9e7631e33aaed3fb9ce5953688da3", size = 331603, upload-time = "2025-12-15T08:41:46.427Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/91/984aca2ec129e2757d1e4e3c81c3fcda9d0f85b74670a094cc443d9ee949/joblib-1.5.3-py3-none-any.whl", hash = "sha256:5fc3c5039fc5ca8c0276333a188bbd59d6b7ab37fe6632daa76bc7f9ec18e713", size = 309071, upload-time = "2025-12-15T08:41:44.973Z" }, +] + +[[package]] +name = "jsonlines" +version = "4.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/35/87/bcda8e46c88d0e34cad2f09ee2d0c7f5957bccdb9791b0b934ec84d84be4/jsonlines-4.0.0.tar.gz", hash = "sha256:0c6d2c09117550c089995247f605ae4cf77dd1533041d366351f6f298822ea74", size = 11359, upload-time = "2023-09-01T12:34:44.187Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f8/62/d9ba6323b9202dd2fe166beab8a86d29465c41a0288cbe229fac60c1ab8d/jsonlines-4.0.0-py3-none-any.whl", hash = "sha256:185b334ff2ca5a91362993f42e83588a360cf95ce4b71a73548502bda52a7c55", size = 8701, upload-time = "2023-09-01T12:34:42.563Z" }, +] + +[[package]] +name = "jsonpatch" +version = "1.33" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jsonpointer" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/78/18813351fe5d63acad16aec57f94ec2b70a09e53ca98145589e185423873/jsonpatch-1.33.tar.gz", hash = "sha256:9fcd4009c41e6d12348b4a0ff2563ba56a2923a7dfee731d004e212e1ee5030c", size = 21699, upload-time = "2023-06-26T12:07:29.144Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/73/07/02e16ed01e04a374e644b575638ec7987ae846d25ad97bcc9945a3ee4b0e/jsonpatch-1.33-py2.py3-none-any.whl", hash = "sha256:0ae28c0cd062bbd8b8ecc26d7d164fbbea9652a1a3693f3b956c1eae5145dade", size = 12898, upload-time = "2023-06-16T21:01:28.466Z" }, +] + +[[package]] +name = "jsonpointer" +version = "3.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/18/c7/af399a2e7a67fd18d63c40c5e62d3af4e67b836a2107468b6a5ea24c4304/jsonpointer-3.1.1.tar.gz", hash = "sha256:0b801c7db33a904024f6004d526dcc53bbb8a4a0f4e32bfd10beadf60adf1900", size = 9068, upload-time = "2026-03-23T22:32:32.458Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/6a/a83720e953b1682d2d109d3c2dbb0bc9bf28cc1cbc205be4ef4be5da709d/jsonpointer-3.1.1-py3-none-any.whl", hash = "sha256:8ff8b95779d071ba472cf5bc913028df06031797532f08a7d5b602d8b2a488ca", size = 7659, upload-time = "2026-03-23T22:32:31.568Z" }, +] + +[[package]] +name = "jsonschema" +version = "4.26.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "jsonschema-specifications" }, + { name = "referencing" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b3/fc/e067678238fa451312d4c62bf6e6cf5ec56375422aee02f9cb5f909b3047/jsonschema-4.26.0.tar.gz", hash = "sha256:0c26707e2efad8aa1bfc5b7ce170f3fccc2e4918ff85989ba9ffa9facb2be326", size = 366583, upload-time = "2026-01-07T13:41:07.246Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/69/90/f63fb5873511e014207a475e2bb4e8b2e570d655b00ac19a9a0ca0a385ee/jsonschema-4.26.0-py3-none-any.whl", hash = "sha256:d489f15263b8d200f8387e64b4c3a75f06629559fb73deb8fdfb525f2dab50ce", size = 90630, upload-time = "2026-01-07T13:41:05.306Z" }, +] + +[[package]] +name = "jsonschema-specifications" +version = "2025.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "referencing" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/19/74/a633ee74eb36c44aa6d1095e7cc5569bebf04342ee146178e2d36600708b/jsonschema_specifications-2025.9.1.tar.gz", hash = "sha256:b540987f239e745613c7a9176f3edb72b832a4ac465cf02712288397832b5e8d", size = 32855, upload-time = "2025-09-08T01:34:59.186Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/45/1a4ed80516f02155c51f51e8cedb3c1902296743db0bbc66608a0db2814f/jsonschema_specifications-2025.9.1-py3-none-any.whl", hash = "sha256:98802fee3a11ee76ecaca44429fda8a41bff98b00a0f2838151b113f210cc6fe", size = 18437, upload-time = "2025-09-08T01:34:57.871Z" }, +] + +[[package]] +name = "jupyter-client" +version = "8.9.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-core" }, + { name = "python-dateutil" }, + { name = "pyzmq" }, + { name = "tornado" }, + { name = "traitlets" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/dc/5512503b088997c2250b8bf18258fba9d9ce5ead641183700960d3c9d342/jupyter_client-8.9.1.tar.gz", hash = "sha256:a58f730dd9e728ba16ba1d62ebccf7ffe1ebbdbce4e95cfae941b7321ae1f4fa", size = 359256, upload-time = "2026-06-09T13:15:01.033Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/6f/56d39bf385c5c27988aebaf0c18a2a17e960575740100973511018bd904e/jupyter_client-8.9.1-py3-none-any.whl", hash = "sha256:0b7a295bc46e8751e9adae84781f726c851c1d911bd793edc4a3bde942e3da81", size = 109828, upload-time = "2026-06-09T13:14:58.835Z" }, +] + +[[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 = "jupyterlab-pygments" +version = "0.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/90/51/9187be60d989df97f5f0aba133fa54e7300f17616e065d1ada7d7646b6d6/jupyterlab_pygments-0.3.0.tar.gz", hash = "sha256:721aca4d9029252b11cfa9d185e5b5af4d54772bb8072f9b7036f4170054d35d", size = 512900, upload-time = "2023-11-23T09:26:37.44Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/dd/ead9d8ea85bf202d90cc513b533f9c363121c7792674f78e0d8a854b63b4/jupyterlab_pygments-0.3.0-py3-none-any.whl", hash = "sha256:841a89020971da1d8693f1a99997aefc5dc424bb1b251fd6322462a1b8842780", size = 15884, upload-time = "2023-11-23T09:26:34.325Z" }, +] + +[[package]] +name = "kiwisolver" +version = "1.5.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d0/67/9c61eccb13f0bdca9307614e782fec49ffdde0f7a2314935d489fa93cd9c/kiwisolver-1.5.0.tar.gz", hash = "sha256:d4193f3d9dc3f6f79aaed0e5637f45d98850ebf01f7ca20e69457f3e8946b66a", size = 103482, upload-time = "2026-03-09T13:15:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ac/f8/06549565caa026e540b7e7bab5c5a90eb7ca986015f4c48dace243cd24d9/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:32cc0a5365239a6ea0c6ed461e8838d053b57e397443c0ca894dcc8e388d4374", size = 122802, upload-time = "2026-03-09T13:12:37.515Z" }, + { url = "https://files.pythonhosted.org/packages/84/eb/8476a0818850c563ff343ea7c9c05dcdcbd689a38e01aa31657df01f91fa/kiwisolver-1.5.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:cc0b66c1eec9021353a4b4483afb12dfd50e3669ffbb9152d6842eb34c7e29fd", size = 66216, upload-time = "2026-03-09T13:12:38.812Z" }, + { url = "https://files.pythonhosted.org/packages/f3/c4/f9c8a6b4c21aed4198566e45923512986d6cef530e7263b3a5f823546561/kiwisolver-1.5.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:86e0287879f75621ae85197b0877ed2f8b7aa57b511c7331dce2eb6f4de7d476", size = 63917, upload-time = "2026-03-09T13:12:40.053Z" }, + { url = "https://files.pythonhosted.org/packages/f1/0e/ba4ae25d03722f64de8b2c13e80d82ab537a06b30fc7065183c6439357e3/kiwisolver-1.5.0-cp310-cp310-manylinux_2_12_x86_64.manylinux2010_x86_64.whl", hash = "sha256:62f59da443c4f4849f73a51a193b1d9d258dcad0c41bc4d1b8fb2bcc04bfeb22", size = 1628776, upload-time = "2026-03-09T13:12:41.976Z" }, + { url = "https://files.pythonhosted.org/packages/8a/e4/3f43a011bc8a0860d1c96f84d32fa87439d3feedf66e672fef03bf5e8bac/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9190426b7aa26c5229501fa297b8d0653cfd3f5a36f7990c264e157cbf886b3b", size = 1228164, upload-time = "2026-03-09T13:12:44.002Z" }, + { url = "https://files.pythonhosted.org/packages/4b/34/3a901559a1e0c218404f9a61a93be82d45cb8f44453ba43088644980f033/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c8277104ded0a51e699c8c3aff63ce2c56d4ed5519a5f73e0fd7057f959a2b9e", size = 1246656, upload-time = "2026-03-09T13:12:45.557Z" }, + { url = "https://files.pythonhosted.org/packages/87/9e/f78c466ea20527822b95ad38f141f2de1dcd7f23fb8716b002b0d91bbe59/kiwisolver-1.5.0-cp310-cp310-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:8f9baf6f0a6e7571c45c8863010b45e837c3ee1c2c77fcd6ef423be91b21fedb", size = 1295562, upload-time = "2026-03-09T13:12:47.562Z" }, + { url = "https://files.pythonhosted.org/packages/0a/66/fd0e4a612e3a286c24e6d6f3a5428d11258ed1909bc530ba3b59807fd980/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cff8e5383db4989311f99e814feeb90c4723eb4edca425b9d5d9c3fefcdd9537", size = 2178473, upload-time = "2026-03-09T13:12:50.254Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8e/6cac929e0049539e5ee25c1ee937556f379ba5204840d03008363ced662d/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:ebae99ed6764f2b5771c522477b311be313e8841d2e0376db2b10922daebbba4", size = 2274035, upload-time = "2026-03-09T13:12:51.785Z" }, + { url = "https://files.pythonhosted.org/packages/ca/d3/9d0c18f1b52ea8074b792452cf17f1f5a56bd0302a85191f405cfbf9da16/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:d5cd5189fc2b6a538b75ae45433140c4823463918f7b1617c31e68b085c0022c", size = 2443217, upload-time = "2026-03-09T13:12:53.329Z" }, + { url = "https://files.pythonhosted.org/packages/45/2a/6e19368803a038b2a90857bf4ee9e3c7b667216d045866bf22d3439fd75e/kiwisolver-1.5.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:f42c23db5d1521218a3276bb08666dcb662896a0be7347cba864eca45ff64ede", size = 2249196, upload-time = "2026-03-09T13:12:55.057Z" }, + { url = "https://files.pythonhosted.org/packages/75/2b/3f641dfcbe72e222175d626bacf2f72c3b34312afec949dd1c50afa400f5/kiwisolver-1.5.0-cp310-cp310-win_amd64.whl", hash = "sha256:94eff26096eb5395136634622515b234ecb6c9979824c1f5004c6e3c3c85ccd2", size = 73389, upload-time = "2026-03-09T13:12:56.496Z" }, + { url = "https://files.pythonhosted.org/packages/da/88/299b137b9e0025d8982e03d2d52c123b0a2b159e84b0ef1501ef446339cf/kiwisolver-1.5.0-cp310-cp310-win_arm64.whl", hash = "sha256:dd952e03bfbb096cfe2dd35cd9e00f269969b67536cb4370994afc20ff2d0875", size = 64782, upload-time = "2026-03-09T13:12:57.609Z" }, + { url = "https://files.pythonhosted.org/packages/12/dd/a495a9c104be1c476f0386e714252caf2b7eca883915422a64c50b88c6f5/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:9eed0f7edbb274413b6ee781cca50541c8c0facd3d6fd289779e494340a2b85c", size = 122798, upload-time = "2026-03-09T13:12:58.963Z" }, + { url = "https://files.pythonhosted.org/packages/11/60/37b4047a2af0cf5ef6d8b4b26e91829ae6fc6a2d1f74524bcb0e7cd28a32/kiwisolver-1.5.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3c4923e404d6bcd91b6779c009542e5647fef32e4a5d75e115e3bbac6f2335eb", size = 66216, upload-time = "2026-03-09T13:13:00.155Z" }, + { url = "https://files.pythonhosted.org/packages/0a/aa/510dc933d87767584abfe03efa445889996c70c2990f6f87c3ebaa0a18c5/kiwisolver-1.5.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:0df54df7e686afa55e6f21fb86195224a6d9beb71d637e8d7920c95cf0f89aac", size = 63911, upload-time = "2026-03-09T13:13:01.671Z" }, + { url = "https://files.pythonhosted.org/packages/80/46/bddc13df6c2a40741e0cc7865bb1c9ed4796b6760bd04ce5fae3928ef917/kiwisolver-1.5.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:2517e24d7315eb51c10664cdb865195df38ab74456c677df67bb47f12d088a27", size = 1438209, upload-time = "2026-03-09T13:13:03.385Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d6/76621246f5165e5372f02f5e6f3f48ea336a8f9e96e43997d45b240ed8cd/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff710414307fefa903e0d9bdf300972f892c23477829f49504e59834f4195398", size = 1248888, upload-time = "2026-03-09T13:13:05.231Z" }, + { url = "https://files.pythonhosted.org/packages/b2/c1/31559ec6fb39a5b48035ce29bb63ade628f321785f38c384dee3e2c08bc1/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6176c1811d9d5a04fa391c490cc44f451e240697a16977f11c6f722efb9041db", size = 1266304, upload-time = "2026-03-09T13:13:06.743Z" }, + { url = "https://files.pythonhosted.org/packages/5e/ef/1cb8276f2d29cc6a41e0a042f27946ca347d3a4a75acf85d0a16aa6dcc82/kiwisolver-1.5.0-cp311-cp311-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:50847dca5d197fcbd389c805aa1a1cf32f25d2e7273dc47ab181a517666b68cc", size = 1319650, upload-time = "2026-03-09T13:13:08.607Z" }, + { url = "https://files.pythonhosted.org/packages/4c/e4/5ba3cecd7ce6236ae4a80f67e5d5531287337d0e1f076ca87a5abe4cd5d0/kiwisolver-1.5.0-cp311-cp311-manylinux_2_39_riscv64.whl", hash = "sha256:01808c6d15f4c3e8559595d6d1fe6411c68e4a3822b4b9972b44473b24f4e679", size = 970949, upload-time = "2026-03-09T13:13:10.299Z" }, + { url = "https://files.pythonhosted.org/packages/5a/69/dc61f7ae9a2f071f26004ced87f078235b5507ab6e5acd78f40365655034/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:f1f9f4121ec58628c96baa3de1a55a4e3a333c5102c8e94b64e23bf7b2083309", size = 2199125, upload-time = "2026-03-09T13:13:11.841Z" }, + { url = "https://files.pythonhosted.org/packages/e5/7b/abbe0f1b5afa85f8d084b73e90e5f801c0939eba16ac2e49af7c61a6c28d/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:b7d335370ae48a780c6e6a6bbfa97342f563744c39c35562f3f367665f5c1de2", size = 2293783, upload-time = "2026-03-09T13:13:14.399Z" }, + { url = "https://files.pythonhosted.org/packages/8a/80/5908ae149d96d81580d604c7f8aefd0e98f4fd728cf172f477e9f2a81744/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:800ee55980c18545af444d93fdd60c56b580db5cc54867d8cbf8a1dc0829938c", size = 1960726, upload-time = "2026-03-09T13:13:16.047Z" }, + { url = "https://files.pythonhosted.org/packages/84/08/a78cb776f8c085b7143142ce479859cfec086bd09ee638a317040b6ef420/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:c438f6ca858697c9ab67eb28246c92508af972e114cac34e57a6d4ba17a3ac08", size = 2464738, upload-time = "2026-03-09T13:13:17.897Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e1/65584da5356ed6cb12c63791a10b208860ac40a83de165cb6a6751a686e3/kiwisolver-1.5.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8c63c91f95173f9c2a67c7c526b2cea976828a0e7fced9cdcead2802dc10f8a4", size = 2270718, upload-time = "2026-03-09T13:13:19.421Z" }, + { url = "https://files.pythonhosted.org/packages/be/6c/28f17390b62b8f2f520e2915095b3c94d88681ecf0041e75389d9667f202/kiwisolver-1.5.0-cp311-cp311-win_amd64.whl", hash = "sha256:beb7f344487cdcb9e1efe4b7a29681b74d34c08f0043a327a74da852a6749e7b", size = 73480, upload-time = "2026-03-09T13:13:20.818Z" }, + { url = "https://files.pythonhosted.org/packages/d8/0e/2ee5debc4f77a625778fec5501ff3e8036fe361b7ee28ae402a485bb9694/kiwisolver-1.5.0-cp311-cp311-win_arm64.whl", hash = "sha256:ad4ae4ffd1ee9cd11357b4c66b612da9888f4f4daf2f36995eda64bd45370cac", size = 64930, upload-time = "2026-03-09T13:13:21.997Z" }, + { url = "https://files.pythonhosted.org/packages/4d/b2/818b74ebea34dabe6d0c51cb1c572e046730e64844da6ed646d5298c40ce/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:4e9750bc21b886308024f8a54ccb9a2cc38ac9fa813bf4348434e3d54f337ff9", size = 123158, upload-time = "2026-03-09T13:13:23.127Z" }, + { url = "https://files.pythonhosted.org/packages/bf/d9/405320f8077e8e1c5c4bd6adc45e1e6edf6d727b6da7f2e2533cf58bff71/kiwisolver-1.5.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:72ec46b7eba5b395e0a7b63025490d3214c11013f4aacb4f5e8d6c3041829588", size = 66388, upload-time = "2026-03-09T13:13:24.765Z" }, + { url = "https://files.pythonhosted.org/packages/99/9f/795fedf35634f746151ca8839d05681ceb6287fbed6cc1c9bf235f7887c2/kiwisolver-1.5.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ed3a984b31da7481b103f68776f7128a89ef26ed40f4dc41a2223cda7fb24819", size = 64068, upload-time = "2026-03-09T13:13:25.878Z" }, + { url = "https://files.pythonhosted.org/packages/c4/13/680c54afe3e65767bed7ec1a15571e1a2f1257128733851ade24abcefbcc/kiwisolver-1.5.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:bb5136fb5352d3f422df33f0c879a1b0c204004324150cc3b5e3c4f310c9049f", size = 1477934, upload-time = "2026-03-09T13:13:27.166Z" }, + { url = "https://files.pythonhosted.org/packages/c8/2f/cebfcdb60fd6a9b0f6b47a9337198bcbad6fbe15e68189b7011fd914911f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b2af221f268f5af85e776a73d62b0845fc8baf8ef0abfae79d29c77d0e776aaf", size = 1278537, upload-time = "2026-03-09T13:13:28.707Z" }, + { url = "https://files.pythonhosted.org/packages/f2/0d/9b782923aada3fafb1d6b84e13121954515c669b18af0c26e7d21f579855/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:b0f172dc8ffaccb8522d7c5d899de00133f2f1ca7b0a49b7da98e901de87bf2d", size = 1296685, upload-time = "2026-03-09T13:13:30.528Z" }, + { url = "https://files.pythonhosted.org/packages/27/70/83241b6634b04fe44e892688d5208332bde130f38e610c0418f9ede47ded/kiwisolver-1.5.0-cp312-cp312-manylinux_2_24_s390x.manylinux_2_28_s390x.whl", hash = "sha256:6ab8ba9152203feec73758dad83af9a0bbe05001eb4639e547207c40cfb52083", size = 1346024, upload-time = "2026-03-09T13:13:32.818Z" }, + { url = "https://files.pythonhosted.org/packages/e4/db/30ed226fb271ae1a6431fc0fe0edffb2efe23cadb01e798caeb9f2ceae8f/kiwisolver-1.5.0-cp312-cp312-manylinux_2_39_riscv64.whl", hash = "sha256:cdee07c4d7f6d72008d3f73b9bf027f4e11550224c7c50d8df1ae4a37c1402a6", size = 987241, upload-time = "2026-03-09T13:13:34.435Z" }, + { url = "https://files.pythonhosted.org/packages/ec/bd/c314595208e4c9587652d50959ead9e461995389664e490f4dce7ff0f782/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7c60d3c9b06fb23bd9c6139281ccbdc384297579ae037f08ae90c69f6845c0b1", size = 2227742, upload-time = "2026-03-09T13:13:36.4Z" }, + { url = "https://files.pythonhosted.org/packages/c1/43/0499cec932d935229b5543d073c2b87c9c22846aab48881e9d8d6e742a2d/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:e315e5ec90d88e140f57696ff85b484ff68bb311e36f2c414aa4286293e6dee0", size = 2323966, upload-time = "2026-03-09T13:13:38.204Z" }, + { url = "https://files.pythonhosted.org/packages/3d/6f/79b0d760907965acfd9d61826a3d41f8f093c538f55cd2633d3f0db269f6/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:1465387ac63576c3e125e5337a6892b9e99e0627d52317f3ca79e6930d889d15", size = 1977417, upload-time = "2026-03-09T13:13:39.966Z" }, + { url = "https://files.pythonhosted.org/packages/ab/31/01d0537c41cb75a551a438c3c7a80d0c60d60b81f694dac83dd436aec0d0/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:530a3fd64c87cffa844d4b6b9768774763d9caa299e9b75d8eca6a4423b31314", size = 2491238, upload-time = "2026-03-09T13:13:41.698Z" }, + { url = "https://files.pythonhosted.org/packages/e4/34/8aefdd0be9cfd00a44509251ba864f5caf2991e36772e61c408007e7f417/kiwisolver-1.5.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1d9daea4ea6b9be74fe2f01f7fbade8d6ffab263e781274cffca0dba9be9eec9", size = 2294947, upload-time = "2026-03-09T13:13:43.343Z" }, + { url = "https://files.pythonhosted.org/packages/ad/cf/0348374369ca588f8fe9c338fae49fa4e16eeb10ffb3d012f23a54578a9e/kiwisolver-1.5.0-cp312-cp312-win_amd64.whl", hash = "sha256:f18c2d9782259a6dc132fdc7a63c168cbc74b35284b6d75c673958982a378384", size = 73569, upload-time = "2026-03-09T13:13:45.792Z" }, + { url = "https://files.pythonhosted.org/packages/28/26/192b26196e2316e2bd29deef67e37cdf9870d9af8e085e521afff0fed526/kiwisolver-1.5.0-cp312-cp312-win_arm64.whl", hash = "sha256:f7c7553b13f69c1b29a5bde08ddc6d9d0c8bfb84f9ed01c30db25944aeb852a7", size = 64997, upload-time = "2026-03-09T13:13:46.878Z" }, + { url = "https://files.pythonhosted.org/packages/1c/fa/2910df836372d8761bb6eff7d8bdcb1613b5c2e03f260efe7abe34d388a7/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_10_13_x86_64.whl", hash = "sha256:5ae8e62c147495b01a0f4765c878e9bfdf843412446a247e28df59936e99e797", size = 130262, upload-time = "2026-03-09T13:15:35.629Z" }, + { url = "https://files.pythonhosted.org/packages/0f/41/c5f71f9f00aabcc71fee8b7475e3f64747282580c2fe748961ba29b18385/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:f6764a4ccab3078db14a632420930f6186058750df066b8ea2a7106df91d3203", size = 138036, upload-time = "2026-03-09T13:15:36.894Z" }, + { url = "https://files.pythonhosted.org/packages/fa/06/7399a607f434119c6e1fdc8ec89a8d51ccccadf3341dee4ead6bd14caaf5/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:c31c13da98624f957b0fb1b5bae5383b2333c2c3f6793d9825dd5ce79b525cb7", size = 194295, upload-time = "2026-03-09T13:15:38.22Z" }, + { url = "https://files.pythonhosted.org/packages/b5/91/53255615acd2a1eaca307ede3c90eb550bae9c94581f8c00081b6b1c8f44/kiwisolver-1.5.0-graalpy312-graalpy250_312_native-win_amd64.whl", hash = "sha256:1f1489f769582498610e015a8ef2d36f28f505ab3096d0e16b4858a9ec214f57", size = 75987, upload-time = "2026-03-09T13:15:39.65Z" }, + { url = "https://files.pythonhosted.org/packages/17/6f/6fd4f690a40c2582fa34b97d2678f718acf3706b91d270c65ecb455d0a06/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:295d9ffe712caa9f8a3081de8d32fc60191b4b51c76f02f951fd8407253528f4", size = 59606, upload-time = "2026-03-09T13:15:40.81Z" }, + { url = "https://files.pythonhosted.org/packages/82/a0/2355d5e3b338f13ce63f361abb181e3b6ea5fffdb73f739b3e80efa76159/kiwisolver-1.5.0-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:51e8c4084897de9f05898c2c2a39af6318044ae969d46ff7a34ed3f96274adca", size = 57537, upload-time = "2026-03-09T13:15:42.071Z" }, + { url = "https://files.pythonhosted.org/packages/c8/b9/1d50e610ecadebe205b71d6728fd224ce0e0ca6aba7b9cbe1da049203ac5/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:b83af57bdddef03c01a9138034c6ff03181a3028d9a1003b301eb1a55e161a3f", size = 79888, upload-time = "2026-03-09T13:15:43.317Z" }, + { url = "https://files.pythonhosted.org/packages/cd/ee/b85ffcd75afed0357d74f0e6fc02a4507da441165de1ca4760b9f496390d/kiwisolver-1.5.0-pp310-pypy310_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf4679a3d71012a7c2bf360e5cd878fbd5e4fcac0896b56393dec239d81529ed", size = 77584, upload-time = "2026-03-09T13:15:44.605Z" }, + { url = "https://files.pythonhosted.org/packages/6b/dd/644d0dde6010a8583b4cd66dd41c5f83f5325464d15c4f490b3340ab73b4/kiwisolver-1.5.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:41024ed50e44ab1a60d3fe0a9d15a4ccc9f5f2b1d814ff283c8d01134d5b81bc", size = 73390, upload-time = "2026-03-09T13:15:45.832Z" }, + { url = "https://files.pythonhosted.org/packages/e9/eb/5fcbbbf9a0e2c3a35effb88831a483345326bbc3a030a3b5b69aee647f84/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ec4c85dc4b687c7f7f15f553ff26a98bfe8c58f5f7f0ac8905f0ba4c7be60232", size = 59532, upload-time = "2026-03-09T13:15:47.047Z" }, + { url = "https://files.pythonhosted.org/packages/c3/9b/e17104555bb4db148fd52327feea1e96be4b88e8e008b029002c281a21ab/kiwisolver-1.5.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:12e91c215a96e39f57989c8912ae761286ac5a9584d04030ceb3368a357f017a", size = 57420, upload-time = "2026-03-09T13:15:48.199Z" }, + { url = "https://files.pythonhosted.org/packages/48/44/2b5b95b7aa39fb2d8d9d956e0f3d5d45aef2ae1d942d4c3ffac2f9cfed1a/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be4a51a55833dc29ab5d7503e7bcb3b3af3402d266018137127450005cdfe737", size = 79892, upload-time = "2026-03-09T13:15:49.694Z" }, + { url = "https://files.pythonhosted.org/packages/52/7d/7157f9bba6b455cfb4632ed411e199fc8b8977642c2b12082e1bd9e6d173/kiwisolver-1.5.0-pp311-pypy311_pp73-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:daae526907e262de627d8f70058a0f64acc9e2641c164c99c8f594b34a799a16", size = 77603, upload-time = "2026-03-09T13:15:50.945Z" }, + { url = "https://files.pythonhosted.org/packages/0a/dd/8050c947d435c8d4bc94e3252f4d8bb8a76cfb424f043a8680be637a57f1/kiwisolver-1.5.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:59cd8683f575d96df5bb48f6add94afc055012c29e28124fcae2b63661b9efb1", size = 73558, upload-time = "2026-03-09T13:15:52.112Z" }, +] + +[[package]] +name = "lazy-loader" +version = "0.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/49/ac/21a1f8aa3777f5658576777ea76bfb124b702c520bbe90edf4ae9915eafa/lazy_loader-0.5.tar.gz", hash = "sha256:717f9179a0dbed357012ddad50a5ad3d5e4d9a0b8712680d4e687f5e6e6ed9b3", size = 15294, upload-time = "2026-03-06T15:45:09.054Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/a1/8d812e53a5da1687abb10445275d41a8b13adb781bbf7196ddbcf8d88505/lazy_loader-0.5-py3-none-any.whl", hash = "sha256:ab0ea149e9c554d4ffeeb21105ac60bed7f3b4fd69b1d2360a4add51b170b005", size = 8044, upload-time = "2026-03-06T15:45:07.668Z" }, +] + +[[package]] +name = "lxml" +version = "6.1.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/05/3b/aab6728cae887456f409b4d75e8a01856e4f04bd510de38052a47768b680/lxml-6.1.1.tar.gz", hash = "sha256:ba96ae44888e0185281e937633a743ea90d5a196c6000f82565ebb0580012d40", size = 4197430, upload-time = "2026-05-18T19:19:06.424Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/12/da/dbe4dfc01ac226fb0504fad035f4d69f3202f3502e20e68537631daddd96/lxml-6.1.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:09dd5b7075dc2f7709654a46543ba1ea3c2e217b2ed8fbd413a8a945a0f40f60", size = 8541124, upload-time = "2026-05-18T19:17:11.589Z" }, + { url = "https://files.pythonhosted.org/packages/78/20/f7095ed9fc2c025f9cfe71cc6ec9f1feb05624edc1812423b5f1aecf3d4b/lxml-6.1.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:f6ac4ef4d82dff54670227a69c67782ae0b811b5cf6b17954f1e8f7502fc0d1d", size = 4602783, upload-time = "2026-05-18T19:17:20.888Z" }, + { url = "https://files.pythonhosted.org/packages/4a/a4/65c63ca98bd129f6cff7b8c2fa48953ab058cc6005b541354e7dd54d8000/lxml-6.1.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:556e94a63c9b04716f8e4de2abb65775061f846e89331b6c5be79183a24f98ea", size = 5002687, upload-time = "2026-05-18T19:17:01.738Z" }, + { url = "https://files.pythonhosted.org/packages/96/1d/ab7a5c4b5a394d98a94e2d0fc67bab8297597426770dd4978370fbdaf531/lxml-6.1.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:5c6bf403fbb3b3e348a561a5f4f0b9961835657981c802a1df03653eef8a9074", size = 5155099, upload-time = "2026-05-18T19:17:05.159Z" }, + { url = "https://files.pythonhosted.org/packages/d0/b1/07603bfeeb891a2596d5c2a68f7d2f70f7d11c841ebe391412c69c2857b0/lxml-6.1.1-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dde6131244bba38a17c745836ba190bc753fd73c9291666287fd0a3fa3dcf30", size = 5057225, upload-time = "2026-05-18T19:17:08.117Z" }, + { url = "https://files.pythonhosted.org/packages/7a/16/cb391ee4b90186fa16d9ebcbe3ea96c71b8da3b0686386c8dcbcc3c67d44/lxml-6.1.1-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:98fc784c2c1440667aeedf8465bdfe10208acf0ead656a2c68627299f546b315", size = 5287643, upload-time = "2026-05-18T19:17:11.507Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d6/b619717f918fd76747448fdbaee0e769edbc70e659b5b5d0112b7020b7a3/lxml-6.1.1-cp310-cp310-manylinux_2_28_i686.whl", hash = "sha256:add8cf6ddf9a65116119a28ece0f7886e30af27ba724a7594305f1d1b58a92a1", size = 5412445, upload-time = "2026-05-18T19:17:22.182Z" }, + { url = "https://files.pythonhosted.org/packages/c6/80/12bc5390ac0a3edeb579d9535e5049a5dda663438728e179d52fb319c33a/lxml-6.1.1-cp310-cp310-manylinux_2_31_armv7l.whl", hash = "sha256:cf9d57306d848218f3601fee7601fab1a327c942d56e2e97610583cb4dd74206", size = 4770864, upload-time = "2026-05-18T19:17:26.851Z" }, + { url = "https://files.pythonhosted.org/packages/0b/59/6500c09da3137f54f020e908d81cfc5ee3e8888e908fd380207afad7c2e6/lxml-6.1.1-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:88136950da4d13c318bde414ce10219931937851327f44328f2df4d2c4614067", size = 5359594, upload-time = "2026-05-18T19:17:32.527Z" }, + { url = "https://files.pythonhosted.org/packages/f2/9b/f64b4cc6b7ebcf75d95af3cde934d254b5f2f10d4163928d838d86b6eb48/lxml-6.1.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:cecdd5dfdc87b1fd87dbf81d4b037a544f47f4c744200a67013771682d67686a", size = 5107713, upload-time = "2026-05-18T19:17:04.402Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/c7388ad5d3a72315d2832dc1458cbf4f2af7f2b990b606ff4876efd04511/lxml-6.1.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:cd312b9692e831d2ffcad61eab31d91d4b4655a962e61de8fb410472cbcd37aa", size = 4803973, upload-time = "2026-05-18T19:17:06.545Z" }, + { url = "https://files.pythonhosted.org/packages/3f/22/76197f0bbf165f0b9e75be59be4997e5259cde973f12f098c1b54c7f5d60/lxml-6.1.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:5b7328b46d49fc9477d91ae8f6d55340347d827b7734ba3ea33faae0efef1383", size = 5349925, upload-time = "2026-05-18T19:17:09.743Z" }, + { url = "https://files.pythonhosted.org/packages/24/52/d2a0cfeccb9bcdc47c7ee05cdae5d69b48c9acf20997790a6338bb0d0b3b/lxml-6.1.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:37a58976370f36d9329d118ad0b953c5aeb9119ac9c6a4e258942a225d0573a1", size = 5309825, upload-time = "2026-05-18T19:17:13.831Z" }, + { url = "https://files.pythonhosted.org/packages/19/4a/b30944266776c2f49749ef2445aa7e78898194134b80ad776386f61b56ae/lxml-6.1.1-cp310-cp310-win32.whl", hash = "sha256:cea3f4c1af79af13cdb2da0c028111d8f8522d4f22a000c82385535f24e5cf3a", size = 3598402, upload-time = "2026-05-18T19:17:08.21Z" }, + { url = "https://files.pythonhosted.org/packages/9e/97/33691c66a4d7ec1a5a98e7c909a5b83ee45c7f7ba4cf92b1c4cf26e98079/lxml-6.1.1-cp310-cp310-win_amd64.whl", hash = "sha256:3abf332af33a74288675d936fe861fd4344da0dd6622193fbc4f2bfbb35536b5", size = 4021295, upload-time = "2026-05-18T19:17:28.638Z" }, + { url = "https://files.pythonhosted.org/packages/d0/5f/26a4dd0e12b9456ff7b12a21af5b491eb6629680d1edd73f4140fd386bcf/lxml-6.1.1-cp310-cp310-win_arm64.whl", hash = "sha256:8dadbe5b217ff35b6a8d16610dd710219b59b76d13f0e3f0d9f36786206e4485", size = 3667717, upload-time = "2026-05-19T19:22:44.474Z" }, + { url = "https://files.pythonhosted.org/packages/62/b0/83f481780d1548750b8ce2ec824073deef2f452d9cd1a6faff8507e3d16d/lxml-6.1.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:53b7d2b7a10b1c35c0a5e21e9224accf60c1bbfba523990732e521b2b73adef2", size = 8526461, upload-time = "2026-05-18T19:17:25.862Z" }, + { url = "https://files.pythonhosted.org/packages/b9/d5/30fa0f808002c7329397bfbb24e306789c0b29f04aa5842c07b174b4216f/lxml-6.1.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:ff3f333630ab480244a1bff72043e511a91eb22e7595dead8653ee5612dd8f3d", size = 4595375, upload-time = "2026-05-18T19:17:34.555Z" }, + { url = "https://files.pythonhosted.org/packages/4f/d2/edb71cf0e561581a7c5eb2626244320eb04e9f8ce6d563184fd668b45073/lxml-6.1.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:a4bbea04c97f6d78a48e3fbc1cb9116d2780b1b39e03a23f6eb9b603fd61f510", size = 4923654, upload-time = "2026-05-18T19:17:42.917Z" }, + { url = "https://files.pythonhosted.org/packages/4c/77/1bc7eeb0de4577d783fb625aa092cc9357883bba35845a3666bf1259f3dc/lxml-6.1.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:db1d75f6617a49c1c01bc7023713e0ff59ab32c9579ae62a7674c0e34f3b0b0a", size = 5067921, upload-time = "2026-05-18T19:17:49.175Z" }, + { url = "https://files.pythonhosted.org/packages/1b/3c/c0690d74bd2bc17bc03b5b0d093569ead597dd0bfa088bf99eef8c24e19c/lxml-6.1.1-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:3a12689be69a28ddaa0ab99a5a1137da2afd5f8f16df7b5680b66f616d3eda1d", size = 5002456, upload-time = "2026-05-18T19:17:59.715Z" }, + { url = "https://files.pythonhosted.org/packages/66/8d/d1b3271af0c0f1e27e8472a849e4d2c65bc7766884b9ad2da9e76e145c88/lxml-6.1.1-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:18b73c339ae29b90fd2d06e58ebd555a751bde9cd6bbd36cc0281b9a2c94e9d8", size = 5202776, upload-time = "2026-05-18T19:18:08.924Z" }, + { url = "https://files.pythonhosted.org/packages/7a/45/689824ffb237fd10125ad273f32b28ff04dc6203c2822c85ff65a93df65e/lxml-6.1.1-cp311-cp311-manylinux_2_28_i686.whl", hash = "sha256:752d3bbfe874715ccd0aec7f88d7fc623c0f1fd7aa7b3238a084e017bad2a009", size = 5329945, upload-time = "2026-05-18T19:18:13.673Z" }, + { url = "https://files.pythonhosted.org/packages/5d/c0/ef73af53767e958fd87d437c170f272e2f6e6c0f854939f133a895f1e711/lxml-6.1.1-cp311-cp311-manylinux_2_31_armv7l.whl", hash = "sha256:6b1761fbf9ec984e2e9d9c589ef5f5fd684b7c19f92aadd567a26c5224958db6", size = 4659237, upload-time = "2026-05-18T19:18:18.657Z" }, + { url = "https://files.pythonhosted.org/packages/a0/5e/e1158e40397585e91cb0472374a1f63d0926a1ddeaa92f13d1a1ffe306d5/lxml-6.1.1-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:d680fbcb768404c601ecb43519ecd8461f6954cb11c06a78962f666832ccfca8", size = 5265904, upload-time = "2026-05-18T19:18:24.883Z" }, + { url = "https://files.pythonhosted.org/packages/a0/16/8687e5d1400ed1c0bc41dace232ebb7553952b618ea1f2e5fb6e2cfbbe23/lxml-6.1.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:162af1091cd785f2f27e62d3547ae9bc58ec5c86dd314d67021fd02463708d83", size = 5045225, upload-time = "2026-05-18T19:17:20.073Z" }, + { url = "https://files.pythonhosted.org/packages/ca/18/d877bd1ae2e5ffdfd4836565aba350db31feb2f2656d6ce70316ed66a05e/lxml-6.1.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:e9308ff8241c532df3f3e570f9a5aeed6c853f888512ba4b75638d7c11c95ef6", size = 4712721, upload-time = "2026-05-18T19:17:40.512Z" }, + { url = "https://files.pythonhosted.org/packages/44/4d/1f44fd1d770b10dacbf6b5c6e520f4d6e0708744930f719dc04e67cab981/lxml-6.1.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:5f6994074ebae6ffb04447268e37dc16edc304f9859cf91acb86e0af6c1b395c", size = 5252549, upload-time = "2026-05-18T19:17:51.236Z" }, + { url = "https://files.pythonhosted.org/packages/64/5d/1d66b84f850089254c230ef6ea6b267a5a54e2e179a5d960036a05d501d7/lxml-6.1.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:80c2dfadb855da477cf73373ad29a333535dedb9b12bad02c9814c8e2b43bf08", size = 5226877, upload-time = "2026-05-18T19:18:00.875Z" }, + { url = "https://files.pythonhosted.org/packages/ad/00/84c4b5302d42a2d0184f38d538c8a197f33b52a50bd4f7bcfe990bce3036/lxml-6.1.1-cp311-cp311-win32.whl", hash = "sha256:30a89d3ac8faec007453fb541f3f46807eeec88edd5826f6e3fe001752a2c621", size = 3594072, upload-time = "2026-05-18T19:17:12.714Z" }, + { url = "https://files.pythonhosted.org/packages/61/9d/2e2f7d876349f45e0f3e29f72da311668853d59b58d473a2dea4f0160135/lxml-6.1.1-cp311-cp311-win_amd64.whl", hash = "sha256:abbefa31eee84842140f67acef1c828e28bba8bbf0c3bc6e5492a9af88152c28", size = 4025469, upload-time = "2026-05-18T19:17:50.566Z" }, + { url = "https://files.pythonhosted.org/packages/b0/d5/570e6390e4110331e6208b2ba83d1482cc9146808ee118b22824a34c1070/lxml-6.1.1-cp311-cp311-win_arm64.whl", hash = "sha256:dcb292aa7fe485ceff7af4f92e46c5af397daec5dff64871a528f0fc47a3cc5b", size = 3667640, upload-time = "2026-05-19T19:22:48.293Z" }, + { url = "https://files.pythonhosted.org/packages/6a/6e/c4add832b6fc1e887125b96f880d7b9b70aae5248718e046b1704bcac4b9/lxml-6.1.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:104c09bda8d2a562824c0e319d0768ce26a779b7601e0931d33b09b53c392ef7", size = 8570821, upload-time = "2026-05-18T19:17:42.068Z" }, + { url = "https://files.pythonhosted.org/packages/22/00/ff3009c88e65de8011630acf8ab5a09cb2becd2aaf47fba2f3449f6224e9/lxml-6.1.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:25c6997a9a534e016695a0ba06b2f07945de682731ff01065b6d5a4474179da1", size = 4624252, upload-time = "2026-05-18T19:17:47.897Z" }, + { url = "https://files.pythonhosted.org/packages/42/95/bb63f0fd62e554fe078e1fb3c8fe9083c14ddc7ad7fa178d10e57e071ac7/lxml-6.1.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:c921ba5c51e4e9f63b8b00267d06566e1f63407408a0496da2d1d0bfc819c7fc", size = 4930746, upload-time = "2026-05-18T19:18:29.637Z" }, + { url = "https://files.pythonhosted.org/packages/eb/99/0013e8d9b5960f4f041cf0b73e2f80c23eb5205b1f7bfb20203243651359/lxml-6.1.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:54a7f95e4de5fb94e2f9f4b9055c6ba33bf3d628fd77a1d647c5923caa2cdcdc", size = 5093723, upload-time = "2026-05-18T19:18:34.168Z" }, + { url = "https://files.pythonhosted.org/packages/29/91/317b332636bfc7bddcff828d41b3307f50043f4b237e40849c333d80fa1a/lxml-6.1.1-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96f2ec43df44b1f76249ee0a615334f9b5b060e1c8bd90e706dad2d14d02f383", size = 5005557, upload-time = "2026-05-18T19:18:39.798Z" }, + { url = "https://files.pythonhosted.org/packages/42/2f/cc9bf06afe70f9c9093ae60855d9759da9db601ec4080f7473319666ffd7/lxml-6.1.1-cp312-cp312-manylinux_2_26_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:70ef8a7e102a1508f8121aae5b0867abd663f72c14f0a9c937e6554cb4587b7b", size = 5631036, upload-time = "2026-05-18T19:18:44.858Z" }, + { url = "https://files.pythonhosted.org/packages/08/f6/af32e23e563971ffb0fb86be52bc5be5c2c118858ffc119bf6a9039b173d/lxml-6.1.1-cp312-cp312-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:ebe6af670449830d6d9b752c256a983291c766a1365ba5d5460048f9e33a7818", size = 5240367, upload-time = "2026-05-18T19:18:49.217Z" }, + { url = "https://files.pythonhosted.org/packages/78/83/8555d40948b09ce86f1bd0c68a7ac31d07b1929f92cc1b074006c97ef2d2/lxml-6.1.1-cp312-cp312-manylinux_2_28_i686.whl", hash = "sha256:27acc820660aaffa4f7c087f29120e12980f7779d56d8492d263170111284740", size = 5350171, upload-time = "2026-05-18T19:18:52.779Z" }, + { url = "https://files.pythonhosted.org/packages/63/75/5d92da93729b7bad783689e6496049fa40927b45bec7bf183c981de3ca70/lxml-6.1.1-cp312-cp312-manylinux_2_31_armv7l.whl", hash = "sha256:1db753c9115ec7100d073b744d17e25e88a8f90f5c39b2f5dd878149af59671f", size = 4694874, upload-time = "2026-05-18T19:18:55.139Z" }, + { url = "https://files.pythonhosted.org/packages/c5/b5/3aad415a9a25b822e783f15deeb4dffccf5113030f1afa2222dd929313d9/lxml-6.1.1-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c4f469aebd783bb741c2ecb2a681008fd26bfe5c16a9a72ed5467f834e810df2", size = 5244492, upload-time = "2026-05-18T19:19:01.28Z" }, + { url = "https://files.pythonhosted.org/packages/f1/a1/5fcf7eb9904b80086aa47dcf0027de07b1bb990afad2e6823144c368ae04/lxml-6.1.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:766b010012d59470072c1816b5b6c69f1d243e5db36ea5968e94accf430a4635", size = 5048232, upload-time = "2026-05-18T19:18:12.67Z" }, + { url = "https://files.pythonhosted.org/packages/77/74/1f601b63c7a69fcdf10fa9b148c81da8442204194f6c55509cc485c786b9/lxml-6.1.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:b8d812c6011c08b8111a15e54dd990b8923692d80adf35488bee34026c35accf", size = 4777023, upload-time = "2026-05-18T19:18:15.928Z" }, + { url = "https://files.pythonhosted.org/packages/a2/b9/7a78f51aec95b1bf780d78e12705a9f6533284f8693dc5c0e6724fa53d3f/lxml-6.1.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:fe0306bd29505a9177aac19f1877174b0e7422c222a59f70b2cd41633448c3dc", size = 5645773, upload-time = "2026-05-18T19:18:23.223Z" }, + { url = "https://files.pythonhosted.org/packages/a5/6e/98a7b7ad54e4e74fa1f20fff776913980619d0ebe5558232d7da6580bdd8/lxml-6.1.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:5ba186ad207446c65d3bb3d3e0412b032b1d9f595e59861e2354798c5703d955", size = 5233088, upload-time = "2026-05-18T19:18:31.433Z" }, + { url = "https://files.pythonhosted.org/packages/65/d1/bc0ed2427bf609f2ee10da303a6a226f9c8bce94f945dc29a32ce55de6e4/lxml-6.1.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:aa366a1e55b8ebfe8ca8ddc3cfe75c8ebade181aeb0f661d0cb05986b647f72a", size = 5260995, upload-time = "2026-05-18T19:18:37.091Z" }, + { url = "https://files.pythonhosted.org/packages/69/8b/6772e1a4b513fc50a8d931f19edde0e13ae6918510a1e13ff67864f3e5ed/lxml-6.1.1-cp312-cp312-win32.whl", hash = "sha256:126c93f7f56f0eda92f6d8c619edc463a4f23d9252f1c9d0405a76f25fa9f11a", size = 3596382, upload-time = "2026-05-18T19:17:18.37Z" }, + { url = "https://files.pythonhosted.org/packages/1b/89/45198e9624762af2dfd2cb8782598477ceb29f6e59caab560388ae1f4ec1/lxml-6.1.1-cp312-cp312-win_amd64.whl", hash = "sha256:26e6eda8d38c1fcab1090dd196ee87cbd13788e531937610e2589085de074e77", size = 3997255, upload-time = "2026-05-18T19:17:56.781Z" }, + { url = "https://files.pythonhosted.org/packages/90/a9/7a54b6834088d9ae528a7b780584ba6a39a9457b0ac330479f20ffbc9449/lxml-6.1.1-cp312-cp312-win_arm64.whl", hash = "sha256:6540377fbd53fe1b629172288c464fb18db11ce1fa7dc15891da10aa9dcc3e7f", size = 3659610, upload-time = "2026-05-19T19:22:50.843Z" }, + { url = "https://files.pythonhosted.org/packages/b5/32/86a3f0f724a3a402d4627937a7fc27b160e45e7012b4adf47f6e1e844511/lxml-6.1.1-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:31033dc34636ea6b7d5cc11b1ddbda78a14de858ba9d3e1ed4b69a3085bc521e", size = 3930127, upload-time = "2026-05-18T19:19:02.27Z" }, + { url = "https://files.pythonhosted.org/packages/40/44/d832e82af08723761556d004b1d04d281c09f9a8cecd7d3148548c9941a3/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:3893c14c4b6ac5b2d54ba8cf03e99fe5104e592de491f19bd6b82756c09f8004", size = 4210769, upload-time = "2026-05-18T19:20:41.427Z" }, + { url = "https://files.pythonhosted.org/packages/6d/39/0dc5949f759ed7d951e0bb8c2f2d9d7aca1908d22352fa84a8afd2ea54af/lxml-6.1.1-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c07da4cebf6889f03ebac8d238f62318e29f495de0aa18a51ea14e61ae907e2e", size = 4318163, upload-time = "2026-05-18T19:20:44.702Z" }, + { url = "https://files.pythonhosted.org/packages/e6/fb/8ab3845fe046ba4cbf74536bcf6801a774b7caf4350de1c5d37f1f0a9e90/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f6f0ce10945fab9c4c06ce14e22af9059d1a87493a9af4501a5b0b9187e21cf2", size = 4250945, upload-time = "2026-05-18T19:20:47.385Z" }, + { url = "https://files.pythonhosted.org/packages/68/1b/7553ab136894374ffae8851ec06f98f511cd8e66246e41b6be059d0a7289/lxml-6.1.1-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f8844cd288697c6425c9beba919302241e3278871dc6519515e72b04e987abcf", size = 4401664, upload-time = "2026-05-18T19:20:50.489Z" }, + { url = "https://files.pythonhosted.org/packages/db/a4/441aee36c6f6b249823d20fd91f9be9ab89d7c5a8ae542a4a4ca6d342d56/lxml-6.1.1-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:ed21202aec73cda4d55d1ce57b389aadb90ffb044e6cd1080b8347efe1b1ec84", size = 3508989, upload-time = "2026-05-18T19:18:38.158Z" }, +] + +[[package]] +name = "markdown-it-py" +version = "4.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mdurl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/06/ff/7841249c247aa650a76b9ee4bbaeae59370dc8bfd2f6c01f3630c35eb134/markdown_it_py-4.2.0.tar.gz", hash = "sha256:04a21681d6fbb623de53f6f364d352309d4094dd4194040a10fd51833e418d49", size = 82454, upload-time = "2026-05-07T12:08:28.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/81/4da04ced5a082363ecfa159c010d200ecbd959ae410c10c0264a38cac0f5/markdown_it_py-4.2.0-py3-none-any.whl", hash = "sha256:9f7ebbcd14fe59494226453aed97c1070d83f8d24b6fc3a3bcf9a38092641c4a", size = 91687, upload-time = "2026-05-07T12:08:27.182Z" }, +] + +[[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/e8/4b/3541d44f3937ba468b75da9eebcae497dcf67adb65caa16760b0a6807ebb/markupsafe-3.0.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:2f981d352f04553a7171b8e44369f2af4055f888dfb147d55e42d29e29e74559", size = 11631, upload-time = "2025-09-27T18:36:05.558Z" }, + { url = "https://files.pythonhosted.org/packages/98/1b/fbd8eed11021cabd9226c37342fa6ca4e8a98d8188a8d9b66740494960e4/markupsafe-3.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e1c1493fb6e50ab01d20a22826e57520f1284df32f2d8601fdd90b6304601419", size = 12057, upload-time = "2025-09-27T18:36:07.165Z" }, + { url = "https://files.pythonhosted.org/packages/40/01/e560d658dc0bb8ab762670ece35281dec7b6c1b33f5fbc09ebb57a185519/markupsafe-3.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1ba88449deb3de88bd40044603fafffb7bc2b055d626a330323a9ed736661695", size = 22050, upload-time = "2025-09-27T18:36:08.005Z" }, + { url = "https://files.pythonhosted.org/packages/af/cd/ce6e848bbf2c32314c9b237839119c5a564a59725b53157c856e90937b7a/markupsafe-3.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f42d0984e947b8adf7dd6dde396e720934d12c506ce84eea8476409563607591", size = 20681, upload-time = "2025-09-27T18:36:08.881Z" }, + { url = "https://files.pythonhosted.org/packages/c9/2a/b5c12c809f1c3045c4d580b035a743d12fcde53cf685dbc44660826308da/markupsafe-3.0.3-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:c0c0b3ade1c0b13b936d7970b1d37a57acde9199dc2aecc4c336773e1d86049c", size = 20705, upload-time = "2025-09-27T18:36:10.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/e3/9427a68c82728d0a88c50f890d0fc072a1484de2f3ac1ad0bfc1a7214fd5/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:0303439a41979d9e74d18ff5e2dd8c43ed6c6001fd40e5bf2e43f7bd9bbc523f", size = 21524, upload-time = "2025-09-27T18:36:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/bc/36/23578f29e9e582a4d0278e009b38081dbe363c5e7165113fad546918a232/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:d2ee202e79d8ed691ceebae8e0486bd9a2cd4794cec4824e1c99b6f5009502f6", size = 20282, upload-time = "2025-09-27T18:36:12.573Z" }, + { url = "https://files.pythonhosted.org/packages/56/21/dca11354e756ebd03e036bd8ad58d6d7168c80ce1fe5e75218e4945cbab7/markupsafe-3.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:177b5253b2834fe3678cb4a5f0059808258584c559193998be2601324fdeafb1", size = 20745, upload-time = "2025-09-27T18:36:13.504Z" }, + { url = "https://files.pythonhosted.org/packages/87/99/faba9369a7ad6e4d10b6a5fbf71fa2a188fe4a593b15f0963b73859a1bbd/markupsafe-3.0.3-cp310-cp310-win32.whl", hash = "sha256:2a15a08b17dd94c53a1da0438822d70ebcd13f8c3a95abe3a9ef9f11a94830aa", size = 14571, upload-time = "2025-09-27T18:36:14.779Z" }, + { url = "https://files.pythonhosted.org/packages/d6/25/55dc3ab959917602c96985cb1253efaa4ff42f71194bddeb61eb7278b8be/markupsafe-3.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:c4ffb7ebf07cfe8931028e3e4c85f0357459a3f9f9490886198848f4fa002ec8", size = 15056, upload-time = "2025-09-27T18:36:16.125Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9e/0a02226640c255d1da0b8d12e24ac2aa6734da68bff14c05dd53b94a0fc3/markupsafe-3.0.3-cp310-cp310-win_arm64.whl", hash = "sha256:e2103a929dfa2fcaf9bb4e7c091983a49c9ac3b19c9061b6d5427dd7d14d81a1", size = 13932, upload-time = "2025-09-27T18:36:17.311Z" }, + { url = "https://files.pythonhosted.org/packages/08/db/fefacb2136439fc8dd20e797950e749aa1f4997ed584c62cfb8ef7c2be0e/markupsafe-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1cc7ea17a6824959616c525620e387f6dd30fec8cb44f649e31712db02123dad", size = 11631, upload-time = "2025-09-27T18:36:18.185Z" }, + { url = "https://files.pythonhosted.org/packages/e1/2e/5898933336b61975ce9dc04decbc0a7f2fee78c30353c5efba7f2d6ff27a/markupsafe-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4bd4cd07944443f5a265608cc6aab442e4f74dff8088b0dfc8238647b8f6ae9a", size = 12058, upload-time = "2025-09-27T18:36:19.444Z" }, + { url = "https://files.pythonhosted.org/packages/1d/09/adf2df3699d87d1d8184038df46a9c80d78c0148492323f4693df54e17bb/markupsafe-3.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6b5420a1d9450023228968e7e6a9ce57f65d148ab56d2313fcd589eee96a7a50", size = 24287, upload-time = "2025-09-27T18:36:20.768Z" }, + { url = "https://files.pythonhosted.org/packages/30/ac/0273f6fcb5f42e314c6d8cd99effae6a5354604d461b8d392b5ec9530a54/markupsafe-3.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:0bf2a864d67e76e5c9a34dc26ec616a66b9888e25e7b9460e1c76d3293bd9dbf", size = 22940, upload-time = "2025-09-27T18:36:22.249Z" }, + { url = "https://files.pythonhosted.org/packages/19/ae/31c1be199ef767124c042c6c3e904da327a2f7f0cd63a0337e1eca2967a8/markupsafe-3.0.3-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:bc51efed119bc9cfdf792cdeaa4d67e8f6fcccab66ed4bfdd6bde3e59bfcbb2f", size = 21887, upload-time = "2025-09-27T18:36:23.535Z" }, + { url = "https://files.pythonhosted.org/packages/b2/76/7edcab99d5349a4532a459e1fe64f0b0467a3365056ae550d3bcf3f79e1e/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:068f375c472b3e7acbe2d5318dea141359e6900156b5b2ba06a30b169086b91a", size = 23692, upload-time = "2025-09-27T18:36:24.823Z" }, + { url = "https://files.pythonhosted.org/packages/a4/28/6e74cdd26d7514849143d69f0bf2399f929c37dc2b31e6829fd2045b2765/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:7be7b61bb172e1ed687f1754f8e7484f1c8019780f6f6b0786e76bb01c2ae115", size = 21471, upload-time = "2025-09-27T18:36:25.95Z" }, + { url = "https://files.pythonhosted.org/packages/62/7e/a145f36a5c2945673e590850a6f8014318d5577ed7e5920a4b3448e0865d/markupsafe-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f9e130248f4462aaa8e2552d547f36ddadbeaa573879158d721bbd33dfe4743a", size = 22923, upload-time = "2025-09-27T18:36:27.109Z" }, + { url = "https://files.pythonhosted.org/packages/0f/62/d9c46a7f5c9adbeeeda52f5b8d802e1094e9717705a645efc71b0913a0a8/markupsafe-3.0.3-cp311-cp311-win32.whl", hash = "sha256:0db14f5dafddbb6d9208827849fad01f1a2609380add406671a26386cdf15a19", size = 14572, upload-time = "2025-09-27T18:36:28.045Z" }, + { url = "https://files.pythonhosted.org/packages/83/8a/4414c03d3f891739326e1783338e48fb49781cc915b2e0ee052aa490d586/markupsafe-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:de8a88e63464af587c950061a5e6a67d3632e36df62b986892331d4620a35c01", size = 15077, upload-time = "2025-09-27T18:36:29.025Z" }, + { url = "https://files.pythonhosted.org/packages/35/73/893072b42e6862f319b5207adc9ae06070f095b358655f077f69a35601f0/markupsafe-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:3b562dd9e9ea93f13d53989d23a7e775fdfd1066c33494ff43f5418bc8c58a5c", size = 13876, upload-time = "2025-09-27T18:36:29.954Z" }, + { 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" }, +] + +[[package]] +name = "matplotlib" +version = "3.10.9" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "contourpy", version = "1.3.2", source = { registry = "https://pypi.org/simple" } }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/63/1b/4be5be87d43d327a0cf4de1a56e86f7f84c89312452406cf122efe2839e6/matplotlib-3.10.9.tar.gz", hash = "sha256:fd66508e8c6877d98e586654b608a0456db8d7e8a546eb1e2600efd957302358", size = 34811233, upload-time = "2026-04-24T00:14:13.539Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/18/6f/340b04986e67aac6f66c5145ce68bf72c64bed30f92c8913499a6e6b8f99/matplotlib-3.10.9-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:77210dce9cb8153dffc967efaae990543392563d5a376d4dd8539bebcb0ed217", size = 8296625, upload-time = "2026-04-24T00:11:43.376Z" }, + { url = "https://files.pythonhosted.org/packages/bb/2f/127081eb83162053ebb9678ceac64220b93a663e0167432566e9c7c82aab/matplotlib-3.10.9-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1e7698ac9868428e84d2c967424803b2472ff7167d9d6590d4204ed775343c3b", size = 8188790, upload-time = "2026-04-24T00:11:46.556Z" }, + { url = "https://files.pythonhosted.org/packages/fc/b7/d8bcec2626c35f96972bff656299fef4578113ea6193c8fdad324710410c/matplotlib-3.10.9-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:1aa972116abb4c9d201bf245620b433726cb6856f3bef6a78f776a00f5c92d37", size = 8769389, upload-time = "2026-04-24T00:11:48.959Z" }, + { url = "https://files.pythonhosted.org/packages/12/49/b78e214a527ea732033b7f4d37f7afb504d74ba9d134bd47938230dfb8b1/matplotlib-3.10.9-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ae2f11957b27ce53497dd4d7b235c4d4f1faf383dfb39d0c5beb833bff883294", size = 9589657, upload-time = "2026-04-24T00:11:51.915Z" }, + { url = "https://files.pythonhosted.org/packages/5f/15/5246f7b43beae19c74dfee651d58d6cc8112e06f77adb4e88cc04f2e3a23/matplotlib-3.10.9-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b049278ddce116aaa1c1377ebf58adea909132dfce0281cf7e3a1ea9fc2e2c65", size = 9651983, upload-time = "2026-04-24T00:11:54.766Z" }, + { url = "https://files.pythonhosted.org/packages/75/77/5acecfe672ba0fa1b8c0454f69ce155d1e6fc5852fa7206bf9afaf767121/matplotlib-3.10.9-cp310-cp310-win_amd64.whl", hash = "sha256:82834c3c292d24d3a8aae77cd2d20019de69d692a34a970e4fdb8d33e2ea3dda", size = 8199701, upload-time = "2026-04-24T00:11:58.389Z" }, + { url = "https://files.pythonhosted.org/packages/4c/8c/290f021104741fea63769c31494f5324c0cd249bf536a65a4350767b1f22/matplotlib-3.10.9-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:68cfdcede415f7c8f5577b03303dd94526cdb6d11036cecdc205e08733b2d2bb", size = 8306860, upload-time = "2026-04-24T00:12:01.207Z" }, + { url = "https://files.pythonhosted.org/packages/51/18/325cd32ece1120d1da51cc4e4294c6580190699490183fc2fe8cb6d61ec5/matplotlib-3.10.9-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dfca0129678bd56379db26c52b5d77ed7de314c047492fbdc763aa7501710cfb", size = 8199254, upload-time = "2026-04-24T00:12:04.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/db/e28c1b83e3680740aa78925f5fb2ae4d16207207419ad75ea9fe604f8676/matplotlib-3.10.9-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:8e436d155fa8a3399dc62683f8f5d0e2e50d25d0144a73edd73f82eec8f4abfb", size = 8777092, upload-time = "2026-04-24T00:12:06.793Z" }, + { url = "https://files.pythonhosted.org/packages/55/fa/3ce7adfe9ba101748f465211660d9c6374c876b671bdb8c2bb6d347e8b94/matplotlib-3.10.9-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:56fc0bd271b00025c6edfdc7c2dcd247372c8e1544971d62e1dc7c17367e8bf9", size = 9595691, upload-time = "2026-04-24T00:12:09.706Z" }, + { url = "https://files.pythonhosted.org/packages/36/c4/6960a76686ed668f2c60f84e9799ba4c0d56abdb36b1577b60c1d061d1ec/matplotlib-3.10.9-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a5a6104ed666402ba5106d7f36e0e0cdca4e8d7fa4d39708ca88019e2835a2eb", size = 9659771, upload-time = "2026-04-24T00:12:12.766Z" }, + { url = "https://files.pythonhosted.org/packages/7e/0d/271aace3342157c64700c9ff4c59c7b392f3dbab393692e8db6fbe7ab96c/matplotlib-3.10.9-cp311-cp311-win_amd64.whl", hash = "sha256:d730e984eddf56974c3e72b6129c7ca462ac38dc624338f4b0b23eb23ecba00f", size = 8205112, upload-time = "2026-04-24T00:12:15.773Z" }, + { url = "https://files.pythonhosted.org/packages/e2/ee/cb57ad4754f3e7b9174ce6ce66d9205fb827067e48a9f58ac09d7e7d6b77/matplotlib-3.10.9-cp311-cp311-win_arm64.whl", hash = "sha256:51bf0ddbdc598e060d46c16b5590708f81a1624cefbaaf62f6a81bf9285b8c80", size = 8132310, upload-time = "2026-04-24T00:12:18.645Z" }, + { url = "https://files.pythonhosted.org/packages/35/c6/5581e26c72233ebb2a2a6fed2d24fb7c66b4700120b813f51b0555acf0b6/matplotlib-3.10.9-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:f0c3c28d9fbcc1fe7a03be236d73430cf6409c41fb2383a7ac52fe932b072cb1", size = 8319908, upload-time = "2026-04-24T00:12:21.323Z" }, + { url = "https://files.pythonhosted.org/packages/b7/18/4880dd762e40cd360c1bf06e890c5a97b997e91cb324602b1a19950ad5ce/matplotlib-3.10.9-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:41cb28c2bd769aa3e98322c6ab09854cbcc52ab69d2759d681bba3e327b2b320", size = 8216016, upload-time = "2026-04-24T00:12:23.4Z" }, + { url = "https://files.pythonhosted.org/packages/32/91/d024616abdba99e83120e07a20658976f6a343646710760c4a51df126029/matplotlib-3.10.9-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:ae20801130378b82d647ff5047c07316295b68dc054ca6b3c13519d0ea624285", size = 8789336, upload-time = "2026-04-24T00:12:26.096Z" }, + { url = "https://files.pythonhosted.org/packages/5c/04/030a2f61ef2158f5e4c259487a92ac877732499fb33d871585d89e03c42d/matplotlib-3.10.9-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c63ebcd8b4b169eb2f5c200552ae6b8be8999a005b6b507ed76fb8d7d674fe2", size = 9604602, upload-time = "2026-04-24T00:12:29.052Z" }, + { url = "https://files.pythonhosted.org/packages/fc/c2/541e4d09d87bb6b5830fc28b4c887a9a8cf4e1c6cee698a8c05552ae2003/matplotlib-3.10.9-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:d75d11c949914165976c621b2324f9ef162af7ebf4b057ddf95dd1dba7e5edcf", size = 9670966, upload-time = "2026-04-24T00:12:32.131Z" }, + { url = "https://files.pythonhosted.org/packages/04/a1/4571fc46e7702de8d0c2dc54ad1b2f8e29328dea3ee90831181f7353d93c/matplotlib-3.10.9-cp312-cp312-win_amd64.whl", hash = "sha256:d091f9d758b34aaaaa6331d13574bf01891d903b3dec59bfff458ef7551de5d6", size = 8217462, upload-time = "2026-04-24T00:12:35.226Z" }, + { url = "https://files.pythonhosted.org/packages/4b/d0/2269edb12aa30c13c8bcc9382892e39943ce1d28aab4ec296e0381798e81/matplotlib-3.10.9-cp312-cp312-win_arm64.whl", hash = "sha256:10cc5ce06d10231c36f40e875f3c7e8050362a4ee8f0ee5d29a6b3277d57bb42", size = 8136688, upload-time = "2026-04-24T00:12:37.442Z" }, + { url = "https://files.pythonhosted.org/packages/2c/2b/0e92ad0ac446633f928a1563db4aa8add407e1924faf0ded5b95b35afb27/matplotlib-3.10.9-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:1872fb212a05b729e649754a72d5da61d03e0554d76e80303b6f83d1d2c0552b", size = 8293058, upload-time = "2026-04-24T00:13:56.339Z" }, + { url = "https://files.pythonhosted.org/packages/4b/23/74682fd369f5299ceda438fea2a0662e6383b85c9383fb9cdfcf04713e07/matplotlib-3.10.9-pp310-pypy310_pp73-macosx_11_0_arm64.whl", hash = "sha256:985f2238880e2e69093f588f5fe2e46771747febf0649f3cf7f7b7480875317f", size = 8186627, upload-time = "2026-04-24T00:13:58.623Z" }, + { url = "https://files.pythonhosted.org/packages/ca/e8/368aab88f3c4cd8992800f31abfe0670c3e47540ba20a97e9fdbcde594b3/matplotlib-3.10.9-pp310-pypy310_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:6640f75af2c6148293caa0a2b39dd806a492dd66c8a8b04035813e33d0fd2585", size = 8764117, upload-time = "2026-04-24T00:14:01.684Z" }, + { url = "https://files.pythonhosted.org/packages/63/e2/9f66ca6a651a52abfe0d4964ce01439ed34f3f1e119de10ff3a07f403043/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:42fb814efabe95c06c1994d8ab5a8385f43a249e23badd3ba931d4308e5bca20", size = 8304420, upload-time = "2026-04-24T00:14:04.57Z" }, + { url = "https://files.pythonhosted.org/packages/e8/e8/467c03568218792906aa87b5e7bb379b605e056ed0c74fe00c051786d925/matplotlib-3.10.9-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:f76e640a5268850bfda54b5131b1b1941cc685e42c5fa98ed9f2d64038308cba", size = 8197981, upload-time = "2026-04-24T00:14:07.233Z" }, + { url = "https://files.pythonhosted.org/packages/6f/87/afead29192170917537934c6aff4b008c805fff7b1ccea0c79120d96beda/matplotlib-3.10.9-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:3fc0364dfbe1d07f6d15c5ebd0c5bf89e126916e5a8667dd4a7a6e84c36653d4", size = 8774002, upload-time = "2026-04-24T00:14:09.816Z" }, +] + +[[package]] +name = "matplotlib" +version = "3.11.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "contourpy", version = "1.3.3", source = { registry = "https://pypi.org/simple" } }, + { name = "cycler" }, + { name = "fonttools" }, + { name = "kiwisolver" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "pyparsing" }, + { name = "python-dateutil" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1f/24/080c99d223d158d3a8902769269ab6da5b50f7a0e6e072513907e02b7a6c/matplotlib-3.11.0.tar.gz", hash = "sha256:68c0c7be01b30dcca3638934f7f591df73401235cbdbf0d1ab1c71e7db7f8b57", size = 33251176, upload-time = "2026-06-12T02:29:15.508Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/a2/78f662f1b18968531f67d3fcde1b7ea8496920bacd4f16ddb5b79d112e46/matplotlib-3.11.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:f857524b442f0f36e641868ce2171aafa88cb0bc0644f4e1d8a5df9b32649fef", size = 9436261, upload-time = "2026-06-12T02:27:34.161Z" }, + { url = "https://files.pythonhosted.org/packages/5e/92/044f1de43901310202f4c79acf4f141be53b2ca8d8380e2fcefb3d523a75/matplotlib-3.11.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:57baa92fdc82948ed716eae6d2579d4d6f40965cd8d2f416755b4a72580a3233", size = 9264669, upload-time = "2026-06-12T02:27:37.413Z" }, + { url = "https://files.pythonhosted.org/packages/53/f4/f0b4f9ba7ec14a7af8151f3ad71ecfe3561e6ba38cfab1db3681ba4ca112/matplotlib-3.11.0-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:630eee0e67d35cce2019a0e670719f4816e3b86aff0fa72729f6c69786fceb45", size = 10021076, upload-time = "2026-06-12T02:27:39.926Z" }, + { url = "https://files.pythonhosted.org/packages/d7/33/4d679c6dcd594a156542080ac907ddccf7b09ca11655c4b28eca8e9ee5da/matplotlib-3.11.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5106c444d0bf966eee2853548c03772af4ab7199118e086c62fbac8ccb07c055", size = 10828999, upload-time = "2026-06-12T02:27:42.433Z" }, + { url = "https://files.pythonhosted.org/packages/07/74/0a3683802037d8cd013144d77c247219b47f2aabace6fdde74faa12bacf7/matplotlib-3.11.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4d7aea652b58e686444079be3376ef546bffa1eee9b9bb9c472b9fcf6cf410d3", size = 10913103, upload-time = "2026-06-12T02:27:44.827Z" }, + { url = "https://files.pythonhosted.org/packages/d0/9f/970fcbf381e82ec66fdf5da8ea76e2e9240f61a24011ce9fd1d42c37ac2d/matplotlib-3.11.0-cp311-cp311-win_amd64.whl", hash = "sha256:70a5b3e9a5dab708c0f039709ae7c68d5b4d254e291ef76492cdba230c8bb5e4", size = 9310945, upload-time = "2026-06-12T02:27:46.867Z" }, + { url = "https://files.pythonhosted.org/packages/14/4e/6e7cfed23611265ded53806852343b5c59339e506e84c474a9b5afc3b249/matplotlib-3.11.0-cp311-cp311-win_arm64.whl", hash = "sha256:3d68266213e73823ac3be90615bab0cf31f88851e114cdb1dd25dacf3b01e1a7", size = 8999304, upload-time = "2026-06-12T02:27:48.798Z" }, + { url = "https://files.pythonhosted.org/packages/da/17/f5276b496c61477a6c4fc5e7401f4bfe1c2e5ef7c6cd67896f2ade3809cb/matplotlib-3.11.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:06b5872e9cf11adc8f589ded3ce11bc3e1061ad498259664fabc1f6615beb918", size = 9449976, upload-time = "2026-06-12T02:27:50.989Z" }, + { url = "https://files.pythonhosted.org/packages/82/34/bdd77418adb2178a1d59f044bd67bfebb115896e91b840b8a197eb3f4f4e/matplotlib-3.11.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0515d495124be3124340e59f164d901ed4484e2246a5b74cfa483cac3b80bd97", size = 9279307, upload-time = "2026-06-12T02:27:53.247Z" }, + { url = "https://files.pythonhosted.org/packages/94/95/7f522393c88313336b20d70fc849555757b2e5febc22b83b3a3f0fd4bce9/matplotlib-3.11.0-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:be5f93a1d21981bfb802ded0d77a0caa92d4342a47d45754fac77e314a506344", size = 10031353, upload-time = "2026-06-12T02:27:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/87/ce/8f25a0e3186aefd61913e7467d1b999465bcd0d0c03ac695c1b26ca559b7/matplotlib-3.11.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:41635d7909d19e52e924a521dde6d8f670b0f53ab1d0e8c331fa831554f681d1", size = 10839232, upload-time = "2026-06-12T02:27:57.746Z" }, + { url = "https://files.pythonhosted.org/packages/85/c2/db15da2bbdf9e3ca66df7db8e2c33a1dfed67be24a24d2c878efaaff01d6/matplotlib-3.11.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:94f5000f67ca9faa300863ea17f8bce9175cb67b88bec4bc7780502d53dd7c9e", size = 10923899, upload-time = "2026-06-12T02:28:00.223Z" }, + { url = "https://files.pythonhosted.org/packages/e5/2f/a58a4443a4d052a4ea77557478336aefc26c7981f6408d37adba763aa758/matplotlib-3.11.0-cp312-cp312-win_amd64.whl", hash = "sha256:ac6f1ef39f3d0f9e2463303013094992cdbe0f85f43bc54155bc472b2042768e", size = 9329528, upload-time = "2026-06-12T02:28:02.27Z" }, + { url = "https://files.pythonhosted.org/packages/61/0f/4b669589d47733b97ab9df4b58d6fc1e68acb5ea42a928dc7cbdd6bf5871/matplotlib-3.11.0-cp312-cp312-win_arm64.whl", hash = "sha256:9dd11fb612ce7bc60b1de5b4fc87ff959d22317b5de42aabf392f66f97af22eb", size = 9003413, upload-time = "2026-06-12T02:28:04.49Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c2/f5da6cd37ed6871f5c9b3c0507ddb69f14d6c36fac4541e4e0c60cb8cdfc/matplotlib-3.11.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:81ae77077a1e16d37a5b61096ccb07c8d90a99b518fa8256b8f21578932f2f62", size = 9434094, upload-time = "2026-06-12T02:29:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/f8/07/56f66906e0f87a0c6d0d0acbd34dbc9432b1931d8f26ef618bd6f92932a9/matplotlib-3.11.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ddef37840695f5eef65f9f070fe2d2f510f584c2156203f9f622a5b0584efffd", size = 9262183, upload-time = "2026-06-12T02:29:11.283Z" }, + { url = "https://files.pythonhosted.org/packages/0c/d8/c4ecab06b7ea36a570c4f3bd2d48d1799fd5d9174470e45c2194199431e7/matplotlib-3.11.0-pp311-pypy311_pp73-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:cf662e5ac5707658cb931e19972c4bd99f7b4f8b7bf79d3c821d239fa6b71e64", size = 10015653, upload-time = "2026-06-12T02:29:13.251Z" }, +] + +[[package]] +name = "matplotlib-inline" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/c0/9f7c9a46090390368a4d7bcb76bb87a4a36c421e4c0792cdb53486ffac7a/matplotlib_inline-0.2.2.tar.gz", hash = "sha256:72f3fe8fce36b70d4a5b612f899090cd0401deddc4ea90e1572b9f4bfb058c79", size = 8150, upload-time = "2026-05-08T17:33:33.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/41/09/5b161152e2d90f7b87f781c2e1267494aef9c32498df793f73ad0a0a494a/matplotlib_inline-0.2.2-py3-none-any.whl", hash = "sha256:3c821cf1c209f59fb2d2d64abbf5b23b67bcb2210d663f9918dd851c6da1fcf6", size = 9534, upload-time = "2026-05-08T17:33:32.055Z" }, +] + +[[package]] +name = "mdurl" +version = "0.1.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/54/cfe61301667036ec958cb99bd3efefba235e65cdeb9c84d24a8293ba1d90/mdurl-0.1.2.tar.gz", hash = "sha256:bb413d29f5eea38f31dd4754dd7377d4465116fb207585f97bf925588687c1ba", size = 8729, upload-time = "2022-08-14T12:40:10.846Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/38/89ba8ad64ae25be8de66a6d463314cf1eb366222074cfda9ee839c56a4b4/mdurl-0.1.2-py3-none-any.whl", hash = "sha256:84008a41e51615a49fc9966191ff91509e3c40b939176e643fd50a5c2196b8f8", size = 9979, upload-time = "2022-08-14T12:40:09.779Z" }, +] + +[[package]] +name = "mistune" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/5f/007786743f962224423753b78f7d7acb0f2ade46d1604f2e0fa2bedf9020/mistune-3.3.2.tar.gz", hash = "sha256:e12ee4f1e74336e91aa1141e35f913b337c40bdf7c0cc49f21fb853a27e8b62f", size = 111284, upload-time = "2026-06-23T00:29:28.568Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/43/894c2cbbcbdf53b57d1257a249811abe2ee9ab7ef76af301b40f1c054533/mistune-3.3.2-py3-none-any.whl", hash = "sha256:a678a56387d487db7368ede4647cb2ba1deff22ce61f92343e4ebe0ddfce4f2d", size = 61554, upload-time = "2026-06-23T00:29:27.088Z" }, +] + +[[package]] +name = "mongoengine" +version = "0.29.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pymongo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b4/76/160e35d90a671913146b884b1ca586909036dd56070600035821870b1aad/mongoengine-0.29.3.tar.gz", hash = "sha256:4267702aea433012845cb12b6334bff86a0a3084b5d141c1e4553ea20374a9b4", size = 188213, upload-time = "2026-03-10T15:19:17.946Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c7/b5/214ea32710fa3ad7c13820cbb9f9a457d4809a5d54995e0d081f33c75116/mongoengine-0.29.3-py3-none-any.whl", hash = "sha256:2d5a216cf2368867d43e5321b13044ecc3e72c3f19ace21b1c5e7403951ca685", size = 112513, upload-time = "2026-03-10T15:19:16.619Z" }, +] + +[[package]] +name = "more-itertools" +version = "11.1.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/de/1d/f4da6f02cdffe04d6362210b807146a26044c88d839208aec273bb0d9184/more_itertools-11.1.0.tar.gz", hash = "sha256:48e8f4d9e7e5878571ecf6f2b4e57634f93cd474cc8cfbd2376f2d11b396e30d", size = 145772, upload-time = "2026-05-22T14:14:29.909Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e8/3d/1087453384dbde46a8c7f9356eead2c58be8a7bf156bca40243377c85715/more_itertools-11.1.0-py3-none-any.whl", hash = "sha256:4b65538ae22f6fed0ce4874efd317463a7489796a0939fa66824dd542125a192", size = 72226, upload-time = "2026-05-22T14:14:28.824Z" }, +] + +[[package]] +name = "motor" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pymongo" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c3/5d/be1f10b4ecc259503bcc9c5642a61b39715796343c771f3f61b84f79ee21/motor-3.6.1.tar.gz", hash = "sha256:ee2b18386292f9ceb3cc8279a4cd34e4c641c5ac8de3500c30374081c76a9d03", size = 279031, upload-time = "2025-01-14T18:46:12.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/aa/a255c74c702477a8610fa24fb83af45ce1a2dd0bce7bca4e2230e2c9a23b/motor-3.6.1-py3-none-any.whl", hash = "sha256:7fe552353aded4fa9f05ae515a179df5b1d192b1da56726f422dbb2d8c3b5962", size = 74813, upload-time = "2025-01-14T18:46:08.002Z" }, +] + +[[package]] +name = "mpmath" +version = "1.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e0/47/dd32fa426cc72114383ac549964eecb20ecfd886d1e5ccf5340b55b02f57/mpmath-1.3.0.tar.gz", hash = "sha256:7a28eb2a9774d00c7bc92411c19a89209d5da7c4c9a9e227be8330a23a25b91f", size = 508106, upload-time = "2023-03-07T16:47:11.061Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/43/e3/7d92a15f894aa0c9c4b49b8ee9ac9850d6e63b03c9c32c0367a13ae62209/mpmath-1.3.0-py3-none-any.whl", hash = "sha256:a0b2b9fe80bbcd81a6647ff13108738cfb482d481d826cc0e02f5b35e5c88d2c", size = 536198, upload-time = "2023-03-07T16:47:09.197Z" }, +] + +[[package]] +name = "msgpack" +version = "1.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/31/f9/c0a1c127f9049db9155afc316952ea571720dd01833ff5e4d7e8e6352dbb/msgpack-1.2.1.tar.gz", hash = "sha256:04c721c2c7448767e9e3f2520a475663d8ee0f09c31890f6d2bd70fd636a9647", size = 183960, upload-time = "2026-06-18T16:13:52.594Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/16/f70100614b69feb3ade7285f08c9c52d6cda0a5c03f3f5e2facd63acb211/msgpack-1.2.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8c7b398c56ff125feae96c2737abfec5595f1fa0aa186df60c56040b8accb95c", size = 82926, upload-time = "2026-06-18T16:12:31.531Z" }, + { url = "https://files.pythonhosted.org/packages/e4/3c/08ecd5cdfe4e2de43aec79062028ad0f7b2d9b1fea5430068c198ba570da/msgpack-1.2.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:1548006a91aa93c5da81f3bdcebc1a0d10cea2d25969754fbe848da622b2b895", size = 82730, upload-time = "2026-06-18T16:12:32.894Z" }, + { url = "https://files.pythonhosted.org/packages/19/9f/a70c9cb1a04ecc134005149367dcfe35d167284e8f65035a1e4156ad17b5/msgpack-1.2.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1dabedcd0f23559f3596428c6589c1cd8c6eaed3a0d720795b07b0225d769203", size = 400729, upload-time = "2026-06-18T16:12:34.052Z" }, + { url = "https://files.pythonhosted.org/packages/fa/7f/5ce020168cf0439041526e95aa068c722c016aee21624e331aeabeee2e8e/msgpack-1.2.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:83efa1c898e0fc5380fc0cabbf75164c52e3b5cbb45973710d75821928380c73", size = 407625, upload-time = "2026-06-18T16:12:35.239Z" }, + { url = "https://files.pythonhosted.org/packages/79/70/fb7668ce0386819303047057aef6fc1da73b584291d9cff82b821744e2ef/msgpack-1.2.1-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:01e2dd6c9b19d333a00282330cc8a73d38d8dabc306dc5b42cd668c3ac82e833", size = 377891, upload-time = "2026-06-18T16:12:36.684Z" }, + { url = "https://files.pythonhosted.org/packages/3d/dc/9ebe654a73c3aed2e40aa6b52e3c2a02b5f53ef0085fa235a45d5b367f87/msgpack-1.2.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:350cb813d0af6e65d2f7ef0d729f7ff5be5a8bce03665892f43e5883d4ecc1b8", size = 391987, upload-time = "2026-06-18T16:12:37.839Z" }, + { url = "https://files.pythonhosted.org/packages/42/eb/b67cf64218a2fa25e1c671fe1d3dbb06cbeb973e71bc4b822da079862d0b/msgpack-1.2.1-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:ee1d9ed27d0497b848923746cf762ed2e7db24f4be7eec8e5cbe8c766aa707b7", size = 374603, upload-time = "2026-06-18T16:12:39.221Z" }, + { url = "https://files.pythonhosted.org/packages/a2/2e/9ee200cde32fd1a0101b4006202fde554c1860adfb9bf7bff31ea4c08df8/msgpack-1.2.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:633727297ed063441fd1cda2288865487f33ad14eeb8831afb5f0c396a62cfce", size = 405121, upload-time = "2026-06-18T16:12:40.524Z" }, + { url = "https://files.pythonhosted.org/packages/43/b6/f10117be7ca7a51e8feed699a907b8e663a8cd66e115ae6b4fb30cc7945c/msgpack-1.2.1-cp310-cp310-win32.whl", hash = "sha256:298872ecf9e61950f1c6af4ca969b859ee91783bb920ef6e6172697d0c8aad74", size = 64088, upload-time = "2026-06-18T16:12:41.762Z" }, + { url = "https://files.pythonhosted.org/packages/ba/93/89976c696fb0224662239d952c47b4d1661b34d79a332ef5584facaa8579/msgpack-1.2.1-cp310-cp310-win_amd64.whl", hash = "sha256:2ff164c1b0bcb740b073b99e945234d0212852fa378e44a208c425379140dbeb", size = 70113, upload-time = "2026-06-18T16:12:42.78Z" }, + { url = "https://files.pythonhosted.org/packages/f4/6b/e9b1cdc042c4458801d2545ed782a95f3d6ba8e270cce8745b8603c7f748/msgpack-1.2.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:29a3f6e9667868429d8240dfd063ea5ffdc1321c13d783aa23827a38de0dcb22", size = 82812, upload-time = "2026-06-18T16:12:45.022Z" }, + { url = "https://files.pythonhosted.org/packages/0c/3a/dd518a1bf78ed1e9ad8afe57307c079a00eafe4b3068932a27ca1ea56b4f/msgpack-1.2.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:aded5bdf32609dc7987a49bbbd15a8ef096193f96dd8bbeb791de729e650acf5", size = 82739, upload-time = "2026-06-18T16:12:46.025Z" }, + { url = "https://files.pythonhosted.org/packages/70/e0/7ba9e1542bf0771a27b8b37c1316e3f95ae9d748fd765284655c476ad4ef/msgpack-1.2.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:146ee4e9ce80b365c6d4c47073da9da7bcec473e58194ceee5dd7620ace77e06", size = 414233, upload-time = "2026-06-18T16:12:47.029Z" }, + { url = "https://files.pythonhosted.org/packages/03/8d/671d81534ea0e2b0e8a121be100020da09eb78861fe3aa8f3ef7dcd3bed1/msgpack-1.2.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a28d076ca7c82b9c8728ad90b7147489449557038bed50e4241eb832395169b4", size = 423843, upload-time = "2026-06-18T16:12:48.19Z" }, + { url = "https://files.pythonhosted.org/packages/d2/b6/e5c737515ed1f166664b87601b532f58cbb73d8aa6a90b99f7c2c5037e8e/msgpack-1.2.1-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:7d31c0ac0c640f877804c67cb2bc9f4e23dc2db97e96c2e67fa27d38283b41f8", size = 390772, upload-time = "2026-06-18T16:12:49.624Z" }, + { url = "https://files.pythonhosted.org/packages/a8/46/62ed8c2e87d7021eab19921594d961ef3aa3794eec76c716dc30f3bfd433/msgpack-1.2.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:8ff92d7feeaf5bc26c51495b69e2f99ed97ab79346fb6555f44be7dd2ac6503b", size = 409559, upload-time = "2026-06-18T16:12:50.936Z" }, + { url = "https://files.pythonhosted.org/packages/70/ff/59aa3887b860bbf43532835e192b1c388a17590d6068ae4f8b2bc74c906e/msgpack-1.2.1-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:779197a6513bab3c3632265e3d0f7cb3227e62510841a6f34f1eaa37efbb345e", size = 387838, upload-time = "2026-06-18T16:12:52.161Z" }, + { url = "https://files.pythonhosted.org/packages/09/11/f8563e471093420cf6478cb3271a0175d8402b82d879783d4035d2d03360/msgpack-1.2.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:67f6dd22fa72a93752643f07889796d62739a13415ee630169a8ce764f86cf9f", size = 421732, upload-time = "2026-06-18T16:12:53.556Z" }, + { url = "https://files.pythonhosted.org/packages/57/cf/e673683c4c6c90c1022b24c65af4b03eda72b182a1176ef6449069d66acc/msgpack-1.2.1-cp311-cp311-win32.whl", hash = "sha256:91054a783328e0ea7954b8771095705c8d2243b814743fbaadf14552c9c52c5d", size = 64091, upload-time = "2026-06-18T16:12:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/3f/07/ca212739d179f9083bff2c7c08c24101c3555a334fadc2b876b18768a3ae/msgpack-1.2.1-cp311-cp311-win_amd64.whl", hash = "sha256:2eda0b7ebb1283a98d3e4492ac933c8af6aff59fd3df1c3ed024f536af4b1dc8", size = 70462, upload-time = "2026-06-18T16:12:55.898Z" }, + { url = "https://files.pythonhosted.org/packages/6d/be/6798347b425e26f35db82e69dd83c09716c856a3714e7bffc4c0860fd830/msgpack-1.2.1-cp311-cp311-win_arm64.whl", hash = "sha256:6ee967f7c7e1df2890c671ff2ee51a28ded0efc95da3e507176dee881ce36c66", size = 65059, upload-time = "2026-06-18T16:12:57.053Z" }, + { url = "https://files.pythonhosted.org/packages/bc/dd/9e8cbd8f5582ca4b590336f2b91ee5662f6a6ca562b565abaf696a0f81ff/msgpack-1.2.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2ef59c659f289eddf8aa6623823f19fa2f40a4029266889eac7a2505dd210c35", size = 83531, upload-time = "2026-06-18T16:12:58.249Z" }, + { url = "https://files.pythonhosted.org/packages/50/2e/ebdb85a8da151397a2790363676b7ed7c125924fe618e4c6d8befb0cc62c/msgpack-1.2.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3567748a5107cb40cdf66a275430c2f87c07777698f4bfd25c35f44d533258c", size = 82657, upload-time = "2026-06-18T16:12:59.396Z" }, + { url = "https://files.pythonhosted.org/packages/26/aa/753ad8b007b464e1d8aa0c8e650b9c5f4f725e658fc5ac8a7635c55b7f6e/msgpack-1.2.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:60926b75d00c8e816ef98f3034f484a8bc64242d66839cef4cf7e503142316a0", size = 410634, upload-time = "2026-06-18T16:13:00.383Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/6adabd4f6d5e686f97dd02ce7fce3fe4cf672cbac36b8f67ff4040e8ad8b/msgpack-1.2.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:020e881a764b20d8d7ca1a54fc01b8175519d108e3c3f194fddc200bda95951a", size = 419989, upload-time = "2026-06-18T16:13:01.776Z" }, + { url = "https://files.pythonhosted.org/packages/5a/cc/85039b7b0eb168aaad7383a23c97e291a11f08351cb45a606ce865e4e3f1/msgpack-1.2.1-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:4202c74688ca06591f78cb18988228bd4cca2cc75d57b60008372892d2f1e6e6", size = 377544, upload-time = "2026-06-18T16:13:03.637Z" }, + { url = "https://files.pythonhosted.org/packages/ed/bf/35963899493b32030c85fc513b723ae66144ac70c11ebc52e889e16e3d99/msgpack-1.2.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8b267ce94efb76fbd1b3373511420074ee3187f0f7811bf394531de13294735a", size = 400842, upload-time = "2026-06-18T16:13:05.012Z" }, + { url = "https://files.pythonhosted.org/packages/a6/df/8e2ac970c8f99264cd9997d1c73df5466bc19da3301d7dc5500862a9b089/msgpack-1.2.1-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:e4f1d0f8f98ade9634e01fb704a408f9336c0a8f1117b369f5db83dc7551d8b1", size = 374108, upload-time = "2026-06-18T16:13:06.232Z" }, + { url = "https://files.pythonhosted.org/packages/17/dd/fa8bd265110dfa51c20cb529f9e6d240a16fafe7e645004c6af2d01353ba/msgpack-1.2.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f02cf17a6ca1abe29b5f980644f7551f94d71f2011509b26d8625ce038f0df64", size = 414939, upload-time = "2026-06-18T16:13:07.478Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b9/8377a5ad8953fc0437c70cc98d9ae29f27fe5ac5109fbec0812085865735/msgpack-1.2.1-cp312-cp312-win32.whl", hash = "sha256:0c0d9802354507bcba62af19c17918e3eb437cc25e6f50657d511b5856a77aac", size = 64504, upload-time = "2026-06-18T16:13:08.822Z" }, + { url = "https://files.pythonhosted.org/packages/57/7f/ce1e377df7e62461fefd9eb23bfb93a4a523f40a517b377b8f844d836828/msgpack-1.2.1-cp312-cp312-win_amd64.whl", hash = "sha256:5c24aa15d5963051e1a5c62b12c50cd705992502b5ec1f3bece6046f33c9fc24", size = 71421, upload-time = "2026-06-18T16:13:09.828Z" }, + { url = "https://files.pythonhosted.org/packages/8f/32/ebfe84c9929f08f188d56c7a2fd913406a9ddad76a634697c1c43b8112e6/msgpack-1.2.1-cp312-cp312-win_arm64.whl", hash = "sha256:4227224aaec8f7fbcbfbd4272319347b2bb4030366502600f8c45588c5187b07", size = 64775, upload-time = "2026-06-18T16:13:11.056Z" }, +] + +[[package]] +name = "multidict" +version = "6.7.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/1a/c2/c2d94cbe6ac1753f3fc980da97b3d930efe1da3af3c9f5125354436c073d/multidict-6.7.1.tar.gz", hash = "sha256:ec6652a1bee61c53a3e5776b6049172c53b6aaba34f18c9ad04f82712bac623d", size = 102010, upload-time = "2026-01-26T02:46:45.979Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/84/0b/19348d4c98980c4851d2f943f8ebafdece2ae7ef737adcfa5994ce8e5f10/multidict-6.7.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:c93c3db7ea657dd4637d57e74ab73de31bccefe144d3d4ce370052035bc85fb5", size = 77176, upload-time = "2026-01-26T02:42:59.784Z" }, + { url = "https://files.pythonhosted.org/packages/ef/04/9de3f8077852e3d438215c81e9b691244532d2e05b4270e89ce67b7d103c/multidict-6.7.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:974e72a2474600827abaeda71af0c53d9ebbc3c2eb7da37b37d7829ae31232d8", size = 44996, upload-time = "2026-01-26T02:43:01.674Z" }, + { url = "https://files.pythonhosted.org/packages/31/5c/08c7f7fe311f32e83f7621cd3f99d805f45519cd06fafb247628b861da7d/multidict-6.7.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:cdea2e7b2456cfb6694fb113066fd0ec7ea4d67e3a35e1f4cbeea0b448bf5872", size = 44631, upload-time = "2026-01-26T02:43:03.169Z" }, + { url = "https://files.pythonhosted.org/packages/b7/7f/0e3b1390ae772f27501199996b94b52ceeb64fe6f9120a32c6c3f6b781be/multidict-6.7.1-cp310-cp310-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:17207077e29342fdc2c9a82e4b306f1127bf1ea91f8b71e02d4798a70bb99991", size = 242561, upload-time = "2026-01-26T02:43:04.733Z" }, + { url = "https://files.pythonhosted.org/packages/dd/f4/8719f4f167586af317b69dd3e90f913416c91ca610cac79a45c53f590312/multidict-6.7.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d4f49cb5661344764e4c7c7973e92a47a59b8fc19b6523649ec9dc4960e58a03", size = 242223, upload-time = "2026-01-26T02:43:06.695Z" }, + { url = "https://files.pythonhosted.org/packages/47/ab/7c36164cce64a6ad19c6d9a85377b7178ecf3b89f8fd589c73381a5eedfd/multidict-6.7.1-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:a9fc4caa29e2e6ae408d1c450ac8bf19892c5fca83ee634ecd88a53332c59981", size = 222322, upload-time = "2026-01-26T02:43:08.472Z" }, + { url = "https://files.pythonhosted.org/packages/f5/79/a25add6fb38035b5337bc5734f296d9afc99163403bbcf56d4170f97eb62/multidict-6.7.1-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:c5f0c21549ab432b57dcc82130f388d84ad8179824cc3f223d5e7cfbfd4143f6", size = 254005, upload-time = "2026-01-26T02:43:10.127Z" }, + { url = "https://files.pythonhosted.org/packages/4a/7b/64a87cf98e12f756fc8bd444b001232ffff2be37288f018ad0d3f0aae931/multidict-6.7.1-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:7dfb78d966b2c906ae1d28ccf6e6712a3cd04407ee5088cd276fe8cb42186190", size = 251173, upload-time = "2026-01-26T02:43:11.731Z" }, + { url = "https://files.pythonhosted.org/packages/4b/ac/b605473de2bb404e742f2cc3583d12aedb2352a70e49ae8fce455b50c5aa/multidict-6.7.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9b0d9b91d1aa44db9c1f1ecd0d9d2ae610b2f4f856448664e01a3b35899f3f92", size = 243273, upload-time = "2026-01-26T02:43:13.063Z" }, + { url = "https://files.pythonhosted.org/packages/03/65/11492d6a0e259783720f3bc1d9ea55579a76f1407e31ed44045c99542004/multidict-6.7.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:dd96c01a9dcd4889dcfcf9eb5544ca0c77603f239e3ffab0524ec17aea9a93ee", size = 238956, upload-time = "2026-01-26T02:43:14.843Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a7/7ee591302af64e7c196fb63fe856c788993c1372df765102bd0448e7e165/multidict-6.7.1-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:067343c68cd6612d375710f895337b3a98a033c94f14b9a99eff902f205424e2", size = 233477, upload-time = "2026-01-26T02:43:16.025Z" }, + { url = "https://files.pythonhosted.org/packages/9c/99/c109962d58756c35fd9992fed7f2355303846ea2ff054bb5f5e9d6b888de/multidict-6.7.1-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:5884a04f4ff56c6120f6ccf703bdeb8b5079d808ba604d4d53aec0d55dc33568", size = 243615, upload-time = "2026-01-26T02:43:17.84Z" }, + { url = "https://files.pythonhosted.org/packages/d5/5f/1973e7c771c86e93dcfe1c9cc55a5481b610f6614acfc28c0d326fe6bfad/multidict-6.7.1-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:8affcf1c98b82bc901702eb73b6947a1bfa170823c153fe8a47b5f5f02e48e40", size = 249930, upload-time = "2026-01-26T02:43:19.06Z" }, + { url = "https://files.pythonhosted.org/packages/5d/a5/f170fc2268c3243853580203378cd522446b2df632061e0a5409817854c7/multidict-6.7.1-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:0d17522c37d03e85c8098ec8431636309b2682cf12e58f4dbc76121fb50e4962", size = 243807, upload-time = "2026-01-26T02:43:20.286Z" }, + { url = "https://files.pythonhosted.org/packages/de/01/73856fab6d125e5bc652c3986b90e8699a95e84b48d72f39ade6c0e74a8c/multidict-6.7.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:24c0cf81544ca5e17cfcb6e482e7a82cd475925242b308b890c9452a074d4505", size = 239103, upload-time = "2026-01-26T02:43:21.508Z" }, + { url = "https://files.pythonhosted.org/packages/e7/46/f1220bd9944d8aa40d8ccff100eeeee19b505b857b6f603d6078cb5315b0/multidict-6.7.1-cp310-cp310-win32.whl", hash = "sha256:d82dd730a95e6643802f4454b8fdecdf08667881a9c5670db85bc5a56693f122", size = 41416, upload-time = "2026-01-26T02:43:22.703Z" }, + { url = "https://files.pythonhosted.org/packages/68/00/9b38e272a770303692fc406c36e1a4c740f401522d5787691eb38a8925a8/multidict-6.7.1-cp310-cp310-win_amd64.whl", hash = "sha256:cf37cbe5ced48d417ba045aca1b21bafca67489452debcde94778a576666a1df", size = 46022, upload-time = "2026-01-26T02:43:23.77Z" }, + { url = "https://files.pythonhosted.org/packages/64/65/d8d42490c02ee07b6bbe00f7190d70bb4738b3cce7629aaf9f213ef730dd/multidict-6.7.1-cp310-cp310-win_arm64.whl", hash = "sha256:59bc83d3f66b41dac1e7460aac1d196edc70c9ba3094965c467715a70ecb46db", size = 43238, upload-time = "2026-01-26T02:43:24.882Z" }, + { url = "https://files.pythonhosted.org/packages/ce/f1/a90635c4f88fb913fbf4ce660b83b7445b7a02615bda034b2f8eb38fd597/multidict-6.7.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:7ff981b266af91d7b4b3793ca3382e53229088d193a85dfad6f5f4c27fc73e5d", size = 76626, upload-time = "2026-01-26T02:43:26.485Z" }, + { url = "https://files.pythonhosted.org/packages/a6/9b/267e64eaf6fc637a15b35f5de31a566634a2740f97d8d094a69d34f524a4/multidict-6.7.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:844c5bca0b5444adb44a623fb0a1310c2f4cd41f402126bb269cd44c9b3f3e1e", size = 44706, upload-time = "2026-01-26T02:43:27.607Z" }, + { url = "https://files.pythonhosted.org/packages/dd/a4/d45caf2b97b035c57267791ecfaafbd59c68212004b3842830954bb4b02e/multidict-6.7.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:f2a0a924d4c2e9afcd7ec64f9de35fcd96915149b2216e1cb2c10a56df483855", size = 44356, upload-time = "2026-01-26T02:43:28.661Z" }, + { url = "https://files.pythonhosted.org/packages/fd/d2/0a36c8473f0cbaeadd5db6c8b72d15bbceeec275807772bfcd059bef487d/multidict-6.7.1-cp311-cp311-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:8be1802715a8e892c784c0197c2ace276ea52702a0ede98b6310c8f255a5afb3", size = 244355, upload-time = "2026-01-26T02:43:31.165Z" }, + { url = "https://files.pythonhosted.org/packages/5d/16/8c65be997fd7dd311b7d39c7b6e71a0cb449bad093761481eccbbe4b42a2/multidict-6.7.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2e2d2ed645ea29f31c4c7ea1552fcfd7cb7ba656e1eafd4134a6620c9f5fdd9e", size = 246433, upload-time = "2026-01-26T02:43:32.581Z" }, + { url = "https://files.pythonhosted.org/packages/01/fb/4dbd7e848d2799c6a026ec88ad39cf2b8416aa167fcc903baa55ecaa045c/multidict-6.7.1-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:95922cee9a778659e91db6497596435777bd25ed116701a4c034f8e46544955a", size = 225376, upload-time = "2026-01-26T02:43:34.417Z" }, + { url = "https://files.pythonhosted.org/packages/b6/8a/4a3a6341eac3830f6053062f8fbc9a9e54407c80755b3f05bc427295c2d0/multidict-6.7.1-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:6b83cabdc375ffaaa15edd97eb7c0c672ad788e2687004990074d7d6c9b140c8", size = 257365, upload-time = "2026-01-26T02:43:35.741Z" }, + { url = "https://files.pythonhosted.org/packages/f7/a2/dd575a69c1aa206e12d27d0770cdf9b92434b48a9ef0cd0d1afdecaa93c4/multidict-6.7.1-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:38fb49540705369bab8484db0689d86c0a33a0a9f2c1b197f506b71b4b6c19b0", size = 254747, upload-time = "2026-01-26T02:43:36.976Z" }, + { url = "https://files.pythonhosted.org/packages/5a/56/21b27c560c13822ed93133f08aa6372c53a8e067f11fbed37b4adcdac922/multidict-6.7.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:439cbebd499f92e9aa6793016a8acaa161dfa749ae86d20960189f5398a19144", size = 246293, upload-time = "2026-01-26T02:43:38.258Z" }, + { url = "https://files.pythonhosted.org/packages/5a/a4/23466059dc3854763423d0ad6c0f3683a379d97673b1b89ec33826e46728/multidict-6.7.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:6d3bc717b6fe763b8be3f2bee2701d3c8eb1b2a8ae9f60910f1b2860c82b6c49", size = 242962, upload-time = "2026-01-26T02:43:40.034Z" }, + { url = "https://files.pythonhosted.org/packages/1f/67/51dd754a3524d685958001e8fa20a0f5f90a6a856e0a9dcabff69be3dbb7/multidict-6.7.1-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:619e5a1ac57986dbfec9f0b301d865dddf763696435e2962f6d9cf2fdff2bb71", size = 237360, upload-time = "2026-01-26T02:43:41.752Z" }, + { url = "https://files.pythonhosted.org/packages/64/3f/036dfc8c174934d4b55d86ff4f978e558b0e585cef70cfc1ad01adc6bf18/multidict-6.7.1-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:0b38ebffd9be37c1170d33bc0f36f4f262e0a09bc1aac1c34c7aa51a7293f0b3", size = 245940, upload-time = "2026-01-26T02:43:43.042Z" }, + { url = "https://files.pythonhosted.org/packages/3d/20/6214d3c105928ebc353a1c644a6ef1408bc5794fcb4f170bb524a3c16311/multidict-6.7.1-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:10ae39c9cfe6adedcdb764f5e8411d4a92b055e35573a2eaa88d3323289ef93c", size = 253502, upload-time = "2026-01-26T02:43:44.371Z" }, + { url = "https://files.pythonhosted.org/packages/b1/e2/c653bc4ae1be70a0f836b82172d643fcf1dade042ba2676ab08ec08bff0f/multidict-6.7.1-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:25167cc263257660290fba06b9318d2026e3c910be240a146e1f66dd114af2b0", size = 247065, upload-time = "2026-01-26T02:43:45.745Z" }, + { url = "https://files.pythonhosted.org/packages/c8/11/a854b4154cd3bd8b1fd375e8a8ca9d73be37610c361543d56f764109509b/multidict-6.7.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:128441d052254f42989ef98b7b6a6ecb1e6f708aa962c7984235316db59f50fa", size = 241870, upload-time = "2026-01-26T02:43:47.054Z" }, + { url = "https://files.pythonhosted.org/packages/13/bf/9676c0392309b5fdae322333d22a829715b570edb9baa8016a517b55b558/multidict-6.7.1-cp311-cp311-win32.whl", hash = "sha256:d62b7f64ffde3b99d06b707a280db04fb3855b55f5a06df387236051d0668f4a", size = 41302, upload-time = "2026-01-26T02:43:48.753Z" }, + { url = "https://files.pythonhosted.org/packages/c9/68/f16a3a8ba6f7b6dc92a1f19669c0810bd2c43fc5a02da13b1cbf8e253845/multidict-6.7.1-cp311-cp311-win_amd64.whl", hash = "sha256:bdbf9f3b332abd0cdb306e7c2113818ab1e922dc84b8f8fd06ec89ed2a19ab8b", size = 45981, upload-time = "2026-01-26T02:43:49.921Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/9dd5305253fa00cd3c7555dbef69d5bf4133debc53b87ab8d6a44d411665/multidict-6.7.1-cp311-cp311-win_arm64.whl", hash = "sha256:b8c990b037d2fff2f4e33d3f21b9b531c5745b33a49a7d6dbe7a177266af44f6", size = 43159, upload-time = "2026-01-26T02:43:51.635Z" }, + { url = "https://files.pythonhosted.org/packages/8d/9c/f20e0e2cf80e4b2e4b1c365bf5fe104ee633c751a724246262db8f1a0b13/multidict-6.7.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:a90f75c956e32891a4eda3639ce6dd86e87105271f43d43442a3aedf3cddf172", size = 76893, upload-time = "2026-01-26T02:43:52.754Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/18ef143a81610136d3da8193da9d80bfe1cb548a1e2d1c775f26b23d024a/multidict-6.7.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3fccb473e87eaa1382689053e4a4618e7ba7b9b9b8d6adf2027ee474597128cd", size = 45456, upload-time = "2026-01-26T02:43:53.893Z" }, + { url = "https://files.pythonhosted.org/packages/a9/65/1caac9d4cd32e8433908683446eebc953e82d22b03d10d41a5f0fefe991b/multidict-6.7.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b0fa96985700739c4c7853a43c0b3e169360d6855780021bfc6d0f1ce7c123e7", size = 43872, upload-time = "2026-01-26T02:43:55.041Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3b/d6bd75dc4f3ff7c73766e04e705b00ed6dbbaccf670d9e05a12b006f5a21/multidict-6.7.1-cp312-cp312-manylinux1_i686.manylinux_2_28_i686.manylinux_2_5_i686.whl", hash = "sha256:cb2a55f408c3043e42b40cc8eecd575afa27b7e0b956dfb190de0f8499a57a53", size = 251018, upload-time = "2026-01-26T02:43:56.198Z" }, + { url = "https://files.pythonhosted.org/packages/fd/80/c959c5933adedb9ac15152e4067c702a808ea183a8b64cf8f31af8ad3155/multidict-6.7.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:eb0ce7b2a32d09892b3dd6cc44877a0d02a33241fafca5f25c8b6b62374f8b75", size = 258883, upload-time = "2026-01-26T02:43:57.499Z" }, + { url = "https://files.pythonhosted.org/packages/86/85/7ed40adafea3d4f1c8b916e3b5cc3a8e07dfcdcb9cd72800f4ed3ca1b387/multidict-6.7.1-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c3a32d23520ee37bf327d1e1a656fec76a2edd5c038bf43eddfa0572ec49c60b", size = 242413, upload-time = "2026-01-26T02:43:58.755Z" }, + { url = "https://files.pythonhosted.org/packages/d2/57/b8565ff533e48595503c785f8361ff9a4fde4d67de25c207cd0ba3befd03/multidict-6.7.1-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9c90fed18bffc0189ba814749fdcc102b536e83a9f738a9003e569acd540a733", size = 268404, upload-time = "2026-01-26T02:44:00.216Z" }, + { url = "https://files.pythonhosted.org/packages/e0/50/9810c5c29350f7258180dfdcb2e52783a0632862eb334c4896ac717cebcb/multidict-6.7.1-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:da62917e6076f512daccfbbde27f46fed1c98fee202f0559adec8ee0de67f71a", size = 269456, upload-time = "2026-01-26T02:44:02.202Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8d/5e5be3ced1d12966fefb5c4ea3b2a5b480afcea36406559442c6e31d4a48/multidict-6.7.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:bfde23ef6ed9db7eaee6c37dcec08524cb43903c60b285b172b6c094711b3961", size = 256322, upload-time = "2026-01-26T02:44:03.56Z" }, + { url = "https://files.pythonhosted.org/packages/31/6e/d8a26d81ac166a5592782d208dd90dfdc0a7a218adaa52b45a672b46c122/multidict-6.7.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3758692429e4e32f1ba0df23219cd0b4fc0a52f476726fff9337d1a57676a582", size = 253955, upload-time = "2026-01-26T02:44:04.845Z" }, + { url = "https://files.pythonhosted.org/packages/59/4c/7c672c8aad41534ba619bcd4ade7a0dc87ed6b8b5c06149b85d3dd03f0cd/multidict-6.7.1-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:398c1478926eca669f2fd6a5856b6de9c0acf23a2cb59a14c0ba5844fa38077e", size = 251254, upload-time = "2026-01-26T02:44:06.133Z" }, + { url = "https://files.pythonhosted.org/packages/7b/bd/84c24de512cbafbdbc39439f74e967f19570ce7924e3007174a29c348916/multidict-6.7.1-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:c102791b1c4f3ab36ce4101154549105a53dc828f016356b3e3bcae2e3a039d3", size = 252059, upload-time = "2026-01-26T02:44:07.518Z" }, + { url = "https://files.pythonhosted.org/packages/fa/ba/f5449385510825b73d01c2d4087bf6d2fccc20a2d42ac34df93191d3dd03/multidict-6.7.1-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:a088b62bd733e2ad12c50dad01b7d0166c30287c166e137433d3b410add807a6", size = 263588, upload-time = "2026-01-26T02:44:09.382Z" }, + { url = "https://files.pythonhosted.org/packages/d7/11/afc7c677f68f75c84a69fe37184f0f82fce13ce4b92f49f3db280b7e92b3/multidict-6.7.1-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:3d51ff4785d58d3f6c91bdbffcb5e1f7ddfda557727043aa20d20ec4f65e324a", size = 259642, upload-time = "2026-01-26T02:44:10.73Z" }, + { url = "https://files.pythonhosted.org/packages/2b/17/ebb9644da78c4ab36403739e0e6e0e30ebb135b9caf3440825001a0bddcb/multidict-6.7.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fc5907494fccf3e7d3f94f95c91d6336b092b5fc83811720fae5e2765890dfba", size = 251377, upload-time = "2026-01-26T02:44:12.042Z" }, + { url = "https://files.pythonhosted.org/packages/ca/a4/840f5b97339e27846c46307f2530a2805d9d537d8b8bd416af031cad7fa0/multidict-6.7.1-cp312-cp312-win32.whl", hash = "sha256:28ca5ce2fd9716631133d0e9a9b9a745ad7f60bac2bccafb56aa380fc0b6c511", size = 41887, upload-time = "2026-01-26T02:44:14.245Z" }, + { url = "https://files.pythonhosted.org/packages/80/31/0b2517913687895f5904325c2069d6a3b78f66cc641a86a2baf75a05dcbb/multidict-6.7.1-cp312-cp312-win_amd64.whl", hash = "sha256:fcee94dfbd638784645b066074b338bc9cc155d4b4bffa4adce1615c5a426c19", size = 46053, upload-time = "2026-01-26T02:44:15.371Z" }, + { url = "https://files.pythonhosted.org/packages/0c/5b/aba28e4ee4006ae4c7df8d327d31025d760ffa992ea23812a601d226e682/multidict-6.7.1-cp312-cp312-win_arm64.whl", hash = "sha256:ba0a9fb644d0c1a2194cf7ffb043bd852cea63a57f66fbd33959f7dae18517bf", size = 43307, upload-time = "2026-01-26T02:44:16.852Z" }, + { url = "https://files.pythonhosted.org/packages/81/08/7036c080d7117f28a4af526d794aab6a84463126db031b007717c1a6676e/multidict-6.7.1-py3-none-any.whl", hash = "sha256:55d97cc6dae627efa6a6e548885712d4864b81110ac76fa4e534c03819fa4a56", size = 12319, upload-time = "2026-01-26T02:46:44.004Z" }, +] + +[[package]] +name = "multivolumefile" +version = "0.2.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/50/f0/a7786212b5a4cb9ba05ae84a2bbd11d1d0279523aea0424b6d981d652a14/multivolumefile-0.2.3.tar.gz", hash = "sha256:a0648d0aafbc96e59198d5c17e9acad7eb531abea51035d08ce8060dcad709d6", size = 77984, upload-time = "2021-04-29T12:18:39.882Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/22/31/ec5f46fd4c83185b806aa9c736e228cb780f13990a9cf4da0beb70025fcc/multivolumefile-0.2.3-py3-none-any.whl", hash = "sha256:237f4353b60af1703087cf7725755a1f6fcaeeea48421e1896940cd1c920d678", size = 17037, upload-time = "2021-04-29T12:18:38.886Z" }, +] + +[[package]] +name = "narwhals" +version = "2.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/ac/66ed1fc6e38a0c0f330627ec5c5d597990d6159b6712b82af0ad2c65f06c/narwhals-2.23.0.tar.gz", hash = "sha256:13e7ff5b4bb4a2f77b907c2e4d8a76e273dfc1323a3c997440a2f9fd26aed408", size = 656209, upload-time = "2026-07-01T11:21:53.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/4e/afc8c31605cb8be1d3bb4438c4d979daa104dab6306cd2b87abe9c3a7299/narwhals-2.23.0-py3-none-any.whl", hash = "sha256:769e7b9ab102c93d8fa019f6b4cd1a657909b04a20bf6210e5a35aae06814ae9", size = 458938, upload-time = "2026-07-01T11:21:51.677Z" }, +] + +[[package]] +name = "natsort" +version = "8.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e2/a9/a0c57aee75f77794adaf35322f8b6404cbd0f89ad45c87197a937764b7d0/natsort-8.4.0.tar.gz", hash = "sha256:45312c4a0e5507593da193dedd04abb1469253b601ecaf63445ad80f0a1ea581", size = 76575, upload-time = "2023-06-20T04:17:19.925Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/82/7a9d0550484a62c6da82858ee9419f3dd1ccc9aa1c26a1e43da3ecd20b0d/natsort-8.4.0-py3-none-any.whl", hash = "sha256:4732914fb471f56b5cce04d7bae6f164a592c7712e1c85f9ef585e197299521c", size = 38268, upload-time = "2023-06-20T04:17:17.522Z" }, +] + +[[package]] +name = "nbclient" +version = "0.11.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "jupyter-client" }, + { name = "jupyter-core" }, + { name = "nbformat" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/28/a5/b3bae4b590c0cbcada2c63a34f7580024e834a8ba213e949a2f906705787/nbclient-0.11.0.tar.gz", hash = "sha256:04a134a5b087f2c5887f228aca155db50169b8cd9334dee6942c8e927e56081a", size = 62535, upload-time = "2026-06-05T07:52:41.746Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/36/c9/94d73e5a01c5b926c3fa2496e97d7a8dc28ed5a77c0b2ed712f1a62e6694/nbclient-0.11.0-py3-none-any.whl", hash = "sha256:ef7fa0d59d6e1d41103933d8a445a18d5de860ca6b613b87b8574accdb3c2895", size = 25288, upload-time = "2026-06-05T07:52:40.115Z" }, +] + +[[package]] +name = "nbconvert" +version = "7.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "beautifulsoup4" }, + { name = "bleach", extra = ["css"] }, + { name = "defusedxml" }, + { name = "jinja2" }, + { name = "jupyter-core" }, + { name = "jupyterlab-pygments" }, + { name = "markupsafe" }, + { name = "mistune" }, + { name = "nbclient" }, + { name = "nbformat" }, + { name = "packaging" }, + { name = "pandocfilters" }, + { name = "pygments" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/01/b1/708e53fe2e429c103c6e6e159106bcf0357ac41aa4c28772bd8402339051/nbconvert-7.17.1.tar.gz", hash = "sha256:34d0d0a7e73ce3cbab6c5aae8f4f468797280b01fd8bd2ca746da8569eddd7d2", size = 865311, upload-time = "2026-04-08T00:44:14.914Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f8/bb0a9d5f46819c821dc1f004aa2cc29b1d91453297dbf5ff20470f00f193/nbconvert-7.17.1-py3-none-any.whl", hash = "sha256:aa85c087b435e7bf1ffd03319f658e285f2b89eccab33bc1ba7025495ab3e7c8", size = 261927, upload-time = "2026-04-08T00:44:12.845Z" }, +] + +[[package]] +name = "nbformat" +version = "5.10.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "fastjsonschema" }, + { name = "jsonschema" }, + { name = "jupyter-core" }, + { name = "traitlets" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6d/fd/91545e604bc3dad7dca9ed03284086039b294c6b3d75c0d2fa45f9e9caf3/nbformat-5.10.4.tar.gz", hash = "sha256:322168b14f937a5d11362988ecac2a4952d3d8e3a2cbeb2319584631226d5b3a", size = 142749, upload-time = "2024-04-04T11:20:37.371Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a9/82/0340caa499416c78e5d8f5f05947ae4bc3cba53c9f038ab6e9ed964e22f1/nbformat-5.10.4-py3-none-any.whl", hash = "sha256:3b48d6c8fbca4b299bf3982ea7db1af21580e4fec269ad087b9e81588891200b", size = 78454, upload-time = "2024-04-04T11:20:34.895Z" }, +] + +[[package]] +name = "networkx" +version = "3.4.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/fd/1d/06475e1cd5264c0b870ea2cc6fdb3e37177c1e565c43f56ff17a10e3937f/networkx-3.4.2.tar.gz", hash = "sha256:307c3669428c5362aab27c8a1260aa8f47c4e91d3891f48be0141738d8d053e1", size = 2151368, upload-time = "2024-10-21T12:39:38.695Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b9/54/dd730b32ea14ea797530a4479b2ed46a6fb250f682a9cfb997e968bf0261/networkx-3.4.2-py3-none-any.whl", hash = "sha256:df5d4365b724cf81b8c6a7312509d0c22386097011ad1abe274afd5e9d3bbc5f", size = 1723263, upload-time = "2024-10-21T12:39:36.247Z" }, +] + +[[package]] +name = "networkx" +version = "3.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/51/63fe664f3908c97be9d2e4f1158eb633317598cfa6e1fc14af5383f17512/networkx-3.6.1.tar.gz", hash = "sha256:26b7c357accc0c8cde558ad486283728b65b6a95d85ee1cd66bafab4c8168509", size = 2517025, upload-time = "2025-12-08T17:02:39.908Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c9/b2622292ea83fbb4ec318f5b9ab867d0a28ab43c5717bb85b0a5f6b3b0a4/networkx-3.6.1-py3-none-any.whl", hash = "sha256:d47fbf302e7d9cbbb9e2555a0d267983d2aa476bac30e90dfbe5669bd57f3762", size = 2068504, upload-time = "2025-12-08T17:02:38.159Z" }, +] + +[[package]] +name = "numpy" +version = "2.2.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/76/21/7d2a95e4bba9dc13d043ee156a356c0a8f0c6309dff6b21b4d71a073b8a8/numpy-2.2.6.tar.gz", hash = "sha256:e29554e2bef54a90aa5cc07da6ce955accb83f21ab5de01a62c8478897b264fd", size = 20276440, upload-time = "2025-05-17T22:38:04.611Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9a/3e/ed6db5be21ce87955c0cbd3009f2803f59fa08df21b5df06862e2d8e2bdd/numpy-2.2.6-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:b412caa66f72040e6d268491a59f2c43bf03eb6c96dd8f0307829feb7fa2b6fb", size = 21165245, upload-time = "2025-05-17T21:27:58.555Z" }, + { url = "https://files.pythonhosted.org/packages/22/c2/4b9221495b2a132cc9d2eb862e21d42a009f5a60e45fc44b00118c174bff/numpy-2.2.6-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8e41fd67c52b86603a91c1a505ebaef50b3314de0213461c7a6e99c9a3beff90", size = 14360048, upload-time = "2025-05-17T21:28:21.406Z" }, + { url = "https://files.pythonhosted.org/packages/fd/77/dc2fcfc66943c6410e2bf598062f5959372735ffda175b39906d54f02349/numpy-2.2.6-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:37e990a01ae6ec7fe7fa1c26c55ecb672dd98b19c3d0e1d1f326fa13cb38d163", size = 5340542, upload-time = "2025-05-17T21:28:30.931Z" }, + { url = "https://files.pythonhosted.org/packages/7a/4f/1cb5fdc353a5f5cc7feb692db9b8ec2c3d6405453f982435efc52561df58/numpy-2.2.6-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:5a6429d4be8ca66d889b7cf70f536a397dc45ba6faeb5f8c5427935d9592e9cf", size = 6878301, upload-time = "2025-05-17T21:28:41.613Z" }, + { url = "https://files.pythonhosted.org/packages/eb/17/96a3acd228cec142fcb8723bd3cc39c2a474f7dcf0a5d16731980bcafa95/numpy-2.2.6-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:efd28d4e9cd7d7a8d39074a4d44c63eda73401580c5c76acda2ce969e0a38e83", size = 14297320, upload-time = "2025-05-17T21:29:02.78Z" }, + { url = "https://files.pythonhosted.org/packages/b4/63/3de6a34ad7ad6646ac7d2f55ebc6ad439dbbf9c4370017c50cf403fb19b5/numpy-2.2.6-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fc7b73d02efb0e18c000e9ad8b83480dfcd5dfd11065997ed4c6747470ae8915", size = 16801050, upload-time = "2025-05-17T21:29:27.675Z" }, + { url = "https://files.pythonhosted.org/packages/07/b6/89d837eddef52b3d0cec5c6ba0456c1bf1b9ef6a6672fc2b7873c3ec4e2e/numpy-2.2.6-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:74d4531beb257d2c3f4b261bfb0fc09e0f9ebb8842d82a7b4209415896adc680", size = 15807034, upload-time = "2025-05-17T21:29:51.102Z" }, + { url = "https://files.pythonhosted.org/packages/01/c8/dc6ae86e3c61cfec1f178e5c9f7858584049b6093f843bca541f94120920/numpy-2.2.6-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:8fc377d995680230e83241d8a96def29f204b5782f371c532579b4f20607a289", size = 18614185, upload-time = "2025-05-17T21:30:18.703Z" }, + { url = "https://files.pythonhosted.org/packages/5b/c5/0064b1b7e7c89137b471ccec1fd2282fceaae0ab3a9550f2568782d80357/numpy-2.2.6-cp310-cp310-win32.whl", hash = "sha256:b093dd74e50a8cba3e873868d9e93a85b78e0daf2e98c6797566ad8044e8363d", size = 6527149, upload-time = "2025-05-17T21:30:29.788Z" }, + { url = "https://files.pythonhosted.org/packages/a3/dd/4b822569d6b96c39d1215dbae0582fd99954dcbcf0c1a13c61783feaca3f/numpy-2.2.6-cp310-cp310-win_amd64.whl", hash = "sha256:f0fd6321b839904e15c46e0d257fdd101dd7f530fe03fd6359c1ea63738703f3", size = 12904620, upload-time = "2025-05-17T21:30:48.994Z" }, + { url = "https://files.pythonhosted.org/packages/da/a8/4f83e2aa666a9fbf56d6118faaaf5f1974d456b1823fda0a176eff722839/numpy-2.2.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f9f1adb22318e121c5c69a09142811a201ef17ab257a1e66ca3025065b7f53ae", size = 21176963, upload-time = "2025-05-17T21:31:19.36Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/64e1affc7972decb74c9e29e5649fac940514910960ba25cd9af4488b66c/numpy-2.2.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c820a93b0255bc360f53eca31a0e676fd1101f673dda8da93454a12e23fc5f7a", size = 14406743, upload-time = "2025-05-17T21:31:41.087Z" }, + { url = "https://files.pythonhosted.org/packages/4a/9f/0121e375000b5e50ffdd8b25bf78d8e1a5aa4cca3f185d41265198c7b834/numpy-2.2.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3d70692235e759f260c3d837193090014aebdf026dfd167834bcba43e30c2a42", size = 5352616, upload-time = "2025-05-17T21:31:50.072Z" }, + { url = "https://files.pythonhosted.org/packages/31/0d/b48c405c91693635fbe2dcd7bc84a33a602add5f63286e024d3b6741411c/numpy-2.2.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:481b49095335f8eed42e39e8041327c05b0f6f4780488f61286ed3c01368d491", size = 6889579, upload-time = "2025-05-17T21:32:01.712Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/7f0554d49b565d0171eab6e99001846882000883998e7b7d9f0d98b1f934/numpy-2.2.6-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b64d8d4d17135e00c8e346e0a738deb17e754230d7e0810ac5012750bbd85a5a", size = 14312005, upload-time = "2025-05-17T21:32:23.332Z" }, + { url = "https://files.pythonhosted.org/packages/b3/dd/2238b898e51bd6d389b7389ffb20d7f4c10066d80351187ec8e303a5a475/numpy-2.2.6-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ba10f8411898fc418a521833e014a77d3ca01c15b0c6cdcce6a0d2897e6dbbdf", size = 16821570, upload-time = "2025-05-17T21:32:47.991Z" }, + { url = "https://files.pythonhosted.org/packages/83/6c/44d0325722cf644f191042bf47eedad61c1e6df2432ed65cbe28509d404e/numpy-2.2.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:bd48227a919f1bafbdda0583705e547892342c26fb127219d60a5c36882609d1", size = 15818548, upload-time = "2025-05-17T21:33:11.728Z" }, + { url = "https://files.pythonhosted.org/packages/ae/9d/81e8216030ce66be25279098789b665d49ff19eef08bfa8cb96d4957f422/numpy-2.2.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:9551a499bf125c1d4f9e250377c1ee2eddd02e01eac6644c080162c0c51778ab", size = 18620521, upload-time = "2025-05-17T21:33:39.139Z" }, + { url = "https://files.pythonhosted.org/packages/6a/fd/e19617b9530b031db51b0926eed5345ce8ddc669bb3bc0044b23e275ebe8/numpy-2.2.6-cp311-cp311-win32.whl", hash = "sha256:0678000bb9ac1475cd454c6b8c799206af8107e310843532b04d49649c717a47", size = 6525866, upload-time = "2025-05-17T21:33:50.273Z" }, + { url = "https://files.pythonhosted.org/packages/31/0a/f354fb7176b81747d870f7991dc763e157a934c717b67b58456bc63da3df/numpy-2.2.6-cp311-cp311-win_amd64.whl", hash = "sha256:e8213002e427c69c45a52bbd94163084025f533a55a59d6f9c5b820774ef3303", size = 12907455, upload-time = "2025-05-17T21:34:09.135Z" }, + { url = "https://files.pythonhosted.org/packages/82/5d/c00588b6cf18e1da539b45d3598d3557084990dcc4331960c15ee776ee41/numpy-2.2.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:41c5a21f4a04fa86436124d388f6ed60a9343a6f767fced1a8a71c3fbca038ff", size = 20875348, upload-time = "2025-05-17T21:34:39.648Z" }, + { url = "https://files.pythonhosted.org/packages/66/ee/560deadcdde6c2f90200450d5938f63a34b37e27ebff162810f716f6a230/numpy-2.2.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:de749064336d37e340f640b05f24e9e3dd678c57318c7289d222a8a2f543e90c", size = 14119362, upload-time = "2025-05-17T21:35:01.241Z" }, + { url = "https://files.pythonhosted.org/packages/3c/65/4baa99f1c53b30adf0acd9a5519078871ddde8d2339dc5a7fde80d9d87da/numpy-2.2.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:894b3a42502226a1cac872f840030665f33326fc3dac8e57c607905773cdcde3", size = 5084103, upload-time = "2025-05-17T21:35:10.622Z" }, + { url = "https://files.pythonhosted.org/packages/cc/89/e5a34c071a0570cc40c9a54eb472d113eea6d002e9ae12bb3a8407fb912e/numpy-2.2.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:71594f7c51a18e728451bb50cc60a3ce4e6538822731b2933209a1f3614e9282", size = 6625382, upload-time = "2025-05-17T21:35:21.414Z" }, + { url = "https://files.pythonhosted.org/packages/f8/35/8c80729f1ff76b3921d5c9487c7ac3de9b2a103b1cd05e905b3090513510/numpy-2.2.6-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:f2618db89be1b4e05f7a1a847a9c1c0abd63e63a1607d892dd54668dd92faf87", size = 14018462, upload-time = "2025-05-17T21:35:42.174Z" }, + { url = "https://files.pythonhosted.org/packages/8c/3d/1e1db36cfd41f895d266b103df00ca5b3cbe965184df824dec5c08c6b803/numpy-2.2.6-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:fd83c01228a688733f1ded5201c678f0c53ecc1006ffbc404db9f7a899ac6249", size = 16527618, upload-time = "2025-05-17T21:36:06.711Z" }, + { url = "https://files.pythonhosted.org/packages/61/c6/03ed30992602c85aa3cd95b9070a514f8b3c33e31124694438d88809ae36/numpy-2.2.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:37c0ca431f82cd5fa716eca9506aefcabc247fb27ba69c5062a6d3ade8cf8f49", size = 15505511, upload-time = "2025-05-17T21:36:29.965Z" }, + { url = "https://files.pythonhosted.org/packages/b7/25/5761d832a81df431e260719ec45de696414266613c9ee268394dd5ad8236/numpy-2.2.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:fe27749d33bb772c80dcd84ae7e8df2adc920ae8297400dabec45f0dedb3f6de", size = 18313783, upload-time = "2025-05-17T21:36:56.883Z" }, + { url = "https://files.pythonhosted.org/packages/57/0a/72d5a3527c5ebffcd47bde9162c39fae1f90138c961e5296491ce778e682/numpy-2.2.6-cp312-cp312-win32.whl", hash = "sha256:4eeaae00d789f66c7a25ac5f34b71a7035bb474e679f410e5e1a94deb24cf2d4", size = 6246506, upload-time = "2025-05-17T21:37:07.368Z" }, + { url = "https://files.pythonhosted.org/packages/36/fa/8c9210162ca1b88529ab76b41ba02d433fd54fecaf6feb70ef9f124683f1/numpy-2.2.6-cp312-cp312-win_amd64.whl", hash = "sha256:c1f9540be57940698ed329904db803cf7a402f3fc200bfe599334c9bd84a40b2", size = 12614190, upload-time = "2025-05-17T21:37:26.213Z" }, + { url = "https://files.pythonhosted.org/packages/9e/3b/d94a75f4dbf1ef5d321523ecac21ef23a3cd2ac8b78ae2aac40873590229/numpy-2.2.6-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:0b605b275d7bd0c640cad4e5d30fa701a8d59302e127e5f79138ad62762c3e3d", size = 21040391, upload-time = "2025-05-17T21:44:35.948Z" }, + { url = "https://files.pythonhosted.org/packages/17/f4/09b2fa1b58f0fb4f7c7963a1649c64c4d315752240377ed74d9cd878f7b5/numpy-2.2.6-pp310-pypy310_pp73-macosx_14_0_x86_64.whl", hash = "sha256:7befc596a7dc9da8a337f79802ee8adb30a552a94f792b9c9d18c840055907db", size = 6786754, upload-time = "2025-05-17T21:44:47.446Z" }, + { url = "https://files.pythonhosted.org/packages/af/30/feba75f143bdc868a1cc3f44ccfa6c4b9ec522b36458e738cd00f67b573f/numpy-2.2.6-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ce47521a4754c8f4593837384bd3424880629f718d87c5d44f8ed763edd63543", size = 16643476, upload-time = "2025-05-17T21:45:11.871Z" }, + { url = "https://files.pythonhosted.org/packages/37/48/ac2a9584402fb6c0cd5b5d1a91dcf176b15760130dd386bbafdbfe3640bf/numpy-2.2.6-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:d042d24c90c41b54fd506da306759e06e568864df8ec17ccc17e9e884634fd00", size = 12812666, upload-time = "2025-05-17T21:45:31.426Z" }, +] + +[[package]] +name = "numpy" +version = "2.4.6" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/d0/ad/fed0499ce6a338d2a03ebae59cd15093910c8875328855781952abf6c2fe/numpy-2.4.6.tar.gz", hash = "sha256:f3a3570c4a2a16746ac2c31a7c7c7b0c186b95ce902e33db6f28094ed7387dda", size = 20735807, upload-time = "2026-05-18T23:37:14.07Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b3/49/ec46835a70be8fa6446c495126ac84fdb28cb2558e1620ffb87a10c8b64c/numpy-2.4.6-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:0280e0356c0829a18d9de1cb7eee50ec22ca639878d7240307ca0943d73cd2c4", size = 16969194, upload-time = "2026-05-18T23:33:13.503Z" }, + { url = "https://files.pythonhosted.org/packages/0e/0d/f5957185c0ee2f3e12f78715aa9e3b353fd83633316c8532b38faa37e3f6/numpy-2.4.6-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:110f8b71aacb688ec69062bb7f6938a0f8acb01b7c1c4beb453c65b6d234584d", size = 14964111, upload-time = "2026-05-18T23:33:17.795Z" }, + { url = "https://files.pythonhosted.org/packages/ad/40/40a40ee0ddf7ceb782c49af278894b686e586d65d8c1889c8b5da01a3d7d/numpy-2.4.6-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:4cfe66903cc32a9921a6733d96b19bb6abf310397581bbad89c228f5abaf0ee8", size = 5469159, upload-time = "2026-05-18T23:33:20.654Z" }, + { url = "https://files.pythonhosted.org/packages/63/13/f9a8046535cb21deae82f8d03de9617e08882d274fad2539630761888228/numpy-2.4.6-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:8155154c7c691289fe18f510b5d4657c68c67989f293f0535a91360392ff6538", size = 6798936, upload-time = "2026-05-18T23:33:22.987Z" }, + { url = "https://files.pythonhosted.org/packages/33/a8/6fa8c1a345a8c85dbb21932c447bee07c30a2c2a3f31e369c0a84b300147/numpy-2.4.6-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0ab0a9c4ffb1a6d95ef519fe4247dba8eb6b18ad93999f76b7f657039acabd47", size = 15966692, upload-time = "2026-05-18T23:33:26.62Z" }, + { url = "https://files.pythonhosted.org/packages/02/03/74fe2a4cb3817d94d86402f2506554130a2f01414e299b5a843e5a8a957f/numpy-2.4.6-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89cd468399cfd2504718f0ba50e410dca55a170b61a02ad92bb18c8a65186e93", size = 16918164, upload-time = "2026-05-18T23:33:29.955Z" }, + { url = "https://files.pythonhosted.org/packages/c5/80/3615be3313f7e7696609bc194b9f0101da809df79e859bdb84e0cd043f46/numpy-2.4.6-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:c2d37ab77531417474168eb79d6d80b14f821a966818505d03013d0833edb7a8", size = 17322877, upload-time = "2026-05-18T23:33:34.724Z" }, + { url = "https://files.pythonhosted.org/packages/ca/ac/a691e0fe2675e370d0e08ff905adc49a1c8830e8cae03efe4477e92cd55d/numpy-2.4.6-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:f407cb6b8e9d6d8c626bc73c945db1706035af8fd632295547bf1c9e46d092d6", size = 18651487, upload-time = "2026-05-18T23:33:38.217Z" }, + { url = "https://files.pythonhosted.org/packages/15/a7/9bc1cd626d7bf6869bfedf27b91b6ab5dd607758bf8e959d6fa80c6a59cb/numpy-2.4.6-cp311-cp311-win32.whl", hash = "sha256:ddea102b48f9e339f3948bf22040944184627a30fdf7f858667673b9c5f033c8", size = 6233945, upload-time = "2026-05-18T23:33:41.331Z" }, + { url = "https://files.pythonhosted.org/packages/c5/31/7fc6239c12bce7e931463251cca4426c465e1876ba3cc785402ef4dd8f4e/numpy-2.4.6-cp311-cp311-win_amd64.whl", hash = "sha256:1e254a00cdf42b1e4d5b3d68d33af63268d41340d8885df2ab6470f2e1500147", size = 12608406, upload-time = "2026-05-18T23:33:44.131Z" }, + { url = "https://files.pythonhosted.org/packages/27/83/140f85a466595a16382996a1bf06b2b54bcd597488921b0c9daaeeda72af/numpy-2.4.6-cp311-cp311-win_arm64.whl", hash = "sha256:ed9749eef4cbd126da3dc1d6bcb3a57f5eb7ac6a6484146bdbf743f552dfc577", size = 10479528, upload-time = "2026-05-18T23:33:50.725Z" }, + { url = "https://files.pythonhosted.org/packages/95/2a/3d7b5ac8aac24feaf9ad7ed58f45b0bbc06d37e4338ae84c9f2298b570f9/numpy-2.4.6-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:001fbb8e08d942dd57599e781f2472269ee7f2755fae407b4f67b2f0b17da3f1", size = 16689119, upload-time = "2026-05-18T23:33:54.065Z" }, + { url = "https://files.pythonhosted.org/packages/ea/12/92c4c131527599e8288d6918e888d88726f84d805d784b771f32408aeaef/numpy-2.4.6-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ebfb099f8dcf083deef3ac1ca4c1503f387cf76296fcb3816b66f5ecb5f54fdb", size = 14699246, upload-time = "2026-05-18T23:33:57.621Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fe/c0a6b7b2ca128a8fb228575147073b660656734b8ebe4d76c8fd748dcc79/numpy-2.4.6-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:3213d622a0283a39a93d188f3cf72b26862df52fbb4ca3697f51705016523d41", size = 5204410, upload-time = "2026-05-18T23:34:00.302Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d4/9770d14ba719432bb90a421bfd443872ed0f70f7264b64bec12ea363d5fd/numpy-2.4.6-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:357cc07a6d7b0b182ff02249616a03742827ebb1277546b5c7cd7f7620a45698", size = 6551240, upload-time = "2026-05-18T23:34:02.852Z" }, + { url = "https://files.pythonhosted.org/packages/c9/c6/50a46a6205feba2343f1d6d17438107c5dc491ed1c736e6ea68689fd906b/numpy-2.4.6-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5f9fb9157b4ce2971008323afe46053787b526ef624fea915b261468a8421a0f", size = 15671012, upload-time = "2026-05-18T23:34:05.485Z" }, + { url = "https://files.pythonhosted.org/packages/99/60/14115e6364fa676c5397c2ad3004e527e9aa487abf5d0706ec81bbd08529/numpy-2.4.6-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90f9849678c75fe7afa2d348ac842c168b0a4d3d61919687216dfc547976d853", size = 16645538, upload-time = "2026-05-18T23:34:09.265Z" }, + { url = "https://files.pythonhosted.org/packages/ae/c5/693cbe59e57db94d2231fa519ca3978dc9e19da5a8f088588f5c6e947ff2/numpy-2.4.6-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c1a2af6c6ef86344a6b0db6b97834208bf598db514f2b155042439b62605601a", size = 17020706, upload-time = "2026-05-18T23:34:13.053Z" }, + { url = "https://files.pythonhosted.org/packages/ef/fc/85b7c4eff9b4966ade25c2273cf7e7012e92366c032058653934b37de044/numpy-2.4.6-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e5805d5a22fd19c8ccff10a9561f9df94436b0545619ea579db2d3c35294bce2", size = 18368541, upload-time = "2026-05-18T23:34:17.024Z" }, + { url = "https://files.pythonhosted.org/packages/f6/81/e1b27545deedce7f4a0b348618c6b62d74e36a4dc9ccd42f3eb2f85eee32/numpy-2.4.6-cp312-cp312-win32.whl", hash = "sha256:e3eeb0aabd6bd5ce64faae67e9935203a6991b4bc2a485a767fbafb2c5125f45", size = 5962825, upload-time = "2026-05-18T23:34:20.3Z" }, + { url = "https://files.pythonhosted.org/packages/ab/ca/feab00bd44aa5fe1ad2c18f08b4d3bb92e26484b0b1d1443897809ed528c/numpy-2.4.6-cp312-cp312-win_amd64.whl", hash = "sha256:d8e8286dd7cea7895157318d1b91cdacac64c479f3cbc8dce548331728484751", size = 12321687, upload-time = "2026-05-18T23:34:23.095Z" }, + { url = "https://files.pythonhosted.org/packages/63/cf/5a6d34850a39d1093558564f77ee8e8e0bee5061151b8f05a55711001ec7/numpy-2.4.6-cp312-cp312-win_arm64.whl", hash = "sha256:4081eb135ac24158bd51cdfbef16f1c64df7063b1143f24731387137c092bec8", size = 10221482, upload-time = "2026-05-18T23:34:25.876Z" }, + { url = "https://files.pythonhosted.org/packages/de/12/b422cc84439adc0d00de605bf4a308890ae5c26f2c71fbd73e5d08fbb0dd/numpy-2.4.6-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:55cced7c52e981362f708ad635198e97a752dfba412cc03c23bbf3bd8d5cd662", size = 16847511, upload-time = "2026-05-18T23:36:50.673Z" }, + { url = "https://files.pythonhosted.org/packages/44/53/f481bef68011740f8849418d82db07230e825013f31f4eef5ba5b805316a/numpy-2.4.6-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:d6da64deb6b8ed903e7560180a92f2d804ee1ba5eeb849ac2748b8c1aba1f6d7", size = 14889064, upload-time = "2026-05-18T23:36:53.879Z" }, + { url = "https://files.pythonhosted.org/packages/7f/57/42ed575c10ced8af951d426bc4e1f8aff16fd851db33f067036215a7f860/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_arm64.whl", hash = "sha256:68a5124b13fa6cc2086764a20005d30bc0548146f7f5322f02fce212ca14317f", size = 5394157, upload-time = "2026-05-18T23:36:57.194Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/f66cc724fcc36c1e364c67f51ae9146090b8b584f27d58b97fdae3edd737/numpy-2.4.6-pp311-pypy311_pp73-macosx_14_0_x86_64.whl", hash = "sha256:948424b06129ce883307e8cff868c31396d8dc7630a59c61d70d98dbe70f222c", size = 6708728, upload-time = "2026-05-18T23:36:59.575Z" }, + { url = "https://files.pythonhosted.org/packages/1a/9c/c531f2293b91265d8b48e9b329f54fdd7ffae73cb4134ea10cca4237e9cc/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbbdb29840ca3d91ee0fece42fc29278886d908280bfec0a5846c6f901a3eb0", size = 15798374, upload-time = "2026-05-18T23:37:02.674Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b0/413077f6b1153ed3cba361401c6783bbad6114804a000cc22eb71c13e190/numpy-2.4.6-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8ad03c0965fb3c692200e74d458ca28c1dbb4ce96f9a479a8aa041ad5fabca02", size = 16747286, upload-time = "2026-05-18T23:37:06.327Z" }, + { url = "https://files.pythonhosted.org/packages/15/ce/e5ec180bc41812edcd8daeb8639d205622c0e8c02259d8ab25a0201b3c2a/numpy-2.4.6-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:2803abfebfc990042cd494d8ce2d5f82e9d847af6d35ec486923aa19dbad5e73", size = 12504263, upload-time = "2026-05-18T23:37:09.715Z" }, +] + +[[package]] +name = "numpy" +version = "2.5.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/22/fd/89965aa4ac08c74998539fcbf24fa3540f3e15237fbeb6bcf9c908f4aade/numpy-2.5.1.tar.gz", hash = "sha256:a48a113e6afea91f5608793bafa7ef2ad481fefbda87ec5069f483de61cb9fa3", size = 20755553, upload-time = "2026-07-04T17:08:00.933Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/7b/14687aa674250e5e546f616f486b0d56d3631cd5b2415739141ce40bdcea/numpy-2.5.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2c889b56fe48b1018f764b0eec8df59ab654e9148aa91faa12596043500de277", size = 16801574, upload-time = "2026-07-04T17:06:12.423Z" }, + { url = "https://files.pythonhosted.org/packages/e1/19/cc5bb2a3f2913d27d6dbb2c78d25921fabaedc6741d4a5a615a11f3c5bf3/numpy-2.5.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ab451b59c5643c570974c43aef780703ef1d3b4965d2be07afd530615a9358d1", size = 11772250, upload-time = "2026-07-04T17:06:15.726Z" }, + { url = "https://files.pythonhosted.org/packages/42/77/fdf34a71dd30f54979b18603bee915e0aaf825b07afe79acd60b04b691e2/numpy-2.5.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:78798bd5b9ad744056af8efa90e3b9ddaa53272a0848a483084a1cc0a13b2dc0", size = 5331516, upload-time = "2026-07-04T17:06:17.913Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e2/eb7efa015b4cce41e2517bf182a7fce0d7d5b9d9ed76a29bfa0f4fe4505c/numpy-2.5.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:2ae0ca40bcb22d6ba59c1dfd5446f49940b0f2d821fde133f10dda11f816b84e", size = 6664863, upload-time = "2026-07-04T17:06:20.02Z" }, + { url = "https://files.pythonhosted.org/packages/a9/4b/a2b32dd94ee9ffbeecb28152240042a3949db33b1c834d44090b80e1b3b8/numpy-2.5.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:61ac47e772e6b8ea489e1d2f441a34c5c3ac17327e7ce294cbdf535795ad4e75", size = 15167977, upload-time = "2026-07-04T17:06:21.621Z" }, + { url = "https://files.pythonhosted.org/packages/b8/a9/6e73d68500f80773f65f0654ea932019d6694329a0eb0ed0533de38df376/numpy-2.5.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:59fda5e192b570217ec2580c96f00e9a7e12ef6866a900eb089b62c1a32545ca", size = 16672469, upload-time = "2026-07-04T17:06:24.064Z" }, + { url = "https://files.pythonhosted.org/packages/24/7d/ad3e59015135f5261c95fd4cafeff159c955febd83a99a1d9250c4233815/numpy-2.5.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:f7119ebff1a9829e9f431a4f9d28e703023bb6b9fe7c8f724467dbfc27c94ab3", size = 16527531, upload-time = "2026-07-04T17:06:26.69Z" }, + { url = "https://files.pythonhosted.org/packages/83/d0/a39b2fbcde9cb17a1dac678f254b33a6336298af9df338824c685425d5e8/numpy-2.5.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e824c2acf8862052246be5a44c15da1777940c60d010dd2aab897824d9c430f9", size = 18431940, upload-time = "2026-07-04T17:06:29.521Z" }, + { url = "https://files.pythonhosted.org/packages/04/12/cff070947791c1ed425ff76413189adbdc2fbe215eba7ce7fa454a03c7f8/numpy-2.5.1-cp312-cp312-win32.whl", hash = "sha256:08d60c810432eb83360958dea0999ac4cfb94531ea8efcbf0b7f277c2068aeb2", size = 6066764, upload-time = "2026-07-04T17:06:32.571Z" }, + { url = "https://files.pythonhosted.org/packages/65/66/53f31807a48a750f9d748da273bc3fcedd12b27ff1f3e373bfec55ef2dc0/numpy-2.5.1-cp312-cp312-win_amd64.whl", hash = "sha256:f7d60026c0bdb1380e83bfa7a0419c4577ee4b9a08880afcb6dadeb74c649fa2", size = 12430966, upload-time = "2026-07-04T17:06:34.926Z" }, + { url = "https://files.pythonhosted.org/packages/2b/2a/d1a88066b1c14186f5d3c0d18c94f17b064511982bab0578d49ee9d43c29/numpy-2.5.1-cp312-cp312-win_arm64.whl", hash = "sha256:17a25e09640602e10bc8de0e6fa2b3fd68eedd84ba6d7842dc8f32f9ab87bd0b", size = 10350488, upload-time = "2026-07-04T17:06:37.785Z" }, +] + +[[package]] +name = "nvidia-cublas-cu12" +version = "12.4.5.8" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ae/71/1c91302526c45ab494c23f61c7a84aa568b8c1f9d196efa5993957faf906/nvidia_cublas_cu12-12.4.5.8-py3-none-manylinux2014_x86_64.whl", hash = "sha256:2fc8da60df463fdefa81e323eef2e36489e1c94335b5358bcb38360adf75ac9b", size = 363438805, upload-time = "2024-04-03T20:57:06.025Z" }, +] + +[[package]] +name = "nvidia-cuda-cupti-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/42/f4f60238e8194a3106d06a058d494b18e006c10bb2b915655bd9f6ea4cb1/nvidia_cuda_cupti_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:9dec60f5ac126f7bb551c055072b69d85392b13311fcc1bcda2202d172df30fb", size = 13813957, upload-time = "2024-04-03T20:55:01.564Z" }, +] + +[[package]] +name = "nvidia-cuda-nvrtc-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/14/91ae57cd4db3f9ef7aa99f4019cfa8d54cb4caa7e00975df6467e9725a9f/nvidia_cuda_nvrtc_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a178759ebb095827bd30ef56598ec182b85547f1508941a3d560eb7ea1fbf338", size = 24640306, upload-time = "2024-04-03T20:56:01.463Z" }, +] + +[[package]] +name = "nvidia-cuda-runtime-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ea/27/1795d86fe88ef397885f2e580ac37628ed058a92ed2c39dc8eac3adf0619/nvidia_cuda_runtime_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:64403288fa2136ee8e467cdc9c9427e0434110899d07c779f25b5c068934faa5", size = 883737, upload-time = "2024-04-03T20:54:51.355Z" }, +] + +[[package]] +name = "nvidia-cudnn-cu12" +version = "9.1.0.70" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9f/fd/713452cd72343f682b1c7b9321e23829f00b842ceaedcda96e742ea0b0b3/nvidia_cudnn_cu12-9.1.0.70-py3-none-manylinux2014_x86_64.whl", hash = "sha256:165764f44ef8c61fcdfdfdbe769d687e06374059fbb388b6c89ecb0e28793a6f", size = 664752741, upload-time = "2024-04-22T15:24:15.253Z" }, +] + +[[package]] +name = "nvidia-cufft-cu12" +version = "11.2.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/27/94/3266821f65b92b3138631e9c8e7fe1fb513804ac934485a8d05776e1dd43/nvidia_cufft_cu12-11.2.1.3-py3-none-manylinux2014_x86_64.whl", hash = "sha256:f083fc24912aa410be21fa16d157fed2055dab1cc4b6934a0e03cba69eb242b9", size = 211459117, upload-time = "2024-04-03T20:57:40.402Z" }, +] + +[[package]] +name = "nvidia-curand-cu12" +version = "10.3.5.147" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8a/6d/44ad094874c6f1b9c654f8ed939590bdc408349f137f9b98a3a23ccec411/nvidia_curand_cu12-10.3.5.147-py3-none-manylinux2014_x86_64.whl", hash = "sha256:a88f583d4e0bb643c49743469964103aa59f7f708d862c3ddb0fc07f851e3b8b", size = 56305206, upload-time = "2024-04-03T20:58:08.722Z" }, +] + +[[package]] +name = "nvidia-cusolver-cu12" +version = "11.6.1.9" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-cublas-cu12" }, + { name = "nvidia-cusparse-cu12" }, + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/3a/e1/5b9089a4b2a4790dfdea8b3a006052cfecff58139d5a4e34cb1a51df8d6f/nvidia_cusolver_cu12-11.6.1.9-py3-none-manylinux2014_x86_64.whl", hash = "sha256:19e33fa442bcfd085b3086c4ebf7e8debc07cfe01e11513cc6d332fd918ac260", size = 127936057, upload-time = "2024-04-03T20:58:28.735Z" }, +] + +[[package]] +name = "nvidia-cusparse-cu12" +version = "12.3.1.170" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "nvidia-nvjitlink-cu12" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/db/f7/97a9ea26ed4bbbfc2d470994b8b4f338ef663be97b8f677519ac195e113d/nvidia_cusparse_cu12-12.3.1.170-py3-none-manylinux2014_x86_64.whl", hash = "sha256:ea4f11a2904e2a8dc4b1833cc1b5181cde564edd0d5cd33e3c168eff2d1863f1", size = 207454763, upload-time = "2024-04-03T20:58:59.995Z" }, +] + +[[package]] +name = "nvidia-cusparselt-cu12" +version = "0.6.2" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/a8/bcbb63b53a4b1234feeafb65544ee55495e1bb37ec31b999b963cbccfd1d/nvidia_cusparselt_cu12-0.6.2-py3-none-manylinux2014_x86_64.whl", hash = "sha256:df2c24502fd76ebafe7457dbc4716b2fec071aabaed4fb7691a201cde03704d9", size = 150057751, upload-time = "2024-07-23T02:35:53.074Z" }, +] + +[[package]] +name = "nvidia-ml-py" +version = "13.610.43" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f0/b5/a8fbc356f768fa5c9cfd646668fd7d34bf55bdd1c6e20754642a64d930d4/nvidia_ml_py-13.610.43.tar.gz", hash = "sha256:65437eb73d68d0c62c931ca4d45038472faff03bd0b8729abba4b899f70d60f2", size = 52109, upload-time = "2026-06-01T18:54:08.829Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/23/45/caa600acfab94560807a20a64b5830d2cd3c3202b7f1328644d70b7d6bd8/nvidia_ml_py-13.610.43-py3-none-any.whl", hash = "sha256:f13c72698edef492f985cc225f14faafe68ae065a2e407f45bdf6f4b9b43fde8", size = 53163, upload-time = "2026-06-01T18:54:07.704Z" }, +] + +[[package]] +name = "nvidia-nccl-cu12" +version = "2.21.5" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/99/12cd266d6233f47d00daf3a72739872bdc10267d0383508b0b9c84a18bb6/nvidia_nccl_cu12-2.21.5-py3-none-manylinux2014_x86_64.whl", hash = "sha256:8579076d30a8c24988834445f8d633c697d42397e92ffc3f63fa26766d25e0a0", size = 188654414, upload-time = "2024-04-03T15:32:57.427Z" }, +] + +[[package]] +name = "nvidia-nvjitlink-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ff/ff/847841bacfbefc97a00036e0fce5a0f086b640756dc38caea5e1bb002655/nvidia_nvjitlink_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:06b3b9b25bf3f8af351d664978ca26a16d2c5127dbd53c0497e28d1fb9611d57", size = 21066810, upload-time = "2024-04-03T20:59:46.957Z" }, +] + +[[package]] +name = "nvidia-nvtx-cu12" +version = "12.4.127" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/87/20/199b8713428322a2f22b722c62b8cc278cc53dffa9705d744484b5035ee9/nvidia_nvtx_cu12-12.4.127-py3-none-manylinux2014_x86_64.whl", hash = "sha256:781e950d9b9f60d8241ccea575b32f5105a5baf4c2351cab5256a24869f12a1a", size = 99144, upload-time = "2024-04-03T20:56:12.406Z" }, +] + +[[package]] +name = "oauthlib" +version = "3.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/5f/19930f824ffeb0ad4372da4812c50edbd1434f678c90c2733e1188edfc63/oauthlib-3.3.1.tar.gz", hash = "sha256:0f0f8aa759826a193cf66c12ea1af1637f87b9b4622d46e866952bb022e538c9", size = 185918, upload-time = "2025-06-19T22:48:08.269Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/9c/92789c596b8df838baa98fa71844d84283302f7604ed565dafe5a6b5041a/oauthlib-3.3.1-py3-none-any.whl", hash = "sha256:88119c938d2b8fb88561af5f6ee0eec8cc8d552b7bb1f712743136eb7523b7a1", size = 160065, upload-time = "2025-06-19T22:48:06.508Z" }, +] + +[[package]] +name = "opencensus" +version = "0.11.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "google-api-core" }, + { name = "opencensus-context" }, + { name = "six" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/15/a7/a46dcffa1b63084f9f17fe3c8cb20724c4c8f91009fd0b2cfdb27d5d2b35/opencensus-0.11.4.tar.gz", hash = "sha256:cbef87d8b8773064ab60e5c2a1ced58bbaa38a6d052c41aec224958ce544eff2", size = 64966, upload-time = "2024-01-03T18:04:07.085Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b5/ed/9fbdeb23a09e430d87b7d72d430484b88184633dc50f6bfb792354b6f661/opencensus-0.11.4-py2.py3-none-any.whl", hash = "sha256:a18487ce68bc19900336e0ff4655c5a116daf10c1b3685ece8d971bddad6a864", size = 128225, upload-time = "2024-01-03T18:04:05.127Z" }, +] + +[[package]] +name = "opencensus-context" +version = "0.1.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/4c/96/3b6f638f6275a8abbd45e582448723bffa29c1fb426721dedb5c72f7d056/opencensus-context-0.1.3.tar.gz", hash = "sha256:a03108c3c10d8c80bb5ddf5c8a1f033161fa61972a9917f9b9b3a18517f0088c", size = 4066, upload-time = "2022-08-03T22:20:22.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/68/162c97ea78c957d68ecf78a5c5041d2e25bd5562bdf5d89a6cbf7f8429bf/opencensus_context-0.1.3-py2.py3-none-any.whl", hash = "sha256:073bb0590007af276853009fac7e4bab1d523c3f03baf4cb4511ca38967c6039", size = 5060, upload-time = "2022-08-03T22:20:20.352Z" }, +] + +[[package]] +name = "opencv-python" +version = "5.0.0.93" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/4c/a438d23e09ce2033c09f7b784ad2fbdb0adf529e434101ed28f142226f98/opencv_python-5.0.0.93.tar.gz", hash = "sha256:66aac3e5b5faa48d4025816592f3af19e4bfc2c68dec067bae2dbb4ca10aa9e2", size = 81802749, upload-time = "2026-07-02T06:59:53.815Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9c/75/76f6ade78f6102c61034f828e2a22616708df2c9504bc8d6af9dd8f73dc5/opencv_python-5.0.0.93-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:198a75138241810206a17c829dbcc40a7cb1841cda538ca86cbbfc6c7d95f898", size = 48322443, upload-time = "2026-07-02T05:50:25.466Z" }, + { url = "https://files.pythonhosted.org/packages/15/8c/bc1bda6aae69a32e9d84fc34153ba104cd25226861eb4aea33b2cea4860d/opencv_python-5.0.0.93-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:6bbc32f59e1b1a7db7b39c81f63d00625f041d333037fd8702f6da52cc39108b", size = 34782755, upload-time = "2026-07-02T05:51:30.556Z" }, + { url = "https://files.pythonhosted.org/packages/f4/8a/b04776ec45d2dea08a1b176f1829201db3515d4ed16c35f8fcc9fa7beb16/opencv_python-5.0.0.93-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:e2b4272e736836f66c2d176e43ab8101f3a00d45654916399f52e150c58981ac", size = 50614064, upload-time = "2026-07-02T06:53:22.604Z" }, + { url = "https://files.pythonhosted.org/packages/95/54/eb47866b94f2b5b42dde17644b78055ef1ee05aae59962c7290e55270803/opencv_python-5.0.0.93-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:f8b6d0a212253dd26ad338c812f1f23ca118fdf05a9c8c6b9444f161aa8c5881", size = 71064711, upload-time = "2026-07-02T06:54:13.148Z" }, + { url = "https://files.pythonhosted.org/packages/93/da/962579f1e703cbf8c5422fd1f576467dcb3b5b0b0b81c1471c979764353a/opencv_python-5.0.0.93-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:08d5d91d967b58d6db86073b2ad3eaef88ca4ebdfd45c9059bf59f5ded0c7ad2", size = 49798576, upload-time = "2026-07-02T06:54:33.781Z" }, + { url = "https://files.pythonhosted.org/packages/cf/4c/c73f828fdbcd37eaf21d08fa852544a3ca7c2dbb3ea76873d64f2ea413d1/opencv_python-5.0.0.93-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:c8de2dec111122a02e8beb28e16c31904992dfd6186560b142a92c71403c1039", size = 73783032, upload-time = "2026-07-02T06:55:03.415Z" }, + { url = "https://files.pythonhosted.org/packages/e2/4b/edaf83b996ca5a1a3d8ccad485706b9c6d4742b13b9c4586bf1c1e7d9423/opencv_python-5.0.0.93-cp37-abi3-win32.whl", hash = "sha256:4b4b1a34c79bf8d3738e3cfe9a9e67b51a79663f6b692cbdad8c31f570da4157", size = 35564734, upload-time = "2026-07-02T05:49:57.704Z" }, + { url = "https://files.pythonhosted.org/packages/21/f0/9fa6e85cb10c8eb36a0222d27e50fe381b86ce49a55446bf39f491727564/opencv_python-5.0.0.93-cp37-abi3-win_amd64.whl", hash = "sha256:f90ba04b8f73bc5c3814037699739f0156f597338a98f05956c684e7c3ca10d2", size = 44000345, upload-time = "2026-07-02T05:49:54.971Z" }, +] + +[[package]] +name = "opencv-python-headless" +version = "4.13.0.92" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/79/42/2310883be3b8826ac58c3f2787b9358a2d46923d61f88fedf930bc59c60c/opencv_python_headless-4.13.0.92-cp37-abi3-macosx_13_0_arm64.whl", hash = "sha256:1a7d040ac656c11b8c38677cc8cccdc149f98535089dbe5b081e80a4e5903209", size = 46247192, upload-time = "2026-02-05T07:01:35.187Z" }, + { url = "https://files.pythonhosted.org/packages/2d/1e/6f9e38005a6f7f22af785df42a43139d0e20f169eb5787ce8be37ee7fcc9/opencv_python_headless-4.13.0.92-cp37-abi3-macosx_14_0_x86_64.whl", hash = "sha256:3e0a6f0a37994ec6ce5f59e936be21d5d6384a4556f2d2da9c2f9c5dc948394c", size = 32568914, upload-time = "2026-02-05T07:01:51.989Z" }, + { url = "https://files.pythonhosted.org/packages/21/76/9417a6aef9def70e467a5bf560579f816148a4c658b7d525581b356eda9e/opencv_python_headless-4.13.0.92-cp37-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:5c8cfc8e87ed452b5cecb9419473ee5560a989859fe1d10d1ce11ae87b09a2cb", size = 33703709, upload-time = "2026-02-05T10:24:46.469Z" }, + { url = "https://files.pythonhosted.org/packages/92/ce/bd17ff5772938267fd49716e94ca24f616ff4cb1ff4c6be13085108037be/opencv_python_headless-4.13.0.92-cp37-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:0525a3d2c0b46c611e2130b5fdebc94cf404845d8fa64d2f3a3b679572a5bd22", size = 56016764, upload-time = "2026-02-05T10:26:48.904Z" }, + { url = "https://files.pythonhosted.org/packages/8f/b4/b7bcbf7c874665825a8c8e1097e93ea25d1f1d210a3e20d4451d01da30aa/opencv_python_headless-4.13.0.92-cp37-abi3-manylinux_2_28_aarch64.whl", hash = "sha256:eb60e36b237b1ebd40a912da5384b348df8ed534f6f644d8e0b4f103e272ba7d", size = 35010236, upload-time = "2026-02-05T10:28:11.031Z" }, + { url = "https://files.pythonhosted.org/packages/4b/33/b5db29a6c00eb8f50708110d8d453747ca125c8b805bc437b289dbdcc057/opencv_python_headless-4.13.0.92-cp37-abi3-manylinux_2_28_x86_64.whl", hash = "sha256:0bd48544f77c68b2941392fcdf9bcd2b9cdf00e98cb8c29b2455d194763cf99e", size = 60391106, upload-time = "2026-02-05T10:30:14.236Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c3/52cfea47cd33e53e8c0fbd6e7c800b457245c1fda7d61660b4ffe9596a7f/opencv_python_headless-4.13.0.92-cp37-abi3-win32.whl", hash = "sha256:a7cf08e5b191f4ebb530791acc0825a7986e0d0dee2a3c491184bd8599848a4b", size = 30812232, upload-time = "2026-02-05T07:02:29.594Z" }, + { url = "https://files.pythonhosted.org/packages/4a/90/b338326131ccb2aaa3c2c85d00f41822c0050139a4bfe723cfd95455bd2d/opencv_python_headless-4.13.0.92-cp37-abi3-win_amd64.whl", hash = "sha256:77a82fe35ddcec0f62c15f2ba8a12ecc2ed4207c17b0902c7a3151ae29f37fb6", size = 40070414, upload-time = "2026-02-05T07:02:26.448Z" }, +] + +[[package]] +name = "opentelemetry-api" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ae/cc/e4c9584181f86494df0f6bdec1a4f3280c50db44704dc2a407e994fc87bb/opentelemetry_api-1.43.0.tar.gz", hash = "sha256:107d0d03857ea8fc7c5fcbbbd83f800c281f0d560553d61c1d675fccfd1761c1", size = 73476, upload-time = "2026-06-24T15:19:55.323Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/17/83/6dba32b85f31868400440dc7ad2ca1eab94cbbf3a7b0459ed39f8311a9e2/opentelemetry_api-1.43.0-py3-none-any.whl", hash = "sha256:20acf45e9b21851926835292e4045d290acade1edd2ff3de86d2f069687ba1fd", size = 61912, upload-time = "2026-06-24T15:19:35.434Z" }, +] + +[[package]] +name = "opentelemetry-exporter-prometheus" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-sdk" }, + { name = "prometheus-client" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/97/b3/f778f705289ea5f1c54589ae4494d318c9cede052f18ca33979fda0ef016/opentelemetry_exporter_prometheus-0.64b0.tar.gz", hash = "sha256:96fec79be9527cb9dc994d7e663051df35161eb936fe2d41954725e4595abbc1", size = 16405, upload-time = "2026-06-24T15:20:02.278Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fe/dd/d95db7ac5bec037b3dcc8ea6fe64cd5dc4bc87017d2e06e7410318e85dc0/opentelemetry_exporter_prometheus-0.64b0-py3-none-any.whl", hash = "sha256:9979a15f8d007d442bc7a6e16f4cbde5e8e0c5e99689887ceb5f33da251f0655", size = 13031, upload-time = "2026-06-24T15:19:44.159Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7e/97/02fe6e1c8b1ffac42d0b429c18080edb24e0e0d18c86612edf72b5752382/opentelemetry_instrumentation-0.64b0.tar.gz", hash = "sha256:b47d528dead6271d7743114417eb67fc915bd9258111c48dbf9a4951d2efa88d", size = 41935, upload-time = "2026-06-24T15:19:12.951Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d2/0c/cb9fe342de5299c7af24582eb7d788661cc53a1c4b904da92309caaa9417/opentelemetry_instrumentation-0.64b0-py3-none-any.whl", hash = "sha256:133ab7ffca796557aec059bf6be3190a34b6dea987f25be3d9409e230cbdad8b", size = 35880, upload-time = "2026-06-24T15:18:17.277Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-asgi" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "asgiref" }, + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/85/0c/71c696fccb86d37af383ea1604af4729fabad0af2fabaf203e4c79c1e859/opentelemetry_instrumentation_asgi-0.64b0.tar.gz", hash = "sha256:4dd3eee566a4303f8e6b9b84f2a0a7abc57a6640df768926c68a3868bf5b2090", size = 26136, upload-time = "2026-06-24T15:19:17.003Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/20/218b65a63d847a7ed28d1bea84c39234689160b74480b8702272e37f4240/opentelemetry_instrumentation_asgi-0.64b0-py3-none-any.whl", hash = "sha256:e0840b66e15303a9254b0540946010bd008aa0504f4d89b8e1b7fb63490a36f0", size = 15906, upload-time = "2026-06-24T15:18:23.107Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-fastapi" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-instrumentation-asgi" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "opentelemetry-util-http" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/db/a1/52282e2cc5c08f4df13b087896d9907258fe2ff4f34035d3b21aa92684c3/opentelemetry_instrumentation_fastapi-0.64b0.tar.gz", hash = "sha256:05f75149929e433c1630de381688e650bf651c1e1cce7f9a7b649a807dac8a98", size = 26236, upload-time = "2026-06-24T15:19:27.219Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/72/2d/4f48dc2d6f289f2febc5b871940dbea9f3b04ab9186d23342581b49cb984/opentelemetry_instrumentation_fastapi-0.64b0-py3-none-any.whl", hash = "sha256:43cbbfb2d3079dc81104478a2950ae93ac6d0e90a5020fa3987a236f8f2bdef1", size = 13263, upload-time = "2026-06-24T15:18:38.553Z" }, +] + +[[package]] +name = "opentelemetry-instrumentation-sqlalchemy" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-instrumentation" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "packaging" }, + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/46/d7/86e333dede47a67a0f989f383da5d0840162ee21e0b252ca56cf61351c59/opentelemetry_instrumentation_sqlalchemy-0.64b0.tar.gz", hash = "sha256:dd737e0b0a72500961aa0dbb6fb2a10525f8dbb5299f9315ddf82d415cc64719", size = 18006, upload-time = "2026-06-24T15:19:40.225Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/90/5424365cb111d2383747b36ca3dbc558e86ef5ec6694efb53bfcb771f046/opentelemetry_instrumentation_sqlalchemy-0.64b0-py3-none-any.whl", hash = "sha256:687ee4c453020c7db009a7f3e390bb2b28eab4e61517e6d267e6e448c3eedcfb", size = 14410, upload-time = "2026-06-24T15:18:57.287Z" }, +] + +[[package]] +name = "opentelemetry-proto" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e0/b9/d357faefb40bda1d4799913e6af611171ff22a2dedcb93576bc92242d056/opentelemetry_proto-1.43.0.tar.gz", hash = "sha256:224778df17e1f3fafeaaa21d874236ca5f6ffc2f86e0899298ec7351aac27924", size = 46481, upload-time = "2026-06-24T15:20:07.625Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ed/a7/3e5308cf548b8f72529c7db1afdb3a404211982376a12927fd7759f77bf3/opentelemetry_proto-1.43.0-py3-none-any.whl", hash = "sha256:c58f1f7ef84bc7dc2834016c0c37fe0081dde7ca9f6339be1970fbf9cdaaa90d", size = 72489, upload-time = "2026-06-24T15:19:51.164Z" }, +] + +[[package]] +name = "opentelemetry-sdk" +version = "1.43.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "opentelemetry-semantic-conventions" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3e/eb/5041074274ac0956b03637cc039d434569112468e875eddfcc9a0674ce06/opentelemetry_sdk-1.43.0.tar.gz", hash = "sha256:d8187c81c162df9913e4003dd6485f7390d9a24fc17026ec7387b8b8218b08e9", size = 254744, upload-time = "2026-06-24T15:20:08.467Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/e3/b17be23af124201c9f52eececd4cc8ddfed1597d37b4ee771895d325805c/opentelemetry_sdk-1.43.0-py3-none-any.whl", hash = "sha256:d1323a547c1ce69d6a069a17a44b7da82bb8b332051ecb074041f87642c86823", size = 178852, upload-time = "2026-06-24T15:19:52.169Z" }, +] + +[[package]] +name = "opentelemetry-semantic-conventions" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "opentelemetry-api" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5a/30/5f26df29509eccd86b99b481ac9ffa39da49ba9577cc69071c552ae30447/opentelemetry_semantic_conventions-0.64b0.tar.gz", hash = "sha256:72f76fb2d1582d9d033dd1fcd84532e961e6ff3d90d24ba6fabc72975a83864c", size = 148340, upload-time = "2026-06-24T15:20:09.267Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f2/ca/23ba87a221b574a7c5a99d48849d80bfe8b047624681357e2b002e566187/opentelemetry_semantic_conventions-0.64b0-py3-none-any.whl", hash = "sha256:ea77e85e354b8f604ddbe5f3d9135216f982fa4d77e5859ac30f6d8a50505aa6", size = 203713, upload-time = "2026-06-24T15:19:53.339Z" }, +] + +[[package]] +name = "opentelemetry-util-http" +version = "0.64b0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c3/1b/1029a805fd7242f7dfce91633b244c3b14a94d703232878f71e01ce862b1/opentelemetry_util_http-0.64b0.tar.gz", hash = "sha256:8a86a220dbfc56d736f47f1e5c4e7932a21fcf69052312e1bcf166444dc79322", size = 11102, upload-time = "2026-06-24T15:19:48.974Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1c/c7/5f8ec5b30546f2dc22cd5fc5759bce2ab5be6e89a2e710a405ac9ef64ed3/opentelemetry_util_http-0.64b0-py3-none-any.whl", hash = "sha256:c1e5350d25507c1afcd6076cf9ac062485a0a4f79cd9971366996fd3056bacdb", size = 8204, upload-time = "2026-06-24T15:19:09.02Z" }, +] + +[[package]] +name = "packaging" +version = "26.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/f1/e7a6dd94a8d4a5626c03e4e99c87f241ba9e350cd9e6d75123f992427270/packaging-26.2.tar.gz", hash = "sha256:ff452ff5a3e828ce110190feff1178bb1f2ea2281fa2075aadb987c2fb221661", size = 228134, upload-time = "2026-04-24T20:15:23.917Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/b2/87e62e8c3e2f4b32e5fe99e0b86d576da1312593b39f47d8ceef365e95ed/packaging-26.2-py3-none-any.whl", hash = "sha256:5fc45236b9446107ff2415ce77c807cee2862cb6fac22b8a73826d0693b0980e", size = 100195, upload-time = "2026-04-24T20:15:22.081Z" }, +] + +[[package]] +name = "pandas" +version = "2.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "tzdata" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/33/01/d40b85317f86cf08d853a4f495195c73815fdf205eef3993821720274518/pandas-2.3.3.tar.gz", hash = "sha256:e05e1af93b977f7eafa636d043f9f94c7ee3ac81af99c13508215942e64c993b", size = 4495223, upload-time = "2025-09-29T23:34:51.853Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3d/f7/f425a00df4fcc22b292c6895c6831c0c8ae1d9fac1e024d16f98a9ce8749/pandas-2.3.3-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:376c6446ae31770764215a6c937f72d917f214b43560603cd60da6408f183b6c", size = 11555763, upload-time = "2025-09-29T23:16:53.287Z" }, + { url = "https://files.pythonhosted.org/packages/13/4f/66d99628ff8ce7857aca52fed8f0066ce209f96be2fede6cef9f84e8d04f/pandas-2.3.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:e19d192383eab2f4ceb30b412b22ea30690c9e618f78870357ae1d682912015a", size = 10801217, upload-time = "2025-09-29T23:17:04.522Z" }, + { url = "https://files.pythonhosted.org/packages/1d/03/3fc4a529a7710f890a239cc496fc6d50ad4a0995657dccc1d64695adb9f4/pandas-2.3.3-cp310-cp310-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5caf26f64126b6c7aec964f74266f435afef1c1b13da3b0636c7518a1fa3e2b1", size = 12148791, upload-time = "2025-09-29T23:17:18.444Z" }, + { url = "https://files.pythonhosted.org/packages/40/a8/4dac1f8f8235e5d25b9955d02ff6f29396191d4e665d71122c3722ca83c5/pandas-2.3.3-cp310-cp310-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dd7478f1463441ae4ca7308a70e90b33470fa593429f9d4c578dd00d1fa78838", size = 12769373, upload-time = "2025-09-29T23:17:35.846Z" }, + { url = "https://files.pythonhosted.org/packages/df/91/82cc5169b6b25440a7fc0ef3a694582418d875c8e3ebf796a6d6470aa578/pandas-2.3.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4793891684806ae50d1288c9bae9330293ab4e083ccd1c5e383c34549c6e4250", size = 13200444, upload-time = "2025-09-29T23:17:49.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/ae/89b3283800ab58f7af2952704078555fa60c807fff764395bb57ea0b0dbd/pandas-2.3.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:28083c648d9a99a5dd035ec125d42439c6c1c525098c58af0fc38dd1a7a1b3d4", size = 13858459, upload-time = "2025-09-29T23:18:03.722Z" }, + { url = "https://files.pythonhosted.org/packages/85/72/530900610650f54a35a19476eca5104f38555afccda1aa11a92ee14cb21d/pandas-2.3.3-cp310-cp310-win_amd64.whl", hash = "sha256:503cf027cf9940d2ceaa1a93cfb5f8c8c7e6e90720a2850378f0b3f3b1e06826", size = 11346086, upload-time = "2025-09-29T23:18:18.505Z" }, + { url = "https://files.pythonhosted.org/packages/c1/fa/7ac648108144a095b4fb6aa3de1954689f7af60a14cf25583f4960ecb878/pandas-2.3.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:602b8615ebcc4a0c1751e71840428ddebeb142ec02c786e8ad6b1ce3c8dec523", size = 11578790, upload-time = "2025-09-29T23:18:30.065Z" }, + { url = "https://files.pythonhosted.org/packages/9b/35/74442388c6cf008882d4d4bdfc4109be87e9b8b7ccd097ad1e7f006e2e95/pandas-2.3.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8fe25fc7b623b0ef6b5009149627e34d2a4657e880948ec3c840e9402e5c1b45", size = 10833831, upload-time = "2025-09-29T23:38:56.071Z" }, + { url = "https://files.pythonhosted.org/packages/fe/e4/de154cbfeee13383ad58d23017da99390b91d73f8c11856f2095e813201b/pandas-2.3.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b468d3dad6ff947df92dcb32ede5b7bd41a9b3cceef0a30ed925f6d01fb8fa66", size = 12199267, upload-time = "2025-09-29T23:18:41.627Z" }, + { url = "https://files.pythonhosted.org/packages/bf/c9/63f8d545568d9ab91476b1818b4741f521646cbdd151c6efebf40d6de6f7/pandas-2.3.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b98560e98cb334799c0b07ca7967ac361a47326e9b4e5a7dfb5ab2b1c9d35a1b", size = 12789281, upload-time = "2025-09-29T23:18:56.834Z" }, + { url = "https://files.pythonhosted.org/packages/f2/00/a5ac8c7a0e67fd1a6059e40aa08fa1c52cc00709077d2300e210c3ce0322/pandas-2.3.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37b5848ba49824e5c30bedb9c830ab9b7751fd049bc7914533e01c65f79791", size = 13240453, upload-time = "2025-09-29T23:19:09.247Z" }, + { url = "https://files.pythonhosted.org/packages/27/4d/5c23a5bc7bd209231618dd9e606ce076272c9bc4f12023a70e03a86b4067/pandas-2.3.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:db4301b2d1f926ae677a751eb2bd0e8c5f5319c9cb3f88b0becbbb0b07b34151", size = 13890361, upload-time = "2025-09-29T23:19:25.342Z" }, + { url = "https://files.pythonhosted.org/packages/8e/59/712db1d7040520de7a4965df15b774348980e6df45c129b8c64d0dbe74ef/pandas-2.3.3-cp311-cp311-win_amd64.whl", hash = "sha256:f086f6fe114e19d92014a1966f43a3e62285109afe874f067f5abbdcbb10e59c", size = 11348702, upload-time = "2025-09-29T23:19:38.296Z" }, + { url = "https://files.pythonhosted.org/packages/9c/fb/231d89e8637c808b997d172b18e9d4a4bc7bf31296196c260526055d1ea0/pandas-2.3.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6d21f6d74eb1725c2efaa71a2bfc661a0689579b58e9c0ca58a739ff0b002b53", size = 11597846, upload-time = "2025-09-29T23:19:48.856Z" }, + { url = "https://files.pythonhosted.org/packages/5c/bd/bf8064d9cfa214294356c2d6702b716d3cf3bb24be59287a6a21e24cae6b/pandas-2.3.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3fd2f887589c7aa868e02632612ba39acb0b8948faf5cc58f0850e165bd46f35", size = 10729618, upload-time = "2025-09-29T23:39:08.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/56/cf2dbe1a3f5271370669475ead12ce77c61726ffd19a35546e31aa8edf4e/pandas-2.3.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ecaf1e12bdc03c86ad4a7ea848d66c685cb6851d807a26aa245ca3d2017a1908", size = 11737212, upload-time = "2025-09-29T23:19:59.765Z" }, + { url = "https://files.pythonhosted.org/packages/e5/63/cd7d615331b328e287d8233ba9fdf191a9c2d11b6af0c7a59cfcec23de68/pandas-2.3.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b3d11d2fda7eb164ef27ffc14b4fcab16a80e1ce67e9f57e19ec0afaf715ba89", size = 12362693, upload-time = "2025-09-29T23:20:14.098Z" }, + { url = "https://files.pythonhosted.org/packages/a6/de/8b1895b107277d52f2b42d3a6806e69cfef0d5cf1d0ba343470b9d8e0a04/pandas-2.3.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a68e15f780eddf2b07d242e17a04aa187a7ee12b40b930bfdd78070556550e98", size = 12771002, upload-time = "2025-09-29T23:20:26.76Z" }, + { url = "https://files.pythonhosted.org/packages/87/21/84072af3187a677c5893b170ba2c8fbe450a6ff911234916da889b698220/pandas-2.3.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:371a4ab48e950033bcf52b6527eccb564f52dc826c02afd9a1bc0ab731bba084", size = 13450971, upload-time = "2025-09-29T23:20:41.344Z" }, + { url = "https://files.pythonhosted.org/packages/86/41/585a168330ff063014880a80d744219dbf1dd7a1c706e75ab3425a987384/pandas-2.3.3-cp312-cp312-win_amd64.whl", hash = "sha256:a16dcec078a01eeef8ee61bf64074b4e524a2a3f4b3be9326420cabe59c4778b", size = 10992722, upload-time = "2025-09-29T23:20:54.139Z" }, +] + +[[package]] +name = "pandas" +version = "3.0.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "python-dateutil" }, + { name = "tzdata", marker = "sys_platform == 'emscripten' or sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f8/87/4341c6252d1c47b08768c3d25ac487362bf403f0313ddae4a2a26c9b1b4c/pandas-3.0.3.tar.gz", hash = "sha256:696a4a00a2a2a35d4e5deb3fc946641b96c944f02230e4f76137fe35d806c4fc", size = 4651414, upload-time = "2026-05-11T18:54:29.21Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/42/16/b5c76b838fd9bf6ce84d3a53346b8874ec05c5f0040d75ef2c320100cd2a/pandas-3.0.3-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:455f6f8139d4282188f526868dbc3c828470e88a3d9d59a891bd46a455f21b98", size = 10338495, upload-time = "2026-05-11T18:52:11.558Z" }, + { url = "https://files.pythonhosted.org/packages/5a/b0/a4ffc4ae74d2d822200dcc46898987d8eb6032d1e2b219cae39da6f5cbcc/pandas-3.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4e15135e2ee5df1063313e2425ceef8ac0f4ae775893815b0923651b806a5639", size = 9938250, upload-time = "2026-05-11T18:52:17.005Z" }, + { url = "https://files.pythonhosted.org/packages/2e/b2/3323601a52caee42c019e370090ca4544b241437240ca04f786cce82b0cf/pandas-3.0.3-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:05f1f1752b8533ea03f7f39a9c15b1a058d067bb48f4748948e7a8691e0510f2", size = 10770558, upload-time = "2026-05-11T18:52:19.865Z" }, + { url = "https://files.pythonhosted.org/packages/32/f1/bbecd2f867b97abebe0f9b53d750f862251b40337e061b36676ded3d920f/pandas-3.0.3-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a1e45c80cceb3b4a21bc5939d52e8cbd8d9b7305309219d59e9754d9ce09e27", size = 11274611, upload-time = "2026-05-11T18:52:22.622Z" }, + { url = "https://files.pythonhosted.org/packages/7f/4f/eafabf2d5fae5adf143b4d18d3706c5efdc368a7c4eb1ee8a3eddabbd0f6/pandas-3.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:14da8316da4d0c5a77618425996bfb1248ca87fc2c1486e6fde4652bd18b5824", size = 11784670, upload-time = "2026-05-11T18:52:25.4Z" }, + { url = "https://files.pythonhosted.org/packages/49/44/1eb20389301b57b19cc099a1c2f662501f72f08a65f912d05822613c1532/pandas-3.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a55066a0505dae0ba2b50a46637db34b46f9094c65c5d4800794ef6335010938", size = 12353708, upload-time = "2026-05-11T18:52:28.139Z" }, + { url = "https://files.pythonhosted.org/packages/eb/62/c321f13b5ba1819fc8dca456c7fce578da2dcfecff1abbf0eaddf8406c0f/pandas-3.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:6674ab18ad8c57802867264b00e15e7bb904700cdd9046e3b2fa1fce237439ea", size = 9907609, upload-time = "2026-05-11T18:52:30.982Z" }, + { url = "https://files.pythonhosted.org/packages/53/85/1b7f563ebc6357c27233a02a96b589bcce1fa9c6eb89fb4f0e56421d277e/pandas-3.0.3-cp311-cp311-win_arm64.whl", hash = "sha256:5cc09a68b3120e0f54870dede8287a7bb1fa463907e4fcec1ea77cab6179bf7a", size = 9165596, upload-time = "2026-05-11T18:52:33.334Z" }, + { url = "https://files.pythonhosted.org/packages/24/f1/392f8c5bfc16f66a0d2d41561c01627c228fe7ed2a0d056ef11315042570/pandas-3.0.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:fed2ff7fd9779120e388e285fc029bd5cf9490cdd2e4166a9ee22c0e49a9ab09", size = 10357846, upload-time = "2026-05-11T18:52:36.143Z" }, + { url = "https://files.pythonhosted.org/packages/cf/3d/b16412745651e855f357e5e66930248688378853a6e2698a214e331fba1f/pandas-3.0.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:b168fc218fd80a6cbdbdbc1a97ddc7889ed057d7eb45f50d866ceab5f39904c4", size = 9899550, upload-time = "2026-05-11T18:52:38.976Z" }, + { url = "https://files.pythonhosted.org/packages/31/a8/fa2535168fffcedf67f4f6de28d2dd903a747ca7c8ea6989451aaeb3a92f/pandas-3.0.3-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0383c72c75cdcca61a9e116e611143902dbfd08bff356829c2f6d1cf40a9ca8c", size = 10412965, upload-time = "2026-05-11T18:52:41.915Z" }, + { url = "https://files.pythonhosted.org/packages/65/b6/09b01cdbc15224e2850365192d17b7bdebb8bdbd8780ed221fcdf0d9a515/pandas-3.0.3-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6dc0b3fd2169c9157deed50b4d519553a3655c8c6a96027136d654592be973a9", size = 10894600, upload-time = "2026-05-11T18:52:45.02Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/2eb28f2fccb4ced4a2c79ab2a5dee9ade1ebf44922ebad6fea158c9f95d4/pandas-3.0.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:7e65d5407dc0b394f509699650e4a2ec01c0514f21850f453fa60f3be79a5dbf", size = 11422824, upload-time = "2026-05-11T18:52:48.058Z" }, + { url = "https://files.pythonhosted.org/packages/f8/45/830bb57f533a4604b355e07edcb8ea18cf88b5f94e5fca92f27052d7c597/pandas-3.0.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f8894dc474d648fe7b6ff0ca9b0bd73950d19952bc1a6534540762c5d79d305c", size = 11950889, upload-time = "2026-05-11T18:52:50.905Z" }, + { url = "https://files.pythonhosted.org/packages/b9/c5/fc1b368f303087d20e8c9bf3d6ceb186263cfac0ade735cd938538bea839/pandas-3.0.3-cp312-cp312-win_amd64.whl", hash = "sha256:c7be265b62cef88e253a941e4698604973736dcfe242fdb5198f0f7bc473cdcc", size = 9755463, upload-time = "2026-05-11T18:52:53.386Z" }, + { url = "https://files.pythonhosted.org/packages/86/bd/fda8f9705b1b09c6ebe14bfc0fa0e4ec8584d54ea673628f157ff55131af/pandas-3.0.3-cp312-cp312-win_arm64.whl", hash = "sha256:557409bc4178e70ee8d9ddb494798e51ebf6ea59330f6be22c51bab2a7db6c49", size = 9066158, upload-time = "2026-05-11T18:52:56.038Z" }, +] + +[[package]] +name = "pandocfilters" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/70/6f/3dd4940bbe001c06a65f88e36bad298bc7a0de5036115639926b0c5c0458/pandocfilters-1.5.1.tar.gz", hash = "sha256:002b4a555ee4ebc03f8b66307e287fa492e4a77b4ea14d3f934328297bb4939e", size = 8454, upload-time = "2024-01-18T20:08:13.726Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/af/4fbc8cab944db5d21b7e2a5b8e9211a03a79852b1157e2c102fcc61ac440/pandocfilters-1.5.1-py2.py3-none-any.whl", hash = "sha256:93be382804a9cdb0a7267585f157e5d1731bbe5545a85b268d6f5fe6232de2bc", size = 8663, upload-time = "2024-01-18T20:08:11.28Z" }, +] + +[[package]] +name = "paramiko" +version = "3.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "bcrypt" }, + { name = "cryptography" }, + { name = "pynacl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7d/15/ad6ce226e8138315f2451c2aeea985bf35ee910afb477bae7477dc3a8f3b/paramiko-3.5.1.tar.gz", hash = "sha256:b2c665bc45b2b215bd7d7f039901b14b067da00f3a11e6640995fd58f2664822", size = 1566110, upload-time = "2025-02-04T02:37:59.783Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/15/f8/c7bd0ef12954a81a1d3cea60a13946bd9a49a0036a5927770c461eade7ae/paramiko-3.5.1-py3-none-any.whl", hash = "sha256:43b9a0501fc2b5e70680388d9346cf252cfb7d00b0667c39e80eb43a408b8f61", size = 227298, upload-time = "2025-02-04T02:37:57.672Z" }, +] + +[[package]] +name = "parso" +version = "0.8.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/30/4b/90c937815137d43ce71ba043cd3566221e9df6b9c805f24b5d138c9d40a7/parso-0.8.7.tar.gz", hash = "sha256:eaaac4c9fdd5e9e8852dc778d2d7405897ec510f2a298071453e5e3a07914bb1", size = 401824, upload-time = "2026-05-01T23:13:02.138Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/99/5d/8268b644392ee874ee82a635cd0df1773de230bde356c38de28e298392cc/parso-0.8.7-py2.py3-none-any.whl", hash = "sha256:a8926eb2a1b915486941fdbd31e86a4baf88fe8c210f25f2f35ecec5b574ca1c", size = 107025, upload-time = "2026-05-01T23:12:58.867Z" }, +] + +[[package]] +name = "pathlib-abc" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d6/cb/448649d7f25d228bf0be3a04590ab7afa77f15e056f8fa976ed05ec9a78f/pathlib_abc-0.5.2.tar.gz", hash = "sha256:fcd56f147234645e2c59c7ae22808b34c364bb231f685ddd9f96885aed78a94c", size = 33342, upload-time = "2025-10-10T18:37:20.524Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b1/29/c028a0731e202035f0e2e0bfbf1a3e46ad6c628cbb17f6f1cc9eea5d9ff1/pathlib_abc-0.5.2-py3-none-any.whl", hash = "sha256:4c9d94cf1b23af417ce7c0417b43333b06a106c01000b286c99de230d95eefbb", size = 19070, upload-time = "2025-10-10T18:37:19.437Z" }, +] + +[[package]] +name = "pathy" +version = "0.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pathlib-abc" }, + { name = "smart-open" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c8/adee48909db6e57affb31d571fbb5ba7a88446d2776c202a46da487f63f1/pathy-0.14.2.tar.gz", hash = "sha256:18e5bebae74d6a56e09ead1adc92d8794c1e7a33f45411c080f79ff2a4c31fae", size = 168756, upload-time = "2026-04-11T17:37:09.757Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/97/a8/b3ee9c9581547861b6536882ec718bc3461b26e9aeb7627fed755a774653/pathy-0.14.2-py3-none-any.whl", hash = "sha256:61d225570906d33b18cd12a864cba7f100b246ef976102860f3224fa111e329a", size = 50914, upload-time = "2026-04-11T17:37:08.54Z" }, +] + +[[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 = "pi-heif" +version = "1.4.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pillow" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/6a/a2/70168b601b41bdf5726dfc8dc110eb4052a2e851fed9c9bdae95910e401d/pi_heif-1.4.0.tar.gz", hash = "sha256:e1199d9d41d9ecc877cf3ae7322ff099f6404574f2e62da47590cd4ecb9ec554", size = 17125614, upload-time = "2026-06-10T16:03:53.207Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/62/fdd32400ebe46a357aede2ee691edd06738c7b794345c153b2421a236301/pi_heif-1.4.0-cp310-cp310-macosx_10_15_x86_64.whl", hash = "sha256:a72f81f7837d298c283e893d4f8805a1eaea9c55df7dd0efe8615a6511bd5add", size = 1063529, upload-time = "2026-06-10T16:02:43.152Z" }, + { url = "https://files.pythonhosted.org/packages/f1/7e/06551546ed9d9169c2b83cd267f11e8cb3813e0223ca34b55be87233b41f/pi_heif-1.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:eeea6d0291bb16f674b2de5088630c580a101b90bcca4990a7dca236959cbf9d", size = 959643, upload-time = "2026-06-10T16:02:44.897Z" }, + { url = "https://files.pythonhosted.org/packages/45/c5/8fc0df0452a4cdcd4cb5525708279bb9331f522e2c62d379b3f30bea7720/pi_heif-1.4.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c1d598f0afa3eccff8aa27d9bc4fbb68a39931d6937be57379fb9ee61d5cd8b8", size = 1352607, upload-time = "2026-06-10T16:02:46.39Z" }, + { url = "https://files.pythonhosted.org/packages/56/eb/702e960ea90a2098f9deab023ae20518258478d13349b9e4c1774b4fdb46/pi_heif-1.4.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:97e4048cbddc3d0d7b0c629f02c9d5e4f911b4ae8e7c088a0c315487b972f405", size = 1486573, upload-time = "2026-06-10T16:02:47.718Z" }, + { url = "https://files.pythonhosted.org/packages/e9/91/dbed0d95c1dc1c791e66332a59d49809d514c4558d760aa97f151a50bc52/pi_heif-1.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a8aba0545e1c54a05b8914665f2bda5ae4826e34eb779a3d2a7f613931d1d14d", size = 2335346, upload-time = "2026-06-10T16:02:49.13Z" }, + { url = "https://files.pythonhosted.org/packages/0c/8e/50eb30c18ab03c570fd5792286c65417ac6991db7e931e6181f0f24c33ca/pi_heif-1.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c1acbbc08fe2a85a58c1dd4c2bcc247f37b50f07e6842bc1d7ff6fa2162236fa", size = 2505847, upload-time = "2026-06-10T16:02:50.708Z" }, + { url = "https://files.pythonhosted.org/packages/03/f4/601f0a15a5ab5987f7e65d1cf416e07af1536b5bee5f2061bd66e3aa3744/pi_heif-1.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:fcfb9422c9c9c8f84d6a18ebf256b872556bf4f05697430e790a16bb197a8f26", size = 2383129, upload-time = "2026-06-10T16:02:52.181Z" }, + { url = "https://files.pythonhosted.org/packages/1e/de/9f1414c732781b7ac13a5879bbc9709aa17f97a7f176345ff7d68b62ae8a/pi_heif-1.4.0-cp311-cp311-macosx_10_15_x86_64.whl", hash = "sha256:b13e807418c60f1b6bda75a2afe9bab4dd1b47b4bf393fa45eff0f3bd884e74a", size = 1063526, upload-time = "2026-06-10T16:02:53.908Z" }, + { url = "https://files.pythonhosted.org/packages/e2/71/d027a0d3102cdf76da416a30754baabc6f94ae1b84dc9c467e572f9808f1/pi_heif-1.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dafa2ea7e7ff594f64fa60e0cd25b3dea9d200277d7aed9fb2b73835fa41fb6d", size = 959643, upload-time = "2026-06-10T16:02:55.278Z" }, + { url = "https://files.pythonhosted.org/packages/06/f0/a6a60e848466c506280fd996864c545ecf90d69a6a21701b543f5f8ee766/pi_heif-1.4.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d8789b56a4eb1bda9ec3479e22537f20a3e42e98e145dfc4825ebf5ec945cdd9", size = 1354310, upload-time = "2026-06-10T16:02:56.584Z" }, + { url = "https://files.pythonhosted.org/packages/fb/b7/864ed7b2c1663b004e8bff2fe0cab23710839a636c65d405047b71a33678/pi_heif-1.4.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:48554de1080094557f75d090bac1b8004850f11b2be91efe7de9d51d6d620f81", size = 1488131, upload-time = "2026-06-10T16:02:57.935Z" }, + { url = "https://files.pythonhosted.org/packages/88/c9/916e8850733699d21e3779e8614458145f646d4a47d8f671142cffaf1fa1/pi_heif-1.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:a4f83306843c80ccd4784cfd73ea78a96a59abdfbb0fc16b2646bd76b8fff438", size = 2336858, upload-time = "2026-06-10T16:02:59.269Z" }, + { url = "https://files.pythonhosted.org/packages/78/b2/a667c3a5f027fdd3673efb212560828ea852527f46b99e850a3edc36076a/pi_heif-1.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:759dc764b45efcb62c1ad26355c7d46be1ed5d5e93e86fe19992ecfeab305e7a", size = 2507428, upload-time = "2026-06-10T16:03:00.932Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/b5047514725f4708d82dd6b1184694e5d32e3fc432558485c540f84da0f1/pi_heif-1.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:9b568e747e31dfc4ca09d5464e8d9475eb5958bf5289767c38280920f6454ba0", size = 2383130, upload-time = "2026-06-10T16:03:02.364Z" }, + { url = "https://files.pythonhosted.org/packages/7b/b4/abfa8d2264144454c1bb18b0339a35bddb1010c078429ced386eab58246e/pi_heif-1.4.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:58320bee5fac8923aa8e09439c7e8778ba4afb146d2cd658be9f4160cb72aec3", size = 1063771, upload-time = "2026-06-10T16:03:03.634Z" }, + { url = "https://files.pythonhosted.org/packages/dc/8e/5367ffae4518b884218d3a49e28edcb0dbd28e71ed67a7eb0a1c82ac4f0c/pi_heif-1.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:04d5b253bc463839beb50ac9fdf9f13a79125ee80346a53030f43962e565f928", size = 959618, upload-time = "2026-06-10T16:03:05.302Z" }, + { url = "https://files.pythonhosted.org/packages/21/ac/96a896a984923bc0de64c6c68e0dcd6f0c2d9f33d5e13f8294fc58b2ea9c/pi_heif-1.4.0-cp312-cp312-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4cc3a6a55d31f7961d7bf16103a47704adf33c06209d9f86351caea2084c40a", size = 1352877, upload-time = "2026-06-10T16:03:06.739Z" }, + { url = "https://files.pythonhosted.org/packages/20/49/7d95867e0190e7396a4ee2d7951483d03c02d803f05d22cf90d401a6157d/pi_heif-1.4.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:482bf2d9b26f4e3399a304bb8d14e01aaf0b806f22615e2cc98a0bdbda895d22", size = 1487485, upload-time = "2026-06-10T16:03:08.153Z" }, + { url = "https://files.pythonhosted.org/packages/b4/eb/672a162c58e3a16acbdd8407e4dac8d4f86a945f3bcb61077c99f5204156/pi_heif-1.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:4fab02de6b0e445d8e7ab2f232338e242d6b5b54c0bddf12959ede248f176518", size = 2335564, upload-time = "2026-06-10T16:03:09.748Z" }, + { url = "https://files.pythonhosted.org/packages/0e/bf/cd127c7cd1cfe6fcd7c49d203b1384ccda9bd0ae4748cdfd8dafb486cda1/pi_heif-1.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5b58514d1b76fb488e4f78ac4717371c8077f6422298d0fc9a21c2fa72d8907b", size = 2506643, upload-time = "2026-06-10T16:03:11.158Z" }, + { url = "https://files.pythonhosted.org/packages/3b/63/d3b8597da25b0dd62e587a7089ce40dbbaa72449b2680f26220fb6a7688a/pi_heif-1.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:81cb473227b2da35bfd7c69a12764f664d91e44b0ec2547cdfe5ca6b8b52cab9", size = 2383230, upload-time = "2026-06-10T16:03:12.512Z" }, + { url = "https://files.pythonhosted.org/packages/5f/4a/376d99ce769353df9445e76fe8f4072a854695d57da65d67d948c895dfd3/pi_heif-1.4.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:2395973961b19e7d72f31f8283279dd0112c20d892e35417ebe09fb8e54c6f51", size = 1051878, upload-time = "2026-06-10T16:03:44.833Z" }, + { url = "https://files.pythonhosted.org/packages/50/59/25f92e8bf833c67f90edb80734fdc50a71becde90d877d0d6f822883222a/pi_heif-1.4.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:2d1577df3172de68ec095cd9b7fc065f396093473f5826a6a82e07a7d26af2af", size = 956097, upload-time = "2026-06-10T16:03:46.206Z" }, + { url = "https://files.pythonhosted.org/packages/9c/22/a4ae6a69a89ce499dcfa26f306bf3de1802bd0e5231311c25ab05f4074c6/pi_heif-1.4.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6c5fe6ca4b5b5e6c9d2d645d30c8cbd9a4fc4087aeb8b45f2872729a5f568b18", size = 1312163, upload-time = "2026-06-10T16:03:47.674Z" }, + { url = "https://files.pythonhosted.org/packages/14/0e/a9fac916c201aff86e51d1bb6ee1565334fe43fef18acedf3228af48a921/pi_heif-1.4.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:13beb46287e190fbaeedcf157a2be6f9ac56a9e91d7a7a7de9264ea2f195643f", size = 1442979, upload-time = "2026-06-10T16:03:48.988Z" }, + { url = "https://files.pythonhosted.org/packages/c0/97/c9e13f864dd2647dc2a231bdb7fd4c8e78362eb9801f042feb0f2356b50b/pi_heif-1.4.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:43241a5fb8a34bd6c822f47022e9b53276db7f42379074e281da2053ca0eca0c", size = 2383479, upload-time = "2026-06-10T16:03:50.477Z" }, +] + +[[package]] +name = "pillow" +version = "12.3.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/3d/bb7fca845737cf9d7dbde16ed1843984665ff2e0a518f5db43e77ec540b9/pillow-12.3.0.tar.gz", hash = "sha256:3b8182a766685eaa002637e28b4ec8d6b18819a0c71f579bf0dbaa5830297cce", size = 47025035, upload-time = "2026-07-01T11:56:38.965Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/c2/669d88644cddb1485bd9534e63e8cf476c8e51cb3c3a1297677023505c0e/pillow-12.3.0-cp310-cp310-macosx_10_10_x86_64.whl", hash = "sha256:6c0016e7b354317c4e9e525b937ac8596c38d2d232b419529b9cd7a1cd46e39a", size = 5392418, upload-time = "2026-07-01T11:53:27.808Z" }, + { url = "https://files.pythonhosted.org/packages/6b/ba/3762f376a2948e3036488d773a146e0ae6ecc2ca03ac20e2615bd0b2ba02/pillow-12.3.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:bcc33feacfaefce60c12fd500a277533bdc02b10a19f7f6d348763d8140bbba7", size = 4785287, upload-time = "2026-07-01T11:53:29.761Z" }, + { url = "https://files.pythonhosted.org/packages/07/50/b5d688cc9c52d4482f3d5bcab6ce20bc2a74a85d2343841c907444a3be2c/pillow-12.3.0-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5594fc43d548a7ed94949d139aa1341b270f1863f11cfd37f5a6c8b778a6b67f", size = 6253754, upload-time = "2026-07-01T11:53:32.298Z" }, + { url = "https://files.pythonhosted.org/packages/4e/89/36f4cd76cf4baf05c50ababb976249153f18c959171c7f6ba09a6f217260/pillow-12.3.0-cp310-cp310-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f0606c8bf2cdefea14a43530f7657cbbb7ecf1c4222512492ef4a4434a9501ec", size = 6925605, upload-time = "2026-07-01T11:53:34.487Z" }, + { url = "https://files.pythonhosted.org/packages/eb/c0/4de58cf6633b9e3a6061ef4be6fb91fc3c90b812ece886f531e3c523d777/pillow-12.3.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:85f998ea1848bc6757289e739cfbdda3a04adfd58b02fc018ce54d754a5ce468", size = 6327788, upload-time = "2026-07-01T11:53:36.433Z" }, + { url = "https://files.pythonhosted.org/packages/87/3c/14d53682a19550dbbaf3b598f807d5457646c510805a44c7d7891cd1cd1a/pillow-12.3.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:25b9b82bb22e6e2b3cd07b39c68b7b862001226cb3dff7130d1cb914121b39ed", size = 7036288, upload-time = "2026-07-01T11:53:38.712Z" }, + { url = "https://files.pythonhosted.org/packages/38/1d/36279e3c77efe034e4cc2b0393ee74ffdb5a62391dacbf9b916154f5f0b8/pillow-12.3.0-cp310-cp310-win32.whl", hash = "sha256:37dc8f7bbb66efe481bb60defacef820c950c24713fb44962ed6aa2a50966de1", size = 6472396, upload-time = "2026-07-01T11:53:40.781Z" }, + { url = "https://files.pythonhosted.org/packages/48/7c/8fa0039574c476d7c6fa57dd7c32a130436877c6ec1e5ce1cc8ec44878c1/pillow-12.3.0-cp310-cp310-win_amd64.whl", hash = "sha256:300557495eb45ebb8aec96c2da9c4be642fbf7cd937278b4013ba894ea8eb0eb", size = 7226887, upload-time = "2026-07-01T11:53:42.764Z" }, + { url = "https://files.pythonhosted.org/packages/fa/17/e324be141d173c1c919428066c3259f21c1b8982e564e01a4a81e96dbdcf/pillow-12.3.0-cp310-cp310-win_arm64.whl", hash = "sha256:514435a37670e3e5e08f3945b68718b6ed329bb84367777e16f9f4dfe1e61a0f", size = 2568039, upload-time = "2026-07-01T11:53:45.372Z" }, + { url = "https://files.pythonhosted.org/packages/fb/c8/0a78b0e02d7ac54bc03e5321c9220da52f0c2ea83b21f7c40e7f3169c502/pillow-12.3.0-cp311-cp311-macosx_10_10_x86_64.whl", hash = "sha256:00808c5e14ef63ac5161091d242999076604ff74b883423a11e5d7bbb38bf756", size = 5392415, upload-time = "2026-07-01T11:53:47.162Z" }, + { url = "https://files.pythonhosted.org/packages/b2/5b/a02d30018abd97ced9f5a6c63d28597694a00d066516b9c1c6de45859fc9/pillow-12.3.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:37d6d0a00072fd2948eb22bce7e1475f34569d90c87c59f7a2ec59541b77f7a6", size = 4785266, upload-time = "2026-07-01T11:53:49.079Z" }, + { url = "https://files.pythonhosted.org/packages/c8/98/766667a4be768150a202836acd9fad19c06824ca86c4286d3cf6b274964e/pillow-12.3.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bcb46e2f9feff8d06323983bd83ed00c201fdcab3d74973e7072a889b3979fcd", size = 6263814, upload-time = "2026-07-01T11:53:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/3b/2d/ede717bc1144f63886c21fd349bb95860b0d1a21149ff16f2bb362b612b6/pillow-12.3.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23d27a3e0307ec2244cc51e7287b919aa68d097504ebe19df4e76a98a3eea5bd", size = 6934408, upload-time = "2026-07-01T11:53:53.487Z" }, + { url = "https://files.pythonhosted.org/packages/a3/48/9c58b685e69d49c31af6c8eb9012055fab7e665785165c84796e2c73ce72/pillow-12.3.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4f883547d4b7f0495ebe7056b0cc2aea76094e7a4abc8e933540f3271df27d9c", size = 6337160, upload-time = "2026-07-01T11:53:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/ff/fa/dc2a5c0ba6df93f67c31d34b808b7ce440b40cdbf96f0b81cde1d1e6fa93/pillow-12.3.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:236ff70b9312fb68943c703aa842ca6a758abfa45ac187a5e7c1452e96ef72b5", size = 7045172, upload-time = "2026-07-01T11:53:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/86/a5/444817a4d4c4c2417df00513086ca196f388d8f9ef40c2e4ccd1ad1af54b/pillow-12.3.0-cp311-cp311-win32.whl", hash = "sha256:10e41f0fbf1eec8cfd234b8fe17a4caac7c9d0db4c204d3c173a8f9f6ef3232b", size = 6472232, upload-time = "2026-07-01T11:53:59.767Z" }, + { url = "https://files.pythonhosted.org/packages/63/c6/4bad1b18d132a50b27e1365e1ab163616f7a5bb56d330f66f9d1d9d4f9d4/pillow-12.3.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e95e1385e4998ae9694eeaa4730ba5457ff61185b3a55e2e7bea0880aef452a", size = 7233653, upload-time = "2026-07-01T11:54:02.066Z" }, + { url = "https://files.pythonhosted.org/packages/fd/16/00f91ab7760dc842f5aad55217e80fc4a7067a0604535249bc8a2d6d9870/pillow-12.3.0-cp311-cp311-win_arm64.whl", hash = "sha256:ebaea975e03d3141d9d3a507df75c9b3ec90fa9d2ffd07567b3a978d9d790b26", size = 2568195, upload-time = "2026-07-01T11:54:04.622Z" }, + { url = "https://files.pythonhosted.org/packages/37/bf/fb3ebff8ddcb76aac5a01389251bbbb9519922a9b520d8247c1ca864a25d/pillow-12.3.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:ba09209fbe443b4acccebe845d8a138b89a8f4fbaeedd44953490b5315d5e965", size = 5345969, upload-time = "2026-07-01T11:54:06.397Z" }, + { url = "https://files.pythonhosted.org/packages/d8/66/9a386a92561f402389a4fc70c18838bf6d35eb5eb5c6850b4b2dc64f5048/pillow-12.3.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ffd0c5368496f41b0944be820fcb7a838aa6e623d250b01acf2643939c3f99d7", size = 4780323, upload-time = "2026-07-01T11:54:09.351Z" }, + { url = "https://files.pythonhosted.org/packages/25/27/ac8f99618ffd3dde21db0f4d4b1d2ab00c0880595bfd17df103f7f39fd0c/pillow-12.3.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d9c7f76c0673154f044e9d78c8655fb4213f6ca31a836df48b40fe5d187717b9", size = 6266838, upload-time = "2026-07-01T11:54:11.71Z" }, + { url = "https://files.pythonhosted.org/packages/84/21/a35af28dcc61f37ed850a2d64c65c701321dfbf25085e469d5559360cbbf/pillow-12.3.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:78cb2c6865a35ab8ff8b75fd122f6033b92a62c82801110e48ddd6c936a45d91", size = 6940830, upload-time = "2026-07-01T11:54:13.732Z" }, + { url = "https://files.pythonhosted.org/packages/eb/51/8b08617af3ad95e33ce6d7dd2c99ed6c8298f7fb131636303956be022e25/pillow-12.3.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e491916b378fba47242221bb9ead245211b70d504f495d105d17b14a24b4907c", size = 6344383, upload-time = "2026-07-01T11:54:15.756Z" }, + { url = "https://files.pythonhosted.org/packages/1d/72/cf78ac9780bb93c28328f408973845a309d4d145041665f734572ced1b52/pillow-12.3.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0dd2064cbc55aaec028ef5fbb60fa47bb6c3e7918e07ff17935284b227a9d2df", size = 7052934, upload-time = "2026-07-01T11:54:17.721Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/25e0f4dc178a6bc0696793720055519a0de89e7661dae886992decbd2f81/pillow-12.3.0-cp312-cp312-win32.whl", hash = "sha256:dbce0b29841537a2fa4a214c2bbf14de3587c9680caa9b4e217568472490b28f", size = 6472684, upload-time = "2026-07-01T11:54:19.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/da2f7971a317f83d807fdd4065c0af40208e59e692cc43d315a71a0e96d1/pillow-12.3.0-cp312-cp312-win_amd64.whl", hash = "sha256:a2b55dd6b2a4c4b7d87ffa56bdb33fdc5fdb9a462173861a7bc097f17d91cb09", size = 7227137, upload-time = "2026-07-01T11:54:22.025Z" }, + { url = "https://files.pythonhosted.org/packages/de/47/4845a0a6c0dbf1db8456bd9fc791f13c5ced7ced20606d08a0aacfd25b49/pillow-12.3.0-cp312-cp312-win_arm64.whl", hash = "sha256:331b624368d4f1d069149002f25f44bc61c8919ce8ddb3c45bdad8f6e2d89510", size = 2568267, upload-time = "2026-07-01T11:54:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/75/18/2e8b40223153ccbc60df07f9e8928dc0c76202aa4e55ae9f53962b6510d6/pillow-12.3.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:b3c777e849237620b022f7f297dd67705f9f5cf1685f09f02e46f93e92725468", size = 5302510, upload-time = "2026-07-01T11:56:25.736Z" }, + { url = "https://files.pythonhosted.org/packages/46/3e/51fabf59d5ab801ceab709453d3ab6b180083496579549de4c45ced6528a/pillow-12.3.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:b343699e8308bdc51978310e1c959c584e7869cc8c40780058c87da7781a1e94", size = 4736058, upload-time = "2026-07-01T11:56:28.041Z" }, + { url = "https://files.pythonhosted.org/packages/bf/20/22fe9384b7949e25fb1293bcfc84fb82590ff4ea6b37c95b24d26d793d86/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fbd139c8447d25dd750ab79ee274cc5e1fe80fc56340ab10b18a195e1b6eca3e", size = 5237776, upload-time = "2026-07-01T11:56:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/08/14/f6ba68107680ffa74b39985f3f30884e41318fbc4250caa423c79b4788bb/pillow-12.3.0-pp311-pypy311_pp73-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:e7e480451b9fa137494bccd3a7d69adbe8ac65a87d97be61e11f1b1050a5bac3", size = 5860358, upload-time = "2026-07-01T11:56:32.68Z" }, + { url = "https://files.pythonhosted.org/packages/36/54/0169bc772ec491108b62f644f8ecf1fe5d8ae5ebafde2ee2142210166903/pillow-12.3.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:04f01d28a6aaff387bf842a13be313df23ba0597a44f1a976c9feb3c6ff4711a", size = 7231786, upload-time = "2026-07-01T11:56:35.046Z" }, +] + +[[package]] +name = "platformdirs" +version = "4.10.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/d7/47/e4501f49c178ae1d9f4a75073fda4204f52647993f075a9db4d14930e0c5/platformdirs-4.10.0.tar.gz", hash = "sha256:31e761a6a0ca04faf7353ea759bdba55652be214725111e5aac52dfa29d4bef7", size = 31224, upload-time = "2026-05-28T03:32:53.587Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/e6/cd9575ac904136b3cbf7aa7ee819ef86eedb7274e46f230e94ea4342e729/platformdirs-4.10.0-py3-none-any.whl", hash = "sha256:fb516cdb12eb0d857d0cd85a7c57cea4d060bee4578d6cf5a14dfdf8cbf8784a", size = 22743, upload-time = "2026-05-28T03:32:52.175Z" }, +] + +[[package]] +name = "playwright" +version = "1.61.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet" }, + { name = "pyee" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/44/ee/31e4e0db36588b817a10b299a0285082545fde7d36543c2abe498bb3d61a/playwright-1.61.0-py3-none-macosx_10_13_x86_64.whl", hash = "sha256:ff138c3a604f69911e9d42fd036e55c2a171e5616edf04c1e7f60a2a285540b0", size = 43421877, upload-time = "2026-06-29T10:32:48.428Z" }, + { url = "https://files.pythonhosted.org/packages/42/35/71395dd3ecc798965be4a3ef8c443217d4abca168e7cb34536304f9489e6/playwright-1.61.0-py3-none-macosx_11_0_arm64.whl", hash = "sha256:009588c2a7e499bc5a8b425b61fa65490968bbda9cd69e0cf2cff10f8304659a", size = 42205016, upload-time = "2026-06-29T10:32:52.104Z" }, + { url = "https://files.pythonhosted.org/packages/f4/44/323164cf5cd1647bdefce76ffce27651aadb959d089b48f53ea40918276e/playwright-1.61.0-py3-none-macosx_11_0_universal2.whl", hash = "sha256:9f7de4536088d12037c13a52b7ea34b59270b78926bb56935070597ffac6b1af", size = 43421884, upload-time = "2026-06-29T10:32:55.773Z" }, + { url = "https://files.pythonhosted.org/packages/ab/f8/a35bf179e4ba2522c1893635094a64e407572547bd61528820fc0abc87fe/playwright-1.61.0-py3-none-manylinux1_x86_64.whl", hash = "sha256:54f3b39f6eab832e33458c1dd7da0b5682aedab3b09ae731b5c59fa12fd2024e", size = 47421381, upload-time = "2026-06-29T10:32:59.903Z" }, + { url = "https://files.pythonhosted.org/packages/b7/eb/e3f922348ec17c315f98c463f72faa1181a1c3de0bfe31a8d2edf6561723/playwright-1.61.0-py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:93454322ade8c11d5d6c211bfd91bdfb9ffb4810e3e026371bcbc4bec1b7ee4c", size = 47120545, upload-time = "2026-06-29T10:33:03.574Z" }, + { url = "https://files.pythonhosted.org/packages/c2/a6/5be4e52b40a9c0c8a073e7c5b0785c05cf5a9ea8f8a7b5b260e32d970342/playwright-1.61.0-py3-none-win32.whl", hash = "sha256:372d55a6f1248fa1dd47599686980cb8fb5bbe6fcda59eab793eb657c11d8a9b", size = 37844841, upload-time = "2026-06-29T10:33:07.361Z" }, + { url = "https://files.pythonhosted.org/packages/6c/fd/2b78036e5fbe9d5f5645bbe08a1eac7160c51243c0093963edbcf67c35d9/playwright-1.61.0-py3-none-win_amd64.whl", hash = "sha256:35c6cc4589a5d00964a59d7b3e59641e0aac0c02f15479a7af77d20f6bc79597", size = 37844846, upload-time = "2026-06-29T10:33:10.637Z" }, + { url = "https://files.pythonhosted.org/packages/27/0d/1b0f3c4ee4eb0514bc805b5c2f9a223e5b6de4f11a926f5235d51d0fc81b/playwright-1.61.0-py3-none-win_arm64.whl", hash = "sha256:e9fcbffcf557a8620fdedd92491eb59a32d18e23d6f3b4f6214b952be324fe51", size = 33955127, upload-time = "2026-06-29T10:33:14.008Z" }, +] + +[[package]] +name = "plotly" +version = "6.8.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "narwhals" }, + { name = "packaging" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/94/fd/d72c292d78aadb93d1a9bcd76bf3c678271040c7cf10abe5788b33040a39/plotly-6.8.0.tar.gz", hash = "sha256:e088e7ddc68d4f70e3d66659224727a45296d71d2b8284181862d3d8f1f0d88f", size = 6915161, upload-time = "2026-06-03T18:33:40.226Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f9/14/abe5ce876ab5b66ee3c691bf537fcd43d037aea55d447aacf74630a8f31e/plotly-6.8.0-py3-none-any.whl", hash = "sha256:13c5c4a0f70b74cab1913eda0de49b826df5931708eb6f9c3010040614700ec8", size = 9902055, upload-time = "2026-06-03T18:33:34.26Z" }, +] + +[[package]] +name = "pluggy" +version = "1.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f9/e2/3e91f31a7d2b083fe6ef3fa267035b518369d9511ffab804f839851d2779/pluggy-1.6.0.tar.gz", hash = "sha256:7dcc130b76258d33b90f61b658791dede3486c3e6bfb003ee5c9bfb396dd22f3", size = 69412, upload-time = "2025-05-15T12:30:07.975Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/54/20/4d324d65cc6d9205fabedc306948156824eb9f0ee1633355a8f7ec5c66bf/pluggy-1.6.0-py3-none-any.whl", hash = "sha256:e920276dd6813095e9377c0bc5566d94c932c33b27a3e3945d8389c374dd4746", size = 20538, upload-time = "2025-05-15T12:30:06.134Z" }, +] + +[[package]] +name = "polars" +version = "1.42.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "polars-runtime-32" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/27/99/fe77f10a13a778705ef05b499fc708c9a0b0a3680d9eb6bc6e1b6a6b9914/polars-1.42.1.tar.gz", hash = "sha256:2fe94f3059334650bd850ae19a9c165dcd5d9cb12cd95ea04de2201662e70e8a", size = 741532, upload-time = "2026-06-30T04:57:51.504Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/6a/edd939cc6fa04b6415aaa9bf19720fc74ead81234b3d38542e0005816d4d/polars-1.42.1-py3-none-any.whl", hash = "sha256:3c0c65cdfa21a621650c4bdcbbccf93964d052fd766c3e70e84a55d961c259fd", size = 837622, upload-time = "2026-06-30T04:56:34.686Z" }, +] + +[[package]] +name = "polars-lts-cpu" +version = "1.33.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f4/93/a0c4200a5e0af2eee31ea79330cb1f5f4c58f604cb3de352f654e2010c81/polars_lts_cpu-1.33.1.tar.gz", hash = "sha256:0a5426d95ec9eec937a56d3e7cf7911a4b5486c42f4dbbcc9512aa706039322c", size = 4822741, upload-time = "2025-09-09T08:37:51.491Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f1/9b/75916636b33724afabe820b0993f60dc243793421d6f680d5fcb531fe170/polars_lts_cpu-1.33.1-cp39-abi3-macosx_10_12_x86_64.whl", hash = "sha256:5db75d1b424bd8aa34c9a670a901592f1931cc94d9fb32bdd428dbaad8c33761", size = 38908638, upload-time = "2025-09-09T08:37:02.258Z" }, + { url = "https://files.pythonhosted.org/packages/81/e2/dc77b81650ba0c631c06f05d8e81faacee87730600fceca372273facf77b/polars_lts_cpu-1.33.1-cp39-abi3-macosx_11_0_arm64.whl", hash = "sha256:37cf3a56cf447c69cfb3f9cd0e714d5b0c754705d7b497b9ab86cbf56e36b3e7", size = 35638895, upload-time = "2025-09-09T08:37:07.575Z" }, + { url = "https://files.pythonhosted.org/packages/27/fb/4dcff801d71dfa02ec682d6b32fd0ce5339de48797f663698d5f8348ffe7/polars_lts_cpu-1.33.1-cp39-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:656b530a672fe8fbd4c212b2a8481099e5cef63e84970975619ea7c25faeb833", size = 39585825, upload-time = "2025-09-09T08:37:11.631Z" }, + { url = "https://files.pythonhosted.org/packages/54/31/0474c14dce2c0507bea40069daafb848980ba7c351ad991908e51ac895fb/polars_lts_cpu-1.33.1-cp39-abi3-manylinux_2_24_aarch64.whl", hash = "sha256:64574c784380b37167b3db3a7cfdb9839cd308e89b8818859d2ffb34a9c896b2", size = 36685020, upload-time = "2025-09-09T08:37:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/d4/0a/5ebba9b145388ffbbd09fa84ac3cd7d336b922e34256b1417abf0a1c2fb9/polars_lts_cpu-1.33.1-cp39-abi3-win_amd64.whl", hash = "sha256:6b849e0e1485acb8ac39bf13356d280ea7c924c2b41cd548ea6e4d102d70be77", size = 39191650, upload-time = "2025-09-09T08:37:19.541Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ad/bf3db68d30ac798ca31c80624709a0c03aa890e2e20e5ca987d7e55fcfc2/polars_lts_cpu-1.33.1-cp39-abi3-win_arm64.whl", hash = "sha256:c99ab56b059cee6bcabe9fb89e97f5813be1012a2251bf77f76e15c2d1cba934", size = 35445244, upload-time = "2025-09-09T08:37:22.97Z" }, +] + +[[package]] +name = "polars-runtime-32" +version = "1.42.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/59/15bcc4dac380c6d63efa5446d8317f22671cbd6c9dadd576bd17a334c45a/polars_runtime_32-1.42.1.tar.gz", hash = "sha256:4d4809e1c1b9a6611f6944f27b24abea902b5159e6b6fa262fd716e947af5afd", size = 3045460, upload-time = "2026-06-30T04:57:52.866Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/29/16ff6e4e91d71e530d3581f45e342a9cc35072ac6b31dcbc2fa33de2569e/polars_runtime_32-1.42.1-cp310-abi3-macosx_10_12_x86_64.whl", hash = "sha256:bbdc26d68ee5b23b0ce227fa0599220aa35b77c826b6b0a6b2d8e7f6c1c36974", size = 53117325, upload-time = "2026-06-30T04:56:37.972Z" }, + { url = "https://files.pythonhosted.org/packages/04/8e/4f8296fcfd1347f1351342fecf13bf2430d7efbae2f1f45964ec7930a99e/polars_runtime_32-1.42.1-cp310-abi3-macosx_11_0_arm64.whl", hash = "sha256:f6c0288be940b607dc4a7476c01e67fb6bbee93f5f1dd42c64970274c71008ba", size = 47446251, upload-time = "2026-06-30T04:56:41.459Z" }, + { url = "https://files.pythonhosted.org/packages/88/2e/0d66a7deadc453b890c3391034ca8ab4b05d0beaebbb92a7d65199fba61b/polars_runtime_32-1.42.1-cp310-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:635d9dbcae2302ae223afb395d5cd220bffa61a53d0ab6871d17c8bc830101cf", size = 51359402, upload-time = "2026-06-30T04:56:44.595Z" }, + { url = "https://files.pythonhosted.org/packages/5d/10/ffb85fa380bc9c9000dc35f40f44954dde49023018501c54faab94b3a39e/polars_runtime_32-1.42.1-cp310-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:d059e8e53cc114ff82f9bd791fd341dc53534a2c745e6f6aa37594c3a93f01fe", size = 57302723, upload-time = "2026-06-30T04:56:47.609Z" }, + { url = "https://files.pythonhosted.org/packages/c2/63/ca50adc62e44224ca5c622a842ba6f35ee87d1d40ef0df7ea2ed6c6edb08/polars_runtime_32-1.42.1-cp310-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:f91f0b13588324905682809d270e1de5f1990c908721c8527657d77a044c9919", size = 51515673, upload-time = "2026-06-30T04:56:50.88Z" }, + { url = "https://files.pythonhosted.org/packages/63/c3/08fbbf38deaa17bf34a601d327cb7451074098673c78b7c1a8538dde9794/polars_runtime_32-1.42.1-cp310-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b8bf972d99d48aaaa2582e2bce966a6f43bc815bd8725d15f5cab9e2fb15d17", size = 55217259, upload-time = "2026-06-30T04:56:53.834Z" }, + { url = "https://files.pythonhosted.org/packages/d1/0e/51db89361668fe077a835fc579277f824ba526e7daf7b94d23d25439e0d0/polars_runtime_32-1.42.1-cp310-abi3-win_amd64.whl", hash = "sha256:e9364c26da389a8b7339e4d29e20a3d12af730247e6ed3b7804bddce2477f428", size = 52715432, upload-time = "2026-06-30T04:56:57.109Z" }, + { url = "https://files.pythonhosted.org/packages/76/c5/2fb8592d691bd114de25d9c84300b23541dca7060eac11d7b4bed0327786/polars_runtime_32-1.42.1-cp310-abi3-win_arm64.whl", hash = "sha256:7051226e6b42ffc395a7a9190377cd28649fbfb991b8f85c6271f4e1cfb736fb", size = 46718300, upload-time = "2026-06-30T04:56:59.855Z" }, +] + +[[package]] +name = "pprintpp" +version = "0.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/1a/7737e7a0774da3c3824d654993cf57adc915cb04660212f03406334d8c0b/pprintpp-0.4.0.tar.gz", hash = "sha256:ea826108e2c7f49dc6d66c752973c3fc9749142a798d6b254e1e301cfdbc6403", size = 17995, upload-time = "2018-07-01T01:42:34.87Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4e/d1/e4ed95fdd3ef13b78630280d9e9e240aeb65cc7c544ec57106149c3942fb/pprintpp-0.4.0-py2.py3-none-any.whl", hash = "sha256:b6b4dcdd0c0c0d75e4d7b2f21a9e933e5b2ce62b26e1a54537f9651ae5a5c01d", size = 16952, upload-time = "2018-07-01T01:42:36.496Z" }, +] + +[[package]] +name = "priority" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f5/3c/eb7c35f4dcede96fca1842dac5f4f5d15511aa4b52f3a961219e68ae9204/priority-2.0.0.tar.gz", hash = "sha256:c965d54f1b8d0d0b19479db3924c7c36cf672dbf2aec92d43fbdaf4492ba18c0", size = 24792, upload-time = "2021-06-27T10:15:05.487Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/5f/82c8074f7e84978129347c2c6ec8b6c59f3584ff1a20bc3c940a3e061790/priority-2.0.0-py3-none-any.whl", hash = "sha256:6f8eefce5f3ad59baf2c080a664037bb4725cd0a790d53d59ab4059288faf6aa", size = 8946, upload-time = "2021-06-27T10:15:03.856Z" }, +] + +[[package]] +name = "prometheus-client" +version = "0.25.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1b/fb/d9aa83ffe43ce1f19e557c0971d04b90561b0cfd50762aafb01968285553/prometheus_client-0.25.0.tar.gz", hash = "sha256:5e373b75c31afb3c86f1a52fa1ad470c9aace18082d39ec0d2f918d11cc9ba28", size = 86035, upload-time = "2026-04-09T19:53:42.359Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/8d/9b/d4b1e644385499c8346fa9b622a3f030dce14cd6ef8a1871c221a17a67e7/prometheus_client-0.25.0-py3-none-any.whl", hash = "sha256:d5aec89e349a6ec230805d0df882f3807f74fd6c1a2fa86864e3c2279059fed1", size = 64154, upload-time = "2026-04-09T19:53:41.324Z" }, +] + +[[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 = "propcache" +version = "0.5.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/44/c87281c333769159c50594f22610f77398a47ccbfbbf23074e744e86f87c/propcache-0.5.2.tar.gz", hash = "sha256:01c4fc7480cd0598bb4b57022df55b9ca296da7fc5a8760bd8451a7e63a7d427", size = 50208, upload-time = "2026-05-08T21:02:12.199Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5b/56/030b7b4719d53085722893e0009dffb9236aa10bca1b12121bdc5626ef16/propcache-0.5.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:d5a81be28596d6559f6131ef33e10200de6e17643b3c74ce03f9eb103be6ae8b", size = 93417, upload-time = "2026-05-08T20:59:15.597Z" }, + { url = "https://files.pythonhosted.org/packages/1a/55/1140a8e067b8ec093a18a4ae7bb0045d9db65da38a08618ddc5e2f1994aa/propcache-0.5.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:29cbaac5ea0212663e6845e04b5e188d5a6ae6dd919810ac835bf1d3b42c3f4c", size = 53847, upload-time = "2026-05-08T20:59:17.096Z" }, + { url = "https://files.pythonhosted.org/packages/20/42/0e7443c90310498561addf346e7d57fe3c6ba1914e1ba938b5464c7bbfd2/propcache-0.5.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:6bf3be92233808fcd338eba0fb4d0b59ec5772af4f4ecfcec450d1bfc0f8b5eb", size = 53512, upload-time = "2026-05-08T20:59:18.64Z" }, + { url = "https://files.pythonhosted.org/packages/b7/db/cf51a71bab2009517d1a7f0ee07657e3bd446c4d69f67e6966cf17bcf956/propcache-0.5.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2f8ea531c794b9d6274acd4e8d2c2ebcac590a4361d27482edd3010b79f1325e", size = 58068, upload-time = "2026-05-08T20:59:20.683Z" }, + { url = "https://files.pythonhosted.org/packages/b7/43/39b6bdee9699fa1e1641c519feeb64a67e2a9f93bb465c70776b37a7333f/propcache-0.5.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:decfca4c79dd53ebab484b00cc4b6717d8c369f86e74aa4ca395a64ac651495e", size = 61020, upload-time = "2026-05-08T20:59:22.112Z" }, + { url = "https://files.pythonhosted.org/packages/26/0b/843726fbb0a29a8c5684fdb25971823638399f31e52e9d1f06a02dc9aa6b/propcache-0.5.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4621064bbf28fa77ff64dd5d94367c04684c67d3a5bf1dff25f0cd0d98a38f3b", size = 62732, upload-time = "2026-05-08T20:59:23.805Z" }, + { url = "https://files.pythonhosted.org/packages/39/6e/899fed76dc1942b8a64193a4f059d7f1a2c7ef65085e8a9366ed8ec0d199/propcache-0.5.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b96db7141a592cbc968daf1feea83a118e6ab378af4abbc72b248c895414c22d", size = 60140, upload-time = "2026-05-08T20:59:25.389Z" }, + { url = "https://files.pythonhosted.org/packages/ab/09/3da4be9b5b879219ad234aa535b3dd4a080ed1ad48d3a73ca07a9e798f22/propcache-0.5.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:1ca071adabaab6e9219924bbe00af821f1ee7de113a9eca1cdc292de3d120f4d", size = 60400, upload-time = "2026-05-08T20:59:27.238Z" }, + { url = "https://files.pythonhosted.org/packages/60/2f/09b72b874a9aa0044faf52a69807a6ed618e267ceaa9ec4a63195fa5b504/propcache-0.5.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e4294d04a94dcab1b3bccd8b66d962dcad411a1d19414b2a41d1445f1de32ad0", size = 58155, upload-time = "2026-05-08T20:59:28.48Z" }, + { url = "https://files.pythonhosted.org/packages/8a/37/97489848c54c95578045473954f10956d619ce6a09e7ac137b71cdcb698b/propcache-0.5.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:a0e399a2eccb91ed18721f86aa85757727400b6865c89e88934781deb9c8498b", size = 57037, upload-time = "2026-05-08T20:59:30.146Z" }, + { url = "https://files.pythonhosted.org/packages/22/db/6c695285ccfc49012743ee9c98212b8c5dd0aed7b63cfd816d4a0f7a1601/propcache-0.5.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:823581fd5cb08b12a48bfa11fe962a7916766b6170c17b028fbdf762b85eb9bf", size = 61103, upload-time = "2026-05-08T20:59:31.626Z" }, + { url = "https://files.pythonhosted.org/packages/98/a9/1e500401ca593b0bdb6bf75a70bc2d723835fd53360edff6af70692c7546/propcache-0.5.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:949c91d1a990cf3b2e8188dfcfb25005e0b834a06c63fa4ef9f360878ce21ecf", size = 60394, upload-time = "2026-05-08T20:59:32.829Z" }, + { url = "https://files.pythonhosted.org/packages/1f/87/f638b6e375eae0f30a1a2325d8b34fd85fdc785bb9960cf805f3bf1ec69a/propcache-0.5.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:cc1177027eda740fdb152706bd215a3f124e3eea15afc39f2cb9fe351b50619e", size = 63084, upload-time = "2026-05-08T20:59:35.964Z" }, + { url = "https://files.pythonhosted.org/packages/f6/18/884573f5d97b6d9eba68de759a82c901b7e39d7904d30f7b8d58d42d2a12/propcache-0.5.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:b05d643f944a8c3c4bd86d65ffd87bf3264b617f87791940302bc474d2ff5274", size = 60999, upload-time = "2026-05-08T20:59:38.481Z" }, + { url = "https://files.pythonhosted.org/packages/8f/1a/c3915eb059ceec9e758a56e4cfd955292bc0f201be2176a46b76d94b303a/propcache-0.5.2-cp310-cp310-win32.whl", hash = "sha256:8114f28879e0904748e831c3a7774261bd9e75f49be089f389a76f959dcd13fe", size = 39036, upload-time = "2026-05-08T20:59:40.323Z" }, + { url = "https://files.pythonhosted.org/packages/5b/02/1dfd5607501a602d19c1c449d2d193b7d1c611f9246b4059026a1189a80e/propcache-0.5.2-cp310-cp310-win_amd64.whl", hash = "sha256:5fcb98e7598b1ee0addab320d90f65b530297a867dbfe9de52ea838077e16e3d", size = 42190, upload-time = "2026-05-08T20:59:42.232Z" }, + { url = "https://files.pythonhosted.org/packages/57/93/f71588ad08b3e6f4b555b5ef215808a3c02b042d0151ad82fa6f15be677a/propcache-0.5.2-cp310-cp310-win_arm64.whl", hash = "sha256:04dc2390d9edbbaef7461f33322555976ffddf0b650a038649d026358714e6c5", size = 38545, upload-time = "2026-05-08T20:59:44.087Z" }, + { url = "https://files.pythonhosted.org/packages/e7/f1/8a8cc1c2c7e7934ab77e0163414f736fadbc0f5e8dd9673b952355ac175b/propcache-0.5.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:74b70780220e2dd89175ca24b81b68b67c83db499ae611e7f2313cb329801c78", size = 90744, upload-time = "2026-05-08T20:59:45.799Z" }, + { url = "https://files.pythonhosted.org/packages/c2/f4/651b1225e976bd1a2ba5cfba0c29d096581c2636b437e3a9a7ab6276270a/propcache-0.5.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:a4840ab0ae0216d952f4b53dc6d0b992bfc2bedbfe360bdd9b548bc184c08959", size = 52033, upload-time = "2026-05-08T20:59:47.408Z" }, + { url = "https://files.pythonhosted.org/packages/15/a8/8ede85d6aa1f79fc7dc2f8fd2c8d65920b8272c3892903c8a1affde48cfb/propcache-0.5.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:c6844ba6364fb12f403928a82cfd295ab103a2b315c77c747b2dbe4a41894ea7", size = 52754, upload-time = "2026-05-08T20:59:49.202Z" }, + { url = "https://files.pythonhosted.org/packages/7d/fe/b3551b41bbc2f5b5bb088fc6920567cd43101253e68fbaa261339eb96fe1/propcache-0.5.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2293949b855ce597f2826452d17c2d545fb5622379c4ea6fdf525e9b8e8a2511", size = 57573, upload-time = "2026-05-08T20:59:50.778Z" }, + { url = "https://files.pythonhosted.org/packages/83/27/ab851ebd1b7172e3e161f5f8d39e315d54a91bea246f01f4d872d3376aef/propcache-0.5.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:0fd59b5af35f74da48d905dcbad55449ba13be91823cb05a9bd590bbf5b61660", size = 60645, upload-time = "2026-05-08T20:59:52.227Z" }, + { url = "https://files.pythonhosted.org/packages/95/7d/466b3d18022e9897cbda9c735c493c5bd747d7a4c6f5ea1480b4cec434b6/propcache-0.5.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:29f9309a2e42b0d273be006fdb4be2d6c39a47f6f57d8fb1cf9f81481df81b66", size = 61563, upload-time = "2026-05-08T20:59:53.866Z" }, + { url = "https://files.pythonhosted.org/packages/27/1b/16ab7f2cf2041da2f60d156ba64c2484eadf9168075b4ff43c3ef60045af/propcache-0.5.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5aaa2b923c1944ac8febd6609cb373540a5563e7cbcb0fd770f75dace2eb817b", size = 58888, upload-time = "2026-05-08T20:59:55.457Z" }, + { url = "https://files.pythonhosted.org/packages/0a/67/bb777ffd907633563bf35fd859c4ce97b0512c32f4633cf5d1eb7c33512b/propcache-0.5.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:66ea454f095ddf5b6b14f56c064c0941c4788be11e18d2464cf643bf7203ff67", size = 59253, upload-time = "2026-05-08T20:59:57.075Z" }, + { url = "https://files.pythonhosted.org/packages/b9/42/64f8d90b73fd9cdc1499b48057ff6d9cd2a98a25734c9bb62ecf07e87061/propcache-0.5.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:95f1e3f4760d404b13c9976c0229b2b49a3c8e2c62a9ce92efdd2b11ada75e3f", size = 57558, upload-time = "2026-05-08T20:59:58.602Z" }, + { url = "https://files.pythonhosted.org/packages/eb/02/dba5bc03c9041f2092ea55a449caf5dfe68352c6654511b29ba0654ddb69/propcache-0.5.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:85341b12b9d55bad0bded24cac341bb34289469e03a11f3f583ea1cc1db0326c", size = 55007, upload-time = "2026-05-08T20:59:59.837Z" }, + { url = "https://files.pythonhosted.org/packages/14/c0/43f649c7aa2a77a3b100d84e9dea3a483120ecb608bfe36ce49eaff517fe/propcache-0.5.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:26a4dca084132874e639895c3135dfad5eb20bae209f62d1aeb31b03e601c3c0", size = 60355, upload-time = "2026-05-08T21:00:01.144Z" }, + { url = "https://files.pythonhosted.org/packages/83/c0/435dafd27f1cb4a495381dae60e25883ccfe4020bb72818e8184c1678092/propcache-0.5.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3b199b9b2b3d6a7edf3183ba8a9a137a22b97f7df525feb5ae1eccf026d2a9c6", size = 59057, upload-time = "2026-05-08T21:00:02.401Z" }, + { url = "https://files.pythonhosted.org/packages/53/ae/6e292df9135d659944e96cb3389258e4a663e5b2b5f6c217ef0ddc8d2f73/propcache-0.5.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:e59bc9e66329185b93dab73f210f1a37f81cb40f321501db8017c9aea15dba27", size = 61938, upload-time = "2026-05-08T21:00:03.638Z" }, + { url = "https://files.pythonhosted.org/packages/0b/42/314ebc50d8159055411fd6b0bda322ff510e4b1f7d2e4927940ad0f6af20/propcache-0.5.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:552ffadf6ad409844bc5919c42a0a83d88314cedddaea0e41e80a8b8fffe881f", size = 59731, upload-time = "2026-05-08T21:00:04.881Z" }, + { url = "https://files.pythonhosted.org/packages/b8/9b/2da6dee38871c3c8772fabc2758325a5c9077d6d18c597737dc04dd884cd/propcache-0.5.2-cp311-cp311-win32.whl", hash = "sha256:cd416c1de191973c52ff1a12a57446bfc7642797b282d7caf2162d7d1b8aa9a0", size = 38966, upload-time = "2026-05-08T21:00:06.511Z" }, + { url = "https://files.pythonhosted.org/packages/42/4e/f17363fb58c0afe05b067361cb6d86ed2d29de6506779a27547c4d183075/propcache-0.5.2-cp311-cp311-win_amd64.whl", hash = "sha256:44e488ef40dbb452700b2b1f8188934121f6648f52c295055662d2191959ff82", size = 42135, upload-time = "2026-05-08T21:00:08.088Z" }, + { url = "https://files.pythonhosted.org/packages/c6/eb/6af6685077d22e8b33358d3c548e3282706a0b3cd85044ffba4e5dd08e3b/propcache-0.5.2-cp311-cp311-win_arm64.whl", hash = "sha256:54adaa85a22078d1e306304a40984dc5be99d599bf3dc0a24dc98f7daeab89ab", size = 38381, upload-time = "2026-05-08T21:00:09.692Z" }, + { url = "https://files.pythonhosted.org/packages/4a/cb/e27bc2b2737a0bb49962b275efa051e8f1c35a936df7d5139b6b658b7dc9/propcache-0.5.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:806719138ecd720339a12410fb9614ac9b2b2d3a5fdf8235d56981c36f4039ba", size = 95887, upload-time = "2026-05-08T21:00:11.277Z" }, + { url = "https://files.pythonhosted.org/packages/e6/13/b8ae04c59392f8d11c6cd9fb4011d1dc7c86b81225c770280300e259ffe1/propcache-0.5.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:db2b80ea58eab4f86b2beec3cc8b39e8ff9276ac20e96b7cce43c8ae84cd6b5a", size = 54654, upload-time = "2026-05-08T21:00:12.604Z" }, + { url = "https://files.pythonhosted.org/packages/2c/7d/49777a3e20b55863d4794384a38acd460c04157b0a00f8602b0d508b8431/propcache-0.5.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e5cbfac9f61484f7e9f3597775500cd3ebe8274e9b050c38f9525c77c97520bf", size = 55190, upload-time = "2026-05-08T21:00:13.935Z" }, + { url = "https://files.pythonhosted.org/packages/44/c7/085d0cd63062e84044e3f05797749c3f8e3938ff3aeb0eb2f69d43fafc91/propcache-0.5.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5dbc581d2814337da56222fab8dc5f161cd798a434e49bac27930aaef798e144", size = 59995, upload-time = "2026-05-08T21:00:15.526Z" }, + { url = "https://files.pythonhosted.org/packages/9c/42/32cf8e3009e92b2645cf1e944f701e8ea4e924dffde1ee26db860bcbf7e4/propcache-0.5.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:857187f381f88c8e2fa2fe56ab94879d011b883d5a2ee5a1b60a8cd2a06846d9", size = 63422, upload-time = "2026-05-08T21:00:16.824Z" }, + { url = "https://files.pythonhosted.org/packages/9e/1b/f112433f99fc979431b87a39ef169e3f8df070d99a72792c56d6937ac48b/propcache-0.5.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:178b4a2cdaac1818e2bf1c5a99b94383fa73ea5382e032a48dec07dc5668dc42", size = 64342, upload-time = "2026-05-08T21:00:18.362Z" }, + { url = "https://files.pythonhosted.org/packages/14/15/5574111ae50dd6e879456888c0eadd4c5a869959775854e18e18a6b345f3/propcache-0.5.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:6f328175a2cde1f0ff2c4ed8ce968b9dcfb55f3a7153f39e2957ed994da13476", size = 61639, upload-time = "2026-05-08T21:00:19.692Z" }, + { url = "https://files.pythonhosted.org/packages/cc/da/4d775080b1490c0ae604acda868bd71aabe3a89ed16f2aa4339eb8a283e7/propcache-0.5.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5671d09a36b06d0fd4a3da0fccbcae360e9b1570924171a15e9e0997f0249fba", size = 61588, upload-time = "2026-05-08T21:00:21.155Z" }, + { url = "https://files.pythonhosted.org/packages/04/ac/f076982cbe2195ee9cf32de5a1e46951d9fb399fc207f390562dd0fd8fb2/propcache-0.5.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:80168e2ebe4d3ec6599d10ad8f520304ae1cad9b6c5a95372aef1b66b7bfb53a", size = 60029, upload-time = "2026-05-08T21:00:22.713Z" }, + { url = "https://files.pythonhosted.org/packages/70/60/189be62e0dd898dce3b331e1b8c7a543cd3a405ac0c81fe8ee8a9d5d77e1/propcache-0.5.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:45f11346f884bc47444f6e6647131055844134c3175b629f84952e2b5cd62b64", size = 56774, upload-time = "2026-05-08T21:00:24.001Z" }, + { url = "https://files.pythonhosted.org/packages/ea/9e/93377b9c7939c1ffae98f878dee955efadfd638078bc86dbc21f9d52f651/propcache-0.5.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:8e778ebd44ef4f66ed60a0416b06b489687db264a9c0b3620362f26489492913", size = 63532, upload-time = "2026-05-08T21:00:25.545Z" }, + { url = "https://files.pythonhosted.org/packages/14/f9/590ef6cfb9b8028d516d287812ece32bb0bc5f11fbb9c8bf6b2e6313fec8/propcache-0.5.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:c0cb9ed24c8964e172768d455a38254c2dd8a552905729ce006cad3d3dda59b1", size = 61592, upload-time = "2026-05-08T21:00:27.186Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5e/70958b3034c297a630bba2f17ca7abc2d5f39a803ad7e370ab79d1ecd022/propcache-0.5.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:1d1ad32d9d4355e2be65574fd0bfd3677e7066b009cd5b9b2dee8aa6a6393b33", size = 64788, upload-time = "2026-05-08T21:00:28.8Z" }, + { url = "https://files.pythonhosted.org/packages/12/fd/77fe5936d8c3086ca9048f7f415f122ed82e53884a9ec193646b42deef06/propcache-0.5.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c80f4ba3e8f00189165999a742ee526ebeccedf6c3f7beb0c7df821e9772435a", size = 62514, upload-time = "2026-05-08T21:00:30.098Z" }, + { url = "https://files.pythonhosted.org/packages/cf/74/66bd798b5b3be70aa1b391f5cc9d6a0a5532d7fd3b19ec0b213e72e6ad9d/propcache-0.5.2-cp312-cp312-win32.whl", hash = "sha256:8c7972d8f193740d9175f0998ab38717e6cd322d5935c5b0fef8c0d323fd9031", size = 39018, upload-time = "2026-05-08T21:00:31.622Z" }, + { url = "https://files.pythonhosted.org/packages/61/7c/5c0d34aa3024694d6dcb9271cdbdd08c4e47c1c0ad95ec7e7bc74cdea145/propcache-0.5.2-cp312-cp312-win_amd64.whl", hash = "sha256:d9ee8826a7d47863a08ac44e1a5f611a462eefc3a194b492da242128bec75b42", size = 42322, upload-time = "2026-05-08T21:00:32.918Z" }, + { url = "https://files.pythonhosted.org/packages/4d/91/875812f1a3feb20ceba818ef39fbe4d92f1081e04ac815c822496d0d038b/propcache-0.5.2-cp312-cp312-win_arm64.whl", hash = "sha256:2800a4a8ead6b28cccd1ec54b59346f0def7922ee1c7598e8499c733cfbb7c84", size = 38172, upload-time = "2026-05-08T21:00:35.124Z" }, + { url = "https://files.pythonhosted.org/packages/3a/ed/1cdcab6ba3d6ab7feca11fc14f0eeea80755bb53ef4e892079f31b10a25f/propcache-0.5.2-py3-none-any.whl", hash = "sha256:be1ddfcbb376e3de5d2e2db1d58d6d67463e6b4f9f040c000de8e300295465fe", size = 14036, upload-time = "2026-05-08T21:02:10.673Z" }, +] + +[[package]] +name = "proto-plus" +version = "1.28.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "protobuf" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c9/56/e647b0c675392d2da368da7b6f158f7368b18542fd6f7d7400a2f39de000/proto_plus-1.28.0.tar.gz", hash = "sha256:38e5696342835b08fc116f30a25665b29531cda9d5d5643e9b81fc312385abd9", size = 57221, upload-time = "2026-05-07T08:04:50.811Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7c/20/b122d4626976acb81132036d2ad1bb35a1a8775fceb837ec30964622516a/proto_plus-1.28.0-py3-none-any.whl", hash = "sha256:a630604310899e73c59ec302e5765c058d412b2f090b9c79c8822589f14955b8", size = 50410, upload-time = "2026-05-07T08:03:31.962Z" }, +] + +[[package]] +name = "protobuf" +version = "6.33.6" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/66/70/e908e9c5e52ef7c3a6c7902c9dfbb34c7e29c25d2f81ade3856445fd5c94/protobuf-6.33.6.tar.gz", hash = "sha256:a6768d25248312c297558af96a9f9c929e8c4cee0659cb07e780731095f38135", size = 444531, upload-time = "2026-03-18T19:05:00.988Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fc/9f/2f509339e89cfa6f6a4c4ff50438db9ca488dec341f7e454adad60150b00/protobuf-6.33.6-cp310-abi3-win32.whl", hash = "sha256:7d29d9b65f8afef196f8334e80d6bc1d5d4adedb449971fefd3723824e6e77d3", size = 425739, upload-time = "2026-03-18T19:04:48.373Z" }, + { url = "https://files.pythonhosted.org/packages/76/5d/683efcd4798e0030c1bab27374fd13a89f7c2515fb1f3123efdfaa5eab57/protobuf-6.33.6-cp310-abi3-win_amd64.whl", hash = "sha256:0cd27b587afca21b7cfa59a74dcbd48a50f0a6400cfb59391340ad729d91d326", size = 437089, upload-time = "2026-03-18T19:04:50.381Z" }, + { url = "https://files.pythonhosted.org/packages/5c/01/a3c3ed5cd186f39e7880f8303cc51385a198a81469d53d0fdecf1f64d929/protobuf-6.33.6-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:9720e6961b251bde64edfdab7d500725a2af5280f3f4c87e57c0208376aa8c3a", size = 427737, upload-time = "2026-03-18T19:04:51.866Z" }, + { url = "https://files.pythonhosted.org/packages/ee/90/b3c01fdec7d2f627b3a6884243ba328c1217ed2d978def5c12dc50d328a3/protobuf-6.33.6-cp39-abi3-manylinux2014_aarch64.whl", hash = "sha256:e2afbae9b8e1825e3529f88d514754e094278bb95eadc0e199751cdd9a2e82a2", size = 324610, upload-time = "2026-03-18T19:04:53.096Z" }, + { url = "https://files.pythonhosted.org/packages/9b/ca/25afc144934014700c52e05103c2421997482d561f3101ff352e1292fb81/protobuf-6.33.6-cp39-abi3-manylinux2014_s390x.whl", hash = "sha256:c96c37eec15086b79762ed265d59ab204dabc53056e3443e702d2681f4b39ce3", size = 339381, upload-time = "2026-03-18T19:04:54.616Z" }, + { url = "https://files.pythonhosted.org/packages/16/92/d1e32e3e0d894fe00b15ce28ad4944ab692713f2e7f0a99787405e43533a/protobuf-6.33.6-cp39-abi3-manylinux2014_x86_64.whl", hash = "sha256:e9db7e292e0ab79dd108d7f1a94fe31601ce1ee3f7b79e0692043423020b0593", size = 323436, upload-time = "2026-03-18T19:04:55.768Z" }, + { url = "https://files.pythonhosted.org/packages/c4/72/02445137af02769918a93807b2b7890047c32bfb9f90371cbc12688819eb/protobuf-6.33.6-py3-none-any.whl", hash = "sha256:77179e006c476e69bf8e8ce866640091ec42e1beb80b213c3900006ecfba6901", size = 170656, upload-time = "2026-03-18T19:04:59.826Z" }, +] + +[[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/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 = "psycopg2-binary" +version = "2.9.12" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/2a/60/a3624f79acea344c16fbef3a94d28b89a8042ddfb8f3e4ca83f538671409/psycopg2_binary-2.9.12.tar.gz", hash = "sha256:5ac9444edc768c02a6b6a591f070b8aae28ff3a99be57560ac996001580f294c", size = 379686, upload-time = "2026-04-21T09:40:34.304Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/80/49bacf9e51617d8309f6f0123e29edc793f6f5f6700c7d1f1b20782fbb37/psycopg2_binary-2.9.12-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9b818ceff717f98851a64bffd4c5eb5b3059ae280276dcecc52ac658dcf006a4", size = 3712314, upload-time = "2026-04-20T23:33:31.363Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f2/98eeac7d60c43df9338287834edf9b3e69be68a2db78a57b1b81d705e735/psycopg2_binary-2.9.12-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:d2fa0d7caca8635c56e373055094eeda3208d901d55dd0ff5abc1d4e47f82b56", size = 3822389, upload-time = "2026-04-20T23:33:34.178Z" }, + { url = "https://files.pythonhosted.org/packages/9f/7c/30575e75f14d5351a56a1971bb43fe7f8bf7edf1b654fb1bec65c42a8812/psycopg2_binary-2.9.12-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:864c261b3690e1207d14bbfe0a61e27567981b80c47a778561e49f676f7ce433", size = 4578448, upload-time = "2026-04-20T23:33:37.073Z" }, + { url = "https://files.pythonhosted.org/packages/65/9b/4df366d89f28c527dc39d0b6c98a5ca74e30d37ac097b73f3352147568ae/psycopg2_binary-2.9.12-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:c5ee5213445dd45312459029b8c4c0a695461eb517b753d2582315bd07995f5e", size = 4273705, upload-time = "2026-04-20T23:33:39.291Z" }, + { url = "https://files.pythonhosted.org/packages/4e/8a/c566803818eb03161ba869b6ba612bf7ad56816d98b9e5121e0a22ad6b0b/psycopg2_binary-2.9.12-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6f9cae1f848779b5b01f417e762c40d026ea93eb0648249a604728cda991dde3", size = 5893784, upload-time = "2026-04-20T23:33:41.658Z" }, + { url = "https://files.pythonhosted.org/packages/63/fe/0dfa5797e0b229e0567bc378695224caf14d547f73b05be0c80549089772/psycopg2_binary-2.9.12-cp310-cp310-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:63a3ebbd543d3d1eda088ac99164e8c5bac15293ee91f20281fd17d050aee1c4", size = 4109306, upload-time = "2026-04-20T23:33:43.953Z" }, + { url = "https://files.pythonhosted.org/packages/3c/89/28063adf17a4ba501eedd9890feab0c649ee4d8bd0a97df0ff1e9584feab/psycopg2_binary-2.9.12-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:d6fcbba8c9fed08a73b8ac61ea79e4821e45b1e92bb466230c5e746bbf3d5256", size = 3654400, upload-time = "2026-04-20T23:33:46.115Z" }, + { url = "https://files.pythonhosted.org/packages/84/94/5a01de0aa4ead0b8d8d1aa4ec18cec0bd36d03fa714eaa5bb8a0b1b50020/psycopg2_binary-2.9.12-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:36512911ebb2b60a0c3e44d0bb5048c1980aced91235d133b7874f3d1d93487c", size = 3299215, upload-time = "2026-04-20T23:33:48.202Z" }, + { url = "https://files.pythonhosted.org/packages/7a/85/723bb085a61c6ac2dc0a0043f375f2fe7365363e27b073bad56ca5bda979/psycopg2_binary-2.9.12-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:8ffdb59fe88f99589e34354a130217aa1fd2d615612402d6edc8b3dbc7a44463", size = 3047724, upload-time = "2026-04-20T23:33:50.74Z" }, + { url = "https://files.pythonhosted.org/packages/b4/67/4d8b1e0d2fc4166677380eac0edf9cdff91013aca2546e8ef7bc04b56158/psycopg2_binary-2.9.12-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:a46fe069b65255df410f856d842bc235f90e22ffdf532dda625fd4213d3fd9b1", size = 3349183, upload-time = "2026-04-20T23:33:59.635Z" }, + { url = "https://files.pythonhosted.org/packages/73/99/21af7a5498637ea4dc91a17c281a53bc1d632fbafe00f6689fbfb32a9fed/psycopg2_binary-2.9.12-cp310-cp310-win_amd64.whl", hash = "sha256:ab29414b25dcb698bf26bf213e3348abdcd07bbd5de032a5bec15bd75b298b03", size = 2757036, upload-time = "2026-04-20T23:34:01.606Z" }, + { url = "https://files.pythonhosted.org/packages/d5/19/d4ce60954f3bb9d8e3bc5e5c4d1f2487de2d3851bf2391d54954c9df12a6/psycopg2_binary-2.9.12-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:5c8ce6c61bd1b1f6b9c24ee32211599f6166af2c55abb19456090a21fd16554b", size = 3712338, upload-time = "2026-04-20T23:34:03.961Z" }, + { url = "https://files.pythonhosted.org/packages/53/71/c85409ee0d78890f0660eff262e815e7dd2bb741a17611d82e9e8cd9dc5e/psycopg2_binary-2.9.12-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:b4a9eaa6e7f4ff91bec10aa3fb296878e75187bced5cc4bafe17dc40915e1326", size = 3822407, upload-time = "2026-04-20T23:34:05.977Z" }, + { url = "https://files.pythonhosted.org/packages/3c/ed/60486c2c7f0d4d1ede2bfb1ed27e2498477ce646bc7f6b2759906303117e/psycopg2_binary-2.9.12-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:c6528cefc8e50fcc6f4a107e27a672058b36cc5736d665476aeb413ba88dbb06", size = 4578425, upload-time = "2026-04-20T23:34:08.246Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b9/656cb03fad9f4f49f2145c334b1126ee75189929ca4e6187d485a2d59951/psycopg2_binary-2.9.12-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e4e184b1fb6072bf05388aa41c697e1b2d01b3473f107e7ec44f186a32cfd0b8", size = 4273709, upload-time = "2026-04-20T23:34:10.974Z" }, + { url = "https://files.pythonhosted.org/packages/99/66/08cf0da0e25cc6fb142c89be45fc8418792858f0c4cbff5e24530ff02cd6/psycopg2_binary-2.9.12-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4766ab678563054d3f1d064a4db19cc4b5f9e3a8d9018592a8285cf200c248f3", size = 5893779, upload-time = "2026-04-20T23:34:13.905Z" }, + { url = "https://files.pythonhosted.org/packages/17/d7/eecd9ce8e146d3721115d82d3836efdbb712187e4590325df549989d18f4/psycopg2_binary-2.9.12-cp311-cp311-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:5a0253224780c978746cb9be55a946bcdaf40fe3519c0f622924cdabdafe2c39", size = 4109308, upload-time = "2026-04-20T23:34:16.761Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2e/b1dc289b362cc8d45697b57eefbd673186f49a4ea0906928988e3affcc98/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0dc9228d47c46bda253d2ecd6bb93b56a9f2d7ad33b684a1fa3622bf74ffe30c", size = 3654405, upload-time = "2026-04-20T23:34:19.303Z" }, + { url = "https://files.pythonhosted.org/packages/eb/e4/4c4aea6473214dbdbd0fbba11aa4691e76dc01722c55724c5951719865ff/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:f921f3cd87035ef7df233383011d7a53ea1d346224752c1385f1edfd790ceb6a", size = 3299187, upload-time = "2026-04-20T23:34:21.206Z" }, + { url = "https://files.pythonhosted.org/packages/ba/5d/b03b99986446a4f57b170ed9a2579fb7ff9783ca0fa5226b19db99737fee/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:3d999bd982a723113c1a45b55a7a6a90d64d0ed2278020ed625c490ff7bef96c", size = 3047716, upload-time = "2026-04-20T23:34:23.077Z" }, + { url = "https://files.pythonhosted.org/packages/14/86/382ee4afbd1d97500c9d2862b20c2fdeddf4b7335e984df3fb4309f64108/psycopg2_binary-2.9.12-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:29d4d134bd0ab46ffb04e94aa3c5fa3ef582e9026609165e2f758ff76fc3a3be", size = 3349237, upload-time = "2026-04-20T23:34:25.211Z" }, + { url = "https://files.pythonhosted.org/packages/a8/16/9a57c75ba1eda7165c017342f526810d5f5a12647dde749c99ae9a7141d7/psycopg2_binary-2.9.12-cp311-cp311-win_amd64.whl", hash = "sha256:cb4a1dacdd48077150dc762a9e5ddbf32c256d66cb46f80839391aa458774936", size = 2757036, upload-time = "2026-04-20T23:34:27.77Z" }, + { url = "https://files.pythonhosted.org/packages/e2/9f/ef4ef3c8e15083df90ca35265cfd1a081a2f0cc07bb229c6314c6af817f4/psycopg2_binary-2.9.12-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:5cdc05117180c5fa9c40eea8ea559ce64d73824c39d928b7da9fb5f6a9392433", size = 3712459, upload-time = "2026-04-20T23:34:30.549Z" }, + { url = "https://files.pythonhosted.org/packages/b5/01/3dd14e46ba48c1e1a6ec58ee599fa1b5efa00c246d5046cd903d0eeb1af1/psycopg2_binary-2.9.12-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:d3227a3bc228c10d21011a99245edca923e4e8bf461857e869a507d9a41fe9f6", size = 3822936, upload-time = "2026-04-20T23:34:32.77Z" }, + { url = "https://files.pythonhosted.org/packages/a6/f7/0640e4901119d8a9f7a1784b927f494e2198e213ceb593753d1f2c8b1b30/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.whl", hash = "sha256:995ce929eede89db6254b50827e2b7fd61e50d11f0b116b29fffe4a2e53c4580", size = 4578676, upload-time = "2026-04-20T23:34:35.18Z" }, + { url = "https://files.pythonhosted.org/packages/b0/55/44df3965b5f297c50cc0b1b594a31c67d6127a9d133045b8a66611b14dfb/psycopg2_binary-2.9.12-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:9fe06d93e72f1c048e731a2e3e7854a5bfaa58fc736068df90b352cefe66f03f", size = 4274917, upload-time = "2026-04-20T23:34:37.982Z" }, + { url = "https://files.pythonhosted.org/packages/b0/4b/74535248b1eac0c9336862e8617c765ac94dac76f9e25d7c4a79588c8907/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:40e7b28b63aaf737cb3a1edc3a9bbc9a9f4ad3dcb7152e8c1130e4050eddcb7d", size = 5894843, upload-time = "2026-04-20T23:34:40.856Z" }, + { url = "https://files.pythonhosted.org/packages/f2/ba/f1bf8d2ae71868ad800b661099086ee52bc0f8d9f05be1acd8ebb06757cc/psycopg2_binary-2.9.12-cp312-cp312-manylinux_2_38_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:89d19a9f7899e8eb0656a2b3a08e0da04c720a06db6e0033eab5928aabe60fa9", size = 4110556, upload-time = "2026-04-20T23:34:44.016Z" }, + { url = "https://files.pythonhosted.org/packages/45/46/c15706c338403b7c420bcc0c2905aad116cc064545686d8bf85f1999ea00/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:612b965daee295ae2da8f8218ce1d274645dc76ef3f1abf6a0a94fd57eff876d", size = 3655714, upload-time = "2026-04-20T23:34:46.233Z" }, + { url = "https://files.pythonhosted.org/packages/b3/7c/a2d5dc09b64a4564db242a0fe418fde7d33f6f8259dd2c5b9d7def00fb5a/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:b9a339b79d37c1b45f3235265f07cdeb0cb5ad7acd2ac7720a5920989c17c24e", size = 3301154, upload-time = "2026-04-20T23:34:49.528Z" }, + { url = "https://files.pythonhosted.org/packages/c0/e8/cc8c9a4ce71461f9ec548d38cadc41dc184b34c73e6455450775a9334ccd/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:3471336e1acfd9c7fe507b8bad5af9317b6a89294f9eb37bd9a030bb7bebcdc6", size = 3048882, upload-time = "2026-04-20T23:34:51.86Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/31e2296bc0787c5ab75d3d118e40b239db8151b5192b90b77c72bc9256e9/psycopg2_binary-2.9.12-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7af18183109e23502c8b2ae7f6926c0882766f35b5175a4cd737ad825e4d7a1b", size = 3351298, upload-time = "2026-04-20T23:34:54.124Z" }, + { url = "https://files.pythonhosted.org/packages/5f/a8/75f4e3e11203b590150abed2cf7794b9c9c9f7eceddae955191138b44dde/psycopg2_binary-2.9.12-cp312-cp312-win_amd64.whl", hash = "sha256:398fcd4db988c7d7d3713e2b8e18939776fd3fb447052daae4f24fa39daede4c", size = 2757230, upload-time = "2026-04-20T23:34:56.242Z" }, +] + +[[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 = "py-spy" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/93/d8/5b71371f50cf153b1307e5a11ac8a4ce4d85651dae946bd7e9a064146545/py_spy-0.4.2.tar.gz", hash = "sha256:90e600b27bb6bb40479637baca5a5b4bc2ba3395c93d889e672315d93042c4ae", size = 286374, upload-time = "2026-04-24T22:08:54.906Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ef/21/ec030145a0c7992bd4b9eafb2f06f56358b3a5339eab4a16534baf3c69aa/py_spy-0.4.2-py2.py3-none-macosx_10_12_x86_64.macosx_11_0_arm64.macosx_10_12_universal2.whl", hash = "sha256:1ccf688393105111684435f035bc14ec3f22117dd2b85b2414612cf27a22755a", size = 3743992, upload-time = "2026-04-24T22:08:45.438Z" }, + { url = "https://files.pythonhosted.org/packages/50/80/de5fd27243c2be03692ecd317bf0dbe24b4c6f78f689ce111e7277a7cb09/py_spy-0.4.2-py2.py3-none-macosx_11_0_arm64.whl", hash = "sha256:a0e6f6810ccf0fc5e64e85e0182a5b626c4496eec01b14fb8755154b363a4831", size = 1859057, upload-time = "2026-04-24T22:08:46.946Z" }, + { url = "https://files.pythonhosted.org/packages/89/23/3eb4c23c684ebd667674ce1d076ae855e0621d1d9bd5e052aa3f7982f757/py_spy-0.4.2-py2.py3-none-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:142887e984a4e541071c99a4401ff8c3770f255d329dbd0f64e8c1dd51882cce", size = 2828136, upload-time = "2026-04-24T22:08:48.519Z" }, + { url = "https://files.pythonhosted.org/packages/ca/01/6314152cf9ad3310ebacbf2c47b5ed858086530f8e12b1a665725ca5e0f4/py_spy-0.4.2-py2.py3-none-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f1c6d9b0e2379ead5bf792df43f4cf36153aa79e6dda4fb8ac7740cf8017110", size = 2857707, upload-time = "2026-04-24T22:08:49.677Z" }, + { url = "https://files.pythonhosted.org/packages/cc/1f/0960a129d504728d28a51dbd5a04ce94031eb75bac676341da7aefdd8232/py_spy-0.4.2-py2.py3-none-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:24720573f95230653b457671a1dcc3c5a381fcf4e92677761e328a430ad251b2", size = 2301852, upload-time = "2026-04-24T22:08:51.152Z" }, + { url = "https://files.pythonhosted.org/packages/f9/34/dd7d3c763a00b7b965e25a5eab0acd1a345dbaf0f45fffe595278873a1c0/py_spy-0.4.2-py2.py3-none-manylinux_2_5_x86_64.manylinux1_x86_64.whl", hash = "sha256:aeb0323409199c785f730645e9f4bb7a7b9ca2c481f2c331a55642b5d13fa52f", size = 2936518, upload-time = "2026-04-24T22:08:52.264Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ed/1409cdb557e558a6c98003ab12fdd4284699e158c167c187cb0f124eea4c/py_spy-0.4.2-py2.py3-none-win_amd64.whl", hash = "sha256:8b06a353c177677e4e1701b288d8c58e2f8d4208ee81a8048d9f72ba800918f8", size = 1894002, upload-time = "2026-04-24T22:08:53.811Z" }, +] + +[[package]] +name = "py7zr" +version = "1.1.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "backports-zstd" }, + { name = "brotli", marker = "platform_python_implementation == 'CPython'" }, + { name = "brotlicffi", marker = "platform_python_implementation == 'PyPy'" }, + { name = "inflate64" }, + { name = "multivolumefile" }, + { name = "psutil", marker = "sys_platform != 'cygwin'" }, + { name = "pybcj" }, + { name = "pycryptodomex" }, + { name = "pyppmd" }, + { name = "texttable" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/59/3f/ac248f25f3901d3d6cf80ac99d5bac6fd1e5e6543c1812c79b02b6074c60/py7zr-1.1.3.tar.gz", hash = "sha256:8d51894abb38355bf14881088bb97f01fe4cb5b14ebe22f66d6297668c7e1a74", size = 71695, upload-time = "2026-06-19T09:28:29.339Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/88/40/dc7f804abd0ea167ea8d4d9b3f5455321aaf671d040fcef647e9e952e714/py7zr-1.1.3-py3-none-any.whl", hash = "sha256:17934a35089e026dec6c72ee275d9b841e646881ef822d618e805c3006661d9a", size = 72242, upload-time = "2026-06-19T09:28:27.512Z" }, +] + +[[package]] +name = "pyasn1" +version = "0.6.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/5c/5f/6583902b6f79b399c9c40674ac384fd9cd77805f9e6205075f828ef11fb2/pyasn1-0.6.3.tar.gz", hash = "sha256:697a8ecd6d98891189184ca1fa05d1bb00e2f84b5977c481452050549c8a72cf", size = 148685, upload-time = "2026-03-17T01:06:53.382Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/a0/7d793dce3fa811fe047d6ae2431c672364b462850c6235ae306c0efd025f/pyasn1-0.6.3-py3-none-any.whl", hash = "sha256:a80184d120f0864a52a073acc6fc642847d0be408e7c7252f31390c0f4eadcde", size = 83997, upload-time = "2026-03-17T01:06:52.036Z" }, +] + +[[package]] +name = "pyasn1-modules" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pyasn1" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/e9/e6/78ebbb10a8c8e4b61a59249394a4a594c1a7af95593dc933a349c8d00964/pyasn1_modules-0.4.2.tar.gz", hash = "sha256:677091de870a80aae844b1ca6134f54652fa2c8c5a52aa396440ac3106e941e6", size = 307892, upload-time = "2025-03-28T02:41:22.17Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/47/8d/d529b5d697919ba8c11ad626e835d4039be708a35b0d22de83a269a6682c/pyasn1_modules-0.4.2-py3-none-any.whl", hash = "sha256:29253a9207ce32b64c3ac6600edc75368f98473906e8fd1043bd6b5b1de2c14a", size = 181259, upload-time = "2025-03-28T02:41:19.028Z" }, +] + +[[package]] +name = "pybcj" +version = "1.0.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/12/0c/2670b672655b18454841b8e88f024b9159d637a4c07f6ce6db85accf8467/pybcj-1.0.7.tar.gz", hash = "sha256:72d64574069ffb0a800020668376b7ebd7adea159adbf4d35f8effc62f0daa67", size = 31282, upload-time = "2025-11-29T00:53:29.738Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a2/8b/8dad8e96268349363184a77ca7a0f9ab3941d0e84e41d75fd4be8ac25494/pybcj-1.0.7-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:618ec7345775c306d83527750e2d0ab3f42ffdc5ad6282f62f88cb53c9b2b679", size = 31780, upload-time = "2025-11-29T00:52:22.317Z" }, + { url = "https://files.pythonhosted.org/packages/98/14/dc0cc7b4f876c733519956a764a64b4fa46b0da353a578f5eacdc5a24897/pybcj-1.0.7-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d7e7faa1b0f7d894685e4567dd41268b93df89cff347ebfdfdc48b4bc0d68cb2", size = 23690, upload-time = "2025-11-29T00:52:24.356Z" }, + { url = "https://files.pythonhosted.org/packages/e8/bf/102510783410dde5aadbc4caa98a1d45dba2c9c304ff02320c0297456a6a/pybcj-1.0.7-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:3cd4b2d05272df605d5bdb54b3386985a2b074b4d97072da944736abd639fdee", size = 24072, upload-time = "2025-11-29T00:52:25.419Z" }, + { url = "https://files.pythonhosted.org/packages/24/da/1fe5aa16188260408e21e850268a758863cf9683049f29b03336e46585dc/pybcj-1.0.7-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8eb5cd6f52df8857a8d9de594ca28a71683169b9de5af7e727c0e510aedb4550", size = 50614, upload-time = "2025-11-29T00:52:26.748Z" }, + { url = "https://files.pythonhosted.org/packages/8d/6e/5bfc159a996a8c009cc3ac2dbb1d2603f3afefbf03f674ec7f784448fb57/pybcj-1.0.7-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d9d10760356b7d254b7b04ff38e052d5229c5f5a69a5514c9c31cb1dbb7d7f82", size = 49451, upload-time = "2025-11-29T00:52:28.189Z" }, + { url = "https://files.pythonhosted.org/packages/89/85/050a9dd0aaacce88fb223a9842fb8f58674e0f485c3ccf65aa08bfef07ff/pybcj-1.0.7-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1696d9b50971e317f72802bebd18f9b53684892ad3c43e0258f34e0a01738484", size = 49738, upload-time = "2025-11-29T00:52:29.298Z" }, + { url = "https://files.pythonhosted.org/packages/73/c9/c6b06dd5845ca1c00e7b2ea2ba5bddfd660a0c7fcf7168b67af1b9d2ba76/pybcj-1.0.7-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:4e3d91b5dfdb0a200545b68145d81dae4edd2c385d89643dc45d6d01291f5c04", size = 49112, upload-time = "2025-11-29T00:52:30.787Z" }, + { url = "https://files.pythonhosted.org/packages/32/80/bd8c01fe6804319a19bcdacf0c725b898508696705b0e17cdaf1abee59f3/pybcj-1.0.7-cp310-cp310-win_amd64.whl", hash = "sha256:74df8f4c897f937105e8cd830df3b4ddf65ab5b5ba3e63cd6e3aeb3f4ecb0864", size = 24900, upload-time = "2025-11-29T00:52:32.174Z" }, + { url = "https://files.pythonhosted.org/packages/95/b9/5d70116ea216474077fe6e9c8b326a576d367bcb3c1ec03255ccab33a600/pybcj-1.0.7-cp310-cp310-win_arm64.whl", hash = "sha256:dc121ecb26fdc1a4173a20b3c7cca5d8cc81494b485d4b44a62ed8448f8c796e", size = 23396, upload-time = "2025-11-29T00:52:33.216Z" }, + { url = "https://files.pythonhosted.org/packages/9e/c7/93567f1a9624b41e7755978243f7abbf198e153242ff7737862376edf468/pybcj-1.0.7-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:906ee707e89302253813a123f90a36d94d1f3c8785a4a1b853b31ac67296857a", size = 31780, upload-time = "2025-11-29T00:52:34.233Z" }, + { url = "https://files.pythonhosted.org/packages/cb/f6/c96a25b4ded3eabe58b07e05528cca0c0ff5b5142a67dc117979d43ae2c2/pybcj-1.0.7-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:93da8503161fd51e01843aca031444fd46dce83e8a8bb4972f0256d6b3d280d3", size = 23696, upload-time = "2025-11-29T00:52:35.99Z" }, + { url = "https://files.pythonhosted.org/packages/5e/90/893d290def15f687c35806ffb2fd45c3f34b07c61bd0348220cb602c8c38/pybcj-1.0.7-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:bcb4a52cd573f4359a89fd3a4a1d82c914f8b758a5c9f16cd5dd13fb8aa24436", size = 24067, upload-time = "2025-11-29T00:52:37.013Z" }, + { url = "https://files.pythonhosted.org/packages/1f/51/19a45c2cb92c722a214b8cfd9a39d1e144b5d1f76c7d92c128b479f4e405/pybcj-1.0.7-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a6d9a26fa9e627eb2fbba0f5b376ab42246bebdaf38cf437e384a6b7e3d78e23", size = 51675, upload-time = "2025-11-29T00:52:38.18Z" }, + { url = "https://files.pythonhosted.org/packages/55/fc/3c9e2323b97bbbe295d4b0bb1eb24f0ddb81e2fe67181b9668ab502ccefe/pybcj-1.0.7-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:47207b69997fdc39e91a66812477506267964284b7d45fed68876dd74323d44f", size = 50539, upload-time = "2025-11-29T00:52:39.469Z" }, + { url = "https://files.pythonhosted.org/packages/f6/87/625dbdbb575cbee728b736bffc8f14bb0a8ee6cc23874d5cb598c28a67a5/pybcj-1.0.7-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:b33d6ef1de94720f4856e198bd2b8eca978015ed685aef4138755ba3910eb963", size = 49720, upload-time = "2025-11-29T00:52:40.822Z" }, + { url = "https://files.pythonhosted.org/packages/de/64/61dab2d5078ce5a36402fee31ba9ee637755b1700aeec3c4fe39ebb11c39/pybcj-1.0.7-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:053c7cda499a8934151d0c915b6efce8e53fa6b47d162434a5b24afef7af5d17", size = 49213, upload-time = "2025-11-29T00:52:41.951Z" }, + { url = "https://files.pythonhosted.org/packages/9c/19/4b756dc90d51492c1c13439b3de5da00137bd068001d4d6293e20686ff60/pybcj-1.0.7-cp311-cp311-win_amd64.whl", hash = "sha256:555e90270d665d94cd34d2e50b096f68dba6baf7035ae11ac65c2bc126f8cef7", size = 24900, upload-time = "2025-11-29T00:52:43.484Z" }, + { url = "https://files.pythonhosted.org/packages/e9/50/426be36573eeeab9e771aa41ab9824edbb285bc5035c226ba766deec0ef9/pybcj-1.0.7-cp311-cp311-win_arm64.whl", hash = "sha256:22bdb390da9a4e38b2191070a62b88ad52edc3f6e12fe7eea278217ccfdbc02c", size = 23394, upload-time = "2025-11-29T00:52:44.528Z" }, + { url = "https://files.pythonhosted.org/packages/f5/60/39b51114e3e740b61844448c3b61be146781a5c0ffabcd473a17ba7f4336/pybcj-1.0.7-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:d39787b85678d2ab1c67e2f21dd2e71be851f08e5c9fe619c605877b57dd529d", size = 31858, upload-time = "2025-11-29T00:52:45.566Z" }, + { url = "https://files.pythonhosted.org/packages/ee/15/df4cd94bdf6a73c2b6ecf5e99dd9dcfe654215992a0114860ff1c94752b5/pybcj-1.0.7-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8cd5dd166093a1fb146fb78859aac0f00b45db6c11074705517bc72a940a1c8e", size = 23746, upload-time = "2025-11-29T00:52:46.947Z" }, + { url = "https://files.pythonhosted.org/packages/15/1a/f8bbe5f9ad95a0c2d1853006a93021aa1c2851b25a6bccc0894b1d72c0f4/pybcj-1.0.7-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:82152e8641f5ce68638f3504227065f27b6b1efe96479ffbf20d81530c220062", size = 24088, upload-time = "2025-11-29T00:52:47.962Z" }, + { url = "https://files.pythonhosted.org/packages/e9/23/53675b56f9dbcb7a4dd681af8c05b1abf95fea3cdf7bf64872b9e0fdc8c8/pybcj-1.0.7-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:2095b45d05f8d19430167b7df52ebd920df854ab8d064bae879df0a4611374b3", size = 52407, upload-time = "2025-11-29T00:52:49.527Z" }, + { url = "https://files.pythonhosted.org/packages/a1/56/3008e748c7d35c407db97b77af52ade07756033250d0e208a6af231131ca/pybcj-1.0.7-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:20b400c9f48faed01edb7f0df54b4354270325c886e785f31c866c581a46023b", size = 51462, upload-time = "2025-11-29T00:52:51.016Z" }, + { url = "https://files.pythonhosted.org/packages/83/f4/8e8b079af7ac6a51b2edcb8bed6040a9748542cb1daf55387f769f9571d0/pybcj-1.0.7-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8210e51a2d4e5ccb4fdb75a1e692dd8c121858b589026bb28988ed7ffdb7ed00", size = 50320, upload-time = "2025-11-29T00:52:52.835Z" }, + { url = "https://files.pythonhosted.org/packages/e1/84/c2277eeb083029313f5822a491c39d7af91ebd1e717f42c772d56b8c3c4e/pybcj-1.0.7-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:c6c3fe420083186ae2e5f75c23aa6563dcb030b8fc188d00778ce374d1df1984", size = 49987, upload-time = "2025-11-29T00:52:53.904Z" }, + { url = "https://files.pythonhosted.org/packages/a0/52/711a94d5ae634ff3dd51324a40885158f819ba660b4601653bd78bbd33cd/pybcj-1.0.7-cp312-cp312-win_amd64.whl", hash = "sha256:c435062d66364f85674a639541980000e37657b98367a2ce2699514e44b8ab05", size = 24940, upload-time = "2025-11-29T00:52:54.973Z" }, + { url = "https://files.pythonhosted.org/packages/5e/d4/02e3ca25deca3359e63b70e5804bdbae9f400d03f93d0c66341e0471bb39/pybcj-1.0.7-cp312-cp312-win_arm64.whl", hash = "sha256:3f74fd70b08092e58b1ee13c67fbf9de63d73eb1c61ab06670a0d7161efeb252", size = 23410, upload-time = "2025-11-29T00:52:55.944Z" }, +] + +[[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 = "pycryptodomex" +version = "3.23.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c9/85/e24bf90972a30b0fcd16c73009add1d7d7cd9140c2498a68252028899e41/pycryptodomex-3.23.0.tar.gz", hash = "sha256:71909758f010c82bc99b0abf4ea12012c98962fbf0583c2164f8b84533c2e4da", size = 4922157, upload-time = "2025-05-17T17:23:41.434Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dd/9c/1a8f35daa39784ed8adf93a694e7e5dc15c23c741bbda06e1d45f8979e9e/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_universal2.whl", hash = "sha256:06698f957fe1ab229a99ba2defeeae1c09af185baa909a31a5d1f9d42b1aaed6", size = 2499240, upload-time = "2025-05-17T17:22:46.953Z" }, + { url = "https://files.pythonhosted.org/packages/7a/62/f5221a191a97157d240cf6643747558759126c76ee92f29a3f4aee3197a5/pycryptodomex-3.23.0-cp37-abi3-macosx_10_9_x86_64.whl", hash = "sha256:b2c2537863eccef2d41061e82a881dcabb04944c5c06c5aa7110b577cc487545", size = 1644042, upload-time = "2025-05-17T17:22:49.098Z" }, + { url = "https://files.pythonhosted.org/packages/8c/fd/5a054543c8988d4ed7b612721d7e78a4b9bf36bc3c5ad45ef45c22d0060e/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:43c446e2ba8df8889e0e16f02211c25b4934898384c1ec1ec04d7889c0333587", size = 2186227, upload-time = "2025-05-17T17:22:51.139Z" }, + { url = "https://files.pythonhosted.org/packages/c8/a9/8862616a85cf450d2822dbd4fff1fcaba90877907a6ff5bc2672cafe42f8/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f489c4765093fb60e2edafdf223397bc716491b2b69fe74367b70d6999257a5c", size = 2272578, upload-time = "2025-05-17T17:22:53.676Z" }, + { url = "https://files.pythonhosted.org/packages/46/9f/bda9c49a7c1842820de674ab36c79f4fbeeee03f8ff0e4f3546c3889076b/pycryptodomex-3.23.0-cp37-abi3-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bdc69d0d3d989a1029df0eed67cc5e8e5d968f3724f4519bd03e0ec68df7543c", size = 2312166, upload-time = "2025-05-17T17:22:56.585Z" }, + { url = "https://files.pythonhosted.org/packages/03/cc/870b9bf8ca92866ca0186534801cf8d20554ad2a76ca959538041b7a7cf4/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:6bbcb1dd0f646484939e142462d9e532482bc74475cecf9c4903d4e1cd21f003", size = 2185467, upload-time = "2025-05-17T17:22:59.237Z" }, + { url = "https://files.pythonhosted.org/packages/96/e3/ce9348236d8e669fea5dd82a90e86be48b9c341210f44e25443162aba187/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_i686.whl", hash = "sha256:8a4fcd42ccb04c31268d1efeecfccfd1249612b4de6374205376b8f280321744", size = 2346104, upload-time = "2025-05-17T17:23:02.112Z" }, + { url = "https://files.pythonhosted.org/packages/a5/e9/e869bcee87beb89040263c416a8a50204f7f7a83ac11897646c9e71e0daf/pycryptodomex-3.23.0-cp37-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:55ccbe27f049743a4caf4f4221b166560d3438d0b1e5ab929e07ae1702a4d6fd", size = 2271038, upload-time = "2025-05-17T17:23:04.872Z" }, + { url = "https://files.pythonhosted.org/packages/8d/67/09ee8500dd22614af5fbaa51a4aee6e342b5fa8aecf0a6cb9cbf52fa6d45/pycryptodomex-3.23.0-cp37-abi3-win32.whl", hash = "sha256:189afbc87f0b9f158386bf051f720e20fa6145975f1e76369303d0f31d1a8d7c", size = 1771969, upload-time = "2025-05-17T17:23:07.115Z" }, + { url = "https://files.pythonhosted.org/packages/69/96/11f36f71a865dd6df03716d33bd07a67e9d20f6b8d39820470b766af323c/pycryptodomex-3.23.0-cp37-abi3-win_amd64.whl", hash = "sha256:52e5ca58c3a0b0bd5e100a9fbc8015059b05cffc6c66ce9d98b4b45e023443b9", size = 1803124, upload-time = "2025-05-17T17:23:09.267Z" }, + { url = "https://files.pythonhosted.org/packages/f9/93/45c1cdcbeb182ccd2e144c693eaa097763b08b38cded279f0053ed53c553/pycryptodomex-3.23.0-cp37-abi3-win_arm64.whl", hash = "sha256:02d87b80778c171445d67e23d1caef279bf4b25c3597050ccd2e13970b57fd51", size = 1707161, upload-time = "2025-05-17T17:23:11.414Z" }, + { url = "https://files.pythonhosted.org/packages/f3/b8/3e76d948c3c4ac71335bbe75dac53e154b40b0f8f1f022dfa295257a0c96/pycryptodomex-3.23.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:ebfff755c360d674306e5891c564a274a47953562b42fb74a5c25b8fc1fb1cb5", size = 1627695, upload-time = "2025-05-17T17:23:17.38Z" }, + { url = "https://files.pythonhosted.org/packages/6a/cf/80f4297a4820dfdfd1c88cf6c4666a200f204b3488103d027b5edd9176ec/pycryptodomex-3.23.0-pp310-pypy310_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:eca54f4bb349d45afc17e3011ed4264ef1cc9e266699874cdd1349c504e64798", size = 1675772, upload-time = "2025-05-17T17:23:19.202Z" }, + { url = "https://files.pythonhosted.org/packages/d1/42/1e969ee0ad19fe3134b0e1b856c39bd0b70d47a4d0e81c2a8b05727394c9/pycryptodomex-3.23.0-pp310-pypy310_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:4f2596e643d4365e14d0879dc5aafe6355616c61c2176009270f3048f6d9a61f", size = 1668083, upload-time = "2025-05-17T17:23:21.867Z" }, + { url = "https://files.pythonhosted.org/packages/6e/c3/1de4f7631fea8a992a44ba632aa40e0008764c0fb9bf2854b0acf78c2cf2/pycryptodomex-3.23.0-pp310-pypy310_pp73-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:fdfac7cda115bca3a5abb2f9e43bc2fb66c2b65ab074913643803ca7083a79ea", size = 1706056, upload-time = "2025-05-17T17:23:24.031Z" }, + { url = "https://files.pythonhosted.org/packages/f2/5f/af7da8e6f1e42b52f44a24d08b8e4c726207434e2593732d39e7af5e7256/pycryptodomex-3.23.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:14c37aaece158d0ace436f76a7bb19093db3b4deade9797abfc39ec6cd6cc2fe", size = 1806478, upload-time = "2025-05-17T17:23:26.066Z" }, +] + +[[package]] +name = "pydantic" +version = "2.13.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "annotated-types" }, + { name = "pydantic-core" }, + { name = "typing-extensions" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/18/a5/b60d21ac674192f8ab0ba4e9fd860690f9b4a6e51ca5df118733b487d8d6/pydantic-2.13.4.tar.gz", hash = "sha256:c40756b57adaa8b1efeeced5c196f3f3b7c435f90e84ea7f443901bec8099ef6", size = 844775, upload-time = "2026-05-06T13:43:05.343Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/fd/7b/122376b1fd3c62c1ed9dc80c931ace4844b3c55407b6fb2d199377c9736f/pydantic-2.13.4-py3-none-any.whl", hash = "sha256:45a282cde31d808236fd7ea9d919b128653c8b38b393d1c4ab335c62924d9aba", size = 472262, upload-time = "2026-05-06T13:43:02.641Z" }, +] + +[[package]] +name = "pydantic-core" +version = "2.46.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9d/56/921726b776ace8d8f5db44c4ef961006580d91dc52b803c489fafd1aa249/pydantic_core-2.46.4.tar.gz", hash = "sha256:62f875393d7f270851f20523dd2e29f082bcc82292d66db2b64ea71f64b6e1c1", size = 471464, upload-time = "2026-05-06T13:37:06.98Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e7/08/f1ba952f1c8ae5581c70fa9c6da89f247b83e3dd8c09c035d5d7931fc23d/pydantic_core-2.46.4-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:a396dcc17e5a0b164dbe026896245a4fa9ff402edca1dff0be3d53a517f74de4", size = 2113146, upload-time = "2026-05-06T13:37:36.537Z" }, + { url = "https://files.pythonhosted.org/packages/56/c6/65f646c7ff09bd257f660434adb45c4dfcbbcebcc030562fecf6f5bf887d/pydantic_core-2.46.4-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:da4b951fe36dc7c3a1ccb4e3cd1747c3542b8c9ceede8fc86cae054e764485f5", size = 1949769, upload-time = "2026-05-06T13:37:46.365Z" }, + { url = "https://files.pythonhosted.org/packages/64/ba/bfb1d928fd5b49e1258935ff104ae356e9fd89384a55bf9f847e9193ad40/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:bb63e0198ca18aad131c089b9204c23079c3afa95487e561f4c522d519e55aba", size = 1974958, upload-time = "2026-05-06T13:37:28.611Z" }, + { url = "https://files.pythonhosted.org/packages/4e/74/76223bfb117b64af743c9b6670d1364516f5c0604f96b48f3272f6af6cc6/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f47286a97f0bc9b8859519809077b91b2cefe4ae47fcbf5e466a009c1c5d742b", size = 2042118, upload-time = "2026-05-06T13:36:55.216Z" }, + { url = "https://files.pythonhosted.org/packages/cb/7b/848732968bc8f48f3187542f08358b9d842db564147b256669426ebb1652/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:905a0ed8ea6f2d61c1738835f99b699348d7857379083e5fc497fa0c967a407c", size = 2222876, upload-time = "2026-05-06T13:38:25.455Z" }, + { url = "https://files.pythonhosted.org/packages/b5/2f/e90b63ee2e14bd8d3db8f705a6d75d64e6ee1b7c2c8833747ce706e1e0ce/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:ea793e075b70290d89d8142074262885d3f7da19634845135751bd6344f73b50", size = 2286703, upload-time = "2026-05-06T13:37:53.304Z" }, + { url = "https://files.pythonhosted.org/packages/ba/1e/acc4d70f88a0a277e4a1fa77ebb985ceabaf900430f875bf9338e11c9420/pydantic_core-2.46.4-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:395aebd9183f9d112f569aeb5b2214d1a10a33bec8456447f7fbdfa51d38d4cd", size = 2092042, upload-time = "2026-05-06T13:38:46.981Z" }, + { url = "https://files.pythonhosted.org/packages/a9/da/0a422b57bf8504102bf3c4ccea9c41bab5a5cee6a54650acf8faf67f5a24/pydantic_core-2.46.4-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:b078afbc25f3a1436c7a1d2cd3e322497ee99615ba97c563566fdf46aff1ee01", size = 2117231, upload-time = "2026-05-06T13:39:23.146Z" }, + { url = "https://files.pythonhosted.org/packages/bd/2a/2ac13c3af305843e23c5078c53d135656b3f05a2fd78cb7bbbb12e97b473/pydantic_core-2.46.4-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f747929cf940cddb5b3668a390056ddd5ba2e5010615ea2dcf4f9c4f3ab8791d", size = 2168388, upload-time = "2026-05-06T13:40:08.06Z" }, + { url = "https://files.pythonhosted.org/packages/72/04/2beacf7e1607e93eefe4aed1b4709f079b905fb77530179d4f7c71745f22/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:daa27d92c36f24388fe3ad306b174781c747627f134452e4f128ea00ce1fe8c4", size = 2184769, upload-time = "2026-05-06T13:38:13.901Z" }, + { url = "https://files.pythonhosted.org/packages/9e/29/d2b9fd9f539133548eaf622c06a4ce176cb46ac59f32d0359c4abc0de047/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_armv7l.whl", hash = "sha256:19e51f073cd3df251856a8a4189fbdf1de4012c3ebacfb1884f94f1eb406079f", size = 2319312, upload-time = "2026-05-06T13:39:08.24Z" }, + { url = "https://files.pythonhosted.org/packages/7c/af/0f7a5b85fec6075bea96e3ef9187de38fccced0de92c1e7feda8d5cc7bb9/pydantic_core-2.46.4-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:c1747f85cee84c26985853c6f3d9bd3e75da5212912443fa111c113b9c246f39", size = 2361817, upload-time = "2026-05-06T13:38:43.2Z" }, + { url = "https://files.pythonhosted.org/packages/25/a4/73363fec545fd3ec025490bdda2743c56d0dd5b6266b1a53bbe9e4265375/pydantic_core-2.46.4-cp310-cp310-win32.whl", hash = "sha256:2f84c03c8607173d16b5a854ec68a2f9079ae03237a54fb506d13af47e1d018d", size = 1987085, upload-time = "2026-05-06T13:39:25.497Z" }, + { url = "https://files.pythonhosted.org/packages/01/aa/62f082da2c91fac1c234bc9ee0066257ce83f0604abd72e4c9d5991f2d84/pydantic_core-2.46.4-cp310-cp310-win_amd64.whl", hash = "sha256:8358a950c8909158e3df31538a7e4edc2d7265a7c54b47f0864d9e5bae9dcebf", size = 2074311, upload-time = "2026-05-06T13:39:59.922Z" }, + { url = "https://files.pythonhosted.org/packages/5c/fa/6d7708d2cfc1a832acb6aeb0cd16e801902df8a0f583bb3b4b527fde022e/pydantic_core-2.46.4-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:0e96592440881c74a213e5ad528e2b24d3d4f940de2766bed9010ab1d9e51594", size = 2111872, upload-time = "2026-05-06T13:40:27.596Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6f/aa064a3e74b5745afbdf250594f38e7ead05e2d651bcb35994b9417a0d4d/pydantic_core-2.46.4-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e0d65b8c354be7fb5f720c3caa8bc940bc2d20ce749c8e06135f07f8ed95dd7c", size = 1948255, upload-time = "2026-05-06T13:39:12.574Z" }, + { url = "https://files.pythonhosted.org/packages/43/3a/41114a9f7569b84b4d84e7a018c57c56347dac30c0d4a872946ec4e36c46/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:7bfb192b3f4b9e8a89b6277b6ce787564f62cfd272055f6e685726b111dc7826", size = 1972827, upload-time = "2026-05-06T13:38:19.841Z" }, + { url = "https://files.pythonhosted.org/packages/ef/25/1ab42e8048fe551934d9884e8d64daa7e990ad386f310a15981aeb6a5b08/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:9037063db01f09b09e237c282b6792bd4da634b5402c4e7f0c61effed7701a04", size = 2041051, upload-time = "2026-05-06T13:38:10.447Z" }, + { url = "https://files.pythonhosted.org/packages/94/c2/1a934597ddf08da410385b3b7aae91956a5a76c635effef456074fad7e88/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:fc010ab034c8c7452522748bf937df58020d256ccae0874463d1f4d01758af8e", size = 2221314, upload-time = "2026-05-06T13:40:13.089Z" }, + { url = "https://files.pythonhosted.org/packages/02/6d/9e8ad178c9c4df27ad3c8f25d1fe2a7ab0d2ba0559fad4aee5d3d1f16771/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8c5dac79fa1614d1e06ca695109c6105923bd9c7d1d6c918d4e637b7e6b32fd3", size = 2285146, upload-time = "2026-05-06T13:38:59.224Z" }, + { url = "https://files.pythonhosted.org/packages/80/50/540cd3aeefc041beb111125c4bff779831a2111fc6b15a9138cda277d32c/pydantic_core-2.46.4-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:f9fa868638bf362d3d138ea55829cefb3d5f4b0d7f142234382a15e2485dbec4", size = 2089685, upload-time = "2026-05-06T13:38:17.762Z" }, + { url = "https://files.pythonhosted.org/packages/6b/a4/b440ad35f05f6a38f89fa0f149accb3f0e02be94ca5e15f3c449a61b4bc9/pydantic_core-2.46.4-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:17299feefe090f2caa5b8e37222bb5f663e4935a8bfa6931d4102e5df1a9f398", size = 2115420, upload-time = "2026-05-06T13:37:58.195Z" }, + { url = "https://files.pythonhosted.org/packages/99/61/de4f55db8dfd57bfdfa9a12ec90fe1b57c4f41062f7ca86f08586b3e0ac0/pydantic_core-2.46.4-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:4c63ebc82684aa89d9a3bcbd13d515b3be44250dc68dd3bd81526c1cb31286c3", size = 2165122, upload-time = "2026-05-06T13:37:01.167Z" }, + { url = "https://files.pythonhosted.org/packages/f7/52/7c529d7bdb2d1068bd52f51fe32572c8301f9a4febf1948f10639f1436f5/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:aaa2a54443eff1950ba5ddc6b6ccda0d9c84a364276a62f969bdf2a390650848", size = 2182573, upload-time = "2026-05-06T13:38:45.04Z" }, + { url = "https://files.pythonhosted.org/packages/37/b3/7c40325848ba78247f2812dcf9c7274e38cd801820ca6dd9fe63bcfb0eb4/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_armv7l.whl", hash = "sha256:18e5ceec2ab67e6d5f1a9085e5a24c9c4e2ac4545730bfe668680bca05e555f3", size = 2317139, upload-time = "2026-05-06T13:37:15.539Z" }, + { url = "https://files.pythonhosted.org/packages/d9/37/f913f81a657c865b75da6c0dbed79876073c2a43b5bd9edbe8da785e4d49/pydantic_core-2.46.4-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:a0f62d0a58f4e7da165457e995725421e0064f2255d8eccebc49f41bbc23b109", size = 2360433, upload-time = "2026-05-06T13:37:30.099Z" }, + { url = "https://files.pythonhosted.org/packages/c4/67/6acaa1be2567f9256b056d8477158cac7240813956ce86e49deae8e173b4/pydantic_core-2.46.4-cp311-cp311-win32.whl", hash = "sha256:041bde0a48fd37cf71cab1c9d56d3e8625a3793fef1f7dd232b3ff37e978ecda", size = 1985513, upload-time = "2026-05-06T13:38:15.669Z" }, + { url = "https://files.pythonhosted.org/packages/aa/e6/c505f83dfeda9a2e5c995cfd872949e4d05e12f7feb3dca72f633daefa94/pydantic_core-2.46.4-cp311-cp311-win_amd64.whl", hash = "sha256:6f2eeda33a839975441c86a4119e1383c50b47faf0cbb5176985565c6bb02c33", size = 2071114, upload-time = "2026-05-06T13:40:35.416Z" }, + { url = "https://files.pythonhosted.org/packages/0f/da/7a263a96d965d9d0df5e8de8a475f33495451117035b09acb110288c381f/pydantic_core-2.46.4-cp311-cp311-win_arm64.whl", hash = "sha256:14f4c5d6db102bd796a627bbb3a17b4cf4574b9ae861d8b7c9a9661c6dd3362d", size = 2044298, upload-time = "2026-05-06T13:38:29.754Z" }, + { url = "https://files.pythonhosted.org/packages/ce/8c/af022f0af448d7747c5154288d46b5f2bc5f17366eaa0e23e9aa04d59f3b/pydantic_core-2.46.4-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:3245406455a5d98187ec35530fd772b1d799b26667980872c8d4614991e2c4a2", size = 2106158, upload-time = "2026-05-06T13:38:57.215Z" }, + { url = "https://files.pythonhosted.org/packages/19/95/6195171e385007300f0f5574592e467c568becce2d937a0b6804f218bc49/pydantic_core-2.46.4-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:962ccbab7b642487b1d8b7df90ef677e03134cf1fd8880bf698649b22a69371f", size = 1951724, upload-time = "2026-05-06T13:37:02.697Z" }, + { url = "https://files.pythonhosted.org/packages/8e/bc/f47d1ff9cbb1620e1b5b697eef06010035735f07820180e74178226b27b3/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8233f2947cf85404441fd7e0085f53b10c93e0ee78611099b5c7237e36aacbf7", size = 1975742, upload-time = "2026-05-06T13:37:09.448Z" }, + { url = "https://files.pythonhosted.org/packages/5b/11/9b9a5b0306345664a2da6410877af6e8082481b5884b3ddd78d47c6013ce/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:3a233125ac121aa3ffba9a2b59edfc4a985a76092dc8279586ab4b71390875e7", size = 2052418, upload-time = "2026-05-06T13:37:38.234Z" }, + { url = "https://files.pythonhosted.org/packages/f1/b7/a65fec226f5d78fc39f4a13c4cc0c768c22b113438f60c14adc9d2865038/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:5b712b53160b79a5850310b912a5ef8e57e56947c8ad690c227f5c9d7e561712", size = 2232274, upload-time = "2026-05-06T13:38:27.753Z" }, + { url = "https://files.pythonhosted.org/packages/68/f0/92039db98b907ef49269a8271f67db9cb78ae2fc68062ef7e4e77adb5f61/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:9401557acd873c3a7f3eb9383edef8ac4968f9510e340f4808d427e75667e7b4", size = 2309940, upload-time = "2026-05-06T13:38:05.353Z" }, + { url = "https://files.pythonhosted.org/packages/5f/97/2aab507d3d00ca626e8e57c1eac6a79e4e5fbcc63eb99733ff55d1717f65/pydantic_core-2.46.4-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:926c9541b14b12b1681dca8a0b75feb510b06c6341b70a8e500c2fdcff837cce", size = 2094516, upload-time = "2026-05-06T13:39:10.577Z" }, + { url = "https://files.pythonhosted.org/packages/22/37/a8aca44d40d737dde2bc05b3c6c07dff0de07ce6f82e9f3167aeaf4d5dea/pydantic_core-2.46.4-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:56cb4851bcaf3d117eddcef4fe66afd750a50274b0da8e22be256d10e5611987", size = 2136854, upload-time = "2026-05-06T13:40:22.59Z" }, + { url = "https://files.pythonhosted.org/packages/24/99/fcef1b79238c06a8cbec70819ac722ba76e02bc8ada9b0fd66eba40da01b/pydantic_core-2.46.4-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:c68fcd102d71ea85c5b2dfac3f4f8476eff42a9e078fd5faefff6d145063536b", size = 2180306, upload-time = "2026-05-06T13:40:10.666Z" }, + { url = "https://files.pythonhosted.org/packages/ae/6c/fc44000918855b42779d007ae63b0532794739027b2f417321cddbc44f6a/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:b2f69dec1725e79a012d920df1707de5caf7ed5e08f3be4435e25803efc47458", size = 2190044, upload-time = "2026-05-06T13:40:43.231Z" }, + { url = "https://files.pythonhosted.org/packages/6b/65/d9cadc9f1920d7a127ad2edba16c1db7916e59719285cd6c94600b0080ba/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_armv7l.whl", hash = "sha256:8d0820e8192167f80d88d64038e609c31452eeca865b4e1d9950a27a4609b00b", size = 2329133, upload-time = "2026-05-06T13:39:57.365Z" }, + { url = "https://files.pythonhosted.org/packages/d0/cf/c873d91679f3a30bcf5e7ac280ce5573483e72295307685120d0d5ad3416/pydantic_core-2.46.4-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:fbdb89b3e1c94a30cc5edfce477c6e6a5dc4d8f84665b455c27582f211a1c72c", size = 2374464, upload-time = "2026-05-06T13:38:06.976Z" }, + { url = "https://files.pythonhosted.org/packages/47/bd/6f2fc8188f31bf10590f1e98e7b306336161fac930a8c514cd7bd828c7dc/pydantic_core-2.46.4-cp312-cp312-win32.whl", hash = "sha256:9aa768456404a8bf48a4406685ac2bec8e72b62c69313734fa3b73cf33b3a894", size = 1974823, upload-time = "2026-05-06T13:40:47.985Z" }, + { url = "https://files.pythonhosted.org/packages/40/8c/985c1d41ea1107c2534abd9870e4ed5c8e7669b5c308297835c001e7a1c4/pydantic_core-2.46.4-cp312-cp312-win_amd64.whl", hash = "sha256:e9c26f834c65f5752f3f06cb08cb86a913ceb7274d0db6e267808a708b46bc89", size = 2072919, upload-time = "2026-05-06T13:39:21.153Z" }, + { url = "https://files.pythonhosted.org/packages/c4/ba/f463d006e0c47373ca7ec5e1a261c59dc01ef4d62b2657af925fb0deee3a/pydantic_core-2.46.4-cp312-cp312-win_arm64.whl", hash = "sha256:4fc73cb559bdb54b1134a706a2802a4cddd27a0633f5abb7e53056268751ac6a", size = 2027604, upload-time = "2026-05-06T13:39:03.753Z" }, + { url = "https://files.pythonhosted.org/packages/ee/a4/73995fd4ebbb46ba0ee51e6fa049b8f02c40daebb762208feda8a6b7894d/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_10_12_x86_64.whl", hash = "sha256:14d4edf427bdcf950a8a02d7cb44a08614388dd6e1bdcbf4f67504fa7887da9c", size = 2111589, upload-time = "2026-05-06T13:37:10.817Z" }, + { url = "https://files.pythonhosted.org/packages/fb/7f/f37d3a5e8bfcc2e403f5c57a730f2d815693fb42119e8ea48b3789335af1/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-macosx_11_0_arm64.whl", hash = "sha256:0ce40cd7b21210e99342afafbd4d0f76d784eb5b1d60f3bdc566be4983c6c73b", size = 1944552, upload-time = "2026-05-06T13:36:56.717Z" }, + { url = "https://files.pythonhosted.org/packages/15/3c/d7eb777b3ff43e8433a4efb39a17aa8fd98a4ee8561a24a67ef5db07b2d6/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:90884113d8b48f760e9587002789ddd741e76ab9f89518cd1e43b1f1a52ec44b", size = 1982984, upload-time = "2026-05-06T13:39:06.207Z" }, + { url = "https://files.pythonhosted.org/packages/63/87/70b9f40170a81afd55ca26c9b2acb25c20d64bcfbf888fafecb3ba077d4c/pydantic_core-2.46.4-graalpy311-graalpy242_311_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:66ce7632c22d837c95301830e111ad0128a32b8207533b60896a96c4915192ea", size = 2138417, upload-time = "2026-05-06T13:39:45.476Z" }, + { url = "https://files.pythonhosted.org/packages/9d/1d/8987ad40f65ae1432753072f214fb5c74fe47ffbd0698bb9cbbb585664f8/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_10_12_x86_64.whl", hash = "sha256:1d8ba486450b14f3b1d63bc521d410ec7565e52f887b9fb671791886436a42f7", size = 2095527, upload-time = "2026-05-06T13:39:52.283Z" }, + { url = "https://files.pythonhosted.org/packages/64/d3/84c282a7eee1d3ac4c0377546ef5a1ea436ce26840d9ac3b7ed54a377507/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-macosx_11_0_arm64.whl", hash = "sha256:3009f12e4e90b7f88b4f9adb1b0c4a3d58fe7820f3238c190047209d148026df", size = 1936024, upload-time = "2026-05-06T13:40:15.671Z" }, + { url = "https://files.pythonhosted.org/packages/d7/ca/eac61596cdeb4d7e174d3dc0bd8a6238f14f75f97a24e7b7db4c7e7340a0/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ad785e92e6dc634c21555edc8bd6b64957ab844541bcb96a1366c202951ae526", size = 1990696, upload-time = "2026-05-06T13:38:34.717Z" }, + { url = "https://files.pythonhosted.org/packages/fa/c3/7c8b240552251faf6b3a957db200fcfbbcec36763c050428b601e0c9b83b/pydantic_core-2.46.4-graalpy312-graalpy250_312_native-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:00c603d540afdd6b80eb39f078f33ebd46211f02f33e34a32d9f053bba711de0", size = 2147590, upload-time = "2026-05-06T13:39:29.883Z" }, + { url = "https://files.pythonhosted.org/packages/11/cb/428de0385b6c8d44b716feba566abfacfbd23ee3c4439faa789a1456242f/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:0c563b08bca408dc7f65f700633d8442fffb2421fc47b8101377e9fd65051ff0", size = 2112782, upload-time = "2026-05-06T13:37:04.016Z" }, + { url = "https://files.pythonhosted.org/packages/0b/b5/6a17bdadd0fc1f170adfd05a20d37c832f52b117b4d9131da1f41bb097ce/pydantic_core-2.46.4-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:db06ffe51636ffe9ca531fe9023dd64bdd794be8754cb5df57c5498ae5b518a7", size = 1952146, upload-time = "2026-05-06T13:39:43.092Z" }, + { url = "https://files.pythonhosted.org/packages/2a/dc/03734d80e362cd43ef65428e9de77c730ce7f2f11c60d2b1e1b39f0fbf99/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:133878133d271ade3d41d1bfb2a45ec38dbdbda40bc065921c6b04e4630127e2", size = 2134492, upload-time = "2026-05-06T13:36:58.124Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/5e5ffc085ed07cc22d298134d3d911c63e91f6a0eb91fe646750a3209910/pydantic_core-2.46.4-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:9bc519fbf2b7578398853d815009ae5e4d4603d12f4e3f91da8c06852d3da3e9", size = 2156604, upload-time = "2026-05-06T13:37:49.88Z" }, + { url = "https://files.pythonhosted.org/packages/81/44/6e112a4253e56f5705467cbab7ab5e91ee7398ba3d56d358635958893d3e/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_aarch64.whl", hash = "sha256:c7a7bd4e39e8e4c12c39cd480356842b6a8a06e41b23a55a5e3e191718838ddf", size = 2183828, upload-time = "2026-05-06T13:37:43.053Z" }, + { url = "https://files.pythonhosted.org/packages/ac/ad/5565071e937d8e752842ac241463944c9eb14c87e2d269f2658a5bd05e98/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_armv7l.whl", hash = "sha256:d396ec2b979760aaf3218e76c24e65bd0aca24983298653b3a9d7a45f9e47b30", size = 2310000, upload-time = "2026-05-06T13:37:56.694Z" }, + { url = "https://files.pythonhosted.org/packages/4f/c3/66883a5cec183e7fba4d024b4cbbe61851a63750ef606b0afecc46d1f2bf/pydantic_core-2.46.4-pp311-pypy311_pp73-musllinux_1_1_x86_64.whl", hash = "sha256:86e1a4418c6cd97d60c95c71164158eaf7324fae7b0923264016baa993eba6fc", size = 2361286, upload-time = "2026-05-06T13:40:05.667Z" }, + { url = "https://files.pythonhosted.org/packages/4b/2d/69abac8f838090bbecd5df894befb2c2619e7996a98ddb949db9f3b93225/pydantic_core-2.46.4-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:d51026d73fcfd93610abc7b27789c26b313920fcfb20e27462d74a7f8b06e983", size = 2193071, upload-time = "2026-05-06T13:38:08.682Z" }, +] + +[[package]] +name = "pydantic-settings" +version = "2.14.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "pydantic" }, + { name = "python-dotenv" }, + { name = "typing-inspection" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/5c/b5/8f48e906c3e0205276e8bd8cb7512217a87b2685304d64be27cad5b3019f/pydantic_settings-2.14.2.tar.gz", hash = "sha256:c19dd64b19097f1de80184f0cc7b0272a13ae6e170cbf240a3e27e381ed14a5f", size = 237700, upload-time = "2026-06-19T13:44:56.324Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/77/c1/6e422f34e569cf8e18df68d1939c81c099d2b61e4f7d9621c8a77560799c/pydantic_settings-2.14.2-py3-none-any.whl", hash = "sha256:a20c97b37910b6550d5ea50fbcc2d4187defe58cd57070b73863d069419c9440", size = 61715, upload-time = "2026-06-19T13:44:55.02Z" }, +] + +[[package]] +name = "pydash" +version = "8.0.6" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/c1/1c55272f49d761cec38ddb80be9817935b9c91ebd6a8988e10f532868d56/pydash-8.0.6.tar.gz", hash = "sha256:b2821547e9723f69cf3a986be4db64de41730be149b2641947ecd12e1e11025a", size = 164338, upload-time = "2026-01-17T16:42:56.576Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/b7/cc5e7974699db40014d58c7dd7c4ad4ffc244d36930dc9ec7d06ee67d7a9/pydash-8.0.6-py3-none-any.whl", hash = "sha256:ee70a81a5b292c007f28f03a4ee8e75c1f5d7576df5457b836ec7ab2839cc5d0", size = 101561, upload-time = "2026-01-17T16:42:55.448Z" }, +] + +[[package]] +name = "pyee" +version = "13.0.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/8b/04/e7c1fe4dc78a6fdbfd6c337b1c3732ff543b8a397683ab38378447baa331/pyee-13.0.1.tar.gz", hash = "sha256:0b931f7c14535667ed4c7e0d531716368715e860b988770fc7eb8578d1f67fc8", size = 31655, upload-time = "2026-02-14T21:12:28.044Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/c4/b4d4827c93ef43c01f599ef31453ccc1c132b353284fc6c87d535c233129/pyee-13.0.1-py3-none-any.whl", hash = "sha256:af2f8fede4171ef667dfded53f96e2ed0d6e6bd7ee3bb46437f77e3b57689228", size = 15659, upload-time = "2026-02-14T21:12:26.263Z" }, +] + +[[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 = "pymongo" +version = "4.9.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "dnspython" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fb/43/d5e8993bd43e6f9cbe985e8ae1398eb73309e88694ac2ea618eacbc9cea2/pymongo-4.9.2.tar.gz", hash = "sha256:3e63535946f5df7848307b9031aa921f82bb0cbe45f9b0c3296f2173f9283eb0", size = 1889366, upload-time = "2024-10-02T16:35:35.307Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/af/1ce26b971e520de621239842f2be302749eb752a5cb29dd253f4c210eb0a/pymongo-4.9.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:ab8d54529feb6e29035ba8f0570c99ad36424bc26486c238ad7ce28597bc43c8", size = 833709, upload-time = "2024-10-02T16:33:59.496Z" }, + { url = "https://files.pythonhosted.org/packages/a6/bd/7bc8224ae96fd9ffe8b2a193469200b9c75787178c5b1955bd20e5d024c7/pymongo-4.9.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:f928bdc152a995cbd0b563fab201b2df873846d11f7a41d1f8cc8a01b35591ab", size = 833974, upload-time = "2024-10-02T16:34:00.885Z" }, + { url = "https://files.pythonhosted.org/packages/87/2e/3cc96aec7a1d6151677bb108af606ea220205a47255ed53255bfe1d8f31f/pymongo-4.9.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b6e7251d59fa3dcbb1399a71a3aec63768cebc6b22180b671601c2195fe1f90a", size = 1405440, upload-time = "2024-10-02T16:34:02.107Z" }, + { url = "https://files.pythonhosted.org/packages/e8/9c/2d5db2fcabc873daead275729c17ddeb2b437010858fe101e8d59a276209/pymongo-4.9.2-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:0e759ed0459e7264a11b6896016f616341a8e4c6ab7f71ae651bd21ffc7e9524", size = 1454720, upload-time = "2024-10-02T16:34:04.748Z" }, + { url = "https://files.pythonhosted.org/packages/6f/84/b382e7f817fd39dcd02ae69e21afd538251acf5de1904606a9908d8895fe/pymongo-4.9.2-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:f3fc60f242191840ccf02b898bc615b5141fbb70064f38f7e60fcaa35d3b5efd", size = 1431625, upload-time = "2024-10-02T16:34:06.361Z" }, + { url = "https://files.pythonhosted.org/packages/87/f5/653f9af6a7625353138bded4548a5a48729352b963fc2a059e07241b37c2/pymongo-4.9.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c798351666ac97a0ddaa823689061c3af949c2d6acf7fb2d9ab0a7f465ced79", size = 1409027, upload-time = "2024-10-02T16:34:08.017Z" }, + { url = "https://files.pythonhosted.org/packages/36/26/f4159209cf6229ce0a5ac37f093dab49495c51daad8ca835279f0058b060/pymongo-4.9.2-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:aac78b5fdd49ed8cae49adf76befacb02293a23b412676775c4715148e166d85", size = 1378524, upload-time = "2024-10-02T16:34:09.659Z" }, + { url = "https://files.pythonhosted.org/packages/57/3c/78c60e721a975b836922467410dd4b9616ac84f096eec00f7bde9e889b2b/pymongo-4.9.2-cp310-cp310-win32.whl", hash = "sha256:bf77bf175c315e299a91332c2bbebc097c4d4fcc8713e513a9861684aa39023a", size = 810564, upload-time = "2024-10-02T16:34:11.081Z" }, + { url = "https://files.pythonhosted.org/packages/71/cf/790c8da7fdd55e5e824b08eaf63355732bbf278ebcb98615e723feb05702/pymongo-4.9.2-cp310-cp310-win_amd64.whl", hash = "sha256:c42b5aad8971256365bfd0a545fb1c7a199c93db80decd298ea2f987419e2a6d", size = 825019, upload-time = "2024-10-02T16:34:12.688Z" }, + { url = "https://files.pythonhosted.org/packages/a8/b4/7af80304a0798526fac959e3de651b0747472c049c8b89a6c15fed2026f6/pymongo-4.9.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:99e40f44877b32bf4b3c46ceed2228f08c222cf7dec8a4366dd192a1429143fa", size = 887499, upload-time = "2024-10-02T16:34:14.257Z" }, + { url = "https://files.pythonhosted.org/packages/33/ee/5389229774f842bd92a123fd3ea4f2d72b474bde9315ff00e889fe104a0d/pymongo-4.9.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6f6834d575ed87edc7dfcab4501d961b6a423b3839edd29ecb1382eee7736777", size = 887755, upload-time = "2024-10-02T16:34:15.803Z" }, + { url = "https://files.pythonhosted.org/packages/d4/fd/3f0ae0fd3a7049ec67ab8f952020bc9fad841791d52d8c51405bd91b3c9b/pymongo-4.9.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3010018f5672e5b7e8d096dea9f1ea6545b05345ff0eb1754f6ee63785550773", size = 1647336, upload-time = "2024-10-02T16:34:17.454Z" }, + { url = "https://files.pythonhosted.org/packages/00/b7/0472d51778e9e22b2ffd5ae9a401888525c4872cb2073f1bff8d5ae9659b/pymongo-4.9.2-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:69394ee9f0ce38ff71266bad01b7e045cd75e58500ebad5d72187cbabf2e652a", size = 1713193, upload-time = "2024-10-02T16:34:18.933Z" }, + { url = "https://files.pythonhosted.org/packages/8c/ac/aa41cb291107bb16bae286d7b9f2c868e393765830bc173609ae4dc9a3ae/pymongo-4.9.2-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:87b18094100f21615d9db99c255dcd9e93e476f10fb03c1d3632cf4b82d201d2", size = 1681720, upload-time = "2024-10-02T16:34:20.578Z" }, + { url = "https://files.pythonhosted.org/packages/dc/70/ac12eb58bd46a7254daaa4d39e7c4109983ee2227dac44df6587954fe345/pymongo-4.9.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:3039e093d28376d6a54bdaa963ca12230c8a53d7b19c8e6368e19bcfbd004176", size = 1652109, upload-time = "2024-10-02T16:34:21.861Z" }, + { url = "https://files.pythonhosted.org/packages/d3/20/38f71e0f1c7878b287305b2965cebe327fc5626ecca83ea52a272968cbe2/pymongo-4.9.2-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6ab42d9ee93fe6b90020c42cba5bfb43a2b4660951225d137835efc21940da48", size = 1611503, upload-time = "2024-10-02T16:34:23.227Z" }, + { url = "https://files.pythonhosted.org/packages/9b/4c/d3b26e1040c9538b9c8aed005ec18af7515c6dd3091aabfbf6c30a3b3b1a/pymongo-4.9.2-cp311-cp311-win32.whl", hash = "sha256:a663ca60e187a248d370c58961e40f5463077d2b43831eb92120ea28a79ecf96", size = 855570, upload-time = "2024-10-02T16:34:24.674Z" }, + { url = "https://files.pythonhosted.org/packages/40/3d/7de1a4cf51bf2b10bb9f43ffa208acad0d64c18994ca8d83f490edef6834/pymongo-4.9.2-cp311-cp311-win_amd64.whl", hash = "sha256:24e7b6887bbfefd05afed26a99a2c69459e2daa351a43a410de0d6c0ee3cce4e", size = 874715, upload-time = "2024-10-02T16:34:25.973Z" }, + { url = "https://files.pythonhosted.org/packages/a1/08/7d95aab0463dc5a2c460a0b4e50a45a743afbe20986f47f87a9a88f43c0c/pymongo-4.9.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8083bbe8cb10bb33dca4d93f8223dd8d848215250bb73867374650bac5fe69e1", size = 941617, upload-time = "2024-10-02T16:34:27.178Z" }, + { url = "https://files.pythonhosted.org/packages/bb/28/40613d8d97fc33bf2b9187446a6746925623aa04a9a27c9b058e97076f7a/pymongo-4.9.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:a1b8c636bf557c7166e3799bbf1120806ca39e3f06615b141c88d9c9ceae4d8c", size = 941394, upload-time = "2024-10-02T16:34:28.562Z" }, + { url = "https://files.pythonhosted.org/packages/df/b2/7f1a0d75f538c0dcaa004ea69e28706fa3ca72d848e0a5a7dafd30939fff/pymongo-4.9.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8aac5dce28454f47576063fbad31ea9789bba67cab86c95788f97aafd810e65b", size = 1907396, upload-time = "2024-10-02T16:34:30.263Z" }, + { url = "https://files.pythonhosted.org/packages/ba/70/9304bae47a361a4b12adb5be714bad41478c0e5bc3d6cf403b328d6398a0/pymongo-4.9.2-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d1d5e7123af1fddf15b2b53e58f20bf5242884e671bcc3860f5e954fe13aeddd", size = 1986029, upload-time = "2024-10-02T16:34:32.346Z" }, + { url = "https://files.pythonhosted.org/packages/ae/51/ac0378d001995c4a705da64a4a2b8e1732f95de5080b752d69f452930cc7/pymongo-4.9.2-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:fe97c847b56d61e533a7af0334193d6b28375b9189effce93129c7e4733794a9", size = 1949088, upload-time = "2024-10-02T16:34:33.916Z" }, + { url = "https://files.pythonhosted.org/packages/1a/30/e93dc808039dc29fc47acee64f128aa650aacae3e4b57b68e01ff1001cda/pymongo-4.9.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:96ad54433a996e2d1985a9cd8fc82538ca8747c95caae2daf453600cc8c317f9", size = 1910516, upload-time = "2024-10-02T16:34:35.953Z" }, + { url = "https://files.pythonhosted.org/packages/2b/34/895b9cad3bd5342d5ab51a853ed3a814840ce281d55c6928968e9f3f49f5/pymongo-4.9.2-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:98b9cade40f5b13e04492a42ae215c3721099be1014ddfe0fbd23f27e4f62c0c", size = 1860499, upload-time = "2024-10-02T16:34:37.727Z" }, + { url = "https://files.pythonhosted.org/packages/24/7e/167818f324bf2122d45551680671a3c6406a345d3fcace4e737f57bda4e4/pymongo-4.9.2-cp312-cp312-win32.whl", hash = "sha256:dde6068ae7c62ea8ee2c5701f78c6a75618cada7e11f03893687df87709558de", size = 901282, upload-time = "2024-10-02T16:34:39.128Z" }, + { url = "https://files.pythonhosted.org/packages/12/6b/b7ffa7114177fc1c60ae529512b82629ff7e25d19be88e97f2d0ddd16717/pymongo-4.9.2-cp312-cp312-win_amd64.whl", hash = "sha256:e1ab6cd7cd2d38ffc7ccdc79fdc166c7a91a63f844a96e3e6b2079c054391c68", size = 924925, upload-time = "2024-10-02T16:34:40.859Z" }, +] + +[[package]] +name = "pynacl" +version = "1.6.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cffi", marker = "platform_python_implementation != 'PyPy'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d9/9a/4019b524b03a13438637b11538c82781a5eda427394380381af8f04f467a/pynacl-1.6.2.tar.gz", hash = "sha256:018494d6d696ae03c7e656e5e74cdfd8ea1326962cc401bcf018f1ed8436811c", size = 3511692, upload-time = "2026-01-01T17:48:10.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/be/7b/4845bbf88e94586ec47a432da4e9107e3fc3ce37eb412b1398630a37f7dd/pynacl-1.6.2-cp38-abi3-macosx_10_10_universal2.whl", hash = "sha256:c949ea47e4206af7c8f604b8278093b674f7c79ed0d4719cc836902bf4517465", size = 388458, upload-time = "2026-01-01T17:32:16.829Z" }, + { url = "https://files.pythonhosted.org/packages/1e/b4/e927e0653ba63b02a4ca5b4d852a8d1d678afbf69b3dbf9c4d0785ac905c/pynacl-1.6.2-cp38-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.whl", hash = "sha256:8845c0631c0be43abdd865511c41eab235e0be69c81dc66a50911594198679b0", size = 800020, upload-time = "2026-01-01T17:32:18.34Z" }, + { url = "https://files.pythonhosted.org/packages/7f/81/d60984052df5c97b1d24365bc1e30024379b42c4edcd79d2436b1b9806f2/pynacl-1.6.2-cp38-abi3-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:22de65bb9010a725b0dac248f353bb072969c94fa8d6b1f34b87d7953cf7bbe4", size = 1399174, upload-time = "2026-01-01T17:32:20.239Z" }, + { url = "https://files.pythonhosted.org/packages/68/f7/322f2f9915c4ef27d140101dd0ed26b479f7e6f5f183590fd32dfc48c4d3/pynacl-1.6.2-cp38-abi3-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:46065496ab748469cdd999246d17e301b2c24ae2fdf739132e580a0e94c94a87", size = 835085, upload-time = "2026-01-01T17:32:22.24Z" }, + { url = "https://files.pythonhosted.org/packages/3e/d0/f301f83ac8dbe53442c5a43f6a39016f94f754d7a9815a875b65e218a307/pynacl-1.6.2-cp38-abi3-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:8a66d6fb6ae7661c58995f9c6435bda2b1e68b54b598a6a10247bfcdadac996c", size = 1437614, upload-time = "2026-01-01T17:32:23.766Z" }, + { url = "https://files.pythonhosted.org/packages/c4/58/fc6e649762b029315325ace1a8c6be66125e42f67416d3dbd47b69563d61/pynacl-1.6.2-cp38-abi3-manylinux_2_34_aarch64.whl", hash = "sha256:26bfcd00dcf2cf160f122186af731ae30ab120c18e8375684ec2670dccd28130", size = 818251, upload-time = "2026-01-01T17:32:25.69Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a8/b917096b1accc9acd878819a49d3d84875731a41eb665f6ebc826b1af99e/pynacl-1.6.2-cp38-abi3-manylinux_2_34_x86_64.whl", hash = "sha256:c8a231e36ec2cab018c4ad4358c386e36eede0319a0c41fed24f840b1dac59f6", size = 1402859, upload-time = "2026-01-01T17:32:27.215Z" }, + { url = "https://files.pythonhosted.org/packages/85/42/fe60b5f4473e12c72f977548e4028156f4d340b884c635ec6b063fe7e9a5/pynacl-1.6.2-cp38-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:68be3a09455743ff9505491220b64440ced8973fe930f270c8e07ccfa25b1f9e", size = 791926, upload-time = "2026-01-01T17:32:29.314Z" }, + { url = "https://files.pythonhosted.org/packages/fa/f9/e40e318c604259301cc091a2a63f237d9e7b424c4851cafaea4ea7c4834e/pynacl-1.6.2-cp38-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:8b097553b380236d51ed11356c953bf8ce36a29a3e596e934ecabe76c985a577", size = 1363101, upload-time = "2026-01-01T17:32:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/48/47/e761c254f410c023a469284a9bc210933e18588ca87706ae93002c05114c/pynacl-1.6.2-cp38-abi3-win32.whl", hash = "sha256:5811c72b473b2f38f7e2a3dc4f8642e3a3e9b5e7317266e4ced1fba85cae41aa", size = 227421, upload-time = "2026-01-01T17:32:33.076Z" }, + { url = "https://files.pythonhosted.org/packages/41/ad/334600e8cacc7d86587fe5f565480fde569dfb487389c8e1be56ac21d8ac/pynacl-1.6.2-cp38-abi3-win_amd64.whl", hash = "sha256:62985f233210dee6548c223301b6c25440852e13d59a8b81490203c3227c5ba0", size = 239754, upload-time = "2026-01-01T17:32:34.557Z" }, + { url = "https://files.pythonhosted.org/packages/29/7d/5945b5af29534641820d3bd7b00962abbbdfee84ec7e19f0d5b3175f9a31/pynacl-1.6.2-cp38-abi3-win_arm64.whl", hash = "sha256:834a43af110f743a754448463e8fd61259cd4ab5bbedcf70f9dabad1d28a394c", size = 184801, upload-time = "2026-01-01T17:32:36.309Z" }, +] + +[[package]] +name = "pyparsing" +version = "3.3.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f3/91/9c6ee907786a473bf81c5f53cf703ba0957b23ab84c264080fb5a450416f/pyparsing-3.3.2.tar.gz", hash = "sha256:c777f4d763f140633dcb6d8a3eda953bf7a214dc4eff598413c070bcdc117cbc", size = 6851574, upload-time = "2026-01-21T03:57:59.36Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/10/bd/c038d7cc38edc1aa5bf91ab8068b63d4308c66c4c8bb3cbba7dfbc049f9c/pyparsing-3.3.2-py3-none-any.whl", hash = "sha256:850ba148bd908d7e2411587e247a1e4f0327839c40e2e5e6d05a007ecc69911d", size = 122781, upload-time = "2026-01-21T03:57:55.912Z" }, +] + +[[package]] +name = "pyppmd" +version = "1.3.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/81/d7/803232913cab9163a1a97ecf2236cd7135903c46ac8d49613448d88e8759/pyppmd-1.3.1.tar.gz", hash = "sha256:ced527f08ade4408c1bfc5264e9f97ffac8d221c9d13eca4f35ec1ec0c7b6b2e", size = 1351815, upload-time = "2025-11-27T22:08:44.175Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c4/f2/175dbdc56178d5d00caa73df79f98f72fab80f5c01a7467aff3ed245f739/pyppmd-1.3.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:041f46fbeb0a59888c0a94d6b9a557c652935633a104be1c31c12de491b5f448", size = 77545, upload-time = "2025-11-27T22:07:22.938Z" }, + { url = "https://files.pythonhosted.org/packages/61/a0/729139273084dd574b3b529cd4b006ca9d2dc42d8bd3b65adf66ae8dffd8/pyppmd-1.3.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:9512a8b39740923559c26eb16266bf8b70d4eab6ad27a9b39cd2465e60e0acfa", size = 47997, upload-time = "2025-11-27T22:07:24.437Z" }, + { url = "https://files.pythonhosted.org/packages/3f/bb/eab338c9fa00ddeb3f54552360949ac503f3cd77debc71857c07263eba20/pyppmd-1.3.1-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8966f26b91ba7cdff3cfec5512d39d1f8bf4a8dbb75c44085e33b564566fea66", size = 48437, upload-time = "2025-11-27T22:07:25.558Z" }, + { url = "https://files.pythonhosted.org/packages/96/5b/f098d68ce887d25a47e95a1aaa6443436cb21bb4bcc3cd73f332135a214d/pyppmd-1.3.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0d1cff657e85655c67426c29c90c78a6210148b207993e643fc351c72c60d188", size = 139198, upload-time = "2025-11-27T22:07:27.086Z" }, + { url = "https://files.pythonhosted.org/packages/1c/1e/59757d7e3aba883b2e446baee07055a069c9e17143fd4bd297fe590dd461/pyppmd-1.3.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9de2cdcc3932e7c23a54beb48dfe1b5ab7b4aedd5ffaae1e4871bd213d630cb3", size = 140959, upload-time = "2025-11-27T22:07:28.817Z" }, + { url = "https://files.pythonhosted.org/packages/ed/6c/4d1aeea9bcb8293dada21b51e2d20eff49d24ddf512ec611b47d2440846a/pyppmd-1.3.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1e1985461219c30d4576070b7e2de718dbb6f32637d1e658d25f838dfda2a4bb", size = 136301, upload-time = "2025-11-27T22:07:30.523Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/f6a46a60b092b5fb9a9631be408e447ea87cce4d656197736586ba082975/pyppmd-1.3.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:20d9d1aa4d0f32118c8094c212c66b7af50e55f47e7c6dffa5f35a8ac391faca", size = 139126, upload-time = "2025-11-27T22:07:32.274Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ed/cf1f4ac5248ddcb19cf18ef8acb256d909912a5c5684fcfe400fb42d778d/pyppmd-1.3.1-cp310-cp310-win32.whl", hash = "sha256:44d25e7dede2abb614bc023fe87835365fdd5865981c2273b70bfad71b84db29", size = 42019, upload-time = "2025-11-27T22:07:33.442Z" }, + { url = "https://files.pythonhosted.org/packages/1b/93/1e035bd1ef405ca024be1fc4d9eb7d603eb03960d7010515ddf155dcccd2/pyppmd-1.3.1-cp310-cp310-win_amd64.whl", hash = "sha256:1e503a28c9a275d31f24af9b735d2cca543b62f438b064e2833e9833e758bdbc", size = 46860, upload-time = "2025-11-27T22:07:34.873Z" }, + { url = "https://files.pythonhosted.org/packages/23/2f/236f7bf2f8b8ccfd93f0505692b9ad10a249fa00ce4671c50049c69ea414/pyppmd-1.3.1-cp310-cp310-win_arm64.whl", hash = "sha256:3fb3708d7b2b38e2999385a2f02c8e68e0f5a364d94f94e475e2e8b09e9338fc", size = 45253, upload-time = "2025-11-27T22:07:36.406Z" }, + { url = "https://files.pythonhosted.org/packages/04/40/580b99818c9db3a09cbae8e3740f9b5127ef7fd7314daf009c487ab02eb6/pyppmd-1.3.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:fdf55aa6ee7aef492f6896464e7a5a528f8615bb9e435f55bc8dff226fcc8292", size = 77550, upload-time = "2025-11-27T22:07:37.839Z" }, + { url = "https://files.pythonhosted.org/packages/8d/a3/f7b4c49ef920f5b2c9812f8f54f48e01435433cb6b46ec82b1b4e740714d/pyppmd-1.3.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:aa820aac385ac4ee57160b26d92862c69d31c08f92272dbef05fe8e619cea8d1", size = 48000, upload-time = "2025-11-27T22:07:38.983Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c3/30de6f7892e77b83350e55d54a6913420591cc2c5c4d2394c219a4c461ac/pyppmd-1.3.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e16593ba4ca0a85821ae698ef06847a52937662f5ce1b130c39cca2979a4e8cd", size = 48439, upload-time = "2025-11-27T22:07:40.428Z" }, + { url = "https://files.pythonhosted.org/packages/39/22/33889cbe22a617c42df2199be54e9e1bf88393fd8643fe911eb9f982849c/pyppmd-1.3.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:486dde2294ff9b30465ab5bb0f213b20bd5ac0e4adf21be801a1ceb29aa75d9d", size = 141737, upload-time = "2025-11-27T22:07:41.641Z" }, + { url = "https://files.pythonhosted.org/packages/0c/f7/940ab2fd78caaef3a9e9833adb36e17b9d03016d8b45ae110cbb4bfc83d1/pyppmd-1.3.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:89730cf026416ae2546c92738966ecf117c8176d52c229ad621a61c34643818b", size = 143643, upload-time = "2025-11-27T22:07:42.892Z" }, + { url = "https://files.pythonhosted.org/packages/75/51/129ce02d2b28a4f6788bccfe6d0ae1defc45db10eb1c4e4389cde8994ec7/pyppmd-1.3.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e77f5a6770950d464b50da760d53e67bce308a3abc8e3bd51db620b3f8cf1fa8", size = 138625, upload-time = "2025-11-27T22:07:44.54Z" }, + { url = "https://files.pythonhosted.org/packages/3a/89/f8390d1a21951d3d4619c854a839f7b1431746997cd98b475f614a658305/pyppmd-1.3.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:8e3bf8deef44f8e03612689a6067a4a3dd7e50d2ef00af4cf987c59b62ff3006", size = 141663, upload-time = "2025-11-27T22:07:45.814Z" }, + { url = "https://files.pythonhosted.org/packages/fa/3f/b58dd8875ebbb78436f87567547967bebdf3a5586f5f243c735fc4460843/pyppmd-1.3.1-cp311-cp311-win32.whl", hash = "sha256:a3509b3f881409ebc5522942438108c48a78f8df88bcf3f9d907b74131b9431c", size = 42014, upload-time = "2025-11-27T22:07:47.058Z" }, + { url = "https://files.pythonhosted.org/packages/b5/d3/5fe05bdccdd7af04461c25a3dc34799f48ad3e9a2bd591aaec9afbc1d10a/pyppmd-1.3.1-cp311-cp311-win_amd64.whl", hash = "sha256:23b83799f33f9a24577f22e092b0feecda8cd1ea33871ad8610a58629874f7bc", size = 46862, upload-time = "2025-11-27T22:07:48.162Z" }, + { url = "https://files.pythonhosted.org/packages/d4/ba/6414cbe8407c23bacce906dad0599f155b2baf6082da104e64d7f1573717/pyppmd-1.3.1-cp311-cp311-win_arm64.whl", hash = "sha256:234489036a1758670655d1ceafd4caeb93b858bd4c0ca39686837d38aef044c0", size = 45249, upload-time = "2025-11-27T22:07:49.261Z" }, + { url = "https://files.pythonhosted.org/packages/3e/89/696046e53c7aea98bb563aed3f15c3e2fa20c33e3d6c9de3c20992c586cc/pyppmd-1.3.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:3faa58ab2ebe3b13ec23b1904639d687fb727270d2962fd2d239ca00fd6eb865", size = 77796, upload-time = "2025-11-27T22:07:50.362Z" }, + { url = "https://files.pythonhosted.org/packages/f1/c5/a708cdb58e76889bc65201eda12211486548ffe00ecddc5dfbdce6d4d252/pyppmd-1.3.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:27703f041ee96912a5410fd3ce31c5cde32f9323bd67f72f100bd960ee67bf13", size = 48185, upload-time = "2025-11-27T22:07:51.736Z" }, + { url = "https://files.pythonhosted.org/packages/9e/5d/f299535c18009addb866d89a7044f1086e4eecf50542e57ff5bb15840195/pyppmd-1.3.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:e773d8353b36f7e7973a43526993fb276b98a97839cb5dc8f4e6465ad873f41a", size = 48496, upload-time = "2025-11-27T22:07:52.866Z" }, + { url = "https://files.pythonhosted.org/packages/aa/9d/4a59b73ea8e305f9192ee26ceb7c3d57e17ccb9bcca0e99ef335db29fcf7/pyppmd-1.3.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:37b1883accf840cb0b711785d353f8548853a1401d381da007c0aec362f3ffac", size = 142620, upload-time = "2025-11-27T22:07:54.411Z" }, + { url = "https://files.pythonhosted.org/packages/88/d7/fe32c2a4f8539365e6292aed25545830a5e718a510cdb4caddd6fd8d8056/pyppmd-1.3.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1bd6d179ad39b6191ca0cbe62fb9592f33f49277b4384ad7bc5eb0e6ca27ebee", size = 144306, upload-time = "2025-11-27T22:07:55.727Z" }, + { url = "https://files.pythonhosted.org/packages/20/20/e3907cf263b58f4ed4c5315bc1ac91721c85332fd0d73a89e3e2752904ef/pyppmd-1.3.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:806cf8d33606e44bf5ff5786c57891f57993f1eef1c763da3c58ea97de3a13c8", size = 139522, upload-time = "2025-11-27T22:07:57.034Z" }, + { url = "https://files.pythonhosted.org/packages/0a/03/22d5f93251e481f23bf741dde7f59cfc3e315f60b32b63f215a2d7bb8944/pyppmd-1.3.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1826cbce9a2c944aa08df79310a7e6d4a61fd20636b6dff64a77ea4bc43da30f", size = 142340, upload-time = "2025-11-27T22:07:58.49Z" }, + { url = "https://files.pythonhosted.org/packages/34/88/38d36c1394d5e331db9708dae08863c87c059bd5b6e43b20234be02a0503/pyppmd-1.3.1-cp312-cp312-win32.whl", hash = "sha256:d3ff96671319318d941dd34300d641745048e8a3251b077bddf98652d6ddc513", size = 42102, upload-time = "2025-11-27T22:08:00.124Z" }, + { url = "https://files.pythonhosted.org/packages/ee/29/1398c6f67dfb66367babeed2980caee837d0a488705e3dff7ff159e017e7/pyppmd-1.3.1-cp312-cp312-win_amd64.whl", hash = "sha256:c8c1ad39e7ebde71bf5a54cf61f489bf4790f1dd0beb70dc2e8f5ad3329d7ca7", size = 46957, upload-time = "2025-11-27T22:08:01.587Z" }, + { url = "https://files.pythonhosted.org/packages/d2/41/ee3193c16472a5a1c5f1965abb8fa87a7ad455c39688e9a0c2d87d6a7027/pyppmd-1.3.1-cp312-cp312-win_arm64.whl", hash = "sha256:391b2bf76d7dc45b343781754d0b734dcbf539b92667986a343f5488c4bf9ca0", size = 45214, upload-time = "2025-11-27T22:08:02.721Z" }, +] + +[[package]] +name = "pytest" +version = "7.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "exceptiongroup", marker = "python_full_version < '3.11'" }, + { name = "iniconfig" }, + { name = "packaging" }, + { name = "pluggy" }, + { name = "tomli", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/80/1f/9d8e98e4133ffb16c90f3b405c43e38d3abb715bb5d7a63a5a684f7e46a3/pytest-7.4.4.tar.gz", hash = "sha256:2cf0005922c6ace4a3e2ec8b4080eb0d9753fdc93107415332f50ce9e7994280", size = 1357116, upload-time = "2023-12-31T12:00:18.035Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/51/ff/f6e8b8f39e08547faece4bd80f89d5a8de68a38b2d179cc1c4490ffa3286/pytest-7.4.4-py3-none-any.whl", hash = "sha256:b090cdf5ed60bf4c45261be03239c2c1c22df034fbffe691abe93cd80cea01d8", size = 325287, upload-time = "2023-12-31T12:00:13.963Z" }, +] + +[[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 = "python-discovery" +version = "1.4.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "filelock" }, + { name = "platformdirs" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/66/26/8b004cc36f430345136f6f00fa1aa9ed596c8ed1e8504625fa79522ff39c/python_discovery-1.4.3.tar.gz", hash = "sha256:ad57d7045a862460d4a235986c33f13ed707d3aeb9153fa47eb7dfd0d4673289", size = 70438, upload-time = "2026-07-03T13:21:51.621Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/28/78/9b77ecb4644d1bbea94d29abf78f21c47eca6eb79e9745b702ec0bed2e19/python_discovery-1.4.3-py3-none-any.whl", hash = "sha256:b6e1e4a7d9e3f6948c39746ffe8218225162d738ba39d05ab1d2f6c1cac4878c", size = 33885, upload-time = "2026-07-03T13:21:50.174Z" }, +] + +[[package]] +name = "python-dotenv" +version = "1.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/82/ed/0301aeeac3e5353ef3d94b6ec08bbcabd04a72018415dcb29e588514bba8/python_dotenv-1.2.2.tar.gz", hash = "sha256:2c371a91fbd7ba082c2c1dc1f8bf89ca22564a087c2c287cd9b662adde799cf3", size = 50135, upload-time = "2026-03-01T16:00:26.196Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/d7/1959b9648791274998a9c3526f6d0ec8fd2233e4d4acce81bbae76b44b2a/python_dotenv-1.2.2-py3-none-any.whl", hash = "sha256:1d8214789a24de455a8b8bd8ae6fe3c6b69a5e3d64aa8a8e5d68e694bbcb285a", size = 22101, upload-time = "2026-03-01T16:00:25.09Z" }, +] + +[[package]] +name = "pytz" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ff/46/dd499ec9038423421951e4fad73051febaa13d2df82b4064f87af8b8c0c3/pytz-2026.2.tar.gz", hash = "sha256:0e60b47b29f21574376f218fe21abc009894a2321ea16c6754f3cad6eb7cdd6a", size = 320861, upload-time = "2026-05-04T01:35:29.667Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ec/dd/96da98f892250475bdf2328112d7468abdd4acc7b902b6af23f4ed958ea0/pytz-2026.2-py2.py3-none-any.whl", hash = "sha256:04156e608bee23d3792fd45c94ae47fae1036688e75032eea2e3bf0323d1f126", size = 510141, upload-time = "2026-05-04T01:35:27.408Z" }, +] + +[[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/f4/a0/39350dd17dd6d6c6507025c0e53aef67a9293a6d37d3511f23ea510d5800/pyyaml-6.0.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:214ed4befebe12df36bcc8bc2b64b396ca31be9304b8f59e25c11cf94a4c033b", size = 184227, upload-time = "2025-09-25T21:31:46.04Z" }, + { url = "https://files.pythonhosted.org/packages/05/14/52d505b5c59ce73244f59c7a50ecf47093ce4765f116cdb98286a71eeca2/pyyaml-6.0.3-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:02ea2dfa234451bbb8772601d7b8e426c2bfa197136796224e50e35a78777956", size = 174019, upload-time = "2025-09-25T21:31:47.706Z" }, + { url = "https://files.pythonhosted.org/packages/43/f7/0e6a5ae5599c838c696adb4e6330a59f463265bfa1e116cfd1fbb0abaaae/pyyaml-6.0.3-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b30236e45cf30d2b8e7b3e85881719e98507abed1011bf463a8fa23e9c3e98a8", size = 740646, upload-time = "2025-09-25T21:31:49.21Z" }, + { url = "https://files.pythonhosted.org/packages/2f/3a/61b9db1d28f00f8fd0ae760459a5c4bf1b941baf714e207b6eb0657d2578/pyyaml-6.0.3-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:66291b10affd76d76f54fad28e22e51719ef9ba22b29e1d7d03d6777a9174198", size = 840793, upload-time = "2025-09-25T21:31:50.735Z" }, + { url = "https://files.pythonhosted.org/packages/7a/1e/7acc4f0e74c4b3d9531e24739e0ab832a5edf40e64fbae1a9c01941cabd7/pyyaml-6.0.3-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:9c7708761fccb9397fe64bbc0395abcae8c4bf7b0eac081e12b809bf47700d0b", size = 770293, upload-time = "2025-09-25T21:31:51.828Z" }, + { url = "https://files.pythonhosted.org/packages/8b/ef/abd085f06853af0cd59fa5f913d61a8eab65d7639ff2a658d18a25d6a89d/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:418cf3f2111bc80e0933b2cd8cd04f286338bb88bdc7bc8e6dd775ebde60b5e0", size = 732872, upload-time = "2025-09-25T21:31:53.282Z" }, + { url = "https://files.pythonhosted.org/packages/1f/15/2bc9c8faf6450a8b3c9fc5448ed869c599c0a74ba2669772b1f3a0040180/pyyaml-6.0.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5e0b74767e5f8c593e8c9b5912019159ed0533c70051e9cce3e8b6aa699fcd69", size = 758828, upload-time = "2025-09-25T21:31:54.807Z" }, + { url = "https://files.pythonhosted.org/packages/a3/00/531e92e88c00f4333ce359e50c19b8d1de9fe8d581b1534e35ccfbc5f393/pyyaml-6.0.3-cp310-cp310-win32.whl", hash = "sha256:28c8d926f98f432f88adc23edf2e6d4921ac26fb084b028c733d01868d19007e", size = 142415, upload-time = "2025-09-25T21:31:55.885Z" }, + { url = "https://files.pythonhosted.org/packages/2a/fa/926c003379b19fca39dd4634818b00dec6c62d87faf628d1394e137354d4/pyyaml-6.0.3-cp310-cp310-win_amd64.whl", hash = "sha256:bdb2c67c6c1390b63c6ff89f210c8fd09d9a1217a465701eac7316313c915e4c", size = 158561, upload-time = "2025-09-25T21:31:57.406Z" }, + { url = "https://files.pythonhosted.org/packages/6d/16/a95b6757765b7b031c9374925bb718d55e0a9ba8a1b6a12d25962ea44347/pyyaml-6.0.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:44edc647873928551a01e7a563d7452ccdebee747728c1080d881d68af7b997e", size = 185826, upload-time = "2025-09-25T21:31:58.655Z" }, + { url = "https://files.pythonhosted.org/packages/16/19/13de8e4377ed53079ee996e1ab0a9c33ec2faf808a4647b7b4c0d46dd239/pyyaml-6.0.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:652cb6edd41e718550aad172851962662ff2681490a8a711af6a4d288dd96824", size = 175577, upload-time = "2025-09-25T21:32:00.088Z" }, + { url = "https://files.pythonhosted.org/packages/0c/62/d2eb46264d4b157dae1275b573017abec435397aa59cbcdab6fc978a8af4/pyyaml-6.0.3-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:10892704fc220243f5305762e276552a0395f7beb4dbf9b14ec8fd43b57f126c", size = 775556, upload-time = "2025-09-25T21:32:01.31Z" }, + { url = "https://files.pythonhosted.org/packages/10/cb/16c3f2cf3266edd25aaa00d6c4350381c8b012ed6f5276675b9eba8d9ff4/pyyaml-6.0.3-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:850774a7879607d3a6f50d36d04f00ee69e7fc816450e5f7e58d7f17f1ae5c00", size = 882114, upload-time = "2025-09-25T21:32:03.376Z" }, + { url = "https://files.pythonhosted.org/packages/71/60/917329f640924b18ff085ab889a11c763e0b573da888e8404ff486657602/pyyaml-6.0.3-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:b8bb0864c5a28024fac8a632c443c87c5aa6f215c0b126c449ae1a150412f31d", size = 806638, upload-time = "2025-09-25T21:32:04.553Z" }, + { url = "https://files.pythonhosted.org/packages/dd/6f/529b0f316a9fd167281a6c3826b5583e6192dba792dd55e3203d3f8e655a/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:1d37d57ad971609cf3c53ba6a7e365e40660e3be0e5175fa9f2365a379d6095a", size = 767463, upload-time = "2025-09-25T21:32:06.152Z" }, + { url = "https://files.pythonhosted.org/packages/f2/6a/b627b4e0c1dd03718543519ffb2f1deea4a1e6d42fbab8021936a4d22589/pyyaml-6.0.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:37503bfbfc9d2c40b344d06b2199cf0e96e97957ab1c1b546fd4f87e53e5d3e4", size = 794986, upload-time = "2025-09-25T21:32:07.367Z" }, + { url = "https://files.pythonhosted.org/packages/45/91/47a6e1c42d9ee337c4839208f30d9f09caa9f720ec7582917b264defc875/pyyaml-6.0.3-cp311-cp311-win32.whl", hash = "sha256:8098f252adfa6c80ab48096053f512f2321f0b998f98150cea9bd23d83e1467b", size = 142543, upload-time = "2025-09-25T21:32:08.95Z" }, + { url = "https://files.pythonhosted.org/packages/da/e3/ea007450a105ae919a72393cb06f122f288ef60bba2dc64b26e2646fa315/pyyaml-6.0.3-cp311-cp311-win_amd64.whl", hash = "sha256:9f3bfb4965eb874431221a3ff3fdcddc7e74e3b07799e0e84ca4a0f867d449bf", size = 158763, upload-time = "2025-09-25T21:32:09.96Z" }, + { 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" }, +] + +[[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/67/b9/52aa9ec2867528b54f1e60846728d8b4d84726630874fee3a91e66c7df81/pyzmq-27.1.0-cp310-cp310-macosx_10_15_universal2.whl", hash = "sha256:508e23ec9bc44c0005c4946ea013d9317ae00ac67778bd47519fdf5a0e930ff4", size = 1329850, upload-time = "2025-09-08T23:07:26.274Z" }, + { url = "https://files.pythonhosted.org/packages/99/64/5653e7b7425b169f994835a2b2abf9486264401fdef18df91ddae47ce2cc/pyzmq-27.1.0-cp310-cp310-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:507b6f430bdcf0ee48c0d30e734ea89ce5567fd7b8a0f0044a369c176aa44556", size = 906380, upload-time = "2025-09-08T23:07:29.78Z" }, + { url = "https://files.pythonhosted.org/packages/73/78/7d713284dbe022f6440e391bd1f3c48d9185673878034cfb3939cdf333b2/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:bf7b38f9fd7b81cb6d9391b2946382c8237fd814075c6aa9c3b746d53076023b", size = 666421, upload-time = "2025-09-08T23:07:31.263Z" }, + { url = "https://files.pythonhosted.org/packages/30/76/8f099f9d6482450428b17c4d6b241281af7ce6a9de8149ca8c1c649f6792/pyzmq-27.1.0-cp310-cp310-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:03ff0b279b40d687691a6217c12242ee71f0fba28bf8626ff50e3ef0f4410e1e", size = 854149, upload-time = "2025-09-08T23:07:33.17Z" }, + { url = "https://files.pythonhosted.org/packages/59/f0/37fbfff06c68016019043897e4c969ceab18bde46cd2aca89821fcf4fb2e/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:677e744fee605753eac48198b15a2124016c009a11056f93807000ab11ce6526", size = 1655070, upload-time = "2025-09-08T23:07:35.205Z" }, + { url = "https://files.pythonhosted.org/packages/47/14/7254be73f7a8edc3587609554fcaa7bfd30649bf89cd260e4487ca70fdaa/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:dd2fec2b13137416a1c5648b7009499bcc8fea78154cd888855fa32514f3dad1", size = 2033441, upload-time = "2025-09-08T23:07:37.432Z" }, + { url = "https://files.pythonhosted.org/packages/22/dc/49f2be26c6f86f347e796a4d99b19167fc94503f0af3fd010ad262158822/pyzmq-27.1.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:08e90bb4b57603b84eab1d0ca05b3bbb10f60c1839dc471fc1c9e1507bef3386", size = 1891529, upload-time = "2025-09-08T23:07:39.047Z" }, + { url = "https://files.pythonhosted.org/packages/a3/3e/154fb963ae25be70c0064ce97776c937ecc7d8b0259f22858154a9999769/pyzmq-27.1.0-cp310-cp310-win32.whl", hash = "sha256:a5b42d7a0658b515319148875fcb782bbf118dd41c671b62dae33666c2213bda", size = 567276, upload-time = "2025-09-08T23:07:40.695Z" }, + { url = "https://files.pythonhosted.org/packages/62/b2/f4ab56c8c595abcb26b2be5fd9fa9e6899c1e5ad54964e93ae8bb35482be/pyzmq-27.1.0-cp310-cp310-win_amd64.whl", hash = "sha256:c0bb87227430ee3aefcc0ade2088100e528d5d3298a0a715a64f3d04c60ba02f", size = 632208, upload-time = "2025-09-08T23:07:42.298Z" }, + { url = "https://files.pythonhosted.org/packages/3b/e3/be2cc7ab8332bdac0522fdb64c17b1b6241a795bee02e0196636ec5beb79/pyzmq-27.1.0-cp310-cp310-win_arm64.whl", hash = "sha256:9a916f76c2ab8d045b19f2286851a38e9ac94ea91faf65bd64735924522a8b32", size = 559766, upload-time = "2025-09-08T23:07:43.869Z" }, + { url = "https://files.pythonhosted.org/packages/06/5d/305323ba86b284e6fcb0d842d6adaa2999035f70f8c38a9b6d21ad28c3d4/pyzmq-27.1.0-cp311-cp311-macosx_10_15_universal2.whl", hash = "sha256:226b091818d461a3bef763805e75685e478ac17e9008f49fce2d3e52b3d58b86", size = 1333328, upload-time = "2025-09-08T23:07:45.946Z" }, + { url = "https://files.pythonhosted.org/packages/bd/a0/fc7e78a23748ad5443ac3275943457e8452da67fda347e05260261108cbc/pyzmq-27.1.0-cp311-cp311-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:0790a0161c281ca9723f804871b4027f2e8b5a528d357c8952d08cd1a9c15581", size = 908803, upload-time = "2025-09-08T23:07:47.551Z" }, + { url = "https://files.pythonhosted.org/packages/7e/22/37d15eb05f3bdfa4abea6f6d96eb3bb58585fbd3e4e0ded4e743bc650c97/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c895a6f35476b0c3a54e3eb6ccf41bf3018de937016e6e18748317f25d4e925f", size = 668836, upload-time = "2025-09-08T23:07:49.436Z" }, + { url = "https://files.pythonhosted.org/packages/b1/c4/2a6fe5111a01005fc7af3878259ce17684fabb8852815eda6225620f3c59/pyzmq-27.1.0-cp311-cp311-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5bbf8d3630bf96550b3be8e1fc0fea5cbdc8d5466c1192887bd94869da17a63e", size = 857038, upload-time = "2025-09-08T23:07:51.234Z" }, + { url = "https://files.pythonhosted.org/packages/cb/eb/bfdcb41d0db9cd233d6fb22dc131583774135505ada800ebf14dfb0a7c40/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:15c8bd0fe0dabf808e2d7a681398c4e5ded70a551ab47482067a572c054c8e2e", size = 1657531, upload-time = "2025-09-08T23:07:52.795Z" }, + { url = "https://files.pythonhosted.org/packages/ab/21/e3180ca269ed4a0de5c34417dfe71a8ae80421198be83ee619a8a485b0c7/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:bafcb3dd171b4ae9f19ee6380dfc71ce0390fefaf26b504c0e5f628d7c8c54f2", size = 2034786, upload-time = "2025-09-08T23:07:55.047Z" }, + { url = "https://files.pythonhosted.org/packages/3b/b1/5e21d0b517434b7f33588ff76c177c5a167858cc38ef740608898cd329f2/pyzmq-27.1.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e829529fcaa09937189178115c49c504e69289abd39967cd8a4c215761373394", size = 1894220, upload-time = "2025-09-08T23:07:57.172Z" }, + { url = "https://files.pythonhosted.org/packages/03/f2/44913a6ff6941905efc24a1acf3d3cb6146b636c546c7406c38c49c403d4/pyzmq-27.1.0-cp311-cp311-win32.whl", hash = "sha256:6df079c47d5902af6db298ec92151db82ecb557af663098b92f2508c398bb54f", size = 567155, upload-time = "2025-09-08T23:07:59.05Z" }, + { url = "https://files.pythonhosted.org/packages/23/6d/d8d92a0eb270a925c9b4dd039c0b4dc10abc2fcbc48331788824ef113935/pyzmq-27.1.0-cp311-cp311-win_amd64.whl", hash = "sha256:190cbf120fbc0fc4957b56866830def56628934a9d112aec0e2507aa6a032b97", size = 633428, upload-time = "2025-09-08T23:08:00.663Z" }, + { url = "https://files.pythonhosted.org/packages/ae/14/01afebc96c5abbbd713ecfc7469cfb1bc801c819a74ed5c9fad9a48801cb/pyzmq-27.1.0-cp311-cp311-win_arm64.whl", hash = "sha256:eca6b47df11a132d1745eb3b5b5e557a7dae2c303277aa0e69c6ba91b8736e07", size = 559497, upload-time = "2025-09-08T23:08:02.15Z" }, + { 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/f3/81/a65e71c1552f74dec9dff91d95bafb6e0d33338a8dfefbc88aa562a20c92/pyzmq-27.1.0-pp310-pypy310_pp73-macosx_10_15_x86_64.whl", hash = "sha256:c17e03cbc9312bee223864f1a2b13a99522e0dc9f7c5df0177cd45210ac286e6", size = 836266, upload-time = "2025-09-08T23:09:40.048Z" }, + { url = "https://files.pythonhosted.org/packages/58/ed/0202ca350f4f2b69faa95c6d931e3c05c3a397c184cacb84cb4f8f42f287/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:f328d01128373cb6763823b2b4e7f73bdf767834268c565151eacb3b7a392f90", size = 800206, upload-time = "2025-09-08T23:09:41.902Z" }, + { url = "https://files.pythonhosted.org/packages/47/42/1ff831fa87fe8f0a840ddb399054ca0009605d820e2b44ea43114f5459f4/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9c1790386614232e1b3a40a958454bdd42c6d1811837b15ddbb052a032a43f62", size = 567747, upload-time = "2025-09-08T23:09:43.741Z" }, + { url = "https://files.pythonhosted.org/packages/d1/db/5c4d6807434751e3f21231bee98109aa57b9b9b55e058e450d0aef59b70f/pyzmq-27.1.0-pp310-pypy310_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:448f9cb54eb0cee4732b46584f2710c8bc178b0e5371d9e4fc8125201e413a74", size = 747371, upload-time = "2025-09-08T23:09:45.575Z" }, + { url = "https://files.pythonhosted.org/packages/26/af/78ce193dbf03567eb8c0dc30e3df2b9e56f12a670bf7eb20f9fb532c7e8a/pyzmq-27.1.0-pp310-pypy310_pp73-win_amd64.whl", hash = "sha256:05b12f2d32112bf8c95ef2e74ec4f1d4beb01f8b5e703b38537f8849f92cb9ba", size = 544862, upload-time = "2025-09-08T23:09:47.448Z" }, + { url = "https://files.pythonhosted.org/packages/4c/c6/c4dcdecdbaa70969ee1fdced6d7b8f60cfabe64d25361f27ac4665a70620/pyzmq-27.1.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:18770c8d3563715387139060d37859c02ce40718d1faf299abddcdcc6a649066", size = 836265, upload-time = "2025-09-08T23:09:49.376Z" }, + { url = "https://files.pythonhosted.org/packages/3e/79/f38c92eeaeb03a2ccc2ba9866f0439593bb08c5e3b714ac1d553e5c96e25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux2014_i686.manylinux_2_17_i686.whl", hash = "sha256:ac25465d42f92e990f8d8b0546b01c391ad431c3bf447683fdc40565941d0604", size = 800208, upload-time = "2025-09-08T23:09:51.073Z" }, + { url = "https://files.pythonhosted.org/packages/49/0e/3f0d0d335c6b3abb9b7b723776d0b21fa7f3a6c819a0db6097059aada160/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53b40f8ae006f2734ee7608d59ed661419f087521edbfc2149c3932e9c14808c", size = 567747, upload-time = "2025-09-08T23:09:52.698Z" }, + { url = "https://files.pythonhosted.org/packages/a1/cf/f2b3784d536250ffd4be70e049f3b60981235d70c6e8ce7e3ef21e1adb25/pyzmq-27.1.0-pp311-pypy311_pp73-manylinux_2_26_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f605d884e7c8be8fe1aa94e0a783bf3f591b84c24e4bc4f3e7564c82ac25e271", size = 747371, upload-time = "2025-09-08T23:09:54.563Z" }, + { url = "https://files.pythonhosted.org/packages/01/1b/5dbe84eefc86f48473947e2f41711aded97eecef1231f4558f1f02713c12/pyzmq-27.1.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:c9f7f6e13dff2e44a6afeaf2cf54cee5929ad64afaf4d40b50f93c58fc687355", size = 544862, upload-time = "2025-09-08T23:09:56.509Z" }, +] + +[[package]] +name = "rarfile" +version = "4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/26/3f/3118a797444e7e30e784921c4bfafb6500fb288a0c84cb8c32ed15853c16/rarfile-4.2.tar.gz", hash = "sha256:8e1c8e72d0845ad2b32a47ab11a719bc2e41165ec101fd4d3fe9e92aa3f469ef", size = 153476, upload-time = "2024-04-03T17:10:53.798Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/62/fc/ab37559419ca36dd8dd317c3a98395ed4dcee2beeb28bf6059b972906727/rarfile-4.2-py3-none-any.whl", hash = "sha256:8757e1e3757e32962e229cab2432efc1f15f210823cc96ccba0f6a39d17370c9", size = 29052, upload-time = "2024-04-03T17:10:52.632Z" }, +] + +[[package]] +name = "ray" +version = "2.56.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "filelock" }, + { name = "jsonschema" }, + { name = "msgpack" }, + { name = "packaging" }, + { name = "protobuf" }, + { name = "pyyaml" }, + { name = "requests" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/c0/d6ffbe8ae2e2e10ea07aa08ea2dd35597239f0b3faaa29b5d7bbc405ab32/ray-2.56.0-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:f34b2345a47ad144292c1b34eeba2ed8d556078f7bd118d1adf2090d5199c843", size = 66362009, upload-time = "2026-06-29T20:50:14.442Z" }, + { url = "https://files.pythonhosted.org/packages/f1/15/037f9eac9d3d43079611ca6af58c34b2a4271b9a94d57679356981b7b8e9/ray-2.56.0-cp310-cp310-manylinux2014_aarch64.whl", hash = "sha256:15ea7ac36bfa3961c1eb2b2a099ed7dcf892f001f462920b6ec379ccafb038b0", size = 73212371, upload-time = "2026-06-29T20:50:21.349Z" }, + { url = "https://files.pythonhosted.org/packages/b0/a3/2d0fbe2d8808ae8837885051f149cefdca3e869eaef4c65618173fa63db5/ray-2.56.0-cp310-cp310-manylinux2014_x86_64.whl", hash = "sha256:58be75df2d4a6a85b5e514e4d3261760fe21cc09ba974ce22cc08a8e4e07c449", size = 74067715, upload-time = "2026-06-29T20:50:26.661Z" }, + { url = "https://files.pythonhosted.org/packages/9d/05/70492aed281a235421ffd116b2eb74f127f387580bb63a7f8ce5c901169e/ray-2.56.0-cp310-cp310-win_amd64.whl", hash = "sha256:b837c5a905647c9b6a4f55061c2782437da24009e4eb4781db1c9c4badc84d0b", size = 28394809, upload-time = "2026-06-29T20:50:31.035Z" }, + { url = "https://files.pythonhosted.org/packages/7b/f2/2cbbbef7a67adc6555b141c7a67557bd7ce21cfb85b85772627c6a582e97/ray-2.56.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:a9ad4e26941eb2f8dbd494ad07f9f2227143164c6114132b26b23ad4f20b1c6f", size = 66354212, upload-time = "2026-06-29T20:50:37.148Z" }, + { url = "https://files.pythonhosted.org/packages/d6/69/09c8320519aa4d075bd6ecb1694c28d26b5b07a5b46050703d9ac2c5a9b6/ray-2.56.0-cp311-cp311-manylinux2014_aarch64.whl", hash = "sha256:aea655831d25084cb343002a8e67a77b6aa552ddb776a65461d49f62884f096a", size = 73299499, upload-time = "2026-06-29T20:50:42.584Z" }, + { url = "https://files.pythonhosted.org/packages/18/d3/84df370c773a0b853abdba498a6258106cb928d452ff56eec7f86c2f80b4/ray-2.56.0-cp311-cp311-manylinux2014_x86_64.whl", hash = "sha256:c5bf1a4384c0e2aa4420c95474b734d064cac354b0f00760be02d886afe96ca4", size = 74143858, upload-time = "2026-06-29T20:50:48.228Z" }, + { url = "https://files.pythonhosted.org/packages/5a/1b/0b4c96879ded375d0b35441c6b3633ccbea7c7c5448335589811fe5f275c/ray-2.56.0-cp311-cp311-win_amd64.whl", hash = "sha256:8e57781685bb4332edf8a7cfb1135ff53d50002b6a0504006e68365bcd26aa7c", size = 28390306, upload-time = "2026-06-29T20:50:53.841Z" }, + { url = "https://files.pythonhosted.org/packages/05/d2/83777f52c10e04654c162bfa093f4e34cf6decf7a0bb4311e2432bfa8ecb/ray-2.56.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:684a427c50745989e92a332343f0812c93b8506f71c768b95b1eefc113492699", size = 66344824, upload-time = "2026-06-29T20:50:58.367Z" }, + { url = "https://files.pythonhosted.org/packages/6e/b2/d610ffe2878dae8ab903cfdded883a054c102b0104670bca7b34b662db51/ray-2.56.0-cp312-cp312-manylinux2014_aarch64.whl", hash = "sha256:e1fd03c6ecc5fe4c31466569e41ce0a4faf26fb930798c9d1f1eb1f405a687c8", size = 73317367, upload-time = "2026-06-29T20:51:03.893Z" }, + { url = "https://files.pythonhosted.org/packages/39/d1/8d442116f41e6bebec418d89f1556c67c77d593b55cf59e716503e7a4a17/ray-2.56.0-cp312-cp312-manylinux2014_x86_64.whl", hash = "sha256:78ef34a71383c1fcf335e531e0e590867857fce9069f06ed351be6ce7a58fc50", size = 74192607, upload-time = "2026-06-29T20:51:09.528Z" }, + { url = "https://files.pythonhosted.org/packages/b9/9e/cac7454325c79eb32f36f233285d9179858c7073bc27ac91afb74854ff12/ray-2.56.0-cp312-cp312-win_amd64.whl", hash = "sha256:a8fc809dab6fc07cf05d45ea93a776c852c990512eb1fac0e3d15819fe6df10a", size = 28370978, upload-time = "2026-06-29T20:51:14.168Z" }, +] + +[package.optional-dependencies] +default = [ + { name = "aiohttp" }, + { name = "aiohttp-cors" }, + { name = "colorful" }, + { name = "grpcio" }, + { name = "opencensus" }, + { name = "opentelemetry-exporter-prometheus" }, + { name = "opentelemetry-proto" }, + { name = "opentelemetry-sdk" }, + { name = "prometheus-client" }, + { name = "py-spy" }, + { name = "pydantic" }, + { name = "requests" }, + { name = "smart-open" }, + { name = "virtualenv" }, +] + +[[package]] +name = "referencing" +version = "0.37.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "attrs" }, + { name = "rpds-py", version = "0.30.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "rpds-py", version = "2026.6.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/22/f5/df4e9027acead3ecc63e50fe1e36aca1523e1719559c499951bb4b53188f/referencing-0.37.0.tar.gz", hash = "sha256:44aefc3142c5b842538163acb373e24cce6632bd54bdb01b21ad5863489f50d8", size = 78036, upload-time = "2025-10-13T15:30:48.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/2c/58/ca301544e1fa93ed4f80d724bf5b194f6e4b945841c5bfd555878eea9fcb/referencing-0.37.0-py3-none-any.whl", hash = "sha256:381329a9f99628c9069361716891d34ad94af76e461dcb0335825aecc7692231", size = 26766, upload-time = "2025-10-13T15:30:47.625Z" }, +] + +[[package]] +name = "regex" +version = "2026.6.28" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f1/05/e4f219230e11e774a6c9987d2ab0d0c6b8573e13a17e143d0015bee710ef/regex-2026.6.28.tar.gz", hash = "sha256:3cb4b6c5cb3060cc31efdc1fbb27c25fb9b29044afd87e40601a1c4d9db54342", size = 416101, upload-time = "2026-06-28T19:56:55.302Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/dc/f7a8c9cf0768f704153d358fae2bc883199bc4ea1e4aa458f1be9d0ef2ce/regex-2026.6.28-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:b83932645630965fd860fdb70ebbf964bf3e8007f08851ea424d01f8d35454a8", size = 489471, upload-time = "2026-06-28T19:53:06.385Z" }, + { url = "https://files.pythonhosted.org/packages/44/b3/9786a4a2133e2f1cc5897ed3d2da3da29ff54b775ffa38bc5935fc24be82/regex-2026.6.28-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:e81f1952355042e517dc9861ce65c676e4a098f42402993c40461786d1f794d4", size = 291294, upload-time = "2026-06-28T19:53:09.232Z" }, + { url = "https://files.pythonhosted.org/packages/dd/1f/bfe5b529257f0853aa6b94146e0f6462f4d45aa4f3c05d5a828f415dfd40/regex-2026.6.28-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:2097591101d70bcc108af64c46f6066bb698ee067fec5f75beac0be317639311", size = 289216, upload-time = "2026-06-28T19:53:10.682Z" }, + { url = "https://files.pythonhosted.org/packages/25/56/f615165e90ac5f3b72b249240643439520bbac0ac60a9de06868528eba4c/regex-2026.6.28-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:31d7538a614b5842bf53ce329d07b43f97754ca7e6db8d69f347e071bce1c953", size = 784787, upload-time = "2026-06-28T19:53:12.393Z" }, + { url = "https://files.pythonhosted.org/packages/04/94/c9e3ad31b3d5fbe1228fee8319e0c02a5460296624f220d08764547fe6ae/regex-2026.6.28-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5561e47bbe2b75373b695326507743fcdd4d2cc7f5022312024ccf39fa094e0", size = 852137, upload-time = "2026-06-28T19:53:14.287Z" }, + { url = "https://files.pythonhosted.org/packages/c0/77/d506a428e446466ee298f5425a774737d0671d070425ed794bb3314d60c6/regex-2026.6.28-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:c10f2c5a55ab3dd8318d8ad5f11b530e2691c0edebebde7713066f484902c3fb", size = 899525, upload-time = "2026-06-28T19:53:15.987Z" }, + { url = "https://files.pythonhosted.org/packages/aa/72/becc00d839f19401f10a20168b44711c7b02f7f62bba875b2d8f98417435/regex-2026.6.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:23f7e0cc60c72486b42a685f1ff4eec90d50d4fb05e4f9c7d5363b03aa02600d", size = 794116, upload-time = "2026-06-28T19:53:17.372Z" }, + { url = "https://files.pythonhosted.org/packages/fa/11/ea2ca423eeaac2e18077a18b058614e9201f130750df2126d444e39acab2/regex-2026.6.28-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:76493755f79a88d5ed2c9e63a41d3c05997e0a7ffbe76ed8c4ded8be35b8b14c", size = 786257, upload-time = "2026-06-28T19:53:18.712Z" }, + { url = "https://files.pythonhosted.org/packages/6d/9e/f5bf7ecbd14ff2086f015c54dc24fd0d74ba5327fef0de479213f8128615/regex-2026.6.28-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:ff0f41a00f23ea5054acb61901380c41813d813eee3f80f800995710bcc52ecd", size = 769914, upload-time = "2026-06-28T19:53:20.564Z" }, + { url = "https://files.pythonhosted.org/packages/43/04/f9040a5360a06241ba5b7f2e6f1c6184e104a84e6f6522535700e94bf8e2/regex-2026.6.28-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:3c60b297292e7e1ef5d02a4759f9e452ee4c8bb95e168d8fd0b5db01bd806f9f", size = 775013, upload-time = "2026-06-28T19:53:22.067Z" }, + { url = "https://files.pythonhosted.org/packages/73/97/4e46f7abf2f864319d2bcac609af3c0532968c66a3364337778fd232b83c/regex-2026.6.28-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:a7cf03c87f7b9cbc25a8894cf9be83818406677b6b391b003ec7c884923387b5", size = 848814, upload-time = "2026-06-28T19:53:24.575Z" }, + { url = "https://files.pythonhosted.org/packages/f7/b8/3d1f995727799a1e2e693e397acb7358094606e5591b6b5fd3128d2d1409/regex-2026.6.28-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:418208ea0af51cfed4f46eb9b1ea7cfc990ca284f0084ecbd951460fb089421e", size = 757702, upload-time = "2026-06-28T19:53:26.215Z" }, + { url = "https://files.pythonhosted.org/packages/20/10/fd5653b8572910a4fe9055f8959b070d7d9443c94ce986529fcdb5fb2a3c/regex-2026.6.28-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:7635fa2cddb917a6bbfac7890602573d2d8c4e470703b0640e6f86a988817ec3", size = 837140, upload-time = "2026-06-28T19:53:27.655Z" }, + { url = "https://files.pythonhosted.org/packages/5d/31/da77e3ef7b594a2aacbd03ce3d0050f33ab3e021df50c6901467c9006511/regex-2026.6.28-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7bb96c13d6cf5880d31bbef84ca701a64d738aa491c2b79975cc33f8ad00a31e", size = 782105, upload-time = "2026-06-28T19:53:29.375Z" }, + { url = "https://files.pythonhosted.org/packages/cd/4d/c379001448d0f58b6946f168d4af96ad60a16c1553259c27b0df8701b640/regex-2026.6.28-cp310-cp310-win32.whl", hash = "sha256:56f05194c4843957dd8b3af87eb0c52d8cf0509e7f18e172d727f5f8ff840646", size = 266728, upload-time = "2026-06-28T19:53:31.813Z" }, + { url = "https://files.pythonhosted.org/packages/f3/8f/cb656529efa87d74cce0d69e606c745537016da3bdfae78f342af2242ee3/regex-2026.6.28-cp310-cp310-win_amd64.whl", hash = "sha256:70710927033af3b54369f17aaba1343b97a23d0b1aa994fa1512b08b1b8c136a", size = 277901, upload-time = "2026-06-28T19:53:33.293Z" }, + { url = "https://files.pythonhosted.org/packages/7b/ac/d35ccc309c9409406445ab2ef0b56f6a341a916ccff49ff9ac5cc6bb8e9b/regex-2026.6.28-cp310-cp310-win_arm64.whl", hash = "sha256:ed7b30185ee3f8b9b053b0be567b4d226016e2afbebc17fde1c6a4580937b688", size = 276880, upload-time = "2026-06-28T19:53:35.029Z" }, + { url = "https://files.pythonhosted.org/packages/72/db/9051b36294bdbabaa9c7db57db0fbcdfbd17f7a106c539bb423d0323faea/regex-2026.6.28-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:a71b51dd08b9b62f055fafab3dee8af8bd2ec81b373a44caef18d6c5ca28f43a", size = 489481, upload-time = "2026-06-28T19:53:36.684Z" }, + { url = "https://files.pythonhosted.org/packages/35/3f/24097a3c3ff30f9a639888900faaecabcf5f54a5bc9c851c297e11b349ef/regex-2026.6.28-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9c26a47770d30a0f85c01e261d2a3ebc342c4af6fd666dbd8c1fe4cbf3adf726", size = 291292, upload-time = "2026-06-28T19:53:38.39Z" }, + { url = "https://files.pythonhosted.org/packages/5e/cc/e0d762a189cfb4e8926d16e691720690d139a977b38fdb80230c259332ab/regex-2026.6.28-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:e5efbc1af38f97e300d43028e5a92e752d924bcfb7f465d8669d5d5a6e78c233", size = 289232, upload-time = "2026-06-28T19:53:40.181Z" }, + { url = "https://files.pythonhosted.org/packages/4b/c8/ca0ac7f09cc88ca61e0c61c53f7db29334f660ffba5d0b52378e7c44723c/regex-2026.6.28-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:f1758df6fdd8c800620a5638958720e8a635e1da49a2f09df2dd63e94a24ec4a", size = 792332, upload-time = "2026-06-28T19:53:41.782Z" }, + { url = "https://files.pythonhosted.org/packages/8e/92/04ae94cbe0dd1f478b2aef6c46f995bb6946d3e338d4b28605478b66a2b7/regex-2026.6.28-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ad73ecf20c1ef5c975639f8bf845a9370fcf7dada7edc1e3b0bca20e2f8202f6", size = 861743, upload-time = "2026-06-28T19:53:43.261Z" }, + { url = "https://files.pythonhosted.org/packages/4c/ec/024d7638c807679ff8a0e6081d01d66c7762339af1cac71e45911587ff9a/regex-2026.6.28-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:4d80c798b0eec6ea3d45f8816a1e8886c5664615d347d89e8c075b576a1b5a5d", size = 906481, upload-time = "2026-06-28T19:53:44.948Z" }, + { url = "https://files.pythonhosted.org/packages/cd/fd/93bfe5af45f0be4fa8983945455c0e6924e1aeb879cde227958869c1e71c/regex-2026.6.28-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:a361feeaf1b6ba1df060f2ff5c5947092edf537a35ce78e76387ac56d3e0f4a4", size = 799867, upload-time = "2026-06-28T19:53:46.997Z" }, + { url = "https://files.pythonhosted.org/packages/ee/fd/e5d965d41f2398c8ce0f37a4652f03bb297fd009bb796d390134225dda12/regex-2026.6.28-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:8b92366d9c8bba9642989534073662abdd9b41faf7603a7ae71597833f3b88f0", size = 773632, upload-time = "2026-06-28T19:53:48.892Z" }, + { url = "https://files.pythonhosted.org/packages/eb/d9/ff39afaec92b9ee2dba0302a4783976005091681069808938c31cf8df3b6/regex-2026.6.28-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:11251768cc23f097dd61b18f67966e70f74da822784d17e12a444eb6b29d4288", size = 781669, upload-time = "2026-06-28T19:53:50.693Z" }, + { url = "https://files.pythonhosted.org/packages/45/4e/e2fd4bb8228e10c24af2d7ff867182372190e498eab9fd29cbe54c403c95/regex-2026.6.28-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:ad5c67786145ec28a71a267d9f9d92bdc8d70d65541eea852c253f520a01f918", size = 854497, upload-time = "2026-06-28T19:53:52.323Z" }, + { url = "https://files.pythonhosted.org/packages/72/7c/f0340384a973082979064156d05f3d2cc1dced7371efcd7a1b45726a1a8a/regex-2026.6.28-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:f1da438e739765c3e85175ede05816cbede3caaacb1e0680568bda6119bfdfca", size = 763335, upload-time = "2026-06-28T19:53:54.024Z" }, + { url = "https://files.pythonhosted.org/packages/e1/32/90ce0d0898e205506cc22b9c81cfb16b722e06ca5f50fad51c053c2a727b/regex-2026.6.28-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d98b639046e51c5de64d9f77351532105e99ca271cb6f7640e1f903d6ab63032", size = 844615, upload-time = "2026-06-28T19:53:56.216Z" }, + { url = "https://files.pythonhosted.org/packages/6a/ef/55abb149599dce1ade687170557129524011eeb3d92afe02429cea7754a2/regex-2026.6.28-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1e164ace4dbab5c6ad4a4ac7c41a2638fe226d0c770a86f2eb041f594bac6ee7", size = 789193, upload-time = "2026-06-28T19:53:57.791Z" }, + { url = "https://files.pythonhosted.org/packages/f8/ea/cf7f6f6f152e52fdad978b913bf24c14df647eca0f81ef31f3aee0be8982/regex-2026.6.28-cp311-cp311-win32.whl", hash = "sha256:3169a3159e4d99d9ae85ff0ed90ef3b8906cc3152653b6078b842ace6c8f72c3", size = 266731, upload-time = "2026-06-28T19:53:59.938Z" }, + { url = "https://files.pythonhosted.org/packages/c6/cf/a48d8e8d406b22481cad146f48fa0dfca3c5f402b91f26d8e5a0fe4f513d/regex-2026.6.28-cp311-cp311-win_amd64.whl", hash = "sha256:5977295b0a74e8241df8a4b3b27b12412a831f6fa32ee8b755039592cd768c3d", size = 277918, upload-time = "2026-06-28T19:54:01.502Z" }, + { url = "https://files.pythonhosted.org/packages/89/b2/a222392207db7ed86281a732a99f7cf7f2bb35d332799e892b8510be000e/regex-2026.6.28-cp311-cp311-win_arm64.whl", hash = "sha256:f5fbaef40c3e9282ccee4b075f5600a0d858aa0c34147732f1baa69c8188a95d", size = 276876, upload-time = "2026-06-28T19:54:03.411Z" }, + { url = "https://files.pythonhosted.org/packages/da/21/44aa415873032056c43eac21c67285deb2cf66cddb2a964c3cdc8f803efc/regex-2026.6.28-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:81cc5793ad33a10444445e8d29d3c73e752c8fb2e120772d70fcb6d41df40fe1", size = 490480, upload-time = "2026-06-28T19:54:05.392Z" }, + { url = "https://files.pythonhosted.org/packages/8b/5f/30d4116093c2128099f78b6990dfc1698fdbf3ee528f1e1c647378034c79/regex-2026.6.28-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:e18225243250a1f7d7e5e5d883f3b96465cd79031acf5c6db902b7025f2125d9", size = 292137, upload-time = "2026-06-28T19:54:07.088Z" }, + { url = "https://files.pythonhosted.org/packages/cb/0e/ca20a0e0de49837e6337603a91ab77556aa27033ac5b975615d98698cfb3/regex-2026.6.28-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:ecd1638b1c2db1f2d01c182a4b0d3e2e88b0e99910320a745c1727ee3638ddab", size = 289623, upload-time = "2026-06-28T19:54:08.762Z" }, + { url = "https://files.pythonhosted.org/packages/50/11/c013422a7e2c59946df8ac93e792a4922c98287f2a2181341603c78a5d98/regex-2026.6.28-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4303ebe16b74eeb3fe2715745023266fea92fd44a23f3e7bb2fb48c7a7bbc195", size = 796756, upload-time = "2026-06-28T19:54:10.616Z" }, + { url = "https://files.pythonhosted.org/packages/b0/95/1309645a0e1ee6fb91d954501da57a0b33d50ad2a9acb313702851a7054e/regex-2026.6.28-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:56b856b70b96c381d837f609eee442a1bd320cd2159f5c294b679552fb1a7eaf", size = 865465, upload-time = "2026-06-28T19:54:12.742Z" }, + { url = "https://files.pythonhosted.org/packages/20/06/491802db47c6f5e2904ffa2518ad3ac27fe6bbf5a66d73210a95cc080d47/regex-2026.6.28-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f74675ab76ab1d005ffba4dee308e53e89efc22be6e9f9fae5b539a3f81bdff2", size = 912350, upload-time = "2026-06-28T19:54:14.508Z" }, + { url = "https://files.pythonhosted.org/packages/5e/60/3ba57840bcc7e2367090360de0c15a5ba6ad22be89314251105f2e943f43/regex-2026.6.28-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:90581684565a93f7258af1e5d3f41ef20d7d7c61f2a428183a342bcb65485e38", size = 801261, upload-time = "2026-06-28T19:54:16.432Z" }, + { url = "https://files.pythonhosted.org/packages/eb/27/af1eb74e9a78c782b3e450b611a595e44906da8a5107e1227f4a7fd0480b/regex-2026.6.28-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:28f9e6c28f9b90f6f784595a33240a57e181e61b6ee3dc259b25c61e356d1aa3", size = 777072, upload-time = "2026-06-28T19:54:18.128Z" }, + { url = "https://files.pythonhosted.org/packages/20/18/fdd4c883a39e3ed00d669062af1135809bfd3281bf528150849fbd68825b/regex-2026.6.28-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:378a71d861fc7c8806b04ac5b133d53c0e774f92f5d9663a539872d3fa2b0417", size = 785119, upload-time = "2026-06-28T19:54:20.314Z" }, + { url = "https://files.pythonhosted.org/packages/1c/79/0aabe34b8482dcadf64355f70f96e22eba5ec6c1efb33563f89654f4061c/regex-2026.6.28-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:4cc199874ecd6267a49b111052250825bfe19b5101b23b2ba80f54efa3e0994e", size = 860118, upload-time = "2026-06-28T19:54:22.368Z" }, + { url = "https://files.pythonhosted.org/packages/a8/2c/c973323306a27c9db7d160e9584eb7e0ece2a96224ccb0d39060558b31f9/regex-2026.6.28-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:b916a10431494ef4b4d62c6c89cab6426af7873125b8cd6c15811bf5fc58eec8", size = 765786, upload-time = "2026-06-28T19:54:24.265Z" }, + { url = "https://files.pythonhosted.org/packages/e3/df/9ca3e378e352242a4cb45573a5e9162c3ee791507702a23966fa559e36b5/regex-2026.6.28-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:2e27727fba075f1e4409416d2f537d4c30fc11f012ea507f7bd74d3e19ecb57a", size = 852120, upload-time = "2026-06-28T19:54:25.972Z" }, + { url = "https://files.pythonhosted.org/packages/a2/3e/3e31e255c4971f53cbce6306b5e3c76cbd3735a54f419bb3b2f194e9f68c/regex-2026.6.28-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:700fc6a7844bb2c4149292ac79d1df8841a00acd4d45cd32c1ebc7bcc1fd0da8", size = 789503, upload-time = "2026-06-28T19:54:27.678Z" }, + { url = "https://files.pythonhosted.org/packages/72/01/d36561c21c3033d7eeb31d51b491916817de7861acefccc5fc9db8a5037c/regex-2026.6.28-cp312-cp312-win32.whl", hash = "sha256:03376d60b6a11aecb88a79fa2be06b40faa01c6693bc31ef69435cd4818b9463", size = 267109, upload-time = "2026-06-28T19:54:29.316Z" }, + { url = "https://files.pythonhosted.org/packages/a0/59/bbbb0591f38b18c65977cd65ce64749eba1c1996c99ac04e900fc30c0dcb/regex-2026.6.28-cp312-cp312-win_amd64.whl", hash = "sha256:fbd2ded482bf99e6651992bbfcde460272724d4bbc49ef3d6b46d9312867ec84", size = 277711, upload-time = "2026-06-28T19:54:31.143Z" }, + { url = "https://files.pythonhosted.org/packages/86/06/be4f6b337d773ae5739a1bc238f97c16926e72017243735853c030f4c628/regex-2026.6.28-cp312-cp312-win_arm64.whl", hash = "sha256:37294d3d7ddb64c7e89184b2894e0f8f0a19c514bc59513d71fe692c3a8d5fc6", size = 277022, upload-time = "2026-06-28T19:54:32.97Z" }, +] + +[[package]] +name = "requests" +version = "2.34.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "certifi" }, + { name = "charset-normalizer" }, + { name = "idna" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ac/c3/e2a2b89f2d3e2179abd6d00ebd70bff6273f37fb3e0cc209f48b39d00cbf/requests-2.34.2.tar.gz", hash = "sha256:f288924cae4e29463698d6d60bc6a4da69c89185ad1e0bcc4104f584e960b9ed", size = 142856, upload-time = "2026-05-14T19:25:27.735Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a0/f4/c67b0b3f1b9245e8d266f0f112c500d50e5b4e83cb6f3b71b6528104182a/requests-2.34.2-py3-none-any.whl", hash = "sha256:2a0d60c172f83ac6ab31e4554906c0f3b3588d37b5cb939b1c061f4907e278e0", size = 73075, upload-time = "2026-05-14T19:25:26.443Z" }, +] + +[[package]] +name = "requests-oauthlib" +version = "2.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "oauthlib" }, + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/42/f2/05f29bc3913aea15eb670be136045bf5c5bbf4b99ecb839da9b422bb2c85/requests-oauthlib-2.0.0.tar.gz", hash = "sha256:b3dffaebd884d8cd778494369603a9e7b58d29111bf6b41bdc2dcd87203af4e9", size = 55650, upload-time = "2024-03-22T20:32:29.939Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3b/5d/63d4ae3b9daea098d5d6f5da83984853c1bbacd5dc826764b249fe119d24/requests_oauthlib-2.0.0-py2.py3-none-any.whl", hash = "sha256:7dd8a5c40426b779b0868c404bdef9768deccf22749cde15852df527e6269b36", size = 24179, upload-time = "2024-03-22T20:32:28.055Z" }, +] + +[[package]] +name = "requests-toolbelt" +version = "1.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "requests" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f3/61/d7545dafb7ac2230c70d38d31cbfe4cc64f7144dc41f6e4e4b78ecd9f5bb/requests-toolbelt-1.0.0.tar.gz", hash = "sha256:7681a0a3d047012b5bdc0ee37d7f8f07ebe76ab08caeccfc3921ce23c88d5bc6", size = 206888, upload-time = "2023-05-01T04:11:33.229Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/51/d4db610ef29373b879047326cbf6fa98b6c1969d6f6dc423279de2b1be2c/requests_toolbelt-1.0.0-py2.py3-none-any.whl", hash = "sha256:cccfdd665f0a24fcf4726e690f65639d272bb0637b9b92dfd91a5568ccf6bd06", size = 54481, upload-time = "2023-05-01T04:11:28.427Z" }, +] + +[[package]] +name = "retrying" +version = "1.4.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/c8/5a/b17e1e257d3e6f2e7758930e1256832c9ddd576f8631781e6a072914befa/retrying-1.4.2.tar.gz", hash = "sha256:d102e75d53d8d30b88562d45361d6c6c934da06fab31bd81c0420acb97a8ba39", size = 11411, upload-time = "2025-08-03T03:35:25.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/67/f3/6cd296376653270ac1b423bb30bd70942d9916b6978c6f40472d6ac038e7/retrying-1.4.2-py3-none-any.whl", hash = "sha256:bbc004aeb542a74f3569aeddf42a2516efefcdaff90df0eb38fbfbf19f179f59", size = 10859, upload-time = "2025-08-03T03:35:23.829Z" }, +] + +[[package]] +name = "rich" +version = "15.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "markdown-it-py" }, + { name = "pygments" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c0/8f/0722ca900cc807c13a6a0c696dacf35430f72e0ec571c4275d2371fca3e9/rich-15.0.0.tar.gz", hash = "sha256:edd07a4824c6b40189fb7ac9bc4c52536e9780fbbfbddf6f1e2502c31b068c36", size = 230680, upload-time = "2026-04-12T08:24:00.75Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/82/3b/64d4899d73f91ba49a8c18a8ff3f0ea8f1c1d75481760df8c68ef5235bf5/rich-15.0.0-py3-none-any.whl", hash = "sha256:33bd4ef74232fb73fe9279a257718407f169c09b78a87ad3d296f548e27de0bb", size = 310654, upload-time = "2026-04-12T08:24:02.83Z" }, +] + +[[package]] +name = "rpds-py" +version = "0.30.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/20/af/3f2f423103f1113b36230496629986e0ef7e199d2aa8392452b484b38ced/rpds_py-0.30.0.tar.gz", hash = "sha256:dd8ff7cf90014af0c0f787eea34794ebf6415242ee1d6fa91eaba725cc441e84", size = 69469, upload-time = "2025-11-30T20:24:38.837Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/06/0c/0c411a0ec64ccb6d104dcabe0e713e05e153a9a2c3c2bd2b32ce412166fe/rpds_py-0.30.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:679ae98e00c0e8d68a7fda324e16b90fd5260945b45d3b824c892cec9eea3288", size = 370490, upload-time = "2025-11-30T20:21:33.256Z" }, + { url = "https://files.pythonhosted.org/packages/19/6a/4ba3d0fb7297ebae71171822554abe48d7cab29c28b8f9f2c04b79988c05/rpds_py-0.30.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4cc2206b76b4f576934f0ed374b10d7ca5f457858b157ca52064bdfc26b9fc00", size = 359751, upload-time = "2025-11-30T20:21:34.591Z" }, + { url = "https://files.pythonhosted.org/packages/cd/7c/e4933565ef7f7a0818985d87c15d9d273f1a649afa6a52ea35ad011195ea/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:389a2d49eded1896c3d48b0136ead37c48e221b391c052fba3f4055c367f60a6", size = 389696, upload-time = "2025-11-30T20:21:36.122Z" }, + { url = "https://files.pythonhosted.org/packages/5e/01/6271a2511ad0815f00f7ed4390cf2567bec1d4b1da39e2c27a41e6e3b4de/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:32c8528634e1bf7121f3de08fa85b138f4e0dc47657866630611b03967f041d7", size = 403136, upload-time = "2025-11-30T20:21:37.728Z" }, + { url = "https://files.pythonhosted.org/packages/55/64/c857eb7cd7541e9b4eee9d49c196e833128a55b89a9850a9c9ac33ccf897/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f207f69853edd6f6700b86efb84999651baf3789e78a466431df1331608e5324", size = 524699, upload-time = "2025-11-30T20:21:38.92Z" }, + { url = "https://files.pythonhosted.org/packages/9c/ed/94816543404078af9ab26159c44f9e98e20fe47e2126d5d32c9d9948d10a/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:67b02ec25ba7a9e8fa74c63b6ca44cf5707f2fbfadae3ee8e7494297d56aa9df", size = 412022, upload-time = "2025-11-30T20:21:40.407Z" }, + { url = "https://files.pythonhosted.org/packages/61/b5/707f6cf0066a6412aacc11d17920ea2e19e5b2f04081c64526eb35b5c6e7/rpds_py-0.30.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:0c0e95f6819a19965ff420f65578bacb0b00f251fefe2c8b23347c37174271f3", size = 390522, upload-time = "2025-11-30T20:21:42.17Z" }, + { url = "https://files.pythonhosted.org/packages/13/4e/57a85fda37a229ff4226f8cbcf09f2a455d1ed20e802ce5b2b4a7f5ed053/rpds_py-0.30.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:a452763cc5198f2f98898eb98f7569649fe5da666c2dc6b5ddb10fde5a574221", size = 404579, upload-time = "2025-11-30T20:21:43.769Z" }, + { url = "https://files.pythonhosted.org/packages/f9/da/c9339293513ec680a721e0e16bf2bac3db6e5d7e922488de471308349bba/rpds_py-0.30.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:e0b65193a413ccc930671c55153a03ee57cecb49e6227204b04fae512eb657a7", size = 421305, upload-time = "2025-11-30T20:21:44.994Z" }, + { url = "https://files.pythonhosted.org/packages/f9/be/522cb84751114f4ad9d822ff5a1aa3c98006341895d5f084779b99596e5c/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:858738e9c32147f78b3ac24dc0edb6610000e56dc0f700fd5f651d0a0f0eb9ff", size = 572503, upload-time = "2025-11-30T20:21:46.91Z" }, + { url = "https://files.pythonhosted.org/packages/a2/9b/de879f7e7ceddc973ea6e4629e9b380213a6938a249e94b0cdbcc325bb66/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:da279aa314f00acbb803da1e76fa18666778e8a8f83484fba94526da5de2cba7", size = 598322, upload-time = "2025-11-30T20:21:48.709Z" }, + { url = "https://files.pythonhosted.org/packages/48/ac/f01fc22efec3f37d8a914fc1b2fb9bcafd56a299edbe96406f3053edea5a/rpds_py-0.30.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:7c64d38fb49b6cdeda16ab49e35fe0da2e1e9b34bc38bd78386530f218b37139", size = 560792, upload-time = "2025-11-30T20:21:50.024Z" }, + { url = "https://files.pythonhosted.org/packages/e2/da/4e2b19d0f131f35b6146425f846563d0ce036763e38913d917187307a671/rpds_py-0.30.0-cp310-cp310-win32.whl", hash = "sha256:6de2a32a1665b93233cde140ff8b3467bdb9e2af2b91079f0333a0974d12d464", size = 221901, upload-time = "2025-11-30T20:21:51.32Z" }, + { url = "https://files.pythonhosted.org/packages/96/cb/156d7a5cf4f78a7cc571465d8aec7a3c447c94f6749c5123f08438bcf7bc/rpds_py-0.30.0-cp310-cp310-win_amd64.whl", hash = "sha256:1726859cd0de969f88dc8673bdd954185b9104e05806be64bcd87badbe313169", size = 235823, upload-time = "2025-11-30T20:21:52.505Z" }, + { url = "https://files.pythonhosted.org/packages/4d/6e/f964e88b3d2abee2a82c1ac8366da848fce1c6d834dc2132c3fda3970290/rpds_py-0.30.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:a2bffea6a4ca9f01b3f8e548302470306689684e61602aa3d141e34da06cf425", size = 370157, upload-time = "2025-11-30T20:21:53.789Z" }, + { url = "https://files.pythonhosted.org/packages/94/ba/24e5ebb7c1c82e74c4e4f33b2112a5573ddc703915b13a073737b59b86e0/rpds_py-0.30.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc4f992dfe1e2bc3ebc7444f6c7051b4bc13cd8e33e43511e8ffd13bf407010d", size = 359676, upload-time = "2025-11-30T20:21:55.475Z" }, + { url = "https://files.pythonhosted.org/packages/84/86/04dbba1b087227747d64d80c3b74df946b986c57af0a9f0c98726d4d7a3b/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:422c3cb9856d80b09d30d2eb255d0754b23e090034e1deb4083f8004bd0761e4", size = 389938, upload-time = "2025-11-30T20:21:57.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/bb/1463f0b1722b7f45431bdd468301991d1328b16cffe0b1c2918eba2c4eee/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:07ae8a593e1c3c6b82ca3292efbe73c30b61332fd612e05abee07c79359f292f", size = 402932, upload-time = "2025-11-30T20:21:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/99/ee/2520700a5c1f2d76631f948b0736cdf9b0acb25abd0ca8e889b5c62ac2e3/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:12f90dd7557b6bd57f40abe7747e81e0c0b119bef015ea7726e69fe550e394a4", size = 525830, upload-time = "2025-11-30T20:21:59.699Z" }, + { url = "https://files.pythonhosted.org/packages/e0/ad/bd0331f740f5705cc555a5e17fdf334671262160270962e69a2bdef3bf76/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:99b47d6ad9a6da00bec6aabe5a6279ecd3c06a329d4aa4771034a21e335c3a97", size = 412033, upload-time = "2025-11-30T20:22:00.991Z" }, + { url = "https://files.pythonhosted.org/packages/f8/1e/372195d326549bb51f0ba0f2ecb9874579906b97e08880e7a65c3bef1a99/rpds_py-0.30.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:33f559f3104504506a44bb666b93a33f5d33133765b0c216a5bf2f1e1503af89", size = 390828, upload-time = "2025-11-30T20:22:02.723Z" }, + { url = "https://files.pythonhosted.org/packages/ab/2b/d88bb33294e3e0c76bc8f351a3721212713629ffca1700fa94979cb3eae8/rpds_py-0.30.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:946fe926af6e44f3697abbc305ea168c2c31d3e3ef1058cf68f379bf0335a78d", size = 404683, upload-time = "2025-11-30T20:22:04.367Z" }, + { url = "https://files.pythonhosted.org/packages/50/32/c759a8d42bcb5289c1fac697cd92f6fe01a018dd937e62ae77e0e7f15702/rpds_py-0.30.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:495aeca4b93d465efde585977365187149e75383ad2684f81519f504f5c13038", size = 421583, upload-time = "2025-11-30T20:22:05.814Z" }, + { url = "https://files.pythonhosted.org/packages/2b/81/e729761dbd55ddf5d84ec4ff1f47857f4374b0f19bdabfcf929164da3e24/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d9a0ca5da0386dee0655b4ccdf46119df60e0f10da268d04fe7cc87886872ba7", size = 572496, upload-time = "2025-11-30T20:22:07.713Z" }, + { url = "https://files.pythonhosted.org/packages/14/f6/69066a924c3557c9c30baa6ec3a0aa07526305684c6f86c696b08860726c/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:8d6d1cc13664ec13c1b84241204ff3b12f9bb82464b8ad6e7a5d3486975c2eed", size = 598669, upload-time = "2025-11-30T20:22:09.312Z" }, + { url = "https://files.pythonhosted.org/packages/5f/48/905896b1eb8a05630d20333d1d8ffd162394127b74ce0b0784ae04498d32/rpds_py-0.30.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:3896fa1be39912cf0757753826bc8bdc8ca331a28a7c4ae46b7a21280b06bb85", size = 561011, upload-time = "2025-11-30T20:22:11.309Z" }, + { url = "https://files.pythonhosted.org/packages/22/16/cd3027c7e279d22e5eb431dd3c0fbc677bed58797fe7581e148f3f68818b/rpds_py-0.30.0-cp311-cp311-win32.whl", hash = "sha256:55f66022632205940f1827effeff17c4fa7ae1953d2b74a8581baaefb7d16f8c", size = 221406, upload-time = "2025-11-30T20:22:13.101Z" }, + { url = "https://files.pythonhosted.org/packages/fa/5b/e7b7aa136f28462b344e652ee010d4de26ee9fd16f1bfd5811f5153ccf89/rpds_py-0.30.0-cp311-cp311-win_amd64.whl", hash = "sha256:a51033ff701fca756439d641c0ad09a41d9242fa69121c7d8769604a0a629825", size = 236024, upload-time = "2025-11-30T20:22:14.853Z" }, + { url = "https://files.pythonhosted.org/packages/14/a6/364bba985e4c13658edb156640608f2c9e1d3ea3c81b27aa9d889fff0e31/rpds_py-0.30.0-cp311-cp311-win_arm64.whl", hash = "sha256:47b0ef6231c58f506ef0b74d44e330405caa8428e770fec25329ed2cb971a229", size = 229069, upload-time = "2025-11-30T20:22:16.577Z" }, + { url = "https://files.pythonhosted.org/packages/03/e7/98a2f4ac921d82f33e03f3835f5bf3a4a40aa1bfdc57975e74a97b2b4bdd/rpds_py-0.30.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a161f20d9a43006833cd7068375a94d035714d73a172b681d8881820600abfad", size = 375086, upload-time = "2025-11-30T20:22:17.93Z" }, + { url = "https://files.pythonhosted.org/packages/4d/a1/bca7fd3d452b272e13335db8d6b0b3ecde0f90ad6f16f3328c6fb150c889/rpds_py-0.30.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:6abc8880d9d036ecaafe709079969f56e876fcf107f7a8e9920ba6d5a3878d05", size = 359053, upload-time = "2025-11-30T20:22:19.297Z" }, + { url = "https://files.pythonhosted.org/packages/65/1c/ae157e83a6357eceff62ba7e52113e3ec4834a84cfe07fa4b0757a7d105f/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:ca28829ae5f5d569bb62a79512c842a03a12576375d5ece7d2cadf8abe96ec28", size = 390763, upload-time = "2025-11-30T20:22:21.661Z" }, + { url = "https://files.pythonhosted.org/packages/d4/36/eb2eb8515e2ad24c0bd43c3ee9cd74c33f7ca6430755ccdb240fd3144c44/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a1010ed9524c73b94d15919ca4d41d8780980e1765babf85f9a2f90d247153dd", size = 408951, upload-time = "2025-11-30T20:22:23.408Z" }, + { url = "https://files.pythonhosted.org/packages/d6/65/ad8dc1784a331fabbd740ef6f71ce2198c7ed0890dab595adb9ea2d775a1/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:f8d1736cfb49381ba528cd5baa46f82fdc65c06e843dab24dd70b63d09121b3f", size = 514622, upload-time = "2025-11-30T20:22:25.16Z" }, + { url = "https://files.pythonhosted.org/packages/63/8e/0cfa7ae158e15e143fe03993b5bcd743a59f541f5952e1546b1ac1b5fd45/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:d948b135c4693daff7bc2dcfc4ec57237a29bd37e60c2fabf5aff2bbacf3e2f1", size = 414492, upload-time = "2025-11-30T20:22:26.505Z" }, + { url = "https://files.pythonhosted.org/packages/60/1b/6f8f29f3f995c7ffdde46a626ddccd7c63aefc0efae881dc13b6e5d5bb16/rpds_py-0.30.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:47f236970bccb2233267d89173d3ad2703cd36a0e2a6e92d0560d333871a3d23", size = 394080, upload-time = "2025-11-30T20:22:27.934Z" }, + { url = "https://files.pythonhosted.org/packages/6d/d5/a266341051a7a3ca2f4b750a3aa4abc986378431fc2da508c5034d081b70/rpds_py-0.30.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:2e6ecb5a5bcacf59c3f912155044479af1d0b6681280048b338b28e364aca1f6", size = 408680, upload-time = "2025-11-30T20:22:29.341Z" }, + { url = "https://files.pythonhosted.org/packages/10/3b/71b725851df9ab7a7a4e33cf36d241933da66040d195a84781f49c50490c/rpds_py-0.30.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:a8fa71a2e078c527c3e9dc9fc5a98c9db40bcc8a92b4e8858e36d329f8684b51", size = 423589, upload-time = "2025-11-30T20:22:31.469Z" }, + { url = "https://files.pythonhosted.org/packages/00/2b/e59e58c544dc9bd8bd8384ecdb8ea91f6727f0e37a7131baeff8d6f51661/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:73c67f2db7bc334e518d097c6d1e6fed021bbc9b7d678d6cc433478365d1d5f5", size = 573289, upload-time = "2025-11-30T20:22:32.997Z" }, + { url = "https://files.pythonhosted.org/packages/da/3e/a18e6f5b460893172a7d6a680e86d3b6bc87a54c1f0b03446a3c8c7b588f/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:5ba103fb455be00f3b1c2076c9d4264bfcb037c976167a6047ed82f23153f02e", size = 599737, upload-time = "2025-11-30T20:22:34.419Z" }, + { url = "https://files.pythonhosted.org/packages/5c/e2/714694e4b87b85a18e2c243614974413c60aa107fd815b8cbc42b873d1d7/rpds_py-0.30.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:7cee9c752c0364588353e627da8a7e808a66873672bcb5f52890c33fd965b394", size = 563120, upload-time = "2025-11-30T20:22:35.903Z" }, + { url = "https://files.pythonhosted.org/packages/6f/ab/d5d5e3bcedb0a77f4f613706b750e50a5a3ba1c15ccd3665ecc636c968fd/rpds_py-0.30.0-cp312-cp312-win32.whl", hash = "sha256:1ab5b83dbcf55acc8b08fc62b796ef672c457b17dbd7820a11d6c52c06839bdf", size = 223782, upload-time = "2025-11-30T20:22:37.271Z" }, + { url = "https://files.pythonhosted.org/packages/39/3b/f786af9957306fdc38a74cef405b7b93180f481fb48453a114bb6465744a/rpds_py-0.30.0-cp312-cp312-win_amd64.whl", hash = "sha256:a090322ca841abd453d43456ac34db46e8b05fd9b3b4ac0c78bcde8b089f959b", size = 240463, upload-time = "2025-11-30T20:22:39.021Z" }, + { url = "https://files.pythonhosted.org/packages/f3/d2/b91dc748126c1559042cfe41990deb92c4ee3e2b415f6b5234969ffaf0cc/rpds_py-0.30.0-cp312-cp312-win_arm64.whl", hash = "sha256:669b1805bd639dd2989b281be2cfd951c6121b65e729d9b843e9639ef1fd555e", size = 230868, upload-time = "2025-11-30T20:22:40.493Z" }, + { url = "https://files.pythonhosted.org/packages/69/71/3f34339ee70521864411f8b6992e7ab13ac30d8e4e3309e07c7361767d91/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:c2262bdba0ad4fc6fb5545660673925c2d2a5d9e2e0fb603aad545427be0fc58", size = 372292, upload-time = "2025-11-30T20:24:16.537Z" }, + { url = "https://files.pythonhosted.org/packages/57/09/f183df9b8f2d66720d2ef71075c59f7e1b336bec7ee4c48f0a2b06857653/rpds_py-0.30.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:ee6af14263f25eedc3bb918a3c04245106a42dfd4f5c2285ea6f997b1fc3f89a", size = 362128, upload-time = "2025-11-30T20:24:18.086Z" }, + { url = "https://files.pythonhosted.org/packages/7a/68/5c2594e937253457342e078f0cc1ded3dd7b2ad59afdbf2d354869110a02/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:3adbb8179ce342d235c31ab8ec511e66c73faa27a47e076ccc92421add53e2bb", size = 391542, upload-time = "2025-11-30T20:24:20.092Z" }, + { url = "https://files.pythonhosted.org/packages/49/5c/31ef1afd70b4b4fbdb2800249f34c57c64beb687495b10aec0365f53dfc4/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:250fa00e9543ac9b97ac258bd37367ff5256666122c2d0f2bc97577c60a1818c", size = 404004, upload-time = "2025-11-30T20:24:22.231Z" }, + { url = "https://files.pythonhosted.org/packages/e3/63/0cfbea38d05756f3440ce6534d51a491d26176ac045e2707adc99bb6e60a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:9854cf4f488b3d57b9aaeb105f06d78e5529d3145b1e4a41750167e8c213c6d3", size = 527063, upload-time = "2025-11-30T20:24:24.302Z" }, + { url = "https://files.pythonhosted.org/packages/42/e6/01e1f72a2456678b0f618fc9a1a13f882061690893c192fcad9f2926553a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:993914b8e560023bc0a8bf742c5f303551992dcb85e247b1e5c7f4a7d145bda5", size = 413099, upload-time = "2025-11-30T20:24:25.916Z" }, + { url = "https://files.pythonhosted.org/packages/b8/25/8df56677f209003dcbb180765520c544525e3ef21ea72279c98b9aa7c7fb/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:58edca431fb9b29950807e301826586e5bbf24163677732429770a697ffe6738", size = 392177, upload-time = "2025-11-30T20:24:27.834Z" }, + { url = "https://files.pythonhosted.org/packages/4a/b4/0a771378c5f16f8115f796d1f437950158679bcd2a7c68cf251cfb00ed5b/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:dea5b552272a944763b34394d04577cf0f9bd013207bc32323b5a89a53cf9c2f", size = 406015, upload-time = "2025-11-30T20:24:29.457Z" }, + { url = "https://files.pythonhosted.org/packages/36/d8/456dbba0af75049dc6f63ff295a2f92766b9d521fa00de67a2bd6427d57a/rpds_py-0.30.0-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:ba3af48635eb83d03f6c9735dfb21785303e73d22ad03d489e88adae6eab8877", size = 423736, upload-time = "2025-11-30T20:24:31.22Z" }, + { url = "https://files.pythonhosted.org/packages/13/64/b4d76f227d5c45a7e0b796c674fd81b0a6c4fbd48dc29271857d8219571c/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:dff13836529b921e22f15cb099751209a60009731a68519630a24d61f0b1b30a", size = 573981, upload-time = "2025-11-30T20:24:32.934Z" }, + { url = "https://files.pythonhosted.org/packages/20/91/092bacadeda3edf92bf743cc96a7be133e13a39cdbfd7b5082e7ab638406/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:1b151685b23929ab7beec71080a8889d4d6d9fa9a983d213f07121205d48e2c4", size = 599782, upload-time = "2025-11-30T20:24:35.169Z" }, + { url = "https://files.pythonhosted.org/packages/d1/b7/b95708304cd49b7b6f82fdd039f1748b66ec2b21d6a45180910802f1abf1/rpds_py-0.30.0-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:ac37f9f516c51e5753f27dfdef11a88330f04de2d564be3991384b2f3535d02e", size = 562191, upload-time = "2025-11-30T20:24:36.853Z" }, +] + +[[package]] +name = "rpds-py" +version = "2026.6.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +sdist = { url = "https://files.pythonhosted.org/packages/aa/2a/9618a122aeb2a169a28b03889a2995fe297588964333d4a7d67bdf46e147/rpds_py-2026.6.3.tar.gz", hash = "sha256:1cebd1337c242e4ec2293e541f712b2da849b29f48f0c293684b71c0632625d4", size = 64051, upload-time = "2026-06-30T07:17:53.009Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/94/1f/a2dca5ffdbf1d475ffc4e80e4d5d720ff3a00f691795910116960ee12511/rpds_py-2026.6.3-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:7b689145a1485c335569bd056464f3243a29af7ed3871c7be31ad624ba239bc7", size = 342174, upload-time = "2026-06-30T07:14:54.821Z" }, + { url = "https://files.pythonhosted.org/packages/4d/dc/323d08583c0832911768663d1944f0107fcd4088704858d84b5e06d105a0/rpds_py-2026.6.3-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:db08f45aecde626498fb3df07bcf6d2ec040af42e859a4f5040d79c200342911", size = 345513, upload-time = "2026-06-30T07:14:56.515Z" }, + { url = "https://files.pythonhosted.org/packages/0b/2a/e31989834d18d2f26ec1d2774c5b1eb3331df4ea8ada525175294c94b48a/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:acc992ab27b15f852c76755eb2ab7dce86585ddadba6fa5946e58556088845b4", size = 373783, upload-time = "2026-06-30T07:14:57.736Z" }, + { url = "https://files.pythonhosted.org/packages/87/fe/e80107ee3639585c9941c17d6a42cd65325022f656c023191fce78c324c8/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:7f88d653e7b3b779d71ae7454e20dcc9b6bae903f33c269db9f2be41bda3f261", size = 378316, upload-time = "2026-06-30T07:14:59.077Z" }, + { url = "https://files.pythonhosted.org/packages/22/6f/81e3adf81acfb6fa694de2a6e4e7d8863121e3e0799e0a7725e6cf5679c4/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:e52655eaf81e32593abedaa4bfe33170c8cfedf3365ed9be6e11e07f148f0278", size = 499423, upload-time = "2026-06-30T07:15:00.488Z" }, + { url = "https://files.pythonhosted.org/packages/2d/9a/41263969df0ce3d9af2a96d5005a288200af1989aed3354bfceb5fc0b21f/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:dfcc8b909769d19db55c7cc9541eb64b9b774b1057ffffb4f1048070475bb9f9", size = 386077, upload-time = "2026-06-30T07:15:01.911Z" }, + { url = "https://files.pythonhosted.org/packages/5e/19/7e98f468bd50346faff5b10e5297374b443bfdddacc8e9fbc65984539597/rpds_py-2026.6.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9c1255b302953c86a486b81d330d5ee1d5bd937691ce271b6be0ef0e299eaab7", size = 371315, upload-time = "2026-06-30T07:15:03.317Z" }, + { url = "https://files.pythonhosted.org/packages/99/3c/2b973b4d371906a134b03decfea7f5d9835a2c6d263454392e15b64b5b18/rpds_py-2026.6.3-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:8d2294a31386bfa251d8c8a39472beee17db67d4f1a6eabea665d35c9a4461c3", size = 383502, upload-time = "2026-06-30T07:15:04.627Z" }, + { url = "https://files.pythonhosted.org/packages/98/2a/12e2799500af0a307bca76b63361c51f9fe479223561489c29eea1f2ee41/rpds_py-2026.6.3-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:f8f23ead891a3b762f35ab3b04623da7056545b48aa60d59957e6789914545da", size = 402673, upload-time = "2026-06-30T07:15:05.856Z" }, + { url = "https://files.pythonhosted.org/packages/2d/e3/21e5872d165fe08be4f229e3d5ee9d90019c0bf0e5538de60dbd54009450/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:421aba32367055614287a4292b6a17f1939c9452299f7a0209c117e990b646d4", size = 549964, upload-time = "2026-06-30T07:15:07.159Z" }, + { url = "https://files.pythonhosted.org/packages/1a/d0/5ee0fe36844297de8123bee27bc12078c1a7416ad9f1b8a8ca18d6b0c0ac/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:1e5822dfc2f0d4ab7e745eaa6d85945069329beeccef965af3f3bb26058fcab6", size = 615446, upload-time = "2026-06-30T07:15:08.531Z" }, + { url = "https://files.pythonhosted.org/packages/b1/80/1ea5873cb683f2fbe5f21b23ea1f6d179ead19f3c5b249b7eb5dca568ef2/rpds_py-2026.6.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:83e35b57523816c8613fd0776b40cd8bb9f596b37ddd2692eb4a6bb5ab2f8c93", size = 576975, upload-time = "2026-06-30T07:15:09.97Z" }, + { url = "https://files.pythonhosted.org/packages/c9/e1/90ef639217a5ddb15b7f4f61b1c33911fd044ad03c311bafdd2bcab85582/rpds_py-2026.6.3-cp311-cp311-win32.whl", hash = "sha256:de3eceba0b683bcbb1ab93da016d0270df1f9ae7be716b40214c5dafac6ea45a", size = 204453, upload-time = "2026-06-30T07:15:11.324Z" }, + { url = "https://files.pythonhosted.org/packages/f2/b7/b7a1695d7af36f521fb11e80d6d3adbd744f73b921859bd3c2a2c0dc706f/rpds_py-2026.6.3-cp311-cp311-win_amd64.whl", hash = "sha256:2c54a076ca4d370980ab57bc0e31df57bbe8d41340436a90ef8b1219a3cbb127", size = 223219, upload-time = "2026-06-30T07:15:12.476Z" }, + { url = "https://files.pythonhosted.org/packages/d7/a2/145afacf796e4506062825941176ad9445c2dcf2b3b6a1f13d3030a15e19/rpds_py-2026.6.3-cp311-cp311-win_arm64.whl", hash = "sha256:168c733a7112e071bb7a66460e667edfcff06c017a3c523f7a8a8e08d0140804", size = 219137, upload-time = "2026-06-30T07:15:13.631Z" }, + { url = "https://files.pythonhosted.org/packages/5c/be/2e8974163072e7bab7df1a5acd54c4498e75e35d6d18b864d3a9d5dadc92/rpds_py-2026.6.3-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:a0811d33247c3d6128a3001d763f2aa056bb3425204335400ac54f89eec3a0d0", size = 343691, upload-time = "2026-06-30T07:15:14.96Z" }, + { url = "https://files.pythonhosted.org/packages/a4/73/319dfa745dd668efe89309141ded489126461fcecd2b8f3a3cda185129b6/rpds_py-2026.6.3-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:538949e262e46caa31ac01bdb3c1e8f642622922cacbabbae6a8445d9dc33eaf", size = 338542, upload-time = "2026-06-30T07:15:16.267Z" }, + { url = "https://files.pythonhosted.org/packages/21/63/4239893be1c4d09b709b1a8f6be4188f0870084ff547f46606b8a75f1b03/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:55927d532399c2c646100ff7feb48eaa940ad70f42cd68e1328f3ded9f81ca24", size = 368180, upload-time = "2026-06-30T07:15:17.62Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ca/9c5de382225234ceb37b1844ebdb140db12b2a278bb9efe2fcd19f6c82ce/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:f56f1695bc5c0871cbc33dc0130fcf503aab0c57dcc5a6700a4f49eba4f2652e", size = 375067, upload-time = "2026-06-30T07:15:18.952Z" }, + { url = "https://files.pythonhosted.org/packages/87/dc/863f69d1bf04ade34b7fe0d59b9fdf6f0135fe2d7cbca74f1d665589559d/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:270b293dae9058fc9fcedab50f13cebf46fb8ed1d1d54e0521a9da5d6b211975", size = 490509, upload-time = "2026-06-30T07:15:20.434Z" }, + { url = "https://files.pythonhosted.org/packages/ce/ef/eac16a12048b45ec7c7fa94f2be3438a5f26bf9cc8580b18a1cfd609b7f6/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:127565fead0a10943b282957bd5447804ff3160ad79f2ad2635e6d249e380680", size = 382754, upload-time = "2026-06-30T07:15:21.831Z" }, + { url = "https://files.pythonhosted.org/packages/04/8f/d2f3f532616be4d06c316ef119683e832bd3d41e112bf3a88f4151c95b17/rpds_py-2026.6.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:ecabd69db66de867690f9797f2f8fa27ba501bbc24540cbdbdc649cd15888ba6", size = 366189, upload-time = "2026-06-30T07:15:23.371Z" }, + { url = "https://files.pythonhosted.org/packages/e3/29/41a7b0e98a4b44cd676ab7598419623373eb43b20be68c084935c1a8cf88/rpds_py-2026.6.3-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:58eadac9cd119677b60e1cf8ac4052f35949d71b8a9e5556efccbe82533cf22a", size = 377750, upload-time = "2026-06-30T07:15:24.659Z" }, + { url = "https://files.pythonhosted.org/packages/2e/05/ecda0bec46f9a1565090bcdc941d023f6a25aff85fda28f89f8d19878152/rpds_py-2026.6.3-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:7491ee23305ac3eb59e492b6945881f5cd77a6f731061a3f25b77fd40f9e99a4", size = 395576, upload-time = "2026-06-30T07:15:25.987Z" }, + { url = "https://files.pythonhosted.org/packages/68/a8/6ed52f03ee6cb854ce78785cc9a9a672eb880e83fd7224d471f667d151f1/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:2c99f7e8ccb3dd6e3e4bfeac657a7b208c9bac8075f4b078c02d7404c34107fa", size = 543807, upload-time = "2026-06-30T07:15:27.356Z" }, + { url = "https://files.pythonhosted.org/packages/8f/d6/156c0d3eea27ba09b92562ba2364ba124c0a061b199e17eac637cd25a5e2/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:62698275682bf121181861295c9181e789030a2d516071f5b8f3c23c170cd0fc", size = 611187, upload-time = "2026-06-30T07:15:28.931Z" }, + { url = "https://files.pythonhosted.org/packages/f1/31/774212ed989c62f7f310220089f9b0a3fb8f40f5443d1727abd5d9f52bc9/rpds_py-2026.6.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a214c993455f99a89aaeadc9b21241900037adc9d97203e374d75513c5911822", size = 573030, upload-time = "2026-06-30T07:15:30.553Z" }, + { url = "https://files.pythonhosted.org/packages/c9/50/22f73127a41f1ce4f87fe39aadfb9a126345801c274aa93ae88456249327/rpds_py-2026.6.3-cp312-cp312-win32.whl", hash = "sha256:501f9f04a588d6a09179368c57071301445191767c64e4b52a6aa9871f1ef5ed", size = 202185, upload-time = "2026-06-30T07:15:32.027Z" }, + { url = "https://files.pythonhosted.org/packages/04/3a/f0ee4d4dde9d3b69dedf1b5f74e7a40017046d55052d173e418c6a94f960/rpds_py-2026.6.3-cp312-cp312-win_amd64.whl", hash = "sha256:2c958bf94822e9290a40aaf2a822d4bc5c88099093e3948ad6c571eca9272e5f", size = 220394, upload-time = "2026-06-30T07:15:33.359Z" }, + { url = "https://files.pythonhosted.org/packages/f3/83/3382fe37f809b59f02aac04dbc4e765b480b46ee0227ed516e3bdc4d3dfc/rpds_py-2026.6.3-cp312-cp312-win_arm64.whl", hash = "sha256:22bffe6042b9bcb0822bcd1955ec00e245daf17b4344e4ed8e9551b976b63e96", size = 215753, upload-time = "2026-06-30T07:15:34.778Z" }, + { url = "https://files.pythonhosted.org/packages/b4/9c/f0d19ac587fd0e4ab6b72cda355e9c5a6166b01ef7e064e437aef8eb9fef/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4cf2d36a2357e4d07bb5a4f98801265327b48256867816cfd2ceb001e9754a8f", size = 349791, upload-time = "2026-06-30T07:17:33.315Z" }, + { url = "https://files.pythonhosted.org/packages/38/c7/1d49d204c9fd2ee6c537601dc4c1ba921e03363ca576bfab94a00254ac9a/rpds_py-2026.6.3-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:30c6dc199b24a5e3e81d50da0f00858c5bbdb2617a750395687f4339c5818171", size = 352842, upload-time = "2026-06-30T07:17:34.897Z" }, + { url = "https://files.pythonhosted.org/packages/ac/e5/c0b5dc93cd0d4c06ce1f438907649514e2ea077bcd911e3154a51e96c38e/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9891e594296ab9dada6551c8e7b387b2721f27a67eecd528412e8906247a7b90", size = 382094, upload-time = "2026-06-30T07:17:36.514Z" }, + { url = "https://files.pythonhosted.org/packages/0d/54/ec0e907b4ca8d541112db352409bd15f871c9b243e0c92c9b5a46ae96f01/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:b5c2dc92304aa48a4a60443b548bb12f12e119d4b72f314015e67b9e1be97fca", size = 388662, upload-time = "2026-06-30T07:17:38.235Z" }, + { url = "https://files.pythonhosted.org/packages/d3/f4/921c22a4fd0f1c1ac13a3996ffbf0aa67951e2c8ad0d1d9574938a2932e8/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:127e08c0642d880cf32ca47ec2a4a77b901f7e2dd1ad9762adb13955d72ffcc9", size = 504896, upload-time = "2026-06-30T07:17:39.689Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1b/a114b972cefa1ab1cdb3c7bb177cd3844a12826c507c722d3a73516dbbaf/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:8bb68f03f395eb793220b45c097bd4d8c32944393da0fad8b999efac0868fc8c", size = 391545, upload-time = "2026-06-30T07:17:41.336Z" }, + { url = "https://files.pythonhosted.org/packages/4e/98/af9b3db77d47fcbe6c8c1f36e2c2147ec70292819e99c325f871584a1c11/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a3450b693fde92133e9f51060568a4c31fcca76d5e53bbd611e689ca446517e9", size = 380059, upload-time = "2026-06-30T07:17:42.857Z" }, + { url = "https://files.pythonhosted.org/packages/c9/ba/0efd8668b97c1d26a61566386c636a7a7a09829e474fdf807caa15a2c844/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_31_riscv64.whl", hash = "sha256:5e8d07bddee435a2ff6f1920e18feff28d0bc4533e42f4bf6927fbd073312c41", size = 393235, upload-time = "2026-06-30T07:17:44.637Z" }, + { url = "https://files.pythonhosted.org/packages/62/90/8c139ee9690f73b0829f32647de6f40d826f8f443af6fa72644f96351aac/rpds_py-2026.6.3-pp311-pypy311_pp73-manylinux_2_5_i686.manylinux1_i686.whl", hash = "sha256:3a83ae6c67b7676b9878378547ca8e93ed77a580037bcbcd1d32f739e1e6089c", size = 413008, upload-time = "2026-06-30T07:17:46.225Z" }, + { url = "https://files.pythonhosted.org/packages/9c/97/0043896fdd7828ce09a1d9a8b06433714d0960fc4ff3fc4aa72b666b764e/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_aarch64.whl", hash = "sha256:2bfd04c19ddbd6640de0b51894d764bd2758854d5b75bd102d2ef10cb9c293a9", size = 558118, upload-time = "2026-06-30T07:17:47.759Z" }, + { url = "https://files.pythonhosted.org/packages/f6/40/02355f0e134f783a8f9814c4680a1bd311d37671577a5964ea838573ff37/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_i686.whl", hash = "sha256:ca6546b66be9dc4738b1b043d5ebd5488c66c578c5ff0fd0e8065313fe3afb76", size = 623138, upload-time = "2026-06-30T07:17:49.355Z" }, + { url = "https://files.pythonhosted.org/packages/10/85/48f0abdcef5cce4e034c7a5b0ceeceba0b01bf0d942824f4bb720afe2dec/rpds_py-2026.6.3-pp311-pypy311_pp73-musllinux_1_2_x86_64.whl", hash = "sha256:8e65860d238379ed982fd9ba690579b5e95af2f4840f99c772816dbe573cb826", size = 586486, upload-time = "2026-06-30T07:17:51.141Z" }, +] + +[[package]] +name = "rtree" +version = "1.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/95/09/7302695875a019514de9a5dd17b8320e7a19d6e7bc8f85dcfb79a4ce2da3/rtree-1.4.1.tar.gz", hash = "sha256:c6b1b3550881e57ebe530cc6cffefc87cd9bf49c30b37b894065a9f810875e46", size = 52425, upload-time = "2025-08-13T19:32:01.413Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/04/d9/108cd989a4c0954e60b3cdc86fd2826407702b5375f6dfdab2802e5fed98/rtree-1.4.1-py3-none-macosx_10_9_x86_64.whl", hash = "sha256:d672184298527522d4914d8ae53bf76982b86ca420b0acde9298a7a87d81d4a4", size = 468484, upload-time = "2025-08-13T19:31:50.593Z" }, + { url = "https://files.pythonhosted.org/packages/f3/cf/2710b6fd6b07ea0aef317b29f335790ba6adf06a28ac236078ed9bd8a91d/rtree-1.4.1-py3-none-macosx_11_0_arm64.whl", hash = "sha256:a7e48d805e12011c2cf739a29d6a60ae852fb1de9fc84220bbcef67e6e595d7d", size = 436325, upload-time = "2025-08-13T19:31:52.367Z" }, + { url = "https://files.pythonhosted.org/packages/55/e1/4d075268a46e68db3cac51846eb6a3ab96ed481c585c5a1ad411b3c23aad/rtree-1.4.1-py3-none-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:efa8c4496e31e9ad58ff6c7df89abceac7022d906cb64a3e18e4fceae6b77f65", size = 459789, upload-time = "2025-08-13T19:31:53.926Z" }, + { url = "https://files.pythonhosted.org/packages/d1/75/e5d44be90525cd28503e7f836d077ae6663ec0687a13ba7810b4114b3668/rtree-1.4.1-py3-none-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12de4578f1b3381a93a655846900be4e3d5f4cd5e306b8b00aa77c1121dc7e8c", size = 507644, upload-time = "2025-08-13T19:31:55.164Z" }, + { url = "https://files.pythonhosted.org/packages/fd/85/b8684f769a142163b52859a38a486493b05bafb4f2fb71d4f945de28ebf9/rtree-1.4.1-py3-none-musllinux_1_2_aarch64.whl", hash = "sha256:b558edda52eca3e6d1ee629042192c65e6b7f2c150d6d6cd207ce82f85be3967", size = 1454478, upload-time = "2025-08-13T19:31:56.808Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a4/c2292b95246b9165cc43a0c3757e80995d58bc9b43da5cb47ad6e3535213/rtree-1.4.1-py3-none-musllinux_1_2_x86_64.whl", hash = "sha256:f155bc8d6bac9dcd383481dee8c130947a4866db1d16cb6dff442329a038a0dc", size = 1555140, upload-time = "2025-08-13T19:31:58.031Z" }, + { url = "https://files.pythonhosted.org/packages/74/25/5282c8270bfcd620d3e73beb35b40ac4ab00f0a898d98ebeb41ef0989ec8/rtree-1.4.1-py3-none-win_amd64.whl", hash = "sha256:efe125f416fd27150197ab8521158662943a40f87acab8028a1aac4ad667a489", size = 389358, upload-time = "2025-08-13T19:31:59.247Z" }, + { url = "https://files.pythonhosted.org/packages/3f/50/0a9e7e7afe7339bd5e36911f0ceb15fed51945836ed803ae5afd661057fd/rtree-1.4.1-py3-none-win_arm64.whl", hash = "sha256:3d46f55729b28138e897ffef32f7ce93ac335cb67f9120125ad3742a220800f0", size = 355253, upload-time = "2025-08-13T19:32:00.296Z" }, +] + +[[package]] +name = "s3fs" +version = "2026.6.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "aiobotocore" }, + { name = "aiohttp" }, + { name = "fsspec" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/99/00/6677343dc919d6c072bb04d80210afdd22c16838a8d16b3315c122dc728f/s3fs-2026.6.0.tar.gz", hash = "sha256:b28de7082d0a4f72392884bdc497e34a4a1582f675d214c7da0acf6e950a0083", size = 87358, upload-time = "2026-06-16T02:05:48.719Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a5/0b/f68a968b49876eae0f2a515387093cebb2eb9451380a96741cc20efac0d0/s3fs-2026.6.0-py3-none-any.whl", hash = "sha256:60576e31bb31193c1f643f32b4c6439548720ea6918ac702e21cd757c80b5db8", size = 32573, upload-time = "2026-06-16T02:05:47.608Z" }, +] + +[[package]] +name = "s3transfer" +version = "0.17.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "botocore" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/11/b3/bcdc2f58fa92592db511beda154c2c08d28f21f6c4637f06a42a24b10c21/s3transfer-0.17.1.tar.gz", hash = "sha256:042dd5e3b1b512355e35a23f0223e426b7042e80b97830ea2680ddce327fc45e", size = 159439, upload-time = "2026-05-26T19:45:01.714Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/85/dd/904873250a6554fbae40cddbf9198e3cc37a2f1319d5e1a5ce82fe269c17/s3transfer-0.17.1-py3-none-any.whl", hash = "sha256:5b9827d1044159bbb01b86ef8902760ea39281927f5de31de75e1d657177bf4c", size = 88264, upload-time = "2026-05-26T19:45:00.452Z" }, +] + +[[package]] +name = "scikit-image" +version = "0.25.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "imageio" }, + { name = "lazy-loader" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" } }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "packaging" }, + { name = "pillow" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" } }, + { name = "tifffile", version = "2025.5.10", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/a8/3c0f256012b93dd2cb6fda9245e9f4bff7dc0486880b248005f15ea2255e/scikit_image-0.25.2.tar.gz", hash = "sha256:e5a37e6cd4d0c018a7a55b9d601357e3382826d3888c10d0213fc63bff977dde", size = 22693594, upload-time = "2025-02-18T18:05:24.538Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/11/cb/016c63f16065c2d333c8ed0337e18a5cdf9bc32d402e4f26b0db362eb0e2/scikit_image-0.25.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:d3278f586793176599df6a4cf48cb6beadae35c31e58dc01a98023af3dc31c78", size = 13988922, upload-time = "2025-02-18T18:04:11.069Z" }, + { url = "https://files.pythonhosted.org/packages/30/ca/ff4731289cbed63c94a0c9a5b672976603118de78ed21910d9060c82e859/scikit_image-0.25.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:5c311069899ce757d7dbf1d03e32acb38bb06153236ae77fcd820fd62044c063", size = 13192698, upload-time = "2025-02-18T18:04:15.362Z" }, + { url = "https://files.pythonhosted.org/packages/39/6d/a2aadb1be6d8e149199bb9b540ccde9e9622826e1ab42fe01de4c35ab918/scikit_image-0.25.2-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:be455aa7039a6afa54e84f9e38293733a2622b8c2fb3362b822d459cc5605e99", size = 14153634, upload-time = "2025-02-18T18:04:18.496Z" }, + { url = "https://files.pythonhosted.org/packages/96/08/916e7d9ee4721031b2f625db54b11d8379bd51707afaa3e5a29aecf10bc4/scikit_image-0.25.2-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a4c464b90e978d137330be433df4e76d92ad3c5f46a22f159520ce0fdbea8a09", size = 14767545, upload-time = "2025-02-18T18:04:22.556Z" }, + { url = "https://files.pythonhosted.org/packages/5f/ee/c53a009e3997dda9d285402f19226fbd17b5b3cb215da391c4ed084a1424/scikit_image-0.25.2-cp310-cp310-win_amd64.whl", hash = "sha256:60516257c5a2d2f74387c502aa2f15a0ef3498fbeaa749f730ab18f0a40fd054", size = 12812908, upload-time = "2025-02-18T18:04:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/c4/97/3051c68b782ee3f1fb7f8f5bb7d535cf8cb92e8aae18fa9c1cdf7e15150d/scikit_image-0.25.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f4bac9196fb80d37567316581c6060763b0f4893d3aca34a9ede3825bc035b17", size = 14003057, upload-time = "2025-02-18T18:04:30.395Z" }, + { url = "https://files.pythonhosted.org/packages/19/23/257fc696c562639826065514d551b7b9b969520bd902c3a8e2fcff5b9e17/scikit_image-0.25.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:d989d64ff92e0c6c0f2018c7495a5b20e2451839299a018e0e5108b2680f71e0", size = 13180335, upload-time = "2025-02-18T18:04:33.449Z" }, + { url = "https://files.pythonhosted.org/packages/ef/14/0c4a02cb27ca8b1e836886b9ec7c9149de03053650e9e2ed0625f248dd92/scikit_image-0.25.2-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b2cfc96b27afe9a05bc92f8c6235321d3a66499995675b27415e0d0c76625173", size = 14144783, upload-time = "2025-02-18T18:04:36.594Z" }, + { url = "https://files.pythonhosted.org/packages/dd/9b/9fb556463a34d9842491d72a421942c8baff4281025859c84fcdb5e7e602/scikit_image-0.25.2-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:24cc986e1f4187a12aa319f777b36008764e856e5013666a4a83f8df083c2641", size = 14785376, upload-time = "2025-02-18T18:04:39.856Z" }, + { url = "https://files.pythonhosted.org/packages/de/ec/b57c500ee85885df5f2188f8bb70398481393a69de44a00d6f1d055f103c/scikit_image-0.25.2-cp311-cp311-win_amd64.whl", hash = "sha256:b4f6b61fc2db6340696afe3db6b26e0356911529f5f6aee8c322aa5157490c9b", size = 12791698, upload-time = "2025-02-18T18:04:42.868Z" }, + { url = "https://files.pythonhosted.org/packages/35/8c/5df82881284459f6eec796a5ac2a0a304bb3384eec2e73f35cfdfcfbf20c/scikit_image-0.25.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8db8dd03663112783221bf01ccfc9512d1cc50ac9b5b0fe8f4023967564719fb", size = 13986000, upload-time = "2025-02-18T18:04:47.156Z" }, + { url = "https://files.pythonhosted.org/packages/ce/e6/93bebe1abcdce9513ffec01d8af02528b4c41fb3c1e46336d70b9ed4ef0d/scikit_image-0.25.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:483bd8cc10c3d8a7a37fae36dfa5b21e239bd4ee121d91cad1f81bba10cfb0ed", size = 13235893, upload-time = "2025-02-18T18:04:51.049Z" }, + { url = "https://files.pythonhosted.org/packages/53/4b/eda616e33f67129e5979a9eb33c710013caa3aa8a921991e6cc0b22cea33/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:9d1e80107bcf2bf1291acfc0bf0425dceb8890abe9f38d8e94e23497cbf7ee0d", size = 14178389, upload-time = "2025-02-18T18:04:54.245Z" }, + { url = "https://files.pythonhosted.org/packages/6b/b5/b75527c0f9532dd8a93e8e7cd8e62e547b9f207d4c11e24f0006e8646b36/scikit_image-0.25.2-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a17e17eb8562660cc0d31bb55643a4da996a81944b82c54805c91b3fe66f4824", size = 15003435, upload-time = "2025-02-18T18:04:57.586Z" }, + { url = "https://files.pythonhosted.org/packages/34/e3/49beb08ebccda3c21e871b607c1cb2f258c3fa0d2f609fed0a5ba741b92d/scikit_image-0.25.2-cp312-cp312-win_amd64.whl", hash = "sha256:bdd2b8c1de0849964dbc54037f36b4e9420157e67e45a8709a80d727f52c7da2", size = 12899474, upload-time = "2025-02-18T18:05:01.166Z" }, +] + +[[package]] +name = "scikit-image" +version = "0.26.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "imageio" }, + { name = "lazy-loader" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" } }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "packaging" }, + { name = "pillow" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "tifffile", version = "2026.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "tifffile", version = "2026.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a1/b4/2528bb43c67d48053a7a649a9666432dc307d66ba02e3a6d5c40f46655df/scikit_image-0.26.0.tar.gz", hash = "sha256:f5f970ab04efad85c24714321fcc91613fcb64ef2a892a13167df2f3e59199fa", size = 22729739, upload-time = "2025-12-20T17:12:21.824Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/76/16/8a407688b607f86f81f8c649bf0d68a2a6d67375f18c2d660aba20f5b648/scikit_image-0.26.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:b1ede33a0fb3731457eaf53af6361e73dd510f449dac437ab54573b26788baf0", size = 12355510, upload-time = "2025-12-20T17:10:31.628Z" }, + { url = "https://files.pythonhosted.org/packages/6b/f9/7efc088ececb6f6868fd4475e16cfafc11f242ce9ab5fc3557d78b5da0d4/scikit_image-0.26.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:7af7aa331c6846bd03fa28b164c18d0c3fd419dbb888fb05e958ac4257a78fdd", size = 12056334, upload-time = "2025-12-20T17:10:34.559Z" }, + { url = "https://files.pythonhosted.org/packages/9f/1e/bc7fb91fb5ff65ef42346c8b7ee8b09b04eabf89235ab7dbfdfd96cbd1ea/scikit_image-0.26.0-cp311-cp311-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:9ea6207d9e9d21c3f464efe733121c0504e494dbdc7728649ff3e23c3c5a4953", size = 13297768, upload-time = "2025-12-20T17:10:37.733Z" }, + { url = "https://files.pythonhosted.org/packages/a5/2a/e71c1a7d90e70da67b88ccc609bd6ae54798d5847369b15d3a8052232f9d/scikit_image-0.26.0-cp311-cp311-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:74aa5518ccea28121f57a95374581d3b979839adc25bb03f289b1bc9b99c58af", size = 13711217, upload-time = "2025-12-20T17:10:40.935Z" }, + { url = "https://files.pythonhosted.org/packages/d4/59/9637ee12c23726266b91296791465218973ce1ad3e4c56fc81e4d8e7d6e1/scikit_image-0.26.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d5c244656de905e195a904e36dbc18585e06ecf67d90f0482cbde63d7f9ad59d", size = 14337782, upload-time = "2025-12-20T17:10:43.452Z" }, + { url = "https://files.pythonhosted.org/packages/e7/5c/a3e1e0860f9294663f540c117e4bf83d55e5b47c281d475cc06227e88411/scikit_image-0.26.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:21a818ee6ca2f2131b9e04d8eb7637b5c18773ebe7b399ad23dcc5afaa226d2d", size = 14805997, upload-time = "2025-12-20T17:10:45.93Z" }, + { url = "https://files.pythonhosted.org/packages/d3/c6/2eeacf173da041a9e388975f54e5c49df750757fcfc3ee293cdbbae1ea0a/scikit_image-0.26.0-cp311-cp311-win_amd64.whl", hash = "sha256:9490360c8d3f9a7e85c8de87daf7c0c66507960cf4947bb9610d1751928721c7", size = 11878486, upload-time = "2025-12-20T17:10:48.246Z" }, + { url = "https://files.pythonhosted.org/packages/c3/a4/a852c4949b9058d585e762a66bf7e9a2cd3be4795cd940413dfbfbb0ce79/scikit_image-0.26.0-cp311-cp311-win_arm64.whl", hash = "sha256:0baa0108d2d027f34d748e84e592b78acc23e965a5de0e4bb03cf371de5c0581", size = 11346518, upload-time = "2025-12-20T17:10:50.575Z" }, + { url = "https://files.pythonhosted.org/packages/99/e8/e13757982264b33a1621628f86b587e9a73a13f5256dad49b19ba7dc9083/scikit_image-0.26.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:d454b93a6fa770ac5ae2d33570f8e7a321bb80d29511ce4b6b78058ebe176e8c", size = 12376452, upload-time = "2025-12-20T17:10:52.796Z" }, + { url = "https://files.pythonhosted.org/packages/e3/be/f8dd17d0510f9911f9f17ba301f7455328bf13dae416560126d428de9568/scikit_image-0.26.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:3409e89d66eff5734cd2b672d1c48d2759360057e714e1d92a11df82c87cba37", size = 12061567, upload-time = "2025-12-20T17:10:55.207Z" }, + { url = "https://files.pythonhosted.org/packages/b3/2b/c70120a6880579fb42b91567ad79feb4772f7be72e8d52fec403a3dde0c6/scikit_image-0.26.0-cp312-cp312-manylinux_2_24_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4c717490cec9e276afb0438dd165b7c3072d6c416709cc0f9f5a4c1070d23a44", size = 13084214, upload-time = "2025-12-20T17:10:57.468Z" }, + { url = "https://files.pythonhosted.org/packages/f4/a2/70401a107d6d7466d64b466927e6b96fcefa99d57494b972608e2f8be50f/scikit_image-0.26.0-cp312-cp312-manylinux_2_24_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7df650e79031634ac90b11e64a9eedaf5a5e06fcd09bcd03a34be01745744466", size = 13561683, upload-time = "2025-12-20T17:10:59.49Z" }, + { url = "https://files.pythonhosted.org/packages/13/a5/48bdfd92794c5002d664e0910a349d0a1504671ef5ad358150f21643c79a/scikit_image-0.26.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:cefd85033e66d4ea35b525bb0937d7f42d4cdcfed2d1888e1570d5ce450d3932", size = 14112147, upload-time = "2025-12-20T17:11:02.083Z" }, + { url = "https://files.pythonhosted.org/packages/ee/b5/ac71694da92f5def5953ca99f18a10fe98eac2dd0a34079389b70b4d0394/scikit_image-0.26.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3f5bf622d7c0435884e1e141ebbe4b2804e16b2dd23ae4c6183e2ea99233be70", size = 14661625, upload-time = "2025-12-20T17:11:04.528Z" }, + { url = "https://files.pythonhosted.org/packages/23/4d/a3cc1e96f080e253dad2251bfae7587cf2b7912bcd76fd43fd366ff35a87/scikit_image-0.26.0-cp312-cp312-win_amd64.whl", hash = "sha256:abed017474593cd3056ae0fe948d07d0747b27a085e92df5474f4955dd65aec0", size = 11911059, upload-time = "2025-12-20T17:11:06.61Z" }, + { url = "https://files.pythonhosted.org/packages/35/8a/d1b8055f584acc937478abf4550d122936f420352422a1a625eef2c605d8/scikit_image-0.26.0-cp312-cp312-win_arm64.whl", hash = "sha256:4d57e39ef67a95d26860c8caf9b14b8fb130f83b34c6656a77f191fa6d1d04d8", size = 11348740, upload-time = "2025-12-20T17:11:09.118Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.7.2" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "joblib" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" } }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c2/a7855e41c9d285dfe86dc50b250978105dce513d6e459ea66a6aeb0e1e0c/scikit_learn-1.7.2.tar.gz", hash = "sha256:20e9e49ecd130598f1ca38a1d85090e1a600147b9c02fa6f15d69cb53d968fda", size = 7193136, upload-time = "2025-09-09T08:21:29.075Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ba/3e/daed796fd69cce768b8788401cc464ea90b306fb196ae1ffed0b98182859/scikit_learn-1.7.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:6b33579c10a3081d076ab403df4a4190da4f4432d443521674637677dc91e61f", size = 9336221, upload-time = "2025-09-09T08:20:19.328Z" }, + { url = "https://files.pythonhosted.org/packages/1c/ce/af9d99533b24c55ff4e18d9b7b4d9919bbc6cd8f22fe7a7be01519a347d5/scikit_learn-1.7.2-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:36749fb62b3d961b1ce4fedf08fa57a1986cd409eff2d783bca5d4b9b5fce51c", size = 8653834, upload-time = "2025-09-09T08:20:22.073Z" }, + { url = "https://files.pythonhosted.org/packages/58/0e/8c2a03d518fb6bd0b6b0d4b114c63d5f1db01ff0f9925d8eb10960d01c01/scikit_learn-1.7.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:7a58814265dfc52b3295b1900cfb5701589d30a8bb026c7540f1e9d3499d5ec8", size = 9660938, upload-time = "2025-09-09T08:20:24.327Z" }, + { url = "https://files.pythonhosted.org/packages/2b/75/4311605069b5d220e7cf5adabb38535bd96f0079313cdbb04b291479b22a/scikit_learn-1.7.2-cp310-cp310-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:4a847fea807e278f821a0406ca01e387f97653e284ecbd9750e3ee7c90347f18", size = 9477818, upload-time = "2025-09-09T08:20:26.845Z" }, + { url = "https://files.pythonhosted.org/packages/7f/9b/87961813c34adbca21a6b3f6b2bea344c43b30217a6d24cc437c6147f3e8/scikit_learn-1.7.2-cp310-cp310-win_amd64.whl", hash = "sha256:ca250e6836d10e6f402436d6463d6c0e4d8e0234cfb6a9a47835bd392b852ce5", size = 8886969, upload-time = "2025-09-09T08:20:29.329Z" }, + { url = "https://files.pythonhosted.org/packages/43/83/564e141eef908a5863a54da8ca342a137f45a0bfb71d1d79704c9894c9d1/scikit_learn-1.7.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:c7509693451651cd7361d30ce4e86a1347493554f172b1c72a39300fa2aea79e", size = 9331967, upload-time = "2025-09-09T08:20:32.421Z" }, + { url = "https://files.pythonhosted.org/packages/18/d6/ba863a4171ac9d7314c4d3fc251f015704a2caeee41ced89f321c049ed83/scikit_learn-1.7.2-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:0486c8f827c2e7b64837c731c8feff72c0bd2b998067a8a9cbc10643c31f0fe1", size = 8648645, upload-time = "2025-09-09T08:20:34.436Z" }, + { url = "https://files.pythonhosted.org/packages/ef/0e/97dbca66347b8cf0ea8b529e6bb9367e337ba2e8be0ef5c1a545232abfde/scikit_learn-1.7.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:89877e19a80c7b11a2891a27c21c4894fb18e2c2e077815bcade10d34287b20d", size = 9715424, upload-time = "2025-09-09T08:20:36.776Z" }, + { url = "https://files.pythonhosted.org/packages/f7/32/1f3b22e3207e1d2c883a7e09abb956362e7d1bd2f14458c7de258a26ac15/scikit_learn-1.7.2-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8da8bf89d4d79aaec192d2bda62f9b56ae4e5b4ef93b6a56b5de4977e375c1f1", size = 9509234, upload-time = "2025-09-09T08:20:38.957Z" }, + { url = "https://files.pythonhosted.org/packages/9f/71/34ddbd21f1da67c7a768146968b4d0220ee6831e4bcbad3e03dd3eae88b6/scikit_learn-1.7.2-cp311-cp311-win_amd64.whl", hash = "sha256:9b7ed8d58725030568523e937c43e56bc01cadb478fc43c042a9aca1dacb3ba1", size = 8894244, upload-time = "2025-09-09T08:20:41.166Z" }, + { url = "https://files.pythonhosted.org/packages/a7/aa/3996e2196075689afb9fce0410ebdb4a09099d7964d061d7213700204409/scikit_learn-1.7.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8d91a97fa2b706943822398ab943cde71858a50245e31bc71dba62aab1d60a96", size = 9259818, upload-time = "2025-09-09T08:20:43.19Z" }, + { url = "https://files.pythonhosted.org/packages/43/5d/779320063e88af9c4a7c2cf463ff11c21ac9c8bd730c4a294b0000b666c9/scikit_learn-1.7.2-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:acbc0f5fd2edd3432a22c69bed78e837c70cf896cd7993d71d51ba6708507476", size = 8636997, upload-time = "2025-09-09T08:20:45.468Z" }, + { url = "https://files.pythonhosted.org/packages/5c/d0/0c577d9325b05594fdd33aa970bf53fb673f051a45496842caee13cfd7fe/scikit_learn-1.7.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.whl", hash = "sha256:e5bf3d930aee75a65478df91ac1225ff89cd28e9ac7bd1196853a9229b6adb0b", size = 9478381, upload-time = "2025-09-09T08:20:47.982Z" }, + { url = "https://files.pythonhosted.org/packages/82/70/8bf44b933837ba8494ca0fc9a9ab60f1c13b062ad0197f60a56e2fc4c43e/scikit_learn-1.7.2-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:b4d6e9deed1a47aca9fe2f267ab8e8fe82ee20b4526b2c0cd9e135cea10feb44", size = 9300296, upload-time = "2025-09-09T08:20:50.366Z" }, + { url = "https://files.pythonhosted.org/packages/c6/99/ed35197a158f1fdc2fe7c3680e9c70d0128f662e1fee4ed495f4b5e13db0/scikit_learn-1.7.2-cp312-cp312-win_amd64.whl", hash = "sha256:6088aa475f0785e01bcf8529f55280a3d7d298679f50c0bb70a2364a82d0b290", size = 8731256, upload-time = "2025-09-09T08:20:52.627Z" }, +] + +[[package]] +name = "scikit-learn" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "joblib" }, + { name = "narwhals" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.12'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "threadpoolctl" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/fa/6f/37092bdb25f712817231799fc5674d8e704066a8a70c1d2d40517e18b4ab/scikit_learn-1.9.0.tar.gz", hash = "sha256:8833266989d3a5110178a9fae30783675460724d0e1efb13b14901d2c660c557", size = 7750767, upload-time = "2026-06-02T11:54:32.706Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f5/be/e844fd9586e66540a15b71924d17a6cbc1bb749e81ddd0a796bcdba4c055/scikit_learn-1.9.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:9db6f4d34e68c8899e4cab27fdf8eafe6ed21f2ba52ceb25ea250cd237f8e47b", size = 8789686, upload-time = "2026-06-02T11:53:05.439Z" }, + { url = "https://files.pythonhosted.org/packages/42/e2/ff880f62677a17d035817d543cb0fc8727d01eccbee81c5f7fc733a9d856/scikit_learn-1.9.0-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:f401448645a3e7bc115aa3c094097865155b34bff1cba8101857d9104e99074c", size = 8256782, upload-time = "2026-06-02T11:53:08.904Z" }, + { url = "https://files.pythonhosted.org/packages/25/64/eb40435e1a508ab1b4e284ce43ae80f6a162e5be5e38ed5a6fab467a9ea4/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:fd3a8ef0c758555a3b23c03adaa858af32f7736785ded50ad5991f59c4ed03fa", size = 8992419, upload-time = "2026-06-02T11:53:11.551Z" }, + { url = "https://files.pythonhosted.org/packages/8d/da/4810a28e473185429e45a57eebcc91fc991b33d889cc0676063e671db03d/scikit_learn-1.9.0-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f7e254636164090da847715a27f8e5478feb98c40a9e0ee90cbd277de9e5ceb8", size = 9281411, upload-time = "2026-06-02T11:53:15.063Z" }, + { url = "https://files.pythonhosted.org/packages/3b/67/be3d369f40d8178ba3bd86635d132e08cb5329b023e4669d9426d84bc007/scikit_learn-1.9.0-cp311-cp311-win_amd64.whl", hash = "sha256:5dc1818c77575d149e25fce9ef82dd7b7263ae372f03494158668ad632a69759", size = 8272736, upload-time = "2026-06-02T11:53:18.108Z" }, + { url = "https://files.pythonhosted.org/packages/37/79/a733f02dc2118da7e77a134b34f39f40201a353311b011d20859d2db3556/scikit_learn-1.9.0-cp311-cp311-win_arm64.whl", hash = "sha256:366652351f092b219c248f1e72821e841960a63d8f358f1dcfd54dc1cbdbbc28", size = 7919564, upload-time = "2026-06-02T11:53:21.2Z" }, + { url = "https://files.pythonhosted.org/packages/ac/20/75f915ff375d6249e6550ac740fdbbd66159a068fd3af1400ff62036b07a/scikit_learn-1.9.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:2bd41b0d201bc81575531b96b713d3eb5e5f50fb0b82101ff0f92294fdc236ac", size = 8741122, upload-time = "2026-06-02T11:53:24.08Z" }, + { url = "https://files.pythonhosted.org/packages/cc/d5/2b5148f2279196775e1db2aeb85d14b70ac80e7e32b3b28e7ebeafb0901d/scikit_learn-1.9.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:5be45aa4a42a68a533913a6ed736cf309de2226411c79ef8d609a5456f1939b1", size = 8261512, upload-time = "2026-06-02T11:53:27.183Z" }, + { url = "https://files.pythonhosted.org/packages/a0/ee/5adbc77656b71f9456a2f5a7a9fdb4bcf9207a6b962889f1c2f9323afa4e/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:5e50ed4da51974e86e940690e9a3d82e729b62b5a49f7c9bac534d515d39d86f", size = 8837603, upload-time = "2026-06-02T11:53:30.328Z" }, + { url = "https://files.pythonhosted.org/packages/6c/c2/63fdda36c56437eeb44aaf9493c8bcd62ce230ab1598924fc626ffbfa943/scikit_learn-1.9.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:056c92bb67ad4c28463c2f2653d9701449201e7e7a9e94e321be0f71c4fef2b8", size = 9132097, upload-time = "2026-06-02T11:53:33.456Z" }, + { url = "https://files.pythonhosted.org/packages/83/a4/c8e67227c680e2259c8864ae72ff48b06e16a6f51253a22167aa02a8aa4e/scikit_learn-1.9.0-cp312-cp312-win_amd64.whl", hash = "sha256:4306775fad04cc4b472a1b15af1ae9cede1540fbfcc17fbce3767cd8dc7ae283", size = 8211173, upload-time = "2026-06-02T11:53:36.602Z" }, + { url = "https://files.pythonhosted.org/packages/cf/fd/3c0863792e98e67e9184aa4029288a175935eb65443afcd30d4f143450cf/scikit_learn-1.9.0-cp312-cp312-win_arm64.whl", hash = "sha256:26e22435f63bcdcf396b574273f29f13dd531f5ea035801f5be10ba1540a4e60", size = 7867451, upload-time = "2026-06-02T11:53:39.075Z" }, +] + +[[package]] +name = "scipy" +version = "1.15.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/0f/37/6964b830433e654ec7485e45a00fc9a27cf868d622838f6b6d9c5ec0d532/scipy-1.15.3.tar.gz", hash = "sha256:eae3cf522bc7df64b42cad3925c876e1b0b6c35c1337c93e12c0f366f55b0eaf", size = 59419214, upload-time = "2025-05-08T16:13:05.955Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/2f/4966032c5f8cc7e6a60f1b2e0ad686293b9474b65246b0c642e3ef3badd0/scipy-1.15.3-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a345928c86d535060c9c2b25e71e87c39ab2f22fc96e9636bd74d1dbf9de448c", size = 38702770, upload-time = "2025-05-08T16:04:20.849Z" }, + { url = "https://files.pythonhosted.org/packages/a0/6e/0c3bf90fae0e910c274db43304ebe25a6b391327f3f10b5dcc638c090795/scipy-1.15.3-cp310-cp310-macosx_12_0_arm64.whl", hash = "sha256:ad3432cb0f9ed87477a8d97f03b763fd1d57709f1bbde3c9369b1dff5503b253", size = 30094511, upload-time = "2025-05-08T16:04:27.103Z" }, + { url = "https://files.pythonhosted.org/packages/ea/b1/4deb37252311c1acff7f101f6453f0440794f51b6eacb1aad4459a134081/scipy-1.15.3-cp310-cp310-macosx_14_0_arm64.whl", hash = "sha256:aef683a9ae6eb00728a542b796f52a5477b78252edede72b8327a886ab63293f", size = 22368151, upload-time = "2025-05-08T16:04:31.731Z" }, + { url = "https://files.pythonhosted.org/packages/38/7d/f457626e3cd3c29b3a49ca115a304cebb8cc6f31b04678f03b216899d3c6/scipy-1.15.3-cp310-cp310-macosx_14_0_x86_64.whl", hash = "sha256:1c832e1bd78dea67d5c16f786681b28dd695a8cb1fb90af2e27580d3d0967e92", size = 25121732, upload-time = "2025-05-08T16:04:36.596Z" }, + { url = "https://files.pythonhosted.org/packages/db/0a/92b1de4a7adc7a15dcf5bddc6e191f6f29ee663b30511ce20467ef9b82e4/scipy-1.15.3-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:263961f658ce2165bbd7b99fa5135195c3a12d9bef045345016b8b50c315cb82", size = 35547617, upload-time = "2025-05-08T16:04:43.546Z" }, + { url = "https://files.pythonhosted.org/packages/8e/6d/41991e503e51fc1134502694c5fa7a1671501a17ffa12716a4a9151af3df/scipy-1.15.3-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:9e2abc762b0811e09a0d3258abee2d98e0c703eee49464ce0069590846f31d40", size = 37662964, upload-time = "2025-05-08T16:04:49.431Z" }, + { url = "https://files.pythonhosted.org/packages/25/e1/3df8f83cb15f3500478c889be8fb18700813b95e9e087328230b98d547ff/scipy-1.15.3-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:ed7284b21a7a0c8f1b6e5977ac05396c0d008b89e05498c8b7e8f4a1423bba0e", size = 37238749, upload-time = "2025-05-08T16:04:55.215Z" }, + { url = "https://files.pythonhosted.org/packages/93/3e/b3257cf446f2a3533ed7809757039016b74cd6f38271de91682aa844cfc5/scipy-1.15.3-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5380741e53df2c566f4d234b100a484b420af85deb39ea35a1cc1be84ff53a5c", size = 40022383, upload-time = "2025-05-08T16:05:01.914Z" }, + { url = "https://files.pythonhosted.org/packages/d1/84/55bc4881973d3f79b479a5a2e2df61c8c9a04fcb986a213ac9c02cfb659b/scipy-1.15.3-cp310-cp310-win_amd64.whl", hash = "sha256:9d61e97b186a57350f6d6fd72640f9e99d5a4a2b8fbf4b9ee9a841eab327dc13", size = 41259201, upload-time = "2025-05-08T16:05:08.166Z" }, + { url = "https://files.pythonhosted.org/packages/96/ab/5cc9f80f28f6a7dff646c5756e559823614a42b1939d86dd0ed550470210/scipy-1.15.3-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:993439ce220d25e3696d1b23b233dd010169b62f6456488567e830654ee37a6b", size = 38714255, upload-time = "2025-05-08T16:05:14.596Z" }, + { url = "https://files.pythonhosted.org/packages/4a/4a/66ba30abe5ad1a3ad15bfb0b59d22174012e8056ff448cb1644deccbfed2/scipy-1.15.3-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:34716e281f181a02341ddeaad584205bd2fd3c242063bd3423d61ac259ca7eba", size = 30111035, upload-time = "2025-05-08T16:05:20.152Z" }, + { url = "https://files.pythonhosted.org/packages/4b/fa/a7e5b95afd80d24313307f03624acc65801846fa75599034f8ceb9e2cbf6/scipy-1.15.3-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:3b0334816afb8b91dab859281b1b9786934392aa3d527cd847e41bb6f45bee65", size = 22384499, upload-time = "2025-05-08T16:05:24.494Z" }, + { url = "https://files.pythonhosted.org/packages/17/99/f3aaddccf3588bb4aea70ba35328c204cadd89517a1612ecfda5b2dd9d7a/scipy-1.15.3-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:6db907c7368e3092e24919b5e31c76998b0ce1684d51a90943cb0ed1b4ffd6c1", size = 25152602, upload-time = "2025-05-08T16:05:29.313Z" }, + { url = "https://files.pythonhosted.org/packages/56/c5/1032cdb565f146109212153339f9cb8b993701e9fe56b1c97699eee12586/scipy-1.15.3-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:721d6b4ef5dc82ca8968c25b111e307083d7ca9091bc38163fb89243e85e3889", size = 35503415, upload-time = "2025-05-08T16:05:34.699Z" }, + { url = "https://files.pythonhosted.org/packages/bd/37/89f19c8c05505d0601ed5650156e50eb881ae3918786c8fd7262b4ee66d3/scipy-1.15.3-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:39cb9c62e471b1bb3750066ecc3a3f3052b37751c7c3dfd0fd7e48900ed52982", size = 37652622, upload-time = "2025-05-08T16:05:40.762Z" }, + { url = "https://files.pythonhosted.org/packages/7e/31/be59513aa9695519b18e1851bb9e487de66f2d31f835201f1b42f5d4d475/scipy-1.15.3-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:795c46999bae845966368a3c013e0e00947932d68e235702b5c3f6ea799aa8c9", size = 37244796, upload-time = "2025-05-08T16:05:48.119Z" }, + { url = "https://files.pythonhosted.org/packages/10/c0/4f5f3eeccc235632aab79b27a74a9130c6c35df358129f7ac8b29f562ac7/scipy-1.15.3-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:18aaacb735ab38b38db42cb01f6b92a2d0d4b6aabefeb07f02849e47f8fb3594", size = 40047684, upload-time = "2025-05-08T16:05:54.22Z" }, + { url = "https://files.pythonhosted.org/packages/ab/a7/0ddaf514ce8a8714f6ed243a2b391b41dbb65251affe21ee3077ec45ea9a/scipy-1.15.3-cp311-cp311-win_amd64.whl", hash = "sha256:ae48a786a28412d744c62fd7816a4118ef97e5be0bee968ce8f0a2fba7acf3bb", size = 41246504, upload-time = "2025-05-08T16:06:00.437Z" }, + { url = "https://files.pythonhosted.org/packages/37/4b/683aa044c4162e10ed7a7ea30527f2cbd92e6999c10a8ed8edb253836e9c/scipy-1.15.3-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:6ac6310fdbfb7aa6612408bd2f07295bcbd3fda00d2d702178434751fe48e019", size = 38766735, upload-time = "2025-05-08T16:06:06.471Z" }, + { url = "https://files.pythonhosted.org/packages/7b/7e/f30be3d03de07f25dc0ec926d1681fed5c732d759ac8f51079708c79e680/scipy-1.15.3-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:185cd3d6d05ca4b44a8f1595af87f9c372bb6acf9c808e99aa3e9aa03bd98cf6", size = 30173284, upload-time = "2025-05-08T16:06:11.686Z" }, + { url = "https://files.pythonhosted.org/packages/07/9c/0ddb0d0abdabe0d181c1793db51f02cd59e4901da6f9f7848e1f96759f0d/scipy-1.15.3-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:05dc6abcd105e1a29f95eada46d4a3f251743cfd7d3ae8ddb4088047f24ea477", size = 22446958, upload-time = "2025-05-08T16:06:15.97Z" }, + { url = "https://files.pythonhosted.org/packages/af/43/0bce905a965f36c58ff80d8bea33f1f9351b05fad4beaad4eae34699b7a1/scipy-1.15.3-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:06efcba926324df1696931a57a176c80848ccd67ce6ad020c810736bfd58eb1c", size = 25242454, upload-time = "2025-05-08T16:06:20.394Z" }, + { url = "https://files.pythonhosted.org/packages/56/30/a6f08f84ee5b7b28b4c597aca4cbe545535c39fe911845a96414700b64ba/scipy-1.15.3-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:c05045d8b9bfd807ee1b9f38761993297b10b245f012b11b13b91ba8945f7e45", size = 35210199, upload-time = "2025-05-08T16:06:26.159Z" }, + { url = "https://files.pythonhosted.org/packages/0b/1f/03f52c282437a168ee2c7c14a1a0d0781a9a4a8962d84ac05c06b4c5b555/scipy-1.15.3-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:271e3713e645149ea5ea3e97b57fdab61ce61333f97cfae392c28ba786f9bb49", size = 37309455, upload-time = "2025-05-08T16:06:32.778Z" }, + { url = "https://files.pythonhosted.org/packages/89/b1/fbb53137f42c4bf630b1ffdfc2151a62d1d1b903b249f030d2b1c0280af8/scipy-1.15.3-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:6cfd56fc1a8e53f6e89ba3a7a7251f7396412d655bca2aa5611c8ec9a6784a1e", size = 36885140, upload-time = "2025-05-08T16:06:39.249Z" }, + { url = "https://files.pythonhosted.org/packages/2e/2e/025e39e339f5090df1ff266d021892694dbb7e63568edcfe43f892fa381d/scipy-1.15.3-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:0ff17c0bb1cb32952c09217d8d1eed9b53d1463e5f1dd6052c7857f83127d539", size = 39710549, upload-time = "2025-05-08T16:06:45.729Z" }, + { url = "https://files.pythonhosted.org/packages/e6/eb/3bf6ea8ab7f1503dca3a10df2e4b9c3f6b3316df07f6c0ded94b281c7101/scipy-1.15.3-cp312-cp312-win_amd64.whl", hash = "sha256:52092bc0472cfd17df49ff17e70624345efece4e1a12b23783a1ac59a1b728ed", size = 40966184, upload-time = "2025-05-08T16:06:52.623Z" }, +] + +[[package]] +name = "scipy" +version = "1.17.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/7a/97/5a3609c4f8d58b039179648e62dd220f89864f56f7357f5d4f45c29eb2cc/scipy-1.17.1.tar.gz", hash = "sha256:95d8e012d8cb8816c226aef832200b1d45109ed4464303e997c5b13122b297c0", size = 30573822, upload-time = "2026-02-23T00:26:24.851Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/df/75/b4ce781849931fef6fd529afa6b63711d5a733065722d0c3e2724af9e40a/scipy-1.17.1-cp311-cp311-macosx_10_14_x86_64.whl", hash = "sha256:1f95b894f13729334fb990162e911c9e5dc1ab390c58aa6cbecb389c5b5e28ec", size = 31613675, upload-time = "2026-02-23T00:16:00.13Z" }, + { url = "https://files.pythonhosted.org/packages/f7/58/bccc2861b305abdd1b8663d6130c0b3d7cc22e8d86663edbc8401bfd40d4/scipy-1.17.1-cp311-cp311-macosx_12_0_arm64.whl", hash = "sha256:e18f12c6b0bc5a592ed23d3f7b891f68fd7f8241d69b7883769eb5d5dfb52696", size = 28162057, upload-time = "2026-02-23T00:16:09.456Z" }, + { url = "https://files.pythonhosted.org/packages/6d/ee/18146b7757ed4976276b9c9819108adbc73c5aad636e5353e20746b73069/scipy-1.17.1-cp311-cp311-macosx_14_0_arm64.whl", hash = "sha256:a3472cfbca0a54177d0faa68f697d8ba4c80bbdc19908c3465556d9f7efce9ee", size = 20334032, upload-time = "2026-02-23T00:16:17.358Z" }, + { url = "https://files.pythonhosted.org/packages/ec/e6/cef1cf3557f0c54954198554a10016b6a03b2ec9e22a4e1df734936bd99c/scipy-1.17.1-cp311-cp311-macosx_14_0_x86_64.whl", hash = "sha256:766e0dc5a616d026a3a1cffa379af959671729083882f50307e18175797b3dfd", size = 22709533, upload-time = "2026-02-23T00:16:25.791Z" }, + { url = "https://files.pythonhosted.org/packages/4d/60/8804678875fc59362b0fb759ab3ecce1f09c10a735680318ac30da8cd76b/scipy-1.17.1-cp311-cp311-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:744b2bf3640d907b79f3fd7874efe432d1cf171ee721243e350f55234b4cec4c", size = 33062057, upload-time = "2026-02-23T00:16:36.931Z" }, + { url = "https://files.pythonhosted.org/packages/09/7d/af933f0f6e0767995b4e2d705a0665e454d1c19402aa7e895de3951ebb04/scipy-1.17.1-cp311-cp311-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:43af8d1f3bea642559019edfe64e9b11192a8978efbd1539d7bc2aaa23d92de4", size = 35349300, upload-time = "2026-02-23T00:16:49.108Z" }, + { url = "https://files.pythonhosted.org/packages/b4/3d/7ccbbdcbb54c8fdc20d3b6930137c782a163fa626f0aef920349873421ba/scipy-1.17.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:cd96a1898c0a47be4520327e01f874acfd61fb48a9420f8aa9f6483412ffa444", size = 35127333, upload-time = "2026-02-23T00:17:01.293Z" }, + { url = "https://files.pythonhosted.org/packages/e8/19/f926cb11c42b15ba08e3a71e376d816ac08614f769b4f47e06c3580c836a/scipy-1.17.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4eb6c25dd62ee8d5edf68a8e1c171dd71c292fdae95d8aeb3dd7d7de4c364082", size = 37741314, upload-time = "2026-02-23T00:17:12.576Z" }, + { url = "https://files.pythonhosted.org/packages/95/da/0d1df507cf574b3f224ccc3d45244c9a1d732c81dcb26b1e8a766ae271a8/scipy-1.17.1-cp311-cp311-win_amd64.whl", hash = "sha256:d30e57c72013c2a4fe441c2fcb8e77b14e152ad48b5464858e07e2ad9fbfceff", size = 36607512, upload-time = "2026-02-23T00:17:23.424Z" }, + { url = "https://files.pythonhosted.org/packages/68/7f/bdd79ceaad24b671543ffe0ef61ed8e659440eb683b66f033454dcee90eb/scipy-1.17.1-cp311-cp311-win_arm64.whl", hash = "sha256:9ecb4efb1cd6e8c4afea0daa91a87fbddbce1b99d2895d151596716c0b2e859d", size = 24599248, upload-time = "2026-02-23T00:17:34.561Z" }, + { url = "https://files.pythonhosted.org/packages/35/48/b992b488d6f299dbe3f11a20b24d3dda3d46f1a635ede1c46b5b17a7b163/scipy-1.17.1-cp312-cp312-macosx_10_14_x86_64.whl", hash = "sha256:35c3a56d2ef83efc372eaec584314bd0ef2e2f0d2adb21c55e6ad5b344c0dcb8", size = 31610954, upload-time = "2026-02-23T00:17:49.855Z" }, + { url = "https://files.pythonhosted.org/packages/b2/02/cf107b01494c19dc100f1d0b7ac3cc08666e96ba2d64db7626066cee895e/scipy-1.17.1-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:fcb310ddb270a06114bb64bbe53c94926b943f5b7f0842194d585c65eb4edd76", size = 28172662, upload-time = "2026-02-23T00:18:01.64Z" }, + { url = "https://files.pythonhosted.org/packages/cf/a9/599c28631bad314d219cf9ffd40e985b24d603fc8a2f4ccc5ae8419a535b/scipy-1.17.1-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:cc90d2e9c7e5c7f1a482c9875007c095c3194b1cfedca3c2f3291cdc2bc7c086", size = 20344366, upload-time = "2026-02-23T00:18:12.015Z" }, + { url = "https://files.pythonhosted.org/packages/35/f5/906eda513271c8deb5af284e5ef0206d17a96239af79f9fa0aebfe0e36b4/scipy-1.17.1-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:c80be5ede8f3f8eded4eff73cc99a25c388ce98e555b17d31da05287015ffa5b", size = 22704017, upload-time = "2026-02-23T00:18:21.502Z" }, + { url = "https://files.pythonhosted.org/packages/da/34/16f10e3042d2f1d6b66e0428308ab52224b6a23049cb2f5c1756f713815f/scipy-1.17.1-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e19ebea31758fac5893a2ac360fedd00116cbb7628e650842a6691ba7ca28a21", size = 32927842, upload-time = "2026-02-23T00:18:35.367Z" }, + { url = "https://files.pythonhosted.org/packages/01/8e/1e35281b8ab6d5d72ebe9911edcdffa3f36b04ed9d51dec6dd140396e220/scipy-1.17.1-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:02ae3b274fde71c5e92ac4d54bc06c42d80e399fec704383dcd99b301df37458", size = 35235890, upload-time = "2026-02-23T00:18:49.188Z" }, + { url = "https://files.pythonhosted.org/packages/c5/5c/9d7f4c88bea6e0d5a4f1bc0506a53a00e9fcb198de372bfe4d3652cef482/scipy-1.17.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:8a604bae87c6195d8b1045eddece0514d041604b14f2727bbc2b3020172045eb", size = 35003557, upload-time = "2026-02-23T00:18:54.74Z" }, + { url = "https://files.pythonhosted.org/packages/65/94/7698add8f276dbab7a9de9fb6b0e02fc13ee61d51c7c3f85ac28b65e1239/scipy-1.17.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:f590cd684941912d10becc07325a3eeb77886fe981415660d9265c4c418d0bea", size = 37625856, upload-time = "2026-02-23T00:19:00.307Z" }, + { url = "https://files.pythonhosted.org/packages/a2/84/dc08d77fbf3d87d3ee27f6a0c6dcce1de5829a64f2eae85a0ecc1f0daa73/scipy-1.17.1-cp312-cp312-win_amd64.whl", hash = "sha256:41b71f4a3a4cab9d366cd9065b288efc4d4f3c0b37a91a8e0947fb5bd7f31d87", size = 36549682, upload-time = "2026-02-23T00:19:07.67Z" }, + { url = "https://files.pythonhosted.org/packages/bc/98/fe9ae9ffb3b54b62559f52dedaebe204b408db8109a8c66fdd04869e6424/scipy-1.17.1-cp312-cp312-win_arm64.whl", hash = "sha256:f4115102802df98b2b0db3cce5cb9b92572633a1197c77b7553e5203f284a5b3", size = 24547340, upload-time = "2026-02-23T00:19:12.024Z" }, +] + +[[package]] +name = "scipy" +version = "1.18.0" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a7/25/c2700dfaf6442b4effaa91af24ebce5dc9d31bb4a69706313aae70d72cd0/scipy-1.18.0.tar.gz", hash = "sha256:67b2ad2ad54c72ca6d04975a9b2df8c3638c34ddd5b28738e94fc2b57929d378", size = 30774447, upload-time = "2026-06-19T15:01:43.456Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/6a/19/ca10ead60b0acc80b2b833c2c4a4f2ff753d0f58b811f70d911c7e94a25c/scipy-1.18.0-cp312-cp312-macosx_10_15_x86_64.whl", hash = "sha256:7bd21faaf5a1a3b2eff922d02db5f191b99a6518db9078a8fb23169f6d22259a", size = 31056519, upload-time = "2026-06-19T14:59:45.203Z" }, + { url = "https://files.pythonhosted.org/packages/96/72/1e6442a00cd2924d361aa1b642ab6373ec35c6fabf311a760be9f76e0f13/scipy-1.18.0-cp312-cp312-macosx_12_0_arm64.whl", hash = "sha256:265915e79107de9f946b855e50d7470d5893ec3f54b342e1aa6201cbdcd8bb6b", size = 28681889, upload-time = "2026-06-19T14:59:48.103Z" }, + { url = "https://files.pythonhosted.org/packages/9b/2d/11dd93d21e147a73ba22bd75c0b9208d3a2e0ec76d53170ce7d9029b1015/scipy-1.18.0-cp312-cp312-macosx_14_0_arm64.whl", hash = "sha256:9ab7b758be6940954a713ee466e2043e9f6e2ed965c1fce5c91039f4be3d90a9", size = 20423580, upload-time = "2026-06-19T14:59:50.665Z" }, + { url = "https://files.pythonhosted.org/packages/9c/01/93552f75e0d2a7dd115a45e59209c51e8d514daff02fc887d2623be06fe1/scipy-1.18.0-cp312-cp312-macosx_14_0_x86_64.whl", hash = "sha256:97b6cddaaee0a779ef6b5ca83c9604b27cc16b2b8fc22c142652df8793319fb8", size = 23054441, upload-time = "2026-06-19T14:59:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/3c/23/21f5e703643d66f21faa6b4c73195bfcad70c55efcb4f1ab327cd7c4101a/scipy-1.18.0-cp312-cp312-manylinux_2_27_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:52a96e21517c7292375c0e27dd796a811f03fcea5fd4d108fdfea8145dcf17ab", size = 33968720, upload-time = "2026-06-19T14:59:56.415Z" }, + { url = "https://files.pythonhosted.org/packages/dd/aa/1b939f6c67ed68635bb538e6752d3dacc02f66535182e939a89581a44e9c/scipy-1.18.0-cp312-cp312-manylinux_2_27_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1f55797419e16e7f30cf88ffb3113ce0467f00cfe3f70d5c281730b21769bfc2", size = 35287115, upload-time = "2026-06-19T14:59:59.411Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ff/eec46be7e9234208f801062b53e1983085eddebd693f6c9bfb03b459830d/scipy-1.18.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ad033410e2e0672ffdc1042110cef20e1c46f8fd0616cee1d44d8d58fad8fc11", size = 35577989, upload-time = "2026-06-19T15:00:02.235Z" }, + { url = "https://files.pythonhosted.org/packages/84/ca/210d4759c7210bb7d269437421959b39a33434e2776b60c5cb8a763bb30a/scipy-1.18.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:4a55985d54c769c872e64b7f4c8a81cc30ef700cc04296abbbf3705439c126de", size = 37421717, upload-time = "2026-06-19T15:00:05.102Z" }, + { url = "https://files.pythonhosted.org/packages/2b/54/9a9edb45345bd6744da5ddfb6628e5d5185920494c6a67ec45b6381004cb/scipy-1.18.0-cp312-cp312-win_amd64.whl", hash = "sha256:71ccc8faa2dd16ac310233203474a8b5cb67f10dedd54a3116d34943f4b19132", size = 36597428, upload-time = "2026-06-19T15:00:08.112Z" }, + { url = "https://files.pythonhosted.org/packages/99/0e/33f32a2a58987e26aec0f7df252cbbad1e90ae77bdbc76f40dd4ed0cf0ea/scipy-1.18.0-cp312-cp312-win_arm64.whl", hash = "sha256:d88363fd9d8fbd3511bd273f1a49efb2a540773ddf92a91d57498ce7dd7f3e76", size = 24351481, upload-time = "2026-06-19T15:00:11.103Z" }, +] + +[[package]] +name = "seaborn" +version = "0.13.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/86/59/a451d7420a77ab0b98f7affa3a1d78a313d2f7281a57afb1a34bae8ab412/seaborn-0.13.2.tar.gz", hash = "sha256:93e60a40988f4d65e9f4885df477e2fdaff6b73a9ded434c1ab356dd57eefff7", size = 1457696, upload-time = "2024-01-25T13:21:52.551Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/83/11/00d3c3dfc25ad54e731d91449895a79e4bf2384dc3ac01809010ba88f6d5/seaborn-0.13.2-py3-none-any.whl", hash = "sha256:636f8336facf092165e27924f223d3c62ca560b1f2bb5dff7ab7fad265361987", size = 294914, upload-time = "2024-01-25T13:21:49.598Z" }, +] + +[[package]] +name = "setuptools" +version = "83.0.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/26/f5d29e25ffdb535afef2d35cdb55b325298f96debd670da4c325e08d70f4/setuptools-83.0.0.tar.gz", hash = "sha256:025bccbbf0fa05b6192bc64ae1e7b16e001fd6d6d4d5de03c97b1c1ade523bef", size = 1154254, upload-time = "2026-07-04T15:31:22.699Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/40/e1e72872c6354b306daef1703549e8e83b4d43cfea356311bf722a043752/setuptools-83.0.0-py3-none-any.whl", hash = "sha256:29b23c360f22f414dc7336bb39178cc7bcbf6021ed2733cde173f09dba19abb3", size = 1008090, upload-time = "2026-07-04T15:31:20.885Z" }, +] + +[[package]] +name = "simsimd" +version = "6.5.16" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/99/8c/070a179eb509b689509dacbd0bc81aa2e36614aff2c8aa6dc6c440886206/simsimd-6.5.16.tar.gz", hash = "sha256:0a005c6e2dacec83f235a747f7dbecca46b5d4d1e183ecc1929ca556ee7d7564", size = 187216, upload-time = "2026-03-07T14:36:23.191Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/f2/23a59a3205e8dc9bde99b3e536e699bea15a974717b68730c94fa4d99795/simsimd-6.5.16-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:192b6381ac8a9fe73b700fd97c65b326de261d2ee71c8ae9a264a0be889e50a5", size = 106357, upload-time = "2026-03-07T14:34:27.077Z" }, + { url = "https://files.pythonhosted.org/packages/a8/f6/fcbe1945971929c0a17955c5f9e79b9917e4bbc928a32eec63b0411f81c0/simsimd-6.5.16-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0829067b6a618b0dc68e221d3856ce38f86f55f38327c381977de08777081b39", size = 94637, upload-time = "2026-03-07T14:34:28.837Z" }, + { url = "https://files.pythonhosted.org/packages/f4/d5/5e64fa2ef2ec94554785b94bec390113c587ae37bde79ac2827e71b0c180/simsimd-6.5.16-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:01b8cbd7f47062e5b42b9782b092a3ea9afd569920ac3af85b306af91d3a14d9", size = 384591, upload-time = "2026-03-07T14:34:30.509Z" }, + { url = "https://files.pythonhosted.org/packages/de/df/464cc7bae76a5ab26463d040debbbf371cb454b071b98f99438a2462779d/simsimd-6.5.16-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:359a68159358645204055a60a29586bad5d57e6e5db4938d4335622c20a2b74b", size = 582802, upload-time = "2026-03-07T14:34:32.176Z" }, + { url = "https://files.pythonhosted.org/packages/78/31/f310a22c0d007f2f292891ed8a5eeb61fc7c6b86ebbbc11ff70bdae4d8f8/simsimd-6.5.16-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:e8a4741010989247883269c738d377d8e99b18730a1aeb9117fff2cd0575bbfe", size = 420949, upload-time = "2026-03-07T14:34:33.774Z" }, + { url = "https://files.pythonhosted.org/packages/9a/04/68fd6c087580653b5cfd30616cb1280297b565583b01971cc30d61c9d507/simsimd-6.5.16-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:5638c6a80e63c5da4861058e566b2e8dd6022a7264e673a8866773b8212cf09f", size = 619077, upload-time = "2026-03-07T14:34:35.501Z" }, + { url = "https://files.pythonhosted.org/packages/d0/a7/0709e0c40e4da029751a1fd84aa845aa93305ce75ce72350070643ce6b5f/simsimd-6.5.16-cp310-cp310-win_amd64.whl", hash = "sha256:6011396dfb4092a08bcde8deaff66c4c8ea67946db097ce34a3f9a6cf52edbbf", size = 87204, upload-time = "2026-03-07T14:34:37.132Z" }, + { url = "https://files.pythonhosted.org/packages/13/66/1205a5d18e1f7ff4da493c869b9c5bb4357e579fbcce7929c36398c6a211/simsimd-6.5.16-cp310-cp310-win_arm64.whl", hash = "sha256:21c95b614cf2d75a2b78e9ce30473fbba2825dbbe35aae3655aa133b0fdfd3e0", size = 62785, upload-time = "2026-03-07T14:34:38.385Z" }, + { url = "https://files.pythonhosted.org/packages/9f/10/93491bebccde37c30989bc576f00814296765977c5f26f66c02041a02986/simsimd-6.5.16-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f3df3dcbeba9571ff08b847c51af69accb71962075aec730a6baf8878bccc196", size = 106357, upload-time = "2026-03-07T14:34:39.927Z" }, + { url = "https://files.pythonhosted.org/packages/9d/9a/e889c90bf3c26ed54ff9cee33a63eca3325ed5600b3ba7808f68cb807040/simsimd-6.5.16-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:2802bc828bc5d22cec0b9a01f8fa3b0bf4df699f30ca05309035d1f57400fa07", size = 94632, upload-time = "2026-03-07T14:34:41.469Z" }, + { url = "https://files.pythonhosted.org/packages/1c/23/e6f8419702f5e40e8630c238daaa992bae78bcaa2f650e6fe3ac941a1e3b/simsimd-6.5.16-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:49a7df7634db3d451cb9842857912032f4397704fb0fd0c857d2017474c2a6ac", size = 385467, upload-time = "2026-03-07T14:34:42.671Z" }, + { url = "https://files.pythonhosted.org/packages/63/ab/ed2272a7a3ed9a104a3224b0f3a389e051c11da67f9c4e8799397cef241e/simsimd-6.5.16-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:34c34c95a32c881ce2d64cec445c82d33f2e350ca02ad50b053a78407d6163ba", size = 583762, upload-time = "2026-03-07T14:34:44.666Z" }, + { url = "https://files.pythonhosted.org/packages/16/78/e0d543a640716b3d88be623cd43c206c41b816dcd8e02b144ffa8a9b09dd/simsimd-6.5.16-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:0c924b690a6654665c1ad44344efb02a6e26d57c2ef2055cc947f8e05e7f7727", size = 421683, upload-time = "2026-03-07T14:34:46.403Z" }, + { url = "https://files.pythonhosted.org/packages/f5/ee/88e281220ca1b262d7fb0fd38963fa849c1345b66e30c62bd7e3651719ec/simsimd-6.5.16-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:565e39ee1b816498c65fec4ac398f75a83d2d2479c5a4e9db4e5e63b228fa86b", size = 619758, upload-time = "2026-03-07T14:34:47.874Z" }, + { url = "https://files.pythonhosted.org/packages/f4/10/64f681865af5bae1158c7d85b3e715e9be1f9987d6d73776ccd46cb6f75a/simsimd-6.5.16-cp311-cp311-win_amd64.whl", hash = "sha256:30d1450f8d111d3f50cf3d1cee893ece23f0f3f959a18057d0fed0b7a206a9e1", size = 87200, upload-time = "2026-03-07T14:34:49.533Z" }, + { url = "https://files.pythonhosted.org/packages/71/e4/db8fcbbd7c323782ccc3bb68e1dab96fe97e38bff327e9fccbfc891ba990/simsimd-6.5.16-cp311-cp311-win_arm64.whl", hash = "sha256:dfc5de474d502a5e85c57f2e26a9ec0e1fd426d97f6d3a2347a133dc10205801", size = 62785, upload-time = "2026-03-07T14:34:50.882Z" }, + { url = "https://files.pythonhosted.org/packages/52/b8/53f89ca12a3526b86c4221de68497d2b1f4c3f7f6b47d8c153ef14c67d15/simsimd-6.5.16-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:7f8a207a23bc9060a46b234ec304a712f1cbb0a240d18b484bad5cabf0d01746", size = 105152, upload-time = "2026-03-07T14:34:52.203Z" }, + { url = "https://files.pythonhosted.org/packages/56/4f/0fa014163c6b846182f6355ebfc24f79e86ced7a2cce0ca95ba711f19e04/simsimd-6.5.16-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:51c6b0ad0078f8c6b4d3ae4ec256bcf861c2bf5909d4567440b86f9ad7f94fd3", size = 94599, upload-time = "2026-03-07T14:34:53.564Z" }, + { url = "https://files.pythonhosted.org/packages/fb/3c/35266c8d128ea42706d9436b54994039e2659fb37ed28f1c62e123a86631/simsimd-6.5.16-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:13b8af340ad5cc1311cae6f8d778aef80bff1922260dee1a17ca60878eaac466", size = 385042, upload-time = "2026-03-07T14:34:54.873Z" }, + { url = "https://files.pythonhosted.org/packages/3c/28/7ae846998728326759eab771afd83ad721b6c10e9cef7da2b5ca9bdd4a7b/simsimd-6.5.16-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:12ae4f5f2ade1152d2d3a0094f56fae636204d40595b385ea9b304410647a353", size = 583515, upload-time = "2026-03-07T14:34:56.578Z" }, + { url = "https://files.pythonhosted.org/packages/ce/b9/3a5717c988b6093a5fb15484754f7ffe5451a7559f3c1d5f2b3183199441/simsimd-6.5.16-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:97bcda199d4be8f4372af6b781e96e7e8cd1838ce256a83deef75ac660dcd464", size = 421418, upload-time = "2026-03-07T14:34:58.316Z" }, + { url = "https://files.pythonhosted.org/packages/bb/65/e218050eb89390c64ddc327f36da8e3b471483f11c0f3683c2bf891d2dab/simsimd-6.5.16-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:a59ef1ab3d0f6d4f1dcac43e1b2db9b8e73c00e72714716e061bfd27dde2d652", size = 619558, upload-time = "2026-03-07T14:34:59.847Z" }, + { url = "https://files.pythonhosted.org/packages/45/89/a45ef421b70d557eac7d196b03e45ff9ff8c7c786b4e54dfb505c1efc0f1/simsimd-6.5.16-cp312-cp312-win_amd64.whl", hash = "sha256:e0ae95b0fe17c62532ecc66f03f6e9354641448249efabe6332eed0f5819150d", size = 87454, upload-time = "2026-03-07T14:35:01.778Z" }, + { url = "https://files.pythonhosted.org/packages/1d/68/620c859f8737990371f79a45e3dc7135374635011c89b9e403cadd746639/simsimd-6.5.16-cp312-cp312-win_arm64.whl", hash = "sha256:fcfcc79473141f42b1db05037cb626e196ed20cffa7f768d4cad34b2a1239965", size = 62912, upload-time = "2026-03-07T14:35:03.133Z" }, +] + +[[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 = "smart-open" +version = "8.0.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "wrapt" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/29/3e/79fd5fd2375a8a500b9ec2f6a0762fc1ac33e35582d4a87483a78d19408f/smart_open-8.0.0.tar.gz", hash = "sha256:5a2008d60688bd3b33c52e2ef666d3c60cf956e73e215de8c7b242cf56fdd1b2", size = 61520, upload-time = "2026-06-27T16:28:11.894Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b4/bd/1c92e69a1daff70118f21e18ef3a100c114f00f08b64a1074484f12d9020/smart_open-8.0.0-py3-none-any.whl", hash = "sha256:ff4f395c9e86f23e27771dc4ba756ad4bd145f181859a782c50d64168485761b", size = 73029, upload-time = "2026-06-27T16:28:10.589Z" }, +] + +[[package]] +name = "smmap" +version = "5.0.3" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1f/ea/49c993d6dfdd7338c9b1000a0f36817ed7ec84577ae2e52f890d1a4ff909/smmap-5.0.3.tar.gz", hash = "sha256:4d9debb8b99007ae47165abc08670bd74cb74b5227dda7f643eccc4e9eb5642c", size = 22506, upload-time = "2026-03-09T03:43:26.1Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/c1/d4/59e74daffcb57a07668852eeeb6035af9f32cbfd7a1d2511f17d2fe6a738/smmap-5.0.3-py3-none-any.whl", hash = "sha256:c106e05d5a61449cf6ba9a1e650227ecfb141590d2a98412103ff35d89fc7b2f", size = 24390, upload-time = "2026-03-09T03:43:24.361Z" }, +] + +[[package]] +name = "sortedcontainers" +version = "2.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/e8/c4/ba2f8066cceb6f23394729afe52f3bf7adec04bf9ed2c820b39e19299111/sortedcontainers-2.4.0.tar.gz", hash = "sha256:25caa5a06cc30b6b83d11423433f65d1f9d76c4c6a0c90e3379eaa43b9bfdb88", size = 30594, upload-time = "2021-05-16T22:03:42.897Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/46/9cb0e58b2deb7f82b84065f37f3bffeb12413f947f9388e4cac22c4621ce/sortedcontainers-2.4.0-py2.py3-none-any.whl", hash = "sha256:a163dcaede0f1c021485e957a39245190e74249897e2ae4b2aa38595db237ee0", size = 29575, upload-time = "2021-05-16T22:03:41.177Z" }, +] + +[[package]] +name = "soupsieve" +version = "2.8.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/47/2c/0a5f6f8ee0d5589e48c7640213ed5175d52cf540a06725b628cc1a45d6ce/soupsieve-2.8.4.tar.gz", hash = "sha256:e121fd02e975c695e4e9e8774a5ee35d74714b59307868dcc5319ad2d9e3328e", size = 121110, upload-time = "2026-05-24T13:55:57.154Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5e/f5/0c41cb68dcae6b7de4fac4188a3a9589e21fb31df21ea3a2e888db95e6c9/soupsieve-2.8.4-py3-none-any.whl", hash = "sha256:e7e6b0769c8f51ed59acab6e994b00621096cfb1c640a7509295987388fbaf65", size = 37304, upload-time = "2026-05-24T13:55:55.406Z" }, +] + +[[package]] +name = "sqlalchemy" +version = "2.0.51" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "greenlet", marker = "platform_machine == 'AMD64' or platform_machine == 'WIN32' or platform_machine == 'aarch64' or platform_machine == 'amd64' or platform_machine == 'ppc64le' or platform_machine == 'win32' or platform_machine == 'x86_64'" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/02/f1/a7a892f18d4d224e6b26f706531eafccc41e37594d37d304786969ee13cb/sqlalchemy-2.0.51.tar.gz", hash = "sha256:804dccd8a4a6242c4e30ad961e540e18a588f6527202f2d6791b01845d59fdc9", size = 9912201, upload-time = "2026-06-15T15:41:20.012Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/71/76/b3ea1d8842e7b62c718a88d302809003d65ed82011460ca48907dde658c4/sqlalchemy-2.0.51-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:0e8203d2fbd5c6254692ef0a72c740d75b2f3c7ca345404f4c1a4604813c77c0", size = 2162087, upload-time = "2026-06-15T16:05:15.795Z" }, + { url = "https://files.pythonhosted.org/packages/6c/22/f19552eb7876774d50cfd025337ef5d67acc10cd8f29adab7716cf47c352/sqlalchemy-2.0.51-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:1af05726b3d0cdba1c55284bf408fd3b792e690fe2399bfb8304565551cda652", size = 3244579, upload-time = "2026-06-15T16:10:36.165Z" }, + { url = "https://files.pythonhosted.org/packages/fc/97/e4a2eb5a8ec5cd3c2a0615a2f15f0afca89ac039229599b9ed0c0ed28e5e/sqlalchemy-2.0.51-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:2e54ff2dd657f2e3e0fbf2b097db1182f7bfea263eca4353f00065bae2a67c3d", size = 3243515, upload-time = "2026-06-15T16:12:22.627Z" }, + { url = "https://files.pythonhosted.org/packages/74/c6/5900ec624fab3360aa2ec59b99bb2046dd79799e310bb78a0514eaa4038e/sqlalchemy-2.0.51-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:1e47b1199c2e832e325eacabc8d32d2487f58c9358f97e9a00f5eb93c5680d84", size = 3195492, upload-time = "2026-06-15T16:10:38.097Z" }, + { url = "https://files.pythonhosted.org/packages/8f/41/2ee3c4e1ac4fd22309349823fe13f33febeab1a71db1d7e9d60293a07dcb/sqlalchemy-2.0.51-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c68568f3facf8f66fa76c60e0ced69b67666ffa9941d1d0a3756fda196049080", size = 3215782, upload-time = "2026-06-15T16:12:24.051Z" }, + { url = "https://files.pythonhosted.org/packages/ce/1c/3bd72c341f1cb5faed5a7457ea840228a46be51cfbaf31a9db72fc963f11/sqlalchemy-2.0.51-cp310-cp310-win32.whl", hash = "sha256:0592bdadf86ddcabfd72d9ab66ea8a5d8d2cc6be1cc51fa7e66c03868ac5eac1", size = 2122119, upload-time = "2026-06-15T16:13:26.915Z" }, + { url = "https://files.pythonhosted.org/packages/2a/63/b6dfdd646abf91c3bedb13727226a5e765e5f8365e898d43818e6672fa46/sqlalchemy-2.0.51-cp310-cp310-win_amd64.whl", hash = "sha256:740cf6f35351b1ac3d82369152acf1d51d37e3dcf85d4dc0a22ca01410eabe2a", size = 2145158, upload-time = "2026-06-15T16:13:28.386Z" }, + { url = "https://files.pythonhosted.org/packages/3a/69/a67c69e5f28fc9c99d6f7bd60bd50e91f2fed2423e3b30fb228fa00e51f3/sqlalchemy-2.0.51-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:1aa10c0daee6705294d181daadaa793221e1a59ed55000a3fab1d42b088ce4ba", size = 2161838, upload-time = "2026-06-15T16:05:17.144Z" }, + { url = "https://files.pythonhosted.org/packages/9a/a4/c8c22b8438bddc0a030157c6ec0f6ef97b3c38effa444bdab2a27af04090/sqlalchemy-2.0.51-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:a5b2ed6d828f1f09bd812861f4f59ca3bc3803f9df871f4555187f0faf018604", size = 3319402, upload-time = "2026-06-15T16:10:40.002Z" }, + { url = "https://files.pythonhosted.org/packages/90/54/44012d32fd77d991256d2ff793ba3807c51d40cb27a85b4796224f6744df/sqlalchemy-2.0.51-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:436728ce18a80f6951a1e11cc6112c2ede9faf20766f1a26195a7c441ca12dbd", size = 3319675, upload-time = "2026-06-15T16:12:25.658Z" }, + { url = "https://files.pythonhosted.org/packages/29/a5/de0592acaf5906cd7430874392d6f7e8b4a7c8437610953ee2d1501c0b44/sqlalchemy-2.0.51-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:dc261707bf5739aea8a541593f3cc1d463c2701fb05fbcbba0ce031b69a21260", size = 3270777, upload-time = "2026-06-15T16:10:42.125Z" }, + { url = "https://files.pythonhosted.org/packages/cb/14/a44c90739c780b362238e4ac3cb19dd0ca40d13e6ddc5daa112166ddab4f/sqlalchemy-2.0.51-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:a6d26094615306d116dd5e4a51b0304c99dd2356fc569eed6922a80a6bd3b265", size = 3293940, upload-time = "2026-06-15T16:12:27.156Z" }, + { url = "https://files.pythonhosted.org/packages/65/eb/fbd0f206a330e66f8c602a99c37c4e731f107faed62954b41b01f16dd9d9/sqlalchemy-2.0.51-cp311-cp311-win32.whl", hash = "sha256:ca8435d13829b92f4a97362d91975154a4015db3a2634154e1754e9a915e6b86", size = 2121183, upload-time = "2026-06-15T16:13:29.905Z" }, + { url = "https://files.pythonhosted.org/packages/ad/fd/005bf80f3cf6e5c62b5dd68616280f51cd012c60840fa74781b3ed7b1623/sqlalchemy-2.0.51-cp311-cp311-win_amd64.whl", hash = "sha256:4a011ea4510683319ce4ed274b56ee05194b39b6da9d09ca7a39388f0fa84dcc", size = 2145796, upload-time = "2026-06-15T16:13:31.283Z" }, + { url = "https://files.pythonhosted.org/packages/d5/70/e868bc5412acd101a8280f25c95f10eeae0771c4eb806b02491142810ee8/sqlalchemy-2.0.51-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7d78702b26ba1c18b2d0fb2ea940ba7f17a9581b42e8361ff93920ebbee1235a", size = 2160291, upload-time = "2026-06-15T16:08:48.918Z" }, + { url = "https://files.pythonhosted.org/packages/e5/1c/71ee0f8a6b9d7316a1ccd30430b4c62b6c2e36adc96017a4e3a72dce49d6/sqlalchemy-2.0.51-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:581921d849d6e6f994d560389192955e80e2950e18fcdfe2ccea863e01158e6e", size = 3343835, upload-time = "2026-06-15T16:19:42.613Z" }, + { url = "https://files.pythonhosted.org/packages/2b/7c/7ab9f9aadc5944fdd06612484ed7918fe376ad871a5f50404dc1536e0194/sqlalchemy-2.0.51-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:1d21ce524ab86c23046e992a5b81cb54c21079c6df6e78b8fc77d77cac70a6b9", size = 3358470, upload-time = "2026-06-15T16:26:38.011Z" }, + { url = "https://files.pythonhosted.org/packages/d0/7d/ff77169fee6186de145a7f2b87006c39638391130abbab2b1f63ac6ea583/sqlalchemy-2.0.51-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:c5d98a2709840027f5a347c3af0a7c3d5f6c1ff93af2ca1c54494e23cba8f389", size = 3289874, upload-time = "2026-06-15T16:19:45.212Z" }, + { url = "https://files.pythonhosted.org/packages/6f/3b/6c505903710d781b55bc3141ee34a062bf9745a6b5bc7333305b9ed63b33/sqlalchemy-2.0.51-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:1181256e0f16479691b5616d36375dc2620ad8332b25978763c3d206ad3f3f1d", size = 3321692, upload-time = "2026-06-15T16:26:39.747Z" }, + { url = "https://files.pythonhosted.org/packages/3c/b7/c5ffe50aa2f4d947c9250e1519d939260329a07fe6272edfccd784b3d007/sqlalchemy-2.0.51-cp312-cp312-win32.whl", hash = "sha256:9f380393be5abeb6815f68fd39271b95127173511b6706b0a630a9995d53f8f5", size = 2119674, upload-time = "2026-06-15T16:23:09.543Z" }, + { url = "https://files.pythonhosted.org/packages/25/dc/46a65916af68a06ef6b972c6050ba4c8f97070fe3fb33097d34229d9bef6/sqlalchemy-2.0.51-cp312-cp312-win_amd64.whl", hash = "sha256:2cf39aabdf48e87c1c2c2ed6d20d33ffa0733b3071ce9c5f66357947dd009080", size = 2146670, upload-time = "2026-06-15T16:23:11.048Z" }, + { url = "https://files.pythonhosted.org/packages/e2/22/dbf013a12ec759e54a34a119e9e217435b3f71b2dd5c61a7ade0a25dae87/sqlalchemy-2.0.51-py3-none-any.whl", hash = "sha256:bb024d8b621d0be75f4f44ecc7c950450026e76d66dc8f791bb5331d7fed59d5", size = 1944334, upload-time = "2026-06-15T16:09:22.418Z" }, +] + +[[package]] +name = "sse-starlette" +version = "3.4.5" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d2/1b/bc9e3e7a72dcdad7dc7888758f5d00f56f8909ed5cfdff822bd72bb4c520/sse_starlette-3.4.5.tar.gz", hash = "sha256:83072538bc211a2f68b7b0422226c4af3e9b62e106e07034664b832ca019842a", size = 35249, upload-time = "2026-06-20T17:36:58.322Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/78/75/c88d3f5dafd59c791da1ce27650d30bf5b70cbf1cbf01cd00e5f9e360915/sse_starlette-3.4.5-py3-none-any.whl", hash = "sha256:e71bad53323f65573c3864a6c3bd0c1eb6e5f092b2e48082b0c35927d19ca296", size = 16518, upload-time = "2026-06-20T17:36:56.729Z" }, +] + +[[package]] +name = "sseclient-py" +version = "1.9.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4d/2e/59920f7d66b7f9932a3d83dd0ec53fab001be1e058bf582606fe414a5198/sseclient_py-1.9.0-py3-none-any.whl", hash = "sha256:340062b1587fc2880892811e2ab5b176d98ef3eee98b3672ff3a3ba1e8ed0f6f", size = 8351, upload-time = "2026-01-02T23:39:30.995Z" }, +] + +[[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 = "starlette" +version = "0.52.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c4/68/79977123bb7be889ad680d79a40f339082c1978b5cfcf62c2d8d196873ac/starlette-0.52.1.tar.gz", hash = "sha256:834edd1b0a23167694292e94f597773bc3f89f362be6effee198165a35d62933", size = 2653702, upload-time = "2026-01-18T13:34:11.062Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/0d/13d1d239a25cbfb19e740db83143e95c772a1fe10202dda4b76792b114dd/starlette-0.52.1-py3-none-any.whl", hash = "sha256:0029d43eb3d273bc4f83a08720b4912ea4b071087a3b48db01b7c839f7954d74", size = 74272, upload-time = "2026-01-18T13:34:09.188Z" }, +] + +[[package]] +name = "starlette-exporter" +version = "0.23.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "prometheus-client" }, + { name = "starlette" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b9/74/173c13e7257a358f275938b767bb8c4ac6a750f199095e1b09e4e7468555/starlette_exporter-0.23.0.tar.gz", hash = "sha256:f80998db2d4a3462808a9bce56950046b113d3fab6ec6c20cb6de4431d974969", size = 22383, upload-time = "2024-06-26T04:05:28.55Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a8/70/935e2ae3ca22a90aec8c935570115bf978cfb58c90110c179d79762d699c/starlette_exporter-0.23.0-py3-none-any.whl", hash = "sha256:ea1a27f2aae48122931e2384a361a03e00261efbb4a665ce1ae2e46f29123d5e", size = 16034, upload-time = "2024-06-26T04:05:26.423Z" }, +] + +[[package]] +name = "strawberry-graphql" +version = "0.316.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "cross-web" }, + { name = "graphql-core" }, + { name = "packaging" }, + { name = "python-dateutil" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cf/09/f189fd3c70544322eeba0398ccaa980d17857894c0a66d447aa0b5704686/strawberry_graphql-0.316.0.tar.gz", hash = "sha256:bee5ce0e20d522325bd1ed2db186c812c03c2ea7db29f997b35e7d694649820c", size = 223985, upload-time = "2026-05-19T17:06:10.443Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0b/dd/b2cf54803cbd0d37e3ce73c7274bdb144ba83743bc83351b5790eb2a5fad/strawberry_graphql-0.316.0-py3-none-any.whl", hash = "sha256:222e16fbbf953f5a1fa75f62bf9a8e95f274180f928f70bec459b566053aa2cb", size = 326530, upload-time = "2026-05-19T17:06:07.844Z" }, +] + +[[package]] +name = "stringzilla" +version = "4.4.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/27/62c3b95d6544c13ae3800cfc8a0e65098c6e1bae038ebc96efd1c930c189/stringzilla-4.4.0.tar.gz", hash = "sha256:e82870bec8aa10c212ca041642fde2d4c4539952806f422bef132b0cb309369b", size = 549968, upload-time = "2025-11-29T16:28:48.406Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d6/77/8bc96f9d033f6010f105d7cde07e6c8a4d3eba19065431a801bbe9fdab3f/stringzilla-4.4.0-cp310-cp310-macosx_10_13_x86_64.whl", hash = "sha256:a96b5ab76b63d2ef8e940e1bfc4a206213c7ac6cc43f6ee99ab59eadce1e9596", size = 178924, upload-time = "2025-11-29T16:26:17.365Z" }, + { url = "https://files.pythonhosted.org/packages/12/13/34663fcb09d2ad165b0b44a92dabcf1f7e8d9a8124e5ed82f0ecf5146083/stringzilla-4.4.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:4ac2d744712808797762410c08772c1e56ab76b9f1b5b68e69d193eb14a067b7", size = 164763, upload-time = "2025-11-29T16:26:18.953Z" }, + { url = "https://files.pythonhosted.org/packages/bc/05/19037326b5b3f5609398602faf52df6639188203bf489baa1f18f9a233b8/stringzilla-4.4.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d5bfff59dcebf2fac2050cb8491e2aad5b77f3aa2e34cc234ff26bbf1417baa0", size = 563384, upload-time = "2025-11-29T16:26:20.709Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/d0f974779a88b52b5598e3c5e596c3f12c5d2869958f1373cdd761d14ff3/stringzilla-4.4.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:23327df5349dcb3515786f8ccda82dca503a62f8347f40160bd0c7f8e9f3a872", size = 525940, upload-time = "2025-11-29T16:26:22.038Z" }, + { url = "https://files.pythonhosted.org/packages/fe/87/97cee85cfa75d1ea47b2b99aaa9f03a1b99a75e8a12837bf447678aefa8c/stringzilla-4.4.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.manylinux_2_28_s390x.whl", hash = "sha256:b47c4999f0c119ee89c4d6efaccb04b02fe412e14b9bfd33a0a6fa08e0169c1e", size = 501844, upload-time = "2025-11-29T16:26:23.737Z" }, + { url = "https://files.pythonhosted.org/packages/8d/12/7925e8af07d9edf29ab0730c114507e313350b12e9de8d1d75f7d93b3f40/stringzilla-4.4.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:d7ac6a21f9f46498d34e4fd65ca09924d0be3fb02f40efab239682ec39e9dd62", size = 837300, upload-time = "2025-11-29T16:26:25.363Z" }, + { url = "https://files.pythonhosted.org/packages/26/b3/0f33afd307f8a8c7b95c511f508ec3e182b9da2397b31b5cb5dca410213e/stringzilla-4.4.0-cp310-cp310-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:57f0d9b392dcbfb48a8a70392ce8206265569ce134ad4113a580449a28e7c7cb", size = 505597, upload-time = "2025-11-29T16:26:27.112Z" }, + { url = "https://files.pythonhosted.org/packages/d3/53/bdc854ecba375b1f48537a6c11e550ae207849fd4c8f2273ca5cf11aa586/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:545b837523f7fa7571bf7a5054b203fdcc0e5b93f5fbd6a6193ec5d3e5b8ca5e", size = 542127, upload-time = "2025-11-29T16:26:28.414Z" }, + { url = "https://files.pythonhosted.org/packages/54/e1/9db404cb65370d6327beaaad0f3dff89552db26118a995d40f25817acc23/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:95da2c9ecee97500ff97be08b16d5aa75226b5fc82933610512a1651e0bbc824", size = 504800, upload-time = "2025-11-29T16:26:29.619Z" }, + { url = "https://files.pythonhosted.org/packages/6e/57/06d8bbcd0352dd0be4b8ea0ded43ec5a091acd6e874f722d2f6f9bcf072c/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_i686.whl", hash = "sha256:63d6fe5e0c8cebb748fd8ec0b98e2d6640bb630c2eecdf1873cb372445838819", size = 512262, upload-time = "2025-11-29T16:26:31.255Z" }, + { url = "https://files.pythonhosted.org/packages/ed/24/0a6015efed14f5019a6fb7650b3bf24c323b7137d06589979715ac32b118/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:e902e1e7ade9fee13a6322ee9d2b3ad91a946c3b6982424ca897f1faaca04ee5", size = 501482, upload-time = "2025-11-29T16:26:32.66Z" }, + { url = "https://files.pythonhosted.org/packages/0f/c3/dda5770cd7a96ef9deb0e4c730fea6fd4a5c319a18459fbf6472952bdb51/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:37d1b856336a290afce71f7975852fe34f0ef1062f234e5866a5b4f0f903f9e4", size = 493513, upload-time = "2025-11-29T16:26:34.045Z" }, + { url = "https://files.pythonhosted.org/packages/34/81/a107c8de85bbce042c91858a75cbaa836747b6b029f4bdc462619280ecfc/stringzilla-4.4.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:c96bd03ee2fbbe3877ab310dcd26f08b7adc4718399e8987721298968f15d058", size = 805711, upload-time = "2025-11-29T16:26:35.481Z" }, + { url = "https://files.pythonhosted.org/packages/b2/63/15a52dac699271f74c018771c8013e5df83804d5d839dcd72aab03014fec/stringzilla-4.4.0-cp310-cp310-win32.whl", hash = "sha256:db62637dd1b64aa50a996897a2f5b2f8c81bf2fce4137665b485b3dae55b794b", size = 99766, upload-time = "2025-11-29T16:26:36.868Z" }, + { url = "https://files.pythonhosted.org/packages/4e/a8/18946fcd478c3892a3e5095447a5a68db216b6251323045eebf10a749d7f/stringzilla-4.4.0-cp310-cp310-win_amd64.whl", hash = "sha256:35ed1f03a6e4a95cf0bd198e915159e98aec9c99d84a989a97e4b0a6d7fb95b1", size = 130941, upload-time = "2025-11-29T16:26:38.062Z" }, + { url = "https://files.pythonhosted.org/packages/6e/4d/b63256f9539534cdaa2c1a1d1586f8fa7ecdb8e01353040b4266490d57f3/stringzilla-4.4.0-cp310-cp310-win_arm64.whl", hash = "sha256:1b8bfb0dfbf149db1d735903fa1ba5f32a011b9079eca14c829b831fb08abf4c", size = 108538, upload-time = "2025-11-29T16:26:39.186Z" }, + { url = "https://files.pythonhosted.org/packages/6c/77/6999c4be208207875d979cdcd0caa4844f95d6f43561f4a0c9a9c133f570/stringzilla-4.4.0-cp311-cp311-macosx_10_13_x86_64.whl", hash = "sha256:494645f71e3b52b36e8be5f55524326022d033e77cfced305e980b176e4355b5", size = 178928, upload-time = "2025-11-29T16:26:40.907Z" }, + { url = "https://files.pythonhosted.org/packages/80/d7/e9d73ab6e77bb1191b8930c6071eff10407ae8e2ef210355c9f77ec2fc7f/stringzilla-4.4.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:dc6add7bdd246ce6337b5dda51b0839d4cc0117f93e19763d17d53d93480758b", size = 164799, upload-time = "2025-11-29T16:26:42.292Z" }, + { url = "https://files.pythonhosted.org/packages/1e/3b/e125ad18e815964a75711d828152e08dab32a83acca957670b296c999695/stringzilla-4.4.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:c70f80b5193e5e9c0d0450bb76953ae330558c9b59801d94f4c9827d6e1f4bd1", size = 567923, upload-time = "2025-11-29T16:26:44.028Z" }, + { url = "https://files.pythonhosted.org/packages/ff/4d/657ae2e7c647310464bea6ffb8c8d2d2f44d77e4d38835b205e96758a993/stringzilla-4.4.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:9ccd9898f56f79cfb57dc7385921a80f07c48afaca1604244d90c05a532c96e3", size = 532342, upload-time = "2025-11-29T16:26:45.34Z" }, + { url = "https://files.pythonhosted.org/packages/e1/61/b8b0358e682d0093f33c17195a21cb42d87626ba7af6870d9252381209dc/stringzilla-4.4.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f59fcb362e1bd60466ec2d73dfc5b0bf17082bcd5987fbd6863dd9fc29eeb571", size = 507518, upload-time = "2025-11-29T16:26:47.096Z" }, + { url = "https://files.pythonhosted.org/packages/be/84/3e741ceec6acf8d83c7f80e4f27f6b17744d4c098a55db69636e657a4535/stringzilla-4.4.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dedba349a35b93e8c46264fb31bc3c8f6ba5fc21b35c02020d23b3bbfe73c71b", size = 842518, upload-time = "2025-11-29T16:26:48.595Z" }, + { url = "https://files.pythonhosted.org/packages/60/08/c2aec376d356badc4fcb3cbfa1d02a2a98f1be0c1a6cebdbfd19a4ea05f4/stringzilla-4.4.0-cp311-cp311-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:6419761782802a2e542e5e5189c2fd45c58bb7f13443d0511c0e150dc5f6b4cd", size = 511605, upload-time = "2025-11-29T16:26:49.912Z" }, + { url = "https://files.pythonhosted.org/packages/18/83/1771016f90d4c6689a0046c7d9d2838365bbb475595f550be5d878a43c3a/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:e07c62f150972bb2c1a3daec745b4a7cf5e136c0e42e28f5cdea3fe95dde958d", size = 548529, upload-time = "2025-11-29T16:26:51.987Z" }, + { url = "https://files.pythonhosted.org/packages/c0/5f/93861dcbdebddecb5f1395815f443f4f2c9b77b451cfe2bcf4c013cc4265/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:a0ca33af2f55374454fd964f1f8ac7aa9b8ba2af02d8224d75d03f3bdad65e1d", size = 510070, upload-time = "2025-11-29T16:26:53.36Z" }, + { url = "https://files.pythonhosted.org/packages/b6/0f/8ef48188d81b026b0af2ec1bd3a171f263b63dc6f7321686169c67cf8d06/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_i686.whl", hash = "sha256:ebf94e897b546ac89689a1e3625bbe51c340600fff2371ab4a75179bfcad1fad", size = 519173, upload-time = "2025-11-29T16:26:54.751Z" }, + { url = "https://files.pythonhosted.org/packages/aa/21/c8613e293bfff554d96fcb6ba39284aec49c5860222bd661336830413f19/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:328f5812b8a295e58c72120227a0b1ebe20888a59dd4e0ddfbcd9f9f1e2d15d4", size = 506865, upload-time = "2025-11-29T16:26:56.52Z" }, + { url = "https://files.pythonhosted.org/packages/be/3e/69d6720f8983d84e65f3c798b319fe25c30f10ffae4736f0bae14e06420b/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:ed8cb47f8008af21c4c63e19c2bb8041f7adb8fa29d94501ed4e93be8d8c1d00", size = 499009, upload-time = "2025-11-29T16:26:58.013Z" }, + { url = "https://files.pythonhosted.org/packages/f5/bf/2a2ae56a10c08054bacf2b65956451ce859903cc87552eeeaf2132831e69/stringzilla-4.4.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:4ebfb6a1c5726afa0434328090ec595b982710390e17441272bce6e00c8048aa", size = 810835, upload-time = "2025-11-29T16:26:59.521Z" }, + { url = "https://files.pythonhosted.org/packages/98/ac/a315929de248944406ce39b8c57194a9ab801e167a9abec11f71f00593b9/stringzilla-4.4.0-cp311-cp311-win32.whl", hash = "sha256:7e6e666a70587cb40b85941cae1e833fc6268d0caaf74d184748ce8c82acb633", size = 99767, upload-time = "2025-11-29T16:27:01.345Z" }, + { url = "https://files.pythonhosted.org/packages/71/31/51b16d573c68ae2cb9311aed2ba247f3718efd1cc7a7abf6e3173c033932/stringzilla-4.4.0-cp311-cp311-win_amd64.whl", hash = "sha256:c020dd9545bae1dc140d5f6fdd18c6dd77b3f81b91b985e624c9a99a48b80367", size = 130857, upload-time = "2025-11-29T16:27:03.084Z" }, + { url = "https://files.pythonhosted.org/packages/7a/8f/53d7b5e2b4ea30c4250221adbfdad30356e84a0f636db532811b081ba4d3/stringzilla-4.4.0-cp311-cp311-win_arm64.whl", hash = "sha256:0862e064b4252f98b438e842ba85939933afca80ca66e55a379ec93d960f7c44", size = 108529, upload-time = "2025-11-29T16:27:04.414Z" }, + { url = "https://files.pythonhosted.org/packages/ad/63/7db69b48592dabd42720fb43ac8d2e4bed51ce330fabfae5bdd4d5eb5aee/stringzilla-4.4.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:dd90b26c64c29f086c7734dd70add53e5b36911c4112b4501cb3291b45c90f9a", size = 179541, upload-time = "2025-11-29T16:27:05.839Z" }, + { url = "https://files.pythonhosted.org/packages/45/1b/6b8636fbdef058d178b4c7170a9806eeb9822a03674f381563bcc417e021/stringzilla-4.4.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:152177078fd85472745a010a0ef84f69108a563dcc6720a0d0da9ea371037330", size = 165078, upload-time = "2025-11-29T16:27:07.213Z" }, + { url = "https://files.pythonhosted.org/packages/61/82/94d4e59a21ccf9ee114fe26a6879bca4170e0e98debf2658bbde0c70b058/stringzilla-4.4.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:18641b3ee1cec177a954a4ad156654a484fdd90b99c49418e9e0f7744efd18a6", size = 567643, upload-time = "2025-11-29T16:27:09.07Z" }, + { url = "https://files.pythonhosted.org/packages/7a/40/1cc679d71e5e90aca25de425661063a9eb19014ec49e46b435c00e67ee0e/stringzilla-4.4.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:ffa21e0c63647551d8a9f2eb0a04a7ce8c99d8f6caddae6313666eee8c32d4aa", size = 532793, upload-time = "2025-11-29T16:27:10.518Z" }, + { url = "https://files.pythonhosted.org/packages/78/cc/81a8276bfac5d19b3ddd140022ce3fe43ca27642bf47cbf82fb5330514bb/stringzilla-4.4.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.manylinux_2_28_s390x.whl", hash = "sha256:f96bd65ac4b91b9fdc4031a88e9776e9a28a12c4051c7dd642ead71d79999fc9", size = 507879, upload-time = "2025-11-29T16:27:12.506Z" }, + { url = "https://files.pythonhosted.org/packages/c5/d4/dfcb921577bfce9c6c0be0a602dc4cfc45765e603c18bd7dd0c219de4741/stringzilla-4.4.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:dc652fd7496c887fb0fd3d81ab77f8e5e74b9f7ffa6db70c29da36432223b80f", size = 844457, upload-time = "2025-11-29T16:27:14.472Z" }, + { url = "https://files.pythonhosted.org/packages/fe/cf/cba271504243176974b9582847acb8a4f7405bf530e3503f4538f4d6369e/stringzilla-4.4.0-cp312-cp312-manylinux_2_5_i686.manylinux1_i686.manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:bb10f9bf2ff1e92c05a41749c1916d95df7e7e6e90068a39a995a70e88381628", size = 514026, upload-time = "2025-11-29T16:27:16.414Z" }, + { url = "https://files.pythonhosted.org/packages/d0/e8/94c95106aef8189b4c6d685c2d0fc93bce5d45845a8f0c2df8844424a929/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:ffd3362a3d09729981c3065cb6e51e08ff0b34a841a97a08656611c6e8bc4cba", size = 547964, upload-time = "2025-11-29T16:27:17.946Z" }, + { url = "https://files.pythonhosted.org/packages/0f/72/15c84e27fb66e19c9ebee0d1c42b9e3de9a8d247aa4c4c01f9a25e1abee4/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:47ebb5ee94d1afe95e1d13a7a1fc3ccd1c896ef2d5a21ba9a159d1c302918a5e", size = 513356, upload-time = "2025-11-29T16:27:19.357Z" }, + { url = "https://files.pythonhosted.org/packages/1d/36/028578aaa8c5ed818c925dd44c49cdf9c03962b0bbb8a66cf0ed431a5de0/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_i686.whl", hash = "sha256:2724da383e27a62977d5d321a320c116d07cb5cc31b5dbfa3ad06d7a028bde2b", size = 520725, upload-time = "2025-11-29T16:27:20.833Z" }, + { url = "https://files.pythonhosted.org/packages/90/14/e99e6825e4600e9f1111d16ca58e5f0874900f9af247fe96b38748a4b4ce/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:74bb5302e3624db9141198d7ce1cc82ea8e7644a5f3b6db25f54efc8631fbf93", size = 507007, upload-time = "2025-11-29T16:27:22.283Z" }, + { url = "https://files.pythonhosted.org/packages/6e/a3/584a6caddfa1a22fe5126b50c573db07b6d8dd5263ff3dcbe87098792cdd/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:c94c5bcc7296afac28c328c68751c210b638a5d4608717ed065c0f2060791ea9", size = 500596, upload-time = "2025-11-29T16:27:24.26Z" }, + { url = "https://files.pythonhosted.org/packages/f2/29/90e64806e41094587c30b4bbb59eae2ae04eff53c028b30fee8058049ec1/stringzilla-4.4.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e22b72fa476cafd428630be4ddeff1defdd43a4c8a3e07c2608c40ddc82a8697", size = 812619, upload-time = "2025-11-29T16:27:25.806Z" }, + { url = "https://files.pythonhosted.org/packages/5b/e5/34d5368b0d43ac8eae586652d6665ba26030a30c816642ce18f3d7856d32/stringzilla-4.4.0-cp312-cp312-win32.whl", hash = "sha256:30356c1dcc5f8bf19d50ce0414fbf54e4bbae372008ac87318e31be41658de8a", size = 100017, upload-time = "2025-11-29T16:27:27.666Z" }, + { url = "https://files.pythonhosted.org/packages/94/a6/d006d786178bce4a6458b7565fa09834ba33f3968099642433cdf63f02ea/stringzilla-4.4.0-cp312-cp312-win_amd64.whl", hash = "sha256:edbe9fe5e397e75b77023fe8763f37d43fcf694e8c523b756e00c17488726499", size = 131024, upload-time = "2025-11-29T16:27:29.139Z" }, + { url = "https://files.pythonhosted.org/packages/f4/de/62b65132e459aa015413064fb2cfc86248d3f6cf85925ee2f88227f079b0/stringzilla-4.4.0-cp312-cp312-win_arm64.whl", hash = "sha256:0dd08804f6b9485f8cf6355efd4c526067545ff627fd98677de043f2e5cd7884", size = 108781, upload-time = "2025-11-29T16:27:30.497Z" }, +] + +[[package]] +name = "sympy" +version = "1.13.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "mpmath" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/ca/99/5a5b6f19ff9f083671ddf7b9632028436167cd3d33e11015754e41b249a4/sympy-1.13.1.tar.gz", hash = "sha256:9cebf7e04ff162015ce31c9c6c9144daa34a93bd082f54fd8f12deca4f47515f", size = 7533040, upload-time = "2024-07-19T09:26:51.238Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/b2/fe/81695a1aa331a842b582453b605175f419fe8540355886031328089d840a/sympy-1.13.1-py3-none-any.whl", hash = "sha256:db36cdc64bf61b9b24578b6f7bab1ecdd2452cf008f34faa33776680c26d66f8", size = 6189177, upload-time = "2024-07-19T09:26:48.863Z" }, +] + +[[package]] +name = "tabulate" +version = "0.9.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ec/fe/802052aecb21e3797b8f7902564ab6ea0d60ff8ca23952079064155d1ae1/tabulate-0.9.0.tar.gz", hash = "sha256:0095b12bf5966de529c0feb1fa08671671b3368eec77d7ef7ab114be2c068b3c", size = 81090, upload-time = "2022-10-06T17:21:48.54Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/40/44/4a5f08c96eb108af5cb50b41f76142f0afa346dfa99d5296fe7202a11854/tabulate-0.9.0-py3-none-any.whl", hash = "sha256:024ca478df22e9340661486f85298cff5f6dcdba14f3813e8830015b9ed1948f", size = 35252, upload-time = "2022-10-06T17:21:44.262Z" }, +] + +[[package]] +name = "taskgroup" +version = "0.2.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "exceptiongroup" }, + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/f0/8d/e218e0160cc1b692e6e0e5ba34e8865dbb171efeb5fc9a704544b3020605/taskgroup-0.2.2.tar.gz", hash = "sha256:078483ac3e78f2e3f973e2edbf6941374fbea81b9c5d0a96f51d297717f4752d", size = 11504, upload-time = "2025-01-03T09:24:13.761Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d1/b1/74babcc824a57904e919f3af16d86c08b524c0691504baf038ef2d7f655c/taskgroup-0.2.2-py2.py3-none-any.whl", hash = "sha256:e2c53121609f4ae97303e9ea1524304b4de6faf9eb2c9280c7f87976479a52fb", size = 14237, upload-time = "2025-01-03T09:24:11.41Z" }, +] + +[[package]] +name = "texttable" +version = "1.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/1c/dc/0aff23d6036a4d3bf4f1d8c8204c5c79c4437e25e0ae94ffe4bbb55ee3c2/texttable-1.7.0.tar.gz", hash = "sha256:2d2068fb55115807d3ac77a4ca68fa48803e84ebb0ee2340f858107a36522638", size = 12831, upload-time = "2023-10-03T09:48:12.272Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/24/99/4772b8e00a136f3e01236de33b0efda31ee7077203ba5967fcc76da94d65/texttable-1.7.0-py2.py3-none-any.whl", hash = "sha256:72227d592c82b3d7f672731ae73e4d1f88cd8e2ef5b075a7a7f01a23a3743917", size = 10768, upload-time = "2023-10-03T09:48:10.434Z" }, +] + +[[package]] +name = "thop" +version = "0.1.1.post2209072238" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "torch" }, +] +wheels = [ + { url = "https://files.pythonhosted.org/packages/bb/0f/72beeab4ff5221dc47127c80f8834b4bcd0cb36f6ba91c0b1d04a1233403/thop-0.1.1.post2209072238-py3-none-any.whl", hash = "sha256:01473c225231927d2ad718351f78ebf7cffe6af3bed464c4f1ba1ef0f7cdda27", size = 15443, upload-time = "2022-09-07T14:38:37.211Z" }, +] + +[[package]] +name = "threadpoolctl" +version = "3.6.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/b7/4d/08c89e34946fce2aec4fbb45c9016efd5f4d7f24af8e5d93296e935631d8/threadpoolctl-3.6.0.tar.gz", hash = "sha256:8ab8b4aa3491d812b623328249fab5302a68d2d71745c8a4c719a2fcaba9f44e", size = 21274, upload-time = "2025-03-13T13:49:23.031Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/32/d5/f9a850d79b0851d1d4ef6456097579a9005b31fea68726a4ae5f2d82ddd9/threadpoolctl-3.6.0-py3-none-any.whl", hash = "sha256:43a0b8fd5a2928500110039e43a5eed8480b918967083ea48dc3ab9f13c4a7fb", size = 18638, upload-time = "2025-03-13T13:49:21.846Z" }, +] + +[[package]] +name = "tifffile" +version = "2025.5.10" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version < '3.11' and sys_platform == 'win32'", + "python_full_version < '3.11' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/44/d0/18fed0fc0916578a4463f775b0fbd9c5fed2392152d039df2fb533bfdd5d/tifffile-2025.5.10.tar.gz", hash = "sha256:018335d34283aa3fd8c263bae5c3c2b661ebc45548fde31504016fcae7bf1103", size = 365290, upload-time = "2025-05-10T19:22:34.386Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/5d/06/bd0a6097da704a7a7c34a94cfd771c3ea3c2f405dd214e790d22c93f6be1/tifffile-2025.5.10-py3-none-any.whl", hash = "sha256:e37147123c0542d67bc37ba5cdd67e12ea6fbe6e86c52bee037a9eb6a064e5ad", size = 226533, upload-time = "2025-05-10T19:22:27.279Z" }, +] + +[[package]] +name = "tifffile" +version = "2026.3.3" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version == '3.11.*' and sys_platform == 'win32'", + "python_full_version == '3.11.*' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c5/cb/2f6d79c7576e22c116352a801f4c3c8ace5957e9aced862012430b62e14f/tifffile-2026.3.3.tar.gz", hash = "sha256:d9a1266bed6f2ee1dd0abde2018a38b4f8b2935cb843df381d70ac4eac5458b7", size = 388745, upload-time = "2026-03-03T19:14:38.134Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/1a/e4/e804505f87627cd8cdae9c010c47c4485fd8c1ce31a7dd0ab7fcc4707377/tifffile-2026.3.3-py3-none-any.whl", hash = "sha256:e8be15c94273113d31ecb7aa3a39822189dd11c4967e3cc88c178f1ad2fd1170", size = 243960, upload-time = "2026-03-03T19:14:35.808Z" }, +] + +[[package]] +name = "tifffile" +version = "2026.6.1" +source = { registry = "https://pypi.org/simple" } +resolution-markers = [ + "python_full_version >= '3.12' and sys_platform == 'win32'", + "python_full_version >= '3.12' and sys_platform != 'win32'", +] +dependencies = [ + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" } }, +] +sdist = { url = "https://files.pythonhosted.org/packages/b7/38/5e2ecef5af2f4fd4a89bb8d6240de9458bab4d51a4cbd97aeb3a0cd618e2/tifffile-2026.6.1.tar.gz", hash = "sha256:626c892c0e899d959b9438e7c0e1491dc154a7fead1f1f37a991724a50eceba9", size = 429694, upload-time = "2026-05-31T23:57:12.165Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/81/59/208f71d70ddc6184f79b8c6d87d46eb7d7b12c19186a817dec9c9c3f3693/tifffile-2026.6.1-py3-none-any.whl", hash = "sha256:0d7382d2769b855b81ce358528e2b40c16d48aa39031746efa81215205332a8d", size = 267108, upload-time = "2026-05-31T23:57:10.597Z" }, +] + +[[package]] +name = "tinycss2" +version = "1.5.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "webencodings" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/a3/ae/2ca4913e5c0f09781d75482874c3a95db9105462a92ddd303c7d285d3df2/tinycss2-1.5.1.tar.gz", hash = "sha256:d339d2b616ba90ccce58da8495a78f46e55d4d25f9fd71dfd526f07e7d53f957", size = 88195, upload-time = "2025-11-23T10:29:10.082Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/60/45/c7b5c3168458db837e8ceab06dc77824e18202679d0463f0e8f002143a97/tinycss2-1.5.1-py3-none-any.whl", hash = "sha256:3415ba0f5839c062696996998176c4a3751d18b7edaaeeb658c9ce21ec150661", size = 28404, upload-time = "2025-11-23T10:29:08.676Z" }, +] + +[[package]] +name = "tomli" +version = "2.4.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/22/de/48c59722572767841493b26183a0d1cc411d54fd759c5607c4590b6563a6/tomli-2.4.1.tar.gz", hash = "sha256:7c7e1a961a0b2f2472c1ac5b69affa0ae1132c39adcb67aba98568702b9cc23f", size = 17543, upload-time = "2026-03-25T20:22:03.828Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/11/db3d5885d8528263d8adc260bb2d28ebf1270b96e98f0e0268d32b8d9900/tomli-2.4.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f8f0fc26ec2cc2b965b7a3b87cd19c5c6b8c5e5f436b984e85f486d652285c30", size = 154704, upload-time = "2026-03-25T20:21:10.473Z" }, + { url = "https://files.pythonhosted.org/packages/6d/f7/675db52c7e46064a9aa928885a9b20f4124ecb9bc2e1ce74c9106648d202/tomli-2.4.1-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:4ab97e64ccda8756376892c53a72bd1f964e519c77236368527f758fbc36a53a", size = 149454, upload-time = "2026-03-25T20:21:12.036Z" }, + { url = "https://files.pythonhosted.org/packages/61/71/81c50943cf953efa35bce7646caab3cf457a7d8c030b27cfb40d7235f9ee/tomli-2.4.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:96481a5786729fd470164b47cdb3e0e58062a496f455ee41b4403be77cb5a076", size = 237561, upload-time = "2026-03-25T20:21:13.098Z" }, + { url = "https://files.pythonhosted.org/packages/48/c1/f41d9cb618acccca7df82aaf682f9b49013c9397212cb9f53219e3abac37/tomli-2.4.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:5a881ab208c0baf688221f8cecc5401bd291d67e38a1ac884d6736cbcd8247e9", size = 243824, upload-time = "2026-03-25T20:21:14.569Z" }, + { url = "https://files.pythonhosted.org/packages/22/e4/5a816ecdd1f8ca51fb756ef684b90f2780afc52fc67f987e3c61d800a46d/tomli-2.4.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:47149d5bd38761ac8be13a84864bf0b7b70bc051806bc3669ab1cbc56216b23c", size = 242227, upload-time = "2026-03-25T20:21:15.712Z" }, + { url = "https://files.pythonhosted.org/packages/6b/49/2b2a0ef529aa6eec245d25f0c703e020a73955ad7edf73e7f54ddc608aa5/tomli-2.4.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:ec9bfaf3ad2df51ace80688143a6a4ebc09a248f6ff781a9945e51937008fcbc", size = 247859, upload-time = "2026-03-25T20:21:17.001Z" }, + { url = "https://files.pythonhosted.org/packages/83/bd/6c1a630eaca337e1e78c5903104f831bda934c426f9231429396ce3c3467/tomli-2.4.1-cp311-cp311-win32.whl", hash = "sha256:ff2983983d34813c1aeb0fa89091e76c3a22889ee83ab27c5eeb45100560c049", size = 97204, upload-time = "2026-03-25T20:21:18.079Z" }, + { url = "https://files.pythonhosted.org/packages/42/59/71461df1a885647e10b6bb7802d0b8e66480c61f3f43079e0dcd315b3954/tomli-2.4.1-cp311-cp311-win_amd64.whl", hash = "sha256:5ee18d9ebdb417e384b58fe414e8d6af9f4e7a0ae761519fb50f721de398dd4e", size = 108084, upload-time = "2026-03-25T20:21:18.978Z" }, + { url = "https://files.pythonhosted.org/packages/b8/83/dceca96142499c069475b790e7913b1044c1a4337e700751f48ed723f883/tomli-2.4.1-cp311-cp311-win_arm64.whl", hash = "sha256:c2541745709bad0264b7d4705ad453b76ccd191e64aa6f0fc66b69a293a45ece", size = 95285, upload-time = "2026-03-25T20:21:20.309Z" }, + { url = "https://files.pythonhosted.org/packages/c1/ba/42f134a3fe2b370f555f44b1d72feebb94debcab01676bf918d0cb70e9aa/tomli-2.4.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:c742f741d58a28940ce01d58f0ab2ea3ced8b12402f162f4d534dfe18ba1cd6a", size = 155924, upload-time = "2026-03-25T20:21:21.626Z" }, + { url = "https://files.pythonhosted.org/packages/dc/c7/62d7a17c26487ade21c5422b646110f2162f1fcc95980ef7f63e73c68f14/tomli-2.4.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:7f86fd587c4ed9dd76f318225e7d9b29cfc5a9d43de44e5754db8d1128487085", size = 150018, upload-time = "2026-03-25T20:21:23.002Z" }, + { url = "https://files.pythonhosted.org/packages/5c/05/79d13d7c15f13bdef410bdd49a6485b1c37d28968314eabee452c22a7fda/tomli-2.4.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ff18e6a727ee0ab0388507b89d1bc6a22b138d1e2fa56d1ad494586d61d2eae9", size = 244948, upload-time = "2026-03-25T20:21:24.04Z" }, + { url = "https://files.pythonhosted.org/packages/10/90/d62ce007a1c80d0b2c93e02cab211224756240884751b94ca72df8a875ca/tomli-2.4.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:136443dbd7e1dee43c68ac2694fde36b2849865fa258d39bf822c10e8068eac5", size = 253341, upload-time = "2026-03-25T20:21:25.177Z" }, + { url = "https://files.pythonhosted.org/packages/1a/7e/caf6496d60152ad4ed09282c1885cca4eea150bfd007da84aea07bcc0a3e/tomli-2.4.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:5e262d41726bc187e69af7825504c933b6794dc3fbd5945e41a79bb14c31f585", size = 248159, upload-time = "2026-03-25T20:21:26.364Z" }, + { url = "https://files.pythonhosted.org/packages/99/e7/c6f69c3120de34bbd882c6fba7975f3d7a746e9218e56ab46a1bc4b42552/tomli-2.4.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:5cb41aa38891e073ee49d55fbc7839cfdb2bc0e600add13874d048c94aadddd1", size = 253290, upload-time = "2026-03-25T20:21:27.46Z" }, + { url = "https://files.pythonhosted.org/packages/d6/2f/4a3c322f22c5c66c4b836ec58211641a4067364f5dcdd7b974b4c5da300c/tomli-2.4.1-cp312-cp312-win32.whl", hash = "sha256:da25dc3563bff5965356133435b757a795a17b17d01dbc0f42fb32447ddfd917", size = 98141, upload-time = "2026-03-25T20:21:28.492Z" }, + { url = "https://files.pythonhosted.org/packages/24/22/4daacd05391b92c55759d55eaee21e1dfaea86ce5c571f10083360adf534/tomli-2.4.1-cp312-cp312-win_amd64.whl", hash = "sha256:52c8ef851d9a240f11a88c003eacb03c31fc1c9c4ec64a99a0f922b93874fda9", size = 108847, upload-time = "2026-03-25T20:21:29.386Z" }, + { url = "https://files.pythonhosted.org/packages/68/fd/70e768887666ddd9e9f5d85129e84910f2db2796f9096aa02b721a53098d/tomli-2.4.1-cp312-cp312-win_arm64.whl", hash = "sha256:f758f1b9299d059cc3f6546ae2af89670cb1c4d48ea29c3cacc4fe7de3058257", size = 95088, upload-time = "2026-03-25T20:21:30.677Z" }, + { url = "https://files.pythonhosted.org/packages/7b/61/cceae43728b7de99d9b847560c262873a1f6c98202171fd5ed62640b494b/tomli-2.4.1-py3-none-any.whl", hash = "sha256:0d85819802132122da43cb86656f8d1f8c6587d54ae7dcaf30e90533028b49fe", size = 14583, upload-time = "2026-03-25T20:22:03.012Z" }, +] + +[[package]] +name = "torch" +version = "2.6.0+cu124" +source = { registry = "https://download.pytorch.org/whl/cu124" } +dependencies = [ + { name = "filelock" }, + { name = "fsspec" }, + { name = "jinja2" }, + { name = "networkx", version = "3.4.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "networkx", version = "3.6.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "nvidia-cublas-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-cupti-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-nvrtc-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cuda-runtime-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cudnn-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cufft-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-curand-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusolver-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparse-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-cusparselt-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nccl-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvjitlink-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "nvidia-nvtx-cu12", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "setuptools", marker = "python_full_version >= '3.12'" }, + { name = "sympy" }, + { name = "triton", marker = "platform_machine == 'x86_64' and sys_platform == 'linux'" }, + { name = "typing-extensions" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp310-cp310-linux_x86_64.whl", hash = "sha256:7f2ba7f7c0459320a521696f6b5bccc187f59890b23c9dfb6c49b0b87c6bfc97", upload-time = "2025-01-30T00:53:02Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp310-cp310-win_amd64.whl", hash = "sha256:7cc45c5b39d74875cfafe908b7f55c544147cc16b01e795feb2fe766583efe78", upload-time = "2025-01-30T00:53:32Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp311-cp311-linux_x86_64.whl", hash = "sha256:d4c3e9a8d31a7c0fcbb9da17c31a1917e1fac26c566a4cfbd8c9568ad7cade79", upload-time = "2025-01-30T00:55:01Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp311-cp311-win_amd64.whl", hash = "sha256:6a1fb2714e9323f11edb6e8abf7aad5f79e45ad25c081cde87681a18d99c29eb", upload-time = "2025-01-30T00:55:31Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp312-cp312-linux_x86_64.whl", hash = "sha256:a393b506844035c0dac2f30ea8478c343b8e95a429f06f3b3cadfc7f53adb597", upload-time = "2025-01-30T00:57:08Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torch-2.6.0%2Bcu124-cp312-cp312-win_amd64.whl", hash = "sha256:3313061c1fec4c7310cf47944e84513dcd27b6173b72a349bb7ca68d0ee6e9c0", upload-time = "2025-01-30T00:57:40Z" }, +] + +[[package]] +name = "torchvision" +version = "0.21.0+cu124" +source = { registry = "https://download.pytorch.org/whl/cu124" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "pillow" }, + { name = "torch" }, +] +wheels = [ + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp310-cp310-linux_x86_64.whl", hash = "sha256:3d3e74018eaa7837c73e3764dad3b7792b7544401c25a42977e9744303731bd3", upload-time = "2025-01-30T01:04:28Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp310-cp310-win_amd64.whl", hash = "sha256:0c6aefb70ab2b312065240c804e459ac7b0e449867afd469b38d2fd47f9391a7", upload-time = "2025-01-30T01:04:28Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp311-cp311-linux_x86_64.whl", hash = "sha256:137376805aca5ba57bd2c7a3ecb8569df961dbe82b128aac9b3b0a7125ef9385", upload-time = "2025-01-30T01:04:28Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp311-cp311-win_amd64.whl", hash = "sha256:000a013584ad2304ab30496318145f284ac364622addb5ee3a5abd2769ba146f", upload-time = "2025-01-30T01:04:29Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp312-cp312-linux_x86_64.whl", hash = "sha256:efb53ea0af7bf09b7b53e2a18b9be6d245f7d46a90b51d5cf97f37e9b929a991", upload-time = "2025-01-30T01:04:29Z" }, + { url = "https://download-r2.pytorch.org/whl/cu124/torchvision-0.21.0%2Bcu124-cp312-cp312-win_amd64.whl", hash = "sha256:ec63c2ee792757492da40590e34b14f2fceda29050558c215f0c1f3b08149c0f", upload-time = "2025-01-30T01:04:30Z" }, +] + +[[package]] +name = "tornado" +version = "6.5.7" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/64/24/95ec527ad67b76d59299e5465b3935d05e4294b7e0290a3924b7487df30b/tornado-6.5.7.tar.gz", hash = "sha256:66c513a76cda70d53907bc27cf1447557699c2e95aa48ba27a442ff61c3ddfc2", size = 519252, upload-time = "2026-06-08T17:34:51.232Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/02/dc/c7043cab6fed8ae159fc1923ce829ada35c4dbd797d408a43858ffaf9639/tornado-6.5.7-cp39-abi3-macosx_10_9_universal2.whl", hash = "sha256:148b2eb15c2c765a50796172c1e499649b35f30d2e3c3d3e15913cfa56bfb163", size = 448543, upload-time = "2026-06-08T17:34:38.052Z" }, + { url = "https://files.pythonhosted.org/packages/92/4f/090b1431e5a43df696feceffc268c5383cc079ecb5f08ce58f917109aafe/tornado-6.5.7-cp39-abi3-macosx_10_9_x86_64.whl", hash = "sha256:9da38de27f1da3b78a966f0dae12b5a1ea9afe72ca805d84ff06508272ddf100", size = 446707, upload-time = "2026-06-08T17:34:39.594Z" }, + { url = "https://files.pythonhosted.org/packages/37/d8/ef374952fd5da67d4463122c2b8e5a96536ec10b4b339254c6dcde81d01c/tornado-6.5.7-cp39-abi3-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:8d759e71906ee783f8867b93bf26a265743da4c1e2f4a018464c1ba019862972", size = 449774, upload-time = "2026-06-08T17:34:41.204Z" }, + { url = "https://files.pythonhosted.org/packages/35/37/d434c73f4c6e014b745b9b37085f34f40c022f007efff3d7fe65991899f3/tornado-6.5.7-cp39-abi3-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:8a46347a18f23fb92b396beebe0fb78f61dda0cc302445202c16203d8a18848b", size = 450745, upload-time = "2026-06-08T17:34:42.531Z" }, + { url = "https://files.pythonhosted.org/packages/b6/2b/56b9aff361d7f1ab728a805ec7d7ea835f8807afa9f5cc690ea0e630efb9/tornado-6.5.7-cp39-abi3-musllinux_1_2_aarch64.whl", hash = "sha256:7778b30bef919231265e91c69963ce0f49a1e9c07ac900bbe75b19ce2575ba92", size = 450578, upload-time = "2026-06-08T17:34:43.787Z" }, + { url = "https://files.pythonhosted.org/packages/02/30/a7444fb23aa76860a14198fab96ac79f1866b0a6e19e26c4381b0938e50f/tornado-6.5.7-cp39-abi3-musllinux_1_2_x86_64.whl", hash = "sha256:e726f0c75da7726eec023aa62751ff8878bd2737e34fbdd33b1ae5897d2200f5", size = 449985, upload-time = "2026-06-08T17:34:45.326Z" }, + { url = "https://files.pythonhosted.org/packages/5c/42/5f0e56c01e8d9d36f4e23f367b85ae6cae0c1ecddd5e6977d8388ad27488/tornado-6.5.7-cp39-abi3-win32.whl", hash = "sha256:f8de3bf12d3efdd0cbe7c8887868198f8a91415e3f29fcf258d9b8eb7b1d9ae4", size = 451047, upload-time = "2026-06-08T17:34:46.784Z" }, + { url = "https://files.pythonhosted.org/packages/c9/a4/b393076ffb21b469eec5b328a0534cf03a3b90bfc6b1f09507cdd075d938/tornado-6.5.7-cp39-abi3-win_amd64.whl", hash = "sha256:de942f843533a039ef9fa3d9c88c7cd8a7c94553fb5ad0154270989b3d99a2c4", size = 451485, upload-time = "2026-06-08T17:34:48.248Z" }, + { url = "https://files.pythonhosted.org/packages/71/2e/7b1c769803121b809112cf9a00681c472eae1d80e32d7ec0e0bd61d0d0e1/tornado-6.5.7-cp39-abi3-win_arm64.whl", hash = "sha256:ff934fce95643af5f11efdae618eaa73d469dc588641e5c8d19295a0c65c4796", size = 450506, upload-time = "2026-06-08T17:34:49.702Z" }, +] + +[[package]] +name = "tqdm" +version = "4.68.3" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/87/d7/0535a28b1f5f24f6612fb3ff1e89fb1a8d160fee0f976e0aa6803862134b/tqdm-4.68.3.tar.gz", hash = "sha256:00dfa48452b6b6cfae3dd9885636c23d3422d1ec97c66d96818cbd5e0821d482", size = 170596, upload-time = "2026-06-17T07:36:52.105Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/d8/8e/bb97bb0c71802080bfc8952937d174e49cfc50de5c951dd47b2496f0dcdb/tqdm-4.68.3-py3-none-any.whl", hash = "sha256:39832cc2def2789a6f29df83f172db7416cea70052c0907a57801c5f2fdccb03", size = 78337, upload-time = "2026-06-17T07:36:50.132Z" }, +] + +[[package]] +name = "tqdm-loggable" +version = "0.4.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tqdm" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/d1/c1/bd361c24a76e7c0d137e299ca1e86bbe188e4c08e3e46674a285aa762051/tqdm_loggable-0.4.1.tar.gz", hash = "sha256:49123ffcb2deb948edb7121d7e09a6008914e0d0333154f060e435deba9e547a", size = 8170, upload-time = "2026-03-16T18:38:50.774Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3e/24/303708f276f2a81bd0551f5e93b5dd51201ca0d73aed0dc50be6976a3443/tqdm_loggable-0.4.1-py3-none-any.whl", hash = "sha256:e3b394a6fc85a1b1b0dad52a63ac926ecb3b478acf4f4bae570d9189f00ab91d", size = 10527, upload-time = "2026-03-16T18:38:49.808Z" }, +] + +[[package]] +name = "traceback-with-variables" +version = "2.2.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/b1/25ee53be3125145cef9385f159a44547b4a01e1b2d2828055ca69b7e18aa/traceback_with_variables-2.2.1.tar.gz", hash = "sha256:ea7c695f9b401762f68f75df0439d661112b8dbd58bcd6910e402cff925ad7e0", size = 26145, upload-time = "2025-10-24T13:39:35.141Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/4a/06/fda9970d55fbbb7cd5cc856da2a9c693107e20f84386596da1f25b90a8cf/traceback_with_variables-2.2.1-py3-none-any.whl", hash = "sha256:ab6d75c72d26d61217962d11db44c98c62dccd2fedb2d4fb0ae4f9faf9db23c2", size = 22388, upload-time = "2025-10-24T13:29:32.712Z" }, +] + +[[package]] +name = "traitlets" +version = "5.15.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/57/a9/a2584b8313b89f94869ddb3c4074617a691de1812a614d2d50e32ca5a7a6/traitlets-5.15.1.tar.gz", hash = "sha256:7b1c07854fe25acb39e009bae49f11b79ff6cbb2f27999104e9110e7a6b53722", size = 163344, upload-time = "2026-06-03T12:26:06.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/8d/1080ee4c231f361b6ce4470d556c8c435b67c7e0753aaa641497ee92f88b/traitlets-5.15.1-py3-none-any.whl", hash = "sha256:770a53705f84b81ac107e83a1b3328ff2dae16094d8fc3cfc004e4b22dfd8e92", size = 85858, upload-time = "2026-06-03T12:26:04.395Z" }, +] + +[[package]] +name = "triton" +version = "3.2.0" +source = { registry = "https://pypi.org/simple" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/01/65/3ffa90e158a2c82f0716eee8d26a725d241549b7d7aaf7e4f44ac03ebd89/triton-3.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b3e54983cd51875855da7c68ec05c05cf8bb08df361b1d5b69e05e40b0c9bd62", size = 253090354, upload-time = "2025-01-22T19:12:21.872Z" }, + { url = "https://files.pythonhosted.org/packages/a7/2e/757d2280d4fefe7d33af7615124e7e298ae7b8e3bc4446cdb8e88b0f9bab/triton-3.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8009a1fb093ee8546495e96731336a33fb8856a38e45bb4ab6affd6dbc3ba220", size = 253157636, upload-time = "2025-01-22T19:12:51.322Z" }, + { url = "https://files.pythonhosted.org/packages/06/00/59500052cb1cf8cf5316be93598946bc451f14072c6ff256904428eaf03c/triton-3.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:8d9b215efc1c26fa7eefb9a157915c92d52e000d2bf83e5f69704047e63f125c", size = 253159365, upload-time = "2025-01-22T19:13:24.648Z" }, +] + +[[package]] +name = "typing-extensions" +version = "4.16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/f6/cc/6253133b5bb138fc3306cebfbda2c520f545d36b5be2c7255cc528bb45d6/typing_extensions-4.16.0.tar.gz", hash = "sha256:dc983d19a509c94dba722ee6abd33940f7c05a89e243c47e907eb4db6f1a43e5", size = 113555, upload-time = "2026-07-02T08:40:05.92Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/49/d3/b8441a820a491ddfc024b0b0cf0393375b75ea13866d9c66727e54c2fc80/typing_extensions-4.16.0-py3-none-any.whl", hash = "sha256:481caa481374e813c1b176ada14e97f1f67a4539ce9cfeb3f350d78d6370c2e8", size = 45571, upload-time = "2026-07-02T08:40:04.659Z" }, +] + +[[package]] +name = "typing-inspection" +version = "0.4.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "typing-extensions" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/55/e3/70399cb7dd41c10ac53367ae42139cf4b1ca5f36bb3dc6c9d33acdb43655/typing_inspection-0.4.2.tar.gz", hash = "sha256:ba561c48a67c5958007083d386c3295464928b01faa735ab8547c5692e87f464", size = 75949, upload-time = "2025-10-01T02:14:41.687Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/dc/9b/47798a6c91d8bdb567fe2698fe81e0c6b7cb7ef4d13da4114b41d239f65d/typing_inspection-0.4.2-py3-none-any.whl", hash = "sha256:4ed1cacbdc298c220f1bd249ed5287caa16f34d44ef4e9c3d0cbad5b521545e7", size = 14611, upload-time = "2025-10-01T02:14:40.154Z" }, +] + +[[package]] +name = "tzdata" +version = "2026.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/ba/19/1b9b0e29f30c6d35cb345486df41110984ea67ae69dddbc0e8a100999493/tzdata-2026.2.tar.gz", hash = "sha256:9173fde7d80d9018e02a662e168e5a2d04f87c41ea174b139fbef642eda62d10", size = 198254, upload-time = "2026-04-24T15:22:08.651Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/ce/e4/dccd7f47c4b64213ac01ef921a1337ee6e30e8c6466046018326977efd95/tzdata-2026.2-py2.py3-none-any.whl", hash = "sha256:bbe9af844f658da81a5f95019480da3a89415801f6cc966806612cc7169bffe7", size = 349321, upload-time = "2026-04-24T15:22:05.876Z" }, +] + +[[package]] +name = "tzlocal" +version = "5.4.4" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "tzdata", marker = "sys_platform == 'win32'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/81/5b/879b2f932adfa7a053c360d50bc896c977fa6426109185f7c12ebdd0cb9d/tzlocal-5.4.4.tar.gz", hash = "sha256:8dbb8660838688a7b6ba4fed31d18dedf842afb4d47ca050d6d891c2c15f3be4", size = 31170, upload-time = "2026-06-29T08:03:40.026Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9e/a4/017a7a6cbe387d961a688ec31364ae60a5c4e22c96ae9921b79a947c855d/tzlocal-5.4.4-py3-none-any.whl", hash = "sha256:aae09f0126a8a86fa736be266eb4a471380d26a0de3bc14844e7821fee3e2a15", size = 18115, upload-time = "2026-06-29T08:03:38.666Z" }, +] + +[[package]] +name = "ultralytics" +version = "8.4.89" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "nvidia-ml-py" }, + { name = "opencv-python" }, + { name = "pillow" }, + { name = "polars" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "ultralytics-thop" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/bd/66/1fe3c90439346a2f16602c5b2fda576f2195b82f195958ce127055974df7/ultralytics-8.4.89.tar.gz", hash = "sha256:15c13f215186feddb4c1ae56fd2ce5a6e513c764458ff2c0ccd96ee57248bec8", size = 1136487, upload-time = "2026-07-05T19:19:03.248Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/25/0b/2639085b305d4402cb544cd20321ac6425c28d8065dd49b2ae8bc3d5e508/ultralytics-8.4.89-py3-none-any.whl", hash = "sha256:3b50379a0a0d99f9accab640b2dbaa6b7fdc947f71a0cb56266bc2d87426e5be", size = 1348192, upload-time = "2026-07-05T19:18:58.624Z" }, +] + +[[package]] +name = "ultralytics-thop" +version = "2.0.20" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "torch" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/98/c6/d25cb53e141242f74950744179c21b8798bb09b9e7161465ecda4f577ddf/ultralytics_thop-2.0.20.tar.gz", hash = "sha256:f3595e0d8c6fd0b9f62fc2cd9be921755e2649a05c34f1fabaea0bff7295d641", size = 34682, upload-time = "2026-06-06T11:42:42.184Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0e/a9/5441a28af447c0ffe193f1f42dfebe2a518ab3e160e9e0d164e8901edead/ultralytics_thop-2.0.20-py3-none-any.whl", hash = "sha256:ef1b326404aeb10954f50db58982ec8dcab5946ee04a9b10e1107ec7ba4d5c22", size = 28954, upload-time = "2026-06-06T11:42:40.796Z" }, +] + +[[package]] +name = "universal-analytics-python3" +version = "1.1.1" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "httpx" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/75/f2/973fd8a70ae06c8c46c15c88c7aac31192cd6a254c4969591f0a7b0cb039/universal-analytics-python3-1.1.1.tar.gz", hash = "sha256:f58b6ab7cef2389aefed80f145b873e447dc4083256330f187122783792f7fad", size = 11928, upload-time = "2021-04-28T08:43:07.477Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7b/03/14c1e481b6f4d4208b30847dd788da5b5de4abcafbf95dc98d8c07a5c95f/universal_analytics_python3-1.1.1-py3-none-any.whl", hash = "sha256:dc408a41865d3bd0adf5c04337f3f20fe418f2633155190e6e87de84e0b75cf1", size = 10455, upload-time = "2021-04-28T08:43:06.597Z" }, +] + +[[package]] +name = "urllib3" +version = "2.7.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/53/0c/06f8b233b8fd13b9e5ee11424ef85419ba0d8ba0b3138bf360be2ff56953/urllib3-2.7.0.tar.gz", hash = "sha256:231e0ec3b63ceb14667c67be60f2f2c40a518cb38b03af60abc813da26505f4c", size = 433602, upload-time = "2026-05-07T16:13:18.596Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/7f/3e/5db95bcf282c52709639744ca2a8b149baccf648e39c8cc87553df9eae0c/urllib3-2.7.0-py3-none-any.whl", hash = "sha256:9fb4c81ebbb1ce9531cce37674bbc6f1360472bc18ca9a553ede278ef7276897", size = 131087, upload-time = "2026-05-07T16:13:17.151Z" }, +] + +[[package]] +name = "uvicorn" +version = "0.50.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "click" }, + { name = "h11" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/9f/f6/cc9aadc0e481344a42095d222bfa764122fb8cfba708d1922917bd8bfb01/uvicorn-0.50.2.tar.gz", hash = "sha256:b92bf03509b82bcb9d49e7335b4fd364518ad021c2dc18b4e6a2fec8c955a0bb", size = 93716, upload-time = "2026-07-06T10:38:31.984Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/aa/f0/7c228ee10c7ab8fd3a21d06579a6f7c6075c6ce72594a20fb5d2f206ff24/uvicorn-0.50.2-py3-none-any.whl", hash = "sha256:4ae72a385630bcc17a0adb8290f26c993865e0b43a2114c2aab96420172c056a", size = 72846, upload-time = "2026-07-06T10:38:30.543Z" }, +] + +[package.optional-dependencies] +standard = [ + { name = "colorama", marker = "sys_platform == 'win32'" }, + { name = "httptools" }, + { name = "python-dotenv" }, + { name = "pyyaml" }, + { name = "uvloop", marker = "platform_python_implementation != 'PyPy' and sys_platform != 'cygwin' and sys_platform != 'win32'" }, + { name = "watchfiles" }, + { name = "websockets" }, +] + +[[package]] +name = "uvloop" +version = "0.22.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/06/f0/18d39dbd1971d6d62c4629cc7fa67f74821b0dc1f5a77af43719de7936a7/uvloop-0.22.1.tar.gz", hash = "sha256:6c84bae345b9147082b17371e3dd5d42775bddce91f885499017f4607fdaf39f", size = 2443250, upload-time = "2025-10-16T22:17:19.342Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/14/ecceb239b65adaaf7fde510aa8bd534075695d1e5f8dadfa32b5723d9cfb/uvloop-0.22.1-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:ef6f0d4cc8a9fa1f6a910230cd53545d9a14479311e87e3cb225495952eb672c", size = 1343335, upload-time = "2025-10-16T22:16:11.43Z" }, + { url = "https://files.pythonhosted.org/packages/ba/ae/6f6f9af7f590b319c94532b9567409ba11f4fa71af1148cab1bf48a07048/uvloop-0.22.1-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7cd375a12b71d33d46af85a3343b35d98e8116134ba404bd657b3b1d15988792", size = 742903, upload-time = "2025-10-16T22:16:12.979Z" }, + { url = "https://files.pythonhosted.org/packages/09/bd/3667151ad0702282a1f4d5d29288fce8a13c8b6858bf0978c219cd52b231/uvloop-0.22.1-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:ac33ed96229b7790eb729702751c0e93ac5bc3bcf52ae9eccbff30da09194b86", size = 3648499, upload-time = "2025-10-16T22:16:14.451Z" }, + { url = "https://files.pythonhosted.org/packages/b3/f6/21657bb3beb5f8c57ce8be3b83f653dd7933c2fd00545ed1b092d464799a/uvloop-0.22.1-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:481c990a7abe2c6f4fc3d98781cc9426ebd7f03a9aaa7eb03d3bfc68ac2a46bd", size = 3700133, upload-time = "2025-10-16T22:16:16.272Z" }, + { url = "https://files.pythonhosted.org/packages/09/e0/604f61d004ded805f24974c87ddd8374ef675644f476f01f1df90e4cdf72/uvloop-0.22.1-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:a592b043a47ad17911add5fbd087c76716d7c9ccc1d64ec9249ceafd735f03c2", size = 3512681, upload-time = "2025-10-16T22:16:18.07Z" }, + { url = "https://files.pythonhosted.org/packages/bb/ce/8491fd370b0230deb5eac69c7aae35b3be527e25a911c0acdffb922dc1cd/uvloop-0.22.1-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:1489cf791aa7b6e8c8be1c5a080bae3a672791fcb4e9e12249b05862a2ca9cec", size = 3615261, upload-time = "2025-10-16T22:16:19.596Z" }, + { url = "https://files.pythonhosted.org/packages/c7/d5/69900f7883235562f1f50d8184bb7dd84a2fb61e9ec63f3782546fdbd057/uvloop-0.22.1-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:c60ebcd36f7b240b30788554b6f0782454826a0ed765d8430652621b5de674b9", size = 1352420, upload-time = "2025-10-16T22:16:21.187Z" }, + { url = "https://files.pythonhosted.org/packages/a8/73/c4e271b3bce59724e291465cc936c37758886a4868787da0278b3b56b905/uvloop-0.22.1-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:3b7f102bf3cb1995cfeaee9321105e8f5da76fdb104cdad8986f85461a1b7b77", size = 748677, upload-time = "2025-10-16T22:16:22.558Z" }, + { url = "https://files.pythonhosted.org/packages/86/94/9fb7fad2f824d25f8ecac0d70b94d0d48107ad5ece03769a9c543444f78a/uvloop-0.22.1-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:53c85520781d84a4b8b230e24a5af5b0778efdb39142b424990ff1ef7c48ba21", size = 3753819, upload-time = "2025-10-16T22:16:23.903Z" }, + { url = "https://files.pythonhosted.org/packages/74/4f/256aca690709e9b008b7108bc85fba619a2bc37c6d80743d18abad16ee09/uvloop-0.22.1-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:56a2d1fae65fd82197cb8c53c367310b3eabe1bbb9fb5a04d28e3e3520e4f702", size = 3804529, upload-time = "2025-10-16T22:16:25.246Z" }, + { url = "https://files.pythonhosted.org/packages/7f/74/03c05ae4737e871923d21a76fe28b6aad57f5c03b6e6bfcfa5ad616013e4/uvloop-0.22.1-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:40631b049d5972c6755b06d0bfe8233b1bd9a8a6392d9d1c45c10b6f9e9b2733", size = 3621267, upload-time = "2025-10-16T22:16:26.819Z" }, + { url = "https://files.pythonhosted.org/packages/75/be/f8e590fe61d18b4a92070905497aec4c0e64ae1761498cad09023f3f4b3e/uvloop-0.22.1-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:535cc37b3a04f6cd2c1ef65fa1d370c9a35b6695df735fcff5427323f2cd5473", size = 3723105, upload-time = "2025-10-16T22:16:28.252Z" }, + { url = "https://files.pythonhosted.org/packages/3d/ff/7f72e8170be527b4977b033239a83a68d5c881cc4775fca255c677f7ac5d/uvloop-0.22.1-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:fe94b4564e865d968414598eea1a6de60adba0c040ba4ed05ac1300de402cd42", size = 1359936, upload-time = "2025-10-16T22:16:29.436Z" }, + { url = "https://files.pythonhosted.org/packages/c3/c6/e5d433f88fd54d81ef4be58b2b7b0cea13c442454a1db703a1eea0db1a59/uvloop-0.22.1-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:51eb9bd88391483410daad430813d982010f9c9c89512321f5b60e2cddbdddd6", size = 752769, upload-time = "2025-10-16T22:16:30.493Z" }, + { url = "https://files.pythonhosted.org/packages/24/68/a6ac446820273e71aa762fa21cdcc09861edd3536ff47c5cd3b7afb10eeb/uvloop-0.22.1-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:700e674a166ca5778255e0e1dc4e9d79ab2acc57b9171b79e65feba7184b3370", size = 4317413, upload-time = "2025-10-16T22:16:31.644Z" }, + { url = "https://files.pythonhosted.org/packages/5f/6f/e62b4dfc7ad6518e7eff2516f680d02a0f6eb62c0c212e152ca708a0085e/uvloop-0.22.1-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7b5b1ac819a3f946d3b2ee07f09149578ae76066d70b44df3fa990add49a82e4", size = 4426307, upload-time = "2025-10-16T22:16:32.917Z" }, + { url = "https://files.pythonhosted.org/packages/90/60/97362554ac21e20e81bcef1150cb2a7e4ffdaf8ea1e5b2e8bf7a053caa18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:e047cc068570bac9866237739607d1313b9253c3051ad84738cbb095be0537b2", size = 4131970, upload-time = "2025-10-16T22:16:34.015Z" }, + { url = "https://files.pythonhosted.org/packages/99/39/6b3f7d234ba3964c428a6e40006340f53ba37993f46ed6e111c6e9141d18/uvloop-0.22.1-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:512fec6815e2dd45161054592441ef76c830eddaad55c8aa30952e6fe1ed07c0", size = 4296343, upload-time = "2025-10-16T22:16:35.149Z" }, +] + +[[package]] +name = "virtualenv" +version = "21.5.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "distlib" }, + { name = "filelock" }, + { name = "platformdirs" }, + { name = "python-discovery" }, + { name = "typing-extensions", marker = "python_full_version < '3.11'" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/04/ff/3dcc01dab91e5d472183dd8d1ac0368b44b70aa3e678a3e47149e8ef716a/virtualenv-21.5.2.tar.gz", hash = "sha256:465da6db2a5b615258cddefb749ceeb3627e4fddda93be88c97ba8321ca3c6d1", size = 5525810, upload-time = "2026-07-06T15:21:23.016Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/9d/08/0ae1145a8e8d7193f7f37aedc8e37eafd02f70a8513b90624089a7a8e321/virtualenv-21.5.2-py3-none-any.whl", hash = "sha256:4d9f76b4363ed04a4837e812110eb301367eb470f616b62399a50d39dee70e47", size = 5506034, upload-time = "2026-07-06T15:21:20.848Z" }, +] + +[[package]] +name = "voxel51-eta" +version = "0.16.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "argcomplete" }, + { name = "dill" }, + { name = "glob2" }, + { name = "jsonlines" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python-headless" }, + { name = "packaging" }, + { name = "paramiko" }, + { name = "pillow" }, + { name = "py7zr" }, + { name = "python-dateutil" }, + { name = "pytz" }, + { name = "rarfile" }, + { name = "requests" }, + { name = "retrying" }, + { name = "scikit-image", version = "0.25.2", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scikit-image", version = "0.26.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "sortedcontainers" }, + { name = "tabulate" }, + { name = "tzlocal" }, + { name = "urllib3" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/3d/9d/dca784714ae4c2cfa0a05cb9475d3d4203d73fe0b9a76d26ae27b04b8c82/voxel51_eta-0.16.0.tar.gz", hash = "sha256:b2d8e8b76215c6798c34712b656f37790197ae9953d80850851031cd2bdc1bd5", size = 907367, upload-time = "2026-06-03T20:26:32.316Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/eb/d0/fa153cbdbd0d35f1fbfe7eaddd1412fa4a58c192786dbf06a3a1687b5420/voxel51_eta-0.16.0-py2.py3-none-any.whl", hash = "sha256:07680b09763d048a2c57cc3194d5b502cec88ed1a42f82fb555dc1640177ed90", size = 935885, upload-time = "2026-06-03T20:26:30.052Z" }, +] + +[[package]] +name = "watchfiles" +version = "1.2.0" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "anyio" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/cd/41/5e1a4bb12aac5f1493fa1bdc11154eca3b258ca4eba65d39c473fe19d8e9/watchfiles-1.2.0.tar.gz", hash = "sha256:c995fba777f1ea992f090f9236e9284cf7a5d1a0130dd5a3d82c598cacd76838", size = 108252, upload-time = "2026-05-18T04:32:04.251Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/0d/5a/2bf22ecb24916983bf1cc0095e7dea2741d14d6553b0d6a2ac8bc96eca93/watchfiles-1.2.0-cp310-cp310-macosx_10_12_x86_64.whl", hash = "sha256:bb68bf4df85abebe5efddc53cf2075520f243a59868d9b3973278b23e76962a9", size = 400471, upload-time = "2026-05-18T04:31:08.908Z" }, + { url = "https://files.pythonhosted.org/packages/55/70/dea1f6a0e76607841a60fb51af150e70124864673f61704abb62b90cdcc7/watchfiles-1.2.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:c16cb06dd17d43b9d185094268459eac92c9538356f050e55b54e82cf700e1d4", size = 394599, upload-time = "2026-05-18T04:30:19.845Z" }, + { url = "https://files.pythonhosted.org/packages/18/52/752dcc7dc817baef5e89518732925795ce52e36a683a9a3c9fb68b21504e/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:77a0feab9af4c021c581f695258c642b3d10c5fd4c676e33a0d8606425d82631", size = 455458, upload-time = "2026-05-18T04:30:29.126Z" }, + { url = "https://files.pythonhosted.org/packages/12/48/366ebbb22fcc504c2f72b45f0b7e72f40a18795cc01752c16066d597b67a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:a16ffe19bf5cf9f5edaa1ad1dd830c5a816e8feec430c522302ab55483a4b994", size = 460513, upload-time = "2026-05-18T04:31:40.85Z" }, + { url = "https://files.pythonhosted.org/packages/ad/44/1f9e1b15e7a729062e0d0c3d0d7225ea4ab98b2267ef87287153be2495fc/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:204f299afcbd65918ab78dbc52626b0ae45e9d8cef403fdbf33ecf9e40eac66e", size = 493616, upload-time = "2026-05-18T04:30:58.47Z" }, + { url = "https://files.pythonhosted.org/packages/7e/55/8b1086dcc8a1d6a697a62767bd7ea368e74c61c6fd171683cfe24a3fe5d2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:11743adfa510bfffebe97659fb280182b5c9b238708f667e866f308c3430dc19", size = 573154, upload-time = "2026-05-18T04:30:37.903Z" }, + { url = "https://files.pythonhosted.org/packages/14/7a/242f400cc77fafa7b18d53d19d9cb64fc6a6f61f28c55913bae7c674d92a/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:eb72919d93e3a16fc451d3aa3d4b1698423daca1b382d3d959c9ac51297c12a8", size = 467046, upload-time = "2026-05-18T04:30:41.869Z" }, + { url = "https://files.pythonhosted.org/packages/02/c8/79eee650c62d2c186598489814468e389b5def0ebe755399ff645b35b1b2/watchfiles-1.2.0-cp310-cp310-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:b62f042afde2dde21ec1d2c1a74361e804673df86f51e418a999c9acfe671b07", size = 457100, upload-time = "2026-05-18T04:31:13.064Z" }, + { url = "https://files.pythonhosted.org/packages/81/36/519f6dbb7a95e4fe7c1513ed25b1520295ef9905a27f1f2226a73892bfb7/watchfiles-1.2.0-cp310-cp310-manylinux_2_31_riscv64.whl", hash = "sha256:027ae72bfdfd254862065d8b3e2a815c6ab9b1853ce41e6648ece84afd34a551", size = 467038, upload-time = "2026-05-18T04:30:32.915Z" }, + { url = "https://files.pythonhosted.org/packages/2f/12/951af6b9f89097e02511122258402cb3578443021930b70cf968d6310dc0/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_aarch64.whl", hash = "sha256:e1cfd51e97e13ff3bd047c140764d277fc9b95b7cb5da59e46a47d167adab310", size = 632563, upload-time = "2026-05-18T04:30:11.539Z" }, + { url = "https://files.pythonhosted.org/packages/28/cc/0cba1f0a6117b7ec117271bdc3cb3a5a252005959755a2c09a745e0942cc/watchfiles-1.2.0-cp310-cp310-musllinux_1_1_x86_64.whl", hash = "sha256:24b2405c0a46738dd9e1cf7135aa5dbdb9d42d024628651b3b13d5117e99f8df", size = 660851, upload-time = "2026-05-18T04:31:53.186Z" }, + { url = "https://files.pythonhosted.org/packages/d0/f2/26347558cc8bf6877845e66b315f644d03c173906aa09e233a3f4fd23928/watchfiles-1.2.0-cp310-cp310-win32.whl", hash = "sha256:8c520725602756229f045b032a1ff33d7ef0f7404189d62f6c2438cb6d8ef6a1", size = 277023, upload-time = "2026-05-18T04:30:18.825Z" }, + { url = "https://files.pythonhosted.org/packages/6d/68/a5e67b6b68e94f4c1511d61c46c55eba0737583620b6febf194c7b9cc23f/watchfiles-1.2.0-cp310-cp310-win_amd64.whl", hash = "sha256:03b14855c6f35539e2d95c442ae9530a75762f1e26567152b9ed05f96534a74d", size = 290107, upload-time = "2026-05-18T04:32:09.677Z" }, + { url = "https://files.pythonhosted.org/packages/fc/3d/8024c801df84d1587740d0359e7fdd80afeae3d159011f3d5376dd82f18e/watchfiles-1.2.0-cp311-cp311-macosx_10_12_x86_64.whl", hash = "sha256:704fd259e332e01f9b9c178f4bce9e49027e5587cc2600eeeaf8e76e1c846201", size = 400242, upload-time = "2026-05-18T04:31:19.014Z" }, + { url = "https://files.pythonhosted.org/packages/87/5b/f4dfd45323e949984a3a7f9dc31d1cbb049921e7d98253488dda72ccdaa9/watchfiles-1.2.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:6543cf55d170003296d185c0af981f3e1311564907e1f4e08671fc7693a890a5", size = 394562, upload-time = "2026-05-18T04:30:08.46Z" }, + { url = "https://files.pythonhosted.org/packages/98/d8/19483ef075d601c409bce8bcbb5c0f81a10876fff870400568f08ce484a1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:89d8c2394a065ca86f5d2910ff263ae67c127e1376ccc4f9fc35c71db879f80a", size = 456611, upload-time = "2026-05-18T04:30:45.723Z" }, + { url = "https://files.pythonhosted.org/packages/b1/6a/cc81fbe7ee42f2f22e661a6e12def7807e01b14b2f39e0ff83fd373fd307/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:772b80df316480d894a0e3165fdd19cf77f5d17f9a787f94029465ad0e3529d1", size = 461379, upload-time = "2026-05-18T04:31:29.292Z" }, + { url = "https://files.pythonhosted.org/packages/b1/57/7e669002082c0a0f4fb5113bb70125f7110124b846b0a11bc5ae8e90eac1/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:d158cd89df6053823533e06fb1d73c549133bff5f0396170c0e53d9559340717", size = 493556, upload-time = "2026-05-18T04:30:05.44Z" }, + { url = "https://files.pythonhosted.org/packages/45/7d/f60a2b19807b21fe8281f3a8da4f59eef0d5f96825ac4680ba2d4f2ebf91/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:d516b3283a758e087841aedb8031549fb41ced08f3db10aa6d2bf32dc042525b", size = 575255, upload-time = "2026-05-18T04:30:40.568Z" }, + { url = "https://files.pythonhosted.org/packages/bd/49/77f5b5e6efbcd57482f74948ebb1b97e5c0046d6b61475042d830c84b3ff/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:53b2290c92e0506d102cd448fbc610d87079553f86caa39d67440856a8b8bba5", size = 467052, upload-time = "2026-05-18T04:31:17.942Z" }, + { url = "https://files.pythonhosted.org/packages/ee/5a/73e2959af1b97fd5d556f9a8bdba017be23ceeef731869d5eaa0a753d5a3/watchfiles-1.2.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a711b51aec4370d0dcda5b6c09463206f133a5759341d7744b953a7b62e1100e", size = 456858, upload-time = "2026-05-18T04:30:30.182Z" }, + { url = "https://files.pythonhosted.org/packages/50/57/1bc8c27fad7e6c19bddee15d276dbb6ab72480ec01c127afff1673aee417/watchfiles-1.2.0-cp311-cp311-manylinux_2_31_riscv64.whl", hash = "sha256:e2ca07fa7d89195ec0865d3d285666286740bfa83d83e5cee204043a31ecc165", size = 467579, upload-time = "2026-05-18T04:32:15.897Z" }, + { url = "https://files.pythonhosted.org/packages/09/6c/3c2e44edba3553c5e3c3b8c8a2a6dee6b9e12ae2cf4bd2378bebf9dc3038/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_aarch64.whl", hash = "sha256:e0618518f282c4ebff60f5e5b1247b6d91bb8b9f4476947563a1e74acc66f3c6", size = 633253, upload-time = "2026-05-18T04:31:37.123Z" }, + { url = "https://files.pythonhosted.org/packages/30/c2/d8c84a882ab39bbefcc4915ab3e91830b7a7e990c5570b0b69075aba3faf/watchfiles-1.2.0-cp311-cp311-musllinux_1_1_x86_64.whl", hash = "sha256:0d191c054d0715c3c95c99df9b8dbf6fd096d8c1e021e8f212e1bd8bc444ccb5", size = 660713, upload-time = "2026-05-18T04:31:24.62Z" }, + { url = "https://files.pythonhosted.org/packages/a9/07/f97736a5fc605364fe67b25e9fa4a6965dfd4840d50c406ada507e9d735f/watchfiles-1.2.0-cp311-cp311-win32.whl", hash = "sha256:9342472aff9b093c5acd4f6d8f70ae0937964ab56542502bcf5579782da69ae8", size = 277222, upload-time = "2026-05-18T04:31:21.131Z" }, + { url = "https://files.pythonhosted.org/packages/cf/99/2b04981977fc2608afd60360d928c6aecf6b950292ca221d98f4005f6694/watchfiles-1.2.0-cp311-cp311-win_amd64.whl", hash = "sha256:dbd6c97045dad81227c8d040173da044c1de08de64a5ea8b555da4aee1d5fa22", size = 290274, upload-time = "2026-05-18T04:31:45.966Z" }, + { url = "https://files.pythonhosted.org/packages/3c/74/f7f58a7075ee9cf612b0cfcddb78b8cd8234f0742d6f0075cf0da2dde1c6/watchfiles-1.2.0-cp311-cp311-win_arm64.whl", hash = "sha256:57a2d9fa4fb4c2ecae57b13dfff2c7ab53e21a2ba674fe9f05506680fcdcc0d7", size = 283460, upload-time = "2026-05-18T04:31:39.126Z" }, + { url = "https://files.pythonhosted.org/packages/b8/2f/e42c992d2afda3108ea1c02acecc991b9f31d05c14adc2a7cee9ee211fc4/watchfiles-1.2.0-cp312-cp312-macosx_10_12_x86_64.whl", hash = "sha256:bc13eb17538be00c874699dc0abe4ee2bc8d50bb1166a6b9e175ef3fd7eb8f26", size = 400115, upload-time = "2026-05-18T04:32:02.06Z" }, + { url = "https://files.pythonhosted.org/packages/5f/8f/6af2ea19065c91d8b0ea3516fdfc8c0d349f407e8e9fbf4e5a17360de8ad/watchfiles-1.2.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:2d95ddc1eb6914154253d239089900813f6a767e174b8e6a50e7fdacb7e4236c", size = 393659, upload-time = "2026-05-18T04:30:50.951Z" }, + { url = "https://files.pythonhosted.org/packages/13/01/b32a967c56fb3e3e5be3db52c3d3b87fa4513aa367d8ed1ad96d42952e5f/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:8f70d8b291ef6e88d19b1f297a6905ddb978888d9272b0d05e6f53309856bcfc", size = 453207, upload-time = "2026-05-18T04:31:04.231Z" }, + { url = "https://files.pythonhosted.org/packages/04/98/97557a812180338cb1abd32e1cffcc4588f59b5f23e0cb006b2ba95ba64a/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_armv7l.manylinux2014_armv7l.whl", hash = "sha256:56d8641cf834c2836922899105bd3ce3d0dfc69291d52edf0b4d0436829b34c0", size = 459273, upload-time = "2026-05-18T04:31:50.377Z" }, + { url = "https://files.pythonhosted.org/packages/e8/a8/b4b08dcb7653b8087c6586f7ce649505900e866bbcfe40dc9587af02e686/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_i686.manylinux2014_i686.whl", hash = "sha256:2581a94056e55d7d0a31a823ea92bf73749c489ca2285bfdc0fbe6b2bb49d50c", size = 489927, upload-time = "2026-05-18T04:31:42.485Z" }, + { url = "https://files.pythonhosted.org/packages/50/94/3dceea03545d2e5ddfd839f0ddd5e1cecbf1697b5a428d5ba11cef6af95d/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_ppc64le.manylinux2014_ppc64le.whl", hash = "sha256:41bc1199f7523b3f82843c88cbb979180c949caef0342cf90968f178e5d49b01", size = 570476, upload-time = "2026-05-18T04:31:03.071Z" }, + { url = "https://files.pythonhosted.org/packages/cc/f2/d39a5450c3532092b91f81d274360e613c2371bc874a89c7a1a3c5e8d138/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_s390x.manylinux2014_s390x.whl", hash = "sha256:7571e4464cb6e434958f867f7f730b8ab0b75e3f8e5eac0499168486ab3c33a8", size = 465650, upload-time = "2026-05-18T04:30:12.701Z" }, + { url = "https://files.pythonhosted.org/packages/22/24/ed72f68cbc1333ca9b9f2200aa048bb6658ae41709bc1caad4310f4bdffd/watchfiles-1.2.0-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:e53a384f76b631c3ae5334ce6a52f0baa3a911eb94a4eac7f160079868b716d5", size = 456398, upload-time = "2026-05-18T04:30:13.784Z" }, + { url = "https://files.pythonhosted.org/packages/0d/64/982ef4a4e5bab5b6e5b6becc8cd5e732f6130a78b855f0abec6439a9a135/watchfiles-1.2.0-cp312-cp312-manylinux_2_31_riscv64.whl", hash = "sha256:d20029a60a71a052a24c4db7673bc4de39ab89adbaccbfb5d67987c5d73f424d", size = 465140, upload-time = "2026-05-18T04:31:52.111Z" }, + { url = "https://files.pythonhosted.org/packages/a0/0c/95282abf4ed680b6096010bcfc30c5fa7a041fc5aa5a2ad17a2cc6c75bba/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_aarch64.whl", hash = "sha256:2cb93af48550faf1cea04c303107c8b75833de7013e57ce27d3b8d21d8d0f58c", size = 630259, upload-time = "2026-05-18T04:31:25.676Z" }, + { url = "https://files.pythonhosted.org/packages/30/45/607c1de1530c4bdcf2cf1d1ecc2505ddba5d96bd43ba9f2b0e79876f850f/watchfiles-1.2.0-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:2995c176de7692b86a2e4c58d9ec718f753150a979cb4a754e2b4ffa38e70906", size = 659859, upload-time = "2026-05-18T04:30:24.333Z" }, + { url = "https://files.pythonhosted.org/packages/fa/08/d9e2e0f9e8e6791d33aefc694ad7eefa7f901f63caff84a81ded38692f9c/watchfiles-1.2.0-cp312-cp312-win32.whl", hash = "sha256:7a2cffd17d27d2ecbb310c2b1d8174f222a5495b1a721894afa88ec11e25b898", size = 275480, upload-time = "2026-05-18T04:30:31.307Z" }, + { url = "https://files.pythonhosted.org/packages/1c/e6/9d42569c0102645cc8cea5d8c7d8a1e9d4ada2cb7f05f75e554b8aa2202a/watchfiles-1.2.0-cp312-cp312-win_amd64.whl", hash = "sha256:f155b3a1b2a5fc89cdc70d47ee5d54e3b75e88efa34982028a35daef9ba00379", size = 288718, upload-time = "2026-05-18T04:32:10.745Z" }, + { url = "https://files.pythonhosted.org/packages/0a/26/88e0dc6ee3898169d7fa22bb6a69cabf2502d2ee25cb8c876d1262d204f8/watchfiles-1.2.0-cp312-cp312-win_arm64.whl", hash = "sha256:8fa585ede612ee9f9e91b18bebf9ba11b9ae29a4e3a0d0cf6fca3e382133f0d5", size = 281026, upload-time = "2026-05-18T04:30:22.23Z" }, + { url = "https://files.pythonhosted.org/packages/23/f4/7513ef1e85fc4c6331b59479d6d72661fc391fbe543678052ac72c8b6c19/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_10_12_x86_64.whl", hash = "sha256:4674d49eb94706dfe666c069fc0a1b646ffcf920473492e209f6d5f60d3f0cc2", size = 403050, upload-time = "2026-05-18T04:30:36.753Z" }, + { url = "https://files.pythonhosted.org/packages/27/0b/a54103cfd732bb703c7a749222011a0483ef3705948dae3b203158601119/watchfiles-1.2.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:094b9b70103d4e963499bdea001ee3c2697b144cd9ae6218a62c0f89ec9e31db", size = 396629, upload-time = "2026-05-18T04:32:03.268Z" }, + { url = "https://files.pythonhosted.org/packages/5e/2c/73f31a3b893886206c3f54d73e8ad8dee58cdb2f69ad2622e0a8a9e07f4e/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:b0ef001f8c25ad0fa9529f914c1600647ecd0f542d11c19b7894768c67b6acb7", size = 457318, upload-time = "2026-05-18T04:31:01.932Z" }, + { url = "https://files.pythonhosted.org/packages/e9/f9/45d021e4a5cc7b9dd567f7cbb06d3b75f751a690063fb6cc7ec60f4e46b7/watchfiles-1.2.0-pp311-pypy311_pp73-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:a88fc94e647bc4eec523f1caa540258eb71d14278b9daf72fa1e2658a98df0f0", size = 457771, upload-time = "2026-05-18T04:30:56.331Z" }, +] + +[[package]] +name = "wcwidth" +version = "0.8.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/34/74/c6428f875774288bec1396f5bfcbc2d925700a4dad61727fd5f2b12f249d/wcwidth-0.8.2.tar.gz", hash = "sha256:91fbef97204b96a3d4d421609b80340b760cf33e26da123ff243d76b1fda8dda", size = 1466253, upload-time = "2026-06-29T18:11:11.601Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/96/42/3e5985a0a7e57de470b320c6d6a1a67c844f6737a587f3d44dd13d1819e7/wcwidth-0.8.2-py3-none-any.whl", hash = "sha256:d63947694a0539a1d51e01eda7caf800c291020e6cdd7e28ad7b14dd33ad4f85", size = 323166, upload-time = "2026-06-29T18:11:09.888Z" }, +] + +[[package]] +name = "webencodings" +version = "0.5.1" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/0b/02/ae6ceac1baeda530866a85075641cec12989bd8d31af6d5ab4a3e8c92f47/webencodings-0.5.1.tar.gz", hash = "sha256:b36a1c245f2d304965eb4e0a82848379241dc04b865afcc4aab16748587e1923", size = 9721, upload-time = "2017-04-05T20:21:34.189Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/f4/24/2a3e3df732393fed8b3ebf2ec078f05546de641fe1b667ee316ec1dcf3b7/webencodings-0.5.1-py2.py3-none-any.whl", hash = "sha256:a0af1213f3c2226497a97e2b3aa01a7e4bee4f403f95be16fc9acd2947514a78", size = 11774, upload-time = "2017-04-05T20:21:32.581Z" }, +] + +[[package]] +name = "websockets" +version = "16.0" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/04/24/4b2031d72e840ce4c1ccb255f693b15c334757fc50023e4db9537080b8c4/websockets-16.0.tar.gz", hash = "sha256:5f6261a5e56e8d5c42a4497b364ea24d94d9563e8fbd44e78ac40879c60179b5", size = 179346, upload-time = "2026-01-10T09:23:47.181Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/20/74/221f58decd852f4b59cc3354cccaf87e8ef695fede361d03dc9a7396573b/websockets-16.0-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:04cdd5d2d1dacbad0a7bf36ccbcd3ccd5a30ee188f2560b7a62a30d14107b31a", size = 177343, upload-time = "2026-01-10T09:22:21.28Z" }, + { url = "https://files.pythonhosted.org/packages/19/0f/22ef6107ee52ab7f0b710d55d36f5a5d3ef19e8a205541a6d7ffa7994e5a/websockets-16.0-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:8ff32bb86522a9e5e31439a58addbb0166f0204d64066fb955265c4e214160f0", size = 175021, upload-time = "2026-01-10T09:22:22.696Z" }, + { url = "https://files.pythonhosted.org/packages/10/40/904a4cb30d9b61c0e278899bf36342e9b0208eb3c470324a9ecbaac2a30f/websockets-16.0-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:583b7c42688636f930688d712885cf1531326ee05effd982028212ccc13e5957", size = 175320, upload-time = "2026-01-10T09:22:23.94Z" }, + { url = "https://files.pythonhosted.org/packages/9d/2f/4b3ca7e106bc608744b1cdae041e005e446124bebb037b18799c2d356864/websockets-16.0-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:7d837379b647c0c4c2355c2499723f82f1635fd2c26510e1f587d89bc2199e72", size = 183815, upload-time = "2026-01-10T09:22:25.469Z" }, + { url = "https://files.pythonhosted.org/packages/86/26/d40eaa2a46d4302becec8d15b0fc5e45bdde05191e7628405a19cf491ccd/websockets-16.0-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:df57afc692e517a85e65b72e165356ed1df12386ecb879ad5693be08fac65dde", size = 185054, upload-time = "2026-01-10T09:22:27.101Z" }, + { url = "https://files.pythonhosted.org/packages/b0/ba/6500a0efc94f7373ee8fefa8c271acdfd4dca8bd49a90d4be7ccabfc397e/websockets-16.0-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:2b9f1e0d69bc60a4a87349d50c09a037a2607918746f07de04df9e43252c77a3", size = 184565, upload-time = "2026-01-10T09:22:28.293Z" }, + { url = "https://files.pythonhosted.org/packages/04/b4/96bf2cee7c8d8102389374a2616200574f5f01128d1082f44102140344cc/websockets-16.0-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:335c23addf3d5e6a8633f9f8eda77efad001671e80b95c491dd0924587ece0b3", size = 183848, upload-time = "2026-01-10T09:22:30.394Z" }, + { url = "https://files.pythonhosted.org/packages/02/8e/81f40fb00fd125357814e8c3025738fc4ffc3da4b6b4a4472a82ba304b41/websockets-16.0-cp310-cp310-win32.whl", hash = "sha256:37b31c1623c6605e4c00d466c9d633f9b812ea430c11c8a278774a1fde1acfa9", size = 178249, upload-time = "2026-01-10T09:22:32.083Z" }, + { url = "https://files.pythonhosted.org/packages/b4/5f/7e40efe8df57db9b91c88a43690ac66f7b7aa73a11aa6a66b927e44f26fa/websockets-16.0-cp310-cp310-win_amd64.whl", hash = "sha256:8e1dab317b6e77424356e11e99a432b7cb2f3ec8c5ab4dabbcee6add48f72b35", size = 178685, upload-time = "2026-01-10T09:22:33.345Z" }, + { url = "https://files.pythonhosted.org/packages/f2/db/de907251b4ff46ae804ad0409809504153b3f30984daf82a1d84a9875830/websockets-16.0-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:31a52addea25187bde0797a97d6fc3d2f92b6f72a9370792d65a6e84615ac8a8", size = 177340, upload-time = "2026-01-10T09:22:34.539Z" }, + { url = "https://files.pythonhosted.org/packages/f3/fa/abe89019d8d8815c8781e90d697dec52523fb8ebe308bf11664e8de1877e/websockets-16.0-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:417b28978cdccab24f46400586d128366313e8a96312e4b9362a4af504f3bbad", size = 175022, upload-time = "2026-01-10T09:22:36.332Z" }, + { url = "https://files.pythonhosted.org/packages/58/5d/88ea17ed1ded2079358b40d31d48abe90a73c9e5819dbcde1606e991e2ad/websockets-16.0-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:af80d74d4edfa3cb9ed973a0a5ba2b2a549371f8a741e0800cb07becdd20f23d", size = 175319, upload-time = "2026-01-10T09:22:37.602Z" }, + { url = "https://files.pythonhosted.org/packages/d2/ae/0ee92b33087a33632f37a635e11e1d99d429d3d323329675a6022312aac2/websockets-16.0-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:08d7af67b64d29823fed316505a89b86705f2b7981c07848fb5e3ea3020c1abe", size = 184631, upload-time = "2026-01-10T09:22:38.789Z" }, + { url = "https://files.pythonhosted.org/packages/c8/c5/27178df583b6c5b31b29f526ba2da5e2f864ecc79c99dae630a85d68c304/websockets-16.0-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:7be95cfb0a4dae143eaed2bcba8ac23f4892d8971311f1b06f3c6b78952ee70b", size = 185870, upload-time = "2026-01-10T09:22:39.893Z" }, + { url = "https://files.pythonhosted.org/packages/87/05/536652aa84ddc1c018dbb7e2c4cbcd0db884580bf8e95aece7593fde526f/websockets-16.0-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:d6297ce39ce5c2e6feb13c1a996a2ded3b6832155fcfc920265c76f24c7cceb5", size = 185361, upload-time = "2026-01-10T09:22:41.016Z" }, + { url = "https://files.pythonhosted.org/packages/6d/e2/d5332c90da12b1e01f06fb1b85c50cfc489783076547415bf9f0a659ec19/websockets-16.0-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:1c1b30e4f497b0b354057f3467f56244c603a79c0d1dafce1d16c283c25f6e64", size = 184615, upload-time = "2026-01-10T09:22:42.442Z" }, + { url = "https://files.pythonhosted.org/packages/77/fb/d3f9576691cae9253b51555f841bc6600bf0a983a461c79500ace5a5b364/websockets-16.0-cp311-cp311-win32.whl", hash = "sha256:5f451484aeb5cafee1ccf789b1b66f535409d038c56966d6101740c1614b86c6", size = 178246, upload-time = "2026-01-10T09:22:43.654Z" }, + { url = "https://files.pythonhosted.org/packages/54/67/eaff76b3dbaf18dcddabc3b8c1dba50b483761cccff67793897945b37408/websockets-16.0-cp311-cp311-win_amd64.whl", hash = "sha256:8d7f0659570eefb578dacde98e24fb60af35350193e4f56e11190787bee77dac", size = 178684, upload-time = "2026-01-10T09:22:44.941Z" }, + { url = "https://files.pythonhosted.org/packages/84/7b/bac442e6b96c9d25092695578dda82403c77936104b5682307bd4deb1ad4/websockets-16.0-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:71c989cbf3254fbd5e84d3bff31e4da39c43f884e64f2551d14bb3c186230f00", size = 177365, upload-time = "2026-01-10T09:22:46.787Z" }, + { url = "https://files.pythonhosted.org/packages/b0/fe/136ccece61bd690d9c1f715baaeefd953bb2360134de73519d5df19d29ca/websockets-16.0-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8b6e209ffee39ff1b6d0fa7bfef6de950c60dfb91b8fcead17da4ee539121a79", size = 175038, upload-time = "2026-01-10T09:22:47.999Z" }, + { url = "https://files.pythonhosted.org/packages/40/1e/9771421ac2286eaab95b8575b0cb701ae3663abf8b5e1f64f1fd90d0a673/websockets-16.0-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:86890e837d61574c92a97496d590968b23c2ef0aeb8a9bc9421d174cd378ae39", size = 175328, upload-time = "2026-01-10T09:22:49.809Z" }, + { url = "https://files.pythonhosted.org/packages/18/29/71729b4671f21e1eaa5d6573031ab810ad2936c8175f03f97f3ff164c802/websockets-16.0-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:9b5aca38b67492ef518a8ab76851862488a478602229112c4b0d58d63a7a4d5c", size = 184915, upload-time = "2026-01-10T09:22:51.071Z" }, + { url = "https://files.pythonhosted.org/packages/97/bb/21c36b7dbbafc85d2d480cd65df02a1dc93bf76d97147605a8e27ff9409d/websockets-16.0-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:e0334872c0a37b606418ac52f6ab9cfd17317ac26365f7f65e203e2d0d0d359f", size = 186152, upload-time = "2026-01-10T09:22:52.224Z" }, + { url = "https://files.pythonhosted.org/packages/4a/34/9bf8df0c0cf88fa7bfe36678dc7b02970c9a7d5e065a3099292db87b1be2/websockets-16.0-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:a0b31e0b424cc6b5a04b8838bbaec1688834b2383256688cf47eb97412531da1", size = 185583, upload-time = "2026-01-10T09:22:53.443Z" }, + { url = "https://files.pythonhosted.org/packages/47/88/4dd516068e1a3d6ab3c7c183288404cd424a9a02d585efbac226cb61ff2d/websockets-16.0-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:485c49116d0af10ac698623c513c1cc01c9446c058a4e61e3bf6c19dff7335a2", size = 184880, upload-time = "2026-01-10T09:22:55.033Z" }, + { url = "https://files.pythonhosted.org/packages/91/d6/7d4553ad4bf1c0421e1ebd4b18de5d9098383b5caa1d937b63df8d04b565/websockets-16.0-cp312-cp312-win32.whl", hash = "sha256:eaded469f5e5b7294e2bdca0ab06becb6756ea86894a47806456089298813c89", size = 178261, upload-time = "2026-01-10T09:22:56.251Z" }, + { url = "https://files.pythonhosted.org/packages/c3/f0/f3a17365441ed1c27f850a80b2bc680a0fa9505d733fe152fdf5e98c1c0b/websockets-16.0-cp312-cp312-win_amd64.whl", hash = "sha256:5569417dc80977fc8c2d43a86f78e0a5a22fee17565d78621b6bb264a115d4ea", size = 178693, upload-time = "2026-01-10T09:22:57.478Z" }, + { url = "https://files.pythonhosted.org/packages/72/07/c98a68571dcf256e74f1f816b8cc5eae6eb2d3d5cfa44d37f801619d9166/websockets-16.0-pp311-pypy311_pp73-macosx_10_15_x86_64.whl", hash = "sha256:349f83cd6c9a415428ee1005cadb5c2c56f4389bc06a9af16103c3bc3dcc8b7d", size = 174947, upload-time = "2026-01-10T09:23:36.166Z" }, + { url = "https://files.pythonhosted.org/packages/7e/52/93e166a81e0305b33fe416338be92ae863563fe7bce446b0f687b9df5aea/websockets-16.0-pp311-pypy311_pp73-macosx_11_0_arm64.whl", hash = "sha256:4a1aba3340a8dca8db6eb5a7986157f52eb9e436b74813764241981ca4888f03", size = 175260, upload-time = "2026-01-10T09:23:37.409Z" }, + { url = "https://files.pythonhosted.org/packages/56/0c/2dbf513bafd24889d33de2ff0368190a0e69f37bcfa19009ef819fe4d507/websockets-16.0-pp311-pypy311_pp73-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:f4a32d1bd841d4bcbffdcb3d2ce50c09c3909fbead375ab28d0181af89fd04da", size = 176071, upload-time = "2026-01-10T09:23:39.158Z" }, + { url = "https://files.pythonhosted.org/packages/a5/8f/aea9c71cc92bf9b6cc0f7f70df8f0b420636b6c96ef4feee1e16f80f75dd/websockets-16.0-pp311-pypy311_pp73-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0298d07ee155e2e9fda5be8a9042200dd2e3bb0b8a38482156576f863a9d457c", size = 176968, upload-time = "2026-01-10T09:23:41.031Z" }, + { url = "https://files.pythonhosted.org/packages/9a/3f/f70e03f40ffc9a30d817eef7da1be72ee4956ba8d7255c399a01b135902a/websockets-16.0-pp311-pypy311_pp73-win_amd64.whl", hash = "sha256:a653aea902e0324b52f1613332ddf50b00c06fdaf7e92624fbf8c77c78fa5767", size = 178735, upload-time = "2026-01-10T09:23:42.259Z" }, + { url = "https://files.pythonhosted.org/packages/6f/28/258ebab549c2bf3e64d2b0217b973467394a9cea8c42f70418ca2c5d0d2e/websockets-16.0-py3-none-any.whl", hash = "sha256:1637db62fad1dc833276dded54215f2c7fa46912301a24bd94d45d46a011ceec", size = 171598, upload-time = "2026-01-10T09:23:45.395Z" }, +] + +[[package]] +name = "wrapt" +version = "2.2.2" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/fe/a4/282c8e64300a59fc834518a54bf0afabb4ff9218b5fa76958b450459a844/wrapt-2.2.2.tar.gz", hash = "sha256:0788e321027c999bf221b667bd4a54aaefd1a36283749a860ac3eb77daed0302", size = 129068, upload-time = "2026-06-20T23:49:44.49Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/e1/8b/59781d0fe7b0adfbea37f600857de4be68921e454aeecf1a11bda35cdccc/wrapt-2.2.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:055e6fcfaa28e58c6a8c247d48b92be9d56f818b7068aa4f22b15b3343a09931", size = 80556, upload-time = "2026-06-20T23:47:28.473Z" }, + { url = "https://files.pythonhosted.org/packages/94/dc/66c61aca927230c9cf97a3cb005c803971a1076ff9f7d61085d035c20085/wrapt-2.2.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:8374eb6b1a58809211e84ff835a182bb17ab2807a5bfef23204c8cff38178a00", size = 81648, upload-time = "2026-06-20T23:47:30.504Z" }, + { url = "https://files.pythonhosted.org/packages/23/1b/545eee1c18f3af4cf140bb5822b6ef81ebe569df0a63ac109973103a30a5/wrapt-2.2.2-cp310-cp310-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:656593bb3f5529f03d27af4136c4d7b11990e470bcbc6fefa5ef218695bece55", size = 152956, upload-time = "2026-06-20T23:47:31.867Z" }, + { url = "https://files.pythonhosted.org/packages/44/a7/6f42a3d03e44dc612a5dcff324e7366075a7857f0be2d49a8cb8a68279b8/wrapt-2.2.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:dfb00cb7bb22099e2f64b7340fb96113639aa7260c0972af3797ace2297b936c", size = 154771, upload-time = "2026-06-20T23:47:33.352Z" }, + { url = "https://files.pythonhosted.org/packages/bf/55/4d76175aaa97523c38f1d28f79d18ab41a1b116814158a818bc0eba00571/wrapt-2.2.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:e7f10ee0bd53673bfd52b67cbce83336fe6cad90d2377b03baf66491d2bbfb91", size = 149460, upload-time = "2026-06-20T23:47:34.712Z" }, + { url = "https://files.pythonhosted.org/packages/84/9b/12e23264d8f4735e8483262f95c5a6b03c3665fd2a84bdf99a45b6a2f4ec/wrapt-2.2.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:4402f57c5f0d0579599858ffbdd9bf4e3f0972f51096f2bd6cc7dab6b76ee49e", size = 153648, upload-time = "2026-06-20T23:47:36.092Z" }, + { url = "https://files.pythonhosted.org/packages/d6/a3/bcd5ec37289dcd85ecd4d15395a6a6063d60bc45ff94a9d77814e1e54d64/wrapt-2.2.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:3a4eb7964ff4643d333c84f880bcf554652b2a1050aebc54ae696327f61acfaf", size = 148502, upload-time = "2026-06-20T23:47:37.623Z" }, + { url = "https://files.pythonhosted.org/packages/f2/be/716d708f607fa70f8a6eb47dff8ee945d5278dfc89ffeeff33039d052e63/wrapt-2.2.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:e542b7c5af91e2123a8aabf19894319d5ec4268d2a9ffd2f239386133fc47746", size = 152238, upload-time = "2026-06-20T23:47:39.118Z" }, + { url = "https://files.pythonhosted.org/packages/b5/c0/1a48e7e54501274f5d906f18372221b13183b0afbb5b8bb4c7ca0392c0b4/wrapt-2.2.2-cp310-cp310-win32.whl", hash = "sha256:6e7e45b43d3c774d244fe7264378f5a3f0f383bc55a54a9866434e524540110f", size = 77278, upload-time = "2026-06-20T23:47:40.476Z" }, + { url = "https://files.pythonhosted.org/packages/b0/82/9cd69a1af288fbdedf01a10e3c8a0b6890b08c7f3f96d36a213699dbcd94/wrapt-2.2.2-cp310-cp310-win_amd64.whl", hash = "sha256:955f1d6e72a352e478de8d8b503abe301c5e139a141b62eb0923bd694995025f", size = 80131, upload-time = "2026-06-20T23:47:41.785Z" }, + { url = "https://files.pythonhosted.org/packages/7f/73/8db7e27daef37ae70a53ea62bef7fe80cc51a8b5e9e9181a8be6eb9a999c/wrapt-2.2.2-cp310-cp310-win_arm64.whl", hash = "sha256:b89d8d73c82db2bb7e6090b3afd7973f980d24e905cc34394eab60b884b3bf67", size = 79615, upload-time = "2026-06-20T23:47:43.109Z" }, + { url = "https://files.pythonhosted.org/packages/27/15/0c2d55168707465abfc41f33c0b23d792a5fa9b65c26983606940900a120/wrapt-2.2.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:f1a2ff355ece6a111ca7a20dc86df6659c9205d3fcee674ca34f2a2854fd4e73", size = 80782, upload-time = "2026-06-20T23:47:44.367Z" }, + { url = "https://files.pythonhosted.org/packages/7d/b5/5c0b093eb48f8a062ef6267d3cb36e9bb1b88440181f6545a383c60efdf8/wrapt-2.2.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:55b9a899e6fff5444f229d30aa6e9ac92d2216d9d60f33c771b5d76a760d5f8e", size = 81678, upload-time = "2026-06-20T23:47:45.857Z" }, + { url = "https://files.pythonhosted.org/packages/34/f3/de70937472dd3e8a4e6811192f9c6075efdffd4a2cd9b4596bf160f89668/wrapt-2.2.2-cp311-cp311-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:a2d78c363f97d8bd718ee40432c66395685e9e98528ccaa423c3355d1715a26d", size = 159671, upload-time = "2026-06-20T23:47:47.345Z" }, + { url = "https://files.pythonhosted.org/packages/a5/ec/40aed2330e7f02ecf74386ffcfef9ccb7108c6a430f15b6a252b663b1bed/wrapt-2.2.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:d619e1eed9bd4f6ed9f24cd61971aa086fa86505289628d464bcf8a2c2e3f328", size = 160785, upload-time = "2026-06-20T23:47:48.759Z" }, + { url = "https://files.pythonhosted.org/packages/45/04/aa5309beed5344b00220ae6b3b24055852192656194c27947bee1736306a/wrapt-2.2.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:518b0c5e323511ec56a38894802ddd5e1222626484e68efe63f201854ad788e5", size = 153699, upload-time = "2026-06-20T23:47:50.177Z" }, + { url = "https://files.pythonhosted.org/packages/01/df/2def7e99d1fe87eea413f95f671924cdddcb08823b1ffd212748dfa6d062/wrapt-2.2.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:4bccea5cdecffa9dd70e343741f0e41e0a16619313d04b72f78bb525162ebcd0", size = 159695, upload-time = "2026-06-20T23:47:51.602Z" }, + { url = "https://files.pythonhosted.org/packages/c7/f6/a906d01a2ce12157bad2404957b3e2140da354b8a70b2fa48bbf282871c0/wrapt-2.2.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:209112cafd963710a05d199aae431d79a28bc76eb8e6d1bbbb8ad24340722cae", size = 152813, upload-time = "2026-06-20T23:47:53.03Z" }, + { url = "https://files.pythonhosted.org/packages/02/49/bc0086292d239575b4c08f4cf8a4079fa58abbad58ec23abf84833a283ed/wrapt-2.2.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:e5a5290e4bf2f332fc29ce72ffb9a2fff678aaac047e2e9f5f7165cd7792e099", size = 158809, upload-time = "2026-06-20T23:47:54.391Z" }, + { url = "https://files.pythonhosted.org/packages/55/83/8fbd034de1f3e907edaa18786d5dd8f6932874edee0826c7cecb5cab03a1/wrapt-2.2.2-cp311-cp311-win32.whl", hash = "sha256:5499236ad1dc116012e2a5dd943f3f31af12fce452128e2bbcbd55a7d3d4d14c", size = 77414, upload-time = "2026-06-20T23:47:55.882Z" }, + { url = "https://files.pythonhosted.org/packages/7e/9c/23695baa331c6de4e874c3d78b8e0bed92e1d2a274e665b29858f6841672/wrapt-2.2.2-cp311-cp311-win_amd64.whl", hash = "sha256:8636809939152be6ae20a6cef0fed9fe60f411b47847d0426a826884b469e971", size = 80368, upload-time = "2026-06-20T23:47:57.237Z" }, + { url = "https://files.pythonhosted.org/packages/08/49/40cefc342bf89b234a4490d741290fce781774b831aefb39c25471da96c9/wrapt-2.2.2-cp311-cp311-win_arm64.whl", hash = "sha256:5d0a142f7af07caeb5e5da87493162a7b8efa19ba919e550a746f7446e13fb30", size = 79489, upload-time = "2026-06-20T23:47:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/2a/85/180b40628b23772692a0c76e8030114e1c0ae068470ed531919f0a5f2a4a/wrapt-2.2.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:8417fd3c674d3c8023d080292d29301531a12daf8bd938dd419710dd2f464f2b", size = 81484, upload-time = "2026-06-20T23:47:59.924Z" }, + { url = "https://files.pythonhosted.org/packages/94/f2/21c90f2a16689702e2aaff45795b11018dff2c9b1242bac10d225483f676/wrapt-2.2.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:0e7070c7472582e31af3dfc2622b2381a0df7435110a9388ed8db5ffbce67efb", size = 82151, upload-time = "2026-06-20T23:48:01.303Z" }, + { url = "https://files.pythonhosted.org/packages/5f/b3/7e6e9fcf4fe7e1b69a49fe6cc5a44e8224bab6283c5233c97e132f14908e/wrapt-2.2.2-cp312-cp312-manylinux1_x86_64.manylinux_2_28_x86_64.manylinux_2_5_x86_64.whl", hash = "sha256:2e096c9d39a59b35b63c9aacfbbbec2088ff51ff1fc31051acc60a07f42f273a", size = 169828, upload-time = "2026-06-20T23:48:02.719Z" }, + { url = "https://files.pythonhosted.org/packages/0b/43/894f132d857ed5a9904d937baf368badcbe5ea9e436e2f1930fe21c9f1f0/wrapt-2.2.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:6d1a6050405bf334be33bf66296f113563622972a34900ae6fa60fd283a1a900", size = 171544, upload-time = "2026-06-20T23:48:04.266Z" }, + { url = "https://files.pythonhosted.org/packages/29/de/3c833e03725b477e9ea34028224dd21a48781830101e4e036f77e8b6b102/wrapt-2.2.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:10adb01371408c6de504a6658b9886480f1a4919a83752748a387a504a21df79", size = 160663, upload-time = "2026-06-20T23:48:05.708Z" }, + { url = "https://files.pythonhosted.org/packages/33/be/27edce350b24e3054d9d047f65f16d4c4d4c1f3f31c4278a1f8a95c723c8/wrapt-2.2.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3442eee2a5798f9b451f1b2cd7518ce8b7e28a2a364696c414460a0e295c012a", size = 169387, upload-time = "2026-06-20T23:48:07.243Z" }, + { url = "https://files.pythonhosted.org/packages/e2/c4/9fd9679af8bf38e146652c7f47b6b352c3e5795b4ad1c0b7f94e15ac2aa7/wrapt-2.2.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:6c99012a22f735a85eed7c4b86a3e99c30fdd57d9e115b2b45f796264b58d0bf", size = 158849, upload-time = "2026-06-20T23:48:08.91Z" }, + { url = "https://files.pythonhosted.org/packages/bc/c2/aa6c0c2206803068c6859dabe01f8c84c43744da93d4c67b8946d21655ee/wrapt-2.2.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:3b686cfc008776a3952d6213cb296ed7f45d782a8453936406faa89eac0835ab", size = 168147, upload-time = "2026-06-20T23:48:10.374Z" }, + { url = "https://files.pythonhosted.org/packages/42/63/3eb25da41049d20ae18fcab2dd8b056e02387c4bfa626cbdfb7c3b872e4f/wrapt-2.2.2-cp312-cp312-win32.whl", hash = "sha256:ef2cce266b5b0b07e19fa82e59673b81142b7a3607c8ed1254113d048ed668da", size = 77734, upload-time = "2026-06-20T23:48:11.769Z" }, + { url = "https://files.pythonhosted.org/packages/da/09/0390e008a305360948fa9ce69507d041ac12cb2ee5d28e34467e2ee79391/wrapt-2.2.2-cp312-cp312-win_amd64.whl", hash = "sha256:abf8c20a2d72ee69e16328b3c91342c446e723bfe48bfcc4dded3b9722ac027f", size = 80585, upload-time = "2026-06-20T23:48:13.117Z" }, + { url = "https://files.pythonhosted.org/packages/d3/b3/84c445c66969f2d3457276b183a48c91097d59bbef9af6c075366b0f8c36/wrapt-2.2.2-cp312-cp312-win_arm64.whl", hash = "sha256:c6c64c5d02578bc4c4bca4f0aef1504de933c1d5b4ac2710b9131111459506c8", size = 79553, upload-time = "2026-06-20T23:48:14.5Z" }, + { url = "https://files.pythonhosted.org/packages/6e/d2/6317eb6d4554855bbf12d61857774af34747bf88a42c19bf306de67e2fa3/wrapt-2.2.2-py3-none-any.whl", hash = "sha256:5bad217350f19ce99ca5b5e71d406765ea86fe541628426772b657375ee1c048", size = 61460, upload-time = "2026-06-20T23:49:42.966Z" }, +] + +[[package]] +name = "wsproto" +version = "1.3.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "h11" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/c7/79/12135bdf8b9c9367b8701c2c19a14c913c120b882d50b014ca0d38083c2c/wsproto-1.3.2.tar.gz", hash = "sha256:b86885dcf294e15204919950f666e06ffc6c7c114ca900b060d6e16293528294", size = 50116, upload-time = "2025-11-20T18:18:01.871Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/a4/f5/10b68b7b1544245097b2a1b8238f66f2fc6dcaeb24ba5d917f52bd2eed4f/wsproto-1.3.2-py3-none-any.whl", hash = "sha256:61eea322cdf56e8cc904bd3ad7573359a242ba65688716b0710a5eb12beab584", size = 24405, upload-time = "2025-11-20T18:18:00.454Z" }, +] + +[[package]] +name = "xmltodict" +version = "1.0.4" +source = { registry = "https://pypi.org/simple" } +sdist = { url = "https://files.pythonhosted.org/packages/19/70/80f3b7c10d2630aa66414bf23d210386700aa390547278c789afa994fd7e/xmltodict-1.0.4.tar.gz", hash = "sha256:6d94c9f834dd9e44514162799d344d815a3a4faec913717a9ecbfa5be1bb8e61", size = 26124, upload-time = "2026-02-22T02:21:22.074Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/38/34/98a2f52245f4d47be93b580dae5f9861ef58977d73a79eb47c58f1ad1f3a/xmltodict-1.0.4-py3-none-any.whl", hash = "sha256:a4a00d300b0e1c59fc2bfccb53d7b2e88c32f200df138a0dd2229f842497026a", size = 13580, upload-time = "2026-02-22T02:21:21.039Z" }, +] + +[[package]] +name = "yarl" +version = "1.24.2" +source = { registry = "https://pypi.org/simple" } +dependencies = [ + { name = "idna" }, + { name = "multidict" }, + { name = "propcache" }, +] +sdist = { url = "https://files.pythonhosted.org/packages/79/12/1e8f37460ea0f7eb59c221fdaf0ed75e7ac43e97f8093b9c6f411df50a78/yarl-1.24.2.tar.gz", hash = "sha256:9ac374123c6fd7abf64d1fec93962b0bd4ee2c19751755a762a72dd96c0378f8", size = 210798, upload-time = "2026-05-19T21:31:05.599Z" } +wheels = [ + { url = "https://files.pythonhosted.org/packages/3f/df/f1c7a3de0831cd83194f1a85c5bb431b13f81e6b45079314c86d1c4ef3f2/yarl-1.24.2-cp310-cp310-macosx_10_9_universal2.whl", hash = "sha256:5249a113065c2b7a958bc699759e359cd61cfc81e3069662208f48f191b7ed12", size = 129057, upload-time = "2026-05-19T21:27:47.564Z" }, + { url = "https://files.pythonhosted.org/packages/48/41/7daafb32dd7562bf45b1ce56562e7e1a9146f6479b6456873eb8a3413c40/yarl-1.24.2-cp310-cp310-macosx_10_9_x86_64.whl", hash = "sha256:7f4425fa244fbf530b006d0c5f79ce920114cfff5b4f5f6056e669f8e160fdc0", size = 91545, upload-time = "2026-05-19T21:27:50.089Z" }, + { url = "https://files.pythonhosted.org/packages/a8/8f/7b3ec212f1ea0683f55f978e3246bc313c38818664edfc97a9f349a4901e/yarl-1.24.2-cp310-cp310-macosx_11_0_arm64.whl", hash = "sha256:15c0b5e49d3c44e2a0b93e6a49476c5edad0a7686b92c395765a7ea775572a75", size = 91380, upload-time = "2026-05-19T21:27:51.953Z" }, + { url = "https://files.pythonhosted.org/packages/8a/1b/8bafab7db23b0567ae9db749099b329d91e3b82bc6028b2050ba583e116c/yarl-1.24.2-cp310-cp310-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:246d32a53a947c8f0189f5d699cbd4c7036de45d9359e13ba238d1239678c727", size = 105957, upload-time = "2026-05-19T21:27:53.98Z" }, + { url = "https://files.pythonhosted.org/packages/7f/77/21030c2f8d21d21559719beafc772ada2014be933418ed1eaed9cc800e42/yarl-1.24.2-cp310-cp310-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:64480fb3e4d4ed9ed71c48a91a477384fc342a50ca30071d2f8a88d51d9c9413", size = 97242, upload-time = "2026-05-19T21:27:55.981Z" }, + { url = "https://files.pythonhosted.org/packages/50/d8/f9ea63d1b6aa910a866e089d871fff6cbd49caab29b86b35221a62dfa0d5/yarl-1.24.2-cp310-cp310-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:349de4701dc3760b6e876628423a8f147ef4f5599d10aba1e10702075d424ed9", size = 114719, upload-time = "2026-05-19T21:27:58.037Z" }, + { url = "https://files.pythonhosted.org/packages/e9/a3/04e0ee98ac58a249ea7ed75223f5f901ba81a834f0b4921b58e5cec11757/yarl-1.24.2-cp310-cp310-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:d162677af8d5d3d6ebab8394b021f4d041ac107a4b705873148a77a49dc9e1b2", size = 112140, upload-time = "2026-05-19T21:27:59.618Z" }, + { url = "https://files.pythonhosted.org/packages/02/ad/0b9cc9f38a7324a7eb1d80f834eaa5283d17e9271bbda3186e598dddaeac/yarl-1.24.2-cp310-cp310-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:f5f5c6ec23a9043f2d139cc072f53dd23168d202a334b9b2fda8de4c3e890d90", size = 106721, upload-time = "2026-05-19T21:28:02.586Z" }, + { url = "https://files.pythonhosted.org/packages/65/e7/a52478ebfc66ec989e085c6ae038b9f1bfa4190baa193b133b669c709e2f/yarl-1.24.2-cp310-cp310-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:60de6742447fbbf697f16f070b8a443f1b5fe6ca3826fbef9fe70ecd5328e643", size = 106478, upload-time = "2026-05-19T21:28:04.523Z" }, + { url = "https://files.pythonhosted.org/packages/04/d8/5508530fea8472542de00013ae280765fc938ee196fc4030c43a498afb36/yarl-1.24.2-cp310-cp310-musllinux_1_2_aarch64.whl", hash = "sha256:acf93187c3710e422368eb768aee98db551ec7c85adc250207a95c16548ab7ac", size = 105423, upload-time = "2026-05-19T21:28:06.515Z" }, + { url = "https://files.pythonhosted.org/packages/84/f1/ece28505e9628e8b756e11bb4f28864a17cc33b6b44db4d2aaf0622bf630/yarl-1.24.2-cp310-cp310-musllinux_1_2_armv7l.whl", hash = "sha256:f4b0352fd41fd34b6651934606268816afd6914d09626f9bcbbf018edb0afb3f", size = 99878, upload-time = "2026-05-19T21:28:08.637Z" }, + { url = "https://files.pythonhosted.org/packages/3f/52/fb5d34529b46dd84013afcfb30b8d2bc2832ed03d412736f577d604fa393/yarl-1.24.2-cp310-cp310-musllinux_1_2_ppc64le.whl", hash = "sha256:6b208bb939099b4b297438da4e9b25357f0b1c791888669b963e45b203ea9f36", size = 114025, upload-time = "2026-05-19T21:28:10.64Z" }, + { url = "https://files.pythonhosted.org/packages/43/f0/ff9d31aaab024f7a251c0ed308a98ae29bf9f7dc344e78f28b1322431ca2/yarl-1.24.2-cp310-cp310-musllinux_1_2_riscv64.whl", hash = "sha256:4b85b8825e631295ff4bc8943f7471d54c533a9360bbe15ebb38e018b555bb8a", size = 105613, upload-time = "2026-05-19T21:28:12.784Z" }, + { url = "https://files.pythonhosted.org/packages/31/7d/3296fb3f3ecd52bf9ae6c16b0895c1cda7e9170a2083861552b683f70264/yarl-1.24.2-cp310-cp310-musllinux_1_2_s390x.whl", hash = "sha256:e26acf20c26cb4fefc631fdb75aca2a6b8fa8b7b5d7f204fb6a8f1e63c706f53", size = 111665, upload-time = "2026-05-19T21:28:14.393Z" }, + { url = "https://files.pythonhosted.org/packages/1a/74/77aa6ddaca4fbf42e45e675a465c43956dd40702281049975a2aa04eae59/yarl-1.24.2-cp310-cp310-musllinux_1_2_x86_64.whl", hash = "sha256:819ca24f8eafcfb683c1bd5f44f2f488cea1274eb8944731ffd2e1f10f619342", size = 106914, upload-time = "2026-05-19T21:28:15.893Z" }, + { url = "https://files.pythonhosted.org/packages/d8/02/7611f22cd1d4ed7373eb7f9ee21fde1046edba2e7c0e514880d760352f48/yarl-1.24.2-cp310-cp310-win_amd64.whl", hash = "sha256:5cb0f995a901c36be096ccbf4c673591c2faabbe96279598ffaec8c030f85bf4", size = 92658, upload-time = "2026-05-19T21:28:17.471Z" }, + { url = "https://files.pythonhosted.org/packages/91/00/671d0add79938127292839ae44506ce2f7fe8909c72d5a931864f128fd0b/yarl-1.24.2-cp310-cp310-win_arm64.whl", hash = "sha256:f408eace7e22a68b467a0562e0d27d322f91fe3eaaa6f466b962c6cfaea9fa39", size = 87887, upload-time = "2026-05-19T21:28:19.021Z" }, + { url = "https://files.pythonhosted.org/packages/c5/c5/1ce244152ff2839645e7cae92f90e7bafcb2c52bea7ff586ac714f14f5df/yarl-1.24.2-cp311-cp311-macosx_10_9_universal2.whl", hash = "sha256:36348bebb147b83818b9d7e673ea4debc75970afc6ffdc7e3975ad05ce5a58c1", size = 128971, upload-time = "2026-05-19T21:28:20.543Z" }, + { url = "https://files.pythonhosted.org/packages/87/5a/00f36967203ed89cb3acd2c8ed526cc3fed9418eb70ce128160a911c8499/yarl-1.24.2-cp311-cp311-macosx_10_9_x86_64.whl", hash = "sha256:1a97e42c8a2233f2f279ecadd9e4a037bcb5d813b78435e8eedd4db5a9e9708c", size = 91507, upload-time = "2026-05-19T21:28:22.556Z" }, + { url = "https://files.pythonhosted.org/packages/31/d0/1fb0c1cd27288f39f6974da4318c32768d72c9890984541fdf1e2e32a51d/yarl-1.24.2-cp311-cp311-macosx_11_0_arm64.whl", hash = "sha256:8d027d56f1035e339d1001ac33eceab5b2ec8e42e449787bb75e289fb9a5cd1d", size = 91343, upload-time = "2026-05-19T21:28:24.092Z" }, + { url = "https://files.pythonhosted.org/packages/03/ce/d4a646508bed2f8dec6435b40166fe9308dd191262033d3f307b2bbcaecd/yarl-1.24.2-cp311-cp311-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:0a6377060e7927187a42b7eb202090cbe2b34933a4eeaf90e3bd9e33432e5cae", size = 105704, upload-time = "2026-05-19T21:28:25.872Z" }, + { url = "https://files.pythonhosted.org/packages/4b/07/b3278e82d8bc41485bcf6d856cd0433262593de615b1d3dc43bd3f5bead4/yarl-1.24.2-cp311-cp311-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:17076578bce0049a5ce57d14ad1bded391b68a3b213e9b81b0097b090244999a", size = 97281, upload-time = "2026-05-19T21:28:27.352Z" }, + { url = "https://files.pythonhosted.org/packages/17/5b/4cee6e7c92e487bebe7afc797da0aa54a248ab4e776a68fe369ec29665a5/yarl-1.24.2-cp311-cp311-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:50713f1d4d6be6375bb178bb43d140ee1acb8abe589cd723320b7925a275be1e", size = 114020, upload-time = "2026-05-19T21:28:29.458Z" }, + { url = "https://files.pythonhosted.org/packages/5c/82/111076571545a7d4f9cca3fbd5c6f40615af58642be09f12328f48022468/yarl-1.24.2-cp311-cp311-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:34263e2fa8fb5bb63a0d97706cda38edbad62fddb58c7f12d6acbc092812aa50", size = 111450, upload-time = "2026-05-19T21:28:31.262Z" }, + { url = "https://files.pythonhosted.org/packages/b6/ec/08f671f69a444d704aeecebf92af659b67b97a869942411d0a578b08c334/yarl-1.24.2-cp311-cp311-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:49016d82f032b1bd1e10b01078a7d29ae71bf468eeae0ea22df8bab691e60003", size = 106384, upload-time = "2026-05-19T21:28:32.856Z" }, + { url = "https://files.pythonhosted.org/packages/e5/86/ce41e7a7a199340b2330d52b60f25c4074b6636dd0e60b1a80d31a9db042/yarl-1.24.2-cp311-cp311-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:3f6d2c216318f8f32038ca3f72501ba08536f0fd18a36e858836b121b2deed9f", size = 106153, upload-time = "2026-05-19T21:28:35.222Z" }, + { url = "https://files.pythonhosted.org/packages/c4/5d/31be8a729531ab3e55ac3e7e5c800be8c89ea98947f418b2f6ea259fb6ee/yarl-1.24.2-cp311-cp311-musllinux_1_2_aarch64.whl", hash = "sha256:08d3a33218e0c64393e7610284e770409a9c31c429b078bcb24096ed0a783b8f", size = 105322, upload-time = "2026-05-19T21:28:36.642Z" }, + { url = "https://files.pythonhosted.org/packages/47/9b/b57afb22b386ae87ac9940f09878b98d8c333f89113e6fc96fcf4ca9eb64/yarl-1.24.2-cp311-cp311-musllinux_1_2_armv7l.whl", hash = "sha256:5d699376c4ca3cba49bbfae3a05b5b70ded572937171ce1e0b8d87118e2ba294", size = 99057, upload-time = "2026-05-19T21:28:38.386Z" }, + { url = "https://files.pythonhosted.org/packages/a3/4f/06348c27c8389256c313e8a57d796808fc0264c915dd5e7cfd3c0e314dc7/yarl-1.24.2-cp311-cp311-musllinux_1_2_ppc64le.whl", hash = "sha256:a1cab588b4fa14bea2e55ebea27478adfb05372f47573738e1acc4a36c0b05d2", size = 113502, upload-time = "2026-05-19T21:28:40.091Z" }, + { url = "https://files.pythonhosted.org/packages/5f/1c/284f307b298e4a17b7943b07d9d7ecc4151537f8d137ba51f3bb6c31ca20/yarl-1.24.2-cp311-cp311-musllinux_1_2_riscv64.whl", hash = "sha256:ec87ccc31bd21db7ad009d8572c127c1000f268517618a4cc09adba3c2a7f21c", size = 105253, upload-time = "2026-05-19T21:28:41.987Z" }, + { url = "https://files.pythonhosted.org/packages/c8/bf/0de123bec8619e45c80cbded9085f61b5b4a9eddb8abe6d25d28ee1ec866/yarl-1.24.2-cp311-cp311-musllinux_1_2_s390x.whl", hash = "sha256:d1dd47a22843b212baa8d74f37796815d43bd046b42a0f41e9da433386c3136b", size = 111345, upload-time = "2026-05-19T21:28:43.93Z" }, + { url = "https://files.pythonhosted.org/packages/90/af/0248eb065e51129d2a9b2436cd1b5c772c19a6b04e5b6a186955671e3319/yarl-1.24.2-cp311-cp311-musllinux_1_2_x86_64.whl", hash = "sha256:7b54b9c67c2b06bd7b9a77253d242124b9c95d2c02def5a1144001ee547dd9d5", size = 106558, upload-time = "2026-05-19T21:28:45.806Z" }, + { url = "https://files.pythonhosted.org/packages/21/3c/f960d7a65ef97d8ba9b424fb5128796a4bc710fc6df2ddbbd7dfdc3bbd20/yarl-1.24.2-cp311-cp311-win_amd64.whl", hash = "sha256:f8fdbcff8b2c7c9284e60c196f693588598ddcee31e11c18e14949ce44519d45", size = 92808, upload-time = "2026-05-19T21:28:48.465Z" }, + { url = "https://files.pythonhosted.org/packages/03/1a/49fb03750e4de4d2284cd5b885a383133c34eef45bd59631b2bb8b7e81e8/yarl-1.24.2-cp311-cp311-win_arm64.whl", hash = "sha256:b32c37a7a337e90822c45797bf3d79d60875cfcccd3ecc80e9f453d87026c122", size = 87610, upload-time = "2026-05-19T21:28:50.07Z" }, + { url = "https://files.pythonhosted.org/packages/f0/da/866bcb01076ba49d2b42b309867bed3826421f1c479655eb7a607b44f20b/yarl-1.24.2-cp312-cp312-macosx_10_13_universal2.whl", hash = "sha256:b975866c184564c827e0877380f0dae57dcca7e52782128381b72feff6dfceb8", size = 129957, upload-time = "2026-05-19T21:28:51.695Z" }, + { url = "https://files.pythonhosted.org/packages/bf/1d/fcefb70922ea2268a8971d8e5874d9a8218644200fb8465f1dcad55e6851/yarl-1.24.2-cp312-cp312-macosx_10_13_x86_64.whl", hash = "sha256:3b075301a2836a0e297b1b658cb6d6135df535d62efefdd60366bd589c2c82f2", size = 92164, upload-time = "2026-05-19T21:28:53.242Z" }, + { url = "https://files.pythonhosted.org/packages/29/b6/170e2b8d4e3bc30e6bfdcca53556537f5bf595e938632dfcb059311f3ff6/yarl-1.24.2-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:8ae44649b00947634ab0dab2a374a638f52923a6e67083f2c156cd5cbd1a881d", size = 91688, upload-time = "2026-05-19T21:28:54.865Z" }, + { url = "https://files.pythonhosted.org/packages/fe/a5/c9f655d5553ea0b99fdac9d6a99ad3f9b3e73b8e5758bb46f58c9831f74c/yarl-1.24.2-cp312-cp312-manylinux2014_aarch64.manylinux_2_17_aarch64.manylinux_2_28_aarch64.whl", hash = "sha256:507cc19f0b45454e2d6dcd62ff7d062b9f77a2812404e62dbdaec05b50faa035", size = 102902, upload-time = "2026-05-19T21:28:56.963Z" }, + { url = "https://files.pythonhosted.org/packages/5d/bc/6b9664d815d79af4ee553337f9d606c56bbf269186ada9172de45f1b5f60/yarl-1.24.2-cp312-cp312-manylinux2014_armv7l.manylinux_2_17_armv7l.manylinux_2_31_armv7l.whl", hash = "sha256:c4c17bad5a530912d2111825d3f05e89bab2dd376aaa8cbc77e449e6db63e576", size = 97931, upload-time = "2026-05-19T21:28:58.56Z" }, + { url = "https://files.pythonhosted.org/packages/98/ec/32ba48acae30fecd60928f5791188b80a9d6ee3840507ffda29fecd37b71/yarl-1.24.2-cp312-cp312-manylinux2014_ppc64le.manylinux_2_17_ppc64le.manylinux_2_28_ppc64le.whl", hash = "sha256:f5f0cbb112838a4a293985b6ed73948a547dadcc1ba6d2089938e7abdedceef8", size = 111030, upload-time = "2026-05-19T21:29:00.148Z" }, + { url = "https://files.pythonhosted.org/packages/82/5a/6f4cd081e5f4934d2ae3a8ef4abe3afacc010d26f0035ee91b35cd7d7c37/yarl-1.24.2-cp312-cp312-manylinux2014_s390x.manylinux_2_17_s390x.manylinux_2_28_s390x.whl", hash = "sha256:5ec8356b8a6afcf81fc7aeeef13b1ff7a49dec00f313394bbb9e83830d32ccd7", size = 110392, upload-time = "2026-05-19T21:29:02.155Z" }, + { url = "https://files.pythonhosted.org/packages/7a/da/323a01c349bd5fb01bb6652e314d9bb218cee630a736bdb810ad50e4013f/yarl-1.24.2-cp312-cp312-manylinux2014_x86_64.manylinux_2_17_x86_64.manylinux_2_28_x86_64.whl", hash = "sha256:7e7ebcdef69dec6c6451e616f32b622a6d4a2e92b445c992f7c8e5274a6bbc4c", size = 105612, upload-time = "2026-05-19T21:29:04.247Z" }, + { url = "https://files.pythonhosted.org/packages/7c/80/264ab684f181e1a876389374519ff05d10248725535ae2ac4e8ac4e563d6/yarl-1.24.2-cp312-cp312-manylinux_2_31_riscv64.manylinux_2_39_riscv64.whl", hash = "sha256:47a55d6cf6db2f401017a9e96e5288844e5051911fb4e0c8311a3980f5e59a7d", size = 104487, upload-time = "2026-05-19T21:29:06.491Z" }, + { url = "https://files.pythonhosted.org/packages/41/07/efabe5df87e96d7ad5959760b888344be48cd6884db127b407c6b5503adc/yarl-1.24.2-cp312-cp312-musllinux_1_2_aarch64.whl", hash = "sha256:3065657c80a2321225e804048597ad55658a7e76b32d6f5ee4074d04c50401db", size = 102333, upload-time = "2026-05-19T21:29:08.267Z" }, + { url = "https://files.pythonhosted.org/packages/44/0c/bcf7c42603e1009295f586d8890f2ba032c8b53310e815adf0a202c73d9f/yarl-1.24.2-cp312-cp312-musllinux_1_2_armv7l.whl", hash = "sha256:cb84b80d88e19ede158619b80813968713d8d008b0e2497a576e6a0557d50712", size = 99025, upload-time = "2026-05-19T21:29:10.682Z" }, + { url = "https://files.pythonhosted.org/packages/4f/82/84482ab1a57a0f21a08afe6a7004c61d741f8f2ecc3b05c321577c612164/yarl-1.24.2-cp312-cp312-musllinux_1_2_ppc64le.whl", hash = "sha256:990de4f680b1c217e77ff0d6aa0029f9eb79889c11fb3e9a3942c7eba29c1996", size = 110507, upload-time = "2026-05-19T21:29:12.954Z" }, + { url = "https://files.pythonhosted.org/packages/c4/8d/a546ba1dfe1b0f290e05fef145cd07614c0f15df1a707195e512d1e39d1d/yarl-1.24.2-cp312-cp312-musllinux_1_2_riscv64.whl", hash = "sha256:abb8ec0323b80161e3802da3150ef660b41d0e9be2048b76a363d93eee992c2b", size = 103719, upload-time = "2026-05-19T21:29:14.893Z" }, + { url = "https://files.pythonhosted.org/packages/1a/b6/267f2a09213138473adfce6b8a6e17791d7fee70bd4d9003218e4dec58b0/yarl-1.24.2-cp312-cp312-musllinux_1_2_s390x.whl", hash = "sha256:e7977781f83638a4c73e0f88425563d70173e0dfd90ac006a45c65036293ee3c", size = 110438, upload-time = "2026-05-19T21:29:16.485Z" }, + { url = "https://files.pythonhosted.org/packages/48/2d/1c8d89c7c5f9cad9fb2902445d94e2ab1d7aa35de029afbb8ae95c42d00f/yarl-1.24.2-cp312-cp312-musllinux_1_2_x86_64.whl", hash = "sha256:e30dd55825dc554ec5b66a94953b8eda8745926514c5089dfcacecb9c99b5bd1", size = 105719, upload-time = "2026-05-19T21:29:18.367Z" }, + { url = "https://files.pythonhosted.org/packages/a7/25/722e3b93bd687009afb2d59a35e13d30ddd8f80571445bb0c4e4ce26ec66/yarl-1.24.2-cp312-cp312-win_amd64.whl", hash = "sha256:7dafe10c12ddd4d120d528c4b5599c953bd7b12845347d507b95451195bb6cad", size = 92901, upload-time = "2026-05-19T21:29:20.014Z" }, + { url = "https://files.pythonhosted.org/packages/39/47/4486ccfb674c04854a1ef8aa77868b6a6f765feaf69633409d7ca4f02cb8/yarl-1.24.2-cp312-cp312-win_arm64.whl", hash = "sha256:044a09d8401fcf8681977faef6d286b8ade1e2d2e9dceda175d1cfa5ca496f30", size = 87229, upload-time = "2026-05-19T21:29:22.1Z" }, + { url = "https://files.pythonhosted.org/packages/fd/4d/4b880086bd0d3e034d25647be1d830afc3e3f610e98c4ab3490af6b1b6d5/yarl-1.24.2-py3-none-any.whl", hash = "sha256:2783d9226db8797636cd6896e4de81feed252d1db72265686c9558d97a4d94b9", size = 53576, upload-time = "2026-05-19T21:31:03.909Z" }, +] + +[[package]] +name = "yolov5" +version = "2026.6.17" +source = { git = "https://github.com/epoch8/yolov5?rev=943ad3c43a981ff81b05c779d2e051641b714f4a#943ad3c43a981ff81b05c779d2e051641b714f4a" } +dependencies = [ + { name = "gitpython" }, + { name = "matplotlib", version = "3.10.9", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "matplotlib", version = "3.11.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "numpy", version = "2.2.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "numpy", version = "2.4.6", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "numpy", version = "2.5.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "opencv-python" }, + { name = "packaging" }, + { name = "pandas", version = "2.3.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "pandas", version = "3.0.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.11'" }, + { name = "pillow" }, + { name = "psutil" }, + { name = "pyyaml" }, + { name = "requests" }, + { name = "scipy", version = "1.15.3", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version < '3.11'" }, + { name = "scipy", version = "1.17.1", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version == '3.11.*'" }, + { name = "scipy", version = "1.18.0", source = { registry = "https://pypi.org/simple" }, marker = "python_full_version >= '3.12'" }, + { name = "seaborn" }, + { name = "setuptools" }, + { name = "thop" }, + { name = "torch" }, + { name = "torchvision" }, + { name = "tqdm" }, + { name = "ultralytics" }, + { name = "urllib3" }, +] From df687dc76fd416ef4aaed6eb4ff5bfb56877fe8f Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Fri, 10 Jul 2026 12:46:10 +0000 Subject: [PATCH 17/18] detection_tags: pin python 3.10 (reference stack: numpy 2.2.6 via lock) + fingerprint scans DATAPIPE_TAGS_DIR too --- examples/detection_tags/.python-version | 1 + examples/detection_tags/scripts/repro_fingerprint.py | 10 ++++++++-- 2 files changed, 9 insertions(+), 2 deletions(-) create mode 100644 examples/detection_tags/.python-version diff --git a/examples/detection_tags/.python-version b/examples/detection_tags/.python-version new file mode 100644 index 00000000..c8cfe395 --- /dev/null +++ b/examples/detection_tags/.python-version @@ -0,0 +1 @@ +3.10 diff --git a/examples/detection_tags/scripts/repro_fingerprint.py b/examples/detection_tags/scripts/repro_fingerprint.py index 6ef4ee64..75dfc835 100644 --- a/examples/detection_tags/scripts/repro_fingerprint.py +++ b/examples/detection_tags/scripts/repro_fingerprint.py @@ -59,8 +59,14 @@ def main() -> int: print("== trained models: WEIGHT hashes (state_dict tensors, not file bytes) ==") # file md5 is misleading — checkpoints embed dates/paths; hash the tensors instead. - tmp = Path(os.environ.get("DATAPIPE_TAGS_TMP_DIR", "/tmp/datapipe-tags")) - found = sorted(tmp.rglob("best.pt")) + # Artifacts may sit under DATAPIPE_TAGS_TMP_DIR (training output) or DATAPIPE_TAGS_DIR + # (persisted models) — scan both when they are LOCAL paths (skip s3:// etc.). + dirs = [] + for var, default in (("DATAPIPE_TAGS_TMP_DIR", "/tmp/datapipe-tags"), ("DATAPIPE_TAGS_DIR", "")): + v = os.environ.get(var, default) + if v and "://" not in v: + dirs.append(Path(v)) + found = sorted({p for d in dirs if d.exists() for p in d.rglob("best.pt")}) if found: import torch From 70e5226e62f76f21b16582bcf4571588f04afbed Mon Sep 17 00:00:00 2001 From: Renat Shakirov Date: Fri, 10 Jul 2026 14:14:48 +0000 Subject: [PATCH 18/18] =?UTF-8?q?detection=5Ftags:=20demo=20seed=20?= =?UTF-8?q?=E2=80=94=20restore=20reference=20models/metrics=20identically?= =?UTF-8?q?=20on=20any=20machine=20in=20~2min=20(images=20re-derived=20byt?= =?UTF-8?q?e-identically=20from=20cache);=20live=20training=20stays=20per-?= =?UTF-8?q?GPU?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .claude/skills/setup-detection-tags/SKILL.md | 6 ++ examples/detection_tags/README.md | 15 +++++ examples/detection_tags/demo_seed/db.sql.gz | Bin 0 -> 285084 bytes .../scripts/restore_demo_seed.sh | 26 ++++++++ .../scripts/seed_upload_images.py | 58 ++++++++++++++++++ 5 files changed, 105 insertions(+) create mode 100644 examples/detection_tags/demo_seed/db.sql.gz create mode 100755 examples/detection_tags/scripts/restore_demo_seed.sh create mode 100644 examples/detection_tags/scripts/seed_upload_images.py diff --git a/.claude/skills/setup-detection-tags/SKILL.md b/.claude/skills/setup-detection-tags/SKILL.md index 2c2db481..168991bc 100644 --- a/.claude/skills/setup-detection-tags/SKILL.md +++ b/.claude/skills/setup-detection-tags/SKILL.md @@ -81,6 +81,12 @@ gamma makes model B memorize that exact darkness (night/train ~0.95, night/val f forces it to generalize "low light", which is what lifts the held-out val. More epochs does NOT fix this (30 epochs = deeper memorization, val drops) — the lever is data diversity, keep epochs=10. +**Identical numbers on ANY machine — use the demo seed, not training:** live training is bit-stable +per GPU but diverges across GPU models (proven: same data + same libs, different CUDA kernels — no +software knob fixes it). `bash scripts/restore_demo_seed.sh` (~2 min) restores the exact reference +state (models A/B + metrics + run history + byte-identical images re-derived from the cache). Train +live only when per-GPU numbers are acceptable. + **Deterministic reference** (gpu5, GTX 1070, seed=42, epochs=10, weighted recall/precision on val): model A → overall 0.324/0.440, night 0.282/0.449; model B → overall **0.415/0.546**, night **0.409/0.549**. **B beats A on BOTH val sets with fat margins (+0.09..+0.13)** — large enough to diff --git a/examples/detection_tags/README.md b/examples/detection_tags/README.md index 57db356a..ca4bc732 100644 --- a/examples/detection_tags/README.md +++ b/examples/detection_tags/README.md @@ -29,6 +29,21 @@ load `base-val` + `night-val` (pinned `--subset val`) before training A, and add (`--subset train`) only for part 2. `add_request.py --subset` pins a batch (`image__subset_hint`), the split step honors it. The pre-staged cache holds **500 images**, so keep the total ≤ 500. +## Identical metrics on any machine — demo seed (no training) + +Live-training numbers are bit-stable on one GPU but DIFFER across GPU models (proven — different CUDA +kernels; no software setting fixes it). For the same numbers everywhere, restore the reference state +instead of training (~2 min): models A/B, all metrics and run history land exactly as validated. + +```bash +# stack up + .env sourced + venv built + image cache present (scripts/build_cache.py) +bash scripts/restore_demo_seed.sh # wipes the public schema, restores demo_seed/db.sql.gz, + # re-uploads images byte-identically from the cache +``` + +Then open the front — `cat_dog` shows the reference metrics (A val recall 0.324 / B 0.415 etc.). +Live (re)training stays available; treat its numbers as per-GPU. + ## Part 1 — baseline to checkpoint ```bash # from examples/detection_tags/detection diff --git a/examples/detection_tags/demo_seed/db.sql.gz b/examples/detection_tags/demo_seed/db.sql.gz new file mode 100644 index 0000000000000000000000000000000000000000..cae45e46d0459b6f49480fbf113800448ff0cbc8 GIT binary patch literal 285084 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⁢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 _iyQ`{CMU^%G6a(2SHb^7+ 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 literal 0 HcmV?d00001 diff --git a/examples/detection_tags/scripts/restore_demo_seed.sh b/examples/detection_tags/scripts/restore_demo_seed.sh new file mode 100755 index 00000000..a50f175a --- /dev/null +++ b/examples/detection_tags/scripts/restore_demo_seed.sh @@ -0,0 +1,26 @@ +#!/bin/bash +# Restore the reference demo state (models A/B + all metrics + run history) so the UI shows the +# EXACT reference numbers on ANY machine — no training, ~2 minutes. Live retraining stays possible +# afterwards, but live-training numbers vary per GPU (proven; see README). +# +# Prereqs: docker compose stack up, .env sourced, venv built, image cache present +# (scripts/build_cache.py — build off-RU and copy if the host can't reach COCO). +# +# Usage, from examples/detection_tags: bash scripts/restore_demo_seed.sh [pg_container] +set -euo pipefail +PG=${1:-detection_tags-postgres-1} +HERE=$(cd "$(dirname "$0")/.." && pwd) + +echo "== 1/3 restore Postgres schema from demo_seed/db.sql.gz (DROPS current public schema!) ==" +docker exec "$PG" psql -U postgres -c "DROP SCHEMA IF EXISTS public CASCADE; CREATE SCHEMA public;" +gunzip -c "$HERE/demo_seed/db.sql.gz" | docker exec -i "$PG" psql -U postgres -q +echo "== 2/3 re-upload images to object storage (byte-identical, derived from the cache) ==" +cd "$HERE/detection" +../.venv/bin/python ../scripts/seed_upload_images.py +echo "== 3/3 sanity ==" +docker exec "$PG" psql -U postgres -tAc \ + "SELECT 'models='||count(*) FROM public.detection_model_train" +docker exec "$PG" psql -U postgres -tAc \ + "SELECT substring(detection_model_id,10,4)||' '||subset_id||' recall='||round(calc__weighted_recall::numeric,3) FROM public.pipeline_model__metrics_on_subset ORDER BY subset_id, detection_model_id" +echo "done — start/refresh the datapipe front; the cat_dog spec shows the reference metrics." +echo "(FiftyOne view: optionally run ../.venv/bin/datapipe step --labels=stage=fiftyone run )" diff --git a/examples/detection_tags/scripts/seed_upload_images.py b/examples/detection_tags/scripts/seed_upload_images.py new file mode 100644 index 00000000..07458cd0 --- /dev/null +++ b/examples/detection_tags/scripts/seed_upload_images.py @@ -0,0 +1,58 @@ +"""Re-upload demo images to object storage after restoring demo_seed/db.sql.gz. + +The seed dump restores all TABLES (models, metrics, run history) but not the MinIO objects the UI +renders. Re-deriving them beats shipping a 70MB tar: the cache bytes and darken() output are +byte-identical on every machine (md5-proven), so this reproduces exactly the objects the dump's +`s3_images` rows point at. Replays load_batch's upload loop over the restored `load_request` rows. + +Run from examples/detection_tags/detection with .env sourced: + ../.venv/bin/python ../scripts/seed_upload_images.py +""" +from __future__ import annotations + +import os +import sys + +import fsspec +import pandas as pd +import sqlalchemy as sa + +sys.path.insert(0, ".") +import coco_demo # noqa: E402 +from coco_demo import CocoDemoSource, darken # noqa: E402 +from config import DB_URL, input_bucket, input_storage_options # noqa: E402 + + +def main() -> int: + eng = sa.create_engine(DB_URL) + schema = os.environ.get("DB_SCHEMA", "public") + reqs = pd.read_sql(f'SELECT * FROM {schema}.load_request ORDER BY "offset"', eng) + if reqs.empty: + sys.exit("load_request is empty — restore demo_seed/db.sql.gz first") + + src = CocoDemoSource() + fs = fsspec.filesystem("s3", **input_storage_options()) + bucket = input_bucket() + n_up = 0 + for _, req in reqs.iterrows(): + n, offset = int(req["n"]), int(req.get("offset") or 0) + tag = req.get("tag") + tag = None if pd.isna(tag) or str(tag) == "" else str(tag) + gamma = req.get("darken") + gamma = None if pd.isna(gamma) or str(gamma) == "" else float(gamma) + for fn in src.pool[offset : offset + n]: + stem, ext = os.path.splitext(fn) + raw, _, _ = src.fetch(fn) + if gamma is not None: + name, data = f"{stem}__{tag or 'dark'}{ext}", darken(raw, gamma) + else: + name, data = fn, raw + fs.pipe(f"{bucket}/images/{name}", data) + n_up += 1 + print(f" {req['request_id']}: {n} images uploaded", flush=True) + print(f"done: {n_up} objects -> {bucket}/images (byte-identical to the seed state)") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main())